actual-css 0.9.1 → 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.
Files changed (107) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +67 -45
  3. package/components.json +33 -13
  4. package/dist/actual.full.css +607 -502
  5. package/dist/actual.full.js +1 -1
  6. package/dist/actual.full.min.css +1 -1
  7. package/docs/design-notes/app-ui.md +1 -1
  8. package/docs/design-notes/column-layout.md +103 -520
  9. package/docs/design-notes/forced-colors.md +12 -1
  10. package/docs/design-notes/naming.md +1 -1
  11. package/docs/design-notes/surface-reparenting.md +8 -9
  12. package/docs/navigation.json +2 -0
  13. package/docs/pages/components/accordion.md +55 -1
  14. package/docs/pages/components/alert.md +9 -15
  15. package/docs/pages/components/badge.md +6 -7
  16. package/docs/pages/components/bleed.md +42 -0
  17. package/docs/pages/components/button.md +30 -4
  18. package/docs/pages/components/card.md +21 -86
  19. package/docs/pages/components/close.md +48 -0
  20. package/docs/pages/components/data-list.md +26 -1
  21. package/docs/pages/components/dialog.md +16 -16
  22. package/docs/pages/components/drawer.md +9 -9
  23. package/docs/pages/components/navbar.md +5 -5
  24. package/docs/pages/components/spinner.md +3 -3
  25. package/docs/pages/components/table.md +3 -2
  26. package/docs/pages/enhancements/overview.md +5 -0
  27. package/docs/pages/enhancements/tooltip.md +3 -1
  28. package/docs/pages/examples/overview.md +3 -1
  29. package/docs/pages/forms/choice-cards.md +39 -0
  30. package/docs/pages/forms/combobox.md +23 -11
  31. package/docs/pages/forms/input-policy.md +59 -0
  32. package/docs/pages/forms/joined-controls.md +2 -5
  33. package/docs/pages/forms/overview.md +6 -0
  34. package/docs/pages/forms/validation.md +37 -1
  35. package/docs/pages/foundations/theming.md +64 -18
  36. package/docs/pages/foundations/tokens.md +50 -13
  37. package/docs/pages/foundations/typography.md +10 -0
  38. package/docs/pages/guides/introduction.md +17 -24
  39. package/docs/pages/guides/modular-import.md +53 -6
  40. package/docs/pages/guides/progressive-enhancement.md +9 -5
  41. package/docs/pages/guides/tailwind.md +17 -5
  42. package/docs/pages/layout/column-layout.md +92 -54
  43. package/docs/pages/layout/media.md +1 -1
  44. package/docs/pages/layout/overview.md +1 -1
  45. package/docs/pages/utilities/overview.md +1 -1
  46. package/docs/pages/utilities/sizing-wrapping.md +5 -3
  47. package/llms.txt +24 -4
  48. package/package.json +7 -6
  49. package/reserved-classes.json +5 -30
  50. package/skills/actual-css/PROJECT.md.example +65 -0
  51. package/skills/actual-css/README.md +64 -0
  52. package/skills/actual-css/SKILL.md +234 -0
  53. package/skills/actual-css/references/accessibility.md +44 -0
  54. package/skills/actual-css/references/api-and-vocabulary.md +94 -0
  55. package/skills/actual-css/references/enhancements.md +59 -0
  56. package/skills/actual-css/references/forms.md +49 -0
  57. package/skills/actual-css/references/layout-and-theming.md +82 -0
  58. package/skills/actual-css/references/review-checklist.md +51 -0
  59. package/skills/actual-css/scripts/inspect-actual-css.mjs +171 -0
  60. package/src/css/components/accordion.css +44 -7
  61. package/src/css/components/alert.css +23 -43
  62. package/src/css/components/app-nav.css +9 -0
  63. package/src/css/components/badge.css +11 -39
  64. package/src/css/components/bleed.css +79 -0
  65. package/src/css/components/button.css +6 -17
  66. package/src/css/components/card.css +7 -40
  67. package/src/css/components/close.css +91 -0
  68. package/src/css/components/data-list.css +18 -0
  69. package/src/css/components/drawer.css +15 -56
  70. package/src/css/components/fab.css +10 -0
  71. package/src/css/components/flyout.css +1 -0
  72. package/src/css/components/index.css +2 -0
  73. package/src/css/components/join.css +36 -20
  74. package/src/css/components/menu.css +12 -0
  75. package/src/css/components/modal.css +10 -57
  76. package/src/css/components/navbar.css +27 -0
  77. package/src/css/core/base.css +2 -0
  78. package/src/css/core/focus.css +9 -3
  79. package/src/css/core/theme.css +25 -43
  80. package/src/css/core/tokens.css +3 -1
  81. package/src/css/core/variants.css +15 -36
  82. package/src/css/forms/choice-card.css +74 -4
  83. package/src/css/forms/choice.css +2 -3
  84. package/src/css/forms/control.css +15 -8
  85. package/src/css/forms/custom-select.css +4 -4
  86. package/src/css/forms/form.css +6 -0
  87. package/src/css/forms/native.css +4 -4
  88. package/src/css/forms/range.css +23 -8
  89. package/src/css/forms/switch.css +2 -3
  90. package/src/css/layout/app-layout.css +1 -1
  91. package/src/css/layout/column-layout.css +26 -111
  92. package/src/css/utilities/extra.css +7 -6
  93. package/src/js/dialog.js +95 -24
  94. package/src/js/enhance.js +7 -3
  95. package/src/js/escape.js +1 -0
  96. package/src/js/flyout.js +10 -1
  97. package/src/js/focus-group.js +2 -1
  98. package/src/js/keys.js +14 -0
  99. package/src/js/menu.js +2 -1
  100. package/src/js/status.js +19 -0
  101. package/src/js/surface.js +12 -8
  102. package/src/js/tab.js +2 -1
  103. package/src/js/tooltip.js +18 -1
  104. package/src/js/validation.js +36 -6
  105. package/dist/actual.css +0 -863
  106. package/dist/actual.js +0 -1
  107. package/dist/actual.min.css +0 -1
