@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
package/vue/UiBadge.vue CHANGED
@@ -1,7 +1,8 @@
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
- import { computed, getCurrentInstance, watchSyncEffect } from 'vue'
3
+ import { computed, watchSyncEffect } from 'vue'
4
4
  import type { PropType } from 'vue'
5
+ import { checkHydratedRoot, nativeAttrs, useReflectedProp } from './host'
5
6
  import { checkedProp, vPropValidity } from './props'
6
7
 
7
8
  defineOptions({ inheritAttrs: false })
@@ -105,53 +106,9 @@ void checkedProps.value
105
106
  watchSyncEffect(() => {
106
107
  void checkedProps.value
107
108
  })
108
- function nativeAttrs(attrs: Record<string, unknown>): Record<string, unknown> {
109
- const names = Object.keys(attrs)
110
- if (!names.some((name) => Object.hasOwn(Object.prototype, name))) return attrs
111
- return Object.fromEntries(names.map((name) => [
112
- Object.hasOwn(Object.prototype, name)
113
- ? name === '__proto__' ? '__Proto__' : name[0]!.toUpperCase() + name.slice(1)
114
- : name,
115
- attrs[name],
116
- ]))
117
- }
118
- const componentInstance = getCurrentInstance()
119
- function reflectedProp(
120
- name: string,
121
- kebab: string,
122
- value: unknown,
123
- fallback: string | undefined,
124
- bound: boolean,
125
- separator?: string,
126
- ): string | undefined {
127
- const incoming = componentInstance?.vnode.props
128
- if (
129
- !bound
130
- && (incoming === null || incoming === undefined
131
- || (!Object.hasOwn(incoming, name) && !Object.hasOwn(incoming, kebab)))
132
- ) return fallback
133
- if (value === null || value === undefined) return undefined
134
- return Array.isArray(value) && separator !== undefined
135
- ? value.join(separator)
136
- : typeof value === 'object'
137
- ? JSON.stringify(value)
138
- : String(value)
139
- }
140
- const hydrationInstance = getCurrentInstance()
141
-
142
- const hydrationNode = hydrationInstance?.vnode.el
143
- if (
144
- typeof window !== 'undefined' && hydrationNode != null
145
- && (!(hydrationNode instanceof Element) || hydrationNode.localName !== ('span'))
146
- ) {
147
- throw Object.assign(new Error('HR005: Server markup for <ui-badge> has an incompatible root.'), {
148
- name: 'HtmlDiagnosticError',
149
- diagnostic: Object.freeze({
150
- code: 'HR005',
151
- message: 'Server markup for <ui-badge> has an incompatible root.',
152
- }),
153
- })
154
- }
109
+ const reflectedProp = useReflectedProp()
110
+
111
+ checkHydratedRoot('span', 'ui-badge')
155
112
 
156
113
  /** The values the styles' :host-state() rules test. */
157
114
  const hostState = computed(() =>
@@ -171,7 +128,7 @@ const hostState = computed(() =>
171
128
 
172
129
  <template>
173
130
  <span
174
- data-component="ui-badge"
131
+ class="ui-badge"
175
132
  v-bind="nativeAttrs($attrs)"
176
133
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
177
134
  :data-shape="reflectedProp('shape', 'shape', checkedProps.shape, undefined, false)"
@@ -246,536 +203,542 @@ const hostState = computed(() =>
246
203
  inherits: false;
247
204
  }
248
205
 
249
- [data-component~="ui-badge"] {
250
- --_badge-surface: color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default));
251
- --_badge-text: var(--ui-text-secondary);
252
- /* Sit between the soft fill and its stronger theme ink. */
253
- --_badge-border: color-mix(in srgb, var(--_badge-surface) 75%, var(--_badge-text) 25%);
254
- /* --ui-badge-color derives a wash and an ink from one colour, between the tone and the explicit
255
- surface, text, and border hooks. Each value is invalid, so the tone shows, while it is unset. The
256
- mixes keep 4.5:1 text contrast for any colour, in a light theme or a dark one. */
257
- --_ui-badge-color: var(--ui-badge-color);
258
- --_badge-color-wash: color-mix(in oklab, var(--_ui-badge-color) 13%, var(--ui-surface-default));
259
- --_badge-color-ink: color-mix(in oklab, var(--_ui-badge-color) 35%, var(--ui-text-primary));
260
- --_badge-color-surface: var(--_badge-color-wash);
261
- --_badge-color-border: color-mix(
262
- in srgb,
263
- var(--_badge-color-wash) 75%,
264
- var(--_badge-color-ink) 25%
265
- );
266
- --_badge-color-text: var(--_badge-color-ink);
267
- --_badge-outline-surface: var(
268
- --ui-badge-surface,
269
- var(--_badge-color-surface, var(--_badge-surface))
270
- );
271
-
272
- display: inline-flex;
273
- align-items: center;
274
- justify-content: center;
275
- gap: var(--ui-space-1);
276
- box-sizing: border-box;
277
- min-inline-size: 0;
278
- max-inline-size: 100%;
279
- padding: var(--ui-badge-padding-block, var(--ui-space-0-5))
280
- var(--ui-badge-padding-inline, var(--ui-space-2));
281
- border: var(--ui-border-width) solid
282
- var(--ui-badge-border, var(--_badge-color-border, var(--_badge-border)));
283
- border-radius: var(--ui-radius-round);
284
- background: var(--_badge-outline-surface);
285
- color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-text)));
286
- font-family: var(--ui-font-family-sans);
287
- font-size: var(--ui-badge-font-size, var(--ui-font-size-sm));
288
- font-weight: var(--ui-badge-font-weight, var(--ui-font-medium));
289
- line-height: var(--ui-badge-line-height, var(--ui-line-height-tight));
290
- white-space: nowrap;
291
- }
292
-
293
206
  /* A constrained badge keeps its surface intact and ellipsizes only its label. The full
294
207
  text stays in the DOM for accessible names and consumers' selected values. */
