├── .gitignore
├── LICENSE
├── README.md
├── config.xml
├── gulpfile.js
├── package.json
├── resources
├── icons
│ ├── Icon-60@2x.png
│ ├── Icon-60@3x.png
│ ├── Icon-76.png
│ ├── Icon-76@2x.png
│ ├── Icon-Small-40.png
│ ├── Icon-Small-40@2x.png
│ ├── Icon-Small-40@3x.png
│ ├── Icon-Small.png
│ ├── Icon-Small@2x.png
│ ├── Icon-Small@3x.png
│ └── iTunesArtwork@2x.png
└── splash
│ ├── 1242x2208.png
│ ├── 640x1136.png
│ ├── 640x960.png
│ └── 750x1334.png
└── src
├── css
├── app.less
├── components.less
├── demo.less
├── ionicons
│ ├── _ionicons-font.less
│ ├── _ionicons-icons.less
│ ├── _ionicons-variables.less
│ └── ionicons.less
├── variables.less
└── views
│ ├── passcode.less
│ └── person.less
├── data
└── months.js
├── fonts
├── ionicons.eot
├── ionicons.svg
├── ionicons.ttf
└── ionicons.woff
├── img
├── favicon.ico
├── icon-qr-inverted.svg
├── icon-qr.svg
├── ios-icon.png
├── logo-mark.svg
├── mock
│ └── qr_code.png
├── organisers
│ ├── cramon.jpg
│ ├── katy.jpg
│ └── pat.jpg
└── speakers
│ ├── SebastianProfile.jpg
│ ├── aria-buckles.jpg
│ ├── ben-alpert.jpeg
│ ├── ben-gotow.jpg
│ ├── cheng-lou.jpg
│ ├── christopher-chedeau.jpg
│ ├── dan-abramov.jpg
│ ├── dlschafer.jpg
│ ├── elie-rotenberg.jpg
│ ├── evan-morikawa.jpg
│ ├── jed-watson.jpg
│ ├── joseph-savona.jpg
│ ├── kevin-robinson.png
│ ├── lee-byron.jpg
│ ├── michael-chan.jpg
│ ├── michael-jackson.jpg
│ ├── michael-ridgway.jpg
│ ├── mikhail-davydov.jpg
│ ├── ryan-florence.jpg
│ ├── schrockn.jpg
│ ├── sebastian-mcKenzie.png
│ └── spencer-ahrens.jpg
├── index.html
└── js
├── app.js
├── components
└── svg
│ └── icon-qr.js
├── config.js
├── stores
└── people.js
└── views
├── controls.js
├── form.js
├── list-complex.js
├── list-details.js
├── list-simple.js
├── lists.js
├── transitions-target-over.js
├── transitions-target.js
└── transitions.js
/.gitignore:
--------------------------------------------------------------------------------
1 | www
2 |
3 | # Logs
4 | logs
5 | *.log
6 |
7 | # Runtime data
8 | pids
9 | *.pid
10 | *.seed
11 |
12 | # Directory for instrumented libs generated by jscoverage/JSCover
13 | lib-cov
14 |
15 | # Coverage directory used by tools like istanbul
16 | coverage
17 |
18 | # Common
19 | .DS_Store
20 | build
21 |
22 | # Node.js
23 | node_modules
24 |
25 | # Xcode
26 | *.mode1v3
27 | *.mode2v3
28 | *.perspectivev3
29 | *.pbxuser
30 | *.hmap
31 | *.ipa
32 | *.xcuserstate
33 | *.xccheckout
34 | *.moved-aside
35 | *.perspectivev3
36 | xcuserdata
37 | DerivedData
38 |
39 | # Android
40 | build.xml
41 | local.properties
42 | gradlew
43 | gradlew.bat
44 | gradle
45 | ant-build
46 | ant-gen
47 | gen
48 | out
49 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Thinkmill Pty Ltd.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | TouchstoneJS Starter
2 | ====================
3 |
4 | Reference TouchstoneJS App with examples of all UI components.
5 |
6 | **See the demo [live here](https://touchstonejs.github.io/touchstonejs-starter/)**.
7 |
8 | To build and preview locally, run `npm start`. It will build the app with browserify, and start a preview server at [localhost:8000](http://localhost:8000).
9 |
10 | The source for the app is in the `/src` folder; the app will be built to `/www`.
11 |
12 | ## Use with Cordova
13 |
14 | Here's how to get the Starter project running in a Cordova app, in the iOS Simulator. You'll need a Mac and XCode to follow this process. Check the [Cordova Docs](https://cordova.apache.org) for more information, and instructions on how to work with other platforms like Android.
15 |
16 | ### Getting set up
17 |
18 | First, Install Cordova:
19 |
20 | ```
21 | npm install -g cordova
22 | ```
23 |
24 | Create a new Project:
25 |
26 | ```
27 | cordova create Starter
28 | ```
29 |
30 | Add your target platform:
31 |
32 | ```
33 | cordova platform add ios
34 | ```
35 |
36 | ### Building and running the project
37 |
38 | Build the `www` folder using the build script:
39 |
40 | ```
41 | npm run build
42 | ```
43 |
44 | Then prepare the cordova project:
45 |
46 | ```
47 | cordova prepare
48 | ```
49 |
50 | You can then open the XCode Project here: `platforms/ios/Starter.xcodeproj` and run it in the simulator or on a device.
51 |
52 | To continuously build the source as you make changes, run:
53 |
54 | ```
55 | npm run watch
56 | ```
57 |
58 | For production use, you can strip debug code and minify the build:
59 |
60 | ```
61 | npm run build:production
62 | ```
63 |
64 |
65 | # Feedback / Questions?
66 |
67 | Let us know! Contact us at [thinkmill.com.au](http://www.thinkmill.com.au/) or open an issue.
68 |
69 | We welcome all ideas, contributions and PRs.
70 |
71 |
72 | # License
73 |
74 | MIT. Copyright (c) 2015 Thinkmill Pty Ltd.
75 |
--------------------------------------------------------------------------------
/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Starter
4 |
5 |
6 | Touchstone Starter App
7 |
8 |
9 |
10 | Thinkmill Team
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | require('touchstonejs-tasks')(require('gulp'));
2 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "touchstonejs-starter",
3 | "version": "1.0.0",
4 | "description": "Touchstone Starter",
5 | "main": "src/js/app.js",
6 | "author": "Jed Watson",
7 | "license": "MIT",
8 | "private": true,
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/touchstonejs/touchstonejs-starter.git"
12 | },
13 | "dependencies": {
14 | "async": "^1.5.0",
15 | "classnames": "^2.2.1",
16 | "cordova-dialogs": "^1.0.2",
17 | "httpify": "^3.0.0",
18 | "react": "^0.14.3",
19 | "react-addons-css-transition-group": "^0.14.3",
20 | "react-container": "^0.3.1",
21 | "react-dom": "^0.14.3",
22 | "react-sentry": "^1.0.2",
23 | "react-tappable": "^0.7.2",
24 | "react-timers": "^5.0.0",
25 | "touchstonejs": "^0.7.3"
26 | },
27 | "devDependencies": {
28 | "gulp": "^3.9.0",
29 | "happiness": "*",
30 | "touchstonejs-tasks": "*"
31 | },
32 | "scripts": {
33 | "build": "gulp clean && gulp build",
34 | "build:production": "gulp clean && NODE_ENV=production gulp build",
35 | "lint": "happiness",
36 | "test": "npm run lint",
37 | "start": "gulp clean && gulp dev",
38 | "watch": "gulp clean && gulp watch"
39 | },
40 | "happiness": {
41 | "ignore": [
42 | "platforms",
43 | "plugins",
44 | "src/data",
45 | "www"
46 | ]
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/resources/icons/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-60@2x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-60@3x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-76.png
--------------------------------------------------------------------------------
/resources/icons/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-76@2x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small-40.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small@2x.png
--------------------------------------------------------------------------------
/resources/icons/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/Icon-Small@3x.png
--------------------------------------------------------------------------------
/resources/icons/iTunesArtwork@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/icons/iTunesArtwork@2x.png
--------------------------------------------------------------------------------
/resources/splash/1242x2208.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/splash/1242x2208.png
--------------------------------------------------------------------------------
/resources/splash/640x1136.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/splash/640x1136.png
--------------------------------------------------------------------------------
/resources/splash/640x960.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/splash/640x960.png
--------------------------------------------------------------------------------
/resources/splash/750x1334.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/resources/splash/750x1334.png
--------------------------------------------------------------------------------
/src/css/app.less:
--------------------------------------------------------------------------------
1 | //
2 | // App
3 | // ==============================
4 |
5 |
6 |
7 |
8 | @import "ionicons/ionicons.less";
9 | @import "../../node_modules/touchstonejs/less/touchstone.less";
10 | @import "../../node_modules/react-container/less/component.less";
11 | @import "views/passcode.less";
12 | @import "views/person.less";
13 |
14 | @import "components.less";
15 | @import "demo.less";
16 |
17 |
18 |
19 |
20 | //
21 | // Mixins
22 | // ==============================
23 |
24 |
25 |
26 |
27 | // Avatars
28 | // ------------------------------
29 |
30 | .avatar(@size) {
31 | .square(@size);
32 | background: fade(@text-color, 10%);
33 | border-radius: 50%;
34 | border: 3px solid fade(@text-color, 20%);
35 | padding: 3px;
36 | }
--------------------------------------------------------------------------------
/src/css/components.less:
--------------------------------------------------------------------------------
1 | //
2 | // Components
3 | // ==============================
4 |
5 |
6 |
7 | // Tab bar
8 | // ------------------------------
9 |
10 | .Tabs-Icon--lists::before {
11 | content: @ionicon-var-ios-list-outline;
12 |
13 | .is-selected > & {
14 | content: @ionicon-var-ios-list;
15 | }
16 | }
17 | .Tabs-Icon--forms::before {
18 | content: @ionicon-var-ios-copy-outline;
19 |
20 | .is-selected > & {
21 | content: @ionicon-var-ios-copy;
22 | }
23 | }
24 | .Tabs-Icon--controls::before {
25 | content: @ionicon-var-ios-settings;
26 |
27 | .is-selected > & {
28 | content: @ionicon-var-ios-settings-strong;
29 | }
30 | }
31 | .Tabs-Icon--transitions::before {
32 | content: @ionicon-var-ios-browsers-outline;
33 |
34 | .is-selected > & {
35 | content: @ionicon-var-ios-browsers;
36 | }
37 | }
--------------------------------------------------------------------------------
/src/css/demo.less:
--------------------------------------------------------------------------------
1 | //
2 | // Demo
3 | // ==============================
4 |
5 |
6 |
7 | // Variables
8 | // ------------------------------
9 |
10 |
11 | @demo-bg: #c32964; // touchstone magenta
12 |
13 | @iphone4-width: 320px;
14 | @iphone4-height: 480px;
15 |
16 | @iphone5-width: 340px;
17 | @iphone5-height: 568px;
18 |
19 | @iphone6-width: 376px;
20 | @iphone6-height: 668px;
21 |
22 | @device-width: @iphone6-width;
23 | @device-height: @iphone6-height;
24 |
25 | @silhouette-chrome-vertical: 50px;
26 | @silhouette-chrome-horizontal: 10px;
27 | @silhouette-width: @device-width + (@silhouette-chrome-horizontal * 2);
28 | @silhouette-height: @device-height + (@silhouette-chrome-vertical * 2);
29 |
30 |
31 |
32 | #app {
33 | height: 100%;
34 | position: absolute;
35 | width: 100%;
36 | }
37 | .app-wrapper,
38 | .device-silhouette {
39 | height: 100%;
40 | width: 100%;
41 | }
42 |
43 |
44 | // desktop wrapper
45 | @media only screen and (min-width : 480px) {
46 |
47 | // make it pretty!
48 |
49 | #app {
50 | #gradient .directional( spin(@demo-bg,-22%), spin(@demo-bg,22%), 135deg );
51 | background-color: @demo-bg;
52 | }
53 |
54 | // center the app inside the viewport
55 |
56 | .app-wrapper {
57 | .size(@device-width,@device-height);
58 | background: none;
59 | left: 50%;
60 | margin-left: -(@device-width / 2);
61 | margin-top: -(@device-height / 2);
62 | overflow: visible;
63 | position: absolute;
64 | top: 50%;
65 | }
66 |
67 | // nice for demonstrating on desktop
68 |
69 | .device-silhouette {
70 | .size(@silhouette-width, @silhouette-height);
71 | background-color: fade(black, 20%);
72 | border-radius: 20px;
73 | margin: -@silhouette-chrome-vertical -@silhouette-chrome-horizontal;
74 | padding: @silhouette-chrome-vertical @silhouette-chrome-horizontal;
75 | }
76 | }
--------------------------------------------------------------------------------
/src/css/ionicons/_ionicons-font.less:
--------------------------------------------------------------------------------
1 | // Ionicons Font Path
2 | // --------------------------
3 |
4 | @font-face {
5 | font-family: @ionicons-font-family;
6 | src:url("@{ionicons-font-path}/ionicons.eot?v=@{ionicons-version}");
7 | src:url("@{ionicons-font-path}/ionicons.eot?v=@{ionicons-version}#iefix") format("embedded-opentype"),
8 | url("@{ionicons-font-path}/ionicons.ttf?v=@{ionicons-version}") format("truetype"),
9 | url("@{ionicons-font-path}/ionicons.woff?v=@{ionicons-version}") format("woff"),
10 | url("@{ionicons-font-path}/ionicons.svg?v=@{ionicons-version}#Ionicons") format("svg");
11 | font-weight: normal;
12 | font-style: normal;
13 | }
14 |
15 | .ion {
16 | display: inline-block;
17 | font-family: @ionicons-font-family;
18 | speak: none;
19 | font-style: normal;
20 | font-weight: normal;
21 | font-variant: normal;
22 | text-transform: none;
23 | text-rendering: auto;
24 | line-height: 1;
25 | -webkit-font-smoothing: antialiased;
26 | -moz-osx-font-smoothing: grayscale;
27 | }
--------------------------------------------------------------------------------
/src/css/ionicons/_ionicons-variables.less:
--------------------------------------------------------------------------------
1 | /*!
2 | Ionicons, v2.0.0
3 | Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
4 | https://twitter.com/benjsperry https://twitter.com/ionicframework
5 | MIT License: https://github.com/driftyco/ionicons
6 | */
7 | // Ionicons Variables
8 | // --------------------------
9 |
10 | @ionicons-font-path: "../fonts";
11 | @ionicons-font-family: "Ionicons";
12 | @ionicons-version: "2.0.0";
13 | @ionicons-prefix: ion-;
14 |
15 | @ionicon-var-alert: "\f101";
16 | @ionicon-var-alert-circled: "\f100";
17 | @ionicon-var-android-add: "\f2c7";
18 | @ionicon-var-android-add-circle: "\f359";
19 | @ionicon-var-android-alarm-clock: "\f35a";
20 | @ionicon-var-android-alert: "\f35b";
21 | @ionicon-var-android-apps: "\f35c";
22 | @ionicon-var-android-archive: "\f2c9";
23 | @ionicon-var-android-arrow-back: "\f2ca";
24 | @ionicon-var-android-arrow-down: "\f35d";
25 | @ionicon-var-android-arrow-dropdown: "\f35f";
26 | @ionicon-var-android-arrow-dropdown-circle: "\f35e";
27 | @ionicon-var-android-arrow-dropleft: "\f361";
28 | @ionicon-var-android-arrow-dropleft-circle: "\f360";
29 | @ionicon-var-android-arrow-dropright: "\f363";
30 | @ionicon-var-android-arrow-dropright-circle: "\f362";
31 | @ionicon-var-android-arrow-dropup: "\f365";
32 | @ionicon-var-android-arrow-dropup-circle: "\f364";
33 | @ionicon-var-android-arrow-forward: "\f30f";
34 | @ionicon-var-android-arrow-up: "\f366";
35 | @ionicon-var-android-attach: "\f367";
36 | @ionicon-var-android-bar: "\f368";
37 | @ionicon-var-android-bicycle: "\f369";
38 | @ionicon-var-android-boat: "\f36a";
39 | @ionicon-var-android-bookmark: "\f36b";
40 | @ionicon-var-android-bulb: "\f36c";
41 | @ionicon-var-android-bus: "\f36d";
42 | @ionicon-var-android-calendar: "\f2d1";
43 | @ionicon-var-android-call: "\f2d2";
44 | @ionicon-var-android-camera: "\f2d3";
45 | @ionicon-var-android-cancel: "\f36e";
46 | @ionicon-var-android-car: "\f36f";
47 | @ionicon-var-android-cart: "\f370";
48 | @ionicon-var-android-chat: "\f2d4";
49 | @ionicon-var-android-checkbox: "\f374";
50 | @ionicon-var-android-checkbox-blank: "\f371";
51 | @ionicon-var-android-checkbox-outline: "\f373";
52 | @ionicon-var-android-checkbox-outline-blank: "\f372";
53 | @ionicon-var-android-checkmark-circle: "\f375";
54 | @ionicon-var-android-clipboard: "\f376";
55 | @ionicon-var-android-close: "\f2d7";
56 | @ionicon-var-android-cloud: "\f37a";
57 | @ionicon-var-android-cloud-circle: "\f377";
58 | @ionicon-var-android-cloud-done: "\f378";
59 | @ionicon-var-android-cloud-outline: "\f379";
60 | @ionicon-var-android-color-palette: "\f37b";
61 | @ionicon-var-android-compass: "\f37c";
62 | @ionicon-var-android-contact: "\f2d8";
63 | @ionicon-var-android-contacts: "\f2d9";
64 | @ionicon-var-android-contract: "\f37d";
65 | @ionicon-var-android-create: "\f37e";
66 | @ionicon-var-android-delete: "\f37f";
67 | @ionicon-var-android-desktop: "\f380";
68 | @ionicon-var-android-document: "\f381";
69 | @ionicon-var-android-done: "\f383";
70 | @ionicon-var-android-done-all: "\f382";
71 | @ionicon-var-android-download: "\f2dd";
72 | @ionicon-var-android-drafts: "\f384";
73 | @ionicon-var-android-exit: "\f385";
74 | @ionicon-var-android-expand: "\f386";
75 | @ionicon-var-android-favorite: "\f388";
76 | @ionicon-var-android-favorite-outline: "\f387";
77 | @ionicon-var-android-film: "\f389";
78 | @ionicon-var-android-folder: "\f2e0";
79 | @ionicon-var-android-folder-open: "\f38a";
80 | @ionicon-var-android-funnel: "\f38b";
81 | @ionicon-var-android-globe: "\f38c";
82 | @ionicon-var-android-hand: "\f2e3";
83 | @ionicon-var-android-hangout: "\f38d";
84 | @ionicon-var-android-happy: "\f38e";
85 | @ionicon-var-android-home: "\f38f";
86 | @ionicon-var-android-image: "\f2e4";
87 | @ionicon-var-android-laptop: "\f390";
88 | @ionicon-var-android-list: "\f391";
89 | @ionicon-var-android-locate: "\f2e9";
90 | @ionicon-var-android-lock: "\f392";
91 | @ionicon-var-android-mail: "\f2eb";
92 | @ionicon-var-android-map: "\f393";
93 | @ionicon-var-android-menu: "\f394";
94 | @ionicon-var-android-microphone: "\f2ec";
95 | @ionicon-var-android-microphone-off: "\f395";
96 | @ionicon-var-android-more-horizontal: "\f396";
97 | @ionicon-var-android-more-vertical: "\f397";
98 | @ionicon-var-android-navigate: "\f398";
99 | @ionicon-var-android-notifications: "\f39b";
100 | @ionicon-var-android-notifications-none: "\f399";
101 | @ionicon-var-android-notifications-off: "\f39a";
102 | @ionicon-var-android-open: "\f39c";
103 | @ionicon-var-android-options: "\f39d";
104 | @ionicon-var-android-people: "\f39e";
105 | @ionicon-var-android-person: "\f3a0";
106 | @ionicon-var-android-person-add: "\f39f";
107 | @ionicon-var-android-phone-landscape: "\f3a1";
108 | @ionicon-var-android-phone-portrait: "\f3a2";
109 | @ionicon-var-android-pin: "\f3a3";
110 | @ionicon-var-android-plane: "\f3a4";
111 | @ionicon-var-android-playstore: "\f2f0";
112 | @ionicon-var-android-print: "\f3a5";
113 | @ionicon-var-android-radio-button-off: "\f3a6";
114 | @ionicon-var-android-radio-button-on: "\f3a7";
115 | @ionicon-var-android-refresh: "\f3a8";
116 | @ionicon-var-android-remove: "\f2f4";
117 | @ionicon-var-android-remove-circle: "\f3a9";
118 | @ionicon-var-android-restaurant: "\f3aa";
119 | @ionicon-var-android-sad: "\f3ab";
120 | @ionicon-var-android-search: "\f2f5";
121 | @ionicon-var-android-send: "\f2f6";
122 | @ionicon-var-android-settings: "\f2f7";
123 | @ionicon-var-android-share: "\f2f8";
124 | @ionicon-var-android-share-alt: "\f3ac";
125 | @ionicon-var-android-star: "\f2fc";
126 | @ionicon-var-android-star-half: "\f3ad";
127 | @ionicon-var-android-star-outline: "\f3ae";
128 | @ionicon-var-android-stopwatch: "\f2fd";
129 | @ionicon-var-android-subway: "\f3af";
130 | @ionicon-var-android-sunny: "\f3b0";
131 | @ionicon-var-android-sync: "\f3b1";
132 | @ionicon-var-android-textsms: "\f3b2";
133 | @ionicon-var-android-time: "\f3b3";
134 | @ionicon-var-android-train: "\f3b4";
135 | @ionicon-var-android-unlock: "\f3b5";
136 | @ionicon-var-android-upload: "\f3b6";
137 | @ionicon-var-android-volume-down: "\f3b7";
138 | @ionicon-var-android-volume-mute: "\f3b8";
139 | @ionicon-var-android-volume-off: "\f3b9";
140 | @ionicon-var-android-volume-up: "\f3ba";
141 | @ionicon-var-android-walk: "\f3bb";
142 | @ionicon-var-android-warning: "\f3bc";
143 | @ionicon-var-android-watch: "\f3bd";
144 | @ionicon-var-android-wifi: "\f305";
145 | @ionicon-var-aperture: "\f313";
146 | @ionicon-var-archive: "\f102";
147 | @ionicon-var-arrow-down-a: "\f103";
148 | @ionicon-var-arrow-down-b: "\f104";
149 | @ionicon-var-arrow-down-c: "\f105";
150 | @ionicon-var-arrow-expand: "\f25e";
151 | @ionicon-var-arrow-graph-down-left: "\f25f";
152 | @ionicon-var-arrow-graph-down-right: "\f260";
153 | @ionicon-var-arrow-graph-up-left: "\f261";
154 | @ionicon-var-arrow-graph-up-right: "\f262";
155 | @ionicon-var-arrow-left-a: "\f106";
156 | @ionicon-var-arrow-left-b: "\f107";
157 | @ionicon-var-arrow-left-c: "\f108";
158 | @ionicon-var-arrow-move: "\f263";
159 | @ionicon-var-arrow-resize: "\f264";
160 | @ionicon-var-arrow-return-left: "\f265";
161 | @ionicon-var-arrow-return-right: "\f266";
162 | @ionicon-var-arrow-right-a: "\f109";
163 | @ionicon-var-arrow-right-b: "\f10a";
164 | @ionicon-var-arrow-right-c: "\f10b";
165 | @ionicon-var-arrow-shrink: "\f267";
166 | @ionicon-var-arrow-swap: "\f268";
167 | @ionicon-var-arrow-up-a: "\f10c";
168 | @ionicon-var-arrow-up-b: "\f10d";
169 | @ionicon-var-arrow-up-c: "\f10e";
170 | @ionicon-var-asterisk: "\f314";
171 | @ionicon-var-at: "\f10f";
172 | @ionicon-var-backspace: "\f3bf";
173 | @ionicon-var-backspace-outline: "\f3be";
174 | @ionicon-var-bag: "\f110";
175 | @ionicon-var-battery-charging: "\f111";
176 | @ionicon-var-battery-empty: "\f112";
177 | @ionicon-var-battery-full: "\f113";
178 | @ionicon-var-battery-half: "\f114";
179 | @ionicon-var-battery-low: "\f115";
180 | @ionicon-var-beaker: "\f269";
181 | @ionicon-var-beer: "\f26a";
182 | @ionicon-var-bluetooth: "\f116";
183 | @ionicon-var-bonfire: "\f315";
184 | @ionicon-var-bookmark: "\f26b";
185 | @ionicon-var-bowtie: "\f3c0";
186 | @ionicon-var-briefcase: "\f26c";
187 | @ionicon-var-bug: "\f2be";
188 | @ionicon-var-calculator: "\f26d";
189 | @ionicon-var-calendar: "\f117";
190 | @ionicon-var-camera: "\f118";
191 | @ionicon-var-card: "\f119";
192 | @ionicon-var-cash: "\f316";
193 | @ionicon-var-chatbox: "\f11b";
194 | @ionicon-var-chatbox-working: "\f11a";
195 | @ionicon-var-chatboxes: "\f11c";
196 | @ionicon-var-chatbubble: "\f11e";
197 | @ionicon-var-chatbubble-working: "\f11d";
198 | @ionicon-var-chatbubbles: "\f11f";
199 | @ionicon-var-checkmark: "\f122";
200 | @ionicon-var-checkmark-circled: "\f120";
201 | @ionicon-var-checkmark-round: "\f121";
202 | @ionicon-var-chevron-down: "\f123";
203 | @ionicon-var-chevron-left: "\f124";
204 | @ionicon-var-chevron-right: "\f125";
205 | @ionicon-var-chevron-up: "\f126";
206 | @ionicon-var-clipboard: "\f127";
207 | @ionicon-var-clock: "\f26e";
208 | @ionicon-var-close: "\f12a";
209 | @ionicon-var-close-circled: "\f128";
210 | @ionicon-var-close-round: "\f129";
211 | @ionicon-var-closed-captioning: "\f317";
212 | @ionicon-var-cloud: "\f12b";
213 | @ionicon-var-code: "\f271";
214 | @ionicon-var-code-download: "\f26f";
215 | @ionicon-var-code-working: "\f270";
216 | @ionicon-var-coffee: "\f272";
217 | @ionicon-var-compass: "\f273";
218 | @ionicon-var-compose: "\f12c";
219 | @ionicon-var-connection-bars: "\f274";
220 | @ionicon-var-contrast: "\f275";
221 | @ionicon-var-crop: "\f3c1";
222 | @ionicon-var-cube: "\f318";
223 | @ionicon-var-disc: "\f12d";
224 | @ionicon-var-document: "\f12f";
225 | @ionicon-var-document-text: "\f12e";
226 | @ionicon-var-drag: "\f130";
227 | @ionicon-var-earth: "\f276";
228 | @ionicon-var-easel: "\f3c2";
229 | @ionicon-var-edit: "\f2bf";
230 | @ionicon-var-egg: "\f277";
231 | @ionicon-var-eject: "\f131";
232 | @ionicon-var-email: "\f132";
233 | @ionicon-var-email-unread: "\f3c3";
234 | @ionicon-var-erlenmeyer-flask: "\f3c5";
235 | @ionicon-var-erlenmeyer-flask-bubbles: "\f3c4";
236 | @ionicon-var-eye: "\f133";
237 | @ionicon-var-eye-disabled: "\f306";
238 | @ionicon-var-female: "\f278";
239 | @ionicon-var-filing: "\f134";
240 | @ionicon-var-film-marker: "\f135";
241 | @ionicon-var-fireball: "\f319";
242 | @ionicon-var-flag: "\f279";
243 | @ionicon-var-flame: "\f31a";
244 | @ionicon-var-flash: "\f137";
245 | @ionicon-var-flash-off: "\f136";
246 | @ionicon-var-folder: "\f139";
247 | @ionicon-var-fork: "\f27a";
248 | @ionicon-var-fork-repo: "\f2c0";
249 | @ionicon-var-forward: "\f13a";
250 | @ionicon-var-funnel: "\f31b";
251 | @ionicon-var-gear-a: "\f13d";
252 | @ionicon-var-gear-b: "\f13e";
253 | @ionicon-var-grid: "\f13f";
254 | @ionicon-var-hammer: "\f27b";
255 | @ionicon-var-happy: "\f31c";
256 | @ionicon-var-happy-outline: "\f3c6";
257 | @ionicon-var-headphone: "\f140";
258 | @ionicon-var-heart: "\f141";
259 | @ionicon-var-heart-broken: "\f31d";
260 | @ionicon-var-help: "\f143";
261 | @ionicon-var-help-buoy: "\f27c";
262 | @ionicon-var-help-circled: "\f142";
263 | @ionicon-var-home: "\f144";
264 | @ionicon-var-icecream: "\f27d";
265 | @ionicon-var-image: "\f147";
266 | @ionicon-var-images: "\f148";
267 | @ionicon-var-information: "\f14a";
268 | @ionicon-var-information-circled: "\f149";
269 | @ionicon-var-ionic: "\f14b";
270 | @ionicon-var-ios-alarm: "\f3c8";
271 | @ionicon-var-ios-alarm-outline: "\f3c7";
272 | @ionicon-var-ios-albums: "\f3ca";
273 | @ionicon-var-ios-albums-outline: "\f3c9";
274 | @ionicon-var-ios-americanfootball: "\f3cc";
275 | @ionicon-var-ios-americanfootball-outline: "\f3cb";
276 | @ionicon-var-ios-analytics: "\f3ce";
277 | @ionicon-var-ios-analytics-outline: "\f3cd";
278 | @ionicon-var-ios-arrow-back: "\f3cf";
279 | @ionicon-var-ios-arrow-down: "\f3d0";
280 | @ionicon-var-ios-arrow-forward: "\f3d1";
281 | @ionicon-var-ios-arrow-left: "\f3d2";
282 | @ionicon-var-ios-arrow-right: "\f3d3";
283 | @ionicon-var-ios-arrow-thin-down: "\f3d4";
284 | @ionicon-var-ios-arrow-thin-left: "\f3d5";
285 | @ionicon-var-ios-arrow-thin-right: "\f3d6";
286 | @ionicon-var-ios-arrow-thin-up: "\f3d7";
287 | @ionicon-var-ios-arrow-up: "\f3d8";
288 | @ionicon-var-ios-at: "\f3da";
289 | @ionicon-var-ios-at-outline: "\f3d9";
290 | @ionicon-var-ios-barcode: "\f3dc";
291 | @ionicon-var-ios-barcode-outline: "\f3db";
292 | @ionicon-var-ios-baseball: "\f3de";
293 | @ionicon-var-ios-baseball-outline: "\f3dd";
294 | @ionicon-var-ios-basketball: "\f3e0";
295 | @ionicon-var-ios-basketball-outline: "\f3df";
296 | @ionicon-var-ios-bell: "\f3e2";
297 | @ionicon-var-ios-bell-outline: "\f3e1";
298 | @ionicon-var-ios-body: "\f3e4";
299 | @ionicon-var-ios-body-outline: "\f3e3";
300 | @ionicon-var-ios-bolt: "\f3e6";
301 | @ionicon-var-ios-bolt-outline: "\f3e5";
302 | @ionicon-var-ios-book: "\f3e8";
303 | @ionicon-var-ios-book-outline: "\f3e7";
304 | @ionicon-var-ios-bookmarks: "\f3ea";
305 | @ionicon-var-ios-bookmarks-outline: "\f3e9";
306 | @ionicon-var-ios-box: "\f3ec";
307 | @ionicon-var-ios-box-outline: "\f3eb";
308 | @ionicon-var-ios-briefcase: "\f3ee";
309 | @ionicon-var-ios-briefcase-outline: "\f3ed";
310 | @ionicon-var-ios-browsers: "\f3f0";
311 | @ionicon-var-ios-browsers-outline: "\f3ef";
312 | @ionicon-var-ios-calculator: "\f3f2";
313 | @ionicon-var-ios-calculator-outline: "\f3f1";
314 | @ionicon-var-ios-calendar: "\f3f4";
315 | @ionicon-var-ios-calendar-outline: "\f3f3";
316 | @ionicon-var-ios-camera: "\f3f6";
317 | @ionicon-var-ios-camera-outline: "\f3f5";
318 | @ionicon-var-ios-cart: "\f3f8";
319 | @ionicon-var-ios-cart-outline: "\f3f7";
320 | @ionicon-var-ios-chatboxes: "\f3fa";
321 | @ionicon-var-ios-chatboxes-outline: "\f3f9";
322 | @ionicon-var-ios-chatbubble: "\f3fc";
323 | @ionicon-var-ios-chatbubble-outline: "\f3fb";
324 | @ionicon-var-ios-checkmark: "\f3ff";
325 | @ionicon-var-ios-checkmark-empty: "\f3fd";
326 | @ionicon-var-ios-checkmark-outline: "\f3fe";
327 | @ionicon-var-ios-circle-filled: "\f400";
328 | @ionicon-var-ios-circle-outline: "\f401";
329 | @ionicon-var-ios-clock: "\f403";
330 | @ionicon-var-ios-clock-outline: "\f402";
331 | @ionicon-var-ios-close: "\f406";
332 | @ionicon-var-ios-close-empty: "\f404";
333 | @ionicon-var-ios-close-outline: "\f405";
334 | @ionicon-var-ios-cloud: "\f40c";
335 | @ionicon-var-ios-cloud-download: "\f408";
336 | @ionicon-var-ios-cloud-download-outline: "\f407";
337 | @ionicon-var-ios-cloud-outline: "\f409";
338 | @ionicon-var-ios-cloud-upload: "\f40b";
339 | @ionicon-var-ios-cloud-upload-outline: "\f40a";
340 | @ionicon-var-ios-cloudy: "\f410";
341 | @ionicon-var-ios-cloudy-night: "\f40e";
342 | @ionicon-var-ios-cloudy-night-outline: "\f40d";
343 | @ionicon-var-ios-cloudy-outline: "\f40f";
344 | @ionicon-var-ios-cog: "\f412";
345 | @ionicon-var-ios-cog-outline: "\f411";
346 | @ionicon-var-ios-color-filter: "\f414";
347 | @ionicon-var-ios-color-filter-outline: "\f413";
348 | @ionicon-var-ios-color-wand: "\f416";
349 | @ionicon-var-ios-color-wand-outline: "\f415";
350 | @ionicon-var-ios-compose: "\f418";
351 | @ionicon-var-ios-compose-outline: "\f417";
352 | @ionicon-var-ios-contact: "\f41a";
353 | @ionicon-var-ios-contact-outline: "\f419";
354 | @ionicon-var-ios-copy: "\f41c";
355 | @ionicon-var-ios-copy-outline: "\f41b";
356 | @ionicon-var-ios-crop: "\f41e";
357 | @ionicon-var-ios-crop-strong: "\f41d";
358 | @ionicon-var-ios-download: "\f420";
359 | @ionicon-var-ios-download-outline: "\f41f";
360 | @ionicon-var-ios-drag: "\f421";
361 | @ionicon-var-ios-email: "\f423";
362 | @ionicon-var-ios-email-outline: "\f422";
363 | @ionicon-var-ios-eye: "\f425";
364 | @ionicon-var-ios-eye-outline: "\f424";
365 | @ionicon-var-ios-fastforward: "\f427";
366 | @ionicon-var-ios-fastforward-outline: "\f426";
367 | @ionicon-var-ios-filing: "\f429";
368 | @ionicon-var-ios-filing-outline: "\f428";
369 | @ionicon-var-ios-film: "\f42b";
370 | @ionicon-var-ios-film-outline: "\f42a";
371 | @ionicon-var-ios-flag: "\f42d";
372 | @ionicon-var-ios-flag-outline: "\f42c";
373 | @ionicon-var-ios-flame: "\f42f";
374 | @ionicon-var-ios-flame-outline: "\f42e";
375 | @ionicon-var-ios-flask: "\f431";
376 | @ionicon-var-ios-flask-outline: "\f430";
377 | @ionicon-var-ios-flower: "\f433";
378 | @ionicon-var-ios-flower-outline: "\f432";
379 | @ionicon-var-ios-folder: "\f435";
380 | @ionicon-var-ios-folder-outline: "\f434";
381 | @ionicon-var-ios-football: "\f437";
382 | @ionicon-var-ios-football-outline: "\f436";
383 | @ionicon-var-ios-game-controller-a: "\f439";
384 | @ionicon-var-ios-game-controller-a-outline: "\f438";
385 | @ionicon-var-ios-game-controller-b: "\f43b";
386 | @ionicon-var-ios-game-controller-b-outline: "\f43a";
387 | @ionicon-var-ios-gear: "\f43d";
388 | @ionicon-var-ios-gear-outline: "\f43c";
389 | @ionicon-var-ios-glasses: "\f43f";
390 | @ionicon-var-ios-glasses-outline: "\f43e";
391 | @ionicon-var-ios-grid-view: "\f441";
392 | @ionicon-var-ios-grid-view-outline: "\f440";
393 | @ionicon-var-ios-heart: "\f443";
394 | @ionicon-var-ios-heart-outline: "\f442";
395 | @ionicon-var-ios-help: "\f446";
396 | @ionicon-var-ios-help-empty: "\f444";
397 | @ionicon-var-ios-help-outline: "\f445";
398 | @ionicon-var-ios-home: "\f448";
399 | @ionicon-var-ios-home-outline: "\f447";
400 | @ionicon-var-ios-infinite: "\f44a";
401 | @ionicon-var-ios-infinite-outline: "\f449";
402 | @ionicon-var-ios-information: "\f44d";
403 | @ionicon-var-ios-information-empty: "\f44b";
404 | @ionicon-var-ios-information-outline: "\f44c";
405 | @ionicon-var-ios-ionic-outline: "\f44e";
406 | @ionicon-var-ios-keypad: "\f450";
407 | @ionicon-var-ios-keypad-outline: "\f44f";
408 | @ionicon-var-ios-lightbulb: "\f452";
409 | @ionicon-var-ios-lightbulb-outline: "\f451";
410 | @ionicon-var-ios-list: "\f454";
411 | @ionicon-var-ios-list-outline: "\f453";
412 | @ionicon-var-ios-location: "\f456";
413 | @ionicon-var-ios-location-outline: "\f455";
414 | @ionicon-var-ios-locked: "\f458";
415 | @ionicon-var-ios-locked-outline: "\f457";
416 | @ionicon-var-ios-loop: "\f45a";
417 | @ionicon-var-ios-loop-strong: "\f459";
418 | @ionicon-var-ios-medical: "\f45c";
419 | @ionicon-var-ios-medical-outline: "\f45b";
420 | @ionicon-var-ios-medkit: "\f45e";
421 | @ionicon-var-ios-medkit-outline: "\f45d";
422 | @ionicon-var-ios-mic: "\f461";
423 | @ionicon-var-ios-mic-off: "\f45f";
424 | @ionicon-var-ios-mic-outline: "\f460";
425 | @ionicon-var-ios-minus: "\f464";
426 | @ionicon-var-ios-minus-empty: "\f462";
427 | @ionicon-var-ios-minus-outline: "\f463";
428 | @ionicon-var-ios-monitor: "\f466";
429 | @ionicon-var-ios-monitor-outline: "\f465";
430 | @ionicon-var-ios-moon: "\f468";
431 | @ionicon-var-ios-moon-outline: "\f467";
432 | @ionicon-var-ios-more: "\f46a";
433 | @ionicon-var-ios-more-outline: "\f469";
434 | @ionicon-var-ios-musical-note: "\f46b";
435 | @ionicon-var-ios-musical-notes: "\f46c";
436 | @ionicon-var-ios-navigate: "\f46e";
437 | @ionicon-var-ios-navigate-outline: "\f46d";
438 | @ionicon-var-ios-nutrition: "\f470";
439 | @ionicon-var-ios-nutrition-outline: "\f46f";
440 | @ionicon-var-ios-paper: "\f472";
441 | @ionicon-var-ios-paper-outline: "\f471";
442 | @ionicon-var-ios-paperplane: "\f474";
443 | @ionicon-var-ios-paperplane-outline: "\f473";
444 | @ionicon-var-ios-partlysunny: "\f476";
445 | @ionicon-var-ios-partlysunny-outline: "\f475";
446 | @ionicon-var-ios-pause: "\f478";
447 | @ionicon-var-ios-pause-outline: "\f477";
448 | @ionicon-var-ios-paw: "\f47a";
449 | @ionicon-var-ios-paw-outline: "\f479";
450 | @ionicon-var-ios-people: "\f47c";
451 | @ionicon-var-ios-people-outline: "\f47b";
452 | @ionicon-var-ios-person: "\f47e";
453 | @ionicon-var-ios-person-outline: "\f47d";
454 | @ionicon-var-ios-personadd: "\f480";
455 | @ionicon-var-ios-personadd-outline: "\f47f";
456 | @ionicon-var-ios-photos: "\f482";
457 | @ionicon-var-ios-photos-outline: "\f481";
458 | @ionicon-var-ios-pie: "\f484";
459 | @ionicon-var-ios-pie-outline: "\f483";
460 | @ionicon-var-ios-pint: "\f486";
461 | @ionicon-var-ios-pint-outline: "\f485";
462 | @ionicon-var-ios-play: "\f488";
463 | @ionicon-var-ios-play-outline: "\f487";
464 | @ionicon-var-ios-plus: "\f48b";
465 | @ionicon-var-ios-plus-empty: "\f489";
466 | @ionicon-var-ios-plus-outline: "\f48a";
467 | @ionicon-var-ios-pricetag: "\f48d";
468 | @ionicon-var-ios-pricetag-outline: "\f48c";
469 | @ionicon-var-ios-pricetags: "\f48f";
470 | @ionicon-var-ios-pricetags-outline: "\f48e";
471 | @ionicon-var-ios-printer: "\f491";
472 | @ionicon-var-ios-printer-outline: "\f490";
473 | @ionicon-var-ios-pulse: "\f493";
474 | @ionicon-var-ios-pulse-strong: "\f492";
475 | @ionicon-var-ios-rainy: "\f495";
476 | @ionicon-var-ios-rainy-outline: "\f494";
477 | @ionicon-var-ios-recording: "\f497";
478 | @ionicon-var-ios-recording-outline: "\f496";
479 | @ionicon-var-ios-redo: "\f499";
480 | @ionicon-var-ios-redo-outline: "\f498";
481 | @ionicon-var-ios-refresh: "\f49c";
482 | @ionicon-var-ios-refresh-empty: "\f49a";
483 | @ionicon-var-ios-refresh-outline: "\f49b";
484 | @ionicon-var-ios-reload: "\f49d";
485 | @ionicon-var-ios-reverse-camera: "\f49f";
486 | @ionicon-var-ios-reverse-camera-outline: "\f49e";
487 | @ionicon-var-ios-rewind: "\f4a1";
488 | @ionicon-var-ios-rewind-outline: "\f4a0";
489 | @ionicon-var-ios-rose: "\f4a3";
490 | @ionicon-var-ios-rose-outline: "\f4a2";
491 | @ionicon-var-ios-search: "\f4a5";
492 | @ionicon-var-ios-search-strong: "\f4a4";
493 | @ionicon-var-ios-settings: "\f4a7";
494 | @ionicon-var-ios-settings-strong: "\f4a6";
495 | @ionicon-var-ios-shuffle: "\f4a9";
496 | @ionicon-var-ios-shuffle-strong: "\f4a8";
497 | @ionicon-var-ios-skipbackward: "\f4ab";
498 | @ionicon-var-ios-skipbackward-outline: "\f4aa";
499 | @ionicon-var-ios-skipforward: "\f4ad";
500 | @ionicon-var-ios-skipforward-outline: "\f4ac";
501 | @ionicon-var-ios-snowy: "\f4ae";
502 | @ionicon-var-ios-speedometer: "\f4b0";
503 | @ionicon-var-ios-speedometer-outline: "\f4af";
504 | @ionicon-var-ios-star: "\f4b3";
505 | @ionicon-var-ios-star-half: "\f4b1";
506 | @ionicon-var-ios-star-outline: "\f4b2";
507 | @ionicon-var-ios-stopwatch: "\f4b5";
508 | @ionicon-var-ios-stopwatch-outline: "\f4b4";
509 | @ionicon-var-ios-sunny: "\f4b7";
510 | @ionicon-var-ios-sunny-outline: "\f4b6";
511 | @ionicon-var-ios-telephone: "\f4b9";
512 | @ionicon-var-ios-telephone-outline: "\f4b8";
513 | @ionicon-var-ios-tennisball: "\f4bb";
514 | @ionicon-var-ios-tennisball-outline: "\f4ba";
515 | @ionicon-var-ios-thunderstorm: "\f4bd";
516 | @ionicon-var-ios-thunderstorm-outline: "\f4bc";
517 | @ionicon-var-ios-time: "\f4bf";
518 | @ionicon-var-ios-time-outline: "\f4be";
519 | @ionicon-var-ios-timer: "\f4c1";
520 | @ionicon-var-ios-timer-outline: "\f4c0";
521 | @ionicon-var-ios-toggle: "\f4c3";
522 | @ionicon-var-ios-toggle-outline: "\f4c2";
523 | @ionicon-var-ios-trash: "\f4c5";
524 | @ionicon-var-ios-trash-outline: "\f4c4";
525 | @ionicon-var-ios-undo: "\f4c7";
526 | @ionicon-var-ios-undo-outline: "\f4c6";
527 | @ionicon-var-ios-unlocked: "\f4c9";
528 | @ionicon-var-ios-unlocked-outline: "\f4c8";
529 | @ionicon-var-ios-upload: "\f4cb";
530 | @ionicon-var-ios-upload-outline: "\f4ca";
531 | @ionicon-var-ios-videocam: "\f4cd";
532 | @ionicon-var-ios-videocam-outline: "\f4cc";
533 | @ionicon-var-ios-volume-high: "\f4ce";
534 | @ionicon-var-ios-volume-low: "\f4cf";
535 | @ionicon-var-ios-wineglass: "\f4d1";
536 | @ionicon-var-ios-wineglass-outline: "\f4d0";
537 | @ionicon-var-ios-world: "\f4d3";
538 | @ionicon-var-ios-world-outline: "\f4d2";
539 | @ionicon-var-ipad: "\f1f9";
540 | @ionicon-var-iphone: "\f1fa";
541 | @ionicon-var-ipod: "\f1fb";
542 | @ionicon-var-jet: "\f295";
543 | @ionicon-var-key: "\f296";
544 | @ionicon-var-knife: "\f297";
545 | @ionicon-var-laptop: "\f1fc";
546 | @ionicon-var-leaf: "\f1fd";
547 | @ionicon-var-levels: "\f298";
548 | @ionicon-var-lightbulb: "\f299";
549 | @ionicon-var-link: "\f1fe";
550 | @ionicon-var-load-a: "\f29a";
551 | @ionicon-var-load-b: "\f29b";
552 | @ionicon-var-load-c: "\f29c";
553 | @ionicon-var-load-d: "\f29d";
554 | @ionicon-var-location: "\f1ff";
555 | @ionicon-var-lock-combination: "\f4d4";
556 | @ionicon-var-locked: "\f200";
557 | @ionicon-var-log-in: "\f29e";
558 | @ionicon-var-log-out: "\f29f";
559 | @ionicon-var-loop: "\f201";
560 | @ionicon-var-magnet: "\f2a0";
561 | @ionicon-var-male: "\f2a1";
562 | @ionicon-var-man: "\f202";
563 | @ionicon-var-map: "\f203";
564 | @ionicon-var-medkit: "\f2a2";
565 | @ionicon-var-merge: "\f33f";
566 | @ionicon-var-mic-a: "\f204";
567 | @ionicon-var-mic-b: "\f205";
568 | @ionicon-var-mic-c: "\f206";
569 | @ionicon-var-minus: "\f209";
570 | @ionicon-var-minus-circled: "\f207";
571 | @ionicon-var-minus-round: "\f208";
572 | @ionicon-var-model-s: "\f2c1";
573 | @ionicon-var-monitor: "\f20a";
574 | @ionicon-var-more: "\f20b";
575 | @ionicon-var-mouse: "\f340";
576 | @ionicon-var-music-note: "\f20c";
577 | @ionicon-var-navicon: "\f20e";
578 | @ionicon-var-navicon-round: "\f20d";
579 | @ionicon-var-navigate: "\f2a3";
580 | @ionicon-var-network: "\f341";
581 | @ionicon-var-no-smoking: "\f2c2";
582 | @ionicon-var-nuclear: "\f2a4";
583 | @ionicon-var-outlet: "\f342";
584 | @ionicon-var-paintbrush: "\f4d5";
585 | @ionicon-var-paintbucket: "\f4d6";
586 | @ionicon-var-paper-airplane: "\f2c3";
587 | @ionicon-var-paperclip: "\f20f";
588 | @ionicon-var-pause: "\f210";
589 | @ionicon-var-person: "\f213";
590 | @ionicon-var-person-add: "\f211";
591 | @ionicon-var-person-stalker: "\f212";
592 | @ionicon-var-pie-graph: "\f2a5";
593 | @ionicon-var-pin: "\f2a6";
594 | @ionicon-var-pinpoint: "\f2a7";
595 | @ionicon-var-pizza: "\f2a8";
596 | @ionicon-var-plane: "\f214";
597 | @ionicon-var-planet: "\f343";
598 | @ionicon-var-play: "\f215";
599 | @ionicon-var-playstation: "\f30a";
600 | @ionicon-var-plus: "\f218";
601 | @ionicon-var-plus-circled: "\f216";
602 | @ionicon-var-plus-round: "\f217";
603 | @ionicon-var-podium: "\f344";
604 | @ionicon-var-pound: "\f219";
605 | @ionicon-var-power: "\f2a9";
606 | @ionicon-var-pricetag: "\f2aa";
607 | @ionicon-var-pricetags: "\f2ab";
608 | @ionicon-var-printer: "\f21a";
609 | @ionicon-var-pull-request: "\f345";
610 | @ionicon-var-qr-scanner: "\f346";
611 | @ionicon-var-quote: "\f347";
612 | @ionicon-var-radio-waves: "\f2ac";
613 | @ionicon-var-record: "\f21b";
614 | @ionicon-var-refresh: "\f21c";
615 | @ionicon-var-reply: "\f21e";
616 | @ionicon-var-reply-all: "\f21d";
617 | @ionicon-var-ribbon-a: "\f348";
618 | @ionicon-var-ribbon-b: "\f349";
619 | @ionicon-var-sad: "\f34a";
620 | @ionicon-var-sad-outline: "\f4d7";
621 | @ionicon-var-scissors: "\f34b";
622 | @ionicon-var-search: "\f21f";
623 | @ionicon-var-settings: "\f2ad";
624 | @ionicon-var-share: "\f220";
625 | @ionicon-var-shuffle: "\f221";
626 | @ionicon-var-skip-backward: "\f222";
627 | @ionicon-var-skip-forward: "\f223";
628 | @ionicon-var-social-android: "\f225";
629 | @ionicon-var-social-android-outline: "\f224";
630 | @ionicon-var-social-angular: "\f4d9";
631 | @ionicon-var-social-angular-outline: "\f4d8";
632 | @ionicon-var-social-apple: "\f227";
633 | @ionicon-var-social-apple-outline: "\f226";
634 | @ionicon-var-social-bitcoin: "\f2af";
635 | @ionicon-var-social-bitcoin-outline: "\f2ae";
636 | @ionicon-var-social-buffer: "\f229";
637 | @ionicon-var-social-buffer-outline: "\f228";
638 | @ionicon-var-social-chrome: "\f4db";
639 | @ionicon-var-social-chrome-outline: "\f4da";
640 | @ionicon-var-social-codepen: "\f4dd";
641 | @ionicon-var-social-codepen-outline: "\f4dc";
642 | @ionicon-var-social-css3: "\f4df";
643 | @ionicon-var-social-css3-outline: "\f4de";
644 | @ionicon-var-social-designernews: "\f22b";
645 | @ionicon-var-social-designernews-outline: "\f22a";
646 | @ionicon-var-social-dribbble: "\f22d";
647 | @ionicon-var-social-dribbble-outline: "\f22c";
648 | @ionicon-var-social-dropbox: "\f22f";
649 | @ionicon-var-social-dropbox-outline: "\f22e";
650 | @ionicon-var-social-euro: "\f4e1";
651 | @ionicon-var-social-euro-outline: "\f4e0";
652 | @ionicon-var-social-facebook: "\f231";
653 | @ionicon-var-social-facebook-outline: "\f230";
654 | @ionicon-var-social-foursquare: "\f34d";
655 | @ionicon-var-social-foursquare-outline: "\f34c";
656 | @ionicon-var-social-freebsd-devil: "\f2c4";
657 | @ionicon-var-social-github: "\f233";
658 | @ionicon-var-social-github-outline: "\f232";
659 | @ionicon-var-social-google: "\f34f";
660 | @ionicon-var-social-google-outline: "\f34e";
661 | @ionicon-var-social-googleplus: "\f235";
662 | @ionicon-var-social-googleplus-outline: "\f234";
663 | @ionicon-var-social-hackernews: "\f237";
664 | @ionicon-var-social-hackernews-outline: "\f236";
665 | @ionicon-var-social-html5: "\f4e3";
666 | @ionicon-var-social-html5-outline: "\f4e2";
667 | @ionicon-var-social-instagram: "\f351";
668 | @ionicon-var-social-instagram-outline: "\f350";
669 | @ionicon-var-social-javascript: "\f4e5";
670 | @ionicon-var-social-javascript-outline: "\f4e4";
671 | @ionicon-var-social-linkedin: "\f239";
672 | @ionicon-var-social-linkedin-outline: "\f238";
673 | @ionicon-var-social-markdown: "\f4e6";
674 | @ionicon-var-social-nodejs: "\f4e7";
675 | @ionicon-var-social-octocat: "\f4e8";
676 | @ionicon-var-social-pinterest: "\f2b1";
677 | @ionicon-var-social-pinterest-outline: "\f2b0";
678 | @ionicon-var-social-python: "\f4e9";
679 | @ionicon-var-social-reddit: "\f23b";
680 | @ionicon-var-social-reddit-outline: "\f23a";
681 | @ionicon-var-social-rss: "\f23d";
682 | @ionicon-var-social-rss-outline: "\f23c";
683 | @ionicon-var-social-sass: "\f4ea";
684 | @ionicon-var-social-skype: "\f23f";
685 | @ionicon-var-social-skype-outline: "\f23e";
686 | @ionicon-var-social-snapchat: "\f4ec";
687 | @ionicon-var-social-snapchat-outline: "\f4eb";
688 | @ionicon-var-social-tumblr: "\f241";
689 | @ionicon-var-social-tumblr-outline: "\f240";
690 | @ionicon-var-social-tux: "\f2c5";
691 | @ionicon-var-social-twitch: "\f4ee";
692 | @ionicon-var-social-twitch-outline: "\f4ed";
693 | @ionicon-var-social-twitter: "\f243";
694 | @ionicon-var-social-twitter-outline: "\f242";
695 | @ionicon-var-social-usd: "\f353";
696 | @ionicon-var-social-usd-outline: "\f352";
697 | @ionicon-var-social-vimeo: "\f245";
698 | @ionicon-var-social-vimeo-outline: "\f244";
699 | @ionicon-var-social-whatsapp: "\f4f0";
700 | @ionicon-var-social-whatsapp-outline: "\f4ef";
701 | @ionicon-var-social-windows: "\f247";
702 | @ionicon-var-social-windows-outline: "\f246";
703 | @ionicon-var-social-wordpress: "\f249";
704 | @ionicon-var-social-wordpress-outline: "\f248";
705 | @ionicon-var-social-yahoo: "\f24b";
706 | @ionicon-var-social-yahoo-outline: "\f24a";
707 | @ionicon-var-social-yen: "\f4f2";
708 | @ionicon-var-social-yen-outline: "\f4f1";
709 | @ionicon-var-social-youtube: "\f24d";
710 | @ionicon-var-social-youtube-outline: "\f24c";
711 | @ionicon-var-soup-can: "\f4f4";
712 | @ionicon-var-soup-can-outline: "\f4f3";
713 | @ionicon-var-speakerphone: "\f2b2";
714 | @ionicon-var-speedometer: "\f2b3";
715 | @ionicon-var-spoon: "\f2b4";
716 | @ionicon-var-star: "\f24e";
717 | @ionicon-var-stats-bars: "\f2b5";
718 | @ionicon-var-steam: "\f30b";
719 | @ionicon-var-stop: "\f24f";
720 | @ionicon-var-thermometer: "\f2b6";
721 | @ionicon-var-thumbsdown: "\f250";
722 | @ionicon-var-thumbsup: "\f251";
723 | @ionicon-var-toggle: "\f355";
724 | @ionicon-var-toggle-filled: "\f354";
725 | @ionicon-var-transgender: "\f4f5";
726 | @ionicon-var-trash-a: "\f252";
727 | @ionicon-var-trash-b: "\f253";
728 | @ionicon-var-trophy: "\f356";
729 | @ionicon-var-tshirt: "\f4f7";
730 | @ionicon-var-tshirt-outline: "\f4f6";
731 | @ionicon-var-umbrella: "\f2b7";
732 | @ionicon-var-university: "\f357";
733 | @ionicon-var-unlocked: "\f254";
734 | @ionicon-var-upload: "\f255";
735 | @ionicon-var-usb: "\f2b8";
736 | @ionicon-var-videocamera: "\f256";
737 | @ionicon-var-volume-high: "\f257";
738 | @ionicon-var-volume-low: "\f258";
739 | @ionicon-var-volume-medium: "\f259";
740 | @ionicon-var-volume-mute: "\f25a";
741 | @ionicon-var-wand: "\f358";
742 | @ionicon-var-waterdrop: "\f25b";
743 | @ionicon-var-wifi: "\f25c";
744 | @ionicon-var-wineglass: "\f2b9";
745 | @ionicon-var-woman: "\f25d";
746 | @ionicon-var-wrench: "\f2ba";
747 | @ionicon-var-xbox: "\f30c";
--------------------------------------------------------------------------------
/src/css/ionicons/ionicons.less:
--------------------------------------------------------------------------------
1 | @import "_ionicons-variables";
2 | @import "_ionicons-font";
3 | @import "_ionicons-icons";
4 |
--------------------------------------------------------------------------------
/src/css/variables.less:
--------------------------------------------------------------------------------
1 | //
2 | // Variables
3 | // ==============================
4 |
5 |
6 |
7 |
8 | // Headerbar
9 | // ------------------------------
10 |
11 | @statusbar-height: 20px;
12 |
13 | @headerbar-bg: #f6faf8;
14 | @headerbar-color: @gray-darker;
15 | @headerbar-height: 44px;
16 | @headerbar-button-color: @app-primary;
17 | @headerbar-button-color-disabled: #ccc;
18 |
19 | @headerbar-inverted-color: white;
20 | @headerbar-inverted-button-color: white;
21 | @headerbar-inverted-button-color-disabled: fade(white, 40%);
22 |
23 | @headerbar-field-gutter: 8px;
24 | @headerbar-field-height: 28px;
25 |
26 |
27 |
28 |
29 | // Footerbar
30 | // ------------------------------
31 |
32 | @footerbar-bg: @headerbar-bg;
33 | @footerbar-color: @headerbar-color;
34 | @footerbar-height: @headerbar-height;
35 | @footerbar-button-color: @gray;
36 | @footerbar-button-color-disabled: #ccc;
37 | @footerbar-button-color-selected: @app-primary;
38 |
39 |
40 |
41 |
42 | // Forms
43 | // ------------------------------
44 |
45 | @field-color: @text-color;
46 | @field-border: #ddd;
47 | @field-border-focus: darken(@field-border, 10%);
48 | @field-placeholder: #c7c7cd;
49 | @field-label-color: @gray;
50 |
51 | @field-height: 44px;
52 | @field-padding-vertical: @padding-base-vertical;
53 | @field-padding-horizontal: @padding-base-horizontal;
--------------------------------------------------------------------------------
/src/css/views/passcode.less:
--------------------------------------------------------------------------------
1 | //
2 | // Passcode
3 | // ==============================
4 |
5 | .Passcode {
6 | padding-bottom: 10vh;
7 | padding-top: 10vh;
8 | }
9 | .Keypad {
10 | bottom: 0;
11 | position: absolute;
12 | width: 100%;
13 | }
--------------------------------------------------------------------------------
/src/css/views/person.less:
--------------------------------------------------------------------------------
1 | //
2 | // Person
3 | // ==============================
4 |
5 |
6 |
7 |
8 | // Body
9 | // ------------------------------
10 |
11 | .PersonDetails {
12 | padding: 2em;
13 | text-align: center;
14 | }
15 | .PersonDetails__avatar {
16 | .avatar(120px);
17 | background-color: rgba(255, 255, 255, 0.5);
18 | margin-bottom: 1em;
19 | }
20 | .PersonDetails__heading {
21 | font-size: @font-size-lg;
22 | font-weight: 500;
23 | }
24 | .PersonDetails__text {
25 | color: @gray-dark;
26 | font-size: @font-size-sm;
27 | line-height: 1.3;
28 | margin-top: 1em;
29 | }
30 |
31 |
32 | // profile
33 |
34 | .PersonDetails__profiles {
35 | font-size: @font-size-lg;
36 | margin-top: 1em;
37 | }
38 | .PersonDetails__profile {
39 | display: block;
40 | padding-bottom: .5em;
41 | padding-top: .5em;
42 | }
43 | // 1. fix vertical alignment
44 | .PersonDetails__profile__icon {
45 | display: inline-block;
46 | font-size: 1.25em;
47 | line-height: 1; // 1
48 | margin-right: .5em;
49 | margin-top: -.15em; // 1
50 | vertical-align: middle;
51 | }
52 |
53 | .PersonDetails__public-indicator {
54 | background-color: rgba(255, 255, 255, 0.125);
55 | border-radius: 2em;
56 | display: inline-block;
57 | line-height: 2.4;
58 | font-size: @font-size-xxs;
59 | font-weight: 500;
60 | margin-bottom: 1.8em;
61 | margin-top: 1.8em;
62 | padding-left: 1.25em;
63 | padding-right: 1.25em;
64 | text-transform: uppercase;
65 | }
--------------------------------------------------------------------------------
/src/data/months.js:
--------------------------------------------------------------------------------
1 | module.exports = [
2 | { name: 'December', number: '12', season: 'Summer' },
3 | { name: 'January', number: '1', season: 'Summer' },
4 | { name: 'February', number: '2', season: 'Summer' },
5 | { name: 'March', number: '3', season: 'Autumn' },
6 | { name: 'April', number: '4', season: 'Autumn' },
7 | { name: 'May', number: '5', season: 'Autumn' },
8 | { name: 'June', number: '6', season: 'Winter' },
9 | { name: 'July', number: '7', season: 'Winter' },
10 | { name: 'August', number: '8', season: 'Winter' },
11 | { name: 'September', number: '9', season: 'Spring' },
12 | { name: 'October', number: '10', season: 'Spring' },
13 | { name: 'November', number: '11', season: 'Spring' }
14 | ];
--------------------------------------------------------------------------------
/src/fonts/ionicons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/fonts/ionicons.eot
--------------------------------------------------------------------------------
/src/fonts/ionicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/fonts/ionicons.ttf
--------------------------------------------------------------------------------
/src/fonts/ionicons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/fonts/ionicons.woff
--------------------------------------------------------------------------------
/src/img/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/favicon.ico
--------------------------------------------------------------------------------
/src/img/icon-qr-inverted.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
222 |
--------------------------------------------------------------------------------
/src/img/icon-qr.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
233 |
--------------------------------------------------------------------------------
/src/img/ios-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/ios-icon.png
--------------------------------------------------------------------------------
/src/img/logo-mark.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
56 |
--------------------------------------------------------------------------------
/src/img/mock/qr_code.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/mock/qr_code.png
--------------------------------------------------------------------------------
/src/img/organisers/cramon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/organisers/cramon.jpg
--------------------------------------------------------------------------------
/src/img/organisers/katy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/organisers/katy.jpg
--------------------------------------------------------------------------------
/src/img/organisers/pat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/organisers/pat.jpg
--------------------------------------------------------------------------------
/src/img/speakers/SebastianProfile.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/SebastianProfile.jpg
--------------------------------------------------------------------------------
/src/img/speakers/aria-buckles.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/aria-buckles.jpg
--------------------------------------------------------------------------------
/src/img/speakers/ben-alpert.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/ben-alpert.jpeg
--------------------------------------------------------------------------------
/src/img/speakers/ben-gotow.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/ben-gotow.jpg
--------------------------------------------------------------------------------
/src/img/speakers/cheng-lou.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/cheng-lou.jpg
--------------------------------------------------------------------------------
/src/img/speakers/christopher-chedeau.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/christopher-chedeau.jpg
--------------------------------------------------------------------------------
/src/img/speakers/dan-abramov.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/dan-abramov.jpg
--------------------------------------------------------------------------------
/src/img/speakers/dlschafer.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/dlschafer.jpg
--------------------------------------------------------------------------------
/src/img/speakers/elie-rotenberg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/elie-rotenberg.jpg
--------------------------------------------------------------------------------
/src/img/speakers/evan-morikawa.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/evan-morikawa.jpg
--------------------------------------------------------------------------------
/src/img/speakers/jed-watson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/jed-watson.jpg
--------------------------------------------------------------------------------
/src/img/speakers/joseph-savona.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/joseph-savona.jpg
--------------------------------------------------------------------------------
/src/img/speakers/kevin-robinson.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/kevin-robinson.png
--------------------------------------------------------------------------------
/src/img/speakers/lee-byron.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/lee-byron.jpg
--------------------------------------------------------------------------------
/src/img/speakers/michael-chan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/michael-chan.jpg
--------------------------------------------------------------------------------
/src/img/speakers/michael-jackson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/michael-jackson.jpg
--------------------------------------------------------------------------------
/src/img/speakers/michael-ridgway.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/michael-ridgway.jpg
--------------------------------------------------------------------------------
/src/img/speakers/mikhail-davydov.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/mikhail-davydov.jpg
--------------------------------------------------------------------------------
/src/img/speakers/ryan-florence.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/ryan-florence.jpg
--------------------------------------------------------------------------------
/src/img/speakers/schrockn.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/schrockn.jpg
--------------------------------------------------------------------------------
/src/img/speakers/sebastian-mcKenzie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/sebastian-mcKenzie.png
--------------------------------------------------------------------------------
/src/img/speakers/spencer-ahrens.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/touchstonejs/touchstonejs-starter/141db40dec29f3c28a01717c386a081bc0e78d4d/src/img/speakers/spencer-ahrens.jpg
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
16 |
17 |
18 |
19 | Touchstonejs Demo
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/src/js/app.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
3 | import ReactDOM from 'react-dom';
4 | import {
5 | Container,
6 | createApp,
7 | UI,
8 | View,
9 | ViewManager
10 | } from 'touchstonejs';
11 |
12 | // App Config
13 | // ------------------------------
14 |
15 | const PeopleStore = require('./stores/people')
16 | const peopleStore = new PeopleStore()
17 |
18 | var App = React.createClass({
19 | mixins: [createApp()],
20 |
21 | childContextTypes: {
22 | peopleStore: React.PropTypes.object
23 | },
24 |
25 | getChildContext () {
26 | return {
27 | peopleStore: peopleStore
28 | };
29 | },
30 |
31 | componentDidMount () {
32 | // Hide the splash screen when the app is mounted
33 | if (navigator.splashscreen) {
34 | navigator.splashscreen.hide();
35 | }
36 | },
37 |
38 | render () {
39 | let appWrapperClassName = 'app-wrapper device--' + (window.device || {}).platform
40 |
41 | return (
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | );
51 | }
52 | });
53 |
54 | // Main Controller
55 | // ------------------------------
56 |
57 | var MainViewController = React.createClass({
58 | render () {
59 | return (
60 |
61 |
62 |
63 |
64 |
65 |
66 | );
67 | }
68 | });
69 |
70 | // Tab Controller
71 | // ------------------------------
72 |
73 | var lastSelectedTab = 'lists'
74 | var TabViewController = React.createClass({
75 | getInitialState () {
76 | return {
77 | selectedTab: lastSelectedTab
78 | };
79 | },
80 |
81 | onViewChange (nextView) {
82 | lastSelectedTab = nextView
83 |
84 | this.setState({
85 | selectedTab: nextView
86 | });
87 | },
88 |
89 | selectTab (value) {
90 | let viewProps;
91 |
92 | this.refs.vm.transitionTo(value, {
93 | transition: 'instant',
94 | viewProps: viewProps
95 | });
96 |
97 | this.setState({
98 | selectedTab: value
99 | })
100 | },
101 |
102 | render () {
103 | let selectedTab = this.state.selectedTab
104 | let selectedTabSpan = selectedTab
105 |
106 | if (selectedTab === 'lists' || selectedTab === 'list-simple' || selectedTab === 'list-complex' || selectedTab === 'list-details') {
107 | selectedTabSpan = 'lists';
108 | }
109 |
110 | if (selectedTab === 'transitions' || selectedTab === 'transitions-target') {
111 | selectedTabSpan = 'transitions';
112 | }
113 |
114 | return (
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | Lists
130 |
131 |
132 |
133 | Forms
134 |
135 |
136 |
137 | Controls
138 |
139 |
140 |
141 | Transitions
142 |
143 |
144 |
145 | );
146 | }
147 | });
148 |
149 | function startApp () {
150 | if (window.StatusBar) {
151 | window.StatusBar.styleDefault();
152 | }
153 | ReactDOM.render(, document.getElementById('app'));
154 | }
155 |
156 | if (!window.cordova) {
157 | startApp();
158 | } else {
159 | document.addEventListener('deviceready', startApp, false);
160 | }
161 |
--------------------------------------------------------------------------------
/src/js/components/svg/icon-qr.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs');
2 | var React = require('react');
3 |
4 | var svg = fs.readFileSync('./src/img/icon-qr.svg', 'utf-8');
5 |
6 | module.exports = React.createClass({
7 | render: function () {
8 | return React.createElement('span', {
9 | className: this.props.className ? this.props.className : 'svg-icon',
10 | dangerouslySetInnerHTML: { __html: svg }
11 | });
12 | }
13 | });
14 |
--------------------------------------------------------------------------------
/src/js/config.js:
--------------------------------------------------------------------------------
1 | module.exports = {};
2 |
--------------------------------------------------------------------------------
/src/js/stores/people.js:
--------------------------------------------------------------------------------
1 | var EventEmitter = require('events').EventEmitter;
2 |
3 | var async = require('async');
4 | var httpify = require('httpify');
5 |
6 | const apiUrl = (window.location.protocol === 'https:') ? 'https://randomuser.me/api?nat=au&results=16' : 'http://api.randomuser.me/?nat=au&results=16';
7 |
8 | function PeopleStore () {
9 | EventEmitter.call(this);
10 |
11 | // initialize internal cache
12 | var storage = this.cache = {
13 | people: []
14 | };
15 | var self = this;
16 |
17 | // Dispatchers
18 | this.starQueue = async.queue((data, callback) => {
19 | var { id, starred } = data;
20 |
21 | // update internal data
22 | self.cache.people
23 | .filter(person => person.id === id)
24 | .forEach(person => person.isStarred = starred);
25 |
26 | // emit events
27 | self.emit('people-updated', storage.people);
28 |
29 | callback();
30 | }, 1);
31 |
32 | this.refreshQueue = async.queue((_, callback) => {
33 | // update
34 | httpify({
35 | method: 'GET',
36 | url: apiUrl
37 | }, function (err, res) {
38 | if (err) return callback(err);
39 |
40 | storage.people = res.body.results.map(p => p.user);
41 |
42 | // post process new data
43 | storage.people.forEach((person, i) => {
44 | person.id = i;
45 | person.name.first = person.name.first[0].toUpperCase() + person.name.first.slice(1);
46 | person.name.last = person.name.last[0].toUpperCase() + person.name.last.slice(1);
47 | person.name.initials = person.name.first[0] + person.name.last[0];
48 | person.name.full = person.name.first + ' ' + person.name.last;
49 | person.category = Math.random() > 0.5 ? 'A' : 'B';
50 | person.github = person.name.first.toLowerCase() + person.name.last.toLowerCase();
51 | person.picture = person.picture.medium;
52 | person.twitter = '@' + person.name.first.toLowerCase() + (Math.random().toString(32).slice(2, 5));
53 | });
54 |
55 | // emit events
56 | self.emit('people-updated', storage.people);
57 | self.emit('refresh');
58 |
59 | callback(null, storage.people);
60 | });
61 | }, 1);
62 |
63 | // refresh immediately
64 | this.refresh();
65 | }
66 |
67 | Object.assign(PeopleStore.prototype, EventEmitter.prototype);
68 |
69 | // Intents
70 | PeopleStore.prototype.refresh = function (callback) {
71 | this.refreshQueue.push(null, callback);
72 | }
73 |
74 | PeopleStore.prototype.star = function ({ id }, starred, callback) {
75 | this.starQueue.push({ id, starred }, callback);
76 | }
77 |
78 | // Getters
79 | PeopleStore.prototype.getPeople = function () { return this.cache.people; };
80 |
81 | module.exports = PeopleStore;
82 |
--------------------------------------------------------------------------------
/src/js/views/controls.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import Tappable from 'react-tappable';
4 | import Timers from 'react-timers';
5 | import { Link, UI } from 'touchstonejs';
6 |
7 | module.exports = React.createClass({
8 | mixins: [Timers],
9 | statics: {
10 | navigationBar: 'main',
11 | getNavigation () {
12 | return {
13 | title: 'Controls'
14 | }
15 | }
16 | },
17 |
18 | getInitialState () {
19 | return {
20 | alertbar: {
21 | visible: false,
22 | type: '',
23 | text: ''
24 | },
25 | popup: {
26 | visible: false
27 | }
28 | }
29 | },
30 |
31 | showLoadingPopup () {
32 | this.setState({
33 | popup: {
34 | visible: true,
35 | loading: true,
36 | header: 'Loading',
37 | iconName: 'ion-load-c',
38 | iconType: 'default'
39 | }
40 | });
41 |
42 | this.setTimeout(() => {
43 | this.setState({
44 | popup: {
45 | visible: true,
46 | loading: false,
47 | header: 'Done!',
48 | iconName: 'ion-ios-checkmark',
49 | iconType: 'success'
50 | }
51 | });
52 | }, 2000);
53 |
54 | this.setTimeout(() => {
55 | this.setState({
56 | popup: {
57 | visible: false
58 | }
59 | });
60 | }, 3000);
61 | },
62 |
63 | showAlertbar (type, text) {
64 | this.setState({
65 | alertbar: {
66 | visible: true,
67 | type: type,
68 | text: text
69 | }
70 | });
71 |
72 | this.setTimeout(() => {
73 | this.setState({
74 | alertbar: {
75 | visible: false
76 | }
77 | });
78 | }, 2000);
79 | },
80 |
81 | handleModeChange (newMode) {
82 | let selectedItem = newMode;
83 |
84 | if (this.state.selectedMode === newMode) {
85 | selectedItem = null;
86 | }
87 |
88 | this.setState({
89 | selectedMode: selectedItem
90 | });
91 |
92 | },
93 |
94 | render () {
95 | let { alertbar } = this.state;
96 | return (
97 |
98 | {alertbar.text || ''}
99 |
100 | Segmented Control
101 |
107 |
108 |
109 |
110 | Alert Bar
111 |
112 |
113 | Danger
114 |
115 |
116 | Warning
117 |
118 |
119 | Success
120 |
121 |
122 |
123 |
124 | Popup
125 |
126 | Show Popup
127 |
128 |
129 |
130 | Application State
131 |
132 |
133 |
134 | Invalid View
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | {this.state.popup.header}
143 |
144 |
145 | );
146 | }
147 | });
148 |
--------------------------------------------------------------------------------
/src/js/views/form.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import dialogs from 'cordova-dialogs';
3 | import React from 'react';
4 | import Tappable from 'react-tappable';
5 | import { UI } from 'touchstonejs';
6 |
7 | const scrollable = Container.initScrollable();
8 |
9 | // html5 input types for testing
10 | // omitted: button, checkbox, radio, image, hidden, reset, submit
11 | const HTML5_INPUT_TYPES = ['color', 'date', 'datetime', 'datetime-local', 'email', 'file', 'month', 'number', 'password', 'range', 'search', 'tel', 'text', 'time', 'url', 'week'];
12 | const FLAVOURS = [
13 | { label: 'Vanilla', value: 'vanilla' },
14 | { label: 'Chocolate', value: 'chocolate' },
15 | { label: 'Caramel', value: 'caramel' },
16 | { label: 'Strawberry', value: 'strawberry' }
17 | ];
18 |
19 | module.exports = React.createClass({
20 | statics: {
21 | navigationBar: 'main',
22 | getNavigation () {
23 | return {
24 | title: 'Forms'
25 | }
26 | }
27 | },
28 |
29 | getInitialState () {
30 | return {
31 | flavourLabelSelect: 'chocolate',
32 | flavourRadioList: 'chocolate',
33 | switchValue: true
34 | }
35 | },
36 |
37 | handleRadioListChange (key, newValue) {
38 | console.log('handleFlavourChange:', key, newValue);
39 | let newState = {};
40 | newState[key] = newValue;
41 |
42 | this.setState(newState);
43 | },
44 |
45 | handleLabelSelectChange (key, event) {
46 | console.log('handleFlavourChange:', key, event.target.value);
47 | let newState = {};
48 | newState[key] = event.target.value;
49 |
50 | this.setState(newState);
51 | },
52 |
53 | handleSwitch (key, event) {
54 | let newState = {};
55 | newState[key] = !this.state[key];
56 |
57 | this.setState(newState);
58 | },
59 |
60 | alert (message) {
61 | dialogs.alert(message, function() {}, null)
62 | },
63 |
64 | // used for testing
65 | renderInputTypes () {
66 | return HTML5_INPUT_TYPES.map(type => {
67 | return ;
68 | });
69 | },
70 |
71 | showDatePicker () {
72 | this.setState({datePicker: true});
73 | },
74 |
75 | handleDatePickerChange (d) {
76 | this.setState({datePicker: false, date: d});
77 | },
78 |
79 | formatDate (date) {
80 | if (date) {
81 | return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate();
82 | }
83 | },
84 |
85 | render () {
86 |
87 | return (
88 |
89 |
90 | {/*
91 | Input Type Experiment
92 |
93 | {this.renderInputTypes()}
94 |
95 | */}
96 |
97 | Checkbox
98 |
99 |
100 |
101 | Switch
102 |
103 |
104 |
105 |
106 |
107 | Disabled
108 |
109 |
110 |
111 |
112 |
113 |
114 | Radio
115 |
116 |
117 |
118 |
119 |
120 | Inputs
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | Labelled Inputs
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | Primary Button
141 |
142 |
143 | Default Button
144 |
145 |
146 | Danger Button
147 |
148 |
149 | Disabled Button
150 |
151 |
152 |
153 |
154 | );
155 | }
156 | });
157 |
--------------------------------------------------------------------------------
/src/js/views/list-complex.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import Sentry from 'react-sentry';
4 | import Tappable from 'react-tappable';
5 | import { Link, UI } from 'touchstonejs';
6 |
7 | var scrollable = Container.initScrollable();
8 |
9 | var ComplexLinkItem = React.createClass({
10 | contextTypes: { peopleStore: React.PropTypes.object.isRequired },
11 |
12 | toggleStar () {
13 | let person = this.props.person
14 |
15 | this.context.peopleStore.star(person, !person.isStarred)
16 | },
17 |
18 | render () {
19 | let person = this.props.person;
20 |
21 | return (
22 |
23 |
24 |
25 |
26 |
27 | {person.name.full}
28 | {person.email || ''}
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | );
37 | }
38 | });
39 |
40 | // FIXME: this bit is global and hacky, expect it to change
41 | var EventEmitter = require('events').EventEmitter;
42 | var emitter = new EventEmitter();
43 |
44 | function getNavigation (props, app, filterStarred) {
45 | return {
46 | leftLabel: 'Lists',
47 | leftArrow: true,
48 | leftAction: () => { app.transitionTo('tabs:lists', { transition: 'reveal-from-right' }) },
49 | rightLabel: filterStarred ? 'All' : 'Starred',
50 | rightAction: emitter.emit.bind(emitter, 'navigationBarRightAction'),
51 | title: 'Complex'
52 | };
53 | }
54 |
55 | module.exports = React.createClass({
56 | contextTypes: {
57 | app: React.PropTypes.object,
58 | peopleStore: React.PropTypes.object.isRequired
59 | },
60 | mixins: [Sentry],
61 |
62 | statics: {
63 | navigationBar: 'main',
64 | getNavigation: getNavigation
65 | },
66 |
67 | getInitialState () {
68 | return {
69 | filterStarred: false,
70 | people: this.context.peopleStore.getPeople()
71 | }
72 | },
73 |
74 | componentDidMount () {
75 | this.watch(this.context.peopleStore, 'people-updated', people => {
76 | this.setState({ people })
77 | })
78 |
79 | this.watch(emitter, 'navigationBarRightAction', this.toggleStarred);
80 | },
81 |
82 | toggleStarred () {
83 | let filterStarred = !this.state.filterStarred;
84 | this.setState({ filterStarred });
85 | this.context.app.navigationBars.main.update(getNavigation({}, this.context.app, filterStarred));
86 | },
87 |
88 | handleModeChange (newMode) {
89 | let selectedMode = newMode;
90 |
91 | if (this.state.selectedMode === newMode) {
92 | selectedMode = null;
93 | }
94 |
95 | this.setState({ selectedMode })
96 | },
97 |
98 | render () {
99 | let { people, filterStarred, selectedMode } = this.state
100 |
101 | if (filterStarred) {
102 | people = people.filter(person => person.isStarred)
103 | }
104 |
105 | if (selectedMode === 'A' || selectedMode === 'B') {
106 | people = people.filter(person => person.category === selectedMode)
107 | }
108 |
109 | function sortByName (a, b) { return a.name.full.localeCompare(b.name.full) }
110 |
111 | let sortedPeople = people.sort(sortByName)
112 | let results
113 |
114 | if (sortedPeople.length) {
115 | let aPeople = sortedPeople
116 | .filter(person => person.category === 'A')
117 | .map((person, i) => {
118 | return
119 | })
120 |
121 | let bPeople = sortedPeople
122 | .filter(person => person.category === 'B')
123 | .map((person, i) => {
124 | return
125 | })
126 |
127 | results = (
128 |
129 | {aPeople.length > 0 ? Category A : ''}
130 | {aPeople}
131 | {bPeople.length > 0 ? Category B : ''}
132 | {bPeople}
133 |
134 | )
135 |
136 | } else {
137 | results = (
138 |
139 |
140 | Go star some people!
141 |
142 | )
143 | }
144 |
145 | return (
146 |
147 |
151 | {results}
152 |
153 | );
154 | }
155 | });
156 |
--------------------------------------------------------------------------------
/src/js/views/list-details.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 |
4 | module.exports = React.createClass({
5 | statics: {
6 | navigationBar: 'main',
7 | getNavigation (props, app) {
8 | var leftLabel = props.prevView === 'list-simple' ? 'Simple' : 'Complex';
9 | return {
10 | leftArrow: true,
11 | leftLabel: leftLabel,
12 | leftAction: () => { app.transitionTo('tabs:' + props.prevView, { transition: 'reveal-from-right' }) },
13 | title: 'Person'
14 | }
15 | }
16 | },
17 | getDefaultProps () {
18 | return {
19 | prevView: 'home'
20 | }
21 | },
22 | render () {
23 | var { person } = this.props;
24 |
25 | return (
26 |
27 |
28 |
29 | {person.name.full}
30 | {person.email || ''}
31 | {(person.twitter || person.github) &&
32 | {person.twitter &&
33 |
34 | {person.twitter}
35 |
}
36 | {person.github &&
37 |
38 | {person.github}
39 |
}
40 |
}
41 |
42 |
43 | );
44 | }
45 | });
46 |
--------------------------------------------------------------------------------
/src/js/views/list-simple.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import Sentry from 'react-sentry';
4 | import Tappable from 'react-tappable';
5 | import { Link, UI } from 'touchstonejs';
6 |
7 | var scrollable = Container.initScrollable({ left: 0, top: 44 });
8 |
9 | var SimpleLinkItem = React.createClass({
10 | propTypes: {
11 | person: React.PropTypes.object.isRequired
12 | },
13 |
14 | render () {
15 | return (
16 |
17 |
18 |
19 | {this.props.person.name.full}
20 |
21 |
22 |
23 | );
24 | }
25 | });
26 |
27 | module.exports = React.createClass({
28 | mixins: [Sentry],
29 | contextTypes: { peopleStore: React.PropTypes.object.isRequired },
30 |
31 | statics: {
32 | navigationBar: 'main',
33 | getNavigation (props, app) {
34 | return {
35 | leftArrow: true,
36 | leftLabel: 'Lists',
37 | leftAction: () => { app.transitionTo('tabs:lists', { transition: 'reveal-from-right' }) },
38 | title: 'Simple'
39 | }
40 | }
41 | },
42 |
43 | componentDidMount () {
44 | this.watch(this.context.peopleStore, 'people-updated', people => {
45 | this.setState({ people })
46 | });
47 | },
48 |
49 | getInitialState () {
50 | return {
51 | searchString: '',
52 | people: this.context.peopleStore.getPeople()
53 | }
54 | },
55 |
56 | clearSearch () {
57 | this.setState({ searchString: '' });
58 | },
59 |
60 | updateSearch (str) {
61 | this.setState({ searchString: str });
62 | },
63 |
64 | submitSearch (str) {
65 | console.log(str);
66 | },
67 |
68 | render () {
69 | let { people, searchString } = this.state
70 | let searchRegex = new RegExp(searchString)
71 |
72 | function searchFilter (person) { return searchRegex.test(person.name.full.toLowerCase()) };
73 | function sortByName (a, b) { return a.name.full.localeCompare(b.name.full) };
74 |
75 | let filteredPeople = people.filter(searchFilter).sort(sortByName);
76 |
77 | let results
78 |
79 | if (searchString && !filteredPeople.length) {
80 | results = (
81 |
82 |
83 | {'No results for "' + searchString + '"'}
84 |
85 | );
86 |
87 | } else {
88 | results = (
89 |
90 | {filteredPeople.map((person, i) => {
91 | return
92 | })}
93 |
94 | );
95 | }
96 |
97 | return (
98 |
99 |
100 | {results}
101 |
102 | );
103 | }
104 | });
105 |
--------------------------------------------------------------------------------
/src/js/views/lists.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import { Link, UI } from 'touchstonejs';
4 |
5 | module.exports = React.createClass({
6 | statics: {
7 | navigationBar: 'main',
8 | getNavigation () {
9 | return {
10 | title: 'Lists'
11 | }
12 | }
13 | },
14 |
15 | render: function () {
16 | return (
17 |
18 |
19 | Lists
20 |
21 |
22 |
23 |
24 | Simple List
25 |
26 |
27 |
28 |
29 |
30 |
31 | Complex List
32 |
33 |
34 |
35 |
36 |
37 |
38 | GroupHeader
39 |
40 |
41 | Use groups to contain content or lists. Where appropriate a Group should be accompanied by a GroupHeading and optionally a GroupFooter.
42 | GroupBody will apply the background for content inside groups.
43 |
44 |
45 | GroupFooter: useful for a detailed explanation to express the intentions of the Group. Try to be concise - remember that users are likely to read the text in your UI many times.
46 |
47 |
48 | );
49 | }
50 | });
51 |
--------------------------------------------------------------------------------
/src/js/views/transitions-target-over.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import Timers from 'react-timers';
4 | import { Mixins, UI } from 'touchstonejs';
5 |
6 | module.exports = React.createClass({
7 | mixins: [Mixins.Transitions, Timers],
8 | componentDidMount () {
9 | var self = this;
10 | this.setTimeout(function () {
11 | self.transitionTo('app:main', { transition: 'fade' });
12 | }, 1000);
13 | },
14 | render () {
15 | return (
16 |
17 |
18 |
19 |
20 | Hold on a sec...
21 |
22 |
23 | );
24 | }
25 | });
26 |
--------------------------------------------------------------------------------
/src/js/views/transitions-target.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import Timers from 'react-timers';
4 | import { Mixins } from 'touchstonejs';
5 |
6 | module.exports = React.createClass({
7 | mixins: [Mixins.Transitions, Timers],
8 | statics: {
9 | navigationBar: 'main',
10 | getNavigation (props) {
11 | return {
12 | title: props.navbarTitle
13 | }
14 | }
15 | },
16 | componentDidMount () {
17 | var self = this;
18 |
19 | this.setTimeout(function () {
20 | self.transitionTo('tabs:transitions', { transition: 'fade' });
21 | }, 1000);
22 | },
23 | render () {
24 | return (
25 |
26 |
27 | Hold on a sec...
28 |
29 | );
30 | }
31 | });
32 |
--------------------------------------------------------------------------------
/src/js/views/transitions.js:
--------------------------------------------------------------------------------
1 | import Container from 'react-container';
2 | import React from 'react';
3 | import { Link, UI } from 'touchstonejs';
4 |
5 | var scrollable = Container.initScrollable();
6 |
7 | module.exports = React.createClass({
8 | statics: {
9 | navigationBar: 'main',
10 | getNavigation () {
11 | return {
12 | title: 'Transitions'
13 | }
14 | }
15 | },
16 |
17 | render () {
18 | return (
19 |
20 |
21 | Default
22 |
23 |
24 |
25 | Instant
26 |
27 |
28 |
29 |
30 |
31 | Fade
32 |
33 |
34 |
35 | Fade
36 |
37 |
38 |
39 |
40 | Fade Expand (non-standard)
41 |
42 |
43 |
44 |
45 | Fade Contract (non-standard)
46 |
47 |
48 |
49 |
50 |
51 | Show
52 |
53 |
54 |
55 | Show from Left (non-standard)
56 |
57 |
58 |
59 |
60 | Show from Right
61 |
62 |
63 |
64 |
65 | Show from Top (non-standard)
66 |
67 |
68 |
69 |
70 | Show from Bottom
71 |
72 |
73 |
74 |
75 |
76 | Reveal
77 |
78 |
79 |
80 | Reveal from Left (non-standard)
81 |
82 |
83 |
84 |
85 | Reveal from Right
86 |
87 |
88 |
89 |
90 | Reveal from Top (non-standard)
91 |
92 |
93 |
94 |
95 | Reveal from Bottom
96 |
97 |
98 |
99 |
100 |
101 | );
102 | }
103 | });
104 |
--------------------------------------------------------------------------------