@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.
- package/CHANGELOG.md +342 -6
- package/README.md +23 -10
- package/custom-elements.json +17352 -4514
- package/dist/baredom.d.ts +92 -94
- package/dist/baremirror-alpha.js +25 -0
- package/dist/base.js +700 -605
- package/dist/integrity.json +113 -113
- package/dist/requests.d.ts +3 -0
- package/dist/requests.js +35 -0
- package/dist/x-alert.js +17 -17
- package/dist/x-avatar-group.js +10 -9
- package/dist/x-avatar.js +14 -14
- package/dist/x-badge.js +9 -9
- package/dist/x-bento-grid.d.ts +5 -0
- package/dist/x-bento-grid.js +6 -5
- package/dist/x-bento-item.d.ts +3 -0
- package/dist/x-bento-item.js +4 -4
- package/dist/x-breadcrumbs.d.ts +6 -5
- package/dist/x-breadcrumbs.js +16 -14
- package/dist/x-button.d.ts +4 -0
- package/dist/x-button.js +1 -1
- package/dist/x-calendar.js +42 -39
- package/dist/x-cancel-dialogue.js +16 -14
- package/dist/x-card.d.ts +4 -0
- package/dist/x-card.js +7 -7
- package/dist/x-carousel.js +37 -35
- package/dist/x-chart.d.ts +2 -0
- package/dist/x-chart.js +48 -47
- package/dist/x-checkbox.d.ts +11 -4
- package/dist/x-checkbox.js +1 -1
- package/dist/x-chip.js +1 -1
- package/dist/x-code.js +29 -27
- package/dist/x-collapse.js +11 -11
- package/dist/x-color-picker.d.ts +7 -0
- package/dist/x-color-picker.js +48 -46
- package/dist/x-combobox.d.ts +12 -4
- package/dist/x-combobox.js +36 -30
- package/dist/x-command-palette.d.ts +9 -1
- package/dist/x-command-palette.js +32 -28
- package/dist/x-confetti.js +24 -24
- package/dist/x-container.d.ts +4 -0
- package/dist/x-container.js +6 -5
- package/dist/x-context-menu.js +20 -20
- package/dist/x-copy.js +1 -1
- package/dist/x-currency-field.d.ts +5 -0
- package/dist/x-currency-field.js +26 -24
- package/dist/x-date-picker.d.ts +20 -2
- package/dist/x-date-picker.js +46 -39
- package/dist/x-divider.js +9 -10
- package/dist/x-drag-panel.d.ts +45 -0
- package/dist/x-drag-panel.js +37 -0
- package/dist/x-drawer.js +12 -11
- package/dist/x-drop-zone.d.ts +49 -0
- package/dist/x-drop-zone.js +12 -0
- package/dist/x-dropdown.js +12 -12
- package/dist/x-fieldset.js +6 -6
- package/dist/x-file-download.d.ts +4 -0
- package/dist/x-file-download.js +15 -7
- package/dist/x-file-upload.d.ts +10 -5
- package/dist/x-file-upload.js +27 -23
- package/dist/x-floating-panel.d.ts +50 -0
- package/dist/x-floating-panel.js +25 -0
- package/dist/x-form-field.d.ts +11 -1
- package/dist/x-form-field.js +18 -15
- package/dist/x-form.js +10 -11
- package/dist/x-gaussian-blur.js +13 -14
- package/dist/x-grid.d.ts +9 -0
- package/dist/x-grid.js +8 -6
- package/dist/x-i18n-provider.js +7 -7
- package/dist/x-i18n.js +4 -4
- package/dist/x-icon.js +7 -7
- package/dist/x-image.js +19 -17
- package/dist/x-kbd.js +16 -16
- package/dist/x-kinetic-canvas.js +26 -26
- package/dist/x-kinetic-font.js +27 -27
- package/dist/x-kinetic-typography.js +35 -35
- package/dist/x-liquid-dock.js +34 -34
- package/dist/x-liquid-fill.js +42 -42
- package/dist/x-liquid-glass.js +42 -41
- package/dist/x-menu-item.js +9 -8
- package/dist/x-menu.js +10 -10
- package/dist/x-metaball-cursor.js +23 -23
- package/dist/x-modal.js +13 -12
- package/dist/x-morph-stack.js +38 -37
- package/dist/x-multi-combobox.d.ts +13 -5
- package/dist/x-multi-combobox.js +42 -36
- package/dist/x-navbar.js +16 -15
- package/dist/x-neural-glow.js +31 -30
- package/dist/x-notification-center.js +9 -9
- package/dist/x-organic-divider.js +18 -18
- package/dist/x-organic-progress.js +35 -35
- package/dist/x-organic-shape.js +13 -14
- package/dist/x-otp-input.d.ts +5 -0
- package/dist/x-otp-input.js +23 -22
- package/dist/x-pagination.js +16 -14
- package/dist/x-particle-button.d.ts +10 -1
- package/dist/x-particle-button.js +55 -51
- package/dist/x-popover.js +28 -27
- package/dist/x-progress-circle.js +8 -9
- package/dist/x-progress.js +8 -8
- package/dist/x-proximity-list.js +20 -20
- package/dist/x-radio.d.ts +10 -3
- package/dist/x-radio.js +13 -11
- package/dist/x-range-slider.d.ts +7 -0
- package/dist/x-range-slider.js +31 -28
- package/dist/x-rating.d.ts +7 -0
- package/dist/x-rating.js +25 -23
- package/dist/x-ripple-effect.js +10 -10
- package/dist/x-scroll-parallax.js +17 -17
- package/dist/x-scroll-stack.js +17 -17
- package/dist/x-scroll-story.js +33 -33
- package/dist/x-scroll-timeline.js +46 -46
- package/dist/x-scroll.js +39 -38
- package/dist/x-search-field.d.ts +10 -3
- package/dist/x-search-field.js +1 -1
- package/dist/x-select.d.ts +12 -2
- package/dist/x-select.js +1 -1
- package/dist/x-sidebar.d.ts +4 -0
- package/dist/x-sidebar.js +17 -18
- package/dist/x-skeleton-group.js +13 -12
- package/dist/x-skeleton.js +1 -1
- package/dist/x-slider.d.ts +7 -0
- package/dist/x-slider.js +17 -16
- package/dist/x-soft-body.js +20 -20
- package/dist/x-spacer.js +4 -4
- package/dist/x-spinner.js +4 -4
- package/dist/x-splash.js +13 -12
- package/dist/x-split-pane.js +15 -15
- package/dist/x-spotlight-card.js +13 -12
- package/dist/x-stat.js +10 -10
- package/dist/x-stepper.js +15 -13
- package/dist/x-switch.d.ts +10 -3
- package/dist/x-switch.js +12 -11
- package/dist/x-tab.d.ts +5 -0
- package/dist/x-tab.js +10 -7
- package/dist/x-table-cell.js +21 -21
- package/dist/x-table-row.js +9 -8
- package/dist/x-table.js +14 -13
- package/dist/x-tabs.d.ts +9 -0
- package/dist/x-tabs.js +11 -11
- package/dist/x-text-area.d.ts +12 -0
- package/dist/x-text-area.js +21 -19
- package/dist/x-theme.js +26 -25
- package/dist/x-timeline-item.js +21 -20
- package/dist/x-timeline.js +8 -8
- package/dist/x-toast.js +22 -22
- package/dist/x-toaster.js +7 -7
- package/dist/x-tooltip.js +14 -12
- package/dist/x-trace-history.js +119 -127
- package/dist/x-typography.js +9 -9
- package/dist/x-welcome-tour.js +63 -63
- package/package.json +25 -26
- package/dist/barebuild-action.d.ts +0 -45
- package/dist/barebuild-action.js +0 -9
- package/dist/barebuild-data.d.ts +0 -39
- package/dist/barebuild-data.js +0 -5
- package/dist/barebuild-invalidate-on.d.ts +0 -42
- package/dist/barebuild-invalidate-on.js +0 -5
- package/dist/barebuild-route.d.ts +0 -39
- package/dist/barebuild-route.js +0 -4
- package/dist/barebuild-router.d.ts +0 -41
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
**
|
|
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** |
|
|
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** |
|
|
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
|
|
195
|
+
BareDOM is tested in the current versions of these browsers:
|
|
183
196
|
|
|
184
197
|
| Browser | Minimum version |
|
|
185
198
|
|---------|----------------|
|
|
186
|
-
| Chrome / Edge |
|
|
187
|
-
| Firefox |
|
|
188
|
-
| Safari |
|
|
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
|
|