@bongos/core 1.19.1066 → 1.19.1068

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.
@@ -1,148 +1,596 @@
1
- /* modules/hall-ui/public/studio.css — the Studio (artist mode), /builders/studio.
2
- R06 of goal 1000074 (the artist's loop), task 1003117.
1
+ /* modules/hall-ui/public/studio.css — the studio, /builders/studio.
3
2
 
4
- The criterion (artist-mode): "a place an artist wants to be, not a form. A
5
- focus environment on the Cloud Bongos screen — a lofi-girl-style zen garden of
6
- focus and creativity — rather than another table of rows." So this sheet is
7
- deliberately NOT the oversight row archetype the copy desk rides. It is a calm
8
- room: one thing to tend at a time, generous air, tonal separation, and one
9
- slow ambient presence — the warm "lamp" that gives a lofi room its light.
3
+ THE STUDIO HOME (task 1003971 / BV2.TW16, goal 1000095; ADR 0341 D2, D8 and
4
+ D11). docs/design/mocks/tweak-mode/Main.dc.html is the master design the
5
+ owner approved ("I like the lofi design for now"), and the first half of this
6
+ sheet is its inline styles, one rule per element: the night room (the window
7
+ with its moon, stars and city lights, the floor, the lamp and its glow, the
8
+ mug and the plant), the eyebrow and the tally pill, the greeting and its
9
+ sub-line, Resume, the three glass quick actions, and the two small glass
10
+ panels. What a gate or a route forced to differ is listed in
11
+ modules/hall-ui/records/studio.md, one line each.
10
12
 
11
- THE ONE WARM THING RULE, kept (DESIGN.md): the salmon accent lights only what
12
- is pressable (the primary action) or LIVE. The ambient lamp is the live thing
13
- — a slow-breathing warm presence, the room's own light — and nothing else here
14
- is warm: the eyebrows, the step numbers and the stones are ink, never accent.
13
+ ONE ROOM, BOTH MODES. The artboard is a room at night, so it is the room
14
+ whatever the hall's theme is (the tweak editor's precedent, tweak-editor.css):
15
+ its palette is the artboard's own values, declared as --st-* on this page's
16
+ body and spent only on the stage (main.studio), the two panels, and the
17
+ shell's full-screen button while it floats over the room. The hall chrome
18
+ around the stage keeps its own light and dark.
15
19
 
16
- Tokens only — no colour literals (tests/hall_audit.mjs §9 holds every hall
17
- sheet to that), so every colour is a var() or a color-mix() of one, and both
18
- modes come for free from style.css's tier. The mode marker html[data-artist]
19
- is set on this page's <html> (the social-mode pattern, shell.js applySocial):
20
- entering the studio IS entering the mode, so the calm reads off the attribute. */
20
+ The second half is the older reviews' garden (R06 of goal 1000074, task
21
+ 1003117), which still answers the reviews filed before Tweak Mode (TW14) in
22
+ its own quiet dialog, in the hall's own tokens as it always was. */
23
+
24
+ body[data-page="studio"] {
25
+ --st-room: #07080d;
26
+ --st-frame: #14151b;
27
+ --st-night: #0c1122;
28
+ --st-moon: #f1e6d2;
29
+ --st-moon-halo: rgba(241, 230, 210, .18);
30
+ --st-star: #d8dcf0;
31
+ --st-tower-1: #090b16;
32
+ --st-tower-2: #0a0d1a;
33
+ --st-tower-3: #080a14;
34
+ --st-floor: #0d0d12;
35
+ --st-floor-edge: rgba(255, 255, 255, .06);
36
+ --st-glow: rgba(251, 149, 105, .22);
37
+ --st-glow-out: rgba(251, 149, 105, 0);
38
+ --st-stem: #1c1c24;
39
+ --st-shade: #22222b;
40
+ --st-mug: #1a1a22;
41
+ --st-leaf-1: #13261d;
42
+ --st-leaf-2: #173022;
43
+ --st-ink: #ffffff;
44
+ --st-ink-sub: #c9c9ce;
45
+ --st-ink-soft: #c0c0c0;
46
+ --st-ink-faint: #a8a8a8;
47
+ --st-ink-dim: #8a8a90;
48
+ --st-ink-hint: #85858c;
49
+ --st-glass: rgba(255, 255, 255, .06);
50
+ --st-glass-edge: rgba(255, 255, 255, .14);
51
+ --st-rule: rgba(255, 255, 255, .16);
52
+ --st-accent: #fb9569;
53
+ --st-on-accent: #000000;
54
+ --st-link: #fcbfa4;
55
+ --st-resume: rgba(251, 149, 105, .16);
56
+ --st-resume-edge: rgba(251, 149, 105, .55);
57
+ --st-word-hover: rgba(255, 255, 255, .28);
58
+ --st-word-ring: rgba(251, 149, 105, .45);
59
+ --st-scrim: rgba(4, 5, 9, .94);
60
+ --st-panel: rgba(255, 255, 255, .075);
61
+ --st-panel-edge: rgba(255, 255, 255, .18);
62
+ --st-panel-rim: rgba(255, 255, 255, .22);
63
+ --st-panel-drop: rgba(0, 0, 0, .55);
64
+ --st-close: rgba(255, 255, 255, .08);
65
+ --st-chip-edge: rgba(255, 255, 255, .16);
66
+ --st-track: rgba(255, 255, 255, .1);
67
+ --st-danger: #ff9b8a;
68
+ --st-face: var(--font-body, Manrope, "Segoe UI", system-ui, sans-serif);
69
+ --st-mono: var(--font-mono, "JetBrains Mono", ui-monospace, Consolas, monospace);
70
+ }
71
+
72
+ /* The stage fills the content box: the hall's content column is a reading
73
+ width, and the artboard is the whole window. */
74
+ body[data-page="studio"] .app-content { max-width: none; padding: 0; }
75
+ body[data-page="studio"] .app-foot { display: none; }
21
76
 
