actual-css 0.9.2 → 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 (101) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +65 -44
  3. package/components.json +33 -13
  4. package/dist/actual.full.css +585 -499
  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/enhancements/overview.md +5 -0
  26. package/docs/pages/enhancements/tooltip.md +3 -1
  27. package/docs/pages/examples/overview.md +2 -1
  28. package/docs/pages/forms/choice-cards.md +39 -0
  29. package/docs/pages/forms/combobox.md +23 -11
  30. package/docs/pages/forms/joined-controls.md +2 -5
  31. package/docs/pages/forms/overview.md +6 -0
  32. package/docs/pages/foundations/theming.md +64 -18
  33. package/docs/pages/foundations/tokens.md +28 -10
  34. package/docs/pages/guides/introduction.md +15 -23
  35. package/docs/pages/guides/modular-import.md +53 -6
  36. package/docs/pages/guides/progressive-enhancement.md +6 -3
  37. package/docs/pages/guides/tailwind.md +17 -5
  38. package/docs/pages/layout/column-layout.md +92 -54
  39. package/docs/pages/layout/media.md +1 -1
  40. package/docs/pages/layout/overview.md +1 -1
  41. package/docs/pages/utilities/overview.md +1 -1
  42. package/docs/pages/utilities/sizing-wrapping.md +5 -3
  43. package/llms.txt +24 -4
  44. package/package.json +6 -6
  45. package/reserved-classes.json +5 -30
  46. package/skills/actual-css/PROJECT.md.example +65 -0
  47. package/skills/actual-css/README.md +64 -0
  48. package/skills/actual-css/SKILL.md +234 -0
  49. package/skills/actual-css/references/accessibility.md +44 -0
  50. package/skills/actual-css/references/api-and-vocabulary.md +94 -0
  51. package/skills/actual-css/references/enhancements.md +59 -0
  52. package/skills/actual-css/references/forms.md +49 -0
  53. package/skills/actual-css/references/layout-and-theming.md +82 -0
  54. package/skills/actual-css/references/review-checklist.md +51 -0
  55. package/skills/actual-css/scripts/inspect-actual-css.mjs +171 -0
  56. package/src/css/components/accordion.css +44 -7
  57. package/src/css/components/alert.css +23 -43
  58. package/src/css/components/app-nav.css +9 -0
  59. package/src/css/components/badge.css +11 -39
  60. package/src/css/components/bleed.css +79 -0
  61. package/src/css/components/button.css +6 -17
  62. package/src/css/components/card.css +7 -40
  63. package/src/css/components/close.css +91 -0
  64. package/src/css/components/data-list.css +18 -0
  65. package/src/css/components/drawer.css +15 -56
  66. package/src/css/components/fab.css +10 -0
  67. package/src/css/components/flyout.css +1 -0
  68. package/src/css/components/index.css +2 -0
  69. package/src/css/components/join.css +36 -20
  70. package/src/css/components/menu.css +12 -0
  71. package/src/css/components/modal.css +10 -57
  72. package/src/css/components/navbar.css +27 -0
  73. package/src/css/core/focus.css +9 -3
  74. package/src/css/core/theme.css +25 -43
  75. package/src/css/core/tokens.css +1 -1
  76. package/src/css/core/variants.css +3 -33
  77. package/src/css/forms/choice-card.css +74 -4
  78. package/src/css/forms/choice.css +2 -3
  79. package/src/css/forms/control.css +15 -8
  80. package/src/css/forms/custom-select.css +4 -4
  81. package/src/css/forms/native.css +4 -4
  82. package/src/css/forms/range.css +23 -8
  83. package/src/css/forms/switch.css +2 -3
  84. package/src/css/layout/app-layout.css +1 -1
  85. package/src/css/layout/column-layout.css +26 -111
  86. package/src/css/utilities/extra.css +7 -6
  87. package/src/js/dialog.js +95 -24
  88. package/src/js/enhance.js +7 -3
  89. package/src/js/escape.js +1 -0
  90. package/src/js/flyout.js +10 -1
  91. package/src/js/focus-group.js +2 -1
  92. package/src/js/keys.js +14 -0
  93. package/src/js/menu.js +2 -1
  94. package/src/js/status.js +19 -0
  95. package/src/js/surface.js +12 -8
  96. package/src/js/tab.js +2 -1
  97. package/src/js/tooltip.js +18 -1
  98. package/src/js/validation.js +5 -6
  99. package/dist/actual.css +0 -876
  100. package/dist/actual.js +0 -1
  101. package/dist/actual.min.css +0 -1