@@ -1,22 +1,34 @@
1
1
  # Column Layout
2
2
 
3
- `.column-layout` is an explicit twelve-column composition canvas. Place regions
4
- with `.column-span-N` and `.column-start-N`.
3
+ `.column-layout` is an explicit twelve-column composition canvas. Each direct
4
+ child places itself with two numbers: `--column-span` (how many units) and
5
+ `--column-start` (which line it begins on).
5
6
 
6
7
  Reach for it when the placement of each region **is** the design. If the regions
7
8
  are a collection, a known density, peers that switch together, or a main region
8
9
  with an aside, one of the other primitives already says so — and says it with
9
10
  intrinsic responsive behavior this one does not have.
10
11
 
12
+ ```css
13
+ .article-main {
14
+ --column-span: 8;
15
+ }
16
+
17
+ .article-aside {
18
+ --column-span: 4;
19
+ }
20
+ ```
21
+
11
22
  ```html demo
12
23
  <div class="column-layout">
13
- <main class="column-span-8 card">Main — 8 columns</main>
14
- <aside class="column-span-4 card">Aside — 4 columns</aside>
24
+ <main class="card" style="--column-span: 8">Main — 8 columns</main>
25
+ <aside class="card" style="--column-span: 4">Aside — 4 columns</aside>
15
26
  </div>
16
27
  ```
17
28
 
18
- Neither child names a start line, so grid auto-placement flows the aside into
19
- columns 9 through 12.
29
+ The hooks are plain CSS: set them from an application class, or inline as a
30
+ shortcut for a composition that never changes. Neither child names a start
31
+ line, so grid auto-placement flows the aside into columns 9 through 12.
20
32
 
21
33
  ## Spans
22
34
 
@@ -24,26 +36,26 @@ A span declares how many of the twelve units a region occupies.
24
36
 
25
37
  ```html demo
26
38
  <div class="column-layout">
27
- <div class="column-span-3 card">3</div>
28
- <div class="column-span-6 card">6</div>
29
- <div class="column-span-3 card">3</div>
39
+ <div class="card" style="--column-span: 3">3</div>
40
+ <div class="card" style="--column-span: 6">6</div>
41
+ <div class="card" style="--column-span: 3">3</div>
30
42
  </div>
31
43
  ```
32
44
 
33
- A child with no placement class spans the whole canvas, so a heading can share
34
- the canvas with placed regions without carrying a class.
45
+ A child with no coordinates spans the whole canvas, so a heading can share the
46
+ canvas with placed regions without setting anything.
35
47
 
36
48
  ```html demo
37
49
  <div class="column-layout">
38
- <h3>Full canvas — no class needed</h3>
39
- <div class="column-span-4 card">4</div>
40
- <div class="column-span-4 card">4</div>
41
- <div class="column-span-4 card">4</div>
50
+ <h3>Full canvas — nothing set</h3>
51
+ <div class="card" style="--column-span: 4">4</div>
52
+ <div class="card" style="--column-span: 4">4</div>
53
+ <div class="card" style="--column-span: 4">4</div>
42
54
  </div>
43
55
  ```
