@threadlabs/looma 0.5.1 → 0.6.0-rc.1

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 (341) hide show
  1. package/README.md +1 -1
  2. package/components/shared/overlay.js +3 -0
  3. package/components/ui-button/ui-button.html +27 -14
  4. package/components/ui-callout/ui-callout.html +1 -1
  5. package/components/ui-checkbox/ui-checkbox.html +1 -1
  6. package/components/ui-cluster/ui-cluster.html +6 -6
  7. package/components/ui-combobox/ui-combobox.html +35 -27
  8. package/components/ui-container/ui-container.html +4 -4
  9. package/components/ui-context-menu/ui-context-menu.html +2 -2
  10. package/components/ui-dialog/ui-dialog.html +21 -8
  11. package/components/ui-disclosure/ui-disclosure.html +19 -4
  12. package/components/ui-editable/ui-editable.html +6 -6
  13. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +21 -21
  14. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +26 -26
  15. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +39 -39
  16. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +26 -22
  17. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +68 -52
  18. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +42 -38
  19. package/components/ui-editor-toolbar/ui-editor-toolbar.html +9 -9
  20. package/components/ui-floating-action-button/ui-floating-action-button.html +16 -22
  21. package/components/ui-form-field/ui-form-field.html +18 -7
  22. package/components/ui-grid/ui-grid.html +6 -6
  23. package/components/ui-icon/ui-icon.html +5 -1
  24. package/components/ui-icon-button/ui-icon-button.html +68 -34
  25. package/components/ui-input/ui-input.html +2 -2
  26. package/components/ui-menu/ui-menu.html +15 -4
  27. package/components/ui-menu-item/ui-menu-item.html +5 -5
  28. package/components/ui-popover/ui-popover.html +3 -3
  29. package/components/ui-popover/ui-popover.js +10 -2
  30. package/components/ui-reel/ui-reel.html +6 -6
  31. package/components/ui-search-result-row/ui-search-result-row.html +9 -9
  32. package/components/ui-search-shell/ui-search-shell.html +10 -3
  33. package/components/ui-search-shell/ui-search-shell.js +9 -0
  34. package/components/ui-select/ui-select.html +2 -2
  35. package/components/ui-sidebar/ui-sidebar.html +11 -11
  36. package/components/ui-stack/ui-stack.html +6 -6
  37. package/components/ui-switcher/ui-switcher.html +6 -6
  38. package/components/ui-tabs/ui-tabs.html +19 -5
  39. package/components/ui-textarea/ui-textarea.html +2 -2
  40. package/components/ui-toast-region/ui-toast-region.html +3 -3
  41. package/components/ui-tooltip/ui-tooltip.html +1 -1
  42. package/components/ui-top-bar/ui-top-bar.html +5 -5
  43. package/components/ui-tree/ui-tree.html +7 -0
  44. package/components/ui-tree-item/ui-tree-item.html +20 -7
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +2 -2
  47. package/package.json +2 -2
  48. package/styles/ui-affordance-scope.css +1 -1
  49. package/styles/ui-avatar-group.css +1 -1
  50. package/styles/ui-avatar.css +1 -1
  51. package/styles/ui-badge.css +1 -1
  52. package/styles/ui-button.css +25 -15
  53. package/styles/ui-callout.css +2 -2
  54. package/styles/ui-checkbox.css +2 -2
  55. package/styles/ui-cluster.css +7 -7
  56. package/styles/ui-combobox.css +24 -24
  57. package/styles/ui-container.css +5 -5
  58. package/styles/ui-context-menu.css +3 -3
  59. package/styles/ui-dialog.css +26 -9
  60. package/styles/ui-disclosure.css +23 -7
  61. package/styles/ui-editable.css +7 -7
  62. package/styles/ui-editor-insert-table-grid.css +21 -21
  63. package/styles/ui-editor-mention-menu.css +26 -26
  64. package/styles/ui-editor-slash-menu.css +40 -40
  65. package/styles/ui-editor-table-context-menu.css +21 -21
  66. package/styles/ui-editor-table-overlay.css +49 -49
  67. package/styles/ui-editor-table-toolbar.css +35 -35
  68. package/styles/ui-editor-toolbar.css +10 -10
  69. package/styles/ui-floating-action-button.css +17 -23
  70. package/styles/ui-form-field.css +24 -10
  71. package/styles/ui-grid.css +7 -7
  72. package/styles/ui-icon-button.css +74 -35
  73. package/styles/ui-icon.css +1 -1
  74. package/styles/ui-input.css +3 -3
  75. package/styles/ui-menu-item.css +6 -6
  76. package/styles/ui-menu.css +19 -7
  77. package/styles/ui-popover.css +4 -4
  78. package/styles/ui-radio-group.css +1 -1
  79. package/styles/ui-radio.css +1 -1
  80. package/styles/ui-reel.css +7 -7
  81. package/styles/ui-search-result-row.css +10 -10
  82. package/styles/ui-search-shell.css +14 -5
  83. package/styles/ui-select.css +3 -3
  84. package/styles/ui-separator.css +1 -1
  85. package/styles/ui-sidebar.css +12 -12
  86. package/styles/ui-stack.css +7 -7
  87. package/styles/ui-switch.css +1 -1
  88. package/styles/ui-switcher.css +7 -7
  89. package/styles/ui-tabs.css +21 -7
  90. package/styles/ui-textarea.css +3 -3
  91. package/styles/ui-toast-region.css +3 -3
  92. package/styles/ui-tooltip.css +2 -2
  93. package/styles/ui-top-bar.css +6 -6
  94. package/styles/ui-tree-item.css +30 -9
  95. package/styles/ui-tree.css +8 -2
  96. package/theme-dark.css +42 -103
  97. package/theme-high-contrast.css +18 -22
  98. package/theme-light.css +15 -41
  99. package/tokens.css +149 -201
  100. package/vanilla/UiAffordanceScope.d.ts +1 -1
  101. package/vanilla/UiAffordanceScope.js +2 -2
  102. package/vanilla/UiAvatar.d.ts +1 -1
  103. package/vanilla/UiAvatar.js +2 -2
  104. package/vanilla/UiAvatarGroup.d.ts +1 -1
  105. package/vanilla/UiAvatarGroup.js +2 -2
  106. package/vanilla/UiBadge.d.ts +1 -1
  107. package/vanilla/UiBadge.js +2 -2
  108. package/vanilla/UiButton.d.ts +3 -1
  109. package/vanilla/UiButton.js +3 -3
  110. package/vanilla/UiCallout.d.ts +1 -1
  111. package/vanilla/UiCallout.js +2 -2
  112. package/vanilla/UiCheckbox.d.ts +1 -1
  113. package/vanilla/UiCheckbox.js +2 -2
  114. package/vanilla/UiCluster.d.ts +1 -1
  115. package/vanilla/UiCluster.js +2 -2
  116. package/vanilla/UiCombobox.d.ts +1 -1
  117. package/vanilla/UiCombobox.js +3 -3
  118. package/vanilla/UiContainer.d.ts +1 -1
  119. package/vanilla/UiContainer.js +2 -2
  120. package/vanilla/UiContextMenu.d.ts +1 -1
  121. package/vanilla/UiContextMenu.js +2 -2
  122. package/vanilla/UiDialog.d.ts +1 -1
  123. package/vanilla/UiDialog.js +2 -2
  124. package/vanilla/UiDisclosure.d.ts +2 -1
  125. package/vanilla/UiDisclosure.js +3 -3
  126. package/vanilla/UiEditable.d.ts +1 -1
  127. package/vanilla/UiEditable.js +2 -2
  128. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  129. package/vanilla/UiEditorInsertTableGrid.js +3 -3
  130. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  131. package/vanilla/UiEditorMentionMenu.js +3 -3
  132. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  133. package/vanilla/UiEditorSlashMenu.js +2 -2
  134. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  135. package/vanilla/UiEditorTableContextMenu.js +3 -3
  136. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  137. package/vanilla/UiEditorTableOverlay.js +3 -3
  138. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  139. package/vanilla/UiEditorTableToolbar.js +3 -3
  140. package/vanilla/UiEditorToolbar.d.ts +1 -1
  141. package/vanilla/UiEditorToolbar.js +2 -2
  142. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  143. package/vanilla/UiFloatingActionButton.js +2 -2
  144. package/vanilla/UiFormField.d.ts +1 -1
  145. package/vanilla/UiFormField.js +15 -6
  146. package/vanilla/UiGrid.d.ts +1 -1
  147. package/vanilla/UiGrid.js +2 -2
  148. package/vanilla/UiIcon.d.ts +1 -1
  149. package/vanilla/UiIcon.js +3 -3
  150. package/vanilla/UiIconButton.d.ts +1 -1
  151. package/vanilla/UiIconButton.js +2 -2
  152. package/vanilla/UiInput.d.ts +1 -1
  153. package/vanilla/UiInput.js +2 -2
  154. package/vanilla/UiMenu.d.ts +2 -1
  155. package/vanilla/UiMenu.js +3 -3
  156. package/vanilla/UiMenuItem.d.ts +1 -1
  157. package/vanilla/UiMenuItem.js +2 -2
  158. package/vanilla/UiPopover.d.ts +1 -1
  159. package/vanilla/UiPopover.js +2 -2
  160. package/vanilla/UiRadio.d.ts +1 -1
  161. package/vanilla/UiRadio.js +2 -2
  162. package/vanilla/UiRadioGroup.d.ts +1 -1
  163. package/vanilla/UiRadioGroup.js +2 -2
  164. package/vanilla/UiReel.d.ts +1 -1
  165. package/vanilla/UiReel.js +2 -2
  166. package/vanilla/UiSearchResultRow.d.ts +1 -1
  167. package/vanilla/UiSearchResultRow.js +2 -2
  168. package/vanilla/UiSearchShell.d.ts +1 -1
  169. package/vanilla/UiSearchShell.js +2 -2
  170. package/vanilla/UiSelect.d.ts +1 -1
  171. package/vanilla/UiSelect.js +2 -2
  172. package/vanilla/UiSeparator.d.ts +1 -1
  173. package/vanilla/UiSeparator.js +2 -2
  174. package/vanilla/UiSidebar.d.ts +1 -1
  175. package/vanilla/UiSidebar.js +2 -2
  176. package/vanilla/UiStack.d.ts +1 -1
  177. package/vanilla/UiStack.js +2 -2
  178. package/vanilla/UiSwitch.d.ts +1 -1
  179. package/vanilla/UiSwitch.js +2 -2
  180. package/vanilla/UiSwitcher.d.ts +1 -1
  181. package/vanilla/UiSwitcher.js +2 -2
  182. package/vanilla/UiTabs.d.ts +2 -1
  183. package/vanilla/UiTabs.js +3 -3
  184. package/vanilla/UiTextarea.d.ts +1 -1
  185. package/vanilla/UiTextarea.js +2 -2
  186. package/vanilla/UiToastRegion.d.ts +1 -1
  187. package/vanilla/UiToastRegion.js +3 -3
  188. package/vanilla/UiTooltip.d.ts +1 -1
  189. package/vanilla/UiTooltip.js +2 -2
  190. package/vanilla/UiTopBar.d.ts +1 -1
  191. package/vanilla/UiTopBar.js +1 -1
  192. package/vanilla/UiTree.d.ts +2 -1
  193. package/vanilla/UiTree.js +3 -3
  194. package/vanilla/UiTreeItem.d.ts +1 -1
  195. package/vanilla/UiTreeItem.js +2 -2
  196. package/vue/UiAffordanceScope.d.ts +2 -2
  197. package/vue/UiAffordanceScope.vue +92 -73
  198. package/vue/UiAvatar.d.ts +7 -7
  199. package/vue/UiAvatar.vue +145 -105
  200. package/vue/UiAvatarGroup.d.ts +4 -4
  201. package/vue/UiAvatarGroup.vue +134 -118
  202. package/vue/UiBadge.d.ts +4 -4
  203. package/vue/UiBadge.vue +113 -114
  204. package/vue/UiButton.d.ts +10 -6
  205. package/vue/UiButton.vue +295 -248
  206. package/vue/UiCallout.d.ts +2 -2
  207. package/vue/UiCallout.vue +154 -87
  208. package/vue/UiCheckbox.d.ts +14 -10
  209. package/vue/UiCheckbox.vue +228 -162
  210. package/vue/UiCluster.d.ts +2 -2
  211. package/vue/UiCluster.vue +53 -60
  212. package/vue/UiCombobox.d.ts +36 -32
  213. package/vue/UiCombobox.vue +1005 -416
  214. package/vue/UiContainer.d.ts +2 -2
  215. package/vue/UiContainer.vue +48 -51
  216. package/vue/UiContextMenu.d.ts +6 -4
  217. package/vue/UiContextMenu.vue +205 -116
  218. package/vue/UiDialog.d.ts +11 -9
  219. package/vue/UiDialog.vue +287 -212
  220. package/vue/UiDisclosure.d.ts +10 -6
  221. package/vue/UiDisclosure.vue +265 -159
  222. package/vue/UiEditable.d.ts +16 -12
  223. package/vue/UiEditable.vue +325 -205
  224. package/vue/UiEditorInsertTableGrid.d.ts +8 -8
  225. package/vue/UiEditorInsertTableGrid.vue +216 -157
  226. package/vue/UiEditorMentionMenu.d.ts +9 -9
  227. package/vue/UiEditorMentionMenu.vue +265 -222
  228. package/vue/UiEditorSlashMenu.d.ts +7 -7
  229. package/vue/UiEditorSlashMenu.vue +286 -240
  230. package/vue/UiEditorTableContextMenu.d.ts +5 -5
  231. package/vue/UiEditorTableContextMenu.vue +306 -193
  232. package/vue/UiEditorTableOverlay.d.ts +2 -2
  233. package/vue/UiEditorTableOverlay.vue +600 -369
  234. package/vue/UiEditorTableToolbar.d.ts +7 -7
  235. package/vue/UiEditorTableToolbar.vue +443 -268
  236. package/vue/UiEditorToolbar.d.ts +2 -2
  237. package/vue/UiEditorToolbar.vue +134 -121
  238. package/vue/UiFloatingActionButton.d.ts +6 -6
  239. package/vue/UiFloatingActionButton.vue +95 -99
  240. package/vue/UiFormField.d.ts +6 -6
  241. package/vue/UiFormField.vue +112 -80
  242. package/vue/UiGrid.d.ts +2 -2
  243. package/vue/UiGrid.vue +51 -57
  244. package/vue/UiIcon.d.ts +2 -2
  245. package/vue/UiIcon.vue +118 -89
  246. package/vue/UiIconButton.d.ts +11 -11
  247. package/vue/UiIconButton.vue +287 -217
  248. package/vue/UiInput.d.ts +9 -9
  249. package/vue/UiInput.vue +153 -127
  250. package/vue/UiMenu.d.ts +10 -6
  251. package/vue/UiMenu.vue +227 -143
  252. package/vue/UiMenuItem.d.ts +4 -4
  253. package/vue/UiMenuItem.vue +53 -46
  254. package/vue/UiPopover.d.ts +8 -6
  255. package/vue/UiPopover.vue +197 -137
  256. package/vue/UiRadio.d.ts +14 -10
  257. package/vue/UiRadio.vue +183 -117
  258. package/vue/UiRadioGroup.d.ts +14 -12
  259. package/vue/UiRadioGroup.vue +172 -111
  260. package/vue/UiReel.d.ts +3 -3
  261. package/vue/UiReel.vue +77 -77
  262. package/vue/UiSearchResultRow.d.ts +4 -4
  263. package/vue/UiSearchResultRow.vue +121 -115
  264. package/vue/UiSearchShell.d.ts +10 -8
  265. package/vue/UiSearchShell.vue +245 -176
  266. package/vue/UiSelect.d.ts +9 -9
  267. package/vue/UiSelect.vue +162 -134
  268. package/vue/UiSeparator.d.ts +2 -2
  269. package/vue/UiSeparator.vue +22 -27
  270. package/vue/UiSidebar.d.ts +20 -18
  271. package/vue/UiSidebar.vue +307 -224
  272. package/vue/UiStack.d.ts +3 -3
  273. package/vue/UiStack.vue +64 -70
  274. package/vue/UiSwitch.d.ts +12 -8
  275. package/vue/UiSwitch.vue +218 -150
  276. package/vue/UiSwitcher.d.ts +3 -3
  277. package/vue/UiSwitcher.vue +73 -75
  278. package/vue/UiTabs.d.ts +12 -8
  279. package/vue/UiTabs.vue +268 -210
  280. package/vue/UiTextarea.d.ts +11 -11
  281. package/vue/UiTextarea.vue +155 -128
  282. package/vue/UiToastRegion.d.ts +10 -8
  283. package/vue/UiToastRegion.vue +261 -198
  284. package/vue/UiTooltip.d.ts +14 -12
  285. package/vue/UiTooltip.vue +241 -177
  286. package/vue/UiTopBar.vue +51 -42
  287. package/vue/UiTree.d.ts +10 -6
  288. package/vue/UiTree.vue +180 -70
  289. package/vue/UiTreeItem.d.ts +24 -22
  290. package/vue/UiTreeItem.vue +464 -339
  291. package/vue/chunks/UiAffordanceScope.js +9 -16
  292. package/vue/chunks/UiAvatar.js +23 -29
  293. package/vue/chunks/UiAvatarGroup.js +16 -39
  294. package/vue/chunks/UiBadge.js +3 -12
  295. package/vue/chunks/UiButton.js +15 -18
  296. package/vue/chunks/UiCallout.js +8 -17
  297. package/vue/chunks/UiCheckbox.js +37 -40
  298. package/vue/chunks/UiCluster.js +3 -12
  299. package/vue/chunks/UiCombobox.js +224 -266
  300. package/vue/chunks/UiContainer.js +3 -12
  301. package/vue/chunks/UiContextMenu.js +39 -34
  302. package/vue/chunks/UiDialog.js +36 -39
  303. package/vue/chunks/UiDisclosure.js +44 -48
  304. package/vue/chunks/UiEditable.js +55 -57
  305. package/vue/chunks/UiEditorInsertTableGrid.js +55 -73
  306. package/vue/chunks/UiEditorMentionMenu.js +40 -81
  307. package/vue/chunks/UiEditorSlashMenu.js +28 -52
  308. package/vue/chunks/UiEditorTableContextMenu.js +32 -56
  309. package/vue/chunks/UiEditorTableOverlay.js +58 -82
  310. package/vue/chunks/UiEditorTableToolbar.js +61 -85
  311. package/vue/chunks/UiEditorToolbar.js +4 -13
  312. package/vue/chunks/UiFloatingActionButton.js +7 -21
  313. package/vue/chunks/UiFormField.js +15 -12
  314. package/vue/chunks/UiGrid.js +3 -12
  315. package/vue/chunks/UiIcon.js +20 -43
  316. package/vue/chunks/UiIconButton.js +16 -28
  317. package/vue/chunks/UiInput.js +20 -25
  318. package/vue/chunks/UiMenu.js +30 -33
  319. package/vue/chunks/UiMenuItem.js +4 -10
  320. package/vue/chunks/UiPopover.js +28 -29
  321. package/vue/chunks/UiRadio.js +36 -39
  322. package/vue/chunks/UiRadioGroup.js +30 -34
  323. package/vue/chunks/UiReel.js +6 -15
  324. package/vue/chunks/UiSearchResultRow.js +6 -19
  325. package/vue/chunks/UiSearchShell.js +25 -28
  326. package/vue/chunks/UiSelect.js +20 -23
  327. package/vue/chunks/UiSeparator.js +2 -8
  328. package/vue/chunks/UiSidebar.js +39 -44
  329. package/vue/chunks/UiStack.js +6 -15
  330. package/vue/chunks/UiSwitch.js +35 -38
  331. package/vue/chunks/UiSwitcher.js +6 -15
  332. package/vue/chunks/UiTabs.js +52 -85
  333. package/vue/chunks/UiTextarea.js +21 -26
  334. package/vue/chunks/UiToastRegion.js +38 -72
  335. package/vue/chunks/UiTooltip.js +34 -35
  336. package/vue/chunks/UiTopBar.js +1 -1
  337. package/vue/chunks/UiTree.js +27 -16
  338. package/vue/chunks/UiTreeItem.js +85 -102
  339. package/vue/components.css +4027 -3800
  340. package/vue/editor/LoomaEditor.d.ts +11 -0
  341. package/vue/editor/index.js +9 -0
