@neuravision/construct 2.2.0 → 2.3.1

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.
@@ -131,6 +131,9 @@
131
131
  .ct-drawer__body {
132
132
  padding: var(--space-6) var(--space-7);
133
133
  display: grid;
134
+ /* Clamped content track: projected content wraps or scrolls inside the
135
+ slot instead of widening the surface. See `.ct-card__body`. */
136
+ grid-template-columns: minmax(0, 1fr);
134
137
  gap: var(--space-4);
135
138
  overflow-y: auto;
136
139
  flex: 1;
@@ -1,5 +1,8 @@
1
1
  .ct-field {
2
2
  display: grid;
3
+ /* Clamped content track: projected content wraps or scrolls inside the
4
+ slot instead of widening the surface. See `.ct-card__body`. */
5
+ grid-template-columns: minmax(0, 1fr);
3
6
  gap: var(--space-2);
4
7
  }
5
8
 
@@ -8,6 +8,9 @@
8
8
  @import './_datum-shared.css';
9
9
  @import './datum.css';
10
10
 
11
+ /* Aperture — opt-in split-oval signature vocabulary */
12
+ @import './aperture.css';
13
+
11
14
  /* Components */
12
15
  @import './button.css';
13
16
  @import './field.css';
@@ -52,6 +52,9 @@
52
52
  .ct-modal__body {
53
53
  padding: var(--space-6) var(--space-7);
54
54
  display: grid;
55
+ /* Clamped content track: projected content wraps or scrolls inside the
56
+ slot instead of widening the surface. See `.ct-card__body`. */
57
+ grid-template-columns: minmax(0, 1fr);
55
58
  gap: var(--space-4);
56
59
  }
57
60
 
@@ -116,7 +119,9 @@
116
119
  --ct-confirmation-icon-color: var(--color-text-secondary);
117
120
 
118
121
  display: grid;
119
- grid-template-columns: auto 1fr;
122
+ /* The content column is clamped so long words or wide embedded content
123
+ stay inside the dialog instead of stretching it. */
124
+ grid-template-columns: auto minmax(0, 1fr);
120
125
  gap: var(--space-4);
121
126
  align-items: start;
122
127
  }
@@ -135,6 +140,7 @@
135
140
 
136
141
  .ct-confirmation__content {
137
142
  display: grid;
143
+ grid-template-columns: minmax(0, 1fr);
138
144
  gap: var(--space-2);
139
145
  }
140
146
 
