@bongos/core 1.19.83 → 1.19.85

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.
@@ -0,0 +1,311 @@
1
+ /* ═══════════════════════════════════════════════════════════════════════
2
+ Cloud Bongos — cosmos.css (task 1002696, the R07 redesign)
3
+ The shared token + component layer for the owner-facing project surfaces
4
+ (/create, /projects).
5
+
6
+ THE LOOK (owner decisions 2026-08-12, Loop 2): a LIGHT/DARK mode flips
7
+ the WHOLE WORLD, not just the cards:
8
+
9
+ · light mode — the sunrise white/orange page: dawn sky, cream cards
10
+ · dark mode — the gate's deep space (public-landing/gate/space.css):
11
+ night sky, stars, deep-navy cards, warm-white ink
12
+
13
+ Mode resolution: prefers-color-scheme by default; an explicit choice
14
+ sets data-mode="light|dark" on <html> (persisted by the page script).
15
+
16
+ TOKEN TIERS:
17
+ · CONTRACT tier — names the branding pack overrides (themeMarkup()
18
+ injects a :root override AFTER stylesheets, so the pack themes LIGHT
19
+ mode; dark mode derives from the platform's own dark tier).
20
+ · DERIVED tier — color-mix'd from contract tokens, so both modes and
21
+ any re-theme carry the whole page automatically.
22
+ State colors keep fixed meanings: green = verified good, amber =
23
+ unverified, red = wrong. Design contract: docs/design/
24
+ projects-surfaces-redesign-direction.md (+ this file's header).
25
+ ═══════════════════════════════════════════════════════════════════════ */
26
+
27
+ :root{
28
+ /* contract tier (light mode) */
29
+ --bg:#fff7ed; --bg-card:#ffffff; --bg-deep:#ffedd5;
30
+ --ink:#2a1f17; --ink-soft:#6b5d52; --ink-faint:#9c8d80;
31
+ --rule:#fdba74; --rule-soft:#fed7aa;
32
+ --accent:#f97316; --accent-deep:#ea580c; --sea:#38bdf8; --terracotta:#fb7185;
33
+ --font-display:"Baloo 2","Quicksand",system-ui,"Arial Rounded MT Bold",sans-serif;
34
+ --font-body:"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;
35
+ --font-mono:"Fira Code",ui-monospace,SFMono-Regular,Menlo,monospace;
36
+
37
+ /* the gate's locked space palette (dark mode's sky) */
38
+ --space-deep:#05060f; --space-mid:#0a0c20; --space-high:#0d0f28; --nebula:#2b2456;
39
+ --sun-lit:#fb923c; --gold:#ffd98a; --gold-soft:#f6c976;
40
+
41
+ /* semantic state tier */
42
+ --ok:#16a34a; --warn:#d97706; --err:#dc2626;
43
+
44
+ /* chrome tier — the WHOLE WORLD flips with the mode (owner, 2026-08-12,
45
+ Loop 2: light = the sunrise white/orange page, dark = the gate's space).
46
+ Light values here; the dark blocks below swap all of them. */
47
+ --page-bg:#fff7ed;
48
+ --sky-bg:linear-gradient(180deg,#e9f5fd 0%,#fde8c8 34%,#fff4e6 62%,#fffdfa 100%);
49
+ --star-display:none;
50
+ --chrome-ink:#2a1f17;
51
+ --chrome-ink-dim:#6b5d52;
52
+ --chrome-accent:#f97316;
53
+ --chrome-glow:none;
54
+ --glass-ink:#6b5d52;
55
+ --glass-bg:rgba(255,255,255,0.65);
56
+ --glass-border:rgba(249,115,22,0.4);
57
+ --ava-shadow:0 2px 8px rgba(42,31,23,0.12);
58
+ --hero-lede:#6b5d52;
59
+ --hero-b:#ea580c;
60
+ --foot-ink:#9c8d80;
61
+ --foot-code:#ea580c;
62
+ color-scheme:light;
63
+ }
64
+ /* dark tier — space sky + dark cards. Two hooks so an explicit choice beats
65
+ the OS preference. */
66
+ :root[data-mode="dark"]{
67
+ --bg:#0d0f28; --bg-card:#12142e; --bg-deep:#1d2046;
68
+ --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#93897d;
69
+ --rule:#5a4a7a; --rule-soft:#3a3560;
70
+ --ok:#4ade80; --warn:#fbbf24; --err:#f87171;
71
+ --page-bg:#05060f;
72
+ --sky-bg:radial-gradient(120% 85% at 50% -12%, #2b2456 0%, rgba(43,36,86,0) 55%),
73
+ radial-gradient(70% 55% at 82% 112%, rgba(56,120,200,.16), transparent 62%),
74
+ radial-gradient(58% 48% at 12% 6%, rgba(120,70,160,.14), transparent 60%),
75
+ linear-gradient(180deg, #05060f 0%, #0a0c20 48%, #0d0f28 100%);
76
+ --star-display:block;
77
+ --chrome-ink:#ffffff;
78
+ --chrome-ink-dim:rgba(255,255,255,0.85);
79
+ --chrome-accent:#fb923c;
80
+ --chrome-glow:0 2px 12px rgba(20,12,30,.7);
81
+ --glass-ink:#ffd98a;
82
+ --glass-bg:rgba(255,255,255,0.06);
83
+ --glass-border:rgba(255,217,138,0.45);
84
+ --ava-shadow:0 0 14px rgba(251,146,60,.45);
85
+ --hero-lede:rgba(255,255,255,0.82);
86
+ --hero-b:#ffd98a;
87
+ --foot-ink:rgba(255,255,255,0.55);
88
+ --foot-code:#ffd98a;
89
+ color-scheme:dark;
90
+ }
91
+ @media (prefers-color-scheme: dark){
92
+ :root:not([data-mode="light"]){
93
+ --bg:#0d0f28; --bg-card:#12142e; --bg-deep:#1d2046;
94
+ --ink:#f4eee7; --ink-soft:#c9bfb2; --ink-faint:#93897d;
95
+ --rule:#5a4a7a; --rule-soft:#3a3560;
96
+ --ok:#4ade80; --warn:#fbbf24; --err:#f87171;
97
+ --page-bg:#05060f;
98
+ --sky-bg:radial-gradient(120% 85% at 50% -12%, #2b2456 0%, rgba(43,36,86,0) 55%),
99
+ radial-gradient(70% 55% at 82% 112%, rgba(56,120,200,.16), transparent 62%),
100
+ radial-gradient(58% 48% at 12% 6%, rgba(120,70,160,.14), transparent 60%),
101
+ linear-gradient(180deg, #05060f 0%, #0a0c20 48%, #0d0f28 100%);
102
+ --star-display:block;
103
+ --chrome-ink:#ffffff;
104
+ --chrome-ink-dim:rgba(255,255,255,0.85);
105
+ --chrome-accent:#fb923c;
106
+ --chrome-glow:0 2px 12px rgba(20,12,30,.7);
107
+ --glass-ink:#ffd98a;
108
+ --glass-bg:rgba(255,255,255,0.06);
109
+ --glass-border:rgba(255,217,138,0.45);
110
+ --ava-shadow:0 0 14px rgba(251,146,60,.45);
111
+ --hero-lede:rgba(255,255,255,0.82);
112
+ --hero-b:#ffd98a;
113
+ --foot-ink:rgba(255,255,255,0.55);
114
+ --foot-code:#ffd98a;
115
+ color-scheme:dark;
116
+ }
117
+ }
118
+ :root{
119
+ /* derived tier — recomputes for whichever mode set the tokens above */
120
+ --card:color-mix(in srgb, var(--bg-card) 92%, var(--bg));
121
+ --line:color-mix(in srgb, var(--rule-soft) 55%, var(--bg-card));
122
+ --ok-soft:color-mix(in srgb, var(--ok) 14%, var(--bg-card));
123
+ --warn-soft:color-mix(in srgb, var(--warn) 15%, var(--bg-card));
124
+ --err-soft:color-mix(in srgb, var(--err) 12%, var(--bg-card));
125
+ --accent-soft:color-mix(in srgb, var(--accent) 15%, var(--bg-card));
126
+ --sea-soft:color-mix(in srgb, var(--sea) 16%, var(--bg-card));
127
+ --neutral-soft:color-mix(in srgb, var(--ink) 8%, var(--bg-card));
128
+ --shadow-card:0 24px 60px -24px rgba(5,6,15,.55), 0 6px 22px -8px rgba(5,6,15,.35);
129
+ }
130
+
131
+ *{box-sizing:border-box;margin:0;padding:0;}
132
+ [hidden]{display:none !important;}
133
+ html{scroll-behavior:smooth;}
134
+ body{font-family:var(--font-body);color:var(--ink);background:var(--page-bg);min-height:100vh;-webkit-font-smoothing:antialiased;overflow-x:hidden;}
135
+
136
+ /* ── the sky: mode-swapped — sunrise white/orange in light, the gate's deep
137
+ space (verbatim space.css recipe) in dark. Fixed layer, never
138
+ fixed-attachment on body. ── */
139
+ .sky{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:var(--sky-bg);}
140
+ .star{position:absolute;display:var(--star-display);border-radius:50%;background:#fff;box-shadow:0 0 3px rgba(255,255,255,.5);animation:twinkle 3.2s ease-in-out infinite;}
141
+ @keyframes twinkle{0%,100%{opacity:.22}50%{opacity:.95}}
142
+
143
+ /* ── header: mode-aware chrome (ink on sunrise, white + glow in space) ── */
144
+ .top{position:relative;z-index:2;display:flex;align-items:center;justify-content:space-between;padding:20px clamp(18px,4vw,40px);}
145
+ .top .mark{font-family:var(--font-display);font-weight:700;font-size:22px;letter-spacing:-0.5px;text-transform:lowercase;color:var(--chrome-ink);text-decoration:none;text-shadow:var(--chrome-glow);}
146
+ .top .mark span{color:var(--chrome-accent);}
147
+ .top-right{display:flex;align-items:center;gap:clamp(10px,2vw,18px);}
148
+ .who{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:600;color:var(--chrome-ink-dim);min-height:34px;text-shadow:var(--chrome-glow);}
149
+ .who img{width:30px;height:30px;border-radius:50%;border:2px solid rgba(255,255,255,0.85);box-shadow:var(--ava-shadow);}
150
+ .btn-space{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:13.5px;color:var(--glass-ink);background:var(--glass-bg);border:1.5px solid var(--glass-border);border-radius:999px;padding:8px 16px;text-decoration:none;text-shadow:var(--chrome-glow);backdrop-filter:blur(4px);}
151
+ .btn-space:hover{border-color:var(--chrome-accent);color:var(--chrome-accent);}
152
+ /* the light/dark switch — same glass voice as .btn-space, icon-only */
153
+ .mode-toggle{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;width:36px;height:36px;border-radius:50%;font-size:15px;line-height:1;color:var(--glass-ink);background:var(--glass-bg);border:1.5px solid var(--glass-border);backdrop-filter:blur(4px);}
154
+ .mode-toggle:hover{border-color:var(--chrome-accent);color:var(--chrome-accent);}
155
+
156
+ /* ── the hero (page title over the sky) ── */
157
+ .hero{position:relative;z-index:1;max-width:880px;margin:0 auto;padding:clamp(6px,1.5vw,18px) clamp(16px,4vw,40px) 26px;}
158
+ .hero h1{font-family:var(--font-display);font-weight:700;font-size:clamp(26px,3.8vw,36px);letter-spacing:-0.5px;color:var(--chrome-ink);text-shadow:var(--chrome-glow);}
159
+ .hero .lede{font-size:15.5px;color:var(--hero-lede);font-weight:500;line-height:1.55;margin-top:6px;max-width:60ch;text-shadow:var(--chrome-glow);}
160
+ .hero .lede b{color:var(--hero-b);font-weight:700;}
161
+
162
+ /* ── cards + type ── */
163
+ .card{background:var(--card);border-radius:26px;box-shadow:var(--shadow-card);padding:clamp(22px,3.6vw,40px);}
164
+ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32px);letter-spacing:-0.5px;line-height:1.15;margin-bottom:8px;}
165
+ .lede{font-size:15.5px;color:var(--ink-soft);font-weight:500;line-height:1.55;margin-bottom:24px;max-width:62ch;}
166
+ .lede a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
167
+ .lede a:hover{text-decoration:underline;}
168
+ :root[data-mode="dark"] .lede a{color:var(--sun-lit);}
169
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .lede a{color:var(--sun-lit);}}
170
+
171
+ /* ── buttons ── */
172
+ .btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;cursor:pointer;font-family:var(--font-display);font-weight:700;font-size:15px;color:#fff;background:var(--accent);border:none;border-radius:999px;padding:11px 22px;text-decoration:none;box-shadow:0 10px 22px -8px color-mix(in srgb,var(--accent) 70%,transparent);transition:transform .15s ease, box-shadow .15s ease, background .15s ease;}
173
+ .btn:hover{transform:translateY(-1px);box-shadow:0 14px 28px -8px color-mix(in srgb,var(--accent) 80%,transparent);}
174
+ .btn:active{transform:translateY(0) scale(.98);}
175
+ .btn:disabled{background:color-mix(in srgb,var(--ink) 12%,var(--bg-deep));color:color-mix(in srgb,var(--ink) 40%,var(--bg-deep));box-shadow:none;cursor:not-allowed;transform:none;}
176
+ .btn.ghost{background:transparent;color:var(--ink-soft);box-shadow:none;border:2px solid var(--line);}
177
+ .btn.ghost:hover{border-color:var(--accent);color:var(--accent-deep);}
178
+ :root[data-mode="dark"] .btn.ghost:hover{color:var(--sun-lit);}
179
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .btn.ghost:hover{color:var(--sun-lit);}}
180
+ .btn.small{font-size:13.5px;padding:8px 16px;}
181
+ .btn.danger{background:transparent;color:var(--err);box-shadow:none;border:2px solid color-mix(in srgb,var(--err) 35%,transparent);}
182
+ .btn.danger:hover{background:var(--err-soft);border-color:var(--err);}
183
+ .btn .gh{width:17px;height:17px;fill:currentColor;}
184
+ .linklike{background:none;border:none;cursor:pointer;font-family:var(--font-body);font-weight:700;font-size:13.5px;color:var(--accent-deep);text-decoration:underline;padding:6px 4px;}
185
+ :root[data-mode="dark"] .linklike{color:var(--sun-lit);}
186
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .linklike{color:var(--sun-lit);}}
187
+
188
+ /* ── chips: the one status vocabulary (direction §4). Recency rides inside
189
+ (.rec) — "live" always says when it was last verified. ── */
190
+ .chip{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:700;letter-spacing:0.3px;border-radius:999px;padding:4px 12px;background:var(--neutral-soft);color:var(--ink-soft);}
191
+ .chip .cdot{width:7px;height:7px;border-radius:50%;background:var(--ink-faint);flex:0 0 auto;}
192
+ .chip .rec{font-weight:600;opacity:0.72;font-size:11.5px;}
193
+ .chip.busy{background:var(--accent-soft);color:var(--accent-deep);}
194
+ :root[data-mode="dark"] .chip.busy{color:var(--sun-lit);}
195
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .chip.busy{color:var(--sun-lit);}}
196
+ .chip.busy .cdot{background:var(--accent);animation:chipPulse 1.4s ease-in-out infinite;}
197
+ .chip.live{background:var(--ok-soft);color:var(--ok);}
198
+ .chip.live .cdot{background:var(--ok);}
199
+ .chip.maybe{background:var(--warn-soft);color:var(--warn);}
200
+ .chip.maybe .cdot{background:var(--warn);}
201
+ .chip.down{background:var(--err-soft);color:var(--err);}
202
+ .chip.down .cdot{background:var(--err);}
203
+ .chip.bad{background:var(--err-soft);color:var(--err);}
204
+ .chip.bad .cdot{background:var(--err);}
205
+ .chip.calm{background:var(--neutral-soft);color:var(--ink-faint);}
206
+ .chip.calm .cdot{background:var(--ink-faint);}
207
+ @keyframes chipPulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--accent) 35%,transparent)}50%{box-shadow:0 0 0 5px transparent}}
208
+
209
+ /* ── the orb: the gate's project sphere, docked onto a card. Glow follows
210
+ verification — warm when verified live, amber-dim when stale, ashen when
211
+ it failed its check, ghosted when torn down. Born for the dark sky; on
212
+ light cards the inset ring keeps it grounded. ── */
213
+ .orb{flex:0 0 54px;width:54px;height:54px;border-radius:50%;position:relative;overflow:visible;cursor:pointer;border:none;padding:0;
214
+ background:radial-gradient(120% 120% at 50% 50%, var(--acc,#fb923c), color-mix(in srgb, var(--acc,#fb923c) 55%, #1b2b52) 100%);
215
+ box-shadow:0 0 0 1.5px rgba(255,255,255,.35) inset, 0 6px 18px rgba(20,16,40,.28), 0 0 26px var(--glow, rgba(251,146,60,.5));}
216
+ .orb::after{content:'';position:absolute;inset:0;border-radius:50%;pointer-events:none;
217
+ background:radial-gradient(38% 34% at 34% 28%, rgba(255,255,255,.9), rgba(255,255,255,0) 60%);}
218
+ .orb.dim{filter:saturate(.55) brightness(.92);--glow:rgba(217,119,6,.35);}
219
+ .orb.ashen{filter:saturate(.3) brightness(.78);--glow:rgba(220,38,38,.22);}
220
+ .orb.ghost{opacity:.4;box-shadow:0 0 0 1.5px rgba(255,255,255,.25) inset;filter:saturate(.2);cursor:default;}
221
+
222
+ /* ── project cards ── */
223
+ .projects{list-style:none;display:flex;flex-direction:column;gap:18px;}
224
+ .proj{border:2px solid var(--line);border-radius:18px;padding:18px 20px;background:var(--bg-card);display:flex;gap:16px;align-items:flex-start;}
225
+ .proj.gone{opacity:0.78;}
226
+ .projBody{flex:1;min-width:0;}
227
+ .projHead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
228
+ .projName{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-0.3px;}
229
+ .projMeta{font-size:13px;font-weight:600;color:var(--ink-faint);margin-top:6px;display:flex;gap:14px;flex-wrap:wrap;}
230
+ .projMeta code{font-family:var(--font-mono);font-size:12.5px;background:var(--bg-deep);border-radius:6px;padding:1px 6px;color:var(--accent-deep);}
231
+ :root[data-mode="dark"] .projMeta code{color:var(--sun-lit);}
232
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMeta code{color:var(--sun-lit);}}
233
+ .addr{margin-top:12px;font-size:14.5px;font-weight:600;color:var(--ink-soft);}
234
+ .addr a{color:var(--accent-deep);font-weight:700;text-decoration:none;font-family:var(--font-mono);font-size:13.5px;}
235
+ :root[data-mode="dark"] .addr a{color:var(--sun-lit);}
236
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr a{color:var(--sun-lit);}}
237
+ .addr a:hover{text-decoration:underline;}
238
+ .addr .none{color:var(--ink-faint);font-style:italic;}
239
+ .addr code{font-family:var(--font-mono);font-size:13px;background:var(--bg-deep);border-radius:6px;padding:1px 7px;color:var(--accent-deep);}
240
+ :root[data-mode="dark"] .addr code{color:var(--sun-lit);}
241
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .addr code{color:var(--sun-lit);}}
242
+ .attach{display:flex;gap:10px;margin-top:10px;flex-wrap:wrap;}
243
+ .attach input[type=text]{flex:1;min-width:220px;font-family:var(--font-body);font-size:15px;font-weight:600;color:var(--ink);background:var(--bg-card);border:2px solid var(--line);border-radius:12px;padding:9px 14px;outline:none;transition:border-color .15s ease, box-shadow .15s ease;}
244
+ .attach input[type=text]::placeholder{color:color-mix(in srgb,var(--ink-faint) 70%,var(--bg-card));font-weight:500;}
245
+ .attach input[type=text]:focus{border-color:var(--accent);box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 13%,transparent);}
246
+ .projMsg{font-size:13.5px;font-weight:600;margin-top:10px;min-height:18px;color:var(--ink-soft);line-height:1.5;}
247
+ .projMsg.ok{color:var(--ok);}
248
+ .projMsg.err{color:var(--err);}
249
+ .projMsg a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
250
+ :root[data-mode="dark"] .projMsg a{color:var(--sun-lit);}
251
+ @media (prefers-color-scheme: dark){:root:not([data-mode="light"]) .projMsg a{color:var(--sun-lit);}}
252
+ .projMsg a:hover{text-decoration:underline;}
253
+ .projMsg details{margin-top:8px;}
254
+ .projMsg summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--ink-faint);}
255
+ .projMsg pre{margin-top:7px;font-family:var(--font-mono);font-size:11.5px;line-height:1.5;color:var(--ink-soft);background:var(--neutral-soft);border-radius:10px;padding:10px 12px;white-space:pre-wrap;word-break:break-word;}
256
+ .actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap;align-items:center;}
257
+ .confirmRow{display:flex;gap:10px;align-items:center;flex-wrap:wrap;font-size:13.5px;font-weight:700;color:var(--err);}
258
+ .confirmRow .plain{font-weight:600;color:var(--ink-soft);}
259
+ .finePrint{font-size:12.5px;color:var(--ink-faint);font-weight:600;margin-top:16px;line-height:1.5;}
260
+
261
+ /* ── progress strips: one visual, per-flow vocabularies (direction §4).
262
+ Default = the sea-blue "working" look; .isLive = verified-landed green;
263
+ .flowDown = teardown's calm neutral (deliberate, never red, never green). ── */
264
+ .strip{border:2px solid var(--sea-soft);border-radius:18px;padding:16px 18px 13px;background:linear-gradient(180deg,color-mix(in srgb,var(--sea) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);margin-top:12px;}
265
+ .strip .stages{display:flex;list-style:none;margin-bottom:6px;}
266
+ .strip .stages li{flex:1;display:flex;flex-direction:column;align-items:center;gap:7px;position:relative;}
267
+ .strip .stages li:not(:first-child)::before{content:"";position:absolute;top:11px;right:50%;width:100%;height:3px;border-radius:2px;background:var(--sea-soft);z-index:0;margin-right:12px;}
268
+ .strip .stages li.done:not(:first-child)::before{background:var(--sea);}
269
+ .strip .sdot{position:relative;z-index:1;width:24px;height:24px;border-radius:50%;border:3px solid var(--sea-soft);background:var(--bg-card);display:flex;align-items:center;justify-content:center;}
270
+ .strip .stages li.done .sdot{border-color:var(--sea);background:var(--sea);}
271
+ .strip .stages li.done .sdot::after{content:"";width:8px;height:5px;border-left:2.5px solid #fff;border-bottom:2.5px solid #fff;transform:rotate(-45deg) translate(1px,-1px);}
272
+ .strip .stages li.now .sdot{border-color:var(--sea);}
273
+ .strip .stages li.now .sdot::after{content:"";width:8px;height:8px;border-radius:50%;background:var(--sea);animation:beatPulse 1.2s ease-in-out infinite;}
274
+ @keyframes beatPulse{0%,100%{transform:scale(.7);opacity:.6}50%{transform:scale(1.15);opacity:1}}
275
+ .strip .slbl{font-size:12px;font-weight:700;color:color-mix(in srgb,var(--sea) 55%,var(--ink-faint));}
276
+ .strip .stages li.now .slbl,.strip .stages li.done .slbl{color:color-mix(in srgb,var(--sea) 40%,var(--ink));}
277
+ .strip .pnote{text-align:center;font-size:13px;font-weight:600;color:var(--ink-soft);min-height:18px;line-height:1.5;}
278
+ .strip .pnote a{color:var(--accent-deep);font-weight:700;text-decoration:none;}
279
+ .strip.isLive{border-color:var(--ok-soft);background:linear-gradient(180deg,color-mix(in srgb,var(--ok) 8%,var(--bg-card)) 0%,var(--bg-card) 100%);}
280
+ .strip.isLive .stages li.done:not(:first-child)::before{background:var(--ok);}
281
+ .strip.isLive .stages li.done .sdot{border-color:var(--ok);background:var(--ok);}
282
+ .strip.isLive .slbl,.strip.isLive .stages li.done .slbl{color:var(--ok);}
283
+ .strip.isLive .pnote{color:var(--ok);}
284
+ .strip.flowDown{border-color:var(--line);background:linear-gradient(180deg,var(--neutral-soft) 0%,var(--bg-card) 100%);}
285
+ .strip.flowDown .stages li:not(:first-child)::before{background:var(--line);}
286
+ .strip.flowDown .stages li.done:not(:first-child)::before{background:var(--ink-faint);}
287
+ .strip.flowDown .sdot{border-color:var(--line);}
288
+ .strip.flowDown .stages li.done .sdot{border-color:var(--ink-faint);background:var(--ink-faint);}
289
+ .strip.flowDown .stages li.now .sdot{border-color:var(--ink-soft);}
290
+ .strip.flowDown .stages li.now .sdot::after{background:var(--ink-soft);}
291
+ .strip.flowDown .slbl{color:var(--ink-faint);}
292
+ .strip.flowDown .stages li.now .slbl,.strip.flowDown .stages li.done .slbl{color:var(--ink-soft);}
293
+
294
+ /* ── page-level bits ── */
295
+ .alert{display:none;background:var(--err-soft);border:2px solid color-mix(in srgb,var(--err) 25%,transparent);color:var(--err);font-weight:600;font-size:14px;border-radius:14px;padding:12px 16px;margin-bottom:18px;}
296
+ .alert.on{display:block;}
297
+ .loading{font-size:14.5px;font-weight:600;color:var(--ink-faint);padding:14px 0;}
298
+ .empty{border:2px dashed var(--line);border-radius:18px;padding:22px;text-align:center;}
299
+ .empty p{font-size:14.5px;font-weight:600;color:var(--ink-soft);margin-bottom:14px;line-height:1.55;}
300
+ .foot{position:relative;z-index:1;text-align:center;font-size:13px;font-weight:600;color:var(--foot-ink);padding:0 20px 34px;text-shadow:var(--chrome-glow);}
301
+ .foot code{font-family:var(--font-mono);color:var(--foot-code);}
302
+
303
+ @media (max-width:640px){
304
+ .projHead{gap:8px;}
305
+ .actions{flex-direction:column;align-items:stretch;}
306
+ .proj{flex-direction:column;}
307
+ .orb{width:44px;height:44px;flex-basis:44px;}
308
+ }
309
+ @media (prefers-reduced-motion:reduce){
310
+ *,*::before,*::after{animation:none !important;transition:none !important;}
311
+ }