@iyulab/house-style 0.2.0 → 0.4.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 CHANGED
@@ -1,5 +1,90 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.0] - 2026-10-14
4
+
5
+ ### Added
6
+
7
+ - `<kbd>` outside a component takes the keyboard-hint look (border, canvas background, overline size).
8
+ - `.hs-table-toolbar__actions` — the action group at the end of a table toolbar.
9
+
10
+ ### Changed
11
+
12
+ - Requires `@iyulab/components` 2.24.0 or later (peer range `^2.24.0`). The house sets the selection role
13
+ (`--u-selection-color`), which components reads from 2.24.0 — with an older components a checked box, a selected
14
+ radio and an on switch keep the primary colour.
15
+
16
+
17
+ ### Deprecated
18
+
19
+ - **`.hs-page-head` and its parts (`__eyebrow` · `__title` · `__description` · `__actions`) — use `u-page-header`**
20
+ from `@iyulab/modern-app`. The house already draws that component the same way (label-size eyebrow and
21
+ description, display-size title), and it carries the page's `h1`, a back link and a status slot the class pattern
22
+ does not. Move the eyebrow, title and description to its `eyebrow`, `title` and `subtitle` attributes and put each
23
+ scope picker and action in `slot="actions"`. Removed in 0.5.0.
24
+ - **`.hs-kbd` — use a plain `<kbd>`.** The house now draws `<kbd>` as the same small outlined cap, in the monospace
25
+ face. Removed in 0.5.0.
26
+ - **`.hs-stats` / `.hs-stat` and its parts — use `u-info-section layout="strip"`** with `u-info-field size="lg"`
27
+ (`@iyulab/modern-app` 0.54): `__label` → `label`, `__value` → `value`, `__unit` → `unit`, `__sub` → `description`,
28
+ `--warning` / `--danger` / `--success` → `tone="warning"` / `"negative"` / `"positive"`. The same strip — one surface,
29
+ hairline dividers, all side by side or all stacked below 640px. `.hs-stat--hero` has no counterpart (nothing used it)
30
+ and goes with it. Removed in 0.5.0.
31
+ - **`.hs-sheet-footer` and its parts — use `<u-action-bar sticky>`** (`@iyulab/modern-app` 0.54): the change summary in
32
+ `slot="summary"`, Cancel and Save as its children, the sheet's inset as `--action-bar-padding-inline`. It also keeps
33
+ a destructive action apart at the leading edge and puts the main actions on top when narrow. Removed in 0.5.0.
34
+
35
+ ### Fixed
36
+
37
+ - `.hs-views` no longer draws a vertical scrollbar beside its tabs. The selected tab's underline reached 1px
38
+ past the scrolling strip (a `-1px` margin over the strip's bottom border); the base line is now an inset shadow the
39
+ underline paints over.
40
+ - `.hs-table--compact` totals rows take the compact height too. `.hs-table tfoot td` set 40px with a higher
41
+ specificity, so a compact table's subtotal, tax and total rows stood taller than its body rows.
42
+ ## [0.3.0] - 2026-10-13
43
+
44
+ ### Changed
45
+
46
+ - 🔴**The house now sets the text between components.** Paragraphs, headings, lists and code spans an application
47
+ writes outside any component drew at the browser's defaults — a 16px body with `line-height: normal`, an `h2` of
48
+ 1.5em that outranked every component title, 1em gaps above and below. They now take the house ladder: the body at
49
+ the body step (14px · 1.571), `h1`/`h2`/`h3` at display/title/subtitle, `h4`–`h6` at the body step in semibold;
50
+ one gap below each block (`--u-space-sm` after a heading, `--u-space-md` after a paragraph, list, quote, figure or
51
+ `pre`), none above and none after the last block in its box; `code`, `kbd`, `samp` and `pre` in the house monospace.
52
+ All zero-specificity inside `iyu.house` — your own rules win. A screen that relied on the browser's defaults draws
53
+ smaller and tighter; set your own rule on that element to keep the old look.
54
+ - **Native checkboxes, radios and ranges take the selection colour** (`accent-color`), and scrollbars the strong line
55
+ colour (`scrollbar-color`).
56
+
57
+ ### Added
58
+
59
+ - **House chart colours** — `--u-chart-color-1` … `-8`, light and dark. Slot one is the interaction blue (`#2F6FEB`;
60
+ dark `#628FEA`, the dark blue taken to the mark band), so a one-series chart draws in the colour the screen already
61
+ uses for links, focus and selection; the other seven are muted, warm-leaning hues chosen as a set — neighbours
62
+ ΔE ≥ 15 for full colour vision and ≥ 8 under red–green deficiency, no slot within ΔE 10 of a status colour, every
63
+ dark slot ≥ 3:1 on the surfaces. Light slot six (olive) is 2.8:1 on white: six or more series need a legend or
64
+ labels. Before, the house set no chart colours and series drew in the built-in Material palette. Charts drawn
65
+ through `@iyulab/u-widgets/themes/components.css` pick them up slot for slot.
66
+ - `--u-selection-color` / `--u-selection-txt-color` — the mark of a chosen option (a checked box, a selected radio) and
67
+ the check drawn on it: the interaction blue, light and dark, held to 3:1 against the surface and its check.
68
+ - `.hs-prose` and `--hs-measure` (70ch) — running text that can grow wider than reads well stops its paragraphs and
69
+ lists at the measure.
70
+
71
+ ### Fixed
72
+
73
+ - **A hovered table header or toolbar strip is visibly different from its rest state.** `--u-bg-color-raised-hover`
74
+ (light) moves from `#EAEAE7` to `#E5E5E2` — the step from `--u-bg-color-raised` was 0.021 in OKLab lightness, below
75
+ what reads as a change. The token contract now holds state and depth steps to perception floors in both modes
76
+ (hover ≥ 0.03, press ≥ 0.05, selection ≥ 0.03, a surface step ≥ 0.025, which also carries a hairline edge).
77
+
78
+ ### Guide and reference app
79
+
80
+ - The guide's prose follows the new document-flow layer and stops at the measure; the theme and deployment pages
81
+ take the same page layout as the others; the «Component depth» cards say what the house draws (cards stay flat).
82
+ - Both sites follow the system theme (`Theme.init({ default: 'system' })`) and carry a favicon; the reference app
83
+ has a theme toggle.
84
+ - Reference app order detail: the items are a `u-rich-table` (the guide's «Line items» pattern) — columns line up,
85
+ quantity edits in place, rows delete from the table — and the add-item line folds in a narrow pane instead of
86
+ scrolling it sideways.
87
+
3
88
  ## [0.2.0] - 2026-10-12
4
89
 
5
90
  ### Changed
package/README.md CHANGED
@@ -37,7 +37,7 @@ so its preflight would beat the theme; `tailwind.css` imports the theme into Tai
37
37
  | `styles/index.css` (package root) | everything below plus Pretendard — for apps without Tailwind |
38
38
  | `styles/theme.css` | the theme without fonts (bring your own face) |
39
39
  | `styles/tokens.css` | house values for the `--u-*` token axes, light and dark; brand tokens `--hs-brand*` |
40
- | `styles/components.css` | sizes and finish for `u-button`, `u-card`, `u-drawer`, `flex-table`, the app shell |
40
+ | `styles/components.css` | the document flow (body text, `h1`–`h6`, block gaps, code spans, native control and scrollbar colours) and sizes and finish for `u-button`, `u-card`, `u-drawer`, `flex-table`, the app shell |
41
41
  | `styles/patterns.css` | `hs-*` layout patterns — page head, saved views, filter bar, stat strip, table card, callout, form sections, side-sheet footer |
42
42
  | `styles/tailwind.css` | the Tailwind v4 entry: fonts + theme (in Tailwind's `components` layer) + role utilities — `bg-canvas`, `text-ink-weak`, `border-line`, `bg-warning-soft`, `rounded-card` … |
43
43
  | `styles/tailwind-neutrals.css` | optional: Tailwind's grey ramps (`gray`, `slate`, `zinc`, `neutral`, `stone`) follow the house neutrals |
@@ -82,6 +82,17 @@ The type ladder is the `--u-text-*-size` steps plus two house steps derived from
82
82
  `--hs-text-hero-size` (display + 6px: a headline figure). Every pattern reads a step, so rescaling the
83
83
  ladder (a larger mode, a product system) carries the patterns along.
84
84
 
85
+ ### Text outside components
86
+
87
+ The theme also sets the text an application writes between components, so a screen's own words match
88
+ the components around them: the body draws at the body step (14px · 1.571), `h1`/`h2`/`h3` at the
89
+ display/title/subtitle steps and `h4`–`h6` at the body step in semibold, and paragraphs, lists and
90
+ headings get one gap below (none above, none after the last block in a box). Code spans use the house
91
+ monospace. A checked native checkbox or radio takes the selection colour (`--u-selection-color`, the
92
+ interaction blue) and scrollbars the strong line colour. Running text that can grow wider than reads
93
+ well opts into the measure: `<div class="hs-prose">` stops its paragraphs and lists at `--hs-measure`
94
+ (70ch). All of it is zero-specificity in the house layer — any rule of yours wins.
95
+
85
96
  ## The guide
86
97
 
87
98
  **Live**: https://iyulab.github.io/house-style/ — this is the guide. There is no
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyulab/house-style",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "The iyulab house theme: a CSS-only theme for @iyulab components — tokens, component recipes, line-of-business layout patterns and a Tailwind CSS v4 preset — plus the guide site that documents it.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,6 +38,7 @@
38
38
  "check:guide": "node scripts/check-guide.mjs",
39
39
  "check:a11y": "node scripts/check-a11y.mjs",
40
40
  "check:ladder": "node scripts/check-ladder.mjs",
41
+ "check:leave": "node scripts/check-leave.mjs",
41
42
  "check:start-here": "node scripts/check-start-here.mjs",
42
43
  "check:start-here:local": "node scripts/check-start-here.mjs --local",
43
44
  "pretest": "node -e \"if(require('fs').existsSync('../../scripts/sibling-dist-check.js'))require('child_process').execFileSync('node',['../../scripts/sibling-dist-check.js'],{stdio:'inherit'})\"",
@@ -57,7 +58,7 @@
57
58
  "pretendard": "^1.3.9"
58
59
  },
59
60
  "peerDependencies": {
60
- "@iyulab/components": "^2.0.0",
61
+ "@iyulab/components": "^2.24.0",
61
62
  "@iyulab/flex-table": ">=0.41.0",
62
63
  "@iyulab/modern-app": ">=0.39.0"
63
64
  },
@@ -70,13 +71,13 @@
70
71
  }
71
72
  },
