@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.
- package/.bongos-core.json +50 -30
- package/docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md +2 -0
- package/docs/copy-inventory.md +64 -43
- package/docs/copy-registry.json +288 -79
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-inventory.json +10 -2
- package/docs/page-readings.json +74 -50
- package/modules/hall-ui/public/studio-lib.js +207 -0
- package/modules/hall-ui/public/studio.css +559 -170
- package/modules/hall-ui/public/studio.html +142 -48
- package/modules/hall-ui/public/studio.js +452 -40
- package/modules/hall-ui/public/studio.states.json +164 -4
- package/modules/hall-ui/records/studio.md +47 -0
- package/modules/lifecycle/cascade.js +48 -96
- package/modules/lifecycle/routes/lifecycle.js +9 -9
- package/modules/lifecycle/tests/cascade.mjs +106 -160
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/scripts/hall-preview/server.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/grader_reader_lens.mjs +16 -24
- package/tests/hall_audit.mjs +4 -0
- package/tests/hall_studio_home.mjs +429 -0
- package/tests/hall_studio_world.mjs +7 -1
- package/tests/removal_verdict.mjs +5 -2
- package/tests/tweak_replaces_artist_review.mjs +170 -0
|
@@ -1,148 +1,596 @@
|
|
|
1
|
-
/* modules/hall-ui/public/studio.css — the
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
/*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
.
|
|
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
|
-
.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
width:
|
|
46
|
-
|
|
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:
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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(--
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
/*
|
|
75
|
-
|
|
76
|
-
.
|
|
77
|
-
|
|
78
|
-
.
|
|
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
|
|
81
|
-
|
|
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
|
-
|
|
315
|
+
display: flex;
|
|
316
|
+
flex-direction: column;
|
|
317
|
+
gap: 12px;
|
|
90
318
|
}
|
|
91
|
-
.
|
|
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:
|
|
327
|
+
padding: 10px 24px;
|
|
99
328
|
box-sizing: border-box;
|
|
100
329
|
border-radius: 22px;
|
|
101
|
-
cursor: pointer;
|
|
102
330
|
text-align: left;
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
.
|
|
109
|
-
|
|
110
|
-
|
|
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
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
margin:
|
|
117
|
-
|
|
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-
|
|
428
|
+
color: var(--st-ink-soft);
|
|
122
429
|
}
|
|
123
|
-
.
|
|
124
|
-
margin:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
.
|
|
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-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
|
139
|
-
|
|
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(
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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,
|
|
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:
|
|
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
|
|
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
|
-
|
|
365
|
-
|
|
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
|
|
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
|
-
.
|
|
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
|
}
|