@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,1396 @@
|
|
|
1
|
+
// Pretui — EmojiPicker: a searchable, keyboard-navigable emoji grid.
|
|
2
|
+
//
|
|
3
|
+
// A searchable, keyboard-complete emoji picker and the small trigger that
|
|
4
|
+
// opens one in a popover.
|
|
5
|
+
//
|
|
6
|
+
// PROVENANCE. The interaction design, the search ranking, the skin-tone
|
|
7
|
+
// handling and the emoji-support detection are ported from Nolan Lawson's
|
|
8
|
+
// emoji-picker-element (Apache-2.0). The dataset and the ported algorithms
|
|
9
|
+
// live in ./emoji-data/ with the licence and the full provenance record; that
|
|
10
|
+
// directory's README explains why this is a PORT rather than a vendored
|
|
11
|
+
// bundle. The short version, because it is the load-bearing fact: the
|
|
12
|
+
// upstream bundle references `requestAnimationFrame`, `Element`,
|
|
13
|
+
// `HTMLElement` and `customElements` at MODULE SCOPE and ships no server-safe
|
|
14
|
+
// globals shim, so importing it anywhere in the realm graph throws under the
|
|
15
|
+
// indexer. Media Chrome survived vendoring because it has that shim; this
|
|
16
|
+
// library does not.
|
|
17
|
+
//
|
|
18
|
+
// WHAT UPSTREAM GOT WRONG, AND WHAT IS FIXED HERE (specifically):
|
|
19
|
+
//
|
|
20
|
+
// 1. THE BROWSE GRID HAS NO KEYBOARD PATH. Upstream renders every emoji in a
|
|
21
|
+
// category as a bare <button> with no tabindex management, so a category
|
|
22
|
+
// is 388 consecutive tab stops and there is no arrow-key navigation at
|
|
23
|
+
// all — the only keydown handlers are on the search field, the category
|
|
24
|
+
// nav and the skin-tone list. Here the grid is one tab stop with roving
|
|
25
|
+
// tabindex and full 2-D arrow / Home / End / PageUp / PageDown movement.
|
|
26
|
+
// 2. THE GRID USES THE WRONG ROLE. Upstream marks it up as role='menu' with
|
|
27
|
+
// role='menuitem' children, which is a single-column action list; a
|
|
28
|
+
// screen reader announces "menu, 388 items" and no position. This is a
|
|
29
|
+
// role='grid' of role='row' / role='gridcell', so row and column position
|
|
30
|
+
// are announced and the APG grid pattern applies.
|
|
31
|
+
// 3. IT FETCHES ITS DATA FROM A CDN AT RUNTIME. jsdelivr, with ETag
|
|
32
|
+
// revalidation, into IndexedDB. That breaks offline, pins us to a third
|
|
33
|
+
// party's uptime and is the same supply-chain exposure being removed from
|
|
34
|
+
// the QR component. The dataset is local and the picker never touches the
|
|
35
|
+
// network.
|
|
36
|
+
// 4. IT FORKS ON prefers-color-scheme INSIDE ITS OWN SHADOW ROOT. A picker
|
|
37
|
+
// in a Pretui dark theme frame on a light OS came out light. Every colour
|
|
38
|
+
// here is a token with a light-value fallback and there are zero dark
|
|
39
|
+
// branches, so the theme frame decides.
|
|
40
|
+
// 5. NO EMOJI PREVIEW. Upstream puts the CLDR name in a `title` tooltip,
|
|
41
|
+
// which is hover-only and invisible in a screenshot. A persistent preview
|
|
42
|
+
// row names the focused emoji in text — the Law 8 resting state.
|
|
43
|
+
//
|
|
44
|
+
// KNOWN UNFINISHED EDGE, named rather than hidden (Law 7). Upstream also runs
|
|
45
|
+
// a per-emoji glyph WIDTH measurement to catch ZWJ sequences the font renders
|
|
46
|
+
// as two glyphs ("person with red hair" drawn as a person plus a floating
|
|
47
|
+
// wig). Versions 12.1, 13.1 and 15.1 are compound-only and can be caught no
|
|
48
|
+
// other way. That check is a layout-thrashing measure pass over every
|
|
49
|
+
// rendered cell; the cheap half — canvas colour detection of the font's
|
|
50
|
+
// version level — IS ported and removes the bulk of the tofu. See
|
|
51
|
+
// ./emoji-data/README.md.
|
|
52
|
+
import Component from '@glimmer/component';
|
|
53
|
+
import { tracked } from '@glimmer/tracking';
|
|
54
|
+
import { on } from '@ember/modifier';
|
|
55
|
+
import { fn } from '@ember/helper';
|
|
56
|
+
import { modifier } from 'ember-modifier';
|
|
57
|
+
import { listen } from '../focus';
|
|
58
|
+
import { cssStyleFrom } from '../pretui-css';
|
|
59
|
+
import { EMOJI_GROUPS, EmojiIndex, MIN_SEARCH_LENGTH, SKIN_TONE_LABELS, SKIN_TONE_SAMPLE, applySkinTone, detectSupportLevel, toneOf } from '../emoji-data/engine';
|
|
60
|
+
import type { Emoji } from '../emoji-data/engine';
|
|
61
|
+
|
|
62
|
+
// ── Public shapes ────────────────────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
/** What a caller receives when someone picks an emoji. */
|
|
65
|
+
export interface EmojiSelection {
|
|
66
|
+
/** The emoji to insert, with the active skin tone already applied. */
|
|
67
|
+
unicode: string;
|
|
68
|
+
/** The CLDR annotation, e.g. "waving hand". Safe to use as alt text. */
|
|
69
|
+
annotation: string;
|
|
70
|
+
/** The untoned emoji, which is the identity used by the recent list. */
|
|
71
|
+
base: string;
|
|
72
|
+
/** The tone that was applied, 0 when none. */
|
|
73
|
+
skinTone: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The id the recent pseudo-category uses; no emojibase group has it. */
|
|
77
|
+
const RECENT_GROUP = -1;
|
|
78
|
+
|
|
79
|
+
const DEFAULT_COLUMNS = 9;
|
|
80
|
+
const DEFAULT_RECENT_LIMIT = 18;
|
|
81
|
+
/** Rows moved by PageUp / PageDown. */
|
|
82
|
+
const PAGE_ROWS = 5;
|
|
83
|
+
/** How long the query must be still before the result count is announced. */
|
|
84
|
+
const ANNOUNCE_DELAY = 700;
|
|
85
|
+
|
|
86
|
+
let uid = 0;
|
|
87
|
+
/** Deterministic per-instance id source. A counter, not Math.random, because
|
|
88
|
+
* randomness breaks indexing determinism. */
|
|
89
|
+
function nextId(): string {
|
|
90
|
+
uid += 1;
|
|
91
|
+
return 'pretui-emoji-' + uid;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ── Modifiers ────────────────────────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Build the index once the picker is in a real browser.
|
|
98
|
+
*
|
|
99
|
+
* This is the ONLY place the dataset is requested, and it is deliberately a
|
|
100
|
+
* modifier: `detectSupportLevel` needs a canvas and `import('./data')` should
|
|
101
|
+
* not run under the indexer. A getter would be evaluated during prerender and
|
|
102
|
+
* is exactly the mistake the Observable Plot spike warned about.
|
|
103
|
+
*/
|
|
104
|
+
const buildIndex = modifier(
|
|
105
|
+
(_el: HTMLElement, [run]: [(cancelled: () => boolean) => void]) => {
|
|
106
|
+
let destroyed = false;
|
|
107
|
+
run(() => destroyed);
|
|
108
|
+
return () => {
|
|
109
|
+
destroyed = true;
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Roving tabindex and focus for the grid, applied imperatively in one pass.
|
|
116
|
+
*
|
|
117
|
+
* Doing this with a per-cell modifier would re-run 388 modifiers on every
|
|
118
|
+
* arrow key. This runs twice per keystroke: one loop to set tabIndex, one
|
|
119
|
+
* `focus()`. `key` is the change key — the identity of the current cell list —
|
|
120
|
+
* so switching category or typing re-seats the roving stop.
|
|
121
|
+
*
|
|
122
|
+
* tabIndex is set as a PROPERTY, matching `rovingTabindex` in focus.gts.
|
|
123
|
+
*/
|
|
124
|
+
const rovingGrid = modifier(
|
|
125
|
+
(
|
|
126
|
+
el: HTMLElement,
|
|
127
|
+
[index, shouldFocus, _key]: [number, boolean, string],
|
|
128
|
+
) => {
|
|
129
|
+
let cells = el.querySelectorAll<HTMLElement>('[data-emoji-cell]');
|
|
130
|
+
for (let i = 0; i < cells.length; i++) {
|
|
131
|
+
cells[i]!.tabIndex = i === index ? 0 : -1;
|
|
132
|
+
}
|
|
133
|
+
if (shouldFocus) {
|
|
134
|
+
cells[index]?.focus();
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Announce `text` once it has stopped changing for `delay` ms.
|
|
141
|
+
*
|
|
142
|
+
* Same one-shot contract as `estimateWhenIdle` in password-strength.gts, and
|
|
143
|
+
* for the same realm-law reason: the modifier owns the handle, its destructor
|
|
144
|
+
* clears it, and because the function form of `modifier` tears down before it
|
|
145
|
+
* re-runs on an arg change, each new value cancels the pending call and arms
|
|
146
|
+
* exactly one more. Nothing re-arms after teardown, so this cannot strand
|
|
147
|
+
* `await settled()`.
|
|
148
|
+
*
|
|
149
|
+
* `run` is a positional arg rather than a captured closure so that identity
|
|
150
|
+
* churn in the caller cannot retrigger the modifier every render.
|
|
151
|
+
*/
|
|
152
|
+
const announceWhenIdle = modifier(
|
|
153
|
+
(
|
|
154
|
+
_el: HTMLElement,
|
|
155
|
+
[text, delay, run]: [string, number, (text: string) => void],
|
|
156
|
+
) => {
|
|
157
|
+
let handle = setTimeout(() => run(text), delay);
|
|
158
|
+
return () => clearTimeout(handle);
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
/** Focus the element when `should` flips true. Local to avoid focus.gts's
|
|
163
|
+
* `focusWhen`, which focuses on insert; the search field must only take focus
|
|
164
|
+
* when the caller asked for it. */
|
|
165
|
+
const focusOnce = modifier((el: HTMLElement, [should]: [boolean]) => {
|
|
166
|
+
if (should) {
|
|
167
|
+
el.focus();
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// ── EmojiPicker ──────────────────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
export interface EmojiPickerSignature {
|
|
174
|
+
Args: {
|
|
175
|
+
/** Called with the chosen emoji. The only required arg in practice. */
|
|
176
|
+
onSelect?: (selection: EmojiSelection) => void;
|
|
177
|
+
/** Active skin tone 0-5. Controlled when supplied. */
|
|
178
|
+
skinTone?: number;
|
|
179
|
+
/** Called when the tone changes; persist it to make the choice sticky. */
|
|
180
|
+
onSkinTone?: (skinTone: number) => void;
|
|
181
|
+
/**
|
|
182
|
+
* Recently-used emoji, MOST RECENT FIRST, as untoned unicode strings.
|
|
183
|
+
*
|
|
184
|
+
* Ordering is positional and carries NO timestamp — `Date.now()` is
|
|
185
|
+
* forbidden in realm code because it breaks indexing determinism, and a
|
|
186
|
+
* wall clock was never needed: "most recent" is "index 0". Controlled
|
|
187
|
+
* when supplied; otherwise the picker keeps its own list for the session.
|
|
188
|
+
*/
|
|
189
|
+
recent?: readonly string[];
|
|
190
|
+
/** Receives the new recent list after each pick. Persist it verbatim. */
|
|
191
|
+
onRecent?: (recent: readonly string[]) => void;
|
|
192
|
+
/** How many recent emoji to keep. Default 18. */
|
|
193
|
+
recentLimit?: number;
|
|
194
|
+
/** Columns in the grid. Default 9. */
|
|
195
|
+
columns?: number;
|
|
196
|
+
/** Focus the search field on insert. Default false. */
|
|
197
|
+
autofocus?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Pin the emoji version instead of detecting it. Detection draws fourteen
|
|
200
|
+
* 1x1 canvases; pin it if a caller has already measured, or to make a
|
|
201
|
+
* screenshot test deterministic across machines.
|
|
202
|
+
*/
|
|
203
|
+
emojiVersion?: number;
|
|
204
|
+
/** Accessible name for the whole picker. Default "Emoji picker". */
|
|
205
|
+
label?: string;
|
|
206
|
+
};
|
|
207
|
+
Element: HTMLDivElement;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
type Status = 'loading' | 'ready' | 'error';
|
|
211
|
+
|
|
212
|
+
interface Cell {
|
|
213
|
+
emoji: Emoji;
|
|
214
|
+
/** The glyph to paint, tone applied. */
|
|
215
|
+
glyph: string;
|
|
216
|
+
/** Flat index across the whole grid — the roving tabindex position. */
|
|
217
|
+
index: number;
|
|
218
|
+
key: string;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export class EmojiPicker extends Component<EmojiPickerSignature> {
|
|
222
|
+
private guid = nextId();
|
|
223
|
+
|
|
224
|
+
@tracked private status: Status = 'loading';
|
|
225
|
+
@tracked private index: EmojiIndex | undefined;
|
|
226
|
+
@tracked private errorMessage = '';
|
|
227
|
+
@tracked private query = '';
|
|
228
|
+
@tracked private group = EMOJI_GROUPS[0]!.id;
|
|
229
|
+
@tracked private focusedIndex = 0;
|
|
230
|
+
@tracked private gridHasFocus = false;
|
|
231
|
+
@tracked private toneOpen = false;
|
|
232
|
+
@tracked private toneActive = 0;
|
|
233
|
+
@tracked private internalTone = 0;
|
|
234
|
+
@tracked private internalRecent: readonly string[] = [];
|
|
235
|
+
@tracked private announcement = '';
|
|
236
|
+
/** The cell the preview row is describing — focused, or hovered. */
|
|
237
|
+
@tracked private previewIndex = -1;
|
|
238
|
+
|
|
239
|
+
// ── ids ────────────────────────────────────────────────────────────────
|
|
240
|
+
get searchId() {
|
|
241
|
+
return this.guid + '-search';
|
|
242
|
+
}
|
|
243
|
+
get panelId() {
|
|
244
|
+
return this.guid + '-panel';
|
|
245
|
+
}
|
|
246
|
+
get hintId() {
|
|
247
|
+
return this.guid + '-hint';
|
|
248
|
+
}
|
|
249
|
+
get toneButtonId() {
|
|
250
|
+
return this.guid + '-tone';
|
|
251
|
+
}
|
|
252
|
+
get toneListId() {
|
|
253
|
+
return this.guid + '-tones';
|
|
254
|
+
}
|
|
255
|
+
toneOptionId = (tone: number) => this.guid + '-tone-' + tone;
|
|
256
|
+
tabId = (group: number) => this.guid + '-tab-' + group;
|
|
257
|
+
|
|
258
|
+
get label(): string {
|
|
259
|
+
return this.args.label ?? 'Emoji picker';
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
get columns(): number {
|
|
263
|
+
let n = Math.trunc(this.args.columns ?? DEFAULT_COLUMNS);
|
|
264
|
+
return Math.max(4, Math.min(16, Number.isFinite(n) ? n : DEFAULT_COLUMNS));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
get skinTone(): number {
|
|
268
|
+
let tone = this.args.skinTone ?? this.internalTone;
|
|
269
|
+
return Math.max(0, Math.min(5, Math.trunc(tone) || 0));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
get recent(): readonly string[] {
|
|
273
|
+
return this.args.recent ?? this.internalRecent;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
get recentLimit(): number {
|
|
277
|
+
let n = Math.trunc(this.args.recentLimit ?? DEFAULT_RECENT_LIMIT);
|
|
278
|
+
return Math.max(0, Math.min(64, Number.isFinite(n) ? n : DEFAULT_RECENT_LIMIT));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
get searching(): boolean {
|
|
282
|
+
return this.query.trim().length >= MIN_SEARCH_LENGTH;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
get isLoading(): boolean {
|
|
286
|
+
return this.status === 'loading';
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
get isError(): boolean {
|
|
290
|
+
return this.status === 'error';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
get shouldAutofocus(): boolean {
|
|
294
|
+
return this.args.autofocus === true;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
get rootStyle() {
|
|
298
|
+
return cssStyleFrom([
|
|
299
|
+
'--pretui-emoji-columns: ' + String(this.columns),
|
|
300
|
+
]);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ── Load ───────────────────────────────────────────────────────────────
|
|
304
|
+
|
|
305
|
+
/** Kicked off by the `buildIndex` modifier, so it only ever runs in a
|
|
306
|
+
* browser. `cancelled` is the modifier's destroyed flag — checked after
|
|
307
|
+
* every await so a picker torn down mid-load sets nothing. */
|
|
308
|
+
private load = (cancelled: () => boolean) => {
|
|
309
|
+
let version = this.args.emojiVersion;
|
|
310
|
+
let supportLevel =
|
|
311
|
+
typeof version === 'number' && Number.isFinite(version)
|
|
312
|
+
? version
|
|
313
|
+
: detectSupportLevel();
|
|
314
|
+
|
|
315
|
+
EmojiIndex.load(supportLevel)
|
|
316
|
+
.then((index) => {
|
|
317
|
+
if (cancelled() || this.isDestroying) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this.index = index;
|
|
321
|
+
this.status = 'ready';
|
|
322
|
+
this.announcement = '';
|
|
323
|
+
})
|
|
324
|
+
.catch((error: unknown) => {
|
|
325
|
+
if (cancelled() || this.isDestroying) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// A picker that cannot load its data is a missing picker, not a
|
|
329
|
+
// broken one — say so in text and keep the trigger usable.
|
|
330
|
+
this.errorMessage =
|
|
331
|
+
error instanceof Error ? error.message : 'Could not load emoji.';
|
|
332
|
+
this.status = 'error';
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
// ── Categories ─────────────────────────────────────────────────────────
|
|
337
|
+
|
|
338
|
+
get tabs(): { id: number; key: string; sample: string; label: string }[] {
|
|
339
|
+
let tabs: { id: number; key: string; sample: string; label: string }[] = [];
|
|
340
|
+
if (this.recent.length) {
|
|
341
|
+
tabs.push({
|
|
342
|
+
id: RECENT_GROUP,
|
|
343
|
+
key: 'recent',
|
|
344
|
+
// A clock face, because there is no clock icon in icon-registry.gts
|
|
345
|
+
// and an emoji tab strip is the one place a glyph is not a cop-out.
|
|
346
|
+
sample: '\u{1F553}',
|
|
347
|
+
label: 'Recently used',
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
for (let group of EMOJI_GROUPS) {
|
|
351
|
+
tabs.push({ id: group.id, key: group.key, sample: group.sample, label: group.label });
|
|
352
|
+
}
|
|
353
|
+
return tabs;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** The selected tab, clamped — the recent tab disappears when the list is
|
|
357
|
+
* empty, so a stale selection has to fall back to something real. */
|
|
358
|
+
get activeGroup(): number {
|
|
359
|
+
let tabs = this.tabs;
|
|
360
|
+
return tabs.some((t) => t.id === this.group) ? this.group : tabs[0]!.id;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
isSelectedTab = (id: number): boolean => !this.searching && id === this.activeGroup;
|
|
364
|
+
|
|
365
|
+
get panelLabel(): string {
|
|
366
|
+
if (this.searching) {
|
|
367
|
+
return 'Search results';
|
|
368
|
+
}
|
|
369
|
+
return this.tabs.find((t) => t.id === this.activeGroup)?.label ?? 'Emoji';
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// ── The current emoji list ─────────────────────────────────────────────
|
|
373
|
+
|
|
374
|
+
private get emojis(): readonly Emoji[] {
|
|
375
|
+
let index = this.index;
|
|
376
|
+
if (!index) {
|
|
377
|
+
return [];
|
|
378
|
+
}
|
|
379
|
+
if (this.searching) {
|
|
380
|
+
return index.search(this.query);
|
|
381
|
+
}
|
|
382
|
+
if (this.activeGroup === RECENT_GROUP) {
|
|
383
|
+
// Rehydrate from unicode. An emoji that has left the dataset, or that
|
|
384
|
+
// this browser's font cannot draw, silently drops out rather than
|
|
385
|
+
// rendering as tofu.
|
|
386
|
+
let out: Emoji[] = [];
|
|
387
|
+
for (let unicode of this.recent) {
|
|
388
|
+
let emoji = index.byUnicode(unicode);
|
|
389
|
+
if (emoji) {
|
|
390
|
+
out.push(emoji);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return out;
|
|
394
|
+
}
|
|
395
|
+
return index.byGroup(this.activeGroup);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
get cells(): Cell[] {
|
|
399
|
+
let tone = this.skinTone;
|
|
400
|
+
return this.emojis.map((emoji, i) => ({
|
|
401
|
+
emoji,
|
|
402
|
+
glyph: toneOf(emoji, tone),
|
|
403
|
+
index: i,
|
|
404
|
+
key: emoji.unicode,
|
|
405
|
+
}));
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** Chunked into `role='row'` groups. Recomputed on category / query /
|
|
409
|
+
* tone change — never on arrow keys, which is why roving tabindex is
|
|
410
|
+
* imperative. */
|
|
411
|
+
get rows(): { key: string; cells: Cell[] }[] {
|
|
412
|
+
let columns = this.columns;
|
|
413
|
+
let cells = this.cells;
|
|
414
|
+
let rows: { key: string; cells: Cell[] }[] = [];
|
|
415
|
+
for (let i = 0; i < cells.length; i += columns) {
|
|
416
|
+
let chunk = cells.slice(i, i + columns);
|
|
417
|
+
rows.push({ key: chunk[0]!.key, cells: chunk });
|
|
418
|
+
}
|
|
419
|
+
return rows;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
get isEmpty(): boolean {
|
|
423
|
+
return this.status === 'ready' && this.cells.length === 0;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/** Change key for `rovingGrid`: any of these means the cell list moved. */
|
|
427
|
+
get gridKey(): string {
|
|
428
|
+
return (
|
|
429
|
+
this.query + '|' + String(this.activeGroup) + '|' + String(this.skinTone) + '|' + String(this.cells.length)
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// ── Announcement ───────────────────────────────────────────────────────
|
|
434
|
+
|
|
435
|
+
/** What the live region SHOULD say once things settle. Derived from
|
|
436
|
+
* settled state only; the delay lives in `announceWhenIdle`, so nothing is
|
|
437
|
+
* announced per keystroke. */
|
|
438
|
+
get pendingAnnouncement(): string {
|
|
439
|
+
if (this.status !== 'ready' || !this.searching) {
|
|
440
|
+
return '';
|
|
441
|
+
}
|
|
442
|
+
let n = this.cells.length;
|
|
443
|
+
if (n === 0) {
|
|
444
|
+
return 'No emoji found';
|
|
445
|
+
}
|
|
446
|
+
// "emoji" is invariant in the plural, which is why this reads better than
|
|
447
|
+
// DataComponent's generic pluraliser would ("1 emojis").
|
|
448
|
+
return String(n) + ' emoji found';
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
setAnnouncement = (text: string) => {
|
|
452
|
+
if (!this.isDestroying) {
|
|
453
|
+
this.announcement = text;
|
|
454
|
+
}
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
// ── Preview ────────────────────────────────────────────────────────────
|
|
458
|
+
|
|
459
|
+
get preview(): Cell | undefined {
|
|
460
|
+
let cells = this.cells;
|
|
461
|
+
if (!cells.length) {
|
|
462
|
+
return undefined;
|
|
463
|
+
}
|
|
464
|
+
let i = this.previewIndex >= 0 ? this.previewIndex : this.focusedIndex;
|
|
465
|
+
return cells[Math.max(0, Math.min(cells.length - 1, i))];
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
setPreview = (index: number) => {
|
|
469
|
+
this.previewIndex = index;
|
|
470
|
+
};
|
|
471
|
+
clearPreview = () => {
|
|
472
|
+
this.previewIndex = -1;
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
// ── Search ─────────────────────────────────────────────────────────────
|
|
476
|
+
|
|
477
|
+
onSearchInput = (event: Event) => {
|
|
478
|
+
// Search is a Map lookup over an in-memory index, so it runs on every
|
|
479
|
+
// keystroke with no debounce at all. Upstream debounces because its
|
|
480
|
+
// search is an IndexedDB round trip — removing the data fetch removed the
|
|
481
|
+
// reason for the timer, which is the single most dangerous thing a realm
|
|
482
|
+
// component can hold.
|
|
483
|
+
this.query = (event.target as HTMLInputElement).value;
|
|
484
|
+
this.focusedIndex = 0;
|
|
485
|
+
this.previewIndex = -1;
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
clearSearch = () => {
|
|
489
|
+
this.query = '';
|
|
490
|
+
this.focusedIndex = 0;
|
|
491
|
+
this.previewIndex = -1;
|
|
492
|
+
this.gridHasFocus = false;
|
|
493
|
+
};
|
|
494
|
+
|
|
495
|
+
onSearchKeydown = (rawEvent: Event) => {
|
|
496
|
+
let event = rawEvent as KeyboardEvent;
|
|
497
|
+
if (event.key === 'ArrowDown' || event.key === 'Enter') {
|
|
498
|
+
if (this.cells.length) {
|
|
499
|
+
event.preventDefault();
|
|
500
|
+
this.focusedIndex = 0;
|
|
501
|
+
this.gridHasFocus = true;
|
|
502
|
+
}
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (event.key === 'Escape' && this.query !== '') {
|
|
506
|
+
// Escape clears the field before it reaches whatever surface is hosting
|
|
507
|
+
// the picker, so the first Escape does not also close the popover.
|
|
508
|
+
event.preventDefault();
|
|
509
|
+
event.stopPropagation();
|
|
510
|
+
this.clearSearch();
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
// ── Tabs ───────────────────────────────────────────────────────────────
|
|
515
|
+
|
|
516
|
+
selectGroup = (id: number) => {
|
|
517
|
+
this.group = id;
|
|
518
|
+
this.query = '';
|
|
519
|
+
this.focusedIndex = 0;
|
|
520
|
+
this.previewIndex = -1;
|
|
521
|
+
this.gridHasFocus = false;
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
onTabKeydown = (rawEvent: Event) => {
|
|
525
|
+
let event = rawEvent as KeyboardEvent;
|
|
526
|
+
let tabs = this.tabs;
|
|
527
|
+
let current = tabs.findIndex((t) => t.id === this.activeGroup);
|
|
528
|
+
let next = current;
|
|
529
|
+
switch (event.key) {
|
|
530
|
+
case 'ArrowRight':
|
|
531
|
+
next = (current + 1) % tabs.length;
|
|
532
|
+
break;
|
|
533
|
+
case 'ArrowLeft':
|
|
534
|
+
next = (current - 1 + tabs.length) % tabs.length;
|
|
535
|
+
break;
|
|
536
|
+
case 'Home':
|
|
537
|
+
next = 0;
|
|
538
|
+
break;
|
|
539
|
+
case 'End':
|
|
540
|
+
next = tabs.length - 1;
|
|
541
|
+
break;
|
|
542
|
+
case 'ArrowDown':
|
|
543
|
+
if (this.cells.length) {
|
|
544
|
+
event.preventDefault();
|
|
545
|
+
this.focusedIndex = 0;
|
|
546
|
+
this.gridHasFocus = true;
|
|
547
|
+
}
|
|
548
|
+
return;
|
|
549
|
+
default:
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
event.preventDefault();
|
|
553
|
+
// Automatic activation: switching category is cheap and non-destructive,
|
|
554
|
+
// which is the condition APG puts on selection-follows-focus for tabs.
|
|
555
|
+
this.selectGroup(tabs[next]!.id);
|
|
556
|
+
(event.currentTarget as HTMLElement)
|
|
557
|
+
?.querySelectorAll<HTMLElement>('[role="tab"]')
|
|
558
|
+
[next]?.focus();
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
// ── Grid keyboard ──────────────────────────────────────────────────────
|
|
562
|
+
|
|
563
|
+
onGridKeydown = (rawEvent: Event) => {
|
|
564
|
+
let event = rawEvent as KeyboardEvent;
|
|
565
|
+
let count = this.cells.length;
|
|
566
|
+
if (!count) {
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
let columns = this.columns;
|
|
570
|
+
let i = this.focusedIndex;
|
|
571
|
+
let next = i;
|
|
572
|
+
|
|
573
|
+
switch (event.key) {
|
|
574
|
+
case 'ArrowRight':
|
|
575
|
+
next = Math.min(count - 1, i + 1);
|
|
576
|
+
break;
|
|
577
|
+
case 'ArrowLeft':
|
|
578
|
+
next = Math.max(0, i - 1);
|
|
579
|
+
break;
|
|
580
|
+
case 'ArrowDown':
|
|
581
|
+
next = i + columns < count ? i + columns : i;
|
|
582
|
+
break;
|
|
583
|
+
case 'ArrowUp':
|
|
584
|
+
if (i - columns < 0) {
|
|
585
|
+
// Leaving the top row returns to the search field rather than
|
|
586
|
+
// trapping focus — the grid is not a dialog.
|
|
587
|
+
event.preventDefault();
|
|
588
|
+
this.gridHasFocus = false;
|
|
589
|
+
this.focusSearch();
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
next = i - columns;
|
|
593
|
+
break;
|
|
594
|
+
case 'Home':
|
|
595
|
+
next = event.ctrlKey || event.metaKey ? 0 : i - (i % columns);
|
|
596
|
+
break;
|
|
597
|
+
case 'End':
|
|
598
|
+
next =
|
|
599
|
+
event.ctrlKey || event.metaKey
|
|
600
|
+
? count - 1
|
|
601
|
+
: Math.min(count - 1, i - (i % columns) + columns - 1);
|
|
602
|
+
break;
|
|
603
|
+
case 'PageDown':
|
|
604
|
+
next = Math.min(count - 1, i + columns * PAGE_ROWS);
|
|
605
|
+
break;
|
|
606
|
+
case 'PageUp':
|
|
607
|
+
next = Math.max(0, i - columns * PAGE_ROWS);
|
|
608
|
+
break;
|
|
609
|
+
case 'Escape':
|
|
610
|
+
event.preventDefault();
|
|
611
|
+
event.stopPropagation();
|
|
612
|
+
this.gridHasFocus = false;
|
|
613
|
+
this.focusSearch();
|
|
614
|
+
return;
|
|
615
|
+
default:
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
event.preventDefault();
|
|
619
|
+
this.focusedIndex = next;
|
|
620
|
+
this.previewIndex = -1;
|
|
621
|
+
this.gridHasFocus = true;
|
|
622
|
+
};
|
|
623
|
+
|
|
624
|
+
private focusSearch() {
|
|
625
|
+
let root = document.getElementById(this.searchId);
|
|
626
|
+
root?.focus();
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Keep the roving stop in step when focus arrives by any route we did not
|
|
631
|
+
* initiate — a click, a Tab, a screen reader moving the virtual cursor.
|
|
632
|
+
*
|
|
633
|
+
* The equality guard is load-bearing, not defensive. `rovingGrid` READS
|
|
634
|
+
* `focusedIndex` and then calls `focus()` on that cell, which fires this
|
|
635
|
+
* handler synchronously inside the same render computation; writing the
|
|
636
|
+
* value back there is a backtracking re-render and Glimmer asserts on it
|
|
637
|
+
* ("you attempted to update `focusedIndex` … but it had already been used").
|
|
638
|
+
* When the focus was ours the index already matches, so returning early
|
|
639
|
+
* makes the self-inflicted case a no-op and leaves the genuine ones alone.
|
|
640
|
+
*/
|
|
641
|
+
onCellFocus = (index: number) => {
|
|
642
|
+
if (this.focusedIndex === index) {
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
645
|
+
this.focusedIndex = index;
|
|
646
|
+
this.previewIndex = -1;
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
// ── Selection ──────────────────────────────────────────────────────────
|
|
650
|
+
|
|
651
|
+
choose = (cell: Cell) => {
|
|
652
|
+
let base = cell.emoji.unicode;
|
|
653
|
+
// Recency is positional: drop any existing occurrence, put this one at
|
|
654
|
+
// the front, trim to the limit. No timestamps, so the ordering is
|
|
655
|
+
// reproducible and the realm's no-wall-clock law is satisfied by
|
|
656
|
+
// construction rather than by care.
|
|
657
|
+
let next = [base, ...this.recent.filter((u) => u !== base)].slice(
|
|
658
|
+
0,
|
|
659
|
+
this.recentLimit,
|
|
660
|
+
);
|
|
661
|
+
if (this.args.recent === undefined) {
|
|
662
|
+
this.internalRecent = next;
|
|
663
|
+
}
|
|
664
|
+
this.args.onRecent?.(next);
|
|
665
|
+
this.args.onSelect?.({
|
|
666
|
+
unicode: cell.glyph,
|
|
667
|
+
annotation: cell.emoji.annotation,
|
|
668
|
+
base,
|
|
669
|
+
skinTone: this.skinTone,
|
|
670
|
+
});
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
// ── Skin tone ──────────────────────────────────────────────────────────
|
|
674
|
+
|
|
675
|
+
get toneGlyph(): string {
|
|
676
|
+
return applySkinTone(SKIN_TONE_SAMPLE, this.skinTone);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
get toneLabel(): string {
|
|
680
|
+
return 'Skin tone: ' + (SKIN_TONE_LABELS[this.skinTone] ?? 'Default');
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
get toneOptions(): { tone: number; glyph: string; label: string }[] {
|
|
684
|
+
return SKIN_TONE_LABELS.map((label, tone) => ({
|
|
685
|
+
tone,
|
|
686
|
+
glyph: applySkinTone(SKIN_TONE_SAMPLE, tone),
|
|
687
|
+
label,
|
|
688
|
+
}));
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
get toneActiveId(): string {
|
|
692
|
+
return this.toneOptionId(this.toneActive);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
isActiveTone = (tone: number): boolean => tone === this.toneActive;
|
|
696
|
+
|
|
697
|
+
toggleTones = () => {
|
|
698
|
+
this.toneOpen = !this.toneOpen;
|
|
699
|
+
if (this.toneOpen) {
|
|
700
|
+
this.toneActive = this.skinTone;
|
|
701
|
+
}
|
|
702
|
+
};
|
|
703
|
+
|
|
704
|
+
commitTone = (tone: number) => {
|
|
705
|
+
if (this.args.skinTone === undefined) {
|
|
706
|
+
this.internalTone = tone;
|
|
707
|
+
}
|
|
708
|
+
this.args.onSkinTone?.(tone);
|
|
709
|
+
this.toneOpen = false;
|
|
710
|
+
document.getElementById(this.toneButtonId)?.focus();
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
onToneKeydown = (rawEvent: Event) => {
|
|
714
|
+
let event = rawEvent as KeyboardEvent;
|
|
715
|
+
let last = SKIN_TONE_LABELS.length - 1;
|
|
716
|
+
switch (event.key) {
|
|
717
|
+
case 'ArrowDown':
|
|
718
|
+
case 'ArrowRight':
|
|
719
|
+
event.preventDefault();
|
|
720
|
+
this.toneActive = Math.min(last, this.toneActive + 1);
|
|
721
|
+
break;
|
|
722
|
+
case 'ArrowUp':
|
|
723
|
+
case 'ArrowLeft':
|
|
724
|
+
event.preventDefault();
|
|
725
|
+
this.toneActive = Math.max(0, this.toneActive - 1);
|
|
726
|
+
break;
|
|
727
|
+
case 'Home':
|
|
728
|
+
event.preventDefault();
|
|
729
|
+
this.toneActive = 0;
|
|
730
|
+
break;
|
|
731
|
+
case 'End':
|
|
732
|
+
event.preventDefault();
|
|
733
|
+
this.toneActive = last;
|
|
734
|
+
break;
|
|
735
|
+
case 'Enter':
|
|
736
|
+
case ' ':
|
|
737
|
+
event.preventDefault();
|
|
738
|
+
this.commitTone(this.toneActive);
|
|
739
|
+
break;
|
|
740
|
+
case 'Escape':
|
|
741
|
+
event.preventDefault();
|
|
742
|
+
event.stopPropagation();
|
|
743
|
+
this.toneOpen = false;
|
|
744
|
+
document.getElementById(this.toneButtonId)?.focus();
|
|
745
|
+
break;
|
|
746
|
+
default:
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
onToneButtonKeydown = (rawEvent: Event) => {
|
|
751
|
+
let event = rawEvent as KeyboardEvent;
|
|
752
|
+
if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {
|
|
753
|
+
event.preventDefault();
|
|
754
|
+
if (!this.toneOpen) {
|
|
755
|
+
this.toggleTones();
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
};
|
|
759
|
+
|
|
760
|
+
<template>
|
|
761
|
+
<div
|
|
762
|
+
class='pretui-emoji'
|
|
763
|
+
role='group'
|
|
764
|
+
aria-label={{this.label}}
|
|
765
|
+
style={{this.rootStyle}}
|
|
766
|
+
data-test-pretui-emoji-picker
|
|
767
|
+
data-status={{this.status}}
|
|
768
|
+
{{buildIndex this.load}}
|
|
769
|
+
{{announceWhenIdle
|
|
770
|
+
this.pendingAnnouncement
|
|
771
|
+
ANNOUNCE_DELAY
|
|
772
|
+
this.setAnnouncement
|
|
773
|
+
}}
|
|
774
|
+
...attributes
|
|
775
|
+
>
|
|
776
|
+
<div class='epx-top'>
|
|
777
|
+
<span class='epx-searchwrap'>
|
|
778
|
+
<svg
|
|
779
|
+
class='epx-magnifier'
|
|
780
|
+
viewBox='0 0 16 16'
|
|
781
|
+
aria-hidden='true'
|
|
782
|
+
focusable='false'
|
|
783
|
+
><circle
|
|
784
|
+
cx='7'
|
|
785
|
+
cy='7'
|
|
786
|
+
r='4.25'
|
|
787
|
+
fill='none'
|
|
788
|
+
stroke='currentColor'
|
|
789
|
+
stroke-width='1.5'
|
|
790
|
+
/><path
|
|
791
|
+
d='M10.2 10.2L14 14'
|
|
792
|
+
fill='none'
|
|
793
|
+
stroke='currentColor'
|
|
794
|
+
stroke-width='1.5'
|
|
795
|
+
stroke-linecap='round'
|
|
796
|
+
/></svg>
|
|
797
|
+
{{! A real <label>, visually hidden, rather than aria-label — realm
|
|
798
|
+
lint counts aria-label beside a placeholder as two labels, and
|
|
799
|
+
a placeholder was never a label. The visible hint is painted. }}
|
|
800
|
+
<label for={{this.searchId}} class='epx-sr'>Search emoji</label>
|
|
801
|
+
{{#unless this.query}}
|
|
802
|
+
<span class='epx-ghost' aria-hidden='true'>Search emoji</span>
|
|
803
|
+
{{/unless}}
|
|
804
|
+
<input
|
|
805
|
+
id={{this.searchId}}
|
|
806
|
+
class='epx-search'
|
|
807
|
+
type='search'
|
|
808
|
+
autocomplete='off'
|
|
809
|
+
autocapitalize='none'
|
|
810
|
+
spellcheck='false'
|
|
811
|
+
enterkeyhint='search'
|
|
812
|
+
aria-controls={{this.panelId}}
|
|
813
|
+
aria-describedby={{this.hintId}}
|
|
814
|
+
value={{this.query}}
|
|
815
|
+
data-test-pretui-emoji-search
|
|
816
|
+
{{focusOnce this.shouldAutofocus}}
|
|
817
|
+
{{on 'input' this.onSearchInput}}
|
|
818
|
+
{{on 'keydown' this.onSearchKeydown}}
|
|
819
|
+
/>
|
|
820
|
+
{{#if this.query}}
|
|
821
|
+
<button
|
|
822
|
+
type='button'
|
|
823
|
+
class='epx-clear'
|
|
824
|
+
aria-label='Clear search'
|
|
825
|
+
data-test-pretui-emoji-clear
|
|
826
|
+
{{on 'click' this.clearSearch}}
|
|
827
|
+
>
|
|
828
|
+
<svg
|
|
829
|
+
width='12'
|
|
830
|
+
height='12'
|
|
831
|
+
viewBox='0 0 12 12'
|
|
832
|
+
aria-hidden='true'
|
|
833
|
+
focusable='false'
|
|
834
|
+
><path
|
|
835
|
+
d='M3 3l6 6M9 3l-6 6'
|
|
836
|
+
fill='none'
|
|
837
|
+
stroke='currentColor'
|
|
838
|
+
stroke-width='1.5'
|
|
839
|
+
stroke-linecap='round'
|
|
840
|
+
/></svg>
|
|
841
|
+
</button>
|
|
842
|
+
{{/if}}
|
|
843
|
+
</span>
|
|
844
|
+
|
|
845
|
+
<span class='epx-tonewrap'>
|
|
846
|
+
<button
|
|
847
|
+
type='button'
|
|
848
|
+
id={{this.toneButtonId}}
|
|
849
|
+
class='epx-tonebutton'
|
|
850
|
+
aria-label={{this.toneLabel}}
|
|
851
|
+
aria-haspopup='listbox'
|
|
852
|
+
aria-expanded={{if this.toneOpen 'true' 'false'}}
|
|
853
|
+
aria-controls={{this.toneListId}}
|
|
854
|
+
data-test-pretui-emoji-tone-button
|
|
855
|
+
{{on 'click' this.toggleTones}}
|
|
856
|
+
{{on 'keydown' this.onToneButtonKeydown}}
|
|
857
|
+
>
|
|
858
|
+
<span class='epx-glyph' aria-hidden='true'>{{this.toneGlyph}}</span>
|
|
859
|
+
</button>
|
|
860
|
+
{{#if this.toneOpen}}
|
|
861
|
+
<div
|
|
862
|
+
id={{this.toneListId}}
|
|
863
|
+
class='epx-tonelist'
|
|
864
|
+
role='listbox'
|
|
865
|
+
aria-label='Skin tones'
|
|
866
|
+
aria-activedescendant={{this.toneActiveId}}
|
|
867
|
+
tabindex='0'
|
|
868
|
+
data-test-pretui-emoji-tone-list
|
|
869
|
+
{{focusOnce true}}
|
|
870
|
+
{{listen 'keydown' this.onToneKeydown}}
|
|
871
|
+
>
|
|
872
|
+
{{#each this.toneOptions key='tone' as |option|}}
|
|
873
|
+
<div
|
|
874
|
+
id={{this.toneOptionId option.tone}}
|
|
875
|
+
class='epx-toneoption'
|
|
876
|
+
role='option'
|
|
877
|
+
aria-selected={{if (this.isActiveTone option.tone) 'true' 'false'}}
|
|
878
|
+
data-active={{if (this.isActiveTone option.tone) 'true'}}
|
|
879
|
+
data-test-pretui-emoji-tone-option
|
|
880
|
+
{{on 'click' (fn this.commitTone option.tone)}}
|
|
881
|
+
>
|
|
882
|
+
<span class='epx-glyph' aria-hidden='true'>{{option.glyph}}</span>
|
|
883
|
+
<span class='epx-tonename'>{{option.label}}</span>
|
|
884
|
+
</div>
|
|
885
|
+
{{/each}}
|
|
886
|
+
</div>
|
|
887
|
+
{{/if}}
|
|
888
|
+
</span>
|
|
889
|
+
</div>
|
|
890
|
+
|
|
891
|
+
<div
|
|
892
|
+
class='epx-tabs'
|
|
893
|
+
role='tablist'
|
|
894
|
+
aria-label='Emoji categories'
|
|
895
|
+
data-test-pretui-emoji-tabs
|
|
896
|
+
{{listen 'keydown' this.onTabKeydown}}
|
|
897
|
+
>
|
|
898
|
+
{{#each this.tabs key='key' as |tab|}}
|
|
899
|
+
<button
|
|
900
|
+
type='button'
|
|
901
|
+
role='tab'
|
|
902
|
+
id={{this.tabId tab.id}}
|
|
903
|
+
class='epx-tab'
|
|
904
|
+
aria-label={{tab.label}}
|
|
905
|
+
aria-selected={{if (this.isSelectedTab tab.id) 'true' 'false'}}
|
|
906
|
+
aria-controls={{this.panelId}}
|
|
907
|
+
tabindex={{if (this.isSelectedTab tab.id) '0' '-1'}}
|
|
908
|
+
data-selected={{if (this.isSelectedTab tab.id) 'true'}}
|
|
909
|
+
data-test-pretui-emoji-tab
|
|
910
|
+
{{on 'click' (fn this.selectGroup tab.id)}}
|
|
911
|
+
>
|
|
912
|
+
<span class='epx-glyph' aria-hidden='true'>{{tab.sample}}</span>
|
|
913
|
+
</button>
|
|
914
|
+
{{/each}}
|
|
915
|
+
</div>
|
|
916
|
+
|
|
917
|
+
<span id={{this.hintId}} class='epx-sr'>Type to filter emoji, then press
|
|
918
|
+
the down arrow to move into the grid.</span>
|
|
919
|
+
|
|
920
|
+
<div
|
|
921
|
+
id={{this.panelId}}
|
|
922
|
+
class='epx-panel'
|
|
923
|
+
role='tabpanel'
|
|
924
|
+
aria-label={{this.panelLabel}}
|
|
925
|
+
aria-busy={{if this.isLoading 'true' 'false'}}
|
|
926
|
+
data-test-pretui-emoji-panel
|
|
927
|
+
>
|
|
928
|
+
{{#if this.isLoading}}
|
|
929
|
+
<div class='epx-state' data-test-pretui-emoji-loading>
|
|
930
|
+
<span class='epx-skeleton' aria-hidden='true'></span>
|
|
931
|
+
<span class='epx-statetext'>Loading emoji…</span>
|
|
932
|
+
</div>
|
|
933
|
+
{{else if this.isError}}
|
|
934
|
+
<div class='epx-state' data-test-pretui-emoji-error>
|
|
935
|
+
<span class='epx-stateglyph' aria-hidden='true'>⚠</span>
|
|
936
|
+
<span class='epx-statetext'>{{this.errorMessage}}</span>
|
|
937
|
+
</div>
|
|
938
|
+
{{else if this.isEmpty}}
|
|
939
|
+
{{! A magnifier EMOJI as the empty-state icon was the one place in
|
|
940
|
+
the kit where a colour pictogram stood in for an icon — and the
|
|
941
|
+
worst possible place for it, because the grid it replaces is
|
|
942
|
+
made of colour pictograms, so the mark had no figure/ground
|
|
943
|
+
distinction from the content that was missing. The empty state
|
|
944
|
+
now does what an empty state is for: name the term that found
|
|
945
|
+
nothing, and offer the way out. }}
|
|
946
|
+
<div class='epx-state' data-test-pretui-emoji-empty>
|
|
947
|
+
<span class='epx-statetext'>No emoji match
|
|
948
|
+
<span class='epx-stateterm'>{{this.query}}</span></span>
|
|
949
|
+
<button
|
|
950
|
+
type='button'
|
|
951
|
+
class='epx-stateaction'
|
|
952
|
+
data-test-pretui-emoji-empty-clear
|
|
953
|
+
{{on 'click' this.clearSearch}}
|
|
954
|
+
>Clear the search</button>
|
|
955
|
+
</div>
|
|
956
|
+
{{else}}
|
|
957
|
+
<div
|
|
958
|
+
class='epx-grid'
|
|
959
|
+
role='grid'
|
|
960
|
+
aria-label={{this.panelLabel}}
|
|
961
|
+
aria-rowcount={{this.rows.length}}
|
|
962
|
+
aria-colcount={{this.columns}}
|
|
963
|
+
data-test-pretui-emoji-grid
|
|
964
|
+
{{rovingGrid this.focusedIndex this.gridHasFocus this.gridKey}}
|
|
965
|
+
{{listen 'keydown' this.onGridKeydown}}
|
|
966
|
+
{{listen 'mouseleave' this.clearPreview}}
|
|
967
|
+
>
|
|
968
|
+
{{#each this.rows key='key' as |row|}}
|
|
969
|
+
<div class='epx-row' role='row'>
|
|
970
|
+
{{#each row.cells key='key' as |cell|}}
|
|
971
|
+
<button
|
|
972
|
+
type='button'
|
|
973
|
+
role='gridcell'
|
|
974
|
+
class='epx-cell'
|
|
975
|
+
aria-label={{cell.emoji.annotation}}
|
|
976
|
+
data-emoji-cell
|
|
977
|
+
data-test-pretui-emoji-cell
|
|
978
|
+
{{on 'click' (fn this.choose cell)}}
|
|
979
|
+
{{on 'focus' (fn this.onCellFocus cell.index)}}
|
|
980
|
+
{{on 'mouseenter' (fn this.setPreview cell.index)}}
|
|
981
|
+
>
|
|
982
|
+
<span class='epx-glyph' aria-hidden='true'>{{cell.glyph}}</span>
|
|
983
|
+
</button>
|
|
984
|
+
{{/each}}
|
|
985
|
+
</div>
|
|
986
|
+
{{/each}}
|
|
987
|
+
</div>
|
|
988
|
+
{{/if}}
|
|
989
|
+
</div>
|
|
990
|
+
|
|
991
|
+
<div class='epx-preview' data-test-pretui-emoji-preview>
|
|
992
|
+
{{#if this.preview}}
|
|
993
|
+
<span class='epx-glyph epx-previewglyph' aria-hidden='true'>
|
|
994
|
+
{{this.preview.glyph}}
|
|
995
|
+
</span>
|
|
996
|
+
<span class='epx-previewname'>{{this.preview.emoji.annotation}}</span>
|
|
997
|
+
{{else}}
|
|
998
|
+
<span class='epx-previewname epx-previewidle'>Pick an emoji</span>
|
|
999
|
+
{{/if}}
|
|
1000
|
+
</div>
|
|
1001
|
+
|
|
1002
|
+
{{! Polite, and only after the query has been still for a beat — a
|
|
1003
|
+
screen reader must not read a result count on every keystroke. }}
|
|
1004
|
+
<p class='epx-sr' role='status' data-test-pretui-emoji-live>
|
|
1005
|
+
{{this.announcement}}
|
|
1006
|
+
</p>
|
|
1007
|
+
</div>
|
|
1008
|
+
|
|
1009
|
+
<style scoped>
|
|
1010
|
+
@layer PretComponent {
|
|
1011
|
+
/* Zero dark branches: every value is a token with a light-value
|
|
1012
|
+
fallback, so the theme frame re-dresses the picker without this file
|
|
1013
|
+
knowing a theme exists. Upstream forks on prefers-color-scheme
|
|
1014
|
+
inside its shadow root, which is why a dark Pretui frame on a light
|
|
1015
|
+
OS gave you a light picker. */
|
|
1016
|
+
.pretui-emoji {
|
|
1017
|
+
--pretui-emoji-size: var(--pretui-emoji-cell, 2rem);
|
|
1018
|
+
--pretui-emoji-gap: 2px;
|
|
1019
|
+
|
|
1020
|
+
display: flex;
|
|
1021
|
+
flex-direction: column;
|
|
1022
|
+
gap: 8px;
|
|
1023
|
+
inline-size: 100%;
|
|
1024
|
+
max-inline-size: var(--pretui-emoji-width, 22rem);
|
|
1025
|
+
padding: 10px;
|
|
1026
|
+
border-radius: var(--radius-surface, 12px);
|
|
1027
|
+
background: var(--card);
|
|
1028
|
+
color: var(--foreground);
|
|
1029
|
+
/* Law 1 — depth is hairline + shadow, never a contrast border. */
|
|
1030
|
+
box-shadow: var(
|
|
1031
|
+
--pretui-shadow-card,
|
|
1032
|
+
0 0 0 1px var(--border),
|
|
1033
|
+
0 1px 2px rgb(0 0 0 / 0.2),
|
|
1034
|
+
0 2px 6px rgb(0 0 0 / 0.2)
|
|
1035
|
+
);
|
|
1036
|
+
font-family: var(--font-sans);
|
|
1037
|
+
font-size: var(--text-ui-md, 12.5px);
|
|
1038
|
+
letter-spacing: var(--track-ui, 0.01em);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
.epx-sr {
|
|
1042
|
+
position: absolute;
|
|
1043
|
+
inline-size: 1px;
|
|
1044
|
+
block-size: 1px;
|
|
1045
|
+
margin: -1px;
|
|
1046
|
+
padding: 0;
|
|
1047
|
+
overflow: hidden;
|
|
1048
|
+
clip-path: inset(50%);
|
|
1049
|
+
white-space: nowrap;
|
|
1050
|
+
border: 0;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/* ── Search row ─────────────────────────────────────────────────── */
|
|
1054
|
+
.epx-top {
|
|
1055
|
+
display: flex;
|
|
1056
|
+
align-items: center;
|
|
1057
|
+
gap: 6px;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
.epx-searchwrap {
|
|
1061
|
+
position: relative;
|
|
1062
|
+
display: flex;
|
|
1063
|
+
align-items: center;
|
|
1064
|
+
flex: 1 1 auto;
|
|
1065
|
+
min-inline-size: 0;
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
.epx-magnifier {
|
|
1069
|
+
position: absolute;
|
|
1070
|
+
inset-inline-start: 8px;
|
|
1071
|
+
inline-size: 14px;
|
|
1072
|
+
block-size: 14px;
|
|
1073
|
+
color: var(--muted-foreground);
|
|
1074
|
+
pointer-events: none;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
.epx-ghost {
|
|
1078
|
+
position: absolute;
|
|
1079
|
+
inset-inline-start: 28px;
|
|
1080
|
+
color: var(--muted-foreground);
|
|
1081
|
+
pointer-events: none;
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
.epx-search {
|
|
1085
|
+
inline-size: 100%;
|
|
1086
|
+
min-inline-size: 0;
|
|
1087
|
+
padding: 6px 28px 6px 28px;
|
|
1088
|
+
border: 0;
|
|
1089
|
+
border-radius: var(--radius);
|
|
1090
|
+
background: var(--field, var(--boxel-light));
|
|
1091
|
+
color: inherit;
|
|
1092
|
+
font: inherit;
|
|
1093
|
+
letter-spacing: inherit;
|
|
1094
|
+
box-shadow: inset 0 0 0 1px var(--input);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
.epx-search::-webkit-search-cancel-button {
|
|
1098
|
+
/* The picker ships its own clear button, with an accessible name and
|
|
1099
|
+
a focus ring; the UA one has neither. */
|
|
1100
|
+
appearance: none;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
.epx-search:focus-visible,
|
|
1104
|
+
.epx-tonebutton:focus-visible,
|
|
1105
|
+
.epx-tab:focus-visible,
|
|
1106
|
+
.epx-clear:focus-visible,
|
|
1107
|
+
.epx-cell:focus-visible,
|
|
1108
|
+
.epx-tonelist:focus-visible {
|
|
1109
|
+
outline: 2px solid var(--ring);
|
|
1110
|
+
outline-offset: 1px;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
.epx-clear {
|
|
1114
|
+
position: absolute;
|
|
1115
|
+
inset-inline-end: 4px;
|
|
1116
|
+
display: grid;
|
|
1117
|
+
place-items: center;
|
|
1118
|
+
inline-size: 20px;
|
|
1119
|
+
block-size: 20px;
|
|
1120
|
+
padding: 0;
|
|
1121
|
+
border: 0;
|
|
1122
|
+
border-radius: 999px;
|
|
1123
|
+
background: transparent;
|
|
1124
|
+
color: var(--muted-foreground);
|
|
1125
|
+
cursor: pointer;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
.epx-clear:hover {
|
|
1129
|
+
background: var(--muted);
|
|
1130
|
+
color: var(--foreground);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
/* ── Skin tone ──────────────────────────────────────────────────── */
|
|
1134
|
+
.epx-tonewrap {
|
|
1135
|
+
position: relative;
|
|
1136
|
+
flex: 0 0 auto;
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
.epx-tonebutton {
|
|
1140
|
+
display: grid;
|
|
1141
|
+
place-items: center;
|
|
1142
|
+
inline-size: var(--pretui-emoji-size);
|
|
1143
|
+
block-size: var(--pretui-emoji-size);
|
|
1144
|
+
padding: 0;
|
|
1145
|
+
border: 0;
|
|
1146
|
+
border-radius: var(--radius);
|
|
1147
|
+
background: transparent;
|
|
1148
|
+
cursor: pointer;
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
.epx-tonebutton:hover {
|
|
1152
|
+
background: var(--muted);
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
.epx-tonelist {
|
|
1156
|
+
position: absolute;
|
|
1157
|
+
inset-inline-end: 0;
|
|
1158
|
+
inset-block-start: calc(100% + 4px);
|
|
1159
|
+
/* The one place this component stacks: a panel floating over the
|
|
1160
|
+
picker's own content. Token first, literal fallback mandatory. */
|
|
1161
|
+
z-index: var(--pretui-z-dropdown, 60);
|
|
1162
|
+
display: flex;
|
|
1163
|
+
flex-direction: column;
|
|
1164
|
+
min-inline-size: 10rem;
|
|
1165
|
+
padding: 4px;
|
|
1166
|
+
border-radius: var(--radius);
|
|
1167
|
+
background: var(--popover);
|
|
1168
|
+
box-shadow: var(
|
|
1169
|
+
--pretui-shadow-overlay,
|
|
1170
|
+
0 0 0 1px var(--border),
|
|
1171
|
+
0 8px 28px rgb(0 0 0 / 0.34)
|
|
1172
|
+
);
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
.epx-toneoption {
|
|
1176
|
+
display: flex;
|
|
1177
|
+
align-items: center;
|
|
1178
|
+
gap: 8px;
|
|
1179
|
+
padding: 4px 8px;
|
|
1180
|
+
border-radius: var(--radius-sm, 8px);
|
|
1181
|
+
cursor: pointer;
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
.epx-toneoption:hover,
|
|
1185
|
+
.epx-toneoption[data-active='true'] {
|
|
1186
|
+
background: var(--muted);
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/* Never colour alone: the active tone is named in text beside the
|
|
1190
|
+
swatch and carries aria-selected. */
|
|
1191
|
+
.epx-tonename {
|
|
1192
|
+
color: var(--muted-foreground);
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
.epx-toneoption[data-active='true'] .epx-tonename {
|
|
1196
|
+
color: var(--foreground);
|
|
1197
|
+
font-weight: 600;
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/* ── Category tabs ──────────────────────────────────────────────── */
|
|
1201
|
+
.epx-tabs {
|
|
1202
|
+
display: grid;
|
|
1203
|
+
grid-auto-flow: column;
|
|
1204
|
+
grid-auto-columns: 1fr;
|
|
1205
|
+
gap: 2px;
|
|
1206
|
+
padding-block-end: 6px;
|
|
1207
|
+
box-shadow: inset 0 -1px 0 var(--border);
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
.epx-tab {
|
|
1211
|
+
position: relative;
|
|
1212
|
+
display: grid;
|
|
1213
|
+
place-items: center;
|
|
1214
|
+
block-size: 1.75rem;
|
|
1215
|
+
padding: 0;
|
|
1216
|
+
border: 0;
|
|
1217
|
+
border-radius: var(--radius-sm, 8px);
|
|
1218
|
+
background: transparent;
|
|
1219
|
+
cursor: pointer;
|
|
1220
|
+
opacity: 0.55;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
.epx-tab:hover {
|
|
1224
|
+
opacity: 1;
|
|
1225
|
+
background: var(--muted);
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
.epx-tab[data-selected='true'] {
|
|
1229
|
+
opacity: 1;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
/* The selected tab is marked by an underline AND by full opacity, so
|
|
1233
|
+
the state survives greyscale. */
|
|
1234
|
+
.epx-tab[data-selected='true']::after {
|
|
1235
|
+
content: '';
|
|
1236
|
+
position: absolute;
|
|
1237
|
+
inset-block-end: -6px;
|
|
1238
|
+
inset-inline: 15%;
|
|
1239
|
+
block-size: 2px;
|
|
1240
|
+
border-radius: 2px;
|
|
1241
|
+
background: var(--primary);
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
/* ── Grid ───────────────────────────────────────────────────────── */
|
|
1245
|
+
.epx-panel {
|
|
1246
|
+
block-size: var(--pretui-emoji-height, 15rem);
|
|
1247
|
+
overflow-y: auto;
|
|
1248
|
+
overscroll-behavior: contain;
|
|
1249
|
+
scrollbar-width: thin;
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
.epx-grid {
|
|
1253
|
+
display: flex;
|
|
1254
|
+
flex-direction: column;
|
|
1255
|
+
gap: var(--pretui-emoji-gap);
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
.epx-row {
|
|
1259
|
+
display: grid;
|
|
1260
|
+
grid-template-columns: repeat(var(--pretui-emoji-columns, 9), 1fr);
|
|
1261
|
+
gap: var(--pretui-emoji-gap);
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
.epx-cell {
|
|
1265
|
+
display: grid;
|
|
1266
|
+
place-items: center;
|
|
1267
|
+
aspect-ratio: 1;
|
|
1268
|
+
min-block-size: var(--pretui-emoji-size);
|
|
1269
|
+
padding: 0;
|
|
1270
|
+
border: 0;
|
|
1271
|
+
border-radius: var(--radius-sm, 8px);
|
|
1272
|
+
background: transparent;
|
|
1273
|
+
cursor: pointer;
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
.epx-cell:hover {
|
|
1277
|
+
background: var(--muted);
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
/* Emoji are painted by the colour-emoji font, never by currentColor —
|
|
1281
|
+
a colour font ignores it, so a "muted" emoji is a myth. Opacity is
|
|
1282
|
+
the only honest channel. */
|
|
1283
|
+
.epx-glyph {
|
|
1284
|
+
font-family: var(
|
|
1285
|
+
--pretui-emoji-font,
|
|
1286
|
+
'Twemoji Mozilla',
|
|
1287
|
+
'Apple Color Emoji',
|
|
1288
|
+
'Segoe UI Emoji',
|
|
1289
|
+
'Segoe UI Symbol',
|
|
1290
|
+
'Noto Color Emoji',
|
|
1291
|
+
'EmojiOne Color',
|
|
1292
|
+
'Android Emoji',
|
|
1293
|
+
sans-serif
|
|
1294
|
+
);
|
|
1295
|
+
font-size: var(--pretui-emoji-glyph, 1.25rem);
|
|
1296
|
+
line-height: 1;
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
/* ── States ─────────────────────────────────────────────────────── */
|
|
1300
|
+
.epx-state {
|
|
1301
|
+
display: flex;
|
|
1302
|
+
flex-direction: column;
|
|
1303
|
+
align-items: center;
|
|
1304
|
+
justify-content: center;
|
|
1305
|
+
gap: 8px;
|
|
1306
|
+
block-size: 100%;
|
|
1307
|
+
color: var(--muted-foreground);
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
.epx-stateglyph {
|
|
1311
|
+
font-size: 1.5rem;
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
/* Law 3: the term the reader typed is a machine value inside prose,
|
|
1315
|
+
so it is set in mono rather than quoted or emphasised. */
|
|
1316
|
+
.epx-stateterm {
|
|
1317
|
+
font-family: var(--font-mono);
|
|
1318
|
+
font-size: var(--text-ui-sm, 11.5px);
|
|
1319
|
+
color: var(--foreground);
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
.epx-stateaction {
|
|
1323
|
+
padding: 0;
|
|
1324
|
+
border: 0;
|
|
1325
|
+
background: none;
|
|
1326
|
+
font: inherit;
|
|
1327
|
+
font-size: var(--text-ui-sm, 11.5px);
|
|
1328
|
+
color: var(--pretui-primary-ink, var(--primary));
|
|
1329
|
+
text-decoration: underline;
|
|
1330
|
+
text-underline-offset: 2px;
|
|
1331
|
+
cursor: pointer;
|
|
1332
|
+
}
|
|
1333
|
+
.epx-stateaction:focus-visible {
|
|
1334
|
+
outline: 2px solid var(--ring);
|
|
1335
|
+
outline-offset: 2px;
|
|
1336
|
+
border-radius: var(--radius-chip, 6px);
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
.epx-skeleton {
|
|
1340
|
+
inline-size: 60%;
|
|
1341
|
+
block-size: 8px;
|
|
1342
|
+
border-radius: 999px;
|
|
1343
|
+
background: var(--muted);
|
|
1344
|
+
animation: epx-pulse 1.4s ease-in-out infinite;
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1347
|
+
@keyframes epx-pulse {
|
|
1348
|
+
50% {
|
|
1349
|
+
opacity: 0.45;
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1353
|
+
/* Reduced motion lands on the END state, never a frozen midpoint. */
|
|
1354
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1355
|
+
.epx-skeleton {
|
|
1356
|
+
animation: none;
|
|
1357
|
+
opacity: 1;
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
/* ── Preview ────────────────────────────────────────────────────── */
|
|
1362
|
+
.epx-preview {
|
|
1363
|
+
display: flex;
|
|
1364
|
+
align-items: center;
|
|
1365
|
+
gap: 8px;
|
|
1366
|
+
min-block-size: 1.5rem;
|
|
1367
|
+
padding-block-start: 6px;
|
|
1368
|
+
box-shadow: inset 0 1px 0 var(--border);
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
.epx-previewglyph {
|
|
1372
|
+
font-size: 1.25rem;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
.epx-previewname {
|
|
1376
|
+
overflow: hidden;
|
|
1377
|
+
text-overflow: ellipsis;
|
|
1378
|
+
white-space: nowrap;
|
|
1379
|
+
color: var(--foreground);
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
.epx-previewidle {
|
|
1383
|
+
color: var(--muted-foreground);
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
/* Coarse pointers get 44px targets. A card knows its pane, not the
|
|
1387
|
+
viewport, so this is a pointer query, not a width query. */
|
|
1388
|
+
@media (any-pointer: coarse) {
|
|
1389
|
+
.pretui-emoji {
|
|
1390
|
+
--pretui-emoji-size: 2.75rem;
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
</style>
|
|
1395
|
+
</template>
|
|
1396
|
+
}
|