295
- .label {
296
- display: block;
297
- min-inline-size: 0;
298
- overflow: hidden;
299
- text-overflow: ellipsis;
300
- }
301
-
302
- .label:empty {
303
- display: none;
304
- }
305
208
 
306
209
  /* Icon content has its own flex item so label ellipsis never clips its strokes. */
307
- .icon {
308
- display: inline-flex;
309
- align-items: center;
310
- justify-content: center;
311
- flex: none;
312
- }
313
-
314
- .icon:empty {
315
- display: none;
316
- }
317
-
318
- .icon :slotted(svg) {
319
- display: block;
320
- inline-size: 1em;
321
- block-size: 1em;
322
- flex: none;
323
- }
324
210
 
325
211
  /* Ordinary icon-plus-text children keep inline ellipsis, with explicit glyph spacing. */
326
- .label :slotted(svg) {
327
- inline-size: 1em;
328
- block-size: 1em;
329
- vertical-align: middle;
330
- margin-inline-end: var(--ui-space-1);
331
- }
332
-
333
- .label:has(svg) {
334
- text-box-trim: none;
335
- }
336
212
 
337
213
  /* Center the capital/baseline text box, while clipping only inline overflow for ellipsis.
338
214
  Vertical ink remains visible so trimming never cuts off ascenders or descenders. */
339
- @supports (text-box-trim: trim-both) {
340
- [data-component~="ui-badge"] {
341
- display: inline-block;
342
- min-block-size: var(--ui-badge-min-block-size, 1.5rem);
343
- text-align: center;
344
- align-content: center;
345
- text-box-trim: none;
346
- }
347
- [data-component~="ui-badge"]:has(.icon:not(:empty)),
348
- [data-component~="ui-badge"]:has(.label svg) {
349
- display: inline-flex;
350
- text-box-trim: none;
351
- }
352
- .label:not(:has(svg)) {
353
- text-box-trim: trim-both;
354
- text-box-edge: cap alphabetic;
355
- overflow-x: clip;
356
- overflow-y: visible;
357
- }
358
- }
359
215
 
360
- [data-component~="ui-badge"][data-ui-badge-state~="size=xs"] {
361
- box-sizing: border-box;
362
- min-inline-size: 1rem;
363
- min-block-size: var(--ui-badge-min-block-size, 1rem);
364
- /* Compact text still needs room at both rounded edges. Fixed marks override this
365
- padding below; ordinary text badges retain their larger spacing. */
366
- padding: var(--ui-badge-padding-block, 0) var(--ui-badge-padding-inline, var(--ui-space-1));
367
- font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
368
- line-height: var(--ui-badge-line-height, 1);
369
- }
216
+ /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
217
+ invalid while the hook is unset. */
370
218
 
371
- [data-component~="ui-badge"][data-ui-badge-state~="size=sm"] {
372
- font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
373
- line-height: var(--ui-badge-line-height, 1);
374
- }
219
+ /* A translucent inverse surface picks up its filled control's tone. Deepen the tone ink
220
+ toward the theme text to retain contrast against that composed surface. */
375
221
 
376
- [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"] {
377
- --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
378
- --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
379
- --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
380
- }
222
+ /* A circular count has a tone-tinted surface, a separate lighter rim and readable tone ink.
223
+ Dark controls retain a shaded surface and theme ink with a quieter rim. */
381
224
 
382
- [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"] {
383
- --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
384
- --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
385
- --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
386
- }
225
+ /* A count can keep its containing control's contrasting ink instead of reversing it.
226
+ The faint fill preserves text contrast; a quiet boundary separates the count from its control. */
387
227
 
388
- [data-component~="ui-badge"][data-ui-badge-state~="tone=success"] {
389
- --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
390
- --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
391
- --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
392
- }
228
+ /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
229
+ surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
393
230
 
394
- [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"] {
395
- --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
396
- --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
397
- --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
398
- }
231
+ /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
399
232
 
400
- [data-component~="ui-badge"][data-ui-badge-state~="tone=info"] {
401
- --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
402
- --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
403
- --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
404
- }
233
+ /* A visible glyph needs fixed geometry, unlike a content-sized pill or a hidden-label dot. */
405
234
 
