@threadlabs/looma 0.5.2 → 0.6.0-rc.2

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 (177) hide show
  1. package/components/shared/overlay.js +3 -0
  2. package/components/ui-button/ui-button.html +46 -26
  3. package/components/ui-callout/ui-callout.html +1 -1
  4. package/components/ui-checkbox/ui-checkbox.html +1 -1
  5. package/components/ui-cluster/ui-cluster.html +6 -6
  6. package/components/ui-combobox/ui-combobox.html +23 -23
  7. package/components/ui-container/ui-container.html +4 -4
  8. package/components/ui-context-menu/ui-context-menu.html +2 -2
  9. package/components/ui-dialog/ui-dialog.html +12 -12
  10. package/components/ui-disclosure/ui-disclosure.html +19 -4
  11. package/components/ui-editable/ui-editable.html +6 -6
  12. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +20 -20
  13. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +25 -25
  14. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +39 -39
  15. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +20 -20
  16. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +48 -48
  17. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +34 -34
  18. package/components/ui-editor-toolbar/ui-editor-toolbar.html +9 -9
  19. package/components/ui-floating-action-button/ui-floating-action-button.html +16 -22
  20. package/components/ui-grid/ui-grid.html +6 -6
  21. package/components/ui-icon-button/ui-icon-button.html +45 -40
  22. package/components/ui-input/ui-input.html +2 -2
  23. package/components/ui-menu/ui-menu.html +15 -4
  24. package/components/ui-menu-item/ui-menu-item.html +5 -5
  25. package/components/ui-popover/ui-popover.html +3 -3
  26. package/components/ui-reel/ui-reel.html +6 -6
  27. package/components/ui-search-result-row/ui-search-result-row.html +9 -9
  28. package/components/ui-search-shell/ui-search-shell.html +3 -3
  29. package/components/ui-select/ui-select.html +2 -2
  30. package/components/ui-sidebar/ui-sidebar.html +11 -11
  31. package/components/ui-stack/ui-stack.html +6 -6
  32. package/components/ui-switcher/ui-switcher.html +6 -6
  33. package/components/ui-tabs/ui-tabs.html +18 -4
  34. package/components/ui-textarea/ui-textarea.html +2 -2
  35. package/components/ui-toast-region/ui-toast-region.html +2 -2
  36. package/components/ui-tooltip/ui-tooltip.html +1 -1
  37. package/components/ui-top-bar/ui-top-bar.html +5 -5
  38. package/components/ui-tree/ui-tree.html +7 -0
  39. package/components/ui-tree-item/ui-tree-item.html +15 -7
  40. package/dist/index.js +1 -1
  41. package/package.json +1 -1
  42. package/styles/ui-button.css +47 -26
  43. package/styles/ui-callout.css +1 -1
  44. package/styles/ui-checkbox.css +1 -1
  45. package/styles/ui-cluster.css +6 -6
  46. package/styles/ui-combobox.css +23 -23
  47. package/styles/ui-container.css +4 -4
  48. package/styles/ui-context-menu.css +2 -2
  49. package/styles/ui-dialog.css +12 -12
  50. package/styles/ui-disclosure.css +22 -6
  51. package/styles/ui-editable.css +6 -6
  52. package/styles/ui-editor-insert-table-grid.css +20 -20
  53. package/styles/ui-editor-mention-menu.css +25 -25
  54. package/styles/ui-editor-slash-menu.css +39 -39
  55. package/styles/ui-editor-table-context-menu.css +20 -20
  56. package/styles/ui-editor-table-overlay.css +48 -48
  57. package/styles/ui-editor-table-toolbar.css +34 -34
  58. package/styles/ui-editor-toolbar.css +9 -9
  59. package/styles/ui-floating-action-button.css +16 -22
  60. package/styles/ui-grid.css +6 -6
  61. package/styles/ui-icon-button.css +45 -40
  62. package/styles/ui-input.css +2 -2
  63. package/styles/ui-menu-item.css +5 -5
  64. package/styles/ui-menu.css +18 -6
  65. package/styles/ui-popover.css +3 -3
  66. package/styles/ui-reel.css +6 -6
  67. package/styles/ui-search-result-row.css +9 -9
  68. package/styles/ui-search-shell.css +3 -3
  69. package/styles/ui-select.css +2 -2
  70. package/styles/ui-sidebar.css +11 -11
  71. package/styles/ui-stack.css +6 -6
  72. package/styles/ui-switcher.css +6 -6
  73. package/styles/ui-tabs.css +20 -6
  74. package/styles/ui-textarea.css +2 -2
  75. package/styles/ui-toast-region.css +2 -2
  76. package/styles/ui-tooltip.css +1 -1
  77. package/styles/ui-top-bar.css +5 -5
  78. package/styles/ui-tree-item.css +21 -8
  79. package/styles/ui-tree.css +7 -1
  80. package/theme-dark.css +46 -103
  81. package/theme-high-contrast.css +22 -22
  82. package/theme-light.css +17 -41
  83. package/tokens.css +154 -201
  84. package/vanilla/UiButton.d.ts +1 -0
  85. package/vanilla/UiButton.js +1 -1
  86. package/vanilla/UiDisclosure.d.ts +1 -0
  87. package/vanilla/UiDisclosure.js +1 -1
  88. package/vanilla/UiMenu.d.ts +1 -0
  89. package/vanilla/UiMenu.js +1 -1
  90. package/vanilla/UiTabs.d.ts +1 -0
  91. package/vanilla/UiTabs.js +1 -1
  92. package/vanilla/UiTree.d.ts +1 -0
  93. package/vanilla/UiTree.js +1 -1
  94. package/vue/UiButton.d.ts +2 -0
  95. package/vue/UiButton.vue +56 -41
  96. package/vue/UiCallout.vue +1 -1
  97. package/vue/UiCheckbox.vue +1 -1
  98. package/vue/UiCluster.vue +6 -6
  99. package/vue/UiCombobox.vue +23 -23
  100. package/vue/UiContainer.vue +4 -4
  101. package/vue/UiContextMenu.vue +2 -2
  102. package/vue/UiDialog.vue +12 -12
  103. package/vue/UiDisclosure.d.ts +2 -0
  104. package/vue/UiDisclosure.vue +21 -4
  105. package/vue/UiEditable.vue +6 -6
  106. package/vue/UiEditorInsertTableGrid.vue +20 -20
  107. package/vue/UiEditorMentionMenu.vue +25 -25
  108. package/vue/UiEditorSlashMenu.vue +39 -39
  109. package/vue/UiEditorTableContextMenu.vue +20 -20
  110. package/vue/UiEditorTableOverlay.vue +48 -57
  111. package/vue/UiEditorTableToolbar.vue +34 -34
  112. package/vue/UiEditorToolbar.vue +9 -9
  113. package/vue/UiFloatingActionButton.vue +17 -22
  114. package/vue/UiGrid.vue +6 -6
  115. package/vue/UiIconButton.vue +45 -55
  116. package/vue/UiInput.vue +2 -2
  117. package/vue/UiMenu.d.ts +2 -0
  118. package/vue/UiMenu.vue +17 -7
  119. package/vue/UiMenuItem.vue +6 -5
  120. package/vue/UiPopover.vue +3 -3
  121. package/vue/UiReel.vue +6 -6
  122. package/vue/UiSearchResultRow.vue +10 -13
  123. package/vue/UiSearchShell.vue +3 -3
  124. package/vue/UiSelect.vue +2 -2
  125. package/vue/UiSidebar.vue +11 -16
  126. package/vue/UiStack.vue +6 -6
  127. package/vue/UiSwitcher.vue +6 -6
  128. package/vue/UiTabs.d.ts +2 -0
  129. package/vue/UiTabs.vue +21 -4
  130. package/vue/UiTextarea.vue +2 -2
  131. package/vue/UiToastRegion.vue +2 -2
  132. package/vue/UiTooltip.vue +1 -1
  133. package/vue/UiTopBar.vue +5 -5
  134. package/vue/UiTree.d.ts +2 -0
  135. package/vue/UiTree.vue +24 -1
  136. package/vue/UiTreeItem.vue +16 -8
  137. package/vue/chunks/UiButton.js +4 -2
  138. package/vue/chunks/UiCallout.js +1 -1
  139. package/vue/chunks/UiCheckbox.js +1 -1
  140. package/vue/chunks/UiCluster.js +1 -1
  141. package/vue/chunks/UiCombobox.js +1 -1
  142. package/vue/chunks/UiContainer.js +1 -1
  143. package/vue/chunks/UiContextMenu.js +1 -1
  144. package/vue/chunks/UiDialog.js +1 -1
  145. package/vue/chunks/UiDisclosure.js +3 -2
  146. package/vue/chunks/UiEditable.js +1 -1
  147. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  148. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  149. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  150. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  151. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  152. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  153. package/vue/chunks/UiEditorToolbar.js +1 -1
  154. package/vue/chunks/UiFloatingActionButton.js +1 -1
  155. package/vue/chunks/UiGrid.js +1 -1
  156. package/vue/chunks/UiIconButton.js +1 -1
  157. package/vue/chunks/UiInput.js +1 -1
  158. package/vue/chunks/UiMenu.js +3 -2
  159. package/vue/chunks/UiMenuItem.js +1 -1
  160. package/vue/chunks/UiPopover.js +1 -1
  161. package/vue/chunks/UiReel.js +1 -1
  162. package/vue/chunks/UiSearchResultRow.js +1 -1
  163. package/vue/chunks/UiSearchShell.js +1 -1
  164. package/vue/chunks/UiSelect.js +1 -1
  165. package/vue/chunks/UiSidebar.js +1 -1
  166. package/vue/chunks/UiStack.js +1 -1
  167. package/vue/chunks/UiSwitcher.js +1 -1
  168. package/vue/chunks/UiTabs.js +7 -2
  169. package/vue/chunks/UiTextarea.js +1 -1
  170. package/vue/chunks/UiToastRegion.js +1 -1
  171. package/vue/chunks/UiTooltip.js +1 -1
  172. package/vue/chunks/UiTopBar.js +1 -1
  173. package/vue/chunks/UiTree.js +8 -2
  174. package/vue/chunks/UiTreeItem.js +1 -1
  175. package/vue/components.css +1114 -1090
  176. package/vue/editor/LoomaEditor.d.ts +11 -0
  177. package/vue/editor/index.js +17 -0