package/CHANGELOG.md CHANGED
@@ -2,9 +2,105 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.10.0] - 2026-09-25
6
+
7
+ ### Breaking changes
8
+
9
+ - `.inverted` is removed: it mixed a contrasting surface with theme inversion while remapping only part of the palette. Use a `data-theme` island for a complete light/dark subtree, or paint a local band in application CSS.
10
+ - `.white-space-normal` is renamed `.text-wrap`, the counterpart of `.text-nowrap`.
11
+ - `.dialog-close`, `.drawer-close`, and `.alert-dismiss` are replaced by the shared `.close` (`components/close.css`); a modular build imports it next to its host.
12
+ - A removable badge needs `<button class="close">`: a bare `.badge > button` is no longer styled, and an empty one no longer paints an X.
13
+ - `--alert-dismiss-size` and `--badge-dismiss-icon-size` are replaced by `--close-size` / `--close-icon-size`.
14
+ - The dialog corner applies to a `.close` that is a direct child of the dialog, of its `form` or `header`, or of a `form` inside that header.
15
+ - `getSurfaceAutoClose` is removed from `surface.js`: it had no caller, and the code that opens a surface passes its own `autoClose`.
16
+ - `.column-span-1…12` and `.column-start-1…12` are replaced by the `--column-span` / `--column-start` hooks on each `.column-layout` child.
17
+ - The bare `actual-css` entrypoint resolves to the complete compiled framework, like `actual-css/full`, `style`, `unpkg`, and `jsdelivr`; import `actual-css/css` for the core alone.
18
+ - `package.json#main` is removed.
19
+ - `dist/actual.css` and `dist/actual.min.css` are no longer built or published; compose the core from `actual-css/css`.
20
+ - `dist/actual.js` (the compiled loader alone) is no longer built or published; bundle your own entry from `actual-css/js` and `actual-css/js/*`.
21
+ - `.input`, `.textarea`, `.select`, and an open custom select draw a `--focus-ring-width` inset outline in `--focus` instead of a focus border plus outer halo.
22
+ - `.join` no longer moves a field's focus ring onto the group: each segment keeps its own indicator.
23
+ - `.btn`, `.close`, `.check`, `.radio`, `.switch`, `.choice-card`, `.file`, and `.color` draw a solid `--focus-ring-width` line in `--focus` at `--focus-outline-offset` instead of a translucent halo.
24
+ - `.range` thumb focus ring is solid `--focus` instead of `--focus-ring`.
25
+ - `--focus-ring` and `--focus-ring-shadow` are removed; every focus indicator reads `--focus`.
26
+ - `--btn-focus-color` and `--btn-focus-ring-color` are removed: a button's focus color no longer follows its intent.
27
+ - `.check`, `.radio`, and `.switch` keep their resting border on focus instead of switching it to `--focus`.
28
+ - The default `--focus` is `hsl(268 30% 55%)` in both schemes instead of `var(--neutral)`: a primary-hued mid-tone that holds 3:1 against `--surface` and `--surface-solid`.
29
+ - `--focus-ring-width` is `2px` instead of `3px`, and `3px` instead of `4px` under `prefers-contrast: more`.
30
+ - `bootstrap-v6` sets `--focus: #3d8bfd` and `--focus-ring-width: 3px` instead of its own ring recipe.
31
+
32
+ ### Added
33
+
34
+ - `.bleed` is a shared surface contract: `src/css/components/bleed.css` reads the relayed `--surface-pad`, so a direct child of a `.drawer` or of an accordion panel escapes its inset like a card child already did.
35
+ - `--accordion-pad` hook: the summary row and the panel no longer hard-code their inset, and the panel relays it so `.accordion.separated` items accept a `.bleed` child.
36
+ - `--accordion-marker-size` hook.
37
+ - `.data-list.stacked`: the value sits under its term instead of beside it.
38
+ - `--bleed-pad` is a public read-only hook: `padding: var(--bleed-pad)` pads a `.bleed` band that is not a header, footer, or figure.
39
+ - `.join` supports a control nested one wrapper level deep (e.g. a combobox element): the wrapper carries the group corners and primary-edge `z-index`, the inner control inherits the radius, and no widget is named.
40
+ - `.nav-link` works on a `<button>`: UA button chrome is neutralized with `<a>`-identical metrics.
41
+ - `material` demo theme: Material 3 baseline palette, filled underline fields and addons whose focus thickens the bottom line, pill buttons, and a joined outline action drawn as one more filled segment.
42
+ - `.choice-card.chip`: compact pill form for filter chips and selectable tags, with a leading dot that turns into the check without moving the label.
43
+ - `--choice-chip-dot` is a read-only hook on the chip's `::before`: the check-slot centre, so a theme can grow the dot's `circle()` clip into a selected fill.
44
+ - The `material` theme grows the chip dot into a tonal fill.
45
+ - The `gradient` theme demos the outer-halo field focus; `bootstrap-v6` and `edge` have no field focus override.
46
+ - `demo/templates/contrast-contexts.html`: the page, `data-theme` islands, a card island, a named theme and an application-painted band with every intent variant, a form, a combobox, a date picker and focus lines measured live, plus a `.join` gallery with no focus adaptation.
47
+
48
+ ### Fixed
49
+
50
+ - `dialog.js` only backdrop-dismisses when the press started on the backdrop: a text selection released over the backdrop no longer closes (or shakes) the dialog.
51
+ - `dialog.js` restores the horizontal scroll position on open, not just the vertical one.
52
+ - `tab.js`, `focus-group.js`, `menu.js`, and the flyout trigger ignore IME-composed and ctrl/alt/meta-modified keys; `escape.js` ignores composition too.
53
+ - `status.js` restores its bar when the host dialog was removed from the DOM (htmx/Turbo swap): the next `status()` heals instead of no-opping forever.
54
+ - `tooltip.js` resynchronizes shorthand `data-tooltip` text on every show, so a "Copy" → "Copied!" update displays without rewiring.
55
+ - The text of a visible shorthand tip updates on the next show, never mid-flight.
56
+ - `flyout.js` sets `aria-haspopup="menu"` only for a true `role="menu"` panel: `<menu>` carries the implicit list role.
57
+ - `dialog.js` respects `closedby="none"` on `cancel` when `HTMLDialogElement.closedBy` is unavailable, while explicit close requests still work.
58
+ - `dialog.js` restores generated ARIA attributes, title IDs, and rewritten `closedby` values on disconnect without overwriting author changes.
59
+ - A last `.bleed` child of an accordion panel had square corners over the rounded `.separated` item or the group's last item.
60
+ - `applyEnhancement("validation", …)` did not wire an already-connected form: `validation.js` now registers through `registerEnhancement`.
61
+ - `--app-nav-side-size` was invisible to `check:css-api` (header read `Public hook:`).
62
+ - A custom `data-theme` on `<html>` kept the default palette's `--*-soft-fg` calibration instead of resetting it, so the same theme resolved a different soft ink on `<html data-theme>` than on a nested island.
63
+ - `.nav-link` hover/current and `.app-nav` hover fill with a tint of their own ink and follow `--ui-fg`, so they read on a bar with its own `--ui-bg`.
64
+ - `.flyout` owns `color: var(--text)`, like modal and drawer.
65
+ - Preset themes: every `--focus` is a mid-tone that holds 3:1 on `--surface` and `--surface-solid`, and a `--soft-fg-mix` keeps every soft ink at 4.5:1 (`report:theme-contrast` lists no failing pair).
66
+ - `report:theme-contrast` measures `.badge.soft` explicitly, so a preset that fills badges by default (`bootstrap-v6`) is no longer reported against a solid pair.
67
+ - `ocean` theme: light `--danger` darkened (solid text 4.1:1 → 5.2:1), `--soft-fg-mix: 50%` (soft inks from 2.0–4.3:1 to ≥ 4.8:1), and a mid-tone `--focus` that holds 3:1 on both surfaces.
68
+ - `.join-addon` honours `--control-border-block-end-color` / `-width` like text controls, so a theme's underline or accent edge reaches the addon segment.
69
+ - `gradient` theme: the focus halo follows validation (`--form-invalid-border`), and it and `material` restyle the open customizable select with their field focus instead of the core `:open` outline.
70
+ - `--dialog-focus-bleed` and `--drawer-focus-bleed` reserve `max(--focus-ring-width, 2 × --border-width)` past the offset, so a 3px component line (`bootstrap-v6`) is no longer clipped by 1px in a scrollable modal or drawer body.
71
+ - A focused field in `.join` stacks above an adjacent field (`z-index: 4` rule now follows the primary-edge rule), so the neighbour no longer covers its shared edge.
72
+ - A field wrapped one level deep in `.join` fills its stretched wrapper (`block-size: 100%`) instead of stopping short of a taller sibling.
73
+ - Focus indicators on a `--surface-solid` band and on a card nested in it hold 3:1 (a primary button's ring measured 1.1:1, a neutral one in a nested card 1.0:1).
74
+
5
75
  ### Documentation and tooling
6
76
 
77
+ - Combobox: the bridge recipe targets `@lekoala/combobox` 0.5.0, replaces its halo with the field inset outline, reads `--form-invalid-border`, and inherits `.join` corners.
78
+ - `tests/browser/field-focus.test.js` asserts the field outline stays inside the border box (default and `prefers-contrast`) and that `--focus` holds 3:1 on `--surface` and `--surface-solid` in both schemes.
79
+ - `bun run report:theme-contrast` also reports each preset's `--focus` against `--surface` and `--surface-solid`.
80
+ - Theming: "Make a dark (or light) section" replaces the `.inverted` recipe — a `data-theme` island for a whole context, application CSS for a painted band.
81
+ - Button: a dark button (formerly `.btn.inverted`) is a custom intent, `--intent: var(--surface-solid)` / `--intent-fg: var(--surface)`.
82
+ - `demo/templates/surfaces.html` is removed; `contrast-contexts.html` covers surface boundaries.
83
+ - `tests/browser/inverted.test.js` becomes `surface-context.test.js`, on an application-painted band.
7
84
  - Pushing a version tag publishes the GitHub release: `.npmrc` keeps `npm version` on the bare tag format, `bun run release:notes` extracts (and validates) the dated changelog section, and the CI `release` job attaches `dist/`.
85
+ - Theming: a "Replace the palette with my own brand" entry names the tinted neutrals and soft-ink tokens a partial override leaves behind, and points at the minimal recolor set.
86
+ - Tokens: the minimal recolor theme includes `--shadow-color`.
87
+ - Tokens: a "Where a token is declared" section separates global, component-scoped, and relay properties, and shows the `var(--card-pad, <default>)` form for reading a component hook from outside.
88
+ - Button: `--ui-bg` is the lever for an opaque fill under an intent-colored border, which no shared variant expresses; the rule must load after Actual CSS.
89
+ - Accordion: the marker is a masked box, so a decorated marker needs a real element — the opt-out recipe paints the chevron and keeps the hover and forced-colors behavior.
90
+ - `llms.txt` lists the four `data-enhance` tokens and what the vocabulary does not have (compound intents, breakpoint prefixes, spacing scale, `is-*`, standalone modifiers).
91
+ - `parseHookSections` throws on a near-miss section label (`Public hook:`) instead of silently dropping the hooks under it.
92
+ - `components.json`: an entry no longer lists another component's class it only styles (`bleed` → `card`), and `plumbingHooks` carries the "Framework plumbing:" section.
93
+ - Progressive enhancement guide: built-in `data-*` behaviors expose no `refresh()`; insert the element with its attribute set.
94
+ - `utilities/extra.css` header no longer calls extra utilities non-API.
95
+ - `skills/actual-css/`: a copyable starter agent skill for building with Actual CSS, shipped in the package and pointed to from the README and `llms.txt`.
96
+ - Install docs lead with modular source imports; the full bundle is the zero-config and CDN option.
97
+ - Modular import guide: "Start from the full entry" copies `actual.full.css` / `full.js` into the app and prunes them, and names the three shared CSS modules (`close`, `bleed`, `spinner`).
98
+ - Tailwind v4 guide: explicit layer order plus the `--font-sans` / `--font-mono` / `--font-weight-*` / `--radius-*` token collisions.
99
+ - Choice cards: the CSS hooks list `--choice-card-border`, `--choice-card-bg`, and `--choice-chip-dot`.
100
+ - `tests/browser/choice-chip.test.js` asserts the chip label never moves on check, the native inputs stay the controls, Tab focus draws the outer ring, and forced colors keep checked distinct.
101
+ - Theming: a `data-theme` island paints nothing; give it a surface, and put it on a wrapper rather than a `<fieldset>`, whose legend straddles the border.
102
+ - `demo/scripts/theme-picker.js`: every demo page uses one `<theme-picker>` fed by a single theme list, replacing 30 hand-copied selects and `admini-theme.js`.
103
+ - `check:templates` fails when `theme-picker.js` drifts from `src/css/themes/index.css` or a page hand-copies a theme list.
8
104
 
9
105
 
10
106
  ## [0.9.2] - 2026-09-22
package/README.md CHANGED
@@ -14,42 +14,46 @@ prefix transform.
14
14
  npm install actual-css
15
15
  ```
16
16
 
17
- Import the full framework in your CSS:
17
+ ### Import what you use
18
18
 
19
- ```css
20
- @import "actual-css/full";
21
- ```
22
-
23
- `actual-css/full` ships every functional family. The bare `actual-css` entrypoint is the minimal core (reset, tokens, theme, base, intents, variants, focus, print).
24
-
25
- Or import only the pieces you use:
19
+ Copy the package's `src/css/actual.full.css` into your project as your entry,
20
+ rewrite its relative imports to package paths, and delete what you do not need
21
+ — see [Start from the full entry](docs/pages/guides/modular-import.md#start-from-the-full-entry):
26
22
 
27
23
  ```css
28
- @import "actual-css/css";
24
+ @import "actual-css/css"; /* core */
29
25
  @import "actual-css/css/layout";
26
+ @import "actual-css/css/forms/all";
30
27
  @import "actual-css/css/components/button";
31
28
  @import "actual-css/css/components/card";
32
- @import "actual-css/css/forms";
33
- @import "actual-css/css/components/flyout";
34
29
  @import "actual-css/css/utilities";
35
30
  ```
36
31
 
37
- `actual-css/css` is the minimal core. Family manifests (`css/layout`,
38
- `css/components`, `css/typography`, `css/effects`, `css/utilities`) and
39
- their modules map one-to-one to `src/css/`; `css/forms` is the exception —
40
- it points at the native-controls base, with `css/forms/all` exposing the
41
- complete Forms family. See the
42
- [modular import guide](docs/pages/guides/modular-import.md) for the full map.
43
-
44
- For a flattened custom bundle, import the source entrypoints you want from
45
- `actual-css/css` and run `npx actual-css bundle src/app.css --out public/app.css --minify`.
46
- The CLI resolves package subpaths and relative files, then inlines them without
32
+ `actual-css/css` is the core (reset, tokens, theme, base, intents, variants,
33
+ focus, print). Family manifests (`css/layout`, `css/components`,
34
+ `css/typography`, `css/effects`, `css/utilities`) and their modules map
35
+ one-to-one to `src/css/`; `css/forms` is the exception — it points at the
36
+ native-controls base, with `css/forms/all` exposing the complete Forms family.
37
+ See the [modular import guide](docs/pages/guides/modular-import.md#family-manifests)
38
+ for the full map.
39
+
40
+ Flatten the composition for production with
41
+ `npx actual-css bundle src/app.css --out public/app.css --minify`. The CLI
42
+ resolves package subpaths and relative files, then inlines them without
47
43
  transpiling modern CSS.
48
44
 
49
- You can also use the compiled full bundle directly:
45
+ ### Full bundle (zero-config)
46
+
47
+ The bare `actual-css` entrypoint and `actual-css/full` both resolve to the
48
+ complete compiled framework — useful for prototypes, CDN usage, or when bundle
49
+ size is not worth optimizing:
50
+
51
+ ```css
52
+ @import "actual-css/full";
53
+ ```
50
54
 
51
55
  ```html
52
- <link rel="stylesheet" href="actual.full.min.css">
56
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/actual-css@0.10/dist/actual.full.min.css">
53
57
  ```
54
58
 
55
59
  ## Usage
@@ -65,7 +69,7 @@ Add classes to your HTML. Components define the structure, variants change the s
65
69
 
66
70
  Intents such as `.primary`, `.secondary`, `.success`, `.warning`, and `.danger` work across components.
67
71
 
68
- Variants such as `.solid`, `.soft`, `.outline`, and `.surface` are shared by components like buttons, badges, alerts, and cards. `.inverted` is a shared surface modifier: it paints any block with the inverse surface. `.ghost` and `.link` are button-only variants.
72
+ Variants such as `.solid`, `.soft`, `.outline`, and `.surface` are shared by components like buttons, badges, alerts, and cards. A dark or light section is a `data-theme` island. `.ghost` and `.link` are button-only variants.
69
73
 
70
74
  Size variants `.sm` and `.lg` scale typography and participating component
71
75
  geometry consistently. Density contexts `.compact` and `.spacious` change
@@ -80,7 +84,7 @@ Actual CSS uses a small unprefixed class grammar:
80
84
  .component [intent] [variant] [size] [modifier]
81
85
  ```
82
86
 
83
- Components, layout helpers, form helpers, and utilities claim their documented class names. Intents are `.primary`, `.secondary`, `.success`, `.warning`, and `.danger`; shared variants are `.solid`, `.soft`, `.outline`, and `.surface`; `.inverted` is a shared surface modifier; button-only variants are `.ghost` and `.link`; shared sizes are `.sm` and `.lg`; density contexts are `.compact` and `.spacious`.
87
+ Components, layout helpers, form helpers, and utilities claim their documented class names. Intents are `.primary`, `.secondary`, `.success`, `.warning`, and `.danger`; shared variants are `.solid`, `.soft`, `.outline`, and `.surface`; button-only variants are `.ghost` and `.link`; shared sizes are `.sm` and `.lg`; density contexts are `.compact` and `.spacious`.
84
88
 
85
89
  Undocumented `is-*` classes are runtime internals.
86
90
 
@@ -108,8 +112,8 @@ The family manifests are the module catalog: `core`, `layout`, `typography`,
108
112
  `forms`, `components`, `effects`, and `utilities` under `src/css/`, each with
109
113
  an `index.css` manifest and per-module files. Import a manifest to get the
110
114
  family, or a single file for one module. See the
111
- [modular import guide](docs/pages/guides/modular-import.md) for the full map
112
- of module names to import paths.
115
+ [modular import guide](docs/pages/guides/modular-import.md#family-manifests)
116
+ for the full map of module names to import paths.
113
117
 
114
118
  ## JavaScript enhancers
115
119
 
@@ -117,32 +121,38 @@ Some components can be enhanced with JavaScript: dialog/drawer, flyout, tooltip,
117
121
 
118
122
  Presentation (`class`) and behaviour (`data-enhance`) are separate layers — import any primitive independently to build custom widgets. See [enhancement contract](docs/design-notes/enhancement-contract.md) and [widget primitives](docs/design-notes/widget-primitives.md).
119
123
 
120
- Use the full module:
124
+ Two ways to load it — pick one, never both, since each copy owns its own
125
+ registries:
121
126
 
122
- ```html
123
- <script src="actual.full.js" type="module"></script>
124
- ```
127
+ * **Full runtime, zero-config** — every built-in enhancer, compiled:
125
128
 
126
- Or import only the enhancers you need:
129
+ ```html
130
+ <script src="https://cdn.jsdelivr.net/npm/actual-css@0.10/dist/actual.full.js" type="module"></script>
131
+ ```
127
132
 
128
- ```js
129
- import "actual-css/js/dialog";
130
- import "actual-css/js/flyout";
131
- import "actual-css/js/filter";
132
- import "actual-css/js/mask";
133
- import "actual-css/js/tooltip";
134
- ```
133
+ * **Your own build** — copy the package's `src/js/full.js` as your entry,
134
+ rewrite its imports to package paths, keep the enhancers you need, and
135
+ bundle it with your app:
136
+
137
+ ```js
138
+ import "actual-css/js"; // enhancement-manifest loader (optional)
139
+ import "actual-css/js/dialog";
140
+ import "actual-css/js/flyout";
141
+ import "actual-css/js/tooltip";
142
+ ```
135
143
 
136
- The package does not maintain separate partial bundles. Modular entrypoints map to source files, so each project can compose the framework shape it needs. To customize the full runtime, comment the imports you do not want in `src/js/full.js` and rebuild the JavaScript bundle. JavaScript modules are safe to import during server-side rendering; outside a browser, registration is a no-op.
144
+ Modular entrypoints map to source files and import `@lekoala/floating` as a bare specifier, so they need a bundler or an import map. JavaScript modules are safe to import during server-side rendering; outside a browser, registration is a no-op.
137
145
 
138
- For project-specific behavior, use `actual-css/js/enhance` and the small input helpers rather than patching built-in modules. See [Progressive Enhancements](docs/pages/enhancements/overview.md) for custom filters, textarea autogrow, ajax forms, and htmx-like patterns.
146
+ For project-specific behavior, use `actual-css/js/enhance` and the small input helpers rather than patching built-in modules. See the [progressive enhancement guide](docs/pages/guides/progressive-enhancement.md#extending-the-runtime) for custom filters, textarea autogrow, ajax forms, and htmx-like patterns.
139
147
 
140
148
  ## Distribution
141
149
 
142
- * `dist/actual.css` — readable core CSS.
143
- * `dist/actual.min.css` — the core, minified for production.
144
150
  * `dist/actual.full.css` — readable full-bundle CSS (every family).
145
- * `dist/actual.full.min.css` — the full bundle, minified for production.
151
+ * `dist/actual.full.min.css` — the full bundle, minified (`actual-css`, `actual-css/full`).
152
+ * `dist/actual.full.js` — the complete runtime, every built-in enhancer registered.
153
+
154
+ Only the full framework is compiled. To compose, import the sources:
155
+ `actual-css/css/*` for CSS, `actual-css/js/*` for JavaScript.
146
156
 
147
157
  Modern syntax such as `light-dark()`, `color-mix()`, `@container`, `:has()`, `100dvh`, and `100vi` is preserved in the distributed files.
148
158
 
@@ -179,6 +189,17 @@ Actual CSS is layer-compatible, not layer-dependent. The default `actual.css` fi
179
189
 
180
190
  Actual CSS uses AI-assisted tooling for code generation, refactoring, and debugging. Patterns and architecture come from hand-written prototypes and iterative human-driven refinement. AI output is reviewed, tested, and owned by the maintainer.
181
191
 
192
+ ## Coding agents
193
+
194
+ Actual CSS ships a starter agent skill under [`skills/actual-css/`](skills/actual-css/).
195
+
196
+ It teaches coding agents how to use the framework's vocabulary, public hooks,
197
+ layout primitives and progressive enhancements without recreating framework
198
+ behavior in application CSS.
199
+
200
+ Copy it into your project's agent skills and extend it with your application's
201
+ theme, loaded modules and local conventions.
202
+
182
203
  ## License
183
204
 
184
205
  MIT
package/components.json CHANGED
@@ -10,7 +10,9 @@
10
10
  ],
11
11
  "publicHooks": [
12
12
  "--accordion-radius",
13
- "--accordion-marker-color"
13
+ "--accordion-pad",
14
+ "--accordion-marker-color",
15
+ "--accordion-marker-size"
14
16
  ],
15
17
  "states": [
16
18
  "open"
@@ -34,7 +36,6 @@
34
36
  "classes": [
35
37
  "admonition",
36
38
  "alert",
37
- "alert-dismiss",
38
39
  "callout"
39
40
  ],
40
41
  "publicHooks": [
@@ -43,7 +44,6 @@
43
44
  "--alert-font-size",
44
45
  "--alert-radius",
45
46
  "--alert-icon-size",
46
- "--alert-dismiss-size",
47
47
  "--alert-border-inline-start-color",
48
48
  "--alert-border-inline-start-width"
49
49
  ],
@@ -53,8 +53,7 @@
53
53
  "--alert-default-border",
54
54
  "--alert-bg",
55
55
  "--alert-fg",
56
- "--alert-border",
57
- "--alert-dismiss-icon-size"
56
+ "--alert-border"
58
57
  ]
59
58
  },
60
59
  {
@@ -114,8 +113,7 @@
114
113
  "--badge-font-size",
115
114
  "--badge-icon-size",
116
115
  "--badge-dot-size",
117
- "--badge-radius",
118
- "--badge-dismiss-icon-size"
116
+ "--badge-radius"
119
117
  ],
120
118
  "internalHooks": [
121
119
  "--badge-default-bg",
@@ -132,6 +130,20 @@
132
130
  "disabled"
133
131
  ]
134
132
  },
