@threadlabs/looma 0.28.5 → 0.28.6

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 (429) hide show
  1. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +3 -2
  2. package/dist/index.js +1 -1
  3. package/package.json +3 -2
  4. package/styles/ui-action-bar.css +13 -6
  5. package/styles/ui-affordance-scope.css +12 -5
  6. package/styles/ui-avatar-group.css +17 -10
  7. package/styles/ui-avatar.css +23 -16
  8. package/styles/ui-badge.css +78 -71
  9. package/styles/ui-breadcrumb-item.css +12 -5
  10. package/styles/ui-breadcrumbs.css +10 -3
  11. package/styles/ui-button.css +79 -72
  12. package/styles/ui-callout.css +29 -22
  13. package/styles/ui-card.css +25 -18
  14. package/styles/ui-checkbox.css +45 -37
  15. package/styles/ui-cluster.css +34 -27
  16. package/styles/ui-combobox.css +46 -39
  17. package/styles/ui-container.css +20 -13
  18. package/styles/ui-context-menu.css +17 -10
  19. package/styles/ui-cover.css +12 -5
  20. package/styles/ui-description-item.css +10 -3
  21. package/styles/ui-description-list.css +20 -13
  22. package/styles/ui-dialog.css +44 -35
  23. package/styles/ui-disclosure.css +32 -25
  24. package/styles/ui-editable.css +15 -8
  25. package/styles/ui-editor-image-toolbar.css +1 -1
  26. package/styles/ui-editor-insert-table-grid.css +11 -4
  27. package/styles/ui-editor-mention-menu-item.css +17 -8
  28. package/styles/ui-editor-mention-menu.css +14 -7
  29. package/styles/ui-editor-slash-menu-group.css +10 -3
  30. package/styles/ui-editor-slash-menu-item.css +15 -8
  31. package/styles/ui-editor-slash-menu.css +15 -8
  32. package/styles/ui-editor-surface.css +10 -3
  33. package/styles/ui-editor-table-context-menu.css +17 -10
  34. package/styles/ui-editor-table-overlay.css +17 -10
  35. package/styles/ui-editor-table-toolbar.css +22 -15
  36. package/styles/ui-editor-toolbar.css +18 -11
  37. package/styles/ui-floating-action-button.css +21 -14
  38. package/styles/ui-form-field.css +20 -13
  39. package/styles/ui-grid.css +21 -14
  40. package/styles/ui-icon-button.css +80 -73
  41. package/styles/ui-icon.css +14 -7
  42. package/styles/ui-image.css +25 -18
  43. package/styles/ui-input-group.css +34 -27
  44. package/styles/ui-input.css +42 -35
  45. package/styles/ui-list-item.css +33 -26
  46. package/styles/ui-list.css +22 -15
  47. package/styles/ui-listbox.css +22 -14
  48. package/styles/ui-menu-group.css +10 -3
  49. package/styles/ui-menu-item.css +29 -22
  50. package/styles/ui-menu.css +25 -18
  51. package/styles/ui-meter.css +36 -29
  52. package/styles/ui-nav-item.css +26 -19
  53. package/styles/ui-page-header.css +12 -5
  54. package/styles/ui-popover.css +27 -20
  55. package/styles/ui-radio-group.css +14 -6
  56. package/styles/ui-radio.css +24 -17
  57. package/styles/ui-reel.css +28 -21
  58. package/styles/ui-scroll-area.css +22 -15
  59. package/styles/ui-search-result-row.css +28 -21
  60. package/styles/ui-search-shell.css +24 -17
  61. package/styles/ui-section.css +14 -7
  62. package/styles/ui-select.css +33 -26
  63. package/styles/ui-separator.css +17 -10
  64. package/styles/ui-sidebar.css +35 -28
  65. package/styles/ui-spinner.css +32 -23
  66. package/styles/ui-stack.css +29 -21
  67. package/styles/ui-status-message.css +14 -7
  68. package/styles/ui-switch.css +29 -22
  69. package/styles/ui-switcher.css +27 -20
  70. package/styles/ui-table.css +14 -7
  71. package/styles/ui-tabs.css +24 -17
  72. package/styles/ui-text.css +35 -28
  73. package/styles/ui-textarea.css +37 -30
  74. package/styles/ui-toast-region.css +74 -63
  75. package/styles/ui-toast.css +21 -14
  76. package/styles/ui-tooltip.css +38 -31
  77. package/styles/ui-top-bar.css +19 -12
  78. package/styles/ui-tree-item.css +79 -71
  79. package/styles/ui-tree.css +18 -11
  80. package/vanilla/UiActionBar.d.ts +1 -1
  81. package/vanilla/UiActionBar.js +1 -1
  82. package/vanilla/UiAffordanceScope.d.ts +1 -1
  83. package/vanilla/UiAffordanceScope.js +1 -1
  84. package/vanilla/UiAvatar.d.ts +1 -1
  85. package/vanilla/UiAvatar.js +1 -1
  86. package/vanilla/UiAvatarGroup.d.ts +1 -1
  87. package/vanilla/UiAvatarGroup.js +1 -1
  88. package/vanilla/UiBadge.d.ts +1 -1
  89. package/vanilla/UiBadge.js +1 -1
  90. package/vanilla/UiBreadcrumbItem.d.ts +1 -1
  91. package/vanilla/UiBreadcrumbItem.js +1 -1
  92. package/vanilla/UiBreadcrumbs.d.ts +1 -1
  93. package/vanilla/UiBreadcrumbs.js +1 -1
  94. package/vanilla/UiButton.d.ts +1 -1
  95. package/vanilla/UiButton.js +19 -57
  96. package/vanilla/UiCallout.d.ts +1 -1
  97. package/vanilla/UiCallout.js +25 -73
  98. package/vanilla/UiCard.d.ts +1 -1
  99. package/vanilla/UiCard.js +1 -1
  100. package/vanilla/UiCheckbox.d.ts +1 -1
  101. package/vanilla/UiCheckbox.js +1 -1
  102. package/vanilla/UiCluster.d.ts +1 -1
  103. package/vanilla/UiCluster.js +1 -1
  104. package/vanilla/UiCombobox.d.ts +1 -1
  105. package/vanilla/UiCombobox.js +60 -166
  106. package/vanilla/UiContainer.d.ts +1 -1
  107. package/vanilla/UiContainer.js +1 -1
  108. package/vanilla/UiContextMenu.d.ts +1 -1
  109. package/vanilla/UiContextMenu.js +1 -1
  110. package/vanilla/UiCover.d.ts +1 -1
  111. package/vanilla/UiCover.js +1 -1
  112. package/vanilla/UiDescriptionItem.d.ts +1 -1
  113. package/vanilla/UiDescriptionItem.js +1 -1
  114. package/vanilla/UiDescriptionList.d.ts +1 -1
  115. package/vanilla/UiDescriptionList.js +1 -1
  116. package/vanilla/UiDialog.d.ts +1 -1
  117. package/vanilla/UiDialog.js +4 -10
  118. package/vanilla/UiDisclosure.d.ts +1 -1
  119. package/vanilla/UiDisclosure.js +1 -1
  120. package/vanilla/UiEditable.d.ts +1 -1
  121. package/vanilla/UiEditable.js +7 -19
  122. package/vanilla/UiEditorImageToolbar.d.ts +1 -1
  123. package/vanilla/UiEditorImageToolbar.js +1 -1
  124. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  125. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  126. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  127. package/vanilla/UiEditorMentionMenu.js +17 -37
  128. package/vanilla/UiEditorMentionMenuItem.d.ts +1 -1
  129. package/vanilla/UiEditorMentionMenuItem.js +4 -10
  130. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  131. package/vanilla/UiEditorSlashMenu.js +5 -4
  132. package/vanilla/UiEditorSlashMenuGroup.d.ts +1 -1
  133. package/vanilla/UiEditorSlashMenuGroup.js +1 -1
  134. package/vanilla/UiEditorSlashMenuItem.d.ts +1 -1
  135. package/vanilla/UiEditorSlashMenuItem.js +7 -19
  136. package/vanilla/UiEditorSurface.d.ts +1 -1
  137. package/vanilla/UiEditorSurface.js +1 -1
  138. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  139. package/vanilla/UiEditorTableContextMenu.js +6 -14
  140. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  141. package/vanilla/UiEditorTableOverlay.js +9 -25
  142. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  143. package/vanilla/UiEditorTableToolbar.js +25 -77
  144. package/vanilla/UiEditorToolbar.d.ts +1 -1
  145. package/vanilla/UiEditorToolbar.js +1 -1
  146. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  147. package/vanilla/UiFloatingActionButton.js +1 -1
  148. package/vanilla/UiFormField.d.ts +1 -1
  149. package/vanilla/UiFormField.js +1 -1
  150. package/vanilla/UiGrid.d.ts +1 -1
  151. package/vanilla/UiGrid.js +1 -1
  152. package/vanilla/UiIcon.d.ts +1 -1
  153. package/vanilla/UiIcon.js +15 -47
  154. package/vanilla/UiIconButton.d.ts +1 -1
  155. package/vanilla/UiIconButton.js +4 -10
  156. package/vanilla/UiImage.d.ts +1 -1
  157. package/vanilla/UiImage.js +1 -1
  158. package/vanilla/UiInput.d.ts +1 -1
  159. package/vanilla/UiInput.js +1 -1
  160. package/vanilla/UiInputGroup.d.ts +1 -1
  161. package/vanilla/UiInputGroup.js +1 -1
  162. package/vanilla/UiList.d.ts +1 -1
  163. package/vanilla/UiList.js +1 -1
  164. package/vanilla/UiListItem.d.ts +1 -1
  165. package/vanilla/UiListItem.js +1 -1
  166. package/vanilla/UiListbox.d.ts +1 -1
  167. package/vanilla/UiListbox.js +4 -10
  168. package/vanilla/UiMenu.d.ts +1 -1
  169. package/vanilla/UiMenu.js +1 -1
  170. package/vanilla/UiMenuGroup.d.ts +1 -1
  171. package/vanilla/UiMenuGroup.js +4 -10
  172. package/vanilla/UiMenuItem.d.ts +1 -1
  173. package/vanilla/UiMenuItem.js +4 -10
  174. package/vanilla/UiMeter.d.ts +1 -1
  175. package/vanilla/UiMeter.js +13 -33
  176. package/vanilla/UiNavItem.d.ts +1 -1
  177. package/vanilla/UiNavItem.js +1 -1
  178. package/vanilla/UiPageHeader.d.ts +1 -1
  179. package/vanilla/UiPageHeader.js +1 -1
  180. package/vanilla/UiPopover.d.ts +1 -1
  181. package/vanilla/UiPopover.js +1 -1
  182. package/vanilla/UiRadio.d.ts +1 -1
  183. package/vanilla/UiRadio.js +1 -1
  184. package/vanilla/UiRadioGroup.d.ts +1 -1
  185. package/vanilla/UiRadioGroup.js +1 -1
  186. package/vanilla/UiReel.d.ts +1 -1
  187. package/vanilla/UiReel.js +1 -1
  188. package/vanilla/UiScrollArea.d.ts +1 -1
  189. package/vanilla/UiScrollArea.js +1 -1
  190. package/vanilla/UiSearchResultRow.d.ts +1 -1
  191. package/vanilla/UiSearchResultRow.js +1 -1
  192. package/vanilla/UiSearchShell.d.ts +1 -1
  193. package/vanilla/UiSearchShell.js +1 -1
  194. package/vanilla/UiSection.d.ts +1 -1
  195. package/vanilla/UiSection.js +1 -1
  196. package/vanilla/UiSelect.d.ts +1 -1
  197. package/vanilla/UiSelect.js +1 -1
  198. package/vanilla/UiSeparator.d.ts +1 -1
  199. package/vanilla/UiSeparator.js +1 -1
  200. package/vanilla/UiSidebar.d.ts +1 -1
  201. package/vanilla/UiSidebar.js +1 -1
  202. package/vanilla/UiSpinner.d.ts +1 -1
  203. package/vanilla/UiSpinner.js +1 -1
  204. package/vanilla/UiStack.d.ts +1 -1
  205. package/vanilla/UiStack.js +1 -1
  206. package/vanilla/UiStatusMessage.d.ts +1 -1
  207. package/vanilla/UiStatusMessage.js +1 -1
  208. package/vanilla/UiSwitch.d.ts +1 -1
  209. package/vanilla/UiSwitch.js +1 -1
  210. package/vanilla/UiSwitcher.d.ts +1 -1
  211. package/vanilla/UiSwitcher.js +1 -1
  212. package/vanilla/UiTable.d.ts +1 -1
  213. package/vanilla/UiTable.js +1 -1
  214. package/vanilla/UiTabs.d.ts +1 -1
  215. package/vanilla/UiTabs.js +1 -1
  216. package/vanilla/UiText.d.ts +1 -1
  217. package/vanilla/UiText.js +1 -1
  218. package/vanilla/UiTextarea.d.ts +1 -1
  219. package/vanilla/UiTextarea.js +1 -1
  220. package/vanilla/UiToast.d.ts +1 -1
  221. package/vanilla/UiToast.js +1 -1
  222. package/vanilla/UiToastRegion.d.ts +1 -1
  223. package/vanilla/UiToastRegion.js +1 -1
  224. package/vanilla/UiTooltip.d.ts +1 -1
  225. package/vanilla/UiTooltip.js +1 -1
  226. package/vanilla/UiTopBar.d.ts +1 -1
  227. package/vanilla/UiTopBar.js +1 -1
  228. package/vanilla/UiTree.d.ts +1 -1
  229. package/vanilla/UiTree.js +1 -1
  230. package/vanilla/UiTreeItem.d.ts +1 -1
  231. package/vanilla/UiTreeItem.js +7 -19
  232. package/vue/UiActionBar.vue +46 -78
  233. package/vue/UiAffordanceScope.vue +27 -66
  234. package/vue/UiAvatar.d.ts +10 -7
  235. package/vue/UiAvatar.vue +100 -218
  236. package/vue/UiAvatarGroup.d.ts +10 -7
  237. package/vue/UiAvatarGroup.vue +78 -160
  238. package/vue/UiBadge.d.ts +1 -1
  239. package/vue/UiBadge.vue +483 -520
  240. package/vue/UiBreadcrumbItem.vue +52 -123
  241. package/vue/UiBreadcrumbs.vue +27 -70
  242. package/vue/UiButton.d.ts +2 -2
  243. package/vue/UiButton.vue +420 -471
  244. package/vue/UiCallout.vue +131 -175
  245. package/vue/UiCard.d.ts +1 -1
  246. package/vue/UiCard.vue +112 -151
  247. package/vue/UiCheckbox.d.ts +13 -10
  248. package/vue/UiCheckbox.vue +160 -221
  249. package/vue/UiCluster.d.ts +1 -1
  250. package/vue/UiCluster.vue +84 -128
  251. package/vue/UiCombobox.d.ts +71 -68
  252. package/vue/UiCombobox.vue +417 -743
  253. package/vue/UiContainer.vue +43 -87
  254. package/vue/UiContextMenu.d.ts +6 -6
  255. package/vue/UiContextMenu.vue +78 -117
  256. package/vue/UiCover.vue +29 -69
  257. package/vue/UiDescriptionItem.vue +39 -82
  258. package/vue/UiDescriptionList.vue +64 -107
  259. package/vue/UiDialog.d.ts +22 -19
  260. package/vue/UiDialog.vue +193 -246
  261. package/vue/UiDisclosure.d.ts +22 -19
  262. package/vue/UiDisclosure.vue +192 -283
  263. package/vue/UiEditable.d.ts +5 -5
  264. package/vue/UiEditable.vue +124 -207
  265. package/vue/UiEditorImageToolbar.d.ts +2 -2
  266. package/vue/UiEditorImageToolbar.vue +41 -251
  267. package/vue/UiEditorInsertTableGrid.d.ts +2 -2
  268. package/vue/UiEditorInsertTableGrid.vue +98 -266
  269. package/vue/UiEditorMentionMenu.d.ts +15 -12
  270. package/vue/UiEditorMentionMenu.vue +150 -239
  271. package/vue/UiEditorMentionMenuItem.vue +66 -110
  272. package/vue/UiEditorSlashMenu.d.ts +16 -13
  273. package/vue/UiEditorSlashMenu.vue +172 -253
  274. package/vue/UiEditorSlashMenuGroup.vue +25 -69
  275. package/vue/UiEditorSlashMenuItem.vue +67 -115
  276. package/vue/UiEditorSurface.vue +19 -63
  277. package/vue/UiEditorTableContextMenu.vue +135 -269
  278. package/vue/UiEditorTableOverlay.d.ts +2 -2
  279. package/vue/UiEditorTableOverlay.vue +310 -479
  280. package/vue/UiEditorTableToolbar.d.ts +2 -2
  281. package/vue/UiEditorTableToolbar.vue +182 -357
  282. package/vue/UiEditorToolbar.vue +143 -183
  283. package/vue/UiFloatingActionButton.vue +70 -114
  284. package/vue/UiFormField.d.ts +1 -1
  285. package/vue/UiFormField.vue +76 -117
  286. package/vue/UiGrid.d.ts +1 -1
  287. package/vue/UiGrid.vue +65 -103
  288. package/vue/UiIcon.vue +32 -106
  289. package/vue/UiIconButton.d.ts +2 -2
  290. package/vue/UiIconButton.vue +359 -411
  291. package/vue/UiImage.vue +145 -180
  292. package/vue/UiInput.vue +158 -190
  293. package/vue/UiInputGroup.vue +199 -239
  294. package/vue/UiList.vue +67 -109
  295. package/vue/UiListItem.vue +154 -201
  296. package/vue/UiListbox.d.ts +10 -7
  297. package/vue/UiListbox.vue +86 -260
  298. package/vue/UiMenu.d.ts +11 -11
  299. package/vue/UiMenu.vue +118 -152
  300. package/vue/UiMenuGroup.vue +21 -67
  301. package/vue/UiMenuItem.d.ts +19 -16
  302. package/vue/UiMenuItem.vue +169 -262
  303. package/vue/UiMeter.d.ts +4 -4
  304. package/vue/UiMeter.vue +166 -680
  305. package/vue/UiNavItem.vue +140 -213
  306. package/vue/UiPageHeader.vue +81 -127
  307. package/vue/UiPopover.d.ts +7 -7
  308. package/vue/UiPopover.vue +90 -129
  309. package/vue/UiRadio.d.ts +12 -9
  310. package/vue/UiRadio.vue +91 -149
  311. package/vue/UiRadioGroup.d.ts +2 -2
  312. package/vue/UiRadioGroup.vue +47 -85
  313. package/vue/UiReel.vue +89 -130
  314. package/vue/UiScrollArea.d.ts +1 -1
  315. package/vue/UiScrollArea.vue +78 -119
  316. package/vue/UiSearchResultRow.vue +96 -149
  317. package/vue/UiSearchShell.d.ts +2 -2
  318. package/vue/UiSearchShell.vue +159 -196
  319. package/vue/UiSection.vue +105 -149
  320. package/vue/UiSelect.d.ts +1 -1
  321. package/vue/UiSelect.vue +114 -146
  322. package/vue/UiSeparator.vue +42 -85
  323. package/vue/UiSidebar.d.ts +10 -7
  324. package/vue/UiSidebar.vue +193 -260
  325. package/vue/UiSpinner.vue +54 -130
  326. package/vue/UiStack.vue +66 -107
  327. package/vue/UiStatusMessage.d.ts +1 -1
  328. package/vue/UiStatusMessage.vue +61 -135
  329. package/vue/UiSwitch.d.ts +12 -9
  330. package/vue/UiSwitch.vue +136 -194
  331. package/vue/UiSwitcher.vue +69 -107
  332. package/vue/UiTable.vue +121 -156
  333. package/vue/UiTabs.d.ts +1 -1
  334. package/vue/UiTabs.vue +139 -267
  335. package/vue/UiText.d.ts +4 -4
  336. package/vue/UiText.vue +145 -184
  337. package/vue/UiTextarea.d.ts +2 -2
  338. package/vue/UiTextarea.vue +162 -194
  339. package/vue/UiToast.vue +70 -118
  340. package/vue/UiToastRegion.vue +157 -276
  341. package/vue/UiTooltip.d.ts +21 -18
  342. package/vue/UiTooltip.vue +174 -234
  343. package/vue/UiTopBar.vue +48 -76
  344. package/vue/UiTree.vue +46 -79
  345. package/vue/UiTreeItem.d.ts +18 -15
  346. package/vue/UiTreeItem.vue +526 -668
  347. package/vue/chunks/UiActionBar.js +5 -17
  348. package/vue/chunks/UiAffordanceScope.js +7 -26
  349. package/vue/chunks/UiAvatar.js +20 -74
  350. package/vue/chunks/UiAvatarGroup.js +14 -56
  351. package/vue/chunks/UiBadge.js +10 -28
  352. package/vue/chunks/UiBreadcrumbItem.js +11 -41
  353. package/vue/chunks/UiBreadcrumbs.js +7 -25
  354. package/vue/chunks/UiButton.js +80 -103
  355. package/vue/chunks/UiCallout.js +9 -27
  356. package/vue/chunks/UiCard.js +33 -53
  357. package/vue/chunks/UiCheckbox.js +14 -46
  358. package/vue/chunks/UiCluster.js +13 -31
  359. package/vue/chunks/UiCombobox.js +99 -237
  360. package/vue/chunks/UiContainer.js +9 -27
  361. package/vue/chunks/UiContextMenu.js +7 -26
  362. package/vue/chunks/UiCover.js +7 -25
  363. package/vue/chunks/UiDescriptionItem.js +6 -24
  364. package/vue/chunks/UiDescriptionList.js +9 -27
  365. package/vue/chunks/UiDialog.js +18 -47
  366. package/vue/chunks/UiDisclosure.js +19 -66
  367. package/vue/chunks/UiEditable.js +18 -60
  368. package/vue/chunks/UiEditorImageToolbar.js +34 -103
  369. package/vue/chunks/UiEditorInsertTableGrid.js +14 -112
  370. package/vue/chunks/UiEditorMentionMenu.js +16 -54
  371. package/vue/chunks/UiEditorMentionMenuItem.js +10 -28
  372. package/vue/chunks/UiEditorSlashMenu.js +17 -46
  373. package/vue/chunks/UiEditorSlashMenuGroup.js +7 -25
  374. package/vue/chunks/UiEditorSlashMenuItem.js +16 -31
  375. package/vue/chunks/UiEditorSurface.js +7 -25
  376. package/vue/chunks/UiEditorTableContextMenu.js +25 -102
  377. package/vue/chunks/UiEditorTableOverlay.js +41 -104
  378. package/vue/chunks/UiEditorTableToolbar.js +44 -122
  379. package/vue/chunks/UiEditorToolbar.js +7 -26
  380. package/vue/chunks/UiFloatingActionButton.js +10 -28
  381. package/vue/chunks/UiFormField.js +8 -27
  382. package/vue/chunks/UiGrid.js +10 -28
  383. package/vue/chunks/UiIcon.js +21 -74
  384. package/vue/chunks/UiIconButton.js +18 -50
  385. package/vue/chunks/UiImage.js +14 -33
  386. package/vue/chunks/UiInput.js +12 -31
  387. package/vue/chunks/UiInputGroup.js +10 -29
  388. package/vue/chunks/UiList.js +17 -37
  389. package/vue/chunks/UiListItem.js +12 -30
  390. package/vue/chunks/UiListbox.js +22 -124
  391. package/vue/chunks/UiMenu.js +13 -32
  392. package/vue/chunks/UiMenuGroup.js +8 -26
  393. package/vue/chunks/UiMenuItem.js +35 -80
  394. package/vue/chunks/UiMeter.js +17 -351
  395. package/vue/chunks/UiNavItem.js +23 -57
  396. package/vue/chunks/UiPageHeader.js +7 -25
  397. package/vue/chunks/UiPopover.js +9 -28
  398. package/vue/chunks/UiRadio.js +11 -43
  399. package/vue/chunks/UiRadioGroup.js +13 -32
  400. package/vue/chunks/UiReel.js +10 -28
  401. package/vue/chunks/UiScrollArea.js +10 -29
  402. package/vue/chunks/UiSearchResultRow.js +10 -28
  403. package/vue/chunks/UiSearchShell.js +9 -28
  404. package/vue/chunks/UiSection.js +9 -27
  405. package/vue/chunks/UiSelect.js +10 -29
  406. package/vue/chunks/UiSeparator.js +10 -28
  407. package/vue/chunks/UiSidebar.js +15 -47
  408. package/vue/chunks/UiSpinner.js +8 -44
  409. package/vue/chunks/UiStack.js +12 -30
  410. package/vue/chunks/UiStatusMessage.js +10 -42
  411. package/vue/chunks/UiSwitch.js +11 -43
  412. package/vue/chunks/UiSwitcher.js +9 -28
  413. package/vue/chunks/UiTable.js +7 -26
  414. package/vue/chunks/UiTabs.js +15 -91
  415. package/vue/chunks/UiText.js +148 -168
  416. package/vue/chunks/UiTextarea.js +16 -35
  417. package/vue/chunks/UiToast.js +13 -37
  418. package/vue/chunks/UiToastRegion.js +16 -88
  419. package/vue/chunks/UiTooltip.js +14 -46
  420. package/vue/chunks/UiTopBar.js +5 -17
  421. package/vue/chunks/UiTree.js +13 -32
  422. package/vue/chunks/UiTreeItem.js +34 -90
  423. package/vue/chunks/_plugin-vue_export-helper.js +904 -1
  424. package/vue/chunks/control.js +3 -0
  425. package/vue/chunks/props.js +1 -1
  426. package/vue/components.css +7606 -7534
  427. package/vue/editor/index.js +1 -1
  428. package/vue/host.ts +999 -14
  429. package/vue/chunks/host.js +0 -443
