diff --git a/package-lock.json b/package-lock.json
index 4848f99..cb41222 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1178,9 +1178,9 @@
}
},
"node_modules/@sveltejs/kit": {
- "version": "2.53.4",
- "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.4.tgz",
- "integrity": "sha512-iAIPEahFgDJJyvz8g0jP08KvqnM6JvdW8YfsygZ+pMeMvyM2zssWMltcsotETvjSZ82G3VlitgDtBIvpQSZrTA==",
+ "version": "2.55.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.55.0.tgz",
+ "integrity": "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1189,7 +1189,7 @@
"@types/cookie": "^0.6.0",
"acorn": "^8.14.1",
"cookie": "^0.6.0",
- "devalue": "^5.6.3",
+ "devalue": "^5.6.4",
"esm-env": "^1.2.2",
"kleur": "^4.1.5",
"magic-string": "^0.30.5",
@@ -2036,9 +2036,9 @@
}
},
"node_modules/devalue": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz",
- "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==",
+ "version": "5.6.4",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz",
+ "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==",
"license": "MIT"
},
"node_modules/es-module-lexer": {
@@ -2452,9 +2452,9 @@
}
},
"node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz",
+ "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==",
"dev": true,
"license": "ISC"
},
diff --git a/src/app.html b/src/app.html
index 3d8585e..7c40556 100644
--- a/src/app.html
+++ b/src/app.html
@@ -5,7 +5,10 @@
-
+
diff --git a/src/lib/assets/img/stop-error.svg b/src/lib/assets/img/stop-error.svg
new file mode 100644
index 0000000..c8aefe3
--- /dev/null
+++ b/src/lib/assets/img/stop-error.svg
@@ -0,0 +1 @@
+
diff --git a/src/lib/components/ui/Button.svelte b/src/lib/components/ui/Button.svelte
new file mode 100644
index 0000000..e584ae6
--- /dev/null
+++ b/src/lib/components/ui/Button.svelte
@@ -0,0 +1,82 @@
+
+
+{#if isLink}
+
+ {@render children?.()}
+
+{:else}
+
+ {@render children?.()}
+
+{/if}
+
+
diff --git a/src/lib/components/ui/Textbox.svelte b/src/lib/components/ui/Textbox.svelte
new file mode 100644
index 0000000..3026bec
--- /dev/null
+++ b/src/lib/components/ui/Textbox.svelte
@@ -0,0 +1,94 @@
+
+
+
+ {#if label}
+ {label}
+ {/if}
+
+ isFocussed = true}
+ onblur={() => isFocussed = false}
+ {...rest}
+ />
+
+ {#if error}
+ {error}
+ {/if}
+
+
+
\ No newline at end of file
diff --git a/src/lib/components/ui/cards/BaseCard.svelte b/src/lib/components/ui/cards/BaseCard.svelte
new file mode 100644
index 0000000..87a1a68
--- /dev/null
+++ b/src/lib/components/ui/cards/BaseCard.svelte
@@ -0,0 +1,94 @@
+
+
+
+ {#if header || helpText}
+
+
+ {#if showHelp && helpText}
+
+ {/if}
+ {/if}
+
+
+ {@render children?.()}
+
+
+
+
\ No newline at end of file
diff --git a/src/lib/global.css b/src/lib/global.css
index c8718dd..5b59d6c 100644
--- a/src/lib/global.css
+++ b/src/lib/global.css
@@ -4,78 +4,79 @@
* Copyright (c) 2014,2015 by (URW)++ Design & Development
*/
@font-face {
- font-family: 'URW Gothic';
- src: url('/type/urwgothic/urwgothic-book-webfont.woff2') format('woff2');
- font-weight: 400;
- font-style: normal;
- font-display: swap;
+ font-family: 'URW Gothic';
+ src: url('/type/urwgothic/urwgothic-book-webfont.woff2') format('woff2');
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
}
/* * URW Gothic is licensed under the SIL Open Font License, Version 1.1.
* Copyright (c) 2014,2015 by (URW)++ Design & Development
*/
@font-face {
- font-family: 'URW Gothic';
- src: url('/type/urwgothic/urwgothic-bookoblique-webfont.woff2') format('woff2');
- font-weight: 400;
- font-style: italic;
- font-display: swap;
+ font-family: 'URW Gothic';
+ src: url('/type/urwgothic/urwgothic-bookoblique-webfont.woff2') format('woff2');
+ font-weight: 400;
+ font-style: italic;
+ font-display: swap;
}
/* * URW Gothic is licensed under the SIL Open Font License, Version 1.1.
* Copyright (c) 2014,2015 by (URW)++ Design & Development
*/
@font-face {
- font-family: 'URW Gothic';
- src: url('/type/urwgothic/urwgothic-demi-webfont.woff2') format('woff2');
- font-weight: 600;
- font-style: normal;
- font-display: swap;
+ font-family: 'URW Gothic';
+ src: url('/type/urwgothic/urwgothic-demi-webfont.woff2') format('woff2');
+ font-weight: 600;
+ font-style: normal;
+ font-display: swap;
}
/* * URW Gothic is licensed under the SIL Open Font License, Version 1.1.
* Copyright (c) 2014,2015 by (URW)++ Design & Development
*/
@font-face {
- font-family: 'URW Gothic';
- src: url('/type/urwgothic/urwgothic-demioblique-webfont.woff2') format('woff2');
- font-weight: 600;
- font-style: italic;
- font-display: swap;
+ font-family: 'URW Gothic';
+ src: url('/type/urwgothic/urwgothic-demioblique-webfont.woff2') format('woff2');
+ font-weight: 600;
+ font-style: italic;
+ font-display: swap;
}
- :root {
- /* Brand Colours */
- --color-brand: #4fd1d1;
- --color-accent: #3c6f79;
- --color-title: #ebebeb;
- --color-bg-light: #404c55;
- --color-bg-dark: #2b343c;
-
- /* Shadows */
- --color-shadow: hsla(210, 20%, 5%, 0.35);
- --shadow-std: 0 4px 12px var(--color-shadow);
- --shadow-up: 0 -4px 12px var(--color-shadow);
- }
+:root {
+ /* Brand Colours */
+ --color-brand: #4fd1d1;
+ --color-accent: #3c6f79;
+ --color-title: #ebebeb;
+ --color-bg-light: #404c55;
+ --color-bg-dark: #2b343c;
+
+ /* Shadows */
+ --color-shadow: hsla(210, 20%, 5%, 0.35);
+ --shadow-std: 0 4px 12px var(--color-shadow);
+ --shadow-up: 0 -4px 12px var(--color-shadow);
+ --shadow-right: 4px 0 12px var(--color-shadow);
+}
body {
- margin: 0;
- padding: 0;
- background-color: var(--color-accent);
- color: white;
- -webkit-font-smoothing: antialiased;
- -mos-osx-font-smoothing: grayscale;
- overflow-x: hidden;
+ margin: 0;
+ padding: 0;
+ background-color: var(--color-accent);
+ color: white;
+ -webkit-font-smoothing: antialiased;
+ -mos-osx-font-smoothing: grayscale;
+ overflow-x: hidden;
}
a {
- color: var(--color-brand);
+ color: var(--color-brand);
}
a:visited {
- color: var(--color-brand);
+ color: var(--color-brand);
}
a:hover {
- color: var(--color-accent);
-}
\ No newline at end of file
+ color: var(--color-accent);
+}
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte
index b9709f4..5a69b2c 100644
--- a/src/routes/+error.svelte
+++ b/src/routes/+error.svelte
@@ -1,69 +1,72 @@
-
+
-
Signal Failure: {page.status}
+
{page.status}
-
- {page.error?.message ?? "An unexpected derailment occurred."}
-
+
+ {page.error?.message ?? 'An unexpected derailment occurred.'}
+
- {#if page.error?.owlCode}
-
- Ref: {page.error.owlCode}
-
- {/if}
+ {#if page.error?.owlCode}
+
+ Ref: {page.error.owlCode}
+
+ {/if}
-
Return to Home
+
Return to Home
\ No newline at end of file
+ .error-message {
+ font-size: 1.1rem;
+ color: var(--color-title);
+ max-width: 300px;
+ margin-top: 5px;
+ margin-bottom: 30px;
+ }
+
+ .debug-info {
+ background: rgba(255, 255, 255, 0.05);
+ padding: 5px 12px;
+ border-radius: 4px;
+ font-size: 0.8rem;
+ opacity: 0.6;
+ }
+
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 6f27509..a98f5c2 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,5 +1,6 @@
@@ -41,37 +72,76 @@
-{@render children()}
+ {@render children()}
-
+
- {#each navItems as item}
- {@const isActive = activePath === item.path}
-
-
+ onclick={() => (menuOpen = false)}
+ >
+
{item.label}
-
+
{/each}
+ {#if hiddenItems.length > 0}
+
+ {#if menuOpen}
+ (menuOpen = false)}
+ transition:fade={{ duration: 150 }}
+ >
+
+ {/if}
+ {/if}
+
+
+
Narrow Gauge Detected
+
+ Just as trains need the right track width, our data needs a bit more room to stay on the rails. Please expand your view to at least 300px to view the app.
+
+
+
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index f0ed6e2..d976e24 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1 +1,19 @@
+
+
+
+Default
+Brand
+Accent
+
+
+Hello
+
OwlBoard
diff --git a/src/routes/about/+page.svelte b/src/routes/about/+page.svelte
index 0d731b2..aafe7fa 100644
--- a/src/routes/about/+page.svelte
+++ b/src/routes/about/+page.svelte
@@ -1,75 +1,101 @@
-
+
-
- © 2022-2026 Frederick Boniface
-
-
- Created by train crew, for train crew
-
-
- OwlBoard was created in 2022, evolving from 'Athena' which just provided 'Quick Links' to Tiger departure boards. The aim was to provide fast and easy access to the information we need on a daily basis.
-
-
- Some components that combine to form OwlBoard are open-source, see the Git reposititories for more info.
-
+ © 2022-2026 Frederick Boniface
+ Created by train crew, for train crew
+
+ OwlBoard was created in 2022, evolving from 'Athena' which just provided 'Quick Links' to Tiger
+ departure boards. The aim was to provide fast and easy access to the information we need on a
+ daily basis.
+
+
+Why OwlBoard? The name was chosen as an evolution of its predecessor, 'Athena'; owls are associated with the Roman Goddess as well as with wisdom. The name also links to Bath, where the app has been built and is run, representing the 'Minerva Owl' sculpture trail in the city, with many of the sculptures still in the area.
+
+
+ Some components that combine to form OwlBoard are open-source, see the Git reposititories for more info.
+
-
- Data is sourced from multiple providers, including National Rail Enquiries and Network Rail along side OwlBoard's own data
-
+
+ Data is sourced from multiple providers, including National Rail Enquiries and Network Rail along side OwlBoard's own data
+
\ No newline at end of file
+ section:last-child {
+ padding-bottom: 15px;
+ }
+
+ .tagline {
+ font-weight: 600;
+ font-style: italic;
+ }
+
diff --git a/src/routes/about/+page.ts b/src/routes/about/+page.ts
index d6ae02d..c444264 100644
--- a/src/routes/about/+page.ts
+++ b/src/routes/about/+page.ts
@@ -1,5 +1,5 @@
export const load = () => {
- return {
- title: "About",
- };
-};
\ No newline at end of file
+ return {
+ title: 'About'
+ };
+};