133
+ {
134
+ "name": "bleed",
135
+ "source": "src/css/components/bleed.css",
136
+ "cssImport": "actual-css/css/components/bleed",
137
+ "classes": [
138
+ "bleed"
139
+ ],
140
+ "publicHooks": [
141
+ "--bleed-pad"
142
+ ],
143
+ "plumbingHooks": [
144
+ "--surface-pad"
145
+ ]
146
+ },
135
147
  {
136
148
  "name": "breadcrumb",
137
149
  "source": "src/css/components/breadcrumb.css",
@@ -172,7 +184,6 @@
172
184
  "--btn-min-size",
173
185
  "--btn-pad-x",
174
186
  "--btn-radius",
175
- "--btn-focus-color",
176
187
  "--btn-gap",
177
188
  "--btn-hover-overlay",
178
189
  "--btn-default-bg",
@@ -185,7 +196,6 @@
185
196
  "--btn-fg",
186
197
  "--btn-border",
187
198
  "--btn-default-hover-bg",
188
- "--btn-focus-ring-color",
189
199
  "--btn-border-block-end-color",
190
200
  "--btn-border-block-end-width",
191
201
  "--spinner-width"
@@ -243,12 +253,25 @@
243
253
  "--chat-bubble-border"
244
254
  ]
245
255
  },
