@vanelsas/baredom 4.0.0-alpha.0 → 4.0.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 (162) hide show
  1. package/CHANGELOG.md +342 -6
  2. package/README.md +23 -10
  3. package/custom-elements.json +17352 -4514
  4. package/dist/baredom.d.ts +92 -94
  5. package/dist/baremirror-alpha.js +25 -0
  6. package/dist/base.js +700 -605
  7. package/dist/integrity.json +113 -113
  8. package/dist/requests.d.ts +3 -0
  9. package/dist/requests.js +35 -0
  10. package/dist/x-alert.js +17 -17
  11. package/dist/x-avatar-group.js +10 -9
  12. package/dist/x-avatar.js +14 -14
  13. package/dist/x-badge.js +9 -9
  14. package/dist/x-bento-grid.d.ts +5 -0
  15. package/dist/x-bento-grid.js +6 -5
  16. package/dist/x-bento-item.d.ts +3 -0
  17. package/dist/x-bento-item.js +4 -4
  18. package/dist/x-breadcrumbs.d.ts +6 -5
  19. package/dist/x-breadcrumbs.js +16 -14
  20. package/dist/x-button.d.ts +4 -0
  21. package/dist/x-button.js +1 -1
  22. package/dist/x-calendar.js +42 -39
  23. package/dist/x-cancel-dialogue.js +16 -14
  24. package/dist/x-card.d.ts +4 -0
  25. package/dist/x-card.js +7 -7
  26. package/dist/x-carousel.js +37 -35
  27. package/dist/x-chart.d.ts +2 -0
  28. package/dist/x-chart.js +48 -47
  29. package/dist/x-checkbox.d.ts +11 -4
  30. package/dist/x-checkbox.js +1 -1
  31. package/dist/x-chip.js +1 -1
  32. package/dist/x-code.js +29 -27
  33. package/dist/x-collapse.js +11 -11
  34. package/dist/x-color-picker.d.ts +7 -0
  35. package/dist/x-color-picker.js +48 -46
  36. package/dist/x-combobox.d.ts +12 -4
  37. package/dist/x-combobox.js +36 -30
  38. package/dist/x-command-palette.d.ts +9 -1
  39. package/dist/x-command-palette.js +32 -28
  40. package/dist/x-confetti.js +24 -24
  41. package/dist/x-container.d.ts +4 -0
  42. package/dist/x-container.js +6 -5
  43. package/dist/x-context-menu.js +20 -20
  44. package/dist/x-copy.js +1 -1
  45. package/dist/x-currency-field.d.ts +5 -0
  46. package/dist/x-currency-field.js +26 -24
  47. package/dist/x-date-picker.d.ts +20 -2
  48. package/dist/x-date-picker.js +46 -39
  49. package/dist/x-divider.js +9 -10
  50. package/dist/x-drag-panel.d.ts +45 -0
  51. package/dist/x-drag-panel.js +37 -0
  52. package/dist/x-drawer.js +12 -11
  53. package/dist/x-drop-zone.d.ts +49 -0
  54. package/dist/x-drop-zone.js +12 -0
  55. package/dist/x-dropdown.js +12 -12
  56. package/dist/x-fieldset.js +6 -6
  57. package/dist/x-file-download.d.ts +4 -0
  58. package/dist/x-file-download.js +15 -7
  59. package/dist/x-file-upload.d.ts +10 -5
  60. package/dist/x-file-upload.js +27 -23
  61. package/dist/x-floating-panel.d.ts +50 -0
  62. package/dist/x-floating-panel.js +25 -0
  63. package/dist/x-form-field.d.ts +11 -1
  64. package/dist/x-form-field.js +18 -15
  65. package/dist/x-form.js +10 -11
  66. package/dist/x-gaussian-blur.js +13 -14
  67. package/dist/x-grid.d.ts +9 -0
  68. package/dist/x-grid.js +8 -6
  69. package/dist/x-i18n-provider.js +7 -7
  70. package/dist/x-i18n.js +4 -4
  71. package/dist/x-icon.js +7 -7
  72. package/dist/x-image.js +19 -17
  73. package/dist/x-kbd.js +16 -16
  74. package/dist/x-kinetic-canvas.js +26 -26
  75. package/dist/x-kinetic-font.js +27 -27
  76. package/dist/x-kinetic-typography.js +35 -35
  77. package/dist/x-liquid-dock.js +34 -34
  78. package/dist/x-liquid-fill.js +42 -42
  79. package/dist/x-liquid-glass.js +42 -41
  80. package/dist/x-menu-item.js +9 -8
  81. package/dist/x-menu.js +10 -10
  82. package/dist/x-metaball-cursor.js +23 -23
  83. package/dist/x-modal.js +13 -12
  84. package/dist/x-morph-stack.js +38 -37
  85. package/dist/x-multi-combobox.d.ts +13 -5
  86. package/dist/x-multi-combobox.js +42 -36
  87. package/dist/x-navbar.js +16 -15
  88. package/dist/x-neural-glow.js +31 -30
  89. package/dist/x-notification-center.js +9 -9
  90. package/dist/x-organic-divider.js +18 -18
  91. package/dist/x-organic-progress.js +35 -35
  92. package/dist/x-organic-shape.js +13 -14
  93. package/dist/x-otp-input.d.ts +5 -0
  94. package/dist/x-otp-input.js +23 -22
  95. package/dist/x-pagination.js +16 -14
  96. package/dist/x-particle-button.d.ts +10 -1
  97. package/dist/x-particle-button.js +55 -51
  98. package/dist/x-popover.js +28 -27
  99. package/dist/x-progress-circle.js +8 -9
  100. package/dist/x-progress.js +8 -8
  101. package/dist/x-proximity-list.js +20 -20
  102. package/dist/x-radio.d.ts +10 -3
  103. package/dist/x-radio.js +13 -11
  104. package/dist/x-range-slider.d.ts +7 -0
  105. package/dist/x-range-slider.js +31 -28
  106. package/dist/x-rating.d.ts +7 -0
  107. package/dist/x-rating.js +25 -23
  108. package/dist/x-ripple-effect.js +10 -10
  109. package/dist/x-scroll-parallax.js +17 -17
  110. package/dist/x-scroll-stack.js +17 -17
  111. package/dist/x-scroll-story.js +33 -33
  112. package/dist/x-scroll-timeline.js +46 -46
  113. package/dist/x-scroll.js +39 -38
  114. package/dist/x-search-field.d.ts +10 -3
  115. package/dist/x-search-field.js +1 -1
  116. package/dist/x-select.d.ts +12 -2
  117. package/dist/x-select.js +1 -1
  118. package/dist/x-sidebar.d.ts +4 -0
  119. package/dist/x-sidebar.js +17 -18
  120. package/dist/x-skeleton-group.js +13 -12
  121. package/dist/x-skeleton.js +1 -1
  122. package/dist/x-slider.d.ts +7 -0
  123. package/dist/x-slider.js +17 -16
  124. package/dist/x-soft-body.js +20 -20
  125. package/dist/x-spacer.js +4 -4
  126. package/dist/x-spinner.js +4 -4
  127. package/dist/x-splash.js +13 -12
  128. package/dist/x-split-pane.js +15 -15
  129. package/dist/x-spotlight-card.js +13 -12
  130. package/dist/x-stat.js +10 -10
  131. package/dist/x-stepper.js +15 -13
  132. package/dist/x-switch.d.ts +10 -3
  133. package/dist/x-switch.js +12 -11
  134. package/dist/x-tab.d.ts +5 -0
  135. package/dist/x-tab.js +10 -7
  136. package/dist/x-table-cell.js +21 -21
  137. package/dist/x-table-row.js +9 -8
  138. package/dist/x-table.js +14 -13
  139. package/dist/x-tabs.d.ts +9 -0
  140. package/dist/x-tabs.js +11 -11
  141. package/dist/x-text-area.d.ts +12 -0
  142. package/dist/x-text-area.js +21 -19
  143. package/dist/x-theme.js +26 -25
  144. package/dist/x-timeline-item.js +21 -20
  145. package/dist/x-timeline.js +8 -8
  146. package/dist/x-toast.js +22 -22
  147. package/dist/x-toaster.js +7 -7
  148. package/dist/x-tooltip.js +14 -12
  149. package/dist/x-trace-history.js +119 -127
  150. package/dist/x-typography.js +9 -9
  151. package/dist/x-welcome-tour.js +63 -63
  152. package/package.json +25 -26
  153. package/dist/barebuild-action.d.ts +0 -45
  154. package/dist/barebuild-action.js +0 -9
  155. package/dist/barebuild-data.d.ts +0 -39
  156. package/dist/barebuild-data.js +0 -5
  157. package/dist/barebuild-invalidate-on.d.ts +0 -42
  158. package/dist/barebuild-invalidate-on.js +0 -5
  159. package/dist/barebuild-route.d.ts +0 -39
  160. package/dist/barebuild-route.js +0 -4
  161. package/dist/barebuild-router.d.ts +0 -41
  162. package/dist/barebuild-router.js +0 -13