22
- /* The room. Generous vertical air so the one focus sits in space, not in a list.
23
- position:relative anchors the ambient layer below it. */
24
77
  .studio {
78
+ color-scheme: dark;
25
79
  position: relative;
26
- padding: clamp(28px, 6vh, 76px) 0 64px;
80
+ overflow: hidden;
81
+ min-height: calc(100vh - var(--topbar-h, 56px));
82
+ box-sizing: border-box;
83
+ padding: 48px 88px 64px;
84
+ background: var(--st-room);
85
+ color: var(--st-ink);
86
+ font-family: var(--st-face);
87
+ }
88
+ html[data-fullscreen="on"] .studio { min-height: 100vh; }
89
+ .studio a { color: var(--st-link); }
90
+ .studio a:hover { color: var(--st-accent); }
91
+ .studio button { font-family: inherit; }
92
+
93
+ /* In full screen the shell's one button floats over the night room in either
94
+ theme, so on this page it wears the room's glass, not the hall's ink. */
95
+ html[data-fullscreen="on"] body[data-page="studio"] .fullscreen-toggle {
96
+ color: var(--st-ink);
97
+ background: var(--st-glass);
98
+ box-shadow: inset 0 0 0 1px var(--st-glass-edge);
27
99
  }
28
100
 
29
- /* The ambient presence — the lamp. A single soft warm disc, low and slow, the
30
- only atmosphere the room draws (the hall's --plate ground is a deferred seam,
31
- owner's call, so nothing is painted into it here). overflow:hidden clips the
32
- disc to the room so it can never widen the document (the no-sideways rule). */
33
- .studio-atmos {
101
+ /* ---------------------------------------------------------------------------
102
+ The night room. Positions are the artboard's, measured from the centre of
103
+ its 1440 frame, so the room stays composed on a wider or narrower window;
104
+ the window never slides under the words column (its left edge holds at
105
+ 680px). Clipped by the stage, so it can never widen the document.
106
+ --------------------------------------------------------------------------- */
107
+ .st-room {
34
108
  position: absolute;
35
109
  inset: 0;
36
- overflow: hidden;
37
110
  pointer-events: none;
38
111
  z-index: 0;
39
112
  }
40
- .studio-atmos::before {
41
- content: "";
42
- position: absolute;
43
- top: -24%;
44
- right: -10%;
45
- width: min(680px, 82vw);
46
- aspect-ratio: 1;
113
+ .st-room > *,
114
+ .st-window > * { position: absolute; }
115
+ .st-window {
116
+ left: max(calc(50% + 60px), 680px);
117
+ top: 86px;
118
+ width: 560px;
119
+ height: 560px;
120
+ box-sizing: border-box;
121
+ border: 16px solid var(--st-frame);
122
+ border-radius: 6px;
123
+ background: var(--st-night);
124
+ overflow: hidden;
125
+ }
126
+ .st-moon {
127
+ left: 372px; top: 64px; width: 64px; height: 64px;
47
128
  border-radius: 50%;
48
- background: color-mix(in srgb, var(--accent) 12%, transparent);
49
- animation: studio-lamp 38s ease-in-out infinite;
50
- }
51
- /* A second, cooler and fainter presence low-left, so the room has depth rather
52
- than one lamp in a corner. --glass is the world's tonal wash token (translucent
53
- ink on paper in light, translucent white on black in dark) — the sanctioned way
54
- to lay a neutral wash that reads right in both modes, never a raw --ink mix into
55
- transparent (which inverts; tests/hall_audit.mjs bans it). */
56
- .studio-atmos::after {
57
- content: "";
58
- position: absolute;
59
- bottom: -30%;
60
- left: -14%;
61
- width: min(560px, 72vw);
62
- aspect-ratio: 1;
129
+ background: var(--st-moon);
130
+ box-shadow: 0 0 60px 12px var(--st-moon-halo);
131
+ }
132
+ .st-star { border-radius: 50%; background: var(--st-star); }
133
+ .st-star--1 { left: 80px; top: 70px; width: 3px; height: 3px; }
134
+ .st-star--2 { left: 190px; top: 40px; width: 2px; height: 2px; }
135
+ .st-star--3 { left: 260px; top: 120px; width: 3px; height: 3px; opacity: .7; }
136
+ .st-star--4 { left: 470px; top: 170px; width: 2px; height: 2px; }
137
+ .st-star--5 { left: 130px; top: 190px; width: 2px; height: 2px; opacity: .6; }
138
+ .st-tower { bottom: 0; }
139
+ .st-tower--1 { left: 0; width: 120px; height: 230px; background: var(--st-tower-1); }
140
+ .st-tower--2 { left: 110px; width: 90px; height: 310px; background: var(--st-tower-2); }
141
+ .st-tower--3 { left: 200px; width: 140px; height: 200px; background: var(--st-tower-3); }
142
+ .st-tower--4 { left: 330px; width: 80px; height: 270px; background: var(--st-tower-2); }
143
+ .st-tower--5 { left: 400px; width: 140px; height: 180px; background: var(--st-tower-1); }
144
+ .st-light { width: 6px; height: 8px; background: var(--st-accent); }
145
+ .st-light--1 { left: 136px; bottom: 250px; opacity: .75; }
146
+ .st-light--2 { left: 160px; bottom: 210px; opacity: .55; }
147
+ .st-light--3 { left: 30px; bottom: 150px; opacity: .6; }
148
+ .st-light--4 { left: 350px; bottom: 220px; opacity: .7; }
149
+ .st-light--5 { left: 370px; bottom: 170px; opacity: .45; }
150
+ .st-light--6 { left: 460px; bottom: 110px; opacity: .6; }
151
+ .st-light--7 { left: 250px; bottom: 120px; opacity: .5; }
152
+ .st-mullion { left: 264px; top: 0; width: 0; height: 100%; border-left: 12px solid var(--st-frame); }
153
+ .st-floor {
154
+ left: 0; right: 0; top: 700px; bottom: 0;
155
+ min-height: 200px;
156
+ background: var(--st-floor);
157
+ border-top: 1px solid var(--st-floor-edge);
158
+ }
159
+ .st-glow {
160
+ left: calc(50% + 440px); top: 470px; width: 300px; height: 300px;
63
161
  border-radius: 50%;
64
- background: var(--glass);
65
- animation: studio-lamp 52s ease-in-out infinite reverse;
66
- }
67
- /* Long-period, transform/opacity only, and dead under the shell's global
68
- reduced-motion kill switch (style.css) — the DESIGN.md rule for ambient loops. */
69
- @keyframes studio-lamp {
70
- 0%, 100% { transform: scale(1); opacity: .85; }
71
- 50% { transform: scale(1.08); opacity: 1; }
162
+ background: radial-gradient(circle, var(--st-glow) 0%, var(--st-glow-out) 65%);
163
+ }
164
+ .st-lamp-stem { left: calc(50% + 570px); top: 560px; width: 6px; height: 140px; background: var(--st-stem); }
165
+ .st-lamp-shade { left: calc(50% + 526px); top: 540px; width: 94px; height: 46px; border-radius: 48px 48px 6px 6px; background: var(--st-shade); }
166
+ .st-mug { left: calc(50% + 340px); top: 650px; width: 46px; height: 52px; border-radius: 0 0 10px 10px; background: var(--st-mug); }
167
+ .st-leaf { border-radius: 50% 50% 0 0; }
168
+ .st-leaf--1 { left: calc(50% + 180px); top: 610px; width: 64px; height: 90px; background: var(--st-leaf-1); }
169
+ .st-leaf--2 { left: calc(50% + 220px); top: 590px; width: 50px; height: 110px; background: var(--st-leaf-2); }
170
+
171
+ /* Everything the artist reads or presses sits above the room. */
172
+ .st-top,
173
+ .st-words,
174
+ .st-actions { position: relative; z-index: 1; }
175
+
176
+ /* ---------------------------------------------------------------------------
177
+ The top row: the room's name, and the tally pill.
178
+ --------------------------------------------------------------------------- */
179
+ .st-top { display: flex; align-items: center; min-height: 48px; gap: 16px; flex-wrap: wrap; }
180
+ .st-eyebrow {
181
+ font-family: var(--st-mono);
182
+ font-size: 11px;
183
+ letter-spacing: .14em;
184
+ text-transform: uppercase;
185
+ color: var(--st-ink-faint);
72
186
  }
187
+ .st-tally {
188
+ margin-left: auto;
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 18px;
192
+ height: 48px;
193
+ padding: 0 22px;
194
+ box-sizing: border-box;
195
+ border-radius: 999px;
196
+ background: var(--st-glass);
197
+ border: 1px solid var(--st-glass-edge);
198
+ backdrop-filter: blur(20px);
199
+ -webkit-backdrop-filter: blur(20px);
200
+ }
201
+ .st-tally[hidden] { display: none; }
202
+ .st-tally__item { display: flex; align-items: baseline; gap: 6px; white-space: nowrap; }
203
+ .st-tally__n { font-size: 20px; font-weight: 300; color: var(--st-ink); font-variant-numeric: tabular-nums; }
204
+ .st-tally__n--credits { color: var(--st-accent); }
205
+ .st-tally__label { font-size: 13px; color: var(--st-ink-soft); }
206
+ .st-tally__rule { width: 1px; height: 20px; background: var(--st-rule); }
73
207
 
74
- /* Everything the reader acts on sits above the lamp. */
75
- .studio-head,
76
- .studio-doors,
77
- .studio-focus,
78
- .studio-rest { position: relative; z-index: 1; }
208
+ /* ---------------------------------------------------------------------------
209
+ The studio's own words: the greeting, its sub-line and the hint. Held to the
210
+ artboard's 176px so the actions stand where it draws them.
211
+ --------------------------------------------------------------------------- */
212
+ .st-words {
213
+ margin-top: 70px;
214
+ width: min(560px, 100%);
215
+ min-height: 176px;
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: 18px;
219
+ }
220
+ .st-greet {
221
+ margin: 0;
222
+ font-size: 64px;
223
+ font-weight: 200;
224
+ line-height: 1.02;
225
+ letter-spacing: -.04em;
226
+ color: var(--st-ink);
227
+ }
228
+ .st-sub {
229
+ margin: 0;
230
+ font-size: 19px;
231
+ line-height: 1.5;
232
+ font-weight: 300;
233
+ color: var(--st-ink-sub);
234
+ }
235
+ .st-words [data-words] { cursor: text; border-radius: 2px; }
236
+ .st-words [data-words]:hover { box-shadow: 0 1px 0 var(--st-word-hover); }
237
+ .st-words [data-words][contenteditable="true"]:focus { box-shadow: 0 1px 0 var(--st-accent); }
238
+ .st-words [data-words][contenteditable="true"]:focus-visible {
239
+ outline: 1px solid var(--st-word-ring);
240
+ outline-offset: 6px;
241
+ }
242
+ /* A word the studio's reading does not list (a sentence newer than the last
243
+ reading) cannot be tweaked in place: it keeps its words and loses the cue. */
244
+ .st-words [data-words][data-unread] { cursor: default; box-shadow: none; }
245
+ .st-hint {
246
+ align-self: flex-start;
247
+ min-height: 24px;
248
+ margin: 0;
249
+ padding: 0;
250
+ border: 0;
251
+ background: none;
252
+ font-size: 12.5px;
253
+ color: var(--st-ink-hint);
254
+ text-align: left;
255
+ cursor: pointer;
256
+ }
257
+ .st-hint:hover { color: var(--st-ink-soft); }
258
+ .st-hint[hidden] { display: none; }
259
+ .st-editing {
260
+ margin: 0;
261
+ min-height: 24px;
262
+ font-size: 12.5px;
263
+ line-height: 24px;
264
+ color: var(--st-ink-soft);
265
+ }
266
+ .st-editing[hidden] { display: none; }
267
+ .st-editing a { display: inline-block; min-height: 24px; }
268
+ .st-editing--failed { color: var(--st-danger); }
79
269
 
80
- /* The quick actions (task 1004323 / TW12): the master design's 72px glass rows
81
- (docs/design/mocks/tweak-mode/Main.dc.html), in the hall's own tokens so they
82
- read in both modes. One today, the Approval queue; the lofi home (TW16)
83
- brings the rest and the night room around them. */
84
- .studio-doors {
270
+ /* The offer: taking the studio page before its words are typed over. */
271
+ .st-offer {
85
272
  display: flex;
86
273
  flex-direction: column;
87
274
  gap: 12px;
275
+ padding: 16px 18px;
276
+ border-radius: 18px;
277
+ background: var(--st-glass);
278
+ border: 1px solid var(--st-glass-edge);
279
+ backdrop-filter: blur(20px);
280
+ -webkit-backdrop-filter: blur(20px);
281
+ }
282
+ .st-offer[hidden] { display: none; }
283
+ .st-offer__text { margin: 0; font-size: 14px; line-height: 1.5; color: var(--st-ink-soft); }
284
+ .st-offer__err { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--st-danger); }
285
+ .st-offer__err[hidden] { display: none; }
286
+ .st-offer__acts { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
287
+ .st-offer__take {
288
+ height: 44px;
289
+ padding: 0 20px;
290
+ border-radius: 999px;
291
+ border: 0;
292
+ cursor: pointer;
293
+ background: var(--st-accent);
294
+ color: var(--st-on-accent);
295
+ font-size: 14px;
296
+ }
297
+ .st-offer__take:disabled { opacity: .6; cursor: default; }
298
+ .st-offer__no {
299
+ height: 44px;
300
+ padding: 0 16px;
301
+ border-radius: 999px;
302
+ border: 0;
303
+ cursor: pointer;
304
+ background: var(--st-close);
305
+ color: var(--st-ink);
306
+ font-size: 13px;
307
+ }
308
+
309
+ /* ---------------------------------------------------------------------------
310
+ Resume and the three quick actions: 72px glass rows, 420 wide.
311
+ --------------------------------------------------------------------------- */
312
+ .st-actions {
313
+ margin-top: 72px;
88
314
  width: min(420px, 100%);
89
- margin-bottom: clamp(22px, 4vh, 40px);
315
+ display: flex;
316
+ flex-direction: column;
317
+ gap: 12px;
90
318
  }
91
- .studio-door {
319
+ .st-resume,
320
+ .st-action {
92
321
  display: flex;
93
322
  flex-direction: column;
94
323
  align-items: flex-start;
95
324
  justify-content: center;
96
325
  gap: 3px;
97
326
  min-height: 72px;
98
- padding: 0 24px;
327
+ padding: 10px 24px;
99
328
  box-sizing: border-box;
100
329
  border-radius: 22px;
101
- cursor: pointer;
102
330
  text-align: left;
103
- font-family: var(--font-body);
104
- background: var(--glass);
105
- border: 1px solid var(--rule-soft);
106
- color: var(--ink);
331
+ backdrop-filter: blur(20px);
332
+ -webkit-backdrop-filter: blur(20px);
107
333
  }
108
- .studio-door:hover { border-color: var(--ink-faint); }
109
- .studio-door__label { font-size: 17px; color: var(--ink); }
110
- .studio-door__detail { font-size: 13px; color: var(--ink-soft); }
334
+ .st-resume {
335
+ text-decoration: none;
336
+ background: var(--st-resume);
337
+ border: 1px solid var(--st-resume-edge);
338
+ }
339
+ .st-resume[hidden] { display: none; }
340
+ .st-action {
341
+ cursor: pointer;
342
+ background: var(--st-glass);
343
+ border: 1px solid var(--st-glass-edge);
344
+ color: var(--st-ink);
345
+ }
346
+ .st-action:hover { border-color: var(--st-rule); background: var(--st-close); }
347
+ .st-resume__label,
348
+ .st-action__label { font-size: 17px; color: var(--st-ink); }
349
+ .st-resume__detail { font-size: 13px; color: var(--st-link); }
350
+ .st-action__detail { font-size: 13px; color: var(--st-ink-faint); }
351
+ .st-resume:focus-visible,
352
+ .st-action:focus-visible,
353
+ .st-hint:focus-visible,
354
+ .st-older:focus-visible { outline: 2px solid var(--st-accent); outline-offset: 3px; }
111
355
 
112
- /* The head: a mono eyebrow naming the mode, then the greeting as the display
113
- voice (Manrope light, tight), then the live count as a quiet sub-line. */
114
- .studio-head { margin-bottom: clamp(22px, 4vh, 40px); max-width: var(--measure); }
115
- .studio-eyebrow {
116
- margin: 0 0 10px;
117
- font-family: var(--font-mono);
356
+ /* The older reviews' door: a quiet line under the actions, not a fourth row. */
357
+ .st-older {
358
+ align-self: flex-start;
359
+ min-height: 24px;
360
+ margin-top: 6px;
361
+ padding: 0;
362
+ border: 0;
363
+ background: none;
364
+ cursor: pointer;
365
+ font-family: var(--st-mono);
366
+ font-size: 11px;
367
+ letter-spacing: .08em;
368
+ color: var(--st-ink-faint);
369
+ text-decoration: underline;
370
+ text-underline-offset: 3px;
371
+ }
372
+ .st-older:hover { color: var(--st-ink); }
373
+ .st-older[hidden] { display: none; }
374
+
375
+ /* ---------------------------------------------------------------------------
376
+ The small glass panel (the Tweak/CopyWrite Flow and Artist Review Status):
377
+ 580 wide over the room. Like the Approval queue's, the one thing that follows
378
+ the hall's theme is the scrim: the artboard's .42 over the dark room, .94
379
+ over the light hall (the panel's grey words fall under AA at .42 over a light
380
+ page), and .88 on a phone.
381
+ --------------------------------------------------------------------------- */
382
+ .st-overlay {
383
+ position: fixed;
384
+ inset: 0;
385
+ z-index: var(--z-modal, 160);
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ padding: 24px;
390
+ box-sizing: border-box;
391
+ background: var(--st-scrim);
392
+ color: var(--st-ink);
393
+ font-family: var(--st-face);
394
+ color-scheme: dark;
395
+ }
396
+ .st-overlay[hidden] { display: none; }
397
+ html[data-theme="dark"] body[data-page="studio"] { --st-scrim: rgba(4, 5, 9, .42); }
398
+ @media (prefers-color-scheme: dark) {
399
+ html:not([data-theme]) body[data-page="studio"] { --st-scrim: rgba(4, 5, 9, .42); }
400
+ }
401
+ html.st-open { overflow: hidden; }
402
+ .st-dialog {
403
+ width: min(580px, 100%);
404
+ max-height: 100%;
405
+ overflow-y: auto;
406
+ box-sizing: border-box;
407
+ padding: 34px 36px 32px;
408
+ border-radius: 30px;
409
+ background: var(--st-panel);
410
+ border: 1px solid var(--st-panel-edge);
411
+ backdrop-filter: blur(30px) saturate(160%);
412
+ -webkit-backdrop-filter: blur(30px) saturate(160%);
413
+ box-shadow: inset 0 1px 0 var(--st-panel-rim), 0 40px 90px var(--st-panel-drop);
414
+ display: flex;
415
+ flex-direction: column;
416
+ gap: 22px;
417
+ }
418
+ .st-overlay button { font-family: inherit; }
419
+ .st-overlay :focus-visible { outline: 2px solid var(--st-accent); outline-offset: 2px; }
420
+ .st-dialog__head { display: flex; align-items: center; gap: 12px; }
421
+ .st-dialog__title {
422
+ margin: 0;
423
+ font-family: var(--st-mono);
118
424
  font-size: 11px;
425
+ font-weight: 400;
119
426
  letter-spacing: .14em;
120
427
  text-transform: uppercase;
121
- color: var(--ink-faint);
428
+ color: var(--st-ink-soft);
122
429
  }
123
- .studio-greet {
124
- margin: 0 0 8px;
125
- font-weight: 300;
126
- font-size: clamp(28px, 4.4vw, 46px);
127
- line-height: 1.04;
128
- letter-spacing: -.028em;
430
+ .st-close {
431
+ margin-left: auto;
432
+ height: 44px;
433
+ padding: 0 16px;
434
+ border-radius: 999px;
435
+ cursor: pointer;
436
+ border: 0;
437
+ background: var(--st-close);
438
+ color: var(--st-ink);
439
+ font-size: 13px;
440
+ }
441
+ .st-dialog__body { display: flex; flex-direction: column; gap: 22px; }
442
+ .st-panel__line { margin: 0; font-size: 15px; line-height: 1.5; color: var(--st-ink-soft); }
443
+ .st-panel__err { margin: 0; font-size: 14px; line-height: 1.45; color: var(--st-danger); }
444
+ .st-panel__err[hidden] { display: none; }
445
+
446
+ /* The Tweak/CopyWrite Flow: the recommended page, take it, pick another. */
447
+ .st-next { display: flex; flex-direction: column; gap: 6px; }
448
+ .st-next__page { font-size: 40px; font-weight: 200; line-height: 1.15; letter-spacing: -.035em; color: var(--st-ink); overflow-wrap: anywhere; }
449
+ .st-next__why { font-size: 15px; color: var(--st-ink-soft); }
450
+ .st-next__acts { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
451
+ .st-take {
452
+ display: inline-flex;
453
+ align-items: center;
454
+ height: 48px;
455
+ padding: 0 26px;
456
+ border-radius: 999px;
457
+ border: 0;
458
+ cursor: pointer;
459
+ background: var(--st-accent);
460
+ color: var(--st-on-accent);
461
+ font-size: 15px;
462
+ }
463
+ .st-take:disabled { opacity: .6; cursor: default; }
464
+ .st-pick {
465
+ height: 44px;
466
+ padding: 0 6px;
467
+ cursor: pointer;
468
+ border: 0;
469
+ background: transparent;
470
+ color: var(--st-ink-faint);
471
+ font-size: 13.5px;
472
+ text-decoration: underline;
473
+ }
474
+ .st-picks { display: flex; flex-wrap: wrap; gap: 8px; }
475
+ .st-picks[hidden] { display: none; }
476
+ .st-chip {
477
+ min-height: 44px;
478
+ padding: 0 16px;
479
+ border-radius: 999px;
480
+ cursor: pointer;
481
+ background: var(--st-glass);
482
+ border: 1px solid var(--st-chip-edge);
483
+ color: var(--st-ink);
484
+ font-size: 13.5px;
485
+ text-align: left;
486
+ }
487
+
488
+ /* Artist Review Status: one line per surface, "N of M tweaked". */
489
+ .st-surfaces { display: flex; flex-direction: column; gap: 20px; margin: 0; padding: 0; list-style: none; }
490
+ .st-surface { display: flex; flex-direction: column; gap: 9px; }
491
+ .st-surface__head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
492
+ .st-surface__name { font-size: 20px; font-weight: 300; color: var(--st-ink); }
493
+ .st-surface__where { font-size: 13px; color: var(--st-ink-dim); }
494
+ .st-surface__count { margin-left: auto; font-size: 14px; color: var(--st-ink-soft); font-variant-numeric: tabular-nums; }
495
+ .st-surface__track { height: 4px; border-radius: 999px; background: var(--st-track); overflow: hidden; }
496
+ .st-surface__fill { height: 4px; border-radius: 999px; background: var(--st-accent); }
497
+ .st-asked { margin: 0; font-size: 14px; line-height: 1.5; color: var(--st-ink-faint); }
498
+
499
+ /* ---------------------------------------------------------------------------
500
+ The phone. The room keeps its night: the window shrinks to the top right
501
+ (scaled whole, so its moon and lights keep their places), the desk sits on a
502
+ floor at the bottom, and the words and actions take the width.
503
+ --------------------------------------------------------------------------- */
504
+ @media (max-width: 760px) {
505
+ .studio { padding: 20px 16px 140px; }
506
+ .st-top { gap: 12px; }
507
+ .st-tally {
508
+ margin-left: 0;
509
+ width: 100%;
510
+ height: auto;
511
+ min-height: 48px;
512
+ padding: 8px 16px;
513
+ gap: 10px;
514
+ justify-content: space-between;
515
+ }
516
+ .st-tally__item { flex-direction: column; align-items: flex-start; gap: 0; }
517
+ .st-tally__n { font-size: 18px; }
518
+ .st-tally__label { font-size: 12px; }
519
+ .st-window {
520
+ left: auto;
521
+ right: 16px;
522
+ top: 96px;
523
+ transform: scale(.36);
524
+ transform-origin: top right;
525
+ opacity: .9;
526
+ }
527
+ .st-words { margin-top: 110px; min-height: 0; gap: 14px; }
528
+ .st-greet { font-size: 44px; }
529
+ .st-sub { font-size: 17px; }
530
+ .st-actions { margin-top: 36px; width: 100%; }
531
+ .st-floor { top: auto; bottom: 0; min-height: 0; height: 96px; }
532
+ .st-glow { left: auto; right: -110px; top: auto; bottom: -20px; }
533
+ .st-lamp-stem { left: auto; right: 44px; top: auto; bottom: 96px; height: 100px; }
534
+ .st-lamp-shade { left: auto; right: 0; top: auto; bottom: 170px; }
535
+ .st-mug { left: auto; right: 116px; top: auto; bottom: 96px; }
536
+ .st-leaf--1 { left: auto; right: 190px; top: auto; bottom: 96px; }
537
+ .st-leaf--2 { left: auto; right: 164px; top: auto; bottom: 96px; }
538
+ .st-overlay { padding: 8px; }
539
+ body[data-page="studio"] .st-overlay { --st-scrim: rgba(4, 5, 9, .88); }
540
+ .st-dialog { padding: 24px 20px; border-radius: 24px; }
541
+ .st-next__page { font-size: 32px; }
542
+ }
543
+ @media (max-width: 360px) {
544
+ .st-tally__n { font-size: 16px; }
545
+ .st-tally__label { font-size: 11px; }
546
+ .st-greet { font-size: 38px; }
547
+ }
548
+
549
+ /* ===========================================================================
550
+ The older reviews (R06 of goal 1000074, task 1003117; retired in TW14,
551
+ task 1004325). One piece at a time, a stone to tend, in the hall's own
552
+ tokens, in a dialog that opens from the quiet door above.
553
+ =========================================================================== */
554
+ .st-reviews {
555
+ position: fixed;
556
+ inset: 0;
557
+ z-index: var(--z-modal, 160);
558
+ display: flex;
559
+ align-items: center;
560
+ justify-content: center;
561
+ padding: 24px;
562
+ box-sizing: border-box;
563
+ background: var(--scrim);
129
564
  color: var(--ink);
565
+ font-family: var(--font-body);
130
566
  }
131
- .studio-sub {
567
+ .st-reviews[hidden] { display: none; }
568
+ .st-reviews__dialog {
569
+ width: min(780px, 100%);
570
+ max-height: 100%;
571
+ overflow-y: auto;
572
+ box-sizing: border-box;
573
+ padding: clamp(18px, 3vw, 28px);
574
+ border-radius: var(--radius);
575
+ background: var(--bg);
576
+ }
577
+ .st-reviews__head { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
578
+ .st-reviews__head .btn-ghost { margin-left: auto; }
579
+ .st-reviews__title {
132
580
  margin: 0;
133
- font-size: 15.5px;
134
- line-height: 1.5;
135
- color: var(--ink-soft);
581
+ font-weight: 300;
582
+ font-size: clamp(20px, 2.6vw, 24px);
583
+ letter-spacing: -.02em;
584
+ color: var(--ink);
136
585
  }
586
+ .st-reviews__sub { margin: 0 0 18px; font-size: 14px; line-height: 1.5; color: var(--ink-soft); max-width: var(--measure); }
137
587
 
138
- /* The focus — the one thing to tend now. Tone separates it from the room (the
139
- v3 hall rule: a --bg-card panel at the full radius, no drawn edge), and it is
140
- held to a reading width so it stays a card and not a banner. */
588
+ /* The focus — the one thing to tend now. Tone separates it (the v3 hall rule:
589
+ a --bg-card panel at the full radius, no drawn edge). */
141
590
  .studio-focus {
142
- max-width: 720px;
143
591
  background: var(--bg-card);
144
592
  border-radius: var(--radius);
145
- padding: clamp(22px, 3.2vw, 34px);
593
+ padding: clamp(18px, 3vw, 30px);
146
594
  }
147
595
  .studio-card__eyebrow {
148
596
  margin: 0 0 14px;
@@ -161,8 +609,7 @@
161
609
  color: var(--ink);
162
610
  }
163
611
  /* The product's own words, shown as evidence for a flag — mono, wrapping
164
- preserved (leading/trailing space is often exactly what is wrong), in a soft
165
- tonal well so the quote reads as quotation, not as this room's own voice. */
612
+ preserved, in a soft tonal well so the quote reads as quotation. */
166
613
  .studio-card__quote {
167
614
  display: block;
168
615
  margin: 0 0 16px;
@@ -185,20 +632,7 @@
185
632
  }
186
633
 
187
634
  /* THE PLATE — the reviewed work's ship-time visual (task 1003829). The picture
188
- IS the card: an artist is being asked to LOOK at something, so it is given the
189
- card's full width and as much height as a screen can spare, not the 44px
190
- thumbnail a ship feed uses. Markup comes from the kit's one renderer
191
- (OTBVisual.taskVisualFigureHtml); only the size is this room's decision.
192
-
193
- max-height in vh, and MEASURED at 1440x900 rather than chosen. The size an
194
- artist can judge it at wins over a zero-scroll card — that is the task's own
195
- priority — so this is not tuned to fit the verdict on the first screen; the
196
- room's head alone is ~300px and no judgeable plate fits under it. What 40vh
197
- buys is that the picture AND its caption are wholly in view together (plate
198
- 459-819, caption 827-865), with the weights one short scroll below (946). At
199
- 58vh the caption fell off too, which is worse: a plate you cannot read the
200
- subject of. The tonal well behind it is --glass, so a transparent PNG has
201
- something to sit on in both modes. */
635
+ IS the card; markup comes from the kit's one renderer. */
202
636
  .studio-plate { margin: 0 0 18px; }
203
637
  .studio-plate__img {
204
638
  display: block;
@@ -209,9 +643,6 @@
209
643
  border-radius: var(--radius-sm);
210
644
  background: var(--glass);
211
645
  }
212
- /* The shipper's own words about the picture, in the caption voice — drawn only
213
- when they wrote some (the kit omits the element otherwise, never a caption
214
- that reads "Visual for task 1899"). */
215
646
  .studio-plate__caption {
216
647
  margin: 8px 0 0;
217
648
  font-size: 12.5px;
@@ -220,9 +651,7 @@
220
651
  max-width: var(--measure);
221
652
  }
222
653
 
223
- /* The two steps of a review (R04): coach the grader, then remake or tweak. Not
224
- a checklist widget — a gentle reminder of the shape of the work, so the room
225
- describes the craft without becoming the form the criterion warns against. */
654
+ /* The two steps of a review (R04): coach the grader, then remake or tweak. */
226
655
  .studio-steps {
227
656
  list-style: none;
228
657
  margin: 0 0 20px;
@@ -253,10 +682,7 @@
253
682
  color: var(--ink-faint);
254
683
  }
255
684
 
256
- /* THE VERDICT — the artist's answer, said here rather than somewhere else
257
- (task 1003829). A tonal well separates it from the card's prose without a
258
- drawn edge (the v3 hall rule), and it sits ABOVE the actions so the reader
259
- meets "what did you think" before "open this" / "let it be". */
685
+ /* THE VERDICT — the artist's answer, said here (task 1003829). */
260
686
  .studio-verdict {
261
687
  margin: 0 0 20px;
262
688
  padding: 16px;
@@ -272,8 +698,6 @@
272
698
  text-transform: var(--label-case);
273
699
  color: var(--ink-soft);
274
700
  }
275
- /* The clarifier rides inside the label (so clicking it still focuses the field)
276
- but drops out of the label voice — caps are for the label, not a sentence. */
277
701
  .studio-verdict__label small {
278
702
  font-family: var(--font-body);
279
703
  font-size: 12.5px;
@@ -288,27 +712,18 @@
288
712
  font-size: 14.5px;
289
713
  line-height: 1.5;
290
714
  }
291
- /* The inline error, beside the control that caused it and gone the moment the
292
- field is edited. --danger is the platform's measured status red; the room
293
- spends no other colour. */
294
715
  .studio-verdict__err {
295
716
  margin: 8px 0 0;
296
717
  font-size: 13px;
297
718
  line-height: 1.45;
298
719
  color: var(--danger);
299
720
  }
300
- /* Three equal answers on one line, wrapping to a column on a phone rather than
301
- squeezing. The 24px control floor is the shell's (.btn-ghost); the gap keeps
302
- them from reading as a segmented control, which would imply one is selected. */
303
721
  .studio-verdict__weights {
304
722
  margin-top: 12px;
305
723
  display: flex;
306
724
  flex-wrap: wrap;
307
725
  gap: 10px;
308
726
  }
309
- /* What a viewer below the routes' floor sees instead of three buttons it would
310
- refuse: a sentence naming where the verdict is recorded. Quiet, not a warning
311
- — this is not an error, it is a different door. */
312
727
  .studio-verdict__sealed {
313
728
  margin: 0 0 20px;
314
729
  padding: 14px 16px;
@@ -319,9 +734,6 @@
319
734
  color: var(--ink-soft);
320
735
  max-width: var(--measure);
321
736
  }
322
-
323
- /* The one place the accent is spent on a control. Ghost is the calm pass —
324
- "let it be for now" advances to the next piece without changing anything. */
325
737
  .studio-card__actions {
326
738
  display: flex;
327
739
  flex-wrap: wrap;
@@ -329,17 +741,15 @@
329
741
  align-items: center;
330
742
  }
331
743
 
332
- /* What else waits — a gentle line and a row of stones, one per remaining piece
333
- (the zen garden), never a table. Non-interactive on purpose: the room asks the
334
- reader to tend one thing, not to scan a queue. */
744
+ /* What else waits — a gentle line and a row of stones, never a table. */
335
745
  .studio-rest {
336
- margin-top: clamp(20px, 3.5vh, 34px);
337
- max-width: 720px;
746
+ margin-top: 18px;
338
747
  display: flex;
339
748
  flex-wrap: wrap;
340
749
  align-items: center;
341
750
  gap: 14px;
342
751
  }
752
+ .studio-rest[hidden] { display: none; }
343
753
  .studio-rest__line {
344
754
  margin: 0;
345
755
  font-size: 13.5px;
@@ -358,27 +768,17 @@
358
768
  background: var(--ink-faint);
359
769
  }
360
770
 
361
- /* Where the full queues live — the calm room is the front door; the tables it
362
- replaces stay one link away for when the reader wants the whole list. */
771
+ /* Where the full queues live, one link away. */
363
772
  .studio-links {
364
- position: relative;
365
- z-index: 1;
366
- margin-top: clamp(26px, 4vh, 44px);
367
- padding-top: 18px;
773
+ margin-top: 22px;
774
+ padding-top: 16px;
368
775
  border-top: 1px solid var(--rule-soft);
369
776
  display: flex;
370
777
  flex-wrap: wrap;
371
778
  gap: 8px 22px;
372
- max-width: 720px;
373
779
  font-size: 13.5px;
374
780
  color: var(--ink-faint);
375
781
  }
376
- /* The 24px control floor, which these two links were failing at every width and
377
- in both modes (the kit's controls-24px audit: 229x21 and 154x21). A link IS a
378
- control, and the floor is "clears 24px on both sides" — so they get the height
379
- here rather than staying the one failing pair on an otherwise clean surface.
380
- inline-flex + align-items keeps the text where it sits today; only the hit
381
- area grows. */
382
782
  .studio-links a {
383
783
  color: var(--accent-ink);
384
784
  display: inline-flex;
@@ -386,13 +786,7 @@
386
786
  min-height: 24px;
387
787
  }
388
788
 
389
- /* The empty room — a good sign, said plainly, not a dead panel. */
390
- .studio-empty {
391
- max-width: 720px;
392
- background: var(--bg-card);
393
- border-radius: var(--radius);
394
- padding: clamp(24px, 3.4vw, 36px);
395
- }
789
+ /* The empty garden — a good sign, said plainly. */
396
790
  .studio-empty h2 {
397
791
  margin: 0 0 8px;
398
792
  font-weight: 300;
@@ -408,14 +802,9 @@
408
802
  max-width: var(--measure);
409
803
  }
410
804
 
411
- /* Phone: the room keeps its air but the head and cards take the full width. */
412
805
  @media (max-width: 640px) {
413
- .studio { padding-top: 20px; }
806
+ .st-reviews { padding: 8px; }
414
807
  .studio-card__actions { gap: 8px; }
415
- /* The plate takes less of a phone's height so the verdict is still reachable
416
- without a scroll past the picture. */
417
808
  .studio-plate__img { max-height: 34vh; }
418
- /* Full-width weights, stacked: three buttons side by side at 320px would each
419
- fall under the 24px-clearance floor. */
420
809
  .studio-verdict__weights { flex-direction: column; align-items: stretch; }
421
810
  }