@threadlabs/looma 0.28.5 → 0.28.7

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 (453) hide show
  1. package/components/ui-editor-block-actions/ui-editor-block-actions.html +20 -0
  2. package/components/ui-editor-block-actions/ui-editor-block-actions.js +14 -0
  3. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.html +7 -6
  4. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.js +2 -1
  5. package/components/ui-editor-link-card/ui-editor-link-card.html +57 -0
  6. package/components/ui-editor-link-card/ui-editor-link-card.js +27 -0
  7. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +3 -2
  8. package/dist/index.js +36 -34
  9. package/package.json +3 -2
  10. package/styles/ui-action-bar.css +13 -6
  11. package/styles/ui-affordance-scope.css +12 -5
  12. package/styles/ui-avatar-group.css +17 -10
  13. package/styles/ui-avatar.css +23 -16
  14. package/styles/ui-badge.css +78 -71
  15. package/styles/ui-breadcrumb-item.css +12 -5
  16. package/styles/ui-breadcrumbs.css +10 -3
  17. package/styles/ui-button.css +79 -72
  18. package/styles/ui-callout.css +29 -22
  19. package/styles/ui-card.css +25 -18
  20. package/styles/ui-checkbox.css +45 -37
  21. package/styles/ui-cluster.css +34 -27
  22. package/styles/ui-combobox.css +46 -39
  23. package/styles/ui-container.css +20 -13
  24. package/styles/ui-context-menu.css +17 -10
  25. package/styles/ui-cover.css +12 -5
  26. package/styles/ui-description-item.css +10 -3
  27. package/styles/ui-description-list.css +20 -13
  28. package/styles/ui-dialog.css +44 -35
  29. package/styles/ui-disclosure.css +32 -25
  30. package/styles/ui-editable.css +15 -8
  31. package/styles/ui-editor-block-actions.css +1 -0
  32. package/styles/ui-editor-image-toolbar.css +1 -1
  33. package/styles/ui-editor-insert-table-grid.css +11 -4
  34. package/styles/ui-editor-link-card.css +1 -0
  35. package/styles/ui-editor-mention-menu-item.css +17 -8
  36. package/styles/ui-editor-mention-menu.css +14 -7
  37. package/styles/ui-editor-slash-menu-group.css +10 -3
  38. package/styles/ui-editor-slash-menu-item.css +15 -8
  39. package/styles/ui-editor-slash-menu.css +15 -8
  40. package/styles/ui-editor-surface.css +10 -3
  41. package/styles/ui-editor-table-context-menu.css +17 -10
  42. package/styles/ui-editor-table-overlay.css +17 -10
  43. package/styles/ui-editor-table-toolbar.css +22 -15
  44. package/styles/ui-editor-toolbar.css +18 -11
  45. package/styles/ui-floating-action-button.css +21 -14
  46. package/styles/ui-form-field.css +20 -13
  47. package/styles/ui-grid.css +21 -14
  48. package/styles/ui-icon-button.css +80 -73
  49. package/styles/ui-icon.css +14 -7
  50. package/styles/ui-image.css +25 -18
  51. package/styles/ui-input-group.css +34 -27
  52. package/styles/ui-input.css +42 -35
  53. package/styles/ui-list-item.css +33 -26
  54. package/styles/ui-list.css +22 -15
  55. package/styles/ui-listbox.css +22 -14
  56. package/styles/ui-menu-group.css +10 -3
  57. package/styles/ui-menu-item.css +29 -22
  58. package/styles/ui-menu.css +25 -18
  59. package/styles/ui-meter.css +36 -29
  60. package/styles/ui-nav-item.css +26 -19
  61. package/styles/ui-page-header.css +12 -5
  62. package/styles/ui-popover.css +27 -20
  63. package/styles/ui-radio-group.css +14 -6
  64. package/styles/ui-radio.css +24 -17
  65. package/styles/ui-reel.css +28 -21
  66. package/styles/ui-scroll-area.css +22 -15
  67. package/styles/ui-search-result-row.css +28 -21
  68. package/styles/ui-search-shell.css +24 -17
  69. package/styles/ui-section.css +14 -7
  70. package/styles/ui-select.css +33 -26
  71. package/styles/ui-separator.css +17 -10
  72. package/styles/ui-sidebar.css +35 -28
  73. package/styles/ui-spinner.css +32 -23
  74. package/styles/ui-stack.css +29 -21
  75. package/styles/ui-status-message.css +14 -7
  76. package/styles/ui-switch.css +29 -22
  77. package/styles/ui-switcher.css +27 -20
  78. package/styles/ui-table.css +14 -7
  79. package/styles/ui-tabs.css +24 -17
  80. package/styles/ui-text.css +35 -28
  81. package/styles/ui-textarea.css +37 -30
  82. package/styles/ui-toast-region.css +74 -63
  83. package/styles/ui-toast.css +21 -14
  84. package/styles/ui-tooltip.css +38 -31
  85. package/styles/ui-top-bar.css +19 -12
  86. package/styles/ui-tree-item.css +79 -71
  87. package/styles/ui-tree.css +18 -11
  88. package/vanilla/UiActionBar.d.ts +1 -1
  89. package/vanilla/UiActionBar.js +1 -1
  90. package/vanilla/UiAffordanceScope.d.ts +1 -1
  91. package/vanilla/UiAffordanceScope.js +1 -1
  92. package/vanilla/UiAvatar.d.ts +1 -1
  93. package/vanilla/UiAvatar.js +1 -1
  94. package/vanilla/UiAvatarGroup.d.ts +1 -1
  95. package/vanilla/UiAvatarGroup.js +1 -1
  96. package/vanilla/UiBadge.d.ts +1 -1
  97. package/vanilla/UiBadge.js +1 -1
  98. package/vanilla/UiBreadcrumbItem.d.ts +1 -1
  99. package/vanilla/UiBreadcrumbItem.js +1 -1
  100. package/vanilla/UiBreadcrumbs.d.ts +1 -1
  101. package/vanilla/UiBreadcrumbs.js +1 -1
  102. package/vanilla/UiButton.d.ts +1 -1
  103. package/vanilla/UiButton.js +19 -57
  104. package/vanilla/UiCallout.d.ts +1 -1
  105. package/vanilla/UiCallout.js +25 -73
  106. package/vanilla/UiCard.d.ts +1 -1
  107. package/vanilla/UiCard.js +1 -1
  108. package/vanilla/UiCheckbox.d.ts +1 -1
  109. package/vanilla/UiCheckbox.js +1 -1
  110. package/vanilla/UiCluster.d.ts +1 -1
  111. package/vanilla/UiCluster.js +1 -1
  112. package/vanilla/UiCombobox.d.ts +1 -1
  113. package/vanilla/UiCombobox.js +60 -166
  114. package/vanilla/UiContainer.d.ts +1 -1
  115. package/vanilla/UiContainer.js +1 -1
  116. package/vanilla/UiContextMenu.d.ts +1 -1
  117. package/vanilla/UiContextMenu.js +1 -1
  118. package/vanilla/UiCover.d.ts +1 -1
  119. package/vanilla/UiCover.js +1 -1
  120. package/vanilla/UiDescriptionItem.d.ts +1 -1
  121. package/vanilla/UiDescriptionItem.js +1 -1
  122. package/vanilla/UiDescriptionList.d.ts +1 -1
  123. package/vanilla/UiDescriptionList.js +1 -1
  124. package/vanilla/UiDialog.d.ts +1 -1
  125. package/vanilla/UiDialog.js +4 -10
  126. package/vanilla/UiDisclosure.d.ts +1 -1
  127. package/vanilla/UiDisclosure.js +1 -1
  128. package/vanilla/UiEditable.d.ts +1 -1
  129. package/vanilla/UiEditable.js +7 -19
  130. package/vanilla/UiEditorBlockActions.d.ts +16 -0
  131. package/vanilla/UiEditorBlockActions.js +41 -0
  132. package/vanilla/UiEditorImageToolbar.d.ts +1 -1
  133. package/vanilla/UiEditorImageToolbar.js +2 -2
  134. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  135. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  136. package/vanilla/UiEditorLinkCard.d.ts +20 -0
  137. package/vanilla/UiEditorLinkCard.js +153 -0
  138. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  139. package/vanilla/UiEditorMentionMenu.js +17 -37
  140. package/vanilla/UiEditorMentionMenuItem.d.ts +1 -1
  141. package/vanilla/UiEditorMentionMenuItem.js +4 -10
  142. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  143. package/vanilla/UiEditorSlashMenu.js +5 -4
  144. package/vanilla/UiEditorSlashMenuGroup.d.ts +1 -1
  145. package/vanilla/UiEditorSlashMenuGroup.js +1 -1
  146. package/vanilla/UiEditorSlashMenuItem.d.ts +1 -1
  147. package/vanilla/UiEditorSlashMenuItem.js +7 -19
  148. package/vanilla/UiEditorSurface.d.ts +1 -1
  149. package/vanilla/UiEditorSurface.js +1 -1
  150. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  151. package/vanilla/UiEditorTableContextMenu.js +6 -14
  152. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  153. package/vanilla/UiEditorTableOverlay.js +9 -25
  154. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  155. package/vanilla/UiEditorTableToolbar.js +25 -77
  156. package/vanilla/UiEditorToolbar.d.ts +1 -1
  157. package/vanilla/UiEditorToolbar.js +1 -1
  158. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  159. package/vanilla/UiFloatingActionButton.js +1 -1
  160. package/vanilla/UiFormField.d.ts +1 -1
  161. package/vanilla/UiFormField.js +1 -1
  162. package/vanilla/UiGrid.d.ts +1 -1
  163. package/vanilla/UiGrid.js +1 -1
  164. package/vanilla/UiIcon.d.ts +1 -1
  165. package/vanilla/UiIcon.js +15 -47
  166. package/vanilla/UiIconButton.d.ts +1 -1
  167. package/vanilla/UiIconButton.js +4 -10
  168. package/vanilla/UiImage.d.ts +1 -1
  169. package/vanilla/UiImage.js +1 -1
  170. package/vanilla/UiInput.d.ts +1 -1
  171. package/vanilla/UiInput.js +1 -1
  172. package/vanilla/UiInputGroup.d.ts +1 -1
  173. package/vanilla/UiInputGroup.js +1 -1
  174. package/vanilla/UiList.d.ts +1 -1
  175. package/vanilla/UiList.js +1 -1
  176. package/vanilla/UiListItem.d.ts +1 -1
  177. package/vanilla/UiListItem.js +1 -1
  178. package/vanilla/UiListbox.d.ts +1 -1
  179. package/vanilla/UiListbox.js +4 -10
  180. package/vanilla/UiMenu.d.ts +1 -1
  181. package/vanilla/UiMenu.js +1 -1
  182. package/vanilla/UiMenuGroup.d.ts +1 -1
  183. package/vanilla/UiMenuGroup.js +4 -10
  184. package/vanilla/UiMenuItem.d.ts +1 -1
  185. package/vanilla/UiMenuItem.js +4 -10
  186. package/vanilla/UiMeter.d.ts +1 -1
  187. package/vanilla/UiMeter.js +13 -33
  188. package/vanilla/UiNavItem.d.ts +1 -1
  189. package/vanilla/UiNavItem.js +1 -1
  190. package/vanilla/UiPageHeader.d.ts +1 -1
  191. package/vanilla/UiPageHeader.js +1 -1
  192. package/vanilla/UiPopover.d.ts +1 -1
  193. package/vanilla/UiPopover.js +1 -1
  194. package/vanilla/UiRadio.d.ts +1 -1
  195. package/vanilla/UiRadio.js +1 -1
  196. package/vanilla/UiRadioGroup.d.ts +1 -1
  197. package/vanilla/UiRadioGroup.js +1 -1
  198. package/vanilla/UiReel.d.ts +1 -1
  199. package/vanilla/UiReel.js +1 -1
  200. package/vanilla/UiScrollArea.d.ts +1 -1
  201. package/vanilla/UiScrollArea.js +1 -1
  202. package/vanilla/UiSearchResultRow.d.ts +1 -1
  203. package/vanilla/UiSearchResultRow.js +1 -1
  204. package/vanilla/UiSearchShell.d.ts +1 -1
  205. package/vanilla/UiSearchShell.js +1 -1
  206. package/vanilla/UiSection.d.ts +1 -1
  207. package/vanilla/UiSection.js +1 -1
  208. package/vanilla/UiSelect.d.ts +1 -1
  209. package/vanilla/UiSelect.js +1 -1
  210. package/vanilla/UiSeparator.d.ts +1 -1
  211. package/vanilla/UiSeparator.js +1 -1
  212. package/vanilla/UiSidebar.d.ts +1 -1
  213. package/vanilla/UiSidebar.js +1 -1
  214. package/vanilla/UiSpinner.d.ts +1 -1
  215. package/vanilla/UiSpinner.js +1 -1
  216. package/vanilla/UiStack.d.ts +1 -1
  217. package/vanilla/UiStack.js +1 -1
  218. package/vanilla/UiStatusMessage.d.ts +1 -1
  219. package/vanilla/UiStatusMessage.js +1 -1
  220. package/vanilla/UiSwitch.d.ts +1 -1
  221. package/vanilla/UiSwitch.js +1 -1
  222. package/vanilla/UiSwitcher.d.ts +1 -1
  223. package/vanilla/UiSwitcher.js +1 -1
  224. package/vanilla/UiTable.d.ts +1 -1
  225. package/vanilla/UiTable.js +1 -1
  226. package/vanilla/UiTabs.d.ts +1 -1
  227. package/vanilla/UiTabs.js +1 -1
  228. package/vanilla/UiText.d.ts +1 -1
  229. package/vanilla/UiText.js +1 -1
  230. package/vanilla/UiTextarea.d.ts +1 -1
  231. package/vanilla/UiTextarea.js +1 -1
  232. package/vanilla/UiToast.d.ts +1 -1
  233. package/vanilla/UiToast.js +1 -1
  234. package/vanilla/UiToastRegion.d.ts +1 -1
  235. package/vanilla/UiToastRegion.js +1 -1
  236. package/vanilla/UiTooltip.d.ts +1 -1
  237. package/vanilla/UiTooltip.js +1 -1
  238. package/vanilla/UiTopBar.d.ts +1 -1
  239. package/vanilla/UiTopBar.js +1 -1
  240. package/vanilla/UiTree.d.ts +1 -1
  241. package/vanilla/UiTree.js +1 -1
  242. package/vanilla/UiTreeItem.d.ts +1 -1
  243. package/vanilla/UiTreeItem.js +7 -19
  244. package/vanilla/index.js +2 -0
  245. package/vue/UiActionBar.vue +46 -78
  246. package/vue/UiAffordanceScope.vue +27 -66
  247. package/vue/UiAvatar.d.ts +10 -7
  248. package/vue/UiAvatar.vue +100 -218
  249. package/vue/UiAvatarGroup.d.ts +10 -7
  250. package/vue/UiAvatarGroup.vue +78 -160
  251. package/vue/UiBadge.d.ts +1 -1
  252. package/vue/UiBadge.vue +483 -520
  253. package/vue/UiBreadcrumbItem.vue +52 -123
  254. package/vue/UiBreadcrumbs.vue +27 -70
  255. package/vue/UiButton.d.ts +2 -2
  256. package/vue/UiButton.vue +420 -471
  257. package/vue/UiCallout.vue +131 -175
  258. package/vue/UiCard.d.ts +1 -1
  259. package/vue/UiCard.vue +112 -151
  260. package/vue/UiCheckbox.d.ts +13 -10
  261. package/vue/UiCheckbox.vue +160 -221
  262. package/vue/UiCluster.d.ts +1 -1
  263. package/vue/UiCluster.vue +84 -128
  264. package/vue/UiCombobox.d.ts +71 -68
  265. package/vue/UiCombobox.vue +417 -743
  266. package/vue/UiContainer.vue +43 -87
  267. package/vue/UiContextMenu.d.ts +6 -6
  268. package/vue/UiContextMenu.vue +78 -117
  269. package/vue/UiCover.vue +29 -69
  270. package/vue/UiDescriptionItem.vue +39 -82
  271. package/vue/UiDescriptionList.vue +64 -107
  272. package/vue/UiDialog.d.ts +22 -19
  273. package/vue/UiDialog.vue +193 -246
  274. package/vue/UiDisclosure.d.ts +22 -19
  275. package/vue/UiDisclosure.vue +192 -283
  276. package/vue/UiEditable.d.ts +5 -5
  277. package/vue/UiEditable.vue +124 -207
  278. package/vue/UiEditorBlockActions.d.ts +33 -0
  279. package/vue/UiEditorBlockActions.js +2 -0
  280. package/vue/UiEditorBlockActions.vue +125 -0
  281. package/vue/UiEditorImageToolbar.d.ts +2 -2
  282. package/vue/UiEditorImageToolbar.vue +45 -256
  283. package/vue/UiEditorInsertTableGrid.d.ts +2 -2
  284. package/vue/UiEditorInsertTableGrid.vue +98 -266
  285. package/vue/UiEditorLinkCard.d.ts +58 -0
  286. package/vue/UiEditorLinkCard.js +2 -0
  287. package/vue/UiEditorLinkCard.vue +319 -0
  288. package/vue/UiEditorMentionMenu.d.ts +15 -12
  289. package/vue/UiEditorMentionMenu.vue +150 -239
  290. package/vue/UiEditorMentionMenuItem.vue +66 -110
  291. package/vue/UiEditorSlashMenu.d.ts +16 -13
  292. package/vue/UiEditorSlashMenu.vue +172 -253
  293. package/vue/UiEditorSlashMenuGroup.vue +25 -69
  294. package/vue/UiEditorSlashMenuItem.vue +67 -115
  295. package/vue/UiEditorSurface.vue +19 -63
  296. package/vue/UiEditorTableContextMenu.vue +135 -269
  297. package/vue/UiEditorTableOverlay.d.ts +2 -2
  298. package/vue/UiEditorTableOverlay.vue +310 -479
  299. package/vue/UiEditorTableToolbar.d.ts +2 -2
  300. package/vue/UiEditorTableToolbar.vue +182 -357
  301. package/vue/UiEditorToolbar.vue +143 -183
  302. package/vue/UiFloatingActionButton.vue +70 -114
  303. package/vue/UiFormField.d.ts +1 -1
  304. package/vue/UiFormField.vue +76 -117
  305. package/vue/UiGrid.d.ts +1 -1
  306. package/vue/UiGrid.vue +65 -103
  307. package/vue/UiIcon.vue +32 -106
  308. package/vue/UiIconButton.d.ts +2 -2
  309. package/vue/UiIconButton.vue +359 -411
  310. package/vue/UiImage.vue +145 -180
  311. package/vue/UiInput.vue +158 -190
  312. package/vue/UiInputGroup.vue +199 -239
  313. package/vue/UiList.vue +67 -109
  314. package/vue/UiListItem.vue +154 -201
  315. package/vue/UiListbox.d.ts +10 -7
  316. package/vue/UiListbox.vue +86 -260
  317. package/vue/UiMenu.d.ts +11 -11
  318. package/vue/UiMenu.vue +118 -152
  319. package/vue/UiMenuGroup.vue +21 -67
  320. package/vue/UiMenuItem.d.ts +19 -16
  321. package/vue/UiMenuItem.vue +169 -262
  322. package/vue/UiMeter.d.ts +4 -4
  323. package/vue/UiMeter.vue +166 -680
  324. package/vue/UiNavItem.vue +140 -213
  325. package/vue/UiPageHeader.vue +81 -127
  326. package/vue/UiPopover.d.ts +7 -7
  327. package/vue/UiPopover.vue +90 -129
  328. package/vue/UiRadio.d.ts +12 -9
  329. package/vue/UiRadio.vue +91 -149
  330. package/vue/UiRadioGroup.d.ts +2 -2
  331. package/vue/UiRadioGroup.vue +47 -85
  332. package/vue/UiReel.vue +89 -130
  333. package/vue/UiScrollArea.d.ts +1 -1
  334. package/vue/UiScrollArea.vue +78 -119
  335. package/vue/UiSearchResultRow.vue +96 -149
  336. package/vue/UiSearchShell.d.ts +2 -2
  337. package/vue/UiSearchShell.vue +159 -196
  338. package/vue/UiSection.vue +105 -149
  339. package/vue/UiSelect.d.ts +1 -1
  340. package/vue/UiSelect.vue +114 -146
  341. package/vue/UiSeparator.vue +42 -85
  342. package/vue/UiSidebar.d.ts +10 -7
  343. package/vue/UiSidebar.vue +193 -260
  344. package/vue/UiSpinner.vue +54 -130
  345. package/vue/UiStack.vue +66 -107
  346. package/vue/UiStatusMessage.d.ts +1 -1
  347. package/vue/UiStatusMessage.vue +61 -135
  348. package/vue/UiSwitch.d.ts +12 -9
  349. package/vue/UiSwitch.vue +136 -194
  350. package/vue/UiSwitcher.vue +69 -107
  351. package/vue/UiTable.vue +121 -156
  352. package/vue/UiTabs.d.ts +1 -1
  353. package/vue/UiTabs.vue +139 -267
  354. package/vue/UiText.d.ts +4 -4
  355. package/vue/UiText.vue +145 -184
  356. package/vue/UiTextarea.d.ts +2 -2
  357. package/vue/UiTextarea.vue +162 -194
  358. package/vue/UiToast.vue +70 -118
  359. package/vue/UiToastRegion.vue +157 -276
  360. package/vue/UiTooltip.d.ts +21 -18
  361. package/vue/UiTooltip.vue +174 -234
  362. package/vue/UiTopBar.vue +48 -76
  363. package/vue/UiTree.vue +46 -79
  364. package/vue/UiTreeItem.d.ts +18 -15
  365. package/vue/UiTreeItem.vue +526 -668
  366. package/vue/chunks/UiActionBar.js +5 -17
  367. package/vue/chunks/UiAffordanceScope.js +7 -26
  368. package/vue/chunks/UiAvatar.js +20 -74
  369. package/vue/chunks/UiAvatarGroup.js +14 -56
  370. package/vue/chunks/UiBadge.js +10 -28
  371. package/vue/chunks/UiBreadcrumbItem.js +11 -41
  372. package/vue/chunks/UiBreadcrumbs.js +7 -25
  373. package/vue/chunks/UiButton.js +80 -103
  374. package/vue/chunks/UiCallout.js +9 -27
  375. package/vue/chunks/UiCard.js +33 -53
  376. package/vue/chunks/UiCheckbox.js +14 -46
  377. package/vue/chunks/UiCluster.js +13 -31
  378. package/vue/chunks/UiCombobox.js +99 -237
  379. package/vue/chunks/UiContainer.js +9 -27
  380. package/vue/chunks/UiContextMenu.js +7 -26
  381. package/vue/chunks/UiCover.js +7 -25
  382. package/vue/chunks/UiDescriptionItem.js +6 -24
  383. package/vue/chunks/UiDescriptionList.js +9 -27
  384. package/vue/chunks/UiDialog.js +18 -47
  385. package/vue/chunks/UiDisclosure.js +19 -66
  386. package/vue/chunks/UiEditable.js +18 -60
  387. package/vue/chunks/UiEditorBlockActions.js +127 -0
  388. package/vue/chunks/UiEditorImageToolbar.js +40 -127
  389. package/vue/chunks/UiEditorInsertTableGrid.js +14 -112
  390. package/vue/chunks/UiEditorLinkCard.js +356 -0
  391. package/vue/chunks/UiEditorMentionMenu.js +16 -54
  392. package/vue/chunks/UiEditorMentionMenuItem.js +10 -28
  393. package/vue/chunks/UiEditorSlashMenu.js +17 -46
  394. package/vue/chunks/UiEditorSlashMenuGroup.js +7 -25
  395. package/vue/chunks/UiEditorSlashMenuItem.js +16 -31
  396. package/vue/chunks/UiEditorSurface.js +7 -25
  397. package/vue/chunks/UiEditorTableContextMenu.js +25 -102
  398. package/vue/chunks/UiEditorTableOverlay.js +41 -104
  399. package/vue/chunks/UiEditorTableToolbar.js +44 -122
  400. package/vue/chunks/UiEditorToolbar.js +7 -26
  401. package/vue/chunks/UiFloatingActionButton.js +10 -28
  402. package/vue/chunks/UiFormField.js +8 -27
  403. package/vue/chunks/UiGrid.js +10 -28
  404. package/vue/chunks/UiIcon.js +21 -74
  405. package/vue/chunks/UiIconButton.js +18 -50
  406. package/vue/chunks/UiImage.js +14 -33
  407. package/vue/chunks/UiInput.js +12 -31
  408. package/vue/chunks/UiInputGroup.js +10 -29
  409. package/vue/chunks/UiList.js +17 -37
  410. package/vue/chunks/UiListItem.js +12 -30
  411. package/vue/chunks/UiListbox.js +22 -124
  412. package/vue/chunks/UiMenu.js +13 -32
  413. package/vue/chunks/UiMenuGroup.js +8 -26
  414. package/vue/chunks/UiMenuItem.js +35 -80
  415. package/vue/chunks/UiMeter.js +17 -351
  416. package/vue/chunks/UiNavItem.js +23 -57
  417. package/vue/chunks/UiPageHeader.js +7 -25
  418. package/vue/chunks/UiPopover.js +9 -28
  419. package/vue/chunks/UiRadio.js +11 -43
  420. package/vue/chunks/UiRadioGroup.js +13 -32
  421. package/vue/chunks/UiReel.js +10 -28
  422. package/vue/chunks/UiScrollArea.js +10 -29
  423. package/vue/chunks/UiSearchResultRow.js +10 -28
  424. package/vue/chunks/UiSearchShell.js +9 -28
  425. package/vue/chunks/UiSection.js +9 -27
  426. package/vue/chunks/UiSelect.js +10 -29
  427. package/vue/chunks/UiSeparator.js +10 -28
  428. package/vue/chunks/UiSidebar.js +15 -47
  429. package/vue/chunks/UiSpinner.js +8 -44
  430. package/vue/chunks/UiStack.js +12 -30
  431. package/vue/chunks/UiStatusMessage.js +10 -42
  432. package/vue/chunks/UiSwitch.js +11 -43
  433. package/vue/chunks/UiSwitcher.js +9 -28
  434. package/vue/chunks/UiTable.js +7 -26
  435. package/vue/chunks/UiTabs.js +15 -91
  436. package/vue/chunks/UiText.js +148 -168
  437. package/vue/chunks/UiTextarea.js +16 -35
  438. package/vue/chunks/UiToast.js +13 -37
  439. package/vue/chunks/UiToastRegion.js +16 -88
  440. package/vue/chunks/UiTooltip.js +14 -46
  441. package/vue/chunks/UiTopBar.js +5 -17
  442. package/vue/chunks/UiTree.js +13 -32
  443. package/vue/chunks/UiTreeItem.js +34 -90
  444. package/vue/chunks/_plugin-vue_export-helper.js +904 -1
  445. package/vue/chunks/control.js +3 -0
  446. package/vue/chunks/props.js +1 -1
  447. package/vue/components.css +7689 -7617
  448. package/vue/editor/index.js +30 -95
  449. package/vue/editor/primitives.d.ts +8 -2
  450. package/vue/host.ts +999 -14
  451. package/vue/index.d.ts +2 -0
  452. package/vue/index.js +5 -3
  453. package/vue/chunks/host.js +0 -443
