From 1ea983d66a96478e3e50659b0263df787c30cde7 Mon Sep 17 00:00:00 2001 From: 0raclus Date: Mon, 11 May 2026 17:44:49 +0300 Subject: [PATCH] fix: SW cleanup + title-case all eyebrow labels + MEV layer status Three production fixes: 1. Service worker: disabled registration and added an active cleanup pass that unregisters any previously-installed SW and clears its CacheStorage entries on every page load. Stops the 'old bundle served from SW cache' footgun that was hiding new deploys (including the routing + button-text fixes from PR #93 + #94). Trade-off: no offline shell. Acceptable through the hackathon submission window; can be re-enabled with a versioned SW after. 2. Uppercase eyebrows / stat labels: stripped 30 'textTransform: uppercase' rules across 15 components (pages, panels, replay, tutorial, pair queue, etc.). Stat labels and eyebrows now render in the case authored in the source string ('Analytics' instead of 'ANALYTICS', 'Routed volume' instead of 'ROUTED VOLUME', etc.), per the polish ask. 3. MEV popover layer status: 'ACTIVE' / 'READY' -> 'Active' / 'Ready'. --- src/components/CommandPalette.tsx | 1 - src/components/CompletionFlourish.tsx | 1 - src/components/DcaSchedulesPanel.tsx | 1 - src/components/ExecutionPanel.tsx | 4 -- src/components/ExecutionReplay.tsx | 2 - src/components/ExecutionStack.tsx | 4 -- src/components/ExecutionTimeline.tsx | 1 - src/components/HeaderBar.tsx | 2 +- src/components/LeaderboardTab.tsx | 4 -- src/components/PairQueuePanel.tsx | 2 - src/components/ProfileSetup.tsx | 2 - src/components/ProgressRingsCard.tsx | 2 - src/components/RiskAdvisor.tsx | 1 - src/components/Tutorial.tsx | 1 - src/pages/AnalyticsPage.tsx | 2 - src/pages/WalletPage.tsx | 2 - src/services/serviceWorker.ts | 58 ++++++++++----------------- 17 files changed, 23 insertions(+), 67 deletions(-) diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx index 4255499..fd6fde3 100644 --- a/src/components/CommandPalette.tsx +++ b/src/components/CommandPalette.tsx @@ -483,7 +483,6 @@ const styles: Record = { fontWeight: 700, letterSpacing: "0.08em", color: "var(--color-text-muted)", - textTransform: "uppercase", }, row: { display: "flex", diff --git a/src/components/CompletionFlourish.tsx b/src/components/CompletionFlourish.tsx index db3f52e..08a24b2 100644 --- a/src/components/CompletionFlourish.tsx +++ b/src/components/CompletionFlourish.tsx @@ -241,7 +241,6 @@ const styles: Record = { fontSize: 11, color: "var(--color-text-muted)", letterSpacing: "0.12em", - textTransform: "uppercase", opacity: 0.7, }, }; diff --git a/src/components/DcaSchedulesPanel.tsx b/src/components/DcaSchedulesPanel.tsx index 6153e13..3ac85d6 100644 --- a/src/components/DcaSchedulesPanel.tsx +++ b/src/components/DcaSchedulesPanel.tsx @@ -155,7 +155,6 @@ const styles: Record = { fontSize: 10, fontWeight: 600, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.14em", }, headerCount: { diff --git a/src/components/ExecutionPanel.tsx b/src/components/ExecutionPanel.tsx index f56b3f4..984890b 100644 --- a/src/components/ExecutionPanel.tsx +++ b/src/components/ExecutionPanel.tsx @@ -1636,7 +1636,6 @@ const VerifiedMark: FC<{ verified: boolean }> = ({ verified }) => ( fontSize: 9, fontWeight: 700, letterSpacing: "0.04em", - textTransform: "uppercase", color: verified ? "var(--color-success)" : "var(--color-warn)", background: verified ? "rgba(34, 197, 94, 0.12)" @@ -2258,7 +2257,6 @@ const styles: Record = { fontVariantNumeric: "tabular-nums", marginLeft: "auto", letterSpacing: "0.04em", - textTransform: "uppercase", }, formCardBody: { display: "flex", @@ -2271,7 +2269,6 @@ const styles: Record = { fontWeight: 600, color: THEME.textMuted, letterSpacing: "0.08em", - textTransform: "uppercase", marginTop: 4, }, formCardFootnote: { @@ -2912,7 +2909,6 @@ const styles: Record = { fontWeight: 600, color: THEME.textMuted, letterSpacing: "0.05em", - textTransform: "uppercase", marginTop: 4, }, heroStatHint: { diff --git a/src/components/ExecutionReplay.tsx b/src/components/ExecutionReplay.tsx index 35da9fc..e7c5e1e 100644 --- a/src/components/ExecutionReplay.tsx +++ b/src/components/ExecutionReplay.tsx @@ -404,7 +404,6 @@ const styles: Record = { fontSize: 11, fontWeight: 700, color: "var(--color-5-strong)", - textTransform: "uppercase", letterSpacing: "0.1em", }, title: { @@ -450,7 +449,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 11, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.04em", }, tickerValue: { diff --git a/src/components/ExecutionStack.tsx b/src/components/ExecutionStack.tsx index 5495bfe..5f5b480 100644 --- a/src/components/ExecutionStack.tsx +++ b/src/components/ExecutionStack.tsx @@ -339,7 +339,6 @@ const styles: Record = { fontSize: 13, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.08em", }, titleHint: { @@ -354,7 +353,6 @@ const styles: Record = { fontSize: 11, fontWeight: 700, letterSpacing: "0.1em", - textTransform: "uppercase", padding: "2px 7px", borderRadius: 999, background: "var(--color-accent-bg-soft)", @@ -440,7 +438,6 @@ const styles: Record = { fontSize: 12, fontWeight: 600, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.05em", }, tally: { @@ -452,7 +449,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 13, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.05em", }, tallyValue: { diff --git a/src/components/ExecutionTimeline.tsx b/src/components/ExecutionTimeline.tsx index 0bab57b..1d069df 100644 --- a/src/components/ExecutionTimeline.tsx +++ b/src/components/ExecutionTimeline.tsx @@ -769,7 +769,6 @@ const styles: Record = { color: "var(--color-text-muted)", width: 64, flexShrink: 0, - textTransform: "uppercase", letterSpacing: "0.04em", fontSize: 12, }, diff --git a/src/components/HeaderBar.tsx b/src/components/HeaderBar.tsx index 7e82342..a9d1cdc 100644 --- a/src/components/HeaderBar.tsx +++ b/src/components/HeaderBar.tsx @@ -614,7 +614,7 @@ const MevPopover: FC<{ strategy: ReturnType }> = ({ fontSize: 12, }} > - · {layer.active ? "ACTIVE" : "READY"} + · {layer.active ? "Active" : "Ready"}
{layer.description}
diff --git a/src/components/LeaderboardTab.tsx b/src/components/LeaderboardTab.tsx index 0a1b2a4..4bb9192 100644 --- a/src/components/LeaderboardTab.tsx +++ b/src/components/LeaderboardTab.tsx @@ -301,7 +301,6 @@ const styles: Record = { fontSize: 12, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.06em", }, yourCardRank: { @@ -333,7 +332,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 11, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.04em", }, emptyState: { @@ -353,7 +351,6 @@ const styles: Record = { fontSize: 12, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.06em", }, boardHint: { @@ -406,7 +403,6 @@ const styles: Record = { fontSize: 9, fontWeight: 700, letterSpacing: "0.06em", - textTransform: "uppercase", border: "1px solid", borderRadius: 4, }, diff --git a/src/components/PairQueuePanel.tsx b/src/components/PairQueuePanel.tsx index 83555c4..cb7980a 100644 --- a/src/components/PairQueuePanel.tsx +++ b/src/components/PairQueuePanel.tsx @@ -239,7 +239,6 @@ const styles: Record = { fontSize: 13, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.06em", }, headerIcon: { fontSize: 14 }, @@ -302,7 +301,6 @@ const styles: Record = { fontSize: 10, fontWeight: 700, letterSpacing: "0.05em", - textTransform: "uppercase", border: "1px solid", borderRadius: 999, fontFamily: MONO, diff --git a/src/components/ProfileSetup.tsx b/src/components/ProfileSetup.tsx index 579a67c..497c21b 100644 --- a/src/components/ProfileSetup.tsx +++ b/src/components/ProfileSetup.tsx @@ -343,7 +343,6 @@ const styles: Record = { letterSpacing: "0.12em", fontWeight: 700, color: "var(--color-5-strong)", - textTransform: "uppercase", }, title: { fontFamily: SANS, @@ -388,7 +387,6 @@ const styles: Record = { fontSize: 13, fontWeight: 600, letterSpacing: "0.12em", - textTransform: "uppercase", color: "var(--color-text-muted)", animation: "liminal-fade-in 200ms var(--ease-out, ease)", }, diff --git a/src/components/ProgressRingsCard.tsx b/src/components/ProgressRingsCard.tsx index 0c407ca..404210b 100644 --- a/src/components/ProgressRingsCard.tsx +++ b/src/components/ProgressRingsCard.tsx @@ -206,7 +206,6 @@ const styles: Record = { fontSize: 13, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.08em", }, body: { @@ -236,7 +235,6 @@ const styles: Record = { fontWeight: 600, color: "var(--color-text-muted)", letterSpacing: "0.04em", - textTransform: "uppercase", }, legendValue: { fontFamily: SANS, diff --git a/src/components/RiskAdvisor.tsx b/src/components/RiskAdvisor.tsx index d319c10..4729c33 100644 --- a/src/components/RiskAdvisor.tsx +++ b/src/components/RiskAdvisor.tsx @@ -162,7 +162,6 @@ const styles: Record = { fontSize: 13, fontWeight: 700, color: "var(--color-text-muted)", - textTransform: "uppercase", letterSpacing: "0.06em", }, headerIcon: { diff --git a/src/components/Tutorial.tsx b/src/components/Tutorial.tsx index 77aeb77..8ddb720 100644 --- a/src/components/Tutorial.tsx +++ b/src/components/Tutorial.tsx @@ -329,7 +329,6 @@ const styles: Record = { fontSize: 11, letterSpacing: "0.1em", fontWeight: 700, - textTransform: "uppercase", color: "var(--color-5-strong)", marginBottom: 6, }, diff --git a/src/pages/AnalyticsPage.tsx b/src/pages/AnalyticsPage.tsx index 7f45093..6788430 100644 --- a/src/pages/AnalyticsPage.tsx +++ b/src/pages/AnalyticsPage.tsx @@ -192,7 +192,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 11, letterSpacing: "0.14em", - textTransform: "uppercase", color: "var(--color-text-muted)", }, heroTitle: { @@ -229,7 +228,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 10, letterSpacing: "0.12em", - textTransform: "uppercase", color: "var(--color-text-muted)", }, statValue: { diff --git a/src/pages/WalletPage.tsx b/src/pages/WalletPage.tsx index f6f0df3..baa0d80 100644 --- a/src/pages/WalletPage.tsx +++ b/src/pages/WalletPage.tsx @@ -230,7 +230,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 11, letterSpacing: "0.14em", - textTransform: "uppercase", color: "var(--color-text-muted)", marginBottom: 4, }, @@ -269,7 +268,6 @@ const styles: Record = { fontFamily: MONO, fontSize: 10, letterSpacing: "0.12em", - textTransform: "uppercase", color: "var(--color-text-muted)", }, statValue: { diff --git a/src/services/serviceWorker.ts b/src/services/serviceWorker.ts index 46d3b9d..1bcd650 100644 --- a/src/services/serviceWorker.ts +++ b/src/services/serviceWorker.ts @@ -1,53 +1,39 @@ /** * LIMINAL — Service Worker registration * - * Wraps the navigator.serviceWorker.register() call with the guards - * we need: - * - Skipped in dev (import.meta.env.DEV) so HMR isn't intercepted - * - Skipped when the browser doesn't support service workers (older - * Safari, file:// origin, etc.) - * - Logs the result via console.warn on failure but never throws — - * a missing offline shell is not a fatal error - * - Listens for `controllerchange` (new SW activated) and reloads - * once so users always run the freshest deploy + * Disabled for hackathon submission. Previous SW versions kept caching + * stale bundles on the production domain, masking new deploys until + * users manually cleared storage. To prevent that footgun during demo + * + judging, we: * - * The actual SW lives in `public/sw.js` so Vite copies it verbatim - * to the build output. We don't bundle it through the JS pipeline - * because workers are loaded by URL, not module-graph. + * 1. No longer register a service worker. + * 2. Actively unregister any SW that a previous visit installed. + * 3. Clear every cache the previous SW seeded (CacheStorage entries). + * + * Effect: every page load fetches the freshest bundle from Vercel. + * Slightly higher network use, much better deploy-to-user latency. + * Re-enable after submission once the cadence settles and we want + * offline support back. */ -const SW_PATH = "/sw.js"; - -let reloaded = false; - export async function registerServiceWorker(): Promise { if (typeof window === "undefined") return; - // Vite injects DEV at build time; on production builds it's false. - if (import.meta.env.DEV) return; if (!("serviceWorker" in navigator)) return; try { - const reg = await navigator.serviceWorker.register(SW_PATH, { - scope: "/", - }); - // When a new SW activates, the browser is ready to use it but the - // current page still runs the old one. Reload exactly once so the - // user immediately sees the new deploy. - navigator.serviceWorker.addEventListener("controllerchange", () => { - if (reloaded) return; - reloaded = true; - window.location.reload(); - }); - if (reg.waiting) { - // A SW is already waiting on first load — likely an update from - // a previous session. Tell it to take over now. - reg.waiting.postMessage({ type: "SKIP_WAITING" }); + const regs = await navigator.serviceWorker.getRegistrations(); + for (const reg of regs) { + await reg.unregister(); + } + if (typeof caches !== "undefined") { + const keys = await caches.keys(); + for (const key of keys) { + await caches.delete(key); + } } } catch (err) { - // Don't toast / Sentry — service worker absence is benign. Just - // a console warn so devs can see if registration fails. console.warn( - `[LIMINAL/sw] register failed: ${err instanceof Error ? err.message : String(err)}`, + `[LIMINAL/sw] cleanup failed: ${err instanceof Error ? err.message : String(err)}`, ); } }