@aceshooting/lyra-ui 18.4.0 → 19.0.1

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 (53) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/mcp-app/mcp-app.class.d.ts +6 -2
  5. package/dist/components/agent-tools/mcp-app/mcp-app.class.js +1 -1
  6. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -1
  7. package/dist/components/charts/chart/chart.class.d.ts +12 -3
  8. package/dist/components/charts/chart/chart.class.js +2 -2
  9. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +2 -2
  10. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +3 -3
  11. package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
  12. package/dist/components/data/table/table.class.d.ts +2 -1
  13. package/dist/components/data/table/table.class.js +1 -1
  14. package/dist/components/forms/combobox/combobox.class.d.ts +2 -2
  15. package/dist/components/forms/combobox/combobox.class.js +3 -2
  16. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  17. package/dist/components/forms/date-picker/calendar-core.js +1 -1
  18. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  19. package/dist/components/forms/select/select.class.d.ts +2 -2
  20. package/dist/components/forms/select/select.class.js +4 -2
  21. package/dist/components/forms/select/select.styles.js +1 -1
  22. package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
  23. package/dist/components/media/file-input/file-input.class.d.ts +6 -5
  24. package/dist/components/media/file-input/file-input.class.js +1 -1
  25. package/dist/components/media/image-viewer/image-viewer.class.d.ts +2 -2
  26. package/dist/components/media/lightbox/lightbox.class.d.ts +1 -1
  27. package/dist/components/media/pan-zoom/pan-zoom.class.d.ts +1 -1
  28. package/dist/components/media/pan-zoom/pan-zoom.d.ts +1 -1
  29. package/dist/components/overlays/dialog/dialog.class.d.ts +12 -6
  30. package/dist/components/overlays/dialog/dialog.class.js +3 -6
  31. package/dist/components/retrieval/retrieval-search/retrieval-search.class.d.ts +3 -4
  32. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js +2 -2
  33. package/dist/components/utility/copy-button/copy-button.class.d.ts +9 -6
  34. package/dist/components/utility/copy-button/copy-button.class.js +1 -1
  35. package/dist/components/utility/icon/icon.class.d.ts +3 -2
  36. package/dist/components/utility/icon/icon.class.js +1 -1
  37. package/dist/internal/accessibility-visibility.js +1 -1
  38. package/dist/internal/overlay-stack.js +1 -1
  39. package/dist/internal/package-metadata.d.ts +1 -1
  40. package/dist/internal/package-metadata.js +1 -1
  41. package/dist/internal/safe-svg.d.ts +15 -11
  42. package/dist/internal/safe-svg.js +1 -1
  43. package/llms/components/lr-agent-workspace.md +2 -2
  44. package/llms/components/lr-chart.md +13 -6
  45. package/llms/components/lr-copy-button.md +6 -6
  46. package/llms/components/lr-dialog.md +5 -3
  47. package/llms/components/lr-file-input.md +3 -2
  48. package/llms/components/lr-mcp-app.md +5 -0
  49. package/llms/components/lr-retrieval-search.md +2 -2
  50. package/llms-full.txt +37 -21
  51. package/package.json +2 -2
  52. package/vscode-html-data.json +1 -1
  53. package/web-types.json +1 -1
@@ -83,10 +83,10 @@ Citation; truncated?: boolean; omittedTokens?: number; redactions?: ContextInspe
83
83
  - `composerStatus: ChatComposerStatus = 'idle'` (attribute `composer-status`) — `'idle' | 'sending' |
84
84
  'streaming'`, `lr-chat-composer`'s own union; invalid values read as `idle` without rewriting the
85
85
  host attribute
86
- - `composerPlaceholder: string = ''` (attribute `composer-placeholder`)
86
+ - `composerPlaceholder?: string` (attribute `composer-placeholder`)
87
87
  - `composerMinRows: number = 1` (attribute `composer-min-rows`), `composerMaxRows: number = 8`
