@aceshooting/lyra-ui 11.2.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/CHANGELOG.md +407 -0
  2. package/README.md +11 -8
  3. package/custom-elements.json +1 -1
  4. package/dist/all.d.ts +1 -0
  5. package/dist/all.js +1 -1
  6. package/dist/autoloader.js +1 -1
  7. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +0 -1
  8. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
  9. package/dist/components/charts/chart/chart.class.d.ts +13 -1
  10. package/dist/components/charts/chart/histogram-bin.d.ts +0 -1
  11. package/dist/components/charts/chart/histogram-bin.js +1 -1
  12. package/dist/components/charts/chart/lite-chart.class.d.ts +22 -9
  13. package/dist/components/charts/chart/lite-chart.class.js +6 -6
  14. package/dist/components/conversation/code-block/code-block-shared.d.ts +4 -54
  15. package/dist/components/conversation/code-block/code-block-shared.js +1 -1
  16. package/dist/components/conversation/code-block/shiki-types.d.ts +2 -1
  17. package/dist/components/conversation/generation-metrics/generation-metrics.class.js +1 -1
  18. package/dist/components/conversation/model-select/model-select.class.d.ts +0 -3
  19. package/dist/components/conversation/model-select/model-select.class.js +1 -1
  20. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +1 -1
  21. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +0 -1
  22. package/dist/components/conversation/voice-picker/voice-picker.class.js +1 -1
  23. package/dist/components/data/data-grid/data-grid.class.js +1 -1
  24. package/dist/components/data/funnel/funnel.class.d.ts +92 -0
  25. package/dist/components/data/funnel/funnel.class.js +25 -0
  26. package/dist/components/data/funnel/funnel.d.ts +1 -0
  27. package/dist/components/data/funnel/funnel.js +1 -0
  28. package/dist/components/data/funnel/funnel.styles.d.ts +1 -0
  29. package/dist/components/data/funnel/funnel.styles.js +127 -0
  30. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +0 -1
  31. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  32. package/dist/components/data/heatmap/heatmap.class.d.ts +199 -14
  33. package/dist/components/data/heatmap/heatmap.class.js +30 -22
  34. package/dist/components/data/heatmap/heatmap.styles.js +36 -0
  35. package/dist/components/data/index.d.ts +1 -0
  36. package/dist/components/data/index.js +1 -1
  37. package/dist/components/data/table/table.class.d.ts +18 -4
  38. package/dist/components/data/table/table.class.js +2 -2
  39. package/dist/components/data/table/table.styles.js +2 -1
  40. package/dist/components/data/timeline/timeline-cluster.d.ts +1 -0
  41. package/dist/components/data/timeline/timeline-cluster.js +1 -0
  42. package/dist/components/data/timeline/timeline-item.class.d.ts +17 -2
  43. package/dist/components/data/timeline/timeline-item.class.js +13 -2
  44. package/dist/components/data/timeline/timeline-item.styles.js +65 -0
  45. package/dist/components/data/timeline/timeline.class.d.ts +83 -27
  46. package/dist/components/data/timeline/timeline.class.js +3 -3
  47. package/dist/components/data/timeline/timeline.d.ts +1 -0
  48. package/dist/components/data/timeline/timeline.js +1 -1
  49. package/dist/components/data/timeline/timeline.styles.js +14 -0
  50. package/dist/components/forms/button/button.class.js +1 -1
  51. package/dist/components/forms/checkbox/checkbox.class.d.ts +0 -1
  52. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  53. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +0 -1
  54. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  55. package/dist/components/forms/code-editor/code-editor.class.js +1 -1
  56. package/dist/components/forms/color-picker/color-picker.class.js +1 -1
  57. package/dist/components/forms/combobox/combobox.class.d.ts +7 -1
  58. package/dist/components/forms/combobox/combobox.class.js +3 -2
  59. package/dist/components/forms/combobox/combobox.styles.js +1 -1
  60. package/dist/components/forms/date-picker/date-input.class.d.ts +23 -0
  61. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  62. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +0 -1
  63. package/dist/components/forms/input/native-time-input.class.js +1 -1
  64. package/dist/components/forms/input/time-input-shared.d.ts +2 -1
  65. package/dist/components/forms/input/time-input.class.js +1 -1
  66. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +0 -1
  67. package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
  68. package/dist/components/forms/radio/radio-button.styles.d.ts +0 -1
  69. package/dist/components/forms/radio/radio-button.styles.js +1 -1
  70. package/dist/components/forms/radio/radio-group.class.d.ts +0 -1
  71. package/dist/components/forms/radio/radio-group.class.js +1 -1
  72. package/dist/components/forms/radio/radio.class.d.ts +0 -1
  73. package/dist/components/forms/radio/radio.class.js +1 -1
  74. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +0 -1
  75. package/dist/components/forms/rubric-form/rubric-form.class.js +1 -1
  76. package/dist/components/forms/select/select.class.d.ts +0 -1
  77. package/dist/components/forms/select/select.class.js +1 -1
  78. package/dist/components/forms/slider/slider.class.d.ts +0 -1
  79. package/dist/components/forms/slider/slider.class.js +1 -1
  80. package/dist/components/forms/switch/switch.class.d.ts +0 -1
  81. package/dist/components/forms/switch/switch.class.js +1 -1
  82. package/dist/components/forms/time-range/time-range.class.d.ts +0 -1
  83. package/dist/components/forms/time-range/time-range.class.js +1 -1
  84. package/dist/components/forms/token-input/token-input.class.d.ts +0 -1
  85. package/dist/components/forms/token-input/token-input.class.js +1 -1
  86. package/dist/components/layout/app-rail/app-rail-item.class.d.ts +16 -0
  87. package/dist/components/layout/app-rail/app-rail-item.class.js +4 -4
  88. package/dist/components/layout/dashboard-grid/layout-internal.d.ts +0 -1
  89. package/dist/components/layout/dashboard-grid/layout-internal.js +1 -1
  90. package/dist/components/layout/details/accordion-owner.d.ts +1 -1
  91. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +32 -3
  92. package/dist/components/layout/filter-bar/filter-bar.class.js +2 -1
  93. package/dist/components/layout/menu/menu-item.class.js +1 -1
  94. package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
  95. package/dist/components/layout/widget/widget.class.d.ts +16 -0
  96. package/dist/components/layout/widget/widget.class.js +2 -2
  97. package/dist/components/lr-funnel.d.ts +1 -0
  98. package/dist/components/lr-funnel.js +1 -0
  99. package/dist/components/media/av-player/av-metadata.d.ts +0 -2
  100. package/dist/components/media/av-player/av-metadata.js +1 -1
  101. package/dist/components/media/file-input/file-input.class.d.ts +0 -1
  102. package/dist/components/media/file-input/file-input.class.js +1 -1
  103. package/dist/components/media/flag/flag-peer-bulk-standard.d.ts +25 -0
  104. package/dist/components/media/flag/flag-peer-bulk-standard.js +1 -0
  105. package/dist/components/media/flag/flag.class.d.ts +8 -0
  106. package/dist/components/media/flag/flag.class.js +1 -1
  107. package/dist/components/media/map/map-loader.d.ts +4 -1
  108. package/dist/components/media/map/map.class.d.ts +242 -23
  109. package/dist/components/media/map/map.class.js +2 -2
  110. package/dist/components/overlays/chip/chip-group.class.d.ts +16 -0
  111. package/dist/components/overlays/chip/chip-group.class.js +10 -3
  112. package/dist/components/overlays/overlay/popover.class.d.ts +7 -1
  113. package/dist/components/overlays/overlay/popover.class.js +1 -1
  114. package/dist/components/overlays/overlay/tooltip.class.d.ts +1 -0
  115. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  116. package/dist/components/overlays/progress/progress-shared.d.ts +0 -2
  117. package/dist/components/overlays/progress/progress-shared.js +1 -1
  118. package/dist/components/overlays/rating/rating.class.js +1 -1
  119. package/dist/components/retrieval/graph/graph-canvas.d.ts +10 -9
  120. package/dist/components/retrieval/mind-map/mind-map-layout.d.ts +0 -4
  121. package/dist/components/retrieval/mind-map/mind-map-layout.js +1 -1
  122. package/dist/components/utility/format/format-options.d.ts +0 -2
  123. package/dist/components/utility/format/format-options.js +1 -1
  124. package/dist/components/utility/icon/icon-resource.d.ts +0 -2
  125. package/dist/components/utility/icon/icon-resource.js +1 -1
  126. package/dist/components/viewers/archive-viewer/zip-resource-guard.d.ts +2 -1
  127. package/dist/components/viewers/docx-viewer/docx-resource-guard.d.ts +0 -3
  128. package/dist/components/viewers/docx-viewer/docx-resource-guard.js +1 -1
  129. package/dist/components/viewers/ebook-viewer/ebook-loader.d.ts +2 -1
  130. package/dist/components/viewers/ebook-viewer/epub-resource-guard.d.ts +0 -3
  131. package/dist/components/viewers/ebook-viewer/epub-resource-guard.js +1 -1
  132. package/dist/components/viewers/pdf-viewer/pdf-loader.d.ts +2 -2
  133. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +2 -2
  134. package/dist/components/viewers/pptx-viewer/pptx-resource-guard.d.ts +0 -2
  135. package/dist/components/viewers/pptx-viewer/pptx-resource-guard.js +1 -1
  136. package/dist/components/viewers/spreadsheet-viewer/xlsx-resource-guard.d.ts +0 -5
  137. package/dist/components/viewers/spreadsheet-viewer/xlsx-resource-guard.js +1 -1
  138. package/dist/custom-elements-jsx.d.ts +16 -8
  139. package/dist/events.d.ts +15 -0
  140. package/dist/internal/accessibility-visibility.d.ts +1 -1
  141. package/dist/internal/anchor-target.d.ts +1 -3
  142. package/dist/internal/anchor-target.js +2 -2
  143. package/dist/internal/anchored-overlay-runtime.d.ts +7 -0
  144. package/dist/internal/anchored-overlay-runtime.js +1 -0
  145. package/dist/internal/announcement-text.d.ts +1 -1
  146. package/dist/internal/ansi.d.ts +0 -4
  147. package/dist/internal/ansi.js +1 -1
  148. package/dist/internal/aria-ownership.d.ts +2 -1
  149. package/dist/internal/autoloader-manifest.js +1 -1
  150. package/dist/internal/autoloader-tags.d.ts +1 -1
  151. package/dist/internal/autoloader-tags.js +1 -1
  152. package/dist/internal/default-strings.generated.d.ts +1 -0
  153. package/dist/internal/default-strings.generated.js +1 -1
  154. package/dist/internal/focus-navigation.d.ts +3 -2
  155. package/dist/internal/form-associated.d.ts +0 -1
  156. package/dist/internal/form-associated.js +1 -1
  157. package/dist/internal/form-control-labels.d.ts +0 -3
  158. package/dist/internal/form-control-labels.js +1 -1
  159. package/dist/internal/localization-runtime.js +1 -1
  160. package/dist/internal/localization-types.d.ts +1 -1
  161. package/dist/internal/localization.js +1 -1
  162. package/dist/internal/lyra-element.d.ts +7 -14
  163. package/dist/internal/lyra-element.js +1 -1
  164. package/dist/internal/nonmodal-overlay-manager.d.ts +9 -0
  165. package/dist/internal/nonmodal-overlay-manager.js +1 -0
  166. package/dist/internal/overlay-manager.d.ts +4 -20
  167. package/dist/internal/overlay-manager.js +1 -1
  168. package/dist/internal/overlay-stack.d.ts +66 -0
  169. package/dist/internal/overlay-stack.js +1 -0
  170. package/dist/internal/package-metadata.d.ts +1 -1
  171. package/dist/internal/package-metadata.js +1 -1
  172. package/dist/internal/positioner.js +1 -1
  173. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  174. package/dist/internal/root-registration-allowlist.js +1 -1
  175. package/dist/internal/text-quote.d.ts +1 -1
  176. package/dist/lyra.d.ts +5 -4
  177. package/dist/lyra.js +1 -1
  178. package/dist/ssr/all.d.ts +1 -0
  179. package/dist/ssr/all.js +1 -1
  180. package/dist/ssr.d.ts +4 -4
  181. package/dist/styles/tokens-root.css +488 -0
  182. package/dist/svelte.d.ts +17 -8
  183. package/dist/translations/ar.js +1 -1
  184. package/dist/translations/de.js +1 -1
  185. package/dist/translations/es.js +1 -1
  186. package/dist/translations/fa.js +1 -1
  187. package/dist/translations/fr.js +1 -1
  188. package/dist/translations/he.js +1 -1
  189. package/dist/translations/ja.js +1 -1
  190. package/dist/translations/pt-BR.js +1 -1
  191. package/dist/translations/ru.js +1 -1
  192. package/dist/translations/zh-CN.js +1 -1
  193. package/dist/utilities/localization.js +1 -1
  194. package/dist/vue.d.ts +16 -8
  195. package/llms/components/lr-app-rail-item.md +8 -1
  196. package/llms/components/lr-app-rail.md +6 -0
  197. package/llms/components/lr-chip-group.md +7 -0
  198. package/llms/components/lr-chip.md +7 -0
  199. package/llms/components/lr-combobox.md +42 -0
  200. package/llms/components/lr-date-input.md +19 -1
  201. package/llms/components/lr-date-picker.md +19 -1
  202. package/llms/components/lr-filter-bar.md +50 -1
  203. package/llms/components/lr-flag.md +14 -0
  204. package/llms/components/lr-funnel.md +122 -0
  205. package/llms/components/lr-heatmap.md +55 -8
  206. package/llms/components/lr-lite-chart.md +20 -8
  207. package/llms/components/lr-map.md +109 -22
  208. package/llms/components/lr-option.md +42 -0
  209. package/llms/components/lr-popover.md +39 -0
  210. package/llms/components/lr-table.md +7 -3
  211. package/llms/components/lr-timeline-item.md +49 -24
  212. package/llms/components/lr-timeline.md +49 -24
  213. package/llms/components/lr-widget.md +7 -1
  214. package/llms/index.md +3 -2
  215. package/llms/peers.md +1 -1
  216. package/llms/shared.md +110 -1
  217. package/llms-full.txt +681 -67
  218. package/llms.txt +1 -1
  219. package/package.json +26 -8
  220. package/vscode-css-data.json +63 -0
  221. package/vscode-html-data.json +108 -23
  222. package/web-types.json +32738 -310
