@atelic-action/ui 0.17.2 → 1.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.
Files changed (188) hide show
  1. package/README.md +432 -45
  2. package/bin/atelic-check-base-path.ts +5 -0
  3. package/bin/atelic-clean-sitemap.ts +5 -0
  4. package/bin/atelic-contact-canary.ts +5 -0
  5. package/bin/atelic-print-sheets.sh +1 -1
  6. package/bin/atelic-seal-document.mjs +1 -1
  7. package/bin/atelic-serve-static.ts +1 -1
  8. package/dist/gate/index.d.ts +1 -1
  9. package/dist/gate/index.js +1 -1
  10. package/dist/gate/middleware.d.ts +4 -1
  11. package/dist/gate/middleware.js +14 -5
  12. package/dist/gate/wall.d.ts +25 -0
  13. package/dist/gate/wall.js +41 -2
  14. package/dist/routing/basePath.d.ts +24 -0
  15. package/dist/routing/basePath.js +54 -0
  16. package/dist/vite/index.d.ts +3 -2
  17. package/dist/vite/index.js +3 -2
  18. package/dist/vite/marketing-config.d.ts +50 -0
  19. package/dist/vite/marketing-config.js +83 -0
  20. package/package.json +164 -5
  21. package/src/app/AppProvider.tsx +41 -0
  22. package/src/app/AuthGuard.tsx +27 -0
  23. package/src/app/CardErrorBoundary.tsx +39 -0
  24. package/src/app/ErrorFallback.tsx +39 -0
  25. package/src/app/GoogleGlyph.tsx +22 -0
  26. package/src/app/config.ts +54 -0
  27. package/src/app/configure.ts +18 -0
  28. package/src/app/context/AppContext.tsx +52 -0
  29. package/src/app/context/SidebarContext.tsx +124 -0
  30. package/src/app/context/UserContext.tsx +139 -0
  31. package/src/app/hooks/useDebounce.ts +12 -0
  32. package/src/app/hooks/useIsDesktop.ts +31 -0
  33. package/src/app/hooks/useWakeLock.ts +49 -0
  34. package/src/app/index.ts +64 -0
  35. package/src/app/layout/ActionButton.tsx +67 -0
  36. package/src/app/layout/AppLayout.tsx +110 -0
  37. package/src/app/layout/AppPage.tsx +268 -0
  38. package/src/app/layout/Breadcrumbs.tsx +57 -0
  39. package/src/app/layout/DesktopRail.tsx +168 -0
  40. package/src/app/layout/FormActionButtons.tsx +69 -0
  41. package/src/app/layout/MobileMenu.tsx +156 -0
  42. package/src/app/layout/MobileTabBar.tsx +43 -0
  43. package/src/app/layout/PageError.tsx +30 -0
  44. package/src/app/layout/PageSkeleton.tsx +65 -0
  45. package/src/app/layout/SectionCards.tsx +33 -0
  46. package/src/app/layout/UserMenu.tsx +104 -0
  47. package/src/app/layout/identity.ts +22 -0
  48. package/src/app/layout/index.ts +20 -0
  49. package/src/app/layout/nav.ts +52 -0
  50. package/src/app/lib/dates.ts +57 -0
  51. package/src/app/lib/env.ts +37 -0
  52. package/src/app/lib/format.ts +61 -0
  53. package/src/app/lib/http.ts +205 -0
  54. package/src/app/lib/lastAuth.ts +45 -0
  55. package/src/app/lib/oauth.ts +32 -0
  56. package/src/app/lib/publicRoutes.ts +33 -0
  57. package/src/app/lib/queryClient.ts +38 -0
  58. package/src/app/lib/search.ts +17 -0
  59. package/src/app/lib/session.ts +36 -0
  60. package/src/app/lib/tokenRefresh.ts +137 -0
  61. package/src/app/lib/transformKeys.ts +60 -0
  62. package/src/app/lib/units.ts +228 -0
  63. package/src/app/lib/unwrap.ts +48 -0
  64. package/src/app/lib/utils.ts +10 -0
  65. package/src/app/stores/authStore.ts +80 -0
  66. package/src/app/stores/storage.ts +40 -0
  67. package/src/app/stores/unitsStore.ts +54 -0
  68. package/src/app/types/index.ts +72 -0
  69. package/src/app/types/query.ts +11 -0
  70. package/src/app/ui/accordion.tsx +54 -0
  71. package/src/app/ui/alert-dialog.tsx +114 -0
  72. package/src/app/ui/alert.tsx +49 -0
  73. package/src/app/ui/avatar.tsx +45 -0
  74. package/src/app/ui/badge-list.tsx +51 -0
  75. package/src/app/ui/badge.tsx +33 -0
  76. package/src/app/ui/button.tsx +49 -0
  77. package/src/app/ui/callout.tsx +22 -0
  78. package/src/app/ui/card.tsx +55 -0
  79. package/src/app/ui/checkbox.tsx +26 -0
  80. package/src/app/ui/clear-button.tsx +42 -0
  81. package/src/app/ui/command.tsx +140 -0
  82. package/src/app/ui/country-dropdown.tsx +184 -0
  83. package/src/app/ui/dialog.tsx +104 -0
  84. package/src/app/ui/dropdown-menu.tsx +185 -0
  85. package/src/app/ui/form.tsx +172 -0
  86. package/src/app/ui/index.ts +36 -0
  87. package/src/app/ui/input.tsx +22 -0
  88. package/src/app/ui/label.tsx +19 -0
  89. package/src/app/ui/option-select.tsx +56 -0
  90. package/src/app/ui/pagination.tsx +90 -0
  91. package/src/app/ui/popover.tsx +29 -0
  92. package/src/app/ui/progress.tsx +25 -0
  93. package/src/app/ui/search-input.tsx +63 -0
  94. package/src/app/ui/select.tsx +151 -0
  95. package/src/app/ui/separator.tsx +24 -0
  96. package/src/app/ui/sheet.tsx +119 -0
  97. package/src/app/ui/slider.tsx +23 -0
  98. package/src/app/ui/switch.tsx +27 -0
  99. package/src/app/ui/textarea.tsx +21 -0
  100. package/src/app/ui/tooltip.tsx +32 -0
  101. package/src/artifact/ArtifactShell.tsx +2 -2
  102. package/src/artifact/Gate.tsx +2 -2
  103. package/src/artifact/Note.tsx +9 -39
  104. package/src/artifact/Paragraph.tsx +65 -0
  105. package/src/artifact/Read.tsx +406 -0
  106. package/src/artifact/Writeup.tsx +7 -7
  107. package/src/artifact/index.ts +1 -0
  108. package/src/chrome/SiteShell.tsx +141 -0
  109. package/src/chrome/index.ts +2 -0
  110. package/src/components/Disclosure.tsx +80 -14
  111. package/src/components/GateLogin.tsx +1 -1
  112. package/src/components/Watermark.tsx +1 -1
  113. package/src/components/index.ts +6 -2
  114. package/src/gate/index.ts +1 -1
  115. package/src/gate/middleware.ts +17 -6
  116. package/src/gate/wall.ts +60 -2
  117. package/src/lib/basePathAudit.ts +96 -0
  118. package/src/lib/displayDate.ts +25 -0
  119. package/src/lib/honeypot.ts +11 -0
  120. package/src/lib/hours.ts +28 -0
  121. package/src/lib/sitemap.ts +34 -0
  122. package/src/lib/trackEvent.ts +26 -0
  123. package/src/lib/useOpenHeight.ts +28 -0
  124. package/src/primitives/Button.tsx +3 -1
  125. package/src/primitives/Chip.tsx +3 -1
  126. package/src/primitives/ImageFrame.tsx +48 -0
  127. package/src/primitives/ProseBlocks.tsx +67 -0
  128. package/src/primitives/QuoteCard.tsx +20 -0
  129. package/src/primitives/StarRow.tsx +37 -0
  130. package/src/primitives/TickList.tsx +24 -0
  131. package/src/primitives/index.ts +5 -0
  132. package/src/routing/BasePathProvider.tsx +47 -0
  133. package/src/routing/basePath.ts +57 -0
  134. package/src/routing/index.ts +8 -0
  135. package/src/scripts/check-base-path.ts +130 -0
  136. package/src/scripts/clean-sitemap.ts +27 -0
  137. package/src/scripts/contact-canary.ts +98 -0
  138. package/src/scripts/serve-static.ts +29 -3
  139. package/src/sections/BlogIndex.tsx +57 -0
  140. package/src/sections/BlogPost.tsx +65 -0
  141. package/src/sections/CTABanner.tsx +93 -0
  142. package/src/sections/CTASection.tsx +60 -0
  143. package/src/sections/ComparisonTable.tsx +114 -0
  144. package/src/sections/ContactForm.tsx +163 -0
  145. package/src/sections/ContactInfoCard.tsx +92 -0
  146. package/src/sections/CredentialList.tsx +28 -0
  147. package/src/sections/DeviceShowcase.tsx +39 -0
  148. package/src/sections/ExpandList.tsx +58 -0
  149. package/src/sections/FAQBrowser.tsx +283 -0
  150. package/src/sections/FeatureDetail.tsx +60 -0
  151. package/src/sections/FeatureGrid.tsx +83 -0
  152. package/src/sections/Gallery.tsx +84 -0
  153. package/src/sections/Hero.tsx +110 -0
  154. package/src/sections/HoursTable.tsx +23 -0
  155. package/src/sections/JumpRail.tsx +35 -0
  156. package/src/sections/LegalPage.tsx +43 -0
  157. package/src/sections/LocationSection.tsx +66 -0
  158. package/src/sections/Locations.tsx +71 -0
  159. package/src/sections/LogoMarquee.tsx +27 -0
  160. package/src/sections/MapEmbed.tsx +75 -0
  161. package/src/sections/MediaBand.tsx +20 -0
  162. package/src/sections/MenuList.tsx +44 -0
  163. package/src/sections/PageHero.tsx +25 -0
  164. package/src/sections/PressQuotes.tsx +51 -0
  165. package/src/sections/PricingBand.tsx +43 -0
  166. package/src/sections/PricingCard.tsx +36 -0
  167. package/src/sections/ProcessSteps.tsx +45 -0
  168. package/src/sections/ProfileCards.tsx +73 -0
  169. package/src/sections/RevealSlider.tsx +156 -0
  170. package/src/sections/ReviewCarousel.tsx +223 -0
  171. package/src/sections/ReviewWall.tsx +220 -0
  172. package/src/sections/SocialStrip.tsx +83 -0
  173. package/src/sections/SplitSection.tsx +56 -0
  174. package/src/sections/index.ts +76 -0
  175. package/src/sections/siteConfig.ts +201 -0
  176. package/src/styles/app.css +673 -0
  177. package/src/styles/artifact.css +759 -401
  178. package/src/styles/base.css +49 -47
  179. package/src/styles/chrome.css +71 -71
  180. package/src/styles/components.css +150 -140
  181. package/src/styles/gate.css +29 -29
  182. package/src/styles/primitives.css +190 -25
  183. package/src/styles/sections.css +2652 -0
  184. package/src/styles/star-rating.css +2 -2
  185. package/src/vite/index.ts +9 -2
  186. package/src/vite/marketing-config.ts +128 -0
  187. package/src/components/Collapsible.tsx +0 -43
  188. /package/src/scripts/{build-gate-payload.mjs → seal-document.mjs} +0 -0
@@ -3,8 +3,8 @@
3
3
  share. Moved whole from the artifact template, in the order its build
4
4
  bundled them (the shared classes, the stage, the monthly page, the
5
5
  writeup), which the two @page rules depend on: the later one wins, and
6
- the writeup's is the later one. The note follows the writeup and sets
7
- no @page, so the writeup's stays the one that wins. They sit in the package's layer like
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
8
  every sheet here, so any rule a site writes outside a layer still wins
9
9
  over them whatever its specificity. */