44
56
 
45
- Regions that do not fit wrap to the next row, as any grid does. Two
46
- `.column-span-8` regions need sixteen units, so the second moves down.
57
+ Regions that do not fit wrap to the next row, as any grid does. Two eight-unit
58
+ regions need sixteen units, so the second moves down.
47
59
 
48
60
  ## Starts
49
61
 
@@ -53,7 +65,7 @@ placement flips with `dir="rtl"` on its own.
53
65
 
54
66
  ```html demo
55
67
  <div class="column-layout">
56
- <article class="column-span-10 column-start-2 card">
68
+ <article class="card" style="--column-start: 2; --column-span: 10">
57
69
  Columns 2 through 11
58
70
  </article>
59
71
  </div>
@@ -63,15 +75,14 @@ Used without a span, a start runs to the end of the canvas.
63
75
 
64
76
  ```html demo
65
77
  <div class="column-layout">
66
- <aside class="column-start-9 card">Columns 9 through 12</aside>
78
+ <aside class="card" style="--column-start: 9">Columns 9 through 12</aside>
67
79
  </div>
68
80
  ```
69
81
 
70
- Keep a combined placement inside the canvas: `S + N - 1 <= 12`. So
71
- `.column-start-9 .column-span-4` is valid and `.column-start-10 .column-span-4`
72
- is not. Exceeding the canvas adds a thirteenth, content-sized column, and every
73
- other region shrinks with it — the failure is canvas-wide, not local to the
74
- region you got wrong.
82
+ Keep a combined placement inside the canvas: `start + span - 1 <= 12`. Start 9
83
+ with span 4 is valid; start 10 with span 4 is not. Exceeding the canvas adds a
84
+ thirteenth, content-sized column, and every other region shrinks with it — the
85
+ failure is canvas-wide, not local to the region you got wrong.
75
86
 
76
87
  ## Cross-section alignment
77
88
 
@@ -82,22 +93,23 @@ guarantee. This is the case no other primitive can replace.
82
93
  ```html demo
83
94
  <div class="stack">
84
95
  <div class="column-layout">
85
- <h3 class="column-span-8 column-start-3">Feature title</h3>
86
- <p class="muted column-span-8 column-start-3">Kicker aligned to the same line.</p>
96
+ <h3 style="--column-start: 3; --column-span: 8">Feature title</h3>
97
+ <p class="muted" style="--column-start: 3; --column-span: 8">Kicker aligned to the same line.</p>
87
98
  </div>
88
99
 
89
100
  <div class="column-layout">
90
- <p class="column-span-8 column-start-3">
101
+ <p style="--column-start: 3; --column-span: 8">
91
102
  Body copy starts on the same column as the title above and spans the same
92
103
  eight columns.
93
104
  </p>
94
- <aside class="column-span-2 column-start-11 card">Inline note</aside>
105
+ <aside class="card" style="--column-start: 11; --column-span: 2">Inline note</aside>
95
106
  </div>
96
107
  </div>
97
108
  ```
98
109
 
99
- Both sections name the same `column-start-3` / `column-span-8`, so their content
100
- shares a left edge and an alignment gutter without a wrapping grid.
110
+ Both sections use start 3 and span 8, so their content shares a left edge and
111
+ an alignment gutter without a wrapping grid. In an application, give that pair
112
+ one class and reuse it.
101
113
 
102
114
  ## The responsive contract
103
115
 
@@ -110,12 +122,13 @@ three regions to become two before stacking. A single framework threshold would
110
122
  be wrong more often than right, and a hidden one would have to be undone rather
111
123
  than extended.
112
124
 
113
- The simplest recomposition stacks everything:
125
+ Recomposition sets the same two hooks. The simplest one stacks everything:
114
126
 
115
127
  ```css
116
128
  @container (width < 40rem) {
117
129
  .profile-layout > * {
118
- grid-column: 1 / -1;
130
+ --column-start: 1;
131
+ --column-span: 12;
119
132
  }
120
133
  }
121
134
  ```
@@ -124,20 +137,32 @@ A coordinate system is more useful when you keep it through an intermediate
124
137
  state:
125
138
 
126
139
  ```css
140
+ .profile-main {
141
+ --column-span: 8;
142
+ }
143
+
144
+ .profile-aside {
145
+ --column-start: 9;
146
+ --column-span: 4;
147
+ }
148
+
127
149
  @container (width < 48rem) {
128
150
  .profile-main {
129
- grid-column: 1 / span 6;
151
+ --column-start: 1;
152
+ --column-span: 6;
130
153
  }
131
154
 
132
155
  .profile-aside {
133
- grid-column: 7 / span 6;
156
+ --column-start: 7;
157
+ --column-span: 6;
134
158
  }
135
159
  }
