| @@ -0,0 +1,31 @@ | |||
| # Specifies intentionally untracked files to ignore when using Git | |||
| # http://git-scm.com/docs/gitignore | |||
| *~ | |||
| *.sw[mnpcod] | |||
| .tmp | |||
| *.tmp | |||
| *.tmp.* | |||
| *.sublime-project | |||
| *.sublime-workspace | |||
| .DS_Store | |||
| Thumbs.db | |||
| UserInterfaceState.xcuserstate | |||
| $RECYCLE.BIN/ | |||
| *.log | |||
| log.txt | |||
| npm-debug.log* | |||
| /.idea | |||
| /.ionic | |||
| /.sass-cache | |||
| /.sourcemaps | |||
| /.versions | |||
| /.vscode | |||
| /coverage | |||
| /dist | |||
| /node_modules | |||
| /platforms | |||
| /plugins | |||
| /www | |||
| @@ -0,0 +1,187 @@ | |||
| { | |||
| "$schema": "./node_modules/@angular/cli/lib/config/schema.json", | |||
| "version": 1, | |||
| "defaultProject": "app", | |||
| "newProjectRoot": "projects", | |||
| "projects": { | |||
| "app": { | |||
| "root": "", | |||
| "sourceRoot": "src", | |||
| "projectType": "application", | |||
| "prefix": "app", | |||
| "schematics": {}, | |||
| "architect": { | |||
| "build": { | |||
| "builder": "@angular-devkit/build-angular:browser", | |||
| "options": { | |||
| "outputPath": "www", | |||
| "index": "src/index.html", | |||
| "main": "src/main.ts", | |||
| "polyfills": "src/polyfills.ts", | |||
| "tsConfig": "tsconfig.app.json", | |||
| "assets": [ | |||
| { | |||
| "glob": "**/*", | |||
| "input": "src/assets", | |||
| "output": "assets" | |||
| }, | |||
| { | |||
| "glob": "**/*.svg", | |||
| "input": "node_modules/ionicons/dist/ionicons/svg", | |||
| "output": "./svg" | |||
| } | |||
| ], | |||
| "styles": [ | |||
| { | |||
| "input": "src/theme/variables.scss" | |||
| }, | |||
| { | |||
| "input": "src/global.scss" | |||
| } | |||
| ], | |||
| "scripts": [] | |||
| }, | |||
| "configurations": { | |||
| "production": { | |||
| "fileReplacements": [ | |||
| { | |||
| "replace": "src/environments/environment.ts", | |||
| "with": "src/environments/environment.prod.ts" | |||
| } | |||
| ], | |||
| "optimization": true, | |||
| "outputHashing": "all", | |||
| "sourceMap": false, | |||
| "extractCss": true, | |||
| "namedChunks": false, | |||
| "aot": true, | |||
| "extractLicenses": true, | |||
| "vendorChunk": false, | |||
| "buildOptimizer": true, | |||
| "budgets": [ | |||
| { | |||
| "type": "initial", | |||
| "maximumWarning": "2mb", | |||
| "maximumError": "5mb" | |||
| } | |||
| ] | |||
| }, | |||
| "ci": { | |||
| "progress": false | |||
| } | |||
| } | |||
| }, | |||
| "serve": { | |||
| "builder": "@angular-devkit/build-angular:dev-server", | |||
| "options": { | |||
| "browserTarget": "app:build" | |||
| }, | |||
| "configurations": { | |||
| "production": { | |||
| "browserTarget": "app:build:production" | |||
| }, | |||
| "ci": { | |||
| "progress": false | |||
| } | |||
| } | |||
| }, | |||
| "extract-i18n": { | |||
| "builder": "@angular-devkit/build-angular:extract-i18n", | |||
| "options": { | |||
| "browserTarget": "app:build" | |||
| } | |||
| }, | |||
| "test": { | |||
| "builder": "@angular-devkit/build-angular:karma", | |||
| "options": { | |||
| "main": "src/test.ts", | |||
| "polyfills": "src/polyfills.ts", | |||
| "tsConfig": "tsconfig.spec.json", | |||
| "karmaConfig": "karma.conf.js", | |||
| "styles": [], | |||
| "scripts": [], | |||
| "assets": [ | |||
| { | |||
| "glob": "favicon.ico", | |||
| "input": "src/", | |||
| "output": "/" | |||
| }, | |||
| { | |||
| "glob": "**/*", | |||
| "input": "src/assets", | |||
| "output": "/assets" | |||
| } | |||
| ] | |||
| }, | |||
| "configurations": { | |||
| "ci": { | |||
| "progress": false, | |||
| "watch": false | |||
| } | |||
| } | |||
| }, | |||
| "lint": { | |||
| "builder": "@angular-devkit/build-angular:tslint", | |||
| "options": { | |||
| "tsConfig": [ | |||
| "tsconfig.app.json", | |||
| "tsconfig.spec.json", | |||
| "e2e/tsconfig.json" | |||
| ], | |||
| "exclude": ["**/node_modules/**"] | |||
| } | |||
| }, | |||
| "e2e": { | |||
| "builder": "@angular-devkit/build-angular:protractor", | |||
| "options": { | |||
| "protractorConfig": "e2e/protractor.conf.js", | |||
| "devServerTarget": "app:serve" | |||
| }, | |||
| "configurations": { | |||
| "production": { | |||
| "devServerTarget": "app:serve:production" | |||
| }, | |||
| "ci": { | |||
| "devServerTarget": "app:serve:ci" | |||
| } | |||
| } | |||
| }, | |||
| "ionic-cordova-build": { | |||
| "builder": "@ionic/angular-toolkit:cordova-build", | |||
| "options": { | |||
| "browserTarget": "app:build" | |||
| }, | |||
| "configurations": { | |||
| "production": { | |||
| "browserTarget": "app:build:production" | |||
| } | |||
| } | |||
| }, | |||
| "ionic-cordova-serve": { | |||
| "builder": "@ionic/angular-toolkit:cordova-serve", | |||
| "options": { | |||
| "cordovaBuildTarget": "app:ionic-cordova-build", | |||
| "devServerTarget": "app:serve" | |||
| }, | |||
| "configurations": { | |||
| "production": { | |||
| "cordovaBuildTarget": "app:ionic-cordova-build:production", | |||
| "devServerTarget": "app:serve:production" | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| }, | |||
| "cli": { | |||
| "defaultCollection": "@ionic/angular-toolkit" | |||
| }, | |||
| "schematics": { | |||
| "@ionic/angular-toolkit:component": { | |||
| "styleext": "scss" | |||
| }, | |||
| "@ionic/angular-toolkit:page": { | |||
| "styleext": "scss" | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. | |||
| # For additional information regarding the format and rule options, please see: | |||
| # https://github.com/browserslist/browserslist#queries | |||
| # You can see what browsers were selected by your queries by running: | |||
| # npx browserslist | |||
| > 0.5% | |||
| last 2 versions | |||
| Firefox ESR | |||
| not dead | |||
| not IE 9-11 # For IE 9-11 support, remove 'not'. | |||
| @@ -0,0 +1,36 @@ | |||
| // @ts-check | |||
| // Protractor configuration file, see link for more information | |||
| // https://github.com/angular/protractor/blob/master/lib/config.ts | |||
| const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); | |||
| /** | |||
| * @type { import("protractor").Config } | |||
| */ | |||
| exports.config = { | |||
| allScriptsTimeout: 11000, | |||
| specs: [ | |||
| './src/**/*.e2e-spec.ts' | |||
| ], | |||
| capabilities: { | |||
| browserName: 'chrome' | |||
| }, | |||
| directConnect: true, | |||
| baseUrl: 'http://localhost:4200/', | |||
| framework: 'jasmine', | |||
| jasmineNodeOpts: { | |||
| showColors: true, | |||
| defaultTimeoutInterval: 30000, | |||
| print: function() {} | |||
| }, | |||
| onPrepare() { | |||
| require('ts-node').register({ | |||
| project: require('path').join(__dirname, './tsconfig.json') | |||
| }); | |||
| jasmine.getEnv().addReporter(new SpecReporter({ | |||
| spec: { | |||
| displayStacktrace: StacktraceOption.PRETTY | |||
| } | |||
| })); | |||
| } | |||
| }; | |||
| @@ -0,0 +1,14 @@ | |||
| import { AppPage } from './app.po'; | |||
| describe('new App', () => { | |||
| let page: AppPage; | |||
| beforeEach(() => { | |||
| page = new AppPage(); | |||
| }); | |||
| it('should display welcome message', () => { | |||
| page.navigateTo(); | |||
| expect(page.getPageTitle()).toContain('Tab 1'); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,11 @@ | |||
| import { browser, by, element } from 'protractor'; | |||
| export class AppPage { | |||
| navigateTo() { | |||
| return browser.get('/'); | |||
| } | |||
| getPageTitle() { | |||
| return element(by.css('ion-title')).getText(); | |||
| } | |||
| } | |||
| @@ -0,0 +1,13 @@ | |||
| { | |||
| "extends": "../tsconfig.json", | |||
| "compilerOptions": { | |||
| "outDir": "../out-tsc/app", | |||
| "module": "commonjs", | |||
| "target": "es5", | |||
| "types": [ | |||
| "jasmine", | |||
| "jasminewd2", | |||
| "node" | |||
| ] | |||
| } | |||
| } | |||
| @@ -0,0 +1,5 @@ | |||
| { | |||
| "name": "kxip-app", | |||
| "integrations": {}, | |||
| "type": "angular" | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| // Karma configuration file, see link for more information | |||
| // https://karma-runner.github.io/1.0/config/configuration-file.html | |||
| module.exports = function (config) { | |||
| config.set({ | |||
| basePath: '', | |||
| frameworks: ['jasmine', '@angular-devkit/build-angular'], | |||
| plugins: [ | |||
| require('karma-jasmine'), | |||
| require('karma-chrome-launcher'), | |||
| require('karma-jasmine-html-reporter'), | |||
| require('karma-coverage-istanbul-reporter'), | |||
| require('@angular-devkit/build-angular/plugins/karma') | |||
| ], | |||
| client: { | |||
| clearContext: false // leave Jasmine Spec Runner output visible in browser | |||
| }, | |||
| coverageIstanbulReporter: { | |||
| dir: require('path').join(__dirname, '../coverage'), | |||
| reports: ['html', 'lcovonly', 'text-summary'], | |||
| fixWebpackSourcePaths: true | |||
| }, | |||
| reporters: ['progress', 'kjhtml'], | |||
| port: 9876, | |||
| colors: true, | |||
| logLevel: config.LOG_INFO, | |||
| autoWatch: true, | |||
| browsers: ['Chrome'], | |||
| singleRun: false | |||
| }); | |||
| }; | |||
| @@ -0,0 +1,54 @@ | |||
| { | |||
| "name": "kxip-app", | |||
| "version": "0.0.1", | |||
| "author": "Ionic Framework", | |||
| "homepage": "https://ionicframework.com/", | |||
| "scripts": { | |||
| "ng": "ng", | |||
| "start": "ng serve", | |||
| "build": "ng build", | |||
| "test": "ng test", | |||
| "lint": "ng lint", | |||
| "e2e": "ng e2e" | |||
| }, | |||
| "private": true, | |||
| "dependencies": { | |||
| "@angular/common": "~10.0.0", | |||
| "@angular/core": "~10.0.0", | |||
| "@angular/forms": "~10.0.0", | |||
| "@angular/platform-browser": "~10.0.0", | |||
| "@angular/platform-browser-dynamic": "~10.0.0", | |||
| "@angular/router": "~10.0.0", | |||
| "@ionic-native/core": "^5.0.0", | |||
| "@ionic-native/splash-screen": "^5.0.0", | |||
| "@ionic-native/status-bar": "^5.0.0", | |||
| "@ionic/angular": "^5.0.0", | |||
| "rxjs": "~6.5.5", | |||
| "tslib": "^2.0.0", | |||
| "zone.js": "~0.10.3" | |||
| }, | |||
| "devDependencies": { | |||
| "@angular-devkit/build-angular": "~0.1000.0", | |||
| "@angular/cli": "~10.0.5", | |||
| "@angular/compiler": "~10.0.0", | |||
| "@angular/compiler-cli": "~10.0.0", | |||
| "@angular/language-service": "~10.0.0", | |||
| "@ionic/angular-toolkit": "^2.3.0", | |||
| "@types/node": "^12.11.1", | |||
| "@types/jasmine": "~3.5.0", | |||
| "@types/jasminewd2": "~2.0.3", | |||
| "codelyzer": "^6.0.0", | |||
| "jasmine-core": "~3.5.0", | |||
| "jasmine-spec-reporter": "~5.0.0", | |||
| "karma": "~5.0.0", | |||
| "karma-chrome-launcher": "~3.1.0", | |||
| "karma-coverage-istanbul-reporter": "~3.0.2", | |||
| "karma-jasmine": "~3.3.0", | |||
| "karma-jasmine-html-reporter": "^1.5.0", | |||
| "protractor": "~7.0.0", | |||
| "ts-node": "~8.3.0", | |||
| "tslint": "~6.1.0", | |||
| "typescript": "~3.9.5" | |||
| }, | |||
| "description": "An Ionic project" | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { PreloadAllModules, RouterModule, Routes } from '@angular/router'; | |||
| const routes: Routes = [ | |||
| { | |||
| path: '', | |||
| loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule) | |||
| } | |||
| ]; | |||
| @NgModule({ | |||
| imports: [ | |||
| RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }) | |||
| ], | |||
| exports: [RouterModule] | |||
| }) | |||
| export class AppRoutingModule {} | |||
| @@ -0,0 +1,3 @@ | |||
| <ion-app> | |||
| <ion-router-outlet></ion-router-outlet> | |||
| </ion-app> | |||
| @@ -0,0 +1,50 @@ | |||
| import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; | |||
| import { TestBed, async } from '@angular/core/testing'; | |||
| import { Platform } from '@ionic/angular'; | |||
| import { SplashScreen } from '@ionic-native/splash-screen/ngx'; | |||
| import { StatusBar } from '@ionic-native/status-bar/ngx'; | |||
| import { AppComponent } from './app.component'; | |||
| describe('AppComponent', () => { | |||
| let statusBarSpy; | |||
| let splashScreenSpy; | |||
| let platformReadySpy; | |||
| let platformSpy; | |||
| beforeEach(async(() => { | |||
| statusBarSpy = jasmine.createSpyObj('StatusBar', ['styleDefault']); | |||
| splashScreenSpy = jasmine.createSpyObj('SplashScreen', ['hide']); | |||
| platformReadySpy = Promise.resolve(); | |||
| platformSpy = jasmine.createSpyObj('Platform', { ready: platformReadySpy }); | |||
| TestBed.configureTestingModule({ | |||
| declarations: [AppComponent], | |||
| schemas: [CUSTOM_ELEMENTS_SCHEMA], | |||
| providers: [ | |||
| { provide: StatusBar, useValue: statusBarSpy }, | |||
| { provide: SplashScreen, useValue: splashScreenSpy }, | |||
| { provide: Platform, useValue: platformSpy }, | |||
| ], | |||
| }).compileComponents(); | |||
| })); | |||
| it('should create the app', () => { | |||
| const fixture = TestBed.createComponent(AppComponent); | |||
| const app = fixture.debugElement.componentInstance; | |||
| expect(app).toBeTruthy(); | |||
| }); | |||
| it('should initialize the app', async () => { | |||
| TestBed.createComponent(AppComponent); | |||
| expect(platformSpy.ready).toHaveBeenCalled(); | |||
| await platformReadySpy; | |||
| expect(statusBarSpy.styleDefault).toHaveBeenCalled(); | |||
| expect(splashScreenSpy.hide).toHaveBeenCalled(); | |||
| }); | |||
| // TODO: add more tests! | |||
| }); | |||
| @@ -0,0 +1,27 @@ | |||
| import { Component } from '@angular/core'; | |||
| import { Platform } from '@ionic/angular'; | |||
| import { SplashScreen } from '@ionic-native/splash-screen/ngx'; | |||
| import { StatusBar } from '@ionic-native/status-bar/ngx'; | |||
| @Component({ | |||
| selector: 'app-root', | |||
| templateUrl: 'app.component.html', | |||
| styleUrls: ['app.component.scss'] | |||
| }) | |||
| export class AppComponent { | |||
| constructor( | |||
| private platform: Platform, | |||
| private splashScreen: SplashScreen, | |||
| private statusBar: StatusBar | |||
| ) { | |||
| this.initializeApp(); | |||
| } | |||
| initializeApp() { | |||
| this.platform.ready().then(() => { | |||
| this.statusBar.styleDefault(); | |||
| this.splashScreen.hide(); | |||
| }); | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { BrowserModule } from '@angular/platform-browser'; | |||
| import { RouteReuseStrategy } from '@angular/router'; | |||
| import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; | |||
| import { SplashScreen } from '@ionic-native/splash-screen/ngx'; | |||
| import { StatusBar } from '@ionic-native/status-bar/ngx'; | |||
| import { AppRoutingModule } from './app-routing.module'; | |||
| import { AppComponent } from './app.component'; | |||
| @NgModule({ | |||
| declarations: [AppComponent], | |||
| entryComponents: [], | |||
| imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule], | |||
| providers: [ | |||
| StatusBar, | |||
| SplashScreen, | |||
| { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } | |||
| ], | |||
| bootstrap: [AppComponent] | |||
| }) | |||
| export class AppModule {} | |||
| @@ -0,0 +1,4 @@ | |||
| <div id="container"> | |||
| <strong>{{ name }}</strong> | |||
| <p>Explore <a target="_blank" rel="noopener noreferrer" href="https://ionicframework.com/docs/components">UI Components</a></p> | |||
| </div> | |||
| @@ -0,0 +1,27 @@ | |||
| #container { | |||
| text-align: center; | |||
| position: absolute; | |||
| left: 0; | |||
| right: 0; | |||
| top: 50%; | |||
| transform: translateY(-50%); | |||
| } | |||
| #container strong { | |||
| font-size: 20px; | |||
| line-height: 26px; | |||
| } | |||
| #container p { | |||
| font-size: 16px; | |||
| line-height: 22px; | |||
| color: #8c8c8c; | |||
| margin: 0; | |||
| } | |||
| #container a { | |||
| text-decoration: none; | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { ExploreContainerComponent } from './explore-container.component'; | |||
| describe('ExploreContainerComponent', () => { | |||
| let component: ExploreContainerComponent; | |||
| let fixture: ComponentFixture<ExploreContainerComponent>; | |||
| beforeEach(async(() => { | |||
| TestBed.configureTestingModule({ | |||
| declarations: [ ExploreContainerComponent ], | |||
| imports: [IonicModule.forRoot()] | |||
| }).compileComponents(); | |||
| fixture = TestBed.createComponent(ExploreContainerComponent); | |||
| component = fixture.componentInstance; | |||
| fixture.detectChanges(); | |||
| })); | |||
| it('should create', () => { | |||
| expect(component).toBeTruthy(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,15 @@ | |||
| import { Component, OnInit, Input } from '@angular/core'; | |||
| @Component({ | |||
| selector: 'app-explore-container', | |||
| templateUrl: './explore-container.component.html', | |||
| styleUrls: ['./explore-container.component.scss'], | |||
| }) | |||
| export class ExploreContainerComponent implements OnInit { | |||
| @Input() name: string; | |||
| constructor() { } | |||
| ngOnInit() {} | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { CommonModule } from '@angular/common'; | |||
| import { FormsModule } from '@angular/forms'; | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { ExploreContainerComponent } from './explore-container.component'; | |||
| @NgModule({ | |||
| imports: [ CommonModule, FormsModule, IonicModule], | |||
| declarations: [ExploreContainerComponent], | |||
| exports: [ExploreContainerComponent] | |||
| }) | |||
| export class ExploreContainerComponentModule {} | |||
| @@ -0,0 +1,16 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { RouterModule, Routes } from '@angular/router'; | |||
| import { Tab1Page } from './tab1.page'; | |||
| const routes: Routes = [ | |||
| { | |||
| path: '', | |||
| component: Tab1Page, | |||
| } | |||
| ]; | |||
| @NgModule({ | |||
| imports: [RouterModule.forChild(routes)], | |||
| exports: [RouterModule] | |||
| }) | |||
| export class Tab1PageRoutingModule {} | |||
| @@ -0,0 +1,20 @@ | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { NgModule } from '@angular/core'; | |||
| import { CommonModule } from '@angular/common'; | |||
| import { FormsModule } from '@angular/forms'; | |||
| import { Tab1Page } from './tab1.page'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab1PageRoutingModule } from './tab1-routing.module'; | |||
| @NgModule({ | |||
| imports: [ | |||
| IonicModule, | |||
| CommonModule, | |||
| FormsModule, | |||
| ExploreContainerComponentModule, | |||
| Tab1PageRoutingModule | |||
| ], | |||
| declarations: [Tab1Page] | |||
| }) | |||
| export class Tab1PageModule {} | |||
| @@ -0,0 +1,17 @@ | |||
| <ion-header [translucent]="true"> | |||
| <ion-toolbar> | |||
| <ion-title> | |||
| Tab 1 | |||
| </ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <ion-content [fullscreen]="true"> | |||
| <ion-header collapse="condense"> | |||
| <ion-toolbar> | |||
| <ion-title size="large">Tab 1</ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <app-explore-container name="Tab 1 page"></app-explore-container> | |||
| </ion-content> | |||
| @@ -0,0 +1,25 @@ | |||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab1Page } from './tab1.page'; | |||
| describe('Tab1Page', () => { | |||
| let component: Tab1Page; | |||
| let fixture: ComponentFixture<Tab1Page>; | |||
| beforeEach(async(() => { | |||
| TestBed.configureTestingModule({ | |||
| declarations: [Tab1Page], | |||
| imports: [IonicModule.forRoot(), ExploreContainerComponentModule] | |||
| }).compileComponents(); | |||
| fixture = TestBed.createComponent(Tab1Page); | |||
| component = fixture.componentInstance; | |||
| fixture.detectChanges(); | |||
| })); | |||
| it('should create', () => { | |||
| expect(component).toBeTruthy(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,12 @@ | |||
| import { Component } from '@angular/core'; | |||
| @Component({ | |||
| selector: 'app-tab1', | |||
| templateUrl: 'tab1.page.html', | |||
| styleUrls: ['tab1.page.scss'] | |||
| }) | |||
| export class Tab1Page { | |||
| constructor() {} | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { RouterModule, Routes } from '@angular/router'; | |||
| import { Tab2Page } from './tab2.page'; | |||
| const routes: Routes = [ | |||
| { | |||
| path: '', | |||
| component: Tab2Page, | |||
| } | |||
| ]; | |||
| @NgModule({ | |||
| imports: [RouterModule.forChild(routes)], | |||
| exports: [RouterModule] | |||
| }) | |||
| export class Tab2PageRoutingModule {} | |||
| @@ -0,0 +1,21 @@ | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { RouterModule } from '@angular/router'; | |||
| import { NgModule } from '@angular/core'; | |||
| import { CommonModule } from '@angular/common'; | |||
| import { FormsModule } from '@angular/forms'; | |||
| import { Tab2Page } from './tab2.page'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab2PageRoutingModule } from './tab2-routing.module'; | |||
| @NgModule({ | |||
| imports: [ | |||
| IonicModule, | |||
| CommonModule, | |||
| FormsModule, | |||
| ExploreContainerComponentModule, | |||
| Tab2PageRoutingModule | |||
| ], | |||
| declarations: [Tab2Page] | |||
| }) | |||
| export class Tab2PageModule {} | |||
| @@ -0,0 +1,17 @@ | |||
| <ion-header [translucent]="true"> | |||
| <ion-toolbar> | |||
| <ion-title> | |||
| Tab 2 | |||
| </ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <ion-content [fullscreen]="true"> | |||
| <ion-header collapse="condense"> | |||
| <ion-toolbar> | |||
| <ion-title size="large">Tab 2</ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <app-explore-container name="Tab 2 page"></app-explore-container> | |||
| </ion-content> | |||
| @@ -0,0 +1,25 @@ | |||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab2Page } from './tab2.page'; | |||
| describe('Tab2Page', () => { | |||
| let component: Tab2Page; | |||
| let fixture: ComponentFixture<Tab2Page>; | |||
| beforeEach(async(() => { | |||
| TestBed.configureTestingModule({ | |||
| declarations: [Tab2Page], | |||
| imports: [IonicModule.forRoot(), ExploreContainerComponentModule] | |||
| }).compileComponents(); | |||
| fixture = TestBed.createComponent(Tab2Page); | |||
| component = fixture.componentInstance; | |||
| fixture.detectChanges(); | |||
| })); | |||
| it('should create', () => { | |||
| expect(component).toBeTruthy(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,12 @@ | |||
| import { Component } from '@angular/core'; | |||
| @Component({ | |||
| selector: 'app-tab2', | |||
| templateUrl: 'tab2.page.html', | |||
| styleUrls: ['tab2.page.scss'] | |||
| }) | |||
| export class Tab2Page { | |||
| constructor() {} | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { RouterModule, Routes } from '@angular/router'; | |||
| import { Tab3Page } from './tab3.page'; | |||
| const routes: Routes = [ | |||
| { | |||
| path: '', | |||
| component: Tab3Page, | |||
| } | |||
| ]; | |||
| @NgModule({ | |||
| imports: [RouterModule.forChild(routes)], | |||
| exports: [RouterModule] | |||
| }) | |||
| export class Tab3PageRoutingModule {} | |||
| @@ -0,0 +1,22 @@ | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { RouterModule } from '@angular/router'; | |||
| import { NgModule } from '@angular/core'; | |||
| import { CommonModule } from '@angular/common'; | |||
| import { FormsModule } from '@angular/forms'; | |||
| import { Tab3Page } from './tab3.page'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab3PageRoutingModule } from './tab3-routing.module'; | |||
| @NgModule({ | |||
| imports: [ | |||
| IonicModule, | |||
| CommonModule, | |||
| FormsModule, | |||
| ExploreContainerComponentModule, | |||
| RouterModule.forChild([{ path: '', component: Tab3Page }]), | |||
| Tab3PageRoutingModule, | |||
| ], | |||
| declarations: [Tab3Page] | |||
| }) | |||
| export class Tab3PageModule {} | |||
| @@ -0,0 +1,17 @@ | |||
| <ion-header [translucent]="true"> | |||
| <ion-toolbar> | |||
| <ion-title> | |||
| Tab 3 | |||
| </ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <ion-content [fullscreen]="true"> | |||
| <ion-header collapse="condense"> | |||
| <ion-toolbar> | |||
| <ion-title size="large">Tab 3</ion-title> | |||
| </ion-toolbar> | |||
| </ion-header> | |||
| <app-explore-container name="Tab 3 page"></app-explore-container> | |||
| </ion-content> | |||
| @@ -0,0 +1,25 @@ | |||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { ExploreContainerComponentModule } from '../explore-container/explore-container.module'; | |||
| import { Tab3Page } from './tab3.page'; | |||
| describe('Tab3Page', () => { | |||
| let component: Tab3Page; | |||
| let fixture: ComponentFixture<Tab3Page>; | |||
| beforeEach(async(() => { | |||
| TestBed.configureTestingModule({ | |||
| declarations: [Tab3Page], | |||
| imports: [IonicModule.forRoot(), ExploreContainerComponentModule] | |||
| }).compileComponents(); | |||
| fixture = TestBed.createComponent(Tab3Page); | |||
| component = fixture.componentInstance; | |||
| fixture.detectChanges(); | |||
| })); | |||
| it('should create', () => { | |||
| expect(component).toBeTruthy(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,12 @@ | |||
| import { Component } from '@angular/core'; | |||
| @Component({ | |||
| selector: 'app-tab3', | |||
| templateUrl: 'tab3.page.html', | |||
| styleUrls: ['tab3.page.scss'] | |||
| }) | |||
| export class Tab3Page { | |||
| constructor() {} | |||
| } | |||
| @@ -0,0 +1,40 @@ | |||
| import { NgModule } from '@angular/core'; | |||
| import { RouterModule, Routes } from '@angular/router'; | |||
| import { TabsPage } from './tabs.page'; | |||
| const routes: Routes = [ | |||
| { | |||
| path: 'tabs', | |||
| component: TabsPage, | |||
| children: [ | |||
| { | |||
| path: 'tab1', | |||
| loadChildren: () => import('../tab1/tab1.module').then(m => m.Tab1PageModule) | |||
| }, | |||
| { | |||
| path: 'tab2', | |||
| loadChildren: () => import('../tab2/tab2.module').then(m => m.Tab2PageModule) | |||
| }, | |||
| { | |||
| path: 'tab3', | |||
| loadChildren: () => import('../tab3/tab3.module').then(m => m.Tab3PageModule) | |||
| }, | |||
| { | |||
| path: '', | |||
| redirectTo: '/tabs/tab1', | |||
| pathMatch: 'full' | |||
| } | |||
| ] | |||
| }, | |||
| { | |||
| path: '', | |||
| redirectTo: '/tabs/tab1', | |||
| pathMatch: 'full' | |||
| } | |||
| ]; | |||
| @NgModule({ | |||
| imports: [RouterModule.forChild(routes)], | |||
| exports: [RouterModule] | |||
| }) | |||
| export class TabsPageRoutingModule {} | |||
| @@ -0,0 +1,19 @@ | |||
| import { IonicModule } from '@ionic/angular'; | |||
| import { NgModule } from '@angular/core'; | |||
| import { CommonModule } from '@angular/common'; | |||
| import { FormsModule } from '@angular/forms'; | |||
| import { TabsPageRoutingModule } from './tabs-routing.module'; | |||
| import { TabsPage } from './tabs.page'; | |||
| @NgModule({ | |||
| imports: [ | |||
| IonicModule, | |||
| CommonModule, | |||
| FormsModule, | |||
| TabsPageRoutingModule | |||
| ], | |||
| declarations: [TabsPage] | |||
| }) | |||
| export class TabsPageModule {} | |||
| @@ -0,0 +1,20 @@ | |||
| <ion-tabs> | |||
| <ion-tab-bar slot="bottom"> | |||
| <ion-tab-button tab="tab1"> | |||
| <ion-icon name="triangle"></ion-icon> | |||
| <ion-label>Tab 1</ion-label> | |||
| </ion-tab-button> | |||
| <ion-tab-button tab="tab2"> | |||
| <ion-icon name="ellipse"></ion-icon> | |||
| <ion-label>Tab 2</ion-label> | |||
| </ion-tab-button> | |||
| <ion-tab-button tab="tab3"> | |||
| <ion-icon name="square"></ion-icon> | |||
| <ion-label>Tab 3</ion-label> | |||
| </ion-tab-button> | |||
| </ion-tab-bar> | |||
| </ion-tabs> | |||
| @@ -0,0 +1 @@ | |||
| @@ -0,0 +1,26 @@ | |||
| import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; | |||
| import { async, ComponentFixture, TestBed } from '@angular/core/testing'; | |||
| import { TabsPage } from './tabs.page'; | |||
| describe('TabsPage', () => { | |||
| let component: TabsPage; | |||
| let fixture: ComponentFixture<TabsPage>; | |||
| beforeEach(async(() => { | |||
| TestBed.configureTestingModule({ | |||
| declarations: [TabsPage], | |||
| schemas: [CUSTOM_ELEMENTS_SCHEMA], | |||
| }).compileComponents(); | |||
| })); | |||
| beforeEach(() => { | |||
| fixture = TestBed.createComponent(TabsPage); | |||
| component = fixture.componentInstance; | |||
| fixture.detectChanges(); | |||
| }); | |||
| it('should create', () => { | |||
| expect(component).toBeTruthy(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,12 @@ | |||
| import { Component } from '@angular/core'; | |||
| @Component({ | |||
| selector: 'app-tabs', | |||
| templateUrl: 'tabs.page.html', | |||
| styleUrls: ['tabs.page.scss'] | |||
| }) | |||
| export class TabsPage { | |||
| constructor() {} | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| <svg width="350" height="140" xmlns="http://www.w3.org/2000/svg" style="background:#f6f7f9"><g fill="none" fill-rule="evenodd"><path fill="#F04141" style="mix-blend-mode:multiply" d="M61.905-34.23l96.194 54.51-66.982 54.512L22 34.887z"/><circle fill="#10DC60" style="mix-blend-mode:multiply" cx="155.5" cy="135.5" r="57.5"/><path fill="#3880FF" style="mix-blend-mode:multiply" d="M208.538 9.513l84.417 15.392L223.93 93.93z"/><path fill="#FFCE00" style="mix-blend-mode:multiply" d="M268.625 106.557l46.332-26.75 46.332 26.75v53.5l-46.332 26.75-46.332-26.75z"/><circle fill="#7044FF" style="mix-blend-mode:multiply" cx="299.5" cy="9.5" r="38.5"/><rect fill="#11D3EA" style="mix-blend-mode:multiply" transform="rotate(-60 148.47 37.886)" x="143.372" y="-7.056" width="10.196" height="89.884" rx="5.098"/><path d="M-25.389 74.253l84.86 8.107c5.498.525 9.53 5.407 9.004 10.905a10 10 0 0 1-.057.477l-12.36 85.671a10.002 10.002 0 0 1-11.634 8.42l-86.351-15.226c-5.44-.959-9.07-6.145-8.112-11.584l13.851-78.551a10 10 0 0 1 10.799-8.219z" fill="#7044FF" style="mix-blend-mode:multiply"/><circle fill="#0CD1E8" style="mix-blend-mode:multiply" cx="273.5" cy="106.5" r="20.5"/></g></svg> | |||
| @@ -0,0 +1,3 @@ | |||
| export const environment = { | |||
| production: true | |||
| }; | |||
| @@ -0,0 +1,16 @@ | |||
| // This file can be replaced during build by using the `fileReplacements` array. | |||
| // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. | |||
| // The list of file replacements can be found in `angular.json`. | |||
| export const environment = { | |||
| production: false | |||
| }; | |||
| /* | |||
| * For easier debugging in development mode, you can import the following file | |||
| * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. | |||
| * | |||
| * This import should be commented out in production mode because it will have a negative impact | |||
| * on performance if an error is thrown. | |||
| */ | |||
| // import 'zone.js/dist/zone-error'; // Included with Angular CLI. | |||
| @@ -0,0 +1,26 @@ | |||
| /* | |||
| * App Global CSS | |||
| * ---------------------------------------------------------------------------- | |||
| * Put style rules here that you want to apply globally. These styles are for | |||
| * the entire app and not just one component. Additionally, this file can be | |||
| * used as an entry point to import other CSS/Sass files to be included in the | |||
| * output CSS. | |||
| * For more information on global stylesheets, visit the documentation: | |||
| * https://ionicframework.com/docs/layout/global-stylesheets | |||
| */ | |||
| /* Core CSS required for Ionic components to work properly */ | |||
| @import "~@ionic/angular/css/core.css"; | |||
| /* Basic CSS for apps built with Ionic */ | |||
| @import "~@ionic/angular/css/normalize.css"; | |||
| @import "~@ionic/angular/css/structure.css"; | |||
| @import "~@ionic/angular/css/typography.css"; | |||
| @import '~@ionic/angular/css/display.css'; | |||
| /* Optional CSS utils that can be commented out */ | |||
| @import "~@ionic/angular/css/padding.css"; | |||
| @import "~@ionic/angular/css/float-elements.css"; | |||
| @import "~@ionic/angular/css/text-alignment.css"; | |||
| @import "~@ionic/angular/css/text-transformation.css"; | |||
| @import "~@ionic/angular/css/flex-utils.css"; | |||
| @@ -0,0 +1,26 @@ | |||
| <!DOCTYPE html> | |||
| <html lang="en"> | |||
| <head> | |||
| <meta charset="utf-8" /> | |||
| <title>Ionic App</title> | |||
| <base href="/" /> | |||
| <meta name="color-scheme" content="light dark" /> | |||
| <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" /> | |||
| <meta name="format-detection" content="telephone=no" /> | |||
| <meta name="msapplication-tap-highlight" content="no" /> | |||
| <link rel="icon" type="image/png" href="assets/icon/favicon.png" /> | |||
| <!-- add to homescreen for ios --> | |||
| <meta name="apple-mobile-web-app-capable" content="yes" /> | |||
| <meta name="apple-mobile-web-app-status-bar-style" content="black" /> | |||
| </head> | |||
| <body> | |||
| <app-root></app-root> | |||
| </body> | |||
| </html> | |||
| @@ -0,0 +1,12 @@ | |||
| import { enableProdMode } from '@angular/core'; | |||
| import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; | |||
| import { AppModule } from './app/app.module'; | |||
| import { environment } from './environments/environment'; | |||
| if (environment.production) { | |||
| enableProdMode(); | |||
| } | |||
| platformBrowserDynamic().bootstrapModule(AppModule) | |||
| .catch(err => console.log(err)); | |||
| @@ -0,0 +1,66 @@ | |||
| /** | |||
| * This file includes polyfills needed by Angular and is loaded before the app. | |||
| * You can add your own extra polyfills to this file. | |||
| * | |||
| * This file is divided into 2 sections: | |||
| * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. | |||
| * 2. Application imports. Files imported after ZoneJS that should be loaded before your main | |||
| * file. | |||
| * | |||
| * The current setup is for so-called "evergreen" browsers; the last versions of browsers that | |||
| * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), | |||
| * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. | |||
| * | |||
| * Learn more in https://angular.io/guide/browser-support | |||
| */ | |||
| /*************************************************************************************************** | |||
| * BROWSER POLYFILLS | |||
| */ | |||
| /** IE10 and IE11 requires the following for NgClass support on SVG elements */ | |||
| // import 'classlist.js'; // Run `npm install --save classlist.js`. | |||
| /** | |||
| * Web Animations `@angular/platform-browser/animations` | |||
| * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. | |||
| * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). | |||
| */ | |||
| // import 'web-animations-js'; // Run `npm install --save web-animations-js`. | |||
| /** | |||
| * By default, zone.js will patch all possible macroTask and DomEvents | |||
| * user can disable parts of macroTask/DomEvents patch by setting following flags | |||
| * because those flags need to be set before `zone.js` being loaded, and webpack | |||
| * will put import in the top of bundle, so user need to create a separate file | |||
| * in this directory (for example: zone-flags.ts), and put the following flags | |||
| * into that file, and then add the following code before importing zone.js. | |||
| * import './zone-flags.ts'; | |||
| * | |||
| * The flags allowed in zone-flags.ts are listed here. | |||
| * | |||
| * The following flags will work for all browsers. | |||
| * | |||
| * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame | |||
| * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick | |||
| * (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames | |||
| * | |||
| * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js | |||
| * with the following flag, it will bypass `zone.js` patch for IE/Edge | |||
| * | |||
| * (window as any).__Zone_enable_cross_context_check = true; | |||
| * | |||
| */ | |||
| import './zone-flags'; | |||
| /*************************************************************************************************** | |||
| * Zone JS is required by default for Angular itself. | |||
| */ | |||
| import 'zone.js/dist/zone'; // Included with Angular CLI. | |||
| /*************************************************************************************************** | |||
| * APPLICATION IMPORTS | |||
| */ | |||
| @@ -0,0 +1,20 @@ | |||
| // This file is required by karma.conf.js and loads recursively all the .spec and framework files | |||
| import 'zone.js/dist/zone-testing'; | |||
| import { getTestBed } from '@angular/core/testing'; | |||
| import { | |||
| BrowserDynamicTestingModule, | |||
| platformBrowserDynamicTesting | |||
| } from '@angular/platform-browser-dynamic/testing'; | |||
| declare const require: any; | |||
| // First, initialize the Angular testing environment. | |||
| getTestBed().initTestEnvironment( | |||
| BrowserDynamicTestingModule, | |||
| platformBrowserDynamicTesting() | |||
| ); | |||
| // Then we find all the tests. | |||
| const context = require.context('./', true, /\.spec\.ts$/); | |||
| // And load the modules. | |||
| context.keys().map(context); | |||
| @@ -0,0 +1,232 @@ | |||
| // Ionic Variables and Theming. For more info, please see: | |||
| // http://ionicframework.com/docs/theming/ | |||
| /** Ionic CSS Variables **/ | |||
| :root { | |||
| /** primary **/ | |||
| --ion-color-primary: #3880ff; | |||
| --ion-color-primary-rgb: 56, 128, 255; | |||
| --ion-color-primary-contrast: #ffffff; | |||
| --ion-color-primary-contrast-rgb: 255, 255, 255; | |||
| --ion-color-primary-shade: #3171e0; | |||
| --ion-color-primary-tint: #4c8dff; | |||
| /** secondary **/ | |||
| --ion-color-secondary: #3dc2ff; | |||
| --ion-color-secondary-rgb: 61, 194, 255; | |||
| --ion-color-secondary-contrast: #ffffff; | |||
| --ion-color-secondary-contrast-rgb: 255, 255, 255; | |||
| --ion-color-secondary-shade: #36abe0; | |||
| --ion-color-secondary-tint: #50c8ff; | |||
| /** tertiary **/ | |||
| --ion-color-tertiary: #5260ff; | |||
| --ion-color-tertiary-rgb: 82, 96, 255; | |||
| --ion-color-tertiary-contrast: #ffffff; | |||
| --ion-color-tertiary-contrast-rgb: 255, 255, 255; | |||
| --ion-color-tertiary-shade: #4854e0; | |||
| --ion-color-tertiary-tint: #6370ff; | |||
| /** success **/ | |||
| --ion-color-success: #2dd36f; | |||
| --ion-color-success-rgb: 45, 211, 111; | |||
| --ion-color-success-contrast: #ffffff; | |||
| --ion-color-success-contrast-rgb: 255, 255, 255; | |||
| --ion-color-success-shade: #28ba62; | |||
| --ion-color-success-tint: #42d77d; | |||
| /** warning **/ | |||
| --ion-color-warning: #ffc409; | |||
| --ion-color-warning-rgb: 255, 196, 9; | |||
| --ion-color-warning-contrast: #000000; | |||
| --ion-color-warning-contrast-rgb: 0, 0, 0; | |||
| --ion-color-warning-shade: #e0ac08; | |||
| --ion-color-warning-tint: #ffca22; | |||
| /** danger **/ | |||
| --ion-color-danger: #eb445a; | |||
| --ion-color-danger-rgb: 235, 68, 90; | |||
| --ion-color-danger-contrast: #ffffff; | |||
| --ion-color-danger-contrast-rgb: 255, 255, 255; | |||
| --ion-color-danger-shade: #cf3c4f; | |||
| --ion-color-danger-tint: #ed576b; | |||
| /** dark **/ | |||
| --ion-color-dark: #222428; | |||
| --ion-color-dark-rgb: 34, 36, 40; | |||
| --ion-color-dark-contrast: #ffffff; | |||
| --ion-color-dark-contrast-rgb: 255, 255, 255; | |||
| --ion-color-dark-shade: #1e2023; | |||
| --ion-color-dark-tint: #383a3e; | |||
| /** medium **/ | |||
| --ion-color-medium: #92949c; | |||
| --ion-color-medium-rgb: 146, 148, 156; | |||
| --ion-color-medium-contrast: #ffffff; | |||
| --ion-color-medium-contrast-rgb: 255, 255, 255; | |||
| --ion-color-medium-shade: #808289; | |||
| --ion-color-medium-tint: #9d9fa6; | |||
| /** light **/ | |||
| --ion-color-light: #f4f5f8; | |||
| --ion-color-light-rgb: 244, 245, 248; | |||
| --ion-color-light-contrast: #000000; | |||
| --ion-color-light-contrast-rgb: 0, 0, 0; | |||
| --ion-color-light-shade: #d7d8da; | |||
| --ion-color-light-tint: #f5f6f9; | |||
| } | |||
| @media (prefers-color-scheme: dark) { | |||
| /* | |||
| * Dark Colors | |||
| * ------------------------------------------- | |||
| */ | |||
| body { | |||
| --ion-color-primary: #428cff; | |||
| --ion-color-primary-rgb: 66,140,255; | |||
| --ion-color-primary-contrast: #ffffff; | |||
| --ion-color-primary-contrast-rgb: 255,255,255; | |||
| --ion-color-primary-shade: #3a7be0; | |||
| --ion-color-primary-tint: #5598ff; | |||
| --ion-color-secondary: #50c8ff; | |||
| --ion-color-secondary-rgb: 80,200,255; | |||
| --ion-color-secondary-contrast: #ffffff; | |||
| --ion-color-secondary-contrast-rgb: 255,255,255; | |||
| --ion-color-secondary-shade: #46b0e0; | |||
| --ion-color-secondary-tint: #62ceff; | |||
| --ion-color-tertiary: #6a64ff; | |||
| --ion-color-tertiary-rgb: 106,100,255; | |||
| --ion-color-tertiary-contrast: #ffffff; | |||
| --ion-color-tertiary-contrast-rgb: 255,255,255; | |||
| --ion-color-tertiary-shade: #5d58e0; | |||
| --ion-color-tertiary-tint: #7974ff; | |||
| --ion-color-success: #2fdf75; | |||
| --ion-color-success-rgb: 47,223,117; | |||
| --ion-color-success-contrast: #000000; | |||
| --ion-color-success-contrast-rgb: 0,0,0; | |||
| --ion-color-success-shade: #29c467; | |||
| --ion-color-success-tint: #44e283; | |||
| --ion-color-warning: #ffd534; | |||
| --ion-color-warning-rgb: 255,213,52; | |||
| --ion-color-warning-contrast: #000000; | |||
| --ion-color-warning-contrast-rgb: 0,0,0; | |||
| --ion-color-warning-shade: #e0bb2e; | |||
| --ion-color-warning-tint: #ffd948; | |||
| --ion-color-danger: #ff4961; | |||
| --ion-color-danger-rgb: 255,73,97; | |||
| --ion-color-danger-contrast: #ffffff; | |||
| --ion-color-danger-contrast-rgb: 255,255,255; | |||
| --ion-color-danger-shade: #e04055; | |||
| --ion-color-danger-tint: #ff5b71; | |||
| --ion-color-dark: #f4f5f8; | |||
| --ion-color-dark-rgb: 244,245,248; | |||
| --ion-color-dark-contrast: #000000; | |||
| --ion-color-dark-contrast-rgb: 0,0,0; | |||
| --ion-color-dark-shade: #d7d8da; | |||
| --ion-color-dark-tint: #f5f6f9; | |||
| --ion-color-medium: #989aa2; | |||
| --ion-color-medium-rgb: 152,154,162; | |||
| --ion-color-medium-contrast: #000000; | |||
| --ion-color-medium-contrast-rgb: 0,0,0; | |||
| --ion-color-medium-shade: #86888f; | |||
| --ion-color-medium-tint: #a2a4ab; | |||
| --ion-color-light: #222428; | |||
| --ion-color-light-rgb: 34,36,40; | |||
| --ion-color-light-contrast: #ffffff; | |||
| --ion-color-light-contrast-rgb: 255,255,255; | |||
| --ion-color-light-shade: #1e2023; | |||
| --ion-color-light-tint: #383a3e; | |||
| } | |||
| /* | |||
| * iOS Dark Theme | |||
| * ------------------------------------------- | |||
| */ | |||
| .ios body { | |||
| --ion-background-color: #000000; | |||
| --ion-background-color-rgb: 0,0,0; | |||
| --ion-text-color: #ffffff; | |||
| --ion-text-color-rgb: 255,255,255; | |||
| --ion-color-step-50: #0d0d0d; | |||
| --ion-color-step-100: #1a1a1a; | |||
| --ion-color-step-150: #262626; | |||
| --ion-color-step-200: #333333; | |||
| --ion-color-step-250: #404040; | |||
| --ion-color-step-300: #4d4d4d; | |||
| --ion-color-step-350: #595959; | |||
| --ion-color-step-400: #666666; | |||
| --ion-color-step-450: #737373; | |||
| --ion-color-step-500: #808080; | |||
| --ion-color-step-550: #8c8c8c; | |||
| --ion-color-step-600: #999999; | |||
| --ion-color-step-650: #a6a6a6; | |||
| --ion-color-step-700: #b3b3b3; | |||
| --ion-color-step-750: #bfbfbf; | |||
| --ion-color-step-800: #cccccc; | |||
| --ion-color-step-850: #d9d9d9; | |||
| --ion-color-step-900: #e6e6e6; | |||
| --ion-color-step-950: #f2f2f2; | |||
| --ion-toolbar-background: #0d0d0d; | |||
| --ion-item-background: #000000; | |||
| --ion-card-background: #1c1c1d; | |||
| } | |||
| /* | |||
| * Material Design Dark Theme | |||
| * ------------------------------------------- | |||
| */ | |||
| .md body { | |||
| --ion-background-color: #121212; | |||
| --ion-background-color-rgb: 18,18,18; | |||
| --ion-text-color: #ffffff; | |||
| --ion-text-color-rgb: 255,255,255; | |||
| --ion-border-color: #222222; | |||
| --ion-color-step-50: #1e1e1e; | |||
| --ion-color-step-100: #2a2a2a; | |||
| --ion-color-step-150: #363636; | |||
| --ion-color-step-200: #414141; | |||
| --ion-color-step-250: #4d4d4d; | |||
| --ion-color-step-300: #595959; | |||
| --ion-color-step-350: #656565; | |||
| --ion-color-step-400: #717171; | |||
| --ion-color-step-450: #7d7d7d; | |||
| --ion-color-step-500: #898989; | |||
| --ion-color-step-550: #949494; | |||
| --ion-color-step-600: #a0a0a0; | |||
| --ion-color-step-650: #acacac; | |||
| --ion-color-step-700: #b8b8b8; | |||
| --ion-color-step-750: #c4c4c4; | |||
| --ion-color-step-800: #d0d0d0; | |||
| --ion-color-step-850: #dbdbdb; | |||
| --ion-color-step-900: #e7e7e7; | |||
| --ion-color-step-950: #f3f3f3; | |||
| --ion-item-background: #1e1e1e; | |||
| --ion-toolbar-background: #1f1f1f; | |||
| --ion-tab-bar-background: #1f1f1f; | |||
| --ion-card-background: #1e1e1e; | |||
| } | |||
| } | |||
| @@ -0,0 +1,5 @@ | |||
| /** | |||
| * Prevents Angular change detection from | |||
| * running with certain Web Component callbacks | |||
| */ | |||
| (window as any).__Zone_disable_customElements = true; | |||
| @@ -0,0 +1,18 @@ | |||
| { | |||
| "extends": "./tsconfig.json", | |||
| "compilerOptions": { | |||
| "outDir": "./out-tsc/app", | |||
| "types": [] | |||
| }, | |||
| "files": [ | |||
| "src/main.ts", | |||
| "src/polyfills.ts" | |||
| ], | |||
| "include": [ | |||
| "src/**/*.ts", | |||
| "src/**/*.d.ts" | |||
| ], | |||
| "exclude": [ | |||
| "src/**/*.spec.ts" | |||
| ] | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| { | |||
| "compileOnSave": false, | |||
| "compilerOptions": { | |||
| "baseUrl": "./", | |||
| "outDir": "./dist/out-tsc", | |||
| "sourceMap": true, | |||
| "declaration": false, | |||
| "downlevelIteration": true, | |||
| "experimentalDecorators": true, | |||
| "module": "esnext", | |||
| "moduleResolution": "node", | |||
| "importHelpers": true, | |||
| "target": "es2015", | |||
| "lib": [ | |||
| "es2018", | |||
| "dom" | |||
| ] | |||
| }, | |||
| "angularCompilerOptions": { | |||
| "fullTemplateTypeCheck": true, | |||
| "strictInjectionParameters": true | |||
| } | |||
| } | |||
| @@ -0,0 +1,18 @@ | |||
| { | |||
| "extends": "./tsconfig.json", | |||
| "compilerOptions": { | |||
| "outDir": "./out-tsc/spec", | |||
| "types": [ | |||
| "jasmine", | |||
| "node" | |||
| ] | |||
| }, | |||
| "files": [ | |||
| "src/test.ts", | |||
| "src/polyfills.ts" | |||
| ], | |||
| "include": [ | |||
| "src/**/*.spec.ts", | |||
| "src/**/*.d.ts" | |||
| ] | |||
| } | |||
| @@ -0,0 +1,149 @@ | |||
| { | |||
| "extends": "tslint:recommended", | |||
| "rules": { | |||
| "align": { | |||
| "options": [ | |||
| "parameters", | |||
| "statements" | |||
| ] | |||
| }, | |||
| "array-type": false, | |||
| "arrow-return-shorthand": true, | |||
| "curly": true, | |||
| "deprecation": { | |||
| "severity": "warning" | |||
| }, | |||
| "component-class-suffix": [true, "Page", "Component"], | |||
| "contextual-lifecycle": true, | |||
| "directive-class-suffix": true, | |||
| "directive-selector": [ | |||
| true, | |||
| "attribute", | |||
| "app", | |||
| "camelCase" | |||
| ], | |||
| "component-selector": [ | |||
| true, | |||
| "element", | |||
| "app", | |||
| "kebab-case" | |||
| ], | |||
| "eofline": true, | |||
| "import-blacklist": [ | |||
| true, | |||
| "rxjs/Rx" | |||
| ], | |||
| "import-spacing": true, | |||
| "indent": { | |||
| "options": [ | |||
| "spaces" | |||
| ] | |||
| }, | |||
| "max-classes-per-file": false, | |||
| "max-line-length": [ | |||
| true, | |||
| 140 | |||
| ], | |||
| "member-ordering": [ | |||
| true, | |||
| { | |||
| "order": [ | |||
| "static-field", | |||
| "instance-field", | |||
| "static-method", | |||
| "instance-method" | |||
| ] | |||
| } | |||
| ], | |||
| "no-console": [ | |||
| true, | |||
| "debug", | |||
| "info", | |||
| "time", | |||
| "timeEnd", | |||
| "trace" | |||
| ], | |||
| "no-empty": false, | |||
| "no-inferrable-types": [ | |||
| true, | |||
| "ignore-params" | |||
| ], | |||
| "no-non-null-assertion": true, | |||
| "no-redundant-jsdoc": true, | |||
| "no-switch-case-fall-through": true, | |||
| "no-var-requires": false, | |||
| "object-literal-key-quotes": [ | |||
| true, | |||
| "as-needed" | |||
| ], | |||
| "quotemark": [ | |||
| true, | |||
| "single" | |||
| ], | |||
| "semicolon": { | |||
| "options": [ | |||
| "always" | |||
| ] | |||
| }, | |||
| "space-before-function-paren": { | |||
| "options": { | |||
| "anonymous": "never", | |||
| "asyncArrow": "always", | |||
| "constructor": "never", | |||
| "method": "never", | |||
| "named": "never" | |||
| } | |||
| }, | |||
| "typedef-whitespace": { | |||
| "options": [ | |||
| { | |||
| "call-signature": "nospace", | |||
| "index-signature": "nospace", | |||
| "parameter": "nospace", | |||
| "property-declaration": "nospace", | |||
| "variable-declaration": "nospace" | |||
| }, | |||
| { | |||
| "call-signature": "onespace", | |||
| "index-signature": "onespace", | |||
| "parameter": "onespace", | |||
| "property-declaration": "onespace", | |||
| "variable-declaration": "onespace" | |||
| } | |||
| ] | |||
| }, | |||
| "variable-name": { | |||
| "options": [ | |||
| "ban-keywords", | |||
| "check-format", | |||
| "allow-pascal-case" | |||
| ] | |||
| }, | |||
| "whitespace": { | |||
| "options": [ | |||
| "check-branch", | |||
| "check-decl", | |||
| "check-operator", | |||
| "check-separator", | |||
| "check-type", | |||
| "check-typecast" | |||
| ] | |||
| }, | |||
| "no-conflicting-lifecycle": true, | |||
| "no-host-metadata-property": true, | |||
| "no-input-rename": true, | |||
| "no-inputs-metadata-property": true, | |||
| "no-output-native": true, | |||
| "no-output-on-prefix": true, | |||
| "no-output-rename": true, | |||
| "no-outputs-metadata-property": true, | |||
| "template-banana-in-box": true, | |||
| "template-no-negated-async": true, | |||
| "use-lifecycle-interface": true, | |||
| "use-pipe-transform-interface": true, | |||
| "object-literal-sort-keys": false | |||
| }, | |||
| "rulesDirectory": [ | |||
| "codelyzer" | |||
| ] | |||
| } | |||