256
+ {
257
+ "name": "close",
258
+ "source": "src/css/components/close.css",
259
+ "cssImport": "actual-css/css/components/close",
260
+ "classes": [
261
+ "close"
262
+ ],
263
+ "publicHooks": [
264
+ "--close-size",
265
+ "--close-icon-size"
266
+ ]
267
+ },
246
268
  {
247
269
  "name": "data-list",
248
270
  "source": "src/css/components/data-list.css",
249
271
  "cssImport": "actual-css/css/components/data-list",
250
272
  "classes": [
251
- "data-list"
273
+ "data-list",
274
+ "stacked"
252
275
  ]
253
276
  },
254
277
  {
@@ -257,7 +280,6 @@
257
280
  "cssImport": "actual-css/css/components/drawer",
258
281
  "classes": [
259
282
  "drawer",
260
- "drawer-close",
261
283
  "is-static"
262
284
  ],
263
285
  "publicHooks": [
@@ -430,7 +452,6 @@
430
452
  "source": "src/css/components/modal.css",
431
453
  "cssImport": "actual-css/css/components/modal",
432
454
  "classes": [
433
- "dialog-close",
434
455
  "dialog-confirmation",
435
456
  "dialog-icon",
436
457
  "had-scrollbar",
@@ -446,7 +467,6 @@
446
467
  "--dialog-icon-glyph-size"
447
468
  ],
448
469
  "internalHooks": [
449
- "--dialog-close-icon-size",
450
470
  "--dialog-focus-bleed",
451
471
  "--dialog-viewport-block",
452
472
  "--dialog-viewport-gap-default",