actual-css 0.4.2 → 0.6.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.
Files changed (117) hide show
  1. package/CHANGELOG.md +66 -3
  2. package/README.md +2 -2
  3. package/dist/actual.css +54 -14
  4. package/dist/actual.full.css +744 -185
  5. package/dist/actual.full.js +1 -1
  6. package/dist/actual.full.min.css +1 -1
  7. package/dist/actual.min.css +1 -1
  8. package/docs/design-notes/browser-support.md +14 -14
  9. package/docs/design-notes/enhancement-contract.md +30 -13
  10. package/docs/design-notes/forced-colors.md +11 -7
  11. package/docs/design-notes/grid.md +4 -4
  12. package/docs/design-notes/naming.md +15 -9
  13. package/docs/design-notes/platform-alignment.md +9 -0
  14. package/docs/design-notes/references.md +4 -0
  15. package/docs/design-notes/spacing-units.md +286 -0
  16. package/docs/design-notes/steps.md +748 -0
  17. package/docs/design-notes/widget-primitives.md +32 -15
  18. package/docs/navigation.json +2 -0
  19. package/docs/pages/components/alert.md +14 -9
  20. package/docs/pages/components/app-navigation.md +2 -0
  21. package/docs/pages/components/aura.md +102 -6
  22. package/docs/pages/components/avatar.md +9 -6
  23. package/docs/pages/components/badge.md +27 -9
  24. package/docs/pages/components/button.md +25 -18
  25. package/docs/pages/components/card.md +27 -7
  26. package/docs/pages/components/chat.md +1 -1
  27. package/docs/pages/components/data-list.md +72 -0
  28. package/docs/pages/components/dialog.md +12 -7
  29. package/docs/pages/components/drawer.md +3 -1
  30. package/docs/pages/components/fab.md +14 -10
  31. package/docs/pages/components/indicator.md +6 -6
  32. package/docs/pages/components/list.md +11 -2
  33. package/docs/pages/components/meter.md +56 -1
  34. package/docs/pages/components/navbar.md +1 -1
  35. package/docs/pages/components/pagination.md +1 -1
  36. package/docs/pages/components/progress.md +10 -0
  37. package/docs/pages/components/rating.md +4 -4
  38. package/docs/pages/components/skeleton.md +3 -1
  39. package/docs/pages/components/spinner.md +1 -1
  40. package/docs/pages/components/steps.md +379 -47
  41. package/docs/pages/components/table.md +6 -5
  42. package/docs/pages/enhancements/flyout.md +14 -10
  43. package/docs/pages/enhancements/overview.md +2 -2
  44. package/docs/pages/enhancements/scrollspy.md +1 -1
  45. package/docs/pages/enhancements/status-bar.md +10 -1
  46. package/docs/pages/enhancements/tabs.md +1 -1
  47. package/docs/pages/examples/overview.md +4 -1
  48. package/docs/pages/forms/choice-cards.md +4 -4
  49. package/docs/pages/forms/combobox.md +87 -0
  50. package/docs/pages/forms/floating-field.md +5 -3
  51. package/docs/pages/forms/joined-controls.md +6 -4
  52. package/docs/pages/forms/labels.md +8 -5
  53. package/docs/pages/forms/overview.md +26 -19
  54. package/docs/pages/forms/password.md +3 -2
  55. package/docs/pages/forms/range.md +15 -2
  56. package/docs/pages/forms/states-and-sizes.md +7 -5
  57. package/docs/pages/forms/validation.md +15 -9
  58. package/docs/pages/foundations/philosophy.md +11 -1
  59. package/docs/pages/foundations/tokens.md +16 -9
  60. package/docs/pages/foundations/typography.md +11 -3
  61. package/docs/pages/guides/bootstrap.md +3 -3
  62. package/docs/pages/guides/introduction.md +2 -2
  63. package/docs/pages/guides/modular-import.md +21 -10
  64. package/docs/pages/guides/progressive-enhancement.md +75 -54
  65. package/docs/pages/guides/tailwind.md +2 -2
  66. package/docs/pages/layout/app-shell.md +4 -4
  67. package/docs/pages/layout/choosing.md +10 -6
  68. package/docs/pages/layout/grid.md +11 -10
  69. package/docs/pages/layout/scroll-snap.md +2 -0
  70. package/docs/pages/layout/sidebar-layout.md +2 -0
  71. package/docs/pages/layout/stack.md +10 -6
  72. package/docs/pages/layout/topbar.md +2 -0
  73. package/docs/pages/patterns/structured-lists.md +7 -7
  74. package/docs/pages/utilities/accessibility.md +19 -1
  75. package/docs/pages/utilities/flex.md +20 -13
  76. package/docs/pages/utilities/links.md +1 -1
  77. package/docs/pages/utilities/list.md +1 -1
  78. package/docs/pages/utilities/overflow.md +14 -7
  79. package/docs/pages/utilities/overview.md +22 -0
  80. package/docs/pages/utilities/shape.md +1 -1
  81. package/docs/pages/utilities/sizing-wrapping.md +10 -8
  82. package/docs/pages/utilities/spacing.md +26 -19
  83. package/docs/pages/utilities/text.md +1 -1
  84. package/llms.txt +27 -4
  85. package/package.json +3 -2
  86. package/scripts/reserved-classes.json +8 -1
  87. package/src/css/components/data-list.css +27 -0
  88. package/src/css/components/drawer.css +30 -11
  89. package/src/css/components/fab.css +44 -8
  90. package/src/css/components/flyout.css +17 -12
  91. package/src/css/components/index.css +1 -0
  92. package/src/css/components/list.css +3 -1
  93. package/src/css/components/meter.css +28 -1
  94. package/src/css/components/modal.css +28 -11
  95. package/src/css/components/progress.css +5 -0
  96. package/src/css/components/status-bar.css +31 -15
  97. package/src/css/components/steps.css +289 -55
  98. package/src/css/components/surface.css +5 -3
  99. package/src/css/components/tooltip.css +5 -8
  100. package/src/css/core/base.css +7 -1
  101. package/src/css/core/intents.css +6 -0
  102. package/src/css/core/tokens.css +24 -9
  103. package/src/css/core/variants.css +17 -4
  104. package/src/css/effects/aura.css +101 -11
  105. package/src/css/forms/custom-select.css +1 -1
  106. package/src/css/forms/floating-field.css +8 -6
  107. package/src/css/forms/form.css +4 -4
  108. package/src/css/layout/container-query.css +37 -13
  109. package/src/css/layout/grid.css +7 -7
  110. package/src/css/layout/index.css +1 -1
  111. package/src/css/typography/prose.css +2 -3
  112. package/src/css/utilities/base.css +16 -0
  113. package/src/js/password.js +1 -1
  114. package/src/js/selectors.js +1 -0
  115. package/src/js/status.js +88 -7
  116. package/src/js/surface.js +2 -11
  117. package/src/js/transition.js +20 -0
