@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,1161 @@
|
|
|
1
|
+
// Pretui — data-component: the foundation base class every data-rich
|
|
2
|
+
// component in the kit extends (Chart, Sheet, Table, DataGrid, Feed, Tree,
|
|
3
|
+
// Masonry, Board, Lookup). It is state and contract, not layout: one shared,
|
|
4
|
+
// tested answer to loading, emptiness, failure, selection, activation and
|
|
5
|
+
// sort, so nine components stop reinventing five of them each.
|
|
6
|
+
//
|
|
7
|
+
// THREE ENTRY POINTS, in the order you should reach for them:
|
|
8
|
+
// • `DataComponent<T>` — extend it when your component's args ARE the data
|
|
9
|
+
// args. You inherit the template, the chrome and the whole API.
|
|
10
|
+
// • `DataSource<T>` — hold one when your component needs args or blocks
|
|
11
|
+
// of its own (`@columns`, `@series`, a `<:cell>` block). Identical state
|
|
12
|
+
// machine, one line: `data = new DataSource<T>(() => this.args)`.
|
|
13
|
+
// • `DataShell` — the chrome alone, pointed at either of the above.
|
|
14
|
+
//
|
|
15
|
+
// PORTED FROM — three lineages, none of them adopted whole:
|
|
16
|
+
// • TanStack Table's row model (getRowId, sorting state, row selection as
|
|
17
|
+
// a keyed record) — the interaction half.
|
|
18
|
+
// • TanStack Query / ember-concurrency task state — the status half
|
|
19
|
+
// (idle → loading → settled, with the error captured rather than thrown).
|
|
20
|
+
// • The kit's own Feed/DataGrid, which had grown private, incompatible
|
|
21
|
+
// copies of both halves.
|
|
22
|
+
//
|
|
23
|
+
// WHAT THIS DOES BETTER THAN ITS INSPIRATION (the acceptance test):
|
|
24
|
+
//
|
|
25
|
+
// 1. `empty` is a first-class status, never a boolean. TanStack Table has
|
|
26
|
+
// no notion of emptiness at all, so every consumer writes
|
|
27
|
+
// `{{#if (eq rows.length 0)}}No results{{/if}}` — which renders "No
|
|
28
|
+
// results" while the first fetch is still in flight. Here the status is
|
|
29
|
+
// DERIVED and `loading` outranks `empty`, so that bug is unwritable.
|
|
30
|
+
// 2. The row type is generic, end to end. TanStack types rows as
|
|
31
|
+
// `TData` but the kit's own collections had decayed to
|
|
32
|
+
// `Record<string, any>` (DataGrid), `[key: string]: unknown` (Feed) and
|
|
33
|
+
// `readonly unknown[]` (Masonry) — every caller narrowing by hand inside
|
|
34
|
+
// the block. `T` flows from `@rows` straight into the yielded block.
|
|
35
|
+
// 3. It does not own the fetch. TanStack Query needs a QueryClient and a
|
|
36
|
+
// provider; this takes a plain `() => Promise<readonly T[]>` and knows
|
|
37
|
+
// nothing about HTTP, cache keys or retries-with-backoff. That also
|
|
38
|
+
// keeps it inside the realm's no-timer law — there is no debounce here,
|
|
39
|
+
// because a debounce is a timer and belongs to the caller.
|
|
40
|
+
// 4. A stale response can never win. React's classic out-of-order-response
|
|
41
|
+
// bug (documented in its own docs as "race conditions") is closed by a
|
|
42
|
+
// monotonic request token: every settle re-checks that it is still the
|
|
43
|
+
// newest request before it writes a single tracked field.
|
|
44
|
+
// 5. Accessibility is IN the base class, which is the entire argument for
|
|
45
|
+
// having one. `aria-busy` while loading, and a polite live region that
|
|
46
|
+
// announces the RESULT COUNT when it settles — the thing that makes an
|
|
47
|
+
// async table usable with a screen reader and that essentially no table
|
|
48
|
+
// library ships. It announces on settle, never per keystroke, because
|
|
49
|
+
// the announcement string is derived only from settled state.
|
|
50
|
+
// 6. Errors are text, not a red border. The failure surfaces through
|
|
51
|
+
// <Alert> with a title, the message, a retry button and (when the load
|
|
52
|
+
// is keyed) a <BrokenLink> naming the dataset that would not come.
|
|
53
|
+
//
|
|
54
|
+
// DROPPED ON PURPOSE (Law 7 — name the edges rather than half-ship them):
|
|
55
|
+
// • Pagination / virtualization. <Pagination> exists and
|
|
56
|
+
// windowing is the host's job; a base class that also owned the window
|
|
57
|
+
// would own layout, which is exactly what this must not do.
|
|
58
|
+
// • Filtering and grouping. Both are pure functions over `@rows` that the
|
|
59
|
+
// caller can apply before handing them over, and a filter model that
|
|
60
|
+
// cannot be expressed as `rows.filter(...)` is a query, not a component.
|
|
61
|
+
// • Debounce / polling / retry-with-backoff. All three are timers (realm
|
|
62
|
+
// law), and all three are policy the caller owns.
|
|
63
|
+
// • Optimistic mutation. This is a reading contract; writing is not here.
|
|
64
|
+
import Component from '@glimmer/component';
|
|
65
|
+
import { cached, tracked } from '@glimmer/tracking';
|
|
66
|
+
import { on } from '@ember/modifier';
|
|
67
|
+
// type-only gap: 'ember-modifier' resolves at realm runtime; glint can't see
|
|
68
|
+
// it here (accepted parse baseline, same as overlay.gts / structure-data.gts)
|
|
69
|
+
import { modifier } from 'ember-modifier';
|
|
70
|
+
import { Button } from './components/button';
|
|
71
|
+
import { Alert } from './components/alert';
|
|
72
|
+
import { BrokenLink } from './components/broken-link';
|
|
73
|
+
import { Spinner } from './components/spinner';
|
|
74
|
+
import { EmptyState } from './components/empty-state';
|
|
75
|
+
import { Skeleton } from './components/skeleton';
|
|
76
|
+
|
|
77
|
+
// ── The shared collection vocabulary ─────────────────────────────────────
|
|
78
|
+
// Exported as named primitives rather than buried, because every collection
|
|
79
|
+
// in the kit keys rows and every one of them should key them the same way.
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* The five states a dataset can be in. Derived, never assigned: see
|
|
83
|
+
* `DataComponent#status`. `empty` is distinguished from `loading` so that
|
|
84
|
+
* "No results" can never render over an in-flight request.
|
|
85
|
+
*/
|
|
86
|
+
export type DataStatus = 'idle' | 'loading' | 'ready' | 'empty' | 'error';
|
|
87
|
+
|
|
88
|
+
/** What a row is keyed by. Strings and numbers only — a key is compared with
|
|
89
|
+
* `===` and must survive being written into a `data-` attribute. */
|
|
90
|
+
export type RowKey = string | number;
|
|
91
|
+
|
|
92
|
+
/** Caller-supplied key accessor: stable identity for one row. */
|
|
93
|
+
export type RowKeyFn<T> = (row: T, index: number) => RowKey;
|
|
94
|
+
|
|
95
|
+
/** The dataset loader. Deliberately knows nothing about HTTP: it is any
|
|
96
|
+
* function returning a promise of rows. */
|
|
97
|
+
export type DataLoad<T> = () => Promise<readonly T[]> | readonly T[];
|
|
98
|
+
|
|
99
|
+
/** How many rows may be selected at once. */
|
|
100
|
+
export type SelectionMode = 'none' | 'single' | 'multi';
|
|
101
|
+
|
|
102
|
+
/** Sort direction. */
|
|
103
|
+
export type SortDir = 'asc' | 'desc';
|
|
104
|
+
|
|
105
|
+
/** The current sort: a column key plus a direction. `null` means unsorted,
|
|
106
|
+
* which is a third state the asc/desc cycle passes through. */
|
|
107
|
+
export interface SortState {
|
|
108
|
+
/** the field/column key being sorted on */
|
|
109
|
+
key: string;
|
|
110
|
+
/** ascending or descending */
|
|
111
|
+
dir: SortDir;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* THE documented key fallback, shared by every collection in the kit.
|
|
116
|
+
*
|
|
117
|
+
* 1. `@key` accessor if the caller supplied one — always prefer this.
|
|
118
|
+
* 2. otherwise the row's own `id` when it is a string or number (the shape
|
|
119
|
+
* Boxel cards, `FeedItem` and every fixture in examples.gts already have);
|
|
120
|
+
* 3. otherwise the row's 0-based index.
|
|
121
|
+
*
|
|
122
|
+
* Branch 3 is a real, documented compromise, not a silent one: an
|
|
123
|
+
* index-keyed row's identity MOVES when the collection is re-sorted or
|
|
124
|
+
* spliced, so selection and the active row follow the position rather than
|
|
125
|
+
* the record. Any collection whose rows can be re-ordered should pass `@key`.
|
|
126
|
+
*/
|
|
127
|
+
export function defaultRowKey(row: unknown, index: number): RowKey {
|
|
128
|
+
if (row && typeof row === 'object') {
|
|
129
|
+
let id = (row as Record<string, unknown>)['id'];
|
|
130
|
+
if (typeof id === 'string' || typeof id === 'number') {
|
|
131
|
+
return id;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return index;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Reads one field off a row for the default comparator. Rows are generic,
|
|
138
|
+
* so the read is an explicit widening rather than an `any`. */
|
|
139
|
+
function readField(row: unknown, key: string): unknown {
|
|
140
|
+
return row && typeof row === 'object'
|
|
141
|
+
? (row as Record<string, unknown>)[key]
|
|
142
|
+
: undefined;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** Total order over unknown values: numbers numerically, everything else by
|
|
146
|
+
* locale-free string compare, with null/undefined last in either direction.
|
|
147
|
+
* Anything richer (dates as objects, money, nested paths) wants `@comparator`. */
|
|
148
|
+
function compareValues(a: unknown, b: unknown): number {
|
|
149
|
+
let aMissing = a === undefined || a === null;
|
|
150
|
+
let bMissing = b === undefined || b === null;
|
|
151
|
+
if (aMissing || bMissing) {
|
|
152
|
+
return aMissing && bMissing ? 0 : aMissing ? 1 : -1;
|
|
153
|
+
}
|
|
154
|
+
if (typeof a === 'number' && typeof b === 'number') {
|
|
155
|
+
return a - b;
|
|
156
|
+
}
|
|
157
|
+
if (typeof a === 'boolean' && typeof b === 'boolean') {
|
|
158
|
+
return Number(a) - Number(b);
|
|
159
|
+
}
|
|
160
|
+
let as = String(a);
|
|
161
|
+
let bs = String(b);
|
|
162
|
+
return as < bs ? -1 : as > bs ? 1 : 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Everything is an Error by the time it reaches tracked state — a thrown
|
|
166
|
+
* string, a rejected `{ message }`, or a genuine Error. Never swallowed. */
|
|
167
|
+
function toError(thrown: unknown): Error {
|
|
168
|
+
if (thrown instanceof Error) {
|
|
169
|
+
return thrown;
|
|
170
|
+
}
|
|
171
|
+
if (typeof thrown === 'string') {
|
|
172
|
+
return new Error(thrown);
|
|
173
|
+
}
|
|
174
|
+
let message = readField(thrown, 'message');
|
|
175
|
+
return new Error(typeof message === 'string' ? message : 'Load failed');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ── The load modifier ────────────────────────────────────────────────────
|
|
179
|
+
// Loading is kicked off from a modifier rather than a getter or a constructor
|
|
180
|
+
// for two reasons: a getter with a side effect is a backtracking re-render
|
|
181
|
+
// waiting to happen, and a constructor cannot re-run when the load key
|
|
182
|
+
// changes. The extra positionals are not read — they exist so that changing
|
|
183
|
+
// `@load`, `@loadKey`, or the reload epoch re-runs the modifier, which is
|
|
184
|
+
// what "re-load when the key changes" means with no timer and no observer.
|
|
185
|
+
|
|
186
|
+
/** Re-runs `beginLoad()` whenever the loader, its key, or the reload epoch
|
|
187
|
+
* changes. Exported so a subclass that writes its own `<template>` (and
|
|
188
|
+
* therefore does not render `<DataShell>`) can still wire the loader. */
|
|
189
|
+
export const dataLoad = modifier(
|
|
190
|
+
(
|
|
191
|
+
_el: Element,
|
|
192
|
+
[state, _load, _key, _epoch]: [DataState, unknown, unknown, number],
|
|
193
|
+
) => {
|
|
194
|
+
state.beginLoad();
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
// ── The shell contract ───────────────────────────────────────────────────
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The narrow, non-generic slice of a data component that the shared chrome
|
|
202
|
+
* needs. `DataComponent` implements it; a component that cannot extend
|
|
203
|
+
* `DataComponent` (because it already extends something else) can implement
|
|
204
|
+
* this instead and still wear the same chrome.
|
|
205
|
+
*/
|
|
206
|
+
export interface DataState {
|
|
207
|
+
/** derived status — see `DataStatus` */
|
|
208
|
+
readonly status: DataStatus;
|
|
209
|
+
/** `'true'` while a request is in flight, for `aria-busy` */
|
|
210
|
+
readonly busy: 'true' | 'false';
|
|
211
|
+
/** the polite live-region text; empty while idle or loading */
|
|
212
|
+
readonly announcement: string;
|
|
213
|
+
/** human-readable failure message, `''` when there is none */
|
|
214
|
+
readonly errorMessage: string;
|
|
215
|
+
/** printable form of the load key, for the BrokenLink reference */
|
|
216
|
+
readonly loadRef: string | undefined;
|
|
217
|
+
/** true when there is a loader to retry with */
|
|
218
|
+
readonly canRetry: boolean;
|
|
219
|
+
/** dependency handle for the load modifier — never called by the shell */
|
|
220
|
+
readonly loadFn: unknown;
|
|
221
|
+
/** dependency handle for the load modifier — never called by the shell */
|
|
222
|
+
readonly loadKey: unknown;
|
|
223
|
+
/** bumped by `reload()`; re-runs the load modifier */
|
|
224
|
+
readonly epoch: number;
|
|
225
|
+
/** starts a load if one is warranted; safe to call on every render */
|
|
226
|
+
beginLoad(): void;
|
|
227
|
+
/** discards any in-flight request and starts a fresh one */
|
|
228
|
+
reload(): void;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export interface DataShellSignature {
|
|
232
|
+
Args: {
|
|
233
|
+
/** the data component (or any `DataState`) whose chrome this is */
|
|
234
|
+
state: DataState;
|
|
235
|
+
/** true when the host was given a `loading` block to forward */
|
|
236
|
+
hasLoading?: boolean;
|
|
237
|
+
/** true when the host was given an `empty` block to forward */
|
|
238
|
+
hasEmpty?: boolean;
|
|
239
|
+
/** true when the host was given an `error` block to forward */
|
|
240
|
+
hasError?: boolean;
|
|
241
|
+
/** headline for the default empty state */
|
|
242
|
+
emptyTitle?: string;
|
|
243
|
+
/** supporting line for the default empty state */
|
|
244
|
+
emptyMessage?: string;
|
|
245
|
+
/** visible label beside the default loading spinner (default 'Loading') */
|
|
246
|
+
loadingLabel?: string;
|
|
247
|
+
/** how many skeleton lines the default loading state draws (default 3) */
|
|
248
|
+
skeletonRows?: number;
|
|
249
|
+
/** headline for the default error state (default 'Could not load') */
|
|
250
|
+
errorTitle?: string;
|
|
251
|
+
};
|
|
252
|
+
Blocks: {
|
|
253
|
+
/** the settled, non-empty content */
|
|
254
|
+
default: [];
|
|
255
|
+
/** replaces the default spinner + skeleton */
|
|
256
|
+
loading: [];
|
|
257
|
+
/** replaces the default EmptyState */
|
|
258
|
+
empty: [];
|
|
259
|
+
/** replaces the default Alert */
|
|
260
|
+
error: [];
|
|
261
|
+
};
|
|
262
|
+
Element: HTMLDivElement;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* The small amount of shared chrome that goes with the base class: the
|
|
267
|
+
* `aria-busy` root, the polite live region, and the four state slots. It is a
|
|
268
|
+
* separate component precisely so a subclass that writes its own
|
|
269
|
+
* `<template>` keeps every accessibility guarantee without copying it.
|
|
270
|
+
*/
|
|
271
|
+
export class DataShell extends Component<DataShellSignature> {
|
|
272
|
+
// Three booleans rather than an `eq` helper: the kit vendors no helper
|
|
273
|
+
// package (Law 9) and a getter reads better in the branch than a curly.
|
|
274
|
+
get isLoading(): boolean {
|
|
275
|
+
return this.args.state.status === 'loading';
|
|
276
|
+
}
|
|
277
|
+
get isError(): boolean {
|
|
278
|
+
return this.args.state.status === 'error';
|
|
279
|
+
}
|
|
280
|
+
get isEmpty(): boolean {
|
|
281
|
+
return this.args.state.status === 'empty';
|
|
282
|
+
}
|
|
283
|
+
get skeletonRows(): number[] {
|
|
284
|
+
let n = Math.max(1, Math.floor(this.args.skeletonRows ?? 3));
|
|
285
|
+
let out: number[] = [];
|
|
286
|
+
for (let i = 0; i < n; i++) {
|
|
287
|
+
out.push(i);
|
|
288
|
+
}
|
|
289
|
+
return out;
|
|
290
|
+
}
|
|
291
|
+
get loadingLabel(): string {
|
|
292
|
+
return this.args.loadingLabel ?? 'Loading';
|
|
293
|
+
}
|
|
294
|
+
get emptyTitle(): string {
|
|
295
|
+
return this.args.emptyTitle ?? 'Nothing to show yet';
|
|
296
|
+
}
|
|
297
|
+
get emptyMessage(): string {
|
|
298
|
+
return (
|
|
299
|
+
this.args.emptyMessage ??
|
|
300
|
+
'No records match this view. Adjust the filters, or check back once the desk has logged something.'
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
get errorTitle(): string {
|
|
304
|
+
return this.args.errorTitle ?? 'Could not load';
|
|
305
|
+
}
|
|
306
|
+
retry = () => {
|
|
307
|
+
this.args.state.reload();
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
<template>
|
|
311
|
+
<div
|
|
312
|
+
class='pretui-data'
|
|
313
|
+
data-test-pretui-data
|
|
314
|
+
data-status={{@state.status}}
|
|
315
|
+
aria-busy={{@state.busy}}
|
|
316
|
+
{{dataLoad @state @state.loadFn @state.loadKey @state.epoch}}
|
|
317
|
+
...attributes
|
|
318
|
+
>
|
|
319
|
+
{{! The live region is ALWAYS in the DOM and always empty-to-start:
|
|
320
|
+
an aria-live element inserted with text already in it is not
|
|
321
|
+
reliably announced. Its text changes only when a load settles,
|
|
322
|
+
so sorting, hovering and typing produce no announcement. }}
|
|
323
|
+
<p class='pretui-sr' role='status' data-test-pretui-data-live>
|
|
324
|
+
{{@state.announcement}}
|
|
325
|
+
</p>
|
|
326
|
+
|
|
327
|
+
{{#if this.isLoading}}
|
|
328
|
+
{{#if @hasLoading}}
|
|
329
|
+
{{yield to='loading'}}
|
|
330
|
+
{{else}}
|
|
331
|
+
<div class='pretui-data-loading'>
|
|
332
|
+
<span class='pretui-data-loading-head'>
|
|
333
|
+
<Spinner />
|
|
334
|
+
<span>{{this.loadingLabel}}</span>
|
|
335
|
+
</span>
|
|
336
|
+
{{#each this.skeletonRows key='@index' as |row|}}
|
|
337
|
+
<span class='pretui-data-skeleton' data-row={{row}}>
|
|
338
|
+
<Skeleton @width='34%' @height='11px' />
|
|
339
|
+
<Skeleton @height='11px' />
|
|
340
|
+
</span>
|
|
341
|
+
{{/each}}
|
|
342
|
+
</div>
|
|
343
|
+
{{/if}}
|
|
344
|
+
{{else if this.isError}}
|
|
345
|
+
{{#if @hasError}}
|
|
346
|
+
{{yield to='error'}}
|
|
347
|
+
{{else}}
|
|
348
|
+
<Alert @tone='danger' @title={{this.errorTitle}}>
|
|
349
|
+
<:default>
|
|
350
|
+
<p class='pretui-data-errmsg'>{{@state.errorMessage}}</p>
|
|
351
|
+
{{#if @state.loadRef}}
|
|
352
|
+
<BrokenLink
|
|
353
|
+
@label='dataset unavailable'
|
|
354
|
+
@refId={{@state.loadRef}}
|
|
355
|
+
/>
|
|
356
|
+
{{/if}}
|
|
357
|
+
</:default>
|
|
358
|
+
<:action>
|
|
359
|
+
{{#if @state.canRetry}}
|
|
360
|
+
<Button
|
|
361
|
+
@appearance='outlined'
|
|
362
|
+
@size='s'
|
|
363
|
+
data-test-pretui-data-retry
|
|
364
|
+
{{on 'click' this.retry}}
|
|
365
|
+
>Try again</Button>
|
|
366
|
+
{{/if}}
|
|
367
|
+
</:action>
|
|
368
|
+
</Alert>
|
|
369
|
+
{{/if}}
|
|
370
|
+
{{else if this.isEmpty}}
|
|
371
|
+
{{#if @hasEmpty}}
|
|
372
|
+
{{yield to='empty'}}
|
|
373
|
+
{{else}}
|
|
374
|
+
<EmptyState
|
|
375
|
+
@title={{this.emptyTitle}}
|
|
376
|
+
@message={{this.emptyMessage}}
|
|
377
|
+
/>
|
|
378
|
+
{{/if}}
|
|
379
|
+
{{else}}
|
|
380
|
+
{{yield}}
|
|
381
|
+
{{/if}}
|
|
382
|
+
</div>
|
|
383
|
+
<style scoped>
|
|
384
|
+
.pretui-data {
|
|
385
|
+
container-type: inline-size;
|
|
386
|
+
display: block;
|
|
387
|
+
min-width: 0;
|
|
388
|
+
color: var(--foreground);
|
|
389
|
+
font-size: var(--text-ui-md, 12.5px);
|
|
390
|
+
letter-spacing: var(--track-ui, 0.01em);
|
|
391
|
+
}
|
|
392
|
+
.pretui-sr {
|
|
393
|
+
position: absolute;
|
|
394
|
+
width: 1px;
|
|
395
|
+
height: 1px;
|
|
396
|
+
overflow: hidden;
|
|
397
|
+
clip: rect(0 0 0 0);
|
|
398
|
+
white-space: nowrap;
|
|
399
|
+
}
|
|
400
|
+
.pretui-data-loading {
|
|
401
|
+
display: grid;
|
|
402
|
+
gap: var(--pretui-data-gap, var(--space-3, 8px));
|
|
403
|
+
}
|
|
404
|
+
.pretui-data-loading-head {
|
|
405
|
+
display: flex;
|
|
406
|
+
align-items: center;
|
|
407
|
+
gap: var(--space-3, 8px);
|
|
408
|
+
color: var(--muted-foreground);
|
|
409
|
+
font-family: var(--font-mono);
|
|
410
|
+
font-size: var(--text-ui-sm, 11.5px);
|
|
411
|
+
letter-spacing: var(--track-eyebrow, 0.08em);
|
|
412
|
+
text-transform: uppercase;
|
|
413
|
+
}
|
|
414
|
+
.pretui-data-skeleton {
|
|
415
|
+
display: grid;
|
|
416
|
+
gap: 7px;
|
|
417
|
+
padding: var(--space-4, 11px) var(--space-5, 14px);
|
|
418
|
+
border-radius: var(--radius-surface, 10px);
|
|
419
|
+
background: var(--card);
|
|
420
|
+
box-shadow: var(--pretui-shadow-hairline, 0 0 0 1px var(--border));
|
|
421
|
+
}
|
|
422
|
+
.pretui-data-errmsg {
|
|
423
|
+
margin: 0 0 var(--space-2, 6px);
|
|
424
|
+
max-width: 60ch;
|
|
425
|
+
}
|
|
426
|
+
/* Unnamed container query only (a named one silently drops every
|
|
427
|
+
later rule in the transpiled stylesheet). It resolves against the
|
|
428
|
+
nearest ANCESTOR container — .pretui-data above — so it styles the
|
|
429
|
+
children, never the container element itself. */
|
|
430
|
+
@container (max-width: 24rem) {
|
|
431
|
+
.pretui-data-skeleton {
|
|
432
|
+
padding: var(--space-3, 8px) var(--space-4, 11px);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
</style>
|
|
436
|
+
</template>
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// ── The base class ───────────────────────────────────────────────────────
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Everything a data component accepts. Subclasses widen this through the
|
|
443
|
+
* `Extra` type parameter rather than re-declaring it.
|
|
444
|
+
*/
|
|
445
|
+
export interface DataArgs<T> {
|
|
446
|
+
/** Eager rows. Supply EITHER this or `@load`, never both — when `@rows` is
|
|
447
|
+
* present it is the single source of truth and `@load` is never invoked. */
|
|
448
|
+
rows?: readonly T[];
|
|
449
|
+
/** Async loader, invoked and awaited by the component. It is any function
|
|
450
|
+
* returning rows or a promise of rows: the component knows nothing about
|
|
451
|
+
* HTTP, so authentication, caching and request cancellation stay yours. */
|
|
452
|
+
load?: DataLoad<T>;
|
|
453
|
+
/** Re-run `@load` whenever this value changes (a query string, a page
|
|
454
|
+
* number, a card id). Compared by identity. There is NO debounce — that is
|
|
455
|
+
* a timer, and the realm forbids timers; debounce this value yourself. */
|
|
456
|
+
loadKey?: unknown;
|
|
457
|
+
/** Stable identity for a row. Strongly recommended whenever rows can be
|
|
458
|
+
* re-ordered — see `defaultRowKey` for the fallback and its consequences. */
|
|
459
|
+
key?: RowKeyFn<T>;
|
|
460
|
+
/** `'none'` (default), `'single'` or `'multi'`. */
|
|
461
|
+
selectionMode?: SelectionMode;
|
|
462
|
+
/** Controlled selection. Omit for uncontrolled (the component keeps its
|
|
463
|
+
* own), pass an array to drive it from outside. */
|
|
464
|
+
selected?: readonly RowKey[];
|
|
465
|
+
/** Initial selection for the uncontrolled case. */
|
|
466
|
+
defaultSelected?: readonly RowKey[];
|
|
467
|
+
/** Fires with the next selection on every change, controlled or not. */
|
|
468
|
+
onSelectionChange?: (keys: RowKey[], rows: T[]) => void;
|
|
469
|
+
/** Controlled active/highlighted row (the keyboard cursor, not selection).
|
|
470
|
+
* Omit for uncontrolled; pass `null` to force "no active row". */
|
|
471
|
+
activeKey?: RowKey | null;
|
|
472
|
+
/** Initial active row for the uncontrolled case. */
|
|
473
|
+
defaultActiveKey?: RowKey | null;
|
|
474
|
+
/** Fires with the next active row on every change. */
|
|
475
|
+
onActiveChange?: (key: RowKey | null, row: T | undefined) => void;
|
|
476
|
+
/** Controlled sort. Omit for uncontrolled; `null` means unsorted. */
|
|
477
|
+
sort?: SortState | null;
|
|
478
|
+
/** Initial sort for the uncontrolled case. */
|
|
479
|
+
defaultSort?: SortState | null;
|
|
480
|
+
/** Fires with the next sort on every change, including the `null` step. */
|
|
481
|
+
onSortChange?: (sort: SortState | null) => void;
|
|
482
|
+
/** Replaces the default field comparator. Receives the active sort so one
|
|
483
|
+
* function can handle every column. Return <0, 0 or >0 for ASCENDING order;
|
|
484
|
+
* the component applies the direction. */
|
|
485
|
+
comparator?: (a: T, b: T, sort: SortState) => number;
|
|
486
|
+
/** Accessible name for the collection, used in the count announcement
|
|
487
|
+
* ("6 lots" rather than "6 results"). Singular/plural handled below. */
|
|
488
|
+
itemNoun?: string;
|
|
489
|
+
/** Silences the polite count announcement. Reach for this only when the
|
|
490
|
+
* host already announces the same result elsewhere — double announcements
|
|
491
|
+
* are worse than none. */
|
|
492
|
+
silentCount?: boolean;
|
|
493
|
+
/** Headline for the default empty state. */
|
|
494
|
+
emptyTitle?: string;
|
|
495
|
+
/** Supporting line for the default empty state. */
|
|
496
|
+
emptyMessage?: string;
|
|
497
|
+
/** Label beside the default loading spinner. */
|
|
498
|
+
loadingLabel?: string;
|
|
499
|
+
/** Skeleton line count for the default loading state (default 3). */
|
|
500
|
+
skeletonRows?: number;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** The interaction surface yielded to the default block alongside the rows.
|
|
504
|
+
* Everything here is safe to call from a template. */
|
|
505
|
+
export interface DataApi<T> {
|
|
506
|
+
/** derived status */
|
|
507
|
+
status: DataStatus;
|
|
508
|
+
/** number of rows currently rendered */
|
|
509
|
+
count: number;
|
|
510
|
+
/** failure message, `''` when there is none */
|
|
511
|
+
errorMessage: string;
|
|
512
|
+
/** the key this component would use for a row */
|
|
513
|
+
keyFor: (row: T, index: number) => RowKey;
|
|
514
|
+
/** current selection mode */
|
|
515
|
+
selectionMode: SelectionMode;
|
|
516
|
+
/** keys of the selected rows */
|
|
517
|
+
selectedKeys: readonly RowKey[];
|
|
518
|
+
/** the selected rows themselves */
|
|
519
|
+
selectedRows: T[];
|
|
520
|
+
/** is this row selected? */
|
|
521
|
+
isSelected: (row: T, index: number) => boolean;
|
|
522
|
+
/** toggle a row per the selection mode (no-op when mode is `'none'`) */
|
|
523
|
+
toggleSelected: (row: T, index: number) => void;
|
|
524
|
+
/** is every visible row selected? */
|
|
525
|
+
allSelected: boolean;
|
|
526
|
+
/** toggle every visible row, keeping keys outside the view (multi only) */
|
|
527
|
+
selectAll: () => void;
|
|
528
|
+
/** drop the whole selection */
|
|
529
|
+
clearSelection: () => void;
|
|
530
|
+
/** key of the active/highlighted row */
|
|
531
|
+
activeKey: RowKey | null;
|
|
532
|
+
/** is this row the active one? */
|
|
533
|
+
isActive: (row: T, index: number) => boolean;
|
|
534
|
+
/** make this row active (`null` clears) */
|
|
535
|
+
setActive: (row: T | null, index: number) => void;
|
|
536
|
+
/** current sort */
|
|
537
|
+
sort: SortState | null;
|
|
538
|
+
/** cycle a column asc → desc → unsorted */
|
|
539
|
+
toggleSort: (key: string) => void;
|
|
540
|
+
/** `'ascending' | 'descending' | 'none'`, ready for `aria-sort` */
|
|
541
|
+
ariaSort: (key: string) => 'ascending' | 'descending' | 'none';
|
|
542
|
+
/** discard any in-flight request and load again */
|
|
543
|
+
reload: () => void;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
export interface DataBlocks<T> {
|
|
547
|
+
/** the settled rows plus the interaction API */
|
|
548
|
+
default: [rows: T[], data: DataApi<T>];
|
|
549
|
+
/** replaces the default spinner + skeleton */
|
|
550
|
+
loading: [];
|
|
551
|
+
/** replaces the default EmptyState */
|
|
552
|
+
empty: [];
|
|
553
|
+
/** replaces the default Alert */
|
|
554
|
+
error: [];
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
export interface DataComponentSignature<
|
|
558
|
+
T,
|
|
559
|
+
El extends Element = HTMLDivElement,
|
|
560
|
+
> {
|
|
561
|
+
Args: DataArgs<T>;
|
|
562
|
+
Blocks: DataBlocks<T>;
|
|
563
|
+
Element: El;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/** The expanded-rows args DataTable and List share. */
|
|
567
|
+
export interface ExpansionArgs {
|
|
568
|
+
/** controlled expanded rows */
|
|
569
|
+
expandedKeys?: readonly RowKey[];
|
|
570
|
+
/** uncontrolled seed */
|
|
571
|
+
defaultExpandedKeys?: readonly RowKey[];
|
|
572
|
+
/** fires with the next expanded set, in both modes */
|
|
573
|
+
onExpandedChange?: (keys: RowKey[]) => void;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/** One row's expansion, everything its expander and detail need. */
|
|
577
|
+
export interface ExpansionView {
|
|
578
|
+
expanded: boolean;
|
|
579
|
+
expandedFlag: 'true' | 'false';
|
|
580
|
+
/** the detail region's id */
|
|
581
|
+
detailId: string;
|
|
582
|
+
/** the detail id while it exists — a collapsed row's detail is not rendered */
|
|
583
|
+
controls: string | undefined;
|
|
584
|
+
/** "Expand {label}" / "Collapse {label}" */
|
|
585
|
+
expandLabel: string;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Which rows are expanded, by key, and the ARIA wiring for each row's
|
|
590
|
+
* expander. Controlled when `@expandedKeys` is passed (the host never moves
|
|
591
|
+
* itself, it only reports), uncontrolled otherwise, seeded from
|
|
592
|
+
* `@defaultExpandedKeys`. Takes a thunk for the same reason DataSource does:
|
|
593
|
+
* every read goes through the live args. DataTable and List both use it, so
|
|
594
|
+
* the state rule and the ARIA contract cannot drift between them.
|
|
595
|
+
*/
|
|
596
|
+
export class ExpansionState {
|
|
597
|
+
constructor(
|
|
598
|
+
private readArgs: () => ExpansionArgs,
|
|
599
|
+
private idPrefix: string,
|
|
600
|
+
) {}
|
|
601
|
+
|
|
602
|
+
@tracked private internal: readonly RowKey[] | undefined = undefined;
|
|
603
|
+
|
|
604
|
+
get keys(): readonly RowKey[] {
|
|
605
|
+
let a = this.readArgs();
|
|
606
|
+
if (a.expandedKeys !== undefined) {
|
|
607
|
+
return a.expandedKeys;
|
|
608
|
+
}
|
|
609
|
+
return this.internal ?? a.defaultExpandedKeys ?? [];
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/** A Set keeps 1 and '1' distinct, as `includes` does. */
|
|
613
|
+
@cached
|
|
614
|
+
get keySet(): Set<RowKey> {
|
|
615
|
+
return new Set(this.keys);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
isExpanded = (key: RowKey): boolean => this.keySet.has(key);
|
|
619
|
+
|
|
620
|
+
/** The detail id is built from the row's position: a key can hold
|
|
621
|
+
* spaces, and 1 and '1' are distinct keys. */
|
|
622
|
+
viewFor(key: RowKey, index: number, label: string): ExpansionView {
|
|
623
|
+
let expanded = this.isExpanded(key);
|
|
624
|
+
let detailId = this.idPrefix + '-d-' + String(index);
|
|
625
|
+
return {
|
|
626
|
+
expanded,
|
|
627
|
+
expandedFlag: expanded ? 'true' : 'false',
|
|
628
|
+
detailId,
|
|
629
|
+
controls: expanded ? detailId : undefined,
|
|
630
|
+
expandLabel: (expanded ? 'Collapse ' : 'Expand ') + label,
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
toggle = (key: RowKey) => {
|
|
635
|
+
let current = this.keys;
|
|
636
|
+
let next = current.includes(key)
|
|
637
|
+
? current.filter((k) => k !== key)
|
|
638
|
+
: [...current, key];
|
|
639
|
+
let a = this.readArgs();
|
|
640
|
+
if (a.expandedKeys === undefined) {
|
|
641
|
+
this.internal = next;
|
|
642
|
+
}
|
|
643
|
+
a.onExpandedChange?.([...next]);
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* THE state machine, as a plain class rather than a component.
|
|
649
|
+
*
|
|
650
|
+
* It is separate from `DataComponent` for a reason that is worth stating,
|
|
651
|
+
* because it is the difference between a base class that only serves its own
|
|
652
|
+
* demo and one the whole kit can use. Glint infers a component's row type
|
|
653
|
+
* from its `Args` type — and inference dies the moment `Args` is anything
|
|
654
|
+
* but a bare `DataArgs<T>`: an intersection with an `Extra` type parameter
|
|
655
|
+
* (`DataArgs<T> & Extra`) makes every caller's `T` collapse to `{}`. So a
|
|
656
|
+
* base class cannot both infer `T` and let subclasses add their own args.
|
|
657
|
+
*
|
|
658
|
+
* Inheritance therefore covers the plain case, and DELEGATION covers the
|
|
659
|
+
* rest: a component with its own signature — `@columns`, `@series`, extra
|
|
660
|
+
* blocks, a different Element — holds a DataSource, points `<DataShell>` at
|
|
661
|
+
* it, and gets the identical state machine:
|
|
662
|
+
*
|
|
663
|
+
* class KitTable<T> extends Component<KitTableSignature<T>> {
|
|
664
|
+
* data = new DataSource<T>(() => this.args);
|
|
665
|
+
* <template><DataShell @state={{this.data}}> … </DataShell></template>
|
|
666
|
+
* }
|
|
667
|
+
*
|
|
668
|
+
* The constructor takes a THUNK, not the args object, so every read goes
|
|
669
|
+
* through the live `this.args` and autotracking stays intact.
|
|
670
|
+
*/
|
|
671
|
+
export class DataSource<T> implements DataState {
|
|
672
|
+
constructor(private readArgs: () => DataArgs<T>) {}
|
|
673
|
+
|
|
674
|
+
/** the host's current args — read through the thunk on every access so
|
|
675
|
+
* tracked argument changes are observed normally */
|
|
676
|
+
private get a(): DataArgs<T> {
|
|
677
|
+
return this.readArgs();
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// ── load state ─────────────────────────────────────────────────────────
|
|
681
|
+
@tracked private loadedRows: readonly T[] = [];
|
|
682
|
+
@tracked private inFlight = false;
|
|
683
|
+
@tracked private settled = false;
|
|
684
|
+
@tracked private failure: Error | undefined = undefined;
|
|
685
|
+
@tracked epoch = 0;
|
|
686
|
+
|
|
687
|
+
// Plain (untracked) fields on purpose: the request token is compared, never
|
|
688
|
+
// rendered, and reading it during a render would make every settle a
|
|
689
|
+
// re-render dependency.
|
|
690
|
+
private requestToken = 0;
|
|
691
|
+
|
|
692
|
+
// ── interaction state ──────────────────────────────────────────────────
|
|
693
|
+
// `undefined` means "the caller's @default* still applies"; anything else
|
|
694
|
+
// is a real uncontrolled value, including an empty selection and a null
|
|
695
|
+
// sort. Seeded lazily rather than in the field initialiser because field
|
|
696
|
+
// initialisers run BEFORE the constructor body, where `readArgs` is
|
|
697
|
+
// assigned — reading args here would be a crash, not a bug you find later.
|
|
698
|
+
@tracked private internalSelected: readonly RowKey[] | undefined = undefined;
|
|
699
|
+
@tracked private internalActive: RowKey | null | undefined = undefined;
|
|
700
|
+
@tracked private internalSort: SortState | null | undefined = undefined;
|
|
701
|
+
|
|
702
|
+
// ── loading ────────────────────────────────────────────────────────────
|
|
703
|
+
|
|
704
|
+
get loadFn(): unknown {
|
|
705
|
+
return this.a.load;
|
|
706
|
+
}
|
|
707
|
+
get loadKey(): unknown {
|
|
708
|
+
return this.a.loadKey;
|
|
709
|
+
}
|
|
710
|
+
get loadRef(): string | undefined {
|
|
711
|
+
let key = this.a.loadKey;
|
|
712
|
+
return typeof key === 'string' || typeof key === 'number'
|
|
713
|
+
? String(key)
|
|
714
|
+
: undefined;
|
|
715
|
+
}
|
|
716
|
+
get canRetry(): boolean {
|
|
717
|
+
return this.a.load !== undefined && this.a.rows === undefined;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/**
|
|
721
|
+
* Called by the `dataLoad` modifier on insert and on every change to
|
|
722
|
+
* `@load` / `@loadKey` / `epoch`. Writes NO tracked state synchronously —
|
|
723
|
+
* the modifier runs inside the render transaction, and a tracked write
|
|
724
|
+
* there is the backtracking-rerender assertion.
|
|
725
|
+
*/
|
|
726
|
+
beginLoad = (): void => {
|
|
727
|
+
let load = this.a.load;
|
|
728
|
+
// A new token retires every earlier request, in flight or not. This one
|
|
729
|
+
// line is the whole stale-response guard: the token is the only thing a
|
|
730
|
+
// settling promise is allowed to write through.
|
|
731
|
+
let token = ++this.requestToken;
|
|
732
|
+
if (!load || this.a.rows !== undefined) {
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
// Fire-and-forget by design; `runLoad` catches everything, so the promise
|
|
736
|
+
// it returns can never reject and no rejection can go unhandled.
|
|
737
|
+
void this.runLoad(load, token);
|
|
738
|
+
};
|
|
739
|
+
|
|
740
|
+
/** Discards whatever is in flight and loads again. */
|
|
741
|
+
reload = (): void => {
|
|
742
|
+
this.epoch = this.epoch + 1;
|
|
743
|
+
};
|
|
744
|
+
|
|
745
|
+
private async runLoad(load: DataLoad<T>, token: number): Promise<void> {
|
|
746
|
+
// One microtask of distance from the render transaction that scheduled
|
|
747
|
+
// us — after this line, tracked writes are safe. Not a timer.
|
|
748
|
+
await Promise.resolve();
|
|
749
|
+
if (token !== this.requestToken) {
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
752
|
+
this.inFlight = true;
|
|
753
|
+
this.failure = undefined;
|
|
754
|
+
try {
|
|
755
|
+
let rows = await load();
|
|
756
|
+
// STALE GUARD. A slower earlier request resolving after a faster later
|
|
757
|
+
// one lands here with an outdated token and writes nothing.
|
|
758
|
+
if (token !== this.requestToken) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
this.loadedRows = rows ?? [];
|
|
762
|
+
this.failure = undefined;
|
|
763
|
+
} catch (thrown) {
|
|
764
|
+
if (token !== this.requestToken) {
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
// Captured, never swallowed: it becomes the error status and the
|
|
768
|
+
// message the reader sees.
|
|
769
|
+
this.failure = toError(thrown);
|
|
770
|
+
} finally {
|
|
771
|
+
// `return` inside `try` runs this too, so the guard is repeated: only
|
|
772
|
+
// the newest request may flip the component out of `loading`.
|
|
773
|
+
if (token === this.requestToken) {
|
|
774
|
+
this.inFlight = false;
|
|
775
|
+
this.settled = true;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// ── status ─────────────────────────────────────────────────────────────
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* The single readable state. DERIVED — nothing assigns it:
|
|
784
|
+
* error a captured failure outranks everything, so a stale row set can
|
|
785
|
+
* never read as success;
|
|
786
|
+
* loading a request is in flight, OR one is about to start and has never
|
|
787
|
+
* settled (which is what closes the empty-flash on first paint);
|
|
788
|
+
* ready settled with rows;
|
|
789
|
+
* empty settled with none — only ever reachable when nothing is
|
|
790
|
+
* loading, which is the bug this ordering exists to prevent;
|
|
791
|
+
* idle no rows and no loader: nobody has asked for anything.
|
|
792
|
+
*/
|
|
793
|
+
get status(): DataStatus {
|
|
794
|
+
// eager @rows are the source of truth the moment they arrive, whatever an
|
|
795
|
+
// earlier @load left behind
|
|
796
|
+
if (this.a.rows !== undefined) {
|
|
797
|
+
return this.a.rows.length > 0 ? 'ready' : 'empty';
|
|
798
|
+
}
|
|
799
|
+
if (this.failure) {
|
|
800
|
+
return 'error';
|
|
801
|
+
}
|
|
802
|
+
if (this.inFlight) {
|
|
803
|
+
return 'loading';
|
|
804
|
+
}
|
|
805
|
+
if (this.a.load === undefined) {
|
|
806
|
+
return 'idle';
|
|
807
|
+
}
|
|
808
|
+
if (!this.settled) {
|
|
809
|
+
return 'loading';
|
|
810
|
+
}
|
|
811
|
+
return this.loadedRows.length > 0 ? 'ready' : 'empty';
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
get busy(): 'true' | 'false' {
|
|
815
|
+
return this.status === 'loading' ? 'true' : 'false';
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
get errorMessage(): string {
|
|
819
|
+
return this.a.rows === undefined && this.failure
|
|
820
|
+
? this.failure.message
|
|
821
|
+
: '';
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
/** The rows as given: `@rows` when eager, the loaded set otherwise. */
|
|
825
|
+
get rows(): readonly T[] {
|
|
826
|
+
return this.a.rows ?? this.loadedRows;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/** The rows as rendered: sorted when a sort is active. Never mutates the
|
|
830
|
+
* caller's array. */
|
|
831
|
+
get visibleRows(): T[] {
|
|
832
|
+
let rows = this.rows;
|
|
833
|
+
let sort = this.sort;
|
|
834
|
+
if (!sort) {
|
|
835
|
+
return rows.slice();
|
|
836
|
+
}
|
|
837
|
+
let dir = sort.dir === 'desc' ? -1 : 1;
|
|
838
|
+
// Annotated local: TS drops the `!sort` narrowing inside the closure.
|
|
839
|
+
let active: SortState = sort;
|
|
840
|
+
return rows.slice().sort((a, b) => this.compare(a, b, active, dir));
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
get count(): number {
|
|
844
|
+
return this.visibleRows.length;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* The polite announcement. Derived ONLY from settled state, which is how
|
|
849
|
+
* "do not announce on every keystroke" is enforced structurally rather than
|
|
850
|
+
* by remembering to: while a request is in flight the text is empty, so a
|
|
851
|
+
* caller-driven filter that re-queries announces once when the new results
|
|
852
|
+
* land, not once per key. Identical text is not re-announced by assistive
|
|
853
|
+
* technology, so re-sorting the same 6 rows stays silent too.
|
|
854
|
+
*/
|
|
855
|
+
get announcement(): string {
|
|
856
|
+
if (this.a.silentCount) {
|
|
857
|
+
return '';
|
|
858
|
+
}
|
|
859
|
+
let noun = this.a.itemNoun ?? 'result';
|
|
860
|
+
switch (this.status) {
|
|
861
|
+
case 'ready': {
|
|
862
|
+
let n = this.count;
|
|
863
|
+
return `${n} ${n === 1 ? noun : `${noun}s`}`;
|
|
864
|
+
}
|
|
865
|
+
case 'empty':
|
|
866
|
+
return `No ${noun}s`;
|
|
867
|
+
case 'error':
|
|
868
|
+
return `Could not load: ${this.errorMessage}`;
|
|
869
|
+
default:
|
|
870
|
+
return '';
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// ── keys ───────────────────────────────────────────────────────────────
|
|
875
|
+
|
|
876
|
+
keyFor = (row: T, index: number): RowKey =>
|
|
877
|
+
this.a.key ? this.a.key(row, index) : defaultRowKey(row, index);
|
|
878
|
+
|
|
879
|
+
private rowsForKeys(keys: readonly RowKey[]): T[] {
|
|
880
|
+
let wanted = new Set<RowKey>(keys);
|
|
881
|
+
return this.visibleRows.filter((row, i) => wanted.has(this.keyFor(row, i)));
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// ── selection ──────────────────────────────────────────────────────────
|
|
885
|
+
|
|
886
|
+
get selectionMode(): SelectionMode {
|
|
887
|
+
return this.a.selectionMode ?? 'none';
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
get selectedKeys(): readonly RowKey[] {
|
|
891
|
+
if (this.a.selected !== undefined) {
|
|
892
|
+
return this.a.selected;
|
|
893
|
+
}
|
|
894
|
+
return this.internalSelected ?? this.a.defaultSelected ?? [];
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
get selectedRows(): T[] {
|
|
898
|
+
return this.rowsForKeys(this.selectedKeys);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/** Every row the reader can see is selected; keys for rows outside the
|
|
902
|
+
* current view do not count either way. */
|
|
903
|
+
get allSelected(): boolean {
|
|
904
|
+
let visible = this.visibleRows;
|
|
905
|
+
if (visible.length === 0) {
|
|
906
|
+
return false;
|
|
907
|
+
}
|
|
908
|
+
let selected = new Set(this.selectedKeys);
|
|
909
|
+
return visible.every((row, index) => selected.has(this.keyFor(row, index)));
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
isSelected = (row: T, index: number): boolean =>
|
|
913
|
+
this.selectedKeys.includes(this.keyFor(row, index));
|
|
914
|
+
|
|
915
|
+
toggleSelected = (row: T, index: number): void => {
|
|
916
|
+
let mode = this.selectionMode;
|
|
917
|
+
if (mode === 'none') {
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
let key = this.keyFor(row, index);
|
|
921
|
+
let current = this.selectedKeys;
|
|
922
|
+
let next: RowKey[];
|
|
923
|
+
if (mode === 'single') {
|
|
924
|
+
next = current.length === 1 && current[0] === key ? [] : [key];
|
|
925
|
+
} else {
|
|
926
|
+
next = current.includes(key)
|
|
927
|
+
? current.filter((k) => k !== key)
|
|
928
|
+
: [...current, key];
|
|
929
|
+
}
|
|
930
|
+
this.commitSelection(next);
|
|
931
|
+
};
|
|
932
|
+
|
|
933
|
+
selectAll = (): void => {
|
|
934
|
+
if (this.selectionMode !== 'multi') {
|
|
935
|
+
return;
|
|
936
|
+
}
|
|
937
|
+
// toggles the rows in view; keys selected outside the view are kept
|
|
938
|
+
let visible = this.visibleRows.map((r, i) => this.keyFor(r, i));
|
|
939
|
+
let shown = new Set(visible);
|
|
940
|
+
let kept = this.selectedKeys.filter((key) => !shown.has(key));
|
|
941
|
+
this.commitSelection(this.allSelected ? kept : [...kept, ...visible]);
|
|
942
|
+
};
|
|
943
|
+
|
|
944
|
+
clearSelection = (): void => {
|
|
945
|
+
this.commitSelection([]);
|
|
946
|
+
};
|
|
947
|
+
|
|
948
|
+
private commitSelection(next: RowKey[]): void {
|
|
949
|
+
// Uncontrolled unless `@selected` was passed — the kit's Slider/Tabs/
|
|
950
|
+
// Comparison rule, applied identically so this feels native.
|
|
951
|
+
if (this.a.selected === undefined) {
|
|
952
|
+
this.internalSelected = next;
|
|
953
|
+
}
|
|
954
|
+
this.a.onSelectionChange?.(next, this.rowsForKeys(next));
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// ── active row ─────────────────────────────────────────────────────────
|
|
958
|
+
|
|
959
|
+
get activeKey(): RowKey | null {
|
|
960
|
+
if (this.a.activeKey !== undefined) {
|
|
961
|
+
return this.a.activeKey;
|
|
962
|
+
}
|
|
963
|
+
return this.internalActive !== undefined
|
|
964
|
+
? this.internalActive
|
|
965
|
+
: (this.a.defaultActiveKey ?? null);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
isActive = (row: T, index: number): boolean =>
|
|
969
|
+
this.activeKey !== null && this.activeKey === this.keyFor(row, index);
|
|
970
|
+
|
|
971
|
+
setActive = (row: T | null, index: number): void => {
|
|
972
|
+
let next = row === null ? null : this.keyFor(row, index);
|
|
973
|
+
if (this.a.activeKey === undefined) {
|
|
974
|
+
this.internalActive = next;
|
|
975
|
+
}
|
|
976
|
+
this.a.onActiveChange?.(next, row ?? undefined);
|
|
977
|
+
};
|
|
978
|
+
|
|
979
|
+
// ── sort ───────────────────────────────────────────────────────────────
|
|
980
|
+
|
|
981
|
+
get sort(): SortState | null {
|
|
982
|
+
if (this.a.sort !== undefined) {
|
|
983
|
+
return this.a.sort;
|
|
984
|
+
}
|
|
985
|
+
return this.internalSort !== undefined
|
|
986
|
+
? this.internalSort
|
|
987
|
+
: (this.a.defaultSort ?? null);
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
/** asc → desc → unsorted, the three-step cycle DataGrid already used. */
|
|
991
|
+
toggleSort = (key: string): void => {
|
|
992
|
+
let current = this.sort;
|
|
993
|
+
let next: SortState | null =
|
|
994
|
+
!current || current.key !== key
|
|
995
|
+
? { key, dir: 'asc' }
|
|
996
|
+
: current.dir === 'asc'
|
|
997
|
+
? { key, dir: 'desc' }
|
|
998
|
+
: null;
|
|
999
|
+
if (this.a.sort === undefined) {
|
|
1000
|
+
this.internalSort = next;
|
|
1001
|
+
}
|
|
1002
|
+
this.a.onSortChange?.(next);
|
|
1003
|
+
};
|
|
1004
|
+
|
|
1005
|
+
ariaSort = (key: string): 'ascending' | 'descending' | 'none' => {
|
|
1006
|
+
let current = this.sort;
|
|
1007
|
+
if (!current || current.key !== key) {
|
|
1008
|
+
return 'none';
|
|
1009
|
+
}
|
|
1010
|
+
return current.dir === 'asc' ? 'ascending' : 'descending';
|
|
1011
|
+
};
|
|
1012
|
+
|
|
1013
|
+
private compare(a: T, b: T, sort: SortState, dir: number): number {
|
|
1014
|
+
if (this.a.comparator) {
|
|
1015
|
+
return this.a.comparator(a, b, sort) * dir;
|
|
1016
|
+
}
|
|
1017
|
+
let x = readField(a, sort.key);
|
|
1018
|
+
let y = readField(b, sort.key);
|
|
1019
|
+
let xMissing = x === undefined || x === null;
|
|
1020
|
+
let yMissing = y === undefined || y === null;
|
|
1021
|
+
// missing values sort last in either direction, so they skip `dir`
|
|
1022
|
+
if (xMissing || yMissing) {
|
|
1023
|
+
return compareValues(x, y);
|
|
1024
|
+
}
|
|
1025
|
+
return compareValues(x, y) * dir;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// ── the yielded hash ───────────────────────────────────────────────────
|
|
1029
|
+
|
|
1030
|
+
get data(): DataApi<T> {
|
|
1031
|
+
return {
|
|
1032
|
+
status: this.status,
|
|
1033
|
+
count: this.count,
|
|
1034
|
+
errorMessage: this.errorMessage,
|
|
1035
|
+
keyFor: this.keyFor,
|
|
1036
|
+
selectionMode: this.selectionMode,
|
|
1037
|
+
selectedKeys: this.selectedKeys,
|
|
1038
|
+
selectedRows: this.selectedRows,
|
|
1039
|
+
allSelected: this.allSelected,
|
|
1040
|
+
isSelected: this.isSelected,
|
|
1041
|
+
toggleSelected: this.toggleSelected,
|
|
1042
|
+
selectAll: this.selectAll,
|
|
1043
|
+
clearSelection: this.clearSelection,
|
|
1044
|
+
activeKey: this.activeKey,
|
|
1045
|
+
isActive: this.isActive,
|
|
1046
|
+
setActive: this.setActive,
|
|
1047
|
+
sort: this.sort,
|
|
1048
|
+
toggleSort: this.toggleSort,
|
|
1049
|
+
ariaSort: this.ariaSort,
|
|
1050
|
+
reload: this.reload,
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* The base class: a `DataSource` plus a template, for the common case where
|
|
1057
|
+
* a data component's args ARE the data args.
|
|
1058
|
+
*
|
|
1059
|
+
* class LotList extends DataComponent<Lot> {
|
|
1060
|
+
* <template>
|
|
1061
|
+
* <DataShell @state={{this.source}}> … </DataShell>
|
|
1062
|
+
* </template>
|
|
1063
|
+
* }
|
|
1064
|
+
*
|
|
1065
|
+
* Extend it and either take the inherited `<template>` (shell + yielded
|
|
1066
|
+
* rows + interaction API) or write your own and render
|
|
1067
|
+
* `<DataShell @state={{this.source}}>` inside it — that is how a subclass
|
|
1068
|
+
* keeps aria-busy, the live region and every state slot without copying a
|
|
1069
|
+
* line of it.
|
|
1070
|
+
*
|
|
1071
|
+
* A subclass inherits the whole `DataSource` surface by forwarding, listed
|
|
1072
|
+
* below. NAMED EDGE (Law 7): the ARG and BLOCK sets are fixed at
|
|
1073
|
+
* `DataArgs<T>` / `DataBlocks<T>`, because a generic type parameter anywhere
|
|
1074
|
+
* inside `Args` makes Glint infer every caller's row type as `{}`, and a
|
|
1075
|
+
* block map built from a generic intersection cannot be flattened at all. A
|
|
1076
|
+
* component that needs its OWN args or blocks does not subclass — it holds a
|
|
1077
|
+
* `DataSource` and points `<DataShell>` at it, which costs one line and
|
|
1078
|
+
* loses nothing.
|
|
1079
|
+
*/
|
|
1080
|
+
export class DataComponent<
|
|
1081
|
+
T,
|
|
1082
|
+
El extends Element = HTMLDivElement,
|
|
1083
|
+
> extends Component<DataComponentSignature<T, El>> {
|
|
1084
|
+
/** the state machine — pass it to `<DataShell @state={{this.source}}>` */
|
|
1085
|
+
source = new DataSource<T>(() => this.args);
|
|
1086
|
+
|
|
1087
|
+
// Thin forwards so a subclass template reads `this.visibleRows` rather
|
|
1088
|
+
// than `this.source.visibleRows`. Arrow-valued members are forwarded by
|
|
1089
|
+
// reference (they are already bound to the source), getters by delegation.
|
|
1090
|
+
get status(): DataStatus {
|
|
1091
|
+
return this.source.status;
|
|
1092
|
+
}
|
|
1093
|
+
get busy(): 'true' | 'false' {
|
|
1094
|
+
return this.source.busy;
|
|
1095
|
+
}
|
|
1096
|
+
get errorMessage(): string {
|
|
1097
|
+
return this.source.errorMessage;
|
|
1098
|
+
}
|
|
1099
|
+
get announcement(): string {
|
|
1100
|
+
return this.source.announcement;
|
|
1101
|
+
}
|
|
1102
|
+
get rows(): readonly T[] {
|
|
1103
|
+
return this.source.rows;
|
|
1104
|
+
}
|
|
1105
|
+
get visibleRows(): T[] {
|
|
1106
|
+
return this.source.visibleRows;
|
|
1107
|
+
}
|
|
1108
|
+
get count(): number {
|
|
1109
|
+
return this.source.count;
|
|
1110
|
+
}
|
|
1111
|
+
get selectionMode(): SelectionMode {
|
|
1112
|
+
return this.source.selectionMode;
|
|
1113
|
+
}
|
|
1114
|
+
get selectedKeys(): readonly RowKey[] {
|
|
1115
|
+
return this.source.selectedKeys;
|
|
1116
|
+
}
|
|
1117
|
+
get selectedRows(): T[] {
|
|
1118
|
+
return this.source.selectedRows;
|
|
1119
|
+
}
|
|
1120
|
+
get allSelected(): boolean {
|
|
1121
|
+
return this.source.allSelected;
|
|
1122
|
+
}
|
|
1123
|
+
get activeKey(): RowKey | null {
|
|
1124
|
+
return this.source.activeKey;
|
|
1125
|
+
}
|
|
1126
|
+
get sort(): SortState | null {
|
|
1127
|
+
return this.source.sort;
|
|
1128
|
+
}
|
|
1129
|
+
get data(): DataApi<T> {
|
|
1130
|
+
return this.source.data;
|
|
1131
|
+
}
|
|
1132
|
+
keyFor = this.source.keyFor;
|
|
1133
|
+
isSelected = this.source.isSelected;
|
|
1134
|
+
toggleSelected = this.source.toggleSelected;
|
|
1135
|
+
selectAll = this.source.selectAll;
|
|
1136
|
+
clearSelection = this.source.clearSelection;
|
|
1137
|
+
isActive = this.source.isActive;
|
|
1138
|
+
setActive = this.source.setActive;
|
|
1139
|
+
toggleSort = this.source.toggleSort;
|
|
1140
|
+
ariaSort = this.source.ariaSort;
|
|
1141
|
+
reload = this.source.reload;
|
|
1142
|
+
|
|
1143
|
+
<template>
|
|
1144
|
+
<DataShell
|
|
1145
|
+
@state={{this.source}}
|
|
1146
|
+
@hasLoading={{has-block 'loading'}}
|
|
1147
|
+
@hasEmpty={{has-block 'empty'}}
|
|
1148
|
+
@hasError={{has-block 'error'}}
|
|
1149
|
+
@emptyTitle={{@emptyTitle}}
|
|
1150
|
+
@emptyMessage={{@emptyMessage}}
|
|
1151
|
+
@loadingLabel={{@loadingLabel}}
|
|
1152
|
+
@skeletonRows={{@skeletonRows}}
|
|
1153
|
+
...attributes
|
|
1154
|
+
>
|
|
1155
|
+
<:default>{{yield this.visibleRows this.data}}</:default>
|
|
1156
|
+
<:loading>{{yield to='loading'}}</:loading>
|
|
1157
|
+
<:empty>{{yield to='empty'}}</:empty>
|
|
1158
|
+
<:error>{{yield to='error'}}</:error>
|
|
1159
|
+
</DataShell>
|
|
1160
|
+
</template>
|
|
1161
|
+
}
|