@atelic-action/ui 1.1.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,19 +1,18 @@
1
- /* The artifact documents under src/artifact: the writeup, the monthly page,
2
- the sealed document stage, and the grade chip and sign off the first two
3
- share. Moved whole from the artifact template, in the order its build
4
- bundled them (the shared classes, the stage, the monthly page, the
5
- writeup), which the two @page rules depend on: the later one wins, and
6
- the writeup's is the later one. The note and the read follow the writeup
7
- and set no @page, so the writeup's stays the one that wins. They sit in the package's layer like
8
- every sheet here, so any rule a site writes outside a layer still wins
9
- over them whatever its specificity. */
1
+ /* The pieces the artifact documents are built from, under src/artifact: the
2
+ grade chip, the sign off, the shot, and the shell's logo and print rules. The
3
+ composed documents (the writeup, the read, the monthly page, the note,
4
+ and the sealed document stage) and their sheet, with both @page rules,
5
+ live in @atelic-action/artifact (its styles/documents.css), which a site
6
+ imports after this one. This sheet sets no @page. Every rule sits in the
7
+ package's layer like every sheet here, so any rule a site writes outside
8
+ a layer still wins over it whatever its specificity. */
10
9
  @layer atelic-ui {
11
10
  /* =================================================================
12
- SHARED: the vocabulary the writeup and the monthly page both wear,
13
- the grade chip (GradeChip) and the sign off lockup (SignOff). A class
14
- used by more than one route's components lives in the base sheet
15
- chain rather than in a component's stylesheet, so it can never vanish
16
- from a page that does not import the component that defined it.
11
+ SHARED: the vocabulary every document wears, the grade chip
12
+ (GradeChip), the sign off lockup (SignOff), and the shot (Shot). A
13
+ class used by more than one document lives in the base sheet chain
14
+ rather than in a component's stylesheet, so it can never vanish from
15
+ a page that does not import the component that defined it.
17
16
 
18
17
  Tokens only, with one deliberate literal set: the four grade colors.
19
18
  ================================================================= */
@@ -36,8 +35,8 @@
36
35
  min-width: 1.6em;
37
36
  text-align: center;
38
37
  }
39
- /* The four grade colors are the second deliberate literal set after the
40
- printed sheet's white: a grade reads green, yellow, orange, red
38
+ /* The four grade colors are a deliberate literal set: a grade reads
39
+ green, yellow, orange, red
41
40
  everywhere, whatever the brand's palette, so they are not theme tokens.
42
41
  The orange sits between the yellow's hue and the red's so the four stay
43
42
  apart on paper, and its letter clears AA on its own tint. */
@@ -117,2465 +116,56 @@
117
116
  display: none;
118
117
  }
119
118
 
