@aceshooting/lyra-ui 16.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 +758 -0
- package/README.md +2 -2
- package/custom-elements.json +1 -1
- package/dist/cli/migration-contract.json +1 -1
- package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +3 -3
- package/dist/components/agent-tools/browser-frame/browser-frame.class.js +2 -2
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -2
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js +3 -3
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +37 -13
- package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
- package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +4 -0
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +3 -3
- package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +117 -17
- package/dist/components/charts/chart/chart.class.js +3 -3
- package/dist/components/charts/chart/histogram-bin.d.ts +5 -1
- package/dist/components/charts/chart/histogram-bin.js +1 -1
- package/dist/components/charts/chart/lite-chart.class.d.ts +9 -0
- package/dist/components/conversation/code-block/code-block.styles.js +1 -1
- package/dist/components/conversation/message-actions/message-actions.styles.js +1 -1
- package/dist/components/conversation/model-select/model-select.class.d.ts +13 -4
- package/dist/components/conversation/model-select/model-select.class.js +2 -1
- package/dist/components/conversation/model-select/model-select.styles.js +1 -1
- package/dist/components/conversation/streaming-text/streaming-text-base.class.d.ts +40 -2
- package/dist/components/conversation/streaming-text/streaming-text-base.class.js +2 -2
- package/dist/components/conversation/streaming-text/streaming-text-core.class.d.ts +27 -3
- package/dist/components/conversation/streaming-text/streaming-text-core.class.js +11 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +31 -3
- package/dist/components/conversation/streaming-text/streaming-text.class.js +11 -0
- package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts +30 -2
- package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js +4 -3
- package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +1 -1
- package/dist/components/conversation/thread-list/thread-list.class.js +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
- package/dist/components/conversation/usage-badge/usage-badge-overlay-runtime.js +1 -1
- package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -0
- package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +16 -4
- package/dist/components/conversation/voice-picker/voice-picker.class.js +2 -1
- package/dist/components/conversation/voice-picker/voice-picker.styles.js +1 -1
- package/dist/components/data/context-meter/context-meter.class.d.ts +23 -4
- package/dist/components/data/context-meter/context-meter.class.js +10 -7
- package/dist/components/data/context-meter/context-meter.styles.js +1 -1
- package/dist/components/data/data-grid/data-grid.class.d.ts +5 -2
- package/dist/components/data/data-grid/data-grid.class.js +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +32 -5
- package/dist/components/data/flow-canvas/flow-canvas.class.js +3 -1
- package/dist/components/data/flow-canvas/flow-canvas.styles.js +1 -1
- package/dist/components/data/flow-canvas/flow-model.js +1 -1
- package/dist/components/data/flow-canvas/flow-types.d.ts +10 -1
- package/dist/components/data/gauge/gauge.class.d.ts +15 -2
- package/dist/components/data/gauge/gauge.class.js +20 -20
- package/dist/components/data/gauge/gauge.styles.js +1 -1
- package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +14 -5
- package/dist/components/data/graph-query-builder/graph-query-builder.class.js +2 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +28 -2
- package/dist/components/data/sequence-strip/sequence-strip.class.js +3 -2
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +1 -1
- package/dist/components/data/table/table.class.d.ts +155 -30
- package/dist/components/data/table/table.class.js +6 -4
- package/dist/components/data/table/table.styles.js +1 -1
- package/dist/components/data/timeline/timeline-item.class.d.ts +9 -1
- package/dist/components/data/timeline/timeline-item.class.js +2 -2
- package/dist/components/data/word-cloud/word-cloud.class.js +1 -1
- package/dist/components/data/word-cloud/word-cloud.styles.js +1 -1
- package/dist/components/forms/button/button.class.d.ts +30 -1
- package/dist/components/forms/button/button.class.js +2 -2
- package/dist/components/forms/checkbox/checkbox.class.d.ts +8 -6
- package/dist/components/forms/checkbox/checkbox.class.js +2 -2
- package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +7 -5
- package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
- package/dist/components/forms/color-picker/color-picker.class.d.ts +16 -2
- package/dist/components/forms/color-picker/color-picker.class.js +2 -2
- package/dist/components/forms/color-picker/color-picker.styles.js +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +52 -7
- package/dist/components/forms/combobox/combobox.class.js +2 -2
- package/dist/components/forms/combobox/combobox.styles.js +1 -1
- package/dist/components/forms/date-picker/date-input.class.d.ts +4 -0
- package/dist/components/forms/date-picker/date-input.class.js +1 -1
- package/dist/components/forms/icon-button/icon-button.class.d.ts +20 -3
- package/dist/components/forms/icon-button/icon-button.class.js +1 -1
- package/dist/components/forms/icon-button/icon-button.styles.js +1 -1
- package/dist/components/forms/input/input.class.d.ts +5 -2
- package/dist/components/forms/input/input.class.js +1 -1
- package/dist/components/forms/input/time-input.class.d.ts +4 -0
- package/dist/components/forms/input/time-input.class.js +1 -1
- package/dist/components/forms/locale-picker/locale-picker.class.d.ts +11 -5
- package/dist/components/forms/locale-picker/locale-picker.class.js +1 -1
- package/dist/components/forms/otp-input/otp-input.class.d.ts +7 -2
- package/dist/components/forms/otp-input/otp-input.class.js +2 -2
- package/dist/components/forms/radio/radio-button.class.d.ts +2 -1
- package/dist/components/forms/radio/radio-group.class.d.ts +9 -4
- package/dist/components/forms/radio/radio-group.class.js +1 -1
- package/dist/components/forms/radio/radio.class.d.ts +13 -7
- package/dist/components/forms/radio/radio.class.js +1 -1
- package/dist/components/forms/rubric-form/rubric-form.class.d.ts +16 -6
- package/dist/components/forms/rubric-form/rubric-form.class.js +2 -2
- package/dist/components/forms/select/select.class.d.ts +50 -13
- package/dist/components/forms/select/select.class.js +2 -2
- package/dist/components/forms/slider/slider.class.d.ts +4 -2
- package/dist/components/forms/slider/slider.class.js +1 -1
- package/dist/components/forms/switch/switch.class.d.ts +8 -6
- package/dist/components/forms/switch/switch.class.js +1 -1
- package/dist/components/forms/textarea/textarea.class.d.ts +5 -3
- package/dist/components/forms/textarea/textarea.class.js +1 -1
- package/dist/components/forms/time-range/time-range.class.d.ts +12 -7
- package/dist/components/forms/time-range/time-range.class.js +1 -1
- package/dist/components/forms/time-range/time-range.styles.js +1 -1
- package/dist/components/forms/token-input/token-input.class.d.ts +6 -4
- package/dist/components/forms/token-input/token-input.class.js +1 -1
- package/dist/components/layout/app-rail/app-rail-item.class.d.ts +109 -4
- package/dist/components/layout/app-rail/app-rail-item.class.js +34 -29
- package/dist/components/layout/app-rail/app-rail-item.styles.js +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +25 -3
- package/dist/components/layout/app-rail/app-rail.styles.js +1 -1
- package/dist/components/layout/app-rail-group/app-rail-group.class.d.ts +2 -2
- package/dist/components/layout/app-rail-group/app-rail-group.class.js +2 -2
- package/dist/components/layout/carousel/carousel.class.d.ts +1 -1
- package/dist/components/layout/carousel/carousel.class.js +1 -1
- package/dist/components/layout/details/accordion.class.d.ts +2 -2
- package/dist/components/layout/details/accordion.class.js +2 -2
- package/dist/components/layout/filter-bar/filter-bar-register.d.ts +1 -0
- package/dist/components/layout/filter-bar/filter-bar-register.js +1 -0
- package/dist/components/layout/filter-bar/filter-bar.class.d.ts +153 -16
- package/dist/components/layout/filter-bar/filter-bar.class.js +8 -5
- package/dist/components/layout/menu/menu-item.class.d.ts +3 -3
- package/dist/components/layout/menu/menu-item.class.js +3 -3
- package/dist/components/layout/menu/menu.class.d.ts +5 -1
- package/dist/components/layout/menu/menu.class.js +2 -2
- package/dist/components/layout/reorder-list/reorder-item.styles.js +1 -1
- 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/attachment-trigger/attachment-trigger.styles.js +1 -1
- package/dist/components/media/avatar-group/avatar-group.class.d.ts +12 -1
- package/dist/components/media/avatar-group/avatar-group.class.js +2 -2
- package/dist/components/media/drop-zone/drop-zone.class.d.ts +32 -11
- package/dist/components/media/drop-zone/drop-zone.class.js +2 -2
- package/dist/components/media/file-input/file-input.class.d.ts +40 -19
- package/dist/components/media/file-input/file-input.class.js +2 -2
- 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/components/overlays/callout/callout.styles.js +1 -1
- package/dist/components/overlays/dialog/dialog.styles.js +1 -1
- package/dist/components/overlays/overlay/dropdown.class.d.ts +13 -3
- package/dist/components/overlays/overlay/dropdown.class.js +2 -2
- package/dist/components/overlays/overlay/popover.class.d.ts +12 -3
- package/dist/components/overlays/overlay/popover.class.js +2 -2
- package/dist/components/overlays/rating/rating.class.d.ts +9 -7
- package/dist/components/overlays/rating/rating.class.js +1 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +5 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
- package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +1 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +5 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -1
- package/dist/components/retrieval/graph-legend/graph-legend.styles.js +1 -1
- package/dist/components/retrieval/retrieval-value-format.js +1 -1
- package/dist/components/retrieval/source-list/source-list.styles.js +1 -1
- package/dist/components/utility/copy-button/copy-button.class.d.ts +23 -11
- package/dist/components/utility/copy-button/copy-button.class.js +2 -2
- package/dist/components/utility/copy-button/copy-button.styles.js +1 -1
- package/dist/components/utility/diff-view/diff-view.styles.js +1 -1
- package/dist/components/utility/export-button/export-button.class.d.ts +4 -0
- package/dist/components/utility/export-button/export-button.class.js +1 -1
- package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
- package/dist/components/utility/known-date/known-date.class.js +1 -1
- package/dist/components/utility/mention-popover/mention-popover.class.d.ts +38 -3
- package/dist/components/utility/mention-popover/mention-popover.class.js +2 -1
- package/dist/components/utility/mention-popover/mention-popover.styles.js +1 -1
- package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
- package/dist/components/utility/tour/tour.class.d.ts +4 -0
- package/dist/components/utility/tour/tour.class.js +1 -1
- package/dist/components/utility/tour/tour.styles.js +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.js +2 -2
- package/dist/components/viewers/docx-viewer/docx-viewer.class.js +2 -2
- package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +2 -2
- package/dist/components/viewers/highlight-layer/highlight-layer.class.js +2 -2
- package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +2 -2
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +2 -2
- package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +2 -2
- package/dist/components/viewers/xml-viewer/xml-viewer.class.js +2 -2
- package/dist/custom-elements-jsx.d.ts +2 -2
- package/dist/events.d.ts +20 -13
- package/dist/internal/aggregate-file-limits.d.ts +33 -0
- package/dist/internal/aggregate-file-limits.js +1 -0
- package/dist/internal/catalog-picker.d.ts +15 -2
- package/dist/internal/catalog-picker.js +1 -1
- package/dist/internal/debounce-controller.d.ts +14 -0
- package/dist/internal/debounce-controller.js +1 -1
- package/dist/internal/default-strings.generated.d.ts +1 -1
- package/dist/internal/default-strings.generated.js +2 -2
- package/dist/internal/focus-navigation.d.ts +45 -0
- package/dist/internal/focus-navigation.js +1 -1
- package/dist/internal/form-associated.js +1 -1
- package/dist/internal/initial-slot-collection.d.ts +30 -0
- package/dist/internal/initial-slot-collection.js +1 -0
- package/dist/internal/intl-cache.js +1 -1
- package/dist/internal/invalid-event-alias.d.ts +46 -0
- package/dist/internal/invalid-event-alias.js +1 -1
- package/dist/internal/localization-runtime.d.ts +24 -0
- package/dist/internal/localization-runtime.js +1 -1
- package/dist/internal/localization-types.d.ts +1 -1
- package/dist/internal/localization.js +1 -1
- package/dist/internal/package-metadata.d.ts +1 -1
- package/dist/internal/package-metadata.js +1 -1
- package/dist/internal/positioning-strategy.d.ts +3 -1
- package/dist/internal/state-part.d.ts +49 -0
- package/dist/internal/state-part.js +1 -0
- package/dist/internal/variants.styles.js +1 -1
- package/dist/lyra.d.ts +1 -1
- package/dist/lyra.js +1 -1
- package/dist/svelte.d.ts +2 -2
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/lyra-tag-event-map.d.ts +2 -2
- package/dist/testing/lyra-tag-event-map.js +1 -1
- package/dist/testing/wait-for-mount.d.ts +46 -0
- package/dist/testing/wait-for-mount.js +1 -0
- package/dist/theme/theme-bootstrap.js +1 -1
- package/dist/theme/theme.d.ts +11 -2
- package/dist/theme/theme.js +1 -1
- package/dist/translations/ar/layout.js +1 -1
- package/dist/translations/ar/retrieval.js +1 -1
- package/dist/translations/ar/shared.js +1 -1
- package/dist/translations/de/layout.js +1 -1
- package/dist/translations/de/retrieval.js +1 -1
- package/dist/translations/de/shared.js +1 -1
- package/dist/translations/es/layout.js +1 -1
- package/dist/translations/es/retrieval.js +1 -1
- package/dist/translations/es/shared.js +1 -1
- package/dist/translations/fa/layout.js +1 -1
- package/dist/translations/fa/retrieval.js +1 -1
- package/dist/translations/fa/shared.js +1 -1
- package/dist/translations/fr/layout.js +1 -1
- package/dist/translations/fr/retrieval.js +1 -1
- package/dist/translations/fr/shared.js +1 -1
- package/dist/translations/he/layout.js +1 -1
- package/dist/translations/he/retrieval.js +1 -1
- package/dist/translations/he/shared.js +1 -1
- package/dist/translations/it/layout.js +1 -1
- package/dist/translations/it/retrieval.js +1 -1
- package/dist/translations/it/shared.js +1 -1
- package/dist/translations/ja/layout.js +1 -1
- package/dist/translations/ja/retrieval.js +1 -1
- package/dist/translations/ja/shared.js +1 -1
- package/dist/translations/pt-BR/layout.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/layout.js +1 -1
- package/dist/translations/ru/retrieval.js +1 -1
- package/dist/translations/ru/shared.js +1 -1
- package/dist/translations/zh-CN/layout.js +1 -1
- package/dist/translations/zh-CN/retrieval.js +1 -1
- package/dist/translations/zh-CN/shared.js +1 -1
- package/dist/utilities/format.d.ts +17 -0
- package/dist/utilities/format.js +1 -1
- package/dist/vue.d.ts +2 -2
- package/llms/components/lr-app-rail-group.md +87 -10
- package/llms/components/lr-app-rail-item.md +88 -11
- package/llms/components/lr-app-rail.md +88 -11
- package/llms/components/lr-attachment-trigger.md +21 -0
- package/llms/components/lr-bar-chart.md +3 -2
- package/llms/components/lr-bubble-chart.md +3 -2
- package/llms/components/lr-button.md +5 -4
- package/llms/components/lr-callout.md +10 -0
- package/llms/components/lr-card.md +2 -1
- package/llms/components/lr-chart.md +43 -12
- package/llms/components/lr-citation-badge.md +7 -1
- package/llms/components/lr-code-block.md +21 -0
- package/llms/components/lr-color-picker.md +12 -7
- package/llms/components/lr-combobox.md +20 -1
- package/llms/components/lr-confirm-bar.md +36 -7
- package/llms/components/lr-context-meter.md +17 -4
- package/llms/components/lr-date-input.md +7 -1
- package/llms/components/lr-date-picker.md +6 -0
- package/llms/components/lr-dialog.md +21 -0
- package/llms/components/lr-doughnut-chart.md +3 -2
- package/llms/components/lr-drawer.md +10 -0
- package/llms/components/lr-drop-zone.md +16 -7
- package/llms/components/lr-dropdown-item.md +7 -0
- package/llms/components/lr-entity-chip.md +7 -1
- package/llms/components/lr-export-button.md +7 -1
- package/llms/components/lr-file-input.md +21 -10
- package/llms/components/lr-filter-bar.md +177 -18
- package/llms/components/lr-flow-canvas.md +16 -9
- package/llms/components/lr-gauge.md +22 -2
- package/llms/components/lr-histogram.md +7 -2
- package/llms/components/lr-icon-button.md +17 -8
- package/llms/components/lr-input.md +3 -1
- package/llms/components/lr-line-chart.md +3 -2
- package/llms/components/lr-lite-chart.md +13 -0
- package/llms/components/lr-locale-picker.md +7 -1
- package/llms/components/lr-map.md +63 -6
- package/llms/components/lr-mention-popover.md +16 -3
- package/llms/components/lr-menu-item.md +7 -0
- package/llms/components/lr-menu.md +8 -1
- package/llms/components/lr-message-actions.md +10 -0
- package/llms/components/lr-model-select.md +8 -3
- package/llms/components/lr-native-time-input.md +8 -1
- package/llms/components/lr-number-input.md +8 -1
- package/llms/components/lr-option.md +19 -0
- package/llms/components/lr-otp-input.md +6 -0
- package/llms/components/lr-pie-chart.md +3 -2
- package/llms/components/lr-polar-area-chart.md +3 -2
- package/llms/components/lr-prompt-input.md +2 -2
- package/llms/components/lr-radar-chart.md +3 -2
- package/llms/components/lr-reorder-item.md +12 -0
- package/llms/components/lr-reorder-list.md +12 -0
- package/llms/components/lr-scatter-chart.md +3 -2
- package/llms/components/lr-select.md +19 -2
- package/llms/components/lr-sequence-strip.md +10 -4
- package/llms/components/lr-streaming-text-core.md +28 -11
- package/llms/components/lr-streaming-text.md +41 -6
- package/llms/components/lr-suggestion-chips.md +8 -4
- package/llms/components/lr-table.md +47 -10
- package/llms/components/lr-textarea.md +1 -1
- package/llms/components/lr-time-input.md +7 -1
- package/llms/components/lr-tool-call-chip.md +7 -1
- package/llms/components/lr-tour.md +7 -1
- package/llms/components/lr-usage-badge.md +7 -1
- package/llms/components/lr-virtual-list.md +53 -0
- package/llms/components/lr-voice-picker.md +7 -3
- package/llms/shared.md +175 -19
- package/llms/tokens.md +17 -1
- package/llms-full.txt +1214 -169
- package/package.json +43 -3
- 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,754 @@
|
|
|
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
|
+
|
|
257
|
+
## 17.0.0
|
|
258
|
+
|
|
259
|
+
### Major Changes
|
|
260
|
+
|
|
261
|
+
- a0507c3: Release the accumulated Lyra UI API, metadata, compatibility, and accessibility corrections as
|
|
262
|
+
`17.0.0`. This release includes the common-issue cleanup pass across form controls, overlays, data
|
|
263
|
+
and retrieval components, viewers, shared tokens, localization, RTL behavior, generated contracts,
|
|
264
|
+
and package-size tooling.
|
|
265
|
+
|
|
266
|
+
### Minor Changes
|
|
267
|
+
|
|
268
|
+
- e7d8187: `<lr-app-rail>`'s `[part="panel"]` gains four direction-aware per-corner radius tokens
|
|
269
|
+
(`--lr-app-rail-panel-radius-start-start`/`-start-end`/`-end-start`/`-end-end`), each defaulting to
|
|
270
|
+
the existing uniform `--lr-app-rail-panel-radius` so an unset override still rounds all four
|
|
271
|
+
corners exactly as before. Because the mobile drawer is always flush against its own logical
|
|
272
|
+
inline-start edge, the two `-end` corner tokens are the ones a flush-against-one-edge drawer
|
|
273
|
+
typically rounds, and both mirror to the opposite physical side under `dir="rtl"` with no second
|
|
274
|
+
consumer rule. `[part="nav"]` gains `--lr-app-rail-nav-padding` and `--lr-app-rail-nav-gap`,
|
|
275
|
+
defaulting to the values that rule previously hard-coded. `<lr-app-rail-item>`'s icon-only square
|
|
276
|
+
gains `--lr-app-rail-item-icon-only-size`, which — when set — sizes `[part="base"]`'s icon-only
|
|
277
|
+
square (and its `min-block-size` floor) directly, independent of
|
|
278
|
+
`--lr-app-rail-item-min-block-size`, so a taller expanded row and an icon-only square pinned to
|
|
279
|
+
`--lr-icon-button-size` can coexist. Unset, all three continue to reproduce their prior rendering
|
|
280
|
+
exactly.
|
|
281
|
+
- e7d8187: `<lr-app-rail-item>`'s `[part="current-indicator"]` full-height edge bar now suppresses itself by
|
|
282
|
+
default in the `icon-only` presentation, where it previously painted a broken-looking bar across a
|
|
283
|
+
square icon tile. `--lr-app-rail-item-current-indicator-display` restores it per instance. A new
|
|
284
|
+
`--lr-app-rail-item-current-ring` token adds an inset ring on the icon-only current tile by
|
|
285
|
+
default — a non-color-only signal (WCAG 1.4.1) that replaces the suppressed bar there — while
|
|
286
|
+
leaving the full presentation, which already conveys current state through the bar and
|
|
287
|
+
`--lr-app-rail-item-current-font-weight`, ring-free by default. Setting the ring token explicitly
|
|
288
|
+
applies the same value in both presentations. Full presentation is otherwise byte-identical to
|
|
289
|
+
before.
|
|
290
|
+
- fa5c976: `<lr-app-rail-item>` gains its own expandable child list — the treeitem-with-link pattern used by
|
|
291
|
+
repository trees, Notion-style page trees and IDE explorers, where the row itself navigates and a
|
|
292
|
+
separate disclosure expands that item's own nested rows. Nested `<lr-app-rail-item>`s slotted into
|
|
293
|
+
`children` grow a built-in disclosure (`[part="toggle"]`) as a SIBLING of the item's own
|
|
294
|
+
link/button, never nested inside it, so the link keeps navigating on its own and the disclosure
|
|
295
|
+
keeps toggling on its own. The new `expanded` property (reflected, `false` by default) is driven
|
|
296
|
+
through a cancelable `lr-toggle-request`/settled `lr-toggle` pair, mirroring
|
|
297
|
+
`<lr-app-rail-group>`'s collapsible contract exactly (same event names, same `{ open }` detail
|
|
298
|
+
shape, same request/commit veto semantics). The disclosure carries `aria-expanded` and
|
|
299
|
+
`aria-controls`, and a localized accessible name interpolating the item's own label. `icon-only`
|
|
300
|
+
forwards from an item onto every `<lr-app-rail-item>` it owns through `children`, exactly how
|
|
301
|
+
`<lr-app-rail-group>` forwards onto the items and groups it owns; a new
|
|
302
|
+
`--lr-app-rail-item-indent` token (default `var(--lr-space-l)`) indents `[part="children"]` once
|
|
303
|
+
per nesting level. An item with nothing slotted into `children` renders no disclosure and no
|
|
304
|
+
`[part="children"]` at all — byte-identical to an item authored before this feature existed.
|
|
305
|
+
- 351a078: Added `lr-chart` (and every chart tag built on it -- `lr-bar-chart`, `lr-line-chart`,
|
|
306
|
+
`lr-scatter-chart`, `lr-bubble-chart`, `lr-pie-chart`, `lr-doughnut-chart`, `lr-radar-chart`,
|
|
307
|
+
`lr-polar-area-chart`, `lr-histogram`) three additive surfaces so a mixed dashboard chart no longer
|
|
308
|
+
needs to drop to raw Chart.js: `LyraChartSeries.stack` (a per-series Chart.js dataset `stack` group
|
|
309
|
+
id -- two groups on the same stacked axis are summed independently and drawn side by side);
|
|
310
|
+
`stackedAxes` (a per-value-axis override of `stacked`, so a stacked bar series on the primary axis
|
|
311
|
+
can sit next to an unstacked overlay series on `y2`); and `tooltipTitleFormatter`/
|
|
312
|
+
`tooltipFooterFormatter` (tooltip title/footer hooks receiving every hovered item's context at
|
|
313
|
+
once, in the same `LyraChartFormatterContext` shape `formatter`'s `'tooltip'` surface already
|
|
314
|
+
produces). `computeStackTotals()` is now computed per stack group as well as per axis, and the
|
|
315
|
+
canvas `stack-totals` data-label draws once per (axis, group) rather than once per axis. All three
|
|
316
|
+
additions are opt-in and unset by default: a chart that only sets the legacy `stacked` boolean
|
|
317
|
+
renders byte-identically to before. `lr-lite-chart` has no counterpart for any of the three --
|
|
318
|
+
documented as a deliberate omission (its single-value-scale, single-stack SVG bar-geometry model
|
|
319
|
+
and native per-mark `<title>` tooltip have no equivalent shape for a second value axis, a
|
|
320
|
+
per-series stack group, or a multi-item tooltip title/footer) rather than implemented.
|
|
321
|
+
- 7ef4f5e: `<lr-combobox>` now takes part in the library's positioning-strategy contract. It exposes
|
|
322
|
+
`positioningStrategy` (attribute `positioning-strategy`), spelled the same as on `<lr-select>`,
|
|
323
|
+
`<lr-popover>`, `<lr-dropdown>`, `<lr-tooltip>` and `<lr-color-picker>`, and when the instance sets
|
|
324
|
+
nothing it honours the cascading `--lr-positioning-strategy` custom property ahead of its own
|
|
325
|
+
default.
|
|
326
|
+
|
|
327
|
+
Previously the listbox was always `fixed` through an undocumented internal default: an app that set
|
|
328
|
+
`--lr-positioning-strategy` once on `:root` to retune every floating surface silently left comboboxes
|
|
329
|
+
behind, and no instance could opt out. The default stays `fixed` — what the listbox has always
|
|
330
|
+
rendered, and the right choice for a typeahead list that usually sits inside a scrollable region — so
|
|
331
|
+
existing layouts do not move.
|
|
332
|
+
|
|
333
|
+
There is deliberately no `hoist` alias on this control. On `<lr-select>` it is Shoelace's established
|
|
334
|
+
spelling; here it would be a boolean defaulting to `true`, whose attribute could only ever express
|
|
335
|
+
the value the control already has. Use `positioning-strategy="absolute"` to opt out.
|
|
336
|
+
- 4fc2bc1: `<lr-context-meter>`'s interactive mode can now express a non-actionable band. A `segments` entry
|
|
337
|
+
accepts `disabled`, which renders that band and its legend row as genuinely disabled controls — no
|
|
338
|
+
tab stop, no hover or press affordance, and no `lr-segment-activate` on activation. Previously a
|
|
339
|
+
band that filtered to nothing was still a fully enabled, tabbable button, so a keyboard user tabbed
|
|
340
|
+
through dead controls with no indication, and nothing distinguished the row visually.
|
|
341
|
+
|
|
342
|
+
Two derived state tokens join `segment-selected`/`legend-item-selected`, and all of them compose:
|
|
343
|
+
`segment-empty`/`legend-item-empty` for a band whose `value` is 0, and
|
|
344
|
+
`segment-disabled`/`legend-item-disabled` for a declared-disabled entry. `--lr-context-meter-disabled-opacity`
|
|
345
|
+
(default `0.5`) themes the disabled treatment.
|
|
346
|
+
|
|
347
|
+
Inertness is deliberately never inferred from `value === 0`: a zero band is legitimately clickable
|
|
348
|
+
in a token-budget meter, so the empty pair is a presentational hook with no built-in treatment while
|
|
349
|
+
`disabled` is declared by the consumer. A meter whose entries set neither renders exactly as before.
|
|
350
|
+
|
|
351
|
+
Internally this adds a shared `statePart()` helper, so a part name carrying several states is built
|
|
352
|
+
one way across the library instead of being hand-rolled per component.
|
|
353
|
+
- 6c826ec: `<lr-file-input>` and `<lr-drop-zone>` can now enforce a cumulative `maxFiles`/`maxTotalSize` cap
|
|
354
|
+
across separate picker or drop sessions. Both limits previously counted only the files the control
|
|
355
|
+
itself held, so with `nonRetaining` (or after a reload in retaining mode) a user already holding 99
|
|
356
|
+
server-persisted files could add 50 more without the control ever rejecting, and the consumer had to
|
|
357
|
+
re-implement the aggregate check and render its own error.
|
|
358
|
+
|
|
359
|
+
Two optional numeric properties, `heldFileCount` (`held-file-count`) and `heldTotalSize`
|
|
360
|
+
(`held-total-size`), are the numeric counterpart of `valuePresent`: they are added to the running
|
|
361
|
+
totals before a batch is evaluated, in both retaining and non-retaining modes, so an over-cap batch is
|
|
362
|
+
rejected through the control's own rejection UI with the existing `maxFiles`/`maxTotalSize` reasons.
|
|
363
|
+
Both default to `0`, which reproduces today's behavior exactly, and a negative, `NaN` or infinite
|
|
364
|
+
value is treated as `0`. The `lr-files` detail also gains `remainingFiles` and `remainingTotalSize`
|
|
365
|
+
(`null` while that limit is unset), so a consumer can say how many more files may be added. The
|
|
366
|
+
aggregate arithmetic is now shared by both components, so the contract cannot drift between them.
|
|
367
|
+
- 771d6fc: Five `<lr-filter-bar>` fixes.
|
|
368
|
+
|
|
369
|
+
An unset `'select'` or single `'combobox'` filter bound `''`, which those controls treat as a
|
|
370
|
+
committed unmatched value, so every page load showed their "not in catalog" treatment instead of the
|
|
371
|
+
declared placeholder. Unset now binds absent. The date branch deliberately keeps `''`, having no
|
|
372
|
+
catalog to mismatch against.
|
|
373
|
+
|
|
374
|
+
`activeFiltersDisplay` (`all` | `changed` | `hidden`, default `all`) controls the active-filter chip
|
|
375
|
+
row. It was unconditional, and a filter resting at its `defaultValue` counted as active — so a bar
|
|
376
|
+
whose default narrows the view claimed the user had narrowed it. `changed` lists only what the user
|
|
377
|
+
actually changed. The default reproduces today exactly.
|
|
378
|
+
|
|
379
|
+
The `'checkbox-menu'` trigger gains the disclosure caret its neighbours have, which also start-aligns
|
|
380
|
+
its content instead of centring a bold sentence in a stretched field, and its label and caret parts
|
|
381
|
+
are forwarded under the `filter-control-*` scheme.
|
|
382
|
+
|
|
383
|
+
A lean registration entry lets a bar pay only for the filter types it declares. The real cost was
|
|
384
|
+
that `filter-bar.class.ts` bare-imported eleven composed control modules it never referenced; those
|
|
385
|
+
are gone, so the class module is genuinely side-effect-free and the default entry still registers
|
|
386
|
+
everything for existing consumers.
|
|
387
|
+
|
|
388
|
+
The composed combobox tag's remove button is now forwarded, so a consumer re-skinning filter tags as
|
|
389
|
+
pills can style the control inside them instead of leaving library defaults in a custom pill.
|
|
390
|
+
- 71e9296: `<lr-gauge>`'s value/label captions are now sized in `em` (`--lr-size-1em` for the value, and
|
|
391
|
+
`calc(var(--lr-size-1em) * 0.625)` for the label — the same 0.625 multiplier `--lr-font-size-2xs`
|
|
392
|
+
carries, kept as `em` math because the value-named token catalog's growth is frozen) instead of the
|
|
393
|
+
previous `rem`-anchored tokens (`--lr-font-size-m`, `--lr-font-size-2xs`, and, for the `linear`
|
|
394
|
+
shape specifically, a flat `--lr-size-0-5rem`). Every box in this component was already `em`-based
|
|
395
|
+
(`--lr-size-8em` for `radial`/`ring`, `--lr-size-12em` by `--lr-size-1-5em` for `linear`), so a
|
|
396
|
+
smaller `size` tier or a caller's own `font-size` on the host previously shrank the frame while the
|
|
397
|
+
caption stayed pinned to the document root — at the smallest tiers, or below them, the fixed
|
|
398
|
+
caption nearly filled or overflowed the box. The caption now scales with the same font-size that
|
|
399
|
+
sets the frame, so `<lr-gauge shape="linear" size="xs">` (or smaller) is usable as a compact
|
|
400
|
+
dashboard meter. At the default (unset `size`, unmodified ambient font) tier the resolved caption
|
|
401
|
+
size is unchanged.
|
|
402
|
+
|
|
403
|
+
New `showValue` property (default `true`, matching today's rendering) lets the decorative
|
|
404
|
+
`part="value"` caption be omitted — `<lr-gauge show-value="false">` — the same way an empty
|
|
405
|
+
`label` already omits the `part="label"` caption. Mirrors `<lr-progress-bar>`'s and
|
|
406
|
+
`<lr-progress-ring>`'s own `showValue` name and meaning; the default differs because a gauge's
|
|
407
|
+
purpose is showing the reading it announces, so hiding it is the opt-out. The accessible value
|
|
408
|
+
(`aria-valuenow`/`aria-valuetext`, the host's computed accessible name) is unaffected either way,
|
|
409
|
+
since the caption was always `aria-hidden`.
|
|
410
|
+
- 2435dad: A blocked native form submission — clicking a `type="submit"` control, calling
|
|
411
|
+
`form.requestSubmit()`, or implicit Enter submission — now marks every invalid participant as
|
|
412
|
+
user-interacted, so `:state(user-invalid)` (and `:state(user-valid)` once corrected) matches
|
|
413
|
+
exactly like native `:user-invalid`/`:user-valid` do. Previously only an explicit
|
|
414
|
+
`control.reportValidity()`/`form.reportValidity()` call counted: a submission attempt drives
|
|
415
|
+
`ElementInternals` directly and never calls a control's own `reportValidity()` method, so
|
|
416
|
+
`aria-invalid` correctly went `true` on a blocked submit while the `user-invalid` custom state
|
|
417
|
+
silently stayed unset.
|
|
418
|
+
|
|
419
|
+
A control's own silent `checkValidity()` query continues to never count as interaction, however
|
|
420
|
+
invalid the control already is — this is unchanged and is the one path interactive validation is
|
|
421
|
+
deliberately distinguished from.
|
|
422
|
+
|
|
423
|
+
Affects every form control that manages `ElementInternals` directly rather than through the
|
|
424
|
+
`FormAssociated` mixin (the mixin itself already got this fix): `<lr-radio>`, `<lr-radio-button>`,
|
|
425
|
+
`<lr-radio-group>`, `<lr-checkbox>`, `<lr-checkbox-group>`, `<lr-switch>`, `<lr-slider>`,
|
|
426
|
+
`<lr-select>`, `<lr-combobox>`, `<lr-token-input>`, `<lr-time-range>`, `<lr-file-input>`,
|
|
427
|
+
`<lr-rating>`, `<lr-model-select>`, `<lr-voice-picker>`, `<lr-locale-picker>`,
|
|
428
|
+
`<lr-graph-query-builder>`, `<lr-tool-param-form>`, and `<lr-rubric-form>`. Every affected
|
|
429
|
+
component's `@cssstate user-valid`/`user-invalid` JSDoc is corrected to document the rule above
|
|
430
|
+
instead of the looser "or a native validity check"/"or an explicit validity report" wording some
|
|
431
|
+
of them previously carried.
|
|
432
|
+
- 96c30ac: `<lr-model-select>` and `<lr-voice-picker>` catalog entries accept `disabled`. A disabled row renders
|
|
433
|
+
as a genuinely non-actionable control — no tab stop, no hover or press affordance — and keyboard
|
|
434
|
+
navigation steps over it without stranding focus. Both components share one catalog entry type, so
|
|
435
|
+
the contract cannot drift between them. An entry that does not set it renders exactly as before.
|
|
436
|
+
- a80606f: `<lr-color-picker>` palette swatches accept `disabled`, so a swatch can be shown as unavailable
|
|
437
|
+
rather than silently doing nothing when chosen. The swatch renders genuinely disabled, selection
|
|
438
|
+
emits nothing, and keyboard navigation steps past it. A swatch that does not set it renders exactly
|
|
439
|
+
as before.
|
|
440
|
+
- d6eb9b1: `<lr-flow-canvas>` nodes accept `disabled`, so a locked, read-only or in-progress node can be shown
|
|
441
|
+
without being activatable. The node's control renders genuinely disabled, activation emits nothing,
|
|
442
|
+
and roving focus steps past it. A node that does not set it renders exactly as before.
|
|
443
|
+
- 62db946: `<lr-mention-popover>` items accept `disabled`, so an ineligible mention or command can stay visible
|
|
444
|
+
without being selectable. The row carries `aria-disabled`, activation emits nothing, and
|
|
445
|
+
active-descendant navigation steps over it without leaving focus stranded. An item that does not set
|
|
446
|
+
it renders exactly as before.
|
|
447
|
+
- 5f4e877: `<lr-sequence-strip>` items accept `disabled`, so a step that cannot currently be opened stops being
|
|
448
|
+
a reachable control that does nothing. Activation emits nothing and roving focus steps past it. An
|
|
449
|
+
item that does not set it renders exactly as before.
|
|
450
|
+
- 694032e: `<lr-suggestion-chips>` suggestions accept `disabled`, so a suggestion that is visible but not
|
|
451
|
+
currently offerable stops being a live, focusable control that does nothing. Activation emits
|
|
452
|
+
nothing and keyboard navigation steps past it. A suggestion that does not set it renders exactly as
|
|
453
|
+
before.
|
|
454
|
+
- 3e5b916: Every `registrations.json` row now carries `localeKeys`: the `LyraMessageKey`s reachable by every tag
|
|
455
|
+
that importing it registers. It reuses the reachability walk that already derives the tree-shakeable
|
|
456
|
+
default-string slices — including keys a component reaches only through an indirect lookup table,
|
|
457
|
+
such as `lr-attachment-trigger`'s per-kind trigger and menu keys — rather than scanning for literal
|
|
458
|
+
`localize()` calls. Paired with `getRegisteredLyraLocaleKeys()`, a consumer can now verify that its
|
|
459
|
+
locale catalogue covers everything its rendered components can reach entirely from public, generated
|
|
460
|
+
metadata, with no parsing of `dist/`. The field is additive, so `schemaVersion` stays `1`.
|
|
461
|
+
- 3e5b916: `registrations.json` now covers every published registration specifier, not just per-tag aliases.
|
|
462
|
+
The three published integration-bridge specifiers — `components/media/flag/flag-peer.js`,
|
|
463
|
+
`components/viewers/archive-viewer/archive-viewer-register.js` and
|
|
464
|
+
`components/viewers/ebook-viewer/ebook-viewer-register.js` — had no row at all, so a consumer asking
|
|
465
|
+
which tags importing one of them defines still had to walk `dist/`. They now appear in a new
|
|
466
|
+
top-level `integrations` array, each with a `registers` list derived from the module's real
|
|
467
|
+
transitive import closure (including the lazy `import()` a document-format registrar uses once a
|
|
468
|
+
matching file appears), never inferred from the file name.
|
|
469
|
+
|
|
470
|
+
Every row, in `entries` and `integrations`, also gains `distModule`: the registration module's own
|
|
471
|
+
published deep specifier. `registrationModule` is a `src/` path that cannot be resolved against the
|
|
472
|
+
tarball; `distModule` can.
|
|
473
|
+
|
|
474
|
+
The bridges live in their own array rather than as tag-less rows inside `entries`, because every
|
|
475
|
+
`entries` row has always carried `tag` and a reader keying by it would otherwise receive `undefined`.
|
|
476
|
+
All additions are additive, so `schemaVersion` stays `1`.
|
|
477
|
+
- 83cde91: `<lr-streaming-text>`/`<lr-streaming-text-core>` forward the rest of the composed `<lr-markdown>`/
|
|
478
|
+
`<lr-markdown-core>` configuration surface verbatim: `tabSize`, `htmlMode`, `gfm`, `linkTarget`,
|
|
479
|
+
`internalLinkPrefix`, `headingOffset`, `highlightCode`, `headingAnchors`, `math`, and `maxHeight`,
|
|
480
|
+
alongside the already-forwarded `content`, `streaming`, and `languages`. Previously every one of
|
|
481
|
+
these was pinned at the composed element's default and unreachable through the wrapper, so a
|
|
482
|
+
consumer who had deliberately set, for example, `link-target=""` for same-tab links silently got
|
|
483
|
+
`target="_blank"` back after adopting `<lr-streaming-text>`. Each new property defaults to exactly
|
|
484
|
+
the composed element's own default, so leaving all of them unset renders identically to before.
|
|
485
|
+
The composed element still applies its own `rel="noopener noreferrer"` guard whenever a forwarded
|
|
486
|
+
`linkTarget` emits a `target`, and never a bare `opener`.
|
|
487
|
+
- 3b1e717: `<lr-table>`'s `editTrigger: 'double-click'` inline cell editor is now reachable by keyboard, closing
|
|
488
|
+
a WCAG 2.1.1 gap: a `'double-click'` column's resting cell is its own `tabindex="-1"` roving-focus
|
|
489
|
+
stop, reachable with ArrowRight/ArrowLeft once the row itself has focus, and `F2` or `Enter` on that
|
|
490
|
+
focused cell opens its editor exactly as a double-click would. `Enter` on the row itself still only
|
|
491
|
+
activates the row. Closing the editor, by commit or by cancel, returns focus to the cell that opened
|
|
492
|
+
it. A new public `editCell(rowKey, columnKey)` method opens the same editor programmatically, for a
|
|
493
|
+
consumer's own key binding or menu action. A table with no `editTrigger: 'double-click'` column
|
|
494
|
+
renders byte-identical markup. `TableColumn.cell` is now optional for an `editTrigger: 'always'`
|
|
495
|
+
column, whose persistent editor renders unconditionally and never falls back to it; every other
|
|
496
|
+
column still requires `cell`.
|
|
497
|
+
- f1612c9: `<lr-table>` columns gain `editLabel?: (row: T) => string`, mirroring the existing `editValue`/
|
|
498
|
+
`cellTitle` row callbacks: when defined, it becomes the inline cell editor's accessible name for
|
|
499
|
+
that row instead of the interpolated `tableEditCell` default (`Edit {column}`). The default is
|
|
500
|
+
identical for every row in a column, which is adequate for `editTrigger: 'double-click'` (only one
|
|
501
|
+
editor is ever open at a time) but not for `editTrigger: 'always'`, where every row's editor is a
|
|
502
|
+
permanent, individually focusable Tab stop -- a 50-row column with no `editLabel` exposed 50
|
|
503
|
+
identically named controls to keyboard and screen-reader users (WCAG 2.4.6, 1.3.1). A column that
|
|
504
|
+
omits `editLabel` renders byte-identical output to before.
|
|
505
|
+
- 0baf79e: `<lr-table>` gains `rowExpandLabel?: (row, expanded) => string`, the accessible name for one row's
|
|
506
|
+
expand/collapse chevron. Every chevron was named from the same localized `expand`/`collapse` string,
|
|
507
|
+
so a long table exposed dozens of identically named Tab stops with no way to tell the rows apart —
|
|
508
|
+
the same shape as the inline editor's naming gap, on a different surface.
|
|
509
|
+
|
|
510
|
+
The default is unchanged, because this component has no row-header notion to derive row context from
|
|
511
|
+
(`rowKey` is an opaque identity, not a label), so a table that does not set the callback renders
|
|
512
|
+
byte-identically.
|
|
513
|
+
- acb4266: Added `waitForLyraElement()` and `waitForToast()` to `@aceshooting/lyra-ui/testing`. `toast()`
|
|
514
|
+
registers `<lr-toast>`/`<lr-toast-item>` through a dynamic `import()` on first call, so a
|
|
515
|
+
fire-and-forget `toast(...)` -- the normal application pattern -- leaves the document empty for at
|
|
516
|
+
least one microtask, forcing a downstream test to hand-write a polling loop before it can assert on
|
|
517
|
+
the toast's rendered text. `waitForLyraElement(selector, options?)` is a generic, bounded,
|
|
518
|
+
event-driven awaitable (`MutationObserver` plus `customElements.whenDefined()`, no busy polling) for
|
|
519
|
+
"a matching library element is connected and upgraded," reachable from an optional `root` and
|
|
520
|
+
filterable by an optional `match` predicate; it rejects with a descriptive error after a bounded
|
|
521
|
+
timeout (2000ms default). `waitForToast(match?, options?)` is the named convenience for `<lr-toast-item>`,
|
|
522
|
+
matching by trimmed text or a predicate. Both run in a real browser and in the documented happy-dom
|
|
523
|
+
test environment. `confirm()` was swept too: it registers `<lr-dialog>` synchronously and has no
|
|
524
|
+
equivalent gap, so it gets no new helper.
|
|
525
|
+
- 857f2ef: `@aceshooting/lyra-ui/theme-bootstrap.js` -- the static, external no-flash theme script for a
|
|
526
|
+
strict Content-Security-Policy -- now reads `data-lr-theme-storage-key` and
|
|
527
|
+
`data-lr-theme-attributes` (space-separated) from its own `<script>` tag via
|
|
528
|
+
`document.currentScript` at parse time, so an application with its own pre-existing `localStorage`
|
|
529
|
+
key can use the shared static asset instead of inlining a per-app copy generated from
|
|
530
|
+
`createLyraThemeBootstrap({ storageKey })`. Both attributes are optional and validated, failing
|
|
531
|
+
closed to today's baked-in defaults (`'lyra-theme'` and `data-lr-theme`/`data-theme`) on an absent,
|
|
532
|
+
empty, oversized, or malformed value -- including an attribute-name list entry that is not a safe
|
|
533
|
+
`data-*`-shaped token (rejecting `on*` handler names, `style`/`class`/`id`, and anything containing
|
|
534
|
+
whitespace, a quote, `=`, or a control character), a list longer than eight entries or with a
|
|
535
|
+
duplicated entry, an oversized storage key, or a `null` `document.currentScript` (module/async
|
|
536
|
+
misuse). A `<script>` tag carrying neither attribute -- every existing deployment, and every inline
|
|
537
|
+
use of `lyraThemeBootstrap`/`createLyraThemeBootstrap()` -- behaves exactly as before.
|
|
538
|
+
|
|
539
|
+
### Patch Changes
|
|
540
|
+
|
|
541
|
+
- 2787a1d: `<lr-button>` now re-evaluates its icon-only geometry when the slotted label's visibility changes
|
|
542
|
+
through CSS alone. Detection ran on `slotchange` and once on the first update, so the most natural
|
|
543
|
+
responsive idiom — a container or media query hiding the label at a narrow width — changed computed
|
|
544
|
+
style with no DOM mutation and nothing re-ran: the button kept full text geometry, padding and
|
|
545
|
+
min-width around an invisible label. It happened to look right only when the element was created
|
|
546
|
+
after the breakpoint was already crossed, which made it read as an intermittent bug.
|
|
547
|
+
|
|
548
|
+
A `ResizeObserver` now watches the label wrapper's own box. It deliberately does not watch the host
|
|
549
|
+
or the base part: once icon-only, those take a fixed size, so widening the container would not resize
|
|
550
|
+
them and the button could never flip back — the same one-way trap the fix exists to remove. The
|
|
551
|
+
recompute is deferred to an animation frame, matching `<lr-textarea>`'s auto-grow observer, because a
|
|
552
|
+
microtask-deferred write lands inside the same delivery pass and trips a ResizeObserver loop warning.
|
|
553
|
+
- 1059b56: Fixed `custom-elements.json` silently omitting `value`, `name`, `required`, and `disabled` (as both
|
|
554
|
+
members and attributes) for a `FormAssociated` component that inherits the mixin through a
|
|
555
|
+
superclass in a different module rather than declaring it directly -- `lr-number-input` and
|
|
556
|
+
`lr-native-time-input` (both extend `LyraInput`, which owns the mixin). The
|
|
557
|
+
`lr-form-associated-mixin-members` custom-elements-manifest plugin's superclass-chain walk already
|
|
558
|
+
found and back-filled these declarations correctly; the gap was that `scripts/manifest-compact.mjs`
|
|
559
|
+
runs as a separate pass after `cem analyze` and prunes any member/attribute whose `inheritedFrom`
|
|
560
|
+
resolves to an identical entry on the named superclass, which is exactly what the back-filled (and,
|
|
561
|
+
for `value`, CEM's own natively-inherited) entries looked like. Both tags now carry the same
|
|
562
|
+
member/attribute shapes, types, and defaults as every other `FormAssociated` consumer. Manifest
|
|
563
|
+
accuracy only -- runtime behavior was already correct.
|
|
564
|
+
- 0b207cb: Docs: every component whose icon-only action became a composed `<lr-icon-button>` in 16.0.0 now
|
|
565
|
+
carries the migration note that only `lr-copy-button` had. A `::part()` rule that used to paint that
|
|
566
|
+
button now names the composed child's host, which paints nothing — and because `color` still
|
|
567
|
+
inherits, such a rule looks half-alive rather than broken, which is how it escapes review. The note
|
|
568
|
+
says what to do instead: set the `--lr-icon-button-*` paint tokens on the component or an ancestor,
|
|
569
|
+
and use `--lr-theme-icon-button-size` for size, since `--lr-icon-button-size` is re-declared on every
|
|
570
|
+
host and never reaches a composed child.
|
|
571
|
+
|
|
572
|
+
Also pins the border half of that contract with a test: an ancestor `--lr-icon-button-border` does
|
|
573
|
+
reach a composed control, so border is not the one paint property that silently dies.
|
|
574
|
+
- ef05323: Fixed `<lr-confirm-bar>`'s `returnFocusTo` thunk resolving before a reactive host could re-create
|
|
575
|
+
the control it names. The documented motivating case -- a host that conditionally swaps a focused
|
|
576
|
+
trigger out for this bar, then swaps a brand-new trigger back in once a decision lands -- could
|
|
577
|
+
never work: every supported host framework re-renders asynchronously relative to the bar's own
|
|
578
|
+
synchronous focus handoff, so the thunk's first (and, previously, only) call always found the
|
|
579
|
+
replacement control missing and fell back past `[part="status"]` to `<body>` once the host's own
|
|
580
|
+
re-render removed the bar.
|
|
581
|
+
|
|
582
|
+
When the thunk's immediate resolution fails, the handoff now retries once more after the host has
|
|
583
|
+
had a real chance to react, and moves focus there only if it has since appeared, is connected and
|
|
584
|
+
focusable, and nothing else has claimed focus in the meantime. An immediately-resolving thunk or a
|
|
585
|
+
plain element value is unaffected -- resolved once, synchronously, exactly as before.
|
|
586
|
+
|
|
587
|
+
The retry is a new shared primitive, `deferComposedFocusRepair()` (plus its `nextHostUpdateOpportunity()`
|
|
588
|
+
timing helper), in `src/internal/focus-navigation.ts`, built on the existing
|
|
589
|
+
`captureComposedFocusRepair()`/`applyComposedFocusRepair()` pair so any other component with the same
|
|
590
|
+
shape -- a return-focus thunk naming a control its host re-creates asynchronously -- can adopt it
|
|
591
|
+
directly.
|
|
592
|
+
- 71e9296: Fixed: `<lr-context-meter shape="ring">`'s centered caption (`.ring-label`, inside `part="label"`)
|
|
593
|
+
now sizes itself in `em` (`calc(var(--lr-size-1em) * 0.625)`) instead of the previous
|
|
594
|
+
`rem`-anchored `--lr-font-size-2xs`. The ring itself is already `--lr-size-8em`, so a caller's own
|
|
595
|
+
`font-size` on the host shrinks the ring but previously left the caption pinned to the document
|
|
596
|
+
root — the same defect shape `<lr-gauge>`'s linear caption had. At the default (unmodified ambient
|
|
597
|
+
font) size the resolved caption size is unchanged.
|
|
598
|
+
- 63ee11b: `<lr-data-grid>` no longer treats an unchanged re-bind of `filters` or `sort` as a change. Both
|
|
599
|
+
setters rebuilt a fresh frozen array on every write, so the new reference was never `===` the old one
|
|
600
|
+
and Lit's dirty check always reported a change. Because a `filters`/`sort` change schedules a server
|
|
601
|
+
request — and a `filters` change schedules the *debounced* one — a host that re-binds these
|
|
602
|
+
properties on every render (the ordinary controlled pattern, often driven by the grid's own events)
|
|
603
|
+
could push the server request further away indefinitely, and re-rendered for nothing in the meantime.
|
|
604
|
+
|
|
605
|
+
The setters now compare the normalized content and keep the held value, including its reference, when
|
|
606
|
+
nothing actually changed. A genuinely different value still schedules exactly as before.
|
|
607
|
+
- 36f83ca: `<lr-input>`'s and `<lr-textarea>`'s `debounce` no longer silently stops working under the
|
|
608
|
+
controlled-input pattern. A pending `lr-input-settled` was cancelled by any programmatic `value`
|
|
609
|
+
write, including the one every framework binding makes on each render when it writes the just-typed
|
|
610
|
+
value straight back, so the event simply never fired and nothing warned. Only a write that actually
|
|
611
|
+
changes the value now cancels the pending settle; a write of the value already held leaves it
|
|
612
|
+
pending. A genuinely different value still supersedes the in-flight edit, exactly as before.
|
|
613
|
+
|
|
614
|
+
The fix lives in the shared `DebounceController` (a new `cancelIfChanged()`), so every debounced
|
|
615
|
+
control that routes external writes through it gets the same contract.
|
|
616
|
+
- 622e12c: `formatNumber`, `formatDate`, `formatRelativeTime`, `formatBytes` and the exported `binValues()` now
|
|
617
|
+
treat an omitted `locale` as the app's active locale instead of hardcoding English. They passed the
|
|
618
|
+
argument straight to the Intl cache, whose resolver starts at `'en'`, so an app that called
|
|
619
|
+
`setLyraLocale('fr')` saw every component render French while these standalone helpers silently stayed
|
|
620
|
+
English — and it looked correct in any English-locale test run.
|
|
621
|
+
|
|
622
|
+
An explicit `locale` argument still wins, and an app that never calls `setLyraLocale()` gets
|
|
623
|
+
byte-identical output: the resolution consults only the pinned active locale and deliberately does
|
|
624
|
+
not fall through to `<html lang>` or `navigator.language`, since a bare function call has no host
|
|
625
|
+
element to resolve against.
|
|
626
|
+
- 6130112: Fix: the seven built-in controls that compose `<lr-icon-button>` for an icon-only action
|
|
627
|
+
(`<lr-callout>`, `<lr-dialog>` — inherited by `<lr-drawer>` — `<lr-code-block>`, shared by
|
|
628
|
+
`<lr-code-block-core>`, `<lr-message-actions>`, `<lr-reorder-item>`, `<lr-attachment-trigger>`, and
|
|
629
|
+
`<lr-copy-button>`) no longer capture a public `--lr-icon-button-*` token on their own `:host` and
|
|
630
|
+
re-declare that same public name on the composed part. `<lr-icon-button>` now carries a private
|
|
631
|
+
`--_lr-icon-button-<token>-default` fallback tier for every paint token (background/color/border and
|
|
632
|
+
their hover/active variants), generalizing the existing `--_lr-icon-button-radius-default` shape;
|
|
633
|
+
each composing component sets its own default directly on that private tier instead of the public
|
|
634
|
+
one. An ancestor `--lr-icon-button-*` override still wins exactly as before — `<lr-icon-button>`'s
|
|
635
|
+
own stylesheet checks the public token first, ahead of any default a composing parent supplies — but
|
|
636
|
+
no descendant declares the public name from a private token derived from that same public token
|
|
637
|
+
anymore, so a scope-flattening custom-property resolver with no notion of which element declared
|
|
638
|
+
what (happy-dom, at least through 20.14.5) no longer sees a cycle: rendering any of the seven
|
|
639
|
+
controls under such an environment no longer throws `RangeError: Maximum call stack size exceeded`.
|
|
640
|
+
Revises the `llms/shared.md` testing note added in 16.0.0 to match — current versions are
|
|
641
|
+
unaffected. No public API changed.
|
|
642
|
+
- 2435dad: Verified and documented that `--lr-icon-button-border` reaches every 16.0.0 composed icon action
|
|
643
|
+
(`<lr-dialog>`'s close control, `<lr-reorder-item>`'s move controls, `<lr-code-block>`'s copy
|
|
644
|
+
control, `<lr-attachment-trigger>`'s trigger) the same way `--lr-icon-button-background`/`-color`/
|
|
645
|
+
`-radius` do. A report read the absence of a relayed `--_lr-icon-button-border-default` on
|
|
646
|
+
`<lr-dialog>`/`<lr-reorder-item>`/`<lr-code-block>` (none of which paint a resting border) as
|
|
647
|
+
border theming being broken for those components. Rendered `getComputedStyle` assertions now cover
|
|
648
|
+
all four components, including `<lr-attachment-trigger>`'s `outlined`/`filled-outlined`
|
|
649
|
+
appearances, which DO relay a non-zero border default and must still let an ancestor's public
|
|
650
|
+
token override it. No source change was needed — the public token was already the first, winning
|
|
651
|
+
arm of the fallback chain in every case; only test coverage and the authored `llms/` reference
|
|
652
|
+
pages were missing an explicit statement of the rule.
|
|
653
|
+
- af075a9: Docs: corrected the token-scope contract for `--lr-icon-button-size`, `--lr-otp-input-segment-size`,
|
|
654
|
+
and `--lr-popover-viewport-clamp`. All three read like ordinary per-component
|
|
655
|
+
`--lr-<component>-*` tokens, but the shared base token layer (`internal/tokens.styles.ts`) declares
|
|
656
|
+
each of them on its own `:host` block, which every `lr-*` component includes -- so, like
|
|
657
|
+
`--lr-focus-ring-width`/`-color`/`-offset`, a rule that sets one of them on an ancestor is reset at
|
|
658
|
+
the first intervening `lr-*` component and never reaches a nested target. This was always the
|
|
659
|
+
behavior (and is already asserted by `internal/tokens.test.ts`); the docs previously implied all
|
|
660
|
+
`--lr-icon-button-*`/`--lr-otp-input-*` tokens inherit uniformly from an ancestor, which is true for
|
|
661
|
+
every other one of them (e.g. `--lr-icon-button-radius`/`-background`) but not these. Updated
|
|
662
|
+
`lr-icon-button`'s and `lr-otp-input`'s own `@cssprop` JSDoc, the icon-button and otp-input entries
|
|
663
|
+
in `llms/forms.md`, and the design-token overview built by `scripts/build-llms.mjs`
|
|
664
|
+
(`llms/tokens.md`) to state the general rule once and name the affected tokens; added test coverage
|
|
665
|
+
proving the asymmetry against a nested shadow root. No runtime behavior changed and no token was
|
|
666
|
+
renamed.
|
|
667
|
+
- 616e6d6: Twenty components derived state from their slotted children only through a `slotchange` listener, so
|
|
668
|
+
they depended on the environment firing that event for a slot's INITIAL assignment. A DOM
|
|
669
|
+
implementation that does not — happy-dom, through 20.14.5 — leaves that state empty forever when the
|
|
670
|
+
children already exist at connect, which is what the ordinary conditional-render pattern produces.
|
|
671
|
+
Most visibly, an `<lr-select>`/`<lr-combobox>` whose `<lr-option>` children are rendered in the same
|
|
672
|
+
commit had zero options there, so the shipped `chooseOption()` testing driver threw, contradicting
|
|
673
|
+
the testing entry's own cross-environment promise.
|
|
674
|
+
|
|
675
|
+
Each affected component now also collects once on first update, from the slot's assigned elements,
|
|
676
|
+
through a shared helper. The collection is idempotent, so a real browser firing the initial event as
|
|
677
|
+
well changes nothing. Also fixed along the way: `lr-menu`'s collection was not idempotent (a second
|
|
678
|
+
pass misread the settled active item as having moved and stole focus), and `lr-chart` could have an
|
|
679
|
+
already-collected slotted config clobbered back to undefined by a phantom `slotchange` fired at the
|
|
680
|
+
slot element discarded during its loading-to-loaded render swap.
|
|
681
|
+
|
|
682
|
+
About eighty other components were checked and already seed their slot-derived state eagerly; they
|
|
683
|
+
are unchanged.
|
|
684
|
+
- 9c19aed: The cascading `--lr-positioning-strategy` custom property (`src/internal/positioning-strategy.ts`)
|
|
685
|
+
was documented as read by "every anchored/positioned overlay in this library", but until now only
|
|
686
|
+
`<lr-select>`, `<lr-popover>` (and `<lr-dropdown>` through it), `<lr-tooltip>`, `<lr-color-picker>`
|
|
687
|
+
and `<lr-combobox>` actually routed their placement through the shared resolver. An app that set the
|
|
688
|
+
property once on `:root` to retune every floating surface silently left every other anchored surface
|
|
689
|
+
behind.
|
|
690
|
+
|
|
691
|
+
`<lr-menu>` (the private submenu surface), `<lr-mention-popover>`, `<lr-export-button>`,
|
|
692
|
+
`<lr-usage-badge>`, `<lr-tool-call-chip>`, `<lr-tour>`, `<lr-locale-picker>`, `<lr-date-input>`,
|
|
693
|
+
`<lr-time-input>`, `<lr-citation-badge>`, `<lr-entity-chip>`, and `<lr-app-rail-item>` now honour the
|
|
694
|
+
same cascading property. None of them exposes a per-instance `positioning-strategy` property — that
|
|
695
|
+
remains a separate, deliberate decision — so an ancestor override is the only way to change them, and
|
|
696
|
+
their own default stays exactly what it always rendered (`fixed` in every case), so nothing moves for
|
|
697
|
+
anyone who sets nothing.
|
|
698
|
+
|
|
699
|
+
`<lr-popup>`, the low-level positioning primitive, is deliberately excluded: its own `strategy`
|
|
700
|
+
property is a plain, always-defined value (default `'absolute'`, never `undefined`), so there is no
|
|
701
|
+
way to distinguish "left unset" from "authored the default" without adding the same
|
|
702
|
+
explicit-vs-default tracking machinery the higher-level components' `positioning-strategy` property
|
|
703
|
+
uses — which this sweep does not add anywhere. It is also meant to be composed directly by a consumer
|
|
704
|
+
who already controls `strategy` explicitly.
|
|
705
|
+
- 2435dad: Added `pnpm run regen`, a single command that runs every source-artifact generator (manifest,
|
|
706
|
+
component inventory, framework types, events, the testing event registry, component metadata,
|
|
707
|
+
registrations/tag-aliases, the autoloader manifest, the registration graph, default-string and
|
|
708
|
+
translation slices, the three palette generators, design tokens, reservation styles, editor data,
|
|
709
|
+
and llms) in real dependency order, so a batch of source changes no longer needs a human to
|
|
710
|
+
remember and re-run each generator individually before `pnpm lint`. Added `scripts/check-regen-
|
|
711
|
+
coverage.mjs` (wired into `contract-policy` as `check:regen-coverage`/`test:regen-coverage`), a
|
|
712
|
+
gate that derives which generators `regen` must reach directly from the freshness gates themselves
|
|
713
|
+
— a same-file `--check`/write argument pair, a gate's own `pnpm run <name>` remedy text, or a gate
|
|
714
|
+
that imports/references a generator file directly — rather than a hand-kept list, so a newly added
|
|
715
|
+
or renamed generator cannot silently fall out of `regen` again. No runtime behavior changed;
|
|
716
|
+
`pnpm run regen` on an already-fresh tree is a no-op.
|
|
717
|
+
- 74a887b: `<lr-table>` no longer gets stuck with `priority`-hidden columns after the table widens back out.
|
|
718
|
+
Narrowing correctly hid `low`/`medium` columns once their content actually overflowed, but widening
|
|
719
|
+
never restored them: `recomputeHiddenPriorityColumns()` reconstructed "how wide would everything be"
|
|
720
|
+
by adding a hidden tier's cached natural width to `[part='base']`'s CURRENT `scrollWidth` — and once a
|
|
721
|
+
tier was hidden, `[part='table']`'s own `inline-size: 100%` stretched the remaining columns to fill
|
|
722
|
+
any leftover room, so that `scrollWidth` tracked `clientWidth` instead of the remaining content's real
|
|
723
|
+
width. The reconstructed total then chased whatever the container currently measured rather than the
|
|
724
|
+
actual content, so `overflowAtFull` never dropped enough to re-admit a hidden tier — `reload` or
|
|
725
|
+
`priorityColumnsVisible = true` were the only ways back, because both bypass the measurement entirely.
|
|
726
|
+
|
|
727
|
+
The fully-visible width is now reconstructed from three independently cached natural widths (the
|
|
728
|
+
always-visible columns, plus each hidden tier) instead of from the currently-rendered, potentially
|
|
729
|
+
stretched `scrollWidth`. Every cache is refreshed only on a pass where the table is genuinely too wide
|
|
730
|
+
for its container — the one condition under which nothing rendered has spare room to stretch into, and
|
|
731
|
+
necessarily true on the pass that first decides to hide anything — so a widening container now
|
|
732
|
+
correctly restores every tier that fits, without the restored tier immediately re-hiding on the very
|
|
733
|
+
next measurement pass its own restoration triggers.
|
|
734
|
+
- 2435dad: Fixed `<lr-input>`'s required-field description, `<lr-task-list>`'s per-item status label,
|
|
735
|
+
`<lr-transcript-feed>`'s interim "Transcribing…" marker, and `<lr-filter-bar>`'s touched-required
|
|
736
|
+
inline error and hidden filter-control label: all four rendered `class="sr-only"` without
|
|
737
|
+
composing the shared `srOnly` style block from `internal/a11y.ts` into their own
|
|
738
|
+
`static override styles`, so the class name did nothing and the assistive-only text rendered as
|
|
739
|
+
ordinary visible content instead of being clipped to a 1px box. Each component now composes the
|
|
740
|
+
shared `srOnly` export, matching the reference shape in `time-input.class.ts`.
|
|
741
|
+
|
|
742
|
+
Added `scripts/check-visually-hidden.mjs` (with its own `scripts/check-visually-hidden.test.mjs`
|
|
743
|
+
unit tests), a new static gate wired into `contract-policy`/`pnpm lint` as
|
|
744
|
+
`check:visually-hidden`/`test:visually-hidden`. It flags any `*.class.ts` file whose render
|
|
745
|
+
template applies the `sr-only` class without either composing the shared `srOnly` export or
|
|
746
|
+
declaring a matching scoped `.sr-only { ... }` rule in its own sibling `*.styles.ts`, so this
|
|
747
|
+
class of defect fails CI instead of shipping silently. Added browser regression tests for all four
|
|
748
|
+
components asserting the rendered `getComputedStyle()` result (clipped, absolute-positioned, with
|
|
749
|
+
the accessible text still present in the DOM), plus explicit `<lr-input>` coverage of the pristine
|
|
750
|
+
(no visible required text, error part hidden) and failed-submission (error becomes visible) states.
|
|
751
|
+
|
|
3
752
|
## 16.0.0
|
|
4
753
|
|
|
5
754
|
### Major Changes
|
|
@@ -65,6 +814,15 @@
|
|
|
65
814
|
reading a painted value off it (`getComputedStyle(node).backgroundColor`) needs
|
|
66
815
|
`node.shadowRoot.querySelector('[part~="button"]')`.
|
|
67
816
|
|
|
817
|
+
**Size is the one token that does NOT follow that rule.** `--lr-icon-button-background`/`-color`/
|
|
818
|
+
`-radius`/`-border` inherit down to a composed action, but `--lr-icon-button-size` set on the
|
|
819
|
+
wrapping component does not reach it, and `min-inline-size`/`min-block-size` written on the old
|
|
820
|
+
part cannot push the nested control past its own floor — so a pre-16 rule that sized one of these
|
|
821
|
+
controls, including a coarse-pointer touch-target pair, is inert with no visible symptom. Use
|
|
822
|
+
`--lr-theme-icon-button-size` instead; it is the hook that crosses into the composed child. This
|
|
823
|
+
applies to every component in the table above, not only `<lr-copy-button>`, whose reference page
|
|
824
|
+
was previously the only place it was written down.
|
|
825
|
+
|
|
68
826
|
**Not affected by this change.** Other icon-sized built-in buttons deliberately stay native
|
|
69
827
|
`<button>`s in 16.0.0, so every rule you already wrote against them still applies: `<lr-alert>`,
|
|
70
828
|
`<lr-toast-item>`, `<lr-lightbox>` and `<lr-tool-result-dialog>` close buttons; `<lr-chip>`,
|