@@ -146,11 +146,11 @@ onBeforeUnmount(() => {
146
146
  position: absolute;
147
147
  inset: 50% auto auto 50%;
148
148
  z-index: 1;
149
- inline-size: var(--ui-affordance-guide-size, 0.25rem);
150
- block-size: var(--ui-affordance-guide-size, 0.25rem);
151
- border-radius: var(--ui-radius-round, 999px);
149
+ inline-size: var(--ui-affordance-guide-size);
150
+ block-size: var(--ui-affordance-guide-size);
151
+ border-radius: var(--ui-radius-round);
152
152
  background: var(--ui-affordance-guide-color, var(--ui-border-strong));
153
- opacity: var(--ui-affordance-guide-opacity, 0.42);
153
+ opacity: var(--ui-affordance-guide-opacity);
154
154
  transform: translate(-50%, -50%);
155
155
  transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
156
156
  pointer-events: none;
@@ -173,16 +173,18 @@ onBeforeUnmount(() => {
173
173
  }
174
174
 
175
175
  [data-component~="ui-icon-button"] {
176
+ /* The size prop resolves here; --ui-icon-button-size overrides it on an element. */
177
+ --_size: 2rem;
176
178
  appearance: none;
177
- inline-size: var(--ui-icon-button-size, 2rem);
178
- block-size: var(--ui-icon-button-size, 2rem);
179
- min-inline-size: var(--ui-icon-button-size, 2rem);
180
- min-block-size: var(--ui-icon-button-size, 2rem);
179
+ inline-size: var(--ui-icon-button-size, var(--_size));
180
+ block-size: var(--ui-icon-button-size, var(--_size));
181
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
182
+ min-block-size: var(--ui-icon-button-size, var(--_size));
181
183
  padding: 0;
182
184
  margin: 0;
183
185
  border: 1px solid transparent;
184
- border-radius: var(--ui-icon-button-radius, var(--ui-radius-2));
185
- background: var(--ui-icon-button-bg, transparent);
186
+ border-radius: var(--ui-icon-button-radius, var(--ui-radius-md));
187
+ background: var(--ui-icon-button-surface, transparent);
186
188
  color: inherit;
187
189
  display: inline-flex;
188
190
  align-items: center;
@@ -213,8 +215,8 @@ onBeforeUnmount(() => {
213
215
  content: "";
214
216
  position: absolute;
215
217
  inset: 50% auto auto 50%;
216
- inline-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
217
- block-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
218
+ inline-size: max(100%, var(--ui-control-min-block-size));
219
+ block-size: max(100%, var(--ui-control-min-block-size));
218
220
  transform: translate(-50%, -50%);
219
221
  }
220
222
  }
@@ -227,38 +229,40 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"]::after {
227
229
  content: "";
228
230
  position: absolute;
229
231
  inset: 50% auto auto 50%;
230
- inline-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
231
- block-size: max(100%, var(--ui-control-min-block-size, 2.75rem));
232
+ inline-size: max(100%, var(--ui-control-min-block-size));
233
+ block-size: max(100%, var(--ui-control-min-block-size));
232
234
  transform: translate(-50%, -50%);
233
235
  }
234
236
 
235
237
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"] {
236
- inline-size: var(--ui-icon-button-size-sm, 1.75rem);
237
- block-size: var(--ui-icon-button-size-sm, 1.75rem);
238
- min-inline-size: var(--ui-icon-button-size-sm, 1.75rem);
239
- min-block-size: var(--ui-icon-button-size-sm, 1.75rem);
238
+ --_size: 1.75rem;
239
+ inline-size: var(--ui-icon-button-size, var(--_size));
240
+ block-size: var(--ui-icon-button-size, var(--_size));
241
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
242
+ min-block-size: var(--ui-icon-button-size, var(--_size));
240
243
  }
241
244
 
242
245
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"] {
243
- inline-size: var(--ui-icon-button-size-lg, 2.5rem);
244
- block-size: var(--ui-icon-button-size-lg, 2.5rem);
245
- min-inline-size: var(--ui-icon-button-size-lg, 2.5rem);
246
- min-block-size: var(--ui-icon-button-size-lg, 2.5rem);
246
+ --_size: 2.5rem;
247
+ inline-size: var(--ui-icon-button-size, var(--_size));
248
+ block-size: var(--ui-icon-button-size, var(--_size));
249
+ min-inline-size: var(--ui-icon-button-size, var(--_size));
250
+ min-block-size: var(--ui-icon-button-size, var(--_size));
247
251
  }
248
252
 
249
253
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="round"] {
250
- border-radius: var(--ui-radius-round, 999px);
254
+ border-radius: var(--ui-radius-round);
251
255
  }
