@threadlabs/looma 0.28.5 → 0.28.7

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