406
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"] {
407
- --_badge-surface: color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default));
408
- --_badge-border: color-mix(in srgb, var(--ui-accent-solid) 25%, var(--ui-surface-default));
409
- --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
410
- }
235
+ /* Center capital and numeral ink, rather than the font's ascent/descent line box.
236
+ Icon labels retain flex geometry; untrimmed browsers keep that fallback too. */
411
237
 
412
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"] {
413
- --_badge-surface: color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default));
414
- --_badge-border: color-mix(in srgb, var(--ui-danger-solid) 25%, var(--ui-surface-default));
415
- --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
416
- }
238
+ /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
417
239
 
418
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"] {
419
- --_badge-surface: color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default));
420
- --_badge-border: color-mix(in srgb, var(--ui-success-solid) 25%, var(--ui-surface-default));
421
- --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
422
- }
240
+ /* The clipped point needs an inset surface over an outer border-colour shape: a native border
241
+ has no diagonal edge to follow. Keep this edge for every tag variant. */
423
242
 
424
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"] {
425
- --_badge-surface: color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default));
426
- --_badge-border: color-mix(in srgb, var(--ui-warning-solid) 25%, var(--ui-surface-default));
427
- --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
428
- }
243
+ /* A component that sets its display still honours the hidden attribute on its root. */
429
244
 
430
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"] {
431
- --_badge-surface: color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default));
432
- --_badge-border: color-mix(in srgb, var(--ui-info-solid) 25%, var(--ui-surface-default));
433
- --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
434
- }
245
+ @scope (.ui-badge) {
246
+ :scope:where(:scope) {
247
+ --_badge-surface: color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default));
248
+ --_badge-text: var(--ui-text-secondary);
249
+ /* Sit between the soft fill and its stronger theme ink. */
250
+ --_badge-border: color-mix(in srgb, var(--_badge-surface) 75%, var(--_badge-text) 25%);
251
+ /* --ui-badge-color derives a wash and an ink from one colour, between the tone and the explicit
252
+ surface, text, and border hooks. Each value is invalid, so the tone shows, while it is unset. The
253
+ mixes keep 4.5:1 text contrast for any colour, in a light theme or a dark one. */
254
+ --_ui-badge-color: var(--ui-badge-color);
255
+ --_badge-color-wash: color-mix(in oklab, var(--_ui-badge-color) 13%, var(--ui-surface-default));
256
+ --_badge-color-ink: color-mix(in oklab, var(--_ui-badge-color) 35%, var(--ui-text-primary));
257
+ --_badge-color-surface: var(--_badge-color-wash);
258
+ --_badge-color-border: color-mix(
259
+ in srgb,
260
+ var(--_badge-color-wash) 75%,
261
+ var(--_badge-color-ink) 25%
262
+ );
263
+ --_badge-color-text: var(--_badge-color-ink);
264
+ --_badge-outline-surface: var(
265
+ --ui-badge-surface,
266
+ var(--_badge-color-surface, var(--_badge-surface))
267
+ );
435
268
 
436
- /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
437
- invalid while the hook is unset. */
438
- [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"] {
439
- --_badge-color-surface: var(--_badge-color-ink);
440
- --_badge-color-border: var(--_badge-color-ink);
441
- --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
442
- }
269
+ display: inline-flex;
270
+ align-items: center;
271
+ justify-content: center;
272
+ gap: var(--ui-space-1);
273
+ box-sizing: border-box;
274
+ min-inline-size: 0;
275
+ max-inline-size: 100%;
276
+ padding: var(--ui-badge-padding-block, var(--ui-space-0-5))
277
+ var(--ui-badge-padding-inline, var(--ui-space-2));
278
+ border: var(--ui-border-width) solid
279
+ var(--ui-badge-border, var(--_badge-color-border, var(--_badge-border)));
280
+ border-radius: var(--ui-radius-round);
281
+ background: var(--_badge-outline-surface);
282
+ color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-text)));
283
+ font-family: var(--ui-font-family-sans);
284
+ font-size: var(--ui-badge-font-size, var(--ui-font-size-sm));
285
+ font-weight: var(--ui-badge-font-weight, var(--ui-font-medium));
286
+ line-height: var(--ui-badge-line-height, var(--ui-line-height-tight));
287
+ white-space: nowrap;
288
+ }
289
+ .label {
290
+ display: block;
291
+ min-inline-size: 0;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ }
443
295
 
444
- /* A translucent inverse surface picks up its filled control's tone. Deepen the tone ink
445
- toward the theme text to retain contrast against that composed surface. */
446
- [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"] {
447
- --_badge-color-surface: color-mix(
448
- in srgb,
449
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%,
450
- transparent
451
- );
452
- --_badge-color-border: var(--_badge-color-surface);
453
- --_badge-color-text: color-mix(in srgb, var(--_badge-color-ink) 85%, var(--ui-text-primary));
454
- --_badge-outline-surface: var(
455
- --ui-badge-surface,
456
- var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent))
457
- );
458
- border-color: var(
459
- --ui-badge-border,
460
- var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent))
461
- );
462
- color: var(
463
- --ui-badge-text,
464
- var(--_badge-color-text, color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary)))
465
- );
466
- /* Paint each translucent layer once, including the border, without a bright double-painted ring. */
467
- background-clip: padding-box;
468
- }
296
+ .label:empty {
297
+ display: none;
298
+ }
299
+ .icon {
300
+ display: inline-flex;
301
+ align-items: center;
302
+ justify-content: center;
303
+ flex: none;
304
+ }
469
305
 