88
88
  (attribute `composer-max-rows`)
89
- - `label: string = ''` — accessible name and visible heading
89
+ - `label?: string` — accessible name and visible heading; omission uses the localized default and an explicit empty string suppresses it
90
90
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — host-level accessible-name
91
91
  override for the internal `role="region"` root
92
92
 
@@ -100,10 +100,11 @@ structured points retain their y-value formatting.
100
100
  draws side by side with the first on that axis. Omitted series share one implicit group, so
101
101
  every chart written before `stack` existed sums exactly as it always did. Only meaningful on an
102
102
  axis that is actually stacked — see `stacked`/`stackedAxes` below.
103
- `LyraChartPoint { readonly x: number; readonly
104
- y: number; readonly r?: number; readonly label?: string }`: `r` is the bubble
105
- radius, and the optional per-point `label` is retained by events, CSV export, keyboard
106
- announcements, generated summaries, and the accessible table. Point wording is localized as
103
+ `LyraChartPoint { readonly x: number; readonly y: number; readonly r?: number; readonly id?:
104
+ string | number; readonly label?: string }`: `r` is the bubble radius, and the optional primitive
105
+ `id` is retained by activation events for application navigation or selection. Objects, symbols,
106
+ and non-finite numeric ids are omitted. The optional per-point `label` is retained by events, CSV
107
+ export, keyboard announcements, generated summaries, and the accessible table. Point wording is localized as
107
108
  whole messages: `chartPointCoordinates`, `chartBubblePointCoordinates`, and
108
109
  `chartLabeledPoint` own coordinate names, order, separators, and the label wrapper. A caller's
109
110
  point label is interpolated verbatim rather than translated or parsed. At runtime, non-record
@@ -381,9 +382,15 @@ const series = [
381
382
  point/segment, when a generated-table value is activated, or when Enter/Space activates the
382
383
  keyboard-current canvas datum; `detail: { datasetIndex: number, index: number, label: string |
383
384
  undefined, value: unknown }`). For scatter/bubble points, `label` prefers the per-point label and
384
- `value` is the complete `LyraChartPoint`, including optional `r` and `label`.
385
+ `value` is the complete `LyraChartPoint`, including optional `r`, `id`, and `label`. A primitive
386
+ `id` survives the same pointer, data-table, and keyboard activation paths; invalid ids are omitted.
385
387
  `lr-datum-activate` emits the same activation with `kind: 'bar'|'point'|'segment'|'slice'` for
386
- family-wide handling; `lr-point-click` remains as a compatibility event. Also
388
+ family-wide handling. For scatter/bubble, both events carry the same `LyraChartPoint` value,
389
+ including a string or finite-number `id` when supplied; invalid ids are omitted. The public
390
+ `LyraChartPoint.id` type is `string | number`, while the activation event's heterogeneous `value`
391
+ is typed `unknown`. Validate or explicitly narrow the value itself before reading point fields;
392
+ checking `detail.kind === 'point'` alone does not narrow `detail.value` in TypeScript.
393
+ `lr-point-click` remains as a compatibility event. Also
387
394
  `lr-before-legend-visibility-change` (cancelable proposal), and
388
395
  `lr-legend-visibility-change` (accepted commit). Both legend events carry
389
396
  `{ datasetIndex: number, visible: boolean, hiddenDatasets: readonly number[] }`; the latter is the
@@ -35,12 +35,12 @@ buttons.
35
35
  Resolution prefers an element in the button's own root, then falls back to the owner document;
36
36
  a duplicate same-root id therefore wins without preventing a shadow-contained button from
37
37
  targeting an otherwise valid document-owned source.
