@threadlabs/looma 0.22.13 → 0.23.0

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 (257) hide show
  1. package/components/shared/icons.js +6 -0
  2. package/components/ui-avatar/ui-avatar.html +3 -3
  3. package/components/ui-avatar-group/ui-avatar-group.html +1 -1
  4. package/components/ui-badge/ui-badge.html +1 -1
  5. package/components/ui-button/ui-button.html +3 -3
  6. package/components/ui-callout/ui-callout.html +3 -2
  7. package/components/ui-card/ui-card.html +23 -4
  8. package/components/ui-checkbox/ui-checkbox.html +3 -3
  9. package/components/ui-combobox/ui-combobox.html +8 -8
  10. package/components/ui-context-menu/ui-context-menu.html +2 -2
  11. package/components/ui-description-list/ui-description-list.html +1 -1
  12. package/components/ui-dialog/ui-dialog.html +3 -3
  13. package/components/ui-disclosure/ui-disclosure.html +43 -3
  14. package/components/ui-editable/ui-editable.html +2 -2
  15. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +5 -5
  16. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +2 -2
  17. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +6 -6
  18. package/components/ui-editor-slash-menu-item/ui-editor-slash-menu-item.html +1 -1
  19. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +2 -2
  20. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +11 -11
  21. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +5 -5
  22. package/components/ui-editor-toolbar/ui-editor-toolbar.html +4 -4
  23. package/components/ui-floating-action-button/ui-floating-action-button.html +2 -2
  24. package/components/ui-icon/ui-icon.html +6 -0
  25. package/components/ui-icon-button/ui-icon-button.html +1 -1
  26. package/components/ui-input/ui-input.html +9 -4
  27. package/components/ui-input-group/ui-input-group.html +21 -6
  28. package/components/ui-list/ui-list.html +1 -1
  29. package/components/ui-list-item/ui-list-item.html +20 -4
  30. package/components/ui-listbox/ui-listbox.html +3 -3
  31. package/components/ui-menu/ui-menu.html +2 -2
  32. package/components/ui-menu-item/ui-menu-item.html +4 -4
  33. package/components/ui-meter/ui-meter.html +1 -1
  34. package/components/ui-nav-item/ui-nav-item.html +46 -14
  35. package/components/ui-popover/ui-popover.html +16 -1
  36. package/components/ui-radio/ui-radio.html +2 -2
  37. package/components/ui-scroll-area/ui-scroll-area.html +12 -0
  38. package/components/ui-search-result-row/ui-search-result-row.html +24 -5
  39. package/components/ui-search-shell/ui-search-shell.html +4 -4
  40. package/components/ui-section/ui-section.html +3 -3
  41. package/components/ui-select/ui-select.html +6 -2
  42. package/components/ui-separator/ui-separator.html +2 -2
  43. package/components/ui-sidebar/ui-sidebar.html +3 -3
  44. package/components/ui-stack/ui-stack.html +6 -3
  45. package/components/ui-status-message/ui-status-message.html +1 -1
  46. package/components/ui-switch/ui-switch.html +3 -3
  47. package/components/ui-table/ui-table.html +3 -3
  48. package/components/ui-tabs/ui-tabs.html +7 -7
  49. package/components/ui-text/ui-text.html +12 -0
  50. package/components/ui-textarea/ui-textarea.html +6 -2
  51. package/components/ui-toast/ui-toast.html +2 -2
  52. package/components/ui-toast-region/ui-toast-region.html +5 -5
  53. package/components/ui-tooltip/ui-tooltip.html +15 -15
  54. package/components/ui-top-bar/ui-top-bar.html +1 -1
  55. package/components/ui-tree-item/ui-tree-item.html +27 -8
  56. package/dist/index.js +1 -1
  57. package/editor/chunks/extensions.js +55 -2
  58. package/editor/extensions/index.d.ts +1 -0
  59. package/editor/extensions/index.js +2 -2
  60. package/editor/extensions/preset.d.ts +2 -0
  61. package/editor/extensions/relative-links.d.ts +8 -0
  62. package/editor/icons.d.ts +6 -0
  63. package/editor/index.js +9 -3
  64. package/package.json +1 -1
  65. package/styles/ui-avatar-group.css +1 -1
  66. package/styles/ui-avatar.css +3 -3
  67. package/styles/ui-badge.css +1 -1
  68. package/styles/ui-button.css +3 -3
  69. package/styles/ui-callout.css +3 -2
  70. package/styles/ui-card.css +19 -2
  71. package/styles/ui-checkbox.css +3 -3
  72. package/styles/ui-combobox.css +8 -8
  73. package/styles/ui-context-menu.css +2 -2
  74. package/styles/ui-description-list.css +1 -1
  75. package/styles/ui-dialog.css +3 -3
  76. package/styles/ui-disclosure.css +42 -2
  77. package/styles/ui-editable.css +2 -2
  78. package/styles/ui-editor-insert-table-grid.css +5 -5
  79. package/styles/ui-editor-mention-menu.css +2 -2
  80. package/styles/ui-editor-slash-menu-item.css +1 -1
  81. package/styles/ui-editor-slash-menu.css +6 -6
  82. package/styles/ui-editor-table-context-menu.css +2 -2
  83. package/styles/ui-editor-table-overlay.css +11 -11
  84. package/styles/ui-editor-table-toolbar.css +5 -5
  85. package/styles/ui-editor-toolbar.css +4 -4
  86. package/styles/ui-floating-action-button.css +2 -2
  87. package/styles/ui-icon-button.css +1 -1
  88. package/styles/ui-input-group.css +19 -6
  89. package/styles/ui-input.css +9 -4
  90. package/styles/ui-list-item.css +23 -4
  91. package/styles/ui-list.css +1 -1
  92. package/styles/ui-listbox.css +3 -3
  93. package/styles/ui-menu-item.css +4 -4
  94. package/styles/ui-menu.css +2 -2
  95. package/styles/ui-meter.css +1 -1
  96. package/styles/ui-nav-item.css +46 -12
  97. package/styles/ui-popover.css +14 -1
  98. package/styles/ui-radio.css +2 -2
  99. package/styles/ui-scroll-area.css +10 -0
  100. package/styles/ui-search-result-row.css +25 -5
  101. package/styles/ui-search-shell.css +4 -4
  102. package/styles/ui-section.css +3 -3
  103. package/styles/ui-select.css +6 -2
  104. package/styles/ui-separator.css +2 -2
  105. package/styles/ui-sidebar.css +3 -3
  106. package/styles/ui-stack.css +3 -0
  107. package/styles/ui-status-message.css +1 -1
  108. package/styles/ui-switch.css +3 -3
  109. package/styles/ui-table.css +3 -3
  110. package/styles/ui-tabs.css +7 -7
  111. package/styles/ui-text.css +8 -0
  112. package/styles/ui-textarea.css +6 -2
  113. package/styles/ui-toast-region.css +5 -5
  114. package/styles/ui-toast.css +2 -2
  115. package/styles/ui-tooltip.css +15 -15
  116. package/styles/ui-top-bar.css +1 -1
  117. package/styles/ui-tree-item.css +32 -8
  118. package/tokens.css +30 -9
  119. package/vanilla/UiCard.d.ts +2 -1
  120. package/vanilla/UiCard.js +1 -1
  121. package/vanilla/UiDisclosure.d.ts +1 -0
  122. package/vanilla/UiDisclosure.js +10 -1
  123. package/vanilla/UiIcon.js +1 -1
  124. package/vanilla/UiInputGroup.d.ts +1 -0
  125. package/vanilla/UiInputGroup.js +1 -1
  126. package/vanilla/UiNavItem.d.ts +2 -0
  127. package/vanilla/UiNavItem.js +1 -1
  128. package/vanilla/UiPopover.d.ts +1 -0
  129. package/vanilla/UiPopover.js +1 -1
  130. package/vanilla/UiScrollArea.d.ts +1 -0
  131. package/vanilla/UiScrollArea.js +1 -1
  132. package/vanilla/UiSearchResultRow.d.ts +1 -0
  133. package/vanilla/UiSearchResultRow.js +1 -1
  134. package/vanilla/UiStack.d.ts +1 -1
  135. package/vanilla/UiStack.js +1 -1
  136. package/vanilla/UiText.d.ts +2 -0
  137. package/vanilla/UiText.js +1 -1
  138. package/vue/UiAvatar.vue +3 -3
  139. package/vue/UiAvatarGroup.vue +1 -1
  140. package/vue/UiBadge.vue +2 -1
  141. package/vue/UiButton.vue +3 -3
  142. package/vue/UiCallout.vue +2 -2
  143. package/vue/UiCard.d.ts +12 -3
  144. package/vue/UiCard.vue +51 -7
  145. package/vue/UiCheckbox.vue +3 -3
  146. package/vue/UiCombobox.vue +11 -8
  147. package/vue/UiContextMenu.vue +2 -2
  148. package/vue/UiDescriptionList.vue +1 -1
  149. package/vue/UiDialog.vue +4 -3
  150. package/vue/UiDisclosure.d.ts +13 -2
  151. package/vue/UiDisclosure.vue +61 -4
  152. package/vue/UiEditable.vue +2 -2
  153. package/vue/UiEditorInsertTableGrid.vue +5 -5
  154. package/vue/UiEditorMentionMenu.vue +2 -2
  155. package/vue/UiEditorSlashMenu.vue +6 -6
  156. package/vue/UiEditorSlashMenuItem.vue +1 -1
  157. package/vue/UiEditorTableContextMenu.vue +2 -2
  158. package/vue/UiEditorTableOverlay.vue +11 -11
  159. package/vue/UiEditorTableToolbar.vue +5 -5
  160. package/vue/UiEditorToolbar.vue +6 -4
  161. package/vue/UiFloatingActionButton.vue +2 -2
  162. package/vue/UiIcon.vue +31 -0
  163. package/vue/UiIconButton.vue +1 -1
  164. package/vue/UiInput.vue +8 -4
  165. package/vue/UiInputGroup.d.ts +9 -0
  166. package/vue/UiInputGroup.vue +39 -8
  167. package/vue/UiList.vue +1 -1
  168. package/vue/UiListItem.vue +20 -4
  169. package/vue/UiListbox.vue +3 -3
  170. package/vue/UiMenu.vue +3 -2
  171. package/vue/UiMenuItem.vue +4 -4
  172. package/vue/UiMeter.vue +1 -1
  173. package/vue/UiNavItem.d.ts +18 -0
  174. package/vue/UiNavItem.vue +96 -12
  175. package/vue/UiPopover.d.ts +9 -0
  176. package/vue/UiPopover.vue +45 -3
  177. package/vue/UiRadio.vue +2 -2
  178. package/vue/UiScrollArea.d.ts +9 -0
  179. package/vue/UiScrollArea.vue +35 -2
  180. package/vue/UiSearchResultRow.d.ts +9 -0
  181. package/vue/UiSearchResultRow.vue +51 -6
  182. package/vue/UiSearchShell.vue +4 -4
  183. package/vue/UiSection.vue +3 -3
  184. package/vue/UiSelect.vue +3 -2
  185. package/vue/UiSeparator.vue +4 -2
  186. package/vue/UiSidebar.vue +5 -3
  187. package/vue/UiStack.d.ts +3 -3
  188. package/vue/UiStack.vue +10 -4
  189. package/vue/UiStatusMessage.vue +1 -1
  190. package/vue/UiSwitch.vue +3 -3
  191. package/vue/UiTable.vue +3 -3
  192. package/vue/UiTabs.vue +8 -7
  193. package/vue/UiText.d.ts +18 -0
  194. package/vue/UiText.vue +70 -0
  195. package/vue/UiTextarea.vue +2 -2
  196. package/vue/UiToast.vue +4 -2
  197. package/vue/UiToastRegion.vue +5 -5
  198. package/vue/UiTooltip.vue +19 -15
  199. package/vue/UiTopBar.vue +1 -1
  200. package/vue/UiTreeItem.vue +31 -8
  201. package/vue/chunks/UiAvatar.js +1 -1
  202. package/vue/chunks/UiAvatarGroup.js +1 -1
  203. package/vue/chunks/UiBadge.js +1 -1
  204. package/vue/chunks/UiButton.js +1 -1
  205. package/vue/chunks/UiCallout.js +1 -1
  206. package/vue/chunks/UiCard.js +39 -3
  207. package/vue/chunks/UiCheckbox.js +1 -1
  208. package/vue/chunks/UiCombobox.js +1 -1
  209. package/vue/chunks/UiContextMenu.js +1 -1
  210. package/vue/chunks/UiDescriptionList.js +1 -1
  211. package/vue/chunks/UiDialog.js +1 -1
  212. package/vue/chunks/UiDisclosure.js +27 -4
  213. package/vue/chunks/UiEditable.js +1 -1
  214. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  215. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  216. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  217. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  218. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  219. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  220. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  221. package/vue/chunks/UiEditorToolbar.js +1 -1
  222. package/vue/chunks/UiFloatingActionButton.js +1 -1
  223. package/vue/chunks/UiIcon.js +92 -1
  224. package/vue/chunks/UiIconButton.js +1 -1
  225. package/vue/chunks/UiInput.js +1 -1
  226. package/vue/chunks/UiInputGroup.js +59 -22
  227. package/vue/chunks/UiList.js +1 -1
  228. package/vue/chunks/UiListItem.js +1 -1
  229. package/vue/chunks/UiListbox.js +1 -1
  230. package/vue/chunks/UiMenu.js +1 -1
  231. package/vue/chunks/UiMenuItem.js +1 -1
  232. package/vue/chunks/UiMeter.js +1 -1
  233. package/vue/chunks/UiNavItem.js +65 -6
  234. package/vue/chunks/UiPopover.js +37 -5
  235. package/vue/chunks/UiRadio.js +1 -1
  236. package/vue/chunks/UiScrollArea.js +66 -23
  237. package/vue/chunks/UiSearchResultRow.js +28 -2
  238. package/vue/chunks/UiSearchShell.js +1 -1
  239. package/vue/chunks/UiSection.js +1 -1
  240. package/vue/chunks/UiSelect.js +1 -1
  241. package/vue/chunks/UiSeparator.js +1 -1
  242. package/vue/chunks/UiSidebar.js +1 -1
  243. package/vue/chunks/UiStack.js +3 -2
  244. package/vue/chunks/UiStatusMessage.js +1 -1
  245. package/vue/chunks/UiSwitch.js +1 -1
  246. package/vue/chunks/UiTable.js +1 -1
  247. package/vue/chunks/UiTabs.js +1 -1
  248. package/vue/chunks/UiText.js +92 -4
  249. package/vue/chunks/UiTextarea.js +1 -1
  250. package/vue/chunks/UiToast.js +1 -1
  251. package/vue/chunks/UiToastRegion.js +1 -1
  252. package/vue/chunks/UiTooltip.js +1 -1
  253. package/vue/chunks/UiTopBar.js +1 -1
  254. package/vue/chunks/UiTreeItem.js +1 -1
  255. package/vue/components.css +1431 -1429
  256. package/vue/editor/LoomaEditor.d.ts +11 -0
  257. package/vue/editor/index.js +261 -145