470
- /* A circular count has a tone-tinted surface, a separate lighter rim and readable tone ink.
471
- Dark controls retain a shaded surface and theme ink with a quieter rim. */
472
- [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="shape=circle"] {
473
- --_badge-color-surface: light-dark(
474
- color-mix(
475
- in srgb,
476
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) var(
477
- --ui-badge-circle-opacity,
478
- 66%
479
- ),
480
- transparent
481
- ),
482
- color-mix(
483
- in srgb,
484
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) var(
485
- --ui-badge-circle-opacity,
486
- 56%
487
- ),
488
- transparent
489
- )
490
- );
491
- --_badge-color-border: light-dark(
492
- color-mix(
493
- in srgb,
494
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%,
495
- transparent
496
- ),
497
- color-mix(
498
- in srgb,
499
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 44%,
500
- transparent
501
- )
502
- );
503
- --_badge-color-text: light-dark(
504
- color-mix(in srgb, var(--_badge-color-ink) 65%, var(--ui-text-primary)),
505
- color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-text-primary))
506
- );
507
- --_badge-count-surface: light-dark(
508
- color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 66%), transparent),
509
- color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 56%), transparent)
510
- );
511
- --_badge-outline-surface: var(
512
- --ui-badge-surface,
513
- var(--_badge-color-surface, var(--_badge-count-surface))
514
- );
515
- border-color: var(
516
- --ui-badge-border,
517
- var(
518
- --_badge-color-border,
519
- light-dark(
520
- color-mix(in srgb, var(--_badge-text) 88%, transparent),
521
- color-mix(in srgb, var(--_badge-text) 44%, transparent)
522
- )
523
- )
524
- );
525
- color: var(
526
- --ui-badge-text,
527
- var(
528
- --_badge-color-text,
529
- light-dark(
530
- color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)),
531
- var(--ui-text-primary)
532
- )
533
- )
534
- );
535
- box-shadow: 0 1px 1px light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.12));
536
- }
306
+ .icon:empty {
307
+ display: none;
308
+ }
537
309
 
538
- /* A count can keep its containing control's contrasting ink instead of reversing it.
539
- The faint fill preserves text contrast; a quiet boundary separates the count from its control. */
540
- [data-component~="ui-badge"][data-ui-badge-state~="variant=overlay"] {
541
- --_badge-outline-surface: var(
542
- --ui-badge-surface,
543
- color-mix(in srgb, currentColor 6%, transparent)
544
- );
545
- color: var(--ui-badge-text, inherit);
546
- border-color: var(--ui-badge-border, color-mix(in srgb, currentColor 20%, transparent));
547
- box-shadow: none;
548
- }
310
+ .icon :slotted(svg) {
311
+ display: block;
312
+ inline-size: 1em;
313
+ block-size: 1em;
314
+ flex: none;
315
+ }
316
+ .label :slotted(svg) {
317
+ inline-size: 1em;
318
+ block-size: 1em;
319
+ vertical-align: middle;
320
+ margin-inline-end: var(--ui-space-1);
321
+ }
549
322
 
550
- /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
551
- surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
552
- [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"] {
553
- color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-surface)));
554
- }
323
+ .label:has(svg) {
324
+ text-box-trim: none;
325
+ }
326
+ @supports (text-box-trim: trim-both) {
327
+ :scope:where(:scope) {
328
+ display: inline-block;
329
+ min-block-size: var(--ui-badge-min-block-size, 1.5rem);
330
+ text-align: center;
331
+ align-content: center;
332
+ text-box-trim: none;
333
+ }
334
+ :scope:where(:scope):is(:has(.icon:not(:empty))), :scope:where(:scope):is(:has(.label svg)) {
335
+ display: inline-flex;
336
+ text-box-trim: none;
337
+ }
338
+ .label:not(:has(svg)) {
339
+ text-box-trim: trim-both;
340
+ text-box-edge: cap alphabetic;
341
+ overflow-x: clip;
342
+ overflow-y: visible;
343
+ }
344
+ }
555
345
 
556
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"] {
557
- --_badge-surface: var(--ui-surface-default);
558
- --_badge-border: var(--ui-border-strong);
559
- --_badge-text: var(--ui-text-secondary);
560
- /* An outline colour keeps the surface and draws its edge and text in the ink. */
561
- --_badge-color-surface: initial;
562
- --_badge-color-border: var(--_badge-color-ink);
563
- }
346
+ :scope:where(:scope):is([data-ui-badge-state~="size=xs"]) {
347
+ box-sizing: border-box;
348
+ min-inline-size: 1rem;
349
+ min-block-size: var(--ui-badge-min-block-size, 1rem);
350
+ /* Compact text still needs room at both rounded edges. Fixed marks override this
351
+ padding below; ordinary text badges retain their larger spacing. */
352
+ padding: var(--ui-badge-padding-block, 0) var(--ui-badge-padding-inline, var(--ui-space-1));
353
+ font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
354
+ line-height: var(--ui-badge-line-height, 1);
355
+ }
564
356
 