120
- /* The sealed document stage: the Gate component (Gate.tsx). The sign in
121
- screen and the watermark it shares a vocabulary with live in
122
- styles/gate.css. */
123
-
124
- /* =================================================================
125
- THE SEALED DOCUMENT STAGE: the Gate component (Gate.tsx).
126
- A dark stage derived from the semantic tokens, so a client's
127
- theme.css recolors it. The gate card reuses the login
128
- screen's vocabulary above (eyebrow, headline, lead, form, input,
129
- error); this section only stages it dark and adds the document
130
- classes the decrypted HTML is written against.
131
- ================================================================= */
132
- .atelic-ui .gate-stage {
133
- --gs-stage: var(--surface-dark);
134
- --gs-bright: color-mix(in srgb, var(--surface) 96%, white);
135
- --gs-dim: color-mix(in srgb, var(--surface) 62%, var(--surface-dark));
136
- --gs-faint: color-mix(in srgb, var(--surface) 40%, var(--surface-dark));
137
- --gs-panel: color-mix(in srgb, var(--surface-dark) 88%, var(--surface));
138
- --gs-border: color-mix(in srgb, var(--surface-dark) 72%, var(--surface));
139
- --gs-hairline: color-mix(in srgb, var(--surface) 10%, transparent);
140
-
141
- /* The navbar is fixed, so it adds no document height: a stage sized
142
- 100svh minus the nav plus a credit bar shorter than the nav leaves
143
- the document shorter than the viewport, and the body's light
144
- background shows beneath the credit bar. The stage therefore owns
145
- the full viewport and clears the nav itself, painting dark edge to
146
- edge behind the bar. */
147
- min-height: 100svh;
148
- padding-top: var(--nav-height);
149
- background: var(--gs-stage);
150
- color: var(--gs-bright);
151
- }
152
-
153
- /* Overscroll and any sub-viewport rounding still expose the page body at
154
- the edges; a page carrying the stage paints its whole shell dark. */
155
- .atelic-ui:has(.gate-stage) {
156
- background: var(--surface-dark);
157
- }
158
-
159
- /* ---- the gate card, staged dark ---- */
160
- .atelic-ui .gate-hall {
161
- display: grid;
162
- place-items: center;
163
- min-height: calc(100svh - var(--nav-height));
164
- padding-block: clamp(48px, 9vh, 96px);
165
- }
166
- .atelic-ui .gate-card {
167
- width: 100%;
168
- max-width: 520px;
169
- margin-inline: auto;
170
- padding: clamp(28px, 5vw, 44px);
171
- border: 1px solid var(--gs-border);
172
- border-radius: var(--radius-lg);
173
- background: var(--gs-panel);
174
- text-align: center;
175
- }
176
- .atelic-ui .gate-stage .gate-eyebrow {
177
- margin: 0 0 12px;
178
- font-size: 12.5px;
179
- letter-spacing: 0.02em;
180
- color: var(--gs-faint);
181
- }
182
- .atelic-ui .gate-stage .gate-headline {
183
- margin: 0 0 12px;
184
- font-family: var(--font-sans);
185
- font-weight: 800;
186
- letter-spacing: -0.015em;
187
- font-size: clamp(26px, 3.4vw, 34px);
188
- line-height: 1.12;
189
- max-width: none;
190
- color: var(--gs-bright);
191
- }
192
- .atelic-ui .gate-stage .gate-lead {
193
- margin: 0 auto 26px;
194
- max-width: 42ch;
195
- font-size: 15px;
196
- line-height: 1.6;
197
- color: var(--gs-dim);
198
- }
199
- .atelic-ui .gate-stage .gate-input {
200
- border-color: var(--gs-border);
201
- background: color-mix(in srgb, var(--surface-dark) 94%, var(--surface));
202
- color: var(--gs-bright);
203
- }
204
- .atelic-ui .gate-stage .gate-input::placeholder {
205
- color: var(--gs-faint);
206
- }
207
- .atelic-ui .gate-stage .gate-input:focus-visible {
208
- border-color: var(--primary-bright);
209
- box-shadow: 0 0 0 3px var(--primary-focus-ring);
210
- }
211
- .atelic-ui .gate-stage .gate-error {
212
- margin: 20px auto 0;
213
- max-width: 46ch;
214
- font-size: 14.5px;
215
- line-height: 1.55;
216
- color: var(--gs-dim);
217
- background: none;
218
- border: none;
219
- padding: 0;
220
- }
221
-
222
- /* ---- the document ----
223
- Everything below styles HTML the content module authors, so the
224
- selectors are element level inside .gate-content rather than a class
225
- per line. A client document writes plain markup and inherits this. */
226
- .atelic-ui .gate-doc {
227
- /* The stage itself clears the fixed nav, so the document pads only
228
- its own breathing room. */
229
- padding-block: clamp(44px, 8vh, 88px) clamp(64px, 12vh, 132px);
230
- }
231
- .atelic-ui .gate-content {
232
- /* The document column matches the chrome: .wrap and .nav-inner share
233
- --max-width, so the text aligns with the header bar's edges rather
234
- than sitting in a narrower centered measure. */
235
- color: var(--gs-dim);
236
- font-size: 16.5px;
237
- line-height: 1.7;
238
- }
239
- .atelic-ui .gate-content h1 {
240
- margin: 0 0 10px;
241
- font-size: clamp(30px, 4.4vw, 46px);
242
- line-height: 1.06;
243
- color: var(--gs-bright);
244
- text-wrap: balance;
245
- }
246
- .atelic-ui .gate-content h2 {
247
- margin: 52px 0 14px;
248
- font-size: clamp(21px, 2.6vw, 27px);
249
- line-height: 1.2;
250
- color: var(--gs-bright);
251
- }
252
- .atelic-ui .gate-content h3 {
253
- margin: 28px 0 8px;
254
- font-size: 17px;
255
- color: var(--gs-bright);
256
- }
257
- .atelic-ui .gate-content p {
258
- margin: 0 0 16px;
259
- text-wrap: pretty;
260
- }
261
- .atelic-ui .gate-content ul {
262
- margin: 0 0 16px;
263
- padding-left: 22px;
264
- display: flex;
265
- flex-direction: column;
266
- gap: 8px;
267
- list-style: disc;
268
- }
269
- .atelic-ui .gate-content li {
270
- display: list-item;
271
- list-style: disc;
272
- margin: 0;
273
- }
274
- .atelic-ui .gate-content li::marker {
275
- color: var(--primary-bright);
276
- }
277
- .atelic-ui .gate-content strong {
278
- color: var(--gs-bright);
279
- font-weight: 600;
280
- }
281
- .atelic-ui .gate-content a {
282
- color: var(--primary-bright);
283
- text-decoration: none;
284
- border-bottom: 1px solid currentColor;
285
- }
286
- .atelic-ui .gate-content hr {
287
- margin: 44px 0;
288
- border: 0;
289
- border-top: 1px solid var(--gs-hairline);
290
- }
291
- .atelic-ui .gate-meta {
292
- margin: 0 0 34px;
293
- font-family: var(--font-mono);
294
- font-size: 12.5px;
295
- color: var(--gs-faint);
296
- }
297
- .atelic-ui .gate-lede {
298
- font-size: 18px;
299
- color: var(--gs-bright);
300
- }
301
-
302
- /* Tier cards: the shape of a three option quote. Faded panels on the
303
- stage, one hairline lifted to mark the recommended option; no filled
304
- color anywhere, so the CTA button stays the only saturated thing. */
305
- .atelic-ui .gate-tiers {
306
- display: grid;
307
- /* Three explicit columns: auto-fit minted a fourth empty track at
308
- document width and squeezed the cards into three quarters of the
309
- row. A proposal's tier row is three builds wide by design. */
310
- grid-template-columns: repeat(3, minmax(0, 1fr));
311
- gap: 16px;
312
- margin: 24px 0 8px;
313
- }
314
- @media (max-width: 860px) {
315
- .atelic-ui .gate-tiers {
316
- grid-template-columns: 1fr;
317
- }
318
- }
319
- .atelic-ui .gate-tier {
119
+ /* ---- the shot: the owner's own screen over its caption ----
120
+ It reads the writeup's own two tokens (--op-card, --op-ink-faint), which
121
+ a document maps on its root, and falls back to the theme's when it sits
122
+ outside one. A document sizes it and lays shots out in its own sheet. */
123
+ .atelic-ui .op-shot {
320
124
  display: flex;
321
125
  flex-direction: column;
322
126
  gap: 6px;
323
- padding: 22px;
324
- border: 1px solid var(--gs-border);
325
- border-radius: var(--radius-lg);
326
- background: var(--gs-panel);
327
- min-width: 0;
328
- }
329
- .atelic-ui .gate-tier.is-picked {
330
- border-color: color-mix(in srgb, var(--primary-bright) 55%, transparent);
331
- }
332
- .atelic-ui .gate-tier-name {
333
- font-weight: 600;
334
- font-size: 17px;
335
- color: var(--gs-bright);
336
- }
337
- .atelic-ui .gate-tier-price {
338
- font-family: var(--font-mono);
339
- font-size: 21px;
340
- color: var(--primary-bright);
341
- }
342
- .atelic-ui .gate-tier-note {
343
- font-size: 14px;
344
- line-height: 1.55;
345
- color: var(--gs-dim);
346
- }
347
-
348
- /* Trade arithmetic on a card: a sum column sitting on the card's left,
349
- digits right-aligned against each other the way a hand total lines
350
- up, with any annotation (the credit's label) to the right of its
351
- figure. Markup:
352
-
353
- <div class="gate-tier-math">
354
- <span class="gate-tier-was">$7,400</span>
355
- <span class="gate-tier-credit">&minus; $3,660</span>
356
- <span class="gate-tier-mathlabel">install credit</span>
357
- <span class="gate-tier-price">$3,740</span>
358
- </div>
359
-
360
- Amounts take grid column one (right-aligned, shared right edge);
361
- labels take column two. A bare .gate-tier-price outside the math
362
- block (the add-on card) keeps its standalone look. */
363
- .atelic-ui .gate-tier-math {
364
- display: grid;
365
- grid-template-columns: max-content auto;
366
- column-gap: 10px;
367
- row-gap: 2px;
368
- align-items: baseline;
369
- justify-content: start;
370
- }
371
- .atelic-ui .gate-tier-math .gate-tier-was,
372
- .atelic-ui .gate-tier-math .gate-tier-credit,
373
- .atelic-ui .gate-tier-math .gate-tier-price {
374
- grid-column: 1;
375
- text-align: right;
376
- }
377
- /* The label never wraps, so a mark inside it (the asterisk that points
378
- at the footnote under the tiers) stays on the label's line:
379
- <span class="gate-tier-mathlabel">founding member credit<svg>...</svg></span> */
380
- .atelic-ui .gate-tier-mathlabel {
381
- grid-column: 2;
382
- font-size: 13px;
383
- color: var(--gs-faint);
384
- white-space: nowrap;
385
- }
386
- .atelic-ui .gate-tier-mathlabel svg {
387
- display: inline-block;
388
- width: 11px;
389
- height: 11px;
390
- vertical-align: -1px;
391
- margin-left: 2px;
392
- color: var(--primary-bright);
393
- }
394
- .atelic-ui .gate-tier-was {
395
- font-family: var(--font-mono);
396
- font-size: 15px;
397
- color: var(--gs-faint);
398
- text-decoration: line-through;
399
- }
400
- .atelic-ui .gate-tier-credit {
401
- font-family: var(--font-mono);
402
- font-size: 14px;
403
- color: var(--gs-dim);
404
- }
405
-
406
- /* A full width card in the tier grid, for an add-on (a monthly service
407
- under one-time builds) that applies across every column. */
408
- .atelic-ui .gate-tiers .gate-tier.is-addon {
409
- grid-column: 1 / -1;
410
- }
411
-
412
- /* The add-ons row: two monthly cards (Operate, Operate with Paid) side
413
- by side under the builds, instead of each full width. The row spans
414
- the tier grid; the cards inside it sit in its own two columns, and
415
- stack with the tiers on a phone.
416
- <div class="gate-addons">
417
- <div class="gate-tier is-addon">...</div>
418
- <div class="gate-tier is-addon is-picked">...</div>
419
- </div> */
420
- .atelic-ui .gate-tiers .gate-addons {
421
- grid-column: 1 / -1;
422
- display: grid;
423
- grid-template-columns: repeat(2, minmax(0, 1fr));
424
- gap: 16px;
425
- }
426
- .atelic-ui .gate-tiers .gate-addons .gate-tier.is-addon {
427
- grid-column: auto;
428
- }
429
- @media (max-width: 860px) {
430
- .atelic-ui .gate-tiers .gate-addons {
431
- grid-template-columns: 1fr;
432
- }
433
- }
434
-
435
- /* The footnote under the tiers: a credit's terms in one line, led by
436
- the same mark the card's label carries.
437
- <p class="gate-footnote"><svg>...</svg><span>...</span></p> */
438
- .atelic-ui .gate-content .gate-footnote {
439
- display: flex;
440
- gap: 8px;
441
- align-items: flex-start;
442
- margin: 14px 0 0;
443
- font-size: 14px;
444
- line-height: 1.5;
445
- color: var(--gs-dim);
446
- }
447
- .atelic-ui .gate-content .gate-footnote svg {
448
- width: 14px;
449
- height: 14px;
450
- flex: 0 0 auto;
451
- margin-top: 3px;
452
- color: var(--primary-bright);
453
- }
454
-
455
- /* The icon list: the standard sent artifact list form, each line led
456
- by a small lucide icon that says what the line means. The sealed
457
- content inlines the SVGs. */
458
- .atelic-ui .gate-content ul.icon-list {
459
- list-style: none;
460
- margin: 0 0 16px;
461
- padding: 0;
462
- display: flex;
463
- flex-direction: column;
464
- gap: 12px;
465
- }
466
- .atelic-ui .gate-content ul.icon-list li {
467
- display: flex;
468
- align-items: flex-start;
469
- gap: 12px;
470
- margin: 0;
471
- list-style: none;
472
- }
473
- .atelic-ui .gate-content ul.icon-list svg {
474
- width: 18px;
475
- height: 18px;
476
- flex: 0 0 auto;
477
- margin-top: 3px;
478
- color: var(--primary-bright);
479
- }
480
- /* The icon list inside a tier card, sized for the card: a tier lists
481
- what it buys with icons that mean the thing, never checks. These tie
482
- the document list's selectors, so they sit after them. */
483
- .atelic-ui .gate-tier ul.icon-list {
484
- margin: 6px 0 0;
485
- gap: 8px;
486
- font-size: 14px;
487
- line-height: 1.5;
488
- color: var(--gs-dim);
489
- }
490
- .atelic-ui .gate-tier ul.icon-list svg {
491
- width: 16px;
492
- height: 16px;
493
- margin-top: 2px;
494
- }
495
-
496
- /* Numbered flow: the ordered list for a step-by-step close. */
497
- .atelic-ui .gate-content ol {
498
- margin: 0 0 16px;
499
- padding-left: 24px;
500
- display: flex;
501
- flex-direction: column;
502
- gap: 10px;
503
- }
504
- .atelic-ui .gate-content ol li {
505
- display: list-item;
506
- list-style: decimal;
507
127
  margin: 0;
508
128
  }
509
- .atelic-ui .gate-content ol li::marker {
510
- color: var(--primary-bright);
511
- font-weight: 700;
512
- }
513
-
514
- /* Icon bullets: a checklist variant of the document list, worn by any
515
- ul.gate-checks in the sealed content or inside a tier card. */
516
- .atelic-ui .gate-content ul.gate-checks {
517
- list-style: none;
518
- padding-left: 0;
519
- }
520
- .atelic-ui .gate-content .gate-checks li {
521
- position: relative;
522
- list-style: none;
523
- padding-left: 26px;
524
- }
525
- .atelic-ui .gate-content .gate-checks li::before {
526
- /* The lucide check, masked so it takes the accent color. A glyph
527
- character would trip the icons-over-emojis test; an SVG matches
528
- the icon set the rest of the site draws from. */
529
- content: "";
530
- position: absolute;
531
- left: 0;
532
- top: 0.28em;
533
- width: 14px;
534
- height: 14px;
535
- background-color: var(--primary-bright);
536
- -webkit-mask:
537
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
538
- center / contain no-repeat;
539
- mask:
540
- url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E")
541
- center / contain no-repeat;
542
- }
543
- .atelic-ui .gate-tier ul.gate-checks {
544
- margin: 6px 0 0;
545
- display: grid;
546
- gap: 8px;
547
- font-size: 14px;
548
- line-height: 1.5;
549
- color: var(--gs-dim);
550
- }
551
- .atelic-ui .gate-tier .gate-checks li {
552
- padding-left: 22px;
553
- }
554
-
555
- /* ---- the close: sign off, then the person lockup ---- */
556
- .atelic-ui .gate-sign {
557
- margin: 44px 0 18px;
558
- /* The pitch surface sign off is the script face (voice.md rule 9),
559
- the same face the writeup and the monthly page close on, centered
560
- on the dark stage. */
561
- font-family: var(--font-script);
562
- font-size: clamp(38px, 5.5vw, 56px);
563
- color: var(--secondary-soft);
564
- text-align: center;
565
- }
566
- .atelic-ui .gate-person {
567
- display: flex;
568
- align-items: center;
569
- justify-content: center;
570
- gap: 18px;
571
- text-align: left;
572
- }
573
- .atelic-ui .gate-person img {
574
- width: 88px;
575
- height: 88px;
576
- border-radius: 50%;
577
- object-fit: cover;
578
- display: block;
579
- flex: none;
580
- }
581
- .atelic-ui .gate-person-name {
582
- display: block;
583
- font-weight: 600;
584
- font-size: 17px;
585
- color: var(--gs-bright);
586
- }
587
- .atelic-ui .gate-person-role {
129
+ .atelic-ui .op-shot a,
130
+ .atelic-ui .op-shot-frame {
588
131
  display: block;
589
- margin-top: 4px;
590
- font-size: 14px;
591
- color: var(--gs-dim);
592
- }
593
- .atelic-ui .gate-person-role a {
594
- color: inherit;
595
- border-bottom: 1px solid currentColor;
596
- }
597
- .atelic-ui .gate-person-mail {
598
- display: inline-flex;
599
- align-items: center;
600
- gap: 7px;
601
- margin-top: 8px;
602
- font-size: 14px;
603
- font-weight: 500;
604
- letter-spacing: 0.02em;
605
- color: var(--primary-bright);
606
- border-bottom: 1px solid currentColor;
607
- padding-bottom: 1px;
608
- }
609
- .atelic-ui .gate-person-mail svg {
610
- width: 15px;
611
- height: 15px;
612
- }
613
-
614
- /* =================================================================
615
- THE MONTHLY PAGE: one letter sheet and its hosted twin. Three
616
- renderings of one DOM, the same as the writeup's:
617
-
618
- - Screen (wide): the sheet at letter width on the surface, under the
619
- artifact shell's dark header.
620
- - Column (under 900px): the same sheet at phone type sizes; the leads
621
- run two across and each grade row folds into a labeled block.
622
- - Print: exactly one letter sheet, zero page margin, the header and
623
- the credit band dropped. Content that misses the sheet is clipped,
624
- never reflowed, so a print of one sheet is the check.
625
-
626
- Tokens only (theme.css), except the printed sheet's white. The grade
627
- chip and the sign off are the shared classes at the head of this sheet.
628
- ================================================================= */
629
- .atelic-ui .rp {
630
- --rp-ink: var(--ink);
631
- --rp-ink-soft: var(--ink-soft);
632
- --rp-ink-faint: var(--neutral-500);
633
- --rp-rule: var(--hairline-strong);
634
- --rp-accent: var(--primary);
635
- --rp-paper: #ffffff;
636
- font-family: var(--font-sans);
637
- color: var(--rp-ink);
638
- background: var(--surface);
639
- padding: calc(var(--nav-height) + 32px) 24px 48px;
640
- }
641
- .atelic-ui .rp a {
642
- color: inherit;
643
- text-decoration: none;
644
- }
645
- .atelic-ui .rp a:hover {
646
- color: var(--rp-accent);
647
- }
648
-
649
- /* ---- the sheet ---- */
650
- .atelic-ui .rp-sheet {
651
- width: 8.5in;
652
- max-width: 100%;
653
- margin: 0 auto;
654
- padding: 0.5in 0.65in 0.45in;
655
- display: flex;
656
- flex-direction: column;
657
- background: var(--rp-paper);
658
- border-radius: 7px;
659
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
660
- print-color-adjust: exact;
661
- -webkit-print-color-adjust: exact;
662
- }
663
-
664
- /* ---- the title and the period ---- */
665
- .atelic-ui .rp-period {
666
- font-family: var(--font-mono);
667
- font-size: 8pt;
668
- letter-spacing: 0.12em;
669
- text-transform: uppercase;
670
- color: var(--rp-accent);
671
- }
672
- .atelic-ui .rp h1 {
673
- font-family: var(--font-sans);
674
- font-size: 25pt;
675
- font-weight: 600;
676
- letter-spacing: -0.03em;
677
- line-height: 1.08;
678
- margin: 6pt 0 14pt;
679
- text-wrap: balance;
680
- color: var(--rp-ink);
681
- }
682
-
683
- /* ---- the leads: four questions, each a figure and one sentence ---- */
684
- .atelic-ui .rp-leads {
685
- display: grid;
686
- grid-template-columns: repeat(4, minmax(0, 1fr));
687
- gap: 0 16pt;
688
- padding: 10pt 0 14pt;
689
- border-top: 1.5px solid var(--rp-ink);
690
- border-bottom: 1px solid var(--rp-rule);
691
- }
692
- .atelic-ui .rp-lead {
693
- display: flex;
694
- flex-direction: column;
695
- gap: 3pt;
696
- min-width: 0;
697
- }
698
- .atelic-ui .rp-q {
699
- margin: 0;
700
- font-family: var(--font-mono);
701
- font-size: 7pt;
702
- font-weight: 500;
703
- letter-spacing: 0.1em;
704
- line-height: 1.4;
705
- text-transform: uppercase;
706
- color: var(--rp-accent);
707
- }
708
- .atelic-ui .rp-figure {
709
- font-size: 18pt;
710
- font-weight: 600;
711
- letter-spacing: -0.02em;
712
- line-height: 1.1;
713
- color: var(--rp-ink);
714
- }
715
- .atelic-ui .rp-lead p {
716
- margin: 0;
717
- font-size: 8.4pt;
718
- line-height: 1.4;
719
- color: var(--rp-ink-soft);
720
- text-wrap: pretty;
721
- }
722
-
723
- /* ---- the seven grades: now, last month, baseline, what moved ---- */
724
- .atelic-ui .rp-grades {
725
132
  width: 100%;
726
- border-collapse: collapse;
727
- margin: 14pt 0 16pt;
728
- font-size: 8.4pt;
729
- line-height: 1.35;
730
- }
731
- .atelic-ui .rp-grades th {
732
- text-align: left;
733
- padding: 0 6pt 4pt 0;
734
- border-bottom: 1.5px solid var(--rp-ink);
735
- font-family: var(--font-mono);
736
- font-size: 6.5pt;
737
- font-weight: 500;
738
- letter-spacing: 0.1em;
739
- text-transform: uppercase;
740
- white-space: nowrap;
741
- color: var(--rp-ink-faint);
742
- }
743
- .atelic-ui .rp-grades td {
744
- padding: 4pt 6pt 4pt 0;
745
- border-bottom: 1px solid var(--rp-rule);
746
- vertical-align: top;
747
- color: var(--rp-ink);
748
- }
749
- .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) td {
750
- border-top: 1px solid var(--rp-ink);
751
- }
752
- .atelic-ui .rp-tier {
753
- width: 0.85in;
754
- font-family: var(--font-mono);
755
- font-size: 7pt;
756
- letter-spacing: 0.1em;
757
- text-transform: uppercase;
758
- white-space: nowrap;
759
- }
760
- .atelic-ui .rp-section {
761
- width: 1.9in;
762
- font-weight: 600;
763
- white-space: nowrap;
764
- }
765
- .atelic-ui .rp-now,
766
- .atelic-ui .rp-earlier {
767
- width: 0.65in;
768
- white-space: nowrap;
133
+ border-radius: var(--radius-sm);
134
+ overflow: hidden;
135
+ border: 1px solid var(--neutral-200);
136
+ background: var(--op-card, var(--card));
769
137
  }
770
- .atelic-ui .rp-grades .op-grade {
771
- margin-left: 0;
138
+ .atelic-ui .op-shot a {
139
+ cursor: zoom-in;
772
140
  }
773
- /* The earlier letters print muted; this month's is the one judgement. */
774
- .atelic-ui .rp-earlier .op-grade {
775
- opacity: 0.45;
141
+ /* The expand badge on a linked crop: off here, the note turns it on. */
142
+ .atelic-ui .op-shot-open {
143
+ display: none;
776
144
  }
777
- .atelic-ui .rp-moved {
778
- color: var(--rp-ink-soft);
779
- text-wrap: pretty;
145
+ .atelic-ui .op-shot img {
146
+ width: 100%;
147
+ height: auto;
148
+ display: block;
780
149
  }
781
-
782
- /* ---- the close ---- */
783
- .atelic-ui .rp-close {
784
- margin-top: auto;
785
- padding-top: 10pt;
786
- border-top: 1px solid var(--rp-rule);
787
- font-size: 8pt;
788
- line-height: 1.6;
789
- color: var(--rp-ink-faint);
150
+ .atelic-ui .op-shot figcaption {
151
+ font-size: 12.5px;
152
+ line-height: 1.45;
153
+ color: var(--op-ink-faint, var(--neutral-500));
790
154
  }
791
-
792
- /* ---- the column: phones and portrait tablets ---- */
793
- @media screen and (max-width: 899px) {
794
- .atelic-ui .rp {
795
- padding: calc(var(--nav-height) + 8px) 0 0;
796
- }
797
- .atelic-ui .rp-sheet {
798
- padding: 22px 18px 24px;
799
- border-radius: 0;
800
- box-shadow: none;
801
- }
802
- .atelic-ui .rp-period {
803
- font-size: 11px;
804
- }
805
- .atelic-ui .rp h1 {
806
- font-size: 30px;
807
- margin: 8px 0 16px;
808
- }
809
- .atelic-ui .rp-leads {
810
- grid-template-columns: repeat(2, minmax(0, 1fr));
811
- gap: 18px 16px;
812
- padding: 16px 0 18px;
813
- }
814
- .atelic-ui .rp-q {
815
- font-size: 11px;
816
- }
817
- .atelic-ui .rp-figure {
818
- font-size: 24px;
819
- }
820
- .atelic-ui .rp-lead p {
821
- font-size: 14px;
822
- line-height: 1.45;
823
- }
824
- .atelic-ui .rp-grades {
825
- font-size: 14px;
826
- }
827
- .atelic-ui .rp-grades thead {
828
- position: absolute;
829
- width: 1px;
830
- height: 1px;
831
- overflow: hidden;
832
- clip: rect(0, 0, 0, 0);
833
- white-space: nowrap;
834
- }
835
- .atelic-ui .rp-grades tr {
836
- display: flex;
837
- flex-wrap: wrap;
838
- align-items: baseline;
839
- gap: 6px 14px;
840
- padding: 10px 0;
841
- border-bottom: 1px solid var(--rp-rule);
842
- }
843
- .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) {
844
- border-top: 1px solid var(--rp-ink);
845
- }
846
- .atelic-ui .rp-grades td {
847
- display: block;
848
- width: auto;
849
- padding: 0;
850
- border: none;
851
- }
852
- .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) td {
853
- border: none;
854
- }
855
- /* Each row folds to the tier on its own line (first row of a tier
856
- only), the section, the three letters, then what moved. */
857
- .atelic-ui .rp-grades .rp-tier,
858
- .atelic-ui .rp-grades .rp-section,
859
- .atelic-ui .rp-grades .rp-moved {
860
- width: 100%;
861
- }
862
- .atelic-ui .rp-tier {
863
- font-size: 10px;
864
- }
865
- .atelic-ui .rp-tier:empty {
866
- display: none;
867
- }
868
- .atelic-ui .rp-section {
869
- white-space: normal;
870
- }
871
- .atelic-ui .rp-now::before,
872
- .atelic-ui .rp-earlier::before {
873
- content: attr(data-label);
874
- margin-right: 6px;
875
- font-family: var(--font-mono);
876
- font-size: 10px;
877
- letter-spacing: 0.08em;
878
- text-transform: uppercase;
879
- color: var(--rp-ink-faint);
880
- }
881
- .atelic-ui .rp-earlier:empty {
882
- display: none;
883
- }
884
- .atelic-ui .rp-close {
885
- padding-top: 16px;
886
- font-size: 13px;
155
+ @media print {
156
+ .atelic-ui .op-shot a {
157
+ cursor: auto;
887
158
  }
888
159
  }
889
160
 
890
- /* ---- print: one letter sheet, the document alone ---- */
891
- @page {
892
- size: letter;
893
- margin: 0;
894
- }
161
+ /* ---- print: the shell's chrome steps aside on every artifact page ----
162
+ ArtifactShell's header, credit band, and skip link belong to the screen;
163
+ a printed document is the page alone. */
895
164
  @media print {
896
- html,
897
- body {
898
- margin: 0;
899
- padding: 0;
900
- background: none;
901
- }
902
- .atelic-ui:has(.rp) .nav,
903
- .atelic-ui:has(.rp) .skip-link,
904
- .atelic-ui:has(.rp) .credit-bar {
165
+ .atelic-ui .nav,
166
+ .atelic-ui .credit-bar,
167
+ .atelic-ui .skip-link {
905
168
  display: none;
906
169
  }
907
- .atelic-ui .rp {
908
- padding: 0;
909
- background: none;
910
- }
911
- .atelic-ui .rp-sheet {
912
- width: 8.5in;
913
- height: 11in;
914
- max-width: none;
915
- margin: 0;
916
- overflow: hidden;
917
- border-radius: 0;
918
- box-shadow: none;
919
- }
920
- }
921
-
922
- /* =================================================================
923
- THE WRITEUP: a web page first, and the printed copy from the same
924
- page.
925
-
926
- - Phone first: the base rules are the phone's. Each section is a card
927
- of small blocks in one column; a table's rows stack, each fact
928
- wearing its column's label, so nothing scrolls sideways.
929
- - Wide (721px and up): the same cards with room: the overview on one
930
- line a section, real table columns, the owner's screen beside the
931
- findings.
932
- - Print: the chrome steps aside, the lockup and the pointer to the
933
- hosted page appear, the type comes down, and the cards flow across
934
- letter pages. Nothing is clipped and no block splits across pages.
935
-
936
- Tokens only (theme.css). The blocks inside a section (the checklist,
937
- the sortable table, the charts, the stat row, the callout, the
938
- disclosure) and their tones are styles/components.css's; this sheet sets
939
- the document around them and their sizes here.
940
- ================================================================= */
941
- .atelic-ui .op {
942
- --op-ink: var(--ink);
943
- --op-ink-soft: var(--ink-soft);
944
- --op-ink-faint: var(--neutral-500);
945
- --op-rule: var(--neutral-100);
946
- --op-accent: var(--primary);
947
- --op-card: var(--card);
948
- font-family: var(--font-sans);
949
- color: var(--op-ink);
950
- background: var(--surface);
951
- min-height: 100vh;
952
- }
953
- .atelic-ui .op a {
954
- color: inherit;
955
- text-decoration: none;
956
- }
957
- .atelic-ui .op-doc {
958
- max-width: 920px;
959
- margin: 0 auto;
960
- padding: calc(var(--nav-height) + 22px) 16px 48px;
961
- font-size: 16px;
962
- line-height: 1.5;
963
- print-color-adjust: exact;
964
- -webkit-print-color-adjust: exact;
965
- }
966
-
967
- /* ---- the head: who it is for, what it is ---- */
968
- .atelic-ui .op-top {
969
- display: none;
970
- }
971
- .atelic-ui .op-meta {
972
- margin: 0 0 10px;
973
- font-family: var(--font-mono);
974
- font-size: 12.5px;
975
- letter-spacing: 0.04em;
976
- color: var(--op-ink-faint);
977
- }
978
- .atelic-ui .op-meta b {
979
- font-weight: 500;
980
- color: var(--op-ink-soft);
981
- }
982
- /* On a phone the date takes its own line; wide, it follows a middle dot. */
983
- .atelic-ui .op-meta-sep {
984
- display: none;
985
- }
986
- .atelic-ui .op-meta-date {
987
- display: block;
988
- }
989
- .atelic-ui .op h1 {
990
- font-size: clamp(32px, 5vw, 44px);
991
- font-weight: 650;
992
- letter-spacing: -0.03em;
993
- line-height: 1.08;
994
- margin: 0;
995
- text-wrap: balance;
996
- color: var(--op-ink);
997
- }
998
- .atelic-ui .op-intro {
999
- margin: 14px 0 0;
1000
- max-width: 62ch;
1001
- font-size: 16.5px;
1002
- line-height: 1.5;
1003
- color: var(--op-ink-soft);
1004
- text-wrap: pretty;
1005
- }
1006
-
1007
- /* ---- the grade chip, at web sizes ---- */
1008
- .atelic-ui .op .op-grade {
1009
- display: inline-grid;
1010
- place-items: center;
1011
- margin: 0;
1012
- padding: 0;
1013
- width: 26px;
1014
- height: 26px;
1015
- border-radius: 8px;
1016
- font-family: var(--font-sans);
1017
- font-size: 14px;
1018
- font-weight: 700;
1019
- letter-spacing: 0;
1020
- line-height: 1;
1021
- vertical-align: middle;
1022
- flex: none;
1023
- }
1024
-
1025
- /* ---- the overview: the key, then every section under its tier, each a
1026
- grade, a name that links to the section, and one plain read ---- */
1027
- .atelic-ui .op-ov {
1028
- margin-top: 22px;
1029
- scroll-margin-top: calc(var(--nav-height) + 16px);
1030
- }
1031
- .atelic-ui .op-ov-head {
1032
- display: flex;
1033
- flex-wrap: wrap;
1034
- align-items: center;
1035
- justify-content: space-between;
1036
- gap: 8px 20px;
1037
- margin-bottom: 10px;
1038
- }
1039
- .atelic-ui .op-ov-title {
1040
- font-size: 13px;
1041
- font-family: var(--font-mono);
1042
- font-weight: 500;
1043
- letter-spacing: 0.1em;
1044
- text-transform: uppercase;
1045
- color: var(--op-ink-faint);
1046
- margin: 0;
1047
- }
1048
- .atelic-ui .op-legend {
1049
- list-style: none;
1050
- margin: 0;
1051
- padding: 0;
1052
- display: flex;
1053
- flex-wrap: wrap;
1054
- gap: 6px 16px;
1055
- font-size: 13.5px;
1056
- color: var(--op-ink-soft);
1057
- }
1058
- .atelic-ui .op-legend li {
1059
- display: inline-flex;
1060
- align-items: center;
1061
- gap: 7px;
1062
- }
1063
- .atelic-ui .op-legend .op-grade {
1064
- width: 22px;
1065
- height: 22px;
1066
- border-radius: 6px;
1067
- font-size: 12px;
1068
- }
1069
- .atelic-ui .op-ov-card {
1070
- background: var(--op-card);
1071
- border: 1px solid var(--op-rule);
1072
- border-radius: var(--radius-md);
1073
- box-shadow: var(--shadow-sm);
1074
- overflow: hidden;
1075
- }
1076
- .atelic-ui .op-ov-tier-label {
1077
- padding: 7px 16px;
1078
- background: var(--surface-alt);
1079
- font-family: var(--font-mono);
1080
- font-size: 11.5px;
1081
- letter-spacing: 0.1em;
1082
- text-transform: uppercase;
1083
- color: var(--op-ink-soft);
1084
- }
1085
- .atelic-ui .op-ov-tier ul {
1086
- list-style: none;
1087
- margin: 0;
1088
- padding: 0;
1089
- }
1090
- .atelic-ui .op-ov-row {
1091
- position: relative;
1092
- display: grid;
1093
- grid-template-columns: auto minmax(0, 1fr) auto;
1094
- column-gap: 12px;
1095
- row-gap: 2px;
1096
- align-items: start;
1097
- padding: 12px 12px 12px 16px;
1098
- border-top: 1px solid var(--op-rule);
1099
- }
1100
- .atelic-ui .op-ov-row:hover {
1101
- background: var(--surface);
1102
- }
1103
- .atelic-ui .op-ov-grade {
1104
- grid-row: 1 / span 2;
1105
- display: inline-flex;
1106
- align-items: center;
1107
- gap: 6px;
1108
- }
1109
- .atelic-ui .op-ov-grade .op-grade {
1110
- width: 30px;
1111
- height: 30px;
1112
- border-radius: 9px;
1113
- font-size: 15px;
1114
- }
1115
- .atelic-ui .op-ov-before .op-grade {
1116
- opacity: 0.45;
1117
- }
1118
- .atelic-ui .op-ov-name {
1119
- font-size: 16px;
1120
- font-weight: 650;
1121
- letter-spacing: -0.01em;
1122
- line-height: 1.35;
1123
- padding-top: 3px;
1124
- }
1125
- /* The name is the link, and it covers the row; a link inside the read
1126
- sits above it. */
1127
- .atelic-ui .op-ov-name a::after {
1128
- content: "";
1129
- position: absolute;
1130
- inset: 0;
1131
- }
1132
- .atelic-ui .op-ov-row:hover .op-ov-name {
1133
- color: var(--op-accent);
1134
- }
1135
- .atelic-ui .op-ov-read {
1136
- grid-column: 2;
1137
- font-size: 15px;
1138
- line-height: 1.45;
1139
- color: var(--op-ink-soft);
1140
- text-wrap: pretty;
1141
- }
1142
- .atelic-ui .op-ov-read a {
1143
- position: relative;
1144
- z-index: 1;
1145
- color: var(--op-accent);
1146
- text-decoration: underline;
1147
- text-underline-offset: 2px;
1148
- }
1149
- .atelic-ui .op-ov-go {
1150
- grid-column: 3;
1151
- grid-row: 1;
1152
- margin-top: 5px;
1153
- color: var(--neutral-300);
1154
- }
1155
-
1156
- /* ---- a part: the tier and the question it answers ---- */
1157
- .atelic-ui .op-part {
1158
- margin: 34px 0 10px;
1159
- scroll-margin-top: calc(var(--nav-height) + 16px);
1160
- }
1161
- .atelic-ui .op-part h2 {
1162
- font-size: 27px;
1163
- font-weight: 650;
1164
- letter-spacing: -0.025em;
1165
- line-height: 1.1;
1166
- margin: 0;
1167
- color: var(--op-ink);
1168
- }
1169
- .atelic-ui .op-part p {
1170
- margin: 6px 0 0;
1171
- font-size: 16.5px;
1172
- color: var(--op-ink-soft);
1173
- }
1174
-
1175
- /* ---- a topic: one section, a card of blocks ---- */
1176
- .atelic-ui .op-topic {
1177
- background: var(--op-card);
1178
- border: 1px solid var(--op-rule);
1179
- border-radius: var(--radius-md);
1180
- box-shadow: var(--shadow-sm);
1181
- padding: 18px 16px 16px;
1182
- margin-top: 12px;
1183
- scroll-margin-top: calc(var(--nav-height) + 16px);
1184
- }
1185
- .atelic-ui .op-topic-head {
1186
- display: flex;
1187
- justify-content: space-between;
1188
- align-items: flex-start;
1189
- gap: 20px;
1190
- }
1191
- .atelic-ui .op-topic h3 {
1192
- font-size: 21px;
1193
- font-weight: 650;
1194
- letter-spacing: -0.02em;
1195
- line-height: 1.2;
1196
- margin: 0;
1197
- color: var(--op-ink);
1198
- }
1199
- .atelic-ui .op-topic h3 a {
1200
- display: inline-flex;
1201
- align-items: center;
1202
- gap: 6px;
1203
- border-bottom: 1px solid var(--neutral-200);
1204
- }
1205
- .atelic-ui .op-topic h3 a svg {
1206
- color: var(--op-ink-faint);
1207
- }
1208
- .atelic-ui .op-topic h3 a:hover,
1209
- .atelic-ui .op-topic h3 a:hover svg {
1210
- color: var(--op-accent);
1211
- border-color: var(--op-accent);
1212
- }
1213
- .atelic-ui .op-def {
1214
- margin: 6px 0 0;
1215
- font-size: 16px;
1216
- line-height: 1.45;
1217
- color: var(--op-ink-soft);
1218
- text-wrap: pretty;
1219
- }
1220
- /* why the letter: the rule the section met, in a line */
1221
- .atelic-ui .op-why {
1222
- margin: 6px 0 0;
1223
- font-size: 14.5px;
1224
- line-height: 1.45;
1225
- color: var(--op-ink-soft);
1226
- text-wrap: pretty;
1227
- }
1228
- .atelic-ui .op-why b {
1229
- font-weight: 650;
1230
- color: var(--op-ink);
1231
- }
1232
- .atelic-ui .op-topic-head > .op-grade {
1233
- width: 42px;
1234
- height: 42px;
1235
- border-radius: 12px;
1236
- font-size: 21px;
1237
- }
1238
-
1239
- /* ---- blocks inside a topic, one under another ---- */
1240
- .atelic-ui .op-blocks {
1241
- display: grid;
1242
- grid-template-columns: minmax(0, 1fr);
1243
- }
1244
- .atelic-ui .op-block {
1245
- margin-top: 16px;
1246
- padding-top: 16px;
1247
- border-top: 1px solid var(--op-rule);
1248
- min-width: 0;
1249
- }
1250
- .atelic-ui .op-block-head {
1251
- margin-bottom: 12px;
1252
- }
1253
- .atelic-ui .op-block-head h4 {
1254
- font-size: 16px;
1255
- font-weight: 650;
1256
- letter-spacing: -0.005em;
1257
- margin: 0;
1258
- color: var(--op-ink);
1259
- }
1260
- .atelic-ui .op-block-head p {
1261
- margin: 3px 0 0;
1262
- font-size: 15px;
1263
- line-height: 1.45;
1264
- color: var(--op-ink-soft);
1265
- text-wrap: pretty;
1266
- }
1267
- .atelic-ui .op-note {
1268
- margin: 12px 0 0;
1269
- font-size: 15px;
1270
- line-height: 1.5;
1271
- color: var(--op-ink-soft);
1272
- text-wrap: pretty;
1273
- }
1274
- .atelic-ui .op-note b {
1275
- color: var(--op-ink);
1276
- font-weight: 600;
1277
- }
1278
- .atelic-ui .op-dash {
1279
- display: inline-block;
1280
- width: 14px;
1281
- height: 1.5px;
1282
- vertical-align: 0.3em;
1283
- background: var(--neutral-300);
1284
- }
1285
-
1286
- /* The blocks are the shared package's components. These are the writeup's
1287
- sizes for them. */
1288
- .atelic-ui .op-checks .checklist,
1289
- .atelic-ui .op-scale .threshold-scale {
1290
- font-size: 15px;
1291
- }
1292
- .atelic-ui .op-bar .chart-key,
1293
- .atelic-ui .op-columns .chart-key {
1294
- font-size: 13px;
1295
- }
1296
-
1297
- /* the table: its layout is the shared DataTable's; these are the writeup's
1298
- own sizes and the two line row names. */
1299
- .atelic-ui .op-table .data-table {
1300
- font-size: 15px;
1301
- }
1302
- .atelic-ui .op-table tbody th b {
1303
- display: block;
1304
- font-weight: 600;
1305
- }
1306
- .atelic-ui .op-table tbody th a,
1307
- .atelic-ui .op-table .op-sub {
1308
- display: block;
1309
- font-family: var(--font-mono);
1310
- font-size: 12px;
1311
- color: var(--op-ink-faint);
1312
- overflow-wrap: anywhere;
1313
- }
1314
- .atelic-ui .op-table tbody th a:hover {
1315
- color: var(--op-accent);
1316
- }
1317
- .atelic-ui .op-table tr[data-tone="bad"] th b {
1318
- color: var(--tone-bad);
1319
- }
1320
- .atelic-ui .op-table td {
1321
- white-space: nowrap;
1322
- }
1323
- /* A cell of running words wraps; a cell of figures never does. */
1324
- .atelic-ui .op-table td:has(.op-wrap) {
1325
- white-space: normal;
1326
- }
1327
- .atelic-ui .op-mark-cell {
1328
- display: inline-flex;
1329
- align-items: center;
1330
- gap: 6px;
1331
- color: var(--tone);
1332
- font-weight: 600;
1333
- }
1334
- /* the icon keeps its size however long the words beside it run */
1335
- .atelic-ui .op-mark-cell svg {
1336
- flex: none;
1337
- }
1338
- .atelic-ui .op-rating {
1339
- display: inline-flex;
1340
- align-items: center;
1341
- gap: 4px;
1342
- font-weight: 600;
1343
- color: var(--tone, var(--op-ink));
1344
- }
1345
- .atelic-ui .op-rating svg {
1346
- color: var(--tone, var(--tone-warn-fill));
1347
- fill: currentColor;
1348
- }
1349
-
1350
- /* a few big numbers: the shared StatRow, at the writeup's sizes */
1351
- .atelic-ui .op-stats .stat-row {
1352
- gap: 18px 28px;
1353
- }
1354
- .atelic-ui .op-stats .stat .num {
1355
- font-size: 28px;
1356
- font-weight: 700;
1357
- letter-spacing: -0.02em;
1358
- line-height: 1.1;
1359
- color: var(--tone, var(--op-ink));
1360
- }
1361
- .atelic-ui .op-stats .stat-delta {
1362
- font-size: 13px;
1363
- }
1364
- .atelic-ui .op-stats .stat .lbl {
1365
- margin-top: 6px;
1366
- font-size: 15px;
1367
- }
1368
-
1369
- /* pictures on their own: the same size, side by side */
1370
- .atelic-ui .op-shots-row {
1371
- display: grid;
1372
- grid-template-columns: repeat(2, minmax(0, 1fr));
1373
- gap: 16px;
1374
- max-width: 520px;
1375
- align-items: start;
1376
- }
1377
- /* three sit on one line, on a phone as well */
1378
- .atelic-ui .op-shots-row[data-count="3"] {
1379
- grid-template-columns: repeat(3, minmax(0, 1fr));
1380
- gap: 12px;
1381
- max-width: 780px;
1382
- }
1383
- .atelic-ui .op-shots-row .op-shot a,
1384
- .atelic-ui .op-shots-row .op-shot-frame {
1385
- aspect-ratio: 3 / 4;
1386
- background: var(--surface);
1387
- }
1388
- .atelic-ui .op-shots-row .op-shot img {
1389
- width: 100%;
1390
- height: 100%;
1391
- object-fit: contain;
1392
- object-position: center;
1393
- }
1394
-
1395
- /* the native disclosure: the shared one, at the writeup's sizes */
1396
- .atelic-ui .op-block.disclosure.is-native {
1397
- border-top: 1px solid var(--op-rule);
1398
- }
1399
- .atelic-ui .op-more .disclosure-label {
1400
- font-size: 16px;
1401
- }
1402
- .atelic-ui .op-more .disclosure-summary {
1403
- font-size: 15px;
1404
- line-height: 1.45;
1405
- }
1406
- .atelic-ui .op-more.is-native > .disclosure-body {
1407
- margin-top: 0;
1408
- }
1409
- .atelic-ui .op-more-body {
1410
- display: grid;
1411
- grid-template-columns: minmax(0, 1fr);
1412
- }
1413
- .atelic-ui .op-more-body > .op-block:first-child {
1414
- border-top: 0;
1415
- margin-top: 6px;
1416
- padding-top: 6px;
1417
- }
1418
-
1419
- /* findings: the shared Callout, one under another, with the owner's screen
1420
- beside them */
1421
- .atelic-ui .op-findings.has-shots {
1422
- display: grid;
1423
- grid-template-columns: minmax(0, 1fr);
1424
- gap: 18px;
1425
- align-items: start;
1426
- }
1427
- .atelic-ui .op-findings-list {
1428
- display: flex;
1429
- flex-direction: column;
1430
- gap: 14px;
1431
- }
1432
- .atelic-ui .op-findings .callout {
1433
- font-size: 15.5px;
1434
- line-height: 1.5;
1435
- }
1436
- .atelic-ui .op-findings .callout a,
1437
- .atelic-ui .op-note a,
1438
- .atelic-ui .op-block-head p a {
1439
- color: var(--op-accent);
1440
- text-decoration: underline;
1441
- text-underline-offset: 2px;
1442
- overflow-wrap: anywhere;
1443
- }
1444
- .atelic-ui .op-shots {
1445
- display: flex;
1446
- flex-direction: column;
1447
- gap: 14px;
1448
- max-width: 340px;
1449
- }
1450
- .atelic-ui .op-shot {
1451
- display: flex;
1452
- flex-direction: column;
1453
- gap: 6px;
1454
- margin: 0;
1455
- }
1456
- .atelic-ui .op-shot a,
1457
- .atelic-ui .op-shot-frame {
1458
- display: block;
1459
- width: 100%;
1460
- border-radius: var(--radius-sm);
1461
- overflow: hidden;
1462
- border: 1px solid var(--neutral-200);
1463
- background: var(--op-card);
1464
- }
1465
- .atelic-ui .op-shot a {
1466
- cursor: zoom-in;
1467
- }
1468
- /* The expand badge on a linked crop: off here, the note turns it on. */
1469
- .atelic-ui .op-shot-open {
1470
- display: none;
1471
- }
1472
- .atelic-ui .op-shot img {
1473
- width: 100%;
1474
- height: auto;
1475
- display: block;
1476
- }
1477
- .atelic-ui .op-shot-brief {
1478
- display: grid;
1479
- place-items: center;
1480
- min-height: 140px;
1481
- border: 1px dashed var(--neutral-300);
1482
- border-radius: var(--radius-sm);
1483
- font-family: var(--font-mono);
1484
- font-size: 12px;
1485
- color: var(--op-ink-faint);
1486
- padding: 12px;
1487
- text-align: center;
1488
- }
1489
- .atelic-ui .op-shot figcaption {
1490
- font-size: 12.5px;
1491
- line-height: 1.45;
1492
- color: var(--op-ink-faint);
1493
- }
1494
-
1495
- /* sources: the tools the readings came from */
1496
- .atelic-ui .op-sources {
1497
- margin-top: 16px;
1498
- padding-top: 12px;
1499
- border-top: 1px solid var(--op-rule);
1500
- display: flex;
1501
- flex-wrap: wrap;
1502
- align-items: baseline;
1503
- gap: 6px 16px;
1504
- font-size: 13.5px;
1505
- }
1506
- .atelic-ui .op-sources-label {
1507
- font-family: var(--font-mono);
1508
- font-size: 11.5px;
1509
- letter-spacing: 0.1em;
1510
- text-transform: uppercase;
1511
- color: var(--op-ink-faint);
1512
- }
1513
- .atelic-ui .op-sources ul {
1514
- list-style: none;
1515
- margin: 0;
1516
- padding: 0;
1517
- display: flex;
1518
- flex-wrap: wrap;
1519
- gap: 6px 18px;
1520
- color: var(--op-ink-soft);
1521
- }
1522
- .atelic-ui .op-sources a {
1523
- display: inline-flex;
1524
- align-items: center;
1525
- gap: 3px;
1526
- color: var(--op-accent);
1527
- font-weight: 550;
1528
- }
1529
- .atelic-ui .op-sources a:hover {
1530
- text-decoration: underline;
1531
- text-underline-offset: 2px;
1532
- }
1533
-
1534
- /* ---- the rented line: paid's facts in one line, ungraded ---- */
1535
- .atelic-ui .op-rented {
1536
- display: flex;
1537
- flex-direction: column;
1538
- gap: 6px;
1539
- margin: 18px 0 0;
1540
- padding: 16px;
1541
- background: var(--surface-alt);
1542
- border-radius: var(--radius-md);
1543
- font-size: 15.5px;
1544
- line-height: 1.5;
1545
- color: var(--op-ink);
1546
- text-wrap: pretty;
1547
- }
1548
- .atelic-ui .op-rented-label {
1549
- flex: none;
1550
- font-family: var(--font-mono);
1551
- font-size: 11.5px;
1552
- letter-spacing: 0.1em;
1553
- text-transform: uppercase;
1554
- color: var(--op-ink-soft);
1555
- }
1556
-
1557
- /* ---- the markets table: on a phone each market stacks, its letters on
1558
- one line with their column's label; wide, it is a table ---- */
1559
- .atelic-ui .op-markets-table {
1560
- display: block;
1561
- width: 100%;
1562
- margin-top: 18px;
1563
- font-size: 15px;
1564
- line-height: 1.4;
1565
- }
1566
- .atelic-ui .op-markets-table tbody {
1567
- display: block;
1568
- }
1569
- .atelic-ui .op-markets-table thead {
1570
- position: absolute;
1571
- width: 1px;
1572
- height: 1px;
1573
- overflow: hidden;
1574
- clip: rect(0, 0, 0, 0);
1575
- white-space: nowrap;
1576
- }
1577
- .atelic-ui .op-markets-table tbody tr {
1578
- display: flex;
1579
- flex-wrap: wrap;
1580
- align-items: center;
1581
- column-gap: 16px;
1582
- row-gap: 6px;
1583
- padding: 12px 0;
1584
- border-bottom: 1px solid var(--op-rule);
1585
- }
1586
- .atelic-ui .op-markets-table tbody tr:last-child {
1587
- border-bottom: 0;
1588
- }
1589
- .atelic-ui .op-markets-table th,
1590
- .atelic-ui .op-markets-table td {
1591
- text-align: left;
1592
- color: var(--op-ink);
1593
- }
1594
- .atelic-ui .op-markets-table .op-markets-market,
1595
- .atelic-ui .op-markets-table .op-markets-read {
1596
- width: 100%;
1597
- }
1598
- .atelic-ui .op-markets-market {
1599
- font-weight: 600;
1600
- }
1601
- .atelic-ui .op-markets-place {
1602
- display: block;
1603
- font-weight: 400;
1604
- font-size: 12.5px;
1605
- color: var(--op-ink-faint);
1606
- }
1607
- .atelic-ui .op-markets-col,
1608
- .atelic-ui .op-markets-label {
1609
- font-family: var(--font-mono);
1610
- font-size: 11.5px;
1611
- font-weight: 400;
1612
- letter-spacing: 0.08em;
1613
- text-transform: uppercase;
1614
- color: var(--op-ink-soft);
1615
- white-space: nowrap;
1616
- }
1617
- .atelic-ui .op-markets-label {
1618
- margin-right: 6px;
1619
- }
1620
- .atelic-ui .op-markets-grade {
1621
- white-space: nowrap;
1622
- }
1623
- .atelic-ui .op-markets-table .op-markets-read {
1624
- color: var(--op-ink-soft);
1625
- text-wrap: pretty;
1626
- }
1627
-
1628
- /* ---- the close ---- */
1629
- .atelic-ui .op-close {
1630
- margin-top: 44px;
1631
- padding-top: 22px;
1632
- border-top: 1px solid var(--neutral-200);
1633
- display: flex;
1634
- flex-direction: column;
1635
- align-items: flex-start;
1636
- gap: 14px;
1637
- font-size: 14px;
1638
- line-height: 1.6;
1639
- color: var(--op-ink-faint);
1640
- }
1641
- .atelic-ui .op-close b {
1642
- font-weight: 500;
1643
- color: var(--op-ink);
1644
- }
1645
- /* The sign off lockup itself (.op-who, .op-sign) is shared with the monthly
1646
- page, so it lives with the shared classes at the head of this sheet. */
1647
- .atelic-ui .op .op-sign {
1648
- font-size: 24px;
1649
- margin-bottom: 8px;
1650
- }
1651
- .atelic-ui .op .op-who {
1652
- gap: 14px;
1653
- }
1654
- .atelic-ui .op .op-who img {
1655
- width: 56px;
1656
- height: 56px;
1657
- }
1658
- /* The pointer to the hosted page belongs to the printed copy alone. */
1659
- .atelic-ui .op-twin {
1660
- display: none;
1661
- }
1662
- .atelic-ui .op-sr-only {
1663
- position: absolute;
1664
- width: 1px;
1665
- height: 1px;
1666
- padding: 0;
1667
- margin: -1px;
1668
- overflow: hidden;
1669
- clip: rect(0, 0, 0, 0);
1670
- white-space: nowrap;
1671
- border: 0;
1672
- }
1673
-
1674
- /* ---- wide: the same page with room ---- */
1675
- @media print, (min-width: 721px) {
1676
- .atelic-ui .op-meta-sep,
1677
- .atelic-ui .op-meta-date {
1678
- display: inline;
1679
- }
1680
- .atelic-ui .op-doc {
1681
- padding: calc(var(--nav-height) + 32px) 24px 64px;
1682
- }
1683
- .atelic-ui .op-intro {
1684
- font-size: 18px;
1685
- }
1686
- .atelic-ui .op-ov-tier-label {
1687
- padding: 7px 20px;
1688
- }
1689
- .atelic-ui .op-ov-row {
1690
- grid-template-columns: auto 232px minmax(0, 1fr) auto;
1691
- column-gap: 16px;
1692
- padding: 11px 14px 11px 20px;
1693
- }
1694
- .atelic-ui .op-ov-grade {
1695
- grid-row: 1;
1696
- }
1697
- .atelic-ui .op-ov-read {
1698
- grid-column: 3;
1699
- padding-top: 4px;
1700
- }
1701
- .atelic-ui .op-ov-go {
1702
- grid-column: 4;
1703
- }
1704
- .atelic-ui .op-part {
1705
- margin: 40px 0 12px;
1706
- }
1707
- .atelic-ui .op-part h2 {
1708
- font-size: 30px;
1709
- }
1710
- .atelic-ui .op-part p {
1711
- font-size: 17px;
1712
- }
1713
- .atelic-ui .op-topic {
1714
- padding: 22px 26px 18px;
1715
- }
1716
- .atelic-ui .op-topic h3 {
1717
- font-size: 23px;
1718
- }
1719
- .atelic-ui .op-topic-head > .op-grade {
1720
- width: 46px;
1721
- height: 46px;
1722
- border-radius: 13px;
1723
- font-size: 23px;
1724
- }
1725
- .atelic-ui .op-findings.has-shots {
1726
- grid-template-columns: minmax(0, 1fr) 250px;
1727
- gap: 28px;
1728
- }
1729
- .atelic-ui .op-findings .op-shots {
1730
- max-width: none;
1731
- }
1732
- .atelic-ui .op-rented {
1733
- flex-direction: row;
1734
- align-items: baseline;
1735
- gap: 16px;
1736
- padding: 16px 26px;
1737
- }
1738
- .atelic-ui .op-close {
1739
- flex-direction: row;
1740
- justify-content: space-between;
1741
- align-items: flex-end;
1742
- }
1743
-
1744
- /* the markets as a real table */
1745
- .atelic-ui .op-markets-table {
1746
- display: table;
1747
- border-collapse: collapse;
1748
- }
1749
- .atelic-ui .op-markets-table tbody {
1750
- display: table-row-group;
1751
- }
1752
- .atelic-ui .op-markets-table thead {
1753
- position: static;
1754
- width: auto;
1755
- height: auto;
1756
- overflow: visible;
1757
- clip: auto;
1758
- }
1759
- .atelic-ui .op-markets-table tbody tr {
1760
- display: table-row;
1761
- padding: 0;
1762
- border: 0;
1763
- }
1764
- .atelic-ui .op-markets-table th,
1765
- .atelic-ui .op-markets-table td {
1766
- display: table-cell;
1767
- padding: 10px 14px 10px 0;
1768
- border-bottom: 1px solid var(--op-rule);
1769
- vertical-align: top;
1770
- }
1771
- .atelic-ui .op-markets-table thead th {
1772
- padding-top: 0;
1773
- padding-bottom: 8px;
1774
- border-bottom: 1.5px solid var(--op-ink);
1775
- vertical-align: bottom;
1776
- }
1777
- .atelic-ui .op-markets-table tbody tr:last-child th,
1778
- .atelic-ui .op-markets-table tbody tr:last-child td {
1779
- border-bottom: 0;
1780
- }
1781
- .atelic-ui .op-markets-table .op-markets-market {
1782
- width: 170px;
1783
- }
1784
- .atelic-ui .op-markets-table .op-markets-read {
1785
- width: auto;
1786
- }
1787
- .atelic-ui .op-markets-col {
1788
- width: 64px;
1789
- }
1790
- .atelic-ui .op-markets-label {
1791
- display: none;
1792
- }
1793
- }
1794
-
1795
- /* ---- print: the same page, on letter paper ---- */
1796
- @page {
1797
- size: letter;
1798
- margin: 0.5in 0.55in 0.6in;
1799
- @bottom-right {
1800
- content: counter(page) " / " counter(pages);
1801
- font-family: ui-monospace, "SF Mono", monospace;
1802
- font-size: 7.5pt;
1803
- color: #75858f;
1804
- }
1805
- }
1806
- @media print {
1807
- html,
1808
- body {
1809
- margin: 0;
1810
- padding: 0;
1811
- background: none;
1812
- }
1813
- /* The sheet is the page at three quarters size. The zoom sits on the root,
1814
- where the browser sizes each block for its page breaks at the printed
1815
- size; on the document it measured them full size and broke early. */
1816
- html:has(.atelic-ui .op-doc) {
1817
- zoom: 0.74;
1818
- }
1819
- .atelic-ui .nav,
1820
- .atelic-ui .credit-bar,
1821
- .atelic-ui .skip-link,
1822
- .atelic-ui .op-ov-go,
1823
- .atelic-ui .op-topic h3 a svg {
1824
- display: none;
1825
- }
1826
- .atelic-ui,
1827
- .atelic-ui .op {
1828
- background: none;
1829
- min-height: 0;
1830
- }
1831
- .atelic-ui .op-doc {
1832
- max-width: none;
1833
- padding: 0;
1834
- }
1835
- .atelic-ui .op-top {
1836
- display: flex;
1837
- align-items: center;
1838
- gap: 12px;
1839
- margin-bottom: 18px;
1840
- }
1841
- .atelic-ui .op-mark {
1842
- font-weight: 600;
1843
- font-size: 22px;
1844
- letter-spacing: -0.045em;
1845
- display: inline-flex;
1846
- align-items: center;
1847
- gap: 0.38em;
1848
- color: var(--op-ink);
1849
- font-family: var(--font-brand);
1850
- }
1851
- .atelic-ui .op-run {
1852
- display: inline-block;
1853
- width: 1.7em;
1854
- height: 2px;
1855
- background: linear-gradient(90deg, var(--op-accent), transparent);
1856
- }
1857
- .atelic-ui .op-x {
1858
- font-family: var(--font-mono);
1859
- font-size: 16px;
1860
- color: var(--op-ink-faint);
1861
- line-height: 1;
1862
- }
1863
- .atelic-ui .op-recipient {
1864
- height: 30px;
1865
- width: auto;
1866
- display: block;
1867
- }
1868
- .atelic-ui .op-ov-card,
1869
- .atelic-ui .op-topic {
1870
- box-shadow: none;
1871
- border-color: var(--neutral-200);
1872
- }
1873
- .atelic-ui .op-topic h3 a {
1874
- border-bottom: 0;
1875
- }
1876
- /* A small block stays whole; a table or a disclosure may run over a
1877
- page, row by row, with its heading kept beside its first rows. */
1878
- .atelic-ui .op-ov,
1879
- .atelic-ui .op-block,
1880
- .atelic-ui .op-rented,
1881
- .atelic-ui .op-close,
1882
- .atelic-ui .op-topic-head,
1883
- .atelic-ui .op-block-head,
1884
- .atelic-ui .op-markets-table tr,
1885
- .atelic-ui .data-table tr {
1886
- break-inside: avoid;
1887
- }
1888
- .atelic-ui .op-block.op-table,
1889
- .atelic-ui .op-block.op-more,
1890
- .atelic-ui .op-block.op-checks,
1891
- .atelic-ui .op-block.op-findings,
1892
- .atelic-ui .op-markets {
1893
- break-inside: auto;
1894
- }
1895
- /* A list of checks or findings runs over a page item by item, so a
1896
- section starts in whatever space the last one left. */
1897
- .atelic-ui .op-checks .checklist > li,
1898
- .atelic-ui .op-findings .callout {
1899
- break-inside: avoid;
1900
- }
1901
- .atelic-ui .op-part,
1902
- .atelic-ui .is-native > .disclosure-head {
1903
- break-inside: avoid;
1904
- break-after: avoid;
1905
- }
1906
- .atelic-ui .op-topic-head,
1907
- .atelic-ui .op-block-head,
1908
- .atelic-ui .is-native > .disclosure-head,
1909
- .atelic-ui .data-table thead {
1910
- break-after: avoid;
1911
- }
1912
- .atelic-ui .op-shot a {
1913
- cursor: auto;
1914
- }
1915
- .atelic-ui .op-twin {
1916
- display: flex;
1917
- align-items: center;
1918
- gap: 14px;
1919
- }
1920
- .atelic-ui .op-twin-text {
1921
- text-align: right;
1922
- font-family: var(--font-mono);
1923
- font-size: 12px;
1924
- letter-spacing: 0.04em;
1925
- }
1926
- .atelic-ui .op-twin-text b {
1927
- display: block;
1928
- font-family: var(--font-sans);
1929
- font-size: 16px;
1930
- font-weight: 600;
1931
- letter-spacing: -0.01em;
1932
- margin-top: 2px;
1933
- }
1934
- .atelic-ui .op-qr {
1935
- width: 96px;
1936
- height: 96px;
1937
- display: block;
1938
- }
1939
- }
1940
-
1941
- /* =================================================================
1942
- THE NOTE: the first touch set as a page (Note.tsx). A letter, not a
1943
- report, read on a phone first. Its column is the writeup's 920px,
1944
- centered under the header with the header's own gutters, and every
1945
- line of text runs the column's full width.
1946
-
1947
- - The two lanes are separate sections stacked top to bottom at
1948
- every width and on paper, never side by side.
1949
- - Phone first: a finding is its Callout with the owner's screen
1950
- under it. Wide (721px and up) and on paper, a finding with a
1951
- screen is one row, the words left and the screen right, top
1952
- aligned; the screen's column sizes to the picture, a phone crop
1953
- about 260px and a wide card up to 45% of the row. A finding
1954
- with no screen takes the full width.
1955
- - Print: one letter sheet. The chrome steps aside (the writeup's print
1956
- rules already hide the header and the credit band on any artifact
1957
- page), the type comes down, and the screens shrink. The note sets
1958
- no @page of its own: the writeup's, the later one in this sheet,
1959
- sets letter paper for every artifact page.
1960
-
1961
- Tokens only. The finding is the shared Callout (styles/components.css),
1962
- the screen the writeup's .op-shot, the sign off the shared .op-who;
1963
- this sheet sets the letter around them and their sizes here.
1964
- ================================================================= */
1965
- /* The borrowed .op-shot reads the writeup's own two tokens, mapped here as
1966
- the writeup's .op root maps them. */
1967
- .atelic-ui .nt {
1968
- --op-card: var(--card);
1969
- --op-ink-faint: var(--neutral-500);
1970
- font-family: var(--font-sans);
1971
- color: var(--ink);
1972
- background: var(--surface);
1973
- }
1974
- /* The writeup's column (.op-doc, 920px), centered under the header and
1975
- held off the edges by the header's gutters (chrome.css, .nav-inner). */
1976
- .atelic-ui .nt-doc {
1977
- max-width: calc(920px + 2 * var(--gutter));
1978
- margin: 0 auto;
1979
- padding: calc(var(--nav-height) + 22px) var(--gutter) 48px;
1980
- font-size: 17px;
1981
- line-height: 1.6;
1982
- print-color-adjust: exact;
1983
- -webkit-print-color-adjust: exact;
1984
- }
1985
- .atelic-ui .nt a {
1986
- color: var(--primary);
1987
- text-decoration: underline;
1988
- text-underline-offset: 2px;
1989
- text-decoration-thickness: 1px;
1990
- overflow-wrap: anywhere;
1991
- }
1992
- .atelic-ui .nt a:hover {
1993
- text-decoration-thickness: 2px;
1994
- }
1995
-
1996
- /* ---- the head: who it is for, then the title ---- */
1997
- .atelic-ui .nt-meta {
1998
- margin: 0 0 10px;
1999
- font-family: var(--font-mono);
2000
- font-size: 12.5px;
2001
- letter-spacing: 0.04em;
2002
- color: var(--neutral-500);
2003
- }
2004
- .atelic-ui .nt-meta b {
2005
- font-weight: 500;
2006
- color: var(--ink-soft);
2007
- }
2008
- .atelic-ui .nt-meta-date {
2009
- white-space: nowrap;
2010
- }
2011
- .atelic-ui .nt h1 {
2012
- font-size: clamp(30px, 6vw, 40px);
2013
- font-weight: 650;
2014
- letter-spacing: -0.03em;
2015
- line-height: 1.1;
2016
- margin: 0;
2017
- text-wrap: balance;
2018
- color: var(--ink);
2019
- }
2020
-
2021
- /* ---- the opener: the letter's first paragraph ---- */
2022
- .atelic-ui .nt-opener {
2023
- margin: 18px 0 0;
2024
- font-size: 18px;
2025
- line-height: 1.6;
2026
- color: var(--ink);
2027
- text-wrap: pretty;
2028
- }
2029
-
2030
- /* ---- the two lanes, each a heading and its findings, one above the
2031
- other at every width ---- */
2032
- .atelic-ui .nt-lanes {
2033
- display: grid;
2034
- grid-template-columns: minmax(0, 1fr);
2035
- gap: 26px;
2036
- margin-top: 30px;
2037
- padding-top: 24px;
2038
- border-top: 1px solid var(--neutral-100);
2039
- }
2040
- .atelic-ui .nt-lane {
2041
- min-width: 0;
2042
- }
2043
- .atelic-ui .nt-lane h2 {
2044
- margin: 0 0 14px;
2045
- font-size: 19px;
2046
- font-weight: 650;
2047
- letter-spacing: -0.015em;
2048
- line-height: 1.25;
2049
- color: var(--ink);
2050
- }
2051
- .atelic-ui .nt-findings {
2052
- list-style: none;
2053
- margin: 0;
2054
- padding: 0;
2055
- display: flex;
2056
- flex-direction: column;
2057
- gap: 18px;
2058
- }
2059
- .atelic-ui .nt-finding .callout {
2060
- font-size: 16px;
2061
- line-height: 1.5;
2062
- }
2063
- /* The screen is a thumbnail under its finding, set in from the icon so it
2064
- lines up with the words. It keeps its own shape, held to 200px tall and
2065
- never the lane's full width; a click opens the full picture. */
2066
- .atelic-ui .nt-finding .op-shot {
2067
- margin: 10px 0 0 28px;
2068
- }
2069
- .atelic-ui .nt-finding .op-shot a,
2070
- .atelic-ui .nt-finding .op-shot-frame {
2071
- width: fit-content;
2072
- max-width: 100%;
2073
- }
2074
- .atelic-ui .nt-finding .op-shot img {
2075
- width: auto;
2076
- max-width: min(100%, 280px);
2077
- max-height: 200px;
2078
- }
2079
- /* A linked thumbnail says it opens: the badge in its corner, and the
2080
- frame takes the accent on hover and focus. */
2081
- .atelic-ui .nt-finding .op-shot a {
2082
- position: relative;
2083
- color: inherit;
2084
- text-decoration: none;
2085
- transition:
2086
- border-color 0.15s ease,
2087
- box-shadow 0.15s ease;
2088
- }
2089
- .atelic-ui .nt-finding .op-shot a:hover,
2090
- .atelic-ui .nt-finding .op-shot a:focus-visible {
2091
- border-color: var(--primary);
2092
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 25%, transparent);
2093
- }
2094
- .atelic-ui .nt-finding .op-shot-open {
2095
- position: absolute;
2096
- right: 4px;
2097
- bottom: 4px;
2098
- display: flex;
2099
- align-items: center;
2100
- justify-content: center;
2101
- width: 20px;
2102
- height: 20px;
2103
- border-radius: 50%;
2104
- background: color-mix(in srgb, var(--ink) 72%, transparent);
2105
- color: var(--surface);
2106
- }
2107
- .atelic-ui .nt-finding .op-shot a:hover .op-shot-open,
2108
- .atelic-ui .nt-finding .op-shot a:focus-visible .op-shot-open {
2109
- background: var(--primary);
2110
- }
2111
- /* The caption wraps to the picture's width and never sets the column's. */
2112
- .atelic-ui .nt-finding .op-shot figcaption {
2113
- width: 0;
2114
- min-width: 100%;
2115
- font-size: 12.5px;
2116
- line-height: 1.45;
2117
- color: var(--neutral-500);
2118
- }
2119
-
2120
- /* ---- where the work would start ---- */
2121
- .atelic-ui .nt-start {
2122
- margin-top: 30px;
2123
- padding-top: 24px;
2124
- border-top: 1px solid var(--neutral-100);
2125
- }
2126
- .atelic-ui .nt-start-lead {
2127
- margin: 0 0 10px;
2128
- font-weight: 650;
2129
- color: var(--ink);
2130
- }
2131
- /* The site base strips list markers; the steps want theirs back. */
2132
- .atelic-ui .nt-start ul {
2133
- margin: 0;
2134
- padding-left: 1.2em;
2135
- list-style: disc;
2136
- display: grid;
2137
- gap: 8px;
2138
- color: var(--ink-soft);
2139
- }
2140
- .atelic-ui .nt-start li {
2141
- padding-left: 2px;
2142
- }
2143
- .atelic-ui .nt-start li::marker {
2144
- color: var(--primary);
2145
- }
2146
- .atelic-ui .nt-start b {
2147
- font-weight: 600;
2148
- color: var(--ink);
2149
- }
2150
-
2151
- /* ---- the close: who is writing, the offer, then the sign off ---- */
2152
- .atelic-ui .nt-close {
2153
- margin-top: 30px;
2154
- padding-top: 24px;
2155
- border-top: 1px solid var(--neutral-100);
2156
- }
2157
- .atelic-ui .nt-close p {
2158
- margin: 0 0 14px;
2159
- text-wrap: pretty;
2160
- }
2161
- .atelic-ui .nt-close .op-who {
2162
- margin-top: 22px;
2163
- gap: 14px;
2164
- font-size: 14px;
2165
- line-height: 1.6;
2166
- color: var(--neutral-500);
2167
- }
2168
- .atelic-ui .nt-close .op-who img {
2169
- width: 56px;
2170
- height: 56px;
2171
- }
2172
- .atelic-ui .nt-close .op-sign {
2173
- font-size: 24px;
2174
- margin-bottom: 8px;
2175
- }
2176
- /* The sign off's own links read as the writeup's do: quiet, in the text color. */
2177
- .atelic-ui .nt-close .op-who a {
2178
- color: inherit;
2179
- text-decoration: none;
2180
- }
2181
-
2182
- /* ---- wide: more room, and each screen beside its finding ---- */
2183
- @media (min-width: 721px) {
2184
- .atelic-ui .nt-doc {
2185
- padding-top: calc(var(--nav-height) + 36px);
2186
- padding-bottom: 64px;
2187
- }
2188
- .atelic-ui .nt-lanes {
2189
- gap: 32px;
2190
- }
2191
- }
2192
-
2193
- /* A finding with a screen is one row: the words left, the screen right,
2194
- top aligned. The screen is a thumbnail about as tall as a three line
2195
- finding, so a phone crop reads as a tall one about 80px wide and a
2196
- wide card as a short wide one; the column shrinks to it, held to 45%
2197
- of the row, with room enough for the caption under it. */
2198
- @media print, (min-width: 721px) {
2199
- .atelic-ui .nt-finding.has-shot {
2200
- display: grid;
2201
- grid-template-columns: minmax(0, 1fr) fit-content(45%);
2202
- column-gap: 32px;
2203
- align-items: start;
2204
- }
2205
- .atelic-ui .nt-finding.has-shot .op-shot {
2206
- margin: 0;
2207
- min-width: 150px;
2208
- }
2209
- .atelic-ui .nt-finding .op-shot img {
2210
- max-width: 100%;
2211
- max-height: 170px;
2212
- }
2213
- .atelic-ui .nt-finding .op-shot figcaption {
2214
- font-size: 12px;
2215
- }
2216
- }
2217
-
2218
- /* ---- print: one letter sheet ----
2219
- The rows hold on paper, since they are shorter than the stacked page.
2220
- The sheet is the page at the writeup's three quarters, the thumbnails
2221
- are held short with room for their captions, and the badge drops. */
2222
- @media print {
2223
- html:has(.atelic-ui .nt-doc) {
2224
- zoom: 0.74;
2225
- }
2226
- .atelic-ui .nt {
2227
- background: none;
2228
- }
2229
- .atelic-ui .nt-doc {
2230
- max-width: none;
2231
- padding: 0;
2232
- font-size: 15px;
2233
- line-height: 1.45;
2234
- }
2235
- .atelic-ui .nt h1 {
2236
- font-size: 32px;
2237
- }
2238
- .atelic-ui .nt-opener {
2239
- margin-top: 12px;
2240
- font-size: 16px;
2241
- }
2242
- .atelic-ui .nt-lanes,
2243
- .atelic-ui .nt-start,
2244
- .atelic-ui .nt-close {
2245
- margin-top: 16px;
2246
- padding-top: 14px;
2247
- }
2248
- .atelic-ui .nt-lanes {
2249
- gap: 18px;
2250
- }
2251
- .atelic-ui .nt-lane h2 {
2252
- margin-bottom: 10px;
2253
- break-after: avoid;
2254
- }
2255
- .atelic-ui .nt-findings {
2256
- gap: 14px;
2257
- }
2258
- .atelic-ui .nt-finding .callout {
2259
- font-size: 14.5px;
2260
- }
2261
- .atelic-ui .nt-finding.has-shot {
2262
- grid-template-columns: minmax(0, 1fr) fit-content(40%);
2263
- column-gap: 24px;
2264
- }
2265
- .atelic-ui .nt-finding.has-shot .op-shot {
2266
- min-width: 1.6in;
2267
- }
2268
- .atelic-ui .nt-finding .op-shot img {
2269
- max-height: 1.5in;
2270
- }
2271
- .atelic-ui .nt-finding .op-shot-open {
2272
- display: none;
2273
- }
2274
- .atelic-ui .nt-finding .op-shot figcaption {
2275
- font-size: 11.5px;
2276
- line-height: 1.35;
2277
- }
2278
- .atelic-ui .nt-finding .op-shot a {
2279
- cursor: auto;
2280
- }
2281
- .atelic-ui .nt-start ul {
2282
- gap: 4px;
2283
- }
2284
- .atelic-ui .nt-close p {
2285
- margin-bottom: 10px;
2286
- }
2287
- .atelic-ui .nt-close .op-who {
2288
- margin-top: 14px;
2289
- }
2290
- .atelic-ui .nt-finding,
2291
- .atelic-ui .nt-start,
2292
- .atelic-ui .nt-close {
2293
- break-inside: avoid;
2294
- }
2295
- }
2296
-
2297
- /* =================================================================
2298
- THE READ: the baseline's grades explained by cause (Read.tsx). The
2299
- writeup's sibling: it sits inside the writeup's own .op root, so the
2300
- column, the head, the grade chip and its key, the tier heading, the
2301
- section card, the screen, the sources, the close, and every print
2302
- rule of the writeup's are its own already. This block adds only what
2303
- the read has and the writeup does not: the gist table, the three
2304
- beats of a section, the proof pictures in a row, and the numbered
2305
- plan. It sets no @page; the writeup's, earlier in this sheet and the
2306
- later of the two there, sets letter paper for every artifact page.
2307
-
2308
- Tokens only (theme.css).
2309
- ================================================================= */
2310
-
2311
- /* Prose links read as links here, where the writeup's are quiet. */
2312
- .atelic-ui .rd-lede a,
2313
- .atelic-ui .rd-beat a,
2314
- .atelic-ui .rd-gist-read a,
2315
- .atelic-ui .rd-plan a,
2316
- .atelic-ui .rd-closing a {
2317
- color: var(--op-accent);
2318
- text-decoration: underline;
2319
- text-underline-offset: 2px;
2320
- text-decoration-thickness: 1px;
2321
- overflow-wrap: anywhere;
2322
- }
2323
-
2324
- /* ---- the gist table: section, grade, and one line, under its tier ---- */
2325
- .atelic-ui .rd-gist {
2326
- margin-top: 26px;
2327
- }
2328
- .atelic-ui .rd-gist-card {
2329
- min-width: 0;
2330
- background: var(--op-card);
2331
- border: 1px solid var(--op-rule);
2332
- border-radius: var(--radius-md);
2333
- box-shadow: var(--shadow-sm);
2334
- overflow: hidden;
2335
- }
2336
- .atelic-ui .rd-gist-table {
2337
- width: 100%;
2338
- border-collapse: collapse;
2339
- font-size: 15px;
2340
- line-height: 1.45;
2341
- }
2342
- .atelic-ui .rd-gist-table thead th {
2343
- padding: 9px 12px;
2344
- text-align: left;
2345
- font-family: var(--font-mono);
2346
- font-size: 11px;
2347
- font-weight: 500;
2348
- letter-spacing: 0.1em;
2349
- text-transform: uppercase;
2350
- color: var(--op-ink-faint);
2351
- border-bottom: 1px solid var(--op-rule);
2352
- }
2353
- .atelic-ui .rd-gist-tier th {
2354
- padding: 7px 12px;
2355
- background: var(--surface-alt);
2356
- text-align: left;
2357
- font-family: var(--font-mono);
2358
- font-size: 11.5px;
2359
- font-weight: 500;
2360
- letter-spacing: 0.1em;
2361
- text-transform: uppercase;
2362
- color: var(--op-ink-soft);
2363
- }
2364
- .atelic-ui .rd-gist-table tbody tr + tr > * {
2365
- border-top: 1px solid var(--op-rule);
2366
- }
2367
- .atelic-ui .rd-gist-table tbody th[scope="row"],
2368
- .atelic-ui .rd-gist-table td {
2369
- padding: 11px 12px;
2370
- vertical-align: top;
2371
- text-align: left;
2372
- }
2373
- .atelic-ui .rd-gist-table .rd-gist-section {
2374
- font-weight: 650;
2375
- letter-spacing: -0.01em;
2376
- width: 30%;
2377
- }
2378
- .atelic-ui .rd-gist-table tbody .rd-gist-section a:hover {
2379
- color: var(--op-accent);
2380
- }
2381
- .atelic-ui .rd-gist-table .rd-gist-grade {
2382
- width: 1%;
2383
- white-space: nowrap;
2384
- text-align: center;
2385
- }
2386
- .atelic-ui .rd-gist-table td.rd-gist-read {
2387
- color: var(--op-ink-soft);
2388
- text-wrap: pretty;
2389
- min-width: 0;
2390
- }
2391
-
2392
- /* ---- a section: the trade name over the question, then three beats ---- */
2393
- .atelic-ui .rd-name {
2394
- margin: 0 0 4px;
2395
- font-family: var(--font-mono);
2396
- font-size: 11.5px;
2397
- letter-spacing: 0.1em;
2398
- text-transform: uppercase;
2399
- color: var(--op-ink-faint);
2400
- }
2401
- .atelic-ui .rd-grade .op-grade {
2402
- width: 42px;
2403
- height: 42px;
2404
- border-radius: 12px;
2405
- font-size: 21px;
2406
- }
2407
- .atelic-ui .rd-beat {
2408
- margin-top: 16px;
2409
- min-width: 0;
2410
- }
2411
- .atelic-ui .rd-beat h4 {
2412
- margin: 0 0 6px;
2413
- font-family: var(--font-mono);
2414
- font-size: 11.5px;
2415
- font-weight: 500;
2416
- letter-spacing: 0.1em;
2417
- text-transform: uppercase;
2418
- color: var(--op-ink-faint);
2419
- }
2420
- .atelic-ui .rd-beat p {
2421
- margin: 0 0 10px;
2422
- max-width: 68ch;
2423
- text-wrap: pretty;
2424
- }
2425
- .atelic-ui .rd-beat p:last-child {
2426
- margin-bottom: 0;
2427
- }
2428
- .atelic-ui .rd-examples {
2429
- list-style: disc;
2430
- margin: 8px 0 0;
2431
- padding-left: 1.2em;
2432
- max-width: 68ch;
2433
- color: var(--op-ink-soft);
2434
- }
2435
- .atelic-ui .rd-examples li + li {
2436
- margin-top: 4px;
2437
- }
2438
- /* Why is one sentence, set apart: a tinted panel with the accent's rule. */
2439
- .atelic-ui .rd-why {
2440
- padding: 12px 14px;
2441
- border-left: 3px solid var(--op-accent);
2442
- border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
2443
- background: var(--surface-alt);
2444
- }
2445
- .atelic-ui .rd-why p {
2446
- font-size: 16.5px;
2447
- font-weight: 550;
2448
- line-height: 1.45;
2449
- color: var(--op-ink);
2450
- }
2451
- /* The proof pictures sit in a row at one size, a search capture per
2452
- market; a phone stacks them. */
2453
- .atelic-ui .rd-shots {
2454
- display: grid;
2455
- grid-template-columns: minmax(0, 1fr);
2456
- gap: 14px;
2457
- margin-top: 14px;
2458
- }
2459
-
2460
- /* ---- the plan: the steps in order, numbered ---- */
2461
- .atelic-ui .rd-plan {
2462
- margin-top: 34px;
2463
- scroll-margin-top: calc(var(--nav-height) + 16px);
2464
- }
2465
- .atelic-ui .rd-plan h2 {
2466
- font-size: 27px;
2467
- font-weight: 650;
2468
- letter-spacing: -0.025em;
2469
- line-height: 1.1;
2470
- margin: 0;
2471
- color: var(--op-ink);
2472
- }
2473
- .atelic-ui .rd-plan-lead {
2474
- margin: 6px 0 0;
2475
- font-size: 16.5px;
2476
- color: var(--op-ink-soft);
2477
- }
2478
- .atelic-ui .rd-steps {
2479
- list-style: none;
2480
- counter-reset: rd-step;
2481
- margin: 12px 0 0;
2482
- padding: 0;
2483
- background: var(--op-card);
2484
- border: 1px solid var(--op-rule);
2485
- border-radius: var(--radius-md);
2486
- box-shadow: var(--shadow-sm);
2487
- }
2488
- .atelic-ui .rd-step {
2489
- counter-increment: rd-step;
2490
- display: grid;
2491
- grid-template-columns: auto minmax(0, 1fr);
2492
- column-gap: 12px;
2493
- padding: 14px 16px;
2494
- }
2495
- .atelic-ui .rd-step + .rd-step {
2496
- border-top: 1px solid var(--op-rule);
2497
- }
2498
- .atelic-ui .rd-step::before {
2499
- content: counter(rd-step);
2500
- display: inline-grid;
2501
- place-items: center;
2502
- width: 28px;
2503
- height: 28px;
2504
- border: 1.5px solid var(--op-accent);
2505
- border-radius: 999px;
2506
- color: var(--op-accent);
2507
- font-size: 14px;
2508
- font-weight: 700;
2509
- line-height: 1;
2510
- }
2511
- .atelic-ui .rd-step p {
2512
- margin: 3px 0 0;
2513
- color: var(--op-ink-soft);
2514
- text-wrap: pretty;
2515
- }
2516
- .atelic-ui .rd-step-title {
2517
- font-weight: 650;
2518
- color: var(--op-ink);
2519
- }
2520
- .atelic-ui .rd-step-who {
2521
- display: inline-block;
2522
- margin-left: 2px;
2523
- padding: 1px 8px;
2524
- border: 1px solid var(--neutral-200);
2525
- border-radius: 999px;
2526
- font-family: var(--font-mono);
2527
- font-size: 11px;
2528
- letter-spacing: 0.06em;
2529
- text-transform: uppercase;
2530
- vertical-align: 0.15em;
2531
- color: var(--op-ink-soft);
2532
- }
2533
-
2534
- /* ---- the close: one line, then the sign off under its rule ---- */
2535
- .atelic-ui .rd-closing {
2536
- margin: 34px 0 0;
2537
- max-width: 62ch;
2538
- font-size: 17px;
2539
- line-height: 1.5;
2540
- color: var(--op-ink);
2541
- }
2542
-
2543
- /* ---- wide and on paper: the pictures beside each other ---- */
2544
- @media print, (min-width: 721px) {
2545
- .atelic-ui .rd-gist-table tbody th[scope="row"],
2546
- .atelic-ui .rd-gist-table td,
2547
- .atelic-ui .rd-gist-table thead th,
2548
- .atelic-ui .rd-gist-tier th {
2549
- padding-left: 20px;
2550
- padding-right: 16px;
2551
- }
2552
- .atelic-ui .rd-shots[data-count="2"] {
2553
- grid-template-columns: repeat(2, minmax(0, 1fr));
2554
- }
2555
- .atelic-ui .rd-shots[data-count="3"] {
2556
- grid-template-columns: repeat(3, minmax(0, 1fr));
2557
- }
2558
- }
2559
-
2560
- /* ---- print: the writeup's rules carry the page; these hold the read's
2561
- own blocks whole ---- */
2562
- @media print {
2563
- .atelic-ui .rd-gist-card,
2564
- .atelic-ui .rd-steps {
2565
- box-shadow: none;
2566
- border-color: var(--neutral-200);
2567
- }
2568
- .atelic-ui .rd-gist-table tr,
2569
- .atelic-ui .rd-closing,
2570
- .atelic-ui .rd-why,
2571
- .atelic-ui .rd-step,
2572
- .atelic-ui .rd-close,
2573
- .atelic-ui .rd-shots .op-shot {
2574
- break-inside: avoid;
2575
- }
2576
- .atelic-ui .rd-beat h4,
2577
- .atelic-ui .rd-plan h2 {
2578
- break-after: avoid;
2579
- }
2580
170
  }
2581
171
  }