@misoto22/design 0.9.0 → 0.10.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/dist/agent/Accordion.md +1 -1
- package/dist/agent/Alert.md +1 -1
- package/dist/agent/AppShell.md +1 -1
- package/dist/agent/ArchitectureFigure.md +1 -1
- package/dist/agent/AreaChart.md +1 -1
- package/dist/agent/Article.md +1 -1
- package/dist/agent/AspectRatio.md +1 -1
- package/dist/agent/Avatar.md +1 -1
- package/dist/agent/Badge.md +1 -1
- package/dist/agent/BarChart.md +1 -1
- package/dist/agent/BarList.md +1 -1
- package/dist/agent/BigNumber.md +1 -1
- package/dist/agent/BoxPlot.md +1 -1
- package/dist/agent/Breadcrumb.md +1 -1
- package/dist/agent/BulletChart.md +1 -1
- package/dist/agent/Button.md +1 -1
- package/dist/agent/Calendar.md +1 -1
- package/dist/agent/Card.md +1 -1
- package/dist/agent/Checkbox.md +1 -1
- package/dist/agent/Code.md +1 -1
- package/dist/agent/CodeBlock.md +1 -1
- package/dist/agent/Collapsible.md +1 -1
- package/dist/agent/ColorPicker.md +1 -1
- package/dist/agent/Combobox.md +1 -1
- package/dist/agent/Command.md +1 -1
- package/dist/agent/ComposedChart.md +1 -1
- package/dist/agent/ContextMenu.md +1 -1
- package/dist/agent/DataflowFigure.md +1 -1
- package/dist/agent/DatePicker.md +1 -1
- package/dist/agent/DescriptionList.md +1 -1
- package/dist/agent/Diagram.md +1 -1
- package/dist/agent/DiagramCanvas.md +1 -1
- package/dist/agent/DiagramExportMenu.md +1 -1
- package/dist/agent/DiagramInspector.md +1 -1
- package/dist/agent/DiagramLegend.md +1 -1
- package/dist/agent/DiagramMinimap.md +1 -1
- package/dist/agent/DiagramToolbar.md +1 -1
- package/dist/agent/Dialog.md +1 -1
- package/dist/agent/DropdownMenu.md +1 -1
- package/dist/agent/EmptyState.md +1 -1
- package/dist/agent/ErrorState.md +1 -1
- package/dist/agent/Facet.md +1 -1
- package/dist/agent/Field.md +1 -1
- package/dist/agent/FigureBand.md +1 -1
- package/dist/agent/FloatingIconButton.md +1 -1
- package/dist/agent/FunnelChart.md +1 -1
- package/dist/agent/Heading.md +1 -1
- package/dist/agent/Heatmap.md +1 -1
- package/dist/agent/Histogram.md +1 -1
- package/dist/agent/Input.md +1 -1
- package/dist/agent/Kbd.md +2 -2
- package/dist/agent/LifecycleFigure.md +1 -1
- package/dist/agent/LineChart.md +1 -1
- package/dist/agent/LinkArrow.md +1 -1
- package/dist/agent/Markdown.md +1 -1
- package/dist/agent/NativeSelect.md +1 -1
- package/dist/agent/NavItem.md +1 -1
- package/dist/agent/NumberField.md +1 -1
- package/dist/agent/Pagination.md +1 -1
- package/dist/agent/PieChart.md +1 -1
- package/dist/agent/Popover.md +1 -1
- package/dist/agent/Progress.md +1 -1
- package/dist/agent/RadarChart.md +1 -1
- package/dist/agent/RadialChart.md +1 -1
- package/dist/agent/RadioGroup.md +1 -1
- package/dist/agent/SankeyChart.md +1 -1
- package/dist/agent/ScatterChart.md +1 -1
- package/dist/agent/ScrollArea.md +1 -1
- package/dist/agent/SearchableMenu.md +1 -1
- package/dist/agent/Select.md +1 -1
- package/dist/agent/Separator.md +1 -1
- package/dist/agent/SequenceFigure.md +1 -1
- package/dist/agent/Sheet.md +1 -1
- package/dist/agent/Sidebar.md +2 -2
- package/dist/agent/Skeleton.md +1 -1
- package/dist/agent/Slider.md +1 -1
- package/dist/agent/Sparkline.md +1 -1
- package/dist/agent/Spinner.md +1 -1
- package/dist/agent/StatusDot.md +1 -1
- package/dist/agent/StatusPill.md +1 -1
- package/dist/agent/Steps.md +1 -1
- package/dist/agent/Switch.md +1 -1
- package/dist/agent/Table.md +1 -1
- package/dist/agent/Tabs.md +1 -1
- package/dist/agent/Tag.md +1 -1
- package/dist/agent/Text.md +1 -1
- package/dist/agent/Textarea.md +1 -1
- package/dist/agent/Timestamp.md +1 -1
- package/dist/agent/Toast.md +1 -1
- package/dist/agent/ToggleGroup.md +1 -1
- package/dist/agent/Toolbar.md +1 -1
- package/dist/agent/Tooltip.md +1 -1
- package/dist/agent/TreemapChart.md +1 -1
- package/dist/agent/WaterfallChart.md +1 -1
- package/dist/agent/WorkflowFigure.md +1 -1
- package/dist/agent/catalog.json +2 -1
- package/dist/agent/index.md +2 -2
- package/dist/charts/lib/chart.js +16 -1
- package/dist/charts/lib/chart.js.map +1 -1
- package/dist/components/AppShell/AppShell.js +2 -2
- package/dist/components/AppShell/AppShell.js.map +1 -1
- package/dist/components/Button/Button.js +3 -3
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Kbd/Kbd.d.ts +7 -0
- package/dist/components/Kbd/Kbd.js +1 -1
- package/dist/components/Kbd/Kbd.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.d.ts +8 -0
- package/dist/components/Sidebar/Sidebar.js +2 -2
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/semantic.css +4 -2
- package/dist/styles.css +1 -1
- package/dist/themes.css +91 -0
- package/dist/tokens.css +67 -1
- package/dist/tokens.d.ts +2 -0
- package/dist/tokens.js +14 -3
- package/dist/tokens.json +14 -3
- package/package.json +1 -1
package/dist/tokens.css
CHANGED
|
@@ -115,7 +115,9 @@
|
|
|
115
115
|
|
|
116
116
|
A consumer who genuinely needs hue does not hand-pick hexes: it sets
|
|
117
117
|
`data-chart-palette="chroma"` (see themes.css), which re-points these
|
|
118
|
-
eight names onto a categorical palette validated against both grounds
|
|
118
|
+
eight names onto a categorical palette validated against both grounds —
|
|
119
|
+
or `"accent"`, which ladders the same eight names out of `--clay` when
|
|
120
|
+
what the charts have to carry is a brand rather than eight categories. */
|
|
119
121
|
--series-1: #101010;
|
|
120
122
|
--series-2: #565656;
|
|
121
123
|
--series-3: #202020;
|
|
@@ -385,6 +387,21 @@
|
|
|
385
387
|
--control-py-sm: 0.5rem;
|
|
386
388
|
--control-py-md: 0.75rem;
|
|
387
389
|
--control-py-lg: 0.75rem;
|
|
390
|
+
/* And so is the LEADING, which is the term that guard was missing.
|
|
391
|
+
`min-height` is a floor, and what has to stay under it is the whole box:
|
|
392
|
+
the line, the padding and the border. The padding was scaled and the line
|
|
393
|
+
was left inheriting the body's 1.6 — so `sm` measured 20.8 + 16 + 2 = 38.8
|
|
394
|
+
against a 36px token, `md` 46 against 44 and `lg` 50 against 48. Every
|
|
395
|
+
text button in the system was two to three pixels taller than the number
|
|
396
|
+
documenting it, and the floor never bound because the box had already
|
|
397
|
+
cleared it.
|
|
398
|
+
|
|
399
|
+
One value on both densities: the font sizes do not move with density, only
|
|
400
|
+
the padding and the heights do, so this does not have to. It is not a
|
|
401
|
+
reading leading — a control's label is one line, and 1.2 leaves every size
|
|
402
|
+
at every density inside its own height with room to spare. The test in
|
|
403
|
+
`tokens.test.ts` is what keeps that true. */
|
|
404
|
+
--control-lh: 1.2;
|
|
388
405
|
--control-gap: 0.625rem;
|
|
389
406
|
/* Text inputs are measured separately: they are read as much as they are
|
|
390
407
|
hit, so their padding tracks the type rather than the target. */
|
|
@@ -418,6 +435,37 @@
|
|
|
418
435
|
--sidebar-w: 16rem;
|
|
419
436
|
--sidebar-w-icon: 3.5rem;
|
|
420
437
|
|
|
438
|
+
/* ─── Bar ────────────────────────────────────────────────────────────────
|
|
439
|
+
How tall the band across the top of an application is — the masthead, and
|
|
440
|
+
the head of the rail beside it, which has to line up with it or the two
|
|
441
|
+
rules meeting at the corner are two different rules.
|
|
442
|
+
|
|
443
|
+
Derived, not typed. A bar is a row of controls and the air around them, so
|
|
444
|
+
it is the control it seats plus six pixels above and below — the same
|
|
445
|
+
twelve `--sidebar-w-icon` adds to a rail's collapsed width, for the same
|
|
446
|
+
reason.
|
|
447
|
+
|
|
448
|
+
WHICH control depends on the pointer, and that is the whole of the second
|
|
449
|
+
block. A bar is chrome: its controls are `sm`, the density this system
|
|
450
|
+
documents as a deliberate below-the-floor size for a mouse. A finger is
|
|
451
|
+
not a mouse, so on a coarse pointer they grow to the 44px target WCAG
|
|
452
|
+
2.5.5 asks for, and the bar has to grow with them or it clips what it
|
|
453
|
+
seats. Sizing it from `--control-h-md` on both is what made it too tall:
|
|
454
|
+
56px of bar around 39px of search field, holding room for a target that is
|
|
455
|
+
not on screen when a mouse is.
|
|
456
|
+
|
|
457
|
+
48px comfortable / 42px compact with a pointer, 56px / 48px with a finger.
|
|
458
|
+
A bar cannot be set to a height its own controls do not fit in.
|
|
459
|
+
|
|
460
|
+
It was five literals before, in two packages, and they did not agree:
|
|
461
|
+
`AppShell` said `h-14` and the documentation site said `h-16`, so the same
|
|
462
|
+
role was 56px in the component this system ships and 64px on the site
|
|
463
|
+
documenting it. `--scroll-offset` in `semantic.css` is a sixth, and the
|
|
464
|
+
one that shows why this matters — it is "a masthead plus a line of air"
|
|
465
|
+
and was written as `88px`, a number derived by hand from whichever of the
|
|
466
|
+
two answers its author had on screen. It now derives from this. */
|
|
467
|
+
--bar-h: calc(var(--control-h-sm) + 0.75rem);
|
|
468
|
+
|
|
421
469
|
/* ─── Floating surfaces ──────────────────────────────────────────────────
|
|
422
470
|
What a panel that FLOATS fills with, and what it does to whatever is
|
|
423
471
|
behind it. A dialog, a menu, a popover, a palette — the surfaces that sit
|
|
@@ -512,6 +560,24 @@
|
|
|
512
560
|
--scrim: color-mix(in srgb, #000 72%, transparent);
|
|
513
561
|
}
|
|
514
562
|
|
|
563
|
+
/* The bar, on a finger.
|
|
564
|
+
*
|
|
565
|
+
* A bar's controls are `sm` — the size this system documents as a deliberate
|
|
566
|
+
* below-the-floor density for a mouse — and a coarse pointer grows them to the
|
|
567
|
+
* 44px target WCAG 2.5.5 asks for. The bar grows with them, or it clips what it
|
|
568
|
+
* seats. Declared on the ROOT like the base value, so the substitution argument
|
|
569
|
+
* above still holds: one answer, resolved once, inherited by a rail that pins
|
|
570
|
+
* its own density.
|
|
571
|
+
*/
|
|
572
|
+
@media (pointer: coarse) {
|
|
573
|
+
:root,
|
|
574
|
+
[data-mode='light'],
|
|
575
|
+
[data-surface='paper'],
|
|
576
|
+
[data-rules='hairline'] {
|
|
577
|
+
--bar-h: calc(var(--control-h-md) + 0.75rem);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
515
581
|
[data-density='compact'] {
|
|
516
582
|
--control-h-sm: 1.875rem; /* 30px */
|
|
517
583
|
--control-h-md: 2.25rem; /* 36px — clears WCAG 2.5.8, not 2.5.5 */
|
package/dist/tokens.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export type TokenName =
|
|
|
23
23
|
| 'background-elevated'
|
|
24
24
|
| 'bar'
|
|
25
25
|
| 'bar-2'
|
|
26
|
+
| 'bar-h'
|
|
26
27
|
| 'border-color'
|
|
27
28
|
| 'border-subtle'
|
|
28
29
|
| 'brand-plate'
|
|
@@ -45,6 +46,7 @@ export type TokenName =
|
|
|
45
46
|
| 'control-h-lg'
|
|
46
47
|
| 'control-h-md'
|
|
47
48
|
| 'control-h-sm'
|
|
49
|
+
| 'control-lh'
|
|
48
50
|
| 'control-px-lg'
|
|
49
51
|
| 'control-px-md'
|
|
50
52
|
| 'control-px-sm'
|
package/dist/tokens.js
CHANGED
|
@@ -172,7 +172,7 @@ export const TOKENS = {
|
|
|
172
172
|
"layer": "tokens",
|
|
173
173
|
"category": "data",
|
|
174
174
|
"light": "#101010",
|
|
175
|
-
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds.",
|
|
175
|
+
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds — or `\"accent\"`, which ladders the same eight names out of `--clay` when what the charts have to carry is a brand rather than eight categories.",
|
|
176
176
|
"dark": "CanvasText"
|
|
177
177
|
},
|
|
178
178
|
"series-2": {
|
|
@@ -441,6 +441,12 @@ export const TOKENS = {
|
|
|
441
441
|
"category": "density",
|
|
442
442
|
"light": "0.75rem"
|
|
443
443
|
},
|
|
444
|
+
"control-lh": {
|
|
445
|
+
"layer": "tokens",
|
|
446
|
+
"category": "density",
|
|
447
|
+
"light": "1.2",
|
|
448
|
+
"comment": "And so is the LEADING, which is the term that guard was missing. `min-height` is a floor, and what has to stay under it is the whole box: the line, the padding and the border. The padding was scaled and the line was left inheriting the body's 1.6 — so `sm` measured 20.8 + 16 + 2 = 38.8 against a 36px token, `md` 46 against 44 and `lg` 50 against 48. Every text button in the system was two to three pixels taller than the number documenting it, and the floor never bound because the box had already cleared it. One value on both densities: the font sizes do not move with density, only the padding and the heights do, so this does not have to. It is not a reading leading — a control's label is one line, and 1.2 leaves every size at every density inside its own height with room to spare. The test in `tokens.test.ts` is what keeps that true."
|
|
449
|
+
},
|
|
444
450
|
"control-gap": {
|
|
445
451
|
"layer": "tokens",
|
|
446
452
|
"category": "density",
|
|
@@ -480,6 +486,11 @@ export const TOKENS = {
|
|
|
480
486
|
"category": "other",
|
|
481
487
|
"light": "3.5rem"
|
|
482
488
|
},
|
|
489
|
+
"bar-h": {
|
|
490
|
+
"layer": "tokens",
|
|
491
|
+
"category": "space",
|
|
492
|
+
"light": "calc(var(--control-h-md) + 0.75rem)"
|
|
493
|
+
},
|
|
483
494
|
"panel-bg": {
|
|
484
495
|
"layer": "tokens",
|
|
485
496
|
"category": "other",
|
|
@@ -1008,7 +1019,7 @@ export const TOKENS = {
|
|
|
1008
1019
|
"scroll-offset": {
|
|
1009
1020
|
"layer": "semantic",
|
|
1010
1021
|
"category": "space",
|
|
1011
|
-
"light": "
|
|
1012
|
-
"comment": "How far below the viewport top an anchored heading comes to rest — a fixed masthead plus a line of air."
|
|
1022
|
+
"light": "calc(var(--bar-h) + 1.5rem)",
|
|
1023
|
+
"comment": "How far below the viewport top an anchored heading comes to rest — a fixed masthead plus a line of air. Both halves are now named: the masthead is `--bar-h`, so a bar that moves takes its anchors with it, where `88px` was a number somebody derived once by hand and nothing kept in step."
|
|
1013
1024
|
}
|
|
1014
1025
|
}
|
package/dist/tokens.json
CHANGED
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
"layer": "tokens",
|
|
172
172
|
"category": "data",
|
|
173
173
|
"light": "#101010",
|
|
174
|
-
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds.",
|
|
174
|
+
"comment": "─── Data ─────────────────────────────────────────────────────────────── The series ramp a chart paints with, and the one place the White Reset has to answer a question a monochrome system would rather not be asked: how do you tell six lines apart with no hue left to spend? The answer is that hue was never the primary carrier here — TEXTURE is. Every chart primitive ships a fill variant (hatched, dotted, lines, stripped, duotone) and the series ramp below is the SECOND encoding, not the first. That ordering is what makes the set legible to a colour-blind reader, in greyscale print, and under forced-colours, none of which a hue-first categorical palette survives. The eight steps are interleaved rather than sequential — light, dark, light, dark — so neighbouring series sit as far apart on the lightness ramp as eight steps allow. Adjacent separation is ΔE 21.0 (OKLab ×100) against a 15 floor, and every step clears 3:1 on its own ground. Two checks a chromatic palette would pass fail here BY DESIGN, and are stated rather than hidden: the chroma floor (these are greys) and the lightness band (--series-1 is ink, and ink is the darkest mark the system has). Texture plus a legend is the relief, and both are mandatory — `Chart.Legend` is not optional above one series. A consumer who genuinely needs hue does not hand-pick hexes: it sets `data-chart-palette=\"chroma\"` (see themes.css), which re-points these eight names onto a categorical palette validated against both grounds — or `\"accent\"`, which ladders the same eight names out of `--clay` when what the charts have to carry is a brand rather than eight categories.",
|
|
175
175
|
"dark": "CanvasText"
|
|
176
176
|
},
|
|
177
177
|
"series-2": {
|
|
@@ -440,6 +440,12 @@
|
|
|
440
440
|
"category": "density",
|
|
441
441
|
"light": "0.75rem"
|
|
442
442
|
},
|
|
443
|
+
"control-lh": {
|
|
444
|
+
"layer": "tokens",
|
|
445
|
+
"category": "density",
|
|
446
|
+
"light": "1.2",
|
|
447
|
+
"comment": "And so is the LEADING, which is the term that guard was missing. `min-height` is a floor, and what has to stay under it is the whole box: the line, the padding and the border. The padding was scaled and the line was left inheriting the body's 1.6 — so `sm` measured 20.8 + 16 + 2 = 38.8 against a 36px token, `md` 46 against 44 and `lg` 50 against 48. Every text button in the system was two to three pixels taller than the number documenting it, and the floor never bound because the box had already cleared it. One value on both densities: the font sizes do not move with density, only the padding and the heights do, so this does not have to. It is not a reading leading — a control's label is one line, and 1.2 leaves every size at every density inside its own height with room to spare. The test in `tokens.test.ts` is what keeps that true."
|
|
448
|
+
},
|
|
443
449
|
"control-gap": {
|
|
444
450
|
"layer": "tokens",
|
|
445
451
|
"category": "density",
|
|
@@ -479,6 +485,11 @@
|
|
|
479
485
|
"category": "other",
|
|
480
486
|
"light": "3.5rem"
|
|
481
487
|
},
|
|
488
|
+
"bar-h": {
|
|
489
|
+
"layer": "tokens",
|
|
490
|
+
"category": "space",
|
|
491
|
+
"light": "calc(var(--control-h-md) + 0.75rem)"
|
|
492
|
+
},
|
|
482
493
|
"panel-bg": {
|
|
483
494
|
"layer": "tokens",
|
|
484
495
|
"category": "other",
|
|
@@ -1007,7 +1018,7 @@
|
|
|
1007
1018
|
"scroll-offset": {
|
|
1008
1019
|
"layer": "semantic",
|
|
1009
1020
|
"category": "space",
|
|
1010
|
-
"light": "
|
|
1011
|
-
"comment": "How far below the viewport top an anchored heading comes to rest — a fixed masthead plus a line of air."
|
|
1021
|
+
"light": "calc(var(--bar-h) + 1.5rem)",
|
|
1022
|
+
"comment": "How far below the viewport top an anchored heading comes to rest — a fixed masthead plus a line of air. Both halves are now named: the masthead is `--bar-h`, so a bar that moves takes its anchors with it, where `88px` was a number somebody derived once by hand and nothing kept in step."
|
|
1012
1023
|
}
|
|
1013
1024
|
}
|