@atelier-ui/react 0.2.18 → 0.2.20

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,3 +1,27 @@
1
+ ## 0.2.20 (2026-08-26)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **rhythm:** every component root states its own leading ([7a7f473](https://github.com/DominikPieper/atelier-ui/commit/7a7f473))
6
+ - **rows:** put the remaining row boxes on the row ladder ([cc6dd13](https://github.com/DominikPieper/atelier-ui/commit/cc6dd13))
7
+
8
+ ### ❤️ Thank You
9
+
10
+ - Claude Opus 5
11
+ - Dominik Pieper @DominikPieper
12
+
13
+ ## 0.2.19 (2026-08-26)
14
+
15
+ ### 🚀 Features
16
+
17
+ - **rows:** prove the row recipe on two boxes, and what that exposed ([14284f9](https://github.com/DominikPieper/atelier-ui/commit/14284f9))
18
+ - **tokens:** the row ladder — --ui-row-inset and --ui-row-height-sm/md/lg ([b2f390a](https://github.com/DominikPieper/atelier-ui/commit/b2f390a))
19
+
20
+ ### ❤️ Thank You
21
+
22
+ - Claude Opus 5
23
+ - Dominik Pieper @DominikPieper
24
+
1
25
  ## 0.2.18 (2026-08-26)
2
26
 
3
27
  ### 🩹 Fixes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atelier-ui/react",
3
- "version": "0.2.18",
3
+ "version": "0.2.20",
4
4
  "description": "Atelier component library for React — LLM-optimised, accessible, design-token-driven",
5
5
  "keywords": [
6
6
  "react",
@@ -18,6 +18,11 @@
18
18
  .atl-accordion-group {
19
19
  display: block;
20
20
  font-family: var(--ui-font-family);
21
+ /* The leading every descendant inherits. Stated here so the component keeps
22
+ its own vertical rhythm instead of adopting the consuming app's prose
23
+ leading — the defect that made the row boxes measure differently in a
24
+ Storybook page and in a docs page (ADR-0052). This one carries prose, so normal. */
25
+ line-height: var(--ui-line-height-normal);
21
26
  color: var(--ui-color-text);
22
27
  }
23
28
 
@@ -78,8 +83,14 @@
78
83
  justify-content: space-between;
79
84
  gap: var(--ui-spacing-3);
80
85
  width: 100%;
81
- min-height: 3.25rem;
82
- padding: var(--ui-spacing-4) var(--ui-spacing-5);
86
+ /* Row recipe (ADR-0052): 3.25rem was a literal that happened to clear the
87
+ prose leading. On the row ladder the trigger is a lg row, and it states
88
+ its own line-height because `all: unset` above reset that to inherit —
89
+ without it the box grows with whatever leading the page sets. */
90
+ min-height: var(--ui-row-height-lg);
91
+ padding-block: 0;
92
+ padding-inline: var(--ui-spacing-5);
93
+ line-height: var(--ui-line-height-tight);
83
94
  font-size: var(--ui-font-size-md);
84
95
  font-weight: var(--ui-font-weight-semibold);
85
96
  color: var(--ui-color-text);
@@ -24,6 +24,11 @@
24
24
  overflow: hidden;
25
25
  flex-shrink: 0;
26
26
  font-family: var(--ui-font-family);
27
+ /* The leading every descendant inherits. Stated here so the component keeps
28
+ its own vertical rhythm instead of adopting the consuming app's prose
29
+ leading — the defect that made the row boxes measure differently in a
30
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
31
+ line-height: var(--ui-line-height-tight);
27
32
  font-weight: var(--ui-font-weight-semibold);
28
33
  background-color: color-mix(in srgb, var(--ui-color-primary) 12%, var(--ui-color-surface-sunken));
29
34
  color: var(--ui-color-primary);
@@ -18,6 +18,11 @@
18
18
  .atl-breadcrumbs {
19
19
  display: block;
20
20
  font-family: var(--ui-font-family);
21
+ /* The leading every descendant inherits. Stated here so the component keeps
22
+ its own vertical rhythm instead of adopting the consuming app's prose
23
+ leading — the defect that made the row boxes measure differently in a
24
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
25
+ line-height: var(--ui-line-height-tight);
21
26
  }
22
27
 
23
28
  .breadcrumbs-list {
@@ -24,6 +24,11 @@
24
24
  * Sans — measured: a card next to a button showed two typefaces. Declared once
25
25
  * per component root, never on a descendant (ADR-0049). */
26
26
  font-family: var(--ui-font-family);
27
+ /* The leading every descendant inherits. Stated here so the component keeps
28
+ its own vertical rhythm instead of adopting the consuming app's prose
29
+ leading — the defect that made the row boxes measure differently in a
30
+ Storybook page and in a docs page (ADR-0052). This one carries prose, so normal. */
31
+ line-height: var(--ui-line-height-normal);
27
32
  display: block;
28
33
  border-radius: var(--ui-radius-xl);
29
34
  background-color: var(--ui-color-surface-raised);
@@ -31,6 +31,11 @@
31
31
  * Sans — measured: a card next to a button showed two typefaces. Declared once
32
32
  * per component root, never on a descendant (ADR-0049). */
33
33
  font-family: var(--ui-font-family);
34
+ /* The leading every descendant inherits. Stated here so the component keeps
35
+ its own vertical rhythm instead of adopting the consuming app's prose
36
+ leading — the defect that made the row boxes measure differently in a
37
+ Storybook page and in a docs page (ADR-0052). This one carries prose, so normal. */
38
+ line-height: var(--ui-line-height-normal);
34
39
  display: contents;
35
40
  }
36
41
 
@@ -12,6 +12,10 @@
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
14
  font-size: var(--ui-font-size-md);
15
+ /* The root is a block wrapping an inline-flex row, so it opens a line box and
16
+ its strut is sized by whatever leading it inherits. Without this the row is
17
+ 40px here and 48px inside an app with roomy prose leading. */
18
+ line-height: var(--ui-line-height-tight);
15
19
  }
16
20
 
17
21
  .atl-checkbox label {
@@ -21,14 +25,21 @@
21
25
  cursor: pointer;
22
26
  user-select: none;
23
27
  color: var(--ui-color-text);
24
- line-height: var(--ui-line-height-normal);
25
- min-height: 1.5rem;
28
+ /* Row recipe (ADR-0052): the clickable line is a row — it states its height
29
+ and centres the control + text, rather than being sized by whichever of
30
+ the two happens to be taller. */
31
+ min-height: var(--ui-row-height-sm);
32
+ padding-block: 0;
33
+ line-height: var(--ui-line-height-tight);
26
34
  }
27
35
 
28
36
  .atl-checkbox input[type='checkbox'] {
29
37
  appearance: none;
30
38
  -webkit-appearance: none;
31
39
  flex-shrink: 0;
40
+ /* The UA ships margin: 3px 3px 3px 4px on a native checkbox. Left in, it
41
+ adds 6px to the row and offsets the box from the label text. */
42
+ margin: 0;
32
43
  width: 1.25rem;
33
44
  height: 1.25rem;
34
45
  border: var(--ui-border-width-thick) solid var(--ui-color-border-strong);
@@ -18,6 +18,10 @@
18
18
  border-radius: var(--ui-radius-lg);
19
19
  overflow: hidden;
20
20
  font-family: var(--ui-font-family);
21
+ /* The leading every descendant inherits, stated so the component keeps its
22
+ own rhythm rather than the consuming app's prose leading (ADR-0052).
23
+ Chrome around the code, so tight — the code element states the code leading itself. */
24
+ line-height: var(--ui-line-height-tight);
21
25
  }
22
26
 
23
27
  /* ---------------------------------------------------------------------------
@@ -99,7 +103,7 @@
99
103
  padding: var(--ui-spacing-4);
100
104
  font-family: var(--ui-font-mono);
101
105
  font-size: var(--ui-font-size-sm);
102
- line-height: 1.65;
106
+ line-height: var(--ui-line-height-code);
103
107
  color: var(--ui-color-text);
104
108
  white-space: pre;
105
109
  tab-size: 2;
@@ -38,6 +38,10 @@
38
38
  display: block;
39
39
  position: relative;
40
40
  font-family: var(--ui-font-family);
41
+ /* The leading every descendant inherits, stated so the component keeps its
42
+ own rhythm rather than the consuming app's prose leading (ADR-0052).
43
+ A single-line field over a list of rows, so tight. */
44
+ line-height: var(--ui-line-height-tight);
41
45
  font-size: var(--ui-font-size-md);
42
46
  }
43
47
 
@@ -156,8 +160,15 @@
156
160
  display: flex;
157
161
  align-items: center;
158
162
  justify-content: space-between;
159
- min-height: 2.25rem;
160
- padding: var(--ui-spacing-2) var(--ui-spacing-4);
163
+ /* Row recipe (ADR-0052): the height is stated, the block padding is zero and the
164
+ * content is centred. A row centres, a control pads — ADR-0041's derived-padding
165
+ * formula produces the wrong box here. The line-height is stated so the box does
166
+ * not follow the installed font (ADR-0048).
167
+ */
168
+ min-height: var(--ui-row-height-sm);
169
+ padding-block: 0;
170
+ line-height: var(--ui-line-height-tight);
171
+ padding-inline: var(--ui-spacing-4);
161
172
  cursor: pointer;
162
173
  color: var(--ui-color-text);
163
174
  font-size: var(--ui-font-size-md);
@@ -29,6 +29,11 @@
29
29
  * typeface (ADR-0035); without this the dialog renders in the consuming app's
30
30
  * font while its neighbours render Instrument Sans (ADR-0049). */
31
31
  font-family: var(--ui-font-family);
32
+ /* The leading every descendant inherits. Stated here so the component keeps
33
+ its own vertical rhythm instead of adopting the consuming app's prose
34
+ leading — the defect that made the row boxes measure differently in a
35
+ Storybook page and in a docs page (ADR-0052). This one carries prose, so normal. */
36
+ line-height: var(--ui-line-height-normal);
32
37
  position: fixed;
33
38
  inset: 0;
34
39
  margin: auto;
@@ -25,6 +25,11 @@
25
25
  * Sans — measured: a card next to a button showed two typefaces. Declared once
26
26
  * per component root, never on a descendant (ADR-0049). */
27
27
  font-family: var(--ui-font-family);
28
+ /* The leading every descendant inherits. Stated here so the component keeps
29
+ its own vertical rhythm instead of adopting the consuming app's prose
30
+ leading — the defect that made the row boxes measure differently in a
31
+ Storybook page and in a docs page (ADR-0052). This one carries prose, so normal. */
32
+ line-height: var(--ui-line-height-normal);
28
33
  display: contents;
29
34
  }
30
35
 
@@ -11,6 +11,10 @@
11
11
  .atl-input {
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits, stated so the component keeps its
15
+ own rhythm rather than the consuming app's prose leading (ADR-0052).
16
+ A single-line field, so tight. */
17
+ line-height: var(--ui-line-height-tight);
14
18
  font-size: var(--ui-font-size-md);
15
19
  }
16
20
 
@@ -28,6 +28,11 @@
28
28
  border-radius: var(--ui-radius-lg);
29
29
  box-shadow: var(--ui-shadow-lg);
30
30
  font-family: var(--ui-font-family);
31
+ /* The leading every descendant inherits. Stated here so the component keeps
32
+ its own vertical rhythm instead of adopting the consuming app's prose
33
+ leading — the defect that made the row boxes measure differently in a
34
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
35
+ line-height: var(--ui-line-height-tight);
31
36
  font-size: var(--ui-font-size-md);
32
37
  color: var(--ui-color-text);
33
38
  outline: none;
@@ -68,8 +73,14 @@
68
73
  display: flex;
69
74
  align-items: center;
70
75
  gap: var(--ui-spacing-3);
71
- min-height: 2.25rem;
72
- padding: var(--ui-spacing-2) var(--ui-spacing-4);
76
+ /* Row recipe (ADR-0052): the height is stated, the block padding is zero and the
77
+ * content is centred. A row centres, a control pads — ADR-0041's derived-padding
78
+ * formula produces the wrong box here. The line-height is stated so the box does
79
+ * not follow the installed font (ADR-0048).
80
+ */
81
+ min-height: var(--ui-row-height-sm);
82
+ padding-block: 0;
83
+ padding-inline: var(--ui-spacing-4);
73
84
  cursor: pointer;
74
85
  color: var(--ui-color-text);
75
86
  transition: background var(--ui-transition-fast);
@@ -77,6 +88,10 @@
77
88
  border: none;
78
89
  background: none;
79
90
  font: inherit;
91
+ /* After `font: inherit`, which is a shorthand and resets line-height along with
92
+ * everything else. Declared above it, the row's stated line-height was silently
93
+ * erased and the box grew with the text metrics again (ADR-0052). */
94
+ line-height: var(--ui-line-height-tight);
80
95
  width: 100%;
81
96
  text-align: start;
82
97
  }
@@ -11,6 +11,11 @@
11
11
  .atl-pagination {
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits. Stated here so the component keeps
15
+ its own vertical rhythm instead of adopting the consuming app's prose
16
+ leading — the defect that made the row boxes measure differently in a
17
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
18
+ line-height: var(--ui-line-height-tight);
14
19
  }
15
20
 
16
21
  .page-list {
@@ -12,6 +12,11 @@
12
12
  display: block;
13
13
  width: 100%;
14
14
  font-family: var(--ui-font-family);
15
+ /* The leading every descendant inherits. Stated here so the component keeps
16
+ its own vertical rhythm instead of adopting the consuming app's prose
17
+ leading — the defect that made the row boxes measure differently in a
18
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
19
+ line-height: var(--ui-line-height-tight);
15
20
  }
16
21
 
17
22
  .track {
@@ -15,11 +15,14 @@
15
15
  cursor: pointer;
16
16
  user-select: none;
17
17
  color: var(--ui-color-text);
18
- line-height: var(--ui-line-height-normal);
18
+ line-height: var(--ui-line-height-tight);
19
19
  font-family: var(--ui-font-family);
20
20
  font-size: var(--ui-font-size-md);
21
- padding: var(--ui-spacing-1) 0;
22
- min-height: 1.5rem;
21
+ /* Row recipe (ADR-0052): the clickable line is a row — it states its height
22
+ and centres the control + text, rather than being sized by whichever of
23
+ the two happens to be taller. */
24
+ padding-block: 0;
25
+ min-height: var(--ui-row-height-sm);
23
26
  transition: color var(--ui-transition-fast);
24
27
  }
25
28
 
@@ -11,6 +11,11 @@
11
11
  .atl-radio-group {
12
12
  display: flex;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits. Stated here so the component keeps
15
+ its own vertical rhythm instead of adopting the consuming app's prose
16
+ leading — the defect that made the row boxes measure differently in a
17
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
18
+ line-height: var(--ui-line-height-tight);
14
19
  gap: var(--ui-spacing-3);
15
20
  }
16
21
 
@@ -12,6 +12,10 @@
12
12
  display: inline-block;
13
13
  position: relative;
14
14
  font-family: var(--ui-font-family);
15
+ /* The leading every descendant inherits, stated so the component keeps its
16
+ own rhythm rather than the consuming app's prose leading (ADR-0052).
17
+ A single-line field, so tight. */
18
+ line-height: var(--ui-line-height-tight);
15
19
  font-size: var(--ui-font-size-md);
16
20
  }
17
21
 
@@ -14,6 +14,11 @@
14
14
  * Sans — measured: a card next to a button showed two typefaces. Declared once
15
15
  * per component root, never on a descendant (ADR-0049). */
16
16
  font-family: var(--ui-font-family);
17
+ /* The leading every descendant inherits. Stated here so the component keeps
18
+ its own vertical rhythm instead of adopting the consuming app's prose
19
+ leading — the defect that made the row boxes measure differently in a
20
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
21
+ line-height: var(--ui-line-height-tight);
17
22
  display: block;
18
23
  background: var(--ui-color-border);
19
24
  overflow: hidden;
@@ -11,6 +11,11 @@
11
11
  .atl-stepper {
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits. Stated here so the component keeps
15
+ its own vertical rhythm instead of adopting the consuming app's prose
16
+ leading — the defect that made the row boxes measure differently in a
17
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
18
+ line-height: var(--ui-line-height-tight);
14
19
  }
15
20
 
16
21
  /* ─── Header ─── */
@@ -36,6 +36,11 @@
36
36
  .atl-table {
37
37
  display: block;
38
38
  font-family: var(--ui-font-family);
39
+ /* The leading every descendant inherits. Stated here so the component keeps
40
+ its own vertical rhythm instead of adopting the consuming app's prose
41
+ leading — the defect that made the row boxes measure differently in a
42
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
43
+ line-height: var(--ui-line-height-tight);
39
44
  color: var(--ui-color-text);
40
45
  }
41
46
 
@@ -60,7 +65,13 @@
60
65
  text-transform: uppercase;
61
66
  border-bottom: var(--ui-border-width-thick) solid var(--ui-color-border);
62
67
  background-color: var(--ui-color-surface);
63
- padding: var(--ui-spacing-3) var(--ui-spacing-4);
68
+ /* Row recipe (ADR-0052): a row centres its content on a stated height, it
69
+ does not let the content push the box. padding-block stays 0 so the size
70
+ variants below only vary the inline inset. */
71
+ height: var(--ui-row-height-md);
72
+ padding-block: 0;
73
+ padding-inline: var(--ui-spacing-4);
74
+ line-height: var(--ui-line-height-tight);
64
75
  text-align: start;
65
76
  white-space: nowrap;
66
77
  }
@@ -70,7 +81,10 @@
70
81
  --------------------------------------------------------------------------- */
71
82
  .atl-table tbody td {
72
83
  border-bottom: var(--ui-border-width) solid var(--ui-color-border);
73
- padding: var(--ui-spacing-3) var(--ui-spacing-4);
84
+ height: var(--ui-row-height-md);
85
+ padding-block: 0;
86
+ padding-inline: var(--ui-spacing-4);
87
+ line-height: var(--ui-line-height-tight);
74
88
  vertical-align: middle;
75
89
  background-color: var(--ui-color-surface);
76
90
  transition: background-color var(--ui-transition-fast);
@@ -81,19 +95,22 @@
81
95
  --------------------------------------------------------------------------- */
82
96
  .atl-table.size-sm thead th,
83
97
  .atl-table.size-sm tbody td {
84
- padding: var(--ui-spacing-2) var(--ui-spacing-3);
98
+ height: var(--ui-row-height-sm);
99
+ padding-inline: var(--ui-spacing-3);
85
100
  font-size: var(--ui-font-size-xs);
86
101
  }
87
102
 
88
103
  .atl-table.size-md thead th,
89
104
  .atl-table.size-md tbody td {
90
- padding: var(--ui-spacing-3) var(--ui-spacing-4);
105
+ height: var(--ui-row-height-md);
106
+ padding-inline: var(--ui-spacing-4);
91
107
  font-size: var(--ui-font-size-sm);
92
108
  }
93
109
 
94
110
  .atl-table.size-lg thead th,
95
111
  .atl-table.size-lg tbody td {
96
- padding: var(--ui-spacing-4) var(--ui-spacing-6);
112
+ height: var(--ui-row-height-lg);
113
+ padding-inline: var(--ui-spacing-6);
97
114
  font-size: var(--ui-font-size-md);
98
115
  }
99
116
 
@@ -11,6 +11,11 @@
11
11
  .atl-tab-group {
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits. Stated here so the component keeps
15
+ its own vertical rhythm instead of adopting the consuming app's prose
16
+ leading — the defect that made the row boxes measure differently in a
17
+ Storybook page and in a docs page (ADR-0052). Single-line chrome, so tight. */
18
+ line-height: var(--ui-line-height-tight);
14
19
  color: var(--ui-color-text);
15
20
  }
16
21
 
@@ -11,6 +11,10 @@
11
11
  .atl-textarea {
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
+ /* The leading every descendant inherits, stated so the component keeps its
15
+ own rhythm rather than the consuming app's prose leading (ADR-0052).
16
+ The field carries prose, so normal. */
17
+ line-height: var(--ui-line-height-normal);
14
18
  font-size: var(--ui-font-size-md);
15
19
  }
16
20
 
@@ -12,6 +12,10 @@
12
12
  display: block;
13
13
  font-family: var(--ui-font-family);
14
14
  font-size: var(--ui-font-size-md);
15
+ /* The root is a block wrapping an inline-flex row, so it opens a line box and
16
+ its strut is sized by whatever leading it inherits. Without this the row is
17
+ 40px here and 48px inside an app with roomy prose leading. */
18
+ line-height: var(--ui-line-height-tight);
15
19
  }
16
20
 
17
21
  .atl-toggle label {
@@ -21,8 +25,12 @@
21
25
  cursor: pointer;
22
26
  user-select: none;
23
27
  color: var(--ui-color-text);
24
- line-height: var(--ui-line-height-normal);
25
- min-height: 1.5rem;
28
+ /* Row recipe (ADR-0052): the clickable line is a row — it states its height
29
+ and centres the control + text, rather than being sized by whichever of
30
+ the two happens to be taller. */
31
+ min-height: var(--ui-row-height-sm);
32
+ padding-block: 0;
33
+ line-height: var(--ui-line-height-tight);
26
34
  }
27
35
 
28
36
  /* Hide native checkbox visually but keep it accessible */
package/styles/tokens.css CHANGED
@@ -47,6 +47,32 @@
47
47
  * button the same height. Stating the padding and hoping, which is what the
48
48
  * library did until 2026-08-26, made them 6px apart.
49
49
  */
50
+ /* ── Row heights ────────────────────────────────────────────────────────────
51
+ * A row is taller than the control it holds. That relation lives here, in a
52
+ * calc over the control scale, rather than as a convention thirty stylesheets
53
+ * have to honour: `--ui-row-inset: 0` collapses the two ladders into one in a
54
+ * single edit.
55
+ *
56
+ * Measured, which is why the inset exists: a table cell at the *control* height
57
+ * of 40 renders 41.0px when it holds a 40px control (the extra pixel is the two
58
+ * collapsed cell borders), while the same cell at 48 renders exactly 48.00px
59
+ * holding text, a badge, an sm button, an md button or an md avatar. So at the
60
+ * row height any control of the matching step fits, with no convention.
61
+ *
62
+ * A row CENTRES its content; a control PADS it. ADR-0041's derived-padding
63
+ * formula therefore does not apply here — a size-md cell with derived padding
64
+ * renders 62.5px holding an md button. The row recipe is
65
+ * `min-height: var(--ui-row-height-*); padding-block: 0; line-height: tight`.
66
+ *
67
+ * Not rows, on purpose: breadcrumbs (17px of inline text, holding no control)
68
+ * and the card/dialog/drawer/chat headers (one-off bands with their own
69
+ * padding, not one line among many). See ADR-0052.
70
+ */
71
+ --ui-row-inset: 0.25rem;
72
+ --ui-row-height-sm: calc(var(--ui-control-height-sm) + 2 * var(--ui-row-inset));
73
+ --ui-row-height-md: calc(var(--ui-control-height-md) + 2 * var(--ui-row-inset));
74
+ --ui-row-height-lg: calc(var(--ui-control-height-lg) + 2 * var(--ui-row-inset));
75
+
50
76
  --ui-control-height-sm: 2rem;
51
77
  --ui-control-height-md: 2.5rem;
52
78
  --ui-control-height-lg: 3rem;
@@ -56,6 +82,9 @@
56
82
  --ui-font-weight-bold: 700;
57
83
  --ui-line-height-tight: 1.25;
58
84
  --ui-line-height-normal: 1.5;
85
+ /* Code needs looser leading than prose: a reader scans columns, not sentences.
86
+ * AtlCodeBlock had 1.65 as a literal in one stylesheet. */
87
+ --ui-line-height-code: 1.65;
59
88
 
60
89
  /* ── Type roles ─────────────────────────────────────────────
61
90
  * Composed entirely from the axes above, so sizes and weights stay