@@ -4,21 +4,38 @@ The JS runtime doubles as a primitive kit for building custom widgets.
4
4
 
5
5
  ## Primitives
6
6
 
7
- | Need | Primitive | Import |
8
- |------|-----------|--------|
9
- | Opt-in discovery + lifecycle + cleanup | `enhance`, `registerEnhancement` | `actual-css/js/enhance` |
10
- | Per-document LIFO Escape dismissal | `escape` (`registerEscapeDismissal`) | `actual-css/js/escape` |
11
- | Positioning, flip/shift, `--available-height`, `data-placement` | `floating` (`track`, `reposition`, `repositionAt`) | `actual-css/js/floating` |
12
- | Open/close, sheet on mobile, backdrop, outside-click, Escape, focus restore | `surface` | `actual-css/js/surface` |
13
- | Directional item lookup, edges, wrapping, RTL | `keys` (`itemForKey`, `firstItem`, `lastItem`, `nextItem`) | `actual-css/js/keys` |
14
- | Menu-item vocabulary, usable-item filtering | `menu` | `actual-css/js/menu` |
15
- | Focusable lookup, visibility | `focus` | `actual-css/js/focus` |
16
- | One remembered tab stop with directional navigation | `focus-group` (`connectFocusGroup`) | `actual-css/js/focus-group` |
17
- | Caret-safe value rewriting | `input` (`onTextInput`, `setCaret`, `dispatchInput`) | `actual-css/js/input` |
18
- | Character policies | `filter` | `actual-css/js/filter` |
19
- | Event namespace | `events` (`EVENTS`, `ACTUAL_EVENT_PREFIX`) | `actual-css/js/events` |
20
- | Declarative triggers | `command` (`registerCommands`) | `actual-css/js/command` |
21
- | State classes the runtime writes | `selectors` (`CLASSES`) | `actual-css/js/selectors` |
7
+ | Need | Primitive | Import |
8
+ | ---------------------------------- | ------------- | --------------------------- |
9
+ | Discovery, lifecycle, cleanup | `enhance` | `actual-css/js/enhance` |
10
+ | Per-document LIFO Escape dismissal | `escape` | `actual-css/js/escape` |
11
+ | Positioning, flip and shift | `floating` | `actual-css/js/floating` |
12
+ | Open/close, sheet, backdrop, focus | `surface` | `actual-css/js/surface` |
13
+ | Directional item lookup | `keys` | `actual-css/js/keys` |
14
+ | Menu-item vocabulary | `menu` | `actual-css/js/menu` |
15
+ | Focusable lookup, visibility | `focus` | `actual-css/js/focus` |
16
+ | One remembered tab stop | `focus-group` | `actual-css/js/focus-group` |
17
+ | Caret-safe value rewriting | `input` | `actual-css/js/input` |
18
+ | Character policies | `filter` | `actual-css/js/filter` |
19
+ | Event namespace | `events` | `actual-css/js/events` |
20
+ | Declarative triggers | `command` | `actual-css/js/command` |
21
+ | State classes the runtime writes | `selectors` | `actual-css/js/selectors` |
22
+
23
+ The named exports each module carries:
24
+
25
+ - `enhance` — `enhance`, `registerEnhancement`
26
+ - `escape` — `registerEscapeDismissal`
27
+ - `floating` — `track`, `reposition`, `repositionAt`, plus
28
+ `--available-height` and `data-placement`
29
+ - `keys` — `itemForKey`, `firstItem`, `lastItem`, `nextItem`, with edge,
30
+ wrapping and RTL handling
31
+ - `focus-group` — `connectFocusGroup`
32
+ - `input` — `onTextInput`, `setCaret`, `dispatchInput`
33
+ - `events` — `EVENTS`, `ACTUAL_EVENT_PREFIX`
34
+ - `command` — `registerCommands`
35
+ - `selectors` — `CLASSES`
36
+
37
+ `surface` also owns outside-click and Escape dismissal, and focus restore.
38
+ `menu` filters to usable items.
22
39
 