@@ -1,8 +1,16 @@
1
- <!-- Generated by HTML Next 1.0.0-alpha.35 for Vue 3.5. Do not edit. -->
1
+ <!-- Generated by HTML Next 1.0.0-alpha.51 for Vue 3.5. Do not edit. -->
2
2
  <script setup lang="ts">
3
3
  import { computed, getCurrentInstance, ref, watchSyncEffect } from 'vue'
4
4
  import type { PropType } from 'vue'
5
- import { createDispatch, useComponentHost } from './host'
5
+ import {
6
+ attribute,
7
+ checkHydratedRoot,
8
+ concat,
9
+ createDispatch,
10
+ nativeAttrs,
11
+ useComponentHost,
12
+ useReflectedProp,
13
+ } from './host'
6
14
  import { checkedProp, propValidityState, vPropValidity } from './props'
7
15
  import UiSpinner from './UiSpinner.vue'
8
16
 
@@ -211,38 +219,7 @@ void checkedProps.value
211
219
  watchSyncEffect(() => {
212
220
  void checkedProps.value
213
221
  })
214
- function nativeAttrs(attrs: Record<string, unknown>): Record<string, unknown> {
215
- const names = Object.keys(attrs)
216
- if (!names.some((name) => Object.hasOwn(Object.prototype, name))) return attrs
217
- return Object.fromEntries(names.map((name) => [
218
- Object.hasOwn(Object.prototype, name)
219
- ? name === '__proto__' ? '__Proto__' : name[0]!.toUpperCase() + name.slice(1)
220
- : name,
221
- attrs[name],
222
- ]))
223
- }
224
- const componentInstance = getCurrentInstance()
225
- function reflectedProp(
226
- name: string,
227
- kebab: string,
228
- value: unknown,
229
- fallback: string | undefined,
230
- bound: boolean,
231
- separator?: string,
232
- ): string | undefined {
233
- const incoming = componentInstance?.vnode.props
234
- if (
235
- !bound
236
- && (incoming === null || incoming === undefined
237
- || (!Object.hasOwn(incoming, name) && !Object.hasOwn(incoming, kebab)))
238
- ) return fallback
239
- if (value === null || value === undefined) return undefined
240
- return Array.isArray(value) && separator !== undefined
241
- ? value.join(separator)
242
- : typeof value === 'object'
243
- ? JSON.stringify(value)
244
- : String(value)
245
- }
222
+ const reflectedProp = useReflectedProp()
246
223
  const hydrationInstance = getCurrentInstance()