@@ -1,19 +1,16 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.35 for Vue 3.5. Do not edit. -->
2
- <script lang="ts">
3
- const htmlNextAuthoredCheck2Reported = new Set<string>()
4
- function htmlNextAuthoredCheck2(accepted: boolean, location: string, message: string): boolean {
5
- if (!accepted && !htmlNextAuthoredCheck2Reported.has(location)) {
6
- htmlNextAuthoredCheck2Reported.add(location)
7
- console.warn(message)
8
- }
9
- return accepted
10
- }
11
- </script>
12
-
1
+ <!-- Generated by HTML Next 1.0.0-alpha.51 for Vue 3.5. Do not edit. -->
13
2
  <script setup lang="ts">
14
3
  import { computed, getCurrentInstance, provide, ref, useTemplateRef, watchSyncEffect } from 'vue'
15
4
  import type { PropType } from 'vue'
16
- import { createDispatch, useComponentHost } from './host'
5
+ import {
6
+ attribute,
7
+ checkHydratedRoot,
8
+ concat,
9
+ createDispatch,
10
+ nativeAttrs,
11
+ useComponentHost,
12
+ useReflectedProp,
13
+ } from './host'
17
14
  import { acceptsControllerWrite } from './props'
18
15
  import { checkedProp, propValidityState, vPropValidity } from './props'