23
40
  ## Focus group
24
41
 
@@ -55,6 +55,7 @@
55
55
  "chat",
56
56
  "dialog",
57
57
  "drawer",
58
+ "data-list",
58
59
  "fab",
59
60
  "indicator",
60
61
  "key",
@@ -76,6 +77,7 @@
76
77
  "pages": [
77
78
  "overview",
78
79
  "controls",
80
+ "combobox",
79
81
  "labels",
80
82
  "floating-field",
81
83
  "states-and-sizes",
@@ -21,17 +21,20 @@ itself needs to change, not `.soft`.
21
21
 
22
22
  ## Class reference
23
23
 
24
- | Class | Kind | Description |
25
- |------------------|-------------|-----------------------------------------------------------------------------------|
26
- | `.alert` | Component | Inline status surface; soft by default. |
27
- | `.alert-icon` | Composition | Decorative leading icon; pins to the first grid column. |
28
- | `.alert-dismiss` | Modifier | Compact dismiss button using the `--icon-close` mask and the `--dismiss` command. |
29
- | `.callout` | Variant | Neutral panel with a thick accent border on the leading edge. |
30
- | `.admonition` | Variant | Structured box with a tinted title bar and body on the page surface. |
24
+ | Class | Kind | Description |
25
+ | ---------------- | ----------- | --------------------------------------------- |
26
+ | `.alert` | Component | Inline status surface; soft by default. |
27
+ | `.alert-icon` | Composition | Decorative leading icon, in the first column. |
28
+ | `.alert-dismiss` | Modifier | Compact dismiss button. |
29
+ | `.callout` | Variant | Neutral panel, thick accent leading edge. |
30
+ | `.admonition` | Variant | Tinted title bar, body on the page surface. |
31
+
32
+ `.alert-dismiss` draws itself with the `--icon-close` mask and acts through the
33
+ `--dismiss` command.
31
34
  | `.alert-title` | Composition | Admonition title bar; hosts the dismiss button. |
32
35
  | `.alert-body` | Composition | Admonition body resting on the page surface. |
33
36
  | Shared intents | Intent | `.primary`, `.secondary`, `.success`, `.warning`, `.danger`. |
34
- | Shared variants | Variant | `.solid` and `.outline` emphasis. |
37
+ | Shared variants | Variant | `.solid`, `.outline`, and `.surface` emphasis. |
35
38
  | `.sm` / `.lg` | Size | Density; inline padding stays stable. |
36
39
 
37
40
  ## Basic usage
@@ -117,10 +120,12 @@ Use `.alert-dismiss` to let a user remove an inline alert. The button is transpa
117
120
  ```html demo
118
121
  <div class="alert warning" id="warning-alert">
119
122
  <i class="ti ti-alert-triangle alert-icon" aria-hidden="true"></i>
120
- <div>
123
+
124
+ <div class="stack" style="--gap: var(--space-10)">
121
125
  <strong>Warning</strong>
122
126
  <p>Something needs your attention.</p>
123
127
  </div>
128
+
124
129
  <button
125
130
  class="alert-dismiss"
126
131
  type="button"
@@ -5,6 +5,8 @@
5
5
  Use one `.app-nav` landmark for the application's primary destinations. Links
6
6
  remain links, and `aria-current="page"` is the only current-page state.
7
7
 
8
+ **Related terms:** tab bar, bottom navigation, bottom nav, navigation rail, side navigation.
9
+
8
10
  ```html demo
9
11
  <nav class="app-nav" aria-label="Primary">
10
12
  <a href="#today" aria-current="page">
@@ -5,6 +5,32 @@
5
5
  Aura adds a decorative intent-colored border and halo around one direct child.
6
6
  It is visual emphasis only and does not change the child's semantics.
7
7
 
8
+ ```html demo
9
+ <div class="cluster" style="gap: 2.5rem">
10
+ <span class="aura primary">
11
+ <article class="card" style="inline-size: 13rem">
12
+ <p><strong>Rotating arc</strong></p>
13
+ <p class="muted">One lit segment travels around the frame.</p>
14
+ </article>
15
+ </span>
16
+
17
+ <span class="aura aura-glow primary">
18
+ <article class="card" style="inline-size: 13rem">
19
+ <p><strong>Breathing glow</strong></p>
20
+ <p class="muted">The whole perimeter lights and breathes.</p>
21
+ </article>
22
+ </span>
23
+ </div>
24
+ ```
25
+
26
+ `.aura` sends a short accent of light travelling around the frame, over a
27
+ permanent halo that keeps the object present between two passes. Add
28
+ `.aura-glow` to light the whole perimeter evenly instead, as a halo that
29
+ breathes slowly.
30
+
31
+ Aura reads best when it has enough perimeter to travel around, and is naturally
32
+ more pronounced on dark surfaces. It still composes on small shapes:
33
+
8
34
  ```html demo
9
35
  <div class="cluster">
10
36
  <span class="aura primary">
@@ -14,22 +40,92 @@ It is visual emphasis only and does not change the child's semantics.
14
40
  <span class="aura aura-glow secondary">
15
41
  <span class="badge">New</span>
16
42
  </span>
43
+
44
+ <span class="aura aura-glow success">
45
+ <span class="badge success soft">Live</span>
46
+ </span>
47
+
48
+ <span class="aura danger">
49
+ <span class="badge danger solid" aria-label="12 unread notifications">12</span>
50
+ </span>
51
+ </div>
52
+ ```
53
+
54
+ Note the intent on the wrapper, not on the child: `.aura` is an intent
55
+ boundary, so the badge or alert inside keeps its own color and the frame keeps
56
+ the one you gave the wrapper. Matching them reads as one object; deliberately
57
+ mismatching them reads as two.
58
+
59
+ ```html demo
60
+ <div class="stack" style="max-inline-size: 28rem">
61
+ <span class="aura warning">
62
+ <div class="alert warning" role="alert">
63
+ <i class="ti ti-alert-triangle alert-icon" aria-hidden="true"></i>
64
+ <div>Your trial ends in three days.</div>
65
+ </div>
66
+ </span>
67
+
68
+ <span class="aura aura-glow danger">
69
+ <div class="alert danger" role="alert">
70
+ <i class="ti ti-credit-card-off alert-icon" aria-hidden="true"></i>
71
+ <div>Two payment methods failed. <a href="#">Review them</a>.</div>
72
+ </div>
73
+ </span>
17
74
  </div>
18
75
  ```
19
76
 
20
- The animated conic frame runs only when the user has not requested reduced
21
- motion. Add `.aura-glow` for a static, solid frame. The component uses an
22
- intent such as `.primary`, `.success`, or `.danger`; it does not introduce
23
- separate aura color variants.
77
+ Motion changes how the light lives, never whether the effect is there: when the
78
+ user has requested reduced motion, the travelling accent becomes two opposite
79
+ lit corners — a deliberate composition rather than a rotation frozen at an
80
+ arbitrary angle — and the glow stays a full, still halo.
81
+
82
+ The frame color comes from an intent such as `.primary`, `.success`, or
83
+ `.danger`; there are no separate aura color variants. The intent is sovereign:
84
+ a neutral intent produces a neutral aura. Use a chromatic intent when you want
85
+ a visibly luminous effect.
86
+
87
+ Two hooks tune how loud the effect is. `--aura-intensity` scales both halos at
88
+ once, resting and breathing alike, so the breath stays proportional at every
89
+ setting; `--aura-duration` sets one full rotation of the accent, or one breath
90
+ of the glow.
91
+
92
+ ```html demo
93
+ <div class="cluster" style="gap: 2rem">
94
+ <span class="aura aura-glow primary" style="--aura-intensity: 0.4">
95
+ <span class="card" style="inline-size: 8rem">Muted</span>
96
+ </span>
97
+
98
+ <span class="aura aura-glow primary">
99
+ <span class="card" style="inline-size: 8rem">Default</span>
100
+ </span>
101
+
102
+ <span class="aura aura-glow primary" style="--aura-intensity: 2">
103
+ <span class="card" style="inline-size: 8rem">Loud</span>
104
+ </span>
105
+
106
+ <span class="aura primary" style="--aura-duration: 2s">
107
+ <span class="card" style="inline-size: 8rem">Fast accent</span>
108
+ </span>
109
+ </div>
110
+ ```
24
111
 
25
112
  Keep exactly one direct child and set `--aura-radius` when its shape differs
26
113
  from the common button, card, alert, and badge shapes detected as a visual
27
114
  enhancement.
28
115
 
116
+ The child must be opaque. The frame paints across the whole box and relies on
117
+ the child to cover all but its edge, so a transparent child — an `.outline`
118
+ alert, a `.ghost` button — is filled edge to edge with the frame color instead
119
+ of framed by it. Give such a child a surface, or move the aura to an opaque
120
+ wrapper around it.
121
+
29
122
  ## CSS hooks
30
123
 
31
124
  - `--aura-color` — frame and halo color; follows the local intent.
32
125
  - `--aura-width` — frame thickness.
33
- - `--aura-blur` — halo blur radius.
126
+ - `--aura-blur` — near halo blur; the far halo derives its own blur and its
127
+ spread beyond the frame from this value, so one hook scales both.
128
+ - `--aura-intensity` — multiplies both halo opacities, resting and breathing.
129
+ It does not touch the frame itself, which stays a crisp line at any setting.
34
130
  - `--aura-radius` — child corner radius used to derive the outer radius.
35
- - `--aura-duration` — rotation duration when motion is allowed.
131
+ - `--aura-duration` — one rotation of the accent, or one breath of the glow.
@@ -12,12 +12,15 @@
12
12
 
13
13
  ## Class reference
14
14
 
15
- | Class | Kind | Description |
16
- |-----------------------------------|-------------|-------------------------------------------------------------------------|
17
- | `.avatar` | Component | Initials or image in a circular box; works on `div`, `a`, and `button`. |
18
- | `.avatar-stack` | Composition | Overlapping avatar group. |
19
- | `.badge:empty` (inside `.avatar`) | Composition | Status dot at the bottom-end corner; give it an `aria-label`. |
20
- | `.sm` / `.lg` | Size | Density; also rescales the whole `.avatar-stack`. |
15
+ | Class | Kind | Description |
16
+ | --------------- | ----------- | --------------------------------------- |
17
+ | `.avatar` | Component | Initials or image in a circular box. |
18
+ | `.avatar-stack` | Composition | Overlapping avatar group. |
19
+ | `.badge:empty` | Composition | Status dot, at the bottom-end corner. |
20
+ | `.sm` / `.lg` | Size | Density; also rescales `.avatar-stack`. |
21
+
22
+ `.avatar` works on `div`, `a` and `button`. The status dot is an empty
23
+ `.badge` inside an `.avatar`, and needs an `aria-label` of its own.
21
24
 
22
25
  ## Basic usage
23
26
 
@@ -16,15 +16,21 @@ direct child of `.stack` (where flex children otherwise stretch). Use
16
16
  `inline-size: 100%` — or the optional `.inline-size-full` utility — when a
17
17
  full-width badge is intentional.
18
18
 
19
+ **Related terms:** chip, tag, pill, removable tag.
20
+
19
21
  ## Class reference
20
22
 
21
- | Class | Kind | Description |
22
- |-----------------|-------------|--------------------------------------------------------------|
23
- | `.badge` | Component | Compact label; soft by default. |
24
- | `.badge:empty` | Composition | Truly-empty badge renders as a solid dot. |
25
- | Shared intents | Intent | `.primary`, `.secondary`, `.success`, `.warning`, `.danger`. |
26
- | Shared variants | Variant | `.solid` (filled) and `.outline` (bordered) emphasis. |
27
- | `.sm` / `.lg` | Size | Compact density. |
23
+ | Class | Kind | Description |
24
+ | --------------- | ----------- | ----------------------------------------- |
25
+ | `.badge` | Component | Compact label; soft by default. |
26
+ | `.badge:empty` | Composition | Truly-empty badge renders as a solid dot. |
27
+ | Shared intents | Intent | `.primary`, `.secondary`, `.success`, … |
28
+ | Shared variants | Variant | `.solid`, `.outline`, `.surface`. |
29
+ | `.sm` / `.lg` | Size | Compact density. |
30
+
31
+ The shared intents are `.primary`, `.secondary`, `.success`, `.warning` and
32
+ `.danger`. The variants set emphasis: `.solid` is filled, `.outline` bordered,
33
+ `.surface` untinted.
28
34
 
29
35
  ## Basic usage
30
36
 
@@ -58,13 +64,25 @@ full-width badge is intentional.
58
64
  </button>
59
65
  ```
60
66
 
61
- ## Empty badge dot
67
+ ## Status dot
62
68
 
63
69
  ```html demo
64
70
  <span class="badge success" aria-label="Online"></span>
65
71
  ```
66
72
 
67
- The dot conveys no text, so an `aria-label` is required for it to mean anything.
73
+ An autonomous dot conveys state without visible text, so give it an accessible
74
+ name.
75
+
76
+ ## Color marker
77
+
78
+ Use an empty badge as a compact intent-colored marker in legends and status
79
+ labels. When adjacent text carries the same information, keep the marker
80
+ decorative.
81
+
82
+ ```html demo
83
+ <span class="badge primary" aria-hidden="true"></span>
84
+ Regular
85
+ ```
68
86
 
69
87
  ## Size variants
70
88
 
@@ -4,22 +4,23 @@ Actions and navigation with shared intents, variants, sizes, and loading, presse
4
4
 
5
5
  ## Class reference
6
6
 
7
- | Class | Kind | Description |
8
- |---------------|-----------|--------------------------------------------------------------------------------------------|
9
- | `.btn` | Component | Base button. Solid by default; works on `<button>`, `<a href>`, and button-like `<input>`. |
10
- | `.primary` | Intent | Primary action. |
11
- | `.secondary` | Intent | Secondary action. |
12
- | `.success` | Intent | Positive outcome. |
13
- | `.warning` | Intent | Caution. |
14
- | `.danger` | Intent | Destructive action. |
15
- | `.neutral` | Intent | Neutral tone (the `.btn` default). |
16
- | `.soft` | Variant | Muted intent-tinted surface. |
17
- | `.outline` | Variant | Transparent with an intent-colored border. |
18
- | `.solid` | Variant | Filled intent background — the `.btn` default. |
19
- | `.ghost` | Variant | Borderless text button (button-only). |
20
- | `.link` | Variant | Underlined text button (button-only). |
21
- | `.sm` / `.lg` | Size | Compact or large control height. |
22
- | `.icon-only` | Variant | Square icon button sized to the control height. |
7
+ | Class | Kind | Description |
8
+ | ------------- | --------- | -------------------------------------------------- |
9
+ | `.btn` | Component | Base button, solid by default. |
10
+ | `.primary` | Intent | Primary action. |
11
+ | `.secondary` | Intent | Secondary action. |
12
+ | `.success` | Intent | Positive outcome. |
13
+ | `.warning` | Intent | Caution. |
14
+ | `.danger` | Intent | Destructive action. |
15
+ | `.neutral` | Intent | Neutral tone (the `.btn` default). |
16
+ | `.soft` | Variant | Muted intent-tinted surface. |
17
+ | `.outline` | Variant | Transparent with an intent-colored border. |
18
+ | `.solid` | Variant | Filled intent background — the `.btn` default. |
19
+ | `.surface` | Variant | Page surface, neutral border, intent on the label. |
20
+ | `.ghost` | Variant | Borderless text button (button-only). |
21
+ | `.link` | Variant | Underlined text button (button-only). |
22
+ | `.sm` / `.lg` | Size | Compact or large control height. |
23
+ | `.icon-only` | Variant | Square icon button sized to the control height. |
23
24
 
24
25
  ## Basic usage
25
26
 
@@ -53,8 +54,12 @@ Shared intent classes set color meaning. They compose with every variant.
53
54
 
54
55
  ## Variants
55
56
 
56
- `.ghost` and `.link` are button-only; `.soft`, `.outline`, and `.solid` are
57
- shared with other components.
57
+ `.ghost` and `.link` are button-only; `.soft`, `.outline`, `.solid`, and
58
+ `.surface` are shared with other components.
59
+
60
+ Reach for `.surface` when a secondary action must sit on an opaque, neutral
61
+ chip: `.outline` lets whatever is behind it show through, and `.soft` is the
62
+ intent-tinted treatment (its baseline fallback uses `--surface-subtle`).
58
63
 
59
64
  Transparent treatments (`.outline`, `.ghost`, `.link`) follow the surrounding
60
65
  foreground by default, including on a contrasting `.inverted` surface. A local
@@ -79,6 +84,8 @@ container. For a plain text link, use a bare `<a>` with no class.
79
84
  <button class="btn danger outline" type="button">Danger outline</button>
80
85
  <button class="btn soft" type="button">Soft</button>
81
86
  <button class="btn danger soft" type="button">Danger soft</button>
87
+ <button class="btn surface" type="button">Surface</button>
88
+ <button class="btn danger surface" type="button">Danger surface</button>
82
89
  <button class="btn ghost" type="button">Ghost</button>
83
90
  <button class="btn link" type="button">Button as link</button>
84
91
  </div>
@@ -4,13 +4,21 @@ Flexible content container with optional header, body, and footer regions, plus
4
4
 
5
5
  ## Class reference
6
6
 
7
- | Class | Kind | Description |
8
- |-------------|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
9
- | `.card` | Component | Neutral raised surface for grouped content. |
10
- | `.raised` | Variant | Elevated surface with a soft shadow. |
11
- | `.subtle` | Variant | Lower contrast against the page surface. |
12
- | `.inverted` | Surface modifier | Inverse surface treatment: paints `--surface-solid` and swaps the foreground to `--surface`, so it inverts in dark themes instead of always reading as dark. Apply as `class="card inverted"`, or on any block. |
13
- | `.compact` | Variant | Tighter padding for dense contexts. |
7
+ | Class | Kind | Description |
8
+ | ----------- | ---------------- | ------------------------------------------- |
9
+ | `.card` | Component | Neutral raised surface for grouped content. |
10
+ | `.raised` | Variant | Elevated surface with a soft shadow. |
11
+ | `.subtle` | Variant | Lower contrast against the page surface. |
12
+ | `.surface` | Variant | The page surface; intent in the text only. |
13
+ | `.inverted` | Surface modifier | Inverse surface treatment. |
14
+ | `.compact` | Variant | Tighter padding for dense contexts. |
15
+
16
+ `.surface` is a shared variant: it paints the page surface instead of
17
+ `--surface-raised` and leaves the intent to the text.
18
+
19
+ `.inverted` paints `--surface-solid` and swaps the foreground to `--surface`,
20
+ so it inverts in dark themes instead of always reading as dark. Write it as
21
+ `class="card inverted"`, or on any block.
14
22
 
15
23
  ## Basic usage
16
24
 
@@ -162,6 +170,11 @@ the surface tokens, so `.card.subtle.inverted` renders a subtle background with
162
170
  inverted foreground. Treat them as mutually exclusive, like two competing
163
171
  variants.
164
172
 
173
+ `.surface` is the shared variant on a card: it drops the card to the page
174
+ surface instead of `--surface-raised`, keeps the theme border, and lets an
175
+ intent class color the text only. `.raised` and `.subtle` are the card-local
176
+ treatments on either side of it.
177
+
165
178
  ```html demo
166
179
  <section class="grid">
167
180
  <article class="card raised">
@@ -178,6 +191,13 @@ variants.
178
191
  </hgroup>
179
192
  </article>
180
193
 
194
+ <article class="card surface">
195
+ <hgroup>
196
+ <h3>Surface</h3>
197
+ <p class="muted">The page surface with the theme border.</p>
198
+ </hgroup>
199
+ </article>
200
+
181
201
  <article class="card inverted stack">
182
202
  <hgroup>
183
203
  <h3>Inverted</h3>
@@ -37,7 +37,7 @@ put `role="log"` on individual messages.
37
37
  ## Class reference
38
38
 
39
39
  | Class | Description |
40
- |---------------------------------|----------------------------------------------|
40
+ | ------------------------------- | -------------------------------------------- |
41
41
  | `.chat` | Message row grid. |
42
42
  | `.chat-start` / `.chat-end` | Logical inline placement. |
43
43
  | `.chat-avatar` | Avatar grid slot; compose it with `.avatar`. |
@@ -0,0 +1,72 @@
1
+ # Data list
2
+
3
+ > A compact key/value layout for object properties.
4
+
5
+ Use `.data-list` to present the properties of a single object as simple
6
+ term–value pairs on a `<dl>`. It expects alternating `<dt>` and `<dd>` children
7
+ — one term, one value per property. Use a plain description list for
8
+ relationships that involve multiple terms or descriptions, and a `<table>` to
9
+ compare the same property across several objects.
10
+
11
+ ```html demo
12
+ <dl class="data-list">
13
+ <dt>Name</dt>
14
+ <dd>Alice Martin</dd>
15
+
16
+ <dt>Email</dt>
17
+ <dd>alice@example.com</dd>
18
+
19
+ <dt>Role</dt>
20
+ <dd>Administrator</dd>
21
+ </dl>
22
+ ```
23
+
24
+ ## Rich values
25
+
26
+ Values accept inline content such as badges, links, dates, or a `.cluster` of
27
+ related items. Terms and values remain baseline-aligned.
28
+
29
+ ```html demo
30
+ <dl class="data-list">
31
+ <dt>Status</dt>
32
+ <dd><span class="badge success">Active</span></dd>
33
+
34
+ <dt>Plan</dt>
35
+ <dd>Professional</dd>
36
+
37
+ <dt>Renewal</dt>
38
+ <dd><time datetime="2026-09-14">14 Sep 2026</time></dd>
39
+ </dl>
40
+ ```
41
+
42
+ ## In a card
43
+
44
+ `.data-list` composes with `.card` and other layout primitives for business
45
+ metadata.
46
+
47
+ ```html demo
48
+ <article class="card stack">
49
+ <h3>Storage details</h3>
50
+
51
+ <dl class="data-list">
52
+ <dt>Used</dt>
53
+ <dd>6.7 GB</dd>
54
+
55
+ <dt>Available</dt>
56
+ <dd>1.3 GB</dd>
57
+
58
+ <dt>Files</dt>
59
+ <dd>12,492</dd>
60
+ </dl>
61
+ </article>
62
+ ```
63
+
64
+ ## Contract
65
+
66
+ `.data-list` styles one `<dt>` followed by one `<dd>` per property. A valid
67
+ `<dl>` may group several terms with one description or the reverse, but that
68
+ markup does not belong in `.data-list` — use a plain description list instead,
69
+ where `.prose` already covers the editorial cases.
70
+
71
+ Use `.data-list` for the properties of a single object. Use a `<table>` when
72
+ comparing the same properties across multiple objects.
@@ -2,15 +2,20 @@
2
2
 
3
3
  > Centered modal overlay for focused tasks, confirmations, or forms, built on the native `<dialog>` element.
4
4
 
5
+ **Related terms:** modal, alert dialog, confirmation dialog.
6
+
5
7
  ## Class reference
6
8
 
7
- | Class | Kind | Description |
8
- |------------------------|-----------|----------------------------------------------------------------------------------|
9
- | `.modal` | Component | Centered modal surface built on the native `<dialog>` element. |
10
- | `.scrollable` | Variant | Keeps the header and footer visible while the dialog body scrolls. |
11
- | `.dialog-confirmation` | Variant | Separates a confirmation message from its full-width action band. |
12
- | `.dialog-icon` | Component | Circular intent-aware icon well for confirmation messages. |
13
- | `.dialog-close` | Component | Icon-only close button anchored to the modal's top end, out of the content flow. |
9
+ | Class | Kind | Description |
10
+ | ---------------------- | --------- | ---------------------------------------------- |
11
+ | `.modal` | Component | Centered surface on the native `<dialog>`. |
12
+ | `.scrollable` | Variant | Header and footer stay while the body scrolls. |
13
+ | `.dialog-confirmation` | Variant | Message above a full-width action band. |
14
+ | `.dialog-icon` | Component | Circular intent-aware icon well. |
15
+ | `.dialog-close` | Component | Icon-only close button, at the top end. |
16
+
17
+ `.dialog-close` sits outside the content flow, so it does not take part in the
18
+ dialog's own layout.
14
19
 
15
20
  ## Usage
16
21
 
@@ -2,10 +2,12 @@
2
2
 
3
3
  > Modal side-sheet that overlays the page for navigation or filters.
4
4
 
5
+ **Related terms:** off-canvas, side panel, side sheet, navigation drawer.
6
+
5
7
  ## Class reference
6
8
 
7
9
  | Class | Kind | Description |
8
- |-----------------|-----------|------------------------------------------------------------|
10
+ | --------------- | --------- | ---------------------------------------------------------- |
9
11
  | `.drawer` | Component | Modal side-sheet built on the native `<dialog>` element. |
10
12
  | `.drawer-close` | Component | Icon-only close button that sits inside the drawer header. |
11
13