package/vue/UiPopover.vue CHANGED
@@ -45,6 +45,15 @@ const propValidityContract = {
45
45
  ],
46
46
  default: 'bottom-start',
47
47
  },
48
+ size: {
49
+ type: { kind: 'terminal', name: 'keyword' },
50
+ required: false,
51
+ target: { attribute: 'size' },
52
+ description:
53
+ 'Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.',
54
+ values: ['content', 'sm', 'md', 'lg'],
55
+ default: 'content',
56
+ },
48
57
  },
49
58
  } as const
50
59
  const props = defineProps({
@@ -68,8 +77,17 @@ const props = defineProps({
68
77
  >,
69
78
  default: 'bottom-start',
70
79
  },
80
+ size: {
81
+ type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
82
+ default: 'content',
83
+ },
71
84
  })
72
- const acceptedProps: Record<string, unknown> = { for: '', open: false, placement: 'bottom-start' }
85
+ const acceptedProps: Record<string, unknown> = {
86
+ for: '',
87
+ open: false,
88
+ placement: 'bottom-start',
89
+ size: 'content',
90
+ }
73
91
  const checkedProps = computed(() => ({
74
92
  for: checkedProp<string>(
75
93
  props['for'],
@@ -111,6 +129,13 @@ const checkedProps = computed(() => ({
111
129
  | 'right'
112
130
  | 'right-start'
113
131
  | 'right-end',
132
+ size: checkedProp<'content' | 'sm' | 'md' | 'lg'>(
133
+ props['size'],
134
+ { kind: 'terminal', name: 'keyword' },
135
+ false,
136
+ 'size',
137
+ acceptedProps,
138
+ ) as 'content' | 'sm' | 'md' | 'lg',
114
139
  }))
115
140
  void checkedProps.value
116
141
  watchSyncEffect(() => {
@@ -195,6 +220,8 @@ if (
195
220
  const hostState = computed(() =>
196
221
  [
197
222
  internalOpen.value && 'internalOpen',
223
+ checkedProps.value.size && 'size',
224
+ checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
198
225
  ].filter(Boolean).join(' ')
199
226
  )
200
227
 
@@ -232,7 +259,7 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
232
259
  ? (incoming[name] ?? incoming[kebab] ?? null)
233
260
  : null
234
261
  },
235
- propNames: ['for', 'open', 'placement'],
262
+ propNames: ['for', 'open', 'placement', 'size'],
236
263
  propValidity: (name: string) =>
237
264
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
238
265
  state: { internalOpen },
@@ -247,6 +274,7 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
247
274
  :data-for="reflectedProp('for', 'for', checkedProps.for, undefined, false)"
248
275
  :data-open="reflectedProp('open', 'open', checkedProps.open, undefined, false)"
249
276
  :data-placement="reflectedProp('placement', 'placement', checkedProps.placement, undefined, false)"
277
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
250
278
  :data-ui-popover-state="hostState || undefined"
251
279
  ref="root"
252
280
  ><div class="surface"><slot /></div></span>
@@ -311,7 +339,8 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
311
339
  overflow: auto;
312
340
  padding: var(--_ui-popover-padding, var(--ui-space-3));
313
341
  background: var(--_ui-popover-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
314
- border: 1px solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
342
+ border: var(--ui-border-width) solid
343
+ var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
315
344
  border-radius: var(--_ui-popover-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
316
345
  box-shadow: var(
317
346
  --_ui-popover-shadow,
@@ -348,6 +377,19 @@ useComponentHost(() => import('../components/ui-popover/ui-popover.js'), {
348
377
  }
349
378
  }
350
379
 
380
+ [data-component~="ui-popover"][data-ui-popover-state~="size=sm"] {
381
+ inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
382
+ max-inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
383
+ }
384
+ [data-component~="ui-popover"][data-ui-popover-state~="size=md"] {
385
+ inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
386
+ max-inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
387
+ }
388
+ [data-component~="ui-popover"][data-ui-popover-state~="size=lg"] {
389
+ inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
390
+ max-inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
391
+ }
392
+
351
393
  [data-component~="ui-popover"][hidden] {
352
394
  display: none;
353
395
  }
package/vue/UiRadio.vue CHANGED
@@ -328,8 +328,8 @@ input {
328
328
  }
329
329
 
330
330
  input:focus-visible {
331
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
332
- outline-offset: 2px;
331
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
332
+ outline-offset: var(--ui-focus-width);
333
333
  }
334
334
 
335
335
  [data-component~="ui-radio"][data-ui-radio-state~="disabled"] {
@@ -8,12 +8,21 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
8
8
  type: PropType<"vertical" | "horizontal" | null>;
9
9
  default: string;
10
10
  };
11
+ size: {
12
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
13
+ default: string;
14
+ };
11
15
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
12
16
  orientation: {
13
17
  type: PropType<"vertical" | "horizontal" | null>;
14
18
  default: string;
15
19
  };
20
+ size: {
21
+ type: PropType<"content" | "sm" | "md" | "lg" | null>;
22
+ default: string;
23
+ };
16
24
  }>> & Readonly<{}>, {
25
+ size: "sm" | "md" | "content" | "lg" | null;
17
26
  orientation: "vertical" | "horizontal" | null;
18
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
19
28
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -18,6 +18,15 @@ const propValidityContract = {
18
18
  values: ['vertical', 'horizontal'],
19
19
  default: 'vertical',
20
20
  },
21
+ size: {
22
+ type: { kind: 'terminal', name: 'keyword' },
23
+ required: false,
24
+ target: { attribute: 'size' },
25
+ description:
26
+ 'Optional height preset. content keeps intrinsic sizing; sm fits three compact 3.125rem result rows, md is 20rem, and lg is 30rem.',
27
+ values: ['content', 'sm', 'md', 'lg'],
28
+ default: 'content',
29
+ },
21
30
  },
22
31
  } as const
23
32
  const props = defineProps({
@@ -25,8 +34,12 @@ const props = defineProps({
25
34
  type: null as unknown as PropType<'vertical' | 'horizontal' | null>,
26
35
  default: 'vertical',
27
36
  },
37
+ size: {
38
+ type: null as unknown as PropType<'content' | 'sm' | 'md' | 'lg' | null>,
39
+ default: 'content',
40
+ },
28
41
  })
29
- const acceptedProps: Record<string, unknown> = { orientation: 'vertical' }
42
+ const acceptedProps: Record<string, unknown> = { orientation: 'vertical', size: 'content' }
30
43
  const checkedProps = computed(() => ({
31
44
  orientation: checkedProp<'vertical' | 'horizontal'>(
32
45
  props['orientation'],
@@ -35,6 +48,13 @@ const checkedProps = computed(() => ({
35
48
  'orientation',
36
49
  acceptedProps,
37
50
  ) as 'vertical' | 'horizontal',
51
+ size: checkedProp<'content' | 'sm' | 'md' | 'lg'>(
52
+ props['size'],
53
+ { kind: 'terminal', name: 'keyword' },
54
+ false,
55
+ 'size',
56
+ acceptedProps,
57
+ ) as 'content' | 'sm' | 'md' | 'lg',
38
58
  }))
39
59
  void checkedProps.value
40
60
  watchSyncEffect(() => {
@@ -99,6 +119,8 @@ const hostState = computed(() =>
99
119
  checkedProps.value.orientation && 'orientation',
100
120
  checkedProps.value.orientation != null
101
121
  && `orientation=${encodeURIComponent(checkedProps.value.orientation)}`,
122
+ checkedProps.value.size && 'size',
123
+ checkedProps.value.size != null && `size=${encodeURIComponent(checkedProps.value.size)}`,
102
124
  ].filter(Boolean).join(' ')
103
125
  )
104
126
 
@@ -119,7 +141,7 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
119
141
  ? (incoming[name] ?? incoming[kebab] ?? null)
120
142
  : null
121
143
  },
122
- propNames: ['orientation'],
144
+ propNames: ['orientation', 'size'],
123
145
  propValidity: (name: string) =>
124
146
  propValidityState({ contract: propValidityContract, values: { ...props } }, name),
125
147
  refs: { content: contentElement },
@@ -132,6 +154,7 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
132
154
  v-bind="nativeAttrs($attrs)"
133
155
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
134
156
  :data-orientation="reflectedProp('orientation', 'orientation', checkedProps.orientation, undefined, false)"
157
+ :data-size="reflectedProp('size', 'size', checkedProps.size, undefined, false)"
135
158
  :data-ui-scroll-area-state="hostState || undefined"
136
159
  ref="root"
137
160
  >
@@ -177,6 +200,16 @@ useComponentHost(() => import('../components/ui-scroll-area/ui-scroll-area.js'),
177
200
  --_ui-scroll-fade-inline: to left;
178
201
  }
179
202
 
203
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=sm"] {
204
+ max-block-size: 9.375rem;
205
+ }
206
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=md"] {
207
+ max-block-size: 20rem;
208
+ }
209
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=lg"] {
210
+ max-block-size: 30rem;
211
+ }
212
+
180
213
  /* A component that sets its display still honours the hidden attribute on its root. */
181
214
  [data-component~="ui-scroll-area"][hidden] {
182
215
  display: none;
@@ -12,6 +12,10 @@ type __VLS_Slots = {} & {
12
12
  trailing?: (props: typeof __VLS_9) => any;
13
13
  };
14
14
  declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
15
+ density: {
16
+ type: PropType<"comfortable" | "compact" | null>;
17
+ default: string;
18
+ };
15
19
  disabled: {
16
20
  type: PropType<boolean | null>;
17
21
  default: boolean;
@@ -21,6 +25,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
21
25
  default: boolean;
22
26
  };
23
27
  }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
28
+ density: {
29
+ type: PropType<"comfortable" | "compact" | null>;
30
+ default: string;
31
+ };
24
32
  disabled: {
25
33
  type: PropType<boolean | null>;
26
34
  default: boolean;
@@ -32,6 +40,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
32
40
  }>> & Readonly<{}>, {
33
41
  selected: boolean | null;
34
42
  disabled: boolean | null;
43
+ density: "comfortable" | "compact" | null;
35
44
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
36
45
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
37
46
  declare const _default: typeof __VLS_export;
@@ -8,6 +8,15 @@ defineOptions({ inheritAttrs: false })
8
8
 
9
9
  const propValidityContract = {
10
10
  props: {
11
+ density: {
12
+ type: { kind: 'terminal', name: 'keyword' },
13
+ required: false,
14
+ target: { attribute: 'density' },
15
+ description:
16
+ 'Compact keeps a title and location together in a 3.125rem row for small destination pickers; comfortable preserves the existing rich result spacing.',
17
+ values: ['comfortable', 'compact'],
18
+ default: 'comfortable',
19
+ },
11
20
  disabled: {
12
21
  type: { kind: 'terminal', name: 'boolean' },
13
22
  required: false,
@@ -27,11 +36,26 @@ const propValidityContract = {
27
36
  },
28
37
  } as const
29
38
  const props = defineProps({
39
+ density: {
40
+ type: null as unknown as PropType<'comfortable' | 'compact' | null>,
41
+ default: 'comfortable',
42
+ },
30
43
  disabled: { type: null as unknown as PropType<boolean | null>, default: false },
31
44
  selected: { type: null as unknown as PropType<boolean | null>, default: false },
32
45
  })
33
- const acceptedProps: Record<string, unknown> = { disabled: false, selected: false }
46
+ const acceptedProps: Record<string, unknown> = {
47
+ density: 'comfortable',
48
+ disabled: false,
49
+ selected: false,
50
+ }
34
51
  const checkedProps = computed(() => ({
52
+ density: checkedProp<'comfortable' | 'compact'>(
53
+ props['density'],
54
+ { kind: 'terminal', name: 'keyword' },
55
+ false,
56
+ 'density',
57
+ acceptedProps,
58
+ ) as 'comfortable' | 'compact',
35
59
  disabled: checkedProp<boolean>(
36
60
  props['disabled'],
37
61
  { kind: 'terminal', name: 'boolean' },
@@ -105,6 +129,9 @@ if (
105
129
  /** The values the styles' :host-state() rules test. */
106
130
  const hostState = computed(() =>
107
131
  [
132
+ checkedProps.value.density && 'density',
133
+ checkedProps.value.density != null
134
+ && `density=${encodeURIComponent(checkedProps.value.density)}`,
108
135
  checkedProps.value.selected && 'selected',
109
136
  ].filter(Boolean).join(' ')
110
137
  )
@@ -118,6 +145,7 @@ const hostState = computed(() =>
118
145
  :disabled="checkedProps.disabled ?? undefined"
119
146
  :aria-current="checkedProps.selected ?? undefined"
120
147
  v-prop-validity="{ contract: propValidityContract, values: { ...props } }"
148
+ :data-density="reflectedProp('density', 'density', checkedProps.density, undefined, false)"
121
149
  :data-disabled="reflectedProp('disabled', 'disabled', checkedProps.disabled, undefined, false)"
122
150
  :data-selected="reflectedProp('selected', 'selected', checkedProps.selected, undefined, false)"
123
151
  :data-ui-search-result-row-state="hostState || undefined"
@@ -176,14 +204,23 @@ const hostState = computed(() =>
176
204
  align-items: flex-start;
177
205
  gap: var(--ui-search-result-row-gap, var(--ui-space-3));
178
206
  background: var(--ui-search-result-row-surface, transparent);
179
- border: 1px solid var(--ui-search-result-row-border, transparent);
180
- border-radius: var(--ui-radius-md);
207
+ border: var(--ui-border-width) solid var(--ui-search-result-row-border, transparent);
208
+ border-radius: var(--ui-selection-radius);
181
209
  color: inherit;
182
210
  cursor: pointer;
183
211
  text-align: left;
184
212
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease);
185
213
  }
186
214
 
215
+ [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="density=compact"] {
216
+ min-block-size: var(--ui-search-result-row-min-height, 3.125rem);
217
+ padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-1));
218
+ padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-2));
219
+ gap: var(--ui-search-result-row-gap, var(--ui-space-2));
220
+ align-items: center;
221
+ font-family: var(--ui-font-family-sans, sans-serif);
222
+ }
223
+
187
224
  [data-component~="ui-search-result-row"]:hover:enabled {
188
225
  background: var(
189
226
  --ui-search-result-row-hover-surface,
@@ -194,13 +231,14 @@ const hostState = computed(() =>
194
231
  [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="selected"] {
195
232
  background: var(
196
233
  --ui-search-result-row-selected-bg,
197
- var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
234
+ var(--ui-selection-surface)
198
235
  );
236
+ color: var(--ui-selection-text);
199
237
  }
200
238
 
201
239
  [data-component~="ui-search-result-row"]:focus-visible {
202
- outline: 2px solid var(--ui-focus-ring);
203
- outline-offset: -2px;
240
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
241
+ outline-offset: calc(-1 * var(--ui-focus-width));
204
242
  }
205
243
 
206
244
  [data-component~="ui-search-result-row"]:disabled {
@@ -245,6 +283,13 @@ const hostState = computed(() =>
245
283
  margin: 0;
246
284
  }
247
285
 
286
+ @media (forced-colors: active) {
287
+ [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="selected"]:not(:focus-visible):not(:disabled) {
288
+ outline: var(--ui-border-width) solid Highlight;
289
+ outline-offset: calc(-1 * var(--ui-border-width));
290
+ }
291
+ }
292
+
248
293
  /* A component that sets its display still honours the hidden attribute on its root. */
249
294
  [data-component~="ui-search-result-row"][hidden] {
250
295
  display: none;
@@ -318,7 +318,7 @@ dialog[data-ui-backdrop-hidden]::backdrop {
318
318
  --_ui-search-shell-surface,
319
319
  var(--ui-overlay-surface, var(--ui-surface-elevated))
320
320
  );
321
- border: 1px solid
321
+ border: var(--ui-border-width) solid
322
322
  var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
323
323
  border-radius: var(--_ui-search-shell-radius, var(--ui-overlay-radius, var(--ui-radius-dialog)));
324
324
  box-shadow: var(
@@ -336,7 +336,7 @@ dialog[data-ui-backdrop-hidden]::backdrop {
336
336
  inline-size: 100%;
337
337
  min-block-size: var(--ui-control-min-block-size);
338
338
  padding: var(--ui-space-2) var(--ui-space-3);
339
- border: 1px solid var(--ui-control-border);
339
+ border: var(--ui-border-width) solid var(--ui-control-border);
340
340
  border-radius: var(--ui-field-radius, var(--ui-radius-md));
341
341
  background: var(--ui-control-surface);
342
342
  color: var(--ui-text-primary);
@@ -346,8 +346,8 @@ dialog[data-ui-backdrop-hidden]::backdrop {
346
346
 
347
347
  :slotted(input[slot="search"]:focus-visible) {
348
348
  border-color: var(--_ui-search-shell-focus-color, var(--ui-control-focus));
349
- outline: 2px solid var(--ui-focus-ring);
350
- outline-offset: 2px;
349
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
350
+ outline-offset: var(--ui-focus-width);
351
351
  }
352
352
 
353
353
  .status,
package/vue/UiSection.vue CHANGED
@@ -166,19 +166,19 @@ const hostState = computed(() =>
166
166
 
167
167
  [data-component~="ui-section"][data-ui-section-state~="variant=card"] {
168
168
  padding: var(--ui-space-5);
169
- border: 1px solid var(--ui-border-strong);
169
+ border: var(--ui-border-width) solid var(--ui-border-strong);
170
170
  border-radius: var(--ui-radius-lg);
171
171
  background: var(--ui-surface-raised);
172
172
  }
173
173
 
174
174
  [data-component~="ui-section"][data-ui-section-state~="variant=divided"] {
175
175
  padding-block-start: var(--ui-space-6);
176
- border-block-start: 1px solid var(--ui-border-divider);
176
+ border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
177
177
  }
178
178
 
179
179
  [data-component~="ui-section"][data-ui-section-state~="variant=card"][data-ui-section-state~="tone=danger"] {
180
180
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
181
- border-inline-start: 4px solid var(--ui-danger);
181
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
182
182
  background: var(--ui-danger-soft);
183
183
  }
184
184
 
package/vue/UiSelect.vue CHANGED
@@ -278,7 +278,8 @@ useComponentHost(() => import('../components/ui-select/ui-select.js'), {
278
278
  min-block-size: var(--ui-control-size-md);
279
279
  margin: 0;
280
280
  padding: var(--ui-space-2) var(--ui-space-3);
281
- border: 1px solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
281
+ border: var(--ui-border-width) solid
282
+ var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
282
283
  border-radius: var(--ui-select-radius, var(--ui-field-radius, var(--ui-radius-md)));
283
284
  background-color: var(--ui-select-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
284
285
  color: var(--ui-text-primary);
@@ -333,7 +334,7 @@ useComponentHost(() => import('../components/ui-select/ui-select.js'), {
333
334
  box-shadow: var(
334
335
  --ui-select-invalid-focus-shadow,
335
336
  var(--ui-control-inset),
336
- 0 0 0 3px color-mix(
337
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
337
338
  in srgb,
338
339
  var(--ui-select-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
339
340
  transparent
@@ -114,12 +114,14 @@ if (
114
114
  align-self: stretch;
115
115
  margin: 0;
116
116
  border: 0;
117
- border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
117
+ border-block-start: var(--ui-border-width) solid
118
+ var(--ui-separator-color, var(--ui-border-divider));
118
119
  }
119
120
 
120
121
  [data-component~="ui-separator"][aria-orientation="vertical"] {
121
122
  block-size: auto;
122
123
  border-block-start: 0;
123
- border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
124
+ border-inline-start: var(--ui-border-width) solid
125
+ var(--ui-separator-color, var(--ui-border-divider));
124
126
  }
125
127
  </style>
package/vue/UiSidebar.vue CHANGED
@@ -383,12 +383,14 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
383
383
  max-inline-size: 100%;
384
384
  min-block-size: 0;
385
385
  background: var(--ui-sidebar-surface, var(--ui-surface-default));
386
- border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
386
+ border-inline-end: var(--ui-border-width) solid
387
+ var(--ui-sidebar-border, var(--ui-border-divider));
387
388
  }
388
389
 
389
390
  [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"] {
390
391
  border-inline-end: 0;
391
- border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
392
+ border-inline-start: var(--ui-border-width) solid
393
+ var(--ui-sidebar-border, var(--ui-border-divider));
392
394
  }
393
395
 
394
396
  /* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
@@ -471,7 +473,7 @@ useComponentHost(() => import('../components/ui-sidebar/ui-sidebar.js'), {
471
473
  inset-inline-start: 50%;
472
474
  inline-size: 6px;
473
475
  block-size: 22px;
474
- border: 1px solid var(--ui-border-strong);
476
+ border: var(--ui-border-width) solid var(--ui-border-strong);
475
477
  border-radius: var(--ui-radius-round);
476
478
  background: var(--ui-surface-elevated);
477
479
  opacity: 0;
package/vue/UiStack.d.ts CHANGED
@@ -9,7 +9,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
9
9
  default: null;
10
10
  };
11
11
  gap: {
12
- type: PropType<"xs" | "s" | "m" | "l" | "xl" | null>;
12
+ type: PropType<"none" | "xs" | "s" | "m" | "l" | "xl" | null>;
13
13
  default: null;
14
14
  };
15
15
  justify: {
@@ -22,7 +22,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
22
22
  default: null;
23
23
  };
24
24
  gap: {
25
- type: PropType<"xs" | "s" | "m" | "l" | "xl" | null>;
25
+ type: PropType<"none" | "xs" | "s" | "m" | "l" | "xl" | null>;
26
26
  default: null;
27
27
  };
28
28
  justify: {
@@ -31,7 +31,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
31
31
  };
32
32
  }>> & Readonly<{}>, {
33
33
  align: "center" | "start" | "stretch" | "end" | null;
34
- gap: "s" | "xs" | "m" | "l" | "xl" | null;
34
+ gap: "s" | "none" | "xs" | "m" | "l" | "xl" | null;
35
35
  justify: "center" | "start" | "end" | "between" | null;
36
36
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
37
37
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
package/vue/UiStack.vue CHANGED
@@ -21,8 +21,8 @@ const propValidityContract = {
21
21
  required: false,
22
22
  target: { attribute: 'gap' },
23
23
  description:
24
- 'Space between items, on the spacing scale: xs is 0.5rem, s 0.75rem, m 1rem (also the default), l 1.5rem, and xl 2rem. The --ui-stack-gap custom property,\n set on the stack itself, overrides it; set on an ancestor, it does nothing.',
25
- values: ['xs', 's', 'm', 'l', 'xl'],
24
+ 'Space between items, on the spacing scale: none is zero, xs is 0.5rem, s 0.75rem, m 1rem (also the default), l 1.5rem, and xl 2rem. The --ui-stack-gap\n custom property, set on the stack itself, overrides it; set on an ancestor, it does nothing.',
25
+ values: ['none', 'xs', 's', 'm', 'l', 'xl'],
26
26
  },
27
27
  justify: {
28
28
  type: { kind: 'terminal', name: 'keyword' },
@@ -39,7 +39,10 @@ const props = defineProps({
39
39
  type: null as unknown as PropType<'start' | 'center' | 'end' | 'stretch' | null>,
40
40
  default: null,
41
41
  },
42
- gap: { type: null as unknown as PropType<'xs' | 's' | 'm' | 'l' | 'xl' | null>, default: null },
42
+ gap: {
43
+ type: null as unknown as PropType<'none' | 'xs' | 's' | 'm' | 'l' | 'xl' | null>,
44
+ default: null,
45
+ },
43
46
  justify: {
44
47
  type: null as unknown as PropType<'start' | 'center' | 'end' | 'between' | null>,
45
48
  default: null,
@@ -54,7 +57,7 @@ const checkedProps = computed(() => ({
54
57
  'align',
55
58
  acceptedProps,
56
59
  ),
57
- gap: checkedProp<'xs' | 's' | 'm' | 'l' | 'xl'>(
60
+ gap: checkedProp<'none' | 'xs' | 's' | 'm' | 'l' | 'xl'>(
58
61
  props['gap'],
59
62
  { kind: 'terminal', name: 'keyword' },
60
63
  false,
@@ -167,6 +170,9 @@ const hostState = computed(() =>
167
170
  margin: 0;
168
171
  }
169
172
 
173
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=none"] {
174
+ --_layout-gap: 0px;
175
+ }
170
176
  [data-component~="ui-stack"][data-ui-stack-state~="gap=xs"] {
171
177
  --_layout-gap: var(--ui-space-2);
172
178
  }
@@ -192,7 +192,7 @@ function attribute(value: unknown): any {
192
192
 
193
193
  [data-component~="ui-status-message"][data-ui-status-message-state~="layout=panel"] {
194
194
  padding: var(--ui-space-6);
195
- border: 1px dashed var(--ui-border-strong);
195
+ border: var(--ui-border-width) dashed var(--ui-border-strong);
196
196
  border-radius: var(--ui-radius-lg);
197
197
  }
198
198
 
package/vue/UiSwitch.vue CHANGED
@@ -331,7 +331,7 @@ input {
331
331
  width: var(--_ui-switch-track-width, 2.5rem);
332
332
  height: var(--_ui-switch-track-height, 1.5rem);
333
333
  padding: 0;
334
- border: 1px solid var(--ui-control-border, var(--ui-border-strong));
334
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
335
335
  border-radius: var(--ui-radius-round);
336
336
  background-color: var(--ui-control-surface, var(--ui-surface-default));
337
337
  box-shadow: var(--ui-control-inset);
@@ -368,8 +368,8 @@ input:checked::after {
368
368
  }
369
369
 
370
370
  input:focus-visible {
371
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
372
- outline-offset: 2px;
371
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
372
+ outline-offset: var(--ui-focus-width);
373
373
  }
374
374
 
375
375
  [data-component~="ui-switch"][data-ui-switch-state~="disabled"] {
package/vue/UiTable.vue CHANGED
@@ -198,8 +198,8 @@ useComponentHost(() => import('../components/ui-table/ui-table.js'), {
198
198
  }
199
199
 
200
200
  [data-component~="ui-table"]:focus-visible {
201
- outline: 2px solid var(--ui-focus-ring);
202
- outline-offset: -2px;
201
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
202
+ outline-offset: calc(-1 * var(--ui-focus-width));
203
203
  }
204
204
 
205
205
  [data-component~="ui-table"][data-ui-table-state~="density=compact"] {
@@ -232,7 +232,7 @@ useComponentHost(() => import('../components/ui-table/ui-table.js'), {
232
232
  :slotted(td) {
233
233
  block-size: var(--_row-size);
234
234
  padding: var(--_pad-block) var(--_pad-inline);
235
- border-block-end: 1px solid var(--ui-border-subtle);
235
+ border-block-end: var(--ui-border-width) solid var(--ui-border-subtle);
236
236
  text-align: start;
237
237
  vertical-align: middle;
238
238
  }
package/vue/UiTabs.vue CHANGED
@@ -410,17 +410,17 @@ function uniqueKeys<T>(
410
410
  overflow-y: hidden;
411
411
  overscroll-behavior: contain;
412
412
  scrollbar-width: thin;
413
- border-block-end: 1px solid var(--ui-border-divider);
413
+ border-block-end: var(--ui-border-width) solid var(--ui-border-divider);
414
414
  }
415
415
 
416
416
  .list button,
417
417
  .list > :slotted(button[slot="tab"]) {
418
418
  min-block-size: var(--_ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
419
- margin: 0 0 -1px;
419
+ margin: 0 0 calc(-1 * var(--ui-border-width));
420
420
  padding: var(--_ui-tabs-tab-padding-block, var(--_tab-padding-block))
421
421
  var(--_ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
422
422
  border: 0;
423
- border-block-end: 2px solid transparent;
423
+ border-block-end: var(--ui-accent-line-width) solid transparent;
424
424
  background: transparent;
425
425
  color: var(--ui-text-secondary);
426
426
  font: inherit;
@@ -470,7 +470,8 @@ function uniqueKeys<T>(
470
470
  .list > :slotted(button[slot="tab"]:focus-visible) {
471
471
  position: relative;
472
472
  outline: none;
473
- box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
473
+ box-shadow: inset 0 0 0 var(--ui-focus-width)
474
+ color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
474
475
  border-radius: var(--ui-radius-sm);
475
476
  }
476
477
 
@@ -490,16 +491,16 @@ function uniqueKeys<T>(
490
491
  grid-auto-flow: row;
491
492
  grid-auto-columns: auto;
492
493
  border-block-end: 0;
493
- border-inline-end: 1px solid var(--ui-border-divider);
494
+ border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
494
495
  }
495
496
 
496
497
  [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"] .list button,
497
498
  [data-component~="ui-tabs"][data-ui-tabs-state~="orientation=vertical"]
498
499
  .list
499
500
  > :slotted(button[slot="tab"]) {
500
- margin: 0 -1px 0 0;
501
+ margin: 0 calc(-1 * var(--ui-border-width)) 0 0;
501
502
  border-block-end: 0;
502
- border-inline-end: 2px solid transparent;
503
+ border-inline-end: var(--ui-accent-line-width) solid transparent;
503
504
  text-align: start;
504
505
  }
505
506