specrails-hub 1.58.4 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>specrails — Hub</title>
6
+ <title>Specrails</title>
7
7
  <!--
8
8
  Anti-FOUC: read the cached theme synchronously and apply it to <html>
9
9
  BEFORE Vite's module bundle loads. Without this, every boot would flash
@@ -94,39 +94,68 @@
94
94
  opacity: 0;
95
95
  visibility: hidden;
96
96
  }
97
- .specrails-splash__brand {
98
- font-size: 22px;
99
- font-weight: 600;
100
- letter-spacing: -0.01em;
101
- display: flex;
102
- gap: 0;
103
- }
104
- .specrails-splash__brand .part-a { color: var(--splash-primary); }
105
- .specrails-splash__brand .part-b { color: var(--splash-secondary); }
106
- .specrails-splash__brand .part-c {
107
- color: var(--splash-muted);
108
- font-weight: 400;
109
- margin-left: 8px;
110
- }
111
- .specrails-splash__spinner {
112
- width: 22px;
113
- height: 22px;
114
- border-radius: 50%;
115
- border: 2px solid color-mix(in srgb, var(--splash-fg) 12%, transparent);
116
- border-top-color: var(--splash-primary);
117
- animation: specrails-spin 720ms linear infinite;
118
- }
119
- .specrails-splash__hint {
120
- font-size: 11px;
121
- color: var(--splash-muted);
122
- letter-spacing: 0.04em;
123
- text-transform: uppercase;
124
- }
125
- @keyframes specrails-spin {
126
- to { transform: rotate(360deg); }
97
+ .specrails-splash__mark {
98
+ width: 136px;
99
+ height: 136px;
100
+ display: block;
101
+ overflow: visible;
102
+ }
103
+ .specrails-splash__mark .pill {
104
+ transform-box: fill-box;
105
+ transform-origin: center;
106
+ animation: splash-pill-travel 2.4s ease-in-out infinite;
107
+ }
108
+ .specrails-splash__mark .pill-body {
109
+ filter:
110
+ drop-shadow(0 0 14px var(--splash-primary))
111
+ drop-shadow(0 0 26px color-mix(in srgb, var(--splash-secondary) 55%, transparent));
112
+ }
113
+ .specrails-splash__mark .bar-1 {
114
+ animation: splash-bar 2.4s ease-in-out infinite;
115
+ }
116
+ .specrails-splash__mark .bar-2 {
117
+ animation: splash-bar 2.4s ease-in-out infinite;
118
+ animation-delay: 0.4s;
119
+ }
120
+ .specrails-splash__glow {
121
+ position: absolute;
122
+ inset: 0;
123
+ pointer-events: none;
124
+ background: radial-gradient(
125
+ ellipse 60% 45% at 50% 50%,
126
+ color-mix(in srgb, var(--splash-primary) 22%, transparent) 0%,
127
+ color-mix(in srgb, var(--splash-primary) 6%, transparent) 30%,
128
+ transparent 58%
129
+ );
130
+ animation: splash-glow 2.4s ease-in-out infinite;
131
+ }
132
+ /* The pill rides the rails: fades in from the left, rests in the
133
+ centre for ~0.5s, then shoots off to the right and fades out. */
134
+ @keyframes splash-pill-travel {
135
+ 0% { transform: translateX(-1000px); opacity: 0; }
136
+ 28% { transform: translateX(0); opacity: 1; }
137
+ 48% { transform: translateX(0); opacity: 1;
138
+ animation-timing-function: cubic-bezier(0.6, 0, 0.85, 0.15); }
139
+ 60% { transform: translateX(1100px); opacity: 0; }
140
+ 100% { transform: translateX(1100px); opacity: 0; }
141
+ }
142
+ @keyframes splash-bar {
143
+ 0%, 100% { opacity: 0.28; }
144
+ 50% { opacity: 0.6; }
145
+ }
146
+ @keyframes splash-glow {
147
+ 0%, 100% { opacity: 0.1; }
148
+ 28%, 48% { opacity: 0.45; }
149
+ 60% { opacity: 0.1; }
127
150
  }
128
151
  @media (prefers-reduced-motion: reduce) {
129
- .specrails-splash__spinner { animation-duration: 1600ms; }
152
+ .specrails-splash__mark .pill,
153
+ .specrails-splash__mark .bar-1,
154
+ .specrails-splash__mark .bar-2,
155
+ .specrails-splash__glow {
156
+ animation: none;
157
+ }
158
+ .specrails-splash__mark .pill { opacity: 1; }
130
159
  }
131
160
  </style>
132
161
  <script type="module" crossorigin src="/assets/index-B3FJB_DS.js"></script>
@@ -137,12 +166,26 @@
137
166
  <link rel="stylesheet" crossorigin href="/assets/index-CrP8xKWG.css">
138
167
  </head>
139
168
  <body>
140
- <div id="specrails-splash" aria-hidden="false" role="status" aria-label="Loading specrails hub">
141
- <div class="specrails-splash__brand">
142
- <span class="part-a">spec</span><span class="part-b">rails</span><span class="part-c">hub</span>
143
- </div>
144
- <div class="specrails-splash__spinner" aria-hidden="true"></div>
145
- <div class="specrails-splash__hint">starting</div>
169
+ <div id="specrails-splash" aria-hidden="false" role="status" aria-label="Loading Specrails">
170
+ <div class="specrails-splash__glow" aria-hidden="true"></div>
171
+ <svg
172
+ class="specrails-splash__mark"
173
+ viewBox="64 166 384 182"
174
+ role="img"
175
+ aria-label="Specrails"
176
+ >
177
+ <defs>
178
+ <linearGradient id="splash-pillfill" x1="0" y1="0" x2="1" y2="0">
179
+ <stop offset="0%" stop-color="var(--splash-primary)"></stop>
180
+ <stop offset="100%" stop-color="var(--splash-secondary)"></stop>
181
+ </linearGradient>
182
+ </defs>
183
+ <rect class="bar-1" x="80" y="182" width="352" height="18" rx="9" fill="var(--splash-muted)"></rect>
184
+ <rect class="bar-2" x="80" y="314" width="352" height="18" rx="9" fill="var(--splash-muted)"></rect>
185
+ <g class="pill">
186
+ <rect class="pill-body" x="80" y="220" width="352" height="72" rx="36" fill="url(#splash-pillfill)"></rect>
187
+ </g>
188
+ </svg>
146
189
  </div>
147
190
  <div id="root"></div>
148
191
  </body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-hub",
3
- "version": "1.58.4",
3
+ "version": "1.59.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -147,7 +147,7 @@ function applyHubMigrations(db) {
147
147
  // Allow-list enforced at the route layer (server/hub-router.ts) and the
148
148
  // client (client/src/lib/themes.ts).
149
149
  () => {
150
- db.prepare('INSERT OR IGNORE INTO hub_settings (key, value) VALUES (?, ?)').run('ui_theme', 'dracula');
150
+ db.prepare('INSERT OR IGNORE INTO hub_settings (key, value) VALUES (?, ?)').run('ui_theme', 'specrails');
151
151
  },
152
152
  // Migration 9: seed code-explorer hub settings — summary language + monthly
153
153
  // budget cap. Enforced by FileSummaryManager + hub-router.
@@ -616,7 +616,7 @@ function createHubRouter(registry, broadcast) {
616
616
  // Persisted under hub_settings key `ui_theme`. Default seeded by migration 8.
617
617
  router.get('/theme', (_req, res) => {
618
618
  const stored = (0, hub_db_1.getHubSetting)(registry.hubDb, 'ui_theme');
619
- const theme = stored && THEME_ID_ALLOWLIST.has(stored) ? stored : 'dracula';
619
+ const theme = stored && THEME_ID_ALLOWLIST.has(stored) ? stored : 'specrails';
620
620
  res.json({ theme });
621
621
  });
622
622
  router.patch('/theme', (req, res) => {