@cardstack/boxel-cli 0.10.0 → 0.10.1-unstable.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/bundled-realms/pretui/README.md +49 -0
- package/bundled-realms/pretui/color/LICENSE +21 -0
- package/bundled-realms/pretui/color/README.md +155 -0
- package/bundled-realms/pretui/color/index.js +78 -0
- package/bundled-realms/pretui/color-engine.ts +1243 -0
- package/bundled-realms/pretui/components/accordion.gts +58 -0
- package/bundled-realms/pretui/components/accordion.md +60 -0
- package/bundled-realms/pretui/components/accordion.usage.gts +129 -0
- package/bundled-realms/pretui/components/action-bar.gts +407 -0
- package/bundled-realms/pretui/components/action-bar.md +48 -0
- package/bundled-realms/pretui/components/action-bar.usage.gts +213 -0
- package/bundled-realms/pretui/components/affix.gts +116 -0
- package/bundled-realms/pretui/components/affix.md +54 -0
- package/bundled-realms/pretui/components/affix.usage.gts +73 -0
- package/bundled-realms/pretui/components/agent-question.gts +116 -0
- package/bundled-realms/pretui/components/agent-question.md +50 -0
- package/bundled-realms/pretui/components/agent-question.usage.gts +22 -0
- package/bundled-realms/pretui/components/ai-instructions.gts +378 -0
- package/bundled-realms/pretui/components/ai-instructions.md +49 -0
- package/bundled-realms/pretui/components/ai-instructions.usage.gts +101 -0
- package/bundled-realms/pretui/components/alert-dialog.gts +223 -0
- package/bundled-realms/pretui/components/alert-dialog.md +76 -0
- package/bundled-realms/pretui/components/alert-dialog.usage.gts +128 -0
- package/bundled-realms/pretui/components/alert.gts +163 -0
- package/bundled-realms/pretui/components/alert.md +57 -0
- package/bundled-realms/pretui/components/alert.usage.gts +99 -0
- package/bundled-realms/pretui/components/amount-input.gts +621 -0
- package/bundled-realms/pretui/components/amount-input.md +63 -0
- package/bundled-realms/pretui/components/amount-input.usage.gts +170 -0
- package/bundled-realms/pretui/components/angle-dial.gts +367 -0
- package/bundled-realms/pretui/components/angle-dial.md +56 -0
- package/bundled-realms/pretui/components/angle-dial.usage.gts +166 -0
- package/bundled-realms/pretui/components/animated-image.gts +291 -0
- package/bundled-realms/pretui/components/animated-image.md +49 -0
- package/bundled-realms/pretui/components/animated-image.usage.gts +127 -0
- package/bundled-realms/pretui/components/app-shell.gts +19 -0
- package/bundled-realms/pretui/components/app-shell.md +43 -0
- package/bundled-realms/pretui/components/app-shell.usage.gts +52 -0
- package/bundled-realms/pretui/components/approval-footer.gts +69 -0
- package/bundled-realms/pretui/components/approval-footer.md +49 -0
- package/bundled-realms/pretui/components/approval-footer.usage.gts +22 -0
- package/bundled-realms/pretui/components/aspect-ratio.gts +328 -0
- package/bundled-realms/pretui/components/aspect-ratio.md +72 -0
- package/bundled-realms/pretui/components/aspect-ratio.usage.gts +174 -0
- package/bundled-realms/pretui/components/asset-grid.gts +542 -0
- package/bundled-realms/pretui/components/asset-grid.md +54 -0
- package/bundled-realms/pretui/components/asset-grid.usage.gts +171 -0
- package/bundled-realms/pretui/components/asset-well.gts +731 -0
- package/bundled-realms/pretui/components/asset-well.md +72 -0
- package/bundled-realms/pretui/components/asset-well.usage.gts +264 -0
- package/bundled-realms/pretui/components/audio-player.gts +152 -0
- package/bundled-realms/pretui/components/audio-player.md +51 -0
- package/bundled-realms/pretui/components/audio-player.usage.gts +118 -0
- package/bundled-realms/pretui/components/autocomplete.gts +1150 -0
- package/bundled-realms/pretui/components/autocomplete.md +67 -0
- package/bundled-realms/pretui/components/autocomplete.usage.gts +339 -0
- package/bundled-realms/pretui/components/avatar-group.gts +30 -0
- package/bundled-realms/pretui/components/avatar-group.md +48 -0
- package/bundled-realms/pretui/components/avatar-group.usage.gts +39 -0
- package/bundled-realms/pretui/components/avatar.gts +134 -0
- package/bundled-realms/pretui/components/avatar.md +69 -0
- package/bundled-realms/pretui/components/avatar.usage.gts +101 -0
- package/bundled-realms/pretui/components/backdrop.gts +179 -0
- package/bundled-realms/pretui/components/backdrop.md +56 -0
- package/bundled-realms/pretui/components/backdrop.usage.gts +223 -0
- package/bundled-realms/pretui/components/background-field.gts +743 -0
- package/bundled-realms/pretui/components/background-field.md +62 -0
- package/bundled-realms/pretui/components/background-field.usage.gts +328 -0
- package/bundled-realms/pretui/components/badge.gts +188 -0
- package/bundled-realms/pretui/components/badge.md +62 -0
- package/bundled-realms/pretui/components/badge.usage.gts +73 -0
- package/bundled-realms/pretui/components/bar-list.gts +255 -0
- package/bundled-realms/pretui/components/bar-list.md +49 -0
- package/bundled-realms/pretui/components/bar-list.usage.gts +129 -0
- package/bundled-realms/pretui/components/board.gts +108 -0
- package/bundled-realms/pretui/components/board.md +54 -0
- package/bundled-realms/pretui/components/board.usage.gts +321 -0
- package/bundled-realms/pretui/components/bottom-nav.gts +217 -0
- package/bundled-realms/pretui/components/bottom-nav.md +64 -0
- package/bundled-realms/pretui/components/bottom-nav.usage.gts +68 -0
- package/bundled-realms/pretui/components/breadcrumb.gts +56 -0
- package/bundled-realms/pretui/components/breadcrumb.md +52 -0
- package/bundled-realms/pretui/components/breadcrumb.usage.gts +24 -0
- package/bundled-realms/pretui/components/broken-link.gts +46 -0
- package/bundled-realms/pretui/components/broken-link.md +50 -0
- package/bundled-realms/pretui/components/broken-link.usage.gts +57 -0
- package/bundled-realms/pretui/components/button-group.gts +246 -0
- package/bundled-realms/pretui/components/button-group.md +46 -0
- package/bundled-realms/pretui/components/button-group.usage.gts +137 -0
- package/bundled-realms/pretui/components/button.examples.gts +67 -0
- package/bundled-realms/pretui/components/button.gts +594 -0
- package/bundled-realms/pretui/components/button.md +81 -0
- package/bundled-realms/pretui/components/button.usage.gts +159 -0
- package/bundled-realms/pretui/components/calendar.gts +457 -0
- package/bundled-realms/pretui/components/calendar.md +57 -0
- package/bundled-realms/pretui/components/calendar.usage.gts +161 -0
- package/bundled-realms/pretui/components/callout.gts +2 -0
- package/bundled-realms/pretui/components/callout.md +40 -0
- package/bundled-realms/pretui/components/callout.usage.gts +48 -0
- package/bundled-realms/pretui/components/card.gts +637 -0
- package/bundled-realms/pretui/components/card.md +105 -0
- package/bundled-realms/pretui/components/card.usage.gts +279 -0
- package/bundled-realms/pretui/components/carousel.gts +583 -0
- package/bundled-realms/pretui/components/carousel.md +53 -0
- package/bundled-realms/pretui/components/carousel.usage.gts +220 -0
- package/bundled-realms/pretui/components/cascader.gts +436 -0
- package/bundled-realms/pretui/components/cascader.md +61 -0
- package/bundled-realms/pretui/components/cascader.usage.gts +79 -0
- package/bundled-realms/pretui/components/channel-slider.gts +251 -0
- package/bundled-realms/pretui/components/channel-slider.md +51 -0
- package/bundled-realms/pretui/components/channel-slider.usage.gts +104 -0
- package/bundled-realms/pretui/components/chart.gts +1011 -0
- package/bundled-realms/pretui/components/chart.md +60 -0
- package/bundled-realms/pretui/components/chart.usage.gts +660 -0
- package/bundled-realms/pretui/components/checkbox-card.gts +82 -0
- package/bundled-realms/pretui/components/checkbox-card.md +73 -0
- package/bundled-realms/pretui/components/checkbox-card.usage.gts +114 -0
- package/bundled-realms/pretui/components/checkbox.examples.gts +61 -0
- package/bundled-realms/pretui/components/checkbox.gts +123 -0
- package/bundled-realms/pretui/components/checkbox.md +55 -0
- package/bundled-realms/pretui/components/checkbox.usage.gts +31 -0
- package/bundled-realms/pretui/components/chip.gts +136 -0
- package/bundled-realms/pretui/components/chip.md +54 -0
- package/bundled-realms/pretui/components/chip.usage.gts +97 -0
- package/bundled-realms/pretui/components/code-block.gts +888 -0
- package/bundled-realms/pretui/components/code-block.md +61 -0
- package/bundled-realms/pretui/components/code-block.usage.gts +374 -0
- package/bundled-realms/pretui/components/collapsed-turn.gts +44 -0
- package/bundled-realms/pretui/components/collapsed-turn.md +48 -0
- package/bundled-realms/pretui/components/collapsed-turn.usage.gts +21 -0
- package/bundled-realms/pretui/components/collapsible.gts +283 -0
- package/bundled-realms/pretui/components/collapsible.md +69 -0
- package/bundled-realms/pretui/components/collapsible.usage.gts +173 -0
- package/bundled-realms/pretui/components/color-area.gts +339 -0
- package/bundled-realms/pretui/components/color-area.md +49 -0
- package/bundled-realms/pretui/components/color-area.usage.gts +72 -0
- package/bundled-realms/pretui/components/color-field.gts +179 -0
- package/bundled-realms/pretui/components/color-field.md +47 -0
- package/bundled-realms/pretui/components/color-field.usage.gts +87 -0
- package/bundled-realms/pretui/components/color-palette.gts +198 -0
- package/bundled-realms/pretui/components/color-palette.md +48 -0
- package/bundled-realms/pretui/components/color-picker.gts +721 -0
- package/bundled-realms/pretui/components/color-picker.md +59 -0
- package/bundled-realms/pretui/components/color-picker.usage.gts +122 -0
- package/bundled-realms/pretui/components/color-stop-editor.gts +184 -0
- package/bundled-realms/pretui/components/color-stop-editor.md +46 -0
- package/bundled-realms/pretui/components/color-stop-editor.usage.gts +75 -0
- package/bundled-realms/pretui/components/combobox.gts +333 -0
- package/bundled-realms/pretui/components/combobox.md +49 -0
- package/bundled-realms/pretui/components/combobox.usage.gts +143 -0
- package/bundled-realms/pretui/components/command-palette.gts +982 -0
- package/bundled-realms/pretui/components/command-palette.md +47 -0
- package/bundled-realms/pretui/components/command-palette.usage.gts +95 -0
- package/bundled-realms/pretui/components/command.gts +2 -0
- package/bundled-realms/pretui/components/command.md +45 -0
- package/bundled-realms/pretui/components/command.usage.gts +58 -0
- package/bundled-realms/pretui/components/compaction-chip.gts +273 -0
- package/bundled-realms/pretui/components/compaction-chip.md +45 -0
- package/bundled-realms/pretui/components/compaction-chip.usage.gts +110 -0
- package/bundled-realms/pretui/components/comparison.gts +223 -0
- package/bundled-realms/pretui/components/comparison.md +46 -0
- package/bundled-realms/pretui/components/comparison.usage.gts +148 -0
- package/bundled-realms/pretui/components/composer.gts +566 -0
- package/bundled-realms/pretui/components/composer.md +59 -0
- package/bundled-realms/pretui/components/composer.usage.gts +173 -0
- package/bundled-realms/pretui/components/compound-field.gts +289 -0
- package/bundled-realms/pretui/components/compound-field.md +66 -0
- package/bundled-realms/pretui/components/compound-field.usage.gts +378 -0
- package/bundled-realms/pretui/components/contact-link.gts +583 -0
- package/bundled-realms/pretui/components/contact-link.md +53 -0
- package/bundled-realms/pretui/components/contact-link.usage.gts +273 -0
- package/bundled-realms/pretui/components/context-menu.gts +811 -0
- package/bundled-realms/pretui/components/context-menu.md +74 -0
- package/bundled-realms/pretui/components/context-menu.usage.gts +244 -0
- package/bundled-realms/pretui/components/copy-button.gts +237 -0
- package/bundled-realms/pretui/components/copy-button.md +71 -0
- package/bundled-realms/pretui/components/copy-button.usage.gts +135 -0
- package/bundled-realms/pretui/components/copy-fit.gts +396 -0
- package/bundled-realms/pretui/components/copy-fit.md +60 -0
- package/bundled-realms/pretui/components/copy-fit.usage.gts +200 -0
- package/bundled-realms/pretui/components/cta-band.gts +285 -0
- package/bundled-realms/pretui/components/cta-band.md +50 -0
- package/bundled-realms/pretui/components/cta-band.usage.gts +208 -0
- package/bundled-realms/pretui/components/cue.gts +180 -0
- package/bundled-realms/pretui/components/cue.md +53 -0
- package/bundled-realms/pretui/components/cue.usage.gts +88 -0
- package/bundled-realms/pretui/components/cursor-trail.gts +221 -0
- package/bundled-realms/pretui/components/cursor-trail.md +56 -0
- package/bundled-realms/pretui/components/cursor-trail.usage.gts +218 -0
- package/bundled-realms/pretui/components/dashboard-grid.gts +939 -0
- package/bundled-realms/pretui/components/dashboard-grid.md +60 -0
- package/bundled-realms/pretui/components/dashboard-grid.usage.gts +307 -0
- package/bundled-realms/pretui/components/dashboard-item.gts +286 -0
- package/bundled-realms/pretui/components/dashboard-item.md +52 -0
- package/bundled-realms/pretui/components/dashboard-item.usage.gts +87 -0
- package/bundled-realms/pretui/components/data-grid.gts +263 -0
- package/bundled-realms/pretui/components/data-grid.md +64 -0
- package/bundled-realms/pretui/components/data-grid.usage.gts +50 -0
- package/bundled-realms/pretui/components/data-table.gts +1618 -0
- package/bundled-realms/pretui/components/data-table.md +104 -0
- package/bundled-realms/pretui/components/data-table.usage.gts +324 -0
- package/bundled-realms/pretui/components/date-picker.gts +98 -0
- package/bundled-realms/pretui/components/date-picker.md +59 -0
- package/bundled-realms/pretui/components/date-picker.usage.gts +66 -0
- package/bundled-realms/pretui/components/date-range-picker.gts +131 -0
- package/bundled-realms/pretui/components/date-range-picker.md +55 -0
- package/bundled-realms/pretui/components/date-range-picker.usage.gts +125 -0
- package/bundled-realms/pretui/components/date-time-picker.gts +227 -0
- package/bundled-realms/pretui/components/date-time-picker.md +60 -0
- package/bundled-realms/pretui/components/date-time-picker.usage.gts +64 -0
- package/bundled-realms/pretui/components/defer.gts +374 -0
- package/bundled-realms/pretui/components/defer.md +61 -0
- package/bundled-realms/pretui/components/defer.usage.gts +174 -0
- package/bundled-realms/pretui/components/delta.gts +45 -0
- package/bundled-realms/pretui/components/delta.md +53 -0
- package/bundled-realms/pretui/components/delta.usage.gts +31 -0
- package/bundled-realms/pretui/components/descriptions.gts +365 -0
- package/bundled-realms/pretui/components/descriptions.md +73 -0
- package/bundled-realms/pretui/components/descriptions.usage.gts +123 -0
- package/bundled-realms/pretui/components/dialog.gts +153 -0
- package/bundled-realms/pretui/components/dialog.md +60 -0
- package/bundled-realms/pretui/components/dialog.usage.gts +86 -0
- package/bundled-realms/pretui/components/diff-block.gts +89 -0
- package/bundled-realms/pretui/components/diff-block.md +51 -0
- package/bundled-realms/pretui/components/diff-block.usage.gts +27 -0
- package/bundled-realms/pretui/components/disclosure.gts +2 -0
- package/bundled-realms/pretui/components/disclosure.md +45 -0
- package/bundled-realms/pretui/components/disclosure.usage.gts +47 -0
- package/bundled-realms/pretui/components/divider.gts +75 -0
- package/bundled-realms/pretui/components/divider.md +49 -0
- package/bundled-realms/pretui/components/divider.usage.gts +98 -0
- package/bundled-realms/pretui/components/doc-report.gts +306 -0
- package/bundled-realms/pretui/components/doc-report.md +45 -0
- package/bundled-realms/pretui/components/doc-report.usage.gts +126 -0
- package/bundled-realms/pretui/components/dock.gts +165 -0
- package/bundled-realms/pretui/components/dock.md +42 -0
- package/bundled-realms/pretui/components/dock.usage.gts +114 -0
- package/bundled-realms/pretui/components/drawer.gts +166 -0
- package/bundled-realms/pretui/components/drawer.md +66 -0
- package/bundled-realms/pretui/components/drawer.usage.gts +111 -0
- package/bundled-realms/pretui/components/dropzone.gts +314 -0
- package/bundled-realms/pretui/components/dropzone.md +56 -0
- package/bundled-realms/pretui/components/dropzone.usage.gts +203 -0
- package/bundled-realms/pretui/components/dueling-picklist.gts +991 -0
- package/bundled-realms/pretui/components/dueling-picklist.md +67 -0
- package/bundled-realms/pretui/components/dueling-picklist.usage.gts +182 -0
- package/bundled-realms/pretui/components/dynamic-island.gts +264 -0
- package/bundled-realms/pretui/components/dynamic-island.md +45 -0
- package/bundled-realms/pretui/components/dynamic-island.usage.gts +195 -0
- package/bundled-realms/pretui/components/easing-curve.gts +629 -0
- package/bundled-realms/pretui/components/easing-curve.md +46 -0
- package/bundled-realms/pretui/components/easing-curve.usage.gts +122 -0
- package/bundled-realms/pretui/components/edit-in-place.gts +559 -0
- package/bundled-realms/pretui/components/edit-in-place.md +63 -0
- package/bundled-realms/pretui/components/edit-in-place.usage.gts +209 -0
- package/bundled-realms/pretui/components/editable.gts +299 -0
- package/bundled-realms/pretui/components/editable.md +79 -0
- package/bundled-realms/pretui/components/editable.usage.gts +68 -0
- package/bundled-realms/pretui/components/email-input.gts +83 -0
- package/bundled-realms/pretui/components/email-input.md +52 -0
- package/bundled-realms/pretui/components/email-input.usage.gts +90 -0
- package/bundled-realms/pretui/components/emoji-button.gts +162 -0
- package/bundled-realms/pretui/components/emoji-button.md +46 -0
- package/bundled-realms/pretui/components/emoji-button.usage.gts +174 -0
- package/bundled-realms/pretui/components/emoji-picker.gts +1396 -0
- package/bundled-realms/pretui/components/emoji-picker.md +53 -0
- package/bundled-realms/pretui/components/emoji-picker.usage.gts +235 -0
- package/bundled-realms/pretui/components/empty-state.gts +162 -0
- package/bundled-realms/pretui/components/empty-state.md +63 -0
- package/bundled-realms/pretui/components/empty-state.usage.gts +113 -0
- package/bundled-realms/pretui/components/empty.gts +2 -0
- package/bundled-realms/pretui/components/empty.md +43 -0
- package/bundled-realms/pretui/components/empty.usage.gts +33 -0
- package/bundled-realms/pretui/components/entity-display.gts +126 -0
- package/bundled-realms/pretui/components/entity-display.md +50 -0
- package/bundled-realms/pretui/components/error-summary.gts +321 -0
- package/bundled-realms/pretui/components/error-summary.md +60 -0
- package/bundled-realms/pretui/components/error-summary.usage.gts +155 -0
- package/bundled-realms/pretui/components/expression-builder.gts +1211 -0
- package/bundled-realms/pretui/components/expression-builder.md +60 -0
- package/bundled-realms/pretui/components/expression-builder.usage.gts +246 -0
- package/bundled-realms/pretui/components/fab.gts +2 -0
- package/bundled-realms/pretui/components/fab.md +38 -0
- package/bundled-realms/pretui/components/fab.usage.gts +38 -0
- package/bundled-realms/pretui/components/feature-voting.gts +365 -0
- package/bundled-realms/pretui/components/feature-voting.md +44 -0
- package/bundled-realms/pretui/components/feature-voting.usage.gts +114 -0
- package/bundled-realms/pretui/components/feed.gts +244 -0
- package/bundled-realms/pretui/components/feed.md +56 -0
- package/bundled-realms/pretui/components/feed.usage.gts +250 -0
- package/bundled-realms/pretui/components/field-error.gts +127 -0
- package/bundled-realms/pretui/components/field-error.md +60 -0
- package/bundled-realms/pretui/components/field-error.usage.gts +146 -0
- package/bundled-realms/pretui/components/field.gts +185 -0
- package/bundled-realms/pretui/components/field.md +60 -0
- package/bundled-realms/pretui/components/field.usage.gts +73 -0
- package/bundled-realms/pretui/components/fieldset.gts +124 -0
- package/bundled-realms/pretui/components/fieldset.md +65 -0
- package/bundled-realms/pretui/components/fieldset.usage.gts +105 -0
- package/bundled-realms/pretui/components/file-trigger.gts +185 -0
- package/bundled-realms/pretui/components/file-trigger.md +53 -0
- package/bundled-realms/pretui/components/file-trigger.usage.gts +121 -0
- package/bundled-realms/pretui/components/file-upload.gts +353 -0
- package/bundled-realms/pretui/components/file-upload.md +63 -0
- package/bundled-realms/pretui/components/file-upload.usage.gts +64 -0
- package/bundled-realms/pretui/components/filmstrip.gts +465 -0
- package/bundled-realms/pretui/components/filmstrip.md +53 -0
- package/bundled-realms/pretui/components/filmstrip.usage.gts +115 -0
- package/bundled-realms/pretui/components/filter-chips.gts +236 -0
- package/bundled-realms/pretui/components/filter-chips.md +58 -0
- package/bundled-realms/pretui/components/filter-chips.usage.gts +102 -0
- package/bundled-realms/pretui/components/filter-set.gts +293 -0
- package/bundled-realms/pretui/components/filter-set.md +60 -0
- package/bundled-realms/pretui/components/filter-set.usage.gts +145 -0
- package/bundled-realms/pretui/components/float-button.gts +339 -0
- package/bundled-realms/pretui/components/float-button.md +69 -0
- package/bundled-realms/pretui/components/float-button.usage.gts +134 -0
- package/bundled-realms/pretui/components/fold.gts +86 -0
- package/bundled-realms/pretui/components/fold.md +54 -0
- package/bundled-realms/pretui/components/fold.usage.gts +19 -0
- package/bundled-realms/pretui/components/form-field.gts +609 -0
- package/bundled-realms/pretui/components/form-field.md +77 -0
- package/bundled-realms/pretui/components/form-field.usage.gts +279 -0
- package/bundled-realms/pretui/components/form-footer.gts +246 -0
- package/bundled-realms/pretui/components/form-footer.md +59 -0
- package/bundled-realms/pretui/components/form-footer.usage.gts +217 -0
- package/bundled-realms/pretui/components/form-layout.gts +130 -0
- package/bundled-realms/pretui/components/form-layout.md +52 -0
- package/bundled-realms/pretui/components/form-layout.usage.gts +200 -0
- package/bundled-realms/pretui/components/form-section.gts +434 -0
- package/bundled-realms/pretui/components/form-section.md +67 -0
- package/bundled-realms/pretui/components/form-section.usage.gts +402 -0
- package/bundled-realms/pretui/components/form.gts +315 -0
- package/bundled-realms/pretui/components/form.md +82 -0
- package/bundled-realms/pretui/components/form.usage.gts +306 -0
- package/bundled-realms/pretui/components/format-bytes.gts +212 -0
- package/bundled-realms/pretui/components/format-bytes.md +47 -0
- package/bundled-realms/pretui/components/format-bytes.usage.gts +274 -0
- package/bundled-realms/pretui/components/format-date.gts +249 -0
- package/bundled-realms/pretui/components/format-date.md +55 -0
- package/bundled-realms/pretui/components/format-date.usage.gts +245 -0
- package/bundled-realms/pretui/components/format-number.gts +138 -0
- package/bundled-realms/pretui/components/format-number.md +51 -0
- package/bundled-realms/pretui/components/format-number.usage.gts +261 -0
- package/bundled-realms/pretui/components/formatted-value.gts +65 -0
- package/bundled-realms/pretui/components/freestyle-usage.gts +311 -0
- package/bundled-realms/pretui/components/freestyle-usage.md +49 -0
- package/bundled-realms/pretui/components/gallery.gts +819 -0
- package/bundled-realms/pretui/components/gallery.md +65 -0
- package/bundled-realms/pretui/components/gallery.usage.gts +212 -0
- package/bundled-realms/pretui/components/gradient-editor.gts +682 -0
- package/bundled-realms/pretui/components/gradient-editor.md +43 -0
- package/bundled-realms/pretui/components/gradient-editor.usage.gts +69 -0
- package/bundled-realms/pretui/components/graph-layout.md +54 -0
- package/bundled-realms/pretui/components/graph-layout.usage.gts +343 -0
- package/bundled-realms/pretui/components/graph-outline.gts +553 -0
- package/bundled-realms/pretui/components/graph-outline.md +50 -0
- package/bundled-realms/pretui/components/graph-outline.usage.gts +88 -0
- package/bundled-realms/pretui/components/grid.gts +68 -0
- package/bundled-realms/pretui/components/grid.md +54 -0
- package/bundled-realms/pretui/components/grid.usage.gts +144 -0
- package/bundled-realms/pretui/components/handle.gts +192 -0
- package/bundled-realms/pretui/components/handle.md +55 -0
- package/bundled-realms/pretui/components/handle.usage.gts +174 -0
- package/bundled-realms/pretui/components/hero-split.gts +307 -0
- package/bundled-realms/pretui/components/hero-split.md +50 -0
- package/bundled-realms/pretui/components/hero-split.usage.gts +200 -0
- package/bundled-realms/pretui/components/hover-actions.gts +485 -0
- package/bundled-realms/pretui/components/hover-actions.md +55 -0
- package/bundled-realms/pretui/components/hover-actions.usage.gts +224 -0
- package/bundled-realms/pretui/components/hover-card.gts +347 -0
- package/bundled-realms/pretui/components/hover-card.md +72 -0
- package/bundled-realms/pretui/components/hover-card.usage.gts +174 -0
- package/bundled-realms/pretui/components/hover-video-player.gts +315 -0
- package/bundled-realms/pretui/components/hover-video-player.md +57 -0
- package/bundled-realms/pretui/components/hover-video-player.usage.gts +152 -0
- package/bundled-realms/pretui/components/icon-button.examples.gts +69 -0
- package/bundled-realms/pretui/components/icon-button.gts +153 -0
- package/bundled-realms/pretui/components/icon-button.md +72 -0
- package/bundled-realms/pretui/components/icon-button.usage.gts +208 -0
- package/bundled-realms/pretui/components/image-cropper.gts +693 -0
- package/bundled-realms/pretui/components/image-cropper.md +52 -0
- package/bundled-realms/pretui/components/image-cropper.usage.gts +108 -0
- package/bundled-realms/pretui/components/image-frame.gts +91 -0
- package/bundled-realms/pretui/components/image-frame.md +42 -0
- package/bundled-realms/pretui/components/image-frame.usage.gts +28 -0
- package/bundled-realms/pretui/components/image.gts +326 -0
- package/bundled-realms/pretui/components/image.md +71 -0
- package/bundled-realms/pretui/components/image.usage.gts +126 -0
- package/bundled-realms/pretui/components/in-view.gts +245 -0
- package/bundled-realms/pretui/components/in-view.md +53 -0
- package/bundled-realms/pretui/components/in-view.usage.gts +264 -0
- package/bundled-realms/pretui/components/indicator.gts +137 -0
- package/bundled-realms/pretui/components/indicator.md +60 -0
- package/bundled-realms/pretui/components/indicator.usage.gts +66 -0
- package/bundled-realms/pretui/components/infinite-scroll.gts +163 -0
- package/bundled-realms/pretui/components/infinite-scroll.md +54 -0
- package/bundled-realms/pretui/components/infinite-scroll.usage.gts +73 -0
- package/bundled-realms/pretui/components/input-group.gts +264 -0
- package/bundled-realms/pretui/components/input-group.md +55 -0
- package/bundled-realms/pretui/components/input-group.usage.gts +283 -0
- package/bundled-realms/pretui/components/input.examples.gts +61 -0
- package/bundled-realms/pretui/components/input.gts +202 -0
- package/bundled-realms/pretui/components/input.md +67 -0
- package/bundled-realms/pretui/components/input.usage.gts +208 -0
- package/bundled-realms/pretui/components/interactive-input.gts +343 -0
- package/bundled-realms/pretui/components/interactive-input.md +45 -0
- package/bundled-realms/pretui/components/interactive-input.usage.gts +98 -0
- package/bundled-realms/pretui/components/item.gts +218 -0
- package/bundled-realms/pretui/components/item.md +66 -0
- package/bundled-realms/pretui/components/item.usage.gts +121 -0
- package/bundled-realms/pretui/components/joystick.gts +381 -0
- package/bundled-realms/pretui/components/joystick.md +52 -0
- package/bundled-realms/pretui/components/joystick.usage.gts +140 -0
- package/bundled-realms/pretui/components/json-editor.gts +1016 -0
- package/bundled-realms/pretui/components/json-editor.md +51 -0
- package/bundled-realms/pretui/components/json-editor.usage.gts +230 -0
- package/bundled-realms/pretui/components/json-tree.gts +596 -0
- package/bundled-realms/pretui/components/json-tree.md +52 -0
- package/bundled-realms/pretui/components/json-tree.usage.gts +217 -0
- package/bundled-realms/pretui/components/jump-chip.gts +230 -0
- package/bundled-realms/pretui/components/jump-chip.md +44 -0
- package/bundled-realms/pretui/components/jump-chip.usage.gts +151 -0
- package/bundled-realms/pretui/components/kbd.gts +60 -0
- package/bundled-realms/pretui/components/kbd.md +50 -0
- package/bundled-realms/pretui/components/kbd.usage.gts +98 -0
- package/bundled-realms/pretui/components/key-value.gts +150 -0
- package/bundled-realms/pretui/components/key-value.md +81 -0
- package/bundled-realms/pretui/components/key-value.usage.gts +125 -0
- package/bundled-realms/pretui/components/known-date.gts +770 -0
- package/bundled-realms/pretui/components/known-date.md +56 -0
- package/bundled-realms/pretui/components/known-date.usage.gts +192 -0
- package/bundled-realms/pretui/components/label.gts +60 -0
- package/bundled-realms/pretui/components/label.md +56 -0
- package/bundled-realms/pretui/components/label.usage.gts +63 -0
- package/bundled-realms/pretui/components/layer-manager.gts +1884 -0
- package/bundled-realms/pretui/components/layer-manager.md +59 -0
- package/bundled-realms/pretui/components/layer-manager.usage.gts +233 -0
- package/bundled-realms/pretui/components/lightbox.gts +461 -0
- package/bundled-realms/pretui/components/lightbox.md +57 -0
- package/bundled-realms/pretui/components/lightbox.usage.gts +180 -0
- package/bundled-realms/pretui/components/line-grid.examples.gts +156 -0
- package/bundled-realms/pretui/components/line-grid.gts +523 -0
- package/bundled-realms/pretui/components/line-grid.md +55 -0
- package/bundled-realms/pretui/components/line-grid.usage.gts +181 -0
- package/bundled-realms/pretui/components/list.gts +679 -0
- package/bundled-realms/pretui/components/list.md +90 -0
- package/bundled-realms/pretui/components/list.usage.gts +203 -0
- package/bundled-realms/pretui/components/loader.gts +2 -0
- package/bundled-realms/pretui/components/loader.md +33 -0
- package/bundled-realms/pretui/components/loader.usage.gts +35 -0
- package/bundled-realms/pretui/components/loading-overlay.gts +120 -0
- package/bundled-realms/pretui/components/loading-overlay.md +68 -0
- package/bundled-realms/pretui/components/loading-overlay.usage.gts +102 -0
- package/bundled-realms/pretui/components/loading-state.gts +124 -0
- package/bundled-realms/pretui/components/loading-state.md +48 -0
- package/bundled-realms/pretui/components/loading-state.usage.gts +16 -0
- package/bundled-realms/pretui/components/lookup.gts +451 -0
- package/bundled-realms/pretui/components/lookup.md +59 -0
- package/bundled-realms/pretui/components/lookup.usage.gts +235 -0
- package/bundled-realms/pretui/components/magnetic.gts +158 -0
- package/bundled-realms/pretui/components/magnetic.md +48 -0
- package/bundled-realms/pretui/components/magnetic.usage.gts +125 -0
- package/bundled-realms/pretui/components/marquee.gts +141 -0
- package/bundled-realms/pretui/components/marquee.md +43 -0
- package/bundled-realms/pretui/components/marquee.usage.gts +116 -0
- package/bundled-realms/pretui/components/masonry.gts +95 -0
- package/bundled-realms/pretui/components/masonry.md +59 -0
- package/bundled-realms/pretui/components/masonry.usage.gts +238 -0
- package/bundled-realms/pretui/components/media-inspector.gts +145 -0
- package/bundled-realms/pretui/components/media-inspector.md +46 -0
- package/bundled-realms/pretui/components/media-inspector.usage.gts +83 -0
- package/bundled-realms/pretui/components/media-player.gts +1133 -0
- package/bundled-realms/pretui/components/media-player.md +74 -0
- package/bundled-realms/pretui/components/media-player.usage.gts +265 -0
- package/bundled-realms/pretui/components/media-viewer.gts +136 -0
- package/bundled-realms/pretui/components/media-viewer.md +47 -0
- package/bundled-realms/pretui/components/media-viewer.usage.gts +70 -0
- package/bundled-realms/pretui/components/mentions.gts +340 -0
- package/bundled-realms/pretui/components/mentions.md +65 -0
- package/bundled-realms/pretui/components/mentions.usage.gts +73 -0
- package/bundled-realms/pretui/components/menu-panel.gts +367 -0
- package/bundled-realms/pretui/components/menu.gts +652 -0
- package/bundled-realms/pretui/components/menu.md +69 -0
- package/bundled-realms/pretui/components/menu.usage.gts +116 -0
- package/bundled-realms/pretui/components/menubar.gts +1200 -0
- package/bundled-realms/pretui/components/menubar.md +49 -0
- package/bundled-realms/pretui/components/menubar.usage.gts +220 -0
- package/bundled-realms/pretui/components/meter.gts +113 -0
- package/bundled-realms/pretui/components/meter.md +50 -0
- package/bundled-realms/pretui/components/meter.usage.gts +50 -0
- package/bundled-realms/pretui/components/modal.gts +2 -0
- package/bundled-realms/pretui/components/modal.md +41 -0
- package/bundled-realms/pretui/components/modal.usage.gts +50 -0
- package/bundled-realms/pretui/components/model-viewer.gts +658 -0
- package/bundled-realms/pretui/components/model-viewer.md +57 -0
- package/bundled-realms/pretui/components/model-viewer.usage.gts +123 -0
- package/bundled-realms/pretui/components/money-input.gts +66 -0
- package/bundled-realms/pretui/components/money-input.md +43 -0
- package/bundled-realms/pretui/components/money-input.usage.gts +293 -0
- package/bundled-realms/pretui/components/morphing-dialog.gts +173 -0
- package/bundled-realms/pretui/components/morphing-dialog.md +46 -0
- package/bundled-realms/pretui/components/morphing-dialog.usage.gts +168 -0
- package/bundled-realms/pretui/components/morphing-popover.gts +245 -0
- package/bundled-realms/pretui/components/morphing-popover.md +47 -0
- package/bundled-realms/pretui/components/morphing-popover.usage.gts +176 -0
- package/bundled-realms/pretui/components/multi-select.gts +392 -0
- package/bundled-realms/pretui/components/multi-select.md +57 -0
- package/bundled-realms/pretui/components/multi-select.usage.gts +97 -0
- package/bundled-realms/pretui/components/native-select.gts +212 -0
- package/bundled-realms/pretui/components/native-select.md +77 -0
- package/bundled-realms/pretui/components/native-select.usage.gts +109 -0
- package/bundled-realms/pretui/components/navigation-menu.gts +351 -0
- package/bundled-realms/pretui/components/navigation-menu.md +65 -0
- package/bundled-realms/pretui/components/navigation-menu.usage.gts +61 -0
- package/bundled-realms/pretui/components/node-canvas.gts +1174 -0
- package/bundled-realms/pretui/components/node-canvas.md +57 -0
- package/bundled-realms/pretui/components/node-canvas.usage.gts +548 -0
- package/bundled-realms/pretui/components/node-card.gts +181 -0
- package/bundled-realms/pretui/components/node-card.md +53 -0
- package/bundled-realms/pretui/components/node-card.usage.gts +156 -0
- package/bundled-realms/pretui/components/notification.gts +242 -0
- package/bundled-realms/pretui/components/notification.md +69 -0
- package/bundled-realms/pretui/components/notification.usage.gts +125 -0
- package/bundled-realms/pretui/components/number-input.gts +191 -0
- package/bundled-realms/pretui/components/number-input.md +54 -0
- package/bundled-realms/pretui/components/number-input.usage.gts +132 -0
- package/bundled-realms/pretui/components/odometer.gts +349 -0
- package/bundled-realms/pretui/components/odometer.md +55 -0
- package/bundled-realms/pretui/components/odometer.usage.gts +258 -0
- package/bundled-realms/pretui/components/onboarding.gts +298 -0
- package/bundled-realms/pretui/components/onboarding.md +48 -0
- package/bundled-realms/pretui/components/onboarding.usage.gts +155 -0
- package/bundled-realms/pretui/components/origin-grid.gts +486 -0
- package/bundled-realms/pretui/components/origin-grid.md +47 -0
- package/bundled-realms/pretui/components/origin-grid.usage.gts +87 -0
- package/bundled-realms/pretui/components/otp-input.gts +289 -0
- package/bundled-realms/pretui/components/otp-input.md +47 -0
- package/bundled-realms/pretui/components/otp-input.usage.gts +131 -0
- package/bundled-realms/pretui/components/page-scaffold.gts +343 -0
- package/bundled-realms/pretui/components/page-scaffold.md +57 -0
- package/bundled-realms/pretui/components/page-scaffold.usage.gts +391 -0
- package/bundled-realms/pretui/components/pagination.gts +150 -0
- package/bundled-realms/pretui/components/pagination.md +56 -0
- package/bundled-realms/pretui/components/pagination.usage.gts +33 -0
- package/bundled-realms/pretui/components/panel-section.gts +301 -0
- package/bundled-realms/pretui/components/panel-section.md +48 -0
- package/bundled-realms/pretui/components/panel-section.usage.gts +137 -0
- package/bundled-realms/pretui/components/panel.gts +158 -0
- package/bundled-realms/pretui/components/panel.md +58 -0
- package/bundled-realms/pretui/components/panel.usage.gts +82 -0
- package/bundled-realms/pretui/components/password-input.gts +329 -0
- package/bundled-realms/pretui/components/password-input.md +58 -0
- package/bundled-realms/pretui/components/password-input.usage.gts +156 -0
- package/bundled-realms/pretui/components/password-strength.gts +485 -0
- package/bundled-realms/pretui/components/password-strength.md +50 -0
- package/bundled-realms/pretui/components/password-strength.usage.gts +34 -0
- package/bundled-realms/pretui/components/path-text.gts +288 -0
- package/bundled-realms/pretui/components/path-text.md +58 -0
- package/bundled-realms/pretui/components/path-text.usage.gts +239 -0
- package/bundled-realms/pretui/components/period-input.gts +1100 -0
- package/bundled-realms/pretui/components/period-input.md +54 -0
- package/bundled-realms/pretui/components/period-input.usage.gts +299 -0
- package/bundled-realms/pretui/components/phone-input.gts +80 -0
- package/bundled-realms/pretui/components/phone-input.md +55 -0
- package/bundled-realms/pretui/components/phone-input.usage.gts +91 -0
- package/bundled-realms/pretui/components/pin-input.gts +2 -0
- package/bundled-realms/pretui/components/pin-input.md +45 -0
- package/bundled-realms/pretui/components/pin-input.usage.gts +39 -0
- package/bundled-realms/pretui/components/pip-scale.gts +717 -0
- package/bundled-realms/pretui/components/pip-scale.md +55 -0
- package/bundled-realms/pretui/components/pip-scale.usage.gts +318 -0
- package/bundled-realms/pretui/components/popconfirm.gts +380 -0
- package/bundled-realms/pretui/components/popconfirm.md +78 -0
- package/bundled-realms/pretui/components/popconfirm.usage.gts +171 -0
- package/bundled-realms/pretui/components/popover.gts +198 -0
- package/bundled-realms/pretui/components/popover.md +57 -0
- package/bundled-realms/pretui/components/popover.usage.gts +106 -0
- package/bundled-realms/pretui/components/popup.gts +85 -0
- package/bundled-realms/pretui/components/popup.md +42 -0
- package/bundled-realms/pretui/components/popup.usage.gts +23 -0
- package/bundled-realms/pretui/components/presence.gts +156 -0
- package/bundled-realms/pretui/components/presence.md +55 -0
- package/bundled-realms/pretui/components/presence.usage.gts +204 -0
- package/bundled-realms/pretui/components/progress-bar.gts +177 -0
- package/bundled-realms/pretui/components/progress-bar.md +63 -0
- package/bundled-realms/pretui/components/progress-bar.usage.gts +172 -0
- package/bundled-realms/pretui/components/progress-radial.gts +67 -0
- package/bundled-realms/pretui/components/progress-radial.md +55 -0
- package/bundled-realms/pretui/components/progress-radial.usage.gts +76 -0
- package/bundled-realms/pretui/components/prompt-library.gts +358 -0
- package/bundled-realms/pretui/components/prompt-library.md +45 -0
- package/bundled-realms/pretui/components/prompt-library.usage.gts +117 -0
- package/bundled-realms/pretui/components/property-row.gts +316 -0
- package/bundled-realms/pretui/components/property-row.md +55 -0
- package/bundled-realms/pretui/components/property-row.usage.gts +146 -0
- package/bundled-realms/pretui/components/property-sheet.gts +133 -0
- package/bundled-realms/pretui/components/property-sheet.md +48 -0
- package/bundled-realms/pretui/components/property-sheet.usage.gts +132 -0
- package/bundled-realms/pretui/components/prose.gts +31 -0
- package/bundled-realms/pretui/components/prose.md +57 -0
- package/bundled-realms/pretui/components/prose.usage.gts +15 -0
- package/bundled-realms/pretui/components/pulsing-border.gts +297 -0
- package/bundled-realms/pretui/components/pulsing-border.md +65 -0
- package/bundled-realms/pretui/components/pulsing-border.usage.gts +253 -0
- package/bundled-realms/pretui/components/qr-code.gts +660 -0
- package/bundled-realms/pretui/components/qr-code.md +58 -0
- package/bundled-realms/pretui/components/qr-code.usage.gts +224 -0
- package/bundled-realms/pretui/components/queued-message.gts +83 -0
- package/bundled-realms/pretui/components/queued-message.md +53 -0
- package/bundled-realms/pretui/components/queued-message.usage.gts +21 -0
- package/bundled-realms/pretui/components/radio-card.gts +88 -0
- package/bundled-realms/pretui/components/radio-card.md +72 -0
- package/bundled-realms/pretui/components/radio-card.usage.gts +148 -0
- package/bundled-realms/pretui/components/radio-group.gts +119 -0
- package/bundled-realms/pretui/components/radio-group.md +46 -0
- package/bundled-realms/pretui/components/radio-group.usage.gts +80 -0
- package/bundled-realms/pretui/components/range-slider.gts +34 -0
- package/bundled-realms/pretui/components/range-slider.md +47 -0
- package/bundled-realms/pretui/components/range-slider.usage.gts +46 -0
- package/bundled-realms/pretui/components/rating.examples.gts +67 -0
- package/bundled-realms/pretui/components/rating.gts +266 -0
- package/bundled-realms/pretui/components/rating.md +55 -0
- package/bundled-realms/pretui/components/rating.usage.gts +96 -0
- package/bundled-realms/pretui/components/readiness-panel.gts +856 -0
- package/bundled-realms/pretui/components/readiness-panel.md +64 -0
- package/bundled-realms/pretui/components/readiness-panel.usage.gts +372 -0
- package/bundled-realms/pretui/components/recommendation.gts +316 -0
- package/bundled-realms/pretui/components/recommendation.md +49 -0
- package/bundled-realms/pretui/components/recommendation.usage.gts +103 -0
- package/bundled-realms/pretui/components/record-detail.gts +1170 -0
- package/bundled-realms/pretui/components/record-detail.md +63 -0
- package/bundled-realms/pretui/components/record-detail.usage.gts +533 -0
- package/bundled-realms/pretui/components/record-face.gts +153 -0
- package/bundled-realms/pretui/components/record-pill.gts +116 -0
- package/bundled-realms/pretui/components/record-pill.md +55 -0
- package/bundled-realms/pretui/components/record-pill.usage.gts +108 -0
- package/bundled-realms/pretui/components/relative-time.gts +88 -0
- package/bundled-realms/pretui/components/relative-time.md +58 -0
- package/bundled-realms/pretui/components/relative-time.usage.gts +89 -0
- package/bundled-realms/pretui/components/reorder.gts +620 -0
- package/bundled-realms/pretui/components/reorder.md +47 -0
- package/bundled-realms/pretui/components/reorder.usage.gts +171 -0
- package/bundled-realms/pretui/components/resizable.gts +2 -0
- package/bundled-realms/pretui/components/resizable.md +37 -0
- package/bundled-realms/pretui/components/resizable.usage.gts +53 -0
- package/bundled-realms/pretui/components/result-card.gts +68 -0
- package/bundled-realms/pretui/components/result-card.md +45 -0
- package/bundled-realms/pretui/components/result-card.usage.gts +29 -0
- package/bundled-realms/pretui/components/result.gts +204 -0
- package/bundled-realms/pretui/components/result.md +67 -0
- package/bundled-realms/pretui/components/result.usage.gts +85 -0
- package/bundled-realms/pretui/components/rule-row.gts +462 -0
- package/bundled-realms/pretui/components/rule-row.md +60 -0
- package/bundled-realms/pretui/components/rule-row.usage.gts +157 -0
- package/bundled-realms/pretui/components/scroll-area.gts +121 -0
- package/bundled-realms/pretui/components/scroll-area.md +59 -0
- package/bundled-realms/pretui/components/scroll-area.usage.gts +175 -0
- package/bundled-realms/pretui/components/scroll-progress.gts +222 -0
- package/bundled-realms/pretui/components/scroll-progress.md +48 -0
- package/bundled-realms/pretui/components/scroll-progress.usage.gts +162 -0
- package/bundled-realms/pretui/components/scroller.gts +323 -0
- package/bundled-realms/pretui/components/scroller.md +44 -0
- package/bundled-realms/pretui/components/scroller.usage.gts +184 -0
- package/bundled-realms/pretui/components/scrub-input.gts +691 -0
- package/bundled-realms/pretui/components/scrub-input.md +61 -0
- package/bundled-realms/pretui/components/scrub-input.usage.gts +275 -0
- package/bundled-realms/pretui/components/search-input.gts +141 -0
- package/bundled-realms/pretui/components/search-input.md +56 -0
- package/bundled-realms/pretui/components/search-input.usage.gts +91 -0
- package/bundled-realms/pretui/components/segmented-control.gts +198 -0
- package/bundled-realms/pretui/components/segmented-control.md +39 -0
- package/bundled-realms/pretui/components/segmented-control.usage.gts +66 -0
- package/bundled-realms/pretui/components/select.examples.gts +80 -0
- package/bundled-realms/pretui/components/select.gts +481 -0
- package/bundled-realms/pretui/components/select.md +71 -0
- package/bundled-realms/pretui/components/select.usage.gts +109 -0
- package/bundled-realms/pretui/components/separator.gts +2 -0
- package/bundled-realms/pretui/components/separator.md +36 -0
- package/bundled-realms/pretui/components/separator.usage.gts +32 -0
- package/bundled-realms/pretui/components/session-prep.gts +164 -0
- package/bundled-realms/pretui/components/session-prep.md +48 -0
- package/bundled-realms/pretui/components/session-prep.usage.gts +122 -0
- package/bundled-realms/pretui/components/sheet-toolbar.gts +130 -0
- package/bundled-realms/pretui/components/sheet-toolbar.md +51 -0
- package/bundled-realms/pretui/components/sheet-toolbar.usage.gts +151 -0
- package/bundled-realms/pretui/components/sheet.gts +1166 -0
- package/bundled-realms/pretui/components/sheet.md +78 -0
- package/bundled-realms/pretui/components/sheet.usage.gts +318 -0
- package/bundled-realms/pretui/components/sidebar.gts +1165 -0
- package/bundled-realms/pretui/components/sidebar.md +88 -0
- package/bundled-realms/pretui/components/sidebar.usage.gts +360 -0
- package/bundled-realms/pretui/components/signature-pad.gts +840 -0
- package/bundled-realms/pretui/components/signature-pad.md +57 -0
- package/bundled-realms/pretui/components/signature-pad.usage.gts +222 -0
- package/bundled-realms/pretui/components/skeleton.gts +46 -0
- package/bundled-realms/pretui/components/skeleton.md +56 -0
- package/bundled-realms/pretui/components/skeleton.usage.gts +56 -0
- package/bundled-realms/pretui/components/skip-link.gts +65 -0
- package/bundled-realms/pretui/components/skip-link.md +49 -0
- package/bundled-realms/pretui/components/skip-link.usage.gts +47 -0
- package/bundled-realms/pretui/components/slide-over.gts +2 -0
- package/bundled-realms/pretui/components/slide-over.md +41 -0
- package/bundled-realms/pretui/components/slide-over.usage.gts +50 -0
- package/bundled-realms/pretui/components/slider.examples.gts +61 -0
- package/bundled-realms/pretui/components/slider.gts +331 -0
- package/bundled-realms/pretui/components/slider.md +59 -0
- package/bundled-realms/pretui/components/slider.usage.gts +99 -0
- package/bundled-realms/pretui/components/sliding-highlight.gts +249 -0
- package/bundled-realms/pretui/components/sliding-highlight.md +58 -0
- package/bundled-realms/pretui/components/sliding-highlight.usage.gts +184 -0
- package/bundled-realms/pretui/components/snackbar.gts +2 -0
- package/bundled-realms/pretui/components/snackbar.md +34 -0
- package/bundled-realms/pretui/components/snackbar.usage.gts +31 -0
- package/bundled-realms/pretui/components/sonner.gts +2 -0
- package/bundled-realms/pretui/components/sonner.md +42 -0
- package/bundled-realms/pretui/components/sonner.usage.gts +43 -0
- package/bundled-realms/pretui/components/sparkline.gts +233 -0
- package/bundled-realms/pretui/components/sparkline.md +58 -0
- package/bundled-realms/pretui/components/sparkline.usage.gts +74 -0
- package/bundled-realms/pretui/components/spinner.gts +57 -0
- package/bundled-realms/pretui/components/spinner.md +49 -0
- package/bundled-realms/pretui/components/spinner.usage.gts +65 -0
- package/bundled-realms/pretui/components/split-panes.gts +69 -0
- package/bundled-realms/pretui/components/split-panes.md +54 -0
- package/bundled-realms/pretui/components/split-panes.usage.gts +171 -0
- package/bundled-realms/pretui/components/spotlight.gts +174 -0
- package/bundled-realms/pretui/components/spotlight.md +51 -0
- package/bundled-realms/pretui/components/spotlight.usage.gts +197 -0
- package/bundled-realms/pretui/components/stack-divider.gts +58 -0
- package/bundled-realms/pretui/components/stack.gts +284 -0
- package/bundled-realms/pretui/components/stack.md +81 -0
- package/bundled-realms/pretui/components/stack.usage.gts +228 -0
- package/bundled-realms/pretui/components/stacking-cards.gts +137 -0
- package/bundled-realms/pretui/components/stacking-cards.md +40 -0
- package/bundled-realms/pretui/components/stacking-cards.usage.gts +124 -0
- package/bundled-realms/pretui/components/stat.gts +216 -0
- package/bundled-realms/pretui/components/stat.md +57 -0
- package/bundled-realms/pretui/components/stat.usage.gts +16 -0
- package/bundled-realms/pretui/components/statement-table.examples.gts +185 -0
- package/bundled-realms/pretui/components/statement-table.gts +792 -0
- package/bundled-realms/pretui/components/statement-table.md +58 -0
- package/bundled-realms/pretui/components/statement-table.usage.gts +252 -0
- package/bundled-realms/pretui/components/status-chip.gts +37 -0
- package/bundled-realms/pretui/components/status-chip.md +48 -0
- package/bundled-realms/pretui/components/status-chip.usage.gts +36 -0
- package/bundled-realms/pretui/components/step-list.gts +624 -0
- package/bundled-realms/pretui/components/step-list.md +50 -0
- package/bundled-realms/pretui/components/step-list.usage.gts +166 -0
- package/bundled-realms/pretui/components/stepper.gts +201 -0
- package/bundled-realms/pretui/components/stepper.md +54 -0
- package/bundled-realms/pretui/components/stepper.usage.gts +103 -0
- package/bundled-realms/pretui/components/steps-with-media.gts +254 -0
- package/bundled-realms/pretui/components/steps-with-media.md +54 -0
- package/bundled-realms/pretui/components/steps-with-media.usage.gts +208 -0
- package/bundled-realms/pretui/components/streaming-text.gts +77 -0
- package/bundled-realms/pretui/components/streaming-text.md +55 -0
- package/bundled-realms/pretui/components/streaming-text.usage.gts +15 -0
- package/bundled-realms/pretui/components/swatch-chip.gts +104 -0
- package/bundled-realms/pretui/components/swatch-chip.md +47 -0
- package/bundled-realms/pretui/components/swatch-chip.usage.gts +21 -0
- package/bundled-realms/pretui/components/swatch.gts +141 -0
- package/bundled-realms/pretui/components/swatch.md +50 -0
- package/bundled-realms/pretui/components/swatch.usage.gts +80 -0
- package/bundled-realms/pretui/components/switch.examples.gts +53 -0
- package/bundled-realms/pretui/components/switch.gts +118 -0
- package/bundled-realms/pretui/components/switch.md +62 -0
- package/bundled-realms/pretui/components/switch.usage.gts +59 -0
- package/bundled-realms/pretui/components/table-of-contents.gts +384 -0
- package/bundled-realms/pretui/components/table-of-contents.md +75 -0
- package/bundled-realms/pretui/components/table-of-contents.usage.gts +270 -0
- package/bundled-realms/pretui/components/table.gts +158 -0
- package/bundled-realms/pretui/components/table.md +80 -0
- package/bundled-realms/pretui/components/table.usage.gts +44 -0
- package/bundled-realms/pretui/components/tabs.gts +117 -0
- package/bundled-realms/pretui/components/tabs.md +58 -0
- package/bundled-realms/pretui/components/tabs.usage.gts +94 -0
- package/bundled-realms/pretui/components/tags-input.gts +52 -0
- package/bundled-realms/pretui/components/tags-input.md +48 -0
- package/bundled-realms/pretui/components/tags-input.usage.gts +56 -0
- package/bundled-realms/pretui/components/task-row.gts +483 -0
- package/bundled-realms/pretui/components/task-row.md +48 -0
- package/bundled-realms/pretui/components/task-row.usage.gts +119 -0
- package/bundled-realms/pretui/components/terminal-animation.gts +355 -0
- package/bundled-realms/pretui/components/terminal-animation.md +49 -0
- package/bundled-realms/pretui/components/terminal-animation.usage.gts +110 -0
- package/bundled-realms/pretui/components/text-effects.gts +339 -0
- package/bundled-realms/pretui/components/text-effects.md +49 -0
- package/bundled-realms/pretui/components/text-effects.usage.gts +192 -0
- package/bundled-realms/pretui/components/text-morph.gts +292 -0
- package/bundled-realms/pretui/components/text-morph.md +45 -0
- package/bundled-realms/pretui/components/text-morph.usage.gts +117 -0
- package/bundled-realms/pretui/components/text-rotate.gts +121 -0
- package/bundled-realms/pretui/components/text-rotate.md +44 -0
- package/bundled-realms/pretui/components/text-rotate.usage.gts +73 -0
- package/bundled-realms/pretui/components/text-scramble.gts +189 -0
- package/bundled-realms/pretui/components/text-scramble.md +42 -0
- package/bundled-realms/pretui/components/text-scramble.usage.gts +80 -0
- package/bundled-realms/pretui/components/text-shimmer.gts +89 -0
- package/bundled-realms/pretui/components/text-shimmer.md +42 -0
- package/bundled-realms/pretui/components/text-shimmer.usage.gts +69 -0
- package/bundled-realms/pretui/components/textarea.gts +112 -0
- package/bundled-realms/pretui/components/textarea.md +51 -0
- package/bundled-realms/pretui/components/textarea.usage.gts +100 -0
- package/bundled-realms/pretui/components/theme-frame.gts +272 -0
- package/bundled-realms/pretui/components/theme-frame.md +48 -0
- package/bundled-realms/pretui/components/thinking.gts +431 -0
- package/bundled-realms/pretui/components/thinking.md +47 -0
- package/bundled-realms/pretui/components/thinking.usage.gts +134 -0
- package/bundled-realms/pretui/components/tilt.gts +194 -0
- package/bundled-realms/pretui/components/tilt.md +50 -0
- package/bundled-realms/pretui/components/tilt.usage.gts +174 -0
- package/bundled-realms/pretui/components/time-input.gts +583 -0
- package/bundled-realms/pretui/components/time-input.md +51 -0
- package/bundled-realms/pretui/components/time-input.usage.gts +110 -0
- package/bundled-realms/pretui/components/timeline.gts +269 -0
- package/bundled-realms/pretui/components/timeline.md +63 -0
- package/bundled-realms/pretui/components/timeline.usage.gts +180 -0
- package/bundled-realms/pretui/components/toast.gts +85 -0
- package/bundled-realms/pretui/components/toast.md +57 -0
- package/bundled-realms/pretui/components/toast.usage.gts +18 -0
- package/bundled-realms/pretui/components/toaster.gts +808 -0
- package/bundled-realms/pretui/components/toaster.md +83 -0
- package/bundled-realms/pretui/components/toaster.usage.gts +256 -0
- package/bundled-realms/pretui/components/toggle-group.gts +435 -0
- package/bundled-realms/pretui/components/toggle-group.md +59 -0
- package/bundled-realms/pretui/components/toggle-group.usage.gts +260 -0
- package/bundled-realms/pretui/components/toggle-matrix.gts +994 -0
- package/bundled-realms/pretui/components/toggle-matrix.md +44 -0
- package/bundled-realms/pretui/components/toggle-matrix.usage.gts +243 -0
- package/bundled-realms/pretui/components/toggle.gts +235 -0
- package/bundled-realms/pretui/components/toggle.md +59 -0
- package/bundled-realms/pretui/components/toggle.usage.gts +244 -0
- package/bundled-realms/pretui/components/token-input.gts +483 -0
- package/bundled-realms/pretui/components/token-input.md +50 -0
- package/bundled-realms/pretui/components/token-input.usage.gts +137 -0
- package/bundled-realms/pretui/components/token.gts +197 -0
- package/bundled-realms/pretui/components/token.md +63 -0
- package/bundled-realms/pretui/components/token.usage.gts +128 -0
- package/bundled-realms/pretui/components/toolbar.gts +62 -0
- package/bundled-realms/pretui/components/toolbar.md +50 -0
- package/bundled-realms/pretui/components/toolbar.usage.gts +78 -0
- package/bundled-realms/pretui/components/tooltip.gts +212 -0
- package/bundled-realms/pretui/components/tooltip.md +53 -0
- package/bundled-realms/pretui/components/tooltip.usage.gts +64 -0
- package/bundled-realms/pretui/components/tour.gts +436 -0
- package/bundled-realms/pretui/components/tour.md +62 -0
- package/bundled-realms/pretui/components/tour.usage.gts +70 -0
- package/bundled-realms/pretui/components/transfer.gts +2 -0
- package/bundled-realms/pretui/components/transfer.md +39 -0
- package/bundled-realms/pretui/components/transfer.usage.gts +52 -0
- package/bundled-realms/pretui/components/transmute.gts +103 -0
- package/bundled-realms/pretui/components/transmute.md +49 -0
- package/bundled-realms/pretui/components/transmute.usage.gts +16 -0
- package/bundled-realms/pretui/components/tree-select.gts +596 -0
- package/bundled-realms/pretui/components/tree-select.md +70 -0
- package/bundled-realms/pretui/components/tree-select.usage.gts +75 -0
- package/bundled-realms/pretui/components/tree.gts +532 -0
- package/bundled-realms/pretui/components/tree.md +68 -0
- package/bundled-realms/pretui/components/tree.usage.gts +278 -0
- package/bundled-realms/pretui/components/trim-bar.gts +611 -0
- package/bundled-realms/pretui/components/trim-bar.md +48 -0
- package/bundled-realms/pretui/components/trim-bar.usage.gts +112 -0
- package/bundled-realms/pretui/components/typewriter.gts +122 -0
- package/bundled-realms/pretui/components/typewriter.md +45 -0
- package/bundled-realms/pretui/components/typewriter.usage.gts +105 -0
- package/bundled-realms/pretui/components/typography.gts +379 -0
- package/bundled-realms/pretui/components/typography.md +77 -0
- package/bundled-realms/pretui/components/typography.usage.gts +52 -0
- package/bundled-realms/pretui/components/url-input.gts +130 -0
- package/bundled-realms/pretui/components/url-input.md +58 -0
- package/bundled-realms/pretui/components/url-input.usage.gts +97 -0
- package/bundled-realms/pretui/components/usage-action.gts +16 -0
- package/bundled-realms/pretui/components/usage-argument.gts +109 -0
- package/bundled-realms/pretui/components/usage-argument.md +44 -0
- package/bundled-realms/pretui/components/usage-array.gts +80 -0
- package/bundled-realms/pretui/components/usage-array.md +47 -0
- package/bundled-realms/pretui/components/usage-bool.gts +62 -0
- package/bundled-realms/pretui/components/usage-bool.md +47 -0
- package/bundled-realms/pretui/components/usage-component-arg.gts +16 -0
- package/bundled-realms/pretui/components/usage-css-variable.gts +56 -0
- package/bundled-realms/pretui/components/usage-css-variable.md +48 -0
- package/bundled-realms/pretui/components/usage-number.gts +127 -0
- package/bundled-realms/pretui/components/usage-number.md +48 -0
- package/bundled-realms/pretui/components/usage-object.gts +58 -0
- package/bundled-realms/pretui/components/usage-object.md +48 -0
- package/bundled-realms/pretui/components/usage-string.gts +89 -0
- package/bundled-realms/pretui/components/usage-string.md +46 -0
- package/bundled-realms/pretui/components/usage-yield.gts +16 -0
- package/bundled-realms/pretui/components/value-input.gts +265 -0
- package/bundled-realms/pretui/components/value-input.md +49 -0
- package/bundled-realms/pretui/components/value-input.usage.gts +176 -0
- package/bundled-realms/pretui/components/video-player.gts +80 -0
- package/bundled-realms/pretui/components/video-player.md +46 -0
- package/bundled-realms/pretui/components/video-player.usage.gts +107 -0
- package/bundled-realms/pretui/components/viewport.gts +520 -0
- package/bundled-realms/pretui/components/viewport.md +55 -0
- package/bundled-realms/pretui/components/visually-hidden.gts +49 -0
- package/bundled-realms/pretui/components/visually-hidden.md +47 -0
- package/bundled-realms/pretui/components/visually-hidden.usage.gts +27 -0
- package/bundled-realms/pretui/components/watermark.gts +141 -0
- package/bundled-realms/pretui/components/watermark.md +58 -0
- package/bundled-realms/pretui/components/watermark.usage.gts +63 -0
- package/bundled-realms/pretui/components/waveform.gts +376 -0
- package/bundled-realms/pretui/components/waveform.md +56 -0
- package/bundled-realms/pretui/components/waveform.usage.gts +131 -0
- package/bundled-realms/pretui/components/wizard.gts +677 -0
- package/bundled-realms/pretui/components/wizard.md +58 -0
- package/bundled-realms/pretui/components/wizard.usage.gts +188 -0
- package/bundled-realms/pretui/components/work-item.gts +207 -0
- package/bundled-realms/pretui/components/work-item.md +58 -0
- package/bundled-realms/pretui/components/work-item.usage.gts +103 -0
- package/bundled-realms/pretui/components/zoomable-frame.gts +541 -0
- package/bundled-realms/pretui/components/zoomable-frame.md +50 -0
- package/bundled-realms/pretui/components/zoomable-frame.usage.gts +175 -0
- package/bundled-realms/pretui/cropper/LICENSE +21 -0
- package/bundled-realms/pretui/cropper/README.md +92 -0
- package/bundled-realms/pretui/cropper/index.js +81 -0
- package/bundled-realms/pretui/data-component.gts +1161 -0
- package/bundled-realms/pretui/demo-design-layers.gts +112 -0
- package/bundled-realms/pretui/demo-design-tools.gts +463 -0
- package/bundled-realms/pretui/demo-design-value.gts +9 -0
- package/bundled-realms/pretui/demo-forms-core.gts +82 -0
- package/bundled-realms/pretui/demo-forms-expression.gts +76 -0
- package/bundled-realms/pretui/demo-forms-record.gts +16 -0
- package/bundled-realms/pretui/demo-foundations-more.gts +10 -0
- package/bundled-realms/pretui/demo-foundations.gts +8 -0
- package/bundled-realms/pretui/demo-ink-feedback.gts +12 -0
- package/bundled-realms/pretui/demo-json.gts +17 -0
- package/bundled-realms/pretui/demo-locations.ts +103 -0
- package/bundled-realms/pretui/demo-media-library.gts +101 -0
- package/bundled-realms/pretui/demo-media.gts +6 -0
- package/bundled-realms/pretui/demo-menu.gts +182 -0
- package/bundled-realms/pretui/demo-motion-core.gts +4 -0
- package/bundled-realms/pretui/demo-motion-pointer.gts +21 -0
- package/bundled-realms/pretui/demo-reading-format.gts +10 -0
- package/bundled-realms/pretui/demo-structure-dashboard.gts +212 -0
- package/bundled-realms/pretui/demo-structure-data.gts +4 -0
- package/bundled-realms/pretui/demo-structure-scroll.gts +19 -0
- package/bundled-realms/pretui/demo-structure.gts +21 -0
- package/bundled-realms/pretui/demo-surfaces-grid.gts +104 -0
- package/bundled-realms/pretui/demo-texture.gts +21 -0
- package/bundled-realms/pretui/docs/catalog-taxonomy.md +200 -0
- package/bundled-realms/pretui/docs/composites.md +13 -0
- package/bundled-realms/pretui/docs/reading.md +12 -0
- package/bundled-realms/pretui/docs/structure.md +8 -0
- package/bundled-realms/pretui/emoji-data/LICENSE +202 -0
- package/bundled-realms/pretui/emoji-data/LICENSE.data +202 -0
- package/bundled-realms/pretui/emoji-data/LICENSE.emojibase +21 -0
- package/bundled-realms/pretui/emoji-data/LICENSE.unicode +39 -0
- package/bundled-realms/pretui/emoji-data/README.md +360 -0
- package/bundled-realms/pretui/emoji-data/data.ts +45 -0
- package/bundled-realms/pretui/emoji-data/engine.ts +465 -0
- package/bundled-realms/pretui/example-gallery.gts +129 -0
- package/bundled-realms/pretui/examples-kit.gts +228 -0
- package/bundled-realms/pretui/examples-listing.gts +51 -0
- package/bundled-realms/pretui/examples.gts +584 -0
- package/bundled-realms/pretui/focus.gts +459 -0
- package/bundled-realms/pretui/gridstack/LICENSE +21 -0
- package/bundled-realms/pretui/gridstack/README.md +103 -0
- package/bundled-realms/pretui/gridstack/index.js +169 -0
- package/bundled-realms/pretui/icon-registry.gts +753 -0
- package/bundled-realms/pretui/index.json +11 -0
- package/bundled-realms/pretui/internal/agentic-chat.gts +101 -0
- package/bundled-realms/pretui/internal/blocks.gts +35 -0
- package/bundled-realms/pretui/internal/choice-cards.gts +258 -0
- package/bundled-realms/pretui/internal/color-fixtures.gts +3 -0
- package/bundled-realms/pretui/internal/composites-fixtures.gts +16 -0
- package/bundled-realms/pretui/internal/corner-mark.gts +83 -0
- package/bundled-realms/pretui/internal/design-tools.gts +881 -0
- package/bundled-realms/pretui/internal/extras.gts +31 -0
- package/bundled-realms/pretui/internal/feedback.gts +27 -0
- package/bundled-realms/pretui/internal/file-intake-fixtures.gts +17 -0
- package/bundled-realms/pretui/internal/file-intake.gts +193 -0
- package/bundled-realms/pretui/internal/forms-core.gts +394 -0
- package/bundled-realms/pretui/internal/forms-expression.gts +837 -0
- package/bundled-realms/pretui/internal/forms-picker-fixtures.gts +10 -0
- package/bundled-realms/pretui/internal/forms-picker.gts +129 -0
- package/bundled-realms/pretui/internal/forms-record.gts +173 -0
- package/bundled-realms/pretui/internal/freestyle.gts +117 -0
- package/bundled-realms/pretui/internal/ink.gts +25 -0
- package/bundled-realms/pretui/internal/json-tree.gts +526 -0
- package/bundled-realms/pretui/internal/keep-style.gts +168 -0
- package/bundled-realms/pretui/internal/media-assets.gts +10 -0
- package/bundled-realms/pretui/internal/media-library.gts +14 -0
- package/bundled-realms/pretui/internal/media-viewer.gts +322 -0
- package/bundled-realms/pretui/internal/media-wave.gts +270 -0
- package/bundled-realms/pretui/internal/menu.gts +522 -0
- package/bundled-realms/pretui/internal/money-fixtures.gts +6 -0
- package/bundled-realms/pretui/internal/money.gts +477 -0
- package/bundled-realms/pretui/internal/motion-core.gts +54 -0
- package/bundled-realms/pretui/internal/motion-pointer.gts +234 -0
- package/bundled-realms/pretui/internal/overlay-confirm.gts +35 -0
- package/bundled-realms/pretui/internal/overlay.gts +291 -0
- package/bundled-realms/pretui/internal/reading-extras.gts +56 -0
- package/bundled-realms/pretui/internal/reading-format.gts +232 -0
- package/bundled-realms/pretui/internal/reading-listing.gts +232 -0
- package/bundled-realms/pretui/internal/structure-chart.gts +414 -0
- package/bundled-realms/pretui/internal/structure-dashboard.gts +503 -0
- package/bundled-realms/pretui/internal/structure-flow.gts +48 -0
- package/bundled-realms/pretui/internal/structure-layout-fixtures.gts +36 -0
- package/bundled-realms/pretui/internal/structure-layout.gts +99 -0
- package/bundled-realms/pretui/internal/structure-morph.gts +140 -0
- package/bundled-realms/pretui/internal/structure-scenes.gts +25 -0
- package/bundled-realms/pretui/internal/structure-scroll.gts +72 -0
- package/bundled-realms/pretui/internal/structure-shell-fixtures.gts +25 -0
- package/bundled-realms/pretui/internal/surfaces-canvas-fixtures.gts +5 -0
- package/bundled-realms/pretui/internal/surfaces-canvas.gts +283 -0
- package/bundled-realms/pretui/internal/texture.gts +81 -0
- package/bundled-realms/pretui/internal/toggle-controls-fixtures.gts +7 -0
- package/bundled-realms/pretui/internal/toggle-controls.gts +81 -0
- package/bundled-realms/pretui/json-model.ts +1981 -0
- package/bundled-realms/pretui/media-chrome/LICENSE +19 -0
- package/bundled-realms/pretui/media-chrome/README.md +111 -0
- package/bundled-realms/pretui/media-chrome/index.js +1647 -0
- package/bundled-realms/pretui/media-examples.gts +315 -0
- package/bundled-realms/pretui/model-viewer/LICENSE +202 -0
- package/{LICENSE → bundled-realms/pretui/model-viewer/LICENSE-gainmap-js} +1 -1
- package/bundled-realms/pretui/model-viewer/LICENSE-lit +28 -0
- package/bundled-realms/pretui/model-viewer/LICENSE-three +21 -0
- package/bundled-realms/pretui/model-viewer/NOTICE +67 -0
- package/bundled-realms/pretui/model-viewer/README.md +122 -0
- package/bundled-realms/pretui/model-viewer/index.js +6413 -0
- package/bundled-realms/pretui/package.json +51 -0
- package/bundled-realms/pretui/photoswipe/LICENSE +21 -0
- package/bundled-realms/pretui/photoswipe/README.md +91 -0
- package/bundled-realms/pretui/photoswipe/index.js +149 -0
- package/bundled-realms/pretui/photoswipe/style.ts +465 -0
- package/bundled-realms/pretui/plot/LICENSE +13 -0
- package/bundled-realms/pretui/plot/LICENSE.d3 +13 -0
- package/bundled-realms/pretui/plot/LICENSE.interval-tree-1d +22 -0
- package/bundled-realms/pretui/plot/LICENSE.isoformat +13 -0
- package/bundled-realms/pretui/plot/README.md +35 -0
- package/bundled-realms/pretui/plot/index.d.ts +31 -0
- package/bundled-realms/pretui/plot/index.js +449 -0
- package/bundled-realms/pretui/pretui-component.gts +1336 -0
- package/bundled-realms/pretui/pretui-css.gts +380 -0
- package/bundled-realms/pretui/pretui-primitives.gts +162 -0
- package/bundled-realms/pretui/qrcode/LICENSE +34 -0
- package/bundled-realms/pretui/qrcode/README.md +87 -0
- package/bundled-realms/pretui/qrcode/index.js +35 -0
- package/bundled-realms/pretui/realm.json +16 -0
- package/bundled-realms/pretui/registry.ts +40 -0
- package/bundled-realms/pretui/sigpad/LICENSE +21 -0
- package/bundled-realms/pretui/sigpad/README.md +103 -0
- package/bundled-realms/pretui/sigpad/index.js +30 -0
- package/bundled-realms/pretui/structure-dashboard-css.ts +166 -0
- package/bundled-realms/pretui/surfaces/README.md +37 -0
- package/bundled-realms/pretui/surfaces/canvas/LICENSE.d3 +168 -0
- package/bundled-realms/pretui/surfaces/canvas/LICENSE.xyflow +21 -0
- package/bundled-realms/pretui/surfaces/canvas/index.js +25420 -0
- package/bundled-realms/pretui/surfaces/grid/LICENSE.tanstack +50 -0
- package/bundled-realms/pretui/surfaces/grid/index.js +21478 -0
- package/bundled-realms/pretui/surfaces/layout/index.js +9036 -0
- package/bundled-realms/pretui/surfaces-canvas-css.ts +1640 -0
- package/bundled-realms/pretui/surfaces-canvas-layout.ts +607 -0
- package/bundled-realms/pretui/tsconfig.json +54 -0
- package/bundled-realms/pretui/wavesurfer/LICENSE +29 -0
- package/bundled-realms/pretui/wavesurfer/README.md +85 -0
- package/bundled-realms/pretui/wavesurfer/index.js +184 -0
- package/bundled-realms/pretui/zxcvbn/LICENSE +21 -0
- package/bundled-realms/pretui/zxcvbn/README.md +192 -0
- package/bundled-realms/pretui/zxcvbn/index.d.ts +28 -0
- package/bundled-realms/pretui/zxcvbn/index.js +5931 -0
- package/bundled-test-harness/index.html +1 -1
- package/bundled-test-harness/tests/index.html +1 -1
- package/dist/api.js +1 -1
- package/dist/index.js +33 -33
- package/package.json +1 -1
- package/src/lib/test-engine.ts +14 -4
|
@@ -0,0 +1,1200 @@
|
|
|
1
|
+
// Pretui — Menubar: the application menu bar (File / Edit / View).
|
|
2
|
+
//
|
|
3
|
+
// ── Why this is not a `Menu` with a horizontal trigger row ───────────────
|
|
4
|
+
// `menu.gts` ships the WAI-ARIA **menu button** pattern: one trigger, one
|
|
5
|
+
// dropdown, Up/Down between siblings, Right to *enter* a submenu. A menubar
|
|
6
|
+
// is a different APG pattern with a different axis and a different focus
|
|
7
|
+
// story, and the differences are behavioural rather than visual:
|
|
8
|
+
//
|
|
9
|
+
// * **The axis flips.** Left/Right move between top-level items; Down opens.
|
|
10
|
+
// * **One tab stop for the whole bar**, always. A menu button has a trigger
|
|
11
|
+
// that is part of the page's ordinary tab order; a menubar is a composite,
|
|
12
|
+
// so Tab leaves it rather than walking it.
|
|
13
|
+
// * **Left/Right stay live while a menu is open** — they close it, step to
|
|
14
|
+
// the adjacent top-level item and open THAT one, with focus landing back
|
|
15
|
+
// on the bar. This single behaviour is what makes a real application menu
|
|
16
|
+
// bar feel like one, and it has no counterpart in a dropdown.
|
|
17
|
+
// * **Hover is asymmetric.** Before anything is open, hovering a top-level
|
|
18
|
+
// item does nothing at all; once the bar is "active" hovering another item
|
|
19
|
+
// switches to it *immediately*, with no dwell delay. A menubar that opened
|
|
20
|
+
// on hover would fire every time the pointer crossed the top of a window;
|
|
21
|
+
// one that kept a dwell delay after opening would feel broken.
|
|
22
|
+
//
|
|
23
|
+
// Everything the two patterns AGREE about is shared rather than re-written:
|
|
24
|
+
// the `MenuNode` taxonomy, the row model, the panel markup and its whole
|
|
25
|
+
// stylesheet (`MenuPanel`), the shortcut faces, the safe triangle, the roving
|
|
26
|
+
// tabindex, the owned timers and the type-ahead buffer. A command object
|
|
27
|
+
// written for `Menu` renders unchanged in `Menubar` and in `CommandPalette`.
|
|
28
|
+
//
|
|
29
|
+
// ── Ported, not vendored: accessible-menu 4.4.0 (ISC, Nick Milton) ───────
|
|
30
|
+
// `src/menubar.js` + `src/_baseMenu.js` are the specification this follows —
|
|
31
|
+
// specifically their keyup state machine and the edge cases inside it (the
|
|
32
|
+
// "previous child was open" carry rule on Left/Right, `preview()` vs `open()`
|
|
33
|
+
// as two different things, and `hoverType: 'dynamic'`'s `hasOpened` gate,
|
|
34
|
+
// which is the hover asymmetry above). The library itself is not usable here:
|
|
35
|
+
// it attaches to *existing* DOM and mutates it, which fights Glimmer for
|
|
36
|
+
// ownership of every element it touches; and it would be a second menu engine
|
|
37
|
+
// beside the one `menu.gts` already is. Taking the state machine as a spec
|
|
38
|
+
// costs nothing and keeps one engine.
|
|
39
|
+
//
|
|
40
|
+
// Deviations from the reference, with reasons, are in `menubarKey` below.
|
|
41
|
+
//
|
|
42
|
+
// Realm laws observed: no `Date.now()`/`Math.random()`; every `setTimeout`
|
|
43
|
+
// belongs to an `OwnedTimers` set an `ember-modifier` adopts and releases, and
|
|
44
|
+
// no timer re-arms itself; element references are plain untracked fields
|
|
45
|
+
// written from modifier bodies, never `@tracked` (a tracked property read and
|
|
46
|
+
// written in one computation is a backtracking re-render).
|
|
47
|
+
import Component from '@glimmer/component';
|
|
48
|
+
import { tracked } from '@glimmer/tracking';
|
|
49
|
+
import { guidFor } from '@ember/object/internals';
|
|
50
|
+
// type-only gap: 'ember-modifier' resolves at realm runtime; glint can't see
|
|
51
|
+
// it here (accepted parse baseline, same as menu.gts / focus.gts)
|
|
52
|
+
import { modifier } from 'ember-modifier';
|
|
53
|
+
import type { PopupPlacement } from '../internal/overlay';
|
|
54
|
+
import { MenuPanel } from './menu-panel';
|
|
55
|
+
import { buildMenuLevel, detectShortcutPlatform } from '../internal/menu';
|
|
56
|
+
import type { LeafNode, MenuEntry, MenuLevel, MenuRow, ShortcutPlatform, SubmenuNode } from '../internal/menu';
|
|
57
|
+
import {
|
|
58
|
+
OwnedTimers,
|
|
59
|
+
PointerTrack,
|
|
60
|
+
TypeaheadBuffer,
|
|
61
|
+
focusWhen,
|
|
62
|
+
listen,
|
|
63
|
+
listenDocument,
|
|
64
|
+
listenDocumentCapture,
|
|
65
|
+
ownsTimers,
|
|
66
|
+
rovingTabindex,
|
|
67
|
+
tracksPointer,
|
|
68
|
+
typeaheadIndex,
|
|
69
|
+
} from '../focus';
|
|
70
|
+
import type { SafeEdge } from '../focus';
|
|
71
|
+
|
|
72
|
+
// ── The keyboard state machine, as pure functions ────────────────────────
|
|
73
|
+
//
|
|
74
|
+
// This is where menubar implementations go wrong, so it is written as data in
|
|
75
|
+
// and data out: no DOM, no component, no timers. Given (where focus is, what
|
|
76
|
+
// is open, which key) it returns (where focus goes, what is open, what the
|
|
77
|
+
// component must do). `menubar.test.gts` drives the whole transition table
|
|
78
|
+
// through it, which is both faster and far more searching than clicking a
|
|
79
|
+
// rendered bar — and it cannot hang.
|
|
80
|
+
|
|
81
|
+
/** Where keyboard focus lives. */
|
|
82
|
+
export type BarWhere = 'bar' | 'menu';
|
|
83
|
+
|
|
84
|
+
export interface BarState {
|
|
85
|
+
/** index of the top-level item holding the bar's single tab stop */
|
|
86
|
+
index: number;
|
|
87
|
+
/** index of the top-level item whose menu is displayed, or -1 for none.
|
|
88
|
+
* Note `open` may be set while `where` is still `'bar'`: that is the
|
|
89
|
+
* "preview" state a menu bar spends most of its open life in — the menu is
|
|
90
|
+
* down, focus is still on its title. accessible-menu models it as
|
|
91
|
+
* `preview()` vs `open()`; conflating the two is the usual bug. */
|
|
92
|
+
open: number;
|
|
93
|
+
where: BarWhere;
|
|
94
|
+
/** depth of the focused row: 0 on the bar, 1 in a top-level item's own
|
|
95
|
+
* menu, 2+ inside a nested submenu */
|
|
96
|
+
depth: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface BarContext {
|
|
100
|
+
/** number of top-level items */
|
|
101
|
+
count: number;
|
|
102
|
+
/** whether top-level item `index` opens a menu AND is not disabled */
|
|
103
|
+
hasMenu: (index: number) => boolean;
|
|
104
|
+
/** whether the row focused inside a menu opens a submenu of its own.
|
|
105
|
+
* Consulted only when `where === 'menu'`. */
|
|
106
|
+
rowHasMenu: boolean;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export type BarEffect =
|
|
110
|
+
/** the state is the whole answer */
|
|
111
|
+
| 'none'
|
|
112
|
+
/** move focus into item `index`'s menu, first row */
|
|
113
|
+
| 'enterFirst'
|
|
114
|
+
/** ... last row */
|
|
115
|
+
| 'enterLast'
|
|
116
|
+
/** open the focused row's own submenu and focus its first row */
|
|
117
|
+
| 'openRow'
|
|
118
|
+
/** pop one submenu level, focus the parent row */
|
|
119
|
+
| 'closeLevel'
|
|
120
|
+
/** activate the focused row, then close */
|
|
121
|
+
| 'activate'
|
|
122
|
+
/** close everything and let focus leave the bar */
|
|
123
|
+
| 'leave';
|
|
124
|
+
|
|
125
|
+
export interface BarResult {
|
|
126
|
+
state: BarState;
|
|
127
|
+
/** the component should `preventDefault` */
|
|
128
|
+
handled: boolean;
|
|
129
|
+
effect: BarEffect;
|
|
130
|
+
/** the key belongs to the LEVEL machine (sibling arrows, Home/End inside a
|
|
131
|
+
* panel, type-ahead) rather than to the bar */
|
|
132
|
+
inner: boolean;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function ignored(state: BarState): BarResult {
|
|
136
|
+
return { state, handled: false, effect: 'none', inner: false };
|
|
137
|
+
}
|
|
138
|
+
function inner(state: BarState): BarResult {
|
|
139
|
+
return { state, handled: false, effect: 'none', inner: true };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Move the bar's focus to `next`, carrying openness.
|
|
144
|
+
*
|
|
145
|
+
* The carry rule IS the menubar: once any menu is displayed, stepping along
|
|
146
|
+
* the bar keeps a menu displayed, so File → Edit → View reads as one
|
|
147
|
+
* continuous surface rather than as three separate openings. When nothing is
|
|
148
|
+
* open, stepping along the bar opens nothing. A landing item with no menu of
|
|
149
|
+
* its own closes whatever was open, exactly as accessible-menu's
|
|
150
|
+
* `closeChildren()` branch does.
|
|
151
|
+
*/
|
|
152
|
+
export function barCarry(
|
|
153
|
+
state: BarState,
|
|
154
|
+
next: number,
|
|
155
|
+
ctx: BarContext,
|
|
156
|
+
): BarState {
|
|
157
|
+
let active = state.open >= 0 || state.where === 'menu';
|
|
158
|
+
return {
|
|
159
|
+
index: next,
|
|
160
|
+
open: active && ctx.hasMenu(next) ? next : -1,
|
|
161
|
+
where: 'bar',
|
|
162
|
+
depth: 0,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The whole menubar keyboard contract.
|
|
168
|
+
*
|
|
169
|
+
* Deviations from accessible-menu 4.4.0, each deliberate:
|
|
170
|
+
*
|
|
171
|
+
* 1. **Escape inside a NESTED submenu closes one level**, not the whole tree.
|
|
172
|
+
* The reference calls `rootMenu.closeChildren()` from any depth, which
|
|
173
|
+
* throws away every level at once. APG's rule is "closes submenu, moves
|
|
174
|
+
* focus to parent menu item", and one-level-per-Escape is also what
|
|
175
|
+
* `Menu` already does — so Escape means the same thing everywhere in the
|
|
176
|
+
* kit. At depth 1 the two agree exactly: the menu closes and focus
|
|
177
|
+
* returns to its top-level item, staying in the bar.
|
|
178
|
+
* 2. **Type-ahead wraps.** The reference searches forward from the current
|
|
179
|
+
* item and stops at the end of the list, so typing "f" while on the last
|
|
180
|
+
* item finds nothing. `typeaheadIndex` wraps and supports a multi-character
|
|
181
|
+
* buffer, which is the APG behaviour and is already shared with `Menu`,
|
|
182
|
+
* `Tree` and the palette.
|
|
183
|
+
* 3. **No `requestAnimationFrame` before focusing a submenu's first row.**
|
|
184
|
+
* The reference defers focus a frame so the panel is visually open first.
|
|
185
|
+
* Here the panel and the focus target render in the same Glimmer pass, and
|
|
186
|
+
* an unowned rAF is a realm-law violation besides.
|
|
187
|
+
* 4. **A disabled top-level item has no menu** (`ctx.hasMenu` returns false),
|
|
188
|
+
* so Down/Enter do nothing on it and the carry rule closes rather than
|
|
189
|
+
* opens. It stays focusable and announced — `aria-disabled`, never the
|
|
190
|
+
* `disabled` attribute.
|
|
191
|
+
*/
|
|
192
|
+
export function menubarKey(
|
|
193
|
+
state: BarState,
|
|
194
|
+
key: string,
|
|
195
|
+
ctx: BarContext,
|
|
196
|
+
): BarResult {
|
|
197
|
+
let count = ctx.count;
|
|
198
|
+
if (count <= 0) {
|
|
199
|
+
return ignored(state);
|
|
200
|
+
}
|
|
201
|
+
let onBar = state.where === 'bar';
|
|
202
|
+
|
|
203
|
+
if (key === 'Tab') {
|
|
204
|
+
// Tab is never preventDefault'ed: the bar closes and the browser's own
|
|
205
|
+
// tab order continues from wherever focus already is.
|
|
206
|
+
return {
|
|
207
|
+
state: { index: state.index, open: -1, where: 'bar', depth: 0 },
|
|
208
|
+
handled: false,
|
|
209
|
+
effect: 'leave',
|
|
210
|
+
inner: false,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (key === 'ArrowRight' || key === 'ArrowLeft' || key === 'Home' || key === 'End') {
|
|
215
|
+
if (onBar) {
|
|
216
|
+
let next =
|
|
217
|
+
key === 'ArrowRight'
|
|
218
|
+
? (state.index + 1) % count
|
|
219
|
+
: key === 'ArrowLeft'
|
|
220
|
+
? (state.index - 1 + count) % count
|
|
221
|
+
: key === 'Home'
|
|
222
|
+
? 0
|
|
223
|
+
: count - 1;
|
|
224
|
+
return {
|
|
225
|
+
state: barCarry(state, next, ctx),
|
|
226
|
+
handled: true,
|
|
227
|
+
effect: 'none',
|
|
228
|
+
inner: false,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Inside a menu, Home/End belong to the level, not to the bar.
|
|
232
|
+
if (key === 'Home' || key === 'End') {
|
|
233
|
+
return inner(state);
|
|
234
|
+
}
|
|
235
|
+
if (key === 'ArrowRight') {
|
|
236
|
+
if (ctx.rowHasMenu) {
|
|
237
|
+
return {
|
|
238
|
+
state: { ...state, depth: state.depth + 1 },
|
|
239
|
+
handled: true,
|
|
240
|
+
effect: 'openRow',
|
|
241
|
+
inner: false,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// A leaf: Right leaves the menu tree entirely, steps to the next
|
|
245
|
+
// top-level item and opens it — with focus back on the bar.
|
|
246
|
+
return {
|
|
247
|
+
state: barCarry(state, (state.index + 1) % count, ctx),
|
|
248
|
+
handled: true,
|
|
249
|
+
effect: 'none',
|
|
250
|
+
inner: false,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// ArrowLeft
|
|
254
|
+
if (state.depth > 1) {
|
|
255
|
+
// A nested level closes just itself; the bar does not move.
|
|
256
|
+
return {
|
|
257
|
+
state: { ...state, depth: state.depth - 1 },
|
|
258
|
+
handled: true,
|
|
259
|
+
effect: 'closeLevel',
|
|
260
|
+
inner: false,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
state: barCarry(state, (state.index - 1 + count) % count, ctx),
|
|
265
|
+
handled: true,
|
|
266
|
+
effect: 'none',
|
|
267
|
+
inner: false,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (key === 'ArrowDown' || key === 'ArrowUp') {
|
|
272
|
+
if (!onBar) {
|
|
273
|
+
// sibling movement within the open level
|
|
274
|
+
return inner(state);
|
|
275
|
+
}
|
|
276
|
+
if (!ctx.hasMenu(state.index)) {
|
|
277
|
+
return ignored(state);
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
state: { index: state.index, open: state.index, where: 'menu', depth: 1 },
|
|
281
|
+
handled: true,
|
|
282
|
+
// Down lands on the first item, Up on the last — the one place the two
|
|
283
|
+
// vertical arrows do different things rather than mirroring.
|
|
284
|
+
effect: key === 'ArrowDown' ? 'enterFirst' : 'enterLast',
|
|
285
|
+
inner: false,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (key === 'Enter' || key === ' ') {
|
|
290
|
+
if (onBar) {
|
|
291
|
+
if (ctx.hasMenu(state.index)) {
|
|
292
|
+
return {
|
|
293
|
+
state: {
|
|
294
|
+
index: state.index,
|
|
295
|
+
open: state.index,
|
|
296
|
+
where: 'menu',
|
|
297
|
+
depth: 1,
|
|
298
|
+
},
|
|
299
|
+
handled: true,
|
|
300
|
+
effect: 'enterFirst',
|
|
301
|
+
inner: false,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
return { state, handled: true, effect: 'activate', inner: false };
|
|
305
|
+
}
|
|
306
|
+
if (ctx.rowHasMenu) {
|
|
307
|
+
return {
|
|
308
|
+
state: { ...state, depth: state.depth + 1 },
|
|
309
|
+
handled: true,
|
|
310
|
+
effect: 'openRow',
|
|
311
|
+
inner: false,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
state: { index: state.index, open: -1, where: 'bar', depth: 0 },
|
|
316
|
+
handled: true,
|
|
317
|
+
effect: 'activate',
|
|
318
|
+
inner: false,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (key === 'Escape') {
|
|
323
|
+
if (onBar) {
|
|
324
|
+
if (state.open < 0) {
|
|
325
|
+
// Nothing is open: Escape is not the bar's to take, so a host surface
|
|
326
|
+
// that listens for it still hears it.
|
|
327
|
+
return ignored(state);
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
state: { ...state, open: -1 },
|
|
331
|
+
handled: true,
|
|
332
|
+
effect: 'none',
|
|
333
|
+
inner: false,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
if (state.depth > 1) {
|
|
337
|
+
return {
|
|
338
|
+
state: { ...state, depth: state.depth - 1 },
|
|
339
|
+
handled: true,
|
|
340
|
+
effect: 'closeLevel',
|
|
341
|
+
inner: false,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
return {
|
|
345
|
+
state: { index: state.index, open: -1, where: 'bar', depth: 0 },
|
|
346
|
+
handled: true,
|
|
347
|
+
effect: 'none',
|
|
348
|
+
inner: false,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Everything else — letters included — is the caller's type-ahead.
|
|
353
|
+
return ignored(state);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ── The component ────────────────────────────────────────────────────────
|
|
357
|
+
|
|
358
|
+
export interface MenubarSignature {
|
|
359
|
+
Args: {
|
|
360
|
+
/** the bar's contents. Exactly `Menu`'s arg type: a `SubmenuNode` becomes
|
|
361
|
+
* a File/Edit/View menu, a `CommandNode` becomes a bare command in the
|
|
362
|
+
* bar (a "Help" that acts on click). Sections and `'---'` carry no
|
|
363
|
+
* meaning at the top level of a bar and contribute no items. */
|
|
364
|
+
items: MenuEntry[];
|
|
365
|
+
/** accessible name for the bar (default 'Main menu'). A page with more
|
|
366
|
+
* than one menubar needs these to differ. */
|
|
367
|
+
label?: string;
|
|
368
|
+
/** fires after any item activates, alongside the node's own onSelect */
|
|
369
|
+
onSelect?: (node: LeafNode) => void;
|
|
370
|
+
/** ms of hover before a NESTED submenu opens (default 110). Top-level
|
|
371
|
+
* switching is never delayed — see `hoverBar`. */
|
|
372
|
+
hoverDelay?: number;
|
|
373
|
+
/** ms the safe triangle keeps deferring a sibling's hover (default 300) */
|
|
374
|
+
safeDelay?: number;
|
|
375
|
+
/** force the shortcut platform (docs pages use it) */
|
|
376
|
+
platform?: ShortcutPlatform;
|
|
377
|
+
};
|
|
378
|
+
Element: HTMLElement;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
export class Menubar extends Component<MenubarSignature> {
|
|
382
|
+
private guid = guidFor(this);
|
|
383
|
+
private timers = new OwnedTimers();
|
|
384
|
+
private track = new PointerTrack();
|
|
385
|
+
private typeahead = new TypeaheadBuffer(this.timers);
|
|
386
|
+
private elements = new Map<string, HTMLElement>();
|
|
387
|
+
private barElements = new Map<number, HTMLElement>();
|
|
388
|
+
private hoverHandle: ReturnType<typeof setTimeout> | undefined;
|
|
389
|
+
private lastDeferStamp = -1;
|
|
390
|
+
/** the level the type-ahead buffer belongs to; changing level resets it */
|
|
391
|
+
private lastTypeLevel = -1;
|
|
392
|
+
/**
|
|
393
|
+
* True from the moment a menu first opens until the bar closes completely.
|
|
394
|
+
* The gate for the hover asymmetry: an inactive bar ignores hover entirely,
|
|
395
|
+
* an active one switches on it instantly. Deliberately NOT `@tracked` — it
|
|
396
|
+
* is read only from event handlers and never renders anything, and
|
|
397
|
+
* accessible-menu's `hasOpened` plays the same role.
|
|
398
|
+
*/
|
|
399
|
+
private barActive = false;
|
|
400
|
+
// Untracked for the reason menu.gts documents: written from inside a
|
|
401
|
+
// modifier body and read from another modifier's arguments. A tracked
|
|
402
|
+
// property read and written in one computation is a backtracking
|
|
403
|
+
// re-render, which corrupts the renderer for the rest of the page.
|
|
404
|
+
private hostEl: HTMLElement | undefined;
|
|
405
|
+
|
|
406
|
+
@tracked private index = 0;
|
|
407
|
+
/** top-level index whose menu is displayed, or -1 */
|
|
408
|
+
@tracked private openIndex = -1;
|
|
409
|
+
/** keys of rows INSIDE the open menu whose own submenus are open */
|
|
410
|
+
@tracked private openPath: string[] = [];
|
|
411
|
+
/** the focused row's key, or undefined when focus is on the bar itself */
|
|
412
|
+
@tracked private focusKey: string | undefined;
|
|
413
|
+
/** true only while the keyboard or a hover is driving — `focusWhen` never
|
|
414
|
+
* steals focus on a plain re-render */
|
|
415
|
+
@tracked private navigating = false;
|
|
416
|
+
@tracked private altHeld = false;
|
|
417
|
+
|
|
418
|
+
get platform(): ShortcutPlatform {
|
|
419
|
+
return this.args.platform ?? detectShortcutPlatform();
|
|
420
|
+
}
|
|
421
|
+
get barLabel(): string {
|
|
422
|
+
return this.args.label ?? 'Main menu';
|
|
423
|
+
}
|
|
424
|
+
get isOpen(): boolean {
|
|
425
|
+
return this.openIndex >= 0;
|
|
426
|
+
}
|
|
427
|
+
private get hoverDelay(): number {
|
|
428
|
+
return this.args.hoverDelay ?? 110;
|
|
429
|
+
}
|
|
430
|
+
private get safeDelay(): number {
|
|
431
|
+
return this.args.safeDelay ?? 300;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// ── Levels ────────────────────────────────────────────────────────────
|
|
435
|
+
|
|
436
|
+
/** The bar itself, built by the SAME transform the panels use — so a
|
|
437
|
+
* top-level item gets the ellipsis convention, the platform shortcut face,
|
|
438
|
+
* the disabled rule and the icon lookup for free, and cannot drift from the
|
|
439
|
+
* rows below it. */
|
|
440
|
+
get topRows(): MenuRow[] {
|
|
441
|
+
return buildMenuLevel(this.args.items ?? [], {
|
|
442
|
+
depth: 0,
|
|
443
|
+
prefix: 'b',
|
|
444
|
+
label: this.barLabel,
|
|
445
|
+
guid: this.guid,
|
|
446
|
+
altHeld: this.altHeld,
|
|
447
|
+
platform: this.platform,
|
|
448
|
+
}).rows;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/** The open menu, plus one level per open nested submenu. `levels[i].depth`
|
|
452
|
+
* is `i + 1`: depth 0 is the bar. */
|
|
453
|
+
get levels(): MenuLevel[] {
|
|
454
|
+
let top = this.topRows[this.openIndex];
|
|
455
|
+
if (this.openIndex < 0 || !top || !top.hasSubmenu) {
|
|
456
|
+
return [];
|
|
457
|
+
}
|
|
458
|
+
let out: MenuLevel[] = [
|
|
459
|
+
buildMenuLevel((top.node as SubmenuNode).items ?? [], {
|
|
460
|
+
depth: 1,
|
|
461
|
+
prefix: 'm' + this.openIndex,
|
|
462
|
+
label: top.label,
|
|
463
|
+
guid: this.guid,
|
|
464
|
+
altHeld: this.altHeld,
|
|
465
|
+
platform: this.platform,
|
|
466
|
+
}),
|
|
467
|
+
];
|
|
468
|
+
for (let i = 0; i < this.openPath.length; i++) {
|
|
469
|
+
let parentKey = this.openPath[i];
|
|
470
|
+
let parent = out[i]?.rows.find((row) => row.key === parentKey);
|
|
471
|
+
if (!parent || !parent.hasSubmenu) {
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
out.push(
|
|
475
|
+
buildMenuLevel((parent.node as SubmenuNode).items ?? [], {
|
|
476
|
+
depth: i + 2,
|
|
477
|
+
prefix: parentKey,
|
|
478
|
+
label: parent.label,
|
|
479
|
+
parentKey,
|
|
480
|
+
guid: this.guid,
|
|
481
|
+
altHeld: this.altHeld,
|
|
482
|
+
platform: this.platform,
|
|
483
|
+
}),
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
return out;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
private get focusLevel(): MenuLevel | undefined {
|
|
490
|
+
let key = this.focusKey;
|
|
491
|
+
if (!key) {
|
|
492
|
+
return undefined;
|
|
493
|
+
}
|
|
494
|
+
return this.levels.find((level) =>
|
|
495
|
+
level.rows.some((row) => row.key === key),
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
private get focusRow(): MenuRow | undefined {
|
|
500
|
+
return this.rowFor(this.focusKey);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
private rowFor(key: string | undefined): MenuRow | undefined {
|
|
504
|
+
if (!key) {
|
|
505
|
+
return undefined;
|
|
506
|
+
}
|
|
507
|
+
for (let level of this.levels) {
|
|
508
|
+
let hit = level.rows.find((row) => row.key === key);
|
|
509
|
+
if (hit) {
|
|
510
|
+
return hit;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return undefined;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// ── Template predicates ───────────────────────────────────────────────
|
|
517
|
+
|
|
518
|
+
/** The single tab stop. When focus is inside a panel the focused ROW holds
|
|
519
|
+
* it, so the bar and its menus never present two tab stops at once. */
|
|
520
|
+
barIsTabStop = (i: number): boolean =>
|
|
521
|
+
i === this.index && this.focusKey === undefined;
|
|
522
|
+
barIsFocusTarget = (i: number): boolean =>
|
|
523
|
+
this.navigating && this.focusKey === undefined && i === this.index;
|
|
524
|
+
barIsActive = (i: number): boolean => i === this.index;
|
|
525
|
+
barIsOpen = (i: number): string | undefined => {
|
|
526
|
+
let row = this.topRows[i];
|
|
527
|
+
if (!row?.hasSubmenu) {
|
|
528
|
+
return undefined;
|
|
529
|
+
}
|
|
530
|
+
return this.openIndex === i ? 'true' : 'false';
|
|
531
|
+
};
|
|
532
|
+
barPopup = (i: number): string | undefined =>
|
|
533
|
+
this.topRows[i]?.hasSubmenu ? 'menu' : undefined;
|
|
534
|
+
|
|
535
|
+
anchorFor = (depth: number): HTMLElement | undefined =>
|
|
536
|
+
depth <= 1
|
|
537
|
+
? this.barElements.get(this.openIndex)
|
|
538
|
+
: this.elements.get(this.openPath[depth - 2]);
|
|
539
|
+
|
|
540
|
+
placementFor = (depth: number): PopupPlacement =>
|
|
541
|
+
depth <= 1 ? 'bottom-start' : 'right-start';
|
|
542
|
+
|
|
543
|
+
distanceFor = (depth: number): number => (depth <= 1 ? 4 : 2);
|
|
544
|
+
|
|
545
|
+
itemFor = (key: string | undefined): HTMLElement | undefined =>
|
|
546
|
+
key ? this.elements.get(key) : undefined;
|
|
547
|
+
|
|
548
|
+
// ── Element registries (plain Maps; never tracked) ────────────────────
|
|
549
|
+
|
|
550
|
+
captureHost = modifier((el: HTMLElement) => {
|
|
551
|
+
this.hostEl = el;
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
captureBarItem = modifier((el: HTMLElement, [i]: [number]) => {
|
|
555
|
+
this.barElements.set(i, el);
|
|
556
|
+
return () => {
|
|
557
|
+
if (this.barElements.get(i) === el) {
|
|
558
|
+
this.barElements.delete(i);
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
onItemElement = (key: string, el: HTMLElement | undefined) => {
|
|
564
|
+
if (el) {
|
|
565
|
+
this.elements.set(key, el);
|
|
566
|
+
} else {
|
|
567
|
+
this.elements.delete(key);
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
|
|
571
|
+
onEdge = (edge: SafeEdge | undefined) => {
|
|
572
|
+
this.track.edge = edge;
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
// ── Open / close ──────────────────────────────────────────────────────
|
|
576
|
+
|
|
577
|
+
private closeAll() {
|
|
578
|
+
this.timers.cancel(this.hoverHandle);
|
|
579
|
+
this.hoverHandle = undefined;
|
|
580
|
+
this.openIndex = -1;
|
|
581
|
+
this.openPath = [];
|
|
582
|
+
this.focusKey = undefined;
|
|
583
|
+
this.altHeld = false;
|
|
584
|
+
this.barActive = false;
|
|
585
|
+
this.typeahead.reset();
|
|
586
|
+
this.lastTypeLevel = -1;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
private openRowSubmenu(row: MenuRow, focusFirst: boolean) {
|
|
590
|
+
if (!row.hasSubmenu || row.disabled) {
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
// a row at depth d is recorded at openPath[d - 1]
|
|
594
|
+
this.openPath = [...this.openPath.slice(0, row.depth - 1), row.key];
|
|
595
|
+
if (focusFirst) {
|
|
596
|
+
// levels[d] is the level at depth d + 1 — the row's own submenu
|
|
597
|
+
let child = this.levels[row.depth]?.rows[0];
|
|
598
|
+
if (child) {
|
|
599
|
+
this.focusKey = child.key;
|
|
600
|
+
this.navigating = true;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
private moveTo(row: MenuRow | undefined) {
|
|
606
|
+
if (!row) {
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
this.navigating = true;
|
|
610
|
+
this.focusKey = row.key;
|
|
611
|
+
// moving within a level closes anything deeper
|
|
612
|
+
this.openPath = this.openPath.slice(0, row.depth - 1);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
private activateRow(row: MenuRow) {
|
|
616
|
+
if (row.disabled) {
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
if (row.hasSubmenu) {
|
|
620
|
+
this.openRowSubmenu(row, true);
|
|
621
|
+
return;
|
|
622
|
+
}
|
|
623
|
+
this.fire(row.node);
|
|
624
|
+
this.closeAll();
|
|
625
|
+
// focus returns to the top-level item the command came from
|
|
626
|
+
this.navigating = true;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
private fire(node: LeafNode) {
|
|
630
|
+
if (node.kind === 'toggle') {
|
|
631
|
+
// HIG: flipping a checkmark closes the menu, like any other command.
|
|
632
|
+
node.onChange?.(node.checked !== true);
|
|
633
|
+
}
|
|
634
|
+
node.onSelect?.();
|
|
635
|
+
this.args.onSelect?.(node);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
// ── Applying a machine result ─────────────────────────────────────────
|
|
639
|
+
|
|
640
|
+
private get barState(): BarState {
|
|
641
|
+
return {
|
|
642
|
+
index: this.index,
|
|
643
|
+
open: this.openIndex,
|
|
644
|
+
where: this.focusKey === undefined ? 'bar' : 'menu',
|
|
645
|
+
depth: this.focusKey === undefined ? 0 : (this.focusLevel?.depth ?? 1),
|
|
646
|
+
};
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
private get ctx(): BarContext {
|
|
650
|
+
let rows = this.topRows;
|
|
651
|
+
let focused = this.focusRow;
|
|
652
|
+
return {
|
|
653
|
+
count: rows.length,
|
|
654
|
+
hasMenu: (i: number) => !!rows[i]?.hasSubmenu && !rows[i]?.disabled,
|
|
655
|
+
rowHasMenu: !!focused?.hasSubmenu && !focused?.disabled,
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
private apply(result: BarResult) {
|
|
660
|
+
let s = result.state;
|
|
661
|
+
this.navigating = true;
|
|
662
|
+
|
|
663
|
+
if (result.effect === 'leave') {
|
|
664
|
+
this.index = s.index;
|
|
665
|
+
this.closeAll();
|
|
666
|
+
// Tab must not be caught by `focusWhen` on the way out.
|
|
667
|
+
this.navigating = false;
|
|
668
|
+
return;
|
|
669
|
+
}
|
|
670
|
+
if (result.effect === 'activate') {
|
|
671
|
+
let row = this.focusRow;
|
|
672
|
+
let top = this.topRows[s.index];
|
|
673
|
+
// disabled rows are visible, focusable, announced — and inert: the key
|
|
674
|
+
// does nothing, as a click does nothing
|
|
675
|
+
if (row ? row.disabled : top?.disabled) {
|
|
676
|
+
return;
|
|
677
|
+
}
|
|
678
|
+
this.index = s.index;
|
|
679
|
+
this.closeAll();
|
|
680
|
+
this.navigating = true;
|
|
681
|
+
if (row) {
|
|
682
|
+
if (!row.disabled) {
|
|
683
|
+
this.fire(row.node);
|
|
684
|
+
}
|
|
685
|
+
} else if (top && !top.disabled && !top.hasSubmenu) {
|
|
686
|
+
this.fire(top.node);
|
|
687
|
+
}
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
if (result.effect === 'openRow') {
|
|
691
|
+
let row = this.focusRow;
|
|
692
|
+
if (row) {
|
|
693
|
+
this.openRowSubmenu(row, true);
|
|
694
|
+
}
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
if (result.effect === 'closeLevel') {
|
|
698
|
+
let parentKey = this.openPath[this.openPath.length - 1];
|
|
699
|
+
this.openPath = this.openPath.slice(0, -1);
|
|
700
|
+
this.focusKey = parentKey;
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// 'none' | 'enterFirst' | 'enterLast'
|
|
705
|
+
this.index = s.index;
|
|
706
|
+
this.openIndex = s.open;
|
|
707
|
+
this.openPath = [];
|
|
708
|
+
this.barActive = s.open >= 0 || s.where === 'menu';
|
|
709
|
+
if (s.where === 'bar') {
|
|
710
|
+
this.focusKey = undefined;
|
|
711
|
+
if (s.open < 0) {
|
|
712
|
+
this.timers.cancel(this.hoverHandle);
|
|
713
|
+
this.hoverHandle = undefined;
|
|
714
|
+
this.typeahead.reset();
|
|
715
|
+
}
|
|
716
|
+
} else {
|
|
717
|
+
let rows = this.levels[0]?.rows ?? [];
|
|
718
|
+
let target =
|
|
719
|
+
result.effect === 'enterLast' ? rows[rows.length - 1] : rows[0];
|
|
720
|
+
this.focusKey = target?.key;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
// ── Keyboard ──────────────────────────────────────────────────────────
|
|
725
|
+
|
|
726
|
+
onKeydown = (event: Event) => {
|
|
727
|
+
let ev = event as KeyboardEvent;
|
|
728
|
+
if (ev.key === 'Escape') {
|
|
729
|
+
// owned by onEscapeCapture, so a host listening on capture cannot act
|
|
730
|
+
// on the same key first
|
|
731
|
+
return;
|
|
732
|
+
}
|
|
733
|
+
if (ev.ctrlKey || ev.metaKey) {
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
let result = menubarKey(this.barState, ev.key, this.ctx);
|
|
737
|
+
if (result.inner) {
|
|
738
|
+
this.innerKey(ev);
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
if (result.handled || result.effect !== 'none') {
|
|
742
|
+
if (result.handled) {
|
|
743
|
+
ev.preventDefault();
|
|
744
|
+
}
|
|
745
|
+
this.apply(result);
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
748
|
+
if (!ev.altKey && ev.key.length === 1 && /\S/.test(ev.key)) {
|
|
749
|
+
this.typeaheadKey(ev);
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
|
|
753
|
+
/** Sibling movement and Home/End inside an open panel — identical to
|
|
754
|
+
* `Menu`'s, because inside a panel the two patterns agree completely. */
|
|
755
|
+
private innerKey(ev: KeyboardEvent) {
|
|
756
|
+
let level = this.focusLevel;
|
|
757
|
+
let rows = level?.rows ?? [];
|
|
758
|
+
if (!rows.length) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
let index = rows.findIndex((row) => row.key === this.focusKey);
|
|
762
|
+
ev.preventDefault();
|
|
763
|
+
if (ev.key === 'ArrowDown') {
|
|
764
|
+
this.moveTo(rows[(index + 1 + rows.length) % rows.length]);
|
|
765
|
+
} else if (ev.key === 'ArrowUp') {
|
|
766
|
+
this.moveTo(rows[(index - 1 + rows.length) % rows.length]);
|
|
767
|
+
} else if (ev.key === 'Home') {
|
|
768
|
+
this.moveTo(rows[0]);
|
|
769
|
+
} else if (ev.key === 'End') {
|
|
770
|
+
this.moveTo(rows[rows.length - 1]);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/** Type-ahead at every level, with the buffer reset when the level changes:
|
|
775
|
+
* "pr" typed in File's menu must not still be in the buffer when the reader
|
|
776
|
+
* arrives in Edit's. */
|
|
777
|
+
private typeaheadKey(ev: KeyboardEvent) {
|
|
778
|
+
let level = this.focusLevel;
|
|
779
|
+
let levelId = this.focusKey === undefined ? 0 : (level?.depth ?? 0);
|
|
780
|
+
if (levelId !== this.lastTypeLevel) {
|
|
781
|
+
this.typeahead.reset();
|
|
782
|
+
this.lastTypeLevel = levelId;
|
|
783
|
+
}
|
|
784
|
+
let prefix = this.typeahead.push(ev.key);
|
|
785
|
+
if (this.focusKey === undefined) {
|
|
786
|
+
let rows = this.topRows;
|
|
787
|
+
if (!rows.length) {
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
let hit = typeaheadIndex(
|
|
791
|
+
rows.map((row) => row.label),
|
|
792
|
+
prefix,
|
|
793
|
+
this.index,
|
|
794
|
+
this.typeahead.isCycling,
|
|
795
|
+
);
|
|
796
|
+
if (hit >= 0) {
|
|
797
|
+
ev.preventDefault();
|
|
798
|
+
this.apply({
|
|
799
|
+
state: barCarry(this.barState, hit, this.ctx),
|
|
800
|
+
handled: true,
|
|
801
|
+
effect: 'none',
|
|
802
|
+
inner: false,
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
807
|
+
let rows = level?.rows ?? [];
|
|
808
|
+
if (!rows.length) {
|
|
809
|
+
return;
|
|
810
|
+
}
|
|
811
|
+
let index = rows.findIndex((row) => row.key === this.focusKey);
|
|
812
|
+
let hit = typeaheadIndex(
|
|
813
|
+
rows.map((row) => row.label),
|
|
814
|
+
prefix,
|
|
815
|
+
index < 0 ? 0 : index,
|
|
816
|
+
this.typeahead.isCycling,
|
|
817
|
+
);
|
|
818
|
+
if (hit >= 0) {
|
|
819
|
+
ev.preventDefault();
|
|
820
|
+
this.moveTo(rows[hit]);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/**
|
|
825
|
+
* Escape, taken in the capture phase: an open bar owns the key outright and
|
|
826
|
+
* nothing else in the page sees it. Without capture, a host surface that
|
|
827
|
+
* listens for Escape on capture acts first and Escape means two things at
|
|
828
|
+
* once — the defect the boxel-catalog popover fork documents.
|
|
829
|
+
*/
|
|
830
|
+
onEscapeCapture = (event: Event) => {
|
|
831
|
+
let ev = event as KeyboardEvent;
|
|
832
|
+
if (ev.key !== 'Escape' || !this.isOpen) {
|
|
833
|
+
return;
|
|
834
|
+
}
|
|
835
|
+
let result = menubarKey(this.barState, 'Escape', this.ctx);
|
|
836
|
+
if (!result.handled) {
|
|
837
|
+
return;
|
|
838
|
+
}
|
|
839
|
+
ev.preventDefault();
|
|
840
|
+
ev.stopPropagation();
|
|
841
|
+
this.apply(result);
|
|
842
|
+
};
|
|
843
|
+
|
|
844
|
+
// ── Pointer ───────────────────────────────────────────────────────────
|
|
845
|
+
|
|
846
|
+
private barIndexFromEvent(event: Event): number | undefined {
|
|
847
|
+
let target = event.target as HTMLElement | null;
|
|
848
|
+
let el = target?.closest('[data-bar-index]') as HTMLElement | null;
|
|
849
|
+
if (!el) {
|
|
850
|
+
return undefined;
|
|
851
|
+
}
|
|
852
|
+
let raw = Number(el.dataset.barIndex);
|
|
853
|
+
return Number.isInteger(raw) ? raw : undefined;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
private rowFromEvent(event: Event): MenuRow | undefined {
|
|
857
|
+
let target = event.target as HTMLElement | null;
|
|
858
|
+
let el = target?.closest('[data-menu-key]') as HTMLElement | null;
|
|
859
|
+
return this.rowFor(el?.dataset.menuKey);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/**
|
|
863
|
+
* **The hover asymmetry.** Before the bar is active, hovering a top-level
|
|
864
|
+
* item does nothing — a menu bar that opened on hover would fire every time
|
|
865
|
+
* the pointer crossed the top of the window. Once a menu is open the reader
|
|
866
|
+
* has already declared intent, so switching is *immediate*: no dwell delay,
|
|
867
|
+
* no hover-intent timer. Both halves are the pattern; shipping only one is
|
|
868
|
+
* the usual mistake (accessible-menu's `hoverType: 'dynamic'` gated on
|
|
869
|
+
* `hasOpened` is the same rule).
|
|
870
|
+
*
|
|
871
|
+
* Hover moves REAL focus, not just the highlight, as the WAI-ARIA menu
|
|
872
|
+
* pattern says — and it must here, because switching top-level items tears
|
|
873
|
+
* down the panel any focused row lived in.
|
|
874
|
+
*/
|
|
875
|
+
private hoverBar(i: number) {
|
|
876
|
+
this.timers.cancel(this.hoverHandle);
|
|
877
|
+
this.hoverHandle = undefined;
|
|
878
|
+
if (!this.barActive) {
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
if (i === this.index && this.focusKey === undefined) {
|
|
882
|
+
return;
|
|
883
|
+
}
|
|
884
|
+
this.navigating = true;
|
|
885
|
+
this.index = i;
|
|
886
|
+
this.openIndex = this.ctx.hasMenu(i) ? i : -1;
|
|
887
|
+
// a title with no menu ends the bar's active state, as apply() does, so
|
|
888
|
+
// a later hover cannot reopen a menu the user thinks is closed
|
|
889
|
+
this.barActive = this.openIndex >= 0;
|
|
890
|
+
this.openPath = [];
|
|
891
|
+
this.focusKey = undefined;
|
|
892
|
+
this.typeahead.reset();
|
|
893
|
+
this.lastTypeLevel = -1;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
/**
|
|
897
|
+
* Hover inside a panel, with the Amazon safe triangle in front of it —
|
|
898
|
+
* identical to `Menu`'s, and reusing the same pure geometry. While the
|
|
899
|
+
* pointer travels diagonally toward an open submenu's near edge, a sibling
|
|
900
|
+
* row it happens to cross must not take over the hover; one deferral per
|
|
901
|
+
* pointer move, so a cursor that comes to rest inside the triangle lets the
|
|
902
|
+
* sibling win rather than re-arming a timer forever.
|
|
903
|
+
*/
|
|
904
|
+
private considerHover(row: MenuRow) {
|
|
905
|
+
this.timers.cancel(this.hoverHandle);
|
|
906
|
+
this.hoverHandle = undefined;
|
|
907
|
+
let openAtDepth = this.openPath[row.depth - 1];
|
|
908
|
+
let wouldCloseSubmenu = !!openAtDepth && openAtDepth !== row.key;
|
|
909
|
+
if (
|
|
910
|
+
wouldCloseSubmenu &&
|
|
911
|
+
this.track.travellingToSubmenu &&
|
|
912
|
+
this.track.stamp !== this.lastDeferStamp
|
|
913
|
+
) {
|
|
914
|
+
this.lastDeferStamp = this.track.stamp;
|
|
915
|
+
this.hoverHandle = this.timers.after(this.safeDelay, () =>
|
|
916
|
+
this.considerHover(row),
|
|
917
|
+
);
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
this.navigating = true;
|
|
921
|
+
this.focusKey = row.key;
|
|
922
|
+
this.openPath = this.openPath.slice(0, row.depth - 1);
|
|
923
|
+
if (row.hasSubmenu && !row.disabled) {
|
|
924
|
+
this.hoverHandle = this.timers.after(this.hoverDelay, () =>
|
|
925
|
+
this.openRowSubmenu(row, false),
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
onPointerOver = (event: Event) => {
|
|
931
|
+
let barIndex = this.barIndexFromEvent(event);
|
|
932
|
+
if (barIndex !== undefined) {
|
|
933
|
+
this.hoverBar(barIndex);
|
|
934
|
+
return;
|
|
935
|
+
}
|
|
936
|
+
let row = this.rowFromEvent(event);
|
|
937
|
+
if (!row || row.key === this.focusKey) {
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
this.considerHover(row);
|
|
941
|
+
};
|
|
942
|
+
|
|
943
|
+
onClick = (event: Event) => {
|
|
944
|
+
let barIndex = this.barIndexFromEvent(event);
|
|
945
|
+
if (barIndex !== undefined) {
|
|
946
|
+
this.clickBar(barIndex);
|
|
947
|
+
return;
|
|
948
|
+
}
|
|
949
|
+
let row = this.rowFromEvent(event);
|
|
950
|
+
if (row) {
|
|
951
|
+
this.activateRow(row);
|
|
952
|
+
}
|
|
953
|
+
};
|
|
954
|
+
|
|
955
|
+
private clickBar(i: number) {
|
|
956
|
+
let row = this.topRows[i];
|
|
957
|
+
if (!row) {
|
|
958
|
+
return;
|
|
959
|
+
}
|
|
960
|
+
this.navigating = true;
|
|
961
|
+
this.index = i;
|
|
962
|
+
if (row.disabled) {
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
if (!row.hasSubmenu) {
|
|
966
|
+
this.closeAll();
|
|
967
|
+
this.navigating = true;
|
|
968
|
+
this.fire(row.node);
|
|
969
|
+
return;
|
|
970
|
+
}
|
|
971
|
+
if (this.openIndex === i) {
|
|
972
|
+
// clicking the open title closes it, as every real menu bar does
|
|
973
|
+
this.closeAll();
|
|
974
|
+
this.navigating = true;
|
|
975
|
+
return;
|
|
976
|
+
}
|
|
977
|
+
this.openIndex = i;
|
|
978
|
+
this.openPath = [];
|
|
979
|
+
this.focusKey = undefined;
|
|
980
|
+
this.barActive = true;
|
|
981
|
+
this.typeahead.reset();
|
|
982
|
+
this.lastTypeLevel = -1;
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
onDocumentPointerDown = (event: Event) => {
|
|
986
|
+
if (!this.isOpen) {
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
let target = event.target as Node | null;
|
|
990
|
+
if (target && this.hostEl?.contains(target)) {
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
// ember-power-select renders its dropdown in a portal at document.body;
|
|
994
|
+
// treat that portal as logically inside, so choosing an option from a
|
|
995
|
+
// Select hosted in a menu does not dismiss the bar underneath it
|
|
996
|
+
let el = target instanceof Element ? target : null;
|
|
997
|
+
if (el?.closest('.ember-basic-dropdown-content')) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
this.navigating = false;
|
|
1001
|
+
this.closeAll();
|
|
1002
|
+
};
|
|
1003
|
+
|
|
1004
|
+
/** Option/Alt swaps dynamic items while held, at every level including the
|
|
1005
|
+
* bar. Watched on the document so a modifier press with the pointer outside
|
|
1006
|
+
* the panels still registers. */
|
|
1007
|
+
onAltDown = (event: Event) => {
|
|
1008
|
+
if ((event as KeyboardEvent).altKey && !this.altHeld) {
|
|
1009
|
+
this.altHeld = true;
|
|
1010
|
+
}
|
|
1011
|
+
};
|
|
1012
|
+
onAltUp = (event: Event) => {
|
|
1013
|
+
if (!(event as KeyboardEvent).altKey && this.altHeld) {
|
|
1014
|
+
this.altHeld = false;
|
|
1015
|
+
}
|
|
1016
|
+
};
|
|
1017
|
+
|
|
1018
|
+
<template>
|
|
1019
|
+
<div
|
|
1020
|
+
class='pretui-menubar-wrap'
|
|
1021
|
+
data-test-pretui-menubar
|
|
1022
|
+
{{this.captureHost}}
|
|
1023
|
+
{{ownsTimers this.timers}}
|
|
1024
|
+
{{listen 'click' this.onClick}}
|
|
1025
|
+
{{listen 'keydown' this.onKeydown}}
|
|
1026
|
+
{{listen 'pointerover' this.onPointerOver}}
|
|
1027
|
+
...attributes
|
|
1028
|
+
>
|
|
1029
|
+
<menu
|
|
1030
|
+
class='pretui-menubar'
|
|
1031
|
+
role='menubar'
|
|
1032
|
+
aria-label={{this.barLabel}}
|
|
1033
|
+
data-test-pretui-menubar-list
|
|
1034
|
+
>
|
|
1035
|
+
{{#each this.topRows key='key' as |row i|}}
|
|
1036
|
+
<li
|
|
1037
|
+
class='pretui-menubar-item'
|
|
1038
|
+
role='menuitem'
|
|
1039
|
+
data-bar-index={{i}}
|
|
1040
|
+
data-active={{if (this.barIsActive i) 'true'}}
|
|
1041
|
+
data-open={{this.barIsOpen i}}
|
|
1042
|
+
aria-disabled={{if row.disabled 'true'}}
|
|
1043
|
+
aria-haspopup={{this.barPopup i}}
|
|
1044
|
+
aria-expanded={{this.barIsOpen i}}
|
|
1045
|
+
aria-keyshortcuts={{row.keyshortcuts}}
|
|
1046
|
+
{{rovingTabindex (this.barIsTabStop i)}}
|
|
1047
|
+
{{focusWhen (this.barIsFocusTarget i)}}
|
|
1048
|
+
{{this.captureBarItem i}}
|
|
1049
|
+
>
|
|
1050
|
+
{{#if row.icon}}
|
|
1051
|
+
<row.icon class='pretui-menubar-icon' role='presentation' />
|
|
1052
|
+
{{/if}}
|
|
1053
|
+
<span class='pretui-menubar-label'>{{row.label}}</span>
|
|
1054
|
+
{{#if row.shortcut}}
|
|
1055
|
+
<span
|
|
1056
|
+
class='pretui-menubar-kbd'
|
|
1057
|
+
aria-hidden='true'
|
|
1058
|
+
>{{row.shortcut}}</span>
|
|
1059
|
+
{{/if}}
|
|
1060
|
+
</li>
|
|
1061
|
+
{{/each}}
|
|
1062
|
+
</menu>
|
|
1063
|
+
|
|
1064
|
+
{{#if this.isOpen}}
|
|
1065
|
+
{{!-- dismissal, dynamic items and the pointer track live only while a
|
|
1066
|
+
menu is open — every listener leaves with the element --}}
|
|
1067
|
+
<span
|
|
1068
|
+
class='pretui-menubar-watch'
|
|
1069
|
+
{{tracksPointer this.track}}
|
|
1070
|
+
{{listenDocumentCapture 'keydown' this.onEscapeCapture}}
|
|
1071
|
+
{{listenDocument 'pointerdown' this.onDocumentPointerDown true}}
|
|
1072
|
+
{{listenDocument 'keydown' this.onAltDown false}}
|
|
1073
|
+
{{listenDocument 'keyup' this.onAltUp false}}
|
|
1074
|
+
></span>
|
|
1075
|
+
|
|
1076
|
+
{{#each this.levels key='depth' as |level|}}
|
|
1077
|
+
<MenuPanel
|
|
1078
|
+
@level={{level}}
|
|
1079
|
+
@anchor={{this.anchorFor level.depth}}
|
|
1080
|
+
@placement={{this.placementFor level.depth}}
|
|
1081
|
+
@distance={{this.distanceFor level.depth}}
|
|
1082
|
+
@rovingKey={{this.focusKey}}
|
|
1083
|
+
@navigating={{this.navigating}}
|
|
1084
|
+
@openKeys={{this.openPath}}
|
|
1085
|
+
@onItemElement={{this.onItemElement}}
|
|
1086
|
+
@parentItem={{this.itemFor level.parentKey}}
|
|
1087
|
+
@onEdge={{this.onEdge}}
|
|
1088
|
+
data-test-pretui-menubar-panel={{level.depth}}
|
|
1089
|
+
/>
|
|
1090
|
+
{{/each}}
|
|
1091
|
+
{{/if}}
|
|
1092
|
+
</div>
|
|
1093
|
+
|
|
1094
|
+
<style scoped>
|
|
1095
|
+
@layer PretComponent {
|
|
1096
|
+
.pretui-menubar-wrap {
|
|
1097
|
+
display: block;
|
|
1098
|
+
container-type: inline-size;
|
|
1099
|
+
}
|
|
1100
|
+
.pretui-menubar-watch {
|
|
1101
|
+
display: none;
|
|
1102
|
+
}
|
|
1103
|
+
.pretui-menubar {
|
|
1104
|
+
display: flex;
|
|
1105
|
+
align-items: stretch;
|
|
1106
|
+
gap: var(--pretui-menubar-gap, 1px);
|
|
1107
|
+
margin: 0;
|
|
1108
|
+
padding: var(--pretui-menubar-padding, 3px);
|
|
1109
|
+
list-style: none;
|
|
1110
|
+
background: var(--pretui-menubar-background, var(--card));
|
|
1111
|
+
color: var(--foreground);
|
|
1112
|
+
border-radius: var(--radius-surface, 10px);
|
|
1113
|
+
box-shadow: var(
|
|
1114
|
+
--pretui-shadow-hairline,
|
|
1115
|
+
0 0 0 1px var(--border)
|
|
1116
|
+
);
|
|
1117
|
+
font-family: var(--font-sans);
|
|
1118
|
+
font-size: var(--text-ui-md, 12.5px);
|
|
1119
|
+
/* The bar is a single line of titles; when the pane is too narrow it
|
|
1120
|
+
scrolls rather than wrapping — a wrapped menu bar loses the one
|
|
1121
|
+
spatial fact readers rely on, which title sits where. */
|
|
1122
|
+
overflow-x: auto;
|
|
1123
|
+
overscroll-behavior-x: contain;
|
|
1124
|
+
scrollbar-width: thin;
|
|
1125
|
+
}
|
|
1126
|
+
.pretui-menubar-item {
|
|
1127
|
+
display: inline-flex;
|
|
1128
|
+
align-items: center;
|
|
1129
|
+
gap: 6px;
|
|
1130
|
+
min-height: var(--pretui-menubar-item-height, 26px);
|
|
1131
|
+
padding-block: 3px;
|
|
1132
|
+
padding-inline: var(--pretui-menubar-item-padding, 9px);
|
|
1133
|
+
border-radius: var(--radius-control, 6px);
|
|
1134
|
+
color: inherit;
|
|
1135
|
+
cursor: default;
|
|
1136
|
+
user-select: none;
|
|
1137
|
+
white-space: nowrap;
|
|
1138
|
+
/* the title's own colour is the only thing that moves, so the bar is
|
|
1139
|
+
still legible in a greyscale screenshot (Law 8) */
|
|
1140
|
+
transition: background-color 90ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
1141
|
+
}
|
|
1142
|
+
.pretui-menubar-item[aria-disabled='true'] {
|
|
1143
|
+
/* dimmed, still focusable, still announced — HIG's "dim, don't
|
|
1144
|
+
remove", which the `disabled` attribute cannot express */
|
|
1145
|
+
opacity: 0.42;
|
|
1146
|
+
}
|
|
1147
|
+
.pretui-menubar-item[data-active='true']:not([aria-disabled='true']) {
|
|
1148
|
+
background: var(--hover, var(--boxel-100));
|
|
1149
|
+
}
|
|
1150
|
+
.pretui-menubar-item[data-open='true'] {
|
|
1151
|
+
background: var(--accent);
|
|
1152
|
+
color: var(--accent-foreground);
|
|
1153
|
+
}
|
|
1154
|
+
.pretui-menubar-item:focus-visible {
|
|
1155
|
+
outline: 2px solid var(--ring);
|
|
1156
|
+
outline-offset: -2px;
|
|
1157
|
+
}
|
|
1158
|
+
.pretui-menubar-label {
|
|
1159
|
+
font-weight: 500;
|
|
1160
|
+
}
|
|
1161
|
+
.pretui-menubar-icon {
|
|
1162
|
+
width: 14px;
|
|
1163
|
+
height: 14px;
|
|
1164
|
+
}
|
|
1165
|
+
.pretui-menubar-kbd {
|
|
1166
|
+
font-family: var(--font-mono);
|
|
1167
|
+
font-size: var(--text-ui-xs, 11px);
|
|
1168
|
+
font-variant-numeric: tabular-nums;
|
|
1169
|
+
color: var(--muted-foreground);
|
|
1170
|
+
white-space: nowrap;
|
|
1171
|
+
}
|
|
1172
|
+
.pretui-menubar-item[data-open='true'] .pretui-menubar-kbd {
|
|
1173
|
+
color: inherit;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
/* Touch: a 26px title is a miss target on a finger, and a touch reader
|
|
1177
|
+
has no hover at all — every title is reachable by tap, which is why
|
|
1178
|
+
the bar never depends on hover to open. */
|
|
1179
|
+
@media (any-pointer: coarse) {
|
|
1180
|
+
.pretui-menubar-item {
|
|
1181
|
+
min-height: 44px;
|
|
1182
|
+
padding-inline: 12px;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
/* Unnamed container query only — the named forms silently drop every
|
|
1186
|
+
following rule in the transpiled stylesheet. */
|
|
1187
|
+
@container (max-width: 380px) {
|
|
1188
|
+
.pretui-menubar-item {
|
|
1189
|
+
padding-inline: 7px;
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1193
|
+
.pretui-menubar-item {
|
|
1194
|
+
transition: none;
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
</style>
|
|
1199
|
+
</template>
|
|
1200
|
+
}
|