10
10
  @layer atelic-ui {
@@ -19,7 +19,7 @@
19
19
  ================================================================= */
20
20
 
21
21
  /* ---- the grade chip ---- */
22
- :is(.mkt, .atelic-ui) .op-grade {
22
+ .atelic-ui .op-grade {
23
23
  display: inline-block;
24
24
  vertical-align: 0.1em;
25
25
  margin-left: 0.6em;
@@ -41,51 +41,51 @@
41
41
  everywhere, whatever the brand's palette, so they are not theme tokens.
42
42
  The orange sits between the yellow's hue and the red's so the four stay
43
43
  apart on paper, and its letter clears AA on its own tint. */
44
- :is(.mkt, .atelic-ui) .op-grade[data-grade="a"] {
44
+ .atelic-ui .op-grade[data-grade="a"] {
45
45
  color: #1b7f3b;
46
46
  border-color: #1b7f3b;
47
47
  background: #eaf6ee;
48
48
  }
49
- :is(.mkt, .atelic-ui) .op-grade[data-grade="b"] {
49
+ .atelic-ui .op-grade[data-grade="b"] {
50
50
  color: #9a6b00;
51
51
  border-color: #c99a1a;
52
52
  background: #fdf5dc;
53
53
  }
54
- :is(.mkt, .atelic-ui) .op-grade[data-grade="c"] {
54
+ .atelic-ui .op-grade[data-grade="c"] {
55
55
  color: #a84500;
56
56
  border-color: #e8650a;
57
57
  background: #fff0e3;
58
58
  }
59
- :is(.mkt, .atelic-ui) .op-grade[data-grade="d"] {
59
+ .atelic-ui .op-grade[data-grade="d"] {
60
60
  color: #b3261e;
61
61
  border-color: #b3261e;
62
62
  background: #fdecea;
63
63
  }
64
64
 
65
65
  /* ---- the sign off lockup: its container sets the size and the color ---- */
66
- :is(.mkt, .atelic-ui) .op-who {
66
+ .atelic-ui .op-who {
67
67
  display: flex;
68
68
  align-items: center;
69
69
  gap: 10pt;
70
70
  }
71
- :is(.mkt, .atelic-ui) .op-who img {
71
+ .atelic-ui .op-who img {
72
72
  width: 0.6in;
73
73
  height: 0.6in;
74
74
  border-radius: 50%;
75
75
  object-fit: cover;
76
76
  flex-shrink: 0;
77
77
  }
78
- :is(.mkt, .atelic-ui) .op-who a {
78
+ .atelic-ui .op-who a {
79
79
  display: inline-flex;
80
80
  align-items: center;
81
81
  gap: 0.3em;
82
82
  white-space: nowrap;
83
83
  }
84
- :is(.mkt, .atelic-ui) .op-who b {
84
+ .atelic-ui .op-who b {
85
85
  font-weight: 500;
86
86
  color: var(--ink);
87
87
  }
88
- :is(.mkt, .atelic-ui) .op-sign {
88
+ .atelic-ui .op-sign {
89
89
  font-family: var(--font-script);
90
90
  font-size: 15pt;
91
91
  color: var(--ink);
@@ -94,13 +94,13 @@
94
94
  }
95
95
 
96
96
  @media screen and (max-width: 899px) {
97
- :is(.mkt, .atelic-ui) .op-grade {
97
+ .atelic-ui .op-grade {
98
98
  font-size: 10px;
99
99
  }
100
- :is(.mkt, .atelic-ui) .op-sign {
100
+ .atelic-ui .op-sign {
101
101
  font-size: 22px;
102
102
  }
103
- :is(.mkt, .atelic-ui) .op-who img {
103
+ .atelic-ui .op-who img {
104
104
  width: 56px;
105
105
  height: 56px;
106
106
  }
@@ -109,11 +109,11 @@
109
109
  /* The sender's logo is the outlined wordmark, an image wider than the square
110
110
  slot the shared header cuts for a mark, so it keeps its own width, and the
111
111
  empty text wordmark beside it takes no room. */
112
- :is(.mkt, .atelic-ui) .nav-logo .mark {
112
+ .atelic-ui .nav-logo .mark {
113
113
  width: auto;
114
114
  height: 20px;
115
115
  }
116
- :is(.mkt, .atelic-ui) .nav-logo .wordmark:empty {
116
+ .atelic-ui .nav-logo .wordmark:empty {
117
117
  display: none;
118
118
  }
119
119
 
@@ -129,7 +129,7 @@
129
129
  error); this section only stages it dark and adds the document
130
130
  classes the decrypted HTML is written against.
131
131
  ================================================================= */
132
- :is(.mkt, .atelic-ui) .gate-stage {
132
+ .atelic-ui .gate-stage {
133
133
  --gs-stage: var(--surface-dark);
134
134
  --gs-bright: color-mix(in srgb, var(--surface) 96%, white);
135
135
  --gs-dim: color-mix(in srgb, var(--surface) 62%, var(--surface-dark));
@@ -152,18 +152,18 @@
152
152
 
153
153
  /* Overscroll and any sub-viewport rounding still expose the page body at
154
154
  the edges; a page carrying the stage paints its whole shell dark. */
155
- :is(.mkt, .atelic-ui):has(.gate-stage) {
155
+ .atelic-ui:has(.gate-stage) {
156
156
  background: var(--surface-dark);
157
157
  }
158
158
 
159
159
  /* ---- the gate card, staged dark ---- */
160
- :is(.mkt, .atelic-ui) .gate-hall {
160
+ .atelic-ui .gate-hall {
161
161
  display: grid;
162
162
  place-items: center;
163
163
  min-height: calc(100svh - var(--nav-height));
164
164
  padding-block: clamp(48px, 9vh, 96px);
165
165
  }
166
- :is(.mkt, .atelic-ui) .gate-card {
166
+ .atelic-ui .gate-card {
167
167
  width: 100%;
168
168
  max-width: 520px;
169
169
  margin-inline: auto;
@@ -173,13 +173,13 @@
173
173
  background: var(--gs-panel);
174
174
  text-align: center;
175
175
  }
176
- :is(.mkt, .atelic-ui) .gate-stage .gate-eyebrow {
176
+ .atelic-ui .gate-stage .gate-eyebrow {
177
177
  margin: 0 0 12px;
178
178
  font-size: 12.5px;
179
179
  letter-spacing: 0.02em;
180
180
  color: var(--gs-faint);
181
181
  }
182
- :is(.mkt, .atelic-ui) .gate-stage .gate-headline {
182
+ .atelic-ui .gate-stage .gate-headline {
183
183
  margin: 0 0 12px;
184
184
  font-family: var(--font-sans);
185
185
  font-weight: 800;
@@ -189,26 +189,26 @@
189
189
  max-width: none;
190
190
  color: var(--gs-bright);
191
191
  }
192
- :is(.mkt, .atelic-ui) .gate-stage .gate-lead {
192
+ .atelic-ui .gate-stage .gate-lead {
193
193
  margin: 0 auto 26px;
194
194
  max-width: 42ch;
195
195
  font-size: 15px;
196
196
  line-height: 1.6;
197
197
  color: var(--gs-dim);
198
198
  }
199
- :is(.mkt, .atelic-ui) .gate-stage .gate-input {
199
+ .atelic-ui .gate-stage .gate-input {
200
200
  border-color: var(--gs-border);
201
201
  background: color-mix(in srgb, var(--surface-dark) 94%, var(--surface));
202
202
  color: var(--gs-bright);
203
203
  }
204
- :is(.mkt, .atelic-ui) .gate-stage .gate-input::placeholder {
204
+ .atelic-ui .gate-stage .gate-input::placeholder {
205
205
  color: var(--gs-faint);
206
206
  }
207
- :is(.mkt, .atelic-ui) .gate-stage .gate-input:focus-visible {
207
+ .atelic-ui .gate-stage .gate-input:focus-visible {
208
208
  border-color: var(--primary-bright);
209
209
  box-shadow: 0 0 0 3px var(--primary-focus-ring);
210
210
  }
211
- :is(.mkt, .atelic-ui) .gate-stage .gate-error {
211
+ .atelic-ui .gate-stage .gate-error {
212
212
  margin: 20px auto 0;
213
213
  max-width: 46ch;
214
214
  font-size: 14.5px;
@@ -223,12 +223,12 @@
223
223
  Everything below styles HTML the content module authors, so the
224
224
  selectors are element level inside .gate-content rather than a class
225
225
  per line. A client document writes plain markup and inherits this. */
226
- :is(.mkt, .atelic-ui) .gate-doc {
226
+ .atelic-ui .gate-doc {
227
227
  /* The stage itself clears the fixed nav, so the document pads only
228
228
  its own breathing room. */
229
229
  padding-block: clamp(44px, 8vh, 88px) clamp(64px, 12vh, 132px);
230
230
  }
231
- :is(.mkt, .atelic-ui) .gate-content {
231
+ .atelic-ui .gate-content {
232
232
  /* The document column matches the chrome: .wrap and .nav-inner share
233
233
  --max-width, so the text aligns with the header bar's edges rather
234
234
  than sitting in a narrower centered measure. */
@@ -236,29 +236,29 @@
236
236
  font-size: 16.5px;
237
237
  line-height: 1.7;
238
238
  }
239
- :is(.mkt, .atelic-ui) .gate-content h1 {
239
+ .atelic-ui .gate-content h1 {
240
240
  margin: 0 0 10px;
241
241
  font-size: clamp(30px, 4.4vw, 46px);
242
242
  line-height: 1.06;
243
243
  color: var(--gs-bright);
244
244
  text-wrap: balance;
245
245
  }
246
- :is(.mkt, .atelic-ui) .gate-content h2 {
246
+ .atelic-ui .gate-content h2 {
247
247
  margin: 52px 0 14px;
248
248
  font-size: clamp(21px, 2.6vw, 27px);
249
249
  line-height: 1.2;
250
250
  color: var(--gs-bright);
251
251
  }
252
- :is(.mkt, .atelic-ui) .gate-content h3 {
252
+ .atelic-ui .gate-content h3 {
253
253
  margin: 28px 0 8px;
254
254
  font-size: 17px;
255
255
  color: var(--gs-bright);
256
256
  }
257
- :is(.mkt, .atelic-ui) .gate-content p {
257
+ .atelic-ui .gate-content p {
258
258
  margin: 0 0 16px;
259
259
  text-wrap: pretty;
260
260
  }
261
- :is(.mkt, .atelic-ui) .gate-content ul {
261
+ .atelic-ui .gate-content ul {
262
262
  margin: 0 0 16px;
263
263
  padding-left: 22px;
264
264
  display: flex;
@@ -266,35 +266,35 @@
266
266
  gap: 8px;
267
267
  list-style: disc;
268
268
  }
269
- :is(.mkt, .atelic-ui) .gate-content li {
269
+ .atelic-ui .gate-content li {
270
270
  display: list-item;
271
271
  list-style: disc;
272
272
  margin: 0;
273
273
  }
274
- :is(.mkt, .atelic-ui) .gate-content li::marker {
274
+ .atelic-ui .gate-content li::marker {
275
275
  color: var(--primary-bright);
276
276
  }
277
- :is(.mkt, .atelic-ui) .gate-content strong {
277
+ .atelic-ui .gate-content strong {
278
278
  color: var(--gs-bright);
279
279
  font-weight: 600;
280
280
  }
281
- :is(.mkt, .atelic-ui) .gate-content a {
281
+ .atelic-ui .gate-content a {
282
282
  color: var(--primary-bright);
283
283
  text-decoration: none;
284
284
  border-bottom: 1px solid currentColor;
285
285
  }
286
- :is(.mkt, .atelic-ui) .gate-content hr {
286
+ .atelic-ui .gate-content hr {
287
287
  margin: 44px 0;
288
288
  border: 0;
289
289
  border-top: 1px solid var(--gs-hairline);
290
290
  }
291
- :is(.mkt, .atelic-ui) .gate-meta {
291
+ .atelic-ui .gate-meta {
292
292
  margin: 0 0 34px;
293
293
  font-family: var(--font-mono);
294
294
  font-size: 12.5px;
295
295
  color: var(--gs-faint);
296
296
  }
297
- :is(.mkt, .atelic-ui) .gate-lede {
297
+ .atelic-ui .gate-lede {
298
298
  font-size: 18px;
299
299
  color: var(--gs-bright);
300
300
  }
@@ -302,7 +302,7 @@
302
302
  /* Tier cards: the shape of a three option quote. Faded panels on the
303
303
  stage, one hairline lifted to mark the recommended option; no filled
304
304
  color anywhere, so the CTA button stays the only saturated thing. */
305
- :is(.mkt, .atelic-ui) .gate-tiers {
305
+ .atelic-ui .gate-tiers {
306
306
  display: grid;
307
307
  /* Three explicit columns: auto-fit minted a fourth empty track at
308
308
  document width and squeezed the cards into three quarters of the
@@ -312,11 +312,11 @@
312
312
  margin: 24px 0 8px;
313
313
  }
314
314
  @media (max-width: 860px) {
315
- :is(.mkt, .atelic-ui) .gate-tiers {
315
+ .atelic-ui .gate-tiers {
316
316
  grid-template-columns: 1fr;
317
317
  }
318
318
  }
319
- :is(.mkt, .atelic-ui) .gate-tier {
319
+ .atelic-ui .gate-tier {
320
320
  display: flex;
321
321
  flex-direction: column;
322
322
  gap: 6px;
@@ -326,20 +326,20 @@
326
326
  background: var(--gs-panel);
327
327
  min-width: 0;
328
328
  }
329
- :is(.mkt, .atelic-ui) .gate-tier.is-picked {
329
+ .atelic-ui .gate-tier.is-picked {
330
330
  border-color: color-mix(in srgb, var(--primary-bright) 55%, transparent);
331
331
  }
332
- :is(.mkt, .atelic-ui) .gate-tier-name {
332
+ .atelic-ui .gate-tier-name {
333
333
  font-weight: 600;
334
334
  font-size: 17px;
335
335
  color: var(--gs-bright);
336
336
  }
337
- :is(.mkt, .atelic-ui) .gate-tier-price {
337
+ .atelic-ui .gate-tier-price {
338
338
  font-family: var(--font-mono);
339
339
  font-size: 21px;
340
340
  color: var(--primary-bright);
341
341
  }
342
- :is(.mkt, .atelic-ui) .gate-tier-note {
342
+ .atelic-ui .gate-tier-note {
343
343
  font-size: 14px;
344
344
  line-height: 1.55;
345
345
  color: var(--gs-dim);
@@ -360,7 +360,7 @@
360
360
  Amounts take grid column one (right-aligned, shared right edge);
361
361
  labels take column two. A bare .gate-tier-price outside the math
362
362
  block (the add-on card) keeps its standalone look. */
363
- :is(.mkt, .atelic-ui) .gate-tier-math {
363
+ .atelic-ui .gate-tier-math {
364
364
  display: grid;
365
365
  grid-template-columns: max-content auto;
366
366
  column-gap: 10px;
@@ -368,24 +368,36 @@
368
368
  align-items: baseline;
369
369
  justify-content: start;
370
370
  }
371
- :is(.mkt, .atelic-ui) .gate-tier-math .gate-tier-was,
372
- :is(.mkt, .atelic-ui) .gate-tier-math .gate-tier-credit,
373
- :is(.mkt, .atelic-ui) .gate-tier-math .gate-tier-price {
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
374
  grid-column: 1;
375
375
  text-align: right;
376
376
  }
377
- :is(.mkt, .atelic-ui) .gate-tier-mathlabel {
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 {
378
381
  grid-column: 2;
379
382
  font-size: 13px;
380
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);
381
393
  }
382
- :is(.mkt, .atelic-ui) .gate-tier-was {
394
+ .atelic-ui .gate-tier-was {
383
395
  font-family: var(--font-mono);
384
396
  font-size: 15px;
385
397
  color: var(--gs-faint);
386
398
  text-decoration: line-through;
387
399
  }
388
- :is(.mkt, .atelic-ui) .gate-tier-credit {
400
+ .atelic-ui .gate-tier-credit {
389
401
  font-family: var(--font-mono);
390
402
  font-size: 14px;
391
403
  color: var(--gs-dim);
@@ -393,14 +405,57 @@
393
405
 
394
406
  /* A full width card in the tier grid, for an add-on (a monthly service
395
407
  under one-time builds) that applies across every column. */
396
- :is(.mkt, .atelic-ui) .gate-tiers .gate-tier.is-addon {
408
+ .atelic-ui .gate-tiers .gate-tier.is-addon {
397
409
  grid-column: 1 / -1;
398
410
  }
399
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
+
400
455
  /* The icon list: the standard sent artifact list form, each line led
401
456
  by a small lucide icon that says what the line means. The sealed
402
457
  content inlines the SVGs. */
403
- :is(.mkt, .atelic-ui) .gate-content ul.icon-list {
458
+ .atelic-ui .gate-content ul.icon-list {
404
459
  list-style: none;
405
460
  margin: 0 0 16px;
406
461
  padding: 0;
@@ -408,51 +463,66 @@
408
463
  flex-direction: column;
409
464
  gap: 12px;
410
465
  }
411
- :is(.mkt, .atelic-ui) .gate-content ul.icon-list li {
466
+ .atelic-ui .gate-content ul.icon-list li {
412
467
  display: flex;
413
468
  align-items: flex-start;
414
469
  gap: 12px;
415
470
  margin: 0;
416
471
  list-style: none;
417
472
  }
418
- :is(.mkt, .atelic-ui) .gate-content ul.icon-list svg {
473
+ .atelic-ui .gate-content ul.icon-list svg {
419
474
  width: 18px;
420
475
  height: 18px;
421
476
  flex: 0 0 auto;
422
477
  margin-top: 3px;
423
478
  color: var(--primary-bright);
424
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
+ }
425
495
 
426
496
  /* Numbered flow: the ordered list for a step-by-step close. */
427
- :is(.mkt, .atelic-ui) .gate-content ol {
497
+ .atelic-ui .gate-content ol {
428
498
  margin: 0 0 16px;
429
499
  padding-left: 24px;
430
500
  display: flex;
431
501
  flex-direction: column;
432
502
  gap: 10px;
433
503
  }
434
- :is(.mkt, .atelic-ui) .gate-content ol li {
504
+ .atelic-ui .gate-content ol li {
435
505
  display: list-item;
436
506
  list-style: decimal;
437
507
  margin: 0;
438
508
  }
439
- :is(.mkt, .atelic-ui) .gate-content ol li::marker {
509
+ .atelic-ui .gate-content ol li::marker {
440
510
  color: var(--primary-bright);
441
511
  font-weight: 700;
442
512
  }
443
513
 
444
514
  /* Icon bullets: a checklist variant of the document list, worn by any
445
515
  ul.gate-checks in the sealed content or inside a tier card. */
446
- :is(.mkt, .atelic-ui) .gate-content ul.gate-checks {
516
+ .atelic-ui .gate-content ul.gate-checks {
447
517
  list-style: none;
448
518
  padding-left: 0;
449
519
  }
450
- :is(.mkt, .atelic-ui) .gate-content .gate-checks li {
520
+ .atelic-ui .gate-content .gate-checks li {
451
521
  position: relative;
452
522
  list-style: none;
453
523
  padding-left: 26px;
454
524
  }
455
- :is(.mkt, .atelic-ui) .gate-content .gate-checks li::before {
525
+ .atelic-ui .gate-content .gate-checks li::before {
456
526
  /* The lucide check, masked so it takes the accent color. A glyph
457
527
  character would trip the icons-over-emojis test; an SVG matches
458
528
  the icon set the rest of the site draws from. */
@@ -470,7 +540,7 @@
470
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")
471
541
  center / contain no-repeat;
472
542
  }
473
- :is(.mkt, .atelic-ui) .gate-tier ul.gate-checks {
543
+ .atelic-ui .gate-tier ul.gate-checks {
474
544
  margin: 6px 0 0;
475
545
  display: grid;
476
546
  gap: 8px;
@@ -478,12 +548,12 @@
478
548
  line-height: 1.5;
479
549
  color: var(--gs-dim);
480
550
  }
481
- :is(.mkt, .atelic-ui) .gate-tier .gate-checks li {
551
+ .atelic-ui .gate-tier .gate-checks li {
482
552
  padding-left: 22px;
483
553
  }
484
554
 
485
555
  /* ---- the close: sign off, then the person lockup ---- */
486
- :is(.mkt, .atelic-ui) .gate-sign {
556
+ .atelic-ui .gate-sign {
487
557
  margin: 44px 0 18px;
488
558
  /* The pitch surface sign off is the script face (voice.md rule 9),
489
559
  the same face the writeup and the monthly page close on, centered
@@ -493,14 +563,14 @@
493
563
  color: var(--secondary-soft);
494
564
  text-align: center;
495
565
  }
496
- :is(.mkt, .atelic-ui) .gate-person {
566
+ .atelic-ui .gate-person {
497
567
  display: flex;
498
568
  align-items: center;
499
569
  justify-content: center;
500
570
  gap: 18px;
501
571
  text-align: left;
502
572
  }
503
- :is(.mkt, .atelic-ui) .gate-person img {
573
+ .atelic-ui .gate-person img {
504
574
  width: 88px;
505
575
  height: 88px;
506
576
  border-radius: 50%;
@@ -508,23 +578,23 @@
508
578
  display: block;
509
579
  flex: none;
510
580
  }
511
- :is(.mkt, .atelic-ui) .gate-person-name {
581
+ .atelic-ui .gate-person-name {
512
582
  display: block;
513
583
  font-weight: 600;
514
584
  font-size: 17px;
515
585
  color: var(--gs-bright);
516
586
  }
517
- :is(.mkt, .atelic-ui) .gate-person-role {
587
+ .atelic-ui .gate-person-role {
518
588
  display: block;
519
589
  margin-top: 4px;
520
590
  font-size: 14px;
521
591
  color: var(--gs-dim);
522
592
  }
523
- :is(.mkt, .atelic-ui) .gate-person-role a {
593
+ .atelic-ui .gate-person-role a {
524
594
  color: inherit;
525
595
  border-bottom: 1px solid currentColor;
526
596
  }
527
- :is(.mkt, .atelic-ui) .gate-person-mail {
597
+ .atelic-ui .gate-person-mail {
528
598
  display: inline-flex;
529
599
  align-items: center;
530
600
  gap: 7px;
@@ -536,7 +606,7 @@
536
606
  border-bottom: 1px solid currentColor;
537
607
  padding-bottom: 1px;
538
608
  }
539
- :is(.mkt, .atelic-ui) .gate-person-mail svg {
609
+ .atelic-ui .gate-person-mail svg {
540
610
  width: 15px;
541
611
  height: 15px;
542
612
  }
@@ -556,7 +626,7 @@
556
626
  Tokens only (theme.css), except the printed sheet's white. The grade
557
627
  chip and the sign off are the shared classes at the head of this sheet.
558
628
  ================================================================= */
559
- :is(.mkt, .atelic-ui) .rp {
629
+ .atelic-ui .rp {
560
630
  --rp-ink: var(--ink);
561
631
  --rp-ink-soft: var(--ink-soft);
562
632
  --rp-ink-faint: var(--neutral-500);
@@ -568,16 +638,16 @@
568
638
  background: var(--surface);
569
639
  padding: calc(var(--nav-height) + 32px) 24px 48px;
570
640
  }
571
- :is(.mkt, .atelic-ui) .rp a {
641
+ .atelic-ui .rp a {
572
642
  color: inherit;
573
643
  text-decoration: none;
574
644
  }
575
- :is(.mkt, .atelic-ui) .rp a:hover {
645
+ .atelic-ui .rp a:hover {
576
646
  color: var(--rp-accent);
577
647
  }
578
648
 
579
649
  /* ---- the sheet ---- */
580
- :is(.mkt, .atelic-ui) .rp-sheet {
650
+ .atelic-ui .rp-sheet {
581
651
  width: 8.5in;
582
652
  max-width: 100%;
583
653
  margin: 0 auto;
@@ -592,14 +662,14 @@
592
662
  }
593
663
 
594
664
  /* ---- the title and the period ---- */
595
- :is(.mkt, .atelic-ui) .rp-period {
665
+ .atelic-ui .rp-period {
596
666
  font-family: var(--font-mono);
597
667
  font-size: 8pt;
598
668
  letter-spacing: 0.12em;
599
669
  text-transform: uppercase;
600
670
  color: var(--rp-accent);
601
671
  }
602
- :is(.mkt, .atelic-ui) .rp h1 {
672
+ .atelic-ui .rp h1 {
603
673
  font-family: var(--font-sans);
604
674
  font-size: 25pt;
605
675
  font-weight: 600;
@@ -611,7 +681,7 @@
611
681
  }
612
682
 
613
683
  /* ---- the leads: four questions, each a figure and one sentence ---- */
614
- :is(.mkt, .atelic-ui) .rp-leads {
684
+ .atelic-ui .rp-leads {
615
685
  display: grid;
616
686
  grid-template-columns: repeat(4, minmax(0, 1fr));
617
687
  gap: 0 16pt;
@@ -619,13 +689,13 @@
619
689
  border-top: 1.5px solid var(--rp-ink);
620
690
  border-bottom: 1px solid var(--rp-rule);
621
691
  }
622
- :is(.mkt, .atelic-ui) .rp-lead {
692
+ .atelic-ui .rp-lead {
623
693
  display: flex;
624
694
  flex-direction: column;
625
695
  gap: 3pt;
626
696
  min-width: 0;
627
697
  }
628
- :is(.mkt, .atelic-ui) .rp-q {
698
+ .atelic-ui .rp-q {
629
699
  margin: 0;
630
700
  font-family: var(--font-mono);
631
701
  font-size: 7pt;
@@ -635,14 +705,14 @@
635
705
  text-transform: uppercase;
636
706
  color: var(--rp-accent);
637
707
  }
638
- :is(.mkt, .atelic-ui) .rp-figure {
708
+ .atelic-ui .rp-figure {
639
709
  font-size: 18pt;
640
710
  font-weight: 600;
641
711
  letter-spacing: -0.02em;
642
712
  line-height: 1.1;
643
713
  color: var(--rp-ink);
644
714
  }
645
- :is(.mkt, .atelic-ui) .rp-lead p {
715
+ .atelic-ui .rp-lead p {
646
716
  margin: 0;
647
717
  font-size: 8.4pt;
648
718
  line-height: 1.4;
@@ -651,14 +721,14 @@
651
721
  }
652
722
 
653
723
  /* ---- the seven grades: now, last month, baseline, what moved ---- */
654
- :is(.mkt, .atelic-ui) .rp-grades {
724
+ .atelic-ui .rp-grades {
655
725
  width: 100%;
656
726
  border-collapse: collapse;
657
727
  margin: 14pt 0 16pt;
658
728
  font-size: 8.4pt;
659
729
  line-height: 1.35;
660
730
  }
661
- :is(.mkt, .atelic-ui) .rp-grades th {
731
+ .atelic-ui .rp-grades th {
662
732
  text-align: left;
663
733
  padding: 0 6pt 4pt 0;
664
734
  border-bottom: 1.5px solid var(--rp-ink);
@@ -670,16 +740,16 @@
670
740
  white-space: nowrap;
671
741
  color: var(--rp-ink-faint);
672
742
  }
673
- :is(.mkt, .atelic-ui) .rp-grades td {
743
+ .atelic-ui .rp-grades td {
674
744
  padding: 4pt 6pt 4pt 0;
675
745
  border-bottom: 1px solid var(--rp-rule);
676
746
  vertical-align: top;
677
747
  color: var(--rp-ink);
678
748
  }
679
- :is(.mkt, .atelic-ui) .rp-grades tr.is-tier-start:not(:first-child) td {
749
+ .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) td {
680
750
  border-top: 1px solid var(--rp-ink);
681
751
  }
682
- :is(.mkt, .atelic-ui) .rp-tier {
752
+ .atelic-ui .rp-tier {
683
753
  width: 0.85in;
684
754
  font-family: var(--font-mono);
685
755
  font-size: 7pt;
@@ -687,30 +757,30 @@
687
757
  text-transform: uppercase;
688
758
  white-space: nowrap;
689
759
  }
690
- :is(.mkt, .atelic-ui) .rp-section {
760
+ .atelic-ui .rp-section {
691
761
  width: 1.9in;
692
762
  font-weight: 600;
693
763
  white-space: nowrap;
694
764
  }
695
- :is(.mkt, .atelic-ui) .rp-now,
696
- :is(.mkt, .atelic-ui) .rp-earlier {
765
+ .atelic-ui .rp-now,
766
+ .atelic-ui .rp-earlier {
697
767
  width: 0.65in;
698
768
  white-space: nowrap;
699
769
  }
700
- :is(.mkt, .atelic-ui) .rp-grades .op-grade {
770
+ .atelic-ui .rp-grades .op-grade {
701
771
  margin-left: 0;
702
772
  }
703
773
  /* The earlier letters print muted; this month's is the one judgement. */
704
- :is(.mkt, .atelic-ui) .rp-earlier .op-grade {
774
+ .atelic-ui .rp-earlier .op-grade {
705
775
  opacity: 0.45;
706
776
  }
707
- :is(.mkt, .atelic-ui) .rp-moved {
777
+ .atelic-ui .rp-moved {
708
778
  color: var(--rp-ink-soft);
709
779
  text-wrap: pretty;
710
780
  }
711
781
 
712
782
  /* ---- the close ---- */
713
- :is(.mkt, .atelic-ui) .rp-close {
783
+ .atelic-ui .rp-close {
714
784
  margin-top: auto;
715
785
  padding-top: 10pt;
716
786
  border-top: 1px solid var(--rp-rule);
@@ -721,40 +791,40 @@
721
791
 
722
792
  /* ---- the column: phones and portrait tablets ---- */
723
793
  @media screen and (max-width: 899px) {
724
- :is(.mkt, .atelic-ui) .rp {
794
+ .atelic-ui .rp {
725
795
  padding: calc(var(--nav-height) + 8px) 0 0;
726
796
  }
727
- :is(.mkt, .atelic-ui) .rp-sheet {
797
+ .atelic-ui .rp-sheet {
728
798
  padding: 22px 18px 24px;
729
799
  border-radius: 0;
730
800
  box-shadow: none;
731
801
  }
732
- :is(.mkt, .atelic-ui) .rp-period {
802
+ .atelic-ui .rp-period {
733
803
  font-size: 11px;
734
804
  }
735
- :is(.mkt, .atelic-ui) .rp h1 {
805
+ .atelic-ui .rp h1 {
736
806
  font-size: 30px;
737
807
  margin: 8px 0 16px;
738
808
  }
739
- :is(.mkt, .atelic-ui) .rp-leads {
809
+ .atelic-ui .rp-leads {
740
810
  grid-template-columns: repeat(2, minmax(0, 1fr));
741
811
  gap: 18px 16px;
742
812
  padding: 16px 0 18px;
743
813
  }
744
- :is(.mkt, .atelic-ui) .rp-q {
814
+ .atelic-ui .rp-q {
745
815
  font-size: 11px;
746
816
  }
747
- :is(.mkt, .atelic-ui) .rp-figure {
817
+ .atelic-ui .rp-figure {
748
818
  font-size: 24px;
749
819
  }
750
- :is(.mkt, .atelic-ui) .rp-lead p {
820
+ .atelic-ui .rp-lead p {
751
821
  font-size: 14px;
752
822
  line-height: 1.45;
753
823
  }
754
- :is(.mkt, .atelic-ui) .rp-grades {
824
+ .atelic-ui .rp-grades {
755
825
  font-size: 14px;
756
826
  }
757
- :is(.mkt, .atelic-ui) .rp-grades thead {
827
+ .atelic-ui .rp-grades thead {
758
828
  position: absolute;
759
829
  width: 1px;
760
830
  height: 1px;
@@ -762,7 +832,7 @@
762
832
  clip: rect(0, 0, 0, 0);
763
833
  white-space: nowrap;
764
834
  }
765
- :is(.mkt, .atelic-ui) .rp-grades tr {
835
+ .atelic-ui .rp-grades tr {
766
836
  display: flex;
767
837
  flex-wrap: wrap;
768
838
  align-items: baseline;
@@ -770,36 +840,36 @@
770
840
  padding: 10px 0;
771
841
  border-bottom: 1px solid var(--rp-rule);
772
842
  }
773
- :is(.mkt, .atelic-ui) .rp-grades tr.is-tier-start:not(:first-child) {
843
+ .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) {
774
844
  border-top: 1px solid var(--rp-ink);
775
845
  }
776
- :is(.mkt, .atelic-ui) .rp-grades td {
846
+ .atelic-ui .rp-grades td {
777
847
  display: block;
778
848
  width: auto;
779
849
  padding: 0;
780
850
  border: none;
781
851
  }
782
- :is(.mkt, .atelic-ui) .rp-grades tr.is-tier-start:not(:first-child) td {
852
+ .atelic-ui .rp-grades tr.is-tier-start:not(:first-child) td {
783
853
  border: none;
784
854
  }
785
855
  /* Each row folds to the tier on its own line (first row of a tier
786
856
  only), the section, the three letters, then what moved. */
787
- :is(.mkt, .atelic-ui) .rp-grades .rp-tier,
788
- :is(.mkt, .atelic-ui) .rp-grades .rp-section,
789
- :is(.mkt, .atelic-ui) .rp-grades .rp-moved {
857
+ .atelic-ui .rp-grades .rp-tier,
858
+ .atelic-ui .rp-grades .rp-section,
859
+ .atelic-ui .rp-grades .rp-moved {
790
860
  width: 100%;
791
861
  }
792
- :is(.mkt, .atelic-ui) .rp-tier {
862
+ .atelic-ui .rp-tier {
793
863
  font-size: 10px;
794
864
  }
795
- :is(.mkt, .atelic-ui) .rp-tier:empty {
865
+ .atelic-ui .rp-tier:empty {
796
866
  display: none;
797
867
  }
798
- :is(.mkt, .atelic-ui) .rp-section {
868
+ .atelic-ui .rp-section {
799
869
  white-space: normal;
800
870
  }
801
- :is(.mkt, .atelic-ui) .rp-now::before,
802
- :is(.mkt, .atelic-ui) .rp-earlier::before {
871
+ .atelic-ui .rp-now::before,
872
+ .atelic-ui .rp-earlier::before {
803
873
  content: attr(data-label);
804
874
  margin-right: 6px;
805
875
  font-family: var(--font-mono);
@@ -808,10 +878,10 @@
808
878
  text-transform: uppercase;
809
879
  color: var(--rp-ink-faint);
810
880
  }
811
- :is(.mkt, .atelic-ui) .rp-earlier:empty {
881
+ .atelic-ui .rp-earlier:empty {
812
882
  display: none;
813
883
  }
814
- :is(.mkt, .atelic-ui) .rp-close {
884
+ .atelic-ui .rp-close {
815
885
  padding-top: 16px;
816
886
  font-size: 13px;
817
887
  }
@@ -829,16 +899,16 @@
829
899
  padding: 0;
830
900
  background: none;
831
901
  }
832
- :is(.mkt, .atelic-ui):has(.rp) .nav,
833
- :is(.mkt, .atelic-ui):has(.rp) .skip-link,
834
- :is(.mkt, .atelic-ui):has(.rp) .credit-bar {
902
+ .atelic-ui:has(.rp) .nav,
903
+ .atelic-ui:has(.rp) .skip-link,
904
+ .atelic-ui:has(.rp) .credit-bar {
835
905
  display: none;
836
906
  }
837
- :is(.mkt, .atelic-ui) .rp {
907
+ .atelic-ui .rp {
838
908
  padding: 0;
839
909
  background: none;
840
910
  }
841
- :is(.mkt, .atelic-ui) .rp-sheet {
911
+ .atelic-ui .rp-sheet {
842
912
  width: 8.5in;
843
913
  height: 11in;
844
914
  max-width: none;
@@ -865,10 +935,10 @@
865
935
 
866
936
  Tokens only (theme.css). The blocks inside a section (the checklist,
867
937
  the sortable table, the charts, the stat row, the callout, the
868
- collapsible) and their tones are styles/components.css's; this sheet sets
938
+ disclosure) and their tones are styles/components.css's; this sheet sets
869
939
  the document around them and their sizes here.
870
940
  ================================================================= */
871
- :is(.mkt, .atelic-ui) .op {
941
+ .atelic-ui .op {
872
942
  --op-ink: var(--ink);
873
943
  --op-ink-soft: var(--ink-soft);
874
944
  --op-ink-faint: var(--neutral-500);
@@ -880,11 +950,11 @@
880
950
  background: var(--surface);
881
951
  min-height: 100vh;
882
952
  }
883
- :is(.mkt, .atelic-ui) .op a {
953
+ .atelic-ui .op a {
884
954
  color: inherit;
885
955
  text-decoration: none;
886
956
  }
887
- :is(.mkt, .atelic-ui) .op-doc {
957
+ .atelic-ui .op-doc {
888
958
  max-width: 920px;
889
959
  margin: 0 auto;
890
960
  padding: calc(var(--nav-height) + 22px) 16px 48px;
@@ -895,28 +965,28 @@
895
965
  }
896
966
 
897
967
  /* ---- the head: who it is for, what it is ---- */
898
- :is(.mkt, .atelic-ui) .op-top {
968
+ .atelic-ui .op-top {
899
969
  display: none;
900
970
  }
901
- :is(.mkt, .atelic-ui) .op-meta {
971
+ .atelic-ui .op-meta {
902
972
  margin: 0 0 10px;
903
973
  font-family: var(--font-mono);
904
974
  font-size: 12.5px;
905
975
  letter-spacing: 0.04em;
906
976
  color: var(--op-ink-faint);
907
977
  }
908
- :is(.mkt, .atelic-ui) .op-meta b {
978
+ .atelic-ui .op-meta b {
909
979
  font-weight: 500;
910
980
  color: var(--op-ink-soft);
911
981
  }
912
982
  /* On a phone the date takes its own line; wide, it follows a middle dot. */
913
- :is(.mkt, .atelic-ui) .op-meta-sep {
983
+ .atelic-ui .op-meta-sep {
914
984
  display: none;
915
985
  }
916
- :is(.mkt, .atelic-ui) .op-meta-date {
986
+ .atelic-ui .op-meta-date {
917
987
  display: block;
918
988
  }
919
- :is(.mkt, .atelic-ui) .op h1 {
989
+ .atelic-ui .op h1 {
920
990
  font-size: clamp(32px, 5vw, 44px);
921
991
  font-weight: 650;
922
992
  letter-spacing: -0.03em;
@@ -925,7 +995,7 @@
925
995
  text-wrap: balance;
926
996
  color: var(--op-ink);
927
997
  }
928
- :is(.mkt, .atelic-ui) .op-intro {
998
+ .atelic-ui .op-intro {
929
999
  margin: 14px 0 0;
930
1000
  max-width: 62ch;
931
1001
  font-size: 16.5px;
@@ -935,7 +1005,7 @@
935
1005
  }
936
1006
 
937
1007
  /* ---- the grade chip, at web sizes ---- */
938
- :is(.mkt, .atelic-ui) .op .op-grade {
1008
+ .atelic-ui .op .op-grade {
939
1009
  display: inline-grid;
940
1010
  place-items: center;
941
1011
  margin: 0;
@@ -954,11 +1024,11 @@
954
1024
 
955
1025
  /* ---- the overview: the key, then every section under its tier, each a
956
1026
  grade, a name that links to the section, and one plain read ---- */
957
- :is(.mkt, .atelic-ui) .op-ov {
1027
+ .atelic-ui .op-ov {
958
1028
  margin-top: 22px;
959
1029
  scroll-margin-top: calc(var(--nav-height) + 16px);
960
1030
  }
961
- :is(.mkt, .atelic-ui) .op-ov-head {
1031
+ .atelic-ui .op-ov-head {
962
1032
  display: flex;
963
1033
  flex-wrap: wrap;
964
1034
  align-items: center;
@@ -966,7 +1036,7 @@
966
1036
  gap: 8px 20px;
967
1037
  margin-bottom: 10px;
968
1038
  }
969
- :is(.mkt, .atelic-ui) .op-ov-title {
1039
+ .atelic-ui .op-ov-title {
970
1040
  font-size: 13px;
971
1041
  font-family: var(--font-mono);
972
1042
  font-weight: 500;
@@ -975,7 +1045,7 @@
975
1045
  color: var(--op-ink-faint);
976
1046
  margin: 0;
977
1047
  }
978
- :is(.mkt, .atelic-ui) .op-legend {
1048
+ .atelic-ui .op-legend {
979
1049
  list-style: none;
980
1050
  margin: 0;
981
1051
  padding: 0;
@@ -985,25 +1055,25 @@
985
1055
  font-size: 13.5px;
986
1056
  color: var(--op-ink-soft);
987
1057
  }
988
- :is(.mkt, .atelic-ui) .op-legend li {
1058
+ .atelic-ui .op-legend li {
989
1059
  display: inline-flex;
990
1060
  align-items: center;
991
1061
  gap: 7px;
992
1062
  }
993
- :is(.mkt, .atelic-ui) .op-legend .op-grade {
1063
+ .atelic-ui .op-legend .op-grade {
994
1064
  width: 22px;
995
1065
  height: 22px;
996
1066
  border-radius: 6px;
997
1067
  font-size: 12px;
998
1068
  }
999
- :is(.mkt, .atelic-ui) .op-ov-card {
1069
+ .atelic-ui .op-ov-card {
1000
1070
  background: var(--op-card);
1001
1071
  border: 1px solid var(--op-rule);
1002
1072
  border-radius: var(--radius-md);
1003
1073
  box-shadow: var(--shadow-sm);
1004
1074
  overflow: hidden;
1005
1075
  }
1006
- :is(.mkt, .atelic-ui) .op-ov-tier-label {
1076
+ .atelic-ui .op-ov-tier-label {
1007
1077
  padding: 7px 16px;
1008
1078
  background: var(--surface-alt);
1009
1079
  font-family: var(--font-mono);
@@ -1012,12 +1082,12 @@
1012
1082
  text-transform: uppercase;
1013
1083
  color: var(--op-ink-soft);
1014
1084
  }
1015
- :is(.mkt, .atelic-ui) .op-ov-tier ul {
1085
+ .atelic-ui .op-ov-tier ul {
1016
1086
  list-style: none;
1017
1087
  margin: 0;
1018
1088
  padding: 0;
1019
1089
  }
1020
- :is(.mkt, .atelic-ui) .op-ov-row {
1090
+ .atelic-ui .op-ov-row {
1021
1091
  position: relative;
1022
1092
  display: grid;
1023
1093
  grid-template-columns: auto minmax(0, 1fr) auto;
@@ -1027,25 +1097,25 @@
1027
1097
  padding: 12px 12px 12px 16px;
1028
1098
  border-top: 1px solid var(--op-rule);
1029
1099
  }
1030
- :is(.mkt, .atelic-ui) .op-ov-row:hover {
1100
+ .atelic-ui .op-ov-row:hover {
1031
1101
  background: var(--surface);
1032
1102
  }
1033
- :is(.mkt, .atelic-ui) .op-ov-grade {
1103
+ .atelic-ui .op-ov-grade {
1034
1104
  grid-row: 1 / span 2;
1035
1105
  display: inline-flex;
1036
1106
  align-items: center;
1037
1107
  gap: 6px;
1038
1108
  }
1039
- :is(.mkt, .atelic-ui) .op-ov-grade .op-grade {
1109
+ .atelic-ui .op-ov-grade .op-grade {
1040
1110
  width: 30px;
1041
1111
  height: 30px;
1042
1112
  border-radius: 9px;
1043
1113
  font-size: 15px;
1044
1114
  }
1045
- :is(.mkt, .atelic-ui) .op-ov-before .op-grade {
1115
+ .atelic-ui .op-ov-before .op-grade {
1046
1116
  opacity: 0.45;
1047
1117
  }
1048
- :is(.mkt, .atelic-ui) .op-ov-name {
1118
+ .atelic-ui .op-ov-name {
1049
1119
  font-size: 16px;
1050
1120
  font-weight: 650;
1051
1121
  letter-spacing: -0.01em;
@@ -1054,29 +1124,29 @@
1054
1124
  }
1055
1125
  /* The name is the link, and it covers the row; a link inside the read
1056
1126
  sits above it. */
1057
- :is(.mkt, .atelic-ui) .op-ov-name a::after {
1127
+ .atelic-ui .op-ov-name a::after {
1058
1128
  content: "";
1059
1129
  position: absolute;
1060
1130
  inset: 0;
1061
1131
  }
1062
- :is(.mkt, .atelic-ui) .op-ov-row:hover .op-ov-name {
1132
+ .atelic-ui .op-ov-row:hover .op-ov-name {
1063
1133
  color: var(--op-accent);
1064
1134
  }
1065
- :is(.mkt, .atelic-ui) .op-ov-read {
1135
+ .atelic-ui .op-ov-read {
1066
1136
  grid-column: 2;
1067
1137
  font-size: 15px;
1068
1138
  line-height: 1.45;
1069
1139
  color: var(--op-ink-soft);
1070
1140
  text-wrap: pretty;
1071
1141
  }
1072
- :is(.mkt, .atelic-ui) .op-ov-read a {
1142
+ .atelic-ui .op-ov-read a {
1073
1143
  position: relative;
1074
1144
  z-index: 1;
1075
1145
  color: var(--op-accent);
1076
1146
  text-decoration: underline;
1077
1147
  text-underline-offset: 2px;
1078
1148
  }
1079
- :is(.mkt, .atelic-ui) .op-ov-go {
1149
+ .atelic-ui .op-ov-go {
1080
1150
  grid-column: 3;
1081
1151
  grid-row: 1;
1082
1152
  margin-top: 5px;
@@ -1084,11 +1154,11 @@
1084
1154
  }
1085
1155
 
1086
1156
  /* ---- a part: the tier and the question it answers ---- */
1087
- :is(.mkt, .atelic-ui) .op-part {
1157
+ .atelic-ui .op-part {
1088
1158
  margin: 34px 0 10px;
1089
1159
  scroll-margin-top: calc(var(--nav-height) + 16px);
1090
1160
  }
1091
- :is(.mkt, .atelic-ui) .op-part h2 {
1161
+ .atelic-ui .op-part h2 {
1092
1162
  font-size: 27px;
1093
1163
  font-weight: 650;
1094
1164
  letter-spacing: -0.025em;
@@ -1096,14 +1166,14 @@
1096
1166
  margin: 0;
1097
1167
  color: var(--op-ink);
1098
1168
  }
1099
- :is(.mkt, .atelic-ui) .op-part p {
1169
+ .atelic-ui .op-part p {
1100
1170
  margin: 6px 0 0;
1101
1171
  font-size: 16.5px;
1102
1172
  color: var(--op-ink-soft);
1103
1173
  }
1104
1174
 
1105
1175
  /* ---- a topic: one section, a card of blocks ---- */
1106
- :is(.mkt, .atelic-ui) .op-topic {
1176
+ .atelic-ui .op-topic {
1107
1177
  background: var(--op-card);
1108
1178
  border: 1px solid var(--op-rule);
1109
1179
  border-radius: var(--radius-md);
@@ -1112,13 +1182,13 @@
1112
1182
  margin-top: 12px;
1113
1183
  scroll-margin-top: calc(var(--nav-height) + 16px);
1114
1184
  }
1115
- :is(.mkt, .atelic-ui) .op-topic-head {
1185
+ .atelic-ui .op-topic-head {
1116
1186
  display: flex;
1117
1187
  justify-content: space-between;
1118
1188
  align-items: flex-start;
1119
1189
  gap: 20px;
1120
1190
  }
1121
- :is(.mkt, .atelic-ui) .op-topic h3 {
1191
+ .atelic-ui .op-topic h3 {
1122
1192
  font-size: 21px;
1123
1193
  font-weight: 650;
1124
1194
  letter-spacing: -0.02em;
@@ -1126,21 +1196,21 @@
1126
1196
  margin: 0;
1127
1197
  color: var(--op-ink);
1128
1198
  }
1129
- :is(.mkt, .atelic-ui) .op-topic h3 a {
1199
+ .atelic-ui .op-topic h3 a {
1130
1200
  display: inline-flex;
1131
1201
  align-items: center;
1132
1202
  gap: 6px;
1133
1203
  border-bottom: 1px solid var(--neutral-200);
1134
1204
  }
1135
- :is(.mkt, .atelic-ui) .op-topic h3 a svg {
1205
+ .atelic-ui .op-topic h3 a svg {
1136
1206
  color: var(--op-ink-faint);
1137
1207
  }
1138
- :is(.mkt, .atelic-ui) .op-topic h3 a:hover,
1139
- :is(.mkt, .atelic-ui) .op-topic h3 a:hover svg {
1208
+ .atelic-ui .op-topic h3 a:hover,
1209
+ .atelic-ui .op-topic h3 a:hover svg {
1140
1210
  color: var(--op-accent);
1141
1211
  border-color: var(--op-accent);
1142
1212
  }
1143
- :is(.mkt, .atelic-ui) .op-def {
1213
+ .atelic-ui .op-def {
1144
1214
  margin: 6px 0 0;
1145
1215
  font-size: 16px;
1146
1216
  line-height: 1.45;
@@ -1148,18 +1218,18 @@
1148
1218
  text-wrap: pretty;
1149
1219
  }
1150
1220
  /* why the letter: the rule the section met, in a line */
1151
- :is(.mkt, .atelic-ui) .op-why {
1221
+ .atelic-ui .op-why {
1152
1222
  margin: 6px 0 0;
1153
1223
  font-size: 14.5px;
1154
1224
  line-height: 1.45;
1155
1225
  color: var(--op-ink-soft);
1156
1226
  text-wrap: pretty;
1157
1227
  }
1158
- :is(.mkt, .atelic-ui) .op-why b {
1228
+ .atelic-ui .op-why b {
1159
1229
  font-weight: 650;
1160
1230
  color: var(--op-ink);
1161
1231
  }
1162
- :is(.mkt, .atelic-ui) .op-topic-head > .op-grade {
1232
+ .atelic-ui .op-topic-head > .op-grade {
1163
1233
  width: 42px;
1164
1234
  height: 42px;
1165
1235
  border-radius: 12px;
@@ -1167,45 +1237,45 @@
1167
1237
  }
1168
1238
 
1169
1239
  /* ---- blocks inside a topic, one under another ---- */
1170
- :is(.mkt, .atelic-ui) .op-blocks {
1240
+ .atelic-ui .op-blocks {
1171
1241
  display: grid;
1172
1242
  grid-template-columns: minmax(0, 1fr);
1173
1243
  }
1174
- :is(.mkt, .atelic-ui) .op-block {
1244
+ .atelic-ui .op-block {
1175
1245
  margin-top: 16px;
1176
1246
  padding-top: 16px;
1177
1247
  border-top: 1px solid var(--op-rule);
1178
1248
  min-width: 0;
1179
1249
  }
1180
- :is(.mkt, .atelic-ui) .op-block-head {
1250
+ .atelic-ui .op-block-head {
1181
1251
  margin-bottom: 12px;
1182
1252
  }
1183
- :is(.mkt, .atelic-ui) .op-block-head h4 {
1253
+ .atelic-ui .op-block-head h4 {
1184
1254
  font-size: 16px;
1185
1255
  font-weight: 650;
1186
1256
  letter-spacing: -0.005em;
1187
1257
  margin: 0;
1188
1258
  color: var(--op-ink);
1189
1259
  }
1190
- :is(.mkt, .atelic-ui) .op-block-head p {
1260
+ .atelic-ui .op-block-head p {
1191
1261
  margin: 3px 0 0;
1192
1262
  font-size: 15px;
1193
1263
  line-height: 1.45;
1194
1264
  color: var(--op-ink-soft);
1195
1265
  text-wrap: pretty;
1196
1266
  }
1197
- :is(.mkt, .atelic-ui) .op-note {
1267
+ .atelic-ui .op-note {
1198
1268
  margin: 12px 0 0;
1199
1269
  font-size: 15px;
1200
1270
  line-height: 1.5;
1201
1271
  color: var(--op-ink-soft);
1202
1272
  text-wrap: pretty;
1203
1273
  }
1204
- :is(.mkt, .atelic-ui) .op-note b {
1274
+ .atelic-ui .op-note b {
1205
1275
  color: var(--op-ink);
1206
1276
  font-weight: 600;
1207
1277
  }
1208
- :is(.mkt, .atelic-ui) .op-dash {
1278
+ .atelic-ui .op-dash {
1209
1279
  display: inline-block;
1210
1280
  width: 14px;
1211
1281
  height: 1.5px;
@@ -1215,46 +1285,46 @@
1215
1285
 
1216
1286
  /* The blocks are the shared package's components. These are the writeup's
1217
1287
  sizes for them. */
1218
- :is(.mkt, .atelic-ui) .op-checks .checklist,
1219
- :is(.mkt, .atelic-ui) .op-scale .threshold-scale {
1288
+ .atelic-ui .op-checks .checklist,
1289
+ .atelic-ui .op-scale .threshold-scale {
1220
1290
  font-size: 15px;
1221
1291
  }
1222
- :is(.mkt, .atelic-ui) .op-bar .chart-key,
1223
- :is(.mkt, .atelic-ui) .op-columns .chart-key {
1292
+ .atelic-ui .op-bar .chart-key,
1293
+ .atelic-ui .op-columns .chart-key {
1224
1294
  font-size: 13px;
1225
1295
  }
1226
1296
 
1227
1297
  /* the table: its layout is the shared DataTable's; these are the writeup's
1228
1298
  own sizes and the two line row names. */
1229
- :is(.mkt, .atelic-ui) .op-table .data-table {
1299
+ .atelic-ui .op-table .data-table {
1230
1300
  font-size: 15px;
1231
1301
  }
1232
- :is(.mkt, .atelic-ui) .op-table tbody th b {
1302
+ .atelic-ui .op-table tbody th b {
1233
1303
  display: block;
1234
1304
  font-weight: 600;
1235
1305
  }
1236
- :is(.mkt, .atelic-ui) .op-table tbody th a,
1237
- :is(.mkt, .atelic-ui) .op-table .op-sub {
1306
+ .atelic-ui .op-table tbody th a,
1307
+ .atelic-ui .op-table .op-sub {
1238
1308
  display: block;
1239
1309
  font-family: var(--font-mono);
1240
1310
  font-size: 12px;
1241
1311
  color: var(--op-ink-faint);
1242
1312
  overflow-wrap: anywhere;
1243
1313
  }
1244
- :is(.mkt, .atelic-ui) .op-table tbody th a:hover {
1314
+ .atelic-ui .op-table tbody th a:hover {
1245
1315
  color: var(--op-accent);
1246
1316
  }
1247
- :is(.mkt, .atelic-ui) .op-table tr[data-tone="bad"] th b {
1317
+ .atelic-ui .op-table tr[data-tone="bad"] th b {
1248
1318
  color: var(--tone-bad);
1249
1319
  }
1250
- :is(.mkt, .atelic-ui) .op-table td {
1320
+ .atelic-ui .op-table td {
1251
1321
  white-space: nowrap;
1252
1322
  }
1253
1323
  /* A cell of running words wraps; a cell of figures never does. */
1254
- :is(.mkt, .atelic-ui) .op-table td:has(.op-wrap) {
1324
+ .atelic-ui .op-table td:has(.op-wrap) {
1255
1325
  white-space: normal;
1256
1326
  }
1257
- :is(.mkt, .atelic-ui) .op-mark-cell {
1327
+ .atelic-ui .op-mark-cell {
1258
1328
  display: inline-flex;
1259
1329
  align-items: center;
1260
1330
  gap: 6px;
@@ -1262,42 +1332,42 @@
1262
1332
  font-weight: 600;
1263
1333
  }
1264
1334
  /* the icon keeps its size however long the words beside it run */
1265
- :is(.mkt, .atelic-ui) .op-mark-cell svg {
1335
+ .atelic-ui .op-mark-cell svg {
1266
1336
  flex: none;
1267
1337
  }
1268
- :is(.mkt, .atelic-ui) .op-rating {
1338
+ .atelic-ui .op-rating {
1269
1339
  display: inline-flex;
1270
1340
  align-items: center;
1271
1341
  gap: 4px;
1272
1342
  font-weight: 600;
1273
1343
  color: var(--tone, var(--op-ink));
1274
1344
  }
1275
- :is(.mkt, .atelic-ui) .op-rating svg {
1345
+ .atelic-ui .op-rating svg {
1276
1346
  color: var(--tone, var(--tone-warn-fill));
1277
1347
  fill: currentColor;
1278
1348
  }
1279
1349
 
1280
1350
  /* a few big numbers: the shared StatRow, at the writeup's sizes */
1281
- :is(.mkt, .atelic-ui) .op-stats .stat-row {
1351
+ .atelic-ui .op-stats .stat-row {
1282
1352
  gap: 18px 28px;
1283
1353
  }
1284
- :is(.mkt, .atelic-ui) .op-stats .stat .num {
1354
+ .atelic-ui .op-stats .stat .num {
1285
1355
  font-size: 28px;
1286
1356
  font-weight: 700;
1287
1357
  letter-spacing: -0.02em;
1288
1358
  line-height: 1.1;
1289
1359
  color: var(--tone, var(--op-ink));
1290
1360
  }
1291
- :is(.mkt, .atelic-ui) .op-stats .stat-delta {
1361
+ .atelic-ui .op-stats .stat-delta {
1292
1362
  font-size: 13px;
1293
1363
  }
1294
- :is(.mkt, .atelic-ui) .op-stats .stat .lbl {
1364
+ .atelic-ui .op-stats .stat .lbl {
1295
1365
  margin-top: 6px;
1296
1366
  font-size: 15px;
1297
1367
  }
1298
1368
 
1299
1369
  /* pictures on their own: the same size, side by side */
1300
- :is(.mkt, .atelic-ui) .op-shots-row {
1370
+ .atelic-ui .op-shots-row {
1301
1371
  display: grid;
1302
1372
  grid-template-columns: repeat(2, minmax(0, 1fr));
1303
1373
  gap: 16px;
@@ -1305,39 +1375,42 @@
1305
1375
  align-items: start;
1306
1376
  }
1307
1377
  /* three sit on one line, on a phone as well */
1308
- :is(.mkt, .atelic-ui) .op-shots-row[data-count="3"] {
1378
+ .atelic-ui .op-shots-row[data-count="3"] {
1309
1379
  grid-template-columns: repeat(3, minmax(0, 1fr));
1310
1380
  gap: 12px;
1311
1381
  max-width: 780px;
1312
1382
  }
1313
- :is(.mkt, .atelic-ui) .op-shots-row .op-shot a,
1314
- :is(.mkt, .atelic-ui) .op-shots-row .op-shot-frame {
1383
+ .atelic-ui .op-shots-row .op-shot a,
1384
+ .atelic-ui .op-shots-row .op-shot-frame {
1315
1385
  aspect-ratio: 3 / 4;
1316
1386
  background: var(--surface);
1317
1387
  }
1318
- :is(.mkt, .atelic-ui) .op-shots-row .op-shot img {
1388
+ .atelic-ui .op-shots-row .op-shot img {
1319
1389
  width: 100%;
1320
1390
  height: 100%;
1321
1391
  object-fit: contain;
1322
1392
  object-position: center;
1323
1393
  }
1324
1394
 
1325
- /* the collapsible: the shared one, at the writeup's sizes */
1326
- :is(.mkt, .atelic-ui) .op-more .collapsible-label {
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 {
1327
1400
  font-size: 16px;
1328
1401
  }
1329
- :is(.mkt, .atelic-ui) .op-more .collapsible-summary {
1402
+ .atelic-ui .op-more .disclosure-summary {
1330
1403
  font-size: 15px;
1331
1404
  line-height: 1.45;
1332
1405
  }
1333
- :is(.mkt, .atelic-ui) .op-more .collapsible-body {
1406
+ .atelic-ui .op-more.is-native > .disclosure-body {
1334
1407
  margin-top: 0;
1335
1408
  }
1336
- :is(.mkt, .atelic-ui) .op-more-body {
1409
+ .atelic-ui .op-more-body {
1337
1410
  display: grid;
1338
1411
  grid-template-columns: minmax(0, 1fr);
1339
1412
  }
1340
- :is(.mkt, .atelic-ui) .op-more-body > .op-block:first-child {
1413
+ .atelic-ui .op-more-body > .op-block:first-child {
1341
1414
  border-top: 0;
1342
1415
  margin-top: 6px;
1343
1416
  padding-top: 6px;
@@ -1345,43 +1418,43 @@
1345
1418
 
1346
1419
  /* findings: the shared Callout, one under another, with the owner's screen
1347
1420
  beside them */
1348
- :is(.mkt, .atelic-ui) .op-findings.has-shots {
1421
+ .atelic-ui .op-findings.has-shots {
1349
1422
  display: grid;
1350
1423
  grid-template-columns: minmax(0, 1fr);
1351
1424
  gap: 18px;
1352
1425
  align-items: start;
1353
1426
  }
1354
- :is(.mkt, .atelic-ui) .op-findings-list {
1427
+ .atelic-ui .op-findings-list {
1355
1428
  display: flex;
1356
1429
  flex-direction: column;
1357
1430
  gap: 14px;
1358
1431
  }
1359
- :is(.mkt, .atelic-ui) .op-findings .callout {
1432
+ .atelic-ui .op-findings .callout {
1360
1433
  font-size: 15.5px;
1361
1434
  line-height: 1.5;
1362
1435
  }
1363
- :is(.mkt, .atelic-ui) .op-findings .callout a,
1364
- :is(.mkt, .atelic-ui) .op-note a,
1365
- :is(.mkt, .atelic-ui) .op-block-head p a {
1436
+ .atelic-ui .op-findings .callout a,
1437
+ .atelic-ui .op-note a,
1438
+ .atelic-ui .op-block-head p a {
1366
1439
  color: var(--op-accent);
1367
1440
  text-decoration: underline;
1368
1441
  text-underline-offset: 2px;
1369
1442
  overflow-wrap: anywhere;
1370
1443
  }
1371
- :is(.mkt, .atelic-ui) .op-shots {
1444
+ .atelic-ui .op-shots {
1372
1445
  display: flex;
1373
1446
  flex-direction: column;
1374
1447
  gap: 14px;
1375
1448
  max-width: 340px;
1376
1449
  }
1377
- :is(.mkt, .atelic-ui) .op-shot {
1450
+ .atelic-ui .op-shot {
1378
1451
  display: flex;
1379
1452
  flex-direction: column;
1380
1453
  gap: 6px;
1381
1454
  margin: 0;
1382
1455
  }
1383
- :is(.mkt, .atelic-ui) .op-shot a,
1384
- :is(.mkt, .atelic-ui) .op-shot-frame {
1456
+ .atelic-ui .op-shot a,
1457
+ .atelic-ui .op-shot-frame {
1385
1458
  display: block;
1386
1459
  width: 100%;
1387
1460
  border-radius: var(--radius-sm);
@@ -1389,19 +1462,19 @@
1389
1462
  border: 1px solid var(--neutral-200);
1390
1463
  background: var(--op-card);
1391
1464
  }
1392
- :is(.mkt, .atelic-ui) .op-shot a {
1465
+ .atelic-ui .op-shot a {
1393
1466
  cursor: zoom-in;
1394
1467
  }
1395
1468
  /* The expand badge on a linked crop: off here, the note turns it on. */
1396
- :is(.mkt, .atelic-ui) .op-shot-open {
1469
+ .atelic-ui .op-shot-open {
1397
1470
  display: none;
1398
1471
  }
1399
- :is(.mkt, .atelic-ui) .op-shot img {
1472
+ .atelic-ui .op-shot img {
1400
1473
  width: 100%;
1401
1474
  height: auto;
1402
1475
  display: block;
1403
1476
  }
1404
- :is(.mkt, .atelic-ui) .op-shot-brief {
1477
+ .atelic-ui .op-shot-brief {
1405
1478
  display: grid;
1406
1479
  place-items: center;
1407
1480
  min-height: 140px;
@@ -1413,14 +1486,14 @@
1413
1486
  padding: 12px;
1414
1487
  text-align: center;
1415
1488
  }
1416
- :is(.mkt, .atelic-ui) .op-shot figcaption {
1489
+ .atelic-ui .op-shot figcaption {
1417
1490
  font-size: 12.5px;
1418
1491
  line-height: 1.45;
1419
1492
  color: var(--op-ink-faint);
1420
1493
  }
1421
1494
 
1422
1495
  /* sources: the tools the readings came from */
1423
- :is(.mkt, .atelic-ui) .op-sources {
1496
+ .atelic-ui .op-sources {
1424
1497
  margin-top: 16px;
1425
1498
  padding-top: 12px;
1426
1499
  border-top: 1px solid var(--op-rule);
@@ -1430,14 +1503,14 @@
1430
1503
  gap: 6px 16px;
1431
1504
  font-size: 13.5px;
1432
1505
  }
1433
- :is(.mkt, .atelic-ui) .op-sources-label {
1506
+ .atelic-ui .op-sources-label {
1434
1507
  font-family: var(--font-mono);
1435
1508
  font-size: 11.5px;
1436
1509
  letter-spacing: 0.1em;
1437
1510
  text-transform: uppercase;
1438
1511
  color: var(--op-ink-faint);
1439
1512
  }
1440
- :is(.mkt, .atelic-ui) .op-sources ul {
1513
+ .atelic-ui .op-sources ul {
1441
1514
  list-style: none;
1442
1515
  margin: 0;
1443
1516
  padding: 0;
@@ -1446,20 +1519,20 @@
1446
1519
  gap: 6px 18px;
1447
1520
  color: var(--op-ink-soft);
1448
1521
  }
1449
- :is(.mkt, .atelic-ui) .op-sources a {
1522
+ .atelic-ui .op-sources a {
1450
1523
  display: inline-flex;
1451
1524
  align-items: center;
1452
1525
  gap: 3px;
1453
1526
  color: var(--op-accent);
1454
1527
  font-weight: 550;
1455
1528
  }
1456
- :is(.mkt, .atelic-ui) .op-sources a:hover {
1529
+ .atelic-ui .op-sources a:hover {
1457
1530
  text-decoration: underline;
1458
1531
  text-underline-offset: 2px;
1459
1532
  }
1460
1533
 
1461
1534
  /* ---- the rented line: paid's facts in one line, ungraded ---- */
1462
- :is(.mkt, .atelic-ui) .op-rented {
1535
+ .atelic-ui .op-rented {
1463
1536
  display: flex;
1464
1537
  flex-direction: column;
1465
1538
  gap: 6px;
@@ -1472,7 +1545,7 @@
1472
1545
  color: var(--op-ink);
1473
1546
  text-wrap: pretty;
1474
1547
  }
1475
- :is(.mkt, .atelic-ui) .op-rented-label {
1548
+ .atelic-ui .op-rented-label {
1476
1549
  flex: none;
1477
1550
  font-family: var(--font-mono);
1478
1551
  font-size: 11.5px;
@@ -1483,17 +1556,17 @@
1483
1556
 
1484
1557
  /* ---- the markets table: on a phone each market stacks, its letters on
1485
1558
  one line with their column's label; wide, it is a table ---- */
1486
- :is(.mkt, .atelic-ui) .op-markets-table {
1559
+ .atelic-ui .op-markets-table {
1487
1560
  display: block;
1488
1561
  width: 100%;
1489
1562
  margin-top: 18px;
1490
1563
  font-size: 15px;
1491
1564
  line-height: 1.4;
1492
1565
  }
1493
- :is(.mkt, .atelic-ui) .op-markets-table tbody {
1566
+ .atelic-ui .op-markets-table tbody {
1494
1567
  display: block;
1495
1568
  }
1496
- :is(.mkt, .atelic-ui) .op-markets-table thead {
1569
+ .atelic-ui .op-markets-table thead {
1497
1570
  position: absolute;
1498
1571
  width: 1px;
1499
1572
  height: 1px;
@@ -1501,7 +1574,7 @@
1501
1574
  clip: rect(0, 0, 0, 0);
1502
1575
  white-space: nowrap;
1503
1576
  }
1504
- :is(.mkt, .atelic-ui) .op-markets-table tbody tr {
1577
+ .atelic-ui .op-markets-table tbody tr {
1505
1578
  display: flex;
1506
1579
  flex-wrap: wrap;
1507
1580
  align-items: center;
@@ -1510,29 +1583,29 @@
1510
1583
  padding: 12px 0;
1511
1584
  border-bottom: 1px solid var(--op-rule);
1512
1585
  }
1513
- :is(.mkt, .atelic-ui) .op-markets-table tbody tr:last-child {
1586
+ .atelic-ui .op-markets-table tbody tr:last-child {
1514
1587
  border-bottom: 0;
1515
1588
  }
1516
- :is(.mkt, .atelic-ui) .op-markets-table th,
1517
- :is(.mkt, .atelic-ui) .op-markets-table td {
1589
+ .atelic-ui .op-markets-table th,
1590
+ .atelic-ui .op-markets-table td {
1518
1591
  text-align: left;
1519
1592
  color: var(--op-ink);
1520
1593
  }
1521
- :is(.mkt, .atelic-ui) .op-markets-table .op-markets-market,
1522
- :is(.mkt, .atelic-ui) .op-markets-table .op-markets-read {
1594
+ .atelic-ui .op-markets-table .op-markets-market,
1595
+ .atelic-ui .op-markets-table .op-markets-read {
1523
1596
  width: 100%;
1524
1597
  }
1525
- :is(.mkt, .atelic-ui) .op-markets-market {
1598
+ .atelic-ui .op-markets-market {
1526
1599
  font-weight: 600;
1527
1600
  }
1528
- :is(.mkt, .atelic-ui) .op-markets-place {
1601
+ .atelic-ui .op-markets-place {
1529
1602
  display: block;
1530
1603
  font-weight: 400;
1531
1604
  font-size: 12.5px;
1532
1605
  color: var(--op-ink-faint);
1533
1606
  }
1534
- :is(.mkt, .atelic-ui) .op-markets-col,
1535
- :is(.mkt, .atelic-ui) .op-markets-label {
1607
+ .atelic-ui .op-markets-col,
1608
+ .atelic-ui .op-markets-label {
1536
1609
  font-family: var(--font-mono);
1537
1610
  font-size: 11.5px;
1538
1611
  font-weight: 400;
@@ -1541,19 +1614,19 @@
1541
1614
  color: var(--op-ink-soft);
1542
1615
  white-space: nowrap;
1543
1616
  }
1544
- :is(.mkt, .atelic-ui) .op-markets-label {
1617
+ .atelic-ui .op-markets-label {
1545
1618
  margin-right: 6px;
1546
1619
  }
1547
- :is(.mkt, .atelic-ui) .op-markets-grade {
1620
+ .atelic-ui .op-markets-grade {
1548
1621
  white-space: nowrap;
1549
1622
  }
1550
- :is(.mkt, .atelic-ui) .op-markets-table .op-markets-read {
1623
+ .atelic-ui .op-markets-table .op-markets-read {
1551
1624
  color: var(--op-ink-soft);
1552
1625
  text-wrap: pretty;
1553
1626
  }
1554
1627
 
1555
1628
  /* ---- the close ---- */
1556
- :is(.mkt, .atelic-ui) .op-close {
1629
+ .atelic-ui .op-close {
1557
1630
  margin-top: 44px;
1558
1631
  padding-top: 22px;
1559
1632
  border-top: 1px solid var(--neutral-200);
@@ -1565,28 +1638,28 @@
1565
1638
  line-height: 1.6;
1566
1639
  color: var(--op-ink-faint);
1567
1640
  }
1568
- :is(.mkt, .atelic-ui) .op-close b {
1641
+ .atelic-ui .op-close b {
1569
1642
  font-weight: 500;
1570
1643
  color: var(--op-ink);
1571
1644
  }
1572
1645
  /* The sign off lockup itself (.op-who, .op-sign) is shared with the monthly
1573
1646
  page, so it lives with the shared classes at the head of this sheet. */
1574
- :is(.mkt, .atelic-ui) .op .op-sign {
1647
+ .atelic-ui .op .op-sign {
1575
1648
  font-size: 24px;
1576
1649
  margin-bottom: 8px;
1577
1650
  }
1578
- :is(.mkt, .atelic-ui) .op .op-who {
1651
+ .atelic-ui .op .op-who {
1579
1652
  gap: 14px;
1580
1653
  }
1581
- :is(.mkt, .atelic-ui) .op .op-who img {
1654
+ .atelic-ui .op .op-who img {
1582
1655
  width: 56px;
1583
1656
  height: 56px;
1584
1657
  }
1585
1658
  /* The pointer to the hosted page belongs to the printed copy alone. */
1586
- :is(.mkt, .atelic-ui) .op-twin {
1659
+ .atelic-ui .op-twin {
1587
1660
  display: none;
1588
1661
  }
1589
- :is(.mkt, .atelic-ui) .op-sr-only {
1662
+ .atelic-ui .op-sr-only {
1590
1663
  position: absolute;
1591
1664
  width: 1px;
1592
1665
  height: 1px;
@@ -1600,121 +1673,121 @@
1600
1673
 
1601
1674
  /* ---- wide: the same page with room ---- */
1602
1675
  @media print, (min-width: 721px) {
1603
- :is(.mkt, .atelic-ui) .op-meta-sep,
1604
- :is(.mkt, .atelic-ui) .op-meta-date {
1676
+ .atelic-ui .op-meta-sep,
1677
+ .atelic-ui .op-meta-date {
1605
1678
  display: inline;
1606
1679
  }
1607
- :is(.mkt, .atelic-ui) .op-doc {
1680
+ .atelic-ui .op-doc {
1608
1681
  padding: calc(var(--nav-height) + 32px) 24px 64px;
1609
1682
  }
1610
- :is(.mkt, .atelic-ui) .op-intro {
1683
+ .atelic-ui .op-intro {
1611
1684
  font-size: 18px;
1612
1685
  }
1613
- :is(.mkt, .atelic-ui) .op-ov-tier-label {
1686
+ .atelic-ui .op-ov-tier-label {
1614
1687
  padding: 7px 20px;
1615
1688
  }
1616
- :is(.mkt, .atelic-ui) .op-ov-row {
1689
+ .atelic-ui .op-ov-row {
1617
1690
  grid-template-columns: auto 232px minmax(0, 1fr) auto;
1618
1691
  column-gap: 16px;
1619
1692
  padding: 11px 14px 11px 20px;
1620
1693
  }
1621
- :is(.mkt, .atelic-ui) .op-ov-grade {
1694
+ .atelic-ui .op-ov-grade {
1622
1695
  grid-row: 1;
1623
1696
  }
1624
- :is(.mkt, .atelic-ui) .op-ov-read {
1697
+ .atelic-ui .op-ov-read {
1625
1698
  grid-column: 3;
1626
1699
  padding-top: 4px;
1627
1700
  }
1628
- :is(.mkt, .atelic-ui) .op-ov-go {
1701
+ .atelic-ui .op-ov-go {
1629
1702
  grid-column: 4;
1630
1703
  }
1631
- :is(.mkt, .atelic-ui) .op-part {
1704
+ .atelic-ui .op-part {
1632
1705
  margin: 40px 0 12px;
1633
1706
  }
1634
- :is(.mkt, .atelic-ui) .op-part h2 {
1707
+ .atelic-ui .op-part h2 {
1635
1708
  font-size: 30px;
1636
1709
  }
1637
- :is(.mkt, .atelic-ui) .op-part p {
1710
+ .atelic-ui .op-part p {
1638
1711
  font-size: 17px;
1639
1712
  }
1640
- :is(.mkt, .atelic-ui) .op-topic {
1713
+ .atelic-ui .op-topic {
1641
1714
  padding: 22px 26px 18px;
1642
1715
  }
1643
- :is(.mkt, .atelic-ui) .op-topic h3 {
1716
+ .atelic-ui .op-topic h3 {
1644
1717
  font-size: 23px;
1645
1718
  }
1646
- :is(.mkt, .atelic-ui) .op-topic-head > .op-grade {
1719
+ .atelic-ui .op-topic-head > .op-grade {
1647
1720
  width: 46px;
1648
1721
  height: 46px;
1649
1722
  border-radius: 13px;
1650
1723
  font-size: 23px;
1651
1724
  }
1652
- :is(.mkt, .atelic-ui) .op-findings.has-shots {
1725
+ .atelic-ui .op-findings.has-shots {
1653
1726
  grid-template-columns: minmax(0, 1fr) 250px;
1654
1727
  gap: 28px;
1655
1728
  }
1656
- :is(.mkt, .atelic-ui) .op-findings .op-shots {
1729
+ .atelic-ui .op-findings .op-shots {
1657
1730
  max-width: none;
1658
1731
  }
1659
- :is(.mkt, .atelic-ui) .op-rented {
1732
+ .atelic-ui .op-rented {
1660
1733
  flex-direction: row;
1661
1734
  align-items: baseline;
1662
1735
  gap: 16px;
1663
1736
  padding: 16px 26px;
1664
1737
  }
1665
- :is(.mkt, .atelic-ui) .op-close {
1738
+ .atelic-ui .op-close {
1666
1739
  flex-direction: row;
1667
1740
  justify-content: space-between;
1668
1741
  align-items: flex-end;
1669
1742
  }
1670
1743
 
1671
1744
  /* the markets as a real table */
1672
- :is(.mkt, .atelic-ui) .op-markets-table {
1745
+ .atelic-ui .op-markets-table {
1673
1746
  display: table;
1674
1747
  border-collapse: collapse;
1675
1748
  }
1676
- :is(.mkt, .atelic-ui) .op-markets-table tbody {
1749
+ .atelic-ui .op-markets-table tbody {
1677
1750
  display: table-row-group;
1678
1751
  }
1679
- :is(.mkt, .atelic-ui) .op-markets-table thead {
1752
+ .atelic-ui .op-markets-table thead {
1680
1753
  position: static;
1681
1754
  width: auto;
1682
1755
  height: auto;
1683
1756
  overflow: visible;
1684
1757
  clip: auto;
1685
1758
  }
1686
- :is(.mkt, .atelic-ui) .op-markets-table tbody tr {
1759
+ .atelic-ui .op-markets-table tbody tr {
1687
1760
  display: table-row;
1688
1761
  padding: 0;
1689
1762
  border: 0;
1690
1763
  }
1691
- :is(.mkt, .atelic-ui) .op-markets-table th,
1692
- :is(.mkt, .atelic-ui) .op-markets-table td {
1764
+ .atelic-ui .op-markets-table th,
1765
+ .atelic-ui .op-markets-table td {
1693
1766
  display: table-cell;
1694
1767
  padding: 10px 14px 10px 0;
1695
1768
  border-bottom: 1px solid var(--op-rule);
1696
1769
  vertical-align: top;
1697
1770
  }
1698
- :is(.mkt, .atelic-ui) .op-markets-table thead th {
1771
+ .atelic-ui .op-markets-table thead th {
1699
1772
  padding-top: 0;
1700
1773
  padding-bottom: 8px;
1701
1774
  border-bottom: 1.5px solid var(--op-ink);
1702
1775
  vertical-align: bottom;
1703
1776
  }
1704
- :is(.mkt, .atelic-ui) .op-markets-table tbody tr:last-child th,
1705
- :is(.mkt, .atelic-ui) .op-markets-table tbody tr:last-child td {
1777
+ .atelic-ui .op-markets-table tbody tr:last-child th,
1778
+ .atelic-ui .op-markets-table tbody tr:last-child td {
1706
1779
  border-bottom: 0;
1707
1780
  }
1708
- :is(.mkt, .atelic-ui) .op-markets-table .op-markets-market {
1781
+ .atelic-ui .op-markets-table .op-markets-market {
1709
1782
  width: 170px;
1710
1783
  }
1711
- :is(.mkt, .atelic-ui) .op-markets-table .op-markets-read {
1784
+ .atelic-ui .op-markets-table .op-markets-read {
1712
1785
  width: auto;
1713
1786
  }
1714
- :is(.mkt, .atelic-ui) .op-markets-col {
1787
+ .atelic-ui .op-markets-col {
1715
1788
  width: 64px;
1716
1789
  }
1717
- :is(.mkt, .atelic-ui) .op-markets-label {
1790
+ .atelic-ui .op-markets-label {
1718
1791
  display: none;
1719
1792
  }
1720
1793
  }
@@ -1740,32 +1813,32 @@
1740
1813
  /* The sheet is the page at three quarters size. The zoom sits on the root,
1741
1814
  where the browser sizes each block for its page breaks at the printed
1742
1815
  size; on the document it measured them full size and broke early. */
1743
- html:has(:is(.mkt, .atelic-ui) .op-doc) {
1816
+ html:has(.atelic-ui .op-doc) {
1744
1817
  zoom: 0.74;
1745
1818
  }
1746
- :is(.mkt, .atelic-ui) .nav,
1747
- :is(.mkt, .atelic-ui) .credit-bar,
1748
- :is(.mkt, .atelic-ui) .skip-link,
1749
- :is(.mkt, .atelic-ui) .op-ov-go,
1750
- :is(.mkt, .atelic-ui) .op-topic h3 a svg {
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 {
1751
1824
  display: none;
1752
1825
  }
1753
- :is(.mkt, .atelic-ui),
1754
- :is(.mkt, .atelic-ui) .op {
1826
+ .atelic-ui,
1827
+ .atelic-ui .op {
1755
1828
  background: none;
1756
1829
  min-height: 0;
1757
1830
  }
1758
- :is(.mkt, .atelic-ui) .op-doc {
1831
+ .atelic-ui .op-doc {
1759
1832
  max-width: none;
1760
1833
  padding: 0;
1761
1834
  }
1762
- :is(.mkt, .atelic-ui) .op-top {
1835
+ .atelic-ui .op-top {
1763
1836
  display: flex;
1764
1837
  align-items: center;
1765
1838
  gap: 12px;
1766
1839
  margin-bottom: 18px;
1767
1840
  }
1768
- :is(.mkt, .atelic-ui) .op-mark {
1841
+ .atelic-ui .op-mark {
1769
1842
  font-weight: 600;
1770
1843
  font-size: 22px;
1771
1844
  letter-spacing: -0.045em;
@@ -1775,82 +1848,82 @@
1775
1848
  color: var(--op-ink);
1776
1849
  font-family: var(--font-brand);
1777
1850
  }
1778
- :is(.mkt, .atelic-ui) .op-run {
1851
+ .atelic-ui .op-run {
1779
1852
  display: inline-block;
1780
1853
  width: 1.7em;
1781
1854
  height: 2px;
1782
1855
  background: linear-gradient(90deg, var(--op-accent), transparent);
1783
1856
  }
1784
- :is(.mkt, .atelic-ui) .op-x {
1857
+ .atelic-ui .op-x {
1785
1858
  font-family: var(--font-mono);
1786
1859
  font-size: 16px;
1787
1860
  color: var(--op-ink-faint);
1788
1861
  line-height: 1;
1789
1862
  }
1790
- :is(.mkt, .atelic-ui) .op-recipient {
1863
+ .atelic-ui .op-recipient {
1791
1864
  height: 30px;
1792
1865
  width: auto;
1793
1866
  display: block;
1794
1867
  }
1795
- :is(.mkt, .atelic-ui) .op-ov-card,
1796
- :is(.mkt, .atelic-ui) .op-topic {
1868
+ .atelic-ui .op-ov-card,
1869
+ .atelic-ui .op-topic {
1797
1870
  box-shadow: none;
1798
1871
  border-color: var(--neutral-200);
1799
1872
  }
1800
- :is(.mkt, .atelic-ui) .op-topic h3 a {
1873
+ .atelic-ui .op-topic h3 a {
1801
1874
  border-bottom: 0;
1802
1875
  }
1803
- /* A small block stays whole; a table or a collapsible may run over a
1876
+ /* A small block stays whole; a table or a disclosure may run over a
1804
1877
  page, row by row, with its heading kept beside its first rows. */
1805
- :is(.mkt, .atelic-ui) .op-ov,
1806
- :is(.mkt, .atelic-ui) .op-block,
1807
- :is(.mkt, .atelic-ui) .op-rented,
1808
- :is(.mkt, .atelic-ui) .op-close,
1809
- :is(.mkt, .atelic-ui) .op-topic-head,
1810
- :is(.mkt, .atelic-ui) .op-block-head,
1811
- :is(.mkt, .atelic-ui) .op-markets-table tr,
1812
- :is(.mkt, .atelic-ui) .data-table tr {
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 {
1813
1886
  break-inside: avoid;
1814
1887
  }
1815
- :is(.mkt, .atelic-ui) .op-block.op-table,
1816
- :is(.mkt, .atelic-ui) .op-block.op-more,
1817
- :is(.mkt, .atelic-ui) .op-block.op-checks,
1818
- :is(.mkt, .atelic-ui) .op-block.op-findings,
1819
- :is(.mkt, .atelic-ui) .op-markets {
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 {
1820
1893
  break-inside: auto;
1821
1894
  }
1822
1895
  /* A list of checks or findings runs over a page item by item, so a
1823
1896
  section starts in whatever space the last one left. */
1824
- :is(.mkt, .atelic-ui) .op-checks .checklist > li,
1825
- :is(.mkt, .atelic-ui) .op-findings .callout {
1897
+ .atelic-ui .op-checks .checklist > li,
1898
+ .atelic-ui .op-findings .callout {
1826
1899
  break-inside: avoid;
1827
1900
  }
1828
- :is(.mkt, .atelic-ui) .op-part,
1829
- :is(.mkt, .atelic-ui) .collapsible > summary {
1901
+ .atelic-ui .op-part,
1902
+ .atelic-ui .is-native > .disclosure-head {
1830
1903
  break-inside: avoid;
1831
1904
  break-after: avoid;
1832
1905
  }
1833
- :is(.mkt, .atelic-ui) .op-topic-head,
1834
- :is(.mkt, .atelic-ui) .op-block-head,
1835
- :is(.mkt, .atelic-ui) .collapsible > summary,
1836
- :is(.mkt, .atelic-ui) .data-table thead {
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 {
1837
1910
  break-after: avoid;
1838
1911
  }
1839
- :is(.mkt, .atelic-ui) .op-shot a {
1912
+ .atelic-ui .op-shot a {
1840
1913
  cursor: auto;
1841
1914
  }
1842
- :is(.mkt, .atelic-ui) .op-twin {
1915
+ .atelic-ui .op-twin {
1843
1916
  display: flex;
1844
1917
  align-items: center;
1845
1918
  gap: 14px;
1846
1919
  }
1847
- :is(.mkt, .atelic-ui) .op-twin-text {
1920
+ .atelic-ui .op-twin-text {
1848
1921
  text-align: right;
1849
1922
  font-family: var(--font-mono);
1850
1923
  font-size: 12px;
1851
1924
  letter-spacing: 0.04em;
1852
1925
  }
1853
- :is(.mkt, .atelic-ui) .op-twin-text b {
1926
+ .atelic-ui .op-twin-text b {
1854
1927
  display: block;
1855
1928
  font-family: var(--font-sans);
1856
1929
  font-size: 16px;
@@ -1858,7 +1931,7 @@
1858
1931
  letter-spacing: -0.01em;
1859
1932
  margin-top: 2px;
1860
1933
  }
1861
- :is(.mkt, .atelic-ui) .op-qr {
1934
+ .atelic-ui .op-qr {
1862
1935
  width: 96px;
1863
1936
  height: 96px;
1864
1937
  display: block;
@@ -1891,7 +1964,7 @@
1891
1964
  ================================================================= */
1892
1965
  /* The borrowed .op-shot reads the writeup's own two tokens, mapped here as
1893
1966
  the writeup's .op root maps them. */
1894
- :is(.mkt, .atelic-ui) .nt {
1967
+ .atelic-ui .nt {
1895
1968
  --op-card: var(--card);
1896
1969
  --op-ink-faint: var(--neutral-500);
1897
1970
  font-family: var(--font-sans);
@@ -1900,7 +1973,7 @@
1900
1973
  }
1901
1974
  /* The writeup's column (.op-doc, 920px), centered under the header and
1902
1975
  held off the edges by the header's gutters (chrome.css, .nav-inner). */
1903
- :is(.mkt, .atelic-ui) .nt-doc {
1976
+ .atelic-ui .nt-doc {
1904
1977
  max-width: calc(920px + 2 * var(--gutter));
1905
1978
  margin: 0 auto;
1906
1979
  padding: calc(var(--nav-height) + 22px) var(--gutter) 48px;
@@ -1909,33 +1982,33 @@
1909
1982
  print-color-adjust: exact;
1910
1983
  -webkit-print-color-adjust: exact;
1911
1984
  }
1912
- :is(.mkt, .atelic-ui) .nt a {
1985
+ .atelic-ui .nt a {
1913
1986
  color: var(--primary);
1914
1987
  text-decoration: underline;
1915
1988
  text-underline-offset: 2px;
1916
1989
  text-decoration-thickness: 1px;
1917
1990
  overflow-wrap: anywhere;
1918
1991
  }
1919
- :is(.mkt, .atelic-ui) .nt a:hover {
1992
+ .atelic-ui .nt a:hover {
1920
1993
  text-decoration-thickness: 2px;
1921
1994
  }
1922
1995
 
1923
1996
  /* ---- the head: who it is for, then the title ---- */
1924
- :is(.mkt, .atelic-ui) .nt-meta {
1997
+ .atelic-ui .nt-meta {
1925
1998
  margin: 0 0 10px;
1926
1999
  font-family: var(--font-mono);
1927
2000
  font-size: 12.5px;
1928
2001
  letter-spacing: 0.04em;
1929
2002
  color: var(--neutral-500);
1930
2003
  }
1931
- :is(.mkt, .atelic-ui) .nt-meta b {
2004
+ .atelic-ui .nt-meta b {
1932
2005
  font-weight: 500;
1933
2006
  color: var(--ink-soft);
1934
2007
  }
1935
- :is(.mkt, .atelic-ui) .nt-meta-date {
2008
+ .atelic-ui .nt-meta-date {
1936
2009
  white-space: nowrap;
1937
2010
  }
1938
- :is(.mkt, .atelic-ui) .nt h1 {
2011
+ .atelic-ui .nt h1 {
1939
2012
  font-size: clamp(30px, 6vw, 40px);
1940
2013
  font-weight: 650;
1941
2014
  letter-spacing: -0.03em;
@@ -1946,7 +2019,7 @@
1946
2019
  }
1947
2020
 
1948
2021
  /* ---- the opener: the letter's first paragraph ---- */
1949
- :is(.mkt, .atelic-ui) .nt-opener {
2022
+ .atelic-ui .nt-opener {
1950
2023
  margin: 18px 0 0;
1951
2024
  font-size: 18px;
1952
2025
  line-height: 1.6;
@@ -1956,7 +2029,7 @@
1956
2029
 
1957
2030
  /* ---- the two lanes, each a heading and its findings, one above the
1958
2031
  other at every width ---- */
1959
- :is(.mkt, .atelic-ui) .nt-lanes {
2032
+ .atelic-ui .nt-lanes {
1960
2033
  display: grid;
1961
2034
  grid-template-columns: minmax(0, 1fr);
1962
2035
  gap: 26px;
@@ -1964,10 +2037,10 @@
1964
2037
  padding-top: 24px;
1965
2038
  border-top: 1px solid var(--neutral-100);
1966
2039
  }
1967
- :is(.mkt, .atelic-ui) .nt-lane {
2040
+ .atelic-ui .nt-lane {
1968
2041
  min-width: 0;
1969
2042
  }
1970
- :is(.mkt, .atelic-ui) .nt-lane h2 {
2043
+ .atelic-ui .nt-lane h2 {
1971
2044
  margin: 0 0 14px;
1972
2045
  font-size: 19px;
1973
2046
  font-weight: 650;
@@ -1975,7 +2048,7 @@
1975
2048
  line-height: 1.25;
1976
2049
  color: var(--ink);
1977
2050
  }
1978
- :is(.mkt, .atelic-ui) .nt-findings {
2051
+ .atelic-ui .nt-findings {
1979
2052
  list-style: none;
1980
2053
  margin: 0;
1981
2054
  padding: 0;
@@ -1983,29 +2056,29 @@
1983
2056
  flex-direction: column;
1984
2057
  gap: 18px;
1985
2058
  }
1986
- :is(.mkt, .atelic-ui) .nt-finding .callout {
2059
+ .atelic-ui .nt-finding .callout {
1987
2060
  font-size: 16px;
1988
2061
  line-height: 1.5;
1989
2062
  }
1990
2063
  /* The screen is a thumbnail under its finding, set in from the icon so it
1991
2064
  lines up with the words. It keeps its own shape, held to 200px tall and
1992
2065
  never the lane's full width; a click opens the full picture. */
1993
- :is(.mkt, .atelic-ui) .nt-finding .op-shot {
2066
+ .atelic-ui .nt-finding .op-shot {
1994
2067
  margin: 10px 0 0 28px;
1995
2068
  }
1996
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a,
1997
- :is(.mkt, .atelic-ui) .nt-finding .op-shot-frame {
2069
+ .atelic-ui .nt-finding .op-shot a,
2070
+ .atelic-ui .nt-finding .op-shot-frame {
1998
2071
  width: fit-content;
1999
2072
  max-width: 100%;
2000
2073
  }
2001
- :is(.mkt, .atelic-ui) .nt-finding .op-shot img {
2074
+ .atelic-ui .nt-finding .op-shot img {
2002
2075
  width: auto;
2003
2076
  max-width: min(100%, 280px);
2004
2077
  max-height: 200px;
2005
2078
  }
2006
2079
  /* A linked thumbnail says it opens: the badge in its corner, and the
2007
2080
  frame takes the accent on hover and focus. */
2008
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a {
2081
+ .atelic-ui .nt-finding .op-shot a {
2009
2082
  position: relative;
2010
2083
  color: inherit;
2011
2084
  text-decoration: none;
@@ -2013,12 +2086,12 @@
2013
2086
  border-color 0.15s ease,
2014
2087
  box-shadow 0.15s ease;
2015
2088
  }
2016
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a:hover,
2017
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a:focus-visible {
2089
+ .atelic-ui .nt-finding .op-shot a:hover,
2090
+ .atelic-ui .nt-finding .op-shot a:focus-visible {
2018
2091
  border-color: var(--primary);
2019
2092
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 25%, transparent);
2020
2093
  }
2021
- :is(.mkt, .atelic-ui) .nt-finding .op-shot-open {
2094
+ .atelic-ui .nt-finding .op-shot-open {
2022
2095
  position: absolute;
2023
2096
  right: 4px;
2024
2097
  bottom: 4px;
@@ -2031,12 +2104,12 @@
2031
2104
  background: color-mix(in srgb, var(--ink) 72%, transparent);
2032
2105
  color: var(--surface);
2033
2106
  }
2034
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a:hover .op-shot-open,
2035
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a:focus-visible .op-shot-open {
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 {
2036
2109
  background: var(--primary);
2037
2110
  }
2038
2111
  /* The caption wraps to the picture's width and never sets the column's. */
2039
- :is(.mkt, .atelic-ui) .nt-finding .op-shot figcaption {
2112
+ .atelic-ui .nt-finding .op-shot figcaption {
2040
2113
  width: 0;
2041
2114
  min-width: 100%;
2042
2115
  font-size: 12.5px;
@@ -2045,18 +2118,18 @@
2045
2118
  }
2046
2119
 
2047
2120
  /* ---- where the work would start ---- */
2048
- :is(.mkt, .atelic-ui) .nt-start {
2121
+ .atelic-ui .nt-start {
2049
2122
  margin-top: 30px;
2050
2123
  padding-top: 24px;
2051
2124
  border-top: 1px solid var(--neutral-100);
2052
2125
  }
2053
- :is(.mkt, .atelic-ui) .nt-start-lead {
2126
+ .atelic-ui .nt-start-lead {
2054
2127
  margin: 0 0 10px;
2055
2128
  font-weight: 650;
2056
2129
  color: var(--ink);
2057
2130
  }
2058
2131
  /* The site base strips list markers; the steps want theirs back. */
2059
- :is(.mkt, .atelic-ui) .nt-start ul {
2132
+ .atelic-ui .nt-start ul {
2060
2133
  margin: 0;
2061
2134
  padding-left: 1.2em;
2062
2135
  list-style: disc;
@@ -2064,55 +2137,55 @@
2064
2137
  gap: 8px;
2065
2138
  color: var(--ink-soft);
2066
2139
  }
2067
- :is(.mkt, .atelic-ui) .nt-start li {
2140
+ .atelic-ui .nt-start li {
2068
2141
  padding-left: 2px;
2069
2142
  }
2070
- :is(.mkt, .atelic-ui) .nt-start li::marker {
2143
+ .atelic-ui .nt-start li::marker {
2071
2144
  color: var(--primary);
2072
2145
  }
2073
- :is(.mkt, .atelic-ui) .nt-start b {
2146
+ .atelic-ui .nt-start b {
2074
2147
  font-weight: 600;
2075
2148
  color: var(--ink);
2076
2149
  }
2077
2150
 
2078
2151
  /* ---- the close: who is writing, the offer, then the sign off ---- */
2079
- :is(.mkt, .atelic-ui) .nt-close {
2152
+ .atelic-ui .nt-close {
2080
2153
  margin-top: 30px;
2081
2154
  padding-top: 24px;
2082
2155
  border-top: 1px solid var(--neutral-100);
2083
2156
  }
2084
- :is(.mkt, .atelic-ui) .nt-close p {
2157
+ .atelic-ui .nt-close p {
2085
2158
  margin: 0 0 14px;
2086
2159
  text-wrap: pretty;
2087
2160
  }
2088
- :is(.mkt, .atelic-ui) .nt-close .op-who {
2161
+ .atelic-ui .nt-close .op-who {
2089
2162
  margin-top: 22px;
2090
2163
  gap: 14px;
2091
2164
  font-size: 14px;
2092
2165
  line-height: 1.6;
2093
2166
  color: var(--neutral-500);
2094
2167
  }
2095
- :is(.mkt, .atelic-ui) .nt-close .op-who img {
2168
+ .atelic-ui .nt-close .op-who img {
2096
2169
  width: 56px;
2097
2170
  height: 56px;
2098
2171
  }
2099
- :is(.mkt, .atelic-ui) .nt-close .op-sign {
2172
+ .atelic-ui .nt-close .op-sign {
2100
2173
  font-size: 24px;
2101
2174
  margin-bottom: 8px;
2102
2175
  }
2103
2176
  /* The sign off's own links read as the writeup's do: quiet, in the text color. */
2104
- :is(.mkt, .atelic-ui) .nt-close .op-who a {
2177
+ .atelic-ui .nt-close .op-who a {
2105
2178
  color: inherit;
2106
2179
  text-decoration: none;
2107
2180
  }
2108
2181
 
2109
2182
  /* ---- wide: more room, and each screen beside its finding ---- */
2110
2183
  @media (min-width: 721px) {
2111
- :is(.mkt, .atelic-ui) .nt-doc {
2184
+ .atelic-ui .nt-doc {
2112
2185
  padding-top: calc(var(--nav-height) + 36px);
2113
2186
  padding-bottom: 64px;
2114
2187
  }
2115
- :is(.mkt, .atelic-ui) .nt-lanes {
2188
+ .atelic-ui .nt-lanes {
2116
2189
  gap: 32px;
2117
2190
  }
2118
2191
  }
@@ -2123,21 +2196,21 @@
2123
2196
  wide card as a short wide one; the column shrinks to it, held to 45%
2124
2197
  of the row, with room enough for the caption under it. */
2125
2198
  @media print, (min-width: 721px) {
2126
- :is(.mkt, .atelic-ui) .nt-finding.has-shot {
2199
+ .atelic-ui .nt-finding.has-shot {
2127
2200
  display: grid;
2128
2201
  grid-template-columns: minmax(0, 1fr) fit-content(45%);
2129
2202
  column-gap: 32px;
2130
2203
  align-items: start;
2131
2204
  }
2132
- :is(.mkt, .atelic-ui) .nt-finding.has-shot .op-shot {
2205
+ .atelic-ui .nt-finding.has-shot .op-shot {
2133
2206
  margin: 0;
2134
2207
  min-width: 150px;
2135
2208
  }
2136
- :is(.mkt, .atelic-ui) .nt-finding .op-shot img {
2209
+ .atelic-ui .nt-finding .op-shot img {
2137
2210
  max-width: 100%;
2138
2211
  max-height: 170px;
2139
2212
  }
2140
- :is(.mkt, .atelic-ui) .nt-finding .op-shot figcaption {
2213
+ .atelic-ui .nt-finding .op-shot figcaption {
2141
2214
  font-size: 12px;
2142
2215
  }
2143
2216
  }
@@ -2147,77 +2220,362 @@
2147
2220
  The sheet is the page at the writeup's three quarters, the thumbnails
2148
2221
  are held short with room for their captions, and the badge drops. */
2149
2222
  @media print {
2150
- html:has(:is(.mkt, .atelic-ui) .nt-doc) {
2223
+ html:has(.atelic-ui .nt-doc) {
2151
2224
  zoom: 0.74;
2152
2225
  }
2153
- :is(.mkt, .atelic-ui) .nt {
2226
+ .atelic-ui .nt {
2154
2227
  background: none;
2155
2228
  }
2156
- :is(.mkt, .atelic-ui) .nt-doc {
2229
+ .atelic-ui .nt-doc {
2157
2230
  max-width: none;
2158
2231
  padding: 0;
2159
2232
  font-size: 15px;
2160
2233
  line-height: 1.45;
2161
2234
  }
2162
- :is(.mkt, .atelic-ui) .nt h1 {
2235
+ .atelic-ui .nt h1 {
2163
2236
  font-size: 32px;
2164
2237
  }
2165
- :is(.mkt, .atelic-ui) .nt-opener {
2238
+ .atelic-ui .nt-opener {
2166
2239
  margin-top: 12px;
2167
2240
  font-size: 16px;
2168
2241
  }
2169
- :is(.mkt, .atelic-ui) .nt-lanes,
2170
- :is(.mkt, .atelic-ui) .nt-start,
2171
- :is(.mkt, .atelic-ui) .nt-close {
2242
+ .atelic-ui .nt-lanes,
2243
+ .atelic-ui .nt-start,
2244
+ .atelic-ui .nt-close {
2172
2245
  margin-top: 16px;
2173
2246
  padding-top: 14px;
2174
2247
  }
2175
- :is(.mkt, .atelic-ui) .nt-lanes {
2248
+ .atelic-ui .nt-lanes {
2176
2249
  gap: 18px;
2177
2250
  }
2178
- :is(.mkt, .atelic-ui) .nt-lane h2 {
2251
+ .atelic-ui .nt-lane h2 {
2179
2252
  margin-bottom: 10px;
2180
2253
  break-after: avoid;
2181
2254
  }
2182
- :is(.mkt, .atelic-ui) .nt-findings {
2255
+ .atelic-ui .nt-findings {
2183
2256
  gap: 14px;
2184
2257
  }
2185
- :is(.mkt, .atelic-ui) .nt-finding .callout {
2258
+ .atelic-ui .nt-finding .callout {
2186
2259
  font-size: 14.5px;
2187
2260
  }
2188
- :is(.mkt, .atelic-ui) .nt-finding.has-shot {
2261
+ .atelic-ui .nt-finding.has-shot {
2189
2262
  grid-template-columns: minmax(0, 1fr) fit-content(40%);
2190
2263
  column-gap: 24px;
2191
2264
  }
2192
- :is(.mkt, .atelic-ui) .nt-finding.has-shot .op-shot {
2265
+ .atelic-ui .nt-finding.has-shot .op-shot {
2193
2266
  min-width: 1.6in;
2194
2267
  }
2195
- :is(.mkt, .atelic-ui) .nt-finding .op-shot img {
2268
+ .atelic-ui .nt-finding .op-shot img {
2196
2269
  max-height: 1.5in;
2197
2270
  }
2198
- :is(.mkt, .atelic-ui) .nt-finding .op-shot-open {
2271
+ .atelic-ui .nt-finding .op-shot-open {
2199
2272
  display: none;
2200
2273
  }
2201
- :is(.mkt, .atelic-ui) .nt-finding .op-shot figcaption {
2274
+ .atelic-ui .nt-finding .op-shot figcaption {
2202
2275
  font-size: 11.5px;
2203
2276
  line-height: 1.35;
2204
2277
  }
2205
- :is(.mkt, .atelic-ui) .nt-finding .op-shot a {
2278
+ .atelic-ui .nt-finding .op-shot a {
2206
2279
  cursor: auto;
2207
2280
  }
2208
- :is(.mkt, .atelic-ui) .nt-start ul {
2281
+ .atelic-ui .nt-start ul {
2209
2282
  gap: 4px;
2210
2283
  }
2211
- :is(.mkt, .atelic-ui) .nt-close p {
2284
+ .atelic-ui .nt-close p {
2212
2285
  margin-bottom: 10px;
2213
2286
  }
2214
- :is(.mkt, .atelic-ui) .nt-close .op-who {
2287
+ .atelic-ui .nt-close .op-who {
2215
2288
  margin-top: 14px;
2216
2289
  }
2217
- :is(.mkt, .atelic-ui) .nt-finding,
2218
- :is(.mkt, .atelic-ui) .nt-start,
2219
- :is(.mkt, .atelic-ui) .nt-close {
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 {
2220
2574
  break-inside: avoid;
2221
2575
  }
2576
+ .atelic-ui .rd-beat h4,
2577
+ .atelic-ui .rd-plan h2 {
2578
+ break-after: avoid;
2579
+ }
2222
2580
  }
2223
2581
  }