19
16
  import UiButton from './UiButton.vue'
@@ -287,38 +284,7 @@ void checkedProps.value
287
284
  watchSyncEffect(() => {
288
285
  void checkedProps.value
289
286
  })
290
- function nativeAttrs(attrs: Record<string, unknown>): Record<string, unknown> {
291
- const names = Object.keys(attrs)
292
- if (!names.some((name) => Object.hasOwn(Object.prototype, name))) return attrs
293
- return Object.fromEntries(names.map((name) => [
294
- Object.hasOwn(Object.prototype, name)
295
- ? name === '__proto__' ? '__Proto__' : name[0]!.toUpperCase() + name.slice(1)
296
- : name,
297
- attrs[name],
298
- ]))
299
- }
300
- const componentInstance = getCurrentInstance()
301
- function reflectedProp(
302
- name: string,
303
- kebab: string,
304
- value: unknown,
305
- fallback: string | undefined,
306
- bound: boolean,
307
- separator?: string,
308
- ): string | undefined {
309
- const incoming = componentInstance?.vnode.props
310
- if (
311
- !bound
312
- && (incoming === null || incoming === undefined
313
- || (!Object.hasOwn(incoming, name) && !Object.hasOwn(incoming, kebab)))
314
- ) return fallback
315
- if (value === null || value === undefined) return undefined
316
- return Array.isArray(value) && separator !== undefined
317
- ? value.join(separator)
318
- : typeof value === 'object'
319
- ? JSON.stringify(value)
320
- : String(value)
321
- }
287
+ const reflectedProp = useReflectedProp()
322
288
  const hydrationInstance = getCurrentInstance()