package/CHANGELOG.md CHANGED
@@ -2,15 +2,351 @@
2
2
 
3
3
  All notable changes to BareDOM will be documented in this file.
4
4
 
5
- ## [4.0.0-alpha.0] - 2026-06-03
5
+ ## [4.0.0] - 2026-10-08
6
+
7
+ BareDOM 4 makes every component follow the theme, gives every attribute a typed property, and
8
+ brings BareMirror as an alpha. A page looks different after this upgrade, with and without
9
+ `x-theme`, which is why it is a major version.
10
+
11
+ All five adapters are released with it: `-react` 3.0.0, `-angular` 3.0.0, `-vue` 0.6.0, `-svelte`
12
+ 0.6.0 and `-solid` 0.6.0. Each now requires `@vanelsas/baredom` 4.0.0 or later.
13
+
14
+ ### Breaking
15
+
16
+ - **The look under `x-theme`.** Ten families of values follow the theme where they were fixed
17
+ before. See "Changed" below for what moves.
18
+ - **The font, also without a theme.** Buttons, inputs, selects and text areas inside components
19
+ take the font of the page. `x-typography` and `x-kinetic-typography` show the page font, where
20
+ they showed the system font.
21
+ - **`hidden` hides a component.** 101 components ignored the attribute. A page that set `hidden`
22
+ on one of them and relied on it showing must remove the attribute.
23
+ - **Seven properties lost their dashed names.** `x-pagination` (`totalPages`, `siblingCount`,
24
+ `boundaryCount`) and `x-breadcrumbs` (`maxItems`, `itemsBefore`, `itemsAfter`,
25
+ `preserveAriaCurrent`) installed these under the names of their attributes, such as
26
+ `el["total-pages"]`. They are now installed under the camel-case names that the docs and the
27
+ types always gave. The attributes are unchanged.
28
+ - **`x-form-field` in the adapters: `readonly` is `readOnly`.** The adapters now use the name
29
+ the element installs.
30
+ - **A boolean property that is on by default reads the text `"false"` as false.** A framework
31
+ that writes `dismissible="false"` to `x-alert` through the property now turns it off.
32
+ - **The `code` property of `x-code` writes the attribute.** The component no longer keeps the
33
+ value in a field of its own, so an attribute written later wins.
34
+ - **`--x-z-toast` is 9000, was 1200.** Under a theme, dialogs are at 1100 (were 1000),
35
+ `x-command-palette` at 1100 (was 800), the tooltip of `x-copy` at 1000 (was 100) and
36
+ `x-notification-center` at 9000 (was 9999).
37
+ - **The supported browsers are the current ones.** BareDOM is tested in Chrome and Edge 154,
38
+ Firefox 157 and Safari 26.5. The floor of Chrome 67, Firefox 63 and Safari 14 is dropped.
39
+ - **Four `data-*` attributes of `x-timeline-item` left the manifest.** The parent writes them,
40
+ and they are not public API.
6
41
 
