@aceshooting/lyra-ui 5.0.0 → 5.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.
- package/README.md +30 -12
- package/custom-elements.json +2150 -220
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +2 -0
- package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js +2 -0
- package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
- package/dist/components/agent-tools/agent-run/agent-run.class.d.ts +1 -0
- package/dist/components/agent-tools/agent-run/agent-run.class.d.ts.map +1 -1
- package/dist/components/agent-tools/agent-run/agent-run.class.js +1 -0
- package/dist/components/agent-tools/agent-run/agent-run.class.js.map +1 -1
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +2 -0
- package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts.map +1 -1
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js +2 -0
- package/dist/components/agent-tools/compare-panel/compare-panel.class.js.map +1 -1
- package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +5 -0
- package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts.map +1 -1
- package/dist/components/agent-tools/stack-trace/stack-trace.class.js +5 -0
- package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
- package/dist/components/agent-tools/terminal/terminal.class.d.ts +3 -0
- package/dist/components/agent-tools/terminal/terminal.class.d.ts.map +1 -1
- package/dist/components/agent-tools/terminal/terminal.class.js +3 -0
- package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
- package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +2 -0
- package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts.map +1 -1
- package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +2 -0
- package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js.map +1 -1
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +2 -0
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +2 -0
- package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts +3 -0
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +3 -0
- package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js.map +1 -1
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +1 -0
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +1 -0
- package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js.map +1 -1
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +1 -0
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +1 -0
- package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js.map +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +2 -0
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts.map +1 -1
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +2 -0
- package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js.map +1 -1
- package/dist/components/charts/chart/chart.class.d.ts +15 -0
- package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
- package/dist/components/charts/chart/chart.class.js +15 -0
- package/dist/components/charts/chart/chart.class.js.map +1 -1
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +2 -0
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts.map +1 -1
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +2 -0
- package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js.map +1 -1
- package/dist/components/conversation/branch-picker/branch-picker.class.d.ts +2 -0
- package/dist/components/conversation/branch-picker/branch-picker.class.d.ts.map +1 -1
- package/dist/components/conversation/branch-picker/branch-picker.class.js +2 -0
- package/dist/components/conversation/branch-picker/branch-picker.class.js.map +1 -1
- package/dist/components/conversation/chat-message/chat-message.class.d.ts +5 -1
- package/dist/components/conversation/chat-message/chat-message.class.d.ts.map +1 -1
- package/dist/components/conversation/chat-message/chat-message.class.js +5 -1
- package/dist/components/conversation/chat-message/chat-message.class.js.map +1 -1
- package/dist/components/conversation/chat-message/chat-message.styles.d.ts.map +1 -1
- package/dist/components/conversation/chat-message/chat-message.styles.js +15 -2
- package/dist/components/conversation/chat-message/chat-message.styles.js.map +1 -1
- package/dist/components/conversation/code-block/code-block.class.d.ts +4 -0
- package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
- package/dist/components/conversation/code-block/code-block.class.js +4 -0
- package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
- package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +2 -0
- package/dist/components/conversation/conversation-item/conversation-item.class.d.ts.map +1 -1
- package/dist/components/conversation/conversation-item/conversation-item.class.js +2 -0
- package/dist/components/conversation/conversation-item/conversation-item.class.js.map +1 -1
- package/dist/components/conversation/markdown/markdown.class.d.ts +2 -0
- package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
- package/dist/components/conversation/markdown/markdown.class.js +2 -0
- package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
- package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +2 -0
- package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts.map +1 -1
- package/dist/components/conversation/push-to-talk/push-to-talk.class.js +2 -0
- package/dist/components/conversation/push-to-talk/push-to-talk.class.js.map +1 -1
- package/dist/components/conversation/stream-status/stream-status.class.d.ts +5 -0
- package/dist/components/conversation/stream-status/stream-status.class.d.ts.map +1 -1
- package/dist/components/conversation/stream-status/stream-status.class.js +5 -0
- package/dist/components/conversation/stream-status/stream-status.class.js.map +1 -1
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts +2 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.d.ts.map +1 -1
- package/dist/components/conversation/streaming-text/streaming-text.class.js +2 -0
- package/dist/components/conversation/streaming-text/streaming-text.class.js.map +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +1 -0
- package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts.map +1 -1
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -0
- package/dist/components/conversation/transcript-feed/transcript-feed.class.js.map +1 -1
- package/dist/components/data/calendar/calendar.class.d.ts +6 -0
- package/dist/components/data/calendar/calendar.class.d.ts.map +1 -1
- package/dist/components/data/calendar/calendar.class.js +6 -0
- package/dist/components/data/calendar/calendar.class.js.map +1 -1
- package/dist/components/data/context-meter/context-meter.class.d.ts +1 -0
- package/dist/components/data/context-meter/context-meter.class.d.ts.map +1 -1
- package/dist/components/data/context-meter/context-meter.class.js +1 -0
- package/dist/components/data/context-meter/context-meter.class.js.map +1 -1
- package/dist/components/data/data-grid/data-grid.class.d.ts +1 -0
- package/dist/components/data/data-grid/data-grid.class.d.ts.map +1 -1
- package/dist/components/data/data-grid/data-grid.class.js +1 -0
- package/dist/components/data/data-grid/data-grid.class.js.map +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +3 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.d.ts.map +1 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.js +3 -1
- package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
- package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +2 -2
- package/dist/components/data/flow-minimap/flow-minimap.class.js +2 -2
- package/dist/components/data/flow-node/flow-node.class.d.ts +1 -1
- package/dist/components/data/flow-node/flow-node.class.js +1 -1
- package/dist/components/data/heatmap/heatmap.class.d.ts +51 -2
- package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
- package/dist/components/data/heatmap/heatmap.class.js +42 -6
- package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
- package/dist/components/data/heatmap/heatmap.styles.d.ts.map +1 -1
- package/dist/components/data/heatmap/heatmap.styles.js +19 -0
- package/dist/components/data/heatmap/heatmap.styles.js.map +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +20 -0
- package/dist/components/data/sequence-strip/sequence-strip.class.d.ts.map +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.class.js +35 -0
- package/dist/components/data/sequence-strip/sequence-strip.class.js.map +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.styles.d.ts.map +1 -1
- package/dist/components/data/sequence-strip/sequence-strip.styles.js +29 -0
- package/dist/components/data/sequence-strip/sequence-strip.styles.js.map +1 -1
- package/dist/components/data/table/table.class.d.ts +11 -0
- package/dist/components/data/table/table.class.d.ts.map +1 -1
- package/dist/components/data/table/table.class.js +11 -0
- package/dist/components/data/table/table.class.js.map +1 -1
- package/dist/components/data/timeline/timeline-item.class.d.ts +17 -0
- package/dist/components/data/timeline/timeline-item.class.d.ts.map +1 -1
- package/dist/components/data/timeline/timeline-item.class.js +17 -0
- package/dist/components/data/timeline/timeline-item.class.js.map +1 -1
- package/dist/components/data/timeline/timeline.styles.d.ts.map +1 -1
- package/dist/components/data/timeline/timeline.styles.js +6 -3
- package/dist/components/data/timeline/timeline.styles.js.map +1 -1
- package/dist/components/data/tree/tree-node.class.d.ts +3 -0
- package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
- package/dist/components/data/tree/tree-node.class.js +3 -0
- package/dist/components/data/tree/tree-node.class.js.map +1 -1
- package/dist/components/forms/button/button.class.d.ts +24 -0
- package/dist/components/forms/button/button.class.d.ts.map +1 -1
- package/dist/components/forms/button/button.class.js +24 -0
- package/dist/components/forms/button/button.class.js.map +1 -1
- package/dist/components/forms/code-editor/code-editor.class.d.ts +28 -12
- package/dist/components/forms/code-editor/code-editor.class.d.ts.map +1 -1
- package/dist/components/forms/code-editor/code-editor.class.js +44 -14
- package/dist/components/forms/code-editor/code-editor.class.js.map +1 -1
- package/dist/components/forms/code-editor/code-editor.styles.d.ts.map +1 -1
- package/dist/components/forms/code-editor/code-editor.styles.js +4 -0
- package/dist/components/forms/code-editor/code-editor.styles.js.map +1 -1
- package/dist/components/forms/combobox/combobox.class.d.ts +10 -0
- package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
- package/dist/components/forms/combobox/combobox.class.js +16 -0
- package/dist/components/forms/combobox/combobox.class.js.map +1 -1
- package/dist/components/forms/combobox/option.class.d.ts +3 -3
- package/dist/components/forms/combobox/option.class.d.ts.map +1 -1
- package/dist/components/forms/combobox/option.class.js +9 -0
- package/dist/components/forms/combobox/option.class.js.map +1 -1
- package/dist/components/forms/date-picker/date-input.class.d.ts +3 -0
- package/dist/components/forms/date-picker/date-input.class.d.ts.map +1 -1
- package/dist/components/forms/date-picker/date-input.class.js +3 -0
- package/dist/components/forms/date-picker/date-input.class.js.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +37 -2
- package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.class.js +113 -10
- package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
- package/dist/components/forms/emoji-picker/emoji-picker.styles.js +30 -0
- package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
- package/dist/components/forms/icon-button/icon-button.class.d.ts +4 -0
- package/dist/components/forms/icon-button/icon-button.class.d.ts.map +1 -1
- package/dist/components/forms/icon-button/icon-button.class.js +4 -0
- package/dist/components/forms/icon-button/icon-button.class.js.map +1 -1
- package/dist/components/forms/input/input.class.d.ts +11 -3
- package/dist/components/forms/input/input.class.d.ts.map +1 -1
- package/dist/components/forms/input/input.class.js +3 -0
- package/dist/components/forms/input/input.class.js.map +1 -1
- package/dist/components/forms/input/time-input.class.d.ts +12 -0
- package/dist/components/forms/input/time-input.class.d.ts.map +1 -1
- package/dist/components/forms/input/time-input.class.js +27 -0
- package/dist/components/forms/input/time-input.class.js.map +1 -1
- package/dist/components/forms/rubric-form/rubric-form.class.d.ts +7 -0
- package/dist/components/forms/rubric-form/rubric-form.class.d.ts.map +1 -1
- package/dist/components/forms/rubric-form/rubric-form.class.js +7 -0
- package/dist/components/forms/rubric-form/rubric-form.class.js.map +1 -1
- package/dist/components/forms/select/select.class.d.ts +8 -0
- package/dist/components/forms/select/select.class.d.ts.map +1 -1
- package/dist/components/forms/select/select.class.js +8 -0
- package/dist/components/forms/select/select.class.js.map +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +1 -1
- package/dist/components/forms/swatch-picker/swatch-picker.class.js +1 -1
- package/dist/components/forms/switch/switch.class.d.ts +6 -0
- package/dist/components/forms/switch/switch.class.d.ts.map +1 -1
- package/dist/components/forms/switch/switch.class.js +6 -0
- package/dist/components/forms/switch/switch.class.js.map +1 -1
- package/dist/components/forms/token-input/token-input.class.d.ts +2 -0
- package/dist/components/forms/token-input/token-input.class.d.ts.map +1 -1
- package/dist/components/forms/token-input/token-input.class.js +2 -0
- package/dist/components/forms/token-input/token-input.class.js.map +1 -1
- package/dist/components/layout/app-rail/app-rail.class.d.ts +8 -0
- package/dist/components/layout/app-rail/app-rail.class.d.ts.map +1 -1
- package/dist/components/layout/app-rail/app-rail.class.js +8 -0
- package/dist/components/layout/app-rail/app-rail.class.js.map +1 -1
- package/dist/components/layout/button-group/button-group.class.d.ts +1 -1
- package/dist/components/layout/button-group/button-group.class.js +1 -1
- package/dist/components/layout/command-palette/command-palette.class.d.ts +12 -0
- package/dist/components/layout/command-palette/command-palette.class.d.ts.map +1 -1
- package/dist/components/layout/command-palette/command-palette.class.js +12 -0
- package/dist/components/layout/command-palette/command-palette.class.js.map +1 -1
- package/dist/components/layout/control-group/control-group.class.d.ts +1 -1
- package/dist/components/layout/control-group/control-group.class.js +1 -1
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +7 -0
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +7 -0
- package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.d.ts +3 -0
- package/dist/components/layout/dock-panel/dock-panel.class.d.ts.map +1 -1
- package/dist/components/layout/dock-panel/dock-panel.class.js +3 -0
- package/dist/components/layout/dock-panel/dock-panel.class.js.map +1 -1
- package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +2 -0
- package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts.map +1 -1
- package/dist/components/layout/responsive-panel/responsive-panel.class.js +2 -0
- package/dist/components/layout/responsive-panel/responsive-panel.class.js.map +1 -1
- package/dist/components/layout/scroller/scroller.class.d.ts +2 -2
- package/dist/components/layout/scroller/scroller.class.js +2 -2
- package/dist/components/layout/segmented/segmented.class.d.ts +6 -0
- package/dist/components/layout/segmented/segmented.class.d.ts.map +1 -1
- package/dist/components/layout/segmented/segmented.class.js +6 -0
- package/dist/components/layout/segmented/segmented.class.js.map +1 -1
- package/dist/components/layout/split/split.class.d.ts +68 -15
- package/dist/components/layout/split/split.class.d.ts.map +1 -1
- package/dist/components/layout/split/split.class.js +80 -21
- package/dist/components/layout/split/split.class.js.map +1 -1
- package/dist/components/layout/stepper/stepper.class.d.ts +52 -11
- package/dist/components/layout/stepper/stepper.class.d.ts.map +1 -1
- package/dist/components/layout/stepper/stepper.class.js +69 -17
- package/dist/components/layout/stepper/stepper.class.js.map +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts +3 -0
- package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
- package/dist/components/layout/virtual-list/virtual-list.class.js +3 -0
- package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
- package/dist/components/layout/widget/widget.class.d.ts +6 -0
- package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
- package/dist/components/layout/widget/widget.class.js +6 -0
- package/dist/components/layout/widget/widget.class.js.map +1 -1
- package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +13 -0
- package/dist/components/media/attachment-chip/attachment-chip.class.d.ts.map +1 -1
- package/dist/components/media/attachment-chip/attachment-chip.class.js +13 -0
- package/dist/components/media/attachment-chip/attachment-chip.class.js.map +1 -1
- package/dist/components/media/avatar/avatar.class.d.ts +6 -0
- package/dist/components/media/avatar/avatar.class.d.ts.map +1 -1
- package/dist/components/media/avatar/avatar.class.js +6 -0
- package/dist/components/media/avatar/avatar.class.js.map +1 -1
- package/dist/components/media/media-card/media-card.class.d.ts +2 -0
- package/dist/components/media/media-card/media-card.class.d.ts.map +1 -1
- package/dist/components/media/media-card/media-card.class.js +2 -0
- package/dist/components/media/media-card/media-card.class.js.map +1 -1
- package/dist/components/media/playback/playback.class.d.ts +2 -0
- package/dist/components/media/playback/playback.class.d.ts.map +1 -1
- package/dist/components/media/playback/playback.class.js +2 -0
- package/dist/components/media/playback/playback.class.js.map +1 -1
- package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -0
- package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
- package/dist/components/media/zoomable-frame/zoomable-frame.class.js +3 -0
- package/dist/components/media/zoomable-frame/zoomable-frame.class.js.map +1 -1
- package/dist/components/overlays/badge/badge.class.d.ts +6 -0
- package/dist/components/overlays/badge/badge.class.d.ts.map +1 -1
- package/dist/components/overlays/badge/badge.class.js +6 -0
- package/dist/components/overlays/badge/badge.class.js.map +1 -1
- package/dist/components/overlays/callout/callout.class.d.ts +6 -0
- package/dist/components/overlays/callout/callout.class.d.ts.map +1 -1
- package/dist/components/overlays/callout/callout.class.js +6 -0
- package/dist/components/overlays/callout/callout.class.js.map +1 -1
- package/dist/components/overlays/chip/chip.class.d.ts +18 -0
- package/dist/components/overlays/chip/chip.class.d.ts.map +1 -1
- package/dist/components/overlays/chip/chip.class.js +18 -0
- package/dist/components/overlays/chip/chip.class.js.map +1 -1
- package/dist/components/overlays/dialog/dialog.class.d.ts +6 -0
- package/dist/components/overlays/dialog/dialog.class.d.ts.map +1 -1
- package/dist/components/overlays/dialog/dialog.class.js +6 -0
- package/dist/components/overlays/dialog/dialog.class.js.map +1 -1
- package/dist/components/overlays/drawer/drawer.class.d.ts +6 -0
- package/dist/components/overlays/drawer/drawer.class.d.ts.map +1 -1
- package/dist/components/overlays/drawer/drawer.class.js +6 -0
- package/dist/components/overlays/drawer/drawer.class.js.map +1 -1
- package/dist/components/overlays/progress/progress-ring.class.d.ts +1 -0
- package/dist/components/overlays/progress/progress-ring.class.d.ts.map +1 -1
- package/dist/components/overlays/progress/progress-ring.class.js +1 -0
- package/dist/components/overlays/progress/progress-ring.class.js.map +1 -1
- package/dist/components/overlays/skeleton/skeleton.class.d.ts +2 -0
- package/dist/components/overlays/skeleton/skeleton.class.d.ts.map +1 -1
- package/dist/components/overlays/skeleton/skeleton.class.js +2 -0
- package/dist/components/overlays/skeleton/skeleton.class.js.map +1 -1
- package/dist/components/overlays/spinner/spinner.class.d.ts +4 -0
- package/dist/components/overlays/spinner/spinner.class.d.ts.map +1 -1
- package/dist/components/overlays/spinner/spinner.class.js +4 -0
- package/dist/components/overlays/spinner/spinner.class.js.map +1 -1
- package/dist/components/overlays/toast/toast-item.class.d.ts +11 -0
- package/dist/components/overlays/toast/toast-item.class.d.ts.map +1 -1
- package/dist/components/overlays/toast/toast-item.class.js +11 -0
- package/dist/components/overlays/toast/toast-item.class.js.map +1 -1
- package/dist/components/overlays/toast/toast.class.d.ts +15 -0
- package/dist/components/overlays/toast/toast.class.d.ts.map +1 -1
- package/dist/components/overlays/toast/toast.class.js +15 -0
- package/dist/components/overlays/toast/toast.class.js.map +1 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +8 -0
- package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts.map +1 -1
- package/dist/components/retrieval/citation-badge/citation-badge.class.js +8 -0
- package/dist/components/retrieval/citation-badge/citation-badge.class.js.map +1 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +1 -0
- package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts.map +1 -1
- package/dist/components/retrieval/entity-chip/entity-chip.class.js +1 -0
- package/dist/components/retrieval/entity-chip/entity-chip.class.js.map +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +2 -0
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts.map +1 -1
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +2 -0
- package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js.map +1 -1
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts +1 -0
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts.map +1 -1
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -0
- package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js.map +1 -1
- package/dist/components/utility/diff-view/diff-view.class.d.ts +1 -0
- package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
- package/dist/components/utility/diff-view/diff-view.class.js +1 -0
- package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
- package/dist/components/utility/icon/icon.class.d.ts +1 -0
- package/dist/components/utility/icon/icon.class.d.ts.map +1 -1
- package/dist/components/utility/icon/icon.class.js +1 -0
- package/dist/components/utility/icon/icon.class.js.map +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.d.ts +3 -0
- package/dist/components/utility/json-viewer/json-viewer.class.d.ts.map +1 -1
- package/dist/components/utility/json-viewer/json-viewer.class.js +3 -0
- package/dist/components/utility/json-viewer/json-viewer.class.js.map +1 -1
- package/dist/components/utility/known-date/known-date.class.d.ts +11 -0
- package/dist/components/utility/known-date/known-date.class.d.ts.map +1 -1
- package/dist/components/utility/known-date/known-date.class.js +11 -0
- package/dist/components/utility/known-date/known-date.class.js.map +1 -1
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +2 -0
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +2 -0
- package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js.map +1 -1
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +5 -0
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +5 -0
- package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js.map +1 -1
- package/dist/components/viewers/document-compare/document-compare.class.d.ts +1 -1
- package/dist/components/viewers/document-compare/document-compare.class.js +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.d.ts +3 -0
- package/dist/components/viewers/document-preview/document-preview.class.d.ts.map +1 -1
- package/dist/components/viewers/document-preview/document-preview.class.js +3 -0
- package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
- package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +2 -0
- package/dist/components/viewers/email-viewer/email-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/email-viewer/email-viewer.class.js +2 -0
- package/dist/components/viewers/email-viewer/email-viewer.class.js.map +1 -1
- package/dist/components/viewers/html-viewer/html-viewer.class.d.ts +2 -0
- package/dist/components/viewers/html-viewer/html-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/html-viewer/html-viewer.class.js +2 -0
- package/dist/components/viewers/html-viewer/html-viewer.class.js.map +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +41 -9
- package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
- package/dist/internal/css-length.d.ts +40 -0
- package/dist/internal/css-length.d.ts.map +1 -0
- package/dist/internal/css-length.js +72 -0
- package/dist/internal/css-length.js.map +1 -0
- package/dist/internal/orientation-breakpoint.d.ts +12 -0
- package/dist/internal/orientation-breakpoint.d.ts.map +1 -0
- package/dist/internal/orientation-breakpoint.js +127 -0
- package/dist/internal/orientation-breakpoint.js.map +1 -0
- package/dist/lyra.d.ts +2 -2
- package/dist/lyra.d.ts.map +1 -1
- package/dist/lyra.js.map +1 -1
- package/llms/components/lr-accordion-item.md +23 -0
- package/llms/components/lr-accordion.md +23 -0
- package/llms/components/lr-activity-feed.md +45 -0
- package/llms/components/lr-agent-run.md +66 -0
- package/llms/components/lr-agent-trace.md +42 -0
- package/llms/components/lr-agent-workspace.md +109 -0
- package/llms/components/lr-animated-image.md +66 -0
- package/llms/components/lr-animation.md +73 -0
- package/llms/components/lr-app-rail-item.md +218 -0
- package/llms/components/lr-app-rail.md +218 -0
- package/llms/components/lr-archive-viewer.md +36 -0
- package/llms/components/lr-artifact-panel.md +60 -0
- package/llms/components/lr-attachment-chip.md +131 -0
- package/llms/components/lr-attachment-trigger.md +90 -0
- package/llms/components/lr-audio-visualizer.md +43 -0
- package/llms/components/lr-av-player.md +50 -0
- package/llms/components/lr-avatar-group.md +69 -0
- package/llms/components/lr-avatar.md +69 -0
- package/llms/components/lr-badge.md +25 -0
- package/llms/components/lr-bar-chart.md +70 -0
- package/llms/components/lr-box-plot.md +67 -0
- package/llms/components/lr-branch-picker.md +32 -0
- package/llms/components/lr-breadcrumb-item.md +30 -0
- package/llms/components/lr-breadcrumb.md +30 -0
- package/llms/components/lr-browser-frame.md +51 -0
- package/llms/components/lr-bubble-chart.md +70 -0
- package/llms/components/lr-button-group.md +30 -0
- package/llms/components/lr-button.md +89 -0
- package/llms/components/lr-calendar-viewer.md +32 -0
- package/llms/components/lr-calendar.md +52 -0
- package/llms/components/lr-callout.md +37 -0
- package/llms/components/lr-card.md +67 -0
- package/llms/components/lr-carousel-item.md +29 -0
- package/llms/components/lr-carousel.md +43 -0
- package/llms/components/lr-chart.md +148 -0
- package/llms/components/lr-chat-composer.md +139 -0
- package/llms/components/lr-chat-message.md +145 -0
- package/llms/components/lr-chat-viewport.md +70 -0
- package/llms/components/lr-checkbox-group.md +21 -0
- package/llms/components/lr-checkbox.md +79 -0
- package/llms/components/lr-checkpoint.md +48 -0
- package/llms/components/lr-chip-group.md +152 -0
- package/llms/components/lr-chip.md +152 -0
- package/llms/components/lr-chunk-inspector.md +66 -0
- package/llms/components/lr-citation-badge.md +102 -0
- package/llms/components/lr-code-block-core.md +113 -0
- package/llms/components/lr-code-block.md +146 -0
- package/llms/components/lr-code-editor.md +72 -0
- package/llms/components/lr-color-picker.md +21 -0
- package/llms/components/lr-combobox.md +196 -0
- package/llms/components/lr-command-palette.md +50 -0
- package/llms/components/lr-commit-card.md +33 -0
- package/llms/components/lr-community-card.md +54 -0
- package/llms/components/lr-compare-panel.md +38 -0
- package/llms/components/lr-confirm-bar.md +48 -0
- package/llms/components/lr-contact-viewer.md +34 -0
- package/llms/components/lr-context-inspector.md +50 -0
- package/llms/components/lr-context-meter.md +92 -0
- package/llms/components/lr-control-group.md +46 -0
- package/llms/components/lr-conversation-item.md +118 -0
- package/llms/components/lr-copy-button.md +52 -0
- package/llms/components/lr-csv-viewer.md +49 -0
- package/llms/components/lr-dashboard-grid.md +34 -0
- package/llms/components/lr-data-grid.md +47 -0
- package/llms/components/lr-dataset-viewer.md +60 -0
- package/llms/components/lr-date-input.md +201 -0
- package/llms/components/lr-date-picker.md +201 -0
- package/llms/components/lr-details.md +23 -0
- package/llms/components/lr-dialog.md +185 -0
- package/llms/components/lr-diff-view.md +86 -0
- package/llms/components/lr-divider.md +28 -0
- package/llms/components/lr-dock-panel.md +110 -0
- package/llms/components/lr-document-compare.md +22 -0
- package/llms/components/lr-document-library.md +21 -0
- package/llms/components/lr-document-preview.md +179 -0
- package/llms/components/lr-document-viewer.md +84 -0
- package/llms/components/lr-docx-viewer.md +63 -0
- package/llms/components/lr-doughnut-chart.md +70 -0
- package/llms/components/lr-drawer.md +48 -0
- package/llms/components/lr-drilldown-panel.md +25 -0
- package/llms/components/lr-dropdown-item.md +171 -0
- package/llms/components/lr-dropdown.md +24 -0
- package/llms/components/lr-ebook-viewer.md +60 -0
- package/llms/components/lr-email-viewer.md +51 -0
- package/llms/components/lr-emoji-picker.md +71 -0
- package/llms/components/lr-empty.md +56 -0
- package/llms/components/lr-entity-card.md +64 -0
- package/llms/components/lr-entity-chip.md +50 -0
- package/llms/components/lr-entity-dossier.md +71 -0
- package/llms/components/lr-env-list.md +27 -0
- package/llms/components/lr-eval-dataset.md +45 -0
- package/llms/components/lr-eval-result.md +45 -0
- package/llms/components/lr-evaluation-run.md +50 -0
- package/llms/components/lr-export-button.md +104 -0
- package/llms/components/lr-file-icon.md +34 -0
- package/llms/components/lr-file-input.md +104 -0
- package/llms/components/lr-file-tree.md +29 -0
- package/llms/components/lr-filter-bar.md +20 -0
- package/llms/components/lr-flag.md +122 -0
- package/llms/components/lr-flow-canvas.md +112 -0
- package/llms/components/lr-flow-controls.md +47 -0
- package/llms/components/lr-flow-minimap.md +52 -0
- package/llms/components/lr-flow-node.md +56 -0
- package/llms/components/lr-flow-run-overlay.md +56 -0
- package/llms/components/lr-format-bytes.md +31 -0
- package/llms/components/lr-format-date.md +33 -0
- package/llms/components/lr-format-number.md +41 -0
- package/llms/components/lr-gauge.md +65 -0
- package/llms/components/lr-generation-status.md +105 -0
- package/llms/components/lr-geojson-view.md +43 -0
- package/llms/components/lr-graph-legend.md +64 -0
- package/llms/components/lr-graph-query-builder.md +27 -0
- package/llms/components/lr-graph.md +224 -0
- package/llms/components/lr-grounding-summary.md +57 -0
- package/llms/components/lr-handoff-divider.md +27 -0
- package/llms/components/lr-heatmap.md +232 -0
- package/llms/components/lr-highlight-layer.md +31 -0
- package/llms/components/lr-histogram.md +69 -0
- package/llms/components/lr-html-viewer.md +30 -0
- package/llms/components/lr-icon-button.md +39 -0
- package/llms/components/lr-icon.md +36 -0
- package/llms/components/lr-image-comparer.md +38 -0
- package/llms/components/lr-image-viewer.md +35 -0
- package/llms/components/lr-include.md +53 -0
- package/llms/components/lr-ingestion-queue.md +60 -0
- package/llms/components/lr-input.md +82 -0
- package/llms/components/lr-intersection-observer.md +25 -0
- package/llms/components/lr-json-viewer.md +98 -0
- package/llms/components/lr-kbd.md +74 -0
- package/llms/components/lr-knowledge-base.md +64 -0
- package/llms/components/lr-knowledge-graph-explorer.md +92 -0
- package/llms/components/lr-known-date.md +84 -0
- package/llms/components/lr-lightbox.md +79 -0
- package/llms/components/lr-line-chart.md +70 -0
- package/llms/components/lr-lite-chart.md +143 -0
- package/llms/components/lr-live-region.md +105 -0
- package/llms/components/lr-map.md +127 -0
- package/llms/components/lr-markdown-core.md +70 -0
- package/llms/components/lr-markdown.md +171 -0
- package/llms/components/lr-media-card.md +106 -0
- package/llms/components/lr-memory-panel.md +67 -0
- package/llms/components/lr-mention-popover.md +139 -0
- package/llms/components/lr-menu-item.md +171 -0
- package/llms/components/lr-menu.md +171 -0
- package/llms/components/lr-message-actions.md +48 -0
- package/llms/components/lr-message-feedback.md +37 -0
- package/llms/components/lr-mind-map.md +64 -0
- package/llms/components/lr-model-select.md +144 -0
- package/llms/components/lr-model-settings-panel.md +99 -0
- package/llms/components/lr-mutation-observer.md +27 -0
- package/llms/components/lr-neighbor-list.md +56 -0
- package/llms/components/lr-node-palette.md +67 -0
- package/llms/components/lr-notebook-viewer.md +65 -0
- package/llms/components/lr-number-input.md +44 -0
- package/llms/components/lr-option.md +196 -0
- package/llms/components/lr-page-rail.md +37 -0
- package/llms/components/lr-pagination.md +88 -0
- package/llms/components/lr-path-strip.md +55 -0
- package/llms/components/lr-pdf-viewer.md +78 -0
- package/llms/components/lr-phone-input.md +162 -0
- package/llms/components/lr-pie-chart.md +70 -0
- package/llms/components/lr-playback.md +74 -0
- package/llms/components/lr-polar-area-chart.md +70 -0
- package/llms/components/lr-policy-summary.md +33 -0
- package/llms/components/lr-poll-status.md +71 -0
- package/llms/components/lr-popover.md +31 -0
- package/llms/components/lr-pptx-viewer.md +35 -0
- package/llms/components/lr-progress-bar.md +22 -0
- package/llms/components/lr-progress-ring.md +26 -0
- package/llms/components/lr-provenance-panel.md +58 -0
- package/llms/components/lr-push-to-talk.md +50 -0
- package/llms/components/lr-qr-code.md +20 -0
- package/llms/components/lr-query-builder.md +21 -0
- package/llms/components/lr-radar-chart.md +70 -0
- package/llms/components/lr-radio-group.md +25 -0
- package/llms/components/lr-radio.md +31 -0
- package/llms/components/lr-random-content.md +62 -0
- package/llms/components/lr-rating.md +21 -0
- package/llms/components/lr-relative-time.md +31 -0
- package/llms/components/lr-resize-observer.md +25 -0
- package/llms/components/lr-responsive-panel.md +112 -0
- package/llms/components/lr-result-card.md +88 -0
- package/llms/components/lr-result-field.md +88 -0
- package/llms/components/lr-retrieval-results.md +84 -0
- package/llms/components/lr-retrieval-search.md +70 -0
- package/llms/components/lr-retrieval-trace.md +59 -0
- package/llms/components/lr-rubric-form.md +37 -0
- package/llms/components/lr-scatter-chart.md +70 -0
- package/llms/components/lr-scroller.md +47 -0
- package/llms/components/lr-segmented.md +74 -0
- package/llms/components/lr-select.md +113 -0
- package/llms/components/lr-sequence-strip.md +95 -0
- package/llms/components/lr-skeleton.md +53 -0
- package/llms/components/lr-slider.md +92 -0
- package/llms/components/lr-source-card.md +131 -0
- package/llms/components/lr-source-list.md +131 -0
- package/llms/components/lr-source-picker.md +63 -0
- package/llms/components/lr-span-waterfall.md +42 -0
- package/llms/components/lr-sparkline.md +60 -0
- package/llms/components/lr-spinner.md +32 -0
- package/llms/components/lr-split.md +191 -0
- package/llms/components/lr-spreadsheet-viewer.md +47 -0
- package/llms/components/lr-stack-trace.md +77 -0
- package/llms/components/lr-stat.md +89 -0
- package/llms/components/lr-stepper.md +118 -0
- package/llms/components/lr-stream-status.md +128 -0
- package/llms/components/lr-streaming-text.md +101 -0
- package/llms/components/lr-suggestion-chips.md +40 -0
- package/llms/components/lr-svg-viewer.md +47 -0
- package/llms/components/lr-swatch-picker.md +91 -0
- package/llms/components/lr-switch.md +82 -0
- package/llms/components/lr-table.md +201 -0
- package/llms/components/lr-tabs.md +80 -0
- package/llms/components/lr-tag.md +25 -0
- package/llms/components/lr-task-list.md +42 -0
- package/llms/components/lr-terminal.md +44 -0
- package/llms/components/lr-test-results.md +38 -0
- package/llms/components/lr-textarea.md +111 -0
- package/llms/components/lr-thinking-panel.md +93 -0
- package/llms/components/lr-thread-list.md +97 -0
- package/llms/components/lr-time-input.md +53 -0
- package/llms/components/lr-time-range.md +91 -0
- package/llms/components/lr-timeline-item.md +65 -0
- package/llms/components/lr-timeline.md +65 -0
- package/llms/components/lr-toast-item.md +123 -0
- package/llms/components/lr-toast.md +123 -0
- package/llms/components/lr-token-input.md +31 -0
- package/llms/components/lr-tool-approval-dialog.md +131 -0
- package/llms/components/lr-tool-call-chip.md +101 -0
- package/llms/components/lr-tool-param-form.md +148 -0
- package/llms/components/lr-tool-result-dialog.md +106 -0
- package/llms/components/lr-tool-result-view.md +162 -0
- package/llms/components/lr-tool-select-dialog.md +124 -0
- package/llms/components/lr-tool-timeline.md +56 -0
- package/llms/components/lr-tooltip.md +47 -0
- package/llms/components/lr-tour.md +100 -0
- package/llms/components/lr-trace-tree.md +35 -0
- package/llms/components/lr-transcript-feed.md +45 -0
- package/llms/components/lr-tree-node.md +133 -0
- package/llms/components/lr-tree.md +133 -0
- package/llms/components/lr-typing-indicator.md +80 -0
- package/llms/components/lr-usage-badge.md +44 -0
- package/llms/components/lr-virtual-list.md +145 -0
- package/llms/components/lr-voice-picker.md +78 -0
- package/llms/components/lr-widget-renderer.md +78 -0
- package/llms/components/lr-widget.md +104 -0
- package/llms/components/lr-word-cloud.md +112 -0
- package/llms/components/lr-xml-viewer.md +58 -0
- package/llms/components/lr-zoomable-frame.md +57 -0
- package/llms/index.md +301 -0
- package/llms/migration.md +86 -0
- package/llms/peers.md +41 -0
- package/llms/shared.md +321 -0
- package/llms/tokens.md +533 -0
- package/llms-full.txt +10731 -8563
- package/llms.txt +64 -121
- package/package.json +14 -2
- package/vscode-css-data.json +1424 -185
- package/vscode-html-data.json +128 -107
- package/web-types.json +853 -118
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/layout.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-virtual-list`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/layout/virtual-list/virtual-list.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraVirtualList`, also available unregistered from `@aceshooting/lyra-ui/components/layout/virtual-list/virtual-list.class.js`
|
|
7
|
+
- **Family** `components/layout/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-virtual-list`
|
|
14
|
+
|
|
15
|
+
A generic windowed/virtualized list host. Renders only the items within the current viewport (plus
|
|
16
|
+
`overscan` padding rows on each side) as real DOM, regardless of how large `items` is, so a
|
|
17
|
+
multi-thousand-row chat-history sidebar (or a long message thread) stays cheap to scroll. Content is
|
|
18
|
+
entirely caller-supplied: `renderItem(item, index)` returns whatever `lit-html` value should represent
|
|
19
|
+
that row, and `keyFunction(item, index)` gives it a stable identity for DOM reconciliation. First-party
|
|
20
|
+
invention (no Web Awesome equivalent).
|
|
21
|
+
|
|
22
|
+
**Properties:**
|
|
23
|
+
- `items: unknown[] = []` (attribute: false) — the full, non-windowed item collection. JS-only; set via
|
|
24
|
+
a property/lit-html binding (`.items=`), not an HTML attribute.
|
|
25
|
+
- `renderItem: (item: unknown, index: number) => unknown = () => nothing` (attribute: false) — renders
|
|
26
|
+
one row's content, typically returning a `lit-html` `TemplateResult`. JS-only.
|
|
27
|
+
- `keyFunction?: (item: unknown, index: number) => string | number` (attribute: false) — derives a
|
|
28
|
+
row's stable reconciliation key. JS-only. Falls back to the item's index in `items` when omitted,
|
|
29
|
+
which is only a safe identity while `items` never reorders/inserts/removes — provide this whenever
|
|
30
|
+
possible, or scroll position and per-row DOM state (e.g. an `<audio>` element's playback position)
|
|
31
|
+
can attach to the wrong row across a mutation.
|
|
32
|
+
- `groups?: VirtualListGroup[]` (attribute: false) — renders a labeled `role="heading"` marker at each
|
|
33
|
+
group's `startIndex`, positioned independently of the row window (so it stays in place as its rows
|
|
34
|
+
scroll past). Groups are sorted by `startIndex`; a `startIndex` that's non-integer, out of range, or
|
|
35
|
+
a duplicate of an earlier group's is silently dropped rather than rendered wrong.
|
|
36
|
+
- `rowHeight: string = 'auto'` (attribute `row-height`) — `'auto'` measures each row's real height via
|
|
37
|
+
`ResizeObserver`; a numeric string (e.g. `"56"`) fixes every row to that many pixels. Anything else
|
|
38
|
+
(non-numeric, zero, negative, non-finite) silently falls back to `'auto'` rather than throwing.
|
|
39
|
+
- `itemRole: 'listitem' | 'row' = 'listitem'` (attribute `item-role`) — `'listitem'` (default)
|
|
40
|
+
preserves the plain `role="list"`/`role="listitem"` mapping with `aria-setsize`/`aria-posinset`.
|
|
41
|
+
`'row'` additionally maps `[part="base"]` to `role="rowgroup"`, `[part="spacer"]` to
|
|
42
|
+
`role="presentation"`, and each row to `role="row"` with `aria-rowindex` instead — for a consumer
|
|
43
|
+
composing its own `role="table"` wrapper and header row around this component (see
|
|
44
|
+
`lr-dataset-viewer`).
|
|
45
|
+
- `rowIndexOffset: number = 0` (attribute `row-index-offset`) — added to a row's 1-based index to
|
|
46
|
+
compute `aria-rowindex` in `item-role="row"` mode (e.g. `1` when a consumer renders its own header
|
|
47
|
+
row occupying `aria-rowindex="1"` outside this component). No effect in `'listitem'` mode.
|
|
48
|
+
- `overscan: number = 6` — extra rows rendered beyond the visible viewport on each side; finite
|
|
49
|
+
values are floored and clamped to 0–100, while non-finite values use the default 6, so an invalid
|
|
50
|
+
runtime value cannot disable windowing and render the entire collection.
|
|
51
|
+
- `activeId: string = ''` (attribute `active-id`) — when set and it matches a row's `keyFunction`
|
|
52
|
+
result (compared with `Object.is` against the typed value — attribute values arrive as strings, so
|
|
53
|
+
assign the property directly for a numeric key), that row is smoothly scrolled into view whenever
|
|
54
|
+
this changes, and rendered with `aria-current="true"`.
|
|
55
|
+
- `loading: boolean = false` (reflected) — sets `aria-busy` on the scroll container and a `cursor:
|
|
56
|
+
progress` style; does not by itself gate `lr-load-more` (see below).
|
|
57
|
+
- `hasMore: boolean = false` (attribute `has-more`, reflected) — when true, scrolling near the bottom
|
|
58
|
+
fires `lr-load-more` (gated by `loading`).
|
|
59
|
+
|
|
60
|
+
**Exported types:** `VirtualListRange { start: number; end: number }` (the `lr-visible-range-changed`
|
|
61
|
+
detail shape); `VirtualListGroup { key: string | number; label?: string; startIndex: number }` — the
|
|
62
|
+
shape consumed by `groups` above.
|
|
63
|
+
The package root also exports `groupByRecency(items, options?)`, a DOM-free helper that returns
|
|
64
|
+
non-empty Today/Yesterday/Previous 7 Days/Older buckets, preserves input order within each bucket,
|
|
65
|
+
and accepts a timestamp extractor, reference date, and label overrides.
|
|
66
|
+
|
|
67
|
+
**Methods:** `scrollToIndex(index, options?)` — the programmatic counterpart to `active-id`'s
|
|
68
|
+
automatic scroll-into-view, for a host that needs to scroll to a specific row without changing which
|
|
69
|
+
row is "active." `options.align` is `'start'`, `'end'`, or `'auto'` (default — no scroll at all when
|
|
70
|
+
already fully visible); `options.behavior` (default `'smooth'`) is forced to `'auto'` under
|
|
71
|
+
`prefers-reduced-motion: reduce`. `index` is clamped to `0…items.length-1`.
|
|
72
|
+
|
|
73
|
+
**Events:** `lr-load-more` (no detail — fired once per approach to the bottom of the list while
|
|
74
|
+
`has-more` is true and `loading` is false; does not refire on every scroll tick while still near the
|
|
75
|
+
bottom — scrolling back away from the bottom and returning, or `items` growing enough to move the
|
|
76
|
+
window away from the end, re-arms it), `lr-visible-range-changed` (`detail: VirtualListRange`, the
|
|
77
|
+
current visible, non-overscanned item index range — fired only when it actually changes)
|
|
78
|
+
|
|
79
|
+
**Slots:** none — all content comes from `renderItem`.
|
|
80
|
+
|
|
81
|
+
**CSS parts:** `base` (the scrollable container, `role="list"` — or `role="rowgroup"` in
|
|
82
|
+
`item-role="row"` mode — `tabindex="0"`), `spacer` (the full-content-height inner element
|
|
83
|
+
establishing true scroll extent; `role="presentation"` in `item-role="row"` mode), `row` (one
|
|
84
|
+
rendered row's absolutely-positioned wrapper, `role="listitem"` — or `role="row"` with
|
|
85
|
+
`aria-rowindex` in `item-role="row"` mode), `group` (a `groups` entry's positioned `role="heading"`
|
|
86
|
+
marker)
|
|
87
|
+
|
|
88
|
+
**Themeable custom properties:** `--lr-virtual-list-height` (default `24rem` — the host's bounded
|
|
89
|
+
scroll extent; component-specific since a virtualized list is meaningless without a sized viewport),
|
|
90
|
+
plus shared `--lr-focus-ring-width/-color/-offset` (inward-offset ring on `[part="base"]`, negative
|
|
91
|
+
so it isn't clipped by the container's own `overflow: auto`).
|
|
92
|
+
|
|
93
|
+
**Optional peer deps:** none.
|
|
94
|
+
|
|
95
|
+
```html
|
|
96
|
+
<lr-virtual-list
|
|
97
|
+
.items=${sessions}
|
|
98
|
+
.renderItem=${(item, index) => html`
|
|
99
|
+
<lr-conversation-item
|
|
100
|
+
id=${item.id}
|
|
101
|
+
title=${item.title}
|
|
102
|
+
.timestamp=${item.updatedAt}
|
|
103
|
+
?active=${item.id === currentId}
|
|
104
|
+
></lr-conversation-item>
|
|
105
|
+
`}
|
|
106
|
+
.keyFunction=${(item) => item.id}
|
|
107
|
+
active-id=${currentId}
|
|
108
|
+
?has-more=${hasMorePages}
|
|
109
|
+
?loading=${isLoadingMore}
|
|
110
|
+
@lr-load-more=${() => loadNextPage()}
|
|
111
|
+
@lr-visible-range-changed=${(e) => console.log('visible', e.detail.start, e.detail.end)}
|
|
112
|
+
></lr-virtual-list>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Every row — in both `row-height` modes — is positioned by a `transform: translateY(offset)` computed
|
|
116
|
+
from a single cumulative offsets array, rather than by page flow; this is what lets a small DOM window
|
|
117
|
+
exist while the scrollbar still reflects the true total content height. That array is rebuilt only
|
|
118
|
+
when `items`, `row-height`, or `keyFunction` change, or a row's measured height changes — **not** on
|
|
119
|
+
every update, so a pure scroll-position tick (potentially every `rAF` while scrolling) only re-runs the
|
|
120
|
+
cheap range/visibility math, never the `O(n)` offsets rebuild (which, in `row-height="auto"` mode, also
|
|
121
|
+
means a `keyFunction` call per item). In `row-height="auto"` mode, unmeasured rows contribute a fixed
|
|
122
|
+
estimate to that array until their real `ResizeObserver`-reported height lands, so only rows after a
|
|
123
|
+
newly-measured one shift on each measurement rather than the whole list reflowing. The offsets rebuild,
|
|
124
|
+
when it does run, is an `O(n)` loop appropriate for hundreds to a few thousand rows (a scrollable
|
|
125
|
+
history sidebar); it is not the right approach for a hundred-thousand-row list without further work
|
|
126
|
+
(e.g. a Fenwick/segment tree for `O(log n)` offset queries+updates).
|
|
127
|
+
|
|
128
|
+
**Known gotchas:**
|
|
129
|
+
- `items`, `renderItem`, `keyFunction`, and `groups` are all `attribute: false` — they must be set as
|
|
130
|
+
JS properties (`.items=`, `.renderItem=`, …), never as HTML attribute strings.
|
|
131
|
+
- The container is `role="list"` with rows `role="listitem"`, deliberately not `listbox`/`option` —
|
|
132
|
+
this component only provides windowing, not the roving-tabindex/`aria-activedescendant`
|
|
133
|
+
keyboard-interaction contract a real `listbox` requires. `active-id` only scrolls a row into view and
|
|
134
|
+
marks it `aria-current`; it is not a selection widget. Compose your own selection behavior on top if
|
|
135
|
+
needed.
|
|
136
|
+
- `[part="base"]` carries `tabindex="0"` unconditionally, since `renderItem`'s caller-supplied content
|
|
137
|
+
isn't guaranteed to contain a focusable element and an otherwise-unreachable-by-keyboard scroll
|
|
138
|
+
region would result.
|
|
139
|
+
- `aria-setsize`/`aria-posinset` are computed from a row's real index in the full `items` array, not its
|
|
140
|
+
position among the currently-rendered DOM window, so assistive tech still announces e.g. "item 12 of
|
|
141
|
+
340" correctly even though only a handful of rows exist in the DOM at a time.
|
|
142
|
+
- `groups` is accepted today purely for forward API compatibility; setting it has no visible effect
|
|
143
|
+
yet.
|
|
144
|
+
|
|
145
|
+
---
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/conversation.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-voice-picker`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/conversation/voice-picker/voice-picker.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraVoicePicker`, also available unregistered from `@aceshooting/lyra-ui/components/conversation/voice-picker/voice-picker.class.js`
|
|
7
|
+
- **Family** `components/conversation/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-voice-picker`
|
|
14
|
+
|
|
15
|
+
A TTS voice selector over a host-supplied `catalog`, mirroring `lr-model-select`'s
|
|
16
|
+
closed-dropdown/free-text-combobox dual mode, stale-value handling, and form-association verbatim
|
|
17
|
+
(see that section for the full mode-switching contract this one shares), extended with a
|
|
18
|
+
TTS-agnostic preview affordance. Preview is event-first: `lr-preview-request` always fires first
|
|
19
|
+
and is cancelable — left un-prevented, a `previewUrl` plays through one internal native `<audio>`
|
|
20
|
+
(validated by `safeMediaSrc()` first); `preventDefault()` or no URL leaves playback to the host's own
|
|
21
|
+
TTS. Requesting the same voice while it's already playing internally stops it instead of
|
|
22
|
+
re-requesting; requesting a different voice switches. Does not synthesize speech, fetch catalogs, or
|
|
23
|
+
persist selection; not a persona picker; `lr-model-select` stays for LLMs.
|
|
24
|
+
|
|
25
|
+
**Exported types:** `LyraVoiceCatalogEntry { id: string; label: string; language?: string;
|
|
26
|
+
description?: string; previewUrl?: string }` — `language`/`description` render as a quiet
|
|
27
|
+
`[part="option-meta"]` second line. `LyraVoiceCatalog = string[] | LyraVoiceCatalogEntry[]` —
|
|
28
|
+
homogeneous, same union contract as `LyraModelCatalog`.
|
|
29
|
+
|
|
30
|
+
**Properties:** `provider: string = ''` — informational only (e.g. `'elevenlabs'`); rendered as a
|
|
31
|
+
small leading badge. `catalog?: LyraVoiceCatalog` (attribute: false) — the full voice list; omit (or
|
|
32
|
+
leave empty) to fall back to plain free-text entry. `allowCustom: boolean = false` (attribute
|
|
33
|
+
`allow-custom`, reflected) — let the user type/commit a value that isn't in `catalog`. `preview:
|
|
34
|
+
boolean = true` (reflected) — whether to render preview affordances at all. `label: string = ''`,
|
|
35
|
+
`hint: string = ''`, `errorText: string = ''` (attribute `error-text`), `placeholder: string = ''`,
|
|
36
|
+
`spellcheck: boolean = true` (string-aware converter, same as `lr-model-select`), `autocapitalize:
|
|
37
|
+
string = ''`, `autoCorrect: string = ''` (attribute `autocorrect`), `autocomplete: string = 'off'`,
|
|
38
|
+
`inputMode: string = ''` (attribute `inputmode`), `enterKeyHint: string = ''` (attribute
|
|
39
|
+
`enterkeyhint`), and `open: boolean = false` (reflected) — all mirror `lr-model-select`'s
|
|
40
|
+
identically-named properties.
|
|
41
|
+
|
|
42
|
+
**Form association:** hand-rolled via `attachInternals()`, mirroring `lr-model-select`: `value`
|
|
43
|
+
getter/setter (the current voice id, `''` when nothing is selected), `name` (reflected), `disabled`
|
|
44
|
+
(reflected), `required` (reflected — enforced via `internals.setValidity()`).
|
|
45
|
+
|
|
46
|
+
**Events:** `lr-change` — `detail: { value, inCatalog }`. `lr-preview-request` — `detail: {
|
|
47
|
+
voiceId, previewUrl? }`, cancelable. `lr-preview-change` — `detail: { voiceId }`, internal playback
|
|
48
|
+
started (`voiceId`) or stopped (`null`). Plus mirrored native `input`/`change` and re-dispatched
|
|
49
|
+
`focus`/`blur` (picker-family contract, same as `lr-model-select`).
|
|
50
|
+
|
|
51
|
+
**Slots:** `hint`, `error`.
|
|
52
|
+
|
|
53
|
+
**CSS parts:** `form-control-label`, `trigger` (closed-dropdown mode), `combobox`/`combobox-input`
|
|
54
|
+
(free-text mode), `provider-badge`, `listbox`, `option`, `option-label`, `option-meta` (the quiet
|
|
55
|
+
`language · description` second line), `option-badge` (the "not in catalog" badge on a synthetic
|
|
56
|
+
stale-value row), `option-preview` (a pointer-only per-row preview icon, `tabindex="-1"`,
|
|
57
|
+
`aria-hidden`), `preview-button` (the standalone, keyboard-reachable preview toggle beside the
|
|
58
|
+
trigger), `expand-icon`, `empty`, `hint`, `error`.
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<lr-voice-picker provider="elevenlabs" .catalog=${voices} allow-custom
|
|
62
|
+
@lr-change=${(e) => setVoice(e.detail.value)}
|
|
63
|
+
@lr-preview-request=${(e) => {
|
|
64
|
+
if (!e.detail.previewUrl) {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
playSample(e.detail.voiceId);
|
|
67
|
+
}
|
|
68
|
+
}}
|
|
69
|
+
></lr-voice-picker>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Known gotchas:**
|
|
73
|
+
- Listbox options must not contain tab-focusable controls, so preview is accessible via the
|
|
74
|
+
standalone `[part="preview-button"]` beside the trigger (previews the active option while open,
|
|
75
|
+
else the committed value) — the per-row `[part="option-preview"]` icon is a pointer-only
|
|
76
|
+
duplicate (`tabindex="-1"`, `aria-hidden="true"`).
|
|
77
|
+
- `catalog` must be homogeneous — the same constraint `lr-model-select`'s `LyraModelCatalog` union
|
|
78
|
+
documents.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/conversation.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-widget-renderer`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/conversation/widget-renderer/widget-renderer.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraWidgetRenderer`, also available unregistered from `@aceshooting/lyra-ui/components/conversation/widget-renderer/widget-renderer.class.js`
|
|
7
|
+
- **Family** `components/conversation/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-widget-renderer`
|
|
14
|
+
|
|
15
|
+
Renders an agent-streamed declarative JSON widget tree through an allowlisted `type -> lyra tag`
|
|
16
|
+
registry: safe generative UI with exactly one action event out. A mapped node's real element is
|
|
17
|
+
created via `document.createElement()` with every prop assigned as a plain JS property (never
|
|
18
|
+
`setAttribute`, never `innerHTML`), and reused by key across a re-resolve so a mapped widget's own
|
|
19
|
+
internal state (an open `<details>`, focus, scroll position) survives a streamed `tree` update.
|
|
20
|
+
Built-in `row`/`col`/`text` structural nodes render through ordinary nested templates instead. Not a
|
|
21
|
+
form runtime (no input/select/form types in the default registry), no expression language or
|
|
22
|
+
data-binding, no remote widget/schema fetching, and it never renders arbitrary HTML or navigates (no
|
|
23
|
+
`href` props are allowlisted anywhere).
|
|
24
|
+
|
|
25
|
+
**Exported types:** `WidgetNode { type: string; id?: string; props?: Record<string, unknown>;
|
|
26
|
+
children?: (WidgetNode | string)[]; slot?: string; actionId?: string; payload?: unknown }` — `id` is
|
|
27
|
+
a stable reconciliation key (falling back to a structural path), `slot` is honored only when the
|
|
28
|
+
parent type allowlists it, `actionId` arms the type's declared action trigger, and `payload` is
|
|
29
|
+
echoed back in `lr-widget-action`.
|
|
30
|
+
|
|
31
|
+
**Properties:** `tree: WidgetNode | null = null` (property only) — the declarative widget tree to
|
|
32
|
+
render; `null` renders an empty base. `registry?: WidgetTypeRegistry` (attribute: false) — a
|
|
33
|
+
per-instance override of the module-level default registry.
|
|
34
|
+
|
|
35
|
+
**Registry module (`widget-renderer/registry.js`):** `registerWidgetType(type, def)` registers (or
|
|
36
|
+
overwrites) a type in the default registry; `def: WidgetTypeDefinition { tag?: string; props?:
|
|
37
|
+
Record<string, 'string' | 'number' | 'boolean'>; forcedProps?: Record<string, unknown>; slots?:
|
|
38
|
+
string[]; action?: { event: string } }` — `tag` is resolved prefix-aware, `props` is a prop allowlist
|
|
39
|
+
(a prop absent here, or whose runtime type doesn't match, is silently skipped — never assigned),
|
|
40
|
+
`forcedProps` always apply and are never overridable by `WidgetNode.props`, `slots` allowlists child
|
|
41
|
+
`slot` names (a disallowed one renders unslotted rather than being dropped), and `action.event` is
|
|
42
|
+
the native/custom DOM event that arms `lr-widget-action` when a node also sets `actionId`.
|
|
43
|
+
`getDefaultWidgetTypeRegistry()` returns the module-level registry `registerWidgetType()` writes to.
|
|
44
|
+
|
|
45
|
+
**Default registry** (populated by the side-effect entry's `registerDefaultWidgetTypes()`): `text`
|
|
46
|
+
(plain text node), `row`/`col` (internal flex wrappers; props `gap: 's'|'m'|'l'`, `align:
|
|
47
|
+
'start'|'center'|'end'|'stretch'`, `justify: 'start'|'center'|'end'|'between'`), `card` →
|
|
48
|
+
`lr-card` (`appearance`), `badge` → `lr-badge` (`variant`), `button` → `lr-button` (`variant`,
|
|
49
|
+
`appearance`, `size`, `disabled`, `loading`; action: `click`), `stat` → `lr-stat` (`label`,
|
|
50
|
+
`value`, `unit`, `variant`, `caption`, `sub`), `result-card` → `lr-result-card` (`title`),
|
|
51
|
+
`result-field` → `lr-result-field` (`label`, `value`), `markdown` → `lr-markdown` (`content`;
|
|
52
|
+
forced `{ sanitize: true }`), `image` → `lr-media-card` (`src`, `alt`, `filename`; forced `{ kind:
|
|
53
|
+
'image' }`).
|
|
54
|
+
|
|
55
|
+
**Events:** `lr-widget-action` — `detail: { actionId, payload }`, the single bubbling action
|
|
56
|
+
channel. `lr-render-error` — `detail: { error }`, the root value was structurally unusable
|
|
57
|
+
(non-object, or the depth/size caps made it empty).
|
|
58
|
+
|
|
59
|
+
**CSS parts:** `base` (the root wrapper, `display: contents`), `row`, `col`, `text` (built-in
|
|
60
|
+
structural nodes only — a mapped lyra component exposes its own parts instead).
|
|
61
|
+
|
|
62
|
+
Caps: depth 32, 5,000 nodes — excess is skipped with a deduped `console.warn` per type/prop per
|
|
63
|
+
instance. Reconciliation is keyed by `id ?? structural path`, so a streamed re-send patches in
|
|
64
|
+
place and user state (an open `<details>`, focus, scroll) survives.
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
registerWidgetType('sparkline', { tag: tag('sparkline'), props: { data: 'string' } });
|
|
68
|
+
```
|
|
69
|
+
```html
|
|
70
|
+
<lr-widget-renderer .tree=${msg.widget}
|
|
71
|
+
@lr-widget-action=${(e) => sendToAgent(e.detail.actionId, e.detail.payload)}
|
|
72
|
+
></lr-widget-renderer>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Optional peer deps:** none new — the default-registry entry directly imports the eight mapped
|
|
76
|
+
components (`markdown` keeps its own `marked`/`dompurify` optional-peer fallback). A host wanting a
|
|
77
|
+
leaner dependency graph registers a custom registry (via the `registry` property) and imports only
|
|
78
|
+
the components it maps.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/layout.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-widget`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/layout/widget/widget.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraWidget`, also available unregistered from `@aceshooting/lyra-ui/components/layout/widget/widget.class.js`
|
|
7
|
+
- **Family** `components/layout/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-widget`
|
|
14
|
+
|
|
15
|
+
A titled panel shell with an optional collapse toggle and an optional fullscreen-expand toggle.
|
|
16
|
+
First-party invention (no Web Awesome equivalent). Fullscreen promotes the same host element in
|
|
17
|
+
place (a CSS state, not a clone/portal), so slotted content (a chart, a running simulation, scroll
|
|
18
|
+
position) survives the transition.
|
|
19
|
+
|
|
20
|
+
**Properties:**
|
|
21
|
+
- `label: string = ''`
|
|
22
|
+
- `sublabel: string = ''`
|
|
23
|
+
- `collapsible: boolean = false` (reflected — shows the collapse/expand chevron button)
|
|
24
|
+
- `collapsed: boolean = false` (reflected)
|
|
25
|
+
- `expandable: boolean = false` (reflected — shows the fullscreen toggle button)
|
|
26
|
+
- `fullscreen: boolean = false` (reflected)
|
|
27
|
+
- `fullscreenInset: string = ''` (attribute `fullscreen-inset`) — raw CSS `inset` shorthand applied to
|
|
28
|
+
`[part="base"]` and `[part="backdrop"]` while fullscreen instead of the default per-side
|
|
29
|
+
`max(var(--lr-space-l), <safe-area inset>)`, e.g. `"0 0 0 240px"` to leave a 240px persistent
|
|
30
|
+
sidebar/toolbar visible during fullscreen
|
|
31
|
+
- `compact: boolean = false` (reflected) — tighter header/body padding, same convention as
|
|
32
|
+
`lr-empty`'s `compact`
|
|
33
|
+
- `backdropInset: string = ''` (attribute `backdrop-inset`) — overrides the fullscreen backdrop's
|
|
34
|
+
CSS `inset` independently from `fullscreenInset`; when empty, it follows `fullscreenInset`
|
|
35
|
+
- `views: WidgetView[] = []` (attribute: false) — named alternate views for the panel body, e.g. a
|
|
36
|
+
chart/table toggle inside the same card chrome; `WidgetView { id: string; label: string; icon?:
|
|
37
|
+
TemplateResult }`. Each entry gets a header toggle button (`[part='view-toggle']`) and a
|
|
38
|
+
`<slot name="view-${id}">`. Empty (the default) renders today's single unnamed default slot as the
|
|
39
|
+
sole view, unchanged.
|
|
40
|
+
- `activeView: string = ''` (attribute: false) — the currently active view's `id`; defaults to the
|
|
41
|
+
first entry of `views` (or `''` when `views` is empty). Settable directly to control the active
|
|
42
|
+
view externally; also updated internally when a view toggle is clicked.
|
|
43
|
+
- `accessibleLabel: string = ''` (attribute `aria-label`) — overrides the label-derived fullscreen
|
|
44
|
+
dialog name.
|
|
45
|
+
|
|
46
|
+
**Events:** `lr-collapse-change` (`detail: { collapsed }`, the new state), `lr-fullscreen-change`
|
|
47
|
+
(`detail: { fullscreen }` — also fired when fullscreen is exited via Escape or a backdrop click, not
|
|
48
|
+
just the toggle button), `lr-view-change` (`detail: { viewId }`, the new active view's `id` — fired
|
|
49
|
+
when it changes via a header view-toggle click, not when a consumer sets `activeView` directly)
|
|
50
|
+
|
|
51
|
+
**Slots:** default (the panel body, rendered only while `views` is empty), `icon` (optional leading
|
|
52
|
+
icon in the title row), `label` (rich label content, overrides the `label` attribute), `sublabel`
|
|
53
|
+
(rich sublabel content, overrides the `sublabel` attribute), `actions` (header action controls,
|
|
54
|
+
rendered before the collapse/expand buttons), `collapse-icon` (replaces the built-in chevron in the
|
|
55
|
+
collapse toggle via native slot fallback; only meaningful while `collapsible`), `fullscreen-icon`
|
|
56
|
+
(replaces the built-in glyph in the fullscreen toggle — the override replaces *both* the "expand"
|
|
57
|
+
and "exit fullscreen" defaults, so the consumer owns that distinction, e.g. by reading the
|
|
58
|
+
`fullscreen` attribute; only meaningful while `expandable`), and one `view-{id}` slot per `views`
|
|
59
|
+
entry, used instead of the default slot
|
|
60
|
+
|
|
61
|
+
**CSS parts:** `base`, `header`, `title`, `icon` (wrapper around the `icon` slot, hidden entirely when
|
|
62
|
+
empty), `label-group` (wrapper around the label and sublabel), `label`, `sublabel`, `actions`,
|
|
63
|
+
`view-toggles` (the header toggle-button group, only rendered when `views` is non-empty),
|
|
64
|
+
`view-toggle` (a single view toggle button), `collapse-button`, `fullscreen-button`, `body`,
|
|
65
|
+
`backdrop`
|
|
66
|
+
|
|
67
|
+
**Themeable custom properties:** `--lr-widget-overlay-color` (default `var(--lr-color-overlay)` —
|
|
68
|
+
the fullscreen backdrop scrim color), `--lr-widget-fullscreen-inset` (default per side
|
|
69
|
+
`max(var(--lr-space-l), <safe-area inset>)` — the fullscreen `[part="base"]` inset; the
|
|
70
|
+
`fullscreen-inset` attribute overrides it), and `--lr-widget-backdrop-inset` (defaults to
|
|
71
|
+
`var(--lr-widget-fullscreen-inset)`; the `backdrop-inset` attribute overrides it), plus shared
|
|
72
|
+
tokens (`--lr-space-*`, `--lr-color-border/-surface/-text-quiet`,
|
|
73
|
+
`--lr-radius`, `--lr-shadow`, `--lr-icon-button-size`, `--lr-focus-ring-*`).
|
|
74
|
+
|
|
75
|
+
**Optional peer deps:** none.
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<lr-widget label="Load profile" sublabel="Last 7 days" collapsible expandable>
|
|
79
|
+
<span slot="actions"><button>Refresh</button></span>
|
|
80
|
+
<div>Panel body content — a chart, a table, anything.</div>
|
|
81
|
+
</lr-widget>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
While `fullscreen`, `[part="base"]` (not the host itself) takes `role="dialog"` + `aria-modal="true"`
|
|
85
|
+
(with `aria-label` from `label`, falling back to `"Fullscreen panel"`), document scroll is locked
|
|
86
|
+
(ref-counted, safe with multiple simultaneously-fullscreen widgets), and Tab/Shift+Tab are bounded
|
|
87
|
+
to the panel's own focusable content (`actions` slot → collapse/fullscreen buttons → body slot,
|
|
88
|
+
matching visual tab order — resolved shadow-piercingly, so a slotted custom element's real
|
|
89
|
+
focusable target inside its own shadow root is found too) so keyboard focus can't escape to page
|
|
90
|
+
content hidden behind the backdrop. Escape or clicking the backdrop exits fullscreen and returns
|
|
91
|
+
focus to whichever button triggered it. Set `fullscreen-inset` (e.g. `"0 0 0 240px"`) to reserve
|
|
92
|
+
space for a persistent sidebar/toolbar that should stay visible instead of being covered by the
|
|
93
|
+
fullscreen panel/backdrop — it overrides the default `var(--lr-space-l)` inset on every side for
|
|
94
|
+
both `[part="base"]` and `[part="backdrop"]`. Set `compact` for tighter header/body padding.
|
|
95
|
+
|
|
96
|
+
**Known gotchas:**
|
|
97
|
+
- a reconnect that preserves the same element instance (e.g. a drag-and-drop reparent) resumes its
|
|
98
|
+
shared overlay registration and re-acquires the scroll lock if `fullscreen` was still `true`
|
|
99
|
+
across the move — `disconnectedCallback`/`connectedCallback` fire back-to-back with no update in
|
|
100
|
+
between, so `willUpdate()` alone wouldn't otherwise notice.
|
|
101
|
+
- `collapsed` hides the body via `hidden` rather than an animated height transition — collapsing is
|
|
102
|
+
instant, not a slide.
|
|
103
|
+
|
|
104
|
+
---
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/data.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-word-cloud`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/data/word-cloud/word-cloud.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraWordCloud`, also available unregistered from `@aceshooting/lyra-ui/components/data/word-cloud/word-cloud.class.js`
|
|
7
|
+
- **Family** `components/data/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-word-cloud`
|
|
14
|
+
|
|
15
|
+
Dependency-free SVG word/tag cloud. First-party invention (no Web Awesome equivalent). Lays words
|
|
16
|
+
out via an outward Archimedean-spiral search — heaviest word placed first, each word spiraling from
|
|
17
|
+
the center until it clears every word already placed. Unlike sibling `lr-sparkline`/`lr-heatmap`
|
|
18
|
+
(one `role="img"` glyph standing in for an aggregate value), the individual words here *are* the
|
|
19
|
+
meaningful interactive content — but with up to `MAX_WORDS` (150) of them, making every single one
|
|
20
|
+
its own tab stop would be a poor keyboard experience. Instead, like `lr-heatmap`'s cells, the whole
|
|
21
|
+
`[part="svg"]` is **one tab stop with roving arrow-key focus**: `ArrowRight`/`ArrowDown` move the
|
|
22
|
+
focus cursor to the next word in **declaration order** (not weight/placement order),
|
|
23
|
+
`ArrowLeft`/`ArrowUp` to the previous, `Home`/`End` to the first/last, and `Enter`/`Space` fires
|
|
24
|
+
`lr-word-click` for the currently-focused word. A `[part="focus-ring"]` `<rect>` is drawn around
|
|
25
|
+
the focused word (absent until a word has actually been focused via keyboard or click), and a
|
|
26
|
+
visually-hidden `[part="live-region"]` (`role="status" aria-live="polite"`) announces
|
|
27
|
+
`"${text}, ${weight}"` on every focus move.
|
|
28
|
+
|
|
29
|
+
**Properties:**
|
|
30
|
+
- `words: WordCloudWord[] = []` (attribute: false) — `{ text: string, weight: number, color?:
|
|
31
|
+
string, group?: string }`; `weight` drives font size (a negative/non-finite `weight` is clamped to
|
|
32
|
+
`0` for sizing purposes only — the original value is still echoed verbatim in `lr-word-click`'s
|
|
33
|
+
`detail`), `color` overrides the palette for that word, `group` shares one palette color across
|
|
34
|
+
every word with the same `group` value
|
|
35
|
+
- `minFontSize: number = 12` (attribute `min-font-size`) — px, applied to the lowest-weight word;
|
|
36
|
+
layout clamps positive finite values to at most 512px and uses 1px for invalid/non-positive values
|
|
37
|
+
- `maxFontSize: number = 48` (attribute `max-font-size`) — px, applied to the highest-weight word;
|
|
38
|
+
normalized by the same 1–512px layout bound (reversed min/max bounds are swapped)
|
|
39
|
+
- `scale: 'linear'|'sqrt' = 'linear'` — `sqrt` compresses the weight→font-size mapping so one heavy
|
|
40
|
+
word doesn't dwarf the rest, matching `lr-heatmap`'s `scale` property
|
|
41
|
+
- `orientations: 'horizontal'|'mixed' = 'horizontal'` — `mixed` lets ~25% of words render rotated
|
|
42
|
+
90° for denser packing
|
|
43
|
+
- `palette?: string[]` (attribute: false) — custom categorical colors, cycled by word index (or by
|
|
44
|
+
`group`); defaults to the `--lr-word-cloud-color-1..8` tokens
|
|
45
|
+
|
|
46
|
+
**Methods:** `refreshTheme(): void` — forces a relayout so the `--lr-font` custom property is
|
|
47
|
+
re-read from computed style (font-family affects the canvas text measurement layout depends on);
|
|
48
|
+
call this from your own theme-toggle handler, since there's no global theme-change event to
|
|
49
|
+
subscribe to automatically (mirrors `lr-chart`'s `refreshTheme()`).
|
|
50
|
+
|
|
51
|
+
**Events:** `lr-word-click` (`detail: { text, weight, group }`, fires on click, or Enter/Space on
|
|
52
|
+
the currently-focused word — a no-op if nothing is focused yet)
|
|
53
|
+
|
|
54
|
+
**Slots:** none.
|
|
55
|
+
|
|
56
|
+
**CSS parts:** `base`, `svg`, `word` (each `<text>`), `focus-ring` (the rect around the roving-focus
|
|
57
|
+
cursor's word), `live-region` (visually-hidden `role="status" aria-live="polite"` announcement text),
|
|
58
|
+
`empty` (the no-data placeholder — hardcoded `"No data"` text, no property to customize it, unlike
|
|
59
|
+
`lr-empty`/`lr-table`)
|
|
60
|
+
|
|
61
|
+
**Themeable custom properties:** `--lr-word-cloud-color-1`, `--lr-word-cloud-color-2`,
|
|
62
|
+
`--lr-word-cloud-color-3`, `--lr-word-cloud-color-4`, `--lr-word-cloud-color-5`,
|
|
63
|
+
`--lr-word-cloud-color-6`, `--lr-word-cloud-color-7`, `--lr-word-cloud-color-8` (the default
|
|
64
|
+
categorical palette, cycled by word index or `group`; a data-driven literal exception like
|
|
65
|
+
`lr-heatmap`'s scale-ramp endpoints — exposed as retheme-able custom properties instead of
|
|
66
|
+
hardcoded), plus shared tokens (`--lr-font`,
|
|
67
|
+
`--lr-focus-ring-*`, `--lr-transition-fast`, `--lr-color-text-quiet`).
|
|
68
|
+
|
|
69
|
+
**Optional peer deps:** none.
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<lr-word-cloud id="cloud" style="height: 20rem"></lr-word-cloud>
|
|
73
|
+
<script type="module">
|
|
74
|
+
document.getElementById('cloud').words = [
|
|
75
|
+
{ text: 'JavaScript', weight: 90 },
|
|
76
|
+
{ text: 'TypeScript', weight: 75 },
|
|
77
|
+
{ text: 'Lit', weight: 60, group: 'framework' },
|
|
78
|
+
];
|
|
79
|
+
document.getElementById('cloud').addEventListener('lr-word-click', (e) => console.log(e.detail));
|
|
80
|
+
</script>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The host itself gets `role="group"` and an auto-computed `aria-label` (e.g. `"Word cloud of 12
|
|
84
|
+
words"` / `"Word cloud of 1 word"`, counting only words actually rendered — post `MAX_WORDS`-cap and
|
|
85
|
+
post-drop, not the raw `words.length`) **unless** the host already carried its own `role`/`aria-label`
|
|
86
|
+
attribute at first render. That opt-out check runs exactly once (the very first update) and is never
|
|
87
|
+
re-checked afterwards, so setting `role`/`aria-label` yourself *after* the component has already
|
|
88
|
+
rendered at least once only sticks until the next `words`-driven relayout, which overwrites it back
|
|
89
|
+
to the auto default — set it in the initial markup (or before first paint) to opt out permanently.
|
|
90
|
+
|
|
91
|
+
**Known gotchas:**
|
|
92
|
+
- capped at 150 words (`MAX_WORDS` in `word-cloud-layout.ts`, mirroring `lr-sparkline`'s
|
|
93
|
+
`MAX_BARS` DOM-node-count guard) — over the cap, the **heaviest** 150 survive and the rest are
|
|
94
|
+
dropped, regardless of where they fell in the input array (it is not simply "first 150 in, rest
|
|
95
|
+
dropped"). A pathological input (e.g. one huge word repeated many times) can also exhaust the
|
|
96
|
+
spiral search's radius bound and get dropped the same way; blank/whitespace-only `text` is dropped
|
|
97
|
+
too. Every drop reason logs one deduplicated `console.warn` per distinct skipped-count (not one
|
|
98
|
+
warning per word, and not repeated twice for the same count) — nothing throws.
|
|
99
|
+
- each word's spiral search tests at most 4,096 candidate positions. Together with the 150-word and
|
|
100
|
+
512px font-size caps, this bounds placement work even for dense or adversarial layouts; a word
|
|
101
|
+
that exhausts the search budget is reported through the same skipped-word path.
|
|
102
|
+
- text width is measured via a detached `<canvas>` 2D context (`ctx.measureText`) at a hardcoded
|
|
103
|
+
`font-weight: 600` matching `[part='word']`'s own default CSS — close enough for
|
|
104
|
+
collision-avoidance spacing, but not pixel-exact, and overriding `[part='word']`'s `font-weight` via
|
|
105
|
+
`::part()` desyncs measurement from what's actually painted (looser/denser packing, not a crash).
|
|
106
|
+
- rotation (`orientations="mixed"`) is genuinely random per layout (`Math.random()`, not seeded), so
|
|
107
|
+
which words render rotated changes on every re-layout (any `words`/`minFontSize`/`maxFontSize`/
|
|
108
|
+
`scale`/`orientations` change) — don't rely on rotation being stable across renders.
|
|
109
|
+
- only one word is ever in the page's tab sequence at a time (the roving cursor on `[part="svg"]`) —
|
|
110
|
+
there's no way to Tab directly to the Nth word; arrow-key/Home/End your way there, or click it.
|
|
111
|
+
|
|
112
|
+
---
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/viewers.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-xml-viewer`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/viewers/xml-viewer/xml-viewer.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraXmlViewer`, also available unregistered from `@aceshooting/lyra-ui/components/viewers/xml-viewer/xml-viewer.class.js`
|
|
7
|
+
- **Family** `components/viewers/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-xml-viewer`
|
|
14
|
+
|
|
15
|
+
Collapsible, copyable, `DOMParser`-based tree view for XML documents, mirroring `lr-json-viewer`'s
|
|
16
|
+
UX (`collapsed-depth`, `copyable`, structural-path-keyed expand state that survives a same-shape
|
|
17
|
+
`xml` reassignment) adapted for XML's own node kinds: elements with attributes, text, comments, CDATA
|
|
18
|
+
sections, and processing instructions. Namespace-literal: qualified names render exactly as authored,
|
|
19
|
+
with no namespace-URI-aware matching. `DOMParser` never resolves external entities or DTDs, so XXE
|
|
20
|
+
injection is structurally out of reach. Not `lr-json-viewer` (JS values); not `lr-html-viewer`
|
|
21
|
+
(sanitized *rendered* HTML). No XPath/XSLT evaluation, no editing, no schema validation.
|
|
22
|
+
|
|
23
|
+
**Properties:** `src: string = ''` — URL to fetch and parse; ignored once `xml` is set. `xml?:
|
|
24
|
+
string` (property only) — raw XML text to parse and render; wins over `src`, and setting it parses
|
|
25
|
+
synchronously. `name: string = ''` — accessible label. `collapsedDepth?: number` (attribute
|
|
26
|
+
`collapsed-depth`) — elements at or beyond this nesting depth (root = 0) start collapsed. `copyable:
|
|
27
|
+
boolean = false` (reflected) — shows copy-to-clipboard affordances, one for the whole document plus
|
|
28
|
+
one per element. `maxHeight: string = ''` (attribute `max-height`). `anchorKinds` is a readonly
|
|
29
|
+
`['node-path']` (this viewer's supported `LyraAnchor.kind` values for the shared anchor-target
|
|
30
|
+
contract) — each numeric path segment is the 0-based index within the parent's *element* children,
|
|
31
|
+
and an optional trailing string segment `'@attrName'` addresses one attribute.
|
|
32
|
+
|
|
33
|
+
**Methods:** `search(query)` resolves the match count via a case-insensitive substring search over
|
|
34
|
+
every element's tag name, attribute names/values, and own text (empty/whitespace query behaves like
|
|
35
|
+
`clearSearch()`); `searchNext()`/`searchPrevious()` advance/step back through matches (wrapping);
|
|
36
|
+
`clearSearch()` clears the query and matches.
|
|
37
|
+
|
|
38
|
+
**Events:** `lr-copy` — `detail: { text }`. `lr-search-change` — `detail: { query, matchCount,
|
|
39
|
+
activeIndex }`. `lr-render-error` — `detail: { error }`, fetching or parsing failed, including a
|
|
40
|
+
parse error or exceeding the node cap.
|
|
41
|
+
|
|
42
|
+
**CSS parts:** `base`, `toolbar` (the whole-document copy button row, only when `copyable`),
|
|
43
|
+
`copy-button` (the whole-document one, or a per-node one), `tree`, `node` (`data-active` while it's
|
|
44
|
+
the resolved anchor target, `data-match`, `data-active-match`), `tag` (`data-match`), `attribute`,
|
|
45
|
+
`attribute-name`, `attribute-value` (`data-match`), `text` (`data-match`), `comment`, `cdata`, `pi`,
|
|
46
|
+
`toggle` (an element's expand/collapse button, hidden but present for row alignment on leaf/empty
|
|
47
|
+
elements), `error`, `spinner`.
|
|
48
|
+
|
|
49
|
+
**Themeable custom properties:** `--lr-xml-viewer-max-height` (default `none`).
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<lr-xml-viewer .xml=${payload} collapsed-depth="2" copyable
|
|
53
|
+
search=${query}
|
|
54
|
+
></lr-xml-viewer>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Node cap: 50,000 — exceeding it renders the localized `xmlViewerTooManyNodes` error instead of the
|
|
58
|
+
tree.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<!-- GENERATED by scripts/build-llms.mjs from llms/media.md — do not edit this file. -->
|
|
2
|
+
|
|
3
|
+
# `lr-zoomable-frame`
|
|
4
|
+
|
|
5
|
+
- **Import** `import '@aceshooting/lyra-ui/components/media/zoomable-frame/zoomable-frame.js';` (registers the tag; side-effect import)
|
|
6
|
+
- **Class** `LyraZoomableFrame`, also available unregistered from `@aceshooting/lyra-ui/components/media/zoomable-frame/zoomable-frame.class.js`
|
|
7
|
+
- **Family** `components/media/` — see `llms/index.md` for its siblings
|
|
8
|
+
- **Optional peers** none
|
|
9
|
+
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## `lr-zoomable-frame`
|
|
14
|
+
|
|
15
|
+
Scrollable inspection frame with bounded zoom controls and keyboard shortcuts. Scrolling provides
|
|
16
|
+
panning when zoomed content exceeds the viewport.
|
|
17
|
+
|
|
18
|
+
**Properties:**
|
|
19
|
+
- `zoom: number = 1` (attribute `zoom`, reflected), `minZoom: number = 0.5`, `maxZoom: number = 4`,
|
|
20
|
+
and `zoomStep: number = 0.25` — bounded zoom configuration
|
|
21
|
+
- `src: string = ''` and `alt: string = ''` — optional image source; otherwise the default slot is
|
|
22
|
+
rendered
|
|
23
|
+
- `accessibleLabel: string | null` (attribute `aria-label`) — host-level accessible name
|
|
24
|
+
|
|
25
|
+
**Methods:** `zoomIn()`, `zoomOut()`, and `resetZoom()` update the zoom and emit
|
|
26
|
+
`lr-zoom-change` (`detail: { zoom }`). `resetView()` calls `resetZoom()` **and** scrolls the
|
|
27
|
+
viewport back to the origin — `resetZoom()` deliberately preserves the current pan/scroll offset
|
|
28
|
+
(it backs the built-in reset button and the `0` shortcut), `resetView()` is the stronger reset for
|
|
29
|
+
a caller swapping in entirely new content (`<lr-lightbox>` calls it on every navigation). The
|
|
30
|
+
viewport accepts `+`/`=` (zoom in), `-`/`_` (zoom out), and `0` (reset zoom) while focused.
|
|
31
|
+
|
|
32
|
+
**Slots:** default slot — content to inspect; ignored while `src` is set (an `<img>` renders
|
|
33
|
+
instead).
|
|
34
|
+
|
|
35
|
+
**Events:** `lr-zoom-change` (`detail: { zoom }`).
|
|
36
|
+
|
|
37
|
+
**CSS parts:** `base`, `viewport`, `content`, `controls`, `zoom-out`, `zoom-in`, and `reset`.
|
|
38
|
+
|
|
39
|
+
**Themeable custom properties:** `--lr-zoomable-frame-min-block-size` (default
|
|
40
|
+
`var(--lr-size-10rem)` — the scrollable viewport's minimum block size).
|
|
41
|
+
`--lr-zoomable-frame-zoom` is a read-only hook, not a knob: the component writes the resolved
|
|
42
|
+
zoom factor inline on `[part="content"]`, which `transform: scale()` consumes — setting it from
|
|
43
|
+
outside is overwritten on the next render.
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<lr-zoomable-frame src="map-preview.png" alt="Map preview" aria-label="Map preview"></lr-zoomable-frame>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Known gotchas:**
|
|
50
|
+
- `zoom`/`minZoom`/`maxZoom`/`zoomStep` are all normalized before any zoom math: `minZoom` falls
|
|
51
|
+
back to `0.5`, `maxZoom` to `4` (and is floored at the effective `minZoom`), `zoomStep` to
|
|
52
|
+
`0.25`, each clamped into `[0.01, 1000]`, so a `NaN`/zero/negative attribute can't stall or
|
|
53
|
+
reverse `zoomIn()`/`zoomOut()`.
|
|
54
|
+
- every zoom is snapped to a multiple of `zoomStep` and rounded to 2 decimals, so `zoom` will not
|
|
55
|
+
always equal the exact value you assigned.
|
|
56
|
+
|
|
57
|
+
---
|