323
289
  const emit = defineEmits<{
324
290
  'update:expanded': [value: boolean]
@@ -347,26 +313,8 @@ const structuralLevel = ref(1)
347
313
  const tabStop = ref(false)
348
314
  const isContainer = ref(false)
349
315
  const moving = ref(false)
350
- let guardedPrevious: any
316
+ let guardedPrevious: any = null
351
317
  const guarded = computed(() => {
352
- if (
353
- !(htmlNextAuthoredCheck2(
354
- structuralLevel.value == null || Number.isInteger(structuralLevel.value),
355
- '$structuralLevel:structuralLevel',
356
- './components/ui-tree-item/ui-tree-item.html: HR007: Reference structuralLevel does not satisfy its declared type.',
357
- ))
358
- ) return guardedPrevious
359
- return guardedPrevious = structuralLevel.value
360
- })
361
- let guardedBindingPrevious: any = null
362
- const guardedBinding = computed(() => {
363
- if (
364
- !(htmlNextAuthoredCheck2(
365
- moving.value == null || typeof moving.value === 'boolean',
366
- '{ true: concat(\'Cancel moving \', $label), false: concat(\'Drag \', $label, \' to reorder\') }[concat($moving)]:moving',
367
- './components/ui-tree-item/ui-tree-item.html: HR007: Reference moving does not satisfy its declared type.',
368
- ))
369
- ) return guardedBindingPrevious
370
318
  const candidate: any = ((objectValue: any, indexValue: any) =>
371
319
  objectValue === Symbol.for('html-next.invalid-result')
372
320
  || indexValue === Symbol.for('html-next.invalid-result')
@@ -386,9 +334,9 @@ const guardedBinding = computed(() => {
386
334
  concat(moving.value),
387
335
  )
388
336
  if (candidate === Symbol.for('html-next.invalid-result')) {
389
- return guardedBindingPrevious
337
+ return guardedPrevious
390
338
  }
391
- return guardedBindingPrevious = typeof (((objectValue: any, indexValue: any) =>
339
+ return guardedPrevious = typeof (((objectValue: any, indexValue: any) =>
392
340
  objectValue === Symbol.for('html-next.invalid-result')
393
341
  || indexValue === Symbol.for('html-next.invalid-result')
394
342
  ? Symbol.for('html-next.invalid-result')
@@ -443,60 +391,18 @@ const guardedBinding = computed(() => {
443
391
  concat(moving.value),
444
392
  ))
445
393
  })
446
- let guardedBinding2Previous: any
447
- const guardedBinding2 = computed(() => {
448
- if (
449
- !(htmlNextAuthoredCheck2(
450
- isContainer.value == null || typeof isContainer.value === 'boolean',
451
- 'not $isContainer:isContainer',
452
- './components/ui-tree-item/ui-tree-item.html: HR007: Reference isContainer does not satisfy its declared type.',
453
- ))
454
- ) return guardedBinding2Previous
455
- return guardedBinding2Previous = !isContainer.value
456
- })
457
- let guardedBinding3Previous: any = null
458
- const guardedBinding3 = computed(() => {
394
+ let guardedBindingPrevious: any = null
395
+ const guardedBinding = computed(() => {
459
396
  const candidate: any = concat('Select ', checkedProps.value.label)
460
- if (candidate === Symbol.for('html-next.invalid-result')) return guardedBinding3Previous
461
- return guardedBinding3Previous = candidate
462
- })
463
- let guardedBinding4Previous: any
464
- const guardedBinding4 = computed(() => {
465
- if (
466
- !(htmlNextAuthoredCheck2(
467
- internalExpanded.value == null || typeof internalExpanded.value === 'boolean',
468
- 'not ($isContainer and $internalExpanded):internalExpanded',
469
- './components/ui-tree-item/ui-tree-item.html: HR007: Reference internalExpanded does not satisfy its declared type.',
470
- )
471
- && htmlNextAuthoredCheck2(
472
- isContainer.value == null || typeof isContainer.value === 'boolean',
473
- 'not ($isContainer and $internalExpanded):isContainer',
474
- './components/ui-tree-item/ui-tree-item.html: HR007: Reference isContainer does not satisfy its declared type.',
475
- ))
476
- ) return guardedBinding4Previous
477
- return guardedBinding4Previous = !(isContainer.value && internalExpanded.value)
397
+ if (candidate === Symbol.for('html-next.invalid-result')) return guardedBindingPrevious
398
+ return guardedBindingPrevious = candidate
478
399
  })
479
400
  provide('html-next:ui-tree-item:internalExpanded', internalExpanded)
480
401
  provide('html-next:ui-tree-item:structuralLevel', structuralLevel)
481
402
  provide('html-next:ui-tree-item:tabStop', tabStop)
482
403
  provide('html-next:ui-tree-item:isContainer', isContainer)
483
404
  provide('html-next:ui-tree-item:moving', moving)
484
- const hydrationNode = hydrationInstance?.vnode.el
485
- if (
486
- typeof window !== 'undefined' && hydrationNode != null
487
- && (!(hydrationNode instanceof Element) || hydrationNode.localName !== ('div'))
488
- ) {
489
- throw Object.assign(
490
- new Error('HR005: Server markup for <ui-tree-item> has an incompatible root.'),
491
- {
492
- name: 'HtmlDiagnosticError',
493
- diagnostic: Object.freeze({
494
- code: 'HR005',
495
- message: 'Server markup for <ui-tree-item> has an incompatible root.',
496
- }),
497
- },
498
- )
499
- }
405
+ checkHydratedRoot('div', 'ui-tree-item')
500
406
 
501
407
  /** The values the styles' :host-state() rules test. */
502
408
  const hostState = computed(() =>
@@ -583,46 +489,15 @@ useComponentHost(() => import('../components/ui-tree-item/ui-tree-item.js'), {
583
489
  },
584
490
  state: { internalExpanded, structuralLevel, tabStop, isContainer, moving },
585
491
  })
586
-
587
- function text(value: unknown): string {
588
- if (Array.isArray(value)) return value.map(text).join(' ')
589
- return value === null || value === undefined || typeof value === 'object' ? '' : String(value)
590
- }
591
-
592
- function attribute(value: unknown): any {
593
- if (
594
- value === null || value === undefined || value === false
595
- || (typeof value === 'object' && !Array.isArray(value))
596
- ) return undefined
597
- return value === true ? '' : text(value)
598
- }
599
-
600
- // A nonempty scalar call cannot produce the invalid-result sentinel.
601
- type ConcatResult<T extends unknown[]> = T extends
602
- [
603
- string | number | boolean | null | undefined,
604
- ...(string | number | boolean | null | undefined)[],
605
- ] ? string | undefined
606
- : string | symbol | undefined
607
- function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
608
- if (values.some(value => value === Symbol.for('html-next.invalid-result'))) {
609
- return Symbol.for('html-next.invalid-result') as ConcatResult<T>
610
- }
611
- if (values.some(value => value === undefined)) return undefined as ConcatResult<T>
612
- if (values.length === 0 || values.some(value => typeof value === 'object' && value !== null)) {
613
- return Symbol.for('html-next.invalid-result') as ConcatResult<T>
614
- }
615
- return values.map(value => value === null ? '' : String(value)).join('') as ConcatResult<T>
616
- }
617
492
  </script>
618
493
 
619
494
  <template>
620
495
  <div
621
- data-component="ui-tree-item"
496
+ class="ui-tree-item"
622
497
  role="treeitem"
623
498
  v-bind="nativeAttrs($attrs)"
624
499
  :aria-label="checkedProps.label ?? undefined"
625
- :aria-level="guarded"
500
+ :aria-level="structuralLevel"
626
501
  :aria-selected="checkedProps.selected ?? undefined"
627
502
  :aria-disabled="checkedProps.disabled ?? undefined"
628
503
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
@@ -650,7 +525,7 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
650
525
  class="drag-handle"
651
526
  type="button"
652
527
  draggable="true"
653
- :aria-label="guardedBinding"
528
+ :aria-label="guarded"
654
529
  ref="dragHandleElement"
655
530
  >
656
531
  <svg
@@ -675,7 +550,7 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
675
550
  class="disclosure"
676
551
  type="button"
677
552
  :disabled="checkedProps.disabled ?? undefined"
678
- :hidden="guardedBinding2"
553
+ :hidden="!isContainer"
679
554
  ref="disclosureElement"
680
555
  >
681
556
  <span class="disclosure-icon" aria-hidden="true"></span>
@@ -686,7 +561,7 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
686
561
  tabindex="-1"
687
562
  :checked.attr="checkedProps.selected ? true : undefined"
688
563
  :disabled="checkedProps.disabled ?? undefined"
689
- :aria-label="guardedBinding3"
564
+ :aria-label="guardedBinding"
690
565
  ></label>
691
566
  <span class="leading" ref="leadingElement"><slot name="leading" /></span>
692
567
  <span class="label" ref="labelElement"><span class="label-text" ref="labelTextElement"><slot
@@ -694,6 +569,7 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
694
569
  >{{ checkedProps.label }}</slot></span></span>
695
570
  <span class="actions" ref="actionsElement"><UiButton
696
571
  v-if="moving"
572
+ class="ui-button"
697
573
  data-tree-cancel-move=""
698
574
  variant="ghost"
699
575
  tone="neutral"
@@ -703,7 +579,12 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
703
579
  <span><slot name="actions" /></span></span>
704
580
  <span class="drop-indicator row-drop-indicator" aria-hidden="true"></span>
705
581
  </div>
706
- <div class="children" role="group" :hidden="guardedBinding4" ref="childrenElement">
582
+ <div
583
+ class="children"
584
+ role="group"
585
+ :hidden="!(isContainer && internalExpanded)"
586
+ ref="childrenElement"
587
+ >
707
588
  <slot />
708
589
  </div>
709
590
  <span class="drop-indicator subtree-drop-indicator" aria-hidden="true"></span>
@@ -733,320 +614,34 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
733
614
  inherits: false;
734
615
  }
735
616
 
736
- [data-component~="ui-tree-item"] {
737
- /* Hooks do not inherit, so the parts below read them from the root. The tree's density
738
- sets the defaults, in --_ui-default-*. */
739
- --_ui-tree-item-min-block-size: var(
740
- --ui-tree-item-min-block-size,
741
- var(--_ui-default-tree-item-min-block-size)
742
- );
743
- --_ui-tree-item-font-size: var(--ui-tree-item-font-size, var(--_ui-default-tree-item-font-size));
744
- --_ui-tree-item-label-padding-block: var(
745
- --ui-tree-item-label-padding-block,
746
- var(--_ui-default-tree-item-label-padding-block)
747
- );
748
- --_ui-tree-item-label-padding-inline: var(--ui-tree-item-label-padding-inline);
749
-
750
- --_tree-row-min-height: 32px;
751
- --_tree-disclosure-size: 16px;
752
-
753
- position: relative;
754
- display: block;
755
- min-inline-size: 0;
756
- margin-inline-start: calc(var(--_ui-tree-item-indent-step, 0) * var(--_ui-tree-indent, 16px));
757
- }
758
-
759
- .row {
760
- position: relative;
761
- display: grid;
762
- grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
763
- align-items: center;
764
- min-block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
765
- min-inline-size: 0;
766
- font-size: var(--_ui-tree-item-font-size, var(--ui-font-size-sm));
767
- border-radius: var(--ui-selection-radius);
768
- color: var(--ui-text-secondary);
769
- transition:
770
- background-color var(--ui-motion-fast) var(--ui-motion-ease),
771
- color var(--ui-motion-fast) var(--ui-motion-ease),
772
- opacity var(--ui-motion-fast) var(--ui-motion-ease),
773
- box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
774
- min-block-size var(--ui-motion-base) var(--ui-motion-ease);
775
- }
776
-
777
- .row:hover,
778
- .row:focus-within {
779
- color: var(--ui-text-primary);
780
- background: var(--_ui-selection-context-surface, var(--ui-surface-muted));
781
- box-shadow: inset 0 0 0 var(--ui-border-width)
782
- var(--_ui-selection-context-border, var(--ui-selection-border));
783
- }
784
-
785
617
  /* Selection is the same surface recipe as destination and choice rows. */
786
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] > .row {
787
- color: var(--_ui-selection-context-text, var(--ui-selection-text));
788
- background: var(--_ui-selection-context-surface, var(--ui-selection-surface));
789
- box-shadow: inset 0 0 0 var(--ui-border-width)
790
- var(--_ui-selection-context-border, var(--ui-selection-border));
791
- }
792
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"]:not([aria-disabled="true"])
793
- > .row
794
- > .leading {
795
- color: var(--_ui-selection-context-text, var(--ui-selection-text));
796
- }
797
-
798
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row {
799
- color: var(--ui-disabled-text);
800
- background: var(--ui-disabled-surface);
801
- box-shadow: none;
802
- }
803
-
804
- [data-component~="ui-tree-item"][data-dragging]:not([data-move-source]) .row {
805
- opacity: 0.42;
806
- }
807
-
808
- [data-component~="ui-tree-item"][data-move-source] > .row > .label,
809
- [data-component~="ui-tree-item"][data-move-source] > .row > .leading {
810
- opacity: 0.42;
811
- }
812
-
813
- [data-component~="ui-tree-item"]:focus {
814
- outline: none;
815
- }
816
-
817
- [data-component~="ui-tree-item"]:focus-visible .row {
818
- box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
819
- }
820
618
 
821
619
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
822
- [data-component~="ui-tree-item"][data-drop-position="inside"] > .row {
823
- background: var(--ui-accent-subtle);
824
- box-shadow: inset 0 0 0 var(--ui-accent-line-width)
825
- var(--_ui-tree-drop-color, var(--ui-accent-solid));
826
- }
827
-
828
- .disclosure,
829
- .disclosure-spacer {
830
- grid-column: 1;
831
- grid-row: 1;
832
- inline-size: var(--_tree-disclosure-size);
833
- block-size: 28px;
834
- }
835
-
836
- .disclosure {
837
- display: grid;
838
- /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
839
- place-items: center start;
840
- padding: 0;
841
- color: var(--ui-text-muted);
842
- background: transparent;
843
- border: 0;
844
- border-radius: var(--ui-radius-sm);
845
- cursor: pointer;
846
- }
847
-
848
- .disclosure[hidden] {
849
- display: none;
850
- }
851
-
852
- .selection-hit {
853
- display: none;
854
- grid-column: 2;
855
- grid-row: 1;
856
- place-items: center;
857
- inline-size: 1.25rem;
858
- block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
859
- cursor: pointer;
860
- }
861
- .selection-checkbox {
862
- inline-size: 1rem;
863
- block-size: 1rem;
864
- margin: 0;
865
- accent-color: var(--ui-accent-solid);
866
- }
867
-
868
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row {
869
- grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr);
870
- }
871
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .selection-hit {
872
- display: grid;
873
- }
874
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .leading {
875
- grid-column: 3;
876
- }
877
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .label {
878
- grid-column: 4;
879
- }
880
-
881
- .disclosure:hover {
882
- color: var(--ui-text-primary);
883
- background: var(--ui-surface-elevated);
884
- }
885
-
886
- .disclosure-icon {
887
- display: grid;
888
- place-items: center;
889
- inline-size: 12px;
890
- block-size: 12px;
891
- transform: rotate(-90deg);
892
- transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
893
- }
894
-
895
- .disclosure-icon::before {
896
- display: block;
897
- inline-size: 0.375rem;
898
- block-size: 0.375rem;
899
- border-inline-end: 1.5px solid currentColor;
900
- border-block-end: 1.5px solid currentColor;
901
- content: "";
902
- /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
903
- transform: translateY(-20%) rotate(45deg);
904
- }
905
-
906
- [data-component~="ui-tree-item"][aria-expanded="true"] > .row > .disclosure > .disclosure-icon {
907
- transform: rotate(0deg);
908
- }
909
620
 
910
621
  /* Lucide grip-vertical, filling the handle as in Looma 0.2. */
911
- .drag-handle svg {
912
- display: block;
913
- inline-size: 100%;
914
- block-size: 100%;
915
- }
916
622
 
917
623
  /* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
918
- .leading {
919
- display: inline-grid;
920
- place-items: center;
921
- grid-column: 2;
922
- grid-row: 1;
923
- inline-size: 1em;
924
- block-size: 1em;
925
- margin-inline-start: var(--ui-space-1);
926
- color: var(--ui-text-muted);
927
- /* Above the label, so a sliding name passes under the icon. */
928
- position: relative;
929
- z-index: 1;
930
- }
931
-
932
- .leading:empty {
933
- display: none;
934
- }
935
624
 
936
625
  /* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
937
- :slotted(svg),
938
- :slotted(img) {
939
- display: block;
940
- inline-size: 1em;
941
- block-size: 1em;
942
- flex: none;
943
- }
944
626
 
945
627
  /* The label spans the row's height and centres its content, so slotted content (a link) can
946
628
  stretch to fill the row as its own hit area; the padding tokens remove the inset. */
947
- .label {
948
- grid-column: 3;
949
- grid-row: 1;
950
- align-self: stretch;
951
- display: flex;
952
- align-items: center;
953
- min-inline-size: 0;
954
- /* The cell clips: a name longer than the row slides inside it rather than over its icons. */
955
- overflow: hidden;
956
- padding: var(--_ui-tree-item-label-padding-block, var(--ui-space-1))
957
- var(--_ui-tree-item-label-padding-inline, var(--ui-space-2));
958
- /* The length of the fade before the controls. The label's one flex child lays out no gap; this
959
- is where the controller reads the length in pixels to stop a sliding name before the fade. */
960
- column-gap: var(--ui-space-1);
961
- }
962
629
 
963
630
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
964
631
  its own text and reading as overflow. */
965
- .label-text {
966
- display: flex;
967
- align-items: center;
968
- /* Stretches, so slotted content can still be the row's full-height hit area. */
969
- align-self: stretch;
970
- block-size: 100%;
971
- min-inline-size: 0;
972
- inline-size: 100%;
973
- white-space: nowrap;
974
- }
975
-
976
- .label-text > :slotted(*) {
977
- flex: 1 1 auto;
978
- min-inline-size: 0;
979
- }
980
632
 
981
633
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
982
634
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
983
- .row:hover > .label,
984
- .row:focus-within > .label,
985
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="actionsVisible"] > .row > .label,
986
- [data-component~="ui-tree-item"][data-move-source] > .row > .label {
987
- text-overflow: clip;
988
- mask-image: linear-gradient(
989
- to right,
990
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
991
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
992
- );
993
- }
994
-
995
- .row:hover > .label:dir(rtl),
996
- .row:focus-within > .label:dir(rtl),
997
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="actionsVisible"]
998
- > .row
999
- > .label:dir(rtl),
1000
- [data-component~="ui-tree-item"][data-move-source] > .row > .label:dir(rtl) {
1001
- mask-image: linear-gradient(
1002
- to left,
1003
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
1004
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
1005
- );
1006
- }
1007
635
 
1008
636
  /* A hovered row reads its whole name: the label slides far enough to show the end, rests
1009
637
  there, and starts again. Only when it actually overflows — the controller measures by how
1010
638
  much — after the controls have taken their place over its end — and hands over the distance
1011
639
  and a duration from it, so every name moves at the same speed. */
1012
- .row[data-ui-marquee] > .label > .label-text {
1013
- /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
1014
- long enough to read rather than sliding back and forth. */
1015
- animation: ui-tree-item-marquee var(--_marquee-duration) linear 0.5s 1 normal forwards;
1016
- will-change: transform;
1017
- }
1018
640
 
1019
641
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
1020
642
  slides, the label reaches back under the icon (the controller measures how far) with its text
1021
643
  where it was, and fades out across the gap before the icon, fully gone where the icon begins
1022
644
  to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
1023
- .row[data-ui-marquee] > .label {
1024
- margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
1025
- padding-inline-start: calc(
1026
- var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1027
- );
1028
- mask-image: linear-gradient(
1029
- to right,
1030
- transparent var(--_marquee-icon-width, 0px),
1031
- #000 calc(
1032
- var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1033
- ),
1034
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
1035
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
1036
- );
1037
- }
1038
-
1039
- .row[data-ui-marquee] > .label:dir(rtl) {
1040
- mask-image: linear-gradient(
1041
- to left,
1042
- transparent var(--_marquee-icon-width, 0px),
1043
- #000 calc(
1044
- var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1045
- ),
1046
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
1047
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
1048
- );
1049
- }
1050
645
 