252
256
 
253
257
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"] {
254
258
  border-color: var(--ui-icon-button-border, var(--ui-border-default));
255
- background: var(--ui-icon-button-outline-bg, var(--ui-surface-default));
256
- color: var(--ui-icon-button-outline-color, var(--ui-text-primary));
259
+ background: var(--ui-icon-button-outline-surface, var(--ui-surface-default));
260
+ color: var(--ui-icon-button-outline-text, var(--ui-text-primary));
257
261
  }
258
262
 
259
263
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"] {
260
- background: var(--ui-icon-button-solid-bg, var(--ui-accent-solid));
261
- color: var(--ui-icon-button-solid-color, var(--ui-text-on-accent));
264
+ background: var(--ui-icon-button-solid-surface, var(--ui-accent-solid));
265
+ color: var(--ui-icon-button-solid-text, var(--ui-text-on-accent));
262
266
  box-shadow: var(
263
267
  --ui-icon-button-solid-shadow,
264
268
  0 1px 2px color-mix(in srgb, var(--ui-accent-solid) 18%, transparent)
@@ -267,8 +271,8 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"]::after {
267
271
 
268
272
  [data-component~="ui-icon-button"]:hover:enabled {
269
273
  /* Derived from the text colour so the ghost hover shows on any background. */
270
- background: var(--ui-icon-button-hover-bg, color-mix(in srgb, currentColor 8%, transparent));
271
- color: var(--ui-icon-button-hover-color, var(--ui-text-primary));
274
+ background: var(--ui-icon-button-hover-surface, color-mix(in srgb, currentColor 8%, transparent));
275
+ color: var(--ui-icon-button-hover-text, var(--ui-text-primary));
272
276
  }
273
277
 
274
278
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"]:hover:enabled {
@@ -276,7 +280,7 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"]::after {
276
280
  }