136
160
 
137
161
  @container (width < 32rem) {
138
162
  .profile-main,
139
163
  .profile-aside {
140
- grid-column: 1 / -1;
164
+ --column-start: 1;
165
+ --column-span: 12;
141
166
  }
142
167
  }
143
168
  ```
@@ -145,26 +170,40 @@ state:
145
170
  ```html
146
171
  <div class="container-query">
147
172
  <div class="column-layout profile-layout">
148
- <main class="column-span-8 profile-main">...</main>
149
- <aside class="column-span-4 column-start-9 profile-aside">...</aside>
173
+ <main class="profile-main">...</main>
174
+ <aside class="profile-aside">...</aside>
150
175
  </div>
151
176
  </div>
152
177
  ```
153
178
 
179
+ Put coordinates you recompose on a class: an inline `style` outranks every
180
+ rule, including your container query.
181
+
154
182
  The `.container-query` wrapper here enables **your** `@container` rules, not a
155
183
  hidden framework behavior. Remove your rules and the wrapper stops mattering.
156
184
  This is the opposite of a primitive whose responsive contract depends on a
157
185
  wrapper someone else has to remember.
158
186
 
159
- Placement classes carry zero specificity, so a single-class rule of your own
160
- wins without `!important` and without having to undo a framework declaration
161
- first.
187
+ ## Nesting
188
+
189
+ A child's coordinates place that child only. A nested `.column-layout` uses the
190
+ ones it carries for its own position in the parent, and its children start from
191
+ nothing.
192
+
193
+ ```html
194
+ <div class="column-layout">
195
+ <section class="column-layout" style="--column-start: 3; --column-span: 8">
196
+ <h3>Full width of the nested canvas</h3>
197
+ <div style="--column-span: 6">Half of it</div>
198
+ </section>
199
+ </div>
200
+ ```
162
201
 
163
202
  ## Narrow containers
164
203
 
165
204
  Twelve columns is a wide-context tool. With the default `--gap`, a 279px
166
205
  container spends 132px on its eleven gaps and leaves about 12px per unit — a
167
- `.column-span-4` region is 84px wide.
206
+ four-unit region is 84px wide.
168
207
 
169
208
  The framework guarantees the canvas itself never overflows its container: the
170
209
  tracks are `minmax(0, 1fr)` and every child gets `min-inline-size: 0`, so item
@@ -174,10 +213,10 @@ its track. Define a narrow representation where the composition needs one.
174
213
 
175
214
  ## Scope
176
215
 
177
- The primitive is horizontal only. There are no `.row-span-*`, `.area-*`, or
178
- `.order-*` classes, and no breakpoint variants such as `md-column-span-6` —
179
- those would move responsive strategy back into markup. For genuinely
180
- two-dimensional placement, use CSS Grid directly on your own class:
216
+ The primitive is horizontal only. There are no row, area, or order hooks, and no
217
+ breakpoint variants — those would move responsive strategy back into markup.
218
+ For genuinely two-dimensional placement, use CSS Grid directly on your own
219
+ class:
181
220
 
182
221
  ```css