247
224
 
248
225
  const root = ref<HTMLElement | null>(null)
@@ -284,22 +261,7 @@ const guarded = computed(() => {
284
261
  concat(checkedProps.value.loading || checkedProps.value.pending),
285
262
  ))
286
263
  })
287
- const hydrationNode = hydrationInstance?.vnode.el
288
- if (
289
- typeof window !== 'undefined' && hydrationNode != null
290
- && (!(hydrationNode instanceof Element) || hydrationNode.localName !== ('button'))
291
- ) {
292
- throw Object.assign(
293
- new Error('HR005: Server markup for <ui-icon-button> has an incompatible root.'),
294
- {
295
- name: 'HtmlDiagnosticError',
296
- diagnostic: Object.freeze({
297
- code: 'HR005',
298
- message: 'Server markup for <ui-icon-button> has an incompatible root.',
299
- }),
300
- },
301
- )
302
- }
264
+ checkHydratedRoot('button', 'ui-icon-button')
303
265
 
304
266
  /** The values the styles' :host-state() rules test. */
305
267
  const hostState = computed(() =>
@@ -354,42 +316,11 @@ useComponentHost(() => import('../components/ui-icon-button/ui-icon-button.js'),
354
316
  propValidity: (name: string) =>
355
317
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
356
318
  })