565
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"] {
566
- --_badge-border: var(--ui-accent-solid);
567
- --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
568
- }
357
+ :scope:where(:scope):is([data-ui-badge-state~="size=sm"]) {
358
+ font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
359
+ line-height: var(--ui-badge-line-height, 1);
360
+ }
569
361
 
570
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"] {
571
- --_badge-border: var(--ui-danger-solid);
572
- --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
573
- }
362
+ :scope:where(:scope):is([data-ui-badge-state~="tone=accent"]) {
363
+ --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
364
+ --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
365
+ --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
366
+ }
574
367
 
575
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"] {
576
- --_badge-border: var(--ui-success-solid);
577
- --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
578
- }
368
+ :scope:where(:scope):is([data-ui-badge-state~="tone=danger"]) {
369
+ --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
370
+ --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
371
+ --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
372
+ }
579
373
 
580
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"] {
581
- --_badge-border: var(--ui-warning-solid);
582
- --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
583
- }
374
+ :scope:where(:scope):is([data-ui-badge-state~="tone=success"]) {
375
+ --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
376
+ --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
377
+ --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
378
+ }
584
379
 
585
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"] {
586
- --_badge-border: var(--ui-info-solid);
587
- --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
588
- }
380
+ :scope:where(:scope):is([data-ui-badge-state~="tone=warning"]) {
381
+ --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
382
+ --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
383
+ --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
384
+ }
589
385
 
590
- /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
591
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] {
592
- --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2));
593
- display: inline-flex;
594
- box-sizing: border-box;
595
- flex: none;
596
- inline-size: var(--_badge-square-size);
597
- block-size: var(--_badge-square-size);
598
- min-inline-size: var(--_badge-square-size);
599
- min-block-size: var(--_badge-square-size);
600
- padding: 0;
601
- border-radius: var(--ui-radius-md);
602
- text-box-trim: none;
603
- }
386
+ :scope:where(:scope):is([data-ui-badge-state~="tone=info"]) {
387
+ --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
388
+ --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
389
+ --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
390
+ }
604
391
 
605
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"] {
606
- --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
607
- }
392
+ :scope:where(:scope):is([data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"]) {
393
+ --_badge-surface: color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default));
394
+ --_badge-border: color-mix(in srgb, var(--ui-accent-solid) 25%, var(--ui-surface-default));
395
+ --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
396
+ }
608
397
 
609
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=lg"] {
610
- --_badge-square-size: var(
611
- --ui-badge-square-size,
612
- calc(var(--ui-space-4) * 2 + var(--ui-space-2))
613
- );
614
- }
398
+ :scope:where(:scope):is([data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"]) {
399
+ --_badge-surface: color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default));
400
+ --_badge-border: color-mix(in srgb, var(--ui-danger-solid) 25%, var(--ui-surface-default));
401
+ --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
402
+ }
615
403
 
616
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label {
617
- display: inline-flex;
618
- align-items: center;
619
- justify-content: center;
620
- }
404
+ :scope:where(:scope):is([data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"]) {
405
+ --_badge-surface: color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default));
406
+ --_badge-border: color-mix(in srgb, var(--ui-success-solid) 25%, var(--ui-surface-default));
407
+ --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
408
+ }
621
409
 
622
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label :slotted(svg) {
623
- margin-inline-end: 0;
624
- }
410
+ :scope:where(:scope):is([data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"]) {
411
+ --_badge-surface: color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default));
412
+ --_badge-border: color-mix(in srgb, var(--ui-warning-solid) 25%, var(--ui-surface-default));
413
+ --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
414
+ }
625
415
 