1051
646
  @keyframes ui-tree-item-marquee {
1052
647
  from {
@@ -1059,298 +654,561 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
1059
654
  }
1060
655
 
1061
656
  /* Reduced motion keeps the fade, which already says the name continues. */
1062
- @media (prefers-reduced-motion: reduce) {
1063
- .row[data-ui-marquee] > .label > .label-text {
1064
- animation: none;
1065
- }
1066
- }
1067
657
 
1068
- .row:hover > .label > :slotted(*),
1069
- .row:focus-within > .label > :slotted(*) {
1070
- text-overflow: clip;
1071
- }
658
+ /* Without hover there is no reveal, so the controls keep their own column. */
1072
659
 
1073
- .actions {
1074
- position: absolute;
1075
- z-index: 1;
1076
- inset-block: 0;
1077
- inset-inline-end: 0;
1078
- display: inline-flex;
1079
- align-items: center;
1080
- min-inline-size: 0;
1081
- opacity: 0;
1082
- pointer-events: none;
1083
- transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
1084
- }
660
+ /* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
661
+ empty column, right before the icon; a branch's disclosure is there, so its handle sits just
662
+ outside the row. It is bare until pointed at: a resting surface behind it read as a faint
663
+ patch rather than as a control. */
1085
664
 
1086
- .row:hover > .actions,
1087
- .row:focus-within > .actions,
1088
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="actionsVisible"] > .row > .actions,
1089
- [data-component~="ui-tree-item"][data-move-source] > .row > .actions {
1090
- opacity: 1;
1091
- pointer-events: auto;
1092
- }
665
+ /* A component that sets its display still honours the hidden attribute on its root. */
666
+
667
+ @scope (.ui-tree-item) to (.ui-button) {
668
+ :scope:where(:scope) {
669
+ /* Hooks do not inherit, so the parts below read them from the root. The tree's density
670
+ sets the defaults, in --_ui-default-*. */
671
+ --_ui-tree-item-min-block-size: var(
672
+ --ui-tree-item-min-block-size,
673
+ var(--_ui-default-tree-item-min-block-size)
674
+ );
675
+ --_ui-tree-item-font-size: var(
676
+ --ui-tree-item-font-size,
677
+ var(--_ui-default-tree-item-font-size)
678
+ );
679
+ --_ui-tree-item-label-padding-block: var(
680
+ --ui-tree-item-label-padding-block,
681
+ var(--_ui-default-tree-item-label-padding-block)
682
+ );
683
+ --_ui-tree-item-label-padding-inline: var(--ui-tree-item-label-padding-inline);
684
+
685
+ --_tree-row-min-height: 32px;
686
+ --_tree-disclosure-size: 16px;
687
+
688
+ position: relative;
689
+ display: block;
690
+ min-inline-size: 0;
691
+ margin-inline-start: calc(var(--_ui-tree-item-indent-step, 0) * var(--_ui-tree-indent, 16px));
692
+ }
1093
693
 
1094
- /* Without hover there is no reveal, so the controls keep their own column. */
1095
- @media (hover: none), (pointer: coarse) {
1096
694
  .row {
1097
- grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
695
+ position: relative;
696
+ display: grid;
697
+ grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
698
+ align-items: center;
699
+ min-block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
700
+ min-inline-size: 0;
701
+ font-size: var(--_ui-tree-item-font-size, var(--ui-font-size-sm));
702
+ border-radius: var(--ui-selection-radius);
703
+ color: var(--ui-text-secondary);
704
+ transition:
705
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
706
+ color var(--ui-motion-fast) var(--ui-motion-ease),
707
+ opacity var(--ui-motion-fast) var(--ui-motion-ease),
708
+ box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
709
+ min-block-size var(--ui-motion-base) var(--ui-motion-ease);
1098
710
  }
1099
711
 
1100
- .actions {
1101
- position: static;
712
+ .row:hover, .row:focus-within {
713
+ color: var(--ui-text-primary);
714
+ background: var(--_ui-selection-context-surface, var(--ui-surface-muted));
715
+ box-shadow: inset 0 0 0 var(--ui-border-width)
716
+ var(--_ui-selection-context-border, var(--ui-selection-border));
717
+ }
718
+ :scope[data-ui-tree-item-state~="selected"] > .row {
719
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
720
+ background: var(--_ui-selection-context-surface, var(--ui-selection-surface));
721
+ box-shadow: inset 0 0 0 var(--ui-border-width)
722
+ var(--_ui-selection-context-border, var(--ui-selection-border));
723
+ }
724
+ :scope[data-ui-tree-item-state~="selected"]:not([aria-disabled="true"]) > .row > .leading {
725
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
726
+ }
727
+
728
+ :scope[data-ui-tree-item-state~="disabled"] .row {
729
+ color: var(--ui-disabled-text);
730
+ background: var(--ui-disabled-surface);
731
+ box-shadow: none;
732
+ }
733
+
734
+ :scope[data-dragging]:not([data-move-source]) .row {
735
+ opacity: 0.42;
736
+ }
737
+
738
+ :scope[data-move-source] > .row > .label, :scope[data-move-source] > .row > .leading {
739
+ opacity: 0.42;
740
+ }
741
+
742
+ :scope:where(:scope):is(:focus) {
743
+ outline: none;
744
+ }
745
+
746
+ :scope:focus-visible .row {
747
+ box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
748
+ }
749
+ :scope[data-drop-position="inside"] > .row {
750
+ background: var(--ui-accent-subtle);
751
+ box-shadow: inset 0 0 0 var(--ui-accent-line-width)
752
+ var(--_ui-tree-drop-color, var(--ui-accent-solid));
753
+ }
754
+
755
+ .disclosure, .disclosure-spacer {
756
+ grid-column: 1;
757
+ grid-row: 1;
758
+ inline-size: var(--_tree-disclosure-size);
759
+ block-size: 28px;
760
+ }
761
+
762
+ .disclosure {
763
+ display: grid;
764
+ /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
765
+ place-items: center start;
766
+ padding: 0;
767
+ color: var(--ui-text-muted);
768
+ background: transparent;
769
+ border: 0;
770
+ border-radius: var(--ui-radius-sm);
771
+ cursor: pointer;
772
+ }
773
+
774
+ .disclosure[hidden] {
775
+ display: none;
776
+ }
777
+
778
+ .selection-hit {
779
+ display: none;
780
+ grid-column: 2;
781
+ grid-row: 1;
782
+ place-items: center;
783
+ inline-size: 1.25rem;
784
+ block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
785
+ cursor: pointer;
786
+ }
787
+ .selection-checkbox {
788
+ inline-size: 1rem;
789
+ block-size: 1rem;
790
+ margin: 0;
791
+ accent-color: var(--ui-accent-solid);
792
+ }
793
+
794
+ :scope[data-selection-mode="multiple"] > .row {
795
+ grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr);
796
+ }
797
+ :scope[data-selection-mode="multiple"] > .row > .selection-hit {
798
+ display: grid;
799
+ }
800
+ :scope[data-selection-mode="multiple"] > .row > .leading {
801
+ grid-column: 3;
802
+ }
803
+ :scope[data-selection-mode="multiple"] > .row > .label {
1102
804
  grid-column: 4;
805
+ }
806
+
807
+ .disclosure:hover {
808
+ color: var(--ui-text-primary);
809
+ background: var(--ui-surface-elevated);
810
+ }
811
+
812
+ .disclosure-icon {
813
+ display: grid;
814
+ place-items: center;
815
+ inline-size: 12px;
816
+ block-size: 12px;
817
+ transform: rotate(-90deg);
818
+ transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
819
+ }
820
+
821
+ .disclosure-icon::before {
822
+ display: block;
823
+ inline-size: 0.375rem;
824
+ block-size: 0.375rem;
825
+ border-inline-end: 1.5px solid currentColor;
826
+ border-block-end: 1.5px solid currentColor;
827
+ content: "";
828
+ /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
829
+ transform: translateY(-20%) rotate(45deg);
830
+ }
831
+
832
+ :scope[aria-expanded="true"] > .row > .disclosure > .disclosure-icon {
833
+ transform: rotate(0deg);
834
+ }
835
+ .drag-handle svg {
836
+ display: block;
837
+ inline-size: 100%;
838
+ block-size: 100%;
839
+ }
840
+ .leading {
841
+ display: inline-grid;
842
+ place-items: center;
843
+ grid-column: 2;
1103
844
  grid-row: 1;
1104
- padding-inline-start: 0;
1105
- background: none;
1106
- opacity: 1;
1107
- pointer-events: auto;
845
+ inline-size: 1em;
846
+ block-size: 1em;
847
+ margin-inline-start: var(--ui-space-1);
848
+ color: var(--ui-text-muted);
849
+ /* Above the label, so a sliding name passes under the icon. */
850
+ position: relative;
851
+ z-index: 1;
1108
852
  }
1109
853
 
1110
- .row:is(:hover, :focus-within) > .label,
1111
- .row:is(:hover, :focus-within) > .label:dir(rtl),
1112
- [data-component~="ui-tree-item"][data-move-source] > .row > .label,
1113
- [data-component~="ui-tree-item"][data-move-source] > .row > .label:dir(rtl) {
1114
- mask-image: none;
854
+ .leading:empty {
855
+ display: none;
856
+ }
857
+ :slotted(svg), :slotted(img) {
858
+ display: block;
859
+ inline-size: 1em;
860
+ block-size: 1em;
861
+ flex: none;
862
+ }
863
+ .label {
864
+ grid-column: 3;
865
+ grid-row: 1;
866
+ align-self: stretch;
867
+ display: flex;
868
+ align-items: center;
869
+ min-inline-size: 0;
870
+ /* The cell clips: a name longer than the row slides inside it rather than over its icons. */
871
+ overflow: hidden;
872
+ padding: var(--_ui-tree-item-label-padding-block, var(--ui-space-1))
873
+ var(--_ui-tree-item-label-padding-inline, var(--ui-space-2));
874
+ /* The length of the fade before the controls. The label's one flex child lays out no gap; this
875
+ is where the controller reads the length in pixels to stop a sliding name before the fade. */
876
+ column-gap: var(--ui-space-1);
877
+ }
878
+ .label-text {
879
+ display: flex;
880
+ align-items: center;
881
+ /* Stretches, so slotted content can still be the row's full-height hit area. */
882
+ align-self: stretch;
883
+ block-size: 100%;
884
+ min-inline-size: 0;
885
+ inline-size: 100%;
886
+ white-space: nowrap;
887
+ }
888
+
889
+ .label-text > :slotted(*) {
890
+ flex: 1 1 auto;
891
+ min-inline-size: 0;
892
+ }
893
+ .row:hover > .label,
894
+ .row:focus-within > .label,
895
+ :scope[data-ui-tree-item-state~="actionsVisible"] > .row > .label,
896
+ :scope[data-move-source] > .row > .label {
897
+ text-overflow: clip;
898
+ mask-image: linear-gradient(
899
+ to right,
900
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
901
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
902
+ );
1115
903
  }
1116
904
 
905
+ .row:hover > .label:dir(rtl),
906
+ .row:focus-within > .label:dir(rtl),
907
+ :scope[data-ui-tree-item-state~="actionsVisible"] > .row > .label:dir(rtl),
908
+ :scope[data-move-source] > .row > .label:dir(rtl) {
909
+ mask-image: linear-gradient(
910
+ to left,
911
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
912
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
913
+ );
914
+ }
915
+ .row[data-ui-marquee] > .label > .label-text {
916
+ /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
917
+ long enough to read rather than sliding back and forth. */
918
+ animation: ui-tree-item-marquee var(--_marquee-duration) linear 0.5s 1 normal forwards;
919
+ will-change: transform;
920
+ }
1117
921
  .row[data-ui-marquee] > .label {
922
+ margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
923
+ padding-inline-start: calc(
924
+ var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
925
+ );
1118
926
  mask-image: linear-gradient(
1119
927
  to right,
1120
928
  transparent var(--_marquee-icon-width, 0px),
1121
929
  #000 calc(
1122
930
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1123
- )
931
+ ),
932
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
933
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
1124
934
  );
1125
935
  }
1126
936
 
1127
- /* Persistent content has its own column on touch. Fade only the label's end. */
1128
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="actionsVisible"] > .row > .label {
1129
- mask-image: linear-gradient(to right, #000 calc(100% - var(--ui-space-1)), transparent 100%);
1130
- }
1131
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="actionsVisible"]
1132
- > .row
1133
- > .label:dir(rtl) {
1134
- mask-image: linear-gradient(to left, #000 calc(100% - var(--ui-space-1)), transparent 100%);
1135
- }
1136
-
1137
937
  .row[data-ui-marquee] > .label:dir(rtl) {
1138
938
  mask-image: linear-gradient(
1139
939
  to left,
1140
940
  transparent var(--_marquee-icon-width, 0px),
1141
941
  #000 calc(
1142
942
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1143
- )
943
+ ),
944
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
945
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
1144
946
  );
