@threadlabs/looma 0.1.21 → 0.1.23
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/dist/{chunk-FSGGPFID.js → chunk-GDMQKT5F.js} +63 -31
- package/dist/{chunk-SZJQ3NPX.js → chunk-TL4FIE7X.js} +4 -8
- package/dist/cjs/{index-D07f6BOw.js → index-BHG9Rpil.js} +33 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/looma.cjs.js +2 -2
- package/dist/cjs/{manager-C9j3HZay.js → manager-Ce25WRtl.js} +6 -7
- package/dist/cjs/ui-affordance-scope.cjs.entry.js +1 -1
- package/dist/cjs/ui-avatar-group.cjs.entry.js +1 -1
- package/dist/cjs/ui-avatar.cjs.entry.js +1 -1
- package/dist/cjs/ui-badge.cjs.entry.js +1 -1
- package/dist/cjs/ui-button.cjs.entry.js +16 -5
- package/dist/cjs/ui-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/ui-combobox.cjs.entry.js +541 -0
- package/dist/cjs/ui-context-menu.cjs.entry.js +3 -3
- package/dist/cjs/ui-dialog.cjs.entry.js +3 -3
- package/dist/cjs/ui-disclosure.cjs.entry.js +2 -2
- package/dist/cjs/ui-floating-action-button.cjs.entry.js +2 -2
- package/dist/cjs/ui-form-field.cjs.entry.js +3 -3
- package/dist/cjs/ui-icon-button.cjs.entry.js +2 -2
- package/dist/cjs/ui-input.cjs.entry.js +11 -6
- package/dist/cjs/ui-menu-item.cjs.entry.js +2 -2
- package/dist/cjs/ui-menu.cjs.entry.js +3 -3
- package/dist/cjs/ui-popover.cjs.entry.js +3 -3
- package/dist/cjs/ui-radio-group.cjs.entry.js +2 -2
- package/dist/cjs/ui-radio.cjs.entry.js +3 -3
- package/dist/cjs/ui-search-result-row.cjs.entry.js +2 -2
- package/dist/cjs/ui-search-shell.cjs.entry.js +2 -2
- package/dist/cjs/ui-select.cjs.entry.js +15 -7
- package/dist/cjs/ui-switch.cjs.entry.js +3 -3
- package/dist/cjs/ui-tabs.cjs.entry.js +2 -2
- package/dist/cjs/ui-textarea.cjs.entry.js +10 -6
- package/dist/cjs/ui-toast-region.cjs.entry.js +2 -2
- package/dist/cjs/ui-tooltip.cjs.entry.js +52 -16
- package/dist/cjs/ui-top-bar.cjs.entry.js +2 -2
- package/dist/cjs/ui-tree-item.cjs.entry.js +7 -3
- package/dist/cjs/ui-tree.cjs.entry.js +113 -21
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/ui-button/ui-button.css +36 -26
- package/dist/collection/components/ui-button/ui-button.js +14 -3
- package/dist/collection/components/ui-combobox/ui-combobox.css +24 -0
- package/dist/collection/components/ui-combobox/ui-combobox.js +973 -0
- package/dist/collection/components/ui-context-menu/ui-context-menu.js +1 -1
- package/dist/collection/components/ui-dialog/ui-dialog.js +1 -1
- package/dist/collection/components/ui-disclosure/ui-disclosure.js +1 -1
- package/dist/collection/components/ui-floating-action-button/ui-floating-action-button.js +1 -1
- package/dist/collection/components/ui-form-field/ui-form-field.css +4 -0
- package/dist/collection/components/ui-form-field/ui-form-field.js +1 -1
- package/dist/collection/components/ui-icon-button/ui-icon-button.js +1 -1
- package/dist/collection/components/ui-input/ui-input.css +8 -6
- package/dist/collection/components/ui-input/ui-input.js +11 -7
- package/dist/collection/components/ui-menu/ui-menu.js +1 -1
- package/dist/collection/components/ui-menu-item/ui-menu-item.js +1 -1
- package/dist/collection/components/ui-popover/ui-popover.js +1 -1
- package/dist/collection/components/ui-radio/ui-radio.js +2 -2
- package/dist/collection/components/ui-radio-group/ui-radio-group.js +1 -1
- package/dist/collection/components/ui-search-result-row/ui-search-result-row.js +1 -1
- package/dist/collection/components/ui-search-shell/ui-search-shell.js +1 -1
- package/dist/collection/components/ui-select/ui-select.css +8 -6
- package/dist/collection/components/ui-select/ui-select.js +17 -11
- package/dist/collection/components/ui-switch/ui-switch.js +2 -2
- package/dist/collection/components/ui-tabs/ui-tabs.js +1 -1
- package/dist/collection/components/ui-textarea/ui-textarea.css +7 -6
- package/dist/collection/components/ui-textarea/ui-textarea.js +10 -7
- package/dist/collection/components/ui-toast-region/ui-toast-region.js +1 -1
- package/dist/collection/components/ui-tooltip/ui-tooltip.js +102 -15
- package/dist/collection/components/ui-top-bar/ui-top-bar.js +1 -1
- package/dist/collection/components/ui-tree/ui-tree.js +132 -20
- package/dist/collection/components/ui-tree-item/ui-tree-item.js +44 -2
- package/dist/collection/field/combobox.js +4 -0
- package/dist/collection/field/valibot.js +5 -0
- package/dist/collection/field/validation.js +62 -0
- package/dist/collection/overlay/manager.js +6 -7
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +1 -1
- package/dist/components/p-Bh_1GxOD.js +1 -0
- package/dist/components/p-C-0syqXZ.js +1 -0
- package/dist/components/p-CaietZcq.js +1 -0
- package/dist/components/p-DHd18bK7.js +1 -0
- package/dist/components/ui-affordance-scope.js +1 -1
- package/dist/components/ui-avatar-group.js +1 -1
- package/dist/components/ui-avatar.js +1 -1
- package/dist/components/ui-badge.js +1 -1
- package/dist/components/ui-button.js +1 -1
- package/dist/components/ui-checkbox.js +1 -1
- package/dist/components/ui-combobox.d.ts +11 -0
- package/dist/components/ui-combobox.js +1 -0
- package/dist/components/ui-context-menu.js +1 -1
- package/dist/components/ui-dialog.js +1 -1
- package/dist/components/ui-disclosure.js +1 -1
- package/dist/components/ui-floating-action-button.js +1 -1
- package/dist/components/ui-form-field.js +1 -1
- package/dist/components/ui-icon-button.js +1 -1
- package/dist/components/ui-input.js +1 -1
- package/dist/components/ui-menu-item.js +1 -1
- package/dist/components/ui-menu.js +1 -1
- package/dist/components/ui-popover.js +1 -1
- package/dist/components/ui-radio-group.js +1 -1
- package/dist/components/ui-radio.js +1 -1
- package/dist/components/ui-search-result-row.js +1 -1
- package/dist/components/ui-search-shell.js +1 -1
- package/dist/components/ui-select.js +1 -1
- package/dist/components/ui-switch.js +1 -1
- package/dist/components/ui-tabs.js +1 -1
- package/dist/components/ui-textarea.js +1 -1
- package/dist/components/ui-toast-region.js +1 -1
- package/dist/components/ui-tooltip.js +1 -1
- package/dist/components/ui-top-bar.js +1 -1
- package/dist/components/ui-tree-item.js +2 -2
- package/dist/components/ui-tree.js +1 -1
- package/dist/esm/{index-CEeiinfk.js → index-8BGiMGQ0.js} +33 -1
- package/dist/esm/loader.js +3 -3
- package/dist/esm/looma.js +3 -3
- package/dist/esm/{manager-PM9a74r7.js → manager-C-0syqXZ.js} +6 -7
- package/dist/esm/ui-affordance-scope.entry.js +1 -1
- package/dist/esm/ui-avatar-group.entry.js +1 -1
- package/dist/esm/ui-avatar.entry.js +1 -1
- package/dist/esm/ui-badge.entry.js +1 -1
- package/dist/esm/ui-button.entry.js +16 -5
- package/dist/esm/ui-checkbox.entry.js +1 -1
- package/dist/esm/ui-combobox.entry.js +539 -0
- package/dist/esm/ui-context-menu.entry.js +3 -3
- package/dist/esm/ui-dialog.entry.js +3 -3
- package/dist/esm/ui-disclosure.entry.js +2 -2
- package/dist/esm/ui-floating-action-button.entry.js +2 -2
- package/dist/esm/ui-form-field.entry.js +3 -3
- package/dist/esm/ui-icon-button.entry.js +2 -2
- package/dist/esm/ui-input.entry.js +11 -6
- package/dist/esm/ui-menu-item.entry.js +2 -2
- package/dist/esm/ui-menu.entry.js +3 -3
- package/dist/esm/ui-popover.entry.js +3 -3
- package/dist/esm/ui-radio-group.entry.js +2 -2
- package/dist/esm/ui-radio.entry.js +3 -3
- package/dist/esm/ui-search-result-row.entry.js +2 -2
- package/dist/esm/ui-search-shell.entry.js +2 -2
- package/dist/esm/ui-select.entry.js +15 -7
- package/dist/esm/ui-switch.entry.js +3 -3
- package/dist/esm/ui-tabs.entry.js +2 -2
- package/dist/esm/ui-textarea.entry.js +10 -6
- package/dist/esm/ui-toast-region.entry.js +2 -2
- package/dist/esm/ui-tooltip.entry.js +52 -16
- package/dist/esm/ui-top-bar.entry.js +2 -2
- package/dist/esm/ui-tree-item.entry.js +7 -3
- package/dist/esm/ui-tree.entry.js +113 -21
- package/dist/index.cjs +911 -135
- package/dist/index.d.cts +104 -1
- package/dist/index.d.ts +104 -1
- package/dist/index.js +62 -8
- package/dist/looma/looma.esm.js +1 -1
- package/dist/looma/{p-0198bb21.entry.js → p-13347631.entry.js} +1 -1
- package/dist/looma/p-14c081cf.entry.js +1 -0
- package/dist/looma/{p-0f45c5f0.entry.js → p-25366205.entry.js} +1 -1
- package/dist/looma/{p-a9f46811.entry.js → p-2e3aa869.entry.js} +1 -1
- package/dist/looma/p-40fe7fee.entry.js +1 -0
- package/dist/looma/p-446cda76.entry.js +1 -0
- package/dist/looma/p-4fc1b005.entry.js +13 -0
- package/dist/looma/p-582973b5.entry.js +1 -0
- package/dist/looma/{p-d273b857.entry.js → p-5a87b59d.entry.js} +1 -1
- package/dist/looma/{p-2ed7e241.entry.js → p-5da09f47.entry.js} +1 -1
- package/dist/looma/{p-7e94d90d.entry.js → p-69a5557b.entry.js} +1 -1
- package/dist/looma/p-6a8a4736.entry.js +1 -0
- package/dist/looma/{p-caa8fc7b.entry.js → p-6bf4038b.entry.js} +1 -1
- package/dist/looma/p-7e0bb7f6.entry.js +1 -0
- package/dist/looma/{p-ed5abf6d.entry.js → p-8204fee6.entry.js} +1 -1
- package/dist/looma/{p-5ba9d496.entry.js → p-8238e0dc.entry.js} +1 -1
- package/dist/looma/p-8BGiMGQ0.js +2 -0
- package/dist/looma/{p-051f578c.entry.js → p-8b8840b8.entry.js} +1 -1
- package/dist/looma/{p-1674cda4.entry.js → p-99d88efb.entry.js} +1 -1
- package/dist/looma/p-C-0syqXZ.js +1 -0
- package/dist/looma/p-a27669b1.entry.js +1 -0
- package/dist/looma/{p-11083743.entry.js → p-a6ee76b7.entry.js} +1 -1
- package/dist/looma/p-a90d2821.entry.js +1 -0
- package/dist/looma/{p-2e6f791e.entry.js → p-add36e74.entry.js} +1 -1
- package/dist/looma/{p-0584a051.entry.js → p-b6398a6b.entry.js} +1 -1
- package/dist/looma/{p-078f9fb8.entry.js → p-d50faaff.entry.js} +1 -1
- package/dist/looma/{p-b7aa4488.entry.js → p-d77278ce.entry.js} +1 -1
- package/dist/looma/p-d9ec13b7.entry.js +1 -0
- package/dist/looma/{p-1681b218.entry.js → p-ecf8005f.entry.js} +1 -1
- package/dist/looma/p-ed368426.entry.js +1 -0
- package/dist/looma/{p-063f5a89.entry.js → p-f0487ff3.entry.js} +1 -1
- package/dist/looma/p-f74e5546.entry.js +1 -0
- package/dist/types/components/ui-combobox/ui-combobox.d.ts +93 -0
- package/dist/types/components/ui-input/ui-input.d.ts +1 -1
- package/dist/types/components/ui-select/ui-select.d.ts +3 -2
- package/dist/types/components/ui-textarea/ui-textarea.d.ts +1 -1
- package/dist/types/components/ui-tooltip/ui-tooltip.d.ts +18 -1
- package/dist/types/components/ui-tree/ui-tree.d.ts +11 -1
- package/dist/types/components/ui-tree-item/ui-tree-item.d.ts +4 -0
- package/dist/types/components.d.ts +260 -28
- package/dist/types/field/combobox.d.ts +46 -0
- package/dist/types/field/valibot.d.ts +7 -0
- package/dist/types/field/validation.d.ts +56 -0
- package/dist/{ui-affordance-scope.entry-Z3H4CM6J.js → ui-affordance-scope.entry-VO4C2MZX.js} +1 -1
- package/dist/{ui-avatar-group.entry-ONGVFRD3.js → ui-avatar-group.entry-TAXJRIIU.js} +1 -1
- package/dist/{ui-avatar.entry-TBA3IEED.js → ui-avatar.entry-T6FU6ZYM.js} +1 -1
- package/dist/{ui-badge.entry-DKBPJ7G7.js → ui-badge.entry-MZFYNBMJ.js} +1 -1
- package/dist/ui-button.entry-7UXMUGHN.js +80 -0
- package/dist/{ui-checkbox.entry-QJTO2U6Z.js → ui-checkbox.entry-DMZJB3RE.js} +1 -1
- package/dist/ui-combobox.entry-ZCTPXEES.js +553 -0
- package/dist/{ui-context-menu.entry-CC4VXCEB.js → ui-context-menu.entry-2WMCBGCP.js} +6 -6
- package/dist/{ui-dialog.entry-GPJWOH5Z.js → ui-dialog.entry-WO23XOSW.js} +6 -6
- package/dist/{ui-disclosure.entry-EGG3HXD4.js → ui-disclosure.entry-USX7OUEW.js} +2 -2
- package/dist/{ui-floating-action-button.entry-XUD44HRX.js → ui-floating-action-button.entry-MXDIN7MV.js} +2 -2
- package/dist/{ui-form-field.entry-UHLNDUXR.js → ui-form-field.entry-7ZCMEHPY.js} +3 -3
- package/dist/{ui-icon-button.entry-6HDCV3E7.js → ui-icon-button.entry-MJUNXHBU.js} +2 -2
- package/dist/{ui-input.entry-73QXAVLL.js → ui-input.entry-AWG63YIG.js} +8 -6
- package/dist/{ui-menu-item.entry-HCZRSY5Y.js → ui-menu-item.entry-HFTWG62N.js} +2 -2
- package/dist/{ui-menu.entry-ASIVAX6M.js → ui-menu.entry-IT3GW5TL.js} +7 -7
- package/dist/{ui-popover.entry-WSQ7AEJN.js → ui-popover.entry-ZQQB4N6E.js} +6 -6
- package/dist/{ui-radio-group.entry-2N7BEBJW.js → ui-radio-group.entry-V7PCTS7I.js} +2 -2
- package/dist/{ui-radio.entry-TOM6HBXP.js → ui-radio.entry-JYH6TQBI.js} +3 -3
- package/dist/{ui-search-result-row.entry-KA3P76WE.js → ui-search-result-row.entry-JBNYXXUN.js} +2 -2
- package/dist/{ui-search-shell.entry-ERMS7TIH.js → ui-search-shell.entry-TEAWE76O.js} +2 -2
- package/dist/{ui-select.entry-KDIM3SWS.js → ui-select.entry-F3A6TE2U.js} +13 -7
- package/dist/{ui-switch.entry-VRTB6X4D.js → ui-switch.entry-MJIICMP2.js} +3 -3
- package/dist/{ui-tabs.entry-GIAO5W3U.js → ui-tabs.entry-6REFIUHV.js} +2 -2
- package/dist/{ui-textarea.entry-T6YH4HVG.js → ui-textarea.entry-OJTXCED7.js} +8 -6
- package/dist/{ui-toast-region.entry-DBQCXOPJ.js → ui-toast-region.entry-NOFXLKPS.js} +5 -5
- package/dist/{ui-tooltip.entry-VS26OECS.js → ui-tooltip.entry-COWTWVHX.js} +57 -21
- package/dist/{ui-top-bar.entry-HGWP6PFQ.js → ui-top-bar.entry-PIAWXJNV.js} +2 -2
- package/dist/{ui-tree-item.entry-ZRXUIZDR.js → ui-tree-item.entry-BSEWNL2O.js} +7 -3
- package/dist/{ui-tree.entry-TC2SCQJF.js → ui-tree.entry-XYI3ZFAZ.js} +105 -20
- package/dist/valibot.d.ts +52 -0
- package/dist/valibot.js +7 -0
- package/package.json +11 -3
- package/styles.css +36 -20
- package/theme-high-contrast.css +12 -0
- package/tokens.css +23 -0
- package/vue/{chunk-5KWCMTXB.js → chunk-JLW23USW.js} +88 -1
- package/vue/editor/index.js +1 -1
- package/vue/index.d.ts +123 -1
- package/vue/index.js +3 -1
- package/dist/components/p-CEYIKqYc.js +0 -1
- package/dist/components/p-CIA4RyEp.js +0 -1
- package/dist/components/p-PM9a74r7.js +0 -1
- package/dist/looma/p-34417499.entry.js +0 -1
- package/dist/looma/p-4b422d40.entry.js +0 -1
- package/dist/looma/p-54722713.entry.js +0 -13
- package/dist/looma/p-54c41576.entry.js +0 -1
- package/dist/looma/p-5d4713a6.entry.js +0 -1
- package/dist/looma/p-624ba086.entry.js +0 -1
- package/dist/looma/p-8d5adb17.entry.js +0 -1
- package/dist/looma/p-9194a99d.entry.js +0 -1
- package/dist/looma/p-CEeiinfk.js +0 -2
- package/dist/looma/p-PM9a74r7.js +0 -1
- package/dist/looma/p-a33522a2.entry.js +0 -1
- package/dist/looma/p-a5127c7d.entry.js +0 -1
- package/dist/looma/p-b0431118.entry.js +0 -1
- package/dist/ui-button.entry-U2MMIHLY.js +0 -71
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as registerInstance, g as getElement, h, H as Host } from './index-
|
|
1
|
+
import { r as registerInstance, g as getElement, h, H as Host } from './index-8BGiMGQ0.js';
|
|
2
2
|
import { d as dispatchDetail, e as eventToTrigger } from './events-JwSoedEO.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -614,6 +614,10 @@ const UITreeItem = class {
|
|
|
614
614
|
label = '';
|
|
615
615
|
/** One-based visual and semantic nesting level. */
|
|
616
616
|
depth = 1;
|
|
617
|
+
/** Application hierarchy depth used for drop constraints. Defaults to visual depth. */
|
|
618
|
+
dropDepth;
|
|
619
|
+
/** Deepest descendant distance, used with the tree's max-depth drop constraint. */
|
|
620
|
+
subtreeDepth;
|
|
617
621
|
/** Whether this item accepts children and exposes disclosure behavior. */
|
|
618
622
|
container = false;
|
|
619
623
|
/** Whether this item participates in pointer drag and drop. */
|
|
@@ -676,10 +680,10 @@ const UITreeItem = class {
|
|
|
676
680
|
const level = Math.max(1, Math.floor(this.depth));
|
|
677
681
|
const disclosureLabel = `${this.internalExpanded ? 'Collapse' : 'Expand'} ${this.label || 'item'}`;
|
|
678
682
|
const dragLabel = `Drag ${this.label || 'item'} to reorder`;
|
|
679
|
-
return (h(Host, { key: '
|
|
683
|
+
return (h(Host, { key: '606f5fdac8a95489d0c62cd7d4918c6d5d0c759e', role: "treeitem", "aria-level": String(level), "aria-expanded": this.container ? String(this.internalExpanded) : undefined, "aria-selected": String(this.selected), "aria-disabled": this.disabled ? 'true' : undefined, "data-container": this.container ? '' : undefined, "data-selected": this.selected ? '' : undefined, "data-disabled": this.disabled ? '' : undefined, "data-drag-type": this.dragType || 'item', "data-drop-scope": this.dropScope || undefined, "data-accepts": this.accepts || undefined, tabIndex: this.disabled ? -1 : 0, style: {
|
|
680
684
|
'--ui-tree-item-depth': String(level - 1),
|
|
681
685
|
'margin-inline-start': level > 1 ? 'var(--ui-tree-indent, 16px)' : '0px',
|
|
682
|
-
} }, h("div", { key: '
|
|
686
|
+
} }, h("div", { key: '2b4bb03d4b24ef668f22b08e803f7f43c2d63ae5', class: "row", part: "row", onClick: this.onRowClick }, this.sortable && !this.disabled ? (h("button", { class: "drag-handle", part: "drag-handle", type: "button", draggable: true, "aria-label": dragLabel, title: dragLabel }, h("span", { innerHTML: loomaIconMarkup('grip-vertical') }))) : null, this.container ? (h("button", { class: "disclosure", part: "disclosure", type: "button", "aria-label": disclosureLabel, "aria-expanded": String(this.internalExpanded), disabled: this.disabled, onClick: this.onDisclosureClick, onKeyDown: this.onDisclosureKeydown }, h("span", { class: { 'disclosure-icon': true, 'disclosure-icon--expanded': this.internalExpanded }, innerHTML: loomaIconMarkup('chevron-down') }))) : h("span", { class: "disclosure-spacer", "aria-hidden": "true" }), h("span", { key: 'e7b935158e35cdc6518bdd73d54c42dcfa211aee', class: "leading", part: "leading" }, h("slot", { key: '8448462349fd23b8be0fb673fc6e101bf94beaa7', name: "leading" })), h("span", { key: 'e0b6338e1ec9ec043446e42c5f03724adf7e1862', class: "label", part: "label" }, h("slot", { key: 'ed44e6f2ce3466c28d2b87fc7511399ecc339255' })), h("span", { key: '2aea78227904fe23cfc4b8e14852a4601e3cc34b', class: "actions", part: "actions" }, h("slot", { key: '7c6549008c2a54c3ea6fcdf9e0fdbe445d379922', name: "actions" })), h("span", { key: '05166ba04765bc518d6b95ca7ae5a67c4394d1bf', class: "drop-indicator row-drop-indicator", part: "drop-indicator", "aria-hidden": "true" })), this.container ? (h("div", { class: "children", part: "children", role: "group", hidden: !this.internalExpanded }, h("slot", { name: "children" }))) : null, h("span", { key: '7381d6e9e2a8f94695f29e73194b1603d79cefb9', class: "drop-indicator subtree-drop-indicator", part: "drop-indicator", "aria-hidden": "true" })));
|
|
683
687
|
}
|
|
684
688
|
static get watchers() { return {
|
|
685
689
|
"expanded": [{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as registerInstance, g as getElement, h, H as Host } from './index-
|
|
1
|
+
import { r as registerInstance, g as getElement, h, H as Host } from './index-8BGiMGQ0.js';
|
|
2
2
|
import { d as dispatchDetail } from './events-JwSoedEO.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -62,13 +62,19 @@ const UITree = class {
|
|
|
62
62
|
get host() { return getElement(this); }
|
|
63
63
|
label = 'Tree';
|
|
64
64
|
hoverExpandDelay = 700;
|
|
65
|
+
/** Maximum resulting item depth accepted by pointer reordering. Zero is unlimited. */
|
|
66
|
+
maxDepth = 0;
|
|
65
67
|
source = null;
|
|
66
68
|
target = null;
|
|
67
69
|
position = null;
|
|
70
|
+
rejectedTarget = null;
|
|
71
|
+
rejectedPosition = null;
|
|
72
|
+
rejection = null;
|
|
68
73
|
hoverIntent = null;
|
|
69
74
|
componentDidLoad() {
|
|
70
75
|
this.hoverIntent = createHoverIntent(this.hoverExpandDelay, this.expandTarget);
|
|
71
76
|
this.host.addEventListener('dragstart', this.onDragStart);
|
|
77
|
+
this.host.addEventListener('drag', this.onDrag);
|
|
72
78
|
this.host.addEventListener('dragenter', this.onDragOver);
|
|
73
79
|
this.host.addEventListener('dragover', this.onDragOver);
|
|
74
80
|
this.host.addEventListener('dragleave', this.onDragLeave);
|
|
@@ -79,6 +85,7 @@ const UITree = class {
|
|
|
79
85
|
disconnectedCallback() {
|
|
80
86
|
this.hoverIntent?.destroy();
|
|
81
87
|
this.host.removeEventListener('dragstart', this.onDragStart);
|
|
88
|
+
this.host.removeEventListener('drag', this.onDrag);
|
|
82
89
|
this.host.removeEventListener('dragenter', this.onDragOver);
|
|
83
90
|
this.host.removeEventListener('dragover', this.onDragOver);
|
|
84
91
|
this.host.removeEventListener('dragleave', this.onDragLeave);
|
|
@@ -130,19 +137,42 @@ const UITree = class {
|
|
|
130
137
|
.filter(Boolean),
|
|
131
138
|
};
|
|
132
139
|
}
|
|
133
|
-
|
|
140
|
+
constraintDepth(item) {
|
|
141
|
+
if (item.dropDepth !== undefined)
|
|
142
|
+
return item.dropDepth;
|
|
143
|
+
const dropDepth = item.getAttribute('drop-depth');
|
|
144
|
+
if (dropDepth !== null)
|
|
145
|
+
return Number(dropDepth);
|
|
146
|
+
if (item.depth !== undefined)
|
|
147
|
+
return item.depth;
|
|
148
|
+
return Number(item.getAttribute('depth')) || 1;
|
|
149
|
+
}
|
|
150
|
+
dropRejection(source, target, position) {
|
|
134
151
|
// A tree item can never move into (or beside) one of its own descendants.
|
|
135
152
|
// Reject the target before showing any insertion affordance so the preview
|
|
136
153
|
// stays truthful instead of promising a move the consumer must undo.
|
|
137
154
|
if (source.contains(target))
|
|
138
|
-
return
|
|
155
|
+
return { reason: 'descendant' };
|
|
139
156
|
const sourceMeta = this.itemMetadata(source);
|
|
140
157
|
const targetMeta = this.itemMetadata(target);
|
|
141
158
|
if (position === 'inside') {
|
|
142
|
-
|
|
143
|
-
|
|
159
|
+
if (!this.acceptsChildren(target)
|
|
160
|
+
|| (targetMeta.accepts.length > 0 && !targetMeta.accepts.includes(sourceMeta.type))) {
|
|
161
|
+
return { reason: 'incompatible' };
|
|
162
|
+
}
|
|
144
163
|
}
|
|
145
|
-
|
|
164
|
+
else if (sourceMeta.type !== targetMeta.type) {
|
|
165
|
+
return { reason: 'incompatible' };
|
|
166
|
+
}
|
|
167
|
+
const maxDepth = Math.max(0, Math.floor(this.maxDepth));
|
|
168
|
+
if (maxDepth > 0 && source.subtreeDepth !== undefined) {
|
|
169
|
+
const targetDepth = Math.max(0, Math.floor(this.constraintDepth(target)));
|
|
170
|
+
const subtreeDepth = Math.max(0, Math.floor(source.subtreeDepth));
|
|
171
|
+
const resultingDepth = targetDepth + (position === 'inside' ? 1 : 0) + subtreeDepth;
|
|
172
|
+
if (resultingDepth > maxDepth)
|
|
173
|
+
return { reason: 'max-depth', maxDepth, resultingDepth };
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
146
176
|
}
|
|
147
177
|
clearTarget() {
|
|
148
178
|
this.target?.removeAttribute('data-drop-position');
|
|
@@ -150,10 +180,16 @@ const UITree = class {
|
|
|
150
180
|
this.position = null;
|
|
151
181
|
this.hoverIntent?.cancel();
|
|
152
182
|
}
|
|
183
|
+
clearRejection() {
|
|
184
|
+
this.rejectedTarget = null;
|
|
185
|
+
this.rejectedPosition = null;
|
|
186
|
+
this.rejection = null;
|
|
187
|
+
}
|
|
153
188
|
finishDrag() {
|
|
154
189
|
this.source?.removeAttribute('data-dragging');
|
|
155
190
|
this.source = null;
|
|
156
191
|
this.clearTarget();
|
|
192
|
+
this.clearRejection();
|
|
157
193
|
}
|
|
158
194
|
expandTarget = (itemId) => {
|
|
159
195
|
const item = Array.from(this.host.querySelectorAll('ui-tree-item'))
|
|
@@ -186,27 +222,36 @@ const UITree = class {
|
|
|
186
222
|
}
|
|
187
223
|
setElementDragImage(event.dataTransfer, row);
|
|
188
224
|
};
|
|
189
|
-
|
|
225
|
+
updateTarget(target, clientY, dataTransfer) {
|
|
190
226
|
if (!this.source)
|
|
191
|
-
return;
|
|
192
|
-
const target = this.itemFromEvent(event);
|
|
227
|
+
return false;
|
|
193
228
|
if (!target || target === this.source) {
|
|
194
229
|
this.clearTarget();
|
|
195
|
-
|
|
230
|
+
this.clearRejection();
|
|
231
|
+
return false;
|
|
196
232
|
}
|
|
197
233
|
const row = this.rowFor(target);
|
|
198
234
|
if (!row)
|
|
199
|
-
return;
|
|
200
|
-
const position = classifyDropPosition(row.getBoundingClientRect(),
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
235
|
+
return false;
|
|
236
|
+
const position = classifyDropPosition(row.getBoundingClientRect(), clientY, this.acceptsChildren(target));
|
|
237
|
+
const rejection = this.dropRejection(this.source, target, position);
|
|
238
|
+
if (rejection) {
|
|
239
|
+
if (dataTransfer)
|
|
240
|
+
dataTransfer.dropEffect = 'none';
|
|
204
241
|
this.clearTarget();
|
|
205
|
-
|
|
242
|
+
if (rejection.reason === 'max-depth') {
|
|
243
|
+
this.rejectedTarget = target;
|
|
244
|
+
this.rejectedPosition = position;
|
|
245
|
+
this.rejection = rejection;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
this.clearRejection();
|
|
249
|
+
}
|
|
250
|
+
return false;
|
|
206
251
|
}
|
|
207
|
-
|
|
208
|
-
if (
|
|
209
|
-
|
|
252
|
+
this.clearRejection();
|
|
253
|
+
if (dataTransfer)
|
|
254
|
+
dataTransfer.dropEffect = 'move';
|
|
210
255
|
if (this.target !== target || this.position !== position) {
|
|
211
256
|
this.clearTarget();
|
|
212
257
|
this.target = target;
|
|
@@ -219,6 +264,26 @@ const UITree = class {
|
|
|
219
264
|
else {
|
|
220
265
|
this.hoverIntent?.cancel();
|
|
221
266
|
}
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
onDrag = (event) => {
|
|
270
|
+
if (!this.source || (event.clientX === 0 && event.clientY === 0))
|
|
271
|
+
return;
|
|
272
|
+
const target = this.itemAtPoint(event.clientX, event.clientY);
|
|
273
|
+
// Native dragenter does not fire when a nested source moves onto an
|
|
274
|
+
// ancestor row: the pointer was already inside that ancestor's host. The
|
|
275
|
+
// source drag event still carries the live pointer coordinates, so use it
|
|
276
|
+
// to keep ancestor/outdent feedback current.
|
|
277
|
+
if (target)
|
|
278
|
+
this.updateTarget(target, event.clientY, event.dataTransfer);
|
|
279
|
+
};
|
|
280
|
+
onDragOver = (event) => {
|
|
281
|
+
if (!this.source)
|
|
282
|
+
return;
|
|
283
|
+
const target = this.itemFromEvent(event);
|
|
284
|
+
if (this.updateTarget(target, event.clientY, event.dataTransfer)) {
|
|
285
|
+
event.preventDefault();
|
|
286
|
+
}
|
|
222
287
|
};
|
|
223
288
|
onDragLeave = (event) => {
|
|
224
289
|
if (this.isWithinTree(event.relatedTarget))
|
|
@@ -226,12 +291,15 @@ const UITree = class {
|
|
|
226
291
|
if (this.itemAtPoint(event.clientX, event.clientY))
|
|
227
292
|
return;
|
|
228
293
|
this.clearTarget();
|
|
294
|
+
this.clearRejection();
|
|
229
295
|
};
|
|
230
296
|
dispatchReorder(source, target, position) {
|
|
231
297
|
const sourceId = this.itemId(source);
|
|
232
298
|
const targetId = this.itemId(target);
|
|
233
299
|
if (!sourceId || !targetId)
|
|
234
300
|
return;
|
|
301
|
+
if (position === 'inside')
|
|
302
|
+
this.expandTarget(targetId);
|
|
235
303
|
const sourceMeta = this.itemMetadata(source);
|
|
236
304
|
const targetMeta = this.itemMetadata(target);
|
|
237
305
|
dispatchDetail(this.host, 'reorder', {
|
|
@@ -245,6 +313,21 @@ const UITree = class {
|
|
|
245
313
|
trigger: 'pointer',
|
|
246
314
|
});
|
|
247
315
|
}
|
|
316
|
+
dispatchReorderRejected(source, target, position, rejection) {
|
|
317
|
+
const sourceId = this.itemId(source);
|
|
318
|
+
const targetId = this.itemId(target);
|
|
319
|
+
if (!sourceId || !targetId)
|
|
320
|
+
return;
|
|
321
|
+
dispatchDetail(this.host, 'reorder-rejected', {
|
|
322
|
+
sourceId,
|
|
323
|
+
targetId,
|
|
324
|
+
position,
|
|
325
|
+
reason: 'max-depth',
|
|
326
|
+
maxDepth: rejection.maxDepth,
|
|
327
|
+
resultingDepth: rejection.resultingDepth,
|
|
328
|
+
trigger: 'pointer',
|
|
329
|
+
});
|
|
330
|
+
}
|
|
248
331
|
onDrop = (event) => {
|
|
249
332
|
if (!this.source || !this.target || !this.position)
|
|
250
333
|
return;
|
|
@@ -254,14 +337,23 @@ const UITree = class {
|
|
|
254
337
|
};
|
|
255
338
|
onDragEnd = (event) => {
|
|
256
339
|
if (this.source) {
|
|
340
|
+
if (this.rejectedTarget && this.rejectedPosition && this.rejection) {
|
|
341
|
+
this.dispatchReorderRejected(this.source, this.rejectedTarget, this.rejectedPosition, this.rejection);
|
|
342
|
+
this.finishDrag();
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
257
345
|
const target = this.itemAtPoint(event.clientX, event.clientY);
|
|
258
346
|
if (target && target !== this.source) {
|
|
259
347
|
const row = this.rowFor(target);
|
|
260
348
|
if (row) {
|
|
261
349
|
const position = classifyDropPosition(row.getBoundingClientRect(), event.clientY, this.acceptsChildren(target));
|
|
262
|
-
|
|
350
|
+
const rejection = this.dropRejection(this.source, target, position);
|
|
351
|
+
if (!rejection) {
|
|
263
352
|
this.dispatchReorder(this.source, target, position);
|
|
264
353
|
}
|
|
354
|
+
else if (rejection.reason === 'max-depth') {
|
|
355
|
+
this.dispatchReorderRejected(this.source, target, position, rejection);
|
|
356
|
+
}
|
|
265
357
|
}
|
|
266
358
|
}
|
|
267
359
|
}
|
|
@@ -286,7 +378,7 @@ const UITree = class {
|
|
|
286
378
|
next.focus();
|
|
287
379
|
};
|
|
288
380
|
render() {
|
|
289
|
-
return (h(Host, { key: '
|
|
381
|
+
return (h(Host, { key: '474c2154d2abe3c76eee9c36bf552390089df6e8', role: "tree", "aria-label": this.label || 'Tree' }, h("slot", { key: '93aedd02f984dd33b5efc811fef417d1199917bd' })));
|
|
290
382
|
}
|
|
291
383
|
};
|
|
292
384
|
UITree.style = uiTreeCss();
|