init
This commit is contained in:
commit
c41d4b4cec
62
.eslintrc.json
Normal file
62
.eslintrc.json
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
{
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2019,
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"es6": true,
|
||||||
|
"browser": true
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
"svelte3"
|
||||||
|
],
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"**/*.svelte"
|
||||||
|
],
|
||||||
|
"processor": "svelte3/svelte3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"arrow-spacing": "error",
|
||||||
|
"block-scoped-var": "error",
|
||||||
|
"block-spacing": "error",
|
||||||
|
"brace-style": ["error", "stroustrup", {}],
|
||||||
|
"camelcase": "error",
|
||||||
|
"comma-dangle": ["error", "never"],
|
||||||
|
"comma-spacing": ["error", { "before": false, "after": true }],
|
||||||
|
"comma-style": [1, "last"],
|
||||||
|
"consistent-this": [1, "_this"],
|
||||||
|
"curly": [1, "multi"],
|
||||||
|
"eol-last": 1,
|
||||||
|
"eqeqeq": 1,
|
||||||
|
"func-names": 1,
|
||||||
|
"indent": ["error", 2, { "SwitchCase": 1 }],
|
||||||
|
"lines-around-comment": ["error", { "beforeBlockComment": true, "allowArrayStart": true }],
|
||||||
|
"max-len": [1, 240, 2], // 2 spaces per tab, max 80 chars per line
|
||||||
|
"new-cap": 1,
|
||||||
|
"newline-before-return": "error",
|
||||||
|
"no-array-constructor": 1,
|
||||||
|
"no-inner-declarations": [1, "both"],
|
||||||
|
"no-mixed-spaces-and-tabs": 1,
|
||||||
|
"no-multi-spaces": 2,
|
||||||
|
"no-new-object": 1,
|
||||||
|
"no-shadow-restricted-names": 1,
|
||||||
|
"object-curly-spacing": ["error", "always"],
|
||||||
|
"padded-blocks": ["error", { "blocks": "never", "switches": "always" }],
|
||||||
|
"prefer-const": "error",
|
||||||
|
"prefer-template": "error",
|
||||||
|
"one-var": 0,
|
||||||
|
"quote-props": ["error", "always"],
|
||||||
|
"quotes": [1, "single"],
|
||||||
|
"radix": 1,
|
||||||
|
"semi": [1, "always"],
|
||||||
|
"space-before-blocks": [1, "always"],
|
||||||
|
"space-infix-ops": 1,
|
||||||
|
"vars-on-top": 1,
|
||||||
|
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1 }],
|
||||||
|
"spaced-comment": ["error", "always", { "markers": ["/"] }]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/node_modules/
|
||||||
|
/public/build/
|
||||||
|
|
||||||
|
.DS_Store
|
5
.idea/.gitignore
vendored
Normal file
5
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
6
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
</profile>
|
||||||
|
</component>
|
6
.idea/jsLibraryMappings.xml
Normal file
6
.idea/jsLibraryMappings.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JavaScriptLibraryMappings">
|
||||||
|
<includedPredefinedLibrary name="Node.js Core" />
|
||||||
|
</component>
|
||||||
|
</project>
|
6
.idea/misc.xml
Normal file
6
.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="JavaScriptSettings">
|
||||||
|
<option name="languageLevel" value="ES6" />
|
||||||
|
</component>
|
||||||
|
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/svelte-traintimes.iml" filepath="$PROJECT_DIR$/.idea/svelte-traintimes.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
12
.idea/svelte-traintimes.iml
Normal file
12
.idea/svelte-traintimes.iml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/temp" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/tmp" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
106
README.md
Normal file
106
README.md
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
*Looking for a shareable component template? Go here --> [sveltejs/component-template](https://github.com/sveltejs/component-template)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Updates
|
||||||
|
|
||||||
|
## 2020-04-17
|
||||||
|
|
||||||
|
Added [svelte-preprocess](https://www.npmjs.com/package/svelte-preprocess) preprocessor with support for: PostCSS, SCSS, Less, Stylus, Coffeescript, TypeScript and Pug.
|
||||||
|
|
||||||
|
Added [rollup-plugin-node-builtins](https://www.npmjs.com/package/rollup-plugin-node-builtins) Allows the node builtins to be required/imported. Doing so gives the proper shims to support modules that were designed for Browserify, some modules require rollup-plugin-node-globals.
|
||||||
|
|
||||||
|
Added [rollup-plugin-node-globals](https://www.npmjs.com/package/rollup-plugin-node-globals) Plugin to insert node globals including so code that works with browserify should work even if it uses process or buffers.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# svelte app
|
||||||
|
|
||||||
|
This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template.
|
||||||
|
|
||||||
|
To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx degit sveltejs/template svelte-app
|
||||||
|
cd svelte-app
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note that you will need to have [Node.js](https://nodejs.org) installed.*
|
||||||
|
|
||||||
|
|
||||||
|
## Get started
|
||||||
|
|
||||||
|
Install the dependencies...
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd svelte-app
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
...then start [Rollup](https://rollupjs.org):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Navigate to [localhost:5000](http://localhost:5000). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes.
|
||||||
|
|
||||||
|
By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`.
|
||||||
|
|
||||||
|
|
||||||
|
## Building and running in production mode
|
||||||
|
|
||||||
|
To create an optimised version of the app:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com).
|
||||||
|
|
||||||
|
|
||||||
|
## Single-page app mode
|
||||||
|
|
||||||
|
By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere.
|
||||||
|
|
||||||
|
If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json:
|
||||||
|
|
||||||
|
```js
|
||||||
|
"start": "sirv public --single"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Deploying to the web
|
||||||
|
|
||||||
|
### With [now](https://zeit.co/now)
|
||||||
|
|
||||||
|
Install `now` if you haven't already:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g now
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, from within your project folder:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd public
|
||||||
|
now deploy --name my-project
|
||||||
|
```
|
||||||
|
|
||||||
|
As an alternative, use the [Now desktop client](https://zeit.co/download) and simply drag the unzipped project folder to the taskbar icon.
|
||||||
|
|
||||||
|
### With [surge](https://surge.sh/)
|
||||||
|
|
||||||
|
Install `surge` if you haven't already:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install -g surge
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, from within your project folder:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
surge public my-project.surge.sh
|
||||||
|
```
|
4197
package-lock.json
generated
Normal file
4197
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
33
package.json
Normal file
33
package.json
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "svelte-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"build": "rollup -c",
|
||||||
|
"dev": "rollup -c -w",
|
||||||
|
"start": "sirv public"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-commonjs": "^11.0.0",
|
||||||
|
"@rollup/plugin-node-resolve": "^7.0.0",
|
||||||
|
"autoprefixer": "^9.7.6",
|
||||||
|
"eslint": "^6.8.0",
|
||||||
|
"eslint-plugin-svelte3": "^2.7.3",
|
||||||
|
"node-sass": "^4.13.1",
|
||||||
|
"rollup": "^1.20.0",
|
||||||
|
"rollup-plugin-livereload": "^1.0.0",
|
||||||
|
"rollup-plugin-node-builtins": "^2.1.2",
|
||||||
|
"rollup-plugin-node-globals": "^1.4.0",
|
||||||
|
"rollup-plugin-svelte": "^5.0.3",
|
||||||
|
"rollup-plugin-terser": "^5.1.2",
|
||||||
|
"svelte": "^3.0.0",
|
||||||
|
"svelte-preprocess": "^3.7.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^0.19.2",
|
||||||
|
"muicss": "^0.10.1",
|
||||||
|
"rollup-plugin-replace": "^2.2.0",
|
||||||
|
"sirv-cli": "^0.4.4",
|
||||||
|
"spectre.css": "^0.5.8",
|
||||||
|
"svelte-spa-router": "^2.1.0"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/favicon.png
Normal file
BIN
public/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
0
public/global.css
Normal file
0
public/global.css
Normal file
17
public/index.html
Normal file
17
public/index.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset='utf-8'>
|
||||||
|
<meta name='viewport' content='width=device-width,initial-scale=1'>
|
||||||
|
|
||||||
|
<title>Svelte app</title>
|
||||||
|
|
||||||
|
<link rel='icon' type='image/png' href='/favicon.png'>
|
||||||
|
<link rel='stylesheet' href='/build/bundle.css'>
|
||||||
|
|
||||||
|
<script defer src='/build/bundle.js'></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>
|
91
rollup.config.js
Normal file
91
rollup.config.js
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import svelte from 'rollup-plugin-svelte';
|
||||||
|
import resolve from '@rollup/plugin-node-resolve';
|
||||||
|
import commonjs from '@rollup/plugin-commonjs';
|
||||||
|
import livereload from 'rollup-plugin-livereload';
|
||||||
|
import replace from 'rollup-plugin-replace';
|
||||||
|
import { terser } from 'rollup-plugin-terser';
|
||||||
|
import sveltePreprocess from 'svelte-preprocess';
|
||||||
|
import builtins from 'rollup-plugin-node-builtins';
|
||||||
|
import globals from 'rollup-plugin-node-globals';
|
||||||
|
|
||||||
|
const production = !process.env.ROLLUP_WATCH;
|
||||||
|
|
||||||
|
const preprocess = sveltePreprocess({
|
||||||
|
'scss': {
|
||||||
|
'includePaths': ['src']
|
||||||
|
},
|
||||||
|
'postcss': {
|
||||||
|
'plugins': [require('autoprefixer')]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
'input': 'src/main.js',
|
||||||
|
'output': {
|
||||||
|
'sourcemap': (!production),
|
||||||
|
'format': 'iife',
|
||||||
|
'name': 'app',
|
||||||
|
'file': 'public/build/bundle.js'
|
||||||
|
},
|
||||||
|
'plugins': [
|
||||||
|
// globals(),
|
||||||
|
// builtins(),
|
||||||
|
svelte({
|
||||||
|
// enable run-time checks when not in production
|
||||||
|
'dev': !production,
|
||||||
|
preprocess,
|
||||||
|
// we'll extract any component CSS out into
|
||||||
|
// a separate file - better for performance
|
||||||
|
'css': css => {
|
||||||
|
css.write('public/build/bundle.css');
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
|
// If you have external dependencies installed from
|
||||||
|
// npm, you'll most likely need these plugins. In
|
||||||
|
// some cases you'll need additional configuration -
|
||||||
|
// consult the documentation for details:
|
||||||
|
// https://github.com/rollup/plugins/tree/master/packages/commonjs
|
||||||
|
resolve({
|
||||||
|
'browser': true,
|
||||||
|
'dedupe': ['svelte']
|
||||||
|
}),
|
||||||
|
commonjs(),
|
||||||
|
replace({
|
||||||
|
'exclude': 'node_modules/**',
|
||||||
|
'ENV': JSON.stringify(production ? 'production' : 'development')
|
||||||
|
}),
|
||||||
|
|
||||||
|
// In dev mode, call `npm run start` once
|
||||||
|
// the bundle has been generated
|
||||||
|
!production && serve(),
|
||||||
|
|
||||||
|
// Watch the `public` directory and refresh the
|
||||||
|
// browser on changes when not in production
|
||||||
|
!production && livereload('public'),
|
||||||
|
|
||||||
|
// If we're building for production (npm run build
|
||||||
|
// instead of npm run dev), minify
|
||||||
|
production && terser()
|
||||||
|
],
|
||||||
|
'watch': {
|
||||||
|
'clearScreen': false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function serve() {
|
||||||
|
let started = false;
|
||||||
|
|
||||||
|
return {
|
||||||
|
writeBundle() {
|
||||||
|
if (!started) {
|
||||||
|
started = true;
|
||||||
|
|
||||||
|
require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
|
||||||
|
'stdio': ['ignore', 'inherit', 'inherit'],
|
||||||
|
'shell': true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
35
src/App.svelte
Normal file
35
src/App.svelte
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<script>
|
||||||
|
import Router from 'svelte-spa-router';
|
||||||
|
import {link, push, pop, replace, location, querystring} from 'svelte-spa-router';
|
||||||
|
import active from 'svelte-spa-router/active'
|
||||||
|
// Import the list of routes
|
||||||
|
import routes from './routes'
|
||||||
|
import Header from "./components/Header.svelte";
|
||||||
|
|
||||||
|
function conditionsFailed(event) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error('Caught event conditionsFailed', event.detail)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handles the "routeLoaded" event dispatched by the router after a route has been successfully loaded
|
||||||
|
function routeLoaded(event) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.info('Caught event routeLoaded', event.detail)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handles event bubbling up from nested routes
|
||||||
|
function routeEvent(event) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.info('Caught event routeEvent', event.detail)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss" global>
|
||||||
|
@import "./css/custom.scss";
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<Header/>
|
||||||
|
<Router {routes} on:conditionsFailed={conditionsFailed} on:routeLoaded={routeLoaded} on:routeEvent={routeEvent} />
|
32
src/components/Header.svelte
Normal file
32
src/components/Header.svelte
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<script>
|
||||||
|
import {link, push, pop, replace, location, querystring} from 'svelte-spa-router';
|
||||||
|
import active from 'svelte-spa-router/active'
|
||||||
|
|
||||||
|
let titleText = 'Traintimes';
|
||||||
|
let currentMode = 1;
|
||||||
|
|
||||||
|
$: titleText = $location;
|
||||||
|
function goBack() {
|
||||||
|
console.log('>> Header:goBack');
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<header id="header">
|
||||||
|
<div class="mui-appbar mui--appbar-line-height mui--z2">
|
||||||
|
{#if currentMode === 1}
|
||||||
|
<div class='mui-col-xs-1 mui-col-md-1 mui--appbar-height'>
|
||||||
|
<a on:click={goBack} class="">
|
||||||
|
<i class="fa-3x fa fa-back mui--align-middle" style="color:white;"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/if}
|
||||||
|
<div class='mui-col-xs-11 mui-col-md-11 mui--appbar-height titleBar'>{titleText}</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</header>
|
17
src/components/TimetableList.svelte
Normal file
17
src/components/TimetableList.svelte
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<script>
|
||||||
|
export let fromStation;
|
||||||
|
export let destStation;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
background: #f55a4e;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span>TimetableList</span>
|
||||||
|
{fromStation} to {destStation}
|
||||||
|
</div>
|
||||||
|
|
89
src/components/TrainRoute.svelte
Normal file
89
src/components/TrainRoute.svelte
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<script>
|
||||||
|
import {findStation} from '../libs/stations'
|
||||||
|
import {minuteFloor, LocalStorage} from '../libs/utils'
|
||||||
|
import {push} from 'svelte-spa-router';
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
|
import {onMount, onDestroy} from 'svelte';
|
||||||
|
|
||||||
|
export let destStation;
|
||||||
|
export let startStation;
|
||||||
|
|
||||||
|
let startStationName;
|
||||||
|
let destStationName;
|
||||||
|
let url;
|
||||||
|
let baseUrl = 'http://localhost:8100';
|
||||||
|
let displayTime;
|
||||||
|
let trainData = {eta: 'OFF', sta: 'OFF'};
|
||||||
|
let status;
|
||||||
|
let timetablePath;
|
||||||
|
let interval = 0;
|
||||||
|
|
||||||
|
$: {
|
||||||
|
status = (trainData.eta === 'On time') ? 'ontime' : 'delayed';
|
||||||
|
displayTime = (trainData.eta === 'On time') ? trainData.sta : trainData.eta;
|
||||||
|
timetablePath = `#/timetable/${startStation}/${destStation}`
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
if( LocalStorage.exists(`${startStation}${destStation}`)) {
|
||||||
|
const fromLS = JSON.parse(LocalStorage.load(`${startStation}${destStation}`));
|
||||||
|
trainData = {...trainData, ...fromLS};
|
||||||
|
}
|
||||||
|
|
||||||
|
startStationName = findStation(startStation);
|
||||||
|
destStationName = findStation(destStation);
|
||||||
|
url = `${baseUrl}/getnexttraintimes?from=${startStation}&to=${destStation}`;
|
||||||
|
updateTrain();
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(async () => {
|
||||||
|
clearInterval(interval);
|
||||||
|
LocalStorage.save(`${startStation}${destStation}`, JSON.stringify(trainData));
|
||||||
|
});
|
||||||
|
|
||||||
|
function onClick() {
|
||||||
|
console.log('Onclick', timetablePath);
|
||||||
|
push(timetablePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateTrain() {
|
||||||
|
console.log(`Update: ${startStation} / ${destStation}`)
|
||||||
|
const now = new Date()
|
||||||
|
const hours = now.getHours()
|
||||||
|
const limit = (hours < 6) ? 3600000 : 95000
|
||||||
|
const mod = limit - (now.getTime() % limit)
|
||||||
|
await getTrain()
|
||||||
|
clearTimeout(interval)
|
||||||
|
interval = 0
|
||||||
|
interval = setTimeout(updateTrain, mod + 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getTrain() {
|
||||||
|
const minuteHash = minuteFloor()
|
||||||
|
const workingUrl = url.concat(`&mh=${minuteHash}`)
|
||||||
|
axios.get(workingUrl)
|
||||||
|
.then((d) => {
|
||||||
|
trainData = {...d.data}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.entry {
|
||||||
|
height: 36px;
|
||||||
|
margin: 6px 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="mui-row card">
|
||||||
|
<div class='mui-col-xs-7 mui-col-md-7 entry'>
|
||||||
|
<div>{startStationName}</div>
|
||||||
|
<div>{destStationName}</div>
|
||||||
|
</div>
|
||||||
|
<div class='mui-col-xs-5 mui-col-md-5 mui--text-right'>
|
||||||
|
<span class="mui-btn mui-btn--flat time {status}" on:click={onClick}>{displayTime}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
12
src/components/TrainService.svelte
Normal file
12
src/components/TrainService.svelte
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
background: #f55a4e;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span>TrainService</span>
|
88
src/css/common.css
Normal file
88
src/css/common.css
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
body {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
position: relative;
|
||||||
|
background-color: #fff;
|
||||||
|
min-height:48px;
|
||||||
|
margin: 8px;
|
||||||
|
border-bottom-color: #666666;
|
||||||
|
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mui--text-display4, .mui--text-display3 {
|
||||||
|
font-family: "Roboto Slab", "Helvetica Neue", Helvetica, Arial;
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp0, .temp1, .temp2, .temp3, .temp4, .temp5 {
|
||||||
|
color: rgb(80,181,221)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp6 {
|
||||||
|
color: rgb(78,178,206)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp7 {
|
||||||
|
color: rgb(76, 176, 190)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp8 {
|
||||||
|
color: rgb(73, 173, 175)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp9 {
|
||||||
|
color: rgb(72, 171, 159)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp10 {
|
||||||
|
color: rgb(70, 168, 142)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp11 {
|
||||||
|
color: rgb(68, 166, 125)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp12 {
|
||||||
|
color: rgb(66, 164, 108)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp13 {
|
||||||
|
color: rgb(102, 173, 94)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp14 {
|
||||||
|
color: rgb(135, 190, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp15 {
|
||||||
|
color: rgb(179, 204, 26)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp16 {
|
||||||
|
color: rgb(214, 213, 28)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp17 {
|
||||||
|
color: rgb(249, 202, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp18 {
|
||||||
|
color: rgb(246, 181, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp19 {
|
||||||
|
color: rgb(244, 150, 26)
|
||||||
|
}
|
||||||
|
|
||||||
|
.temp20 {
|
||||||
|
color: rgb(236, 110, 5)
|
||||||
|
}
|
||||||
|
|
||||||
|
.day {
|
||||||
|
font-family: "Roboto Slab", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
.summary::first-letter {
|
||||||
|
text-transform: capitalize
|
||||||
|
}
|
336
src/css/custom.scss
Normal file
336
src/css/custom.scss
Normal file
@ -0,0 +1,336 @@
|
|||||||
|
// import MUI colors
|
||||||
|
@import "./node_modules/muicss/lib/sass/mui/colors";
|
||||||
|
|
||||||
|
// customize MUI variables
|
||||||
|
$mui-primary-color: mui-color("blue-grey", "500");
|
||||||
|
$mui-primary-color-dark: mui-color("blue-grey", "700");
|
||||||
|
$mui-primary-color-light: mui-color("blue-grey", "100");
|
||||||
|
|
||||||
|
$mui-accent-color: mui-color("deep-purple", "900");
|
||||||
|
$mui-accent-color-dark: mui-color("indigo", "A100");
|
||||||
|
$mui-accent-color-light: mui-color("indigo", "A400");
|
||||||
|
|
||||||
|
$mui-base-font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, Verdana,
|
||||||
|
"Trebuchet MS";
|
||||||
|
|
||||||
|
// import MUI SASS
|
||||||
|
@import "./node_modules/muicss/lib/sass/mui";
|
||||||
|
@import "./src/css/viewport";
|
||||||
|
@import "./src/css/horscroll";
|
||||||
|
@import "./src/css/spinner";
|
||||||
|
////
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: mui-color("grey", "100");
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 2;
|
||||||
|
transition: left 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 4px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dates {
|
||||||
|
padding: 2px;
|
||||||
|
border: solid 1px #80007e;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#btc,
|
||||||
|
#fx,
|
||||||
|
#trend {
|
||||||
|
font-size: 85%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.up,
|
||||||
|
.ontime,
|
||||||
|
.trendUp {
|
||||||
|
color: mui-color("green") !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.down,
|
||||||
|
.delayed,
|
||||||
|
.trendDown {
|
||||||
|
color: $mui-text-danger !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nochange {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
.password {
|
||||||
|
border: 1px solid mui-color("grey", "400");
|
||||||
|
background-color: mui-color("grey", "200");
|
||||||
|
font-family: monospace;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trendUp:before {
|
||||||
|
content: "▲";
|
||||||
|
}
|
||||||
|
|
||||||
|
.trendDown:before {
|
||||||
|
content: "▼";
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
position: relative;
|
||||||
|
background-color: #fff;
|
||||||
|
min-height: 48px;
|
||||||
|
margin: 8px;
|
||||||
|
border-bottom-color: #666666;
|
||||||
|
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2),
|
||||||
|
0 1px 5px 0 rgba(0, 0, 0, 0.12);
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
height: 36px;
|
||||||
|
margin: 6px 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.time {
|
||||||
|
font-family: "Roboto";
|
||||||
|
}
|
||||||
|
|
||||||
|
.titleBar {
|
||||||
|
font-family: "Gotham Light";
|
||||||
|
font-size: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#trains,
|
||||||
|
#trainResults {
|
||||||
|
overflow-y: auto;
|
||||||
|
transition: all 0.5s;
|
||||||
|
-webkit-transition: all 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBody {
|
||||||
|
transition: all 0.5s;
|
||||||
|
-webkit-transition: all 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unsliced {
|
||||||
|
height: 455px;
|
||||||
|
}
|
||||||
|
.sliced {
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The snackbar - position it at the bottom and in the middle of the screen */
|
||||||
|
#snackbar {
|
||||||
|
visibility: hidden; /* Hidden by default. Visible on click */
|
||||||
|
min-width: 250px; /* Set a default minimum width */
|
||||||
|
margin-left: -125px; /* Divide value of min-width by 2 */
|
||||||
|
background-color: #333; /* Black background color */
|
||||||
|
color: #fff; /* White text color */
|
||||||
|
text-align: center; /* Centered text */
|
||||||
|
border-radius: 2px; /* Rounded borders */
|
||||||
|
padding: 16px; /* Padding */
|
||||||
|
position: fixed; /* Sit on top of the screen */
|
||||||
|
z-index: 1; /* Add a z-index if needed */
|
||||||
|
left: 50%; /* Center the snackbar */
|
||||||
|
bottom: 30px; /* 30px from the bottom */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show the snackbar when clicking on a button (class added with JavaScript) */
|
||||||
|
#snackbar.show {
|
||||||
|
visibility: visible; /* Show the snackbar */
|
||||||
|
|
||||||
|
/* Add animation: Take 0.5 seconds to fade in and out the snackbar.
|
||||||
|
However, delay the fade out process for 2.5 seconds */
|
||||||
|
/* -webkit-animation: fadein 0.5s, fadeout 0.5s 2.5s;
|
||||||
|
animation: fadein 0.5s, fadeout 0.5s 2.5s;*/
|
||||||
|
|
||||||
|
-webkit-animation: fadein 0.5s;
|
||||||
|
animation: fadein 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animations to fade the snackbar in and out */
|
||||||
|
@-webkit-keyframes fadein {
|
||||||
|
from {
|
||||||
|
bottom: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
bottom: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadein {
|
||||||
|
from {
|
||||||
|
bottom: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
bottom: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes fadeout {
|
||||||
|
from {
|
||||||
|
bottom: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
bottom: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeout {
|
||||||
|
from {
|
||||||
|
bottom: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
bottom: 0;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stop-scrolling {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 5000;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
background-color: mui-color("grey", "300");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fillpanel {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: mui-color("amber", "50");
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen .header {
|
||||||
|
/*position: fixed;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: +1;
|
||||||
|
transition: left 0.2s;*/
|
||||||
|
|
||||||
|
position: sticky;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
height: 100%;
|
||||||
|
// overflow:auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .headerSpacer {
|
||||||
|
flex: 0 1 66px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box .content {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
background-color: mui-color("white");
|
||||||
|
overflow: auto;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.newsarticle img {
|
||||||
|
max-height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tiny {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.medium {
|
||||||
|
font-size: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.large {
|
||||||
|
font-size: 6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cardLink {
|
||||||
|
color: mui-color("blue", "500");
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.endbumper {
|
||||||
|
height: 66px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.seemore {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
#connectionStatus {
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trafficHeavy {
|
||||||
|
color: #fa4a50;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trafficLight {
|
||||||
|
color: #fdbd15;
|
||||||
|
}
|
||||||
|
|
||||||
|
.trafficMedium {
|
||||||
|
color: #fba010;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
height: 180px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bymeImages {
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bbm-wrapper {
|
||||||
|
z-index: 2000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cancelledRow {
|
||||||
|
background: repeating-linear-gradient(
|
||||||
|
-55deg,
|
||||||
|
#ff000010,
|
||||||
|
#ff000010 10px,
|
||||||
|
#fff 10px,
|
||||||
|
#fff 20px
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.nrccAlert a {
|
||||||
|
color:#212121;
|
||||||
|
}
|
52
src/css/horscroll.scss
Normal file
52
src/css/horscroll.scss
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
.scrolling-wrapper-flexbox {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
overflow-x: auto;
|
||||||
|
|
||||||
|
.scrollCard, .scrollCardHalf, .imageCard, .hourlyCard {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
margin-right: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrollCard, .scrollCardHalf, .hourlyCard {
|
||||||
|
width: 250px;
|
||||||
|
height: 175px;
|
||||||
|
overflow-y: hidden;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
padding: 5px;
|
||||||
|
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.05), 0 2px 1px -2px rgba(0,0,0,0.05), 0 1px 5px 0 rgba(0,0,0,0.05)
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrollCardHalf {
|
||||||
|
height: 85px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hourlyCard {
|
||||||
|
width: 42px;
|
||||||
|
height:70px;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imageCard {
|
||||||
|
// width: 250px;
|
||||||
|
height: 175px;
|
||||||
|
overflow-y: hidden;
|
||||||
|
|
||||||
|
}
|
||||||
|
.imageCard img {
|
||||||
|
max-height:100%;
|
||||||
|
max-width:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scrolling-wrapper, .scrolling-wrapper-flexbox {
|
||||||
|
height: 75px;
|
||||||
|
width: 100%;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
181
src/css/skeleton-min.css
vendored
Normal file
181
src/css/skeleton-min.css
vendored
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
.container{position:relative;width:100%;max-width:960px;margin:0 auto;padding:0 20px;box-sizing:border-box;}
|
||||||
|
.column,
|
||||||
|
.columns{width:100%;float:left;box-sizing:border-box;}
|
||||||
|
@media (min-width:400px){.container{width:85%;padding:0;}
|
||||||
|
}
|
||||||
|
@media (min-width:550px){.container{width:80%;}
|
||||||
|
.column,
|
||||||
|
.columns{margin-left:4%;}
|
||||||
|
.column:first-child,
|
||||||
|
.columns:first-child{margin-left:0;}
|
||||||
|
.one.column,
|
||||||
|
.one.columns{width:4.66666666667%;}
|
||||||
|
.two.columns{width:13.3333333333%;}
|
||||||
|
.three.columns{width:22%;}
|
||||||
|
.four.columns{width:30.6666666667%;}
|
||||||
|
.five.columns{width:39.3333333333%;}
|
||||||
|
.six.columns{width:48%;}
|
||||||
|
.seven.columns{width:56.6666666667%;}
|
||||||
|
.eight.columns{width:65.3333333333%;}
|
||||||
|
.nine.columns{width:74.0%;}
|
||||||
|
.ten.columns{width:82.6666666667%;}
|
||||||
|
.eleven.columns{width:91.3333333333%;}
|
||||||
|
.twelve.columns{width:100%;margin-left:0;}
|
||||||
|
.one-third.column{width:30.6666666667%;}
|
||||||
|
.two-thirds.column{width:65.3333333333%;}
|
||||||
|
.one-half.column{width:48%;}
|
||||||
|
.offset-by-one.column,
|
||||||
|
.offset-by-one.columns{margin-left:8.66666666667%;}
|
||||||
|
.offset-by-two.column,
|
||||||
|
.offset-by-two.columns{margin-left:17.3333333333%;}
|
||||||
|
.offset-by-three.column,
|
||||||
|
.offset-by-three.columns{margin-left:26%;}
|
||||||
|
.offset-by-four.column,
|
||||||
|
.offset-by-four.columns{margin-left:34.6666666667%;}
|
||||||
|
.offset-by-five.column,
|
||||||
|
.offset-by-five.columns{margin-left:43.3333333333%;}
|
||||||
|
.offset-by-six.column,
|
||||||
|
.offset-by-six.columns{margin-left:52%;}
|
||||||
|
.offset-by-seven.column,
|
||||||
|
.offset-by-seven.columns{margin-left:60.6666666667%;}
|
||||||
|
.offset-by-eight.column,
|
||||||
|
.offset-by-eight.columns{margin-left:69.3333333333%;}
|
||||||
|
.offset-by-nine.column,
|
||||||
|
.offset-by-nine.columns{margin-left:78.0%;}
|
||||||
|
.offset-by-ten.column,
|
||||||
|
.offset-by-ten.columns{margin-left:86.6666666667%;}
|
||||||
|
.offset-by-eleven.column,
|
||||||
|
.offset-by-eleven.columns{margin-left:95.3333333333%;}
|
||||||
|
.offset-by-one-third.column,
|
||||||
|
.offset-by-one-third.columns{margin-left:34.6666666667%;}
|
||||||
|
.offset-by-two-thirds.column,
|
||||||
|
.offset-by-two-thirds.columns{margin-left:69.3333333333%;}
|
||||||
|
.offset-by-one-half.column,
|
||||||
|
.offset-by-one-half.columns{margin-left:52%;}
|
||||||
|
}
|
||||||
|
html{font-size:62.5%;}
|
||||||
|
body{font-size:1.5em;line-height:1.6;font-weight:400;font-family:"Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;color:#222;}
|
||||||
|
h1, h2, h3, h4, h5, h6{margin-top:0;margin-bottom:2rem;font-weight:300;}
|
||||||
|
h1{font-size:4.0rem;line-height:1.2;letter-spacing:-.1rem;}
|
||||||
|
h2{font-size:3.6rem;line-height:1.25;letter-spacing:-.1rem;}
|
||||||
|
h3{font-size:3.0rem;line-height:1.3;letter-spacing:-.1rem;}
|
||||||
|
h4{font-size:2.4rem;line-height:1.35;letter-spacing:-.08rem;}
|
||||||
|
h5{font-size:1.8rem;line-height:1.5;letter-spacing:-.05rem;}
|
||||||
|
h6{font-size:1.5rem;line-height:1.6;letter-spacing:0;}
|
||||||
|
@media (min-width:550px){h1{font-size:5.0rem;}
|
||||||
|
h2{font-size:4.2rem;}
|
||||||
|
h3{font-size:3.6rem;}
|
||||||
|
h4{font-size:3.0rem;}
|
||||||
|
h5{font-size:2.4rem;}
|
||||||
|
h6{font-size:1.5rem;}
|
||||||
|
}
|
||||||
|
p{margin-top:0;}
|
||||||
|
a{color:#1EAEDB;}
|
||||||
|
a:hover{color:#0FA0CE;}
|
||||||
|
.button,
|
||||||
|
button,
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"]{display:inline-block;height:38px;padding:0 30px;color:#555;text-align:center;font-size:11px;font-weight:600;line-height:38px;letter-spacing:.1rem;text-transform:uppercase;text-decoration:none;white-space:nowrap;background-color:transparent;border-radius:4px;border:1px solid #bbb;cursor:pointer;box-sizing:border-box;}
|
||||||
|
.button:hover,
|
||||||
|
button:hover,
|
||||||
|
input[type="submit"]:hover,
|
||||||
|
input[type="reset"]:hover,
|
||||||
|
input[type="button"]:hover,
|
||||||
|
.button:focus,
|
||||||
|
button:focus,
|
||||||
|
input[type="submit"]:focus,
|
||||||
|
input[type="reset"]:focus,
|
||||||
|
input[type="button"]:focus{color:#333;border-color:#888;outline:0;}
|
||||||
|
.button.button-primary,
|
||||||
|
button.button-primary,
|
||||||
|
input[type="submit"].button-primary,
|
||||||
|
input[type="reset"].button-primary,
|
||||||
|
input[type="button"].button-primary{color:#FFF;background-color:#33C3F0;border-color:#33C3F0;}
|
||||||
|
.button.button-primary:hover,
|
||||||
|
button.button-primary:hover,
|
||||||
|
input[type="submit"].button-primary:hover,
|
||||||
|
input[type="reset"].button-primary:hover,
|
||||||
|
input[type="button"].button-primary:hover,
|
||||||
|
.button.button-primary:focus,
|
||||||
|
button.button-primary:focus,
|
||||||
|
input[type="submit"].button-primary:focus,
|
||||||
|
input[type="reset"].button-primary:focus,
|
||||||
|
input[type="button"].button-primary:focus{color:#FFF;background-color:#1EAEDB;border-color:#1EAEDB;}
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea,
|
||||||
|
select{height:38px;padding:6px 10px;background-color:#fff;border:1px solid #D1D1D1;border-radius:4px;box-shadow:none;box-sizing:border-box;}
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;}
|
||||||
|
textarea{min-height:65px;padding-top:6px;padding-bottom:6px;}
|
||||||
|
input[type="email"]:focus,
|
||||||
|
input[type="number"]:focus,
|
||||||
|
input[type="search"]:focus,
|
||||||
|
input[type="text"]:focus,
|
||||||
|
input[type="tel"]:focus,
|
||||||
|
input[type="url"]:focus,
|
||||||
|
input[type="password"]:focus,
|
||||||
|
textarea:focus,
|
||||||
|
select:focus{border:1px solid #33C3F0;outline:0;}
|
||||||
|
label,
|
||||||
|
legend{display:block;margin-bottom:.5rem;font-weight:600;}
|
||||||
|
fieldset{padding:0;border-width:0;}
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"]{display:inline;}
|
||||||
|
label > .label-body{display:inline-block;margin-left:.5rem;font-weight:normal;}
|
||||||
|
ul{list-style:circle inside;}
|
||||||
|
ol{list-style:decimal inside;}
|
||||||
|
ol, ul{padding-left:0;margin-top:0;}
|
||||||
|
ul ul,
|
||||||
|
ul ol,
|
||||||
|
ol ol,
|
||||||
|
ol ul{margin:1.5rem 0 1.7rem 3rem;font-size:90%;}
|
||||||
|
li{margin-bottom:1rem;}
|
||||||
|
code{padding:.2rem .5rem;margin:0 .2rem;font-size:90%;white-space:nowrap;background:#F1F1F1;border:1px solid #E1E1E1;border-radius:4px;}
|
||||||
|
pre > code{display:block;padding:1rem 1.5rem;white-space:pre;}
|
||||||
|
th,
|
||||||
|
td{padding:12px 15px;text-align:left;border-bottom:1px solid #E1E1E1;}
|
||||||
|
th:first-child,
|
||||||
|
td:first-child{padding-left:0;}
|
||||||
|
th:last-child,
|
||||||
|
td:last-child{padding-right:0;}
|
||||||
|
button,
|
||||||
|
.button{margin-bottom:1rem;}
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select,
|
||||||
|
fieldset{margin-bottom:1.5rem;}
|
||||||
|
pre,
|
||||||
|
blockquote,
|
||||||
|
dl,
|
||||||
|
figure,
|
||||||
|
table,
|
||||||
|
p,
|
||||||
|
ul,
|
||||||
|
ol,
|
||||||
|
form{margin-bottom:2.5rem;}
|
||||||
|
.u-full-width{width:100%;box-sizing:border-box;}
|
||||||
|
.u-max-full-width{max-width:100%;box-sizing:border-box;}
|
||||||
|
.u-pull-right{float:right;}
|
||||||
|
.u-pull-left{float:left;}
|
||||||
|
hr{margin-top:3rem;margin-bottom:3.5rem;border-width:0;border-top:1px solid #E1E1E1;}
|
||||||
|
.container:after,
|
||||||
|
.row:after,
|
||||||
|
.u-cf{content:"";display:table;clear:both;}
|
||||||
|
@media (min-width:400px){}
|
||||||
|
@media (min-width:550px){}
|
||||||
|
@media (min-width:750px){}
|
||||||
|
@media (min-width:1000px){}
|
||||||
|
@media (min-width:1200px){}
|
419
src/css/skeleton.css
vendored
Normal file
419
src/css/skeleton.css
vendored
Normal file
@ -0,0 +1,419 @@
|
|||||||
|
/*
|
||||||
|
* Skeleton V2.0.4
|
||||||
|
* Copyright 2014, Dave Gamache
|
||||||
|
* www.getskeleton.com
|
||||||
|
* Free to use under the MIT license.
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
* 12/29/2014
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Table of contents
|
||||||
|
––––––––––––––––––––––––––––––––––––––––––––––––––
|
||||||
|
- Grid
|
||||||
|
- Base Styles
|
||||||
|
- Typography
|
||||||
|
- Links
|
||||||
|
- Buttons
|
||||||
|
- Forms
|
||||||
|
- Lists
|
||||||
|
- Code
|
||||||
|
- Tables
|
||||||
|
- Spacing
|
||||||
|
- Utilities
|
||||||
|
- Clearing
|
||||||
|
- Media Queries
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Grid
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.container {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 960px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 20px;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.column,
|
||||||
|
.columns {
|
||||||
|
width: 100%;
|
||||||
|
float: left;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
|
||||||
|
/* For devices larger than 400px */
|
||||||
|
@media (min-width: 400px) {
|
||||||
|
.container {
|
||||||
|
width: 85%;
|
||||||
|
padding: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For devices larger than 550px */
|
||||||
|
@media (min-width: 550px) {
|
||||||
|
.container {
|
||||||
|
width: 80%; }
|
||||||
|
.column,
|
||||||
|
.columns {
|
||||||
|
margin-left: 4%; }
|
||||||
|
.column:first-child,
|
||||||
|
.columns:first-child {
|
||||||
|
margin-left: 0; }
|
||||||
|
|
||||||
|
.one.column,
|
||||||
|
.one.columns { width: 4.66666666667%; }
|
||||||
|
.two.columns { width: 13.3333333333%; }
|
||||||
|
.three.columns { width: 22%; }
|
||||||
|
.four.columns { width: 30.6666666667%; }
|
||||||
|
.five.columns { width: 39.3333333333%; }
|
||||||
|
.six.columns { width: 48%; }
|
||||||
|
.seven.columns { width: 56.6666666667%; }
|
||||||
|
.eight.columns { width: 65.3333333333%; }
|
||||||
|
.nine.columns { width: 74.0%; }
|
||||||
|
.ten.columns { width: 82.6666666667%; }
|
||||||
|
.eleven.columns { width: 91.3333333333%; }
|
||||||
|
.twelve.columns { width: 100%; margin-left: 0; }
|
||||||
|
|
||||||
|
.one-third.column { width: 30.6666666667%; }
|
||||||
|
.two-thirds.column { width: 65.3333333333%; }
|
||||||
|
|
||||||
|
.one-half.column { width: 48%; }
|
||||||
|
|
||||||
|
/* Offsets */
|
||||||
|
.offset-by-one.column,
|
||||||
|
.offset-by-one.columns { margin-left: 8.66666666667%; }
|
||||||
|
.offset-by-two.column,
|
||||||
|
.offset-by-two.columns { margin-left: 17.3333333333%; }
|
||||||
|
.offset-by-three.column,
|
||||||
|
.offset-by-three.columns { margin-left: 26%; }
|
||||||
|
.offset-by-four.column,
|
||||||
|
.offset-by-four.columns { margin-left: 34.6666666667%; }
|
||||||
|
.offset-by-five.column,
|
||||||
|
.offset-by-five.columns { margin-left: 43.3333333333%; }
|
||||||
|
.offset-by-six.column,
|
||||||
|
.offset-by-six.columns { margin-left: 52%; }
|
||||||
|
.offset-by-seven.column,
|
||||||
|
.offset-by-seven.columns { margin-left: 60.6666666667%; }
|
||||||
|
.offset-by-eight.column,
|
||||||
|
.offset-by-eight.columns { margin-left: 69.3333333333%; }
|
||||||
|
.offset-by-nine.column,
|
||||||
|
.offset-by-nine.columns { margin-left: 78.0%; }
|
||||||
|
.offset-by-ten.column,
|
||||||
|
.offset-by-ten.columns { margin-left: 86.6666666667%; }
|
||||||
|
.offset-by-eleven.column,
|
||||||
|
.offset-by-eleven.columns { margin-left: 95.3333333333%; }
|
||||||
|
|
||||||
|
.offset-by-one-third.column,
|
||||||
|
.offset-by-one-third.columns { margin-left: 34.6666666667%; }
|
||||||
|
.offset-by-two-thirds.column,
|
||||||
|
.offset-by-two-thirds.columns { margin-left: 69.3333333333%; }
|
||||||
|
|
||||||
|
.offset-by-one-half.column,
|
||||||
|
.offset-by-one-half.columns { margin-left: 52%; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Base Styles
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
/* NOTE
|
||||||
|
html is set to 62.5% so that all the REM measurements throughout Skeleton
|
||||||
|
are based on 10px sizing. So basically 1.5rem = 15px :) */
|
||||||
|
html {
|
||||||
|
font-size: 62.5%; }
|
||||||
|
body {
|
||||||
|
font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
|
||||||
|
line-height: 1.6;
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: 'Roboto', "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
color: #222; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Typography
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-family: 'Roboto Condensed', Helvetica, Arial, sans-serif;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
font-weight: 300; }
|
||||||
|
h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;}
|
||||||
|
h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
|
||||||
|
h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; }
|
||||||
|
h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; font-weight:700;}
|
||||||
|
h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; }
|
||||||
|
h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; }
|
||||||
|
|
||||||
|
/* Larger than phablet */
|
||||||
|
@media (min-width: 550px) {
|
||||||
|
h1 { font-size: 5.0rem; }
|
||||||
|
h2 { font-size: 4.2rem; }
|
||||||
|
h3 { font-size: 3.6rem; }
|
||||||
|
h4 { font-size: 3.0rem; }
|
||||||
|
h5 { font-size: 2.4rem; }
|
||||||
|
h6 { font-size: 1.5rem; }
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-top: 0; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Links
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
a {
|
||||||
|
color: #1EAEDB; }
|
||||||
|
a:hover {
|
||||||
|
color: #0FA0CE; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Buttons
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.button,
|
||||||
|
button,
|
||||||
|
input[type="submit"],
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="button"] {
|
||||||
|
display: inline-block;
|
||||||
|
height: 38px;
|
||||||
|
padding: 0 30px;
|
||||||
|
color: #555;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 38px;
|
||||||
|
letter-spacing: .1rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-decoration: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
cursor: pointer;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.button:hover,
|
||||||
|
button:hover,
|
||||||
|
input[type="submit"]:hover,
|
||||||
|
input[type="reset"]:hover,
|
||||||
|
input[type="button"]:hover,
|
||||||
|
.button:focus,
|
||||||
|
button:focus,
|
||||||
|
input[type="submit"]:focus,
|
||||||
|
input[type="reset"]:focus,
|
||||||
|
input[type="button"]:focus {
|
||||||
|
color: #333;
|
||||||
|
border-color: #888;
|
||||||
|
outline: 0; }
|
||||||
|
.button.button-primary,
|
||||||
|
button.button-primary,
|
||||||
|
input[type="submit"].button-primary,
|
||||||
|
input[type="reset"].button-primary,
|
||||||
|
input[type="button"].button-primary {
|
||||||
|
color: #FFF;
|
||||||
|
background-color: #33C3F0;
|
||||||
|
border-color: #33C3F0; }
|
||||||
|
.button.button-primary:hover,
|
||||||
|
button.button-primary:hover,
|
||||||
|
input[type="submit"].button-primary:hover,
|
||||||
|
input[type="reset"].button-primary:hover,
|
||||||
|
input[type="button"].button-primary:hover,
|
||||||
|
.button.button-primary:focus,
|
||||||
|
button.button-primary:focus,
|
||||||
|
input[type="submit"].button-primary:focus,
|
||||||
|
input[type="reset"].button-primary:focus,
|
||||||
|
input[type="button"].button-primary:focus {
|
||||||
|
color: #FFF;
|
||||||
|
background-color: #1EAEDB;
|
||||||
|
border-color: #1EAEDB; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Forms
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea,
|
||||||
|
select {
|
||||||
|
height: 38px;
|
||||||
|
padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #D1D1D1;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: none;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
/* Removes awkward default styles on some inputs for iOS */
|
||||||
|
input[type="email"],
|
||||||
|
input[type="number"],
|
||||||
|
input[type="search"],
|
||||||
|
input[type="text"],
|
||||||
|
input[type="tel"],
|
||||||
|
input[type="url"],
|
||||||
|
input[type="password"],
|
||||||
|
textarea {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
-moz-appearance: none;
|
||||||
|
appearance: none; }
|
||||||
|
textarea {
|
||||||
|
min-height: 65px;
|
||||||
|
padding-top: 6px;
|
||||||
|
padding-bottom: 6px; }
|
||||||
|
input[type="email"]:focus,
|
||||||
|
input[type="number"]:focus,
|
||||||
|
input[type="search"]:focus,
|
||||||
|
input[type="text"]:focus,
|
||||||
|
input[type="tel"]:focus,
|
||||||
|
input[type="url"]:focus,
|
||||||
|
input[type="password"]:focus,
|
||||||
|
textarea:focus,
|
||||||
|
select:focus {
|
||||||
|
border: 1px solid #33C3F0;
|
||||||
|
outline: 0; }
|
||||||
|
label,
|
||||||
|
legend {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
font-weight: 600; }
|
||||||
|
fieldset {
|
||||||
|
padding: 0;
|
||||||
|
border-width: 0; }
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
display: inline; }
|
||||||
|
label > .label-body {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: .5rem;
|
||||||
|
font-weight: normal; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Lists
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
ul {
|
||||||
|
list-style: circle inside; }
|
||||||
|
ol {
|
||||||
|
list-style: decimal inside; }
|
||||||
|
ol, ul {
|
||||||
|
padding-left: 0;
|
||||||
|
margin-top: 0; }
|
||||||
|
ul ul,
|
||||||
|
ul ol,
|
||||||
|
ol ol,
|
||||||
|
ol ul {
|
||||||
|
margin: 1.5rem 0 1.5rem 3rem;
|
||||||
|
font-size: 90%; }
|
||||||
|
li {
|
||||||
|
margin-bottom: 1rem; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Code
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
code {
|
||||||
|
padding: .2rem .5rem;
|
||||||
|
margin: 0 .2rem;
|
||||||
|
font-size: 90%;
|
||||||
|
white-space: nowrap;
|
||||||
|
background: #F1F1F1;
|
||||||
|
border: 1px solid #E1E1E1;
|
||||||
|
border-radius: 4px; }
|
||||||
|
pre > code {
|
||||||
|
display: block;
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
white-space: pre; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Tables
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
padding: 12px 15px;
|
||||||
|
text-align: left;
|
||||||
|
border-bottom: 1px solid #E1E1E1; }
|
||||||
|
th:first-child,
|
||||||
|
td:first-child {
|
||||||
|
padding-left: 0; }
|
||||||
|
th:last-child,
|
||||||
|
td:last-child {
|
||||||
|
padding-right: 0; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Spacing
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
button,
|
||||||
|
.button {
|
||||||
|
margin-bottom: 1rem; }
|
||||||
|
input,
|
||||||
|
textarea,
|
||||||
|
select,
|
||||||
|
fieldset {
|
||||||
|
margin-bottom: 1.5rem; }
|
||||||
|
pre,
|
||||||
|
blockquote,
|
||||||
|
dl,
|
||||||
|
figure,
|
||||||
|
table,
|
||||||
|
p,
|
||||||
|
ul,
|
||||||
|
ol,
|
||||||
|
form {
|
||||||
|
margin-bottom: 2.5rem; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Utilities
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
.u-full-width {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.u-max-full-width {
|
||||||
|
max-width: 100%;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
.u-pull-right {
|
||||||
|
float: right; }
|
||||||
|
.u-pull-left {
|
||||||
|
float: left; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Misc
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
hr {
|
||||||
|
margin-top: 3rem;
|
||||||
|
margin-bottom: 3.5rem;
|
||||||
|
border-width: 0;
|
||||||
|
border-top: 1px solid #E1E1E1; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Clearing
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
|
||||||
|
/* Self Clearing Goodness */
|
||||||
|
.container:after,
|
||||||
|
.row:after,
|
||||||
|
.u-cf {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both; }
|
||||||
|
|
||||||
|
|
||||||
|
/* Media Queries
|
||||||
|
–––––––––––––––––––––––––––––––––––––––––––––––––– */
|
||||||
|
/*
|
||||||
|
Note: The best way to structure the use of media queries is to create the queries
|
||||||
|
near the relevant code. For example, if you wanted to change the styles for buttons
|
||||||
|
on small devices, paste the mobile query code up in the buttons section and style it
|
||||||
|
there.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Larger than mobile */
|
||||||
|
@media (min-width: 400px) {}
|
||||||
|
|
||||||
|
/* Larger than phablet (also point when grid becomes active) */
|
||||||
|
@media (min-width: 550px) {}
|
||||||
|
|
||||||
|
/* Larger than tablet */
|
||||||
|
@media (min-width: 750px) {}
|
||||||
|
|
||||||
|
/* Larger than desktop */
|
||||||
|
@media (min-width: 1000px) {}
|
||||||
|
|
||||||
|
/* Larger than Desktop HD */
|
||||||
|
@media (min-width: 1200px) {}
|
93
src/css/spinner.scss
Normal file
93
src/css/spinner.scss
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
$green: #008744;
|
||||||
|
$blue: #0fa3ef;
|
||||||
|
$red: #dc4f43;
|
||||||
|
$yellow: #ffbe39;
|
||||||
|
$white: #eee;
|
||||||
|
$black: #301010;
|
||||||
|
|
||||||
|
// scaling... any units
|
||||||
|
$width: 100px;
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: $white;
|
||||||
|
}
|
||||||
|
|
||||||
|
// demo-specific
|
||||||
|
.showbox {
|
||||||
|
position: absolute;
|
||||||
|
top: 40vh;
|
||||||
|
bottom: 60vh;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
padding: 5%;
|
||||||
|
}
|
||||||
|
// end demo-specific
|
||||||
|
|
||||||
|
.loader {
|
||||||
|
position: relative;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: $width;
|
||||||
|
&:before {
|
||||||
|
content: '';
|
||||||
|
display: block;
|
||||||
|
padding-top: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.circular {
|
||||||
|
animation: rotate 2s linear infinite;
|
||||||
|
height: 100%;
|
||||||
|
transform-origin: center center;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.path {
|
||||||
|
stroke-dasharray: 1, 200;
|
||||||
|
stroke-dashoffset: 0;
|
||||||
|
animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
|
||||||
|
stroke-linecap: round;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes rotate {
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes dash {
|
||||||
|
0% {
|
||||||
|
stroke-dasharray: 1, 200;
|
||||||
|
stroke-dashoffset: 0;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
stroke-dasharray: 89, 200;
|
||||||
|
stroke-dashoffset: -35px;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
stroke-dasharray: 89, 200;
|
||||||
|
stroke-dashoffset: -124px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes color {
|
||||||
|
100%,
|
||||||
|
0% {
|
||||||
|
stroke: $red;
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
stroke: $yellow;
|
||||||
|
}
|
||||||
|
66% {
|
||||||
|
stroke: $blue;
|
||||||
|
}
|
||||||
|
80%,
|
||||||
|
90% {
|
||||||
|
stroke: $black;
|
||||||
|
}
|
||||||
|
}
|
81
src/css/viewport.scss
Normal file
81
src/css/viewport.scss
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
.viewport {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* encapsulate the various syntax in helper clases */
|
||||||
|
/* inspired by http://infrequently.org/2009/08/css-3-progress/ */
|
||||||
|
|
||||||
|
/* items flex/expand vertically */
|
||||||
|
.vbox {
|
||||||
|
/* previous syntax */
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -moz-box;
|
||||||
|
display: box;
|
||||||
|
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-moz-box-orient: vertical;
|
||||||
|
-ms-box-orient: vertical;
|
||||||
|
box-orient: vertical;
|
||||||
|
|
||||||
|
/* current syntax */
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -moz-flex;
|
||||||
|
display: -ms-flex;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
-webkit-flex-direction: column;
|
||||||
|
-moz-flex-direction: column;
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gradient {
|
||||||
|
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#ebf1f6+0,abd3ee+50,89c3eb+51,d5ebfb+100;Blue+Gloss+%234 */
|
||||||
|
background: #ebf1f6; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%); /* FF3.6-15 */
|
||||||
|
background: -webkit-linear-gradient(top, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%); /* Chrome10-25,Safari5.1-6 */
|
||||||
|
background: linear-gradient(to bottom, #ebf1f6 0%, #abd3ee 50%, #89c3eb 51%, #d5ebfb 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebf1f6', endColorstr='#d5ebfb', GradientType=0); /* IE6-9 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.backgroundImage {
|
||||||
|
background-image: url(http://via.placeholder.com/411x823);
|
||||||
|
}
|
||||||
|
|
||||||
|
.appPanel {
|
||||||
|
/* previous syntax */
|
||||||
|
-webkit-box-flex: 1;
|
||||||
|
-moz-box-flex: 1;
|
||||||
|
-ms-box-flex: 1;
|
||||||
|
box-flex: 1;
|
||||||
|
|
||||||
|
/* current syntax */
|
||||||
|
-webkit-flex: 1;
|
||||||
|
-moz-flex: 1;
|
||||||
|
-ms-flex: 1;
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
|
||||||
|
overflow-y: auto;
|
||||||
|
/* background-color: white;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-id~="main"] {
|
||||||
|
z-index: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-id~="routeP"] {
|
||||||
|
z-index: 1000;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
}
|
12
src/libs/stations.js
Normal file
12
src/libs/stations.js
Normal file
File diff suppressed because one or more lines are too long
120
src/libs/utils.js
Normal file
120
src/libs/utils.js
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
function partOfDay (timeString, today) {
|
||||||
|
console.log(new Date());
|
||||||
|
if (timeString === undefined || timeString === null) timeString = (new Date()).getHours().toString();
|
||||||
|
|
||||||
|
if (today === undefined) today = false;
|
||||||
|
|
||||||
|
const hours = timeString.substring(0, 2);
|
||||||
|
let dayBit = '';
|
||||||
|
|
||||||
|
console.log('Hours', hours);
|
||||||
|
|
||||||
|
if (hours >= 0 && hours < 4)
|
||||||
|
dayBit = 'Late Night';
|
||||||
|
|
||||||
|
else if (hours >= 4 && hours < 7)
|
||||||
|
dayBit = 'Early Morning';
|
||||||
|
|
||||||
|
else if (hours >= 7 && hours < 12)
|
||||||
|
dayBit = 'Morning';
|
||||||
|
|
||||||
|
else if (hours >= 12 && hours < 17)
|
||||||
|
dayBit = 'Afternoon';
|
||||||
|
|
||||||
|
else if (hours < 21)
|
||||||
|
dayBit = 'Evening';
|
||||||
|
|
||||||
|
else dayBit = 'Night';
|
||||||
|
|
||||||
|
if (today)
|
||||||
|
if (dayBit === 'night') {
|
||||||
|
dayBit = 'tonight';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dayBit = `this ${dayBit}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('partOfDay', dayBit);
|
||||||
|
|
||||||
|
return dayBit;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toHour (extra = 0) {
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
return (3600000 - (now.getTime() % 3600000)) + extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hourFloor () {
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
return parseInt(~~(now.getTime() / 3600000) * 3600000, 10).toString(32);
|
||||||
|
}
|
||||||
|
|
||||||
|
function minuteFloor () {
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
return parseInt(~~(now.getTime() / 60000) * 60000, 10).toString(32);
|
||||||
|
}
|
||||||
|
|
||||||
|
function distance (lat1, lon1, lat2, lon2) {
|
||||||
|
const p = 0.017453292519943295; // Math.PI / 180
|
||||||
|
const c = Math.cos;
|
||||||
|
const a = 0.5 - c((lat2 - lat1) * p) / 2 +
|
||||||
|
c(lat1 * p) * c(lat2 * p) *
|
||||||
|
(1 - c((lon2 - lon1) * p)) / 2;
|
||||||
|
|
||||||
|
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function splitURL (url) {
|
||||||
|
|
||||||
|
} */
|
||||||
|
|
||||||
|
const maybePluralize = (count, noun, suffix = 's') =>
|
||||||
|
`${count} ${noun}${count !== 1 ? suffix : ''}`;
|
||||||
|
|
||||||
|
function supportsLocalStorage() {
|
||||||
|
try {
|
||||||
|
if (!localStorage)return false;
|
||||||
|
else return true;
|
||||||
|
// May only need the above simple test
|
||||||
|
// - old versions of firefox may cause problem?
|
||||||
|
// return 'localStorage' in window && window['localStorage']!==null;
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let LocalStorage = {};
|
||||||
|
|
||||||
|
if (supportsLocalStorage())
|
||||||
|
LocalStorage = {
|
||||||
|
'save':function ( i, v ) {
|
||||||
|
localStorage[i] = v;
|
||||||
|
},
|
||||||
|
'load':function ( i ) {
|
||||||
|
return localStorage[i];
|
||||||
|
},
|
||||||
|
'exists':function(i) {
|
||||||
|
return !(typeof(localStorage[i]) === 'undefined');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
else
|
||||||
|
LocalStorage = {
|
||||||
|
'save':function ( i, v ) {
|
||||||
|
document.cookie = `${i }=${ encodeURIComponent(v)}`;
|
||||||
|
},
|
||||||
|
'load':function ( i ) {
|
||||||
|
var s = `; ${ document.cookie };`,
|
||||||
|
p = s.indexOf(`; ${ i }=`);
|
||||||
|
if (p < 0)return '';
|
||||||
|
p = p + i.length + 3;
|
||||||
|
var p2 = s.indexOf(';', p + 1);
|
||||||
|
|
||||||
|
return decodeURIComponent(s.substring(p, p2));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { partOfDay, toHour, hourFloor, distance, maybePluralize, minuteFloor, LocalStorage };
|
10
src/main.js
Normal file
10
src/main.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import App from './App.svelte';
|
||||||
|
|
||||||
|
const app = new App({
|
||||||
|
'target': document.body,
|
||||||
|
'props': {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default app;
|
20
src/pages/Home.svelte
Normal file
20
src/pages/Home.svelte
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<script>
|
||||||
|
import TrainRoute from "../components/TrainRoute.svelte";
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="mui-container">
|
||||||
|
<TrainRoute destStation="glq" startStation="dbe"/>
|
||||||
|
<TrainRoute destStation="dbe" startStation="glq"/>
|
||||||
|
<TrainRoute destStation="glc" startStation="ptk"/>
|
||||||
|
<TrainRoute destStation="ptk" startStation="dbe"/>
|
||||||
|
<TrainRoute destStation="glc" startStation="eus"/>
|
||||||
|
<TrainRoute destStation="eus" startStation="glc"/>
|
||||||
|
<TrainRoute destStation="pad" startStation="hxx"/>
|
||||||
|
<TrainRoute destStation="glc" startStation="bhi"/>
|
||||||
|
<TrainRoute destStation="bhi" startStation="glc"/>
|
||||||
|
<TrainRoute destStation="dbe" startStation="dmr"/>
|
||||||
|
<TrainRoute destStation="dmr" startStation="glc"/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
14
src/pages/NotFound.svelte
Normal file
14
src/pages/NotFound.svelte
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
background: #f55a4e;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<h2 class="routetitle">NotFound</h2>
|
||||||
|
|
||||||
|
<p>Oops, this route doesn't exist!</p>
|
12
src/pages/Service.svelte
Normal file
12
src/pages/Service.svelte
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<script>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
background: #f55a4e;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<span>Service</span>
|
41
src/pages/Timetable.svelte
Normal file
41
src/pages/Timetable.svelte
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<script>
|
||||||
|
import {onMount, onDestroy} from 'svelte';
|
||||||
|
import TimetableList from "../components/TimetableList.svelte";
|
||||||
|
import { findStation } from '../libs/stations'
|
||||||
|
|
||||||
|
export let params = {};
|
||||||
|
|
||||||
|
let fromStationName;
|
||||||
|
let destStationName;
|
||||||
|
let fromStation;
|
||||||
|
let destStation;
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
|
||||||
|
console.log('>> Timetable:', params);
|
||||||
|
|
||||||
|
fromStation = params.fromStation;
|
||||||
|
destStation = params.destStation;
|
||||||
|
fromStationName = findStation(fromStation);
|
||||||
|
destStationName = findStation(destStation);
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(async () => {
|
||||||
|
console.log('>> onDestroy Timetable')
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
<div class="mui--appbar-height"></div>
|
||||||
|
<div class="mui-container">
|
||||||
|
<div>
|
||||||
|
<div class="mui--text-center mui--text-accent">{fromStationName} TO {destStationName}</div>
|
||||||
|
<TimetableList {fromStation} {destStation}/>
|
||||||
|
|
||||||
|
<!--<timetable-list :fromStation="$route.params.fromStation" :destStation="$route.params.destStation"/>-->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
21
src/routes.js
Normal file
21
src/routes.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Created by WebStorm.
|
||||||
|
* User: martin
|
||||||
|
* Date: 19/04/2020
|
||||||
|
* Time: 21:19
|
||||||
|
|
||||||
|
*/
|
||||||
|
// import { wrap } from 'svelte-spa-router';
|
||||||
|
|
||||||
|
import Home from './pages/Home.svelte';
|
||||||
|
import Service from './pages/Service.svelte';
|
||||||
|
import Timetable from './pages/Timetable.svelte';
|
||||||
|
import NotFound from './pages/NotFound.svelte';
|
||||||
|
|
||||||
|
const routes = new Map();
|
||||||
|
routes.set('/', Home);
|
||||||
|
routes.set('/timetable/:fromStation/:destStation', Timetable);
|
||||||
|
routes.set('/service/:serviceId', Service);
|
||||||
|
routes.set('*', NotFound);
|
||||||
|
|
||||||
|
export default routes;
|
Loading…
Reference in New Issue
Block a user