@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,1174 @@
|
|
|
1
|
+
// Pretui — NodeCanvas: a node-and-edge canvas over the vendored surfaces engine.
|
|
2
|
+
import Component from '@glimmer/component';
|
|
3
|
+
import { tracked } from '@glimmer/tracking';
|
|
4
|
+
import { cssStyle } from '../pretui-css';
|
|
5
|
+
import { Background, Canvas, Controls, Handle, MiniMap, Panel, addEdge, applyEdgeChanges, applyNodeChanges, getCanvas } from '../surfaces/canvas/index.js';
|
|
6
|
+
import { GraphOutline } from './graph-outline';
|
|
7
|
+
import { graphLayout, handleSidesFor } from '../surfaces-canvas-layout';
|
|
8
|
+
import type { GraphDirection, GraphLayoutResult } from '../surfaces-canvas-layout';
|
|
9
|
+
import { NodeCard } from './node-card';
|
|
10
|
+
import type { NodeBodyComponent, NodeBodySignature } from './node-card';
|
|
11
|
+
import { canvasStylesheet } from '../internal/surfaces-canvas';
|
|
12
|
+
import type { CanvasEdge, CanvasNode } from '../internal/surfaces-canvas';
|
|
13
|
+
|
|
14
|
+
// ── NodeShell — handles + hit area around whatever body is in play ───────
|
|
15
|
+
// The engine's FlowNode draws its own source/target handles ONLY when no
|
|
16
|
+
// custom node component is supplied (`hasSourceHandle = !nodeComponent`),
|
|
17
|
+
// which means every custom node in React Flow and in this port has to
|
|
18
|
+
// remember to render <Handle>s or its edges detach. NodeCanvas always uses
|
|
19
|
+
// a custom component, so the shell renders them once, correctly, for every
|
|
20
|
+
// body — including a caller's.
|
|
21
|
+
|
|
22
|
+
class NodeShell extends Component<NodeBodySignature> {
|
|
23
|
+
/** Overridden by `shellFor` to carry the caller's body component. */
|
|
24
|
+
get body(): NodeBodyComponent {
|
|
25
|
+
return NodeCard as unknown as NodeBodyComponent;
|
|
26
|
+
}
|
|
27
|
+
get targetPosition() {
|
|
28
|
+
return this.args.node?.targetPosition ?? 'left';
|
|
29
|
+
}
|
|
30
|
+
get sourcePosition() {
|
|
31
|
+
return this.args.node?.sourcePosition ?? 'right';
|
|
32
|
+
}
|
|
33
|
+
<template>
|
|
34
|
+
<Handle @type='target' @position={{this.targetPosition}} />
|
|
35
|
+
<this.body
|
|
36
|
+
@node={{@node}}
|
|
37
|
+
@id={{@id}}
|
|
38
|
+
@data={{@data}}
|
|
39
|
+
@selected={{@selected}}
|
|
40
|
+
@dragging={{@dragging}}
|
|
41
|
+
/>
|
|
42
|
+
<Handle @type='source' @position={{this.sourcePosition}} />
|
|
43
|
+
</template>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// A component class must keep a STABLE identity across renders or the
|
|
47
|
+
// engine treats it as a brand-new node type and warns (error002). Memoised
|
|
48
|
+
// per body component; subclassing inherits NodeShell's template through
|
|
49
|
+
// the prototype chain.
|
|
50
|
+
const SHELL_CACHE = new WeakMap<object, unknown>();
|
|
51
|
+
|
|
52
|
+
function shellFor(body: NodeBodyComponent): unknown {
|
|
53
|
+
let hit = SHELL_CACHE.get(body as unknown as object);
|
|
54
|
+
if (!hit) {
|
|
55
|
+
hit = class extends NodeShell {
|
|
56
|
+
override get body(): NodeBodyComponent {
|
|
57
|
+
return body;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
SHELL_CACHE.set(body as unknown as object, hit);
|
|
61
|
+
}
|
|
62
|
+
return hit;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── NodeCanvas ───────────────────────────────────────────────────────────
|
|
66
|
+
// Ported from @cardstack/boxel-canvas (xyflow / React Flow). What the
|
|
67
|
+
// inspiration got wrong, and what this fixes:
|
|
68
|
+
//
|
|
69
|
+
// • Uncontrolled by default. React Flow makes you wire onNodesChange /
|
|
70
|
+
// useNodesState before a node will move at all; drop `<NodeCanvas
|
|
71
|
+
// @nodes>` on a page here and dragging just works. Pass
|
|
72
|
+
// `@onNodesChange` and it hands control straight back.
|
|
73
|
+
// • Node content is a component slot, not a string. React Flow's stock
|
|
74
|
+
// node renders `data.label`; anything richer means authoring a
|
|
75
|
+
// nodeTypes map AND remembering the <Handle>s. Here `@nodeBody` takes
|
|
76
|
+
// any component and the shell supplies the handles.
|
|
77
|
+
// • Chrome is tokenized. Every colour in the engine's `--xy-*` channel
|
|
78
|
+
// is remapped to a Pretui token with a documented `--pretui-canvas-*`
|
|
79
|
+
// knob in front of it — background pattern, edges, handles, controls,
|
|
80
|
+
// minimap, selection rectangle. No `.dark` branch anywhere (the engine
|
|
81
|
+
// ships one; we never add the class that triggers it).
|
|
82
|
+
// • Edges arrive where the handles are. The engine computes an edge's
|
|
83
|
+
// endpoints from `node.sourcePosition ?? 'bottom'` /
|
|
84
|
+
// `node.targetPosition ?? 'top'`, but a custom node component draws
|
|
85
|
+
// its own handles — so every React-Flow graph that forgets those two
|
|
86
|
+
// keys renders edges leaving the BOTTOM of a node whose handle is on
|
|
87
|
+
// the right. `@flow` sets both sides for the whole graph, once, and
|
|
88
|
+
// the shell draws the handles to match.
|
|
89
|
+
// • Depth is hairline + shadow (Law 1) — the stock node border is gone.
|
|
90
|
+
// • Focus is visible again, and animated edges stop under
|
|
91
|
+
// prefers-reduced-motion (Law 5). Both were `outline: none` /
|
|
92
|
+
// unguarded `animation` upstream. See PRETUI_CANVAS_SKIN.
|
|
93
|
+
// • The graph has a text form, and the text form is OPERABLE. Canvases
|
|
94
|
+
// are the worst surface in UI for screen readers; `@summary` renders
|
|
95
|
+
// the whole graph as GraphOutline — a real list of nodes with both
|
|
96
|
+
// directions of every edge spelled out (labels included), where each
|
|
97
|
+
// node is a button that selects and focuses it in the picture, and
|
|
98
|
+
// where a keyboard user can draw a NEW edge. sr-only by default, and
|
|
99
|
+
// it unhides the moment focus enters it.
|
|
100
|
+
// • Auto-layout. React Flow ships none at all; its own Layouting example
|
|
101
|
+
// reaches for `dagre`, whose ranker calls `Math.random()` — forbidden
|
|
102
|
+
// in realm code, because the indexer requires determinism. `@autoLayout`
|
|
103
|
+
// runs a layered pass written for this kit (see surfaces-canvas-layout).
|
|
104
|
+
// • Arrowheads that actually draw. The port emits
|
|
105
|
+
// `marker-end="url('#1__type=arrowclosed')"` and ships no `<marker>`
|
|
106
|
+
// anywhere, so `markerEnd` has always been a no-op. The defs are
|
|
107
|
+
// supplied here, and `@arrowheads` defaults to ON — a directed graph
|
|
108
|
+
// that does not say which way its edges run is not communicating.
|
|
109
|
+
// • Edge routing is a knob. `@edgeType` sets the routing for every edge
|
|
110
|
+
// AND the shape of the line drawn while connecting, which the engine
|
|
111
|
+
// otherwise leaves as a bezier however the edges look.
|
|
112
|
+
//
|
|
113
|
+
// KEYBOARD — read out of the engine bundle rather than assumed, because a
|
|
114
|
+
// canvas is the surface people lie about most:
|
|
115
|
+
// • the canvas root is `role="application" tabindex="0"`; every visible
|
|
116
|
+
// node is `tabindex="0"` with `aria-roledescription="node"`.
|
|
117
|
+
// • Tab / Shift-Tab move the SELECTION to the next / previous node and
|
|
118
|
+
// focus it. The engine consumes the key — inside a canvas Tab is a
|
|
119
|
+
// graph walk, not the browser's tab order.
|
|
120
|
+
// • Enter (or F2) ACTIVATES the focused node — it dispatches the
|
|
121
|
+
// surface `activate` command. Space does NOT select: it is the
|
|
122
|
+
// pan-activation key, held while dragging to pan the viewport.
|
|
123
|
+
// • Arrow keys move the selection to the nearest node in that
|
|
124
|
+
// direction; in the surface's `change` mode they nudge the selected
|
|
125
|
+
// node by one graph unit, Shift+Arrow by ten.
|
|
126
|
+
// • Delete / Backspace delete the selection, Cmd/Ctrl+A selects all,
|
|
127
|
+
// and Escape cancels a drag, then an edit, then clears the selection
|
|
128
|
+
// and releases focus.
|
|
129
|
+
// • zoom in / zoom out / fit view / interactivity lock are real
|
|
130
|
+
// <button>s with aria-labels inside `Controls`, so they are reachable
|
|
131
|
+
// and are the only keyboard route to pan or zoom.
|
|
132
|
+
// THE REMAINING GAPS, stated plainly rather than papered over:
|
|
133
|
+
// 1. The ENGINE has no keyboard path to create or reconnect an edge —
|
|
134
|
+
// connections are pointer-only here and in React Flow — so `@summary`
|
|
135
|
+
// carries one. GraphOutline gives every node a real button (select and focus it in
|
|
136
|
+
// the picture) and a connect control: arm a source, activate a
|
|
137
|
+
// target, and the connection goes through the SAME `onConnect` a
|
|
138
|
+
// pointer drag uses. Reconnecting an existing edge is still
|
|
139
|
+
// pointer-only.
|
|
140
|
+
// 2. The engine registers its key handler on the WINDOW in the capture
|
|
141
|
+
// phase, so while any canvas is mounted those keys are canvas-scoped
|
|
142
|
+
// for the whole page — a Tab pressed outside the graph can be pulled
|
|
143
|
+
// into it (text inputs and activation keys on buttons are exempt).
|
|
144
|
+
// Give a canvas its own page or panel; do not sit one beside an
|
|
145
|
+
// unrelated form.
|
|
146
|
+
// 3. The MiniMap's accessible name is an SVG <title> with a FIXED id
|
|
147
|
+
// upstream, so two canvases on one page share the first one's name.
|
|
148
|
+
// One canvas per page is the shape that behaves.
|
|
149
|
+
// 4. `@summary` is the answer to what is left: the same graph as a real
|
|
150
|
+
// list of nodes and their outgoing links — sr-only by default, and
|
|
151
|
+
// `visible` for anyone who would rather read it than trace it.
|
|
152
|
+
|
|
153
|
+
const EMPTY_NODES: CanvasNode[] = [];
|
|
154
|
+
const EMPTY_EDGES: CanvasEdge[] = [];
|
|
155
|
+
|
|
156
|
+
/** Which sides the handles (and therefore the edge endpoints) sit on. */
|
|
157
|
+
export type CanvasFlow = 'horizontal' | 'vertical';
|
|
158
|
+
|
|
159
|
+
const FLOW_SIDES: Record<
|
|
160
|
+
CanvasFlow,
|
|
161
|
+
{ source: CanvasNode['sourcePosition']; target: CanvasNode['targetPosition'] }
|
|
162
|
+
> = {
|
|
163
|
+
horizontal: { source: 'right', target: 'left' },
|
|
164
|
+
vertical: { source: 'bottom', target: 'top' },
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/** Edge routing. `bezier` is the engine's unnamed default. */
|
|
168
|
+
export type CanvasEdgeType =
|
|
169
|
+
| 'bezier'
|
|
170
|
+
| 'smoothstep'
|
|
171
|
+
| 'step'
|
|
172
|
+
| 'straight'
|
|
173
|
+
| 'simplebezier';
|
|
174
|
+
|
|
175
|
+
/** What the default block's second parameter carries. */
|
|
176
|
+
export interface NodeCanvasApi {
|
|
177
|
+
/** re-run `@autoLayout` over the CURRENT graph, after drags */
|
|
178
|
+
relayout: () => void;
|
|
179
|
+
/** select a node and move keyboard focus to it */
|
|
180
|
+
focusNode: (id: string) => void;
|
|
181
|
+
/** the last layout result: layers, reversed edges, crossing counts */
|
|
182
|
+
layout: GraphLayoutResult | undefined;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* `bezier` is the engine's DEFAULT branch, reached by leaving `type`
|
|
187
|
+
* unset — there is no `'bezier'` case in its path switch, so writing the
|
|
188
|
+
* string through would fall into the same default but is left undefined
|
|
189
|
+
* here to keep the edge records honest about what they asked for.
|
|
190
|
+
*/
|
|
191
|
+
function edgeTypeValue(type: CanvasEdgeType | undefined): string | undefined {
|
|
192
|
+
return type && type !== 'bezier' ? type : undefined;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** The engine's own name for the same routing, on the in-flight line. */
|
|
196
|
+
const CONNECTION_LINE_TYPE: Record<CanvasEdgeType, string> = {
|
|
197
|
+
bezier: 'default',
|
|
198
|
+
smoothstep: 'smoothstep',
|
|
199
|
+
step: 'step',
|
|
200
|
+
straight: 'straight',
|
|
201
|
+
simplebezier: 'simplebezier',
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const MARKER_FOR: Record<string, { type: string } | undefined> = {
|
|
205
|
+
closed: { type: 'arrowclosed' },
|
|
206
|
+
open: { type: 'arrow' },
|
|
207
|
+
none: undefined,
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
// Memoised so the object handed to the engine keeps ONE identity for a
|
|
211
|
+
// given combination — a fresh object every read makes the engine treat
|
|
212
|
+
// every edge as replaced.
|
|
213
|
+
const EDGE_OPTIONS_CACHE = new Map<string, Record<string, unknown>>();
|
|
214
|
+
|
|
215
|
+
function defaultEdgeOptionsFor(
|
|
216
|
+
type: CanvasEdgeType,
|
|
217
|
+
arrowheads: string,
|
|
218
|
+
animated: boolean,
|
|
219
|
+
): Record<string, unknown> {
|
|
220
|
+
let key = `${type}|${arrowheads}|${animated ? 'a' : '-'}`;
|
|
221
|
+
let hit = EDGE_OPTIONS_CACHE.get(key);
|
|
222
|
+
if (!hit) {
|
|
223
|
+
hit = {};
|
|
224
|
+
let routed = edgeTypeValue(type);
|
|
225
|
+
if (routed) {
|
|
226
|
+
hit['type'] = routed;
|
|
227
|
+
}
|
|
228
|
+
let marker = MARKER_FOR[arrowheads];
|
|
229
|
+
if (marker) {
|
|
230
|
+
hit['markerEnd'] = marker;
|
|
231
|
+
}
|
|
232
|
+
if (animated) {
|
|
233
|
+
hit['animated'] = true;
|
|
234
|
+
}
|
|
235
|
+
EDGE_OPTIONS_CACHE.set(key, hit);
|
|
236
|
+
}
|
|
237
|
+
return hit;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const SNAP_CACHE = new Map<number, [number, number]>();
|
|
241
|
+
|
|
242
|
+
/** Snapping to the drawn grid, not to a second invisible one. */
|
|
243
|
+
function snapGridFor(gap: number): [number, number] {
|
|
244
|
+
let hit = SNAP_CACHE.get(gap);
|
|
245
|
+
if (!hit) {
|
|
246
|
+
hit = [gap, gap];
|
|
247
|
+
SNAP_CACHE.set(gap, hit);
|
|
248
|
+
}
|
|
249
|
+
return hit;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let summarySeq = 0;
|
|
253
|
+
|
|
254
|
+
export interface NodeCanvasSignature {
|
|
255
|
+
Args: {
|
|
256
|
+
/**
|
|
257
|
+
* The nodes to draw. Uncontrolled unless `@onNodesChange` is passed:
|
|
258
|
+
* an uncontrolled canvas SEEDS from this array once and then owns its
|
|
259
|
+
* own copy, so later changes to it are ignored. Pass `@onNodesChange`
|
|
260
|
+
* (and keep the array yourself) whenever the graph changes from
|
|
261
|
+
* outside the canvas.
|
|
262
|
+
*/
|
|
263
|
+
nodes?: CanvasNode[];
|
|
264
|
+
/** the edges to draw. Uncontrolled unless `@onEdgesChange` is passed. */
|
|
265
|
+
edges?: CanvasEdge[];
|
|
266
|
+
/** accessible name for the canvas. Required — it is a `role=application`. */
|
|
267
|
+
label: string;
|
|
268
|
+
/** take control of node changes (drag, select, remove) */
|
|
269
|
+
onNodesChange?: (changes: unknown[]) => void;
|
|
270
|
+
/** take control of edge changes */
|
|
271
|
+
onEdgesChange?: (changes: unknown[]) => void;
|
|
272
|
+
/** fires when a handle drag completes; uncontrolled canvases add the edge */
|
|
273
|
+
onConnect?: (connection: unknown) => void;
|
|
274
|
+
/**
|
|
275
|
+
* Which sides connectors leave from, for every node that does not set
|
|
276
|
+
* its own `sourcePosition`/`targetPosition`: `horizontal` (default,
|
|
277
|
+
* in at the inline start and out at the inline end) or `vertical`.
|
|
278
|
+
* Sets the drawn handles AND the edge endpoints together.
|
|
279
|
+
*/
|
|
280
|
+
flow?: CanvasFlow;
|
|
281
|
+
/**
|
|
282
|
+
* Run the layered auto-layout and place every node, ignoring the
|
|
283
|
+
* `position` on the input nodes. `right` / `down` / `left` / `up`; omit
|
|
284
|
+
* for free positioning. Also pins the handle sides to match, so edges
|
|
285
|
+
* leave the side they are drawn on. See `graphLayout`.
|
|
286
|
+
*
|
|
287
|
+
* It obeys the same controlled/uncontrolled rule as `@nodes`: an
|
|
288
|
+
* UNCONTROLLED canvas lays out once and then owns its own positions, so
|
|
289
|
+
* a reader's drags are never yanked back and a later change to
|
|
290
|
+
* `@autoLayout` does not move anything by itself. Re-run it with the
|
|
291
|
+
* outline's "Tidy layout" control or the `relayout` on the yielded API.
|
|
292
|
+
* A CONTROLLED canvas (`@onNodesChange`) re-lays out whenever the nodes
|
|
293
|
+
* or edges array changes identity.
|
|
294
|
+
*/
|
|
295
|
+
autoLayout?: GraphDirection;
|
|
296
|
+
/** space between layers under `@autoLayout`, in graph units (default 110) */
|
|
297
|
+
rankGap?: number;
|
|
298
|
+
/** space between siblings within a layer under `@autoLayout` (default 28) */
|
|
299
|
+
nodeGap?: number;
|
|
300
|
+
/** node width the layout assumes when a node declares none (default 200) */
|
|
301
|
+
layoutNodeWidth?: number;
|
|
302
|
+
/** node height the layout assumes when a node declares none (default 96) */
|
|
303
|
+
layoutNodeHeight?: number;
|
|
304
|
+
/**
|
|
305
|
+
* Edge routing for every edge that does not set its own `type`:
|
|
306
|
+
* `bezier` (default), `smoothstep`, `step`, `straight`, `simplebezier`.
|
|
307
|
+
* Also picks the shape of the line drawn WHILE connecting, which the
|
|
308
|
+
* engine otherwise leaves as a bezier no matter what the edges look
|
|
309
|
+
* like.
|
|
310
|
+
*/
|
|
311
|
+
edgeType?: CanvasEdgeType;
|
|
312
|
+
/**
|
|
313
|
+
* Arrowheads on every edge: `closed` (default — a directed graph
|
|
314
|
+
* without them is ambiguous), `open`, or `none`. React Flow ships no
|
|
315
|
+
* marker by default and the Ember port ships no marker DEFINITIONS at
|
|
316
|
+
* all; both are fixed here.
|
|
317
|
+
*/
|
|
318
|
+
arrowheads?: 'closed' | 'open' | 'none';
|
|
319
|
+
/** dash and travel every edge that does not set its own `animated` */
|
|
320
|
+
animatedEdges?: boolean;
|
|
321
|
+
/**
|
|
322
|
+
* Drag on empty canvas to rubber-band select instead of panning, and
|
|
323
|
+
* select on TOUCH rather than full enclosure. Panning stays available
|
|
324
|
+
* on the pan-activation key (Space held while dragging) and through
|
|
325
|
+
* the Controls, so this does not strand anyone — but say so in the UI,
|
|
326
|
+
* because a canvas that stops panning under the pointer reads as
|
|
327
|
+
* broken.
|
|
328
|
+
*/
|
|
329
|
+
marquee?: boolean;
|
|
330
|
+
/** snap dragged nodes to the background grid */
|
|
331
|
+
snapToGrid?: boolean;
|
|
332
|
+
/** component rendered inside every node; handles are added around it */
|
|
333
|
+
nodeBody?: NodeBodyComponent;
|
|
334
|
+
/** per-type node components, keyed by `node.type`, for mixed graphs */
|
|
335
|
+
nodeTypes?: Record<string, unknown>;
|
|
336
|
+
/** background pattern: `dots` (default), `lines`, `cross` or `none` */
|
|
337
|
+
pattern?: 'dots' | 'lines' | 'cross' | 'none';
|
|
338
|
+
/** grid spacing of the background pattern, in graph units */
|
|
339
|
+
gap?: number;
|
|
340
|
+
/** dot radius / cross arm length, in graph units */
|
|
341
|
+
patternSize?: number;
|
|
342
|
+
/** show the zoom / fit / lock control cluster (default true) */
|
|
343
|
+
controls?: boolean;
|
|
344
|
+
/** corner for the control cluster */
|
|
345
|
+
controlsPosition?:
|
|
346
|
+
| 'top-left'
|
|
347
|
+
| 'top-right'
|
|
348
|
+
| 'bottom-left'
|
|
349
|
+
| 'bottom-right';
|
|
350
|
+
/** lay the control cluster out horizontally instead of vertically */
|
|
351
|
+
controlsHorizontal?: boolean;
|
|
352
|
+
/** show the minimap (default true) */
|
|
353
|
+
minimap?: boolean;
|
|
354
|
+
/** corner for the minimap */
|
|
355
|
+
minimapPosition?:
|
|
356
|
+
| 'top-left'
|
|
357
|
+
| 'top-right'
|
|
358
|
+
| 'bottom-left'
|
|
359
|
+
| 'bottom-right';
|
|
360
|
+
/** frame the whole graph on first render (default true) */
|
|
361
|
+
fitView?: boolean;
|
|
362
|
+
/**
|
|
363
|
+
* Allow node dragging. Defaults to true — EXCEPT on a controlled canvas
|
|
364
|
+
* under `@autoLayout`, where the layout owns positions and a dragged
|
|
365
|
+
* node would snap straight back. See the getter for the whole rule.
|
|
366
|
+
*/
|
|
367
|
+
draggable?: boolean;
|
|
368
|
+
/** allow drawing new edges from handles (default true) */
|
|
369
|
+
connectable?: boolean;
|
|
370
|
+
/** allow selecting nodes and edges (default true) */
|
|
371
|
+
selectable?: boolean;
|
|
372
|
+
/** height of the canvas frame; any CSS length (default `26rem`) */
|
|
373
|
+
height?: string;
|
|
374
|
+
/** where the text form of the graph goes (default `sr-only`) */
|
|
375
|
+
summary?: 'sr-only' | 'visible' | 'off';
|
|
376
|
+
};
|
|
377
|
+
Blocks: {
|
|
378
|
+
/**
|
|
379
|
+
* anything extra inside the viewport — Panels, NodeToolbars, overlays.
|
|
380
|
+
* Yields the engine store first (viewport, fitView, setCenter) and the
|
|
381
|
+
* canvas's own API second (`relayout`, `focusNode`, `layout`).
|
|
382
|
+
*/
|
|
383
|
+
default: [unknown, NodeCanvasApi];
|
|
384
|
+
/** a floating top-start Panel: filters, mode switches, a title */
|
|
385
|
+
toolbar: [];
|
|
386
|
+
/** a floating top-end Panel: a key for the node hues */
|
|
387
|
+
legend: [];
|
|
388
|
+
/** shown centred when there are no nodes at all */
|
|
389
|
+
empty: [];
|
|
390
|
+
};
|
|
391
|
+
Element: HTMLDivElement;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export class NodeCanvas extends Component<NodeCanvasSignature> {
|
|
395
|
+
private summaryId = `pretui-canvas-summary-${(summarySeq += 1)}`;
|
|
396
|
+
private rootId = `pretui-canvas-root-${summarySeq}`;
|
|
397
|
+
|
|
398
|
+
// Uncontrolled mode holds its own copy so a bare <NodeCanvas @nodes>
|
|
399
|
+
// drags out of the box; controlled mode never reads these.
|
|
400
|
+
@tracked private localNodes: CanvasNode[] = seed(
|
|
401
|
+
this.args.nodes ?? EMPTY_NODES,
|
|
402
|
+
this.args.edges ?? EMPTY_EDGES,
|
|
403
|
+
this.args.flow ?? 'horizontal',
|
|
404
|
+
layoutOptionsFrom(this.args),
|
|
405
|
+
);
|
|
406
|
+
@tracked private localEdges: CanvasEdge[] = (
|
|
407
|
+
this.args.edges ?? EMPTY_EDGES
|
|
408
|
+
).map((edge) => ({ ...edge }));
|
|
409
|
+
|
|
410
|
+
/** The node the outline last sent focus to, so it can mark its own row. */
|
|
411
|
+
@tracked private activeId: string | undefined = undefined;
|
|
412
|
+
|
|
413
|
+
get isNodeControlled() {
|
|
414
|
+
return typeof this.args.onNodesChange === 'function';
|
|
415
|
+
}
|
|
416
|
+
get isEdgeControlled() {
|
|
417
|
+
return typeof this.args.onEdgesChange === 'function';
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Identity matters: the engine warns (error002) when the node array or
|
|
421
|
+
// the nodeTypes object is a fresh object on every read, and Glimmer does
|
|
422
|
+
// not cache getters. The memo lives in module-level WeakMaps keyed on the
|
|
423
|
+
// caller's own array/object, so the getter stays free of side effects.
|
|
424
|
+
get flow(): CanvasFlow {
|
|
425
|
+
// Under @autoLayout the direction IS the flow — a graph laid out
|
|
426
|
+
// downward whose handles point right draws every edge leaving the wrong
|
|
427
|
+
// face of the node. Explicit @flow still wins.
|
|
428
|
+
if (this.args.flow) {
|
|
429
|
+
return this.args.flow;
|
|
430
|
+
}
|
|
431
|
+
let direction = this.args.autoLayout;
|
|
432
|
+
if (direction) {
|
|
433
|
+
return direction === 'down' || direction === 'up'
|
|
434
|
+
? 'vertical'
|
|
435
|
+
: 'horizontal';
|
|
436
|
+
}
|
|
437
|
+
return 'horizontal';
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
get nodes(): CanvasNode[] {
|
|
441
|
+
return this.isNodeControlled
|
|
442
|
+
? placedCached(
|
|
443
|
+
this.args.nodes ?? EMPTY_NODES,
|
|
444
|
+
this.args.edges ?? EMPTY_EDGES,
|
|
445
|
+
this.flow,
|
|
446
|
+
layoutOptionsFrom(this.args),
|
|
447
|
+
)
|
|
448
|
+
: this.localNodes;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/** The layout result for the graph as it is currently drawn, or undefined. */
|
|
452
|
+
get layout(): GraphLayoutResult | undefined {
|
|
453
|
+
if (!this.args.autoLayout) {
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
return layoutCached(this.nodes, this.edges, layoutOptionsFrom(this.args))
|
|
457
|
+
.result;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
get edges(): CanvasEdge[] {
|
|
461
|
+
return this.isEdgeControlled
|
|
462
|
+
? (this.args.edges ?? EMPTY_EDGES)
|
|
463
|
+
: this.localEdges;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
get nodeTypes(): Record<string, unknown> {
|
|
467
|
+
return nodeTypesFor(this.args.nodeBody, this.args.nodeTypes);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
canvas = getCanvas(this, {
|
|
471
|
+
nodes: () => this.nodes,
|
|
472
|
+
edges: () => this.edges,
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
handleNodesChange = (changes: unknown[]) => {
|
|
476
|
+
if (this.args.onNodesChange) {
|
|
477
|
+
this.args.onNodesChange(changes);
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
this.localNodes = applyNodeChanges(changes, this.localNodes);
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
handleEdgesChange = (changes: unknown[]) => {
|
|
484
|
+
if (this.args.onEdgesChange) {
|
|
485
|
+
this.args.onEdgesChange(changes);
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
this.localEdges = applyEdgeChanges(changes, this.localEdges);
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
handleConnect = (connection: unknown) => {
|
|
492
|
+
this.args.onConnect?.(connection);
|
|
493
|
+
if (!this.isEdgeControlled) {
|
|
494
|
+
this.localEdges = addEdge(connection, this.localEdges);
|
|
495
|
+
}
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
// ── The keyboard connection path ───────────────────────────────────────
|
|
499
|
+
// Upstream has none: "there is NO keyboard path to create or reconnect an
|
|
500
|
+
// edge" is a documented gap in React Flow and in this port. The outline
|
|
501
|
+
// supplies it, and it funnels through the SAME `handleConnect` a pointer
|
|
502
|
+
// drag uses, so a controlled canvas cannot tell the two apart.
|
|
503
|
+
private connectFromOutline = (source: string, target: string) => {
|
|
504
|
+
this.handleConnect({
|
|
505
|
+
source,
|
|
506
|
+
target,
|
|
507
|
+
sourceHandle: null,
|
|
508
|
+
targetHandle: null,
|
|
509
|
+
});
|
|
510
|
+
};
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Select a node and move keyboard focus onto it. Selection goes through
|
|
514
|
+
* the engine's own change protocol rather than a store poke, so a
|
|
515
|
+
* controlled canvas keeps control of its own selection state.
|
|
516
|
+
*
|
|
517
|
+
* `data-id` is compared rather than interpolated into a selector: a node
|
|
518
|
+
* id is caller data and may contain quotes or brackets, which would break
|
|
519
|
+
* an attribute selector — or worse, match the wrong node.
|
|
520
|
+
*/
|
|
521
|
+
private focusNode = (id: string) => {
|
|
522
|
+
this.activeId = id;
|
|
523
|
+
this.handleNodesChange(
|
|
524
|
+
this.nodes.map((node) => ({
|
|
525
|
+
id: node.id,
|
|
526
|
+
type: 'select',
|
|
527
|
+
selected: node.id === id,
|
|
528
|
+
})),
|
|
529
|
+
);
|
|
530
|
+
let root = document.getElementById(this.rootId);
|
|
531
|
+
if (!root) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
let candidates = root.querySelectorAll<HTMLElement>('.boxel-canvas__node');
|
|
535
|
+
for (let element of Array.from(candidates)) {
|
|
536
|
+
if (element.dataset['id'] === id) {
|
|
537
|
+
element.focus();
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
/**
|
|
544
|
+
* Re-run the layout over the graph AS IT IS NOW, after drags. Uncontrolled
|
|
545
|
+
* canvases replace their own copy; controlled ones get position changes in
|
|
546
|
+
* the engine's own change vocabulary, so a caller's `applyNodeChanges`
|
|
547
|
+
* reducer handles it with no special case.
|
|
548
|
+
*/
|
|
549
|
+
private relayout = () => {
|
|
550
|
+
let options = layoutOptionsFrom(this.args);
|
|
551
|
+
if (!options.direction) {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
let result = graphLayout(this.nodes, this.edges, {
|
|
555
|
+
direction: options.direction,
|
|
556
|
+
rankGap: options.rankGap,
|
|
557
|
+
nodeGap: options.nodeGap,
|
|
558
|
+
nodeWidth: options.nodeWidth,
|
|
559
|
+
nodeHeight: options.nodeHeight,
|
|
560
|
+
});
|
|
561
|
+
let changes = result.placements.map((placement) => ({
|
|
562
|
+
id: placement.id,
|
|
563
|
+
type: 'position',
|
|
564
|
+
position: { x: placement.x, y: placement.y },
|
|
565
|
+
dragging: false,
|
|
566
|
+
}));
|
|
567
|
+
this.handleNodesChange(changes);
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
get api(): NodeCanvasApi {
|
|
571
|
+
return {
|
|
572
|
+
relayout: this.relayout,
|
|
573
|
+
focusNode: this.focusNode,
|
|
574
|
+
layout: this.layout,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
get autoLayoutOn() {
|
|
579
|
+
return Boolean(this.args.autoLayout);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
get relayoutAction() {
|
|
583
|
+
return this.autoLayoutOn ? this.relayout : undefined;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
get connectAction() {
|
|
587
|
+
return this.connectable ? this.connectFromOutline : undefined;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
get edgeType(): CanvasEdgeType {
|
|
591
|
+
return this.args.edgeType ?? 'bezier';
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
get connectionLineType() {
|
|
595
|
+
return CONNECTION_LINE_TYPE[this.edgeType] ?? 'default';
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
get arrowheads() {
|
|
599
|
+
return this.args.arrowheads ?? 'closed';
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
/**
|
|
603
|
+
* Spread onto every edge that does not set the same key itself, by the
|
|
604
|
+
* engine's `applyDefaultEdgeOptions`. Identity-stable because the engine
|
|
605
|
+
* spreads it into each edge on every read.
|
|
606
|
+
*/
|
|
607
|
+
get defaultEdgeOptions(): Record<string, unknown> {
|
|
608
|
+
return defaultEdgeOptionsFor(
|
|
609
|
+
this.edgeType,
|
|
610
|
+
this.arrowheads,
|
|
611
|
+
this.args.animatedEdges ?? false,
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
get marquee() {
|
|
616
|
+
return this.args.marquee ?? false;
|
|
617
|
+
}
|
|
618
|
+
get selectionMode() {
|
|
619
|
+
return this.marquee ? 'partial' : 'full';
|
|
620
|
+
}
|
|
621
|
+
get snapToGrid() {
|
|
622
|
+
return this.args.snapToGrid ?? false;
|
|
623
|
+
}
|
|
624
|
+
get snapGrid(): [number, number] {
|
|
625
|
+
return snapGridFor(this.gap);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
get pattern() {
|
|
629
|
+
return this.args.pattern ?? 'dots';
|
|
630
|
+
}
|
|
631
|
+
get showBackground() {
|
|
632
|
+
return this.pattern !== 'none';
|
|
633
|
+
}
|
|
634
|
+
get gap() {
|
|
635
|
+
return this.args.gap ?? 22;
|
|
636
|
+
}
|
|
637
|
+
get patternSize() {
|
|
638
|
+
return this.args.patternSize ?? (this.pattern === 'cross' ? 6 : 1.4);
|
|
639
|
+
}
|
|
640
|
+
get showControls() {
|
|
641
|
+
return this.args.controls ?? true;
|
|
642
|
+
}
|
|
643
|
+
get controlsPosition() {
|
|
644
|
+
return this.args.controlsPosition ?? 'bottom-left';
|
|
645
|
+
}
|
|
646
|
+
get controlsOrientation() {
|
|
647
|
+
return this.args.controlsHorizontal ? 'horizontal' : 'vertical';
|
|
648
|
+
}
|
|
649
|
+
get showMinimap() {
|
|
650
|
+
return this.args.minimap ?? true;
|
|
651
|
+
}
|
|
652
|
+
get minimapPosition() {
|
|
653
|
+
return this.args.minimapPosition ?? 'bottom-right';
|
|
654
|
+
}
|
|
655
|
+
get fitView() {
|
|
656
|
+
return this.args.fitView ?? true;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* A CONTROLLED canvas under `@autoLayout` recomputes positions whenever
|
|
660
|
+
* the nodes array changes identity — and a drag changes it — so the node
|
|
661
|
+
* would snap back the instant it landed. Rather than ship that, dragging
|
|
662
|
+
* is off by default in exactly that combination. `@draggable={{true}}`
|
|
663
|
+
* forces it back on for a caller who wants the snap.
|
|
664
|
+
*
|
|
665
|
+
* An UNCONTROLLED canvas seeds from the layout once and then owns its own
|
|
666
|
+
* positions, so dragging works normally there and the outline's "Tidy
|
|
667
|
+
* layout" control puts everything back.
|
|
668
|
+
*/
|
|
669
|
+
get draggable() {
|
|
670
|
+
if (this.args.draggable !== undefined) {
|
|
671
|
+
return this.args.draggable;
|
|
672
|
+
}
|
|
673
|
+
return !(this.autoLayoutOn && this.isNodeControlled);
|
|
674
|
+
}
|
|
675
|
+
get connectable() {
|
|
676
|
+
return this.args.connectable ?? true;
|
|
677
|
+
}
|
|
678
|
+
get selectable() {
|
|
679
|
+
return this.args.selectable ?? true;
|
|
680
|
+
}
|
|
681
|
+
get summaryMode() {
|
|
682
|
+
return this.args.summary ?? 'sr-only';
|
|
683
|
+
}
|
|
684
|
+
get showSummary() {
|
|
685
|
+
return this.summaryMode !== 'off';
|
|
686
|
+
}
|
|
687
|
+
get describedBy() {
|
|
688
|
+
return this.showSummary ? this.summaryId : undefined;
|
|
689
|
+
}
|
|
690
|
+
get isEmpty() {
|
|
691
|
+
return this.nodes.length === 0;
|
|
692
|
+
}
|
|
693
|
+
get frameStyle() {
|
|
694
|
+
return cssStyle('--pretui-canvas-height', this.args.height);
|
|
695
|
+
}
|
|
696
|
+
get minimapLabel() {
|
|
697
|
+
return `Minimap of ${this.args.label}`;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
/** `off` renders no mirror at all; otherwise GraphOutline owns the text. */
|
|
701
|
+
get outlineMode(): 'sr-only' | 'visible' {
|
|
702
|
+
return this.summaryMode === 'visible' ? 'visible' : 'sr-only';
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
<template>
|
|
706
|
+
<div
|
|
707
|
+
id={{this.rootId}}
|
|
708
|
+
class='pretui-node-canvas'
|
|
709
|
+
style={{this.frameStyle}}
|
|
710
|
+
data-pattern={{this.pattern}}
|
|
711
|
+
data-summary={{this.summaryMode}}
|
|
712
|
+
data-layout={{if this.autoLayoutOn @autoLayout 'free'}}
|
|
713
|
+
data-test-pretui-node-canvas
|
|
714
|
+
{{canvasStylesheet}}
|
|
715
|
+
...attributes
|
|
716
|
+
>
|
|
717
|
+
<Canvas
|
|
718
|
+
@canvas={{this.canvas}}
|
|
719
|
+
@nodes={{this.nodes}}
|
|
720
|
+
@edges={{this.edges}}
|
|
721
|
+
@nodeTypes={{this.nodeTypes}}
|
|
722
|
+
@defaultEdgeOptions={{this.defaultEdgeOptions}}
|
|
723
|
+
@connectionLineType={{this.connectionLineType}}
|
|
724
|
+
@onNodesChange={{this.handleNodesChange}}
|
|
725
|
+
@onEdgesChange={{this.handleEdgesChange}}
|
|
726
|
+
@onConnect={{this.handleConnect}}
|
|
727
|
+
@fitView={{this.fitView}}
|
|
728
|
+
@nodesDraggable={{this.draggable}}
|
|
729
|
+
@nodesConnectable={{this.connectable}}
|
|
730
|
+
@elementsSelectable={{this.selectable}}
|
|
731
|
+
@selectionOnDrag={{this.marquee}}
|
|
732
|
+
@selectionMode={{this.selectionMode}}
|
|
733
|
+
@snapToGrid={{this.snapToGrid}}
|
|
734
|
+
@snapGrid={{this.snapGrid}}
|
|
735
|
+
{{! @glint-expect-error - the vendored Canvas bundle declares no element type }}
|
|
736
|
+
aria-label={{@label}}
|
|
737
|
+
aria-describedby={{this.describedBy}}
|
|
738
|
+
as |store|
|
|
739
|
+
>
|
|
740
|
+
{{#if this.showBackground}}
|
|
741
|
+
<Background
|
|
742
|
+
@variant={{this.pattern}}
|
|
743
|
+
@gap={{this.gap}}
|
|
744
|
+
@size={{this.patternSize}}
|
|
745
|
+
@patternColor='var(--pretui-canvas-grid-ink, color-mix(in oklch, var(--foreground) 22%, transparent))'
|
|
746
|
+
/>
|
|
747
|
+
{{/if}}
|
|
748
|
+
|
|
749
|
+
{{#if (has-block 'toolbar')}}
|
|
750
|
+
<Panel @position='top-left'>
|
|
751
|
+
<div class='pnv-bar'>{{yield to='toolbar'}}</div>
|
|
752
|
+
</Panel>
|
|
753
|
+
{{/if}}
|
|
754
|
+
|
|
755
|
+
{{#if (has-block 'legend')}}
|
|
756
|
+
<Panel @position='top-right'>
|
|
757
|
+
<div class='pnv-bar'>{{yield to='legend'}}</div>
|
|
758
|
+
</Panel>
|
|
759
|
+
{{/if}}
|
|
760
|
+
|
|
761
|
+
{{#if this.showControls}}
|
|
762
|
+
<Controls
|
|
763
|
+
@position={{this.controlsPosition}}
|
|
764
|
+
@orientation={{this.controlsOrientation}}
|
|
765
|
+
/>
|
|
766
|
+
{{/if}}
|
|
767
|
+
|
|
768
|
+
{{#if this.showMinimap}}
|
|
769
|
+
<MiniMap
|
|
770
|
+
@position={{this.minimapPosition}}
|
|
771
|
+
@ariaLabel={{this.minimapLabel}}
|
|
772
|
+
@bgColor='var(--pretui-canvas-minimap-bg, var(--card))'
|
|
773
|
+
@maskColor='var(--pretui-canvas-minimap-mask, color-mix(in oklch, var(--muted) 78%, transparent))'
|
|
774
|
+
@nodeColor='var(--pretui-canvas-minimap-node, color-mix(in oklch, var(--foreground) 24%, var(--card)))'
|
|
775
|
+
/>
|
|
776
|
+
{{/if}}
|
|
777
|
+
|
|
778
|
+
{{yield store this.api}}
|
|
779
|
+
</Canvas>
|
|
780
|
+
|
|
781
|
+
{{#if this.isEmpty}}
|
|
782
|
+
<div class='pnv-empty'>
|
|
783
|
+
{{#if (has-block 'empty')}}
|
|
784
|
+
{{yield to='empty'}}
|
|
785
|
+
{{else}}
|
|
786
|
+
<p class='pnv-empty-line'>No nodes to draw.</p>
|
|
787
|
+
{{/if}}
|
|
788
|
+
</div>
|
|
789
|
+
{{/if}}
|
|
790
|
+
|
|
791
|
+
{{!-- The graph as text. GraphOutline is a separate module — see its
|
|
792
|
+
header for why — and it is the ONLY route to a node, an edge or
|
|
793
|
+
a new connection that does not require a pointer. --}}
|
|
794
|
+
{{#if this.showSummary}}
|
|
795
|
+
<GraphOutline
|
|
796
|
+
@outlineId={{this.summaryId}}
|
|
797
|
+
@nodes={{this.nodes}}
|
|
798
|
+
@edges={{this.edges}}
|
|
799
|
+
@label={{@label}}
|
|
800
|
+
@mode={{this.outlineMode}}
|
|
801
|
+
@activeId={{this.activeId}}
|
|
802
|
+
@onSelect={{this.focusNode}}
|
|
803
|
+
@onConnect={{this.connectAction}}
|
|
804
|
+
@onRelayout={{this.relayoutAction}}
|
|
805
|
+
data-test-pretui-node-canvas-summary
|
|
806
|
+
/>
|
|
807
|
+
{{/if}}
|
|
808
|
+
</div>
|
|
809
|
+
|
|
810
|
+
<style scoped>
|
|
811
|
+
@layer PretComponent {
|
|
812
|
+
/* Every colour the engine reads lives in its `--xy-*` channel, so
|
|
813
|
+
the whole re-skin happens here — inherited into the engine's
|
|
814
|
+
subtree, no selector ever reaching into its markup. Each one is
|
|
815
|
+
fronted by a `--pretui-canvas-*` knob so a consumer can retune a
|
|
816
|
+
single part without forking. */
|
|
817
|
+
.pretui-node-canvas {
|
|
818
|
+
position: relative;
|
|
819
|
+
height: var(--pretui-canvas-height, 26rem);
|
|
820
|
+
min-height: var(--pretui-canvas-min-height, 12rem);
|
|
821
|
+
border-radius: var(--pretui-canvas-radius, var(--radius-surface, 10px));
|
|
822
|
+
overflow: hidden;
|
|
823
|
+
background: var(--pretui-canvas-bg, var(--card));
|
|
824
|
+
font-family: var(--font-sans);
|
|
825
|
+
/* Law 1 — the frame is a hairline plus a shadow, one property. */
|
|
826
|
+
box-shadow: var(
|
|
827
|
+
--pretui-canvas-shadow,
|
|
828
|
+
var(--pretui-shadow-card, 0 0 0 1px var(--border), 0 1px 2px
|
|
829
|
+
rgb(0 0 0 / 0.12))
|
|
830
|
+
);
|
|
831
|
+
|
|
832
|
+
--xy-background-color: transparent;
|
|
833
|
+
--xy-background-pattern-color: var(
|
|
834
|
+
--pretui-canvas-grid-ink,
|
|
835
|
+
color-mix(in oklch, var(--foreground) 22%, transparent)
|
|
836
|
+
);
|
|
837
|
+
|
|
838
|
+
--xy-edge-stroke: var(
|
|
839
|
+
--pretui-canvas-edge,
|
|
840
|
+
color-mix(in oklch, var(--foreground) 34%, transparent)
|
|
841
|
+
);
|
|
842
|
+
--xy-edge-stroke-width: var(--pretui-canvas-edge-width, 1.5);
|
|
843
|
+
--xy-edge-stroke-selected: var(
|
|
844
|
+
--pretui-canvas-edge-selected,
|
|
845
|
+
var(--primary)
|
|
846
|
+
);
|
|
847
|
+
--xy-edge-label-background-color: var(--card);
|
|
848
|
+
--xy-edge-label-color: var(--card-foreground);
|
|
849
|
+
|
|
850
|
+
--xy-connectionline-stroke: var(
|
|
851
|
+
--pretui-canvas-edge-selected,
|
|
852
|
+
var(--primary)
|
|
853
|
+
);
|
|
854
|
+
--xy-connectionline-stroke-width: 1.5;
|
|
855
|
+
|
|
856
|
+
--xy-handle-background-color: var(
|
|
857
|
+
--pretui-handle-bg,
|
|
858
|
+
var(--card)
|
|
859
|
+
);
|
|
860
|
+
--xy-handle-border-color: var(
|
|
861
|
+
--pretui-handle-border,
|
|
862
|
+
color-mix(in oklch, var(--foreground) 40%, transparent)
|
|
863
|
+
);
|
|
864
|
+
|
|
865
|
+
/* the stock node treatment, in case a caller mixes in an
|
|
866
|
+
untyped engine node alongside Pretui ones */
|
|
867
|
+
--xy-node-background-color: var(--card);
|
|
868
|
+
--xy-node-color: var(--card-foreground);
|
|
869
|
+
--xy-node-border: none;
|
|
870
|
+
--xy-node-border-selected: none;
|
|
871
|
+
--xy-node-border-radius: var(
|
|
872
|
+
--pretui-node-radius,
|
|
873
|
+
var(--radius-surface, 10px)
|
|
874
|
+
);
|
|
875
|
+
--xy-node-boxshadow-hover: 0 0 0 1px var(--border),
|
|
876
|
+
0 2px 8px rgb(0 0 0 / 0.12);
|
|
877
|
+
--xy-node-boxshadow-selected: 0 0 0 1px var(--primary),
|
|
878
|
+
0 0 0 4px color-mix(in oklch, var(--primary) 18%, transparent);
|
|
879
|
+
|
|
880
|
+
--xy-selection-background-color: color-mix(
|
|
881
|
+
in oklch,
|
|
882
|
+
var(--primary) 10%,
|
|
883
|
+
transparent
|
|
884
|
+
);
|
|
885
|
+
--xy-selection-border: 1px dashed
|
|
886
|
+
color-mix(in oklch, var(--primary) 55%, transparent);
|
|
887
|
+
|
|
888
|
+
--xy-controls-box-shadow: var(
|
|
889
|
+
--pretui-canvas-chrome-shadow,
|
|
890
|
+
0 0 0 1px var(--border),
|
|
891
|
+
0 1px 2px rgb(0 0 0 / 0.12)
|
|
892
|
+
);
|
|
893
|
+
--xy-controls-button-background-color: var(--card);
|
|
894
|
+
--xy-controls-button-background-color-hover: var(--muted);
|
|
895
|
+
--xy-controls-button-border-color: var(--border);
|
|
896
|
+
--xy-controls-button-color: var(--muted-foreground);
|
|
897
|
+
--xy-controls-button-color-hover: var(--foreground);
|
|
898
|
+
|
|
899
|
+
--xy-minimap-background-color: var(--card);
|
|
900
|
+
--xy-minimap-mask-background-color: color-mix(
|
|
901
|
+
in oklch,
|
|
902
|
+
var(--muted) 78%,
|
|
903
|
+
transparent
|
|
904
|
+
);
|
|
905
|
+
--xy-minimap-node-background-color: color-mix(
|
|
906
|
+
in oklch,
|
|
907
|
+
var(--foreground) 24%,
|
|
908
|
+
var(--card)
|
|
909
|
+
);
|
|
910
|
+
|
|
911
|
+
--xy-attribution-background-color: transparent;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
/* Floating Panel contents — the toolbar and legend slots. Pretui
|
|
915
|
+
cloth on a surface the engine only positions. */
|
|
916
|
+
.pnv-bar {
|
|
917
|
+
display: flex;
|
|
918
|
+
align-items: center;
|
|
919
|
+
gap: var(--space-3, 8px);
|
|
920
|
+
padding: var(--space-2, 5px) var(--space-3, 8px);
|
|
921
|
+
border-radius: var(--pretui-canvas-chrome-radius, 8px);
|
|
922
|
+
background: var(--pretui-canvas-panel-bg, var(--card));
|
|
923
|
+
color: var(--card-foreground);
|
|
924
|
+
font-size: var(--text-ui-sm, 11.5px);
|
|
925
|
+
box-shadow: var(
|
|
926
|
+
--pretui-canvas-chrome-shadow,
|
|
927
|
+
0 0 0 1px var(--border),
|
|
928
|
+
0 1px 2px rgb(0 0 0 / 0.12)
|
|
929
|
+
);
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
.pnv-empty {
|
|
933
|
+
position: absolute;
|
|
934
|
+
inset: 0;
|
|
935
|
+
display: grid;
|
|
936
|
+
place-items: center;
|
|
937
|
+
pointer-events: none;
|
|
938
|
+
padding: var(--space-6, 18px);
|
|
939
|
+
text-align: center;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
.pnv-empty-line {
|
|
943
|
+
margin: 0;
|
|
944
|
+
font-size: var(--text-ui-md, 12.5px);
|
|
945
|
+
color: var(--muted-foreground);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
/* The text mirror lives in GraphOutline now, which owns its own
|
|
949
|
+
scoped CSS (scoped CSS does not cross a component boundary). All
|
|
950
|
+
that stays here is the KNOB the skin sheet reads to lift the
|
|
951
|
+
engine's bottom-corner panels clear of the strip. */
|
|
952
|
+
}
|
|
953
|
+
</style>
|
|
954
|
+
</template>
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
/** Node name for the text summary and for the engine's per-node aria-label. */
|
|
958
|
+
function nameOf(node: CanvasNode): string {
|
|
959
|
+
let data = node.data ?? {};
|
|
960
|
+
return (
|
|
961
|
+
node.ariaLabel ??
|
|
962
|
+
data.title ??
|
|
963
|
+
(typeof data.label === 'string' ? data.label : undefined) ??
|
|
964
|
+
node.id
|
|
965
|
+
);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Point every node at Pretui's node shell, pin the handle sides so the
|
|
970
|
+
* engine's edge geometry lands on the handles the shell actually draws,
|
|
971
|
+
* and give the node a screen-reader name. The engine's own fallback name
|
|
972
|
+
* is the raw node id, which is meaningless out loud; this fills it from
|
|
973
|
+
* the data before the id is ever reached. `data` is defaulted because the
|
|
974
|
+
* engine's stock label getter reads `node.data['label']` unguarded.
|
|
975
|
+
*/
|
|
976
|
+
function decorate(
|
|
977
|
+
nodes: CanvasNode[],
|
|
978
|
+
flow: CanvasFlow,
|
|
979
|
+
placements?: Map<string, { x: number; y: number }>,
|
|
980
|
+
sidesOverride?: { source: CanvasNode['sourcePosition']; target: CanvasNode['targetPosition'] },
|
|
981
|
+
): CanvasNode[] {
|
|
982
|
+
let sides = sidesOverride ?? FLOW_SIDES[flow] ?? FLOW_SIDES.horizontal;
|
|
983
|
+
return nodes.map((node) => {
|
|
984
|
+
let placed = placements?.get(node.id);
|
|
985
|
+
return {
|
|
986
|
+
...node,
|
|
987
|
+
type: node.type ?? 'pretui',
|
|
988
|
+
data: node.data ?? {},
|
|
989
|
+
position: placed ?? node.position,
|
|
990
|
+
sourcePosition: node.sourcePosition ?? sides.source,
|
|
991
|
+
targetPosition: node.targetPosition ?? sides.target,
|
|
992
|
+
ariaLabel: nameOf(node),
|
|
993
|
+
};
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
// ── Auto-layout plumbing ─────────────────────────────────────────────────
|
|
998
|
+
// `graphLayout` is a pure function; everything below is only about keeping
|
|
999
|
+
// its result IDENTITY-STABLE. The engine warns (error002) when the node
|
|
1000
|
+
// array is a fresh object on every read, and Glimmer does not cache
|
|
1001
|
+
// getters, so the memo lives in module-level WeakMaps keyed on the caller's
|
|
1002
|
+
// own arrays. A getter can therefore read it without writing to `this`
|
|
1003
|
+
// (ember/no-side-effects).
|
|
1004
|
+
|
|
1005
|
+
/** The subset of the args that changes a layout. */
|
|
1006
|
+
export interface CanvasLayoutOptions {
|
|
1007
|
+
direction?: GraphDirection;
|
|
1008
|
+
rankGap?: number;
|
|
1009
|
+
nodeGap?: number;
|
|
1010
|
+
nodeWidth?: number;
|
|
1011
|
+
nodeHeight?: number;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
function layoutOptionsFrom(args: {
|
|
1015
|
+
autoLayout?: GraphDirection;
|
|
1016
|
+
rankGap?: number;
|
|
1017
|
+
nodeGap?: number;
|
|
1018
|
+
layoutNodeWidth?: number;
|
|
1019
|
+
layoutNodeHeight?: number;
|
|
1020
|
+
}): CanvasLayoutOptions {
|
|
1021
|
+
return {
|
|
1022
|
+
direction: args.autoLayout,
|
|
1023
|
+
rankGap: args.rankGap,
|
|
1024
|
+
nodeGap: args.nodeGap,
|
|
1025
|
+
nodeWidth: args.layoutNodeWidth,
|
|
1026
|
+
nodeHeight: args.layoutNodeHeight,
|
|
1027
|
+
};
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
function layoutKey(options: CanvasLayoutOptions): string {
|
|
1031
|
+
return [
|
|
1032
|
+
options.direction ?? '-',
|
|
1033
|
+
options.rankGap ?? '-',
|
|
1034
|
+
options.nodeGap ?? '-',
|
|
1035
|
+
options.nodeWidth ?? '-',
|
|
1036
|
+
options.nodeHeight ?? '-',
|
|
1037
|
+
].join('|');
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
const NO_LAYOUT: { result: GraphLayoutResult | undefined } = {
|
|
1041
|
+
result: undefined,
|
|
1042
|
+
};
|
|
1043
|
+
|
|
1044
|
+
const LAYOUT_CACHE = new WeakMap<
|
|
1045
|
+
object,
|
|
1046
|
+
WeakMap<object, Map<string, { result: GraphLayoutResult | undefined }>>
|
|
1047
|
+
>();
|
|
1048
|
+
|
|
1049
|
+
function layoutCached(
|
|
1050
|
+
nodes: CanvasNode[],
|
|
1051
|
+
edges: CanvasEdge[],
|
|
1052
|
+
options: CanvasLayoutOptions,
|
|
1053
|
+
): { result: GraphLayoutResult | undefined } {
|
|
1054
|
+
if (!options.direction) {
|
|
1055
|
+
return NO_LAYOUT;
|
|
1056
|
+
}
|
|
1057
|
+
let byEdges = LAYOUT_CACHE.get(nodes as unknown as object);
|
|
1058
|
+
if (!byEdges) {
|
|
1059
|
+
byEdges = new WeakMap();
|
|
1060
|
+
LAYOUT_CACHE.set(nodes as unknown as object, byEdges);
|
|
1061
|
+
}
|
|
1062
|
+
let byKey = byEdges.get(edges as unknown as object);
|
|
1063
|
+
if (!byKey) {
|
|
1064
|
+
byKey = new Map();
|
|
1065
|
+
byEdges.set(edges as unknown as object, byKey);
|
|
1066
|
+
}
|
|
1067
|
+
let key = layoutKey(options);
|
|
1068
|
+
let hit = byKey.get(key);
|
|
1069
|
+
if (!hit) {
|
|
1070
|
+
hit = {
|
|
1071
|
+
result: graphLayout(nodes, edges, {
|
|
1072
|
+
direction: options.direction,
|
|
1073
|
+
rankGap: options.rankGap,
|
|
1074
|
+
nodeGap: options.nodeGap,
|
|
1075
|
+
nodeWidth: options.nodeWidth,
|
|
1076
|
+
nodeHeight: options.nodeHeight,
|
|
1077
|
+
}),
|
|
1078
|
+
};
|
|
1079
|
+
byKey.set(key, hit);
|
|
1080
|
+
}
|
|
1081
|
+
return hit;
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
/** Decorate, and place from the layout when `@autoLayout` is on. */
|
|
1085
|
+
function place(
|
|
1086
|
+
nodes: CanvasNode[],
|
|
1087
|
+
edges: CanvasEdge[],
|
|
1088
|
+
flow: CanvasFlow,
|
|
1089
|
+
options: CanvasLayoutOptions,
|
|
1090
|
+
): CanvasNode[] {
|
|
1091
|
+
let laid = layoutCached(nodes, edges, options).result;
|
|
1092
|
+
if (!laid || !options.direction) {
|
|
1093
|
+
return decorate(nodes, flow);
|
|
1094
|
+
}
|
|
1095
|
+
let positions = new Map<string, { x: number; y: number }>();
|
|
1096
|
+
for (let placement of laid.placements) {
|
|
1097
|
+
positions.set(placement.id, { x: placement.x, y: placement.y });
|
|
1098
|
+
}
|
|
1099
|
+
return decorate(nodes, flow, positions, handleSidesFor(options.direction));
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
/** The uncontrolled canvas's one-time seed. Never shared with the memo. */
|
|
1103
|
+
function seed(
|
|
1104
|
+
nodes: CanvasNode[],
|
|
1105
|
+
edges: CanvasEdge[],
|
|
1106
|
+
flow: CanvasFlow,
|
|
1107
|
+
options: CanvasLayoutOptions,
|
|
1108
|
+
): CanvasNode[] {
|
|
1109
|
+
return place(nodes, edges, flow, options);
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
// Keyed on (flow, nodes identity, edges identity, option string). The edges
|
|
1113
|
+
// arm matters: adding one edge replaces the edges array and nothing else,
|
|
1114
|
+
// and a layout that ignored it would keep drawing the previous shape.
|
|
1115
|
+
const PLACED_CACHE: Record<
|
|
1116
|
+
CanvasFlow,
|
|
1117
|
+
WeakMap<object, WeakMap<object, Map<string, CanvasNode[]>>>
|
|
1118
|
+
> = {
|
|
1119
|
+
horizontal: new WeakMap(),
|
|
1120
|
+
vertical: new WeakMap(),
|
|
1121
|
+
};
|
|
1122
|
+
|
|
1123
|
+
function placedCached(
|
|
1124
|
+
nodes: CanvasNode[],
|
|
1125
|
+
edges: CanvasEdge[],
|
|
1126
|
+
flow: CanvasFlow,
|
|
1127
|
+
options: CanvasLayoutOptions,
|
|
1128
|
+
): CanvasNode[] {
|
|
1129
|
+
let cache = PLACED_CACHE[flow] ?? PLACED_CACHE.horizontal;
|
|
1130
|
+
let byEdges = cache.get(nodes as unknown as object);
|
|
1131
|
+
if (!byEdges) {
|
|
1132
|
+
byEdges = new WeakMap();
|
|
1133
|
+
cache.set(nodes as unknown as object, byEdges);
|
|
1134
|
+
}
|
|
1135
|
+
let byKey = byEdges.get(edges as unknown as object);
|
|
1136
|
+
if (!byKey) {
|
|
1137
|
+
byKey = new Map();
|
|
1138
|
+
byEdges.set(edges as unknown as object, byKey);
|
|
1139
|
+
}
|
|
1140
|
+
let key = layoutKey(options);
|
|
1141
|
+
let hit = byKey.get(key);
|
|
1142
|
+
if (!hit) {
|
|
1143
|
+
hit = place(nodes, edges, flow, options);
|
|
1144
|
+
byKey.set(key, hit);
|
|
1145
|
+
}
|
|
1146
|
+
return hit;
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1149
|
+
const NO_EXTRA_TYPES: Record<string, unknown> = {};
|
|
1150
|
+
const TYPES_CACHE = new WeakMap<
|
|
1151
|
+
object,
|
|
1152
|
+
WeakMap<object, Record<string, unknown>>
|
|
1153
|
+
>();
|
|
1154
|
+
|
|
1155
|
+
function nodeTypesFor(
|
|
1156
|
+
body: NodeBodyComponent | undefined,
|
|
1157
|
+
extra: Record<string, unknown> | undefined,
|
|
1158
|
+
): Record<string, unknown> {
|
|
1159
|
+
let shell = shellFor(
|
|
1160
|
+
body ?? (NodeCard as unknown as NodeBodyComponent),
|
|
1161
|
+
) as object;
|
|
1162
|
+
let byExtra = TYPES_CACHE.get(shell);
|
|
1163
|
+
if (!byExtra) {
|
|
1164
|
+
byExtra = new WeakMap();
|
|
1165
|
+
TYPES_CACHE.set(shell, byExtra);
|
|
1166
|
+
}
|
|
1167
|
+
let key = (extra ?? NO_EXTRA_TYPES) as object;
|
|
1168
|
+
let hit = byExtra.get(key);
|
|
1169
|
+
if (!hit) {
|
|
1170
|
+
hit = { pretui: shell, ...(extra ?? {}) };
|
|
1171
|
+
byExtra.set(key, hit);
|
|
1172
|
+
}
|
|
1173
|
+
return hit;
|
|
1174
|
+
}
|