277
281
 
278
282
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"]:hover:enabled {
279
- background: var(--ui-icon-button-solid-hover-bg, var(--ui-accent-hover));
283
+ background: var(--ui-icon-button-solid-hover-surface, var(--ui-accent-hover));
280
284
  }
281
285
 
282
286
  [data-component~="ui-icon-button"]:active:enabled {
@@ -290,47 +294,33 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"]::after {
290
294
 
291
295
  /* Disabled colours fall back to each variant's own; ghost takes only the icon colour. */
292
296
  [data-component~="ui-icon-button"]:disabled {
293
- opacity: var(--ui-icon-button-disabled-opacity, 0.6);
294
- color: var(--ui-icon-button-disabled-color, inherit);
297
+ opacity: var(--ui-icon-button-disabled-opacity, 1);
298
+ color: var(--ui-icon-button-disabled-text, var(--ui-disabled-text));
295
299
  cursor: not-allowed;
296
300
  }
297
301
 
298
302
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"]:disabled {
299
- border-color: var(
300
- --ui-icon-button-disabled-border,
301
- var(--ui-icon-button-border, var(--ui-border-default))
302
- );
303
- background-color: var(
304
- --ui-icon-button-disabled-bg,
305
- var(--ui-icon-button-outline-bg, var(--ui-surface-default))
306
- );
307
- color: var(
308
- --ui-icon-button-disabled-color,
309
- var(--ui-icon-button-outline-color, var(--ui-text-primary))
310
- );
303
+ border-color: var(--ui-icon-button-disabled-border, var(--ui-border));
304
+ background-color: var(--ui-icon-button-disabled-surface, var(--ui-disabled-surface));
305
+ color: var(--ui-icon-button-disabled-text, var(--ui-disabled-text));
311
306
  }
312
307
 
313
308
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"]:disabled {
314
- background-color: var(
315
- --ui-icon-button-disabled-bg,
316
- var(--ui-icon-button-solid-bg, var(--ui-accent-solid))
317
- );
318
- color: var(
319
- --ui-icon-button-disabled-color,
320
- var(--ui-icon-button-solid-color, var(--ui-text-on-accent))
321
- );
309
+ border-color: var(--ui-icon-button-disabled-border, var(--ui-border));
310
+ background-color: var(--ui-icon-button-disabled-surface, var(--ui-disabled-surface));
311
+ color: var(--ui-icon-button-disabled-text, var(--ui-disabled-text));
322
312
  }
323
313
 
324
314
  [data-component~="ui-icon-button"] {
325
- --_icon-button-icon-default: var(--ui-icon-size-md, 1.25rem);
315
+ --_icon-button-icon-default: var(--ui-icon-size-md);
326
316
  }
327
317
 
328
318
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"] {
329
- --_icon-button-icon-default: var(--ui-icon-size-sm, 1rem);
319
+ --_icon-button-icon-default: var(--ui-icon-size-sm);
330
320
  }
331
321
 
332
322
  [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"] {
333
- --_icon-button-icon-default: var(--ui-icon-size-lg, 1.5rem);
323
+ --_icon-button-icon-default: var(--ui-icon-size-lg);
334
324
  }
335
325
 