183
222
  .dashboard-summary {
@@ -186,7 +225,7 @@ two-dimensional placement, use CSS Grid directly on your own class:
186
225
  ```
187
226
 
188
227
  The column count is fixed at twelve and is not configurable. Twelve is what
189
- makes the vocabulary shared and lets `6 + 6`, `4 + 4 + 4`, `3 + 3 + 3 + 3`,
228
+ makes the coordinates shared and lets `6 + 6`, `4 + 4 + 4`, `3 + 3 + 3 + 3`,
190
229
  `8 + 4`, and `2 + 8 + 2` all land on the same canvas. For a track system whose
191
230
  sizes carry meaning rather than twelve interchangeable units, use
192
231
  `--grid-columns` on `.grid`.
@@ -194,13 +233,12 @@ sizes carry meaning rather than twelve interchangeable units, use
194
233
  Unlike `.grid-N`, the track template does not read `--gap`, so the gap
195
234
  utilities are exact here at every width.
196
235
 
197
- A region carrying a placement class must generate a box. `display: contents`
198
- removes that box and promotes its descendants to grid items, which leaves the
199
- placement with nothing to apply to.
236
+ A placed region must generate a box. `display: contents` removes that box and
237
+ promotes its descendants to grid items, which leaves the placement with nothing
238
+ to apply to.
200
239
 
201
- ### Classes
240
+ ### Hooks
202
241
 
203
- - `.column-layout` establishes the twelve-column canvas.
204
- - `.column-span-1` … `.column-span-12` set the width in canvas units.
205
- - `.column-start-1` … `.column-start-12` set the starting line, running to the
206
- canvas end unless a span refines it.
242
+ - `--column-span` — width in canvas units, 1 to 12. Unset, a region runs to the
243
+ canvas end.
244
+ - `--column-start` — starting line, 1 to 12. Unset, the region is auto-placed.
@@ -25,4 +25,4 @@ Add `.items-center` to align the leading element with short trailing content. Fo
25
25
  </div>
26
26
  ```
27
27
 
28
- The media object is the underlying pattern of `.blog-author`, `.blog-comment`, and similar compositions in templates. Components can adopt it instead of repeating the grid rule. The [Workspaces example](../examples/overview.md) shows the card pattern: `card > header` with `.media` plus `hgroup`, and row actions in the header — never a third `.media` child.
28
+ The media object is the underlying pattern of `.blog-author`, `.blog-comment`, and similar compositions in templates. Components can adopt it instead of repeating the grid rule. The [Workspaces example](../examples/overview.md#page-shapes) shows the card pattern: `card > header` with `.media` plus `hgroup`, and row actions in the header — never a third `.media` child.
@@ -57,4 +57,4 @@ Prefer a parent `gap` for relationships between peers instead of encoding siblin
57
57
 
58
58
  Before adding a divider or other separating chrome, consider whether additional spacing already expresses the boundary clearly.
59
59
 
60
- Density changes the amount of space available, not the relationships that space communicates. When a composition contains local, group, and section rhythms, preserve their relative hierarchy with nested or local `--gap` values rather than relying on one inherited gap at every level. See [Stack](./stack.md) for the nesting and density mechanics.
60
+ Density changes the amount of space available, not the relationships that space communicates. When a composition contains local, group, and section rhythms, preserve their relative hierarchy with nested or local `--gap` values rather than relying on one inherited gap at every level. See [Choosing a density](./stack.md#choosing-a-density) for the nesting and density mechanics.
@@ -37,7 +37,7 @@ list the two layers as separate tables. Every other utility page is base only.
37
37
  - No color scales such as `.text-primary` or `.bg-success` — intent colors belong to components and state.
38
38
  - No breakpoint utility variants — use container queries or layout primitives.
39
39
  - No utility variants for hover, focus, dark mode, or arbitrary selectors — use component states.
40
- - No full spacing scale with every step and direction — the 17 spacing helpers across the core and extra utilities cover the most common escape hatches.
40
+ - No full spacing scale with every step and direction — the spacing helpers in base and extra cover the common escape hatches and read the inherited rhythm.
41
41
 
42
42
  ## Display escape hatches
43
43
 
@@ -8,6 +8,7 @@ Small layout corrections for controls, labels, and compact rails.
8
8
  | ------------------------- | ------- | ----------------------------------------- |
9
9
  | `.fit` | Utility | Shrinks an element to its content width. |
10
10
  | `.text-nowrap` | Utility | Keeps text on one line. |
11
+ | `.text-wrap` | Utility | Restores wrapping under a nowrap parent. |
11
12
  | `.truncate` | Utility | Ellipsizes overflowing single-line text. |
12
13
  | `.scroller` | Layout | Theme-aware scrollbar density and colour. |
13
14
  | `.scroller.stable-gutter` | Variant | Reserves inline-axis scrollbar gutter. |
@@ -22,9 +23,10 @@ Use `.fit` when a control or element should shrink to its content instead of fil
22
23
  </select>
23
24
  ```
24
25
 
25
- Use `.text-nowrap` to keep text on one line inside a cell or label. To stop a
26
- layout primitive from wrapping — for example to force a `.cluster` onto a single
27
- row — set `--cluster-wrap: nowrap`.
26
+ Use `.text-nowrap` to keep text on one line inside a cell or label, and
27
+ `.text-wrap` to let a long label wrap inside a component that keeps its text on
28
+ one line (`.badge`). To stop a layout primitive from wrapping — for example to
29
+ force a `.cluster` onto a single row — set `--cluster-wrap: nowrap`.
28
30
 
29
31
  ```html demo
30
32
  <div class="cluster compact" style="--cluster-wrap: nowrap;">
package/llms.txt CHANGED
@@ -12,12 +12,13 @@ Actual CSS uses a small public grammar: `.component [intent] [variant] [size] [m
12
12
 
13
13
  `package.json#exports` is the canonical package surface.
14
14
 
15
- - `actual-css` — the minimal core: tokens, theme contract, reset, base elements, and universal variants. Components and layout primitives are NOT included.
16
- - `actual-css/full` — the complete framework: core plus every component, form, layout, typography, effect, and utility family.
15
+ - `actual-css/css` — the source core, the recommended starting point: tokens, theme contract, reset, base elements, and universal variants. Components and layout primitives are NOT included; add them with `actual-css/css/<family>` or `actual-css/css/<family>/<module>`.
16
+ - `actual-css` / `actual-css/full` — the complete compiled framework, for zero-config and CDN use: core plus every component, form, layout, typography, effect, and utility family.
17
17
  - `actual-css/js` — the enhancement-loader entry only: it watches `data-enhance-modules` manifest blocks and imports the declared enhancers on demand.
18
18
  - `actual-css/js/full` — the complete runtime with all built-in enhancers pre-registered.
19
19
  - `actual-css/reserved-classes.json` — machine-readable list of the framework-owned class namespace. Use it to check whether a class belongs to Actual CSS and to validate claimed framework classes; application-specific classes are expected to exist outside this manifest.
20
20
  - `actual-css/components.json` — machine-readable component index, derived from the sources (CSS headers, selectors, package exports, `src/js`) by `scripts/build-catalog.js` and verified by `check:catalog`. Gives each component its import paths, owned classes, hooks, states, and registered enhancement tokens — enough to know what exists and where to read more, not a replacement for `docs/pages/components/*.md`.
21
+ - [Starter agent skill](skills/actual-css/SKILL.md) — a copyable skill for building with Actual CSS (vocabulary, hooks, layouts, enhancements); consuming projects extend it with a local `PROJECT.md`.
21
22
  - Individual families and modules are importable separately (`actual-css/css/components`, `actual-css/css/layout/grid`, `actual-css/js/dialog`, …); see [README](README.md) and [Modular imports](docs/pages/guides/modular-import.md).
22
23
 
23
24
  Forms are the one family with two aggregate entrypoints:
@@ -28,13 +29,32 @@ The composition guides in [README](README.md) and [Progressive Enhancements](doc
28
29
  show supported CSS modules and individual enhancer imports without duplicating
29
30
  the full export list here.
30
31
 
31
- Presentation (`class`) and behavior (`data-enhance`) are separate layers.
32
+ Presentation (`class`) and behavior are separate layers. `data-enhance` takes
33
+ four tokens only — `tabs`, `flyout`, `scrollspy`, `validation`; leaf behaviors
34
+ use their own attribute (`data-tooltip`, `data-mask`, `data-filter`,
35
+ `data-context-menu`) and `<dialog>` needs none. See
36
+ [when a token, when a data-*](docs/design-notes/enhancement-contract.md).
37
+
32
38
  Behaviour primitives are independently importable for building custom widgets,
33
39
  including `enhance`, `surface`, `floating`, `focus-group`, `keys`, `input`,
34
40
  `command`, `menu`, `focus`, `escape`, and `events`. See
35
- [enhancement contract](docs/design-notes/enhancement-contract.md) and
36
41
  [widget primitives](docs/design-notes/widget-primitives.md).
37
42
 
43
+ ## What the vocabulary does not have
44
+
45
+ - No compound intent classes (`.btn-primary`, `.badge-success`): intents and
46
+ variants are separate classes on the component (`.btn primary outline`).
47
+ - No breakpoint or state prefixes (`md:stack`, `hover:…`) and no arbitrary
48
+ values: layout primitives and container queries own responsiveness.
49
+ - No spacing scale (`mt-4`, `p-2`): spacing comes from `--gap`, density
50
+ (`.compact`, `.spacious`), and component hooks.
51
+ - `is-*` classes are written by the runtime, not by authors.
52
+ - Modifiers such as `.ghost`, `.link`, `.flush`, `.raised` only mean something
53
+ on their component; alone they are inert.
54
+
55
+ See [naming](docs/design-notes/naming.md) and
56
+ [utilities non-goals](docs/pages/utilities/overview.md#non-goals).
57
+
38
58
  ## Choosing a page shell
39
59
 
40
60
  Before choosing a content layout, choose the page shell:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "actual-css",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Plain CSS component framework with semantic classes, universal variants, small tokens, theme hooks, and progressive enhancements.",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.4.2",
@@ -26,7 +26,7 @@
26
26
  "progressive-enhancement"
27
27
  ],
28
28
  "exports": {
29
- ".": "./dist/actual.min.css",
29
+ ".": "./dist/actual.full.min.css",
30
30
  "./full": "./dist/actual.full.min.css",
31
31
  "./css": "./src/css/actual.css",
32
32
  "./css/components": "./src/css/components/index.css",
@@ -80,10 +80,9 @@
80
80
  "bin": {
81
81
  "actual-css": "./src/cli/actual-css.js"
82
82
  },
83
- "main": "./dist/actual.js",
84
- "style": "./dist/actual.min.css",
85
- "unpkg": "./dist/actual.min.css",
86
- "jsdelivr": "./dist/actual.min.css",
83
+ "style": "./dist/actual.full.min.css",
84
+ "unpkg": "./dist/actual.full.min.css",
85
+ "jsdelivr": "./dist/actual.full.min.css",
87
86
  "sideEffects": true,
88
87
  "files": [
89
88
  "dist",
@@ -101,6 +100,7 @@
101
100
  "reserved-classes.json",
102
101
  "components.json",
103
102
  "docs",
103
+ "skills",
104
104
  "CHANGELOG.md",
105
105
  "llms.txt",
106
106
  "LICENSE",
@@ -144,6 +144,7 @@
144
144
  "probe": "bun scripts/probe.js",
145
145
  "serve": "bun scripts/serve.js",
146
146
  "check:sync": "bun scripts/check-sync.js",
147
+ "release:notes": "bun scripts/release-notes.js",
147
148
  "test": "bun test",
148
149
  "test:changed": "bun test --changed=master",
149
150
  "build:all": "bun run lint && bun run build:dist && bun run build:js && bun run build:size && bun run format:docs && bun run build:docs && bun run check:docs && bun run check:doc-classes && bun run check:compat && bun run check:css-api && bun run check:color-space && bun run check:architecture && bun run check:enhance && bun run generate:reserved && bun run check:reserved && bun run generate:catalog && bun run check:catalog && bun run check:sync && bun run check:links && bun run check:templates && bun run check:markup && bun run test",
@@ -4,7 +4,6 @@
4
4
  "admonition",
5
5
  "alert",
6
6
  "alert-body",
7
- "alert-dismiss",
8
7
  "alert-icon",
9
8
  "alert-title",
10
9
  "align-self-center",
@@ -43,43 +42,20 @@
43
42
  "chat-header",
44
43
  "chat-start",
45
44
  "check",
45
+ "chip",
46
46
  "choice",
47
47
  "choice-card",
48
48
  "circle",
49
+ "close",
49
50
  "cluster",
50
51
  "color",
51
52
  "column-gap-context",
52
53
  "column-layout",
53
- "column-span-1",
54
- "column-span-10",
55
- "column-span-11",
56
- "column-span-12",
57
- "column-span-2",
58
- "column-span-3",
59
- "column-span-4",
60
- "column-span-5",
61
- "column-span-6",
62
- "column-span-7",
63
- "column-span-8",
64
- "column-span-9",
65
- "column-start-1",
66
- "column-start-10",
67
- "column-start-11",
68
- "column-start-12",
69
- "column-start-2",
70
- "column-start-3",
71
- "column-start-4",
72
- "column-start-5",
73
- "column-start-6",
74
- "column-start-7",
75
- "column-start-8",
76
- "column-start-9",
77
54
  "compact",
78
55
  "container-query",
79
56
  "cursor-pointer",
80
57
  "danger",
81
58
  "data-list",
82
- "dialog-close",
83
59
  "dialog-confirmation",
84
60
  "dialog-icon",
85
61
  "display-block",
@@ -91,7 +67,6 @@
91
67
  "display-none",
92
68
  "dot",
93
69
  "drawer",
94
- "drawer-close",
95
70
  "fab",
96
71
  "fab-action",
97
72
  "fab-actions",
@@ -133,7 +108,6 @@
133
108
  "input",
134
109
  "input-icon",
135
110
  "intent-color",
136
- "inverted",
137
111
  "is-open",
138
112
  "is-static",
139
113
  "items-center",
@@ -239,6 +213,7 @@
239
213
  "sr-only",
240
214
  "stable-gutter",
241
215
  "stack",
216
+ "stacked",
242
217
  "start",
243
218
  "status-bar",
244
219
  "step-complete",
@@ -270,6 +245,7 @@
270
245
  "text-start",
271
246
  "text-title",
272
247
  "text-uppercase",
248
+ "text-wrap",
273
249
  "textarea",
274
250
  "tooltip",
275
251
  "topbar",
@@ -278,6 +254,5 @@
278
254
  "user-select-none",
279
255
  "visibility-hidden",
280
256
  "warning",
281
- "was-validated",
282
- "white-space-normal"
257
+ "was-validated"
283
258
  ]
@@ -0,0 +1,65 @@
1
+ # Project-specific Actual CSS usage
2
+
3
+ Copy this file to `PROJECT.md` beside `SKILL.md` and keep only decisions that are true for this application.
4
+
5
+ This file narrows **how the application uses Actual CSS**. It does not redefine Actual CSS API.
6
+
7
+ ## Imports
8
+
9
+ CSS loaded by this project:
10
+
11
+ ```text
12
+ - TODO
13
+ ```
14
+
15
+ JavaScript enhancers loaded by this project:
16
+
17
+ ```text
18
+ - TODO
19
+ ```
20
+
21
+ ## Theme
22
+
23
+ Theme root / selector:
24
+
25
+ ```text
26
+ TODO
27
+ ```
28
+
29
+ Application-owned brand tokens or theme conventions:
30
+
31
+ ```text
32
+ - TODO
33
+ ```
34
+
35
+ ## Page shell and layout conventions
36
+
37
+ ```text
38
+ - TODO
39
+ ```
40
+
41
+ ## Existing application wrappers
42
+
43
+ List server-side/template components that agents should reuse before writing raw markup.
44
+
45
+ ```text
46
+ - TODO
47
+ ```
48
+
49
+ ## Application CSS conventions
50
+
51
+ ```text
52
+ - TODO
53
+ ```
54
+
55
+ ## Browser policy
56
+
57
+ If stricter than Actual CSS itself:
58
+
59
+ ```text
60
+ TODO
61
+ ```
62
+
63
+ ## Local decisions
64
+
65
+ Add only stable, reusable decisions that materially change implementation choices.
@@ -0,0 +1,64 @@
1
+ # Actual CSS starter skill
2
+
3
+ A small, copyable agent skill for **building with Actual CSS**.
4
+
5
+ It is intentionally not a contributor guide for the Actual CSS repository. Repository development workflow belongs in `AGENTS.md`; this skill teaches consumers how to use the framework without inventing API or duplicating framework behavior.
6
+
7
+ ## Contents
8
+
9
+ ```text
10
+ actual-css/
11
+ ├── SKILL.md
12
+ ├── README.md
13
+ ├── PROJECT.md.example
14
+ ├── references/
15
+ │ ├── accessibility.md
16
+ │ ├── api-and-vocabulary.md
17
+ │ ├── enhancements.md
18
+ │ ├── forms.md
19
+ │ ├── layout-and-theming.md
20
+ │ └── review-checklist.md
21
+ └── scripts/
22
+ └── inspect-actual-css.mjs
23
+ ```
24
+
25
+ ## Recommended distribution
26
+
27
+ Actual CSS can ship this directory as a starter/reference skill. Consuming projects copy it into the location their coding agent uses for skills.
28
+
29
+ The copied skill should remain mostly framework-generic. Application-specific choices belong in a local `PROJECT.md` created from `PROJECT.md.example`.
30
+
31
+ This gives a clean split:
32
+
33
+ ```text
34
+ Actual CSS package/docs/manifests
35
+ -> what exists and how the framework works
36
+
37
+ SKILL.md + references
38
+ -> how an agent should build with it
39
+
40
+ PROJECT.md
41
+ -> how this application chooses to use it
42
+ ```
43
+
44
+ ## Why the skill does not bundle the catalog
45
+
46
+ `components.json`, `reserved-classes.json`, package exports, CSS source, and JS source are intentionally read from the installed Actual CSS version. Copying those files into the skill would create a second, quickly stale API snapshot.
47
+
48
+ The bundled inspector makes common lookups cheap:
49
+
50
+ ```sh
51
+ node /path/to/actual-css/scripts/inspect-actual-css.mjs --source
52
+ node /path/to/actual-css/scripts/inspect-actual-css.mjs button
53
+ node /path/to/actual-css/scripts/inspect-actual-css.mjs --class compact
54
+ node /path/to/actual-css/scripts/inspect-actual-css.mjs --exports
55
+ node /path/to/actual-css/scripts/inspect-actual-css.mjs --enhancements
56
+ ```
57
+
58
+ Set `ACTUAL_CSS_ROOT=/path/to/actual-css` to inspect a specific checkout or installed package.
59
+
60
+ ## Customize, do not fork the framework contract
61
+
62
+ Good project customizations include which modules are loaded, local theme tokens, server/template wrappers, page-shell conventions, browser policy, and application class naming.
63
+
64
+ Do not use the project layer to redefine Actual CSS class meanings, internal runtime state, package exports, or undocumented hooks.