@@ -0,0 +1,55 @@
1
+ # Aperture – Review und Politur
2
+
3
+ Stand: 16. September 2026. Grundlage ist die vorhandene Aperture-Fassung im
4
+ Arbeitsverzeichnis, visuell geprüft in der lokalen Vorschau und in Storybook.
5
+
6
+ ## Einschätzung
7
+
8
+ Das geteilte, versetzte Oval ist der stärkste Identitätsträger. Die Kombination
9
+ aus Papier, Kobalt und großer Groteskschrift gibt ihm einen überzeugenden Rahmen.
10
+ Der ursprüngliche Einstieg funktioniert bereits gut. Im weiteren Seitenverlauf
11
+ wird die Formidee jedoch kaum fortgeführt: gleichförmige runde Karten, ein üblicher
12
+ Pillen-Button und ein kleiner Footer schwächen die Eigenständigkeit.
13
+
14
+ Die Politur macht **Fuge und Versatz** zu einer wiederkehrenden Gestaltungsregel.
15
+ Die Einschätzung zur Wiedererkennung ist ein Designurteil; eine Messung mit
16
+ Nutzern oder ein Vergleich mit anderen Marken war nicht Teil dieses Durchgangs.
17
+
18
+ ## Befunde und Änderungen
19
+
20
+ | Befund | Umsetzung |
21
+ | --- | --- |
22
+ | Die Signatur steckt hauptsächlich im großen Signet. | Geteilte Trennlinien übernehmen die 46/8/46-Proportion; zweite Überschriftszeilen treten wiederkehrend aus der Achse. |
23
+ | Der Pfeil wirkt wie ein Standarddetail innerhalb einer Pille. | Beschriftung und Pfeilscheibe erhalten eine echte Fuge und einen vertikalen Versatz. Beides bleibt eine gemeinsame Klickfläche und ein Tastaturziel. |
24
+ | Drei gleich ausgerichtete, stark gerundete Karten wirken austauschbar. | Ruhigere 4-px-Radien, gestaffelte Musterflächen, größere monochrome Formstudie und präzisere Typografie innerhalb der jeweiligen Fläche. Auf kleinen Breiten entfällt die Staffelung. |
25
+ | Der Abschluss besitzt wenig visuelles Gewicht. | Eine große Wort-Bild-Marke und ein kurzer Leitsatz schließen die Komposition ab. |
26
+ | Globale Link-Hover-Farben können die helle Beschriftung auf dunklen Aktionen überschreiben. | Aperture erhält explizite Hover-/Aktivfarben; ein Storybook-Test prüft den Kontrasterhalt. |
27
+ | Versetzte Aktionen benötigen eine saubere Spiegelung in RTL. | Logische Innenabstände halten die Fuge offen; ein Geometrietest sichert sie ab. Disclosure-Pfeile zeigen auch in RTL nach unten beziehungsweise oben. |
28
+ | Der fokussierte Sprunglink-Zielbereich übernimmt die orange Foundation-Markierung. | Der Inhaltsfokus folgt jetzt der Aperture-Tintenfarbe. |
29
+
30
+ Das Oval selbst, seine Fuge und seine Proportionen bleiben erhalten. Kobalt
31
+ konzentriert sich auf die Hauptfläche. Die neue monochrome Story zeigt, wie die
32
+ Komposition ohne den Farbakzent funktioniert. Neue öffentliche Bausteine sind
33
+ `ct-aperture-line` und `ct-aperture-rule`; die Komposition bleibt im Beispiel-CSS.
34
+
35
+ ## Bildvergleich
36
+
37
+ | Vorher, 1440 px | Nachher, 1440 px |
38
+ | --- | --- |
39
+ | ![Aperture vor der Politur](assets/aperture-review/before-desktop.png) | ![Aperture nach der Politur](assets/aperture-review/after-desktop.png) |
40
+
41
+ Weitere Ansichten: [Mobil, 390 px](assets/aperture-review/after-mobile.png) ·
42
+ [Monochrom](assets/aperture-review/after-monochrome.png).
43
+
44
+ ## Verifikation
45
+
46
+ - `npm run build` und `npm run check`: erfolgreich, einschließlich Token-, Kontrast-, CSS- und Exportprüfungen.
47
+ - `npm test`: 447 bestandene Tests – 56 Behavior-, 378 Storybook-, 6 Touch- und 7 Forced-Colors-Tests; darunter 10 Aperture-Stories.
48
+ - `npm run storybook:build`: erfolgreich. Vite meldet Hinweise zu Chunk-Größen und Plugin-Laufzeiten.
49
+ - Zusätzliche Chromium-Prüfung: 320, 360, 390, 600, 850, 851, 900, 1024, 1440 und 1920 px in allen vier Themes; kein horizontaler Überlauf in diesen 40 Kombinationen.
50
+ - Zusätzlich geprüft: RTL-Layout, lange Aktionsbeschriftungen, Sprunglink und Tastaturfokus, unbewegter Pfeil bei reduzierter Bewegung sowie 200 % Textgröße bei 720 px Fensterbreite.
51
+ - Visuell kontrolliert: Desktop, Mobil, Zwischenbreite, Dark, High Contrast Dark, Forced Colors, RTL, Monochrom und vergrößerter Text.
52
+
53
+ Screenshots dokumentieren den lokalen Chromium-Stand. Die automatisierten
54
+ Accessibility-Prüfungen ersetzen keine vollständige manuelle Prüfung mit
55
+ Screenreader oder in weiteren Browsern.
@@ -0,0 +1,114 @@
1
+ # Aperture
2
+
3
+ Aperture is Construct's additional signature look. Its identifying shape is an oval
4
+ split into two halves, separated by an eight-percent seam and shifted vertically.
5
+ That silhouette repeats at wordmark and poster scale. Oversized, tightly set grotesk
6
+ type and a displaced second line give the composition its rhythm. Paper, dark ink
7
+ and one cobalt field keep the hierarchy clear. The seam also separates action labels
8
+ from their lowered arrow discs and interrupts the composition's horizontal rules.
9
+ The identity should remain legible in monochrome.
10
+
11
+ Datum uses measured lines, technical annotations and orange registration marks.
12
+ Aperture uses a bold silhouette, editorial scale and open space. Choose a grammar
13
+ for a composition; avoid stacking both signatures on the same surface.
14
+
15
+ ## Preview
16
+
17
+ Run `npm run storybook` and open **Patterns → Aperture Grammar → Aperture / The Full Look**.
18
+ Stories also cover dark, high contrast, a compact container, native theme switching,
19
+ individual primitives, all four theme scopes, right-to-left layout, a monochrome
20
+ composition and long action labels. See the [polish review](aperture-review.md)
21
+ for the visual findings and before/after comparison.
22
+
23
+ For the standalone specimen, run `npx vite --host 127.0.0.1 --port 4173` from the
24
+ repository and open `http://127.0.0.1:4173/aperture.demo.html`.
25
+ Run `npm run build` first after a fresh checkout. Serve the page over HTTP so its
26
+ shared ES module can load. The page needs no hosted fonts or image services.
27
+
28
+ ## Integration
29
+
30
+ ```css
31
+ @import '@neuravision/construct/foundations.css';
32
+ @import '@neuravision/construct/components/aperture.css';
33
+ ```
34
+
35
+ ```html
36
+ <section class="ct-aperture" data-theme="light">
37
+ <p class="ct-aperture-label">A new perspective</p>
38
+ <h2 class="ct-aperture-heading">Room for character.</h2>
39
+ <a class="ct-aperture-action" href="/work">
40
+ Explore the work
41
+ <span class="ct-aperture-action__icon" aria-hidden="true">↗</span>
42
+ </a>
43
+ </section>
44
+ ```
45
+
46
+ The full component bundle includes Aperture too. Classes opt in explicitly;
47
+ existing Datum components keep their styles. Theme scopes inherit normally:
48
+ omit `data-theme` to follow the parent or the system preference.
49
+
50
+ The composition in `examples/aperture/showcase.css` is example page layout.
51
+ The reusable component contract lives in `components/aperture.css`. The native
52
+ radio handler in `examples/aperture/showcase.js` only changes the preview's theme;
53
+ the signature primitives themselves require no JavaScript.
54
+
55
+ ## Vocabulary
56
+
57
+ | Primitive | Use |
58
+ | --- | --- |
59
+ | `ct-aperture` | Scoped typography, palette, selection, focus and query container |
60
+ | `ct-aperture-mark` | Decorative split oval; set `aria-hidden="true"` |
61
+ | `ct-aperture-wordmark` | Mark and name on a shared baseline |
62
+ | `ct-aperture-label` | Small section label with restrained spacing |
63
+ | `ct-aperture-display` / `ct-aperture-heading` | Fluid display and section typography |
64
+ | `ct-aperture-line` | Block line within a heading; subsequent lines step out by 0.24em |
65
+ | `ct-aperture-rule` | Decorative split rule with a 46 / 8 / 46 rhythm; set `aria-hidden="true"` |
66
+ | `ct-aperture-poster` | A strong field for one mark and a caption |
67
+ | `ct-aperture-action` / `--quiet` | Native action with detached circular arrow |
68
+ | `ct-aperture-panel` | A quiet supporting surface |
69
+ | `ct-aperture-choices` / `ct-aperture-choice` | Fieldset and labels around native radios |
70
+ | `ct-aperture-disclosure` | Native `details` and `summary` content |
71
+
72
+ Put `ct-aperture-poster__art` around the mark and
73
+ `ct-aperture-poster__caption` on the caption. Set
74
+ `--ct-aperture-mark-size` to a CSS length or percentage to resize a mark.
75
+ Use a link for navigation and a button for an action; disable buttons with the
76
+ native `disabled` attribute. Supply actual destinations and product behavior.
77
+
78
+ Action text and `ct-aperture-action__icon` belong inside the same native control.
79
+ The six-pixel visual seam is part of its clickable area; the disc is lowered eight
80
+ pixels and aligns with the label on hover. Keep the icon decorative, never a second
81
+ button. Inline SVG provides a consistent arrow shape; a text arrow also works.
82
+
83
+ Use `ct-aperture-line` on spans inside a single heading, with whitespace between
84
+ the spans. The offset follows the reading direction and allows wrapping. Split
85
+ rules are decorative composition breaks, not semantic `hr` replacements.
86
+
87
+ ## Design constraints
88
+
89
+ - Use one dominant mark per composition. Smaller repetitions establish continuity.
90
+ - Keep the seam and offset proportional. Do not stretch the individual halves.
91
+ - Use typography and space for hierarchy. Reserve cobalt for the main focal area.
92
+ - Keep content text out of decorative cutouts. Let long labels and translated copy wrap.
93
+ - Keep the giant display for short headlines. Use the heading scale for longer text.
94
+ - Repeat the seam and offset in a few purposeful places. Avoid turning every edge into a motif.
95
+ - Keep supporting panels restrained; the default four-pixel radius leaves the oval as the dominant curve.
96
+
97
+ Colors resolve from cobalt/graphite primitives through `color.aperture.*` semantic
98
+ roles to `aperture.*` component tokens. The heading family uses the local Arial /
99
+ Helvetica / sans-serif stack, independent of Construct's optional Lato font import.
100
+ Customize token sources and regenerate outputs with `npm run build`.
101
+
102
+ ## Accessibility and verification
103
+
104
+ The token pipeline gates ink and secondary text against paper and surface, and
105
+ poster text against its accent, at 4.5:1 in each theme. Keyboard focus uses a visible
106
+ outline; selected radios also change border and weight. Actions and theme labels
107
+ have at least 44-pixel targets. Radio groups and disclosures use browser-native
108
+ keyboard behavior. Hover motion is disabled for reduced-motion preferences.
109
+ Forced colors preserves the silhouette with system colors, control borders and
110
+ an underlined selected radio label.
111
+
112
+ Storybook includes interaction and automated accessibility checks. Touch and
113
+ forced-colors suites cover the new controls. These are bounded automated checks,
114
+ not a claim that any consuming page is completely WCAG conformant.
@@ -185,7 +185,9 @@ Rules that keep the signature strong and accessible:
185
185
  reference element. Never let two orange edges compete; if everything is highlighted, nothing is.
