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