626
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label:empty {
627
- display: none;
628
- }
416
+ :scope:where(:scope):is([data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"]) {
417
+ --_badge-surface: color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default));
418
+ --_badge-border: color-mix(in srgb, var(--ui-info-solid) 25%, var(--ui-surface-default));
419
+ --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
420
+ }
421
+ :scope:where(:scope):is([data-ui-badge-state~="variant=solid"]) {
422
+ --_badge-color-surface: var(--_badge-color-ink);
423
+ --_badge-color-border: var(--_badge-color-ink);
424
+ --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
425
+ }
426
+ :scope:where(:scope):is([data-ui-badge-state~="variant=inverse"]) {
427
+ --_badge-color-surface: color-mix(
428
+ in srgb,
429
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%,
430
+ transparent
431
+ );
432
+ --_badge-color-border: var(--_badge-color-surface);
433
+ --_badge-color-text: color-mix(in srgb, var(--_badge-color-ink) 85%, var(--ui-text-primary));
434
+ --_badge-outline-surface: var(
435
+ --ui-badge-surface,
436
+ var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent))
437
+ );
438
+ border-color: var(
439
+ --ui-badge-border,
440
+ var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent))
441
+ );
442
+ color: var(
443
+ --ui-badge-text,
444
+ var(
445
+ --_badge-color-text,
446
+ color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary))
447
+ )
448
+ );
449
+ /* Paint each translucent layer once, including the border, without a bright double-painted ring. */
450
+ background-clip: padding-box;
451
+ }
452
+ :scope:where(:scope):is([data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="shape=circle"]) {
453
+ --_badge-color-surface: light-dark(
454
+ color-mix(
455
+ in srgb,
456
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) var(
457
+ --ui-badge-circle-opacity,
458
+ 66%
459
+ ),
460
+ transparent
461
+ ),
462
+ color-mix(
463
+ in srgb,
464
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) var(
465
+ --ui-badge-circle-opacity,
466
+ 56%
467
+ ),
468
+ transparent
469
+ )
470
+ );
471
+ --_badge-color-border: light-dark(
472
+ color-mix(
473
+ in srgb,
474
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%,
475
+ transparent
476
+ ),
477
+ color-mix(
478
+ in srgb,
479
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 44%,
480
+ transparent
481
+ )
482
+ );
483
+ --_badge-color-text: light-dark(
484
+ color-mix(in srgb, var(--_badge-color-ink) 65%, var(--ui-text-primary)),
485
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-text-primary))
486
+ );
487
+ --_badge-count-surface: light-dark(
488
+ color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 66%), transparent),
489
+ color-mix(in srgb, var(--_badge-text) var(--ui-badge-circle-opacity, 56%), transparent)
490
+ );
491
+ --_badge-outline-surface: var(
492
+ --ui-badge-surface,
493
+ var(--_badge-color-surface, var(--_badge-count-surface))
494
+ );
495
+ border-color: var(
496
+ --ui-badge-border,
497
+ var(
498
+ --_badge-color-border,
499
+ light-dark(
500
+ color-mix(in srgb, var(--_badge-text) 88%, transparent),
501
+ color-mix(in srgb, var(--_badge-text) 44%, transparent)
502
+ )
503
+ )
504
+ );
505
+ color: var(
506
+ --ui-badge-text,
507
+ var(
508
+ --_badge-color-text,
509
+ light-dark(
510
+ color-mix(in srgb, var(--_badge-surface) 65%, var(--ui-text-primary)),
511
+ var(--ui-text-primary)
512
+ )
513
+ )
514
+ );
515
+ box-shadow: 0 1px 1px light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.12));
516
+ }
517
+ :scope:where(:scope):is([data-ui-badge-state~="variant=overlay"]) {
518
+ --_badge-outline-surface: var(
519
+ --ui-badge-surface,
520
+ color-mix(in srgb, currentColor 6%, transparent)
521
+ );
522
+ color: var(--ui-badge-text, inherit);
523
+ border-color: var(--ui-badge-border, color-mix(in srgb, currentColor 20%, transparent));
524
+ box-shadow: none;
525
+ }
526
+ :scope:where(:scope):is([data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"]) {
527
+ color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-surface)));
528
+ }
629
529
 
630
- /* A visible glyph needs fixed geometry, unlike a content-sized pill or a hidden-label dot. */
631
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] {
632
- --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-3) * 2));
633
- display: inline-flex;
634
- flex: none;
635
- inline-size: var(--_badge-circle-size);
636
- block-size: var(--_badge-circle-size);
637
- min-inline-size: var(--_badge-circle-size);
638
- min-block-size: var(--_badge-circle-size);
639
- padding: 0;
640
- border-radius: var(--ui-radius-round);
641
- text-box-trim: none;
642
- }
530
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"]) {
531
+ --_badge-surface: var(--ui-surface-default);
532
+ --_badge-border: var(--ui-border-strong);
533
+ --_badge-text: var(--ui-text-secondary);
534
+ /* An outline colour keeps the surface and draws its edge and text in the ink. */
535
+ --_badge-color-surface: initial;
536
+ --_badge-color-border: var(--_badge-color-ink);
537
+ }
643
538
 
644
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=sm"][data-ui-badge-state~="variant=overlay"] {
645
- --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) + var(--ui-space-1)));
646
- }
539
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"]) {
540
+ --_badge-border: var(--ui-accent-solid);
541
+ --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
542
+ }
647
543
 
648
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=xs"] {
649
- --_badge-circle-size: var(--ui-badge-circle-size, var(--ui-space-4));
650
- }
544
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"]) {
545
+ --_badge-border: var(--ui-danger-solid);
546
+ --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
547
+ }
651
548
 
652
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=lg"] {
653
- --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) * 2));
654
- }
549
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"]) {
550
+ --_badge-border: var(--ui-success-solid);
551
+ --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
552
+ }
655
553
 
656
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label {
657
- display: inline-flex;
658
- align-items: center;
659
- justify-content: center;
660
- line-height: 1;
661
- text-box-trim: none;
662
- }
554
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"]) {
555
+ --_badge-border: var(--ui-warning-solid);
556
+ --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
557
+ }
663
558
 