357
-
358
- function text(value: unknown): string {
359
- if (Array.isArray(value)) return value.map(text).join(' ')
360
- return value === null || value === undefined || typeof value === 'object' ? '' : String(value)
361
- }
362
-
363
- function attribute(value: unknown): any {
364
- if (
365
- value === null || value === undefined || value === false
366
- || (typeof value === 'object' && !Array.isArray(value))
367
- ) return undefined
368
- return value === true ? '' : text(value)
369
- }
370
-
371
- // A nonempty scalar call cannot produce the invalid-result sentinel.
372
- type ConcatResult<T extends unknown[]> = T extends
373
- [
374
- string | number | boolean | null | undefined,
375
- ...(string | number | boolean | null | undefined)[],
376
- ] ? string | undefined
377
- : string | symbol | undefined
378
- function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
379
- if (values.some(value => value === Symbol.for('html-next.invalid-result'))) {
380
- return Symbol.for('html-next.invalid-result') as ConcatResult<T>
381
- }
382
- if (values.some(value => value === undefined)) return undefined as ConcatResult<T>
383
- if (values.length === 0 || values.some(value => typeof value === 'object' && value !== null)) {
384
- return Symbol.for('html-next.invalid-result') as ConcatResult<T>
385
- }
386
- return values.map(value => value === null ? '' : String(value)).join('') as ConcatResult<T>
387
- }
388
319
  </script>