@@ -9,19 +9,19 @@
9
9
  display: block;
10
10
  box-sizing: border-box;
11
11
  width: 100%;
12
- padding: var(--ui-space-2) var(--ui-space-3);
12
+ padding: var(--ui-menu-item-padding-block, var(--ui-space-2)) var(--ui-menu-item-padding-inline, var(--ui-space-3));
13
13
  text-align: left;
14
- border-radius: var(--ui-radius-2);
14
+ border-radius: var(--ui-menu-item-radius, var(--ui-radius-md));
15
15
  color: var(--ui-text-primary);
16
- font-size: var(--ui-font-size-md);
17
- font-weight: var(--ui-font-medium, 500);
16
+ font-size: var(--ui-menu-item-font-size, var(--ui-font-size-md));
17
+ font-weight: var(--ui-font-medium);
18
18
  cursor: pointer;
19
19
  outline: none;
20
20
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), color var(--ui-motion-fast) var(--ui-motion-ease);
21
21
  }
22
22
 
23
23
  :host:is(:hover, :focus-visible):not([aria-disabled="true"]) {
24
- background: var(--ui-surface-subtle);
24
+ background: var(--ui-menu-item-hover-surface, var(--ui-surface-subtle));
25
25
  }
26
26
 
27
27
  :host[aria-disabled="true"] {
@@ -19,9 +19,9 @@
19
19
  box-sizing: border-box;
20
20
  max-inline-size: min(
21
21
  20rem,
22
- calc(100vw - var(--ui-popover-viewport-gap, var(--ui-space-2, 0.5rem)) * 2)
22
+ calc(100vw - var(--ui-popover-viewport-gap, var(--ui-space-2)) * 2)
23
23
  );
24
- max-block-size: calc(100dvh - var(--ui-popover-viewport-gap, var(--ui-space-2, 0.5rem)) * 2);
24
+ max-block-size: calc(100dvh - var(--ui-popover-viewport-gap, var(--ui-space-2)) * 2);
25
25
  overflow: visible;
26
26
  padding: 0;
27
27
  border: 0;
@@ -39,7 +39,7 @@
39
39
  padding: var(--ui-space-3);
40
40
  background: var(--ui-surface-elevated);
41
41
  border: 1px solid var(--ui-border-default);
42
- border-radius: var(--ui-radius-3);
42
+ border-radius: var(--ui-radius-lg);
43
43
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
44
44
  }