1145
947
  }
1146
-
1147
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row {
1148
- grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr) auto;
948
+ @media (prefers-reduced-motion: reduce) {
949
+ .row[data-ui-marquee] > .label > .label-text {
950
+ animation: none;
951
+ }
1149
952
  }
1150
953
 
1151
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .actions {
1152
- grid-column: 5;
954
+ .row:hover > .label > :slotted(*), .row:focus-within > .label > :slotted(*) {
955
+ text-overflow: clip;
1153
956
  }
1154
- }
1155
-
1156
- /* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
1157
- empty column, right before the icon; a branch's disclosure is there, so its handle sits just
1158
- outside the row. It is bare until pointed at: a resting surface behind it read as a faint
1159
- patch rather than as a control. */
1160
- .drag-handle {
1161
- position: absolute;
1162
- z-index: 2;
1163
- inset-block-start: 50%;
1164
- inset-inline-start: 0;
1165
- inline-size: var(--_tree-disclosure-size);
1166
- block-size: 24px;
1167
- display: grid;
1168
- place-items: center;
1169
- padding: 5px 2px;
1170
- color: var(--ui-text-muted);
1171
- background: transparent;
1172
- border: 0;
1173
- border-radius: var(--ui-radius-sm);
1174
- cursor: grab;
1175
- /* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
1176
- the pointer onto it must not hide it on the way. */
1177
- opacity: 0;
1178
- transform: translateY(-50%);
1179
- transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
1180
- }
1181
957
 