389
320
 
390
321
  <template>
391
322
  <button
392
- data-component="ui-icon-button"
323
+ class="ui-icon-button"
393
324
  type="button"
394
325
  v-bind="nativeAttrs($attrs)"
395
326
  :disabled="checkedProps.disabled ?? undefined"
@@ -411,7 +342,7 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
411
342
  :data-ui-icon-button-state="hostState || undefined"
412
343
  ref="root"
413
344
  >
414
- <UiSpinner v-if="checkedProps.loading || checkedProps.pending" size="sm" />
345
+ <UiSpinner v-if="checkedProps.loading || checkedProps.pending" class="ui-spinner" size="sm" />
415
346
  <span class="content"><slot /></span>
416
347
  </button>
417
348
  </template>
@@ -495,152 +426,178 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
495
426
  inherits: false;
496
427
  }
497
428
 
498
- [data-component~="ui-icon-button"] {
499
- /* Optional inherited action-group values keep text and icon actions under the same light.
500
- One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
501
- A single ambient lift avoids stacking a face gradient or another inset bevel. */
502
- --_ui-action-start: 1px;
503
- --_ui-action-edge: var(
504
- --ui-action-edge,
505
- inset var(--_ui-action-start) 1px 0 light-dark(
506
- rgb(255 255 255 / 0.08),
507
- rgb(255 255 255 / 0.06)
508
- ),
509
- inset calc(-1 * var(--_ui-action-start)) -1px 0 light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.08))
510
- );
511
- --_ui-action-shadow:
512
- var(--_ui-action-edge),
513
- 0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
514
- /* Hooks do not inherit, so the parts below read them from the root. */
515
- --_ui-icon-button-icon-size: var(--ui-icon-button-icon-size);
516
- --_ui-icon-button-icon-stroke-width: var(--ui-icon-button-icon-stroke-width);
517
-
518
- display: inline-flex;
519
- color: var(--ui-text-secondary);
520
- }
429
+ /* Omitted tone retains the existing accent solid; explicit neutral is additive. */
521
430
 
522
- [data-component~="ui-icon-button"]:dir(rtl) {
523
- --_ui-action-start: -1px;
524
- }
431
+ /* At rest an anticipatory button shows only its guide dot. The icon grows into place when
432
+ proximity, hover, or focus reveals it; the button's hit area and guide remain stable. */
525
433
 
526
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="tone=accent"] {
527
- --_icon-button-border: var(--ui-accent-solid);
528
- --_icon-button-hover-border: var(--ui-accent-hover);
529
- --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
530
- --_icon-button-outline-surface: color-mix(
531
- in srgb,
532
- var(--ui-accent-solid) 5%,
533
- var(--ui-surface-default)
534
- );
535
- color: var(--_icon-button-text);
536
- }
434
+ /* A touch target without a bigger button: an invisible hit area, at least the control
435
+ minimum, centred on the button (::before is the anticipatory guide). */
537
436
 
538
- /* Omitted tone retains the existing accent solid; explicit neutral is additive. */
539
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="tone=neutral"] {
540
- --_icon-button-solid-surface: var(--ui-text-primary);
541
- --_icon-button-solid-hover-surface: var(--ui-text-primary);
542
- --_icon-button-solid-text: var(--ui-surface-default);
543
- }
437
+ /* A text button's companion uses control geometry; compact icon buttons keep their own density. */
544
438
 
545
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] {
546
- position: relative;
547
- }
439
+ /* Native toggle state persists after pointer release, including during loading. */
548
440
 
549
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]::before {
550
- content: "";
551
- position: absolute;
552
- inset: 50% auto auto 50%;
553
- z-index: 1;
554
- inline-size: var(--ui-affordance-guide-size);
555
- block-size: var(--ui-affordance-guide-size);
556
- border-radius: var(--ui-radius-round);
557
- background: var(--ui-affordance-guide-color, var(--ui-border-strong));
558
- opacity: calc(var(--ui-affordance-guide-opacity) * var(--ui-affordance-scope-guide, 1));
559
- transform: translate(-50%, -50%);
560
- transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
561
- pointer-events: none;
562
- }
441
+ /* Disabled is a flat neutral control, independent of the active variant's tone. */
563
442
 
564
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-ui-icon-button-state~="guide=bar"]::before {
565
- inline-size: 2px;
566
- block-size: 20px;
567
- background: var(--ui-border-strong);
568
- opacity: 1;
569
- }
443
+ /* A component that sets its display still honours the hidden attribute on its root. */
570
444
 