45
45
 
@@ -14,11 +14,19 @@ export default function controller(host) {
14
14
 
15
15
  const close = (reason, trigger) => {
16
16
  host.state.internalOpen = false;
17
+ lastOpen = false;
17
18
  host.dispatch("close", { open: false, reason, trigger });
18
19
  };
19
20
  const onAnchorClick = (event) => {
20
- host.state.internalOpen = !Boolean(host.state.internalOpen);
21
- if (!host.state.internalOpen) close("action", event.detail === 0 ? "keyboard" : "pointer");
21
+ const trigger = event.detail === 0 ? "keyboard" : "pointer";
22
+ if (host.state.internalOpen) {
23
+ close("action", trigger);
24
+ return;
25
+ }
26
+ host.state.internalOpen = true;
27
+ // Announce the anchor's toggle once, with its real trigger; apply() only announces changes it made.
28
+ lastOpen = true;
29
+ host.dispatch("open", { open: true, reason: "action", trigger });
22
30
  };
23
31
  const ids = createIdResolver(document, () => apply());
24
32
  const setup = () => {
@@ -7,7 +7,7 @@
7
7
  <div role="region" tabindex="0"><slot></slot></div>
8
8
  <style>
9
9
  :host {
10
- --_reel-gap: var(--ui-space-4, 1rem);
10
+ --_reel-gap: var(--ui-space-4);
11
11
  --_reel-item-width: auto;
12
12
  display: flex;
13
13
  inline-size: 100%;
@@ -26,19 +26,19 @@
26
26
  }
27
27
 
28
28
  :host-state([gap="xs"]) {
29
- --_reel-gap: var(--ui-space-2, 0.5rem);
29
+ --_reel-gap: var(--ui-space-2);
30
30
  }
31
31
  :host-state([gap="s"]) {
32
- --_reel-gap: var(--ui-space-3, 0.75rem);
32
+ --_reel-gap: var(--ui-space-3);
33
33
  }
34
34
  :host-state([gap="m"]) {
35
- --_reel-gap: var(--ui-space-4, 1rem);
35
+ --_reel-gap: var(--ui-space-4);
36
36
  }
37
37
  :host-state([gap="l"]) {
38
- --_reel-gap: var(--ui-space-5, 1.5rem);
38
+ --_reel-gap: var(--ui-space-5);
39
39
  }
40
40
  :host-state([gap="xl"]) {
41
- --_reel-gap: var(--ui-space-6, 2rem);
41
+ --_reel-gap: var(--ui-space-6);
42
42
  }
43
43
  :host-state([itemWidth="sm"]) {
44
44
  --_reel-item-width: 12rem;
@@ -18,18 +18,18 @@
18
18
  inline-size: 100%;
19
19
  min-block-size: var(--ui-search-result-row-min-height, 56px);
20
20
  margin: 0;
21
- padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-3, 0.75rem));
22
- padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-4, 1rem));
21
+ padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-3));
22
+ padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-4));
23
23
  display: flex;