1182
- .row:hover .drag-handle,
1183
- .drag-handle:hover,
1184
- .drag-handle:focus-visible,
1185
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle {
1186
- opacity: 1;
1187
- }
1188
-
1189
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle {
1190
- inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
1191
- }
1192
-
1193
- .drag-handle:hover,
1194
- .drag-handle:focus-visible {
1195
- color: var(--ui-text-primary);
1196
- background: var(--ui-surface-hover);
1197
- }
1198
-
1199
- .drag-handle:active {
1200
- cursor: grabbing;
1201
- }
958
+ .actions {
959
+ position: absolute;
960
+ z-index: 1;
961
+ inset-block: 0;
962
+ inset-inline-end: 0;
963
+ display: inline-flex;
964
+ align-items: center;
965
+ min-inline-size: 0;
966
+ opacity: 0;
967
+ pointer-events: none;
968
+ transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
969
+ }
1202
970
 
1203
- .drop-indicator {
1204
- position: absolute;
1205
- z-index: 3;
1206
- inset-inline: 1px;
1207
- display: none;
1208
- block-size: var(--ui-accent-line-width);
1209
- border-radius: var(--ui-radius-round);
1210
- background: var(--_ui-tree-drop-color, var(--ui-accent-solid));
1211
- pointer-events: none;
1212
- }
971
+ .row:hover > .actions,
972
+ .row:focus-within > .actions,
973
+ :scope[data-ui-tree-item-state~="actionsVisible"] > .row > .actions,
974
+ :scope[data-move-source] > .row > .actions {
975
+ opacity: 1;
976
+ pointer-events: auto;
977
+ }
978
+ @media (hover: none), (pointer: coarse) {
979
+ .row {
980
+ grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
981
+ }
982
+
983
+ .actions {
984
+ position: static;
985
+ grid-column: 4;
986
+ grid-row: 1;
987
+ padding-inline-start: 0;
988
+ background: none;
989
+ opacity: 1;
990
+ pointer-events: auto;
991
+ }
992
+
993
+ .row:is(:hover, :focus-within) > .label,
994
+ .row:is(:hover, :focus-within) > .label:dir(rtl),
995
+ :scope[data-move-source] > .row > .label,
996
+ :scope[data-move-source] > .row > .label:dir(rtl) {
997
+ mask-image: none;
998
+ }
999
+
1000
+ .row[data-ui-marquee] > .label {
1001
+ mask-image: linear-gradient(
1002
+ to right,
1003
+ transparent var(--_marquee-icon-width, 0px),
1004
+ #000 calc(
1005
+ var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1006
+ )
1007
+ );
1008
+ }
1009
+
1010
+ /* Persistent content has its own column on touch. Fade only the label's end. */
1011
+ :scope[data-ui-tree-item-state~="actionsVisible"] > .row > .label {
1012
+ mask-image: linear-gradient(to right, #000 calc(100% - var(--ui-space-1)), transparent 100%);
1013
+ }
1014
+ :scope[data-ui-tree-item-state~="actionsVisible"] > .row > .label:dir(rtl) {
1015
+ mask-image: linear-gradient(to left, #000 calc(100% - var(--ui-space-1)), transparent 100%);
1016
+ }
1017
+
1018
+ .row[data-ui-marquee] > .label:dir(rtl) {
1019
+ mask-image: linear-gradient(
1020
+ to left,
1021
+ transparent var(--_marquee-icon-width, 0px),
1022
+ #000 calc(
1023
+ var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
1024
+ )
1025
+ );
1026
+ }
1027
+
1028
+ :scope[data-selection-mode="multiple"] > .row {
1029
+ grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr) auto;
1030
+ }
1031
+
1032
+ :scope[data-selection-mode="multiple"] > .row > .actions {
1033
+ grid-column: 5;
1034
+ }
1035
+ }
1036
+ .drag-handle {
1037
+ position: absolute;
1038
+ z-index: 2;
1039
+ inset-block-start: 50%;
1040
+ inset-inline-start: 0;
1041
+ inline-size: var(--_tree-disclosure-size);
1042
+ block-size: 24px;
1043
+ display: grid;
1044
+ place-items: center;
1045
+ padding: 5px 2px;
1046
+ color: var(--ui-text-muted);
1047
+ background: transparent;
1048
+ border: 0;
1049
+ border-radius: var(--ui-radius-sm);
1050
+ cursor: grab;
1051
+ /* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
1052
+ the pointer onto it must not hide it on the way. */
1053
+ opacity: 0;
1054
+ transform: translateY(-50%);
1055
+ transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
1056
+ }
1213
1057
 