571
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:disabled::before {
572
- opacity: 0;
573
- }
445
+ @scope (.ui-icon-button) to (.ui-spinner) {
446
+ :scope:where(:scope) {
447
+ /* Optional inherited action-group values keep text and icon actions under the same light.
448
+ One fine top/start highlight follows the bottom/end lowlight at a joined action seam.
449
+ A single ambient lift avoids stacking a face gradient or another inset bevel. */
450
+ --_ui-action-start: 1px;
451
+ --_ui-action-edge: var(
452
+ --ui-action-edge,
453
+ inset var(--_ui-action-start) 1px 0 light-dark(
454
+ rgb(255 255 255 / 0.08),
455
+ rgb(255 255 255 / 0.06)
456
+ ),
457
+ inset calc(-1 * var(--_ui-action-start)) -1px 0 light-dark(
458
+ rgb(0 0 0 / 0.08),
459
+ rgb(0 0 0 / 0.08)
460
+ )
461
+ );
462
+ --_ui-action-shadow:
463
+ var(--_ui-action-edge),
464
+ 0 1px 2px light-dark(rgb(0 0 0 / 0.10), rgb(0 0 0 / 0.20));
465
+ /* Hooks do not inherit, so the parts below read them from the root. */
466
+ --_ui-icon-button-icon-size: var(--ui-icon-button-icon-size);
467
+ --_ui-icon-button-icon-stroke-width: var(--ui-icon-button-icon-stroke-width);
468
+
469
+ display: inline-flex;
470
+ color: var(--ui-text-secondary);
471
+ }
574
472
 
575
- /* At rest an anticipatory button shows only its guide dot. The icon grows into place when
576
- proximity, hover, or focus reveals it; the button's hit area and guide remain stable. */
577
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content {
578
- opacity: 1;
579
- transform: scale(1);
580
- transition:
581
- opacity var(--ui-motion-fast) var(--ui-motion-ease),
582
- transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
583
- }
473
+ :scope:where(:scope):is(:dir(rtl)) {
474
+ --_ui-action-start: -1px;
475
+ }
584
476
 
585
- @media (hover: hover) and (pointer: fine) {
586
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
587
- border-color: transparent;
588
- background-color: transparent;
589
- box-shadow: none;
477
+ :scope:where(:scope):is([data-ui-icon-button-state~="tone=accent"]) {
478
+ --_icon-button-border: var(--ui-accent-solid);
479
+ --_icon-button-hover-border: var(--ui-accent-hover);
480
+ --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
481
+ --_icon-button-outline-surface: color-mix(
482
+ in srgb,
483
+ var(--ui-accent-solid) 5%,
484
+ var(--ui-surface-default)
485
+ );
486
+ color: var(--_icon-button-text);
487
+ }
488
+ :scope:where(:scope):is([data-ui-icon-button-state~="tone=neutral"]) {
489
+ --_icon-button-solid-surface: var(--ui-text-primary);
490
+ --_icon-button-solid-hover-surface: var(--ui-text-primary);
491
+ --_icon-button-solid-text: var(--ui-surface-default);
590
492
  }
591
493
 
592
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
593
- .content {
594
- opacity: 0;
595
- transform: scale(0.65);
596
- transition-duration: var(--ui-motion-fast);
494
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"]) {
495
+ position: relative;
597
496
  }
598
- }
599
497
 
600
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:is([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
601
- opacity: 0;
602
- }
498
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"])::before {
499
+ content: "";
500
+ position: absolute;
501
+ inset: 50% auto auto 50%;
502
+ z-index: 1;
503
+ inline-size: var(--ui-affordance-guide-size);
504
+ block-size: var(--ui-affordance-guide-size);
505
+ border-radius: var(--ui-radius-round);
506
+ background: var(--ui-affordance-guide-color, var(--ui-border-strong));
507
+ opacity: calc(var(--ui-affordance-guide-opacity) * var(--ui-affordance-scope-guide, 1));
508
+ transform: translate(-50%, -50%);
509
+ transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
510
+ pointer-events: none;
511
+ }
603
512
 
604
- [data-component~="ui-icon-button"] {
605
- /* The size prop resolves here; --ui-icon-button-size overrides it on an element. */
606
- --_size: 2rem;
607
- appearance: none;
608
- inline-size: var(--ui-icon-button-size, var(--_size));
609
- block-size: var(--ui-icon-button-size, var(--_size));
610
- min-inline-size: var(--ui-icon-button-size, var(--_size));
611
- min-block-size: var(--ui-icon-button-size, var(--_size));
612
- padding: 0;
613
- margin: 0;
614
- border: var(--ui-border-width) solid transparent;
615
- border-radius: var(--ui-icon-button-radius, var(--ui-action-radius, var(--ui-radius-md)));
616
- background-color: var(--ui-icon-button-surface, transparent);
617
- color: inherit;
618
- display: inline-flex;
619
- align-items: center;
620
- justify-content: center;
621
- cursor: pointer;
622
- transition:
623
- background-color var(--ui-motion-fast) var(--ui-motion-ease),
624
- border-color var(--ui-motion-fast) var(--ui-motion-ease),
625
- color var(--ui-motion-fast) var(--ui-motion-ease),
626
- box-shadow var(--ui-motion-base) var(--ui-motion-ease),
627
- scale var(--ui-motion-fast) var(--ui-motion-ease);
628
- }
513
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"][data-ui-icon-button-state~="guide=bar"])::before {
514
+ inline-size: 2px;
515
+ block-size: 20px;
516
+ background: var(--ui-border-strong);
517
+ opacity: 1;
518
+ }
629
519
 
630
- @media (hover: none), (pointer: coarse) {
631
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]::before {
520
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"]:disabled)::before {
632
521
  opacity: 0;
633
522
  }
634
- }
523
+ :scope[data-ui-icon-button-state~="anticipatory"] .content {
524
+ opacity: 1;
525
+ transform: scale(1);
526
+ transition:
527
+ opacity var(--ui-motion-fast) var(--ui-motion-ease),
528
+ transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
529
+ }
635
530
 
636
- /* A touch target without a bigger button: an invisible hit area, at least the control
637
- minimum, centred on the button (::before is the anticipatory guide). */
638
- @media (pointer: coarse) {
639
- [data-component~="ui-icon-button"] {
531
+ @media (hover: hover) and (pointer: fine) {
532
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)) {
533
+ border-color: transparent;
534
+ background-color: transparent;
535
+ box-shadow: none;
536
+ }
537
+
538
+ :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
539
+ .content {
540
+ opacity: 0;
541
+ transform: scale(0.65);
542
+ transition-duration: var(--ui-motion-fast);
543
+ }
544
+ }
545
+
546
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"]:is(:scope[data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible))::before {
547
+ opacity: 0;
548
+ }
549
+
550
+ :scope:where(:scope) {
551
+ /* The size prop resolves here; --ui-icon-button-size overrides it on an element. */
552
+ --_size: 2rem;
553
+ appearance: none;
554
+ inline-size: var(--ui-icon-button-size, var(--_size));
555
+ block-size: var(--ui-icon-button-size, var(--_size));
556
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
557
+ min-block-size: var(--ui-icon-button-size, var(--_size));
558
+ padding: 0;
559
+ margin: 0;
560
+ border: var(--ui-border-width) solid transparent;
561
+ border-radius: var(--ui-icon-button-radius, var(--ui-action-radius, var(--ui-radius-md)));
562
+ background-color: var(--ui-icon-button-surface, transparent);
563
+ color: inherit;
564
+ display: inline-flex;
565
+ align-items: center;
566
+ justify-content: center;
567
+ cursor: pointer;
568
+ transition:
569
+ background-color var(--ui-motion-fast) var(--ui-motion-ease),
570
+ border-color var(--ui-motion-fast) var(--ui-motion-ease),
571
+ color var(--ui-motion-fast) var(--ui-motion-ease),
572
+ box-shadow var(--ui-motion-base) var(--ui-motion-ease),
573
+ scale var(--ui-motion-fast) var(--ui-motion-ease);
574
+ }
575
+
576
+ @media (hover: none), (pointer: coarse) {
577
+ :scope:where(:scope):is([data-ui-icon-button-state~="anticipatory"])::before {
578
+ opacity: 0;
579
+ }
580
+ }
581
+ @media (pointer: coarse) {
582
+ :scope:where(:scope) {
583
+ position: relative;
584
+ }
585
+
586
+ :scope:where(:scope)::after {
587
+ content: "";
588
+ position: absolute;
589
+ inset: 50% auto auto 50%;
590
+ inline-size: max(100%, var(--ui-control-min-block-size));
591
+ block-size: max(100%, var(--ui-control-min-block-size));
592
+ transform: translate(-50%, -50%);
593
+ }
594
+ }
595
+
596
+ :scope:where(:scope):is(html[data-ui-input-modality="touch"] *) {
640
597
  position: relative;
641
598
  }
642
599
 
643
- [data-component~="ui-icon-button"]::after {
600
+ :scope:where(:scope):is(html[data-ui-input-modality="touch"] *)::after {
644
601
  content: "";
645
602
  position: absolute;
646
603
  inset: 50% auto auto 50%;
@@ -648,242 +605,233 @@ function concat<T extends unknown[]>(...values: T): ConcatResult<T> {
648
605
  block-size: max(100%, var(--ui-control-min-block-size));
649
606
  transform: translate(-50%, -50%);
650
607
  }
651
- }
652
-
653
- html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"] {
654
- position: relative;
655
- }
656
608
 
657
- html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"]::after {
658
- content: "";
659
- position: absolute;
660
- inset: 50% auto auto 50%;
661
- inline-size: max(100%, var(--ui-control-min-block-size));
662
- block-size: max(100%, var(--ui-control-min-block-size));
663
- transform: translate(-50%, -50%);
664
- }
609
+ :scope:where(:scope):is([data-ui-icon-button-state~="size=sm"]) {
610
+ --_size: 1.75rem;
611
+ inline-size: var(--ui-icon-button-size, var(--_size));
612
+ block-size: var(--ui-icon-button-size, var(--_size));
613
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
614
+ min-block-size: var(--ui-icon-button-size, var(--_size));
615
+ }
665
616
 
