@aceshooting/lyra-ui 17.0.0 → 18.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 +254 -0
- package/README.md +2 -2
- package/custom-elements.json +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +22 -0
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +1 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +22 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.js +1 -0
- package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
- package/dist/components/data/table/table.styles.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +12 -2
- package/dist/components/forms/combobox/combobox.class.js +2 -2
- package/dist/components/forms/combobox/combobox.styles.js +1 -1
- package/dist/components/forms/select/select.class.d.ts +31 -5
- package/dist/components/forms/select/select.class.js +2 -2
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts +68 -6
- package/dist/components/layout/filter-bar/filter-bar.class.js +2 -2
- package/dist/components/layout/reorder-list/reorder-list.class.js +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +107 -2
- package/dist/components/layout/virtual-list/virtual-list.class.js +12 -7
- package/dist/components/media/map/map.class.d.ts +138 -12
- package/dist/components/media/map/map.class.js +25 -20
- package/dist/components/media/map/map.styles.js +1 -1
- package/dist/custom-elements-jsx.d.ts +1 -1
- package/dist/events.d.ts +7 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/lyra.d.ts +1 -1
- package/dist/lyra.js +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/translations/ar/retrieval.js +1 -1
- package/dist/translations/ar/shared.js +1 -1
- package/dist/translations/de/retrieval.js +1 -1
- package/dist/translations/de/shared.js +1 -1
- package/dist/translations/es/retrieval.js +1 -1
- package/dist/translations/es/shared.js +1 -1
- package/dist/translations/fa/retrieval.js +1 -1
- package/dist/translations/fa/shared.js +1 -1
- package/dist/translations/fr/retrieval.js +1 -1
- package/dist/translations/fr/shared.js +1 -1
- package/dist/translations/he/retrieval.js +1 -1
- package/dist/translations/he/shared.js +1 -1
- package/dist/translations/it/retrieval.js +1 -1
- package/dist/translations/it/shared.js +1 -1
- package/dist/translations/ja/retrieval.js +1 -1
- package/dist/translations/ja/shared.js +1 -1
- package/dist/translations/pt-BR/retrieval.js +1 -1
- package/dist/translations/pt-BR/shared.js +1 -1
- package/dist/translations/ro/agent-tools.d.ts +1 -0
- package/dist/translations/ro/agent-tools.js +1 -0
- package/dist/translations/ro/charts.d.ts +1 -0
- package/dist/translations/ro/charts.js +1 -0
- package/dist/translations/ro/conversation.d.ts +1 -0
- package/dist/translations/ro/conversation.js +1 -0
- package/dist/translations/ro/data.d.ts +1 -0
- package/dist/translations/ro/data.js +1 -0
- package/dist/translations/ro/forms.d.ts +1 -0
- package/dist/translations/ro/forms.js +1 -0
- package/dist/translations/ro/layout.d.ts +1 -0
- package/dist/translations/ro/layout.js +1 -0
- package/dist/translations/ro/media.d.ts +1 -0
- package/dist/translations/ro/media.js +1 -0
- package/dist/translations/ro/overlays.d.ts +1 -0
- package/dist/translations/ro/overlays.js +1 -0
- package/dist/translations/ro/retrieval.d.ts +1 -0
- package/dist/translations/ro/retrieval.js +1 -0
- package/dist/translations/ro/shared.d.ts +1 -0
- package/dist/translations/ro/shared.js +1 -0
- package/dist/translations/ro/utility.d.ts +1 -0
- package/dist/translations/ro/utility.js +1 -0
- package/dist/translations/ro/viewers.d.ts +1 -0
- package/dist/translations/ro/viewers.js +5 -0
- package/dist/translations/ro.d.ts +1 -0
- package/dist/translations/ro.js +1 -0
- package/dist/translations/ru/retrieval.js +1 -1
- package/dist/translations/ru/shared.js +1 -1
- package/dist/translations/zh-CN/retrieval.js +1 -1
- package/dist/translations/zh-CN/shared.js +1 -1
- package/dist/vue.d.ts +1 -1
- package/llms/components/lr-button.md +5 -4
- package/llms/components/lr-card.md +2 -1
- package/llms/components/lr-combobox.md +7 -0
- package/llms/components/lr-filter-bar.md +86 -3
- package/llms/components/lr-icon-button.md +2 -1
- package/llms/components/lr-map.md +63 -6
- package/llms/components/lr-option.md +7 -0
- package/llms/components/lr-select.md +19 -2
- package/llms/components/lr-streaming-text-core.md +7 -3
- package/llms/components/lr-streaming-text.md +7 -2
- package/llms/components/lr-virtual-list.md +53 -0
- package/llms/shared.md +6 -3
- package/llms-full.txt +273 -22
- package/package.json +28 -2
- package/registrations.json +1 -1
- package/vscode-css-data.json +1 -1
- package/vscode-html-data.json +1 -1
- package/web-types.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,259 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 18.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 555b974: **Major only because several exported TypeScript unions and maps gained members. No runtime
|
|
8
|
+
behaviour changes, no attribute or event was removed or renamed, and no default moved.** If you do
|
|
9
|
+
not perform exhaustive type-level matching over the members listed below, this release is a
|
|
10
|
+
drop-in upgrade and you can stop reading here.
|
|
11
|
+
|
|
12
|
+
The public-API gate classifies widening an exported union as breaking, and it is right to: a
|
|
13
|
+
consumer with an exhaustive `switch` over one of these, or a mapped type keyed by one, stops
|
|
14
|
+
compiling until the new member is handled. Nothing else about them changed.
|
|
15
|
+
|
|
16
|
+
**`lr-filter-bar`**
|
|
17
|
+
- `LyraFilterBarControlType` gains `'chip'`.
|
|
18
|
+
- `LyraFilterBarFilterDefinition` gains `LyraFilterBarChipDefinition`.
|
|
19
|
+
- `LyraFilterBarDefinitionValue<D>` gains an arm resolving a chip filter to the full
|
|
20
|
+
`LyraFilterBarFieldValue`, exactly as `'custom'` already does. Every other `D` resolves as before.
|
|
21
|
+
|
|
22
|
+
An exhaustive `switch (definition.type)` over a filter schema now needs a `'chip'` case, and a
|
|
23
|
+
`Record<LyraFilterBarControlType, T>` needs a `chip` key.
|
|
24
|
+
|
|
25
|
+
**`lr-map`**
|
|
26
|
+
- `LyraMapLegendEntry` gains an optional `value` category key.
|
|
27
|
+
- `LyraMapEventMap` gains `'lr-map-legend-toggle'`.
|
|
28
|
+
- New exported `LyraMapLegendToggleDetail`.
|
|
29
|
+
|
|
30
|
+
A `Record<keyof LyraMapEventMap, T>` needs the new key. `LyraMapLegendEntry` is only widened by an
|
|
31
|
+
optional property, so constructing one is unaffected; only code that enumerates its keys is.
|
|
32
|
+
|
|
33
|
+
**`lr-virtual-list`**
|
|
34
|
+
- New `rowProjection` property and `row-projection` attribute, new `projectedRows` getter, new
|
|
35
|
+
exported `LyraVirtualListRowProjection`, and two exported constants,
|
|
36
|
+
`VIRTUAL_LIST_ROW_ATTRIBUTE` and `VIRTUAL_LIST_STICKY_ATTRIBUTE`.
|
|
37
|
+
|
|
38
|
+
**Generated framework declarations.** `./custom-elements-jsx`, `./vue` and `./svelte` are
|
|
39
|
+
regenerated from the manifest, so the prop types for the components above widen accordingly. This
|
|
40
|
+
is the bulk of the gate's reported diff and needs no action.
|
|
41
|
+
|
|
42
|
+
**Migration:** add the new members to any exhaustive union handling; otherwise upgrade directly.
|
|
43
|
+
|
|
44
|
+
### Minor Changes
|
|
45
|
+
|
|
46
|
+
- 49eb3ef: `<lr-combobox>` gains `sync` (unset by default), spelled and shaped identically to
|
|
47
|
+
`<lr-dropdown>`/`<lr-popup>`/`<lr-popover>`'s property of the same name. Setting `sync="width"`
|
|
48
|
+
copies the trigger's rendered width onto the listbox and drops the previously fixed 12rem-28rem
|
|
49
|
+
content-based clamp (keeping only the outer viewport/available-space ceiling), so a full-width
|
|
50
|
+
trigger with short option labels gets a listbox that aligns to its own edges instead of floating
|
|
51
|
+
narrower in the middle. Left unset, the listbox continues to size to its own content exactly as
|
|
52
|
+
before.
|
|
53
|
+
- 204aeb4: **`<lr-filter-bar>`: a control-less `type: 'chip'` filter, for a value owned by a widget elsewhere
|
|
54
|
+
on the page.**
|
|
55
|
+
|
|
56
|
+
A calendar heatmap cell, a map selection, a chart brush — the filter is real, but the control that
|
|
57
|
+
sets it is not in the toolbar. Until now the only way to surface such a filter in the bar was a
|
|
58
|
+
`type: 'custom'` definition whose renderer drew something inert just to occupy the cell it was
|
|
59
|
+
forced to claim.
|
|
60
|
+
|
|
61
|
+
`type: 'chip'` renders **no control and no toolbar cell**: no `field` wrapper is emitted for it, so
|
|
62
|
+
`lr-filter-bar::part(field)` and `::part(field-<filterId>)` never match one, and a bar whose filters
|
|
63
|
+
are *all* chip-only paints no empty column — its `controls` row still renders the reset button (the
|
|
64
|
+
"clear all" action such a bar needs), the `end` slot and the loading spinner, exactly like a bar
|
|
65
|
+
declaring no filters at all.
|
|
66
|
+
|
|
67
|
+
Everything else is unchanged from any other filter type. The value lives in `value` under its own
|
|
68
|
+
filter ID, rides every `lr-input`/`lr-reset` detail, counts toward `hasActiveFilters` (so it enables
|
|
69
|
+
the reset button) and toward `invalidFilterIds` when `required`, renders a removable active-filter
|
|
70
|
+
chip subject to `activeFiltersDisplay`, and is cleared both by removing that chip and by `reset()`.
|
|
71
|
+
A `required` chip-only filter is honoured in bookkeeping only — it joins `invalidFilterIds`, fails
|
|
72
|
+
`checkValidity()` and moves `lr-validity-change` — but renders no inline error, because the bar
|
|
73
|
+
renders no element of its own for it; the owning widget keeps its own error affordance. The
|
|
74
|
+
inherited `placeholder` is inert here for the same reason it already is for `type: 'custom'`.
|
|
75
|
+
|
|
76
|
+
**Chip text.** An optional `formatValue(value, locale)` produces it, and `locale` is the bar's
|
|
77
|
+
`effectiveLocale` — the same locale every built-in type's own chip formatting and a custom adapter's
|
|
78
|
+
`formatValue` already receive, so the caller localizes its own data. Omitted, the fallback ladder is
|
|
79
|
+
the one a custom adapter's omitted `formatValue` uses: a string array renders as a localized
|
|
80
|
+
conjunction list, anything else renders verbatim through `String(value)`, and an unset value renders
|
|
81
|
+
empty. Verbatim is exact — a chip-only value never passes through the date branch that localizes a
|
|
82
|
+
`'date'`/`'date-range'` chip, so an ISO day is not silently reformatted and a value containing a
|
|
83
|
+
slash is not mangled.
|
|
84
|
+
|
|
85
|
+
**Clearing.** An optional `clearValue` (default `''`, what every non-multi built-in type writes) is
|
|
86
|
+
what a chip removal writes; declare `[]` for an array-valued chip-only filter. An optional `isEmpty`
|
|
87
|
+
overrides the built-in emptiness rule. A domain sentinel must pair the two: a sentinel clear value
|
|
88
|
+
with no matching `isEmpty` leaves the bar reading the "cleared" value as still set and still
|
|
89
|
+
rendering a chip for it — the identical pairing a custom adapter's own `clearValue`/`isEmpty`
|
|
90
|
+
already documents. With the pair declared, the sentinel is never stored in `value` and an absent key
|
|
91
|
+
reads back as the sentinel for the owning widget.
|
|
92
|
+
|
|
93
|
+
**Additive only.** A schema declaring no `'chip'` filter renders byte-identical shadow DOM: the
|
|
94
|
+
render path keys on `type === 'chip'` exactly, never on "not a known control type", so an
|
|
95
|
+
unrecognized `type` still falls back to `<lr-select>` as before. At the type level, a `'chip'` filter
|
|
96
|
+
keeps the full unconstrained field value in `LyraFilterBarValueFor<Defs>`, like `'custom'`. New
|
|
97
|
+
exported type: `LyraFilterBarChipDefinition`.
|
|
98
|
+
- af5a12e: `<lr-map>` gains an opt-in interactive legend, so a categorical point layer's key can double as its
|
|
99
|
+
layer switch instead of needing a hand-built checkbox group positioned over the canvas.
|
|
100
|
+
|
|
101
|
+
`legendInteractive` (attribute `legend-interactive`, default `false`) turns every legend row that
|
|
102
|
+
carries the new `LyraMapLegendEntry.value` category key into a keyboard-operable toggle button.
|
|
103
|
+
`value` is the same string a `point.colors` / `point.icons` record matches against
|
|
104
|
+
`point.field` / `point.iconField`, so one set of category records can feed both the paint and the
|
|
105
|
+
key and the two cannot drift. It is distinct from — and does not derive from — the `value` on a
|
|
106
|
+
row's `icon` record, which is still dropped from the canonical readback as before. Rows without a
|
|
107
|
+
`value` stay inert even when `legendInteractive` is set.
|
|
108
|
+
|
|
109
|
+
`hiddenCategories: readonly string[]` is the controlled state, mirroring `<lr-chart>`'s
|
|
110
|
+
`hiddenDatasets`, and is honoured on first render rather than only after a user toggle. Activating a
|
|
111
|
+
toggle emits a cancelable `lr-map-legend-toggle` carrying the activated key, its proposed
|
|
112
|
+
visibility, and the complete proposed hidden set; `preventDefault()` is a real veto — nothing is
|
|
113
|
+
written, the row's `aria-pressed` does not change, the map is not repainted, and no announcement is
|
|
114
|
+
made — so a host can own the state itself. A programmatic `hiddenCategories` assignment reconciles
|
|
115
|
+
silently and emits nothing.
|
|
116
|
+
|
|
117
|
+
A hidden category's points, point icons and stroke are muted in the rendered MapLibre layers
|
|
118
|
+
through the new `--lr-map-hidden-category-opacity` (default `0.15`), resolved live from the cascade
|
|
119
|
+
because MapLibre paints to a WebGL canvas that never sees `var()`. The legend row itself dims only
|
|
120
|
+
its decorative swatch (`--lr-map-legend-hidden-swatch-opacity`, default `0.5`) and re-colors its
|
|
121
|
+
label through the quiet-text token, so the label keeps WCAG AA contrast rather than fading with the
|
|
122
|
+
swatch. New parts: `legend-toggle` and `legend-toggle-hidden`.
|
|
123
|
+
|
|
124
|
+
Each toggle is an ordinary tabbable `<button>` with `aria-pressed` rendering both `"true"` and
|
|
125
|
+
`"false"`, matching `<lr-chart>` and `<lr-graph-legend>` rather than introducing a third legend
|
|
126
|
+
vocabulary; a long interactive legend therefore contributes one tab stop per keyed row. Show/hide
|
|
127
|
+
state changes are announced through the shared light-DOM live region.
|
|
128
|
+
|
|
129
|
+
With `legendInteractive` left unset, the legend DOM and every MapLibre paint property are
|
|
130
|
+
byte-identical to before: no button is rendered and `circle-opacity` is never written at all.
|
|
131
|
+
- 3024e74: Added a complete Romanian (`ro`) translation catalog, the twelfth full locale to ship with the
|
|
132
|
+
package. Like every other locale, it is split into twelve side-effect-only per-family slices
|
|
133
|
+
(`@aceshooting/lyra-ui/translations/ro/<family>.js`) plus the back-compat aggregate
|
|
134
|
+
`@aceshooting/lyra-ui/translations/ro.js`, covering all 1,291 keys in `LYRA_DEFAULT_STRINGS`
|
|
135
|
+
(including the 14 pluralized entries). Romanian's CLDR plural category set is `one`/`few`/`other`
|
|
136
|
+
rather than English's `one`/`other` — `few` covers `0` and `2`-`19` (and the `101`-`119`-per-hundred
|
|
137
|
+
band), while `other` is the `de`-requiring form from `20` upward (`"20 de rezultate"` vs.
|
|
138
|
+
`"2 rezultate"`) — so every pluralized message was authored with all three categories rather than
|
|
139
|
+
widening `few` to `other`.
|
|
140
|
+
- 9db9165: `<lr-select>` gains `loading` (default `false`, reflected). A committed value whose catalog hasn't
|
|
141
|
+
arrived yet -- `<lr-option>`s still being fetched/mounted asynchronously -- previously had no way to
|
|
142
|
+
distinguish itself from a genuinely stale value: both rendered the raw value string badged
|
|
143
|
+
dashed/italic `notInCatalog`. Setting `loading` while the matching option is still pending instead
|
|
144
|
+
renders the localized `loading` placeholder, with no `unknown-value` badge and no synthetic
|
|
145
|
+
`showUnknownOption` listbox row, in the trigger label or the relevant `multiple`-mode tag. Once the
|
|
146
|
+
matching `<lr-option>` mounts, the real label renders automatically on the next render, with or
|
|
147
|
+
without also flipping `loading` back to `false`. A value that already matches a live option, and
|
|
148
|
+
every existing `loading`-unset unknown-value/`getUnknownLabel` behavior, is unchanged.
|
|
149
|
+
- 1942512: `<lr-streaming-text>`/`<lr-streaming-text-core>` now forward their composed
|
|
150
|
+
`<lr-markdown>`/`<lr-markdown-core>`'s documented CSS parts (`content`, `heading`, `paragraph`,
|
|
151
|
+
`list`, `code-block`, `inline-code`, `link`, `table`, `blockquote`, `img`, `math`) through
|
|
152
|
+
`exportparts`, reusing each name verbatim since none collides with either wrapper's own `base`/
|
|
153
|
+
`cursor` parts. A host-level `lr-streaming-text::part(link)`/`::part(img)` (or the `-core` variant's
|
|
154
|
+
equivalent) rule now reaches the rendered `<a>`/`<img>` the same way it already does applied
|
|
155
|
+
directly to `<lr-markdown>`/`<lr-markdown-core>` -- previously that styling surface was unreachable
|
|
156
|
+
from outside either wrapper's own shadow boundary.
|
|
157
|
+
- c78f78c: `<lr-virtual-list>` gains `row-projection`, an opt-in light-DOM row projection mode, so an
|
|
158
|
+
application whose list rows are already styled by its own global stylesheet can adopt virtualization
|
|
159
|
+
without rehoming every row rule.
|
|
160
|
+
|
|
161
|
+
Until now `renderItem`'s output was stamped inside the component's shadow root, so document CSS
|
|
162
|
+
could not reach row content: adopting virtualization meant moving a dozen descendant rules per row
|
|
163
|
+
into a new custom element or a growing set of custom properties — a stylesheet refactor, paid
|
|
164
|
+
exactly by the lists long enough to need virtualizing. With `row-projection="light"` the windowed
|
|
165
|
+
rows are rendered into the host's own light DOM and assigned into the shadow viewport through
|
|
166
|
+
internal named slots. The component keeps owning windowing, measurement, spacer sizing,
|
|
167
|
+
`scrollToIndex()`, the external-scroller mode and the ARIA contract; the consumer keeps owning the
|
|
168
|
+
row markup and its cascade, and ordinary document CSS styles a virtualized row exactly as it styles
|
|
169
|
+
the same row unvirtualized.
|
|
170
|
+
|
|
171
|
+
Positioning stays on the shadow-side `[part="row"]` wrapper, which the document cannot select, so
|
|
172
|
+
windowing is not overridable by consumer CSS and the whole existing part vocabulary — `base`,
|
|
173
|
+
`spacer`, `row`, `group`, `sticky-group` — keeps matching in both modes.
|
|
174
|
+
|
|
175
|
+
Costs, stated plainly rather than hidden:
|
|
176
|
+
|
|
177
|
+
- Each projected row sits inside one component-owned wrapper element carrying the reserved
|
|
178
|
+
`data-lr-virtual-list-row` attribute (exported as `VIRTUAL_LIST_ROW_ATTRIBUTE`; the sticky band's
|
|
179
|
+
counterpart is `VIRTUAL_LIST_STICKY_ATTRIBUTE`). Descendant selectors port unchanged; child
|
|
180
|
+
combinators, `:nth-child`, `:first-child` and sibling combinators written against unvirtualized
|
|
181
|
+
markup do not, and `:nth-child` reflects the current window rather than the item index.
|
|
182
|
+
- A delegated listener on the host now sees an un-retargeted `event.target`, so
|
|
183
|
+
`closest('[part="row"]')` no longer resolves — use `closest('[data-lr-virtual-list-row]')`.
|
|
184
|
+
- The document cascade now reaches row content, including resets that previously could not.
|
|
185
|
+
- Per-row light-DOM state does not survive a disconnect/reconnect, because disconnect removes the
|
|
186
|
+
projected rows completely.
|
|
187
|
+
- On a hydrated page the first window is shadow-rendered for one task before it swaps into the
|
|
188
|
+
light DOM, so server markup and the first client render agree.
|
|
189
|
+
|
|
190
|
+
`rowProjection` is `'shadow'` by default. Left unset, every existing list renders byte-identically
|
|
191
|
+
and the host's light DOM stays empty.
|
|
192
|
+
|
|
193
|
+
### Patch Changes
|
|
194
|
+
|
|
195
|
+
- ce460db: **Documentation: `aria-pressed` stopped reaching a link button (`href` set) in 16.0.0 — recorded
|
|
196
|
+
here because 16.0.0 filed it where nobody would find it.**
|
|
197
|
+
|
|
198
|
+
No behaviour changes in this release. This entry exists because the change itself shipped without a
|
|
199
|
+
discoverable release note, and a consumer pinning the old contract met it as an unexplained test
|
|
200
|
+
failure after a dependency bump.
|
|
201
|
+
|
|
202
|
+
**What changed, and when.** Through 15.0.0, `<lr-button>`, `<lr-icon-button>` and `<lr-card>`
|
|
203
|
+
forwarded a host `aria-pressed` onto the `<a>` they render when `href` is set. Since **16.0.0** they
|
|
204
|
+
do not: `aria-pressed` reaches the `<button>` rendering only. `role="link"` has no pressed state, so
|
|
205
|
+
forwarding it there asserted an ARIA state that does not exist on that role — an ARIA conformance
|
|
206
|
+
failure, not a feature. The behaviour is correct and is not being reverted.
|
|
207
|
+
|
|
208
|
+
This narrowed a documented forwarding contract, so it was a **breaking change** for anyone relying
|
|
209
|
+
on the old behaviour, and it should have been filed as one. 16.0.0 did describe it, but as the third
|
|
210
|
+
sub-heading of a long `<lr-card>` disabled-state entry whose opening sentence never mentions
|
|
211
|
+
`<lr-button>` — so neither scanning the release notes for button changes nor reading a per-component
|
|
212
|
+
digest surfaced it.
|
|
213
|
+
|
|
214
|
+
**Migration.** If the control is a real toggle, drop `href` — the same host `aria-pressed` then
|
|
215
|
+
reaches the `<button>` that replaces the anchor, and the pressed state is exposed again. If it is a
|
|
216
|
+
navigation target, use the global `aria-current` (`page`, `step`, `location`, `date`, `time`,
|
|
217
|
+
`true`, `false`) instead: that one is valid on `role="link"` and does still reach the anchor.
|
|
218
|
+
|
|
219
|
+
The `lr-button`, `lr-icon-button` and `lr-card` reference sections now name 16.0.0 as the version
|
|
220
|
+
the carve-out landed in, so the rule can be dated from the reference alone.
|
|
221
|
+
- 87d02cb: Fixed `<lr-reorder-list>`'s documented Ctrl/Cmd+ArrowUp/ArrowDown shortcut so it fires from real
|
|
222
|
+
keyboard focus on a row's own move button, not only when a `keydown` happens to be dispatched
|
|
223
|
+
synthetically on the button's host element. The move buttons are composed `<lr-icon-button>`s, so
|
|
224
|
+
real DOM focus during ordinary keyboard use lands on that button's own native `<button>` — one
|
|
225
|
+
shadow boundary deeper than `<lr-reorder-item>`'s own shadow root. The exclusion predicate that
|
|
226
|
+
tells the row's own chrome apart from a consumer's nested control only recognized an element whose
|
|
227
|
+
root node was exactly the item's shadow root, so the nested native button fell through to the
|
|
228
|
+
generic `name === 'button'` exclusion and every Ctrl/Cmd+Arrow press starting from real focus on a
|
|
229
|
+
move button was discarded as though it had come from a consumer's own control.
|
|
230
|
+
- 87d02cb: Fixed `<lr-reorder-list>` in `controlled` mode so it no longer steals focus back to the moved row
|
|
231
|
+
when the consumer has deliberately moved focus elsewhere while an async `finalizePendingMove()` /
|
|
232
|
+
host reconciliation is still in flight. Previously the post-move focus restore unconditionally
|
|
233
|
+
focused the moved row's move button once the host's re-render settled, even when the consumer had
|
|
234
|
+
already moved focus to an unrelated control on the page in the meantime — overriding that
|
|
235
|
+
deliberate choice. The restore now only runs when the pre-restore focus was still somewhere inside
|
|
236
|
+
this list, or there was nothing meaningful to preserve (nothing focused, or the previously-focused
|
|
237
|
+
node was disconnected by the host's own reconciliation); a still-connected external focus target
|
|
238
|
+
is left alone.
|
|
239
|
+
- cada7da: `<lr-table>`'s `editType: 'select'` cell editor now shows a themed disclosure chevron instead of
|
|
240
|
+
looking like a plain text field. `appearance: none` on `select[part='cell-editor']` removed the
|
|
241
|
+
native arrow with no replacement; the glyph is repainted on the enclosing `[part='cell']` (a bare
|
|
242
|
+
`<select>` cannot host a decorative child, and a `mask` can't apply to the select itself without
|
|
243
|
+
clipping its own text), using the same mask + `background: currentColor` technique already shipped
|
|
244
|
+
for the map attribution-toggle glyph, positioned at the logical inline-end edge so it mirrors
|
|
245
|
+
correctly under `dir="rtl"` and survives `forced-colors: active`. The `text`/`number` cell editors
|
|
246
|
+
are unaffected.
|
|
247
|
+
- e4402ef: Fixed `<lr-thread-list>` data-mode rows so choosing a `renderActions`-rendered menu action (for
|
|
248
|
+
example a consumer's `<lr-dropdown>` containing an `<lr-menu>`) no longer also fires the row's own
|
|
249
|
+
`lr-select` and selects/opens the conversation. The row's `lr-select` listener previously reacted to
|
|
250
|
+
any `lr-select`-named event that bubbled through the `<lr-conversation-item>`, including one
|
|
251
|
+
coincidentally emitted by a `renderActions`-rendered descendant (`<lr-menu>` fires its own
|
|
252
|
+
`lr-select` on item choice). It now only treats the event as row activation when it was dispatched
|
|
253
|
+
directly on the `<lr-conversation-item>` itself (`e.target === e.currentTarget`), which is how a
|
|
254
|
+
real row click/keyboard activation always dispatches it; a descendant's bubbled event is still
|
|
255
|
+
absorbed at the row boundary (as before) but no longer re-emitted as the row's own selection.
|
|
256
|
+
|
|
3
257
|
## 17.0.0
|
|
4
258
|
|
|
5
259
|
### Major Changes
|
package/README.md
CHANGED
|
@@ -476,11 +476,11 @@ registerLyraLocale("en", {
|
|
|
476
476
|
});
|
|
477
477
|
```
|
|
478
478
|
|
|
479
|
-
|
|
479
|
+
Twelve translation catalogs now ship as side-effect-only modules, so a common locale no longer needs a
|
|
480
480
|
hand-written catalog at all:
|
|
481
481
|
|
|
482
482
|
```js
|
|
483
|
-
import "@aceshooting/lyra-ui/translations/fr.js"; // also ar, de, es, fa, he, it, ja, pt-BR, ru, zh-CN
|
|
483
|
+
import "@aceshooting/lyra-ui/translations/fr.js"; // also ar, de, es, fa, he, it, ja, pt-BR, ro, ru, zh-CN
|
|
484
484
|
```
|
|
485
485
|
|
|
486
486
|
Each locale also ships as twelve smaller per-family slices, so an app using only a handful of
|