@threadlabs/looma 0.28.4 → 0.28.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.html +96 -0
  2. package/components/ui-editor-image-toolbar/ui-editor-image-toolbar.js +56 -0
  3. package/components/ui-editor-mention-menu-item/ui-editor-mention-menu-item.html +3 -2
  4. package/dist/index.js +34 -33
  5. package/package.json +3 -2
  6. package/styles/ui-action-bar.css +13 -6
  7. package/styles/ui-affordance-scope.css +12 -5
  8. package/styles/ui-avatar-group.css +17 -10
  9. package/styles/ui-avatar.css +23 -16
  10. package/styles/ui-badge.css +78 -71
  11. package/styles/ui-breadcrumb-item.css +12 -5
  12. package/styles/ui-breadcrumbs.css +10 -3
  13. package/styles/ui-button.css +79 -72
  14. package/styles/ui-callout.css +29 -22
  15. package/styles/ui-card.css +25 -18
  16. package/styles/ui-checkbox.css +45 -37
  17. package/styles/ui-cluster.css +34 -27
  18. package/styles/ui-combobox.css +46 -39
  19. package/styles/ui-container.css +20 -13
  20. package/styles/ui-context-menu.css +17 -10
  21. package/styles/ui-cover.css +12 -5
  22. package/styles/ui-description-item.css +10 -3
  23. package/styles/ui-description-list.css +20 -13
  24. package/styles/ui-dialog.css +44 -35
  25. package/styles/ui-disclosure.css +32 -25
  26. package/styles/ui-editable.css +15 -8
  27. package/styles/ui-editor-image-toolbar.css +1 -0
  28. package/styles/ui-editor-insert-table-grid.css +11 -4
  29. package/styles/ui-editor-mention-menu-item.css +17 -8
  30. package/styles/ui-editor-mention-menu.css +14 -7
  31. package/styles/ui-editor-slash-menu-group.css +10 -3
  32. package/styles/ui-editor-slash-menu-item.css +15 -8
  33. package/styles/ui-editor-slash-menu.css +15 -8
  34. package/styles/ui-editor-surface.css +10 -3
  35. package/styles/ui-editor-table-context-menu.css +17 -10
  36. package/styles/ui-editor-table-overlay.css +17 -10
  37. package/styles/ui-editor-table-toolbar.css +22 -15
  38. package/styles/ui-editor-toolbar.css +18 -11
  39. package/styles/ui-floating-action-button.css +21 -14
  40. package/styles/ui-form-field.css +20 -13
  41. package/styles/ui-grid.css +21 -14
  42. package/styles/ui-icon-button.css +80 -73
  43. package/styles/ui-icon.css +14 -7
  44. package/styles/ui-image.css +25 -18
  45. package/styles/ui-input-group.css +34 -27
  46. package/styles/ui-input.css +42 -35
  47. package/styles/ui-list-item.css +33 -26
  48. package/styles/ui-list.css +22 -15
  49. package/styles/ui-listbox.css +22 -14
  50. package/styles/ui-menu-group.css +10 -3
  51. package/styles/ui-menu-item.css +29 -22
  52. package/styles/ui-menu.css +25 -18
  53. package/styles/ui-meter.css +36 -29
  54. package/styles/ui-nav-item.css +26 -19
  55. package/styles/ui-page-header.css +12 -5
  56. package/styles/ui-popover.css +27 -20
  57. package/styles/ui-radio-group.css +14 -6
  58. package/styles/ui-radio.css +24 -17
  59. package/styles/ui-reel.css +28 -21
  60. package/styles/ui-scroll-area.css +22 -15
  61. package/styles/ui-search-result-row.css +28 -21
  62. package/styles/ui-search-shell.css +24 -17
  63. package/styles/ui-section.css +14 -7
  64. package/styles/ui-select.css +33 -26
  65. package/styles/ui-separator.css +17 -10
  66. package/styles/ui-sidebar.css +35 -28
  67. package/styles/ui-spinner.css +32 -23
  68. package/styles/ui-stack.css +29 -21
  69. package/styles/ui-status-message.css +14 -7
  70. package/styles/ui-switch.css +29 -22
  71. package/styles/ui-switcher.css +27 -20
  72. package/styles/ui-table.css +14 -7
  73. package/styles/ui-tabs.css +24 -17
  74. package/styles/ui-text.css +35 -28
  75. package/styles/ui-textarea.css +37 -30
  76. package/styles/ui-toast-region.css +74 -63
  77. package/styles/ui-toast.css +21 -14
  78. package/styles/ui-tooltip.css +38 -31
  79. package/styles/ui-top-bar.css +19 -12
  80. package/styles/ui-tree-item.css +79 -71
  81. package/styles/ui-tree.css +18 -11
  82. package/vanilla/UiActionBar.d.ts +1 -1
  83. package/vanilla/UiActionBar.js +1 -1
  84. package/vanilla/UiAffordanceScope.d.ts +1 -1
  85. package/vanilla/UiAffordanceScope.js +1 -1
  86. package/vanilla/UiAvatar.d.ts +1 -1
  87. package/vanilla/UiAvatar.js +1 -1
  88. package/vanilla/UiAvatarGroup.d.ts +1 -1
  89. package/vanilla/UiAvatarGroup.js +1 -1
  90. package/vanilla/UiBadge.d.ts +1 -1
  91. package/vanilla/UiBadge.js +1 -1
  92. package/vanilla/UiBreadcrumbItem.d.ts +1 -1
  93. package/vanilla/UiBreadcrumbItem.js +1 -1
  94. package/vanilla/UiBreadcrumbs.d.ts +1 -1
  95. package/vanilla/UiBreadcrumbs.js +1 -1
  96. package/vanilla/UiButton.d.ts +1 -1
  97. package/vanilla/UiButton.js +19 -57
  98. package/vanilla/UiCallout.d.ts +1 -1
  99. package/vanilla/UiCallout.js +25 -73
  100. package/vanilla/UiCard.d.ts +1 -1
  101. package/vanilla/UiCard.js +1 -1
  102. package/vanilla/UiCheckbox.d.ts +1 -1
  103. package/vanilla/UiCheckbox.js +1 -1
  104. package/vanilla/UiCluster.d.ts +1 -1
  105. package/vanilla/UiCluster.js +1 -1
  106. package/vanilla/UiCombobox.d.ts +1 -1
  107. package/vanilla/UiCombobox.js +60 -166
  108. package/vanilla/UiContainer.d.ts +1 -1
  109. package/vanilla/UiContainer.js +1 -1
  110. package/vanilla/UiContextMenu.d.ts +1 -1
  111. package/vanilla/UiContextMenu.js +1 -1
  112. package/vanilla/UiCover.d.ts +1 -1
  113. package/vanilla/UiCover.js +1 -1
  114. package/vanilla/UiDescriptionItem.d.ts +1 -1
  115. package/vanilla/UiDescriptionItem.js +1 -1
  116. package/vanilla/UiDescriptionList.d.ts +1 -1
  117. package/vanilla/UiDescriptionList.js +1 -1
  118. package/vanilla/UiDialog.d.ts +1 -1
  119. package/vanilla/UiDialog.js +4 -10
  120. package/vanilla/UiDisclosure.d.ts +1 -1
  121. package/vanilla/UiDisclosure.js +1 -1
  122. package/vanilla/UiEditable.d.ts +1 -1
  123. package/vanilla/UiEditable.js +7 -19
  124. package/vanilla/UiEditorImageToolbar.d.ts +19 -0
  125. package/vanilla/UiEditorImageToolbar.js +171 -0
  126. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  127. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  128. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  129. package/vanilla/UiEditorMentionMenu.js +17 -37
  130. package/vanilla/UiEditorMentionMenuItem.d.ts +1 -1
  131. package/vanilla/UiEditorMentionMenuItem.js +4 -10
  132. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  133. package/vanilla/UiEditorSlashMenu.js +5 -4
  134. package/vanilla/UiEditorSlashMenuGroup.d.ts +1 -1
  135. package/vanilla/UiEditorSlashMenuGroup.js +1 -1
  136. package/vanilla/UiEditorSlashMenuItem.d.ts +1 -1
  137. package/vanilla/UiEditorSlashMenuItem.js +7 -19
  138. package/vanilla/UiEditorSurface.d.ts +1 -1
  139. package/vanilla/UiEditorSurface.js +1 -1
  140. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  141. package/vanilla/UiEditorTableContextMenu.js +6 -14
  142. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  143. package/vanilla/UiEditorTableOverlay.js +9 -25
  144. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  145. package/vanilla/UiEditorTableToolbar.js +25 -77
  146. package/vanilla/UiEditorToolbar.d.ts +1 -1
  147. package/vanilla/UiEditorToolbar.js +1 -1
  148. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  149. package/vanilla/UiFloatingActionButton.js +1 -1
  150. package/vanilla/UiFormField.d.ts +1 -1
  151. package/vanilla/UiFormField.js +1 -1
  152. package/vanilla/UiGrid.d.ts +1 -1
  153. package/vanilla/UiGrid.js +1 -1
  154. package/vanilla/UiIcon.d.ts +1 -1
  155. package/vanilla/UiIcon.js +15 -47
  156. package/vanilla/UiIconButton.d.ts +1 -1
  157. package/vanilla/UiIconButton.js +4 -10
  158. package/vanilla/UiImage.d.ts +1 -1
  159. package/vanilla/UiImage.js +1 -1
  160. package/vanilla/UiInput.d.ts +1 -1
  161. package/vanilla/UiInput.js +1 -1
  162. package/vanilla/UiInputGroup.d.ts +1 -1
  163. package/vanilla/UiInputGroup.js +1 -1
  164. package/vanilla/UiList.d.ts +1 -1
  165. package/vanilla/UiList.js +1 -1
  166. package/vanilla/UiListItem.d.ts +1 -1
  167. package/vanilla/UiListItem.js +1 -1
  168. package/vanilla/UiListbox.d.ts +1 -1
  169. package/vanilla/UiListbox.js +4 -10
  170. package/vanilla/UiMenu.d.ts +1 -1
  171. package/vanilla/UiMenu.js +1 -1
  172. package/vanilla/UiMenuGroup.d.ts +1 -1
  173. package/vanilla/UiMenuGroup.js +4 -10
  174. package/vanilla/UiMenuItem.d.ts +1 -1
  175. package/vanilla/UiMenuItem.js +4 -10
  176. package/vanilla/UiMeter.d.ts +1 -1
  177. package/vanilla/UiMeter.js +13 -33
  178. package/vanilla/UiNavItem.d.ts +1 -1
  179. package/vanilla/UiNavItem.js +1 -1
  180. package/vanilla/UiPageHeader.d.ts +1 -1
  181. package/vanilla/UiPageHeader.js +1 -1
  182. package/vanilla/UiPopover.d.ts +1 -1
  183. package/vanilla/UiPopover.js +1 -1
  184. package/vanilla/UiRadio.d.ts +1 -1
  185. package/vanilla/UiRadio.js +1 -1
  186. package/vanilla/UiRadioGroup.d.ts +1 -1
  187. package/vanilla/UiRadioGroup.js +1 -1
  188. package/vanilla/UiReel.d.ts +1 -1
  189. package/vanilla/UiReel.js +1 -1
  190. package/vanilla/UiScrollArea.d.ts +1 -1
  191. package/vanilla/UiScrollArea.js +1 -1
  192. package/vanilla/UiSearchResultRow.d.ts +1 -1
  193. package/vanilla/UiSearchResultRow.js +1 -1
  194. package/vanilla/UiSearchShell.d.ts +1 -1
  195. package/vanilla/UiSearchShell.js +1 -1
  196. package/vanilla/UiSection.d.ts +1 -1
  197. package/vanilla/UiSection.js +1 -1
  198. package/vanilla/UiSelect.d.ts +1 -1
  199. package/vanilla/UiSelect.js +1 -1
  200. package/vanilla/UiSeparator.d.ts +1 -1
  201. package/vanilla/UiSeparator.js +1 -1
  202. package/vanilla/UiSidebar.d.ts +1 -1
  203. package/vanilla/UiSidebar.js +1 -1
  204. package/vanilla/UiSpinner.d.ts +1 -1
  205. package/vanilla/UiSpinner.js +1 -1
  206. package/vanilla/UiStack.d.ts +1 -1
  207. package/vanilla/UiStack.js +1 -1
  208. package/vanilla/UiStatusMessage.d.ts +1 -1
  209. package/vanilla/UiStatusMessage.js +1 -1
  210. package/vanilla/UiSwitch.d.ts +1 -1
  211. package/vanilla/UiSwitch.js +1 -1
  212. package/vanilla/UiSwitcher.d.ts +1 -1
  213. package/vanilla/UiSwitcher.js +1 -1
  214. package/vanilla/UiTable.d.ts +1 -1
  215. package/vanilla/UiTable.js +1 -1
  216. package/vanilla/UiTabs.d.ts +1 -1
  217. package/vanilla/UiTabs.js +1 -1
  218. package/vanilla/UiText.d.ts +1 -1
  219. package/vanilla/UiText.js +1 -1
  220. package/vanilla/UiTextarea.d.ts +1 -1
  221. package/vanilla/UiTextarea.js +1 -1
  222. package/vanilla/UiToast.d.ts +1 -1
  223. package/vanilla/UiToast.js +1 -1
  224. package/vanilla/UiToastRegion.d.ts +1 -1
  225. package/vanilla/UiToastRegion.js +1 -1
  226. package/vanilla/UiTooltip.d.ts +1 -1
  227. package/vanilla/UiTooltip.js +1 -1
  228. package/vanilla/UiTopBar.d.ts +1 -1
  229. package/vanilla/UiTopBar.js +1 -1
  230. package/vanilla/UiTree.d.ts +1 -1
  231. package/vanilla/UiTree.js +1 -1
  232. package/vanilla/UiTreeItem.d.ts +1 -1
  233. package/vanilla/UiTreeItem.js +7 -19
  234. package/vanilla/index.js +1 -0
  235. package/vue/UiActionBar.vue +46 -78
  236. package/vue/UiAffordanceScope.vue +27 -66
  237. package/vue/UiAvatar.d.ts +10 -7
  238. package/vue/UiAvatar.vue +100 -218
  239. package/vue/UiAvatarGroup.d.ts +10 -7
  240. package/vue/UiAvatarGroup.vue +78 -160
  241. package/vue/UiBadge.d.ts +1 -1
  242. package/vue/UiBadge.vue +483 -520
  243. package/vue/UiBreadcrumbItem.vue +52 -123
  244. package/vue/UiBreadcrumbs.vue +27 -70
  245. package/vue/UiButton.d.ts +2 -2
  246. package/vue/UiButton.vue +420 -471
  247. package/vue/UiCallout.vue +131 -175
  248. package/vue/UiCard.d.ts +1 -1
  249. package/vue/UiCard.vue +112 -151
  250. package/vue/UiCheckbox.d.ts +13 -10
  251. package/vue/UiCheckbox.vue +160 -221
  252. package/vue/UiCluster.d.ts +1 -1
  253. package/vue/UiCluster.vue +84 -128
  254. package/vue/UiCombobox.d.ts +71 -68
  255. package/vue/UiCombobox.vue +417 -743
  256. package/vue/UiContainer.vue +43 -87
  257. package/vue/UiContextMenu.d.ts +6 -6
  258. package/vue/UiContextMenu.vue +78 -117
  259. package/vue/UiCover.vue +29 -69
  260. package/vue/UiDescriptionItem.vue +39 -82
  261. package/vue/UiDescriptionList.vue +64 -107
  262. package/vue/UiDialog.d.ts +22 -19
  263. package/vue/UiDialog.vue +193 -246
  264. package/vue/UiDisclosure.d.ts +22 -19
  265. package/vue/UiDisclosure.vue +192 -283
  266. package/vue/UiEditable.d.ts +5 -5
  267. package/vue/UiEditable.vue +124 -207
  268. package/vue/UiEditorImageToolbar.d.ts +54 -0
  269. package/vue/UiEditorImageToolbar.js +2 -0
  270. package/vue/UiEditorImageToolbar.vue +415 -0
  271. package/vue/UiEditorInsertTableGrid.d.ts +2 -2
  272. package/vue/UiEditorInsertTableGrid.vue +98 -266
  273. package/vue/UiEditorMentionMenu.d.ts +15 -12
  274. package/vue/UiEditorMentionMenu.vue +150 -239
  275. package/vue/UiEditorMentionMenuItem.vue +66 -110
  276. package/vue/UiEditorSlashMenu.d.ts +16 -13
  277. package/vue/UiEditorSlashMenu.vue +172 -253
  278. package/vue/UiEditorSlashMenuGroup.vue +25 -69
  279. package/vue/UiEditorSlashMenuItem.vue +67 -115
  280. package/vue/UiEditorSurface.vue +19 -63
  281. package/vue/UiEditorTableContextMenu.vue +135 -269
  282. package/vue/UiEditorTableOverlay.d.ts +2 -2
  283. package/vue/UiEditorTableOverlay.vue +310 -479
  284. package/vue/UiEditorTableToolbar.d.ts +2 -2
  285. package/vue/UiEditorTableToolbar.vue +182 -357
  286. package/vue/UiEditorToolbar.vue +143 -183
  287. package/vue/UiFloatingActionButton.vue +70 -114
  288. package/vue/UiFormField.d.ts +1 -1
  289. package/vue/UiFormField.vue +76 -117
  290. package/vue/UiGrid.d.ts +1 -1
  291. package/vue/UiGrid.vue +65 -103
  292. package/vue/UiIcon.vue +32 -106
  293. package/vue/UiIconButton.d.ts +2 -2
  294. package/vue/UiIconButton.vue +359 -411
  295. package/vue/UiImage.vue +145 -180
  296. package/vue/UiInput.vue +158 -190
  297. package/vue/UiInputGroup.vue +199 -239
  298. package/vue/UiList.vue +67 -109
  299. package/vue/UiListItem.vue +154 -201
  300. package/vue/UiListbox.d.ts +10 -7
  301. package/vue/UiListbox.vue +86 -260
  302. package/vue/UiMenu.d.ts +11 -11
  303. package/vue/UiMenu.vue +118 -152
  304. package/vue/UiMenuGroup.vue +21 -67
  305. package/vue/UiMenuItem.d.ts +19 -16
  306. package/vue/UiMenuItem.vue +169 -262
  307. package/vue/UiMeter.d.ts +4 -4
  308. package/vue/UiMeter.vue +166 -680
  309. package/vue/UiNavItem.vue +140 -213
  310. package/vue/UiPageHeader.vue +81 -127
  311. package/vue/UiPopover.d.ts +7 -7
  312. package/vue/UiPopover.vue +90 -129
  313. package/vue/UiRadio.d.ts +12 -9
  314. package/vue/UiRadio.vue +91 -149
  315. package/vue/UiRadioGroup.d.ts +2 -2
  316. package/vue/UiRadioGroup.vue +47 -85
  317. package/vue/UiReel.vue +89 -130
  318. package/vue/UiScrollArea.d.ts +1 -1
  319. package/vue/UiScrollArea.vue +78 -119
  320. package/vue/UiSearchResultRow.vue +96 -149
  321. package/vue/UiSearchShell.d.ts +2 -2
  322. package/vue/UiSearchShell.vue +159 -196
  323. package/vue/UiSection.vue +105 -149
  324. package/vue/UiSelect.d.ts +1 -1
  325. package/vue/UiSelect.vue +114 -146
  326. package/vue/UiSeparator.vue +42 -85
  327. package/vue/UiSidebar.d.ts +10 -7
  328. package/vue/UiSidebar.vue +193 -260
  329. package/vue/UiSpinner.vue +54 -130
  330. package/vue/UiStack.vue +66 -107
  331. package/vue/UiStatusMessage.d.ts +1 -1
  332. package/vue/UiStatusMessage.vue +61 -135
  333. package/vue/UiSwitch.d.ts +12 -9
  334. package/vue/UiSwitch.vue +136 -194
  335. package/vue/UiSwitcher.vue +69 -107
  336. package/vue/UiTable.vue +121 -156
  337. package/vue/UiTabs.d.ts +1 -1
  338. package/vue/UiTabs.vue +139 -267
  339. package/vue/UiText.d.ts +4 -4
  340. package/vue/UiText.vue +145 -184
  341. package/vue/UiTextarea.d.ts +2 -2
  342. package/vue/UiTextarea.vue +162 -194
  343. package/vue/UiToast.vue +70 -118
  344. package/vue/UiToastRegion.vue +157 -276
  345. package/vue/UiTooltip.d.ts +21 -18
  346. package/vue/UiTooltip.vue +174 -234
  347. package/vue/UiTopBar.vue +48 -76
  348. package/vue/UiTree.vue +46 -79
  349. package/vue/UiTreeItem.d.ts +18 -15
  350. package/vue/UiTreeItem.vue +526 -668
  351. package/vue/chunks/UiActionBar.js +5 -17
  352. package/vue/chunks/UiAffordanceScope.js +7 -26
  353. package/vue/chunks/UiAvatar.js +20 -74
  354. package/vue/chunks/UiAvatarGroup.js +14 -56
  355. package/vue/chunks/UiBadge.js +10 -28
  356. package/vue/chunks/UiBreadcrumbItem.js +11 -41
  357. package/vue/chunks/UiBreadcrumbs.js +7 -25
  358. package/vue/chunks/UiButton.js +80 -103
  359. package/vue/chunks/UiCallout.js +9 -27
  360. package/vue/chunks/UiCard.js +33 -53
  361. package/vue/chunks/UiCheckbox.js +14 -46
  362. package/vue/chunks/UiCluster.js +13 -31
  363. package/vue/chunks/UiCombobox.js +99 -237
  364. package/vue/chunks/UiContainer.js +9 -27
  365. package/vue/chunks/UiContextMenu.js +7 -26
  366. package/vue/chunks/UiCover.js +7 -25
  367. package/vue/chunks/UiDescriptionItem.js +6 -24
  368. package/vue/chunks/UiDescriptionList.js +9 -27
  369. package/vue/chunks/UiDialog.js +18 -47
  370. package/vue/chunks/UiDisclosure.js +19 -66
  371. package/vue/chunks/UiEditable.js +18 -60
  372. package/vue/chunks/UiEditorImageToolbar.js +515 -0
  373. package/vue/chunks/UiEditorInsertTableGrid.js +14 -112
  374. package/vue/chunks/UiEditorMentionMenu.js +16 -54
  375. package/vue/chunks/UiEditorMentionMenuItem.js +10 -28
  376. package/vue/chunks/UiEditorSlashMenu.js +17 -46
  377. package/vue/chunks/UiEditorSlashMenuGroup.js +7 -25
  378. package/vue/chunks/UiEditorSlashMenuItem.js +16 -31
  379. package/vue/chunks/UiEditorSurface.js +7 -25
  380. package/vue/chunks/UiEditorTableContextMenu.js +25 -102
  381. package/vue/chunks/UiEditorTableOverlay.js +41 -104
  382. package/vue/chunks/UiEditorTableToolbar.js +44 -122
  383. package/vue/chunks/UiEditorToolbar.js +7 -26
  384. package/vue/chunks/UiFloatingActionButton.js +10 -28
  385. package/vue/chunks/UiFormField.js +8 -27
  386. package/vue/chunks/UiGrid.js +10 -28
  387. package/vue/chunks/UiIcon.js +21 -74
  388. package/vue/chunks/UiIconButton.js +18 -50
  389. package/vue/chunks/UiImage.js +14 -33
  390. package/vue/chunks/UiInput.js +12 -31
  391. package/vue/chunks/UiInputGroup.js +10 -29
  392. package/vue/chunks/UiList.js +17 -37
  393. package/vue/chunks/UiListItem.js +12 -30
  394. package/vue/chunks/UiListbox.js +22 -124
  395. package/vue/chunks/UiMenu.js +13 -32
  396. package/vue/chunks/UiMenuGroup.js +8 -26
  397. package/vue/chunks/UiMenuItem.js +35 -80
  398. package/vue/chunks/UiMeter.js +17 -351
  399. package/vue/chunks/UiNavItem.js +23 -57
  400. package/vue/chunks/UiPageHeader.js +7 -25
  401. package/vue/chunks/UiPopover.js +9 -28
  402. package/vue/chunks/UiRadio.js +11 -43
  403. package/vue/chunks/UiRadioGroup.js +13 -32
  404. package/vue/chunks/UiReel.js +10 -28
  405. package/vue/chunks/UiScrollArea.js +10 -29
  406. package/vue/chunks/UiSearchResultRow.js +10 -28
  407. package/vue/chunks/UiSearchShell.js +9 -28
  408. package/vue/chunks/UiSection.js +9 -27
  409. package/vue/chunks/UiSelect.js +10 -29
  410. package/vue/chunks/UiSeparator.js +10 -28
  411. package/vue/chunks/UiSidebar.js +15 -47
  412. package/vue/chunks/UiSpinner.js +8 -44
  413. package/vue/chunks/UiStack.js +12 -30
  414. package/vue/chunks/UiStatusMessage.js +10 -42
  415. package/vue/chunks/UiSwitch.js +11 -43
  416. package/vue/chunks/UiSwitcher.js +9 -28
  417. package/vue/chunks/UiTable.js +7 -26
  418. package/vue/chunks/UiTabs.js +15 -91
  419. package/vue/chunks/UiText.js +148 -168
  420. package/vue/chunks/UiTextarea.js +16 -35
  421. package/vue/chunks/UiToast.js +13 -37
  422. package/vue/chunks/UiToastRegion.js +16 -88
  423. package/vue/chunks/UiTooltip.js +14 -46
  424. package/vue/chunks/UiTopBar.js +5 -17
  425. package/vue/chunks/UiTree.js +13 -32
  426. package/vue/chunks/UiTreeItem.js +34 -90
  427. package/vue/chunks/_plugin-vue_export-helper.js +904 -1
  428. package/vue/chunks/control.js +3 -0
  429. package/vue/chunks/props.js +1 -1
  430. package/vue/components.css +7902 -7830
  431. package/vue/editor/index.js +42 -171
  432. package/vue/editor/primitives.d.ts +9 -1
  433. package/vue/host.ts +999 -14
  434. package/vue/index.d.ts +1 -0
  435. package/vue/index.js +9 -8
  436. package/vue/chunks/host.js +0 -443
  437. package/vue/editor/image-controls.d.ts +0 -19
@@ -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>