186
186
  - **The component that owns the border owns the datum.** Use `ct-frame ct-frame--datum` for framed
187
187
  exhibits and put clipping on `ct-frame__content`. Do not attach overflow clipping to the outer frame
188
- or rebuild the corner in product CSS.
188
+ or rebuild the corner in product CSS. The registration mark absorbs the owner's hairline — it is
189
+ painted one border width further out — so the corner reads as one orange arc on strong borders as
190
+ well as subtle ones.
189
191
  - **Orange is never text.** Labels and values stay on `--color-text-*` neutrals; orange is carried by
190
192
  non-text ticks, edges, rules, and lines.
191
193
  - **Edges are `--color-brand-accent`; meaning-bearing fills are `--color-brand-accent-strong`**
@@ -0,0 +1,363 @@
1
+ /* Composition for the Aperture specimen. Public primitives live in
2
+ components/aperture.css; this file contains only page layout. */
3
+ .aperture-demo {
4
+ inline-size: 100%;
5
+ }
6
+
7
+ .aperture-demo__page {
8
+ max-inline-size: 1600px;
9
+ margin-inline: auto;
10
+ padding-inline: clamp(1.25rem, 4.5cqi, 5rem);
11
+ }
12
+
13
+ .aperture-demo__header {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: space-between;
17
+ flex-wrap: wrap;
18
+ gap: var(--space-6);
19
+ padding-block: var(--space-7);
20
+ }
21
+
22
+ .aperture-demo__header .ct-aperture-wordmark {
23
+ font-size: 28px;
24
+ }
25
+
26
+ .aperture-demo__nav {
27
+ display: flex;
28
+ align-items: center;
29
+ flex-wrap: wrap;
30
+ gap: clamp(1rem, 3cqi, 3rem);
31
+ }
32
+
33
+ .aperture-demo__link {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ min-block-size: 44px;
37
+ color: inherit;
38
+ font-size: var(--font-size-sm);
39
+ text-decoration: underline;
40
+ text-decoration-thickness: 1px;
41
+ text-underline-offset: 0.3em;
42
+ }
43
+
44
+ .aperture-demo__link:is(:hover, :active) {
45
+ color: inherit;
46
+ }
47
+
48
+ .aperture-demo__skip {
49
+ position: absolute;
50
+ inset-block-start: 0;
51
+ inset-inline-start: var(--space-6);
52
+ z-index: 1;
53
+ padding: var(--space-5);
54
+ background: var(--component-aperture-paper);
55
+ color: inherit;
56
+ transform: translateY(-150%);
57
+ }
58
+
59
+ .aperture-demo__skip:focus {
60
+ transform: none;
61
+ }
62
+
63
+ .aperture-demo__hero {
64
+ display: grid;
65
+ grid-template-columns: 1.15fr 0.85fr;
66
+ gap: 4cqi;
67
+ padding-block: clamp(2.5rem, 5cqi, 5rem) var(--space-10);
68
+ }
69
+
70
+ .aperture-demo__intro {
71
+ display: flex;
72
+ flex-direction: column;
73
+ align-items: start;
74
+ min-inline-size: 0;
75
+ padding-block: var(--space-5) var(--space-4);
76
+ }
77
+
78
+ .aperture-demo__intro .ct-aperture-display {
79
+ margin-block: clamp(2.5rem, 4.6cqi, 5rem) clamp(2rem, 3.5cqi, 4rem);
80
+ }
81
+
82
+ .aperture-demo__eyebrow {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ gap: var(--space-4) var(--space-7);
86
+ }
87
+
88
+ .aperture-demo__eyebrow span:last-child {
89
+ color: var(--component-aperture-muted);
90
+ }
91
+
92
+ .aperture-demo__poster-heading {
93
+ display: flex;
94
+ align-items: start;
95
+ justify-content: space-between;
96
+ gap: var(--space-5);
97
+ }
98
+
99
+ .aperture-demo__poster-heading > :last-child {
100
+ font-size: var(--font-size-xs);
101
+ font-variant-numeric: tabular-nums;
102
+ }
103
+
104
+ .aperture-demo__description {
105
+ max-inline-size: 29ch;
106
+ font-size: clamp(1rem, 0.75rem + 0.7cqi, 1.4rem);
107
+ line-height: 1.55;
108
+ color: var(--component-aperture-muted);
109
+ }
110
+
111
+ .aperture-demo__intro .ct-aperture-action {
112
+ margin-block-start: var(--space-8);
113
+ }
114
+
115
+ .aperture-demo__hero .ct-aperture-poster {
116
+ min-block-size: 540px;
117
+ }
118
+
119
+ .aperture-demo__hero .ct-aperture-poster__art .ct-aperture-mark {
120
+ --ct-aperture-mark-size: 86%;
121
+ }
122
+
123
+ .aperture-demo__edition {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ flex-wrap: wrap;
128
+ gap: var(--space-5);
129
+ padding-block: var(--space-6);
130
+ font-size: var(--font-size-xs);
131
+ }
132
+
133
+ .aperture-demo__edition span:last-child {
134
+ color: var(--component-aperture-muted);
135
+ }
136
+
137
+ .aperture-demo__section {
138
+ padding-block: clamp(4rem, 8cqi, 8rem);
139
+ scroll-margin-block-start: var(--space-7);
140
+ }
141
+
142
+ .aperture-demo__section-head {
143
+ display: grid;
144
+ grid-template-columns: 1.35fr 0.65fr;
145
+ gap: var(--space-9);
146
+ align-items: end;
147
+ margin-block-end: var(--space-10);
148
+ }
149
+
150
+ .aperture-demo__section-head .ct-aperture-label {
151
+ margin-block-end: var(--space-7);
152
+ }
153
+
154
+ .aperture-demo__section-head > p {
155
+ max-inline-size: 36ch;
156
+ color: var(--component-aperture-muted);
157
+ }
158
+
159
+ .aperture-demo__specimens {
160
+ display: grid;
161
+ grid-template-columns: 1fr 1.2fr 1fr;
162
+ align-items: start;
163
+ gap: var(--space-6);
164
+ }
165
+
166
+ .aperture-demo__specimen {
167
+ display: flex;
168
+ flex-direction: column;
169
+ gap: var(--space-6);
170
+ min-inline-size: 0;
171
+ }
172
+
173
+ .aperture-demo__specimen:nth-child(2) {
174
+ margin-block-start: var(--space-8);
175
+ }
176
+
177
+ .aperture-demo__specimen:nth-child(3) {
178
+ margin-block-start: var(--space-10);
179
+ }
180
+
181
+ .aperture-demo__specimen h3 {
182
+ display: flex;
183
+ align-items: baseline;
184
+ gap: var(--space-4);
185
+ font-size: var(--font-size-xl);
186
+ letter-spacing: -0.035em;
187
+ }
188
+
189
+ .aperture-demo__index {
190
+ color: var(--component-aperture-muted);
191
+ font-size: var(--font-size-xs);
192
+ font-weight: var(--font-weight-regular);
193
+ letter-spacing: 0;
194
+ font-variant-numeric: tabular-nums;
195
+ }
196
+
197
+ .aperture-demo__specimen p {
198
+ margin-block-start: var(--space-3);
199
+ font-size: var(--font-size-sm);
200
+ color: var(--component-aperture-muted);
201
+ }
202
+
203
+ .aperture-demo__sample {
204
+ position: relative;
205
+ container-type: inline-size;
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: center;
209
+ min-block-size: 260px;
210
+ padding: var(--space-10) var(--space-6) var(--space-6);
211
+ border: 1px solid var(--component-aperture-border);
212
+ border-radius: var(--component-aperture-panel-radius);
213
+ }
214
+
215
+ .aperture-demo__sample-label {
216
+ position: absolute;
217
+ inset-block-start: var(--space-5);
218
+ inset-inline: var(--space-6);
219
+ font-size: 10px;
220
+ font-weight: var(--font-weight-regular);
221
+ letter-spacing: 0.06em;
222
+ line-height: 1.5;
223
+ text-transform: uppercase;
224
+ }
225
+
226
+ .aperture-demo__sample--mark {
227
+ color: var(--component-aperture-ink);
228
+ background: var(--component-aperture-surface);
229
+ }
230
+
231
+ .aperture-demo__marks {
232
+ display: flex;
233
+ align-items: end;
234
+ justify-content: center;
235
+ gap: clamp(1.5rem, 12cqi, 3rem);
236
+ inline-size: 100%;
237
+ }
238
+
239
+ .aperture-demo__sample--mark .ct-aperture-mark:first-child {
240
+ --ct-aperture-mark-size: clamp(80px, 40cqi, 120px);
241
+ }
242
+
243
+ .aperture-demo__sample--mark .ct-aperture-mark:last-child {
244
+ --ct-aperture-mark-size: 32px;
245
+ }
246
+
247
+ .aperture-demo__sample--type {
248
+ justify-content: start;
249
+ color: var(--component-aperture-paper);
250
+ background: var(--component-aperture-ink);
251
+ font-weight: var(--font-weight-bold);
252
+ letter-spacing: -0.07em;
253
+ line-height: 1;
254
+ }
255
+
256
+ .aperture-demo__sample--type > div {
257
+ font-size: clamp(2rem, 20cqi, 5.5rem);
258
+ }
259
+
260
+ .aperture-demo__sample--action {
261
+ flex-direction: column;
262
+ gap: var(--space-5);
263
+ }
264
+
265
+ .aperture-demo__note {
266
+ display: grid;
267
+ grid-template-columns: 0.75fr 1.25fr;
268
+ align-items: start;
269
+ gap: clamp(2rem, 6cqi, 6rem);
270
+ padding-block: var(--space-8) clamp(4rem, 8cqi, 8rem);
271
+ scroll-margin-block-start: var(--space-7);
272
+ }
273
+
274
+ .aperture-demo__note .ct-aperture-label {
275
+ margin-block-end: var(--space-6);
276
+ }
277
+
278
+ .aperture-demo__footer {
279
+ padding-block-end: var(--space-7);
280
+ font-size: var(--font-size-xs);
281
+ }
282
+
283
+ .aperture-demo__signoff {
284
+ display: flex;
285
+ align-items: end;
286
+ justify-content: space-between;
287
+ flex-wrap: wrap;
288
+ gap: var(--space-7);
289
+ padding-block: clamp(2.5rem, 5cqi, 5rem);
290
+ }
291
+
292
+ .aperture-demo__signature {
293
+ --ct-aperture-mark-size: 0.8em;
294
+ gap: 0.2em;
295
+ font-size: clamp(3.5rem, 10.5cqi, 10rem);
296
+ letter-spacing: -0.075em;
297
+ }
298
+
299
+ .aperture-demo__signoff > p {
300
+ padding-block-end: 0.25em;
301
+ font-size: clamp(1.25rem, 2.5cqi, 2rem);
302
+ font-weight: var(--font-weight-bold);
303
+ letter-spacing: -0.035em;
304
+ line-height: 1.2;
305
+ }
306
+
307
+ .aperture-demo__colophon {
308
+ display: flex;
309
+ align-items: center;
310
+ justify-content: space-between;
311
+ flex-wrap: wrap;
312
+ gap: var(--space-6);
313
+ color: var(--component-aperture-muted);
314
+ }
315
+
316
+ @container (max-width: 850px) {
317
+ .aperture-demo__hero,
318
+ .aperture-demo__section-head,
319
+ .aperture-demo__note {
320
+ grid-template-columns: 1fr;
321
+ }
322
+
323
+ .aperture-demo__hero {
324
+ gap: var(--space-9);
325
+ }
326
+
327
+ .aperture-demo__intro .ct-aperture-display {
328
+ font-size: clamp(3.25rem, 0.75rem + 15cqi, 8.5rem);
329
+ }
330
+
331
+ .aperture-demo__hero .ct-aperture-poster {
332
+ min-block-size: 0;
333
+ }
334
+
335
+ .aperture-demo__hero .ct-aperture-poster__art .ct-aperture-mark {
336
+ --ct-aperture-mark-size: min(65%, 320px);
337
+ }
338
+
339
+ .aperture-demo__specimens {
340
+ grid-template-columns: 1fr;
341
+ gap: var(--space-9);
342
+ }
343
+
344
+ .aperture-demo__specimen:nth-child(n) {
345
+ margin-block-start: 0;
346
+ }
347
+
348
+ .aperture-demo__sample {
349
+ min-block-size: 240px;
350
+ }
351
+
352
+ .aperture-demo__sample--type > div {
353
+ font-size: clamp(2rem, 20cqi, 6rem);
354
+ }
355
+ }
356
+
357
+ @media (forced-colors: active) {
358
+ .aperture-demo__sample {
359
+ color: CanvasText;
360
+ background: Canvas;
361
+ border-color: CanvasText;
362
+ }
363
+ }