sheleg-design-skill 1.22.0 → 1.23.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.
- package/CHANGELOG.md +58 -0
- package/kits/blueprint/src/styles.css +13 -1
- package/kits/datasheet/src/styles.css +13 -1
- package/kits/field-notes/src/styles.css +4 -0
- package/kits/maquette/src/styles.css +3 -0
- package/kits/scoreboard/src/styles.css +18 -2
- package/package.json +1 -1
- package/plugins/sheleg-design/.claude-plugin/plugin.json +1 -1
- package/plugins/sheleg-design/skills/sheleg-design/SKILL.md +1 -1
- package/plugins/sheleg-design/skills/sheleg-design/styles/STYLE_PACK_TEMPLATE.md +17 -1
- package/plugins/sheleg-design/skills/sheleg-design/styles/blueprint.md +8 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/datasheet.md +6 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/manpage.md +6 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/maquette.md +6 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/pigeonhole.md +9 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/prism.md +6 -0
- package/plugins/sheleg-design/skills/sheleg-design/styles/showroom.md +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,64 @@ All notable changes to this project are documented in this file. The format
|
|
|
4
4
|
follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions
|
|
5
5
|
follow [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [1.23.0] - 2026-08-13
|
|
8
|
+
|
|
9
|
+
A component library that sized itself by the screen, and a contract bullet nobody had
|
|
10
|
+
answered since it was written.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`validate_pack_container_answer()`** — a widened pack's `## Responsive` section has
|
|
15
|
+
to say which of its components size against their container. The skeleton has carried
|
|
16
|
+
that bullet since the contract was widened in **1.5.0**, and **seven of the ten
|
|
17
|
+
widened packs left it blank**: the contract asked and nothing checked, which is the
|
|
18
|
+
same dead zone the all-or-nothing heading rule closed. "None, and here is why" is a
|
|
19
|
+
valid answer — `field-notes` and `cyclorama` were already giving it.
|
|
20
|
+
- **`validate_kit_breakpoints()`** — every width media query in the sixteen kits must
|
|
21
|
+
either target `:root` alone or carry a declared reason, because a kit ships components
|
|
22
|
+
a consumer drops into an arbitrary box. It found **seven queries across six kits, and
|
|
23
|
+
zero `container-type` anywhere**.
|
|
24
|
+
- **Three kinds of breakpoint, in the skeleton**, because only one of them has a
|
|
25
|
+
container answer: **CONTAINER** (a property on a descendant of a component root),
|
|
26
|
+
**PAGE** (a value the page owns — a hero's padding, a root token switch), and **SELF**
|
|
27
|
+
— a property on the element that *establishes* the container, which cannot query
|
|
28
|
+
itself and has no container answer at all. Five of the seven queries turned out to be
|
|
29
|
+
SELF or PAGE, which is why "0 of 16 kits use container queries" was a worse
|
|
30
|
+
description of the problem than it looked.
|
|
31
|
+
- **The distinction the library was missing:** the pack documents a page measured off a
|
|
32
|
+
reference, so its breakpoints are viewport-shaped; the kit ships components this
|
|
33
|
+
project authors, so theirs are container-shaped. `field-notes` was right that
|
|
34
|
+
container queries are "not for the page" and incomplete about the component library
|
|
35
|
+
shipped beside it.
|
|
36
|
+
- **All seven silent packs now answer**, each from its own component list — the
|
|
37
|
+
instrument's cell grid, the code frame and the endpoint row, the CLI line and the
|
|
38
|
+
agent prompt, the labelled row and the FAQ's columns, the install line and the
|
|
39
|
+
benchmark row, the data row and the column header, the panel and the figure well.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- **`scoreboard`'s ledger now does what its own pack has always specified.** The pack
|
|
44
|
+
says *"Container queries for the report surface and the ledger: `container-type:
|
|
45
|
+
inline-size`, because both appear inside columns of different widths on the same page
|
|
46
|
+
and neither should size against the viewport"* — and the kit was switching on the
|
|
47
|
+
viewport, so a ledger in a 320px sidebar on a 1440px screen kept its wide columns and
|
|
48
|
+
crushed its leader. This was not a missing modern feature; it was a kit ignoring its
|
|
49
|
+
pack.
|
|
50
|
+
- **The breakpoint is derived rather than carried over.** 767px was a statement about
|
|
51
|
+
phones. The row's own geometry: label 95 + gap 12 + numeral column 80 + gap 12 = 199px
|
|
52
|
+
of fixed content, plus a minimum leader of `--space-8` so the dotted line still reads
|
|
53
|
+
as a leader — **231px**, with the 32px named as the one decision it contains.
|
|
54
|
+
|
|
55
|
+
### Notes
|
|
56
|
+
|
|
57
|
+
- **Two conversions are held, with the reason at the block.** `blueprint`'s tick and
|
|
58
|
+
column rule and `datasheet`'s cell grid are genuine CONTAINER cases marked
|
|
59
|
+
`TODO-CONTAINER B-032`; each needs its breakpoint derived from its own geometry, and
|
|
60
|
+
carrying 768 or 640 into `@container` would be the same mistake in a newer syntax.
|
|
61
|
+
- The new check's own first draft looked back a fixed 400 characters for its marker and
|
|
62
|
+
missed a five-line reason whose marker sat at 425 — a check that fails on a longer
|
|
63
|
+
explanation teaches authors to write shorter ones. It reads the whole comment now.
|
|
64
|
+
|
|
7
65
|
## [1.22.0] - 2026-08-13
|
|
8
66
|
|
|
9
67
|
The palette gate learns two colour forms it had been refusing, and the refusal turns
|
|
@@ -226,8 +226,20 @@
|
|
|
226
226
|
.bp-code__copy:hover { color: var(--accent); }
|
|
227
227
|
|
|
228
228
|
/* Registration marks are a desktop flourish and must not become touch targets. */
|
|
229
|
+
/* SELF — .bp-grid's background-size is a property of the element that would
|
|
230
|
+
establish the container, and a container cannot query itself. Halving the grid
|
|
231
|
+
step needs a wrapper this kit has no business adding to a consumer's markup, so
|
|
232
|
+
it stays a viewport query by limitation rather than by preference. */
|
|
229
233
|
@media (max-width: 768px) {
|
|
230
|
-
.bp-reg__tick { display: none; }
|
|
231
234
|
.bp-grid { background-size: calc(var(--grid-step) / 2) calc(var(--grid-step) / 2); }
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* TODO-CONTAINER B-032 — the tick and the column rule are descendants of the panel
|
|
238
|
+
and the column, so both have a real container answer: container-type on those two
|
|
239
|
+
roots and @container here. Held out of 1.23.0 because each needs its breakpoint
|
|
240
|
+
derived from the component's own geometry the way the scoreboard ledger's was, and
|
|
241
|
+
a number carried over from the viewport would be the same mistake in a new syntax. */
|
|
242
|
+
@media (max-width: 768px) {
|
|
243
|
+
.bp-reg__tick { display: none; }
|
|
232
244
|
.bp-column__rule { display: none; }
|
|
233
245
|
}
|
|
@@ -566,12 +566,24 @@
|
|
|
566
566
|
border-bottom: 1px dashed var(--rule-dash);
|
|
567
567
|
}
|
|
568
568
|
|
|
569
|
+
/* SELF for the guides, PAGE for the heading. .ds-guides--ruled sets a border on the
|
|
570
|
+
element that would establish its own container. The --1 step is the page title's
|
|
571
|
+
type, and the pack states it per viewport in its Responsive table, so it answers to
|
|
572
|
+
the page rather than to a box. */
|
|
569
573
|
@media (max-width: 640px) {
|
|
570
574
|
.ds-guides--ruled { border-bottom-style: none; }
|
|
571
|
-
.ds-instrument__grid { grid-template-columns: 1fr; }
|
|
572
575
|
.ds-heading--1 {
|
|
573
576
|
font-size: 32px;
|
|
574
577
|
line-height: 1.25;
|
|
575
578
|
letter-spacing: -0.021em;
|
|
576
579
|
}
|
|
577
580
|
}
|
|
581
|
+
|
|
582
|
+
/* TODO-CONTAINER B-032 — the instrument's cell grid is a descendant of .ds-instrument,
|
|
583
|
+
and the pack's own Responsive section now says it must collapse when its own box is
|
|
584
|
+
narrow rather than when the phone is: the instrument is the component a reader
|
|
585
|
+
embeds. Held for the same reason as blueprint's: the breakpoint has to come from the
|
|
586
|
+
cell grid's minimum comfortable column, not from 640. */
|
|
587
|
+
@media (max-width: 640px) {
|
|
588
|
+
.ds-instrument__grid { grid-template-columns: 1fr; }
|
|
589
|
+
}
|
|
@@ -702,6 +702,8 @@
|
|
|
702
702
|
opacity: var(--grain-opacity);
|
|
703
703
|
pointer-events: none;
|
|
704
704
|
}
|
|
705
|
+
/* PAGE — a hero's padding is the page's opening viewport, which is the one measure
|
|
706
|
+
that is genuinely about the screen. */
|
|
705
707
|
@media (min-width: 64rem) {
|
|
706
708
|
.fn-hero {
|
|
707
709
|
padding: var(--s7);
|
|
@@ -813,6 +815,8 @@
|
|
|
813
815
|
background-position: left top, left top, right top, right top, left bottom,
|
|
814
816
|
left bottom, right bottom, right bottom;
|
|
815
817
|
}
|
|
818
|
+
/* SELF — .fn-crop is the crop mark itself, so the property is on the element that
|
|
819
|
+
would establish the container. A crop mark cannot query its own presence. */
|
|
816
820
|
@media (min-width: 48rem) {
|
|
817
821
|
.fn-crop {
|
|
818
822
|
display: block;
|
|
@@ -245,6 +245,9 @@
|
|
|
245
245
|
|
|
246
246
|
/* The offset shortens on small screens: 24px of displacement on a 320px drawing
|
|
247
247
|
reads as a printing error. Labels never scale. */
|
|
248
|
+
/* SELF — the drop-shadow is a property of .mq-block, which is the element that would
|
|
249
|
+
establish the container. Wrapping every model block to let it query itself would
|
|
250
|
+
change a consumer's markup, which is not the kit's business. */
|
|
248
251
|
@media (max-width: 768px) {
|
|
249
252
|
.mq-block { filter: drop-shadow(var(--shadow-block-sm)); }
|
|
250
253
|
}
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
.sb-tick-heading__tick { flex: 0 0 auto; width: 3px; height: 18px; border-radius: var(--radius-pill); background-color: var(--accent); }
|
|
308
308
|
|
|
309
309
|
/* The ledger. One per page, and every row is a record rather than a control. */
|
|
310
|
-
.sb-ledger { display: block; background-color: var(--bg); color: var(--ink);
|
|
310
|
+
.sb-ledger { container-type: inline-size; display: block; background-color: var(--bg); color: var(--ink);
|
|
311
311
|
border-radius: var(--radius-md); padding: var(--space-8) var(--space-6); }
|
|
312
312
|
.sb-ledger__label { display: flex; align-items: center; gap: var(--space-2); margin: 0 0 var(--space-4);
|
|
313
313
|
font-size: var(--t-label); font-weight: var(--weight-label); text-transform: uppercase;
|
|
@@ -342,7 +342,23 @@
|
|
|
342
342
|
.sb-status--on-panel.sb-status--danger { color: var(--danger-on-dark); }
|
|
343
343
|
.sb-status--on-panel.sb-status--info { color: var(--info-on-dark); }
|
|
344
344
|
|
|
345
|
-
|
|
345
|
+
/* The pack has specified this since it shipped -- "Container queries for the report
|
|
346
|
+
surface and the ledger: container-type: inline-size, because both appear inside
|
|
347
|
+
columns of different widths on the same page and neither should size against the
|
|
348
|
+
viewport" -- and the kit was still switching on the VIEWPORT, so a ledger in a
|
|
349
|
+
320px sidebar on a 1440px screen kept its wide columns and crushed its leader.
|
|
350
|
+
|
|
351
|
+
The breakpoint is derived from the row's own geometry rather than carried over
|
|
352
|
+
from the old 767px, which was a statement about phones and not about this box:
|
|
353
|
+
label 95px + gap 12px + numeral column 80px + gap 12px = 199px of fixed content,
|
|
354
|
+
plus a minimum leader of --space-8 (32px) so the dotted line still reads as a
|
|
355
|
+
leader rather than a dash. 231px. The 32px is this kit's one decision here; the
|
|
356
|
+
199px is arithmetic on the pack's own tokens.
|
|
357
|
+
|
|
358
|
+
Below it the columns take the narrow pair, which the pack describes as a glyph
|
|
359
|
+
budget rather than a width: 70px holds four glyphs of Press Start 2P at
|
|
360
|
+
--t-numeral where 80px holds five. */
|
|
361
|
+
@container (max-width: 231px) {
|
|
346
362
|
.sb-row__label { width: 75px; }
|
|
347
363
|
.sb-row__value { width: 70px; }
|
|
348
364
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sheleg-design-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "Design taste as an installable agent skill. Cinematic scroll-driven landing pages built on one scroll clock and layered degrade-to-calm motion, a motion doctrine that decides whether to animate before it decides how, three calibration dials, and sixteen locked style packs with ready-made design tokens — instrument-console, editorial-luxury, workbench, briefing-room, atrium, orchard, field-notes, cyclorama, showroom, blueprint, prism, maquette, scoreboard, datasheet, manpage and pigeonhole. Colour, slop and fork-reciprocity gates run as scripts, not opinions. Works with Cursor, Claude Code and any agent that reads a SKILL.md.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"sheleg-design-skill": "bin/cli.js"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "sheleg-design",
|
|
3
3
|
"displayName": "SHELEG Design",
|
|
4
4
|
"description": "SHELEG Design methodology: cinematic scroll-driven landing pages (single scroll clock, layered degrade-to-calm motion, WebGL particle formations), a motion doctrine that decides whether to animate before it decides how, and sixteen pluggable visual style packs — instrument-console (dark console), editorial-luxury (warm editorial), workbench (light/dark product UI for dashboards and tools), briefing-room (dark 16:9 deck), atrium (warm consumer health), orchard (friendly consumer biotech), field-notes (warm paper for dev tools sold on auditability), cyclorama (a pastel field on a 32s cycle), showroom (the product as the exhibit), blueprint (a drawing sheet, zero radius), prism (one iridescent wash over mono body), maquette (cream axonometric models on a dark table), scoreboard (warm paper, pixel numerals, a dark ledger of results), datasheet (an off-white spec sheet whose live instrument goes dark when it detects the reader is hiding), manpage (a developer landing page set in the reader's own system monospace on cream paper, with coral label chips that are real headings and a dark code frame as the argument), pigeonhole (a white sorting wall whose nine pastel categories are a filing scheme rather than a mood, each a two-layer chip whose label word is mandatory). Ships the sheleg-design skill, the architecture reference, the motion doctrine, the Figma and Claude Design bridges, AI-surface patterns, style packs with ready-made token CSS, and the /sheleg-design command.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.23.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -3,7 +3,7 @@ name: sheleg-design
|
|
|
3
3
|
description: Use when building or upgrading a cinematic scroll-driven landing page, marketing site or hero (particle/WebGL background, scroll-linked animation, parallax, scrubbed sections) — when such a page feels busy or janky or its motion layers drift out of sync — or when styling product UI with its style packs - dashboards, admin panels, internal/dev tools, mobile app screens, design tokens, light/dark themes - or when carrying a visual system across the Figma border (publishing tokens as variables, implementing a design without importing raw values). Triggers - "cinematic landing" / "кинематографичный лендинг", "scroll animation" / "скролл-анимация", "dashboard style" / "стиль дашборда", "design tokens" / "дизайн-токены", "light/dark theme" / "светлая/тёмная тема", "figma variables / figma to code" / "переменные фигмы, фигма в код", "chat/agent UI" / "интерфейс чата или агента", "streaming output" / "стриминг ответа", "mobile screen" / "мобильный экран".
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
|
-
version: 1.
|
|
6
|
+
version: 1.23.0
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# SHELEG Design
|
|
@@ -143,7 +143,23 @@ How the pack collapses. Not "it is responsive" — the actual rules.
|
|
|
143
143
|
|
|
144
144
|
- **Fluid type** — the `clamp()` values, with the slope shown, not guessed.
|
|
145
145
|
- **Container queries** — which components size against their container
|
|
146
|
-
(`container-type: inline-size`) rather than the viewport.
|
|
146
|
+
(`container-type: inline-size`) rather than the viewport. **This bullet is not
|
|
147
|
+
optional and "none" is a valid answer**: it was added with the widened contract
|
|
148
|
+
and seven of the ten widened packs left it blank until 1.23.0, which is why
|
|
149
|
+
`validate_pack_container_answer()` now asks for it. Sort every breakpoint the
|
|
150
|
+
pack owns into three kinds, because only the first has a container answer:
|
|
151
|
+
|
|
152
|
+
| Kind | What it is | Where it goes |
|
|
153
|
+
|---|---|---|
|
|
154
|
+
| **CONTAINER** | a property on a *descendant* of a component root — a row's column widths, a grid's track count, a decorative tick | `container-type: inline-size` on the root, `@container` on the descendant |
|
|
155
|
+
| **PAGE** | a value the page owns — a hero's padding, a nav's shape, a root token switch | a viewport `@media`, and it stays there |
|
|
156
|
+
| **SELF** | a property on the element that *establishes* the container — a block's own shadow, a background-size on the grid element itself | **no container answer exists.** A container cannot query itself, and adding a wrapper to a consumer's markup is not the kit's business. Keep the viewport query and mark it `SELF` with the reason |
|
|
157
|
+
|
|
158
|
+
The distinction the library was missing: **the pack documents a page measured off
|
|
159
|
+
a reference, so its breakpoints are viewport-shaped; the kit ships components this
|
|
160
|
+
project authors, so theirs are container-shaped.** `field-notes` was right that
|
|
161
|
+
container queries are "not for the page" and incomplete about the component
|
|
162
|
+
library shipped beside it.
|
|
147
163
|
- **Collapse** — what happens to asymmetry, overlap, rotation and negative
|
|
148
164
|
margins below the pack's breakpoint. Overlapping elements that survive to
|
|
149
165
|
mobile become touch-target conflicts.
|
|
@@ -242,6 +242,14 @@ Measured off the reference unless a row says **pack decision**.
|
|
|
242
242
|
— at 8px they become touch-target confetti — and stay only on framed figures.
|
|
243
243
|
- Buttons go full-width and stack below 480px. Full-height sections use `dvh`.
|
|
244
244
|
|
|
245
|
+
- **Container queries.** The **panel** and the **figure well** are what a consumer
|
|
246
|
+
drops into an arbitrary column, so both take `container-type: inline-size`, and the
|
|
247
|
+
registration ticks and the column rule inside them answer to that box rather than to
|
|
248
|
+
the screen — a drawing sheet in a 400px sidebar has no room for ticks whatever the
|
|
249
|
+
viewport says. The 32px grid's own `background-size` is **SELF**: it sits on the
|
|
250
|
+
element that establishes the container, so it cannot query its own width, and it
|
|
251
|
+
keeps a viewport query.
|
|
252
|
+
|
|
245
253
|
## Motion tokens
|
|
246
254
|
|
|
247
255
|
- **One curve, `cubic-bezier(0.4, 0, 0.2, 1)`**, and three durations:
|
|
@@ -337,6 +337,12 @@ Measured breakpoints, ordered by how much of the stylesheet each carries:
|
|
|
337
337
|
guides on a 390px screen is noise.
|
|
338
338
|
- **Viewport** — use `100dvh` for any full-height section, never the static unit.
|
|
339
339
|
|
|
340
|
+
- **Container queries.** The **instrument's cell grid** is the one that must: it
|
|
341
|
+
collapses to a single column when *its own* box is narrow, not when the phone is,
|
|
342
|
+
because the instrument is exactly the component a reader embeds in a sidebar. Cards
|
|
343
|
+
follow the same rule. The **navigation** spans the page and stays viewport, and the
|
|
344
|
+
`--1` heading step is page type rather than a component's — **PAGE**, both of them.
|
|
345
|
+
|
|
340
346
|
## Motion tokens
|
|
341
347
|
|
|
342
348
|
One ease, one measured base duration, one measured stagger.
|
|
@@ -422,6 +422,12 @@ Measured at the reference's own breakpoints (Tailwind v4: `sm` 40rem, `lg` 64rem
|
|
|
422
422
|
reflows and never shrinks its type — a wrapped code sample is a wrong code
|
|
423
423
|
sample.
|
|
424
424
|
|
|
425
|
+
- **Container queries.** Two components own their own width: the **code frame**,
|
|
426
|
+
which scrolls rather than reflows and must decide that from its box, and the
|
|
427
|
+
**endpoint row**, whose method chip and path share a line only while there is room
|
|
428
|
+
for both. Both take `container-type: inline-size`. The 576px argument column is a
|
|
429
|
+
page measure — **PAGE** — and so is the label chip's position in the flow.
|
|
430
|
+
|
|
425
431
|
## Signature element
|
|
426
432
|
|
|
427
433
|
**The coral label chip that is a real `<h2>`.**
|
|
@@ -203,6 +203,12 @@ Measured off the reference unless a row says **pack decision**.
|
|
|
203
203
|
24px displacement on a 320px-wide drawing reads as a printing error.
|
|
204
204
|
- Full-height sections use `dvh`; bare `100vh` is banned.
|
|
205
205
|
|
|
206
|
+
- **Container queries.** The **CLI line** and the **agent prompt** wrap by their own
|
|
207
|
+
width, so they answer to their container. The **model block's** drop-shadow is
|
|
208
|
+
**SELF**: the shadow is a property of the block that would establish the container,
|
|
209
|
+
and a container cannot query itself — so that one breakpoint stays a viewport query,
|
|
210
|
+
by limitation rather than by preference.
|
|
211
|
+
|
|
206
212
|
## Motion tokens
|
|
207
213
|
|
|
208
214
|
- **One curve, `cubic-bezier(0.4, 0, 0.2, 1)`.** Durations `--dur-fast .15s`,
|
|
@@ -328,6 +328,15 @@ What stacks below 768px: the two-column card grids collapse to one, the FAQ's tw
|
|
|
328
328
|
columns to one, the three step cards to a vertical run, and the hero's two buttons
|
|
329
329
|
to full width. The marquee keeps running at the same 100s.
|
|
330
330
|
|
|
331
|
+
- **Container queries.** The **labelled row** is the container case, and it is the
|
|
332
|
+
reason the category chip sits above the subject rather than beside it: a row in a
|
|
333
|
+
320px sidebar needs that stacking whatever the viewport is. The FAQ's two columns are
|
|
334
|
+
the same kind of decision — its `≥1024px` rule is really about the list's own width.
|
|
335
|
+
Both take `container-type: inline-size` on their wrapper. The **nav** and the **logo
|
|
336
|
+
marquee** are **PAGE**. And the display's line-height switch is a **root token**, so
|
|
337
|
+
it has no container answer at all — `:root` is not inside anyone's container, which
|
|
338
|
+
is why that single `@media` in the token layer is correct as it stands.
|
|
339
|
+
|
|
331
340
|
## Motion tokens
|
|
332
341
|
|
|
333
342
|
| Token | Value | Where it was measured |
|
|
@@ -193,6 +193,12 @@ Measured off the reference unless a row says **pack decision**.
|
|
|
193
193
|
thing to be compromised.
|
|
194
194
|
- Full-height sections use `dvh`; bare `100vh` is banned.
|
|
195
195
|
|
|
196
|
+
- **Container queries.** The **install line** is the container case that matters — a
|
|
197
|
+
command must not wrap mid-flag, and whether it fits is a fact about its box, not about
|
|
198
|
+
the screen — with the **benchmark row** beside it for the same reason. Both take
|
|
199
|
+
`container-type: inline-size`. The iridescent wash and its hard edge are **PAGE**: the
|
|
200
|
+
field is the page, and a wash that recalculated per component would band.
|
|
201
|
+
|
|
196
202
|
## Motion tokens
|
|
197
203
|
|
|
198
204
|
- **One curve, `cubic-bezier(0.4, 0, 0.2, 1)`**, two durations: `--dur-fast .2s`
|
|
@@ -219,6 +219,13 @@ on iOS.
|
|
|
219
219
|
`480px`.
|
|
220
220
|
- Full-height sections use `dvh`; bare `100vh` is banned.
|
|
221
221
|
|
|
222
|
+
- **Container queries.** The **data row** and the **column header** are the container
|
|
223
|
+
cases: the specimen's own table is laid out at whatever width the specimen frame
|
|
224
|
+
gives it, which is not the viewport minus gutters. Both take
|
|
225
|
+
`container-type: inline-size` on the table wrapper. The specimen frame's seven-layer
|
|
226
|
+
shadow is **SELF** — it is a property of the frame itself — and the centred hero is
|
|
227
|
+
**PAGE**.
|
|
228
|
+
|
|
222
229
|
## Motion tokens
|
|
223
230
|
|
|
224
231
|
- **One curve, `cubic-bezier(0.2, 0, 0, 1)`**, for every state change and reveal;
|