@threadlabs/looma 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -12
- package/components/shared/editor.js +69 -0
- package/components/shared/input-modality.js +20 -0
- package/components/shared/overlay.js +281 -0
- package/components/shared/trigger.js +17 -0
- package/components/ui-affordance-scope/ui-affordance-scope.html +22 -0
- package/components/ui-affordance-scope/ui-affordance-scope.js +76 -0
- package/components/ui-avatar/ui-avatar.html +59 -0
- package/components/ui-avatar/ui-avatar.js +47 -0
- package/components/ui-avatar-group/ui-avatar-group.html +62 -0
- package/components/ui-avatar-group/ui-avatar-group.js +27 -0
- package/components/ui-badge/ui-badge.html +94 -0
- package/components/ui-button/ui-button.html +198 -0
- package/components/ui-callout/ui-callout.html +104 -0
- package/components/ui-checkbox/ui-checkbox.html +107 -0
- package/components/ui-checkbox/ui-checkbox.js +24 -0
- package/components/ui-cluster/ui-cluster.html +49 -0
- package/components/ui-combobox/ui-combobox.html +377 -0
- package/components/ui-combobox/ui-combobox.js +432 -0
- package/components/ui-container/ui-container.html +39 -0
- package/components/ui-context-menu/ui-context-menu.html +75 -0
- package/components/ui-context-menu/ui-context-menu.js +143 -0
- package/components/ui-dialog/ui-dialog.html +178 -0
- package/components/ui-dialog/ui-dialog.js +105 -0
- package/components/ui-disclosure/ui-disclosure.html +109 -0
- package/components/ui-disclosure/ui-disclosure.js +28 -0
- package/components/ui-editable/ui-editable.html +163 -0
- package/components/ui-editable/ui-editable.js +113 -0
- package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +97 -0
- package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.js +71 -0
- package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +157 -0
- package/components/ui-editor-mention-menu/ui-editor-mention-menu.js +50 -0
- package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +197 -0
- package/components/ui-editor-slash-menu/ui-editor-slash-menu.js +44 -0
- package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +164 -0
- package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.js +75 -0
- package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +422 -0
- package/components/ui-editor-table-overlay/ui-editor-table-overlay.js +119 -0
- package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +271 -0
- package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.js +54 -0
- package/components/ui-editor-toolbar/ui-editor-toolbar.html +110 -0
- package/components/ui-floating-action-button/ui-floating-action-button.html +83 -0
- package/components/ui-form-field/ui-form-field.html +45 -0
- package/components/ui-form-field/ui-form-field.js +71 -0
- package/components/ui-grid/ui-grid.html +46 -0
- package/components/ui-icon/ui-icon.html +34 -0
- package/components/ui-icon/ui-icon.js +8 -0
- package/components/ui-icon-button/ui-icon-button.html +167 -0
- package/components/ui-icon-button/ui-icon-button.js +7 -0
- package/components/ui-input/ui-input.html +81 -0
- package/components/ui-input/ui-input.js +7 -0
- package/components/ui-menu/ui-menu.html +87 -0
- package/components/ui-menu/ui-menu.js +114 -0
- package/components/ui-menu-item/ui-menu-item.html +37 -0
- package/components/ui-popover/ui-popover.html +85 -0
- package/components/ui-popover/ui-popover.js +70 -0
- package/components/ui-radio/ui-radio.html +57 -0
- package/components/ui-radio/ui-radio.js +25 -0
- package/components/ui-radio-group/ui-radio-group.html +51 -0
- package/components/ui-radio-group/ui-radio-group.js +42 -0
- package/components/ui-reel/ui-reel.html +67 -0
- package/components/ui-search-result-row/ui-search-result-row.html +101 -0
- package/components/ui-search-shell/ui-search-shell.html +142 -0
- package/components/ui-search-shell/ui-search-shell.js +60 -0
- package/components/ui-select/ui-select.html +87 -0
- package/components/ui-select/ui-select.js +16 -0
- package/components/ui-separator/ui-separator.html +22 -0
- package/components/ui-sidebar/ui-sidebar.html +183 -0
- package/components/ui-sidebar/ui-sidebar.js +178 -0
- package/components/ui-stack/ui-stack.html +59 -0
- package/components/ui-switch/ui-switch.html +95 -0
- package/components/ui-switch/ui-switch.js +24 -0
- package/components/ui-switcher/ui-switcher.html +65 -0
- package/components/ui-tabs/ui-tabs.html +134 -0
- package/components/ui-tabs/ui-tabs.js +81 -0
- package/components/ui-textarea/ui-textarea.html +80 -0
- package/components/ui-textarea/ui-textarea.js +7 -0
- package/components/ui-toast-region/ui-toast-region.html +127 -0
- package/components/ui-toast-region/ui-toast-region.js +119 -0
- package/components/ui-tooltip/ui-tooltip.html +122 -0
- package/components/ui-tooltip/ui-tooltip.js +134 -0
- package/components/ui-top-bar/ui-top-bar.html +53 -0
- package/components/ui-tree/ui-tree.html +29 -0
- package/components/ui-tree/ui-tree.js +250 -0
- package/components/ui-tree-item/ui-tree-item.html +326 -0
- package/components/ui-tree-item/ui-tree-item.js +94 -0
- package/dist/index.d.ts +4 -414
- package/dist/index.js +55 -657
- package/editor/chunks/extensions.js +7267 -0
- package/editor/chunks/table-backgrounds.js +51 -0
- package/editor/chunks/ui.js +92 -0
- package/editor/extensions/callout.d.ts +20 -0
- package/editor/extensions/index.d.ts +12 -441
- package/editor/extensions/index.js +3 -64
- package/editor/extensions/list-behavior.d.ts +7 -0
- package/editor/extensions/mention.d.ts +35 -0
- package/editor/extensions/preset.d.ts +42 -0
- package/editor/extensions/slash-command.d.ts +80 -0
- package/editor/extensions/smart-paste.d.ts +13 -0
- package/editor/extensions/table-commands.d.ts +114 -0
- package/editor/extensions/table-formatting.d.ts +60 -0
- package/editor/icons.d.ts +55 -0
- package/editor/index.d.ts +8 -6
- package/editor/index.js +96 -71
- package/editor/insert-table-grid.d.ts +7 -0
- package/editor/mention-contract.d.ts +78 -0
- package/editor/mention-menu.d.ts +9 -0
- package/editor/slash-menu.d.ts +29 -0
- package/editor/table-backgrounds.d.ts +43 -0
- package/editor/table-context-menu.d.ts +12 -0
- package/editor/table-overlay.d.ts +79 -0
- package/editor/ui.d.ts +10 -50
- package/editor/ui.js +3 -14
- package/editor/viewport.d.ts +15 -0
- package/package.json +84 -60
- package/styles/ui-affordance-scope.css +19 -0
- package/styles/ui-avatar-group.css +56 -0
- package/styles/ui-avatar.css +47 -0
- package/styles/ui-badge.css +91 -0
- package/styles/ui-button.css +206 -0
- package/styles/ui-callout.css +76 -0
- package/styles/ui-checkbox.css +98 -0
- package/styles/ui-cluster.css +46 -0
- package/styles/ui-combobox.css +213 -0
- package/styles/ui-container.css +36 -0
- package/styles/ui-context-menu.css +68 -0
- package/styles/ui-dialog.css +160 -0
- package/styles/ui-disclosure.css +95 -0
- package/styles/ui-editable.css +139 -0
- package/styles/ui-editor-insert-table-grid.css +65 -0
- package/styles/ui-editor-mention-menu.css +121 -0
- package/styles/ui-editor-slash-menu.css +179 -0
- package/styles/ui-editor-table-context-menu.css +118 -0
- package/styles/ui-editor-table-overlay.css +318 -0
- package/styles/ui-editor-table-toolbar.css +191 -0
- package/styles/ui-editor-toolbar.css +115 -0
- package/styles/ui-floating-action-button.css +82 -0
- package/styles/ui-form-field.css +36 -0
- package/styles/ui-grid.css +43 -0
- package/styles/ui-icon-button.css +169 -0
- package/styles/ui-icon.css +23 -0
- package/styles/ui-input.css +82 -0
- package/styles/ui-menu-item.css +34 -0
- package/styles/ui-menu.css +80 -0
- package/styles/ui-popover.css +76 -0
- package/styles/ui-radio-group.css +38 -0
- package/styles/ui-radio.css +46 -0
- package/styles/ui-reel.css +63 -0
- package/styles/ui-search-result-row.css +92 -0
- package/styles/ui-search-shell.css +128 -0
- package/styles/ui-select.css +86 -0
- package/styles/ui-separator.css +16 -0
- package/styles/ui-sidebar.css +166 -0
- package/styles/ui-stack.css +55 -0
- package/styles/ui-switch.css +88 -0
- package/styles/ui-switcher.css +61 -0
- package/styles/ui-tabs.css +114 -0
- package/styles/ui-textarea.css +77 -0
- package/styles/ui-toast-region.css +103 -0
- package/styles/ui-tooltip.css +113 -0
- package/styles/ui-top-bar.css +51 -0
- package/styles/ui-tree-item.css +267 -0
- package/styles/ui-tree.css +16 -0
- package/vanilla/UiAffordanceScope.d.ts +14 -0
- package/vanilla/UiAffordanceScope.js +30 -0
- package/vanilla/UiAvatar.d.ts +17 -0
- package/vanilla/UiAvatar.js +41 -0
- package/vanilla/UiAvatarGroup.d.ts +15 -0
- package/vanilla/UiAvatarGroup.js +40 -0
- package/vanilla/UiBadge.d.ts +15 -0
- package/vanilla/UiBadge.js +30 -0
- package/vanilla/UiButton.d.ts +16 -0
- package/vanilla/UiButton.js +32 -0
- package/vanilla/UiCallout.d.ts +14 -0
- package/vanilla/UiCallout.js +124 -0
- package/vanilla/UiCheckbox.d.ts +19 -0
- package/vanilla/UiCheckbox.js +47 -0
- package/vanilla/UiCluster.d.ts +15 -0
- package/vanilla/UiCluster.js +30 -0
- package/vanilla/UiCombobox.d.ts +42 -0
- package/vanilla/UiCombobox.js +194 -0
- package/vanilla/UiContainer.d.ts +15 -0
- package/vanilla/UiContainer.js +30 -0
- package/vanilla/UiContextMenu.d.ts +18 -0
- package/vanilla/UiContextMenu.js +35 -0
- package/vanilla/UiDialog.d.ts +19 -0
- package/vanilla/UiDialog.js +53 -0
- package/vanilla/UiDisclosure.d.ts +18 -0
- package/vanilla/UiDisclosure.js +49 -0
- package/vanilla/UiEditable.d.ts +22 -0
- package/vanilla/UiEditable.js +59 -0
- package/vanilla/UiEditorInsertTableGrid.d.ts +18 -0
- package/vanilla/UiEditorInsertTableGrid.js +46 -0
- package/vanilla/UiEditorMentionMenu.d.ts +21 -0
- package/vanilla/UiEditorMentionMenu.js +63 -0
- package/vanilla/UiEditorSlashMenu.d.ts +20 -0
- package/vanilla/UiEditorSlashMenu.js +74 -0
- package/vanilla/UiEditorTableContextMenu.d.ts +17 -0
- package/vanilla/UiEditorTableContextMenu.js +69 -0
- package/vanilla/UiEditorTableOverlay.d.ts +16 -0
- package/vanilla/UiEditorTableOverlay.js +113 -0
- package/vanilla/UiEditorTableToolbar.d.ts +18 -0
- package/vanilla/UiEditorTableToolbar.js +121 -0
- package/vanilla/UiEditorToolbar.d.ts +14 -0
- package/vanilla/UiEditorToolbar.js +30 -0
- package/vanilla/UiFloatingActionButton.d.ts +16 -0
- package/vanilla/UiFloatingActionButton.js +35 -0
- package/vanilla/UiFormField.d.ts +16 -0
- package/vanilla/UiFormField.js +54 -0
- package/vanilla/UiGrid.d.ts +15 -0
- package/vanilla/UiGrid.js +30 -0
- package/vanilla/UiIcon.d.ts +14 -0
- package/vanilla/UiIcon.js +40 -0
- package/vanilla/UiIconButton.d.ts +19 -0
- package/vanilla/UiIconButton.js +37 -0
- package/vanilla/UiInput.d.ts +18 -0
- package/vanilla/UiInput.js +37 -0
- package/vanilla/UiMenu.d.ts +19 -0
- package/vanilla/UiMenu.js +35 -0
- package/vanilla/UiMenuItem.d.ts +15 -0
- package/vanilla/UiMenuItem.js +43 -0
- package/vanilla/UiPopover.d.ts +18 -0
- package/vanilla/UiPopover.js +33 -0
- package/vanilla/UiRadio.d.ts +19 -0
- package/vanilla/UiRadio.js +48 -0
- package/vanilla/UiRadioGroup.d.ts +21 -0
- package/vanilla/UiRadioGroup.js +35 -0
- package/vanilla/UiReel.d.ts +16 -0
- package/vanilla/UiReel.js +34 -0
- package/vanilla/UiSearchResultRow.d.ts +15 -0
- package/vanilla/UiSearchResultRow.js +82 -0
- package/vanilla/UiSearchShell.d.ts +18 -0
- package/vanilla/UiSearchShell.js +74 -0
- package/vanilla/UiSelect.d.ts +18 -0
- package/vanilla/UiSelect.js +42 -0
- package/vanilla/UiSeparator.d.ts +14 -0
- package/vanilla/UiSeparator.js +28 -0
- package/vanilla/UiSidebar.d.ts +24 -0
- package/vanilla/UiSidebar.js +47 -0
- package/vanilla/UiStack.d.ts +16 -0
- package/vanilla/UiStack.js +32 -0
- package/vanilla/UiSwitch.d.ts +18 -0
- package/vanilla/UiSwitch.js +46 -0
- package/vanilla/UiSwitcher.d.ts +16 -0
- package/vanilla/UiSwitcher.js +32 -0
- package/vanilla/UiTabs.d.ts +18 -0
- package/vanilla/UiTabs.js +47 -0
- package/vanilla/UiTextarea.d.ts +19 -0
- package/vanilla/UiTextarea.js +40 -0
- package/vanilla/UiToastRegion.d.ts +20 -0
- package/vanilla/UiToastRegion.js +58 -0
- package/vanilla/UiTooltip.d.ts +21 -0
- package/vanilla/UiTooltip.js +34 -0
- package/vanilla/UiTopBar.d.ts +13 -0
- package/vanilla/UiTopBar.js +59 -0
- package/vanilla/UiTree.d.ts +18 -0
- package/vanilla/UiTree.js +31 -0
- package/vanilla/UiTreeItem.d.ts +26 -0
- package/vanilla/UiTreeItem.js +164 -0
- package/vanilla/index.js +48 -0
- package/vue/UiAffordanceScope.d.ts +18 -0
- package/vue/UiAffordanceScope.js +2 -0
- package/vue/UiAffordanceScope.vue +118 -0
- package/vue/UiAvatar.d.ts +23 -0
- package/vue/UiAvatar.js +2 -0
- package/vue/UiAvatar.vue +152 -0
- package/vue/UiAvatarGroup.d.ts +20 -0
- package/vue/UiAvatarGroup.js +2 -0
- package/vue/UiAvatarGroup.vue +167 -0
- package/vue/UiBadge.d.ts +20 -0
- package/vue/UiBadge.js +2 -0
- package/vue/UiBadge.vue +123 -0
- package/vue/UiButton.d.ts +22 -0
- package/vue/UiButton.js +2 -0
- package/vue/UiButton.vue +229 -0
- package/vue/UiCallout.d.ts +18 -0
- package/vue/UiCallout.js +2 -0
- package/vue/UiCallout.vue +104 -0
- package/vue/UiCheckbox.d.ts +38 -0
- package/vue/UiCheckbox.js +2 -0
- package/vue/UiCheckbox.vue +216 -0
- package/vue/UiCluster.d.ts +17 -0
- package/vue/UiCluster.js +2 -0
- package/vue/UiCluster.vue +75 -0
- package/vue/UiCombobox.d.ts +255 -0
- package/vue/UiCombobox.js +2 -0
- package/vue/UiCombobox.vue +466 -0
- package/vue/UiContainer.d.ts +17 -0
- package/vue/UiContainer.js +2 -0
- package/vue/UiContainer.vue +65 -0
- package/vue/UiContextMenu.d.ts +50 -0
- package/vue/UiContextMenu.js +2 -0
- package/vue/UiContextMenu.vue +166 -0
- package/vue/UiDialog.d.ts +39 -0
- package/vue/UiDialog.js +2 -0
- package/vue/UiDialog.vue +273 -0
- package/vue/UiDisclosure.d.ts +44 -0
- package/vue/UiDisclosure.js +2 -0
- package/vue/UiDisclosure.vue +211 -0
- package/vue/UiEditable.d.ts +48 -0
- package/vue/UiEditable.js +2 -0
- package/vue/UiEditable.vue +267 -0
- package/vue/UiEditorInsertTableGrid.d.ts +26 -0
- package/vue/UiEditorInsertTableGrid.js +2 -0
- package/vue/UiEditorInsertTableGrid.vue +210 -0
- package/vue/UiEditorMentionMenu.d.ts +44 -0
- package/vue/UiEditorMentionMenu.js +2 -0
- package/vue/UiEditorMentionMenu.vue +284 -0
- package/vue/UiEditorSlashMenu.d.ts +41 -0
- package/vue/UiEditorSlashMenu.js +2 -0
- package/vue/UiEditorSlashMenu.vue +306 -0
- package/vue/UiEditorTableContextMenu.d.ts +19 -0
- package/vue/UiEditorTableContextMenu.js +2 -0
- package/vue/UiEditorTableContextMenu.vue +252 -0
- package/vue/UiEditorTableOverlay.d.ts +66 -0
- package/vue/UiEditorTableOverlay.js +2 -0
- package/vue/UiEditorTableOverlay.vue +455 -0
- package/vue/UiEditorTableToolbar.d.ts +21 -0
- package/vue/UiEditorTableToolbar.js +2 -0
- package/vue/UiEditorTableToolbar.vue +339 -0
- package/vue/UiEditorToolbar.d.ts +18 -0
- package/vue/UiEditorToolbar.js +2 -0
- package/vue/UiEditorToolbar.vue +138 -0
- package/vue/UiFloatingActionButton.d.ts +22 -0
- package/vue/UiFloatingActionButton.js +2 -0
- package/vue/UiFloatingActionButton.vue +116 -0
- package/vue/UiFormField.d.ts +28 -0
- package/vue/UiFormField.js +2 -0
- package/vue/UiFormField.vue +124 -0
- package/vue/UiGrid.d.ts +17 -0
- package/vue/UiGrid.js +2 -0
- package/vue/UiGrid.vue +72 -0
- package/vue/UiIcon.d.ts +8 -0
- package/vue/UiIcon.js +2 -0
- package/vue/UiIcon.vue +135 -0
- package/vue/UiIconButton.d.ts +27 -0
- package/vue/UiIconButton.js +2 -0
- package/vue/UiIconButton.vue +268 -0
- package/vue/UiInput.d.ts +20 -0
- package/vue/UiInput.js +2 -0
- package/vue/UiInput.vue +177 -0
- package/vue/UiMenu.d.ts +52 -0
- package/vue/UiMenu.js +2 -0
- package/vue/UiMenu.vue +194 -0
- package/vue/UiMenuItem.d.ts +20 -0
- package/vue/UiMenuItem.js +2 -0
- package/vue/UiMenuItem.vue +55 -0
- package/vue/UiPopover.d.ts +44 -0
- package/vue/UiPopover.js +2 -0
- package/vue/UiPopover.vue +188 -0
- package/vue/UiRadio.d.ts +38 -0
- package/vue/UiRadio.js +2 -0
- package/vue/UiRadio.vue +166 -0
- package/vue/UiRadioGroup.d.ts +50 -0
- package/vue/UiRadioGroup.js +2 -0
- package/vue/UiRadioGroup.vue +161 -0
- package/vue/UiReel.d.ts +18 -0
- package/vue/UiReel.js +2 -0
- package/vue/UiReel.vue +93 -0
- package/vue/UiSearchResultRow.d.ts +28 -0
- package/vue/UiSearchResultRow.js +2 -0
- package/vue/UiSearchResultRow.vue +124 -0
- package/vue/UiSearchShell.d.ts +42 -0
- package/vue/UiSearchShell.js +2 -0
- package/vue/UiSearchShell.vue +233 -0
- package/vue/UiSelect.d.ts +30 -0
- package/vue/UiSelect.js +2 -0
- package/vue/UiSelect.vue +183 -0
- package/vue/UiSeparator.d.ts +8 -0
- package/vue/UiSeparator.js +2 -0
- package/vue/UiSeparator.vue +38 -0
- package/vue/UiSidebar.d.ts +54 -0
- package/vue/UiSidebar.js +2 -0
- package/vue/UiSidebar.vue +288 -0
- package/vue/UiStack.d.ts +18 -0
- package/vue/UiStack.js +2 -0
- package/vue/UiStack.vue +85 -0
- package/vue/UiSwitch.d.ts +36 -0
- package/vue/UiSwitch.js +2 -0
- package/vue/UiSwitch.vue +203 -0
- package/vue/UiSwitcher.d.ts +18 -0
- package/vue/UiSwitcher.js +2 -0
- package/vue/UiSwitcher.vue +91 -0
- package/vue/UiTabs.d.ts +36 -0
- package/vue/UiTabs.js +2 -0
- package/vue/UiTabs.vue +269 -0
- package/vue/UiTextarea.d.ts +22 -0
- package/vue/UiTextarea.js +2 -0
- package/vue/UiTextarea.vue +177 -0
- package/vue/UiToastRegion.d.ts +48 -0
- package/vue/UiToastRegion.js +2 -0
- package/vue/UiToastRegion.vue +256 -0
- package/vue/UiTooltip.d.ts +50 -0
- package/vue/UiTooltip.js +2 -0
- package/vue/UiTooltip.vue +230 -0
- package/vue/UiTopBar.d.ts +19 -0
- package/vue/UiTopBar.js +2 -0
- package/vue/UiTopBar.vue +56 -0
- package/vue/UiTree.d.ts +62 -0
- package/vue/UiTree.js +2 -0
- package/vue/UiTree.vue +117 -0
- package/vue/UiTreeItem.d.ts +56 -0
- package/vue/UiTreeItem.js +2 -0
- package/vue/UiTreeItem.vue +418 -0
- package/vue/chunks/UiAffordanceScope.js +112 -0
- package/vue/chunks/UiAvatar.js +144 -0
- package/vue/chunks/UiAvatarGroup.js +142 -0
- package/vue/chunks/UiBadge.js +33 -0
- package/vue/chunks/UiButton.js +47 -0
- package/vue/chunks/UiCallout.js +117 -0
- package/vue/chunks/UiCheckbox.js +167 -0
- package/vue/chunks/UiCluster.js +33 -0
- package/vue/chunks/UiCombobox.js +684 -0
- package/vue/chunks/UiContainer.js +33 -0
- package/vue/chunks/UiContextMenu.js +153 -0
- package/vue/chunks/UiDialog.js +162 -0
- package/vue/chunks/UiDisclosure.js +185 -0
- package/vue/chunks/UiEditable.js +223 -0
- package/vue/chunks/UiEditorInsertTableGrid.js +221 -0
- package/vue/chunks/UiEditorMentionMenu.js +245 -0
- package/vue/chunks/UiEditorSlashMenu.js +210 -0
- package/vue/chunks/UiEditorTableContextMenu.js +201 -0
- package/vue/chunks/UiEditorTableOverlay.js +301 -0
- package/vue/chunks/UiEditorTableToolbar.js +299 -0
- package/vue/chunks/UiEditorToolbar.js +37 -0
- package/vue/chunks/UiFloatingActionButton.js +56 -0
- package/vue/chunks/UiFormField.js +113 -0
- package/vue/chunks/UiGrid.js +33 -0
- package/vue/chunks/UiIcon.js +170 -0
- package/vue/chunks/UiIconButton.js +141 -0
- package/vue/chunks/UiInput.js +136 -0
- package/vue/chunks/UiMenu.js +163 -0
- package/vue/chunks/UiMenuItem.js +37 -0
- package/vue/chunks/UiPopover.js +149 -0
- package/vue/chunks/UiRadio.js +164 -0
- package/vue/chunks/UiRadioGroup.js +160 -0
- package/vue/chunks/UiReel.js +42 -0
- package/vue/chunks/UiSearchResultRow.js +63 -0
- package/vue/chunks/UiSearchShell.js +152 -0
- package/vue/chunks/UiSelect.js +134 -0
- package/vue/chunks/UiSeparator.js +24 -0
- package/vue/chunks/UiSidebar.js +180 -0
- package/vue/chunks/UiStack.js +38 -0
- package/vue/chunks/UiSwitch.js +162 -0
- package/vue/chunks/UiSwitcher.js +38 -0
- package/vue/chunks/UiTabs.js +210 -0
- package/vue/chunks/UiTextarea.js +139 -0
- package/vue/chunks/UiToastRegion.js +227 -0
- package/vue/chunks/UiTooltip.js +163 -0
- package/vue/chunks/UiTopBar.js +25 -0
- package/vue/chunks/UiTree.js +140 -0
- package/vue/chunks/UiTreeItem.js +315 -0
- package/vue/chunks/_plugin-vue_export-helper.js +8 -0
- package/vue/components.css +4405 -0
- package/vue/editor/LoomaEditor.d.ts +171 -0
- package/vue/editor/image-delivery.d.ts +61 -0
- package/vue/editor/index.d.ts +4 -386
- package/vue/editor/index.js +995 -1134
- package/vue/editor/primitives.d.ts +23 -0
- package/vue/index.d.ts +48 -604
- package/vue/index.js +49 -86
- package/dist/chunk-MLKGABMK.js +0 -9
- package/dist/chunk-RWLYVQY6.js +0 -5719
- package/dist/chunk-XDNZIKNI.js +0 -2721
- package/dist/declarative-generated.cjs +0 -149
- package/dist/declarative-generated.d.cts +0 -16
- package/dist/declarative-generated.d.ts +0 -16
- package/dist/declarative-generated.js +0 -124
- package/dist/declarative.cjs +0 -2750
- package/dist/declarative.d.cts +0 -101
- package/dist/declarative.d.ts +0 -101
- package/dist/declarative.js +0 -15
- package/dist/index.cjs +0 -9077
- package/dist/index.d.cts +0 -414
- package/dist/loader.cjs +0 -8442
- package/dist/loader.d.cts +0 -4
- package/dist/loader.d.ts +0 -4
- package/dist/loader.js +0 -16
- package/editor/chunk-EUIH3TBV.js +0 -6826
- package/editor/chunk-JK53ENSG.js +0 -29
- package/editor/chunk-U36XNFJN.js +0 -2592
- package/editor/table-overlay-DZFGHQDt.d.ts +0 -138
- package/editor.css +0 -1592
- package/layout/index.cjs +0 -356
- package/layout/index.d.cts +0 -18
- package/layout/index.d.ts +0 -18
- package/layout/index.js +0 -341
- package/layout.css +0 -191
- package/styles.css +0 -940
- package/vue/chunk-OX3EACZ7.js +0 -4369
package/vue/UiTree.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
hoverExpandDelay?: number | null;
|
|
3
|
+
label?: string | null;
|
|
4
|
+
maxDepth?: number | null;
|
|
5
|
+
};
|
|
6
|
+
declare var __VLS_1: {};
|
|
7
|
+
type __VLS_Slots = {} & {
|
|
8
|
+
default?: (props: typeof __VLS_1) => any;
|
|
9
|
+
};
|
|
10
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
11
|
+
reorder: (detail: {
|
|
12
|
+
readonly sourceId: string;
|
|
13
|
+
readonly targetId: string;
|
|
14
|
+
readonly position: "before" | "inside" | "after";
|
|
15
|
+
readonly sourceType: string;
|
|
16
|
+
readonly targetType: string;
|
|
17
|
+
readonly sourceScope: string;
|
|
18
|
+
readonly targetScope: string;
|
|
19
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
20
|
+
}) => any;
|
|
21
|
+
"reorder-rejected": (detail: {
|
|
22
|
+
readonly sourceId: string;
|
|
23
|
+
readonly targetId: string;
|
|
24
|
+
readonly position: "before" | "inside" | "after";
|
|
25
|
+
readonly reason: "max-depth";
|
|
26
|
+
readonly maxDepth: number;
|
|
27
|
+
readonly resultingDepth: number;
|
|
28
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
29
|
+
}) => any;
|
|
30
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
31
|
+
onReorder?: ((detail: {
|
|
32
|
+
readonly sourceId: string;
|
|
33
|
+
readonly targetId: string;
|
|
34
|
+
readonly position: "before" | "inside" | "after";
|
|
35
|
+
readonly sourceType: string;
|
|
36
|
+
readonly targetType: string;
|
|
37
|
+
readonly sourceScope: string;
|
|
38
|
+
readonly targetScope: string;
|
|
39
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
40
|
+
}) => any) | undefined;
|
|
41
|
+
"onReorder-rejected"?: ((detail: {
|
|
42
|
+
readonly sourceId: string;
|
|
43
|
+
readonly targetId: string;
|
|
44
|
+
readonly position: "before" | "inside" | "after";
|
|
45
|
+
readonly reason: "max-depth";
|
|
46
|
+
readonly maxDepth: number;
|
|
47
|
+
readonly resultingDepth: number;
|
|
48
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
49
|
+
}) => any) | undefined;
|
|
50
|
+
}>, {
|
|
51
|
+
label: string | null;
|
|
52
|
+
hoverExpandDelay: number | null;
|
|
53
|
+
maxDepth: number | null;
|
|
54
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
55
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
56
|
+
declare const _default: typeof __VLS_export;
|
|
57
|
+
export default _default;
|
|
58
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
59
|
+
new (): {
|
|
60
|
+
$slots: S;
|
|
61
|
+
};
|
|
62
|
+
};
|
package/vue/UiTree.js
ADDED
package/vue/UiTree.vue
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<!-- Generated by HTML Next 1.0.0-alpha.1 for Vue 3.5. Do not edit. -->
|
|
2
|
+
<script setup lang="ts">
|
|
3
|
+
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from "vue";
|
|
4
|
+
import * as controllerModule from "../components/ui-tree/ui-tree.js";
|
|
5
|
+
|
|
6
|
+
defineOptions({ inheritAttrs: false });
|
|
7
|
+
|
|
8
|
+
const props = withDefaults(defineProps<{
|
|
9
|
+
hoverExpandDelay?: number | null;
|
|
10
|
+
label?: string | null;
|
|
11
|
+
maxDepth?: number | null;
|
|
12
|
+
}>(), {
|
|
13
|
+
hoverExpandDelay: 700,
|
|
14
|
+
label: "Tree",
|
|
15
|
+
maxDepth: 0,
|
|
16
|
+
});
|
|
17
|
+
const emit = defineEmits<{
|
|
18
|
+
"reorder": [detail: { readonly sourceId: string; readonly targetId: string; readonly position: "before" | "inside" | "after"; readonly sourceType: string; readonly targetType: string; readonly sourceScope: string; readonly targetScope: string; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
|
|
19
|
+
"reorder-rejected": [detail: { readonly sourceId: string; readonly targetId: string; readonly position: "before" | "inside" | "after"; readonly reason: "max-depth"; readonly maxDepth: number; readonly resultingDepth: number; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
|
|
20
|
+
}>();
|
|
21
|
+
const root = ref<HTMLElement | null>(null);
|
|
22
|
+
const refs: Record<string, Element | undefined> = {};
|
|
23
|
+
|
|
24
|
+
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
25
|
+
const dispatch = (name: string, detail?: unknown): boolean => {
|
|
26
|
+
const declared = {"reorder":{"bubbles":true,"composed":true,"cancelable":false},"reorder-rejected":{"bubbles":true,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
|
|
27
|
+
const checks: Record<string, (detail: unknown) => boolean> = {
|
|
28
|
+
"reorder": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["sourceId"] === "string" && typeof (detail as Record<string, unknown>)["targetId"] === "string" && ((detail as Record<string, unknown>)["position"] === "before" || (detail as Record<string, unknown>)["position"] === "inside" || (detail as Record<string, unknown>)["position"] === "after") && typeof (detail as Record<string, unknown>)["sourceType"] === "string" && typeof (detail as Record<string, unknown>)["targetType"] === "string" && typeof (detail as Record<string, unknown>)["sourceScope"] === "string" && typeof (detail as Record<string, unknown>)["targetScope"] === "string" && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["sourceId","targetId","position","sourceType","targetType","sourceScope","targetScope","trigger"].includes(key))),
|
|
29
|
+
"reorder-rejected": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["sourceId"] === "string" && typeof (detail as Record<string, unknown>)["targetId"] === "string" && ((detail as Record<string, unknown>)["position"] === "before" || (detail as Record<string, unknown>)["position"] === "inside" || (detail as Record<string, unknown>)["position"] === "after") && (detail as Record<string, unknown>)["reason"] === "max-depth" && Number.isInteger((detail as Record<string, unknown>)["maxDepth"]) && Number.isInteger((detail as Record<string, unknown>)["resultingDepth"]) && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["sourceId","targetId","position","reason","maxDepth","resultingDepth","trigger"].includes(key))),
|
|
30
|
+
};
|
|
31
|
+
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
32
|
+
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
|
|
33
|
+
}
|
|
34
|
+
(emit as (name: string, detail: unknown) => void)(name, detail);
|
|
35
|
+
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function read(name: string): unknown {
|
|
39
|
+
return (props as Record<string, unknown>)[name];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function write(name: string, value: unknown): boolean {
|
|
43
|
+
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const stops: Array<() => void> = [];
|
|
47
|
+
const host = {
|
|
48
|
+
get element(): Element { return root.value as Element; },
|
|
49
|
+
state: new Proxy({} as Record<string, unknown>, {
|
|
50
|
+
get: (_target, name) => typeof name === "string" ? read(name) : undefined,
|
|
51
|
+
set: (_target, name, value) => typeof name === "string" && write(name, value),
|
|
52
|
+
}),
|
|
53
|
+
refs: refs as Readonly<Record<string, Element>>,
|
|
54
|
+
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
55
|
+
get: (_target, name) => {
|
|
56
|
+
if (typeof name !== "string" || root.value === null) return undefined;
|
|
57
|
+
const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
|
|
58
|
+
return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
|
|
59
|
+
},
|
|
60
|
+
}),
|
|
61
|
+
signal<T>(initialValue: T) {
|
|
62
|
+
const value = shallowRef(initialValue);
|
|
63
|
+
return {
|
|
64
|
+
get: (): T => value.value,
|
|
65
|
+
set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
|
|
66
|
+
update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
computed<T>(compute: () => T) {
|
|
70
|
+
const value = computed(compute);
|
|
71
|
+
return { get: (): T => value.value };
|
|
72
|
+
},
|
|
73
|
+
effect(run: () => void | (() => void)): () => void {
|
|
74
|
+
const stop = watchEffect((onCleanup) => {
|
|
75
|
+
const cleanup = run();
|
|
76
|
+
if (typeof cleanup === "function") onCleanup(cleanup);
|
|
77
|
+
}, { flush: "post" });
|
|
78
|
+
stops.push(stop);
|
|
79
|
+
return stop;
|
|
80
|
+
},
|
|
81
|
+
on(event: string, listener: EventListener): () => void {
|
|
82
|
+
const element = root.value;
|
|
83
|
+
element?.addEventListener(event, listener);
|
|
84
|
+
const off = (): void => element?.removeEventListener(event, listener);
|
|
85
|
+
stops.push(off);
|
|
86
|
+
return off;
|
|
87
|
+
},
|
|
88
|
+
dispatch,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
let cleanup: void | (() => void);
|
|
92
|
+
let ready: Promise<void> | undefined;
|
|
93
|
+
onMounted(() => {
|
|
94
|
+
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
|
|
95
|
+
});
|
|
96
|
+
onBeforeUnmount(() => {
|
|
97
|
+
for (const stop of stops.splice(0)) stop();
|
|
98
|
+
if (typeof cleanup === "function") cleanup();
|
|
99
|
+
});
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<template>
|
|
103
|
+
<div data-component="ui-tree" role="tree" v-bind="$attrs" ref="root"><slot></slot></div>
|
|
104
|
+
</template>
|
|
105
|
+
|
|
106
|
+
<style scoped>
|
|
107
|
+
[data-component~="ui-tree"] {
|
|
108
|
+
display: block;
|
|
109
|
+
min-inline-size: 0;
|
|
110
|
+
padding-inline-start: var(--ui-tree-gutter, 0px);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
114
|
+
[data-component~="ui-tree"][hidden] {
|
|
115
|
+
display: none;
|
|
116
|
+
}
|
|
117
|
+
</style>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
accepts?: string | null;
|
|
3
|
+
container?: boolean | null;
|
|
4
|
+
disabled?: boolean | null;
|
|
5
|
+
dragType?: string | null;
|
|
6
|
+
dropDepth?: number | null;
|
|
7
|
+
dropScope?: string | null;
|
|
8
|
+
expanded?: boolean | null;
|
|
9
|
+
itemId?: string | null;
|
|
10
|
+
label?: string | null;
|
|
11
|
+
selected?: boolean | null;
|
|
12
|
+
sortable?: boolean | null;
|
|
13
|
+
subtreeDepth?: number | null;
|
|
14
|
+
};
|
|
15
|
+
declare var __VLS_1: {}, __VLS_3: {}, __VLS_5: {}, __VLS_7: {};
|
|
16
|
+
type __VLS_Slots = {} & {
|
|
17
|
+
leading?: (props: typeof __VLS_1) => any;
|
|
18
|
+
} & {
|
|
19
|
+
label?: (props: typeof __VLS_3) => any;
|
|
20
|
+
} & {
|
|
21
|
+
actions?: (props: typeof __VLS_5) => any;
|
|
22
|
+
} & {
|
|
23
|
+
default?: (props: typeof __VLS_7) => any;
|
|
24
|
+
};
|
|
25
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
26
|
+
expand: (detail: {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly expanded: boolean;
|
|
29
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
30
|
+
}) => any;
|
|
31
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
32
|
+
onExpand?: ((detail: {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
readonly expanded: boolean;
|
|
35
|
+
readonly trigger: "keyboard" | "pointer" | "programmatic";
|
|
36
|
+
}) => any) | undefined;
|
|
37
|
+
}>, {
|
|
38
|
+
label: string | null;
|
|
39
|
+
disabled: boolean | null;
|
|
40
|
+
selected: boolean | null;
|
|
41
|
+
expanded: boolean | null;
|
|
42
|
+
accepts: string | null;
|
|
43
|
+
container: boolean | null;
|
|
44
|
+
dragType: string | null;
|
|
45
|
+
dropScope: string | null;
|
|
46
|
+
itemId: string | null;
|
|
47
|
+
sortable: boolean | null;
|
|
48
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
50
|
+
declare const _default: typeof __VLS_export;
|
|
51
|
+
export default _default;
|
|
52
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
53
|
+
new (): {
|
|
54
|
+
$slots: S;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
<!-- Generated by HTML Next 1.0.0-alpha.1 for Vue 3.5. Do not edit. -->
|
|
2
|
+
<script setup lang="ts">
|
|
3
|
+
import { computed, onBeforeUnmount, onMounted, ref, shallowRef, watchEffect } from "vue";
|
|
4
|
+
import * as controllerModule from "../components/ui-tree-item/ui-tree-item.js";
|
|
5
|
+
|
|
6
|
+
defineOptions({ inheritAttrs: false });
|
|
7
|
+
|
|
8
|
+
const hn = {
|
|
9
|
+
t: (v: unknown): boolean => v === true || (typeof v === "string" ? v.length > 0 : typeof v === "number" ? v !== 0 && v === v : Array.isArray(v) ? v.length > 0 : v !== null && typeof v === "object" ? Object.keys(v).length > 0 : false),
|
|
10
|
+
n: (v: unknown): number | undefined => typeof v === "number" && v === v ? v : undefined,
|
|
11
|
+
text: (v: unknown): string => v === undefined || v === null ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? "" : String(v),
|
|
12
|
+
attr: (v: unknown): any => v === undefined || v === null || v === false ? undefined : v === true ? "" : Array.isArray(v) ? v.map(hn.text).join(" ") : typeof v === "object" ? undefined : String(v),
|
|
13
|
+
enumerated: (v: unknown): any => typeof v === "boolean" ? String(v) : hn.attr(v),
|
|
14
|
+
call: (fn: string, ...args: unknown[]): any => {
|
|
15
|
+
if (fn === "format") {
|
|
16
|
+
let index = 1;
|
|
17
|
+
return typeof args[0] === "string" ? args[0].replace(/%s/g, () => index < args.length ? hn.text(args[index++]) : "%s") : undefined;
|
|
18
|
+
}
|
|
19
|
+
const n = args.map(hn.n);
|
|
20
|
+
if (n.some((value) => value === undefined)) return undefined;
|
|
21
|
+
const v = n as number[];
|
|
22
|
+
switch (fn) {
|
|
23
|
+
case "abs": return v.length === 1 ? Math.abs(v[0]!) : undefined;
|
|
24
|
+
case "round": return v.length === 1 ? Math.round(v[0]!) : undefined;
|
|
25
|
+
case "min": return v.length > 0 ? Math.min(...v) : undefined;
|
|
26
|
+
case "max": return v.length > 0 ? Math.max(...v) : undefined;
|
|
27
|
+
case "clamp": return v.length === 3 ? Math.min(Math.max(v[0]!, v[1]!), v[2]!) : undefined;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const props = withDefaults(defineProps<{
|
|
34
|
+
accepts?: string | null;
|
|
35
|
+
container?: boolean | null;
|
|
36
|
+
disabled?: boolean | null;
|
|
37
|
+
dragType?: string | null;
|
|
38
|
+
dropDepth?: number | null;
|
|
39
|
+
dropScope?: string | null;
|
|
40
|
+
expanded?: boolean | null;
|
|
41
|
+
itemId?: string | null;
|
|
42
|
+
label?: string | null;
|
|
43
|
+
selected?: boolean | null;
|
|
44
|
+
sortable?: boolean | null;
|
|
45
|
+
subtreeDepth?: number | null;
|
|
46
|
+
}>(), {
|
|
47
|
+
accepts: "",
|
|
48
|
+
container: false,
|
|
49
|
+
disabled: false,
|
|
50
|
+
dragType: "item",
|
|
51
|
+
dropScope: "",
|
|
52
|
+
expanded: false,
|
|
53
|
+
itemId: "",
|
|
54
|
+
label: "",
|
|
55
|
+
selected: false,
|
|
56
|
+
sortable: false,
|
|
57
|
+
});
|
|
58
|
+
const emit = defineEmits<{
|
|
59
|
+
"expand": [detail: { readonly id: string; readonly expanded: boolean; readonly trigger: "keyboard" | "pointer" | "programmatic" }];
|
|
60
|
+
}>();
|
|
61
|
+
const root = ref<HTMLElement | null>(null);
|
|
62
|
+
const refs: Record<string, Element | undefined> = {};
|
|
63
|
+
const state_internalExpanded = ref<any>(false);
|
|
64
|
+
const state_structuralLevel = ref<any>(1);
|
|
65
|
+
const state_tabStop = ref<any>(false);
|
|
66
|
+
const state_isContainer = ref<any>(false);
|
|
67
|
+
|
|
68
|
+
/** Dispatches a component event to Vue listeners and, for controllers and page code, on the root. */
|
|
69
|
+
const dispatch = (name: string, detail?: unknown): boolean => {
|
|
70
|
+
const declared = {"expand":{"bubbles":false,"composed":true,"cancelable":false}} as Record<string, EventInit | undefined>;
|
|
71
|
+
const checks: Record<string, (detail: unknown) => boolean> = {
|
|
72
|
+
"expand": (detail: unknown) => (detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof (detail as Record<string, unknown>)["id"] === "string" && typeof (detail as Record<string, unknown>)["expanded"] === "boolean" && ((detail as Record<string, unknown>)["trigger"] === "keyboard" || (detail as Record<string, unknown>)["trigger"] === "pointer" || (detail as Record<string, unknown>)["trigger"] === "programmatic") && Object.keys(detail as object).every((key) => ["id","expanded","trigger"].includes(key))),
|
|
73
|
+
};
|
|
74
|
+
if (detail !== undefined && checks[name] !== undefined && !checks[name]!(detail)) {
|
|
75
|
+
throw new TypeError(`HR002: Event \`${name}\` detail does not satisfy its declared type.`);
|
|
76
|
+
}
|
|
77
|
+
(emit as (name: string, detail: unknown) => void)(name, detail);
|
|
78
|
+
return root.value?.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, ...declared[name], detail })) ?? true;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** The resolved values the styles' :host-state() rules test. */
|
|
82
|
+
const hostState = computed(() => (["selected","disabled"] as const).flatMap((name) => {
|
|
83
|
+
const value = read(name);
|
|
84
|
+
const tokens: string[] = hn.t(value) ? [name] : [];
|
|
85
|
+
if (typeof value === "string" || typeof value === "number") tokens.push(`${name}=${encodeURIComponent(String(value))}`);
|
|
86
|
+
return tokens;
|
|
87
|
+
}).join(" "));
|
|
88
|
+
|
|
89
|
+
function read(name: string): unknown {
|
|
90
|
+
if (name === "internalExpanded") return state_internalExpanded.value;
|
|
91
|
+
if (name === "structuralLevel") return state_structuralLevel.value;
|
|
92
|
+
if (name === "tabStop") return state_tabStop.value;
|
|
93
|
+
if (name === "isContainer") return state_isContainer.value;
|
|
94
|
+
return (props as Record<string, unknown>)[name];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function write(name: string, value: unknown): boolean {
|
|
98
|
+
if (name === "internalExpanded") { state_internalExpanded.value = value; return true; }
|
|
99
|
+
if (name === "structuralLevel") { state_structuralLevel.value = value; return true; }
|
|
100
|
+
if (name === "tabStop") { state_tabStop.value = value; return true; }
|
|
101
|
+
if (name === "isContainer") { state_isContainer.value = value; return true; }
|
|
102
|
+
throw new TypeError(`Only declared state is writable; \`${name}\` is not.`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const stops: Array<() => void> = [];
|
|
106
|
+
const host = {
|
|
107
|
+
get element(): Element { return root.value as Element; },
|
|
108
|
+
state: new Proxy({} as Record<string, unknown>, {
|
|
109
|
+
get: (_target, name) => typeof name === "string" ? read(name) : undefined,
|
|
110
|
+
set: (_target, name, value) => typeof name === "string" && write(name, value),
|
|
111
|
+
}),
|
|
112
|
+
refs: refs as Readonly<Record<string, Element>>,
|
|
113
|
+
elements: new Proxy({} as Record<string, Element | RadioNodeList | undefined>, {
|
|
114
|
+
get: (_target, name) => {
|
|
115
|
+
if (typeof name !== "string" || root.value === null) return undefined;
|
|
116
|
+
const form = root.value instanceof HTMLFormElement ? root.value : root.value.querySelector("form");
|
|
117
|
+
return form?.elements.namedItem(name) ?? root.value.querySelector(`[name="${CSS.escape(name)}"]`) ?? undefined;
|
|
118
|
+
},
|
|
119
|
+
}),
|
|
120
|
+
signal<T>(initialValue: T) {
|
|
121
|
+
const value = shallowRef(initialValue);
|
|
122
|
+
return {
|
|
123
|
+
get: (): T => value.value,
|
|
124
|
+
set: (next: T): void => { if (!Object.is(value.value, next)) value.value = next; },
|
|
125
|
+
update: (next: (current: T) => T): void => { const updated = next(value.value); if (!Object.is(value.value, updated)) value.value = updated; },
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
computed<T>(compute: () => T) {
|
|
129
|
+
const value = computed(compute);
|
|
130
|
+
return { get: (): T => value.value };
|
|
131
|
+
},
|
|
132
|
+
effect(run: () => void | (() => void)): () => void {
|
|
133
|
+
const stop = watchEffect((onCleanup) => {
|
|
134
|
+
const cleanup = run();
|
|
135
|
+
if (typeof cleanup === "function") onCleanup(cleanup);
|
|
136
|
+
}, { flush: "post" });
|
|
137
|
+
stops.push(stop);
|
|
138
|
+
return stop;
|
|
139
|
+
},
|
|
140
|
+
on(event: string, listener: EventListener): () => void {
|
|
141
|
+
const element = root.value;
|
|
142
|
+
element?.addEventListener(event, listener);
|
|
143
|
+
const off = (): void => element?.removeEventListener(event, listener);
|
|
144
|
+
stops.push(off);
|
|
145
|
+
return off;
|
|
146
|
+
},
|
|
147
|
+
dispatch,
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
let cleanup: void | (() => void);
|
|
151
|
+
let ready: Promise<void> | undefined;
|
|
152
|
+
onMounted(() => {
|
|
153
|
+
ready = Promise.resolve(controllerModule.default(host as never)).then((result) => { cleanup = result; });
|
|
154
|
+
});
|
|
155
|
+
onBeforeUnmount(() => {
|
|
156
|
+
for (const stop of stops.splice(0)) stop();
|
|
157
|
+
if (typeof cleanup === "function") cleanup();
|
|
158
|
+
});
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<template>
|
|
162
|
+
<div data-component="ui-tree-item" role="treeitem" v-bind="$attrs" :aria-label="hn.enumerated(props.label)" :aria-level="hn.enumerated(state_structuralLevel)" :aria-selected="hn.enumerated(props.selected)" :aria-disabled="hn.enumerated(props.disabled)" :data-item-id="hn.attr(props.itemId)" :data-drag-type="hn.attr(props.dragType)" :data-drop-scope="hn.attr(props.dropScope)" :data-accepts="hn.attr(props.accepts)" :data-drop-depth="hn.attr(props.dropDepth)" :data-subtree-depth="hn.attr(props.subtreeDepth)" :data-ui-tree-item-state="hostState || undefined" ref="root"><div class="row" :ref="(element) => { refs['row'] = element as Element }"><template v-if="hn.t((hn.t(props.sortable) && hn.t(!hn.t(props.disabled))))"><button class="drag-handle" type="button" draggable="true" :aria-label="hn.enumerated(hn.call('format', 'Drag %s to reorder', props.label))" :ref="(element) => { refs['dragHandle'] = element as Element }"><svg aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="12" r="1"></circle><circle cx="9" cy="5" r="1"></circle><circle cx="9" cy="19" r="1"></circle><circle cx="15" cy="12" r="1"></circle><circle cx="15" cy="5" r="1"></circle><circle cx="15" cy="19" r="1"></circle></svg></button></template><button class="disclosure" type="button" :disabled="hn.attr(props.disabled)" :hidden="hn.attr(!hn.t(state_isContainer))" :ref="(element) => { refs['disclosure'] = element as Element }"><span class="disclosure-icon" aria-hidden="true"></span></button><span class="leading"><slot name="leading"></slot></span><span class="label"><slot name="label">{{ hn.text(props.label) }}</slot></span><span class="actions"><slot name="actions"></slot></span><span class="drop-indicator row-drop-indicator" aria-hidden="true"></span></div><div class="children" role="group" :hidden="hn.attr(!hn.t((hn.t(state_isContainer) && hn.t(state_internalExpanded))))" :ref="(element) => { refs['children'] = element as Element }"><slot></slot></div><span class="drop-indicator subtree-drop-indicator" aria-hidden="true"></span></div>
|
|
163
|
+
</template>
|
|
164
|
+
|
|
165
|
+
<style scoped>
|
|
166
|
+
[data-component~="ui-tree-item"] {
|
|
167
|
+
--_tree-row-min-height: 32px;
|
|
168
|
+
|
|
169
|
+
position: relative;
|
|
170
|
+
display: block;
|
|
171
|
+
min-inline-size: 0;
|
|
172
|
+
margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--ui-tree-indent, 16px));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.row {
|
|
176
|
+
position: relative;
|
|
177
|
+
display: grid;
|
|
178
|
+
grid-template-columns: 20px auto minmax(0, 1fr) auto;
|
|
179
|
+
align-items: center;
|
|
180
|
+
min-block-size: var(--ui-tree-row-min-height, var(--_tree-row-min-height));
|
|
181
|
+
min-inline-size: 0;
|
|
182
|
+
font-size: var(--ui-tree-font-size, var(--ui-font-size-ui, 0.9375rem));
|
|
183
|
+
border-radius: var(--ui-radius-md);
|
|
184
|
+
color: var(--ui-text-secondary);
|
|
185
|
+
transition:
|
|
186
|
+
background-color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
187
|
+
color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
188
|
+
opacity var(--ui-motion-fast) var(--ui-motion-ease),
|
|
189
|
+
box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
|
|
190
|
+
min-block-size var(--ui-motion-base) var(--ui-motion-ease);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.row:hover,
|
|
194
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row,
|
|
195
|
+
.row:focus-within {
|
|
196
|
+
color: var(--ui-text-primary);
|
|
197
|
+
background: var(--ui-surface-muted);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row {
|
|
201
|
+
opacity: 0.55;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
[data-component~="ui-tree-item"][data-dragging] .row {
|
|
205
|
+
opacity: 0.42;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
[data-component~="ui-tree-item"]:focus {
|
|
209
|
+
outline: none;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
[data-component~="ui-tree-item"]:focus-visible .row {
|
|
213
|
+
box-shadow: 0 0 0 2px var(--ui-focus-ring);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
[data-component~="ui-tree-item"][data-drop-position="inside"] .row {
|
|
217
|
+
background: var(--ui-accent-subtle);
|
|
218
|
+
box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.disclosure,
|
|
222
|
+
.disclosure-spacer {
|
|
223
|
+
grid-column: 1;
|
|
224
|
+
grid-row: 1;
|
|
225
|
+
inline-size: 20px;
|
|
226
|
+
block-size: 28px;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.disclosure {
|
|
230
|
+
display: grid;
|
|
231
|
+
place-items: center;
|
|
232
|
+
padding: 0;
|
|
233
|
+
color: var(--ui-text-muted);
|
|
234
|
+
background: transparent;
|
|
235
|
+
border: 0;
|
|
236
|
+
border-radius: var(--ui-radius-sm);
|
|
237
|
+
cursor: pointer;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.disclosure[hidden] {
|
|
241
|
+
display: none;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.disclosure:hover {
|
|
245
|
+
color: var(--ui-text-primary);
|
|
246
|
+
background: var(--ui-surface-elevated);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.disclosure-icon {
|
|
250
|
+
display: grid;
|
|
251
|
+
place-items: center;
|
|
252
|
+
inline-size: 14px;
|
|
253
|
+
block-size: 14px;
|
|
254
|
+
transform: rotate(-90deg);
|
|
255
|
+
transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.disclosure-icon::before {
|
|
259
|
+
display: block;
|
|
260
|
+
inline-size: 0.45rem;
|
|
261
|
+
block-size: 0.45rem;
|
|
262
|
+
border-inline-end: 2px solid currentColor;
|
|
263
|
+
border-block-end: 2px solid currentColor;
|
|
264
|
+
content: "";
|
|
265
|
+
/* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
|
|
266
|
+
transform: translateY(-20%) rotate(45deg);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
[data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon {
|
|
270
|
+
transform: rotate(0deg);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* Lucide grip-vertical, filling the handle as in Looma 0.2. */
|
|
274
|
+
.drag-handle svg {
|
|
275
|
+
display: block;
|
|
276
|
+
inline-size: 100%;
|
|
277
|
+
block-size: 100%;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
|
|
281
|
+
.leading {
|
|
282
|
+
display: inline-grid;
|
|
283
|
+
place-items: center;
|
|
284
|
+
grid-column: 2;
|
|
285
|
+
grid-row: 1;
|
|
286
|
+
inline-size: 1em;
|
|
287
|
+
block-size: 1em;
|
|
288
|
+
margin-inline-start: var(--ui-space-1);
|
|
289
|
+
color: var(--ui-text-muted);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.leading:empty {
|
|
293
|
+
display: none;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
|
|
297
|
+
:slotted(svg),
|
|
298
|
+
:slotted(img) {
|
|
299
|
+
display: block;
|
|
300
|
+
inline-size: 1em;
|
|
301
|
+
block-size: 1em;
|
|
302
|
+
flex: none;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.label {
|
|
306
|
+
grid-column: 3;
|
|
307
|
+
grid-row: 1;
|
|
308
|
+
min-inline-size: 0;
|
|
309
|
+
padding: var(--ui-space-1) var(--ui-space-2);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.actions {
|
|
313
|
+
grid-column: 4;
|
|
314
|
+
grid-row: 1;
|
|
315
|
+
display: inline-flex;
|
|
316
|
+
align-items: center;
|
|
317
|
+
min-inline-size: 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.drag-handle {
|
|
321
|
+
position: absolute;
|
|
322
|
+
z-index: 2;
|
|
323
|
+
inset-block-start: 50%;
|
|
324
|
+
inset-inline-start: -22px;
|
|
325
|
+
inline-size: 20px;
|
|
326
|
+
block-size: 32px;
|
|
327
|
+
display: grid;
|
|
328
|
+
place-items: center;
|
|
329
|
+
padding: 7px 3px;
|
|
330
|
+
color: var(--ui-text-muted);
|
|
331
|
+
background: var(--ui-surface-elevated);
|
|
332
|
+
border: 1px solid transparent;
|
|
333
|
+
border-radius: var(--ui-radius-sm);
|
|
334
|
+
cursor: grab;
|
|
335
|
+
/* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
|
|
336
|
+
the pointer onto it must not hide it on the way. */
|
|
337
|
+
opacity: 0;
|
|
338
|
+
transform: translateY(-50%);
|
|
339
|
+
transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.row:hover .drag-handle,
|
|
343
|
+
.drag-handle:hover,
|
|
344
|
+
.drag-handle:focus-visible,
|
|
345
|
+
[data-component~="ui-tree-item"][data-dragging] .drag-handle {
|
|
346
|
+
opacity: 1;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.drag-handle:active {
|
|
350
|
+
cursor: grabbing;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
.drop-indicator {
|
|
354
|
+
position: absolute;
|
|
355
|
+
z-index: 3;
|
|
356
|
+
inset-inline: 1px;
|
|
357
|
+
display: none;
|
|
358
|
+
block-size: 2px;
|
|
359
|
+
border-radius: 999px;
|
|
360
|
+
background: var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
361
|
+
pointer-events: none;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
.drop-indicator::before,
|
|
365
|
+
.drop-indicator::after {
|
|
366
|
+
content: "";
|
|
367
|
+
position: absolute;
|
|
368
|
+
inset-block-start: 50%;
|
|
369
|
+
inline-size: 7px;
|
|
370
|
+
block-size: 7px;
|
|
371
|
+
border: 2px solid var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
372
|
+
border-radius: 999px;
|
|
373
|
+
background: var(--ui-surface-elevated);
|
|
374
|
+
transform: translateY(-50%);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.drop-indicator::before {
|
|
378
|
+
inset-inline-start: -1px;
|
|
379
|
+
}
|
|
380
|
+
.drop-indicator::after {
|
|
381
|
+
inset-inline-end: -1px;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
[data-component~="ui-tree-item"][data-drop-position="before"] .row-drop-indicator {
|
|
385
|
+
display: block;
|
|
386
|
+
inset-block-start: -1px;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
[data-component~="ui-tree-item"][data-drop-position="after"] .subtree-drop-indicator {
|
|
390
|
+
display: block;
|
|
391
|
+
inset-block-end: -1px;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.children[hidden] {
|
|
395
|
+
display: none;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] {
|
|
399
|
+
--_tree-row-min-height: 44px;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle {
|
|
403
|
+
display: none;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
@media (prefers-reduced-motion: reduce) {
|
|
407
|
+
.row,
|
|
408
|
+
.disclosure-icon,
|
|
409
|
+
.drag-handle {
|
|
410
|
+
transition: none;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
415
|
+
[data-component~="ui-tree-item"][hidden] {
|
|
416
|
+
display: none;
|
|
417
|
+
}
|
|
418
|
+
</style>
|