7
- **Pre-release — published on the npm `alpha` dist-tag (`npm install @vanelsas/baredom@alpha`). The stable `latest` line is unaffected, and `^3.x` ranges never resolve this version.** First preview of the BareBuild **write-side** coordination elements, designed-by-use from the Phase-4 demo port. These are **experimental — attribute shapes may change before 4.0.0** (the no-selectors / values-not-places spine will not). See `barebuild/docs/write-side-design-notes.md`.
42
+ ### Added
43
+
44
+ - **BareMirror, as an alpha.** A small set of functions for an application on top of the
45
+ components. They place keyed nodes, write values into the parts of a template and turn events
46
+ into messages, with no comparing of old and new. `@vanelsas/baredom/baremirror-alpha` for
47
+ JavaScript, and the namespaces `baremirror.alpha.*` for ClojureScript. A name there may still
48
+ change. See [`docs/baremirror.md`](docs/baremirror.md).
49
+ - **The requests map.** `@vanelsas/baredom/requests` and `baredom.requests` say, for each
50
+ cancelable request event, which attributes it asks to change. The manifest gives every event
51
+ its cancelable flag and every request its attributes.
52
+ - **A typed property for every public attribute.** 79 new properties in 16 components, and
53
+ `counter` and `dots` on `x-welcome-tour`. The manifest types every attribute, and a number
54
+ property accepts numeric text, as a native one does.
55
+ - **A change request on two text fields.** `x-form-field-change-request` and
56
+ `x-search-field-change-request` fire before a typed value takes effect. A cancelled request
57
+ puts the field back to its `value` attribute.
58
+ - **Eight theme tokens.** `--x-radius-xl`, `--x-font-weight-bold`, and a `-hover` and an
59
+ `-active` shade for `--x-color-danger`, `--x-color-success` and `--x-color-warning`. The shades
60
+ are mixed from their colour, so a preset that names only the colour gets matching shades.
61
+ - **A hold of the render.** Every element offers a way to hold its attribute changes and to
62
+ deliver them in order, for code that must write several attributes as one step.
63
+ - **A script that prerenders a page**, `scripts/prerender.mjs`. See
64
+ [`docs/PRERENDER.md`](docs/PRERENDER.md).
65
+ - **Two documents.** [`docs/styling.md`](docs/styling.md) says at which level to style and where
66
+ each value must be set to work. [`docs/TOKEN-COVERAGE.md`](docs/TOKEN-COVERAGE.md) counts, for
67
+ each component, how many values follow the theme.
68
+
69
+ ### Changed
70
+
71
+ Under `x-theme`, these values now follow the theme:
72
+
73
+ - **Colour.** A custom danger, success, warning or primary colour reaches alerts, badges,
74
+ toasts, selected tabs and rows. Hover fills and tints are mixed from the theme's colours. A
75
+ disabled `x-button` is a pale surface with muted text. The hover and pressed colour of a
76
+ danger, success or warning button shifts slightly.
77
+ - **Corners.** 27 components take the theme's scale.
78
+ - **Motion.** Every triggered transition takes the theme's duration and easing.
79
+ - **Shadows.** They follow the theme, in dark mode too.
80
+ - **Type.** The font family, the weights and the body line height follow the theme. Text of
81
+ 13px and 15px is 14px, and the sizes of buttons and badges follow the scale.
82
+ - **Borders.** Edges, inputs and divider lines follow `--x-border-width`.
83
+ - **Layers.** Popups, dialogs and toasts sit on the three layers of the theme.
84
+
85
+ Also changed:
86
+
87
+ - A removed chip of `x-multi-combobox` fades out.
88
+ - The default cells in the component docs are generated from the manifest.
89
+
90
+ ### Fixed
91
+
92
+ - **Lists keep their nodes.** Ten lists no longer rebuild their items on every change, so a
93
+ node that stays keeps its focus: the pages of `x-pagination`, the chips and options of
94
+ `x-multi-combobox`, the options of `x-combobox`, the steps of `x-stepper`, the dots of
95
+ `x-scroll`, the day cells of `x-calendar` and `x-date-picker`, the items of
96
+ `x-command-palette` and the rows of `x-file-upload`.
97
+ - **`x-table` honours a cancelled row select.** It changed the selection in every case.
98
+ - **`x-form-field` and `x-search-field` keep typed text** on a write of the value they already
99
+ have.
100
+ - **`x-progress` and `x-progress-circle` drop `aria-valuemax`** when they become indeterminate.
101
+ - **`x-form`, `x-otp-input` and `x-search-field` set up on a prerendered page.** They took a
102
+ shadow root that was already there as a sign that they were set up.
103
+ - **Three documents no longer show a component's own property set on `:root`**, where it has no
104
+ effect.
105
+
106
+ This release contains the two fixes of 3.12.1.
107
+
108
+ ## [3.12.1] - 2026-10-08
109
+
110
+ ### Fixed
111
+
112
+ - **`x-multi-combobox` reports no `NotFoundError` when a chip is removed with the pointer.** A
113
+ click on the remove button of a chip, while the panel was open, moved focus into that chip.
114
+ Removing the chip then closed the panel from inside the render, and the browser reported
115
+ `Failed to execute 'removeChild' on 'Node'`. The selection was correct, but an ordinary gesture
116
+ left an error in the console. Focus now moves to the input before the chip leaves, so the panel
117
+ stays open and focus stays in the control. (#376)
118
+
119
+ - **`x-currency-field` keeps `value` current while the user types.** The `value` attribute was
120
+ written on change only, so the property was stale during an edit, and with it the values that
121
+ `x-form` collects on a submit with Enter. The attribute now follows each keystroke. (#264)
122
+
123
+ Three things follow from that:
124
+
125
+ - The inline message for a bad number or a value out of range waits while the user types, and
126
+ shows on change or blur. Validity itself follows each keystroke, as before.
127
+ - The display is formatted on every blur, also when the value did not change.
128
+ - On a change, `previousValue` of `x-currency-field-change-request` is the typed text. It was
129
+ the value before the edit.
130
+
131
+ ## [3.12.0] - 2026-09-15
132
+
133
+ ### Added
134
+
135
+ - **`x-file-download` saves through the native save dialog.** A new `picker` attribute makes a
136
+ click open `showSaveFilePicker`, so the user chooses the folder and the name. The component
137
+ then fetches `href` and streams it into the chosen file, and reports the outcome as
138
+ `x-file-download-success`, `x-file-download-cancel` or `x-file-download-error` with the failing
139
+ phase. Browsers without the API, such as Firefox, Safari and Brave, keep the plain download, as
140
+ do cross-origin frames and a dialog that cannot open. `picker` is off by default, so existing
141
+ pages are unchanged.
142
+
143
+ All five adapters gain the `picker` prop and the three events: `-react` 2.5.0, `-angular`
144
+ 2.11.0, `-vue` 0.5.0, `-svelte` 0.5.0, `-solid` 0.5.0.
145
+
146
+ ## [3.11.0] - 2026-08-28
147
+
148
+ ### Fixed
149
+
150
+ - **Event detail keys are published as the component dispatches them.** `x-particle-button`
151
+ dispatches `#js {:press-x … :press-y …}`, so those are the keys on the event, but the generated
152
+ types camel-cased them and promised `pressX` and `pressY`. Every typed caller read a field that
153
+ is not there. The `.d.ts`, `custom-elements.json` and all five adapters now say `"press-x"`,
154
+ quoted because a hyphenated key is not a bare identifier in a TypeScript type.
155
+
156
+ This supersedes the detail half of the 3.3.0 fix "TypeScript declarations", which corrected the
157
+ same invalid identifiers by renaming them. That made the types compile and made them wrong.
158
+ Property names are unaffected and still camel-case, because a property reflects an attribute and
159
+ genuinely changes spelling.
160
+
161
+ Breaking for anyone writing `e.detail.pressX` — which never resolved to anything. Only
162
+ `x-particle-button` is affected; no other component has a kebab-case detail key. Every adapter
163
+ published the wrong key, so all five are released with it: `-react` 2.4.1, `-angular` 2.10.1,
164
+ `-vue` 0.4.2, `-svelte` 0.4.2, `-solid` 0.4.1.
165
+
166
+ ### Added
167
+
168
+ - **`detail` on every event in `custom-elements.json`** — what an event carries, as data, beside
169
+ the TypeScript in `type.text`. A reader no longer parses a type expression to learn the shape.
170
+ Both come from one function, so they cannot disagree.
171
+
172
+ ### Changed
173
+
174
+ - **`scripts/check_event_api.bb` also compares the manifest with the model.** It read the model on
175
+ both sides, so anything the generator did between them was invisible — which is how the
176
+ camel-casing above survived it. It now compares names and types over the union of both sides, so
177
+ a schema edited without regenerating is caught too.
178
+
179
+ ## [3.10.0] - 2026-08-28
180
+
181
+ ### Changed
182
+
183
+ - **`x-date-picker` change details are one shape in both modes.** `x-date-picker-change` and
184
+ `x-date-picker-change-request` carried a different key set per mode — `value` in single mode,
185
+ `start` and `end` in range mode, and `date` on a range click — while `event-schema` declared only
186
+ the first. Every key is now always present and `null` where the mode has nothing to say, so the
187
+ declaration is true and a handler null-checks instead of testing for a key that was never there.
188
+
189
+ This widens the published types from `string` to `string | null` for `value`, `date`, `start` and
190
+ `end` on those two events, in `custom-elements.json`, the `.d.ts` files and all five framework
191
+ adapters. A consumer writing `const v: string = e.detail.value` will need a null check. Nothing
192
+ about when the events fire has changed.
193
+
194
+ ### Fixed
195
+
196
+ - **The Svelte and Vue adapters no longer write `"null"` into a bound value.** Released as
197
+ `@vanelsas/baredom-svelte` 0.4.1 and `@vanelsas/baredom-vue` 0.4.1. Both coerced the
198
+ change detail unconditionally — `String(detail.value)`, `Number(detail.page)` — so a detail field
199
+ that did not apply arrived as the literal string `"null"` in `bind:value` / `v-model` and was
200
+ written back onto the element as an attribute. They now write only when the field is present.
201
+ `false`, `0` and `""` are values and still write; only `null` and `undefined` are skipped.
202
+ Affects the twelve form controls in each adapter. React, Solid and Angular do not write back and
203
+ were never affected.
204
+
205
+ ### Added
206
+
207
+ - **`scripts/check_event_api.bb`** — a CI check that reads each component's dispatch calls and
208
+ asserts the manifest's event details agree with them. It reads forms rather than text, follows a
209
+ detail through a `let`, a helper, a namespace alias and `clj->js`, and reports what it could not
210
+ read rather than counting it as agreement. 198 of 201 events are compared; the three it cannot
211
+ resolve are named. It is what found the `x-date-picker` mismatch above.
212
+
213
+ ## [3.9.0] - 2026-08-26
214
+
215
+ The manifest declares `schemaVersion 1.0.0` and omitted three fields the schema defines. It now
216
+ publishes all three, so an editor reading `custom-elements.json` completes attributes and custom
217
+ properties that it previously knew nothing about.
218
+
219
+ ### Added
220
+
221
+ - **`attributes`** — every attribute a component observes. An attribute that a `property-api`
222
+ entry reflects also carries that property's type and field name. The rest carry a name alone,
223
+ because the component states no type for them. 809 attributes across 108 components, 480 of
224
+ them typed. `observed-attributes` names symbols rather than strings, so each one is resolved
225
+ through the model's own constants: a symbol that escaped resolution would publish `attr-columns`
226
+ as if it were an attribute name.
227
+
228
+ - **`cssProperties` and `cssParts`** — the custom properties a component reads and the parts it
229
+ exposes, read from the implementation source that writes them rather than from a second
230
+ declaration. A property is owned by the longest tag that prefixes it, so `--x-table-cell-padding`
231
+ belongs to `x-table-cell` and not to `x-table`. 1351 properties and 489 parts.
232
+
233
+ - **`scripts/check_css_api.bb` and `scripts/check_attribute_api.bb`** — CI checks that read each
234
+ component crudely and assert the manifest agrees. Each is written to avoid the assumption its
235
+ extractor makes, because a check that shares one agrees with the bug.
236
+
237
+ ### Notes
238
+
239
+ - **`src/` is unchanged**, so the ESM bundles, the framework adapters and the compiled namespaces
240
+ in the jar are identical to 3.8.0. Only the manifest grew.
241
+
242
+ ## [3.8.0] - 2026-08-14
243
+
244
+ ### Added
245
+
246
+ - **`baredom.dev.pick`** — a dev-only namespace for pointing at elements from a REPL, in both directions. `pick!` puts the page into click-to-select and answers with a stable `tag#n` id for whatever is clicked, `element-for` resolves that id back to an element, and `show!` outlines where it is. The id is minted here rather than reused from `x-trace-history`'s component id, which is an integer assigned inside the trace hook and only exists while the recorder is installed, because picking has to work with tracing off. Ids are numbered per tag in document order, so `x-table-cell#7` is the seventh cell on the page rather than the seventh one clicked, and an id survives a re-projection replacing the node.
247
+
248
+ ### Notes
249
+
250
+ - **Nothing here is reachable from a component**, and no custom element is registered, so the ESM bundle and the framework adapters are unchanged. The namespace ships in the Clojars jar alongside the other `baredom.dev` namespaces and is not exported to npm.
251
+
252
+ ## [3.7.1] - 2026-08-12
253
+
254
+ ### Fixed
255
+
256
+ - **`x-drop-zone`** no longer animates a panel in from the top-left corner. `animate-moves` measured panels with `getBoundingClientRect`, which returns `(0,0)` inside a `display: none` subtree, so a panel captured while hidden flew in from the viewport origin once shown. The FLIP decision is now a pure `flip-delta` that returns nil when either box was measured with zero size, and nil when the panel did not move.
257
+
258
+ ## [3.7.0] - 2026-07-30
259
+
260
+ Two new components that work as a pair: a panel the user can pick up and a region that accepts it. Together they cover kanban boards, sortable lists, and any interface where something is moved from one place to another.
261
+
262
+ ### Added
263
+
264
+ - **`x-drag-panel`** — a surface the user picks up with a pointer or the keyboard, with a grip handle over a body slot. Built on pointer events rather than the HTML5 drag-and-drop API, which never fires from touch input on iOS or Android, so it works from 320px up. `grab` chooses whether the whole card is a drag target or only the handle bar; in surface mode a touch drag arms after a short press and cancels if the finger travels first, so swiping over a card still scrolls the board. Dragging toward the edge of a scrollable ancestor auto-scrolls it, resolving the vertical and horizontal scrollers independently so a board that scrolls sideways with columns that scroll down works in both axes at once. Emits `x-drag-panel-drag-start` and `x-drag-panel-drag-cancel`.
265
+
266
+ - **`x-drop-zone`** — a region that senses panels passing over it, renders an insertion caret where one would land, and reports the drop. Acceptance is declarative: `accepts` matches the panel's `kind` and `max` caps capacity, so a full or incompatible zone shows a reject cue during the hover rather than silently ignoring the drop. `animate-moves` animates children into place whenever the child list changes, which covers drop confirmations, another client's change arriving over a websocket, and filter toggles with one mechanism. Emits `x-drop-zone-enter`, `x-drop-zone-leave`, and `x-drop-zone-drop`.
267
+
268
+ ### Notes
269
+
270
+ - **Neither component moves a node.** A drop is a request, not a fact — an app may validate it locally and refuse, queue it offline, or send it to a server that reorders differently. The components sense and report; the application owns the landing. `x-drop-zone-drop` carries `{ kind, value, from, to, index, panel }`, where `value` identifies the panel and `from` / `to` are the two zones' `value`s, so a server-backed handler works entirely in opaque strings and never holds an element across a round trip. `from` is `null` when the panel came from outside any zone, distinct from `""` for a zone with no `value`, and is typed `string | null` so the check is not optional.
271
+
272
+ - **For moves that need confirming**, `zone.reserve(panel, index)` marks the in-flight window and `zone.release()` clears it. The panel renders an empty dashed footprint that keeps its box and the zone renders a reserved caret, so nothing in the layout moves until the answer arrives — every real reflow happens once, when the truth does. Nothing times out: a stalled move stays visible and keyboard-reachable rather than becoming a lost card. The underlying `pending` and `pending-index` attributes remain author-settable for apps that prefer to drive them directly.
273
+
274
+ ### Accessibility
275
+
276
+ - The full interaction is keyboard-operable, which WCAG 2.2 SC 2.5.7 (Dragging Movements) requires of any drag: <kbd>Space</kbd> picks a panel up from its handle, arrows cycle the accepting zones in document order and scroll each into view, <kbd>Enter</kbd> drops, <kbd>Esc</kbd> cancels. Pointer and keyboard produce the same `x-drop-zone-drop` detail, so a consumer handles one path rather than two.
277
+
278
+ - Focus moves to the destination zone on commit rather than riding the panel, because a confirmation re-render will often replace the panel element and focus would fall to `<body>`. Each component narrates the events it owns into a visually hidden live region; the panel's is created lazily at pickup so a fifty-card board carries no idle `aria-live` nodes. Whether a move succeeded is read back from the DOM rather than assumed, so a server that refused is announced honestly.
279
+
280
+ - Auto-scroll is deliberately **not** disabled under `prefers-reduced-motion` — it is function rather than decoration, and a board deeper than the viewport would otherwise be unusable for the people relying on that setting. The lift transition, caret pulse, and `animate-moves` all are.
281
+
282
+ - The framework adapters gain generated `x-drag-panel` and `x-drop-zone` wrappers. They version on their own cadence — see [`docs/RELEASING.md`](docs/RELEASING.md) — so releasing them is a separate step.
283
+
284
+ ## [3.6.0] - 2026-07-27
285
+
286
+ One new component: a floating, draggable container for inspectors, tool palettes, mini-players, and any persistent surface the user should be able to move out of the way.
287
+
288
+ ### Added
289
+
290
+ - **`x-floating-panel`** — a non-modal container that floats above page content at a viewport-fixed position and is repositioned by dragging its handle bar or, when the handle has focus, with the arrow keys. Position lives in the `x` / `y` attributes, so a panel renders where you declared it on first paint with no measure-then-place flash, and clamping keeps the handle reachable whenever the panel opens, connects, moves, or the viewport resizes — a panel parked off-screen is pulled back rather than stranded. Optional `closable` (close button plus `Escape`), `resizable` (native CSS resize grip on the body), `focus-on-open` (off by default, so an ambient panel never steals focus from what the user is typing in), and `step` for arrow-key distance. Emits `x-floating-panel-toggle`, a cancelable `x-floating-panel-dismiss-request`, and `x-floating-panel-move` on drag end and keyboard nudge — never per animation frame.
291
+
292
+ ### Accessibility
8
293
 
9
- ### Added — write-side ALPHA
294
+ - The handle bar is keyboard-operable, which WCAG 2.2 SC 2.5.7 (Dragging Movements) requires of any drag interaction. It is focusable and carries `aria-roledescription="Drag handle"` plus `aria-keyshortcuts`, because the handle is moved rather than activated and a bare `role="button"` would promise an activation that never happens. The panel is a non-modal `role="dialog"` with no focus trap, always accessibly named from the `header` slot or the `label` attribute.
295
+
296
+ ### Notes
297
+
298
+ - Interactive content in the `header` slot can opt out of the drag surface with `data-no-drag`; the built-in close button is excluded automatically.
299
+ - The framework adapters gain a generated `x-floating-panel` wrapper. They version on their own cadence — see [`docs/RELEASING.md`](docs/RELEASING.md) — so releasing them is a separate step.
300
+
301
+ ## [3.5.0] - 2026-07-24
302
+
303
+ Form-associated components gain the instance-level validation API they were missing, and two form-control bugs are fixed: emptying an `x-date-picker` input now clears the committed date, and a form reset now clears validation errors.
304
+
305
+ ### Added
306
+
307
+ - **The native validation API on all 17 form-associated components** — read-only `validity`, `validationMessage`, `willValidate`, `form` and `labels`, plus `checkValidity()` and `reportValidity()`. `ElementInternals` never mirrors these onto the host element, so only `x-search-field`, `x-currency-field`, `x-otp-input` and `x-file-upload` exposed any of it (the two methods), and every other control could be validated only by attempting a submit. `x-checkbox`, `x-color-picker`, `x-combobox`, `x-date-picker`, `x-form-field`, `x-multi-combobox`, `x-radio`, `x-range-slider`, `x-rating`, `x-select`, `x-slider`, `x-switch` and `x-text-area` now expose the full surface, and the four above are extended to match.
308
+
309
+ ### Fixed
310
+
311
+ - **`x-date-picker` ignored a cleared input.** Deleting the text and committing it (blur, `Enter`, or `commit()`) left the previous date committed and repainted the old text — there was no way to clear the field from the keyboard. It now clears the value through the same cancelable `x-date-picker-change-request` path a normal commit uses, reports empty strings in the change detail (`{ value: "" }`, or `{ start: "", end: "" }` in range mode), and resets the range step so a half-picked range cannot complete against a start that no longer exists. Committing a blank input when nothing is committed stays a no-op.
312
+ - **`form.reset()` left stale validation errors.** Reset cleared the value but not the `error` attribute, so the inline message, `data-invalid`, `aria-invalid` and the `customError` flag survived it on `x-date-picker`, `x-select`, `x-combobox`, `x-multi-combobox`, `x-form-field` and `x-text-area`. All six now drop the attribute on reset.
313
+
314
+ ### Changed — internal
315
+
316
+ - **`forms/install-validity-api!`** (new, in `baredom.utils.forms`) is the single implementation of the validation surface; the four components that hand-rolled `checkValidity` / `reportValidity` are migrated onto it. The five read-only members are declared in each `property-api` as `:readonly true` — the framework adapters skip them and the generated declarations mark them `readonly` — and the two methods in `method-api`.
317
+ - Twelve validity assertions across five test suites sat behind a `(when (.-validity el) …)` guard that was never true, and an input-commit regression test dispatched an event the component never listens for. All of them now genuinely run, alongside a new cross-component suite covering the surface on all 17 tags.
318
+
319
+ ### Notes
320
+
321
+ - No adapter release accompanies this one: the new members are read-only, so the generated wrappers filter them out and the adapter packages are functionally unchanged.
322
+
323
+ ## [3.4.0] - 2026-07-22
324
+
325
+ The four popup-selection form controls — `x-select`, `x-date-picker`, `x-combobox`, and `x-multi-combobox` — become **real form controls**: they display inline validation errors and participate in native `<form>` submission and constraint validation via `ElementInternals`. Two internal refactors extract the resulting form-control policy into one shared, unit-tested place.
326
+
327
+ ### Added
328
+
329
+ - **Inline validation errors** on `x-select`, `x-date-picker`, `x-combobox`, `x-multi-combobox` — a new `error` attribute (and matching `error` property) renders a message in an `error` CSS part (an assertive `role="alert"` live region), marks the host `data-invalid`, and sets `aria-invalid` / `aria-describedby` on the control. Inside `x-form` this is driven for you by `form.setFieldError(name, message)`.
330
+ - **Form association** for those four controls — they now attach `ElementInternals`, submit their value under `name` (appearing in `FormData` with no hidden input), honour `required`, expose the `error` attribute as a `customError`, and respond to `form.reset()` and a disabling `<fieldset>`.
331
+ - **Framework adapter form bindings** for the newly form-associated controls: `x-date-picker` gains Vue `v-model` / Angular `ControlValueAccessor` / Svelte `bind:value` / React & Solid controlled `value`; `x-multi-combobox` gains the same with an array (`string[]`) value via new array-aware adapter codegen.
332
+
333
+ ### Changed — behavior changes (please read)
334
+
335
+ These are bug fixes — the controls advertised `name` / `required` but did not honour them — but they change runtime behavior for anyone already using these four inside a `<form>`:
336
+
337
+ - **Native form participation.** Placed in a plain `<form>`, these controls now submit their value under `name` and appear in `FormData`. Previously they did not (unless manually wired); a hidden-input workaround for the same `name` will now double-submit.
338
+ - **`required` and `error` now block submission**, and `form.reset()` now clears these fields. Previously `required` was inert and reset skipped them — a form that used to submit with an empty required select/combobox/date-picker will now be gated by `reportValidity()`.
339
+
340
+ No attributes, properties, or events were removed or renamed; this is otherwise additive.
341
+
342
+ ### Changed — internal
343
+
344
+ - **`baredom.utils.forms`** (new) — the ElementInternals constraint-validation policy and the inline error-display recipe, previously hand-implemented in each form control, are extracted into one namespace. Both the validity decision and the `aria-describedby` projection are pure functions split from their effects, and are now unit-tested (coverage the effecting versions never had). All six form-associated components (the four above plus `x-form-field`, `x-text-area`) compose the shared validity policy; the four popup controls also compose the shared error display.
345
+ - **`custom-elements.json`** — regenerated to pick up the `error` fields and `x-search-field`'s `debounce` field that had drifted out of the committed manifest.
346
+
347
+ ### Notes
10
348
 
11
- - **`<barebuild-action>`** — wraps a submit emitter by containment (a descendant dispatching the configured `submit-event`), JSON-POST/PUT/DELETEs the values, and publishes `.state` + a `barebuild-action-state {name, state}` event per phase transition. Optional `.valuesTransform` property for payload hygiene the action can't itself know (blank-stripping, numeric coercion).
12
- - **`<barebuild-invalidate-on>`** — placed as a child of a source; on a `when-phase`/`when-name` match it dispatches the document-level `barebuild-invalidate {src}` protocol.
13
- - **`<barebuild-data>`** now also listens at document for `barebuild-invalidate` and refetches when `detail.src` matches its own `src` by exact `URL.pathname` — the invalidation substrate (additive; the read-side contract is unchanged).
349
+ - Adapter packages are versioned independently. This release ships alongside `react@2.2.0`, `angular@2.8.0`, `vue@0.2.0`, `svelte@0.2.0`, `solid@0.2.0` — each a minor bump carrying the new form bindings. See [`docs/RELEASING.md`](docs/RELEASING.md).
14
350
 
15
351
  ## [3.3.0] - 2026-05-26
16
352
 
package/README.md CHANGED
@@ -18,6 +18,14 @@
18
18
 
19
19
  ---
20
20
 
21
+ **Part of a set.** [BareDOM](https://github.com/avanelsas/baredom) is a comprehensive web component
22
+ library. [BareBuild](https://github.com/avanelsas/barebuild) is a small runtime that drives web
23
+ components from server state alone. [BareReplay](https://github.com/avanelsas/barereplay) is a
24
+ powerful time-travel replay debugger for BareBuild-based apps.
25
+ [BareProbe](https://github.com/avanelsas/bareprobe) reads the same log from a REPL.
26
+
27
+ ---
28
+
21
29
  ## What is BareDOM?
22
30
 
23
31
  BareDOM is a library of UI components built entirely on web standards — Custom Elements v1, Shadow DOM, and ES modules. There is no framework runtime, no virtual DOM, and no JavaScript framework peer dependency. Every component is a native HTML element that you register once and use anywhere.
@@ -46,7 +54,7 @@ All components can be explored in the [live demo](https://avanelsas.github.io/ba
46
54
 
47
55
  **Zero runtime, tree-shakeable.** Each component is a self-contained ES module compiled with Google Closure Advanced. The only JavaScript in your bundle is the components you import — no framework, no utility belt, no runtime library.
48
56
 
49
- **Predictable theming.** Every visual detail is exposed as a `--x-<component>-<property>` CSS custom property — override at any scope, or wrap in [`<x-theme>`](./docs/x-theme.md) for coordinated palettes with built-in presets. Light/dark mode adapts automatically via `prefers-color-scheme`.
57
+ **Predictable theming.** Every visual detail is exposed as a `--x-<component>-<property>` CSS custom property. Set it on the component, or wrap the page in [`<x-theme>`](./docs/x-theme.md) for coordinated palettes with built-in presets. Light/dark mode adapts automatically via `prefers-color-scheme`.
50
58
 
51
59
  **Accessible & mobile-first.** ARIA roles, keyboard navigation, focus management, and `prefers-reduced-motion` support are part of every component. All components are tested on viewports from 320px up; touch targets meet the 44px minimum on coarse-pointer devices, and pointer events handle mouse + touch uniformly.
52
60
 
@@ -103,22 +111,21 @@ All adapters are auto-generated from the same Custom Elements Manifest, so addin
103
111
 
104
112
  ## Components
105
113
 
106
- **103 UI web components across 11 categories** — from foundational UI controls to morphing animations, organic effects, and scroll-driven storytelling — plus **5 [BareBuild](./barebuild/docs/read-side.md) orchestration elements** (read-side: router / route / data; write-side alpha: action / invalidate-on).
114
+ **106 UI web components across 11 categories** — from foundational UI controls to morphing animations, organic effects, and scroll-driven storytelling.
107
115
 
108
116
  | Category | Count | Examples |
109
117
  |----------|------:|----------|
110
118
  | **Form** | 23 | Button · Checkbox · Slider · Combobox · OTP Input · Color Picker |
111
119
  | **Feedback** | 11 | Alert · Toast · Spinner · Progress · Skeleton · Notification Center |
112
120
  | **Navigation** | 8 | Navbar · Sidebar · Breadcrumbs · Tabs · Pagination · Menu |
113
- | **Layout** | 10 | Card · Grid · Bento Grid · Split Pane · Container · Collapse |
121
+ | **Layout** | 12 | Card · Grid · Bento Grid · Split Pane · Drag Panel · Drop Zone |
114
122
  | **Data** | 11 | Avatar · Table · Chart · Timeline · Calendar · Stat |
115
- | **Overlay** | 9 | Modal · Drawer · Popover · Tooltip · Welcome Tour · Command Palette |
123
+ | **Overlay** | 10 | Modal · Drawer · Popover · Tooltip · Floating Panel · Command Palette |
116
124
  | **Display** | 6 | Icon · Image · Typography · Code · Kbd · Spotlight Card |
117
125
  | **Animation** | 6 | Kinetic Canvas · Kinetic Typography · Morph Stack · Soft Body · Splash |
118
126
  | **Effects** | 12 | Liquid Glass · Confetti · Neural Glow · Metaball Cursor · Organic Shape |
119
127
  | **Scroll** | 5 | Scroll · Scroll Parallax · Scroll Stack · Scroll Story · Scroll Timeline |
120
128
  | **Utility** | 2 | i18n · i18n Provider |
121
- | **Orchestration** | 5 | BareBuild Router · Route · Data — read-side; Action · Invalidate-On — write-side (alpha); not adapter-wrapped |
122
129
 
123
130
  See [**docs/components.md**](./docs/components.md) for the full per-component catalogue with one-line descriptions and links to each component's API documentation.
124
131
 
@@ -141,7 +148,13 @@ See [`docs/x-trace-history.md`](./docs/x-trace-history.md) for the full guide
141
148
 
142
149
  Wrap any subtree in `<x-theme>` to apply a coordinated palette across every BareDOM component inside it. Eight presets ship in the box — `default`, `ocean`, `forest`, `sunset`, `neo-brutalist`, `aurora`, `mono-ai`, `warm-mineral` — each with light and dark variants that follow `prefers-color-scheme`.
143
150
 
144
- Register your own preset, override individual tokens via CSS, or nest themes for per-section palettes. See [`docs/x-theme.md`](./docs/x-theme.md) for the full API (presets, `registerPreset`, CSS overrides) and [`docs/THEMING.md`](./docs/THEMING.md) for the token catalogue.
151
+ Register your own preset, override individual tokens via CSS, or nest themes for per-section palettes. See [`docs/x-theme.md`](./docs/x-theme.md) for the full API (presets, `registerPreset`, CSS overrides) and [`docs/THEMING.md`](./docs/THEMING.md) for the token catalogue. [`docs/styling.md`](./docs/styling.md) says where each value goes so that it works.
152
+
153
+ ---
154
+
155
+ ## BareMirror (alpha)
156
+
157
+ A small set of functions for an application on top of the components: they place keyed nodes, write values into the parts of a template and turn events into messages, with no comparing of old and new. It ships inside this package as an alpha, for JavaScript and ClojureScript. See [`docs/baremirror.md`](./docs/baremirror.md).
145
158
 
146
159
  ---
147
160
 
@@ -179,13 +192,13 @@ Each component loads `base.js` once plus its own module. A typical page using 5-
179
192
 
180
193
  ## Browser Support
181
194
 
182
- BareDOM targets browsers that support Custom Elements v1 and Shadow DOM v1 natively:
195
+ BareDOM is tested in the current versions of these browsers:
183
196
 
184
197
  | Browser | Minimum version |
185
198
  |---------|----------------|
186
- | Chrome / Edge | 67+ |
187
- | Firefox | 63+ |
188
- | Safari | 14+ |
199
+ | Chrome / Edge | 154+ |
200
+ | Firefox | 157+ |
201
+ | Safari | 26.5+ |
189
202
 
190
203
  No polyfills are included or required for these targets.
191
204