|
1 | 1 | <script> |
2 | | - import Router from 'svelte-spa-router' |
| 2 | + import Router, { location } from 'svelte-spa-router' |
| 3 | + import { fade } from 'svelte/transition' |
3 | 4 | import Nav from './components/Nav.svelte' |
4 | 5 | import Home from './pages/Home.svelte' |
5 | 6 | import Augmentum from './pages/Augmentum.svelte' |
6 | 7 | import Visage from './pages/Visage.svelte' |
7 | 8 | import MrHaven from './pages/MrHaven.svelte' |
8 | 9 | import Ecosystem from './pages/Ecosystem.svelte' |
| 10 | + import NotFound from './pages/NotFound.svelte' |
9 | 11 |
|
10 | 12 | const routes = { |
11 | 13 | '/': Home, |
12 | 14 | '/augmentum': Augmentum, |
13 | 15 | '/visage': Visage, |
14 | 16 | '/mrhaven': MrHaven, |
15 | 17 | '/ecosystem': Ecosystem, |
| 18 | + '*': NotFound, |
16 | 19 | } |
| 20 | +
|
| 21 | + // Key changes on route change to trigger the fade transition |
| 22 | + $: routeKey = $location |
17 | 23 | </script> |
18 | 24 |
|
19 | 25 | <Nav /> |
20 | | -<Router {routes} /> |
| 26 | + |
| 27 | +{#key routeKey} |
| 28 | + <div in:fade={{ duration: 150, delay: 50 }} out:fade={{ duration: 100 }}> |
| 29 | + <Router {routes} /> |
| 30 | + </div> |
| 31 | +{/key} |
21 | 32 |
|
22 | 33 | <footer> |
23 | 34 | <div class="footer-inner"> |
24 | 35 | <div class="footer-top"> |
25 | 36 | <a href="#/" class="footer-wordmark">SOVREN</a> |
26 | 37 | <nav class="footer-nav"> |
27 | | - <a href="#/augmentum">AUGMENTUM</a> |
28 | | - <a href="#/visage">VISAGE</a> |
29 | | - <a href="#/mrhaven">MR. HAVEN</a> |
30 | | - <a href="#/ecosystem">ECOSYSTEM</a> |
31 | | - <a href="https://twitter.com/sovren_software" target="_blank" rel="noreferrer">TWITTER</a> |
32 | | - <a href="https://github.com/sovren-software" target="_blank" rel="noreferrer">GITHUB</a> |
33 | | - <a href="mailto:hello@sovren.software" class="muted">CONTACT</a> |
34 | | - <a href="#" class="muted">PRIVACY</a> |
35 | | - <a href="#" class="muted">LEGAL</a> |
| 38 | + <div class="footer-col"> |
| 39 | + <span class="col-label">PRODUCTS</span> |
| 40 | + <a href="#/augmentum">AUGMENTUM</a> |
| 41 | + <a href="#/visage">VISAGE</a> |
| 42 | + <a href="#/mrhaven">MR. HAVEN</a> |
| 43 | + </div> |
| 44 | + <div class="footer-col"> |
| 45 | + <span class="col-label">COMPANY</span> |
| 46 | + <a href="#/ecosystem">ECOSYSTEM</a> |
| 47 | + <a href="mailto:hello@sovren.software">CONTACT</a> |
| 48 | + </div> |
| 49 | + <div class="footer-col"> |
| 50 | + <span class="col-label">EXTERNAL</span> |
| 51 | + <a href="https://twitter.com/sovren_software" target="_blank" rel="noreferrer">TWITTER</a> |
| 52 | + <a href="https://github.com/sovren-software" target="_blank" rel="noreferrer">GITHUB</a> |
| 53 | + <a href="https://mrhaven.io" target="_blank" rel="noreferrer">MRHAVEN.IO</a> |
| 54 | + <a href="https://augmentum.computer" target="_blank" rel="noreferrer">AUGMENTUM.COMPUTER</a> |
| 55 | + </div> |
36 | 56 | </nav> |
37 | 57 | </div> |
38 | | - <div class="footer-copy">© 2026 SOVREN SOFTWARE. BUILT FOR AUTONOMY.</div> |
| 58 | + <div class="footer-bottom"> |
| 59 | + <span class="footer-copy">© 2026 SOVREN SOFTWARE</span> |
| 60 | + <span class="footer-copy muted">BUILT FOR AUTONOMY.</span> |
| 61 | + </div> |
39 | 62 | </div> |
40 | 63 | </footer> |
41 | 64 |
|
42 | 65 | <style> |
43 | 66 | footer { |
44 | 67 | background: var(--bg); |
45 | 68 | border-top: 1px solid var(--border); |
46 | | - padding: 3.5rem 2.5rem; |
| 69 | + padding: 4rem 2.5rem 3rem; |
47 | 70 | } |
48 | 71 |
|
49 | 72 | .footer-inner { |
50 | 73 | max-width: var(--max-w); |
51 | 74 | margin: 0 auto; |
52 | 75 | display: flex; |
53 | 76 | flex-direction: column; |
54 | | - gap: 2rem; |
| 77 | + gap: 3rem; |
55 | 78 | } |
56 | 79 |
|
57 | 80 | .footer-top { |
58 | 81 | display: flex; |
59 | | - align-items: flex-start; |
60 | 82 | justify-content: space-between; |
61 | | - gap: 2rem; |
| 83 | + gap: 4rem; |
62 | 84 | flex-wrap: wrap; |
63 | 85 | } |
64 | 86 |
|
|
72 | 94 |
|
73 | 95 | .footer-nav { |
74 | 96 | display: flex; |
| 97 | + gap: 4rem; |
75 | 98 | flex-wrap: wrap; |
76 | | - gap: 0.75rem 2rem; |
77 | | - font-size: 0.65rem; |
78 | | - letter-spacing: 0.14em; |
79 | 99 | } |
80 | 100 |
|
81 | | - .footer-nav a { |
82 | | - color: var(--text-secondary); |
83 | | - text-decoration: none; |
| 101 | + .footer-col { |
| 102 | + display: flex; |
| 103 | + flex-direction: column; |
| 104 | + gap: 0.9rem; |
84 | 105 | } |
85 | 106 |
|
86 | | - .footer-nav a.muted { |
| 107 | + .col-label { |
| 108 | + font-size: 0.58rem; |
| 109 | + letter-spacing: 0.2em; |
87 | 110 | color: var(--text-muted); |
| 111 | + margin-bottom: 0.25rem; |
88 | 112 | } |
89 | 113 |
|
90 | | - .footer-nav a:hover { |
| 114 | + .footer-col a { |
| 115 | + font-size: 0.68rem; |
| 116 | + letter-spacing: 0.12em; |
| 117 | + color: var(--text-secondary); |
| 118 | + text-decoration: none; |
| 119 | + transition: color 0.15s; |
| 120 | + } |
| 121 | +
|
| 122 | + .footer-col a:hover { |
91 | 123 | color: var(--text-primary); |
92 | 124 | } |
93 | 125 |
|
| 126 | + .footer-bottom { |
| 127 | + display: flex; |
| 128 | + gap: 1.5rem; |
| 129 | + align-items: center; |
| 130 | + flex-wrap: wrap; |
| 131 | + } |
| 132 | +
|
94 | 133 | .footer-copy { |
95 | 134 | font-size: 0.6rem; |
96 | 135 | letter-spacing: 0.12em; |
97 | 136 | color: var(--text-muted); |
98 | 137 | } |
| 138 | +
|
| 139 | + .footer-copy.muted { |
| 140 | + color: rgba(255, 255, 255, 0.12); |
| 141 | + } |
| 142 | +
|
| 143 | + @media (max-width: 768px) { |
| 144 | + .footer-nav { |
| 145 | + gap: 2.5rem; |
| 146 | + } |
| 147 | + } |
99 | 148 | </style> |
0 commit comments