72
73
  "devDependencies": {
73
- "@iyulab/components": "^2.20.0",
74
- "@iyulab/data-components": "^0.47.0",
74
+ "@iyulab/components": "^2.24.0",
75
+ "@iyulab/data-components": "^0.49.0",
75
76
  "@iyulab/enterprise": "^0.32.0",
76
- "@iyulab/flex-table": "^0.64.0",
77
- "@iyulab/modern-app": "^0.52.0",
78
- "@iyulab/router": "^0.23.0",
79
- "@iyulab/u-widgets": "^0.30.1",
77
+ "@iyulab/flex-table": "^0.67.0",
78
+ "@iyulab/modern-app": "^0.54.0",
79
+ "@iyulab/router": "^0.24.0",
80
+ "@iyulab/u-widgets": "^0.31.0",
80
81
  "@lit/react": "^1.0.8",
81
82
  "@types/node": "^26.1.1",
82
83
  "@types/react": "^19.3.0",
@@ -21,6 +21,70 @@
21
21
  color: var(--u-txt-color);
22
22
  -webkit-font-smoothing: antialiased;
23
23
  }
24
+ /* ── Document flow — the text an application writes between components ─────────────────── *
25
+ * Paragraphs, headings, lists and code spans outside any component would draw at the browser's
26
+ * defaults — 16px body with `line-height: normal`, an h2 of 1.5em that outranks every component
27
+ * title, 1em gaps — so a screen's own words looked unlike the components around them. Here they
28
+ * take the house ladder. Zero specificity inside the house layer: any application rule wins. */
29
+ :where(body) {
30
+ font-size: var(--u-text-body-size);
31
+ line-height: var(--u-text-body-leading);
32
+ }
33
+ :where(h1) {
34
+ font-size: var(--u-text-display-size);
35
+ font-weight: var(--u-text-display-weight);
36
+ line-height: var(--u-text-display-leading);
37
+ }
38
+ :where(h2) {
39
+ font-size: var(--u-text-title-size);
40
+ font-weight: var(--u-text-title-weight);
41
+ line-height: var(--u-text-title-leading);
42
+ }
43
+ :where(h3) {
44
+ font-size: var(--u-text-subtitle-size);
45
+ font-weight: var(--u-text-subtitle-weight);
46
+ line-height: var(--u-text-subtitle-leading);
47
+ }
48
+ :where(h4, h5, h6) {
49
+ font-size: var(--u-text-body-size);
50
+ font-weight: 600;
51
+ line-height: var(--u-text-body-leading);
52
+ }
53
+ /* One gap below each block, none above — the gap between two blocks is one step, not two
54
+ * collapsed margins; the last block in its box adds none. */
55
+ :where(h1, h2, h3, h4, h5, h6) {
56
+ margin-block: 0 var(--u-space-sm);
57
+ }
58
+ :where(p, ul, ol, dl, blockquote, figure, pre) {
59
+ margin-block: 0 var(--u-space-md);
60
+ }
61
+ :where(h1, h2, h3, h4, h5, h6, p, ul, ol, dl, blockquote, figure, pre):where(:last-child) {
62
+ margin-block-end: 0;
63
+ }
64
+ :where(code, kbd, samp, pre) {
65
+ font-family: var(--u-font-mono);
66
+ }
67
+ /* A key the reader presses — a small outlined cap, quieter than the text around it. */
68
+ :where(kbd) {
69
+ padding: 0 4px;
70
+ border: 1px solid var(--u-border-color);
71
+ border-radius: var(--u-radius-md, 4px);
72
+ background: var(--u-canvas-bg-color);
73
+ font-size: var(--u-text-overline-size, 11px);
74
+ font-weight: 500;
75
+ line-height: 16px;
76
+ color: var(--u-txt-color-weak);
77
+ }
78
+ /* A measure for running text — opt in where a paragraph can be wider than reads well. */
79
+ :where(.hs-prose) :where(p, ul, ol, dl, blockquote) {
80
+ max-inline-size: var(--hs-measure);
81
+ }
82
+ /* Native controls (a checkbox in a plain form, a range) and scrollbars take the house colours. */
83
+ :root {
84
+ accent-color: var(--u-selection-color);
85
+ scrollbar-color: var(--u-border-color-strong) transparent;
86
+ }
87
+
24
88
  /* A plain link takes the house link colour instead of the browser's — in light and dark alike.
25
89
  * Zero specificity: a class on the link (`hs-*`, an app's own) and any application rule win.
26
90
  * Visited links keep the same colour (an application, not a document); the underline stays,
@@ -9,9 +9,9 @@
9
9
  * Prefix `hs-`. Everything sits in `@layer iyu.house`; an application rule always wins.
10
10
  *
11
11
  * Screen recipes (the guide shows each one):
12
- * list = .hs-page-head → .hs-filter-bar → .hs-stats → .hs-table-card (toolbar · table · pager)
13
- * detail = side sheet: head (id · status · one primary action) → steps → .hs-stats → tabs → cards
14
- * edit = side sheet with .hs-fieldset sections and a pinned .hs-sheet-footer
12
+ * list = u-page-header → .hs-filter-bar → u-info-section layout="strip" → .hs-table-card (toolbar · table · pager)
13
+ * detail = side sheet: head (id · status · one primary action) → steps → stat strip → tabs → cards
14
+ * edit = side sheet with .hs-fieldset sections and a pinned u-action-bar (summary slot)
15
15
  *
16
16
  * Rules the patterns encode:
17
17
  * · one ink (primary) button per view — the rest are outlined, plain or in a menu
@@ -35,7 +35,10 @@
35
35
 
36
36
  /* Page head — eyebrow · title · one-line description on the left; on the right a scope
37
37
  picker (data-wide filters such as a season or period), up to two secondary actions and
38
- the single primary action, in that order. */
38
+ the single primary action, in that order.
39
+ @deprecated Use `u-page-header` (`@iyulab/modern-app`) — `eyebrow` · `title` · `subtitle`, and the
40
+ scope picker and actions in its `actions` slot. The house already draws it this way
41
+ (`components.css`), and it carries the page's h1 and a back link. remove: 0.5.0 */
39
42
  .hs-page-head {
40
43
  display: flex;
41
44
  align-items: flex-end;
@@ -74,7 +77,10 @@
74
77
  .hs-views {
75
78
  display: flex;
76
79
  gap: var(--u-space-2xs, 4px);
77
- border-bottom: 1px solid var(--u-border-color);
80
+ /* The base line is an inset shadow, not a border: a tab's 2px underline paints over it without the tab
81
+ reaching past the box — with a border and a -1px tab margin the scroll container overflowed by 1px and
82
+ drew a vertical scrollbar beside the tabs. */
83
+ box-shadow: inset 0 -1px 0 var(--u-border-color);
78
84
  overflow-x: auto;
79
85
  }
80
86
  .hs-views__tab {
@@ -82,7 +88,6 @@
82
88
  align-items: center;
83
89
  gap: 6px;
84
90
  padding: var(--u-space-sm, 8px) var(--u-space-md, 12px);
85
- margin-bottom: -1px;
86
91
  border: 0;
87
92
  border-bottom: 2px solid transparent;
88
93
  background: none;
@@ -150,7 +155,10 @@
150
155
  /* Side by side, or stacked when the strip is narrower than 640px — all or nothing, never a ragged row.
151
156
  * No size container: the threshold is each stat's flex-basis, calc((640px - 100%) * 999) — negative
152
157
  * (so 0) when wide, huge when narrow (the "Holy Albatross"). The dividers are the 1px gap showing the
153
- * strip's border-coloured background, so they turn from vertical to horizontal on their own. */
158
+ * strip's border-coloured background, so they turn from vertical to horizontal on their own.
159
+ * @deprecated Use `u-info-section layout="strip"` with `u-info-field size="lg"` (`@iyulab/modern-app` 0.54) — the
160
+ * same strip as a component: `label` · `value` · `unit` · `description` (the supporting line) and `tone` for the
161
+ * warning, danger and success values. `.hs-stat--hero` has no counterpart and goes with it. remove: 0.5.0 */
154
162
  .hs-stats {
155
163
  display: flex;
156
164
  flex-wrap: wrap;
@@ -233,6 +241,12 @@
233
241
  font-size: var(--hs-text-dense-size, 13px);
234
242
  font-weight: 600;
235
243
  }
244
+ .hs-table-toolbar__actions {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: var(--u-space-sm, 8px);
248
+ flex-wrap: wrap;
249
+ }
236
250
  .hs-pager {
237
251
  display: flex;
238
252
  align-items: center;
@@ -279,7 +293,9 @@
279
293
  }
280
294
  /* One line separates the totals from the body — not one per totals row (subtotal · tax · total). */
281
295
  .hs-table tfoot tr:first-child td { border-top: 1px solid var(--u-border-color); }
282
- .hs-table--compact td { height: var(--hs-row-compact, 32px); }
296
+ /* Totals rows follow the compact height too (`tfoot td` would otherwise win on specificity). */
297
+ .hs-table--compact td,
298
+ .hs-table--compact tfoot td { height: var(--hs-row-compact, 32px); }
283
299
  .hs-table--top td { vertical-align: top; padding-block: var(--u-space-sm, 8px); height: auto; }
284
300
  /* Cells (`th` too — header text aligns with its values) */
285
301
  .hs-num,
@@ -512,7 +528,10 @@ a.hs-card:hover,
512
528
  }
513
529
  .hs-span-all { grid-column: 1 / -1; }
514
530
 
515
- /* ── Side sheet footer — change summary on the left, Cancel / Save on the right ── */
531
+ /* ── Side sheet footer — change summary on the left, Cancel / Save on the right ──
532
+ * @deprecated Use `<u-action-bar sticky>` (`@iyulab/modern-app` 0.54): the summary in `slot="summary"`, Cancel and
533
+ * Save as its children, the sheet's inset as `--action-bar-padding-inline`. It also keeps a destructive action
534
+ * apart at the leading edge and puts the main actions on top when narrow. remove: 0.5.0 */
516
535
  .hs-sheet-footer {
517
536
  display: flex;
518
537
  align-items: center;
@@ -563,7 +582,9 @@ a.hs-card:hover,
563
582
  }
564
583
  .hs-due--soon { background: var(--u-warning-bg-color); color: var(--u-warning-color-strong); }
565
584
  .hs-due--over { background: var(--u-danger-bg-color); color: var(--u-danger-color-strong); }
566
- /* A keyboard hint. */
585
+ /* A keyboard hint.
586
+ @deprecated Use a plain `<kbd>` — the house draws it the same way (`components.css`), in the
587
+ monospace face. remove: 0.5.0 */
567
588
  .hs-kbd {
568
589
  padding: 0 4px;
569
590
  border: 1px solid var(--u-border-color);
package/styles/tokens.css CHANGED
@@ -47,7 +47,7 @@
47
47
  --u-panel-bg-color: #FFFFFF;
48
48
  --u-input-bg-color: #FFFFFF;
49
49
  --u-bg-color-raised: #F1F1EF; /* table header, toolbar strip, read-only field */
50
- --u-bg-color-raised-hover: #EAEAE7;
50
+ --u-bg-color-raised-hover: #E5E5E2;
51
51
  --u-bg-color-hover: #F1F1EF;
52
52
  --u-bg-color-active: #EAEAE7;
53
53
  --u-bg-color-disabled: #F1F1EF;
@@ -83,9 +83,25 @@
83
83
  --u-primary-txt-color: #FFFFFF;
84
84
  --u-primary-bg-color: #EEF3FD; /* selected rows, current item */
85
85
 
86
- /* Interaction — blue, for links and focus only */
86
+ /* Interaction — blue, for links, focus and the mark of a chosen option (a checked box or radio) */
87
87
  --u-link-txt-color: #1F5FCC;
88
88
  --u-focus-ring-color: #2F6FEB;
89
+ --u-selection-color: #2F6FEB;
90
+ --u-selection-txt-color: #FFFFFF; /* the check drawn on that fill */
91
+
92
+ /* Chart series — eight, in order (slot one first, never cycled). Slot one is the interaction blue, so a
93
+ one-series chart draws in the colour the rest of the screen uses for "this is the thing"; the other seven
94
+ are muted, warm-leaning hues chosen as a set: OKLCH L 0.50–0.68, chroma ≥ 0.10, neighbours ΔE ≥ 15 for
95
+ full colour vision and ≥ 8 under red–green deficiency (Machado 2009), every slot at least ΔE 10 from a
96
+ status colour. Slot six (light olive) is 2.8:1 on white — six or more series need a legend or labels. */
97
+ --u-chart-color-1: #2F6FEB;
98
+ --u-chart-color-2: #B55F40;
99
+ --u-chart-color-3: #14938D;
100
+ --u-chart-color-4: #AF8020;
101
+ --u-chart-color-5: #7D4B92;
102
+ --u-chart-color-6: #86A645;
103
+ --u-chart-color-7: #C46E83;
104
+ --u-chart-color-8: #834B14;
89
105
 
90
106
  /* Status — `-color-strong` is the text step (on surface and on its own tint), `-bg-color`
91
107
  the tint, `-color` the solid fill (with `-txt-color` on top). */
@@ -204,6 +220,20 @@
204
220
 
205
221
  --u-link-txt-color: #8DB3F7;
206
222
  --u-focus-ring-color: #6E9CF7;
223
+ --u-selection-color: #6E9CF7;
224
+ --u-selection-txt-color: #0E0F10;
225
+
226
+ /* Chart series, dark — the same hues stepped into the dark band (L 0.52–0.66), every slot ≥ 3:1 on the
227
+ surface and the raised surface. Slot one is the dark interaction blue taken to the band's top (#6E9CF7
228
+ itself is lighter than a filled mark should be on this surface). */
229
+ --u-chart-color-1: #628FEA;
230
+ --u-chart-color-2: #C97152;
231
+ --u-chart-color-3: #04A19B;
232
+ --u-chart-color-4: #B8892D;
233
+ --u-chart-color-5: #9760AF;
234
+ --u-chart-color-6: #57833D;
235
+ --u-chart-color-7: #CF7188;
236
+ --u-chart-color-8: #9A5F1A;
207
237
 
208
238
  --u-info-color-weakest: #1F3152;
209
239
  --u-info-color-weaker: #2C4A7E;
@@ -311,6 +341,9 @@
311
341
  --hs-text-dense-size: calc((var(--u-text-body-size) + var(--u-text-label-size)) / 2);
312
342
  --hs-text-hero-size: calc(var(--u-text-display-size) + 6px);
313
343
 
344
+ /* Prose measure — a running paragraph stops around 70 characters a line (`.hs-prose`). */
345
+ --hs-measure: 70ch;
346
+
314
347
  /* Field box (`@iyulab/components`) — 32px fields beside 32px buttons; 40px inside form sections. In em, so the box
315
348
  follows the control density with the buttons (resolved at the field: 4.5px / 12px at the default 14px). */
316
349
  --u-field-padding-block: calc(4.5em / 14);