666
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"] {
667
- --_size: 1.75rem;
668
- inline-size: var(--ui-icon-button-size, var(--_size));
669
- block-size: var(--ui-icon-button-size, var(--_size));
670
- min-inline-size: var(--ui-icon-button-size, var(--_size));
671
- min-block-size: var(--ui-icon-button-size, var(--_size));
672
- }
617
+ :scope:where(:scope):is([data-ui-icon-button-state~="size=lg"]) {
618
+ --_size: 2.5rem;
619
+ inline-size: var(--ui-icon-button-size, var(--_size));
620
+ block-size: var(--ui-icon-button-size, var(--_size));
621
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
622
+ min-block-size: var(--ui-icon-button-size, var(--_size));
623
+ }
624
+ :scope:where(:scope):is([data-ui-icon-button-state~="matchButton"]) {
625
+ --_size: var(--ui-control-size-md);
626
+ block-size: auto;
627
+ align-self: stretch;
628
+ }
673
629
 
674
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"] {
675
- --_size: 2.5rem;
676
- inline-size: var(--ui-icon-button-size, var(--_size));
677
- block-size: var(--ui-icon-button-size, var(--_size));
678
- min-inline-size: var(--ui-icon-button-size, var(--_size));
679
- min-block-size: var(--ui-icon-button-size, var(--_size));
680
- }
630
+ :scope:where(:scope):is([data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=sm"]) {
631
+ --_size: var(--ui-control-size-sm);
632
+ }
681
633
 
682
- /* A text button's companion uses control geometry; compact icon buttons keep their own density. */
683
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"] {
684
- --_size: var(--ui-control-size-md);
685
- block-size: auto;
686
- align-self: stretch;
687
- }
634
+ :scope:where(:scope):is([data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=lg"]) {
635
+ --_size: var(--ui-control-size-lg);
636
+ }
688
637
 
689
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=sm"] {
690
- --_size: var(--ui-control-size-sm);
691
- }
638
+ @media (pointer: coarse) {
639
+ :scope:where(:scope):is([data-ui-icon-button-state~="matchButton"]) {
640
+ inline-size: max(var(--ui-icon-button-size, var(--_size)), var(--ui-control-min-block-size));
641
+ min-inline-size: max(
642
+ var(--ui-icon-button-size, var(--_size)),
643
+ var(--ui-control-min-block-size)
644
+ );
645
+ min-block-size: max(
646
+ var(--ui-icon-button-size, var(--_size)),
647
+ var(--ui-control-min-block-size)
648
+ );
649
+ }
650
+ }
692
651
 
693
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=lg"] {
694
- --_size: var(--ui-control-size-lg);
695
- }
652
+ :scope:where(:scope):is([data-ui-icon-button-state~="round"]) {
653
+ border-radius: var(--ui-radius-round);
654
+ }
696
655
 
697
- @media (pointer: coarse) {
698
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"] {
699
- inline-size: max(var(--ui-icon-button-size, var(--_size)), var(--ui-control-min-block-size));
700
- min-inline-size: max(
701
- var(--ui-icon-button-size, var(--_size)),
702
- var(--ui-control-min-block-size)
656
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"]) {
657
+ border-color: var(
658
+ --ui-icon-button-border,
659
+ var(--_icon-button-border, var(--ui-control-border, var(--ui-border-strong)))
703
660
  );
704
- min-block-size: max(var(--ui-icon-button-size, var(--_size)), var(--ui-control-min-block-size));
661
+ background-color: var(
662
+ --ui-icon-button-outline-surface,
663
+ var(--_icon-button-outline-surface, var(--ui-surface-default))
664
+ );
665
+ background-image: none;
666
+ color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
667
+ box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow));
705
668
  }
706
- }
707
-
708
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="round"] {
709
- border-radius: var(--ui-radius-round);
710
- }
711
-
712
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"] {
713
- border-color: var(
714
- --ui-icon-button-border,
715
- var(--_icon-button-border, var(--ui-control-border, var(--ui-border-strong)))
716
- );
717
- background-color: var(
718
- --ui-icon-button-outline-surface,
719
- var(--_icon-button-outline-surface, var(--ui-surface-default))
720
- );
721
- background-image: none;
722
- color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
723
- box-shadow: var(--ui-action-shadow, var(--_ui-action-shadow));
724
- }
725
-
726
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"] {
727
- background-color: var(
728
- --ui-icon-button-solid-surface,
729
- var(--_icon-button-solid-surface, var(--ui-accent-solid))
730
- );
731
- background-image: none;
732
- color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
733
- box-shadow: var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow)));
734
- }
735
-
736
- [data-component~="ui-icon-button"]:hover:enabled:not([aria-disabled="true"]) {
737
- /* Derived from the text colour so the ghost hover shows on any background. */
738
- background-color: var(
739
- --ui-icon-button-hover-surface,
740
- color-mix(in srgb, currentColor 8%, transparent)
741
- );
742
- color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
743
- }
744
669
 
745
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"]:hover:enabled:not([aria-disabled="true"]) {
746
- border-color: var(
747
- --ui-icon-button-hover-border,
748
- var(--_icon-button-hover-border, var(--ui-control-border-hover, var(--ui-control-border)))
749
- );
750
- }
670
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=solid"]) {
671
+ background-color: var(
672
+ --ui-icon-button-solid-surface,
673
+ var(--_icon-button-solid-surface, var(--ui-accent-solid))
674
+ );
675
+ background-image: none;
676
+ color: var(
677
+ --ui-icon-button-solid-text,
678
+ var(--_icon-button-solid-text, var(--ui-text-on-accent))
679
+ );
680
+ box-shadow: var(
681
+ --ui-icon-button-solid-shadow,
682
+ var(--ui-action-shadow, var(--_ui-action-shadow))
683
+ );
684
+ }
751
685
 
752
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"]:hover:enabled:not([aria-disabled="true"]) {
753
- background-color: var(
754
- --ui-icon-button-solid-hover-surface,
755
- var(--_icon-button-solid-hover-surface, var(--ui-accent-hover))
756
- );
757
- }
686
+ :scope:where(:scope):is(:hover:enabled:not([aria-disabled="true"])) {
687
+ /* Derived from the text colour so the ghost hover shows on any background. */
688
+ background-color: var(
689
+ --ui-icon-button-hover-surface,
690
+ color-mix(in srgb, currentColor 8%, transparent)
691
+ );
692
+ color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
693
+ }
758
694
 
759
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=accent"]:hover:enabled:not([aria-disabled="true"]),
760
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=neutral"]:hover:enabled:not([aria-disabled="true"]) {
761
- color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
762
- }
695
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"]:hover:enabled:not([aria-disabled="true"])) {
696
+ border-color: var(
697
+ --ui-icon-button-hover-border,
698
+ var(--_icon-button-hover-border, var(--ui-control-border-hover, var(--ui-control-border)))
699
+ );
700
+ }
763
701
 
764
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"][aria-expanded="true"]:enabled:not([aria-disabled="true"]) {
765
- background-color: var(
766
- --ui-icon-button-active-surface,
767
- color-mix(in srgb, currentColor 16%, transparent)
768
- );
769
- color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
770
- box-shadow: var(--ui-pressed);
771
- }
702
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=solid"]:hover:enabled:not([aria-disabled="true"])) {
703
+ background-color: var(
704
+ --ui-icon-button-solid-hover-surface,
705
+ var(--_icon-button-solid-hover-surface, var(--ui-accent-hover))
706
+ );
707
+ }
772
708
 
773
- /* Native toggle state persists after pointer release, including during loading. */
774
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled {
775
- background-color: var(
776
- --ui-icon-button-active-surface,
777
- color-mix(in srgb, currentColor 12%, var(--ui-surface-default))
778
- );
779
- background-image: none;
780
- box-shadow: var(--ui-pressed);
781
- }
709
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=accent"]:hover:enabled:not([aria-disabled="true"])),
710
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=neutral"]:hover:enabled:not([aria-disabled="true"])) {
711
+ color: var(
712
+ --ui-icon-button-solid-text,
713
+ var(--_icon-button-solid-text, var(--ui-text-on-accent))
714
+ );
715
+ }
782
716
 