664
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label :slotted(svg) {
665
- margin-inline-end: 0;
666
- }
559
+ :scope:where(:scope):is([data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"]) {
560
+ --_badge-border: var(--ui-info-solid);
561
+ --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
562
+ }
563
+ :scope:where(:scope):is([data-ui-badge-state~="shape=square"]) {
564
+ --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2));
565
+ display: inline-flex;
566
+ box-sizing: border-box;
567
+ flex: none;
568
+ inline-size: var(--_badge-square-size);
569
+ block-size: var(--_badge-square-size);
570
+ min-inline-size: var(--_badge-square-size);
571
+ min-block-size: var(--_badge-square-size);
572
+ padding: 0;
573
+ border-radius: var(--ui-radius-md);
574
+ text-box-trim: none;
575
+ }
667
576
 
668
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label:empty {
669
- display: none;
670
- }
577
+ :scope:where(:scope):is([data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"]) {
578
+ --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
579
+ }
671
580
 
672
- /* Center capital and numeral ink, rather than the font's ascent/descent line box.
673
- Icon labels retain flex geometry; untrimmed browsers keep that fallback too. */
674
- @supports (text-box-trim: trim-both) {
675
- [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label:not(:has(svg)),
676
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label:not(:has(svg)) {
677
- display: block;
678
- text-box-trim: trim-both;
679
- text-box-edge: cap alphabetic;
680
- overflow: visible;
581
+ :scope:where(:scope):is([data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=lg"]) {
582
+ --_badge-square-size: var(
583
+ --ui-badge-square-size,
584
+ calc(var(--ui-space-4) * 2 + var(--ui-space-2))
585
+ );
681
586
  }
682
- }
683
587
 
684
- /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
685
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] {
686
- position: relative;
687
- box-sizing: border-box;
688
- flex: none;
689
- inline-size: var(--ui-badge-dot-size, var(--ui-space-2));
690
- block-size: var(--ui-badge-dot-size, var(--ui-space-2));
691
- min-inline-size: var(--ui-badge-dot-size, var(--ui-space-2));
692
- min-block-size: var(--ui-badge-dot-size, var(--ui-space-2));
693
- padding: 0;
694
- border-radius: var(--ui-radius-round);
695
- text-box-trim: none;
696
- }
588
+ :scope[data-ui-badge-state~="shape=square"] .label {
589
+ display: inline-flex;
590
+ align-items: center;
591
+ justify-content: center;
592
+ }
697
593
 
698
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] .label {
699
- position: absolute;
700
- inline-size: 1px;
701
- block-size: 1px;
702
- overflow: hidden;
703
- clip-path: inset(50%);
704
- white-space: nowrap;
705
- }
594
+ :scope[data-ui-badge-state~="shape=square"] .label :slotted(svg) {
595
+ margin-inline-end: 0;
596
+ }
706
597
 
707
- /* The clipped point needs an inset surface over an outer border-colour shape: a native border
708
- has no diagonal edge to follow. Keep this edge for every tag variant. */
709
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"] {
710
- --_badge-point: var(--ui-badge-point, var(--ui-space-2));
711
-
712
- position: relative;
713
- isolation: isolate;
714
- border-color: transparent;
715
- border-radius: 0;
716
- background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-border)));
717
- padding-inline-end: calc(var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point));
718
- clip-path: polygon(
719
- 0 0,
720
- calc(100% - var(--_badge-point)) 0,
721
- 100% 50%,
722
- calc(100% - var(--_badge-point)) 100%,
723
- 0 100%
724
- );
725
- }
598
+ :scope[data-ui-badge-state~="shape=square"] .label:empty {
599
+ display: none;
600
+ }
601
+ :scope:where(:scope):is([data-ui-badge-state~="shape=circle"]) {
602
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-3) * 2));
603
+ display: inline-flex;
604
+ flex: none;
605
+ inline-size: var(--_badge-circle-size);
606
+ block-size: var(--_badge-circle-size);
607
+ min-inline-size: var(--_badge-circle-size);
608
+ min-block-size: var(--_badge-circle-size);
609
+ padding: 0;
610
+ border-radius: var(--ui-radius-round);
611
+ text-box-trim: none;
612
+ }
726
613
 
727
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"]::before {
728
- content: "";
729
- position: absolute;
730
- inset: 0;
731
- z-index: -1;
732
- background: var(--_badge-outline-surface);
733
- clip-path: polygon(
734
- 0 0,
735
- calc(100% - var(--_badge-point)) 0,
736
- 100% 50%,
737
- calc(100% - var(--_badge-point)) 100%,
738
- 0 100%
739
- );
740
- pointer-events: none;
741
- }
614
+ :scope:where(:scope):is([data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=sm"][data-ui-badge-state~="variant=overlay"]) {
615
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) + var(--ui-space-1)));
616
+ }
742
617
 