24
24
  align-items: flex-start;
25
- gap: var(--ui-search-result-row-gap, var(--ui-space-3, 0.75rem));
26
- background: var(--ui-search-result-row-bg, transparent);
25
+ gap: var(--ui-search-result-row-gap, var(--ui-space-3));
26
+ background: var(--ui-search-result-row-surface, transparent);
27
27
  border: none;
28
- border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border, #e5e7eb));
28
+ border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border));
29
29
  color: inherit;
30
30
  cursor: pointer;
31
31
  text-align: left;
32
- transition: background-color var(--ui-motion-fast, 160ms) var(--ui-motion-ease, ease);
32
+ transition: background-color var(--ui-motion-fast) var(--ui-motion-ease);
33
33
  }
34
34
 
35
35
  :host:last-child {
@@ -37,18 +37,18 @@
37
37
  }
38
38
 
39
39
  :host:hover:enabled {
40
- background: var(--ui-search-result-row-hover-bg, color-mix(in srgb, var(--ui-surface, #ffffff) 85%, black 3%));
40
+ background: var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%));
41
41
  }
42
42
 
43
43
  :host-state([selected]) {
44
44
  background: var(
45
45
  --ui-search-result-row-selected-bg,
46
- var(--ui-search-result-row-hover-bg, color-mix(in srgb, var(--ui-surface, #ffffff) 85%, black 3%))
46
+ var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
47
47
  );
48
48
  }
49
49
 
50
50
  :host:focus-visible {
51
- outline: 2px solid var(--ui-focus-ring, #2563eb);
51
+ outline: 2px solid var(--ui-focus-ring);
52
52
  outline-offset: -2px;
53
53
  }
54
54
 
@@ -55,7 +55,7 @@
55
55
  max-block-size: var(--ui-search-shell-max-height, 80vh);
56
56
  margin-inline: auto;
57
57
  overflow: hidden;
58
- background: var(--ui-search-shell-bg, var(--ui-surface-elevated));
58
+ background: var(--ui-search-shell-surface, var(--ui-surface-elevated));
59
59
  border: 1px solid var(--ui-search-shell-border, var(--ui-border-default));
60
60
  border-radius: var(--ui-search-shell-radius, var(--ui-radius-dialog));
61
61
  box-shadow: var(--ui-search-shell-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)));
@@ -64,6 +64,13 @@
64
64
  .search {
65
65
  padding: var(--ui-space-3);
66
66
  border-block-end: 1px solid var(--ui-border-default);
67
+ transition: border-color var(--ui-motion-fast) var(--ui-motion-ease), box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
68
+ }
69
+
70
+ /* The search region shows where typing goes, whatever the author put in it. */
71
+ .search:focus-within {
72
+ border-block-end-color: var(--ui-search-shell-focus-color, var(--ui-control-focus));
73
+ box-shadow: inset 0 -1px 0 var(--ui-search-shell-focus-color, var(--ui-control-focus));
67
74
  }
68
75
 
69
76
  :slotted(input[slot="search"]) {
@@ -72,7 +79,7 @@
72
79
  min-block-size: var(--ui-control-min-block-size);
73
80
  padding: var(--ui-space-2) var(--ui-space-3);
74
81
  border: 1px solid var(--ui-control-border);
75
- border-radius: var(--ui-radius-2);
82
+ border-radius: var(--ui-radius-md);
76
83
  background: var(--ui-control-surface);
77
84
  color: var(--ui-text-primary);
78
85
  font: inherit;
@@ -81,7 +88,7 @@
81
88
 
82
89
  :slotted(input[slot="search"]:focus-visible) {
83
90
  border-color: var(--ui-control-focus);
84
- outline: 2px solid var(--ui-focus-ring, currentColor);
91
+ outline: 2px solid var(--ui-focus-ring);
85
92
  outline-offset: 2px;
86
93
  }
87
94
 
@@ -40,6 +40,13 @@ export default function controller(host) {
40
40
  event.preventDefault();
41
41
  if (host.state.dismissible) dispatchClose("escape", "keyboard");
42
42
  };
43
+ // A search field spends the first Escape clearing itself and the dialog never sees a cancel,
44
+ // so a dismissible shell closes on Escape from anywhere inside it.
45
+ const onKeydown = (event) => {
46
+ if (event.key !== "Escape" || event.defaultPrevented || !host.state.dismissible) return;
47
+ event.preventDefault();
48
+ dispatchClose("escape", "keyboard");
49
+ };
43
50
  const onClick = (event) => {
44
51
  if (host.state.dismissible && event.target === dialog) dispatchClose("light-dismiss", trigger());
45
52
  };
@@ -47,12 +54,14 @@ export default function controller(host) {
47
54
  if (!suppressNativeClose && host.state.internalOpen) dispatchClose("action", trigger());
48
55
  };
49
56
  dialog.addEventListener("cancel", onCancel);
57
+ dialog.addEventListener("keydown", onKeydown);
50
58
  dialog.addEventListener("click", onClick);
51
59
  dialog.addEventListener("close", onClose);
52
60
  return () => {
53
61
  stop();
54
62
  stopTracking();
55
63
  dialog.removeEventListener("cancel", onCancel);
64
+ dialog.removeEventListener("keydown", onKeydown);
56
65
  dialog.removeEventListener("click", onClick);
57
66
  dialog.removeEventListener("close", onClose);
58
67
  closeNative();
@@ -13,11 +13,11 @@
13
13
  display: inline-block;
14
14
  inline-size: 100%;
15
15
  min-inline-size: 0;
16
- min-block-size: var(--ui-control-size-md, 2.5rem);
16
+ min-block-size: var(--ui-control-size-md);
17
17
  margin: 0;
18
18
  padding: var(--ui-space-2) var(--ui-space-3);
19
19
  border: 1px solid var(--ui-control-border, var(--ui-border-strong));
20
- border-radius: var(--ui-select-radius, var(--ui-radius-2));
20
+ border-radius: var(--ui-select-radius, var(--ui-radius-md));
21
21
  background-color: var(--ui-control-surface, var(--ui-surface-elevated));
22
22
  color: var(--ui-text-primary);
23
23
  color-scheme: light dark;
@@ -91,10 +91,10 @@
91
91
  inset-inline-start: 3px;
92
92
  inline-size: 2px;
93
93
  background: color-mix(in srgb, var(--ui-affordance-guide-color, var(--ui-border-strong)) 45%, transparent);
94
- opacity: var(--ui-affordance-guide-opacity, 0.42);
94
+ opacity: var(--ui-affordance-guide-opacity);
95
95
  transition:
96
- background-color var(--ui-affordance-motion, var(--ui-motion-fast, 120ms)) var(--ui-motion-ease, ease),
97
- opacity var(--ui-affordance-motion, var(--ui-motion-fast, 120ms)) var(--ui-motion-ease, ease);
96
+ background-color var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease),
97
+ opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
98
98
  }
99
99
 
100
100
  .guide {
@@ -103,17 +103,17 @@
103
103
  inset-inline-start: 50%;
104
104
  inline-size: 6px;
105
105
  block-size: 22px;
106
- border: 1px solid var(--ui-border-strong, #c8c8c4);
107
- border-radius: var(--ui-radius-round, 999px);
108
- background: var(--ui-surface-elevated, #fff);
106
+ border: 1px solid var(--ui-border-strong);
107
+ border-radius: var(--ui-radius-round);
108
+ background: var(--ui-surface-elevated);
109
109
  opacity: 0;
110
110
  transform: translate(-50%, -50%);
111
- transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast, 120ms)) var(--ui-motion-ease, ease);
111
+ transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
112
112
  pointer-events: none;
113
113
  }
114
114
 
115
115
  .resizer:is(:hover, :focus-visible)::after {
116
- background: var(--ui-affordance-direct-color, var(--ui-accent-solid, var(--ui-color-focus, Highlight)));
116
+ background: var(--ui-affordance-direct-color, var(--ui-accent-solid, var(--ui-focus-ring)));
117
117
  opacity: 1;
118
118
  }
119
119
 
@@ -136,9 +136,9 @@
136
136
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
137
137
  transform: translateX(0);
138
138
  transition:
139
- transform var(--ui-motion-base, 0.2s) var(--ui-motion-ease-out, ease-out),
140
- display var(--ui-motion-base, 0.2s) allow-discrete,
141
- overlay var(--ui-motion-base, 0.2s) allow-discrete;
139
+ transform var(--ui-motion-base) var(--ui-motion-ease-out),
140
+ display var(--ui-motion-base) allow-discrete,
141
+ overlay var(--ui-motion-base) allow-discrete;
142
142
  }
143
143
 
144
144
  /* The author display above would otherwise override the UA rule that hides a closed popover. */
@@ -7,7 +7,7 @@
7
7
  <div><slot></slot></div>
8
8
  <style>
9
9
  :host {
10
- --_layout-gap: var(--ui-space-4, 1rem);
10
+ --_layout-gap: var(--ui-space-4);
11
11
  display: flex;
12
12
  flex-direction: column;
13
13
  align-items: stretch;
@@ -18,19 +18,19 @@
18
18
  }
19
19
 
20
20
  :host-state([gap="xs"]) {
21
- --_layout-gap: var(--ui-space-2, 0.5rem);
21
+ --_layout-gap: var(--ui-space-2);
22
22
  }
23
23
  :host-state([gap="s"]) {
24
- --_layout-gap: var(--ui-space-3, 0.75rem);
24
+ --_layout-gap: var(--ui-space-3);
25
25
  }
26
26
  :host-state([gap="m"]) {
27
- --_layout-gap: var(--ui-space-4, 1rem);
27
+ --_layout-gap: var(--ui-space-4);
28
28
  }
29
29
  :host-state([gap="l"]) {
30
- --_layout-gap: var(--ui-space-5, 1.5rem);
30
+ --_layout-gap: var(--ui-space-5);
31
31
  }
32
32
  :host-state([gap="xl"]) {
33
- --_layout-gap: var(--ui-space-6, 2rem);
33
+ --_layout-gap: var(--ui-space-6);
34
34
  }
35
35
  :host-state([align="start"]) {
36
36
  align-items: flex-start;
@@ -7,7 +7,7 @@
7
7
  <div><slot></slot></div>
8
8
  <style>
9
9
  :host {
10
- --_switcher-gap: var(--ui-space-4, 1rem);
10
+ --_switcher-gap: var(--ui-space-4);
11
11
  display: flex;
12
12
  flex-wrap: wrap;
13
13
  gap: var(--ui-switcher-gap, var(--_switcher-gap));
@@ -24,19 +24,19 @@
24
24
  }
25
25
 
26
26
  :host-state([gap="xs"]) {
27
- --_switcher-gap: var(--ui-space-2, 0.5rem);
27
+ --_switcher-gap: var(--ui-space-2);
28
28
  }
29
29
  :host-state([gap="s"]) {
30
- --_switcher-gap: var(--ui-space-3, 0.75rem);
30
+ --_switcher-gap: var(--ui-space-3);
31
31
  }
32
32
  :host-state([gap="m"]) {
33
- --_switcher-gap: var(--ui-space-4, 1rem);
33
+ --_switcher-gap: var(--ui-space-4);
34
34
  }
35
35
  :host-state([gap="l"]) {
36
- --_switcher-gap: var(--ui-space-5, 1.5rem);
36
+ --_switcher-gap: var(--ui-space-5);
37
37
  }
38
38
  :host-state([gap="xl"]) {
39
- --_switcher-gap: var(--ui-space-6, 2rem);
39
+ --_switcher-gap: var(--ui-space-6);
40
40
  }
41
41
  :host-state([threshold="xs"]) > :slotted(*) {
42
42
  flex-basis: calc((var(--ui-switcher-threshold, 20rem) - 100%) * 999);
@@ -1,11 +1,12 @@
1
1
  <template component="ui-tabs" controller="./ui-tabs.js">
2
2
  <defs>
3
+ <prop name="density" type="comfortable | compact" default="comfortable">Compact trades padding and type size for rows that fit more on screen.</prop>
3
4
  <prop name="label" type="string" default="Tabs">label token.</prop>
4
5
  <prop name="value" type="string" default="">value token.</prop>
5
6
  <prop name="orientation" type="horizontal | vertical" default="horizontal">orientation token.</prop>
6
7
  <prop name="stretch" type="boolean" default="false">Share the full width of the tab list equally between tabs instead of sizing each to its label.</prop>
7
8
  <state name="internalValue" :value="''"></state>
8
- <state name="tabs" :value="[]"></state>
9
+ <state name="tabs" type="list(object({ id: string, label: string }))" :value="[]"></state>
9
10
  <event name="select" type="object({ value: string, previousValue: string, trigger: keyboard | pointer | programmatic })"></event>
10
11
  </defs>
11
12
  <div>
@@ -26,6 +27,19 @@
26
27
  <div class="panels" $ref="panels"><slot></slot></div>
27
28
  </div>
28
29
  <style>
30
+ /* Density resolves into the tab row's own values; the public tokens still override them. */
31
+ :host {
32
+ --_tab-min-block-size: var(--ui-control-size);
33
+ --_tab-padding-block: var(--ui-space-2);
34
+ --_tab-padding-inline: var(--ui-space-3);
35
+ }
36
+
37
+ :host-state([density="compact"]) {
38
+ --_tab-min-block-size: var(--ui-control-size-sm);
39
+ --_tab-padding-block: var(--ui-space-1);
40
+ --_tab-padding-inline: var(--ui-space-2);
41
+ }
42
+
29
43
  :host {
30
44
  display: grid;
31
45
  inline-size: 100%;
@@ -50,16 +64,16 @@
50
64
  }
51
65
 
52
66
  .list button {
53
- min-block-size: 2.5rem;
67
+ min-block-size: var(--ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
54
68
  margin: 0 0 -1px;
55
- padding: var(--ui-space-2) var(--ui-space-3);
69
+ padding: var(--ui-tabs-tab-padding-block, var(--_tab-padding-block)) var(--ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
56
70
  border: 0;
57
71
  border-block-end: 2px solid transparent;
58
72
  background: transparent;
59
73
  color: var(--ui-text-secondary);
60
74
  font: inherit;
61
75
  font-size: var(--ui-font-size-sm);
62
- font-weight: var(--ui-font-medium, 500);
76
+ font-weight: var(--ui-font-medium);
63
77
  cursor: pointer;
64
78
  transition:
65
79
  color var(--ui-motion-fast) var(--ui-motion-ease),
@@ -87,7 +101,7 @@
87
101
  position: relative;
88
102
  outline: none;
89
103
  box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
90
- border-radius: var(--ui-radius-1);
104
+ border-radius: var(--ui-radius-sm);
91
105
  }
92
106
 
93
107
  .panels {
@@ -14,13 +14,13 @@
14
14
  display: inline-block;
15
15
  inline-size: 100%;
16
16
  min-inline-size: 0;
17
- min-block-size: calc(var(--ui-space-12, 3rem) * 2);
17
+ min-block-size: calc(3rem * 2);
18
18
  margin: 0;
19
19
  padding: var(--ui-space-2) var(--ui-space-3);
20
20
  appearance: none;
21
21
  resize: vertical;
22
22
  border: 1px solid var(--ui-control-border, var(--ui-border-strong));
23
- border-radius: var(--ui-textarea-radius, var(--ui-radius-2));
23
+ border-radius: var(--ui-textarea-radius, var(--ui-radius-md));
24
24
  background: var(--ui-control-surface, var(--ui-surface-elevated));
25
25
  color: var(--ui-text-primary);
26
26
  font: inherit;
@@ -7,7 +7,7 @@
7
7
  >Dismiss each message automatically after its duration. Timers pause while the pointer or focus is on a message.</prop>
8
8
  <prop name="duration" type="number" default="5000">Milliseconds an automatically dismissed message stays visible.</prop>
9
9
  <state name="internalOpen" :value="false"></state>
10
- <state name="toasts" :value="[]"></state>
10
+ <state name="toasts" type="list(object({ id: string, message: string, role: alert | status, closing: boolean }))" :value="[]"></state>
11
11
  <event
12
12
  name="close"
13
13
  type="object({ open: boolean, reason: action | timeout | programmatic | light-dismiss | escape, trigger: keyboard | pointer | programmatic })"
@@ -67,7 +67,7 @@
67
67
  gap: var(--ui-space-2);
68
68
  align-items: start;
69
69
  border: 1px solid var(--ui-border-default);
70
- border-radius: var(--ui-radius-3);
70
+ border-radius: var(--ui-radius-lg);
71
71
  padding: var(--ui-space-3) var(--ui-space-4);
72
72
  background: var(--ui-surface-elevated);
73
73
  color: var(--ui-text-primary);
@@ -77,7 +77,7 @@
77
77
 
78
78
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
79
79
  .toast.closing {
80
- animation: ui-toast-exit var(--ui-toast-exit-duration, 0.22s) var(--ui-motion-ease, ease) both;
80
+ animation: ui-toast-exit var(--ui-toast-exit-duration, 0.22s) var(--ui-motion-ease) both;
81
81
  pointer-events: none;
82
82
  }
83
83
 
@@ -46,7 +46,7 @@
46
46
  box-sizing: border-box;
47
47
  max-inline-size: var(--ui-tooltip-max-inline-size, 18rem);
48
48
  border: 1px solid var(--_tooltip-line);
49
- border-radius: var(--ui-tooltip-radius, var(--ui-radius-1));
49
+ border-radius: var(--ui-tooltip-radius, var(--ui-radius-sm));
50
50
  background: var(--ui-tooltip-surface, var(--ui-surface-elevated));
51
51
  color: var(--ui-tooltip-text, var(--ui-text-primary));
52
52
  padding: var(--ui-space-1) var(--ui-space-2);
@@ -13,11 +13,11 @@
13
13
  min-block-size: calc(var(--ui-top-bar-height, 56px) + env(safe-area-inset-top));
14
14
  display: flex;
15
15
  align-items: center;
16
- gap: var(--ui-top-bar-gap, var(--ui-space-3, 0.75rem));
16
+ gap: var(--ui-top-bar-gap, var(--ui-space-3));
17
17
  padding-block-start: env(safe-area-inset-top);
18
- padding-inline-start: max(var(--ui-top-bar-padding-inline, var(--ui-space-4, 1rem)), env(safe-area-inset-left));
19
- padding-inline-end: max(var(--ui-top-bar-padding-inline, var(--ui-space-4, 1rem)), env(safe-area-inset-right));
20
- background: var(--ui-top-bar-bg, var(--ui-surface-elevated));
18
+ padding-inline-start: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-left));
19
+ padding-inline-end: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-right));
20
+ background: var(--ui-top-bar-surface, var(--ui-surface-elevated));
21
21
  border-block-end: 1px solid var(--ui-top-bar-border, var(--ui-border-default));
22
22
  }
23
23
 
@@ -30,7 +30,7 @@
30
30
  }
31
31
 
32
32
  .actions {
33
- gap: var(--ui-top-bar-actions-gap, var(--ui-space-1, 0.25rem));
33
+ gap: var(--ui-top-bar-actions-gap, var(--ui-space-1));
34
34
  }
35
35
 
36
36
  .title {
@@ -1,6 +1,7 @@
1
1
  <link rel="component" href="../ui-tree-item/ui-tree-item.html">
2
2
  <template component="ui-tree" controller="./ui-tree.js">
3
3
  <defs>
4
+ <prop name="density" type="comfortable | compact" default="comfortable">Compact trades padding and type size for rows that fit more on screen.</prop>
4
5
  <prop name="label" type="string" default="Tree">label token.</prop>
5
6
  <prop name="hoverExpandDelay" type="number" default="700">hoverExpandDelay token.</prop>
6
7
  <prop name="maxDepth" type="number" default="0">maxDepth token.</prop>
@@ -15,6 +16,12 @@
15
16
  </defs>
16
17
  <div role="tree"><slot></slot></div>
17
18
  <style>
19
+ :host-state([density="compact"]) {
20
+ --ui-tree-item-min-block-size: var(--ui-control-size-sm);
21
+ --ui-tree-item-font-size: var(--ui-font-size-sm);
22
+ --ui-tree-item-label-padding-block: 0;
23
+ }
24
+
18
25
  :host {
19
26
  display: block;
20
27
  min-inline-size: 0;
@@ -84,9 +84,9 @@
84
84
  display: grid;
85
85
  grid-template-columns: 20px auto minmax(0, 1fr) auto;
86
86
  align-items: center;
87
- min-block-size: var(--ui-tree-row-min-height, var(--_tree-row-min-height));
87
+ min-block-size: var(--ui-tree-item-min-block-size, var(--_tree-row-min-height));
88
88
  min-inline-size: 0;
89
- font-size: var(--ui-tree-font-size, var(--ui-font-size-ui, 0.9375rem));
89
+ font-size: var(--ui-tree-item-font-size, var(--ui-font-size-ui));
90
90
  border-radius: var(--ui-radius-md);
91
91
  color: var(--ui-text-secondary);
92
92
  transition:
@@ -120,7 +120,8 @@
120
120
  box-shadow: 0 0 0 2px var(--ui-focus-ring);
121
121
  }
122
122
 
123
- :host[data-drop-position="inside"] .row {
123
+ /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
124
+ :host[data-drop-position="inside"] > .row {
124
125
  background: var(--ui-accent-subtle);
125
126
  box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
126
127
  }
@@ -209,11 +210,23 @@
209
210
  flex: none;
210
211
  }
211
212
 
213
+ /* The label spans the row's height and centres its content, so slotted content (a link) can
214
+ stretch to fill the row as its own hit area; the padding tokens remove the inset. */
212
215
  .label {
213
216
  grid-column: 3;
214
217
  grid-row: 1;
218
+ align-self: stretch;
219
+ display: flex;
220
+ align-items: center;
221
+ min-inline-size: 0;
222
+ padding: var(--ui-tree-item-label-padding-block, var(--ui-space-1)) var(--ui-tree-item-label-padding-inline, var(--ui-space-2));
223
+ }
224
+
225
+ /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
226
+ its own text and reading as overflow. */
227
+ .label > :slotted(*) {
228
+ flex: 1 1 auto;
215
229
  min-inline-size: 0;
216
- padding: var(--ui-space-1) var(--ui-space-2);
217
230
  }
218
231
 
219
232
  .actions {
@@ -249,7 +262,7 @@
249
262
  .row:hover .drag-handle,
250
263
  .drag-handle:hover,
251
264
  .drag-handle:focus-visible,
252
- :host[data-dragging] .drag-handle {
265
+ :host[data-dragging] > .row > .drag-handle {
253
266
  opacity: 1;
254
267
  }
255
268
 
@@ -288,12 +301,12 @@
288
301
  inset-inline-end: -1px;
289
302
  }
290
303
 
291
- :host[data-drop-position="before"] .row-drop-indicator {
304
+ :host[data-drop-position="before"] > .row > .row-drop-indicator {
292
305
  display: block;
293
306
  inset-block-start: -1px;
294
307
  }
295
308
 
296
- :host[data-drop-position="after"] .subtree-drop-indicator {
309
+ :host[data-drop-position="after"] > .subtree-drop-indicator {
297
310
  display: block;
298
311
  inset-block-end: -1px;
299
312
  }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ComponentDefinition } from "@nextwebwg/declarative-components";
1
+ import type { ComponentDefinition } from "@nextwebwg/html-next";
2
2
  export declare const definitions: readonly ComponentDefinition[];
3
3
  export declare function register(root?: Document): () => void;
4
4
  export declare const stop: undefined | (() => void);