783
- [data-component~="ui-icon-button"]:active:enabled:not([aria-disabled="true"]) {
784
- scale: var(--ui-icon-button-active-scale, 0.96);
785
- }
717
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=ghost"][aria-expanded="true"]:enabled:not([aria-disabled="true"])) {
718
+ background-color: var(
719
+ --ui-icon-button-active-surface,
720
+ color-mix(in srgb, currentColor 16%, transparent)
721
+ );
722
+ color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
723
+ box-shadow: var(--ui-pressed);
724
+ }
725
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled) {
726
+ background-color: var(
727
+ --ui-icon-button-active-surface,
728
+ color-mix(in srgb, currentColor 12%, var(--ui-surface-default))
729
+ );
730
+ background-image: none;
731
+ box-shadow: var(--ui-pressed);
732
+ }
786
733
 
787
- :is([data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"]) {
788
- cursor: progress;
789
- }
734
+ :scope:where(:scope):is(:active:enabled:not([aria-disabled="true"])) {
735
+ scale: var(--ui-icon-button-active-scale, 0.96);
736
+ }
790
737
 
791
- .content {
792
- display: inline-flex;
793
- align-items: center;
794
- justify-content: center;
795
- }
738
+ :is(:scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"]) {
739
+ cursor: progress;
740
+ }
796
741
 
797
- :is([data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"])
798
742
  .content {
799
- display: none;
800
- }
801
-
802
- @media (prefers-reduced-motion: reduce) {
803
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content {
804
- transition: none;
743
+ display: inline-flex;
744
+ align-items: center;
745
+ justify-content: center;
805
746
  }
806
- }
807
-
808
- [data-component~="ui-icon-button"]:focus-visible {
809
- outline: none;
810
- box-shadow: var(--ui-focus-halo);
811
- }
812
747
 
813
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"]:focus-visible {
814
- box-shadow:
815
- var(--ui-action-shadow, var(--_ui-action-shadow)),
816
- var(--ui-focus-halo);
817
- }
748
+ :is(:scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"])
749
+ .content {
750
+ display: none;
751
+ }
818
752
 
819
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"]:focus-visible {
820
- box-shadow:
821
- var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
822
- var(--ui-focus-halo);
823
- }
753
+ @media (prefers-reduced-motion: reduce) {
754
+ :scope[data-ui-icon-button-state~="anticipatory"] .content {
755
+ transition: none;
756
+ }
757
+ }
824
758
 
825
- [data-component~="ui-icon-button"]:is([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"]):active:enabled:not([aria-disabled="true"]) {
826
- background-image: none;
827
- box-shadow: var(--ui-pressed);
828
- }
759
+ :scope:where(:scope):is(:focus-visible) {
760
+ outline: none;
761
+ box-shadow: var(--ui-focus-halo);
762
+ }
829
763
 
830
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled:focus-visible {
831
- box-shadow:
832
- var(--ui-pressed),
833
- var(--ui-focus-halo);
834
- }
764
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"]:focus-visible) {
765
+ box-shadow:
766
+ var(--ui-action-shadow, var(--_ui-action-shadow)),
767
+ var(--ui-focus-halo);
768
+ }
835
769
 
836
- @media (forced-colors: active) {
837
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled {
838
- outline: var(--ui-focus-width) solid Highlight;
839
- outline-offset: calc(-2 * var(--ui-focus-width));
770
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=solid"]:focus-visible) {
771
+ box-shadow:
772
+ var(--ui-icon-button-solid-shadow, var(--ui-action-shadow, var(--_ui-action-shadow))),
773
+ var(--ui-focus-halo);
840
774
  }
841
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled:focus-visible {
842
- outline-offset: var(--ui-focus-width);
775
+
776
+ :scope:where(:scope):is(:is(:scope[data-ui-icon-button-state~="variant=outline"], :scope[data-ui-icon-button-state~="variant=solid"]):active:enabled:not([aria-disabled="true"])) {
777
+ background-image: none;
778
+ box-shadow: var(--ui-pressed);
843
779
  }
844
- }
845
780
 
846
- /* Disabled is a flat neutral control, independent of the active variant's tone. */
847
- [data-component~="ui-icon-button"]:disabled {
848
- border-color: var(--ui-disabled-border);
849
- background-color: var(--ui-disabled-surface);
850
- color: var(--ui-disabled-text);
851
- filter: var(--ui-icon-button-disabled-filter, var(--ui-disabled-filter));
852
- opacity: var(--ui-icon-button-disabled-opacity, 1);
853
- cursor: not-allowed;
854
- box-shadow: none;
855
- background-image: none;
856
- }
781
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled:focus-visible) {
782
+ box-shadow:
783
+ var(--ui-pressed),
784
+ var(--ui-focus-halo);
785
+ }
857
786
 
858
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"]:disabled {
859
- border-color: transparent;
860
- }
787
+ @media (forced-colors: active) {
788
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled) {
789
+ outline: var(--ui-focus-width) solid Highlight;
790
+ outline-offset: calc(-2 * var(--ui-focus-width));
791
+ }
792
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=outline"][aria-pressed="true"]:enabled:focus-visible) {
793
+ outline-offset: var(--ui-focus-width);
794
+ }
795
+ }
796
+ :scope:where(:scope):is(:disabled) {
797
+ border-color: var(--ui-disabled-border);
798
+ background-color: var(--ui-disabled-surface);
799
+ color: var(--ui-disabled-text);
800
+ filter: var(--ui-icon-button-disabled-filter, var(--ui-disabled-filter));
801
+ opacity: var(--ui-icon-button-disabled-opacity, 1);
802
+ cursor: not-allowed;
803
+ box-shadow: none;
804
+ background-image: none;
805
+ }
861
806
 
862
- [data-component~="ui-icon-button"] {
863
- --_icon-button-icon-default: var(--ui-icon-size-md);
864
- /* A slotted ui-icon is its own component, out of reach of the svg rule below; these are its
865
- defaults, which its own --ui-icon-* hooks still override. */
866
- --_ui-default-icon-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
867
- --_ui-default-icon-stroke-width: var(--_ui-icon-button-icon-stroke-width, 1.75);
868
- }
807
+ :scope:where(:scope):is([data-ui-icon-button-state~="variant=ghost"]:disabled) {
808
+ border-color: transparent;
809
+ }
869
810
 
870
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"] {
871
- --_icon-button-icon-default: var(--ui-icon-size-sm);
872
- }
811
+ :scope:where(:scope) {
812
+ --_icon-button-icon-default: var(--ui-icon-size-md);
813
+ /* A slotted ui-icon is its own component, out of reach of the svg rule below; these are its
814
+ defaults, which its own --ui-icon-* hooks still override. */
815
+ --_ui-default-icon-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
816
+ --_ui-default-icon-stroke-width: var(--_ui-icon-button-icon-stroke-width, 1.75);
817
+ }
873
818
 
874
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"] {
875
- --_icon-button-icon-default: var(--ui-icon-size-lg);
876
- }
819
+ :scope:where(:scope):is([data-ui-icon-button-state~="size=sm"]) {
820
+ --_icon-button-icon-default: var(--ui-icon-size-sm);
821
+ }
877
822
 
878
- :slotted(svg) {
879
- inline-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
880
- block-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
881
- flex-shrink: 0;
882
- stroke-width: var(--_ui-icon-button-icon-stroke-width, 1.75);
883
- }
823
+ :scope:where(:scope):is([data-ui-icon-button-state~="size=lg"]) {
824
+ --_icon-button-icon-default: var(--ui-icon-size-lg);
825
+ }
884
826
 
885
- /* A component that sets its display still honours the hidden attribute on its root. */
886
- [data-component~="ui-icon-button"][hidden] {
887
- display: none;
827
+ :slotted(svg) {
828
+ inline-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
829
+ block-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
830
+ flex-shrink: 0;
831
+ stroke-width: var(--_ui-icon-button-icon-stroke-width, 1.75);
832
+ }
833
+ :scope:where(:scope):is([hidden]) {
834
+ display: none;
835
+ }
888
836
  }
889
837
  </style>