743
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-ui-badge-state~="variant=inverse"] {
744
- background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-text)));
745
- }
618
+ :scope:where(:scope):is([data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=xs"]) {
619
+ --_badge-circle-size: var(--ui-badge-circle-size, var(--ui-space-4));
620
+ }
746
621
 
747
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"]:dir(rtl) {
748
- padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
749
- padding-inline-start: calc(
750
- var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
751
- );
752
- clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
753
- }
622
+ :scope:where(:scope):is([data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=lg"]) {
623
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) * 2));
624
+ }
754
625
 
755
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"]:dir(rtl)::before {
756
- clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
757
- }
626
+ :scope[data-ui-badge-state~="shape=circle"] .label {
627
+ display: inline-flex;
628
+ align-items: center;
629
+ justify-content: center;
630
+ line-height: 1;
631
+ text-box-trim: none;
632
+ }
758
633
 
759
- @media (forced-colors: active) {
760
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] {
761
- forced-color-adjust: none;
762
- border-color: CanvasText;
763
- background: CanvasText;
634
+ :scope[data-ui-badge-state~="shape=circle"] .label :slotted(svg) {
635
+ margin-inline-end: 0;
764
636
  }
765
637
 
766
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"] {
767
- forced-color-adjust: none;
768
- background: CanvasText;
769
- color: CanvasText;
638
+ :scope[data-ui-badge-state~="shape=circle"] .label:empty {
639
+ display: none;
640
+ }
641
+ @supports (text-box-trim: trim-both) {
642
+ :scope[data-ui-badge-state~="shape=circle"] .label:not(:has(svg)),
643
+ :scope[data-ui-badge-state~="shape=square"] .label:not(:has(svg)) {
644
+ display: block;
645
+ text-box-trim: trim-both;
646
+ text-box-edge: cap alphabetic;
647
+ overflow: visible;
648
+ }
649
+ }
650
+ :scope:where(:scope):is([data-ui-badge-state~="shape=dot"]) {
651
+ position: relative;
652
+ box-sizing: border-box;
653
+ flex: none;
654
+ inline-size: var(--ui-badge-dot-size, var(--ui-space-2));
655
+ block-size: var(--ui-badge-dot-size, var(--ui-space-2));
656
+ min-inline-size: var(--ui-badge-dot-size, var(--ui-space-2));
657
+ min-block-size: var(--ui-badge-dot-size, var(--ui-space-2));
658
+ padding: 0;
659
+ border-radius: var(--ui-radius-round);
660
+ text-box-trim: none;
770
661
  }
771
662
 
772
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"]::before {
773
- background: Canvas;
663
+ :scope[data-ui-badge-state~="shape=dot"] .label {
664
+ position: absolute;
665
+ inline-size: 1px;
666
+ block-size: 1px;
667
+ overflow: hidden;
668
+ clip-path: inset(50%);
669
+ white-space: nowrap;
670
+ }
671
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"]) {
672
+ --_badge-point: var(--ui-badge-point, var(--ui-space-2));
673
+
674
+ position: relative;
675
+ isolation: isolate;
676
+ border-color: transparent;
677
+ border-radius: 0;
678
+ background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-border)));
679
+ padding-inline-end: calc(
680
+ var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
681
+ );
682
+ clip-path: polygon(
683
+ 0 0,
684
+ calc(100% - var(--_badge-point)) 0,
685
+ 100% 50%,
686
+ calc(100% - var(--_badge-point)) 100%,
687
+ 0 100%
688
+ );
774
689
  }
775
- }
776
690
 
777
- /* A component that sets its display still honours the hidden attribute on its root. */
778
- [data-component~="ui-badge"][hidden] {
779
- display: none;
691
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"])::before {
692
+ content: "";
693
+ position: absolute;
694
+ inset: 0;
695
+ z-index: -1;
696
+ background: var(--_badge-outline-surface);
697
+ clip-path: polygon(
698
+ 0 0,
699
+ calc(100% - var(--_badge-point)) 0,
700
+ 100% 50%,
701
+ calc(100% - var(--_badge-point)) 100%,
702
+ 0 100%
703
+ );
704
+ pointer-events: none;
705
+ }
706
+
707
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"][data-ui-badge-state~="variant=inverse"]) {
708
+ background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-text)));
709
+ }
710
+
711
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"]:dir(rtl)) {
712
+ padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
713
+ padding-inline-start: calc(
714
+ var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
715
+ );
716
+ clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
717
+ }
718
+
719
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"]:dir(rtl))::before {
720
+ clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
721
+ }
722
+
723
+ @media (forced-colors: active) {
724
+ :scope:where(:scope):is([data-ui-badge-state~="shape=dot"]) {
725
+ forced-color-adjust: none;
726
+ border-color: CanvasText;
727
+ background: CanvasText;
728
+ }
729
+
730
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"]) {
731
+ forced-color-adjust: none;
732
+ background: CanvasText;
733
+ color: CanvasText;
734
+ }
735
+
736
+ :scope:where(:scope):is([data-ui-badge-state~="shape=tag"])::before {
737
+ background: Canvas;
738
+ }
739
+ }
740
+ :scope:where(:scope):is([hidden]) {
741
+ display: none;
742
+ }
780
743
  }
781
744
  </style>