package/CHANGELOG.md CHANGED
@@ -1,5 +1,412 @@
1
1
  # Changelog
2
2
 
3
+ ## 12.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6504adc: Expand `lr-map` with zoom-responsive heatmap radius and intensity, heatmap opacity,
8
+ construction-time world-copy control, allocation-aware resizing, and accessible declarative marker
9
+ activation events.
10
+ - 81dbb6a: Add opt-in automatic value-axis gutter sizing and category-label density to `lr-lite-chart`.
11
+ - acf4c5f: Avoid redundant `lr-heatmap` redraws for unchanged legend snapshots, and keep stable-ID `lr-map`
12
+ GeoJSON additions, removals, and order changes on MapLibre's incremental update path.
13
+ - 5e801f9: Add an opt-in `scroll-mode="auto"` to `lr-table` that keeps page flow while content fits and contains horizontal overflow when the table narrows.
14
+ - 12b4791: Add opt-in collision clustering to time-scaled timelines, with allocation-aware accessible count markers and a typed member activation event.
15
+
16
+ ### Patch Changes
17
+
18
+ - b36d915: Defer anchored-positioning and form-label runtime paths until they are needed, keeping granular
19
+ popover and combobox registrations lighter and documenting first-interaction progressive loading
20
+ for strict initial-JavaScript budgets.
21
+
22
+ ## 12.0.0
23
+
24
+ ### Major Changes
25
+
26
+ - bd0f05f: **Breaking:** `LyraElement` no longer declares the static `getPropertyDescriptor()`, so that member
27
+ is gone from every element's public surface in `custom-elements.json`.
28
+
29
+ This is the release's only substantive breaking change, and in practice nothing consumer-callable
30
+ was removed: `getPropertyDescriptor()` is Lit's own finalization hook, called *by* `ReactiveElement`
31
+ during `finalize()` and never by application code. It appeared on all 285 tags purely because this
32
+ library overrode it, and the manifest projects an inherited static onto every subclass. Only code
33
+ that subclassed an `lr-*` element and overrode the hook itself is affected — a path Lit has already
34
+ deprecated and states will not be called under standard decorators.
35
+
36
+ The major is nonetheless correct rather than pedantic. By this package's own definition of public
37
+ surface, a public static was removed from every element, and the reachable-declaration set of every
38
+ export shrank as a result. The semver gate reports that honestly, and the alternative — shipping it
39
+ as a minor behind a blanket exception — would have meant weakening the gate to let one change past
40
+ it.
41
+
42
+ `@lit/reactive-element` 2.1.2 deprecates that hook and warns during `finalize()`, so every consumer
43
+ saw an unactionable dev-mode warning on every page load that mounted any `lr-*` element, not
44
+ silenceable without disabling Lit's dev warnings wholesale.
45
+
46
+ The more important half was invisible. That override was what implemented the documented
47
+ clone-owned/bounded/frozen collection contract on 182 enrolled property names across 87 modules
48
+ (`colorSteps`, `legendStops`, `annotations` and their equivalents): it wrapped every reactive setter
49
+ and routed owned values through the snapshot helpers. It worked only because the published dist
50
+ ships experimental decorators, which still call the hook. Lit states plainly that standard
51
+ decorators will not — so a migration, or a consumer build applying them, would have silently
52
+ reverted every one of those properties to storing the caller's live array by reference. No clone, no
53
+ freeze, no error, no warning, and no test would have caught it.
54
+
55
+ The contract now rides a decorator-agnostic seam that re-defines the already-finished prototype
56
+ accessor. Legacy `@property`, standard `accessor`/setter decorators, a `static properties` block and
57
+ hand-written getter/setter pairs all end in a prototype accessor by finalization, so this walks the
58
+ finished accessor rather than the hook Lit refuses to call. It installs from the finalization
59
+ trigger Lit itself documents, and registration strictly precedes every instance — constructing an
60
+ unregistered custom element throws — so no assignment can reach an unwrapped setter.
61
+
62
+ `finalize()` was deliberately not hooked: that would add a static method to the class surface, which
63
+ the component inventory records per component and a pinned-manifest gate grades. The chosen seam
64
+ changes no static surface at all.
65
+
66
+ **No migration is expected.** If you do not override `getPropertyDescriptor()` on an `lr-*`
67
+ subclass, there is nothing to do.
68
+
69
+ ### Minor Changes
70
+
71
+ - 103922d: `<lr-chip-group>` gained `accessibleLabel` (attribute `aria-label`) and now renders
72
+ `role="group"` on `[part='base']` whenever a name is supplied.
73
+
74
+ A chip group is a group, and every peer grouping primitive in this library already said so —
75
+ `<lr-radio-group>` renders `role="radiogroup"`, `<lr-segmented>` the same, each forwarding a host
76
+ `aria-label` inward to the element that owns the role. `<lr-chip-group>` rendered a roleless
77
+ container and read no accessible name at all. Because a host `aria-label` does not cross a shadow
78
+ boundary, a consumer labelling the host named nothing: the chips were announced as unrelated
79
+ toggle buttons with no indication of what set they belonged to.
80
+
81
+ This surfaced from a real multi-select filter row, where the consumer had to hand-write
82
+ `role="group" aria-label="…"` onto the host to get a named group. That workaround is the evidence
83
+ the capability was wanted and was reachable only by reaching around the component.
84
+
85
+ The role is applied only *with* a name, deliberately. An unnamed group role adds verbosity without
86
+ adding information, and applying it unconditionally would change the accessibility tree of every
87
+ decorative chip row already shipped. An explicit unset-regression test pins that.
88
+ - bd0f05f: Completed the date-preset story across the three components that share it.
89
+
90
+ `<lr-date-input>` now mirrors the nested picker's `appliedPreset` as a read-only getter. 11.0.0 added
91
+ `presets` to `<lr-date-picker>`; 11.1.0 then separately forwarded `presets` to `<lr-date-input>` and
92
+ added `appliedPreset` to the picker — but never joined the two halves, so the readback landed on the
93
+ component that does not need it and the component that does could set presets and not read the
94
+ result. `appliedPreset`'s own documentation describes the dashboard time filter ("'Last 7 days' must
95
+ still mean the last 7 days after tomorrow's reload"), and that shape is the compact
96
+ text-field-plus-popover input, not the inline calendar.
97
+
98
+ There was no workaround. The nested picker lives in the input's shadow root with no documented
99
+ readback path: `input`/`change` are deliberately native events and carry no detail, and every
100
+ alternative the docs already reject applied — matching `value` back against the preset list is "the
101
+ mapping table `presets` exists to delete" and is ambiguous (Today and This month coincide on the
102
+ 1st), while reaching for `[part='preset-button'][data-active]` depends on private structure and on
103
+ the popover having been opened at least once.
104
+
105
+ The mirror is the input's own field rather than a shadow-root lookup, so it is correct (`undefined`)
106
+ when the popover has never been opened. It carries both halves of the picker's contract — set before
107
+ `commit()`, so a consumer reading it inside their own `change` handler sees the causing preset, and
108
+ cleared on a hand-pick — plus three clear paths the picker cannot see because typing, clearing and
109
+ resetting never reach it: a typed commit that actually changes the value (deliberately not a no-op
110
+ re-commit, which would otherwise silently drop the preset), `clear()`, and `formResetCallback()`.
111
+
112
+ `<lr-filter-bar>` can now pass `presets` on its `date-range` filter and reports the resolved preset
113
+ on the `lr-input` detail as `appliedPreset`. The bar already composed `<lr-date-input>` and already
114
+ forwarded that control's `min`/`max`, but had no path at all for `presets` — so the quick-range row
115
+ and the component built for the same dashboard shape could not be combined. `type: 'custom'` was a
116
+ poor substitute: hand-rendering the control plus a full adapter to set one property, and forfeiting
117
+ the built-in date-range chip localization the docs themselves flag as non-trivial.
118
+
119
+ `presets` is declared on the `date-range` definition only, not the shared base: a preset names two
120
+ dates and the picker ignores the list outside range mode, so putting it on `'date'` would type-check
121
+ a guaranteed-inert field.
122
+ - bd0f05f: `<lr-heatmap>` gained `sticky-labels` (`'none' | 'rows' | 'cols' | 'both'`, default `'none'`), which
123
+ paints the matrix label bands into their own layers instead of into the scrolling bitmap.
124
+
125
+ Matrix labels shared one canvas with the cells, so a tall grid lost its column header on scroll: a
126
+ 160-row matrix at cell-size 32 is about 5,100px of bitmap, and a header baked into it cannot be
127
+ `position: sticky` on its own. The only workaround was a light-DOM mirror row, which had to follow
128
+ the gutter width and cell size — and before `matrixGeometry` shipped it had to hardcode them, which
129
+ made the workaround mutually exclusive with `row-label-width="auto"`: a consumer got the automatic
130
+ fit or the sticky header, never both. (Scale on why the gutter matters: against the component's own
131
+ 10px label font, 160 country names ellipsized 37 times in the built-in 60px gutter and 3 times in a
132
+ 120px one.)
133
+
134
+ A closed set rather than a boolean, because a boolean cannot express one axis at all and a later
135
+ one-axis need would force either a second property or a breaking type change; and rather than a
136
+ `sticky-row-labels`/`sticky-col-labels` pair, which is two attributes and four states for one
137
+ concept with no single reflected value to select on in CSS. `rows`/`cols` name the axes this
138
+ component already names everywhere else (`rowLabels`, `row-label-width`, `colLabels`,
139
+ `col-label-height`), which `freeze-axis="x|y"` would have clashed with.
140
+
141
+ Default `'none'` reproduces today's single-canvas output exactly, including in calendar mode, and an
142
+ unrecognized value normalizes back to `'none'` and repairs the attribute.
143
+ - bd0f05f: New component `<lr-funnel>`: a conversion funnel — an ordered set of stages, each drawn as a bar
144
+ whose length is that stage's share of the FIRST stage, read top-to-bottom as progressive drop-off.
145
+
146
+ Nothing in the catalogue expressed this. A funnel is not a sorted bar chart: it normalizes to the
147
+ first stage rather than the data maximum, its value axis carries no information worth drawing, and it
148
+ is read as stage-to-stage retention rather than category comparison. Reaching one through
149
+ `lr-bar-chart` meant switching off axes, grid and legend, hand-computing every percentage, and still
150
+ pulling the Chart.js peers for what is a handful of rectangles. `lr-span-waterfall` encodes time
151
+ offset, not share; `lr-flow-canvas` draws a graph, not a quantitative comparison; `lr-stepper` and
152
+ `lr-progress-bar` express position or completion, not per-stage magnitude.
153
+
154
+ It lives in the `data` family beside `lr-heatmap` and `lr-gauge` as an analytics primitive, and pulls
155
+ no peer at all.
156
+
157
+ Each stage carries both its absolute value and its share, because the interesting question is usually
158
+ the percentage but the credibility check is the count. `comparison` draws a second series behind each
159
+ bar, normalized to ITS OWN first stage, so a cohort's funnel *shape* can be read against a baseline
160
+ whose absolute volumes are not comparable — comparing one entity against a many-entity peer group is
161
+ the common case, and per-series normalization is what makes it legible. `dropoff` (on by default)
162
+ renders the consecutive-stage change.
163
+
164
+ The chart is plain HTML — an ordered list of stages with real text and a percentage-width bar — so
165
+ the accessible representation *is* the chart rather than a transcript bolted onto a sighted-only
166
+ drawing.
167
+
168
+ Degenerate cases are defined and tested rather than left to chance: an empty series renders a
169
+ localized empty state, a single stage renders one bar and no drop-off, a zero or negative first stage
170
+ suppresses shares instead of dividing by it, a stage larger than its predecessor (real in funnels
171
+ with re-entry) is not clamped, and a comparison series of a different length is matched by position.
172
+ - bd0f05f: `<lr-map>`'s `dataLayers` gained declarative marker clustering and a heatmap layer kind. Both are
173
+ strictly additive — today's behaviour is the default in each.
174
+
175
+ `cluster?: { radius?, maxZoom?, radiusSteps?, colorSteps?, countFont? }` opts an entry into
176
+ MapLibre's native clustering: the source gains `cluster`/`clusterRadius`/`clusterMaxZoom` and the
177
+ entry emits a cluster circle layer, a count symbol layer, and a circle layer for points that stayed
178
+ unclustered. `markers` creates one `maplibregl.Marker` per entry, which is right for tens of pins and
179
+ wrong for thousands — a consumer rendering up to 5,000 listings in a country-sized viewport got 5,000
180
+ DOM nodes and an unreadable map. `radiusSteps`/`colorSteps` are `['step', …]` breaks on `point_count`
181
+ in the same ascending `[value, output]` vocabulary `choropleth.stops` already uses, including the
182
+ same "the first stop's output is also the base" rule.
183
+
184
+ `kind?: 'auto' | 'heatmap'` plus `heatmap?: { weightField?, weightRange?, stops?, radius?, intensity? }`
185
+ reaches MapLibre's first-class `heatmap` layer type. `dataLayers` emitted exactly three
186
+ geometry-filtered layers — fill, line and circle — so a weighted-point density surface was
187
+ unreachable declaratively even though the peer implements it. The colour ramp reuses the same
188
+ `[value, color]` stop vocabulary `choropleth.stops` and `legendGradient` share.
189
+
190
+ Between them these were the only remaining reason for raw MapLibre in at least one consumer, which
191
+ carried roughly 212 lines behind the `.map` escape hatch — plus a `style.load` listener and
192
+ idempotent remove-then-add, because a basemap swap wipes every layer and `<lr-map>` restored only its
193
+ own. Both new renderings join the component's existing re-application path, so a `mapStyle` swap
194
+ restores them too.
195
+ - bd0f05f: New opt-in stylesheet `@aceshooting/lyra-ui/tokens-root.css` publishes a curated subset of the
196
+ resolved `--lr-*` layer at document scope, so an application's own custom elements can read the
197
+ kit's tokens.
198
+
199
+ `theme.css` ships the `--lr-theme-*` INPUT layer at `:root`, but the resolved OUTPUT layer
200
+ (`--lr-color-*`, `--lr-space-*`, `--lr-radius`, `--lr-shadow-*`, `--lr-font-*`) is declared only
201
+ inside each `lr-*` component's own shadow `:host`. An app's own elements are not descendants of any
202
+ `lr-*` host, so nothing inherits it to them. Consumers measured the consequence in Chromium rather
203
+ than inferring it: at document scope `--lr-color-brand`, `--lr-color-border` and `--lr-focus-ring`
204
+ all resolve to the empty string while `--lr-theme-focus-ring-width` resolves fine. One project found
205
+ 550 `var(--lr-*)` references in its own components reading nothing — 358 with no fallback at all,
206
+ the rest silently running on a literal fallback that never tracked the theme. Neither failure is
207
+ detectable without reading computed styles in a browser, because an undefined custom property is not
208
+ an error.
209
+
210
+ The subset is curated rather than complete, deliberately: `--lr-*` is documented as the internal
211
+ output layer precisely so it can change without a major, and publishing all of it would make several
212
+ hundred names permanent public API. 114 names are in — ambient surfaces/text/borders, the semantic
213
+ colour grid and its flat aliases, the spacing scale, radii, border widths, elevation, font sizes and
214
+ weights, the focus-ring parts, and the base motion pair — each with a stated reason in the file, as
215
+ is each deliberate omission.
216
+
217
+ It is generated from the same canonical token source as everything else, so it cannot drift, and a
218
+ fail-closed validator in the existing `check:design-tokens` gate rejects a curated token whose value
219
+ reaches an internal name the file does not declare — the case that would otherwise ship an empty
220
+ `var()` at `:root`. Ramp references resolve to literals at generation time and stay behind their
221
+ `--lr-theme-*` input, so the file is self-sufficient without `theme.css`, still fully rethemable,
222
+ publishes no ramp names, and computes byte-identical values to what a component reaches through the
223
+ ramp.
224
+
225
+ Opt-in, and layered in `lr-theme` like `theme.css`, so it changes nothing for anyone who does not
226
+ import it and an app's own unlayered rules still win.
227
+ - bd0f05f: `web-types.json` now carries `js.properties`, `js.events` and `slots` alongside its attributes.
228
+
229
+ It previously declared attributes and nothing else: 0 of 284 tags had properties, events or slots,
230
+ while `custom-elements.json` in the same tarball described 1,029 events, 3,102 public fields and 445
231
+ slots. 865 of those fields are `attribute: false` and were therefore invisible to JetBrains
232
+ completion entirely — and they are frequently the primary API rather than an edge case
233
+ (`lr-chart.datasets`, `.labels`, `.config`, `lr-heatmap.legendStops`, `.colorSteps`, `.cellColor`,
234
+ `lr-lite-chart.datasets`).
235
+
236
+ That gap mattered more here than it would for a typical component library: these are Lit components,
237
+ so the idiomatic usage is `.prop=${…}` and `@event=${…}` in a template, not attributes. The shipped
238
+ metadata covered the minority binding style and omitted the majority.
239
+
240
+ The web-types schema the file already declared supports all three directly, and the data was already
241
+ generated for the manifest, so this was a projection gap rather than missing information. It now
242
+ emits every public instance field with its type and default, every declared event with its
243
+ `CustomEvent<…Detail>` handler type, and every slot. Static fields and methods are deliberately
244
+ excluded (a `.formAssociated=` completion would be wrong, and web-types has no IDE-integrated method
245
+ kind).
246
+
247
+ The sibling `vscode-html-data.json` stays attributes-only, which is correct: the VS Code custom-data
248
+ format defines no properties/events/slots concept.
249
+
250
+ ### Patch Changes
251
+
252
+ - 103922d: Documented that `<lr-chart>`'s `description` **replaces** the generated accessible summary rather
253
+ than adding to it.
254
+
255
+ Unset, the component builds an sr-only per-series summary from the actual data; set, it discards
256
+ that summary entirely and substitutes the supplied text. That is the right behaviour for a full
257
+ override, but the property was documented only as "Accessible chart description", which reads as
258
+ additive — and a consumer adding a one-line caveat to five charts would have silently traded away
259
+ the data summary on all five. They caught it by reading the source, and applied it only where the
260
+ trade was actually wanted.
261
+
262
+ No behaviour change; the JSDoc and the family reference now state the trade and point at the better
263
+ tool for a caveat, which is visible text beside the chart rather than a note only screen-reader
264
+ users hear.
265
+ - 2a156eb: Added the missing package-export route for
266
+ `@aceshooting/lyra-ui/components/media/flag/flag-peer-bulk.js`. 11.2.0 led with that module as the
267
+ opt-in bulk peer-registration entry point for `<lr-flag>`, and `llms/components/lr-flag.md` and
268
+ `flag.class.d.ts` both told readers to import it — but it was never listed in `package.json`'s
269
+ `exports`, and an exports map blocks everything it does not list. Following the documentation was a
270
+ hard build error (`"…/flag-peer-bulk.js" is not exported under the conditions […]`), so the
271
+ release's headline `<lr-flag>` feature was unreachable by any consumer.
272
+
273
+ The derivation that exists to prevent exactly this — every `*-loader.ts` / `*-peer.ts` /
274
+ `*-register.ts` / `registry.ts` module must be explicitly classified as public or internal — missed
275
+ it because a *qualified* suffix (`-peer-bulk`) is not the bare suffix (`-peer`). The convention now
276
+ accepts qualified variants; across the whole source tree that widening catches this file and
277
+ nothing else.
278
+
279
+ A second, independent instance surfaced in the same sweep and is fixed too:
280
+ `@aceshooting/lyra-ui/components/data/flow-canvas/flow-types.js` is shown as an import in
281
+ `llms/data.md` and in the generated `llms/components/lr-flow-canvas.md`, and was likewise
282
+ unlisted. (Those types were still reachable through `flow-canvas.class.js`, so this adds the route
283
+ the docs already named rather than any new surface.)
284
+
285
+ Both were promises made in documentation, which no naming convention over the source tree can see.
286
+ So a new release gate, `check:doc-specifiers`, now reads the promises instead: every
287
+ `@aceshooting/lyra-ui/…` specifier a shipped file tells a reader to import must resolve through the
288
+ exports map. It understands prose instructions as well as fenced code examples — the
289
+ `flag-peer-bulk.js` promise was a sentence, not a code block.
290
+ - 8084d04: Added `flag-peer-bulk.js` (and the new `flag-peer-bulk-standard.js`) to `package.json`'s
291
+ `sideEffects` list.
292
+
293
+ These modules exist purely for their import-time side effect: a consumer writes a bare
294
+ `import '…/flag-peer-bulk.js'` and never reads an export, so a bundler honouring `sideEffects` drops
295
+ the module outright unless it is declared. The generator that derives these entries matched the bare
296
+ suffix `-peer.ts` but not the qualified `-peer-bulk.ts` — the same blind spot that left the module
297
+ out of the `exports` map.
298
+
299
+ This half failed more quietly than that one. The missing export route was a hard build error; a
300
+ missing `sideEffects` entry compiles cleanly and then simply does nothing in a production build, so
301
+ `<lr-flag>` would fall back to no resolver with no diagnostic at all.
302
+ - bd0f05f: `<lr-flag>` now distinguishes a peer that is not installed from one that is installed but does not
303
+ carry the capability the chosen entry point needs.
304
+
305
+ Both cases previously produced the same warning — "install it with `pnpm add
306
+ @aceshooting/lyra-flags`" — which is advice a reader in the second case has already followed, and
307
+ which sends them looking for the wrong problem entirely.
308
+
309
+ That case stops being exotic from this release on. `flag-peer-bulk-standard.js` requires
310
+ `createFlagUrlResolver()` on the tier-committed `./standard` subpath, which older peers do not
311
+ export at all, so a consumer who upgrades `@aceshooting/lyra-ui` while pinning
312
+ `@aceshooting/lyra-flags` reaches it by the ordinary route. The peer-range floor moves in the same
313
+ release to make that a resolution warning rather than a silent one, and this makes the runtime
314
+ message match: it now says the package is present, that this is a version mismatch, and where to
315
+ look for the floor it expects.
316
+ - 2a156eb: `<lr-heatmap>`'s `matrixGeometry` now returns the geometry the last matrix-mode draw actually
317
+ painted with, instead of recomputing from current layout on every read.
318
+
319
+ It is documented as "the gutter/cell geometry the last matrix-mode draw actually painted with", and
320
+ 11.2.0's notes claimed it "can never disagree" with the canvas because it reuses the same internal
321
+ getters `drawMatrix()` calls. Reusing those getters is precisely what made it disagree: they read
322
+ *current* layout, not the last paint, so any interval where layout has moved but no draw has
323
+ happened made the getter describe a canvas that does not exist. Two such intervals are routine —
324
+ full redraws pause while the host is outside the viewport (documented behaviour of this component),
325
+ and `rowLabelWidth`/`colLabelHeight` are not redraw-triggering properties at all, so assigning one
326
+ moved the getter *permanently* ahead of the canvas rather than for a transient window.
327
+
328
+ That landed squarely on the use case the property was added for: a light-DOM sticky-header mirror
329
+ for a tall matrix — i.e. exactly the component most likely to be scrolled out of view. A mirror
330
+ synced from the getter while the grid was off-screen lined up with geometry the canvas was not
331
+ using, which is the same misalignment the property exists to eliminate. It also silently disagreed
332
+ with `lr-matrix-geometry-change`, which fires only from the draw path and was always correct.
333
+
334
+ The getter now returns the frozen object the draw stored and the event carried, so the two are
335
+ equal by construction. The returned object is frozen, so a consumer cannot corrupt the component's
336
+ own change detection by mutating it.
337
+ - 2a156eb: Fixed two defects in `<lr-map>`'s `maxBounds`, reported together because the first was the only
338
+ thing hiding the second.
339
+
340
+ `maxBounds` never reached maplibre-gl when set declaratively. It is `attribute: false`, so a
341
+ property binding is the only way to set it, which puts its one and only appearance in `changed` on
342
+ the first update — before the component's asynchronous peer import and WebGL initialization have
343
+ produced a map. The `updated()` guard `changed.has('maxBounds') && this._map` therefore
344
+ short-circuited, and because the property never changed again it was never retried: a documented
345
+ property that read back as set, did nothing, permanently, and warned about none of it. It is now
346
+ applied from the map-ready path as well, so a declaratively-set box reaches the peer; a later
347
+ reassignment still goes through `updated()` as before.
348
+
349
+ The property's guard also could not run in the case it was written for. It applies the bounds and
350
+ then reads the camera back to detect a non-finite zoom — but at the conditions its own warning text
351
+ names (sub-1 fractional zooms in wide containers) maplibre-gl 6.x throws synchronously out of
352
+ `setMaxBounds()` instead, so the readback line was never reached. With no `try`/`catch` the
353
+ exception escaped `updated()` into the consumer's render cycle, degenerating into repeated throws
354
+ from the peer's own matrix math on every later `resize`/`setZoom` and a canvas that never painted
355
+ again. A throw now routes into the same drop-the-constraint-and-restore-the-camera path the
356
+ non-finite-camera branch already used, so the documented worst case — an unconstrained map plus one
357
+ dev-mode warning — is now the real worst case.
358
+ - 2a156eb: The release process now fails when the published upgrade feed lags npm.
359
+
360
+ The documented upgrade workflow tells consumers — and upgrading agents — to fetch
361
+ `https://www.lyra-ui.com/changelog.json` and read every release between their installed version and
362
+ its `latest`. That feed is built from this package's `CHANGELOG.md` by the sibling website and
363
+ deployed separately, after the release, so between `npm publish` and that deploy it advertises the
364
+ *previous* release as current.
365
+
366
+ Consumers reported that window twice, from two different projects, on two consecutive releases: the
367
+ site said 11.0.0 while npm had 11.1.0, then 11.1.0 while npm had 11.2.0. It fails silently and it
368
+ inverts the workflow's own advice — a reader who trusts the feed concludes they are already current
369
+ and never reads the new release. One release skipped that way contained a fix the reader was
370
+ waiting for. Both reporters caught it only by reading the installed tarball's `CHANGELOG.md`
371
+ instead, which is what the workflow tells them they should not have to do.
372
+
373
+ `release-integrity.mjs verify-site-freshness` now checks npm's dist-tag, the published feed's
374
+ `latest`, the presence of the new version in its `releases` array (it went missing entirely once,
375
+ which defeats even a reader who ignores `latest`), and the component catalog's `catalog_version` —
376
+ which rides the same deploy and was caught a release behind at the same time. The release script
377
+ waits on it, so a stale feed is now a loud, actionable release failure rather than something a
378
+ consumer discovers weeks later.
379
+
380
+ No published component surface changes.
381
+ - 8084d04: Restored two public property names that were renamed with no alias, no changelog entry and no
382
+ deprecation record, silently breaking shipped consumers.
383
+
384
+ - `<lr-app-rail-item>`: `active` is back as a deprecated alias for `current`, read alongside it —
385
+ the item is current when either is true, in both property and attribute form.
386
+ - `<lr-widget>`: `activeView` is back as a deprecated alias for `activeViewId`, which it seeds.
387
+
388
+ Both were the members' *original* public names. `active` shipped documented as public API ("add an
389
+ `active` property that reflects `aria-current="page"` onto the item"), and a later release's notes
390
+ still described it as `active` after the rename had already happened. `activeView` never appears in
391
+ `CHANGELOG.md` at all, so its rename was never announced in any form.
392
+
393
+ The breakage was invisible by construction: a Lit `.prop=${…}` binding on a custom element is
394
+ untyped, so `.active=${…}` and `.activeView=${…}` did not error — they became dead expandos. No
395
+ consumer type check, test suite or build step could see it. One consumer's app rail consequently
396
+ had no current-item indicator and a permanent `aria-current="false"` — an accessibility regression
397
+ — and its widgets fell back to their first view, with everything still passing.
398
+
399
+ This is what the house rule about mirrored members already required in general: a rename adds a
400
+ second name, it does not swap one out from under shipped consumers. The compatibility window runs
401
+ long (`removalNotBefore` two majors out) because these aliases are not new API — they are the names
402
+ consumers already wrote.
403
+
404
+ `activeView` seeds rather than being read alongside, because unlike a boolean flag it is a property
405
+ the component itself writes (a view-toggle click, and the fallback when `views` no longer contains
406
+ the active id); a read-alongside alias would undo a later interactive change on the next update.
407
+ - Updated dependencies [bd0f05f]
408
+ - @aceshooting/lyra-flags@2.2.0
409
+
3
410
  ## 11.2.0