1214
- .drop-indicator::before,
1215
- .drop-indicator::after {
1216
- content: "";
1217
- position: absolute;
1218
- inset-block-start: 50%;
1219
- inline-size: 7px;
1220
- block-size: 7px;
1221
- border: var(--ui-accent-line-width) solid var(--_ui-tree-drop-color, var(--ui-accent-solid));
1222
- border-radius: var(--ui-radius-round);
1223
- background: var(--ui-surface-elevated);
1224
- transform: translateY(-50%);
1225
- }
1058
+ .row:hover .drag-handle,
1059
+ .drag-handle:hover,
1060
+ .drag-handle:focus-visible,
1061
+ :scope[data-dragging] > .row > .drag-handle {
1062
+ opacity: 1;
1063
+ }
1226
1064
 
1227
- .drop-indicator::before {
1228
- inset-inline-start: -1px;
1229
- }
1230
- .drop-indicator::after {
1231
- inset-inline-end: -1px;
1232
- }
1065
+ :scope[data-ui-tree-item-state~="isContainer"] > .row > .drag-handle {
1066
+ inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
1067
+ }
1233
1068
 
1234
- [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator {
1235
- display: block;
1236
- inset-block-start: calc(-0.5 * var(--ui-accent-line-width));
1237
- }
1069
+ .drag-handle:hover, .drag-handle:focus-visible {
1070
+ color: var(--ui-text-primary);
1071
+ background: var(--ui-surface-hover);
1072
+ }
1238
1073
 
1239
- [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator {
1240
- display: block;
1241
- inset-block-end: calc(-0.5 * var(--ui-accent-line-width));
1242
- }
1074
+ .drag-handle:active {
1075
+ cursor: grabbing;
1076
+ }
1243
1077
 
1244
- .children[hidden] {
1245
- display: none;
1246
- }
1078
+ .drop-indicator {
1079
+ position: absolute;
1080
+ z-index: 3;
1081
+ inset-inline: 1px;
1082
+ display: none;
1083
+ block-size: var(--ui-accent-line-width);
1084
+ border-radius: var(--ui-radius-round);
1085
+ background: var(--_ui-tree-drop-color, var(--ui-accent-solid));
1086
+ pointer-events: none;
1087
+ }
1247
1088
 
1248
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] {
1249
- --_tree-row-min-height: 44px;
1250
- }
1089
+ .drop-indicator::before, .drop-indicator::after {
1090
+ content: "";
1091
+ position: absolute;
1092
+ inset-block-start: 50%;
1093
+ inline-size: 7px;
1094
+ block-size: 7px;
1095
+ border: var(--ui-accent-line-width) solid var(--_ui-tree-drop-color, var(--ui-accent-solid));
1096
+ border-radius: var(--ui-radius-round);
1097
+ background: var(--ui-surface-elevated);
1098
+ transform: translateY(-50%);
1099
+ }
1251
1100
 
1252
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row {
1253
- grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr);
1254
- }
1101
+ .drop-indicator::before {
1102
+ inset-inline-start: -1px;
1103
+ }
1104
+ .drop-indicator::after {
1105
+ inset-inline-end: -1px;
1106
+ }
1255
1107
 
1256
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle,
1257
- html[data-ui-input-modality="touch"]
1258
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"]
1259
- > .row
1260
- > .drag-handle {
1261
- position: relative;
1262
- grid-column: 1;
1263
- grid-row: 1;
1264
- inset: auto;
1265
- inline-size: 44px;
1266
- block-size: 44px;
1267
- padding: 14px;
1268
- opacity: 1;
1269
- transform: none;
1270
- cursor: pointer;
1271
- }
1108
+ :scope[data-drop-position="before"] > .row > .row-drop-indicator {
1109
+ display: block;
1110
+ inset-block-start: calc(-0.5 * var(--ui-accent-line-width));
1111
+ }
1272
1112
 
1273
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .disclosure {
1274
- grid-column: 2;
1275
- }
1276
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .leading {
1277
- grid-column: 3;
1278
- }
1279
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .label {
1280
- grid-column: 4;
1281
- }
1113
+ :scope[data-drop-position="after"] > .subtree-drop-indicator {
1114
+ display: block;
1115
+ inset-block-end: calc(-0.5 * var(--ui-accent-line-width));
1116
+ }
1282
1117
 
1283
- html[data-ui-input-modality="touch"]
1284
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1285
- > .row {
1286
- grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr);
1287
- }
1288
- html[data-ui-input-modality="touch"]
1289
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1290
- > .row
1291
- > .selection-hit {
1292
- grid-column: 3;
1293
- inline-size: 44px;
1294
- block-size: 44px;
1295
- }
1296
- html[data-ui-input-modality="touch"]
1297
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1298
- > .row
1299
- > .leading {
1300
- grid-column: 4;
1301
- }
1302
- html[data-ui-input-modality="touch"]
1303
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1304
- > .row
1305
- > .label {
1306
- grid-column: 5;
1307
- }
1118
+ .children[hidden] {
1119
+ display: none;
1120
+ }
1308
1121
 
1309
- @media (hover: none), (pointer: coarse) {
1310
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row {
1311
- grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
1122
+ :scope:where(:scope):is(html[data-ui-input-modality="touch"] *) {
1123
+ --_tree-row-min-height: 44px;
1312
1124
  }
1313
1125
 
1314
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .actions {
1315
- grid-column: 5;
1126
+ html[data-ui-input-modality="touch"] :scope .row {
1127
+ grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr);
1316
1128
  }
1317
1129
 
1130
+ html[data-ui-input-modality="touch"] :scope .drag-handle,
1318
1131
  html[data-ui-input-modality="touch"]
1319
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1320
- > .row {
1321
- grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr) auto;
1132
+ :scope[data-ui-tree-item-state~="isContainer"]
1133
+ > .row
1134
+ > .drag-handle {
1135
+ position: relative;
1136
+ grid-column: 1;
1137
+ grid-row: 1;
1138
+ inset: auto;
1139
+ inline-size: 44px;
1140
+ block-size: 44px;
1141
+ padding: 14px;
1142
+ opacity: 1;
1143
+ transform: none;
1144
+ cursor: pointer;
1322
1145
  }
1323
1146
 
1147
+ html[data-ui-input-modality="touch"] :scope .disclosure {
1148
+ grid-column: 2;
1149
+ }
1150
+ html[data-ui-input-modality="touch"] :scope .leading {
1151
+ grid-column: 3;
1152
+ }
1153
+ html[data-ui-input-modality="touch"] :scope .label {
1154
+ grid-column: 4;
1155
+ }
1156
+
1157
+ html[data-ui-input-modality="touch"] :scope[data-selection-mode="multiple"] > .row {
1158
+ grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr);
1159
+ }
1324
1160
  html[data-ui-input-modality="touch"]
1325
- [data-component~="ui-tree-item"][data-selection-mode="multiple"]
1161
+ :scope[data-selection-mode="multiple"]
1326
1162
  > .row
1327
- > .actions {
1328
- grid-column: 6;
1163
+ > .selection-hit {
1164
+ grid-column: 3;
1165
+ inline-size: 44px;
1166
+ block-size: 44px;
1329
1167
  }
1330
- }
1331
-
1332
- @media (prefers-reduced-motion: reduce) {
1333
- .row,
1334
- .disclosure-icon,
1335
- .drag-handle {
1336
- transition: none;
1168
+ html[data-ui-input-modality="touch"] :scope[data-selection-mode="multiple"] > .row > .leading {
1169
+ grid-column: 4;
1337
1170
  }
1338
- }
1171
+ html[data-ui-input-modality="touch"] :scope[data-selection-mode="multiple"] > .row > .label {
1172
+ grid-column: 5;
1173
+ }
1174
+
1175
+ @media (hover: none), (pointer: coarse) {
1176
+ html[data-ui-input-modality="touch"] :scope .row {
1177
+ grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
1178
+ }
1339
1179
 
1340
- @media (forced-colors: active) {
1341
- [data-component~="ui-tree-item"]:focus-visible > .row {
1342
- outline: var(--ui-focus-width) solid Highlight;
1343
- outline-offset: calc(-1 * var(--ui-focus-width));
1180
+ html[data-ui-input-modality="touch"] :scope .actions {
1181
+ grid-column: 5;
1182
+ }
1183
+
1184
+ html[data-ui-input-modality="touch"] :scope[data-selection-mode="multiple"] > .row {
1185
+ grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr) auto;
1186
+ }
1187
+
1188
+ html[data-ui-input-modality="touch"] :scope[data-selection-mode="multiple"] > .row > .actions {
1189
+ grid-column: 6;
1190
+ }
1344
1191
  }
1345
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"]:not(:focus-visible):not([aria-disabled="true"])
1346
- > .row {
1347
- outline: var(--ui-border-width) solid Highlight;
1348
- outline-offset: calc(-1 * var(--ui-border-width));
1192
+
1193
+ @media (prefers-reduced-motion: reduce) {
1194
+ .row, .disclosure-icon, .drag-handle {
1195
+ transition: none;
1196
+ }
1349
1197
  }
1350
- }
1351
1198
 
1352
- /* A component that sets its display still honours the hidden attribute on its root. */
1353
- [data-component~="ui-tree-item"][hidden] {
1354
- display: none;
1199
+ @media (forced-colors: active) {
1200
+ :scope:focus-visible > .row {
1201
+ outline: var(--ui-focus-width) solid Highlight;
1202
+ outline-offset: calc(-1 * var(--ui-focus-width));
1203
+ }
1204
+ :scope[data-ui-tree-item-state~="selected"]:not(:focus-visible):not([aria-disabled="true"])
1205
+ > .row {
1206
+ outline: var(--ui-border-width) solid Highlight;
1207
+ outline-offset: calc(-1 * var(--ui-border-width));
1208
+ }
1209
+ }
1210
+ :scope:where(:scope):is([hidden]) {
1211
+ display: none;
1212
+ }
1355
1213
  }
1356
1214
  </style>