38
- - `copyLabel: string = ''` (attribute `copy-label`) — built-in button accessible name and resting
39
- tooltip text; empty uses localized `copy`.
40
- - `successLabel: string = ''` (attribute `success-label`) — confirmation name/tooltip text; empty
41
- uses localized `copied`.
42
- - `errorLabel: string = ''` (attribute `error-label`) — failure name/tooltip text; empty uses
43
- localized `copyFailed`.
38
+ - `copyLabel?: string` (attribute `copy-label`) — built-in button accessible name and resting
39
+ tooltip text; omission uses localized `copy`, while an explicit empty string suppresses it.
40
+ - `successLabel?: string` (attribute `success-label`) — confirmation name/tooltip text; omission
41
+ uses localized `copied`, while an explicit empty string suppresses it.
42
+ - `errorLabel?: string` (attribute `error-label`) — failure name/tooltip text; omission uses
43
+ localized `copyFailed`, while an explicit empty string suppresses it.
44
44
  - `tooltip: 'full' | 'copy' | 'none' = 'full'` (reflected) — `full` shows the resting tooltip on
45
45
  hover/focus and feedback after activation, `copy` shows feedback only, and `none` disables it.
46
46
  - `tooltipPlacement: 'top' | 'right' | 'bottom' | 'left' = 'top'` (attribute
@@ -178,10 +178,12 @@ painted surface sits one boundary deeper. `<lr-drawer>` inherits this control an
178
178
  `<lr-icon-button>` itself.
179
179
 
180
180
  **The body is keyboard-reachable while it overflows.** `[part="body"]` is the element that scrolls,
181
- so it carries `tabindex="-1"` and joins the focus order **only while its content actually
182
- overflows** — a dialog whose content is nothing but prose, a table, or a rendered document used to
181
+ so it carries `tabindex="0"` **only while its content actually overflows** — a dialog whose
182
+ content is nothing but prose, a table, or a rendered document used to
183
183
  be scrollable with a mouse and completely unreachable from the keyboard, because a scroll container
184
- with no focusable child is not a stop of its own. A short body never becomes a gratuitous stop.
184
+ with no focusable child is not a stop of its own. A short body keeps `tabindex="-1"` and never
185
+ becomes a gratuitous stop. Resize and content changes update the body's tabindex as its overflow
186
+ changes; `<lr-drawer>` uses the same behavior.
185
187
 
186
188
  It takes focus like any other stop, so it styles like one: `::part(body):focus-visible` draws the
187
189
  standard `--lr-focus-ring-*` ring, inset (`outline-offset` is negative) because the body is flush
@@ -87,8 +87,9 @@ enabled buttons retain pointer feedback.
87
87
  constrained spaces (a toolbar, a table cell) — the same convention as `lr-empty`'s `compact`. The
88
88
  dashed border stays; only the internal spacing shrinks. `false` (the default) keeps the full
89
89
  `--lr-space-l` dropzone.
90
- - `label: string = ''` and `hint: string = ''`; an empty `label` leaves the localized dropzone
91
- instruction (`fileInputDefaultLabel`) as the visible fallback
90
+ - `label?: string` — form-control label. Omission uses the localized dropzone instruction
91
+ (`fileInputDefaultLabel`); an explicit empty string suppresses that fallback. `hint: string = ''`
92
+ remains empty when omitted and can be supplied through the named slot as well
92
93
  - `errorText: string = ''` (attribute `error-text`) — plain-text owned validation feedback. When
93
94
  it is empty, a `customError` message is rendered when present; otherwise an intrinsic validation
94
95
  message appears after the control has been interacted with. Rich `error` slot content replaces
@@ -47,6 +47,11 @@ typed events. Capabilities are denied unless explicitly enabled in `resource.per
47
47
  request with exactly one of `{ frameGeneration, result }` or `{ frameGeneration, error }`. Missing,
48
48
  stale, or ambiguous correlation fails closed. Both methods are no-ops before a frame exists.
49
49
 
50
+ The initial `host-context` message includes a document-bound nonce and transfers a `MessagePort` to
51
+ the executable document. Frame requests and host messages after bootstrap use that port. A same-frame
52
+ navigation closes the port, invalidates the nonce and generation, and mounts a fresh sandbox before
53
+ host data can be delivered.
54
+
50
55
  **Exported types:** `McpAppResource`, `McpAppCsp`, `McpAppPermissions`,
51
56
  `McpAppToolCallDetail`, `McpAppToolResultOptions`, and `LyraMcpAppEventMap`.
52
57
 
@@ -60,8 +60,8 @@ at the same size tier, so the toolbar row renders as one flush line.
60
60
  Remove any host `role="status"`/`role="alert"` hand-added before this property existed once it
61
61
  is set — otherwise the initial state is announced twice, through the native role and again
62
62
  through the shared sink
63
- - `placeholder: string = ''` — falls back to the localized generic "Search" placeholder, which also
64
- becomes the field's accessible name
63
+ - `placeholder?: string` — query-field placeholder. Omission uses the localized generic "Search"
64
+ placeholder; an explicit empty string suppresses that fallback
65
65
  - `label?: string` — fallback name for the `role="search"` landmark; omission uses the localized
66
66
  retrieval-search label, while an explicit empty string stays empty
67
67
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — as a JS-only property while
package/llms-full.txt CHANGED
@@ -22621,10 +22621,12 @@ painted surface sits one boundary deeper. `<lr-drawer>` inherits this control an
22621
22621
  `<lr-icon-button>` itself.
22622
22622
 
22623
22623
  **The body is keyboard-reachable while it overflows.** `[part="body"]` is the element that scrolls,
22624
- so it carries `tabindex="-1"` and joins the focus order **only while its content actually
22625
- overflows** — a dialog whose content is nothing but prose, a table, or a rendered document used to
22624
+ so it carries `tabindex="0"` **only while its content actually overflows** — a dialog whose
22625
+ content is nothing but prose, a table, or a rendered document used to
22626
22626
  be scrollable with a mouse and completely unreachable from the keyboard, because a scroll container
22627
- with no focusable child is not a stop of its own. A short body never becomes a gratuitous stop.
22627
+ with no focusable child is not a stop of its own. A short body keeps `tabindex="-1"` and never
22628
+ becomes a gratuitous stop. Resize and content changes update the body's tabindex as its overflow
22629
+ changes; `<lr-drawer>` uses the same behavior.
22628
22630
 
22629
22631
  It takes focus like any other stop, so it styles like one: `::part(body):focus-visible` draws the
22630
22632
  standard `--lr-focus-ring-*` ring, inset (`outline-offset` is negative) because the body is flush
@@ -25012,12 +25014,12 @@ buttons.
25012
25014
  Resolution prefers an element in the button's own root, then falls back to the owner document;
25013
25015
  a duplicate same-root id therefore wins without preventing a shadow-contained button from
25014
25016
  targeting an otherwise valid document-owned source.
25015
- - `copyLabel: string = ''` (attribute `copy-label`) — built-in button accessible name and resting
25016
- tooltip text; empty uses localized `copy`.
25017
- - `successLabel: string = ''` (attribute `success-label`) — confirmation name/tooltip text; empty
25018
- uses localized `copied`.
25019
- - `errorLabel: string = ''` (attribute `error-label`) — failure name/tooltip text; empty uses
25020
- localized `copyFailed`.
25017
+ - `copyLabel?: string` (attribute `copy-label`) — built-in button accessible name and resting
25018
+ tooltip text; omission uses localized `copy`, while an explicit empty string suppresses it.
25019
+ - `successLabel?: string` (attribute `success-label`) — confirmation name/tooltip text; omission
25020
+ uses localized `copied`, while an explicit empty string suppresses it.
25021
+ - `errorLabel?: string` (attribute `error-label`) — failure name/tooltip text; omission uses
25022
+ localized `copyFailed`, while an explicit empty string suppresses it.
25021
25023
  - `tooltip: 'full' | 'copy' | 'none' = 'full'` (reflected) — `full` shows the resting tooltip on
25022
25024
  hover/focus and feedback after activation, `copy` shows feedback only, and `none` disables it.
25023
25025
  - `tooltipPlacement: 'top' | 'right' | 'bottom' | 'left' = 'top'` (attribute
@@ -28153,8 +28155,9 @@ enabled buttons retain pointer feedback.
28153
28155
  constrained spaces (a toolbar, a table cell) — the same convention as `lr-empty`'s `compact`. The
28154
28156
  dashed border stays; only the internal spacing shrinks. `false` (the default) keeps the full
28155
28157
  `--lr-space-l` dropzone.
28156
- - `label: string = ''` and `hint: string = ''`; an empty `label` leaves the localized dropzone
28157
- instruction (`fileInputDefaultLabel`) as the visible fallback
28158
+ - `label?: string` — form-control label. Omission uses the localized dropzone instruction
28159
+ (`fileInputDefaultLabel`); an explicit empty string suppresses that fallback. `hint: string = ''`
28160
+ remains empty when omitted and can be supplied through the named slot as well
28158
28161
  - `errorText: string = ''` (attribute `error-text`) — plain-text owned validation feedback. When
28159
28162
  it is empty, a `customError` message is rendered when present; otherwise an intrinsic validation
28160
28163
  message appears after the control has been interacted with. Rich `error` slot content replaces
@@ -30802,10 +30805,11 @@ structured points retain their y-value formatting.
30802
30805
  draws side by side with the first on that axis. Omitted series share one implicit group, so
30803
30806
  every chart written before `stack` existed sums exactly as it always did. Only meaningful on an
30804
30807
  axis that is actually stacked — see `stacked`/`stackedAxes` below.
30805
- `LyraChartPoint { readonly x: number; readonly
30806
- y: number; readonly r?: number; readonly label?: string }`: `r` is the bubble
30807
- radius, and the optional per-point `label` is retained by events, CSV export, keyboard
30808
- announcements, generated summaries, and the accessible table. Point wording is localized as
30808
+ `LyraChartPoint { readonly x: number; readonly y: number; readonly r?: number; readonly id?:
30809
+ string | number; readonly label?: string }`: `r` is the bubble radius, and the optional primitive
30810
+ `id` is retained by activation events for application navigation or selection. Objects, symbols,
30811
+ and non-finite numeric ids are omitted. The optional per-point `label` is retained by events, CSV
30812
+ export, keyboard announcements, generated summaries, and the accessible table. Point wording is localized as
30809
30813
  whole messages: `chartPointCoordinates`, `chartBubblePointCoordinates`, and
30810
30814
  `chartLabeledPoint` own coordinate names, order, separators, and the label wrapper. A caller's
30811
30815
  point label is interpolated verbatim rather than translated or parsed. At runtime, non-record
@@ -31083,9 +31087,15 @@ const series = [
31083
31087
  point/segment, when a generated-table value is activated, or when Enter/Space activates the
31084
31088
  keyboard-current canvas datum; `detail: { datasetIndex: number, index: number, label: string |
31085
31089
  undefined, value: unknown }`). For scatter/bubble points, `label` prefers the per-point label and
31086
- `value` is the complete `LyraChartPoint`, including optional `r` and `label`.
31090
+ `value` is the complete `LyraChartPoint`, including optional `r`, `id`, and `label`. A primitive
31091
+ `id` survives the same pointer, data-table, and keyboard activation paths; invalid ids are omitted.
31087
31092
  `lr-datum-activate` emits the same activation with `kind: 'bar'|'point'|'segment'|'slice'` for
31088
- family-wide handling; `lr-point-click` remains as a compatibility event. Also
31093
+ family-wide handling. For scatter/bubble, both events carry the same `LyraChartPoint` value,
31094
+ including a string or finite-number `id` when supplied; invalid ids are omitted. The public
31095
+ `LyraChartPoint.id` type is `string | number`, while the activation event's heterogeneous `value`
31096
+ is typed `unknown`. Validate or explicitly narrow the value itself before reading point fields;
31097
+ checking `detail.kind === 'point'` alone does not narrow `detail.value` in TypeScript.
31098
+ `lr-point-click` remains as a compatibility event. Also
31089
31099
  `lr-before-legend-visibility-change` (cancelable proposal), and
31090
31100
  `lr-legend-visibility-change` (accepted commit). Both legend events carry
31091
31101
  `{ datasetIndex: number, visible: boolean, hiddenDatasets: readonly number[] }`; the latter is the
@@ -32249,6 +32259,7 @@ These named interfaces and helper signatures are available to typed integrations
32249
32259
  readonly x: number;
32250
32260
  readonly y: number;
32251
32261
  readonly r?: number;
32262
+ readonly id?: string | number;
32252
32263
  readonly label?: string;
32253
32264
  }`
32254
32265
  Import: `@aceshooting/lyra-ui/components/charts/chart/chart.class.js`.
@@ -38719,10 +38730,10 @@ Citation; truncated?: boolean; omittedTokens?: number; redactions?: ContextInspe
38719
38730
  - `composerStatus: ChatComposerStatus = 'idle'` (attribute `composer-status`) — `'idle' | 'sending' |
38720
38731
  'streaming'`, `lr-chat-composer`'s own union; invalid values read as `idle` without rewriting the
38721
38732
  host attribute
38722
- - `composerPlaceholder: string = ''` (attribute `composer-placeholder`)
38733
+ - `composerPlaceholder?: string` (attribute `composer-placeholder`)
38723
38734
  - `composerMinRows: number = 1` (attribute `composer-min-rows`), `composerMaxRows: number = 8`
38724
38735
  (attribute `composer-max-rows`)
38725
- - `label: string = ''` — accessible name and visible heading
38736
+ - `label?: string` — accessible name and visible heading; omission uses the localized default and an explicit empty string suppresses it
38726
38737
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — host-level accessible-name
38727
38738
  override for the internal `role="region"` root
38728
38739
 
@@ -42630,6 +42641,11 @@ typed events. Capabilities are denied unless explicitly enabled in `resource.per
42630
42641
  request with exactly one of `{ frameGeneration, result }` or `{ frameGeneration, error }`. Missing,
42631
42642
  stale, or ambiguous correlation fails closed. Both methods are no-ops before a frame exists.
42632
42643
 
42644
+ The initial `host-context` message includes a document-bound nonce and transfers a `MessagePort` to
42645
+ the executable document. Frame requests and host messages after bootstrap use that port. A same-frame
42646
+ navigation closes the port, invalidates the nonce and generation, and mounts a fresh sandbox before
42647
+ host data can be delivered.
42648
+
42633
42649
  **Exported types:** `McpAppResource`, `McpAppCsp`, `McpAppPermissions`,
42634
42650
  `McpAppToolCallDetail`, `McpAppToolResultOptions`, and `LyraMcpAppEventMap`.
42635
42651
 
@@ -45731,8 +45747,8 @@ at the same size tier, so the toolbar row renders as one flush line.
45731
45747
  Remove any host `role="status"`/`role="alert"` hand-added before this property existed once it
45732
45748
  is set — otherwise the initial state is announced twice, through the native role and again
45733
45749
  through the shared sink
45734
- - `placeholder: string = ''` — falls back to the localized generic "Search" placeholder, which also
45735
- becomes the field's accessible name
45750
+ - `placeholder?: string` — query-field placeholder. Omission uses the localized generic "Search"
45751
+ placeholder; an explicit empty string suppresses that fallback
45736
45752
  - `label?: string` — fallback name for the `role="search"` landmark; omission uses the localized
45737
45753
  retrieval-search label, while an explicit empty string stays empty
45738
45754
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — as a JS-only property while
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aceshooting/lyra-ui",
3
- "version": "18.4.0",
3
+ "version": "19.0.1",
4
4
  "description": "Free, independent Lit web components: an open-source alternative to Shoelace and Web Awesome with accessible forms, dashboards, charts, and agent UI.",
5
5
  "keywords": [
6
6
  "web-components",
@@ -2890,7 +2890,7 @@
2890
2890
  "test:translation-slices": "node scripts/generate-translation-slices.test.mjs",
2891
2891
  "check:default-strings": "node scripts/check-default-strings.mjs",
2892
2892
  "test:default-strings": "node scripts/check-default-strings.test.mjs",
2893
- "test:tooling": "node scripts/build-llms.test.mjs && node --test scripts/create-component.test.mjs && node --test scripts/full-engine-shard.test.mjs && node --test scripts/coverage-shard-runner.test.mjs && node --test scripts/lint-ci-shard.test.mjs && node --test scripts/web-test-runner-config.test.mjs && node scripts/component-families.test.mjs && node scripts/maplibre-peer-range.test.mjs && node scripts/migrate-wa.test.mjs && node scripts/visual-regression-compare.test.mjs && node --test scripts/visual-regression-shard.test.mjs && node scripts/visual-regression-config.test.mjs && node --test scripts/check-source-policy.test.mjs scripts/check-test-assertions.test.mjs && node scripts/bundle-budgets.test.mjs && node scripts/compact-build-js.test.mjs && node scripts/compact-build-css.test.mjs && node scripts/compact-build-declarations.test.mjs && node --test scripts/normalize-mixin-declarations.test.mjs && node --test scripts/check-palette-freshness.test.mjs && node --test scripts/is-main-module.test.mjs && node scripts/manifest-compact.test.mjs && node --test scripts/viewer-fixture-generators.test.mjs && node --test scripts/strip-css-comments.test.mjs && node scripts/editor-web-types.test.mjs && node scripts/check-migration-coverage.test.mjs && node --test scripts/generate-theme-bootstrap.test.mjs",
2893
+ "test:tooling": "node scripts/build-llms.test.mjs && node --test scripts/build-testing-event-registry.test.mjs && node --test scripts/create-component.test.mjs && node --test scripts/full-engine-shard.test.mjs && node --test scripts/coverage-shard-runner.test.mjs && node --test scripts/lint-ci-shard.test.mjs && node --test scripts/web-test-runner-config.test.mjs && node scripts/component-families.test.mjs && node scripts/maplibre-peer-range.test.mjs && node scripts/migrate-wa.test.mjs && node scripts/visual-regression-compare.test.mjs && node --test scripts/visual-regression-shard.test.mjs && node scripts/visual-regression-config.test.mjs && node --test scripts/check-source-policy.test.mjs scripts/check-test-assertions.test.mjs && node scripts/bundle-budgets.test.mjs && node scripts/compact-build-js.test.mjs && node scripts/compact-build-css.test.mjs && node scripts/compact-build-declarations.test.mjs && node --test scripts/normalize-mixin-declarations.test.mjs && node --test scripts/check-palette-freshness.test.mjs && node --test scripts/is-main-module.test.mjs && node scripts/manifest-compact.test.mjs && node --test scripts/viewer-fixture-generators.test.mjs && node --test scripts/strip-css-comments.test.mjs && node scripts/editor-web-types.test.mjs && node scripts/check-migration-coverage.test.mjs && node --test scripts/generate-theme-bootstrap.test.mjs",
2894
2894
  "framework-types": "node scripts/generate-framework-types.mjs",
2895
2895
  "check:framework-types": "node scripts/check-framework-types.mjs",
2896
2896
  "test:framework-types": "node scripts/generate-framework-types.test.mjs",