@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.
Files changed (248) hide show
  1. package/dist/{chunk-FSGGPFID.js → chunk-GDMQKT5F.js} +63 -31
  2. package/dist/{chunk-SZJQ3NPX.js → chunk-TL4FIE7X.js} +4 -8
  3. package/dist/cjs/{index-D07f6BOw.js → index-BHG9Rpil.js} +33 -0
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/looma.cjs.js +2 -2
  6. package/dist/cjs/{manager-C9j3HZay.js → manager-Ce25WRtl.js} +6 -7
  7. package/dist/cjs/ui-affordance-scope.cjs.entry.js +1 -1
  8. package/dist/cjs/ui-avatar-group.cjs.entry.js +1 -1
  9. package/dist/cjs/ui-avatar.cjs.entry.js +1 -1
  10. package/dist/cjs/ui-badge.cjs.entry.js +1 -1
  11. package/dist/cjs/ui-button.cjs.entry.js +16 -5
  12. package/dist/cjs/ui-checkbox.cjs.entry.js +1 -1
  13. package/dist/cjs/ui-combobox.cjs.entry.js +541 -0
  14. package/dist/cjs/ui-context-menu.cjs.entry.js +3 -3
  15. package/dist/cjs/ui-dialog.cjs.entry.js +3 -3
  16. package/dist/cjs/ui-disclosure.cjs.entry.js +2 -2
  17. package/dist/cjs/ui-floating-action-button.cjs.entry.js +2 -2
  18. package/dist/cjs/ui-form-field.cjs.entry.js +3 -3
  19. package/dist/cjs/ui-icon-button.cjs.entry.js +2 -2
  20. package/dist/cjs/ui-input.cjs.entry.js +11 -6
  21. package/dist/cjs/ui-menu-item.cjs.entry.js +2 -2
  22. package/dist/cjs/ui-menu.cjs.entry.js +3 -3
  23. package/dist/cjs/ui-popover.cjs.entry.js +3 -3
  24. package/dist/cjs/ui-radio-group.cjs.entry.js +2 -2
  25. package/dist/cjs/ui-radio.cjs.entry.js +3 -3
  26. package/dist/cjs/ui-search-result-row.cjs.entry.js +2 -2
  27. package/dist/cjs/ui-search-shell.cjs.entry.js +2 -2
  28. package/dist/cjs/ui-select.cjs.entry.js +15 -7
  29. package/dist/cjs/ui-switch.cjs.entry.js +3 -3
  30. package/dist/cjs/ui-tabs.cjs.entry.js +2 -2
  31. package/dist/cjs/ui-textarea.cjs.entry.js +10 -6
  32. package/dist/cjs/ui-toast-region.cjs.entry.js +2 -2
  33. package/dist/cjs/ui-tooltip.cjs.entry.js +52 -16
  34. package/dist/cjs/ui-top-bar.cjs.entry.js +2 -2
  35. package/dist/cjs/ui-tree-item.cjs.entry.js +7 -3
  36. package/dist/cjs/ui-tree.cjs.entry.js +113 -21
  37. package/dist/collection/collection-manifest.json +1 -0
  38. package/dist/collection/components/ui-button/ui-button.css +36 -26
  39. package/dist/collection/components/ui-button/ui-button.js +14 -3
  40. package/dist/collection/components/ui-combobox/ui-combobox.css +24 -0
  41. package/dist/collection/components/ui-combobox/ui-combobox.js +973 -0
  42. package/dist/collection/components/ui-context-menu/ui-context-menu.js +1 -1
  43. package/dist/collection/components/ui-dialog/ui-dialog.js +1 -1
  44. package/dist/collection/components/ui-disclosure/ui-disclosure.js +1 -1
  45. package/dist/collection/components/ui-floating-action-button/ui-floating-action-button.js +1 -1
  46. package/dist/collection/components/ui-form-field/ui-form-field.css +4 -0
  47. package/dist/collection/components/ui-form-field/ui-form-field.js +1 -1
  48. package/dist/collection/components/ui-icon-button/ui-icon-button.js +1 -1
  49. package/dist/collection/components/ui-input/ui-input.css +8 -6
  50. package/dist/collection/components/ui-input/ui-input.js +11 -7
  51. package/dist/collection/components/ui-menu/ui-menu.js +1 -1
  52. package/dist/collection/components/ui-menu-item/ui-menu-item.js +1 -1
  53. package/dist/collection/components/ui-popover/ui-popover.js +1 -1
  54. package/dist/collection/components/ui-radio/ui-radio.js +2 -2
  55. package/dist/collection/components/ui-radio-group/ui-radio-group.js +1 -1
  56. package/dist/collection/components/ui-search-result-row/ui-search-result-row.js +1 -1
  57. package/dist/collection/components/ui-search-shell/ui-search-shell.js +1 -1
  58. package/dist/collection/components/ui-select/ui-select.css +8 -6
  59. package/dist/collection/components/ui-select/ui-select.js +17 -11
  60. package/dist/collection/components/ui-switch/ui-switch.js +2 -2
  61. package/dist/collection/components/ui-tabs/ui-tabs.js +1 -1
  62. package/dist/collection/components/ui-textarea/ui-textarea.css +7 -6
  63. package/dist/collection/components/ui-textarea/ui-textarea.js +10 -7
  64. package/dist/collection/components/ui-toast-region/ui-toast-region.js +1 -1
  65. package/dist/collection/components/ui-tooltip/ui-tooltip.js +102 -15
  66. package/dist/collection/components/ui-top-bar/ui-top-bar.js +1 -1
  67. package/dist/collection/components/ui-tree/ui-tree.js +132 -20
  68. package/dist/collection/components/ui-tree-item/ui-tree-item.js +44 -2
  69. package/dist/collection/field/combobox.js +4 -0
  70. package/dist/collection/field/valibot.js +5 -0
  71. package/dist/collection/field/validation.js +62 -0
  72. package/dist/collection/overlay/manager.js +6 -7
  73. package/dist/components/index.d.ts +2 -0
  74. package/dist/components/index.js +1 -1
  75. package/dist/components/p-Bh_1GxOD.js +1 -0
  76. package/dist/components/p-C-0syqXZ.js +1 -0
  77. package/dist/components/p-CaietZcq.js +1 -0
  78. package/dist/components/p-DHd18bK7.js +1 -0
  79. package/dist/components/ui-affordance-scope.js +1 -1
  80. package/dist/components/ui-avatar-group.js +1 -1
  81. package/dist/components/ui-avatar.js +1 -1
  82. package/dist/components/ui-badge.js +1 -1
  83. package/dist/components/ui-button.js +1 -1
  84. package/dist/components/ui-checkbox.js +1 -1
  85. package/dist/components/ui-combobox.d.ts +11 -0
  86. package/dist/components/ui-combobox.js +1 -0
  87. package/dist/components/ui-context-menu.js +1 -1
  88. package/dist/components/ui-dialog.js +1 -1
  89. package/dist/components/ui-disclosure.js +1 -1
  90. package/dist/components/ui-floating-action-button.js +1 -1
  91. package/dist/components/ui-form-field.js +1 -1
  92. package/dist/components/ui-icon-button.js +1 -1
  93. package/dist/components/ui-input.js +1 -1
  94. package/dist/components/ui-menu-item.js +1 -1
  95. package/dist/components/ui-menu.js +1 -1
  96. package/dist/components/ui-popover.js +1 -1
  97. package/dist/components/ui-radio-group.js +1 -1
  98. package/dist/components/ui-radio.js +1 -1
  99. package/dist/components/ui-search-result-row.js +1 -1
  100. package/dist/components/ui-search-shell.js +1 -1
  101. package/dist/components/ui-select.js +1 -1
  102. package/dist/components/ui-switch.js +1 -1
  103. package/dist/components/ui-tabs.js +1 -1
  104. package/dist/components/ui-textarea.js +1 -1
  105. package/dist/components/ui-toast-region.js +1 -1
  106. package/dist/components/ui-tooltip.js +1 -1
  107. package/dist/components/ui-top-bar.js +1 -1
  108. package/dist/components/ui-tree-item.js +2 -2
  109. package/dist/components/ui-tree.js +1 -1
  110. package/dist/esm/{index-CEeiinfk.js → index-8BGiMGQ0.js} +33 -1
  111. package/dist/esm/loader.js +3 -3
  112. package/dist/esm/looma.js +3 -3
  113. package/dist/esm/{manager-PM9a74r7.js → manager-C-0syqXZ.js} +6 -7
  114. package/dist/esm/ui-affordance-scope.entry.js +1 -1
  115. package/dist/esm/ui-avatar-group.entry.js +1 -1
  116. package/dist/esm/ui-avatar.entry.js +1 -1
  117. package/dist/esm/ui-badge.entry.js +1 -1
  118. package/dist/esm/ui-button.entry.js +16 -5
  119. package/dist/esm/ui-checkbox.entry.js +1 -1
  120. package/dist/esm/ui-combobox.entry.js +539 -0
  121. package/dist/esm/ui-context-menu.entry.js +3 -3
  122. package/dist/esm/ui-dialog.entry.js +3 -3
  123. package/dist/esm/ui-disclosure.entry.js +2 -2
  124. package/dist/esm/ui-floating-action-button.entry.js +2 -2
  125. package/dist/esm/ui-form-field.entry.js +3 -3
  126. package/dist/esm/ui-icon-button.entry.js +2 -2
  127. package/dist/esm/ui-input.entry.js +11 -6
  128. package/dist/esm/ui-menu-item.entry.js +2 -2
  129. package/dist/esm/ui-menu.entry.js +3 -3
  130. package/dist/esm/ui-popover.entry.js +3 -3
  131. package/dist/esm/ui-radio-group.entry.js +2 -2
  132. package/dist/esm/ui-radio.entry.js +3 -3
  133. package/dist/esm/ui-search-result-row.entry.js +2 -2
  134. package/dist/esm/ui-search-shell.entry.js +2 -2
  135. package/dist/esm/ui-select.entry.js +15 -7
  136. package/dist/esm/ui-switch.entry.js +3 -3
  137. package/dist/esm/ui-tabs.entry.js +2 -2
  138. package/dist/esm/ui-textarea.entry.js +10 -6
  139. package/dist/esm/ui-toast-region.entry.js +2 -2
  140. package/dist/esm/ui-tooltip.entry.js +52 -16
  141. package/dist/esm/ui-top-bar.entry.js +2 -2
  142. package/dist/esm/ui-tree-item.entry.js +7 -3
  143. package/dist/esm/ui-tree.entry.js +113 -21
  144. package/dist/index.cjs +911 -135
  145. package/dist/index.d.cts +104 -1
  146. package/dist/index.d.ts +104 -1
  147. package/dist/index.js +62 -8
  148. package/dist/looma/looma.esm.js +1 -1
  149. package/dist/looma/{p-0198bb21.entry.js → p-13347631.entry.js} +1 -1
  150. package/dist/looma/p-14c081cf.entry.js +1 -0
  151. package/dist/looma/{p-0f45c5f0.entry.js → p-25366205.entry.js} +1 -1
  152. package/dist/looma/{p-a9f46811.entry.js → p-2e3aa869.entry.js} +1 -1
  153. package/dist/looma/p-40fe7fee.entry.js +1 -0
  154. package/dist/looma/p-446cda76.entry.js +1 -0
  155. package/dist/looma/p-4fc1b005.entry.js +13 -0
  156. package/dist/looma/p-582973b5.entry.js +1 -0
  157. package/dist/looma/{p-d273b857.entry.js → p-5a87b59d.entry.js} +1 -1
  158. package/dist/looma/{p-2ed7e241.entry.js → p-5da09f47.entry.js} +1 -1
  159. package/dist/looma/{p-7e94d90d.entry.js → p-69a5557b.entry.js} +1 -1
  160. package/dist/looma/p-6a8a4736.entry.js +1 -0
  161. package/dist/looma/{p-caa8fc7b.entry.js → p-6bf4038b.entry.js} +1 -1
  162. package/dist/looma/p-7e0bb7f6.entry.js +1 -0
  163. package/dist/looma/{p-ed5abf6d.entry.js → p-8204fee6.entry.js} +1 -1
  164. package/dist/looma/{p-5ba9d496.entry.js → p-8238e0dc.entry.js} +1 -1
  165. package/dist/looma/p-8BGiMGQ0.js +2 -0
  166. package/dist/looma/{p-051f578c.entry.js → p-8b8840b8.entry.js} +1 -1
  167. package/dist/looma/{p-1674cda4.entry.js → p-99d88efb.entry.js} +1 -1
  168. package/dist/looma/p-C-0syqXZ.js +1 -0
  169. package/dist/looma/p-a27669b1.entry.js +1 -0
  170. package/dist/looma/{p-11083743.entry.js → p-a6ee76b7.entry.js} +1 -1
  171. package/dist/looma/p-a90d2821.entry.js +1 -0
  172. package/dist/looma/{p-2e6f791e.entry.js → p-add36e74.entry.js} +1 -1
  173. package/dist/looma/{p-0584a051.entry.js → p-b6398a6b.entry.js} +1 -1
  174. package/dist/looma/{p-078f9fb8.entry.js → p-d50faaff.entry.js} +1 -1
  175. package/dist/looma/{p-b7aa4488.entry.js → p-d77278ce.entry.js} +1 -1
  176. package/dist/looma/p-d9ec13b7.entry.js +1 -0
  177. package/dist/looma/{p-1681b218.entry.js → p-ecf8005f.entry.js} +1 -1
  178. package/dist/looma/p-ed368426.entry.js +1 -0
  179. package/dist/looma/{p-063f5a89.entry.js → p-f0487ff3.entry.js} +1 -1
  180. package/dist/looma/p-f74e5546.entry.js +1 -0
  181. package/dist/types/components/ui-combobox/ui-combobox.d.ts +93 -0
  182. package/dist/types/components/ui-input/ui-input.d.ts +1 -1
  183. package/dist/types/components/ui-select/ui-select.d.ts +3 -2
  184. package/dist/types/components/ui-textarea/ui-textarea.d.ts +1 -1
  185. package/dist/types/components/ui-tooltip/ui-tooltip.d.ts +18 -1
  186. package/dist/types/components/ui-tree/ui-tree.d.ts +11 -1
  187. package/dist/types/components/ui-tree-item/ui-tree-item.d.ts +4 -0
  188. package/dist/types/components.d.ts +260 -28
  189. package/dist/types/field/combobox.d.ts +46 -0
  190. package/dist/types/field/valibot.d.ts +7 -0
  191. package/dist/types/field/validation.d.ts +56 -0
  192. package/dist/{ui-affordance-scope.entry-Z3H4CM6J.js → ui-affordance-scope.entry-VO4C2MZX.js} +1 -1
  193. package/dist/{ui-avatar-group.entry-ONGVFRD3.js → ui-avatar-group.entry-TAXJRIIU.js} +1 -1
  194. package/dist/{ui-avatar.entry-TBA3IEED.js → ui-avatar.entry-T6FU6ZYM.js} +1 -1
  195. package/dist/{ui-badge.entry-DKBPJ7G7.js → ui-badge.entry-MZFYNBMJ.js} +1 -1
  196. package/dist/ui-button.entry-7UXMUGHN.js +80 -0
  197. package/dist/{ui-checkbox.entry-QJTO2U6Z.js → ui-checkbox.entry-DMZJB3RE.js} +1 -1
  198. package/dist/ui-combobox.entry-ZCTPXEES.js +553 -0
  199. package/dist/{ui-context-menu.entry-CC4VXCEB.js → ui-context-menu.entry-2WMCBGCP.js} +6 -6
  200. package/dist/{ui-dialog.entry-GPJWOH5Z.js → ui-dialog.entry-WO23XOSW.js} +6 -6
  201. package/dist/{ui-disclosure.entry-EGG3HXD4.js → ui-disclosure.entry-USX7OUEW.js} +2 -2
  202. package/dist/{ui-floating-action-button.entry-XUD44HRX.js → ui-floating-action-button.entry-MXDIN7MV.js} +2 -2
  203. package/dist/{ui-form-field.entry-UHLNDUXR.js → ui-form-field.entry-7ZCMEHPY.js} +3 -3
  204. package/dist/{ui-icon-button.entry-6HDCV3E7.js → ui-icon-button.entry-MJUNXHBU.js} +2 -2
  205. package/dist/{ui-input.entry-73QXAVLL.js → ui-input.entry-AWG63YIG.js} +8 -6
  206. package/dist/{ui-menu-item.entry-HCZRSY5Y.js → ui-menu-item.entry-HFTWG62N.js} +2 -2
  207. package/dist/{ui-menu.entry-ASIVAX6M.js → ui-menu.entry-IT3GW5TL.js} +7 -7
  208. package/dist/{ui-popover.entry-WSQ7AEJN.js → ui-popover.entry-ZQQB4N6E.js} +6 -6
  209. package/dist/{ui-radio-group.entry-2N7BEBJW.js → ui-radio-group.entry-V7PCTS7I.js} +2 -2
  210. package/dist/{ui-radio.entry-TOM6HBXP.js → ui-radio.entry-JYH6TQBI.js} +3 -3
  211. package/dist/{ui-search-result-row.entry-KA3P76WE.js → ui-search-result-row.entry-JBNYXXUN.js} +2 -2
  212. package/dist/{ui-search-shell.entry-ERMS7TIH.js → ui-search-shell.entry-TEAWE76O.js} +2 -2
  213. package/dist/{ui-select.entry-KDIM3SWS.js → ui-select.entry-F3A6TE2U.js} +13 -7
  214. package/dist/{ui-switch.entry-VRTB6X4D.js → ui-switch.entry-MJIICMP2.js} +3 -3
  215. package/dist/{ui-tabs.entry-GIAO5W3U.js → ui-tabs.entry-6REFIUHV.js} +2 -2
  216. package/dist/{ui-textarea.entry-T6YH4HVG.js → ui-textarea.entry-OJTXCED7.js} +8 -6
  217. package/dist/{ui-toast-region.entry-DBQCXOPJ.js → ui-toast-region.entry-NOFXLKPS.js} +5 -5
  218. package/dist/{ui-tooltip.entry-VS26OECS.js → ui-tooltip.entry-COWTWVHX.js} +57 -21
  219. package/dist/{ui-top-bar.entry-HGWP6PFQ.js → ui-top-bar.entry-PIAWXJNV.js} +2 -2
  220. package/dist/{ui-tree-item.entry-ZRXUIZDR.js → ui-tree-item.entry-BSEWNL2O.js} +7 -3
  221. package/dist/{ui-tree.entry-TC2SCQJF.js → ui-tree.entry-XYI3ZFAZ.js} +105 -20
  222. package/dist/valibot.d.ts +52 -0
  223. package/dist/valibot.js +7 -0
  224. package/package.json +11 -3
  225. package/styles.css +36 -20
  226. package/theme-high-contrast.css +12 -0
  227. package/tokens.css +23 -0
  228. package/vue/{chunk-5KWCMTXB.js → chunk-JLW23USW.js} +88 -1
  229. package/vue/editor/index.js +1 -1
  230. package/vue/index.d.ts +123 -1
  231. package/vue/index.js +3 -1
  232. package/dist/components/p-CEYIKqYc.js +0 -1
  233. package/dist/components/p-CIA4RyEp.js +0 -1
  234. package/dist/components/p-PM9a74r7.js +0 -1
  235. package/dist/looma/p-34417499.entry.js +0 -1
  236. package/dist/looma/p-4b422d40.entry.js +0 -1
  237. package/dist/looma/p-54722713.entry.js +0 -13
  238. package/dist/looma/p-54c41576.entry.js +0 -1
  239. package/dist/looma/p-5d4713a6.entry.js +0 -1
  240. package/dist/looma/p-624ba086.entry.js +0 -1
  241. package/dist/looma/p-8d5adb17.entry.js +0 -1
  242. package/dist/looma/p-9194a99d.entry.js +0 -1
  243. package/dist/looma/p-CEeiinfk.js +0 -2
  244. package/dist/looma/p-PM9a74r7.js +0 -1
  245. package/dist/looma/p-a33522a2.entry.js +0 -1
  246. package/dist/looma/p-a5127c7d.entry.js +0 -1
  247. package/dist/looma/p-b0431118.entry.js +0 -1
  248. 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-CEeiinfk.js';
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: 'ea8ed538aa3883c87257a25614a066965364693f', 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: {
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: '740b93aa47e65d8a1cb899d4b9c966d9ad1d456f', 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: '37e1b7f1cdddf623734becef465ffde83d8b86f2', class: "leading", part: "leading" }, h("slot", { key: '0ab3a60c98628f009918d0d720772154912d2709', name: "leading" })), h("span", { key: 'defdd343f25a0f4354110e981f3889e1d09c27ee', class: "label", part: "label" }, h("slot", { key: 'bde46ccacc1a620348062fc300503c4f1736316b' })), h("span", { key: 'caff9ada38c41be90aeb6e331f4c54a51f31d26c', class: "actions", part: "actions" }, h("slot", { key: 'e11704d6871445c91eaa29c99302d8b751be69d3', name: "actions" })), h("span", { key: '9efc0e95588f1dd4527dade2b7ff9f2774462c2e', 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: '8893ec2c4082bb8af942ef563055a2910d0d4201', class: "drop-indicator subtree-drop-indicator", part: "drop-indicator", "aria-hidden": "true" })));
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-CEeiinfk.js';
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
- permitsDrop(source, target, position) {
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 false;
155
+ return { reason: 'descendant' };
139
156
  const sourceMeta = this.itemMetadata(source);
140
157
  const targetMeta = this.itemMetadata(target);
141
158
  if (position === 'inside') {
142
- return this.acceptsChildren(target)
143
- && (targetMeta.accepts.length === 0 || targetMeta.accepts.includes(sourceMeta.type));
159
+ if (!this.acceptsChildren(target)
160
+ || (targetMeta.accepts.length > 0 && !targetMeta.accepts.includes(sourceMeta.type))) {
161
+ return { reason: 'incompatible' };
162
+ }
144
163
  }
145
- return sourceMeta.type === targetMeta.type;
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
- onDragOver = (event) => {
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
- return;
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(), event.clientY, this.acceptsChildren(target));
201
- if (!this.permitsDrop(this.source, target, position)) {
202
- if (event.dataTransfer)
203
- event.dataTransfer.dropEffect = 'none';
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
- return;
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
- event.preventDefault();
208
- if (event.dataTransfer)
209
- event.dataTransfer.dropEffect = 'move';
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
- if (this.permitsDrop(this.source, target, position)) {
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: 'b659635f6acdf09a3618c514f5bdd9bf173f9d98', role: "tree", "aria-label": this.label || 'Tree' }, h("slot", { key: '0815f0eb0bfe766dd2f358385af1516fd4328e2e' })));
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();