4
411
 
5
412
  ### Minor Changes
package/README.md CHANGED
@@ -27,7 +27,7 @@
27
27
  **Lyra UI — the free, independent web-component alternative.** A MIT-licensed [Lit](https://lit.dev)
28
28
  library for accessible forms, dashboards, charts, data visualization, and Conversation & Agent UI.
29
29
  It is a practical open-source alternative to [Shoelace](https://shoelace.style/) and
30
- [Web Awesome](https://webawesome.com/), with 284 custom elements, native custom-element APIs,
30
+ [Web Awesome](https://webawesome.com/), with 285 custom elements, native custom-element APIs,
31
31
  tree-shakeable imports, its own `--lr-*` design tokens, built-in localization and RTL support,
32
32
  and no runtime dependency on either project.
33
33
 
@@ -892,12 +892,14 @@ them — typically in a workspace `.vscode/settings.json` so the whole team pick
892
892
  ```
893
893
 
894
894
  Both settings accept an array, so add these alongside any other custom-data files the workspace
895
- already references. WebStorm/IntelliJ users get the same tag, attribute, and custom-property
896
- completion automatically from the bundled `web-types.json` JetBrains IDEs pick up a dependency's
897
- `web-types.json` with no extra configuration once the package is installed. The selected plain
898
- custom-element schemas do not define structural slot or CSS-part completion fields, so those names
899
- remain available as reference prose in each element's hover description rather than as completion
900
- items.
895
+ already references. WebStorm/IntelliJ users get more from the bundled `web-types.json`, with no
896
+ extra configuration once the package is installed: tag, attribute, JS property (`.prop=${…}`), DOM
897
+ event (`@lr-event=${…}`), slot and custom-property completion. The property and event contributions
898
+ matter most here these are Lit components, so the idiomatic binding style is `.prop=`/`@event=`
899
+ rather than attributes, and 865 public members are declared `attribute: false` and reachable no other
900
+ way. The VS Code custom-data format defines no properties/events/slots concept, so in
901
+ `vscode-html-data.json` those names remain reference prose in each tag's hover description. CSS-part
902
+ names are prose in both files.
901
903
 
902
904
  Build tools can import the published manifest directly through its explicit package export:
903
905
 
@@ -914,7 +916,7 @@ resolved `web-types.json`/`vscode-html-data.json` above instead.
914
916
 
915
917
  ## Components
916
918
 
917
- The catalog below lists all 284 tags in the current Custom Elements Manifest, grouped by
919
+ The catalog below lists all 285 tags in the current Custom Elements Manifest, grouped by
918
920
  capability. The manifest and live docs are the authoritative sources for the complete generated
919
921
  API details.
920
922
 
@@ -995,6 +997,7 @@ API details.
995
997
  | `<lr-time-range>` | — (extra) | Two-handle brush/scrubber over a numeric domain |
996
998
  | `<lr-sequence-playback>` | — (extra) | Play/pause sequence index stepper over `itemCount`, with `currentIndex` and `lr-sequence-step` |
997
999
  | `<lr-heatmap>` | — (extra) | DPR-aware Canvas heatmap with matrix and calendar (`mode="calendar"`) layouts, `fit-to-width` responsive scaling |
1000
+ | `<lr-funnel>` | — (extra) | Dependency-free conversion funnel: each stage a bar sized as its share of the FIRST stage, labelled with both its absolute value and its share, with per-stage drop-off and an optional comparison series normalized to its own first stage; plain HTML, so the accessible representation is the chart itself |
998
1001
  | `<lr-sequence-strip>` | — (extra) | Compact, one-thin-cell-per-item strip visualizing a sequence of categorical states with an optional secondary per-cell marker — pure CSS/flex, no chart.js/SVG/canvas; a named roving `role="list"` whose `role="listitem"` cells are individually inspectable with Arrow/Home/End navigation but deliberately non-activating |
999
1002
  | `<lr-graph>` | — (extra) | Force-directed node-link diagram with pan/zoom/drag, directed/styled relationship links, and rich accessible metadata — needs the optional peer deps `d3-force`, `d3-drag`, `d3-zoom`, `d3-selection` |
1000
1003
  | `<lr-tree>` + `<lr-tree-item>` | `wa-tree` / `wa-tree-item` / `sl-tree` / `sl-tree-item` | Expand/collapse hierarchy with structured icon/label/description/badge rows, optional richer accessible labels, and APG tree keyboard navigation |