336
326
  :slotted(svg) {
package/vue/UiInput.vue CHANGED
@@ -132,12 +132,12 @@ onBeforeUnmount(() => {
132
132
  display: inline-block;
133
133
  inline-size: 100%;
134
134
  min-inline-size: 0;
135
- min-block-size: var(--ui-control-size-md, 2.5rem);
135
+ min-block-size: var(--ui-control-size-md);
136
136
  margin: 0;
137
137
  padding: var(--ui-space-2) var(--ui-space-3);
138
138
  appearance: none;
139
139
  border: 1px solid var(--ui-control-border, var(--ui-border-strong));
140
- border-radius: var(--ui-input-radius, var(--ui-radius-2));
140
+ border-radius: var(--ui-input-radius, var(--ui-radius-md));
141
141
  background: var(--ui-control-surface, var(--ui-surface-elevated));
142
142
  color: var(--ui-text-primary);
143
143
  font: inherit;
package/vue/UiMenu.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  type __VLS_Props = {
2
+ density?: 'comfortable' | 'compact';
2
3
  for?: string;
3
4
  open?: boolean;
4
5
  placement?: string;
@@ -43,6 +44,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
43
44
  for: string;
44
45
  open: boolean;
45
46
  placement: string;
47
+ density: "comfortable" | "compact";
46
48
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
47
49
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
48
50
  declare const _default: typeof __VLS_export;
package/vue/UiMenu.vue CHANGED
@@ -7,11 +7,13 @@ defineOptions({ inheritAttrs: false })
7
7
 
8
8
  const props = withDefaults(
9
9
  defineProps<{
10
+ density?: 'comfortable' | 'compact'
10
11
  for?: string
11
12
  open?: boolean
12
13
  placement?: string
13
14
  }>(),
14
15
  {
16
+ density: 'comfortable',
15
17
  for: '',
16
18
  open: false,
17
19
  placement: 'bottom-start',
@@ -44,6 +46,7 @@ const internalOpen = ref(false)
44
46
  /** The values the styles' :host-state() rules test. */
45
47
  const hostState = computed(() =>
46
48
  [
49
+ props.density && `density density=${props.density}`,
47
50
  internalOpen.value && 'internalOpen',
48
51
  ].filter(Boolean).join(' ')
49
52
  )
@@ -192,16 +195,23 @@ onBeforeUnmount(() => {
192
195
  </template>
193
196
 
194
197
  <style scoped>
198
+ /* Compact sets the part tokens its items read, so nothing has to rescale a global. */
199
+ [data-component~="ui-menu"][data-ui-menu-state~="density=compact"] {
200
+ --ui-menu-item-padding-block: var(--ui-space-1);
201
+ --ui-menu-item-padding-inline: var(--ui-space-2);
202
+ --ui-menu-item-font-size: var(--ui-font-size-sm);
203
+ --ui-menu-item-radius: var(--ui-radius-sm);
204
+ padding: var(--ui-space-1);
205
+ gap: 0;
206
+ }
207
+
195
208
  [data-component~="ui-menu"] {
196
209
  display: flex;
197
210
  flex-direction: column;
198
211
  box-sizing: border-box;
199
212
  inline-size: max-content;
200
- min-inline-size: min(
201
- 12rem,
202
- calc(100vw - var(--ui-menu-viewport-gap, var(--ui-space-2, 0.5rem)) * 2)
203
- );
204
- max-inline-size: calc(100vw - var(--ui-menu-viewport-gap, var(--ui-space-2, 0.5rem)) * 2);
213
+ min-inline-size: min(12rem, calc(100vw - var(--ui-menu-viewport-gap, var(--ui-space-2)) * 2));
214
+ max-inline-size: calc(100vw - var(--ui-menu-viewport-gap, var(--ui-space-2)) * 2);
205
215
  padding: 0;
206
216
  border: 0;
207
217
  outline: 0;
@@ -219,7 +229,7 @@ onBeforeUnmount(() => {
219
229
  padding: var(--ui-space-1);
220
230
  background: var(--ui-surface-elevated);
221
231
  border: 1px solid var(--ui-border-default);
222
- border-radius: var(--ui-radius-3);
232
+ border-radius: var(--ui-radius-lg);
223
233
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
224
234
  max-block-size: inherit;
225
235
  overflow: auto;
@@ -234,7 +244,7 @@ onBeforeUnmount(() => {
234
244
  inset: auto;
235
245
  margin: 0;
236
246
  overflow: visible;
237
- max-block-size: calc(100dvh - var(--ui-menu-viewport-gap, var(--ui-space-2, 0.5rem)) * 2);
247
+ max-block-size: calc(100dvh - var(--ui-menu-viewport-gap, var(--ui-space-2)) * 2);
238
248
  opacity: 0;
239
249
  transform: translateY(-4px) scale(0.99);
240
250
  transition:
@@ -32,12 +32,13 @@ withDefaults(
32
32
  display: block;
33
33
  box-sizing: border-box;
34
34
  width: 100%;
35
- padding: var(--ui-space-2) var(--ui-space-3);
35
+ padding: var(--ui-menu-item-padding-block, var(--ui-space-2))
36
+ var(--ui-menu-item-padding-inline, var(--ui-space-3));
36
37
  text-align: left;
37
- border-radius: var(--ui-radius-2);
38
+ border-radius: var(--ui-menu-item-radius, var(--ui-radius-md));
38
39
  color: var(--ui-text-primary);
39
- font-size: var(--ui-font-size-md);
40
- font-weight: var(--ui-font-medium, 500);
40
+ font-size: var(--ui-menu-item-font-size, var(--ui-font-size-md));
41
+ font-weight: var(--ui-font-medium);
41
42
  cursor: pointer;
42
43
  outline: none;
43
44
  transition:
@@ -46,7 +47,7 @@ withDefaults(
46
47
  }
47
48
 
48
49
  [data-component~="ui-menu-item"]:is(:hover, :focus-visible):not([aria-disabled="true"]) {
49
- background: var(--ui-surface-subtle);
50
+ background: var(--ui-menu-item-hover-surface, var(--ui-surface-subtle));
50
51
  }
51
52
 
52
53
  [data-component~="ui-menu-item"][aria-disabled="true"] {
package/vue/UiPopover.vue CHANGED
@@ -183,9 +183,9 @@ onBeforeUnmount(() => {
183
183
  box-sizing: border-box;
184
184
  max-inline-size: min(
185
185
  20rem,
186
- calc(100vw - var(--ui-popover-viewport-gap, var(--ui-space-2, 0.5rem)) * 2)
186
+ calc(100vw - var(--ui-popover-viewport-gap, var(--ui-space-2)) * 2)
187
187
  );
188
- max-block-size: calc(100dvh - var(--ui-popover-viewport-gap, var(--ui-space-2, 0.5rem)) * 2);
188
+ max-block-size: calc(100dvh - var(--ui-popover-viewport-gap, var(--ui-space-2)) * 2);
189
189
  overflow: visible;
190
190
  padding: 0;
191
191
  border: 0;
@@ -203,7 +203,7 @@ onBeforeUnmount(() => {
203
203
  padding: var(--ui-space-3);
204
204
  background: var(--ui-surface-elevated);
205
205
  border: 1px solid var(--ui-border-default);
206
- border-radius: var(--ui-radius-3);
206
+ border-radius: var(--ui-radius-lg);
207
207
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
208
208
  }
209
209
 
package/vue/UiReel.vue CHANGED
@@ -34,7 +34,7 @@ const hostState = computed(() =>
34
34
 
35
35
  <style scoped>
36
36
  [data-component~="ui-reel"] {
37
- --_reel-gap: var(--ui-space-4, 1rem);
37
+ --_reel-gap: var(--ui-space-4);
38
38
  --_reel-item-width: auto;
39
39
  display: flex;
40
40
  inline-size: 100%;
@@ -53,19 +53,19 @@ const hostState = computed(() =>
53
53
  }
54
54
 
55
55
  [data-component~="ui-reel"][data-ui-reel-state~="gap=xs"] {
56
- --_reel-gap: var(--ui-space-2, 0.5rem);
56
+ --_reel-gap: var(--ui-space-2);
57
57
  }
58
58
  [data-component~="ui-reel"][data-ui-reel-state~="gap=s"] {
59
- --_reel-gap: var(--ui-space-3, 0.75rem);
59
+ --_reel-gap: var(--ui-space-3);
60
60
  }
61
61
  [data-component~="ui-reel"][data-ui-reel-state~="gap=m"] {
62
- --_reel-gap: var(--ui-space-4, 1rem);
62
+ --_reel-gap: var(--ui-space-4);
63
63
  }
64
64
  [data-component~="ui-reel"][data-ui-reel-state~="gap=l"] {
65
- --_reel-gap: var(--ui-space-5, 1.5rem);
65
+ --_reel-gap: var(--ui-space-5);
66
66
  }
67
67
  [data-component~="ui-reel"][data-ui-reel-state~="gap=xl"] {
68
- --_reel-gap: var(--ui-space-6, 2rem);
68
+ --_reel-gap: var(--ui-space-6);
69
69
  }
70
70
  [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=sm"] {
71
71
  --_reel-item-width: 12rem;
@@ -45,18 +45,18 @@ const hostState = computed(() =>
45
45
  inline-size: 100%;
46
46
  min-block-size: var(--ui-search-result-row-min-height, 56px);
47
47
  margin: 0;
48
- padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-3, 0.75rem));
49
- padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-4, 1rem));
48
+ padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-3));
49
+ padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-4));
50
50
  display: flex;
51
51
  align-items: flex-start;
52
- gap: var(--ui-search-result-row-gap, var(--ui-space-3, 0.75rem));
53
- background: var(--ui-search-result-row-bg, transparent);
52
+ gap: var(--ui-search-result-row-gap, var(--ui-space-3));
53
+ background: var(--ui-search-result-row-surface, transparent);
54
54
  border: none;
55
- border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border, #e5e7eb));
55
+ border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border));
56
56
  color: inherit;
57
57
  cursor: pointer;
58
58
  text-align: left;
59
- transition: background-color var(--ui-motion-fast, 160ms) var(--ui-motion-ease, ease);
59
+ transition: background-color var(--ui-motion-fast) var(--ui-motion-ease);
60
60
  }
61
61
 
62
62
  [data-component~="ui-search-result-row"]:last-child {
@@ -65,23 +65,20 @@ const hostState = computed(() =>
65
65
 
66
66
  [data-component~="ui-search-result-row"]:hover:enabled {
67
67
  background: var(
68
- --ui-search-result-row-hover-bg,
69
- color-mix(in srgb, var(--ui-surface, #ffffff) 85%, black 3%)
68
+ --ui-search-result-row-hover-surface,
69
+ color-mix(in srgb, var(--ui-surface) 85%, black 3%)
70
70
  );
71
71
  }
72
72
 
73
73
  [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="selected"] {
74
74
  background: var(
75
75
  --ui-search-result-row-selected-bg,
76
- var(
77
- --ui-search-result-row-hover-bg,
78
- color-mix(in srgb, var(--ui-surface, #ffffff) 85%, black 3%)
79
- )
76
+ var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
80
77
  );
81
78
  }
82
79
 
83
80
  [data-component~="ui-search-result-row"]:focus-visible {
84
- outline: 2px solid var(--ui-focus-ring, #2563eb);
81
+ outline: 2px solid var(--ui-focus-ring);
85
82
  outline-offset: -2px;
86
83
  }
87
84
 
@@ -207,7 +207,7 @@ dialog::backdrop {
207
207
  max-block-size: var(--ui-search-shell-max-height, 80vh);
208
208
  margin-inline: auto;
209
209
  overflow: hidden;
210
- background: var(--ui-search-shell-bg, var(--ui-surface-elevated));
210
+ background: var(--ui-search-shell-surface, var(--ui-surface-elevated));
211
211
  border: 1px solid var(--ui-search-shell-border, var(--ui-border-default));
212
212
  border-radius: var(--ui-search-shell-radius, var(--ui-radius-dialog));
213
213
  box-shadow: var(--ui-search-shell-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)));
@@ -233,7 +233,7 @@ dialog::backdrop {
233
233
  min-block-size: var(--ui-control-min-block-size);
234
234
  padding: var(--ui-space-2) var(--ui-space-3);
235
235
  border: 1px solid var(--ui-control-border);
236
- border-radius: var(--ui-radius-2);
236
+ border-radius: var(--ui-radius-md);
237
237
  background: var(--ui-control-surface);
238
238
  color: var(--ui-text-primary);
239
239
  font: inherit;
@@ -242,7 +242,7 @@ dialog::backdrop {
242
242
 
243
243
  :slotted(input[slot="search"]:focus-visible) {
244
244
  border-color: var(--ui-control-focus);
245
- outline: 2px solid var(--ui-focus-ring, currentColor);
245
+ outline: 2px solid var(--ui-focus-ring);
246
246
  outline-offset: 2px;
247
247
  }
248
248
 
package/vue/UiSelect.vue CHANGED
@@ -134,11 +134,11 @@ onBeforeUnmount(() => {
134
134
  display: inline-block;
135
135
  inline-size: 100%;
136
136
  min-inline-size: 0;
137
- min-block-size: var(--ui-control-size-md, 2.5rem);
137
+ min-block-size: var(--ui-control-size-md);
138
138
  margin: 0;
139
139
  padding: var(--ui-space-2) var(--ui-space-3);
140
140
  border: 1px solid var(--ui-control-border, var(--ui-border-strong));
141
- border-radius: var(--ui-select-radius, var(--ui-radius-2));
141
+ border-radius: var(--ui-select-radius, var(--ui-radius-md));
142
142
  background-color: var(--ui-control-surface, var(--ui-surface-elevated));
143
143
  color: var(--ui-text-primary);
144
144
  color-scheme: light dark;
package/vue/UiSidebar.vue CHANGED
@@ -280,11 +280,10 @@ onBeforeUnmount(() => {
280
280
  var(--ui-affordance-guide-color, var(--ui-border-strong)) 45%,
281
281
  transparent
282
282
  );
283
- opacity: var(--ui-affordance-guide-opacity, 0.42);
283
+ opacity: var(--ui-affordance-guide-opacity);
284
284
  transition:
285
- background-color var(--ui-affordance-motion, var(--ui-motion-fast, 120ms))
286
- var(--ui-motion-ease, ease),
287
- opacity var(--ui-affordance-motion, var(--ui-motion-fast, 120ms)) var(--ui-motion-ease, ease);
285
+ background-color var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease),
286
+ opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
288
287
  }
289
288
 
290
289
  .guide {
@@ -293,21 +292,17 @@ onBeforeUnmount(() => {
293
292
  inset-inline-start: 50%;
294
293
  inline-size: 6px;
295
294
  block-size: 22px;
296
- border: 1px solid var(--ui-border-strong, #c8c8c4);
297
- border-radius: var(--ui-radius-round, 999px);
298
- background: var(--ui-surface-elevated, #fff);
295
+ border: 1px solid var(--ui-border-strong);
296
+ border-radius: var(--ui-radius-round);
297
+ background: var(--ui-surface-elevated);
299
298
  opacity: 0;
300
299
  transform: translate(-50%, -50%);
301
- transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast, 120ms))
302
- var(--ui-motion-ease, ease);
300
+ transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
303
301
  pointer-events: none;
304
302
  }
305
303
 
306
304
  .resizer:is(:hover, :focus-visible)::after {
307
- background: var(
308
- --ui-affordance-direct-color,
309
- var(--ui-accent-solid, var(--ui-color-focus, Highlight))
310
- );
305
+ background: var(--ui-affordance-direct-color, var(--ui-accent-solid, var(--ui-focus-ring)));
311
306
  opacity: 1;
312
307
  }
313
308
 
@@ -330,9 +325,9 @@ onBeforeUnmount(() => {
330
325
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
331
326
  transform: translateX(0);
332
327
  transition:
333
- transform var(--ui-motion-base, 0.2s) var(--ui-motion-ease-out, ease-out),
334
- display var(--ui-motion-base, 0.2s) allow-discrete,
335
- overlay var(--ui-motion-base, 0.2s) allow-discrete;
328
+ transform var(--ui-motion-base) var(--ui-motion-ease-out),
329
+ display var(--ui-motion-base) allow-discrete,
330
+ overlay var(--ui-motion-base) allow-discrete;
336
331
  }
337
332
 
338
333
  /* The author display above would otherwise override the UA rule that hides a closed popover. */
package/vue/UiStack.vue CHANGED
@@ -28,7 +28,7 @@ const hostState = computed(() =>
28
28
 
29
29
  <style scoped>
30
30
  [data-component~="ui-stack"] {
31
- --_layout-gap: var(--ui-space-4, 1rem);
31
+ --_layout-gap: var(--ui-space-4);
32
32
  display: flex;
33
33
  flex-direction: column;
34
34
  align-items: stretch;
@@ -39,19 +39,19 @@ const hostState = computed(() =>
39
39
  }
40
40
 
41
41
  [data-component~="ui-stack"][data-ui-stack-state~="gap=xs"] {
42
- --_layout-gap: var(--ui-space-2, 0.5rem);
42
+ --_layout-gap: var(--ui-space-2);
43
43
  }
44
44
  [data-component~="ui-stack"][data-ui-stack-state~="gap=s"] {
45
- --_layout-gap: var(--ui-space-3, 0.75rem);
45
+ --_layout-gap: var(--ui-space-3);
46
46
  }
47
47
  [data-component~="ui-stack"][data-ui-stack-state~="gap=m"] {
48
- --_layout-gap: var(--ui-space-4, 1rem);
48
+ --_layout-gap: var(--ui-space-4);
49
49
  }
50
50
  [data-component~="ui-stack"][data-ui-stack-state~="gap=l"] {
51
- --_layout-gap: var(--ui-space-5, 1.5rem);
51
+ --_layout-gap: var(--ui-space-5);
52
52
  }
53
53
  [data-component~="ui-stack"][data-ui-stack-state~="gap=xl"] {
54
- --_layout-gap: var(--ui-space-6, 2rem);
54
+ --_layout-gap: var(--ui-space-6);
55
55
  }
56
56
  [data-component~="ui-stack"][data-ui-stack-state~="align=start"] {
57
57
  align-items: flex-start;
@@ -32,7 +32,7 @@ const hostState = computed(() =>
32
32
 
33
33
  <style scoped>
34
34
  [data-component~="ui-switcher"] {
35
- --_switcher-gap: var(--ui-space-4, 1rem);
35
+ --_switcher-gap: var(--ui-space-4);
36
36
  display: flex;
37
37
  flex-wrap: wrap;
38
38
  gap: var(--ui-switcher-gap, var(--_switcher-gap));
@@ -49,19 +49,19 @@ const hostState = computed(() =>
49
49
  }
50
50
 
51
51
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=xs"] {
52
- --_switcher-gap: var(--ui-space-2, 0.5rem);
52
+ --_switcher-gap: var(--ui-space-2);
53
53
  }
54
54
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=s"] {
55
- --_switcher-gap: var(--ui-space-3, 0.75rem);
55
+ --_switcher-gap: var(--ui-space-3);
56
56
  }
57
57
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=m"] {
58
- --_switcher-gap: var(--ui-space-4, 1rem);
58
+ --_switcher-gap: var(--ui-space-4);
59
59
  }
60
60
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=l"] {
61
- --_switcher-gap: var(--ui-space-5, 1.5rem);
61
+ --_switcher-gap: var(--ui-space-5);
62
62
  }
63
63
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=xl"] {
64
- --_switcher-gap: var(--ui-space-6, 2rem);
64
+ --_switcher-gap: var(--ui-space-6);
65
65
  }
66
66
  [data-component~="ui-switcher"][data-ui-switcher-state~="threshold=xs"] > :slotted(*) {
67
67
  flex-basis: calc((var(--ui-switcher-threshold, 20rem) - 100%) * 999);
package/vue/UiTabs.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  type __VLS_Props = {
2
+ density?: 'comfortable' | 'compact';
2
3
  label?: string;
3
4
  orientation?: 'horizontal' | 'vertical';
4
5
  stretch?: boolean;
@@ -26,6 +27,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
26
27
  label: string;
27
28
  value: string;
28
29
  stretch: boolean;
30
+ density: "comfortable" | "compact";
29
31
  orientation: "horizontal" | "vertical";
30
32
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
31
33
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;