@threadlabs/looma 0.22.14 → 0.23.1

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 (217) hide show
  1. package/components/shared/icons.js +2 -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 +2 -2
  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 +2 -0
  25. package/components/ui-icon-button/ui-icon-button.html +1 -1
  26. package/components/ui-input/ui-input.html +8 -4
  27. package/components/ui-input-group/ui-input-group.html +10 -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 +1 -1
  36. package/components/ui-radio/ui-radio.html +2 -2
  37. package/components/ui-search-result-row/ui-search-result-row.html +24 -5
  38. package/components/ui-search-shell/ui-search-shell.html +4 -4
  39. package/components/ui-section/ui-section.html +3 -3
  40. package/components/ui-select/ui-select.html +6 -2
  41. package/components/ui-separator/ui-separator.html +2 -2
  42. package/components/ui-sidebar/ui-sidebar.html +3 -3
  43. package/components/ui-status-message/ui-status-message.html +1 -1
  44. package/components/ui-switch/ui-switch.html +3 -3
  45. package/components/ui-table/ui-table.html +3 -3
  46. package/components/ui-tabs/ui-tabs.html +7 -7
  47. package/components/ui-textarea/ui-textarea.html +6 -2
  48. package/components/ui-toast/ui-toast.html +2 -2
  49. package/components/ui-toast-region/ui-toast-region.html +5 -5
  50. package/components/ui-tooltip/ui-tooltip.html +15 -15
  51. package/components/ui-top-bar/ui-top-bar.html +1 -1
  52. package/components/ui-tree-item/ui-tree-item.html +27 -8
  53. package/dist/index.js +1 -1
  54. package/editor/icons.d.ts +2 -0
  55. package/editor/index.js +3 -1
  56. package/package.json +1 -1
  57. package/styles/ui-avatar-group.css +1 -1
  58. package/styles/ui-avatar.css +3 -3
  59. package/styles/ui-badge.css +1 -1
  60. package/styles/ui-button.css +3 -3
  61. package/styles/ui-callout.css +3 -2
  62. package/styles/ui-card.css +2 -2
  63. package/styles/ui-checkbox.css +3 -3
  64. package/styles/ui-combobox.css +8 -8
  65. package/styles/ui-context-menu.css +2 -2
  66. package/styles/ui-description-list.css +1 -1
  67. package/styles/ui-dialog.css +3 -3
  68. package/styles/ui-disclosure.css +42 -2
  69. package/styles/ui-editable.css +2 -2
  70. package/styles/ui-editor-insert-table-grid.css +5 -5
  71. package/styles/ui-editor-mention-menu.css +2 -2
  72. package/styles/ui-editor-slash-menu-item.css +1 -1
  73. package/styles/ui-editor-slash-menu.css +6 -6
  74. package/styles/ui-editor-table-context-menu.css +2 -2
  75. package/styles/ui-editor-table-overlay.css +11 -11
  76. package/styles/ui-editor-table-toolbar.css +5 -5
  77. package/styles/ui-editor-toolbar.css +4 -4
  78. package/styles/ui-floating-action-button.css +2 -2
  79. package/styles/ui-icon-button.css +1 -1
  80. package/styles/ui-input-group.css +10 -6
  81. package/styles/ui-input.css +8 -4
  82. package/styles/ui-list-item.css +23 -4
  83. package/styles/ui-list.css +1 -1
  84. package/styles/ui-listbox.css +3 -3
  85. package/styles/ui-menu-item.css +4 -4
  86. package/styles/ui-menu.css +2 -2
  87. package/styles/ui-meter.css +1 -1
  88. package/styles/ui-nav-item.css +46 -12
  89. package/styles/ui-popover.css +1 -1
  90. package/styles/ui-radio.css +2 -2
  91. package/styles/ui-search-result-row.css +29 -5
  92. package/styles/ui-search-shell.css +4 -4
  93. package/styles/ui-section.css +3 -3
  94. package/styles/ui-select.css +6 -2
  95. package/styles/ui-separator.css +2 -2
  96. package/styles/ui-sidebar.css +3 -3
  97. package/styles/ui-status-message.css +1 -1
  98. package/styles/ui-switch.css +3 -3
  99. package/styles/ui-table.css +3 -3
  100. package/styles/ui-tabs.css +7 -7
  101. package/styles/ui-textarea.css +6 -2
  102. package/styles/ui-toast-region.css +5 -5
  103. package/styles/ui-toast.css +2 -2
  104. package/styles/ui-tooltip.css +15 -15
  105. package/styles/ui-top-bar.css +1 -1
  106. package/styles/ui-tree-item.css +32 -8
  107. package/tokens.css +30 -9
  108. package/vanilla/UiDisclosure.d.ts +1 -0
  109. package/vanilla/UiDisclosure.js +10 -1
  110. package/vanilla/UiIcon.js +1 -1
  111. package/vanilla/UiNavItem.d.ts +2 -0
  112. package/vanilla/UiNavItem.js +1 -1
  113. package/vue/UiAvatar.vue +3 -3
  114. package/vue/UiAvatarGroup.vue +1 -1
  115. package/vue/UiBadge.vue +2 -1
  116. package/vue/UiButton.vue +3 -3
  117. package/vue/UiCallout.vue +2 -2
  118. package/vue/UiCard.vue +2 -2
  119. package/vue/UiCheckbox.vue +3 -3
  120. package/vue/UiCombobox.vue +11 -8
  121. package/vue/UiContextMenu.vue +2 -2
  122. package/vue/UiDescriptionList.vue +1 -1
  123. package/vue/UiDialog.vue +4 -3
  124. package/vue/UiDisclosure.d.ts +13 -2
  125. package/vue/UiDisclosure.vue +61 -4
  126. package/vue/UiEditable.vue +2 -2
  127. package/vue/UiEditorInsertTableGrid.vue +5 -5
  128. package/vue/UiEditorMentionMenu.vue +2 -2
  129. package/vue/UiEditorSlashMenu.vue +6 -6
  130. package/vue/UiEditorSlashMenuItem.vue +1 -1
  131. package/vue/UiEditorTableContextMenu.vue +2 -2
  132. package/vue/UiEditorTableOverlay.vue +11 -11
  133. package/vue/UiEditorTableToolbar.vue +5 -5
  134. package/vue/UiEditorToolbar.vue +6 -4
  135. package/vue/UiFloatingActionButton.vue +2 -2
  136. package/vue/UiIcon.vue +8 -0
  137. package/vue/UiIconButton.vue +1 -1
  138. package/vue/UiInput.vue +7 -4
  139. package/vue/UiInputGroup.vue +6 -6
  140. package/vue/UiList.vue +1 -1
  141. package/vue/UiListItem.vue +20 -4
  142. package/vue/UiListbox.vue +3 -3
  143. package/vue/UiMenu.vue +3 -2
  144. package/vue/UiMenuItem.vue +4 -4
  145. package/vue/UiMeter.vue +1 -1
  146. package/vue/UiNavItem.d.ts +18 -0
  147. package/vue/UiNavItem.vue +96 -12
  148. package/vue/UiPopover.vue +2 -1
  149. package/vue/UiRadio.vue +2 -2
  150. package/vue/UiSearchResultRow.vue +25 -5
  151. package/vue/UiSearchShell.vue +4 -4
  152. package/vue/UiSection.vue +3 -3
  153. package/vue/UiSelect.vue +3 -2
  154. package/vue/UiSeparator.vue +4 -2
  155. package/vue/UiSidebar.vue +5 -3
  156. package/vue/UiStatusMessage.vue +1 -1
  157. package/vue/UiSwitch.vue +3 -3
  158. package/vue/UiTable.vue +3 -3
  159. package/vue/UiTabs.vue +8 -7
  160. package/vue/UiTextarea.vue +2 -2
  161. package/vue/UiToast.vue +4 -2
  162. package/vue/UiToastRegion.vue +5 -5
  163. package/vue/UiTooltip.vue +19 -15
  164. package/vue/UiTopBar.vue +1 -1
  165. package/vue/UiTreeItem.vue +31 -8
  166. package/vue/chunks/UiAvatar.js +1 -1
  167. package/vue/chunks/UiAvatarGroup.js +1 -1
  168. package/vue/chunks/UiBadge.js +1 -1
  169. package/vue/chunks/UiButton.js +1 -1
  170. package/vue/chunks/UiCallout.js +1 -1
  171. package/vue/chunks/UiCard.js +1 -1
  172. package/vue/chunks/UiCheckbox.js +1 -1
  173. package/vue/chunks/UiCombobox.js +1 -1
  174. package/vue/chunks/UiContextMenu.js +1 -1
  175. package/vue/chunks/UiDescriptionList.js +1 -1
  176. package/vue/chunks/UiDialog.js +1 -1
  177. package/vue/chunks/UiDisclosure.js +27 -4
  178. package/vue/chunks/UiEditable.js +1 -1
  179. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  180. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  181. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  182. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  183. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  184. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  185. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  186. package/vue/chunks/UiEditorToolbar.js +1 -1
  187. package/vue/chunks/UiFloatingActionButton.js +1 -1
  188. package/vue/chunks/UiIcon.js +24 -1
  189. package/vue/chunks/UiIconButton.js +1 -1
  190. package/vue/chunks/UiInput.js +1 -1
  191. package/vue/chunks/UiInputGroup.js +1 -1
  192. package/vue/chunks/UiList.js +1 -1
  193. package/vue/chunks/UiListItem.js +1 -1
  194. package/vue/chunks/UiListbox.js +1 -1
  195. package/vue/chunks/UiMenu.js +1 -1
  196. package/vue/chunks/UiMenuItem.js +1 -1
  197. package/vue/chunks/UiMeter.js +1 -1
  198. package/vue/chunks/UiNavItem.js +65 -6
  199. package/vue/chunks/UiPopover.js +1 -1
  200. package/vue/chunks/UiRadio.js +1 -1
  201. package/vue/chunks/UiSearchResultRow.js +1 -1
  202. package/vue/chunks/UiSearchShell.js +1 -1
  203. package/vue/chunks/UiSection.js +1 -1
  204. package/vue/chunks/UiSelect.js +1 -1
  205. package/vue/chunks/UiSeparator.js +1 -1
  206. package/vue/chunks/UiSidebar.js +1 -1
  207. package/vue/chunks/UiStatusMessage.js +1 -1
  208. package/vue/chunks/UiSwitch.js +1 -1
  209. package/vue/chunks/UiTable.js +1 -1
  210. package/vue/chunks/UiTabs.js +1 -1
  211. package/vue/chunks/UiTextarea.js +1 -1
  212. package/vue/chunks/UiToast.js +1 -1
  213. package/vue/chunks/UiToastRegion.js +1 -1
  214. package/vue/chunks/UiTooltip.js +1 -1
  215. package/vue/chunks/UiTopBar.js +1 -1
  216. package/vue/chunks/UiTreeItem.js +1 -1
  217. package/vue/components.css +1348 -1208
@@ -147,7 +147,7 @@
147
147
  min-block-size: var(--ui-icon-button-size, var(--_size));
148
148
  padding: 0;
149
149
  margin: 0;
150
- border: 1px solid transparent;
150
+ border: var(--ui-border-width) solid transparent;
151
151
  border-radius: var(--ui-icon-button-radius, var(--ui-action-radius, var(--ui-radius-md)));
152
152
  background-color: var(--ui-icon-button-surface, transparent);
153
153
  color: inherit;
@@ -43,7 +43,7 @@
43
43
  min-inline-size: 0;
44
44
  min-block-size: var(--ui-control-size-md);
45
45
  /* The frame reads the shared control tokens with a lone Input's fallbacks, so the two match. */
46
- border: 1px solid var(--ui-control-border, var(--ui-border-strong));
46
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
47
47
  border-radius: var(--ui-input-group-radius, var(--ui-field-radius, var(--ui-radius-md)));
48
48
  background: var(--ui-control-surface, var(--ui-surface-elevated));
49
49
  box-shadow: var(--ui-control-inset);
@@ -89,15 +89,19 @@
89
89
  box-shadow: var(
90
90
  --ui-input-group-invalid-focus-shadow,
91
91
  var(--ui-control-inset),
92
- 0 0 0 3px color-mix(in srgb, var(--ui-input-group-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
92
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
93
+ in srgb,
94
+ var(--ui-input-group-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
95
+ transparent
96
+ )
93
97
  );
94
98
  }
95
99
 
96
100
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
97
101
  @media (forced-colors: active) {
98
102
  :scope:has(input:focus-visible) {
99
- outline: 2px solid Highlight;
100
- outline-offset: 1px;
103
+ outline: var(--ui-focus-width) solid Highlight;
104
+ outline-offset: var(--ui-border-width);
101
105
  }
102
106
  }
103
107
 
@@ -132,11 +136,11 @@
132
136
  }
133
137
 
134
138
  .affix:has([slot="prefix"]) {
135
- border-inline-end: 1px solid var(--ui-border-divider);
139
+ border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
136
140
  }
137
141
 
138
142
  .affix:has([slot="suffix"]) {
139
- border-inline-start: 1px solid var(--ui-border-divider);
143
+ border-inline-start: var(--ui-border-width) solid var(--ui-border-divider);
140
144
  }
141
145
 
142
146
  :scope[data-ui-input-group-state~="prefixKind=icon"] {
@@ -65,7 +65,7 @@
65
65
  padding: var(--ui-space-2) var(--ui-space-3);
66
66
  appearance: none;
67
67
  padding-inline-start: var(--_ui-default-input-padding-inline-start, var(--ui-space-3));
68
- border: var(--ui-input-border-width, var(--_ui-default-input-border-width, 1px)) solid
68
+ border: var(--ui-input-border-width, var(--_ui-default-input-border-width, var(--ui-border-width))) solid
69
69
  var(--ui-input-border, var(--_ui-default-input-border, var(--ui-control-border, var(--ui-border-strong))));
70
70
  border-radius: var(--ui-input-radius, var(--_ui-default-input-radius, var(--ui-field-radius, var(--ui-radius-md))));
71
71
  background: var(--ui-input-surface, var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated))));
@@ -134,7 +134,11 @@
134
134
  var(
135
135
  --_ui-default-input-invalid-focus-shadow,
136
136
  var(--ui-control-inset),
137
- 0 0 0 3px color-mix(in srgb, var(--ui-input-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
137
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
138
+ in srgb,
139
+ var(--ui-input-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
140
+ transparent
141
+ )
138
142
  )
139
143
  );
140
144
  }
@@ -149,8 +153,8 @@
149
153
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
150
154
  @media (forced-colors: active) {
151
155
  :scope:focus-visible {
152
- outline: var(--ui-input-focus-outline, var(--_ui-default-input-focus-outline, 2px solid Highlight));
153
- outline-offset: 1px;
156
+ outline: var(--ui-input-focus-outline, var(--_ui-default-input-focus-outline, var(--ui-focus-width) solid Highlight));
157
+ outline-offset: var(--ui-border-width);
154
158
  }
155
159
  }
156
160
 
@@ -40,7 +40,7 @@
40
40
  min-block-size: var(--_ui-list-item-min-size, var(--ui-control-size, 2.5rem));
41
41
  padding-block: var(--ui-list-item-padding-block, var(--_ui-list-item-padding-block, var(--ui-space-2)));
42
42
  padding-inline: var(--ui-list-item-padding-inline, var(--_ui-list-item-padding-inline, var(--ui-space-3)));
43
- border-radius: var(--ui-radius-md);
43
+ border-radius: var(--ui-selection-radius);
44
44
  color: var(--ui-text-primary);
45
45
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), border-color var(--ui-motion-fast) var(--ui-motion-ease);
46
46
  }
@@ -48,7 +48,7 @@
48
48
  :scope[data-ui-list-item-state~="variant=card"] {
49
49
  padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
50
50
  padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
51
- border: 1px solid var(--ui-border-strong);
51
+ border: var(--ui-border-width) solid var(--ui-border-strong);
52
52
  border-radius: var(--ui-radius-lg);
53
53
  background: var(--ui-surface-raised);
54
54
  }
@@ -62,11 +62,12 @@
62
62
  }
63
63
 
64
64
  :scope[data-ui-list-item-state~="current"] {
65
- background: var(--ui-surface-hover);
65
+ background: var(--ui-selection-surface);
66
+ color: var(--ui-selection-text);
66
67
  }
67
68
 
68
69
  :scope:has(.title a[href]:focus-visible) {
69
- box-shadow: 0 0 0 2px var(--ui-focus-ring);
70
+ box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
70
71
  }
71
72
 
72
73
  .leading,
@@ -82,6 +83,10 @@
82
83
  font-size: var(--_ui-list-item-icon-size, var(--ui-font-size-lg));
83
84
  }
84
85
 
86
+ :scope[data-ui-list-item-state~="current"] .leading {
87
+ color: var(--ui-selection-text);
88
+ }
89
+
85
90
  /* Trailing controls take their own clicks, above the title link's stretched hit area. */
86
91
  .trailing {
87
92
  position: relative;
@@ -126,6 +131,17 @@
126
131
  display: none;
127
132
  }
128
133
 
134
+ @media (forced-colors: active) {
135
+ :scope:has(a:focus-visible) {
136
+ outline: var(--ui-focus-width) solid Highlight;
137
+ outline-offset: calc(-1 * var(--ui-focus-width));
138
+ }
139
+ :scope[data-ui-list-item-state~="current"]:not(:has(a:focus-visible)) {
140
+ outline: var(--ui-border-width) solid Highlight;
141
+ outline-offset: calc(-1 * var(--ui-border-width));
142
+ }
143
+ }
144
+
129
145
  /* A component that sets its display still honours the hidden attribute on its root. */
130
146
  :scope[hidden] {
131
147
  display: none;
@@ -165,5 +181,8 @@
165
181
 
166
182
  /* An unused region takes no space. */
167
183
 
184
+ @media (forced-colors: active) {
185
+ }
186
+
168
187
  /* A component that sets its display still honours the hidden attribute on its root. */
169
188
  }
@@ -79,7 +79,7 @@
79
79
 
80
80
  :scope > :where([data-slotted], [data-slotted] *):is(li.card) {
81
81
  padding: var(--_ui-list-native-padding-block, var(--ui-space-3)) var(--_ui-list-native-padding-inline, var(--ui-space-4));
82
- border: 1px solid var(--ui-border-strong);
82
+ border: var(--ui-border-width) solid var(--ui-border-strong);
83
83
  border-radius: var(--ui-radius-lg);
84
84
  background: var(--ui-surface-raised);
85
85
  list-style: none;
@@ -28,7 +28,7 @@
28
28
  min-inline-size: 0;
29
29
  margin: 0;
30
30
  padding: var(--ui-space-1);
31
- border: 1px solid var(--ui-listbox-border, var(--ui-control-border));
31
+ border: var(--ui-border-width) solid var(--ui-listbox-border, var(--ui-control-border));
32
32
  border-radius: var(--ui-listbox-radius, var(--ui-field-radius, var(--ui-radius-md)));
33
33
  background: var(--ui-listbox-surface, var(--ui-control-surface));
34
34
  color: var(--ui-text-primary);
@@ -72,8 +72,8 @@
72
72
 
73
73
  :scope:focus-visible {
74
74
  border-color: var(--ui-control-focus);
75
- outline: 2px solid var(--ui-focus-ring);
76
- outline-offset: 2px;
75
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
76
+ outline-offset: var(--ui-focus-width);
77
77
  box-shadow: var(--ui-listbox-focus-shadow, var(--ui-focus-halo));
78
78
  }
79
79
 
@@ -35,7 +35,7 @@
35
35
  padding: var(--ui-menu-item-padding-block, var(--_ui-default-menu-item-padding-block, var(--ui-space-2)))
36
36
  var(--ui-menu-item-padding-inline, var(--_ui-default-menu-item-padding-inline, var(--ui-space-3)));
37
37
  text-align: left;
38
- border-radius: var(--ui-menu-item-radius, var(--_ui-default-menu-item-radius, var(--ui-radius-md)));
38
+ border-radius: var(--ui-menu-item-radius, var(--_ui-default-menu-item-radius, var(--ui-selection-radius)));
39
39
  color: var(--ui-text-primary);
40
40
  font-size: var(--ui-menu-item-font-size, var(--_ui-default-menu-item-font-size, var(--ui-font-size-md)));
41
41
  font-weight: var(--ui-font-medium);
@@ -61,7 +61,7 @@
61
61
  box-sizing: border-box;
62
62
  inline-size: var(--_ui-default-menu-indicator-size, var(--ui-icon-size-sm));
63
63
  block-size: var(--_ui-default-menu-indicator-size, var(--ui-icon-size-sm));
64
- border: 1.5px solid var(--ui-control-border);
64
+ border: var(--ui-border-width) solid var(--ui-control-border);
65
65
  border-radius: var(--ui-radius-sm);
66
66
  color: var(--ui-surface);
67
67
  --_ui-default-icon-size: 0.75rem;
@@ -110,8 +110,8 @@
110
110
  }
111
111
 
112
112
  :scope:focus-visible {
113
- outline: 2px solid var(--ui-focus-ring);
114
- outline-offset: -2px;
113
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
114
+ outline-offset: calc(-1 * var(--ui-focus-width));
115
115
  }
116
116
 
117
117
  :scope[aria-disabled="true"] {
@@ -80,7 +80,7 @@
80
80
  max-inline-size: inherit;
81
81
  padding: var(--ui-space-1);
82
82
  background: var(--_ui-menu-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
83
- border: 1px solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-strong)));
83
+ border: var(--ui-border-width) solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-strong)));
84
84
  border-radius: var(--_ui-menu-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
85
85
  box-shadow: var(--_ui-menu-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
86
86
  max-block-size: inherit;
@@ -92,7 +92,7 @@
92
92
  block-size: 0;
93
93
  margin: var(--ui-space-1) 0;
94
94
  border: 0;
95
- border-block-start: 1px solid var(--ui-border-divider);
95
+ border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
96
96
  }
97
97
 
98
98
  :scope:not(:scope[data-ui-menu-state~="internalOpen"]):not(:scope[data-ui-menu-state~="inline"]) {
@@ -22,7 +22,7 @@
22
22
  background: var(--ui-border);
23
23
  box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1), inset 0 -1px rgb(255 255 255 / 0.22);
24
24
  /* Unseen until forced colours draw it, where the track's own colour is gone. */
25
- outline: 1px solid transparent;
25
+ outline: var(--ui-border-width) solid transparent;
26
26
  }
27
27
 
28
28
  :scope[data-ui-meter-state~="size=sm"] {
@@ -23,7 +23,7 @@
23
23
  belongs to. Label and description are one line each and end in an ellipsis, so every item in a
24
24
  navigation has the same height and the rail never grows sideways. */
25
25
  :scope {
26
- --_indicator-width: var(--ui-nav-item-indicator-width, 3px);
26
+ --_indicator-width: var(--ui-nav-item-indicator-width, var(--ui-accent-line-width));
27
27
  --_indicator-color: var(--ui-nav-item-indicator-color, var(--ui-accent));
28
28
  position: relative;
29
29
  box-sizing: border-box;
@@ -37,11 +37,11 @@
37
37
  padding-block: var(--ui-space-2);
38
38
  padding-inline: var(--ui-space-3);
39
39
  border: 0;
40
- border-radius: var(--ui-radius-md);
40
+ border-radius: var(--ui-selection-radius);
41
41
  background: transparent;
42
42
  color: var(--ui-text-secondary);
43
43
  font: inherit;
44
- font-weight: var(--ui-font-medium);
44
+ font-weight: var(--ui-font-normal);
45
45
  text-align: start;
46
46
  text-decoration: none;
47
47
  cursor: pointer;
@@ -57,32 +57,43 @@
57
57
  /* The ring is an outline, drawn inside the item: forced colors keep an outline where they drop a
58
58
  box shadow, and a scrolling rail cannot clip a ring that stays within the item. */
59
59
  :scope:focus-visible {
60
- outline: 2px solid var(--ui-focus-ring);
61
- outline-offset: -2px;
60
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
61
+ outline-offset: calc(-1 * var(--ui-focus-width));
62
62
  }
63
63
 
64
64
  :scope[aria-current] {
65
- background: var(--ui-nav-item-current-surface, var(--ui-accent-soft));
66
- color: var(--ui-accent-subtle-text, var(--ui-text-primary));
67
- font-weight: var(--ui-font-semibold);
65
+ background: var(--ui-nav-item-current-surface, var(--ui-selection-surface));
66
+ color: var(--ui-selection-text);
67
+ }
68
+
69
+ :scope[data-ui-nav-item-state~="variant=line"] {
70
+ border-radius: 0;
68
71
  }
69
72
 
70
- /* The bar on the start edge is a border, not a fill: forced colors replace backgrounds but keep a
73
+ /* A line treatment has straight corners and a continuous edge. Surface treatment has
74
+ shared rounded corners and no edge marker; never combine the two geometries.
75
+ The line is a border, not a fill: forced colors replace backgrounds but keep a
71
76
  border, so the current item stays marked in high contrast. Logical edges mirror it in a
72
77
  right-to-left page. */
73
78
  .indicator {
74
79
  position: absolute;
75
- inset-block: var(--ui-space-2);
80
+ inset-block: 0;
76
81
  inset-inline-start: 0;
77
82
  display: none;
78
83
  border-inline-start: var(--_indicator-width) solid var(--_indicator-color);
79
84
  }
80
85
 
81
- :scope[aria-current] .indicator {
86
+ :scope[data-ui-nav-item-state~="variant=line"][aria-current] .indicator {
82
87
  display: block;
83
88
  }
84
89
 
85
90
  @media (forced-colors: active) {
91
+ /* System colors may erase the selected fill. Trace the complete surface, without
92
+ creating an edge stripe; the stronger keyboard focus outline keeps precedence. */
93
+ :scope[data-ui-nav-item-state~="variant=surface"][aria-current]:not(:focus-visible) {
94
+ outline: var(--ui-border-width) solid Highlight;
95
+ outline-offset: calc(-1 * var(--ui-border-width));
96
+ }
86
97
  .indicator {
87
98
  border-inline-start-color: Highlight;
88
99
  }
@@ -125,6 +136,22 @@
125
136
  line-height: var(--ui-line-height-tight);
126
137
  }
127
138
 
139
+ :scope[data-ui-nav-item-state~="density=compact"] {
140
+ min-block-size: var(--ui-control-size-sm);
141
+ padding-block: var(--ui-space-1);
142
+ padding-inline: var(--ui-space-2);
143
+ }
144
+ :scope[data-ui-nav-item-state~="density=compact"] .leading,
145
+ :scope[data-ui-nav-item-state~="density=compact"] .label {
146
+ font-size: var(--ui-font-size-sm);
147
+ }
148
+
149
+ @media (pointer: coarse) {
150
+ :scope[data-ui-nav-item-state~="density=compact"] {
151
+ min-block-size: var(--ui-control-min-block-size);
152
+ }
153
+ }
154
+
128
155
  /* An unused region takes no space. */
129
156
  .leading:empty,
130
157
  .description:empty {
@@ -147,11 +174,18 @@
147
174
  /* The ring is an outline, drawn inside the item: forced colors keep an outline where they drop a
148
175
  box shadow, and a scrolling rail cannot clip a ring that stays within the item. */
149
176
 
150
- /* The bar on the start edge is a border, not a fill: forced colors replace backgrounds but keep a
177
+ /* A line treatment has straight corners and a continuous edge. Surface treatment has
178
+ shared rounded corners and no edge marker; never combine the two geometries.
179
+ The line is a border, not a fill: forced colors replace backgrounds but keep a
151
180
  border, so the current item stays marked in high contrast. Logical edges mirror it in a
152
181
  right-to-left page. */
153
182
 
154
183
  @media (forced-colors: active) {
184
+ /* System colors may erase the selected fill. Trace the complete surface, without
185
+ creating an edge stripe; the stronger keyboard focus outline keeps precedence. */
186
+ }
187
+
188
+ @media (pointer: coarse) {
155
189
  }
156
190
 
157
191
  /* An unused region takes no space. */
@@ -58,7 +58,7 @@
58
58
  overflow: auto;
59
59
  padding: var(--_ui-popover-padding, var(--ui-space-3));
60
60
  background: var(--_ui-popover-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
61
- border: 1px solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
61
+ border: var(--ui-border-width) solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
62
62
  border-radius: var(--_ui-popover-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
63
63
  box-shadow: var(--_ui-popover-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
64
64
  }
@@ -55,8 +55,8 @@
55
55
  }
56
56
 
57
57
  input:focus-visible {
58
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
59
- outline-offset: 2px;
58
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
59
+ outline-offset: var(--ui-focus-width);
60
60
  }
61
61
 
62
62
  :scope[data-ui-radio-state~="disabled"] {
@@ -45,8 +45,8 @@
45
45
  align-items: flex-start;
46
46
  gap: var(--ui-search-result-row-gap, var(--ui-space-3));
47
47
  background: var(--ui-search-result-row-surface, transparent);
48
- border: 1px solid var(--ui-search-result-row-border, transparent);
49
- border-radius: var(--ui-radius-md);
48
+ border: var(--ui-border-width) solid var(--ui-search-result-row-border, transparent);
49
+ border-radius: var(--ui-selection-radius);
50
50
  color: inherit;
51
51
  cursor: pointer;
52
52
  text-align: left;
@@ -62,6 +62,17 @@
62
62
  font-family: var(--ui-font-family-sans, sans-serif);
63
63
  }
64
64
 
65
+ /* Slot wrappers own their line boxes even when an app makes buttons inherit body typography. */
66
+ :scope[data-ui-search-result-row-state~="density=compact"] .title {
67
+ font-size: var(--ui-font-size-sm);
68
+ line-height: var(--ui-line-height);
69
+ }
70
+
71
+ :scope[data-ui-search-result-row-state~="density=compact"] .meta {
72
+ font-size: var(--ui-font-size-xs);
73
+ line-height: var(--ui-line-height);
74
+ }
75
+
65
76
  :scope:hover:enabled {
66
77
  background: var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%));
67
78
  }
@@ -69,13 +80,14 @@
69
80
  :scope[data-ui-search-result-row-state~="selected"] {
70
81
  background: var(
71
82
  --ui-search-result-row-selected-bg,
72
- var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
83
+ var(--ui-selection-surface)
73
84
  );
85
+ color: var(--ui-selection-text);
74
86
  }
75
87
 
76
88
  :scope:focus-visible {
77
- outline: 2px solid var(--ui-focus-ring);
78
- outline-offset: -2px;
89
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
90
+ outline-offset: calc(-1 * var(--ui-focus-width));
79
91
  }
80
92
 
81
93
  :scope:disabled {
@@ -113,6 +125,13 @@
113
125
  display: none;
114
126
  }
115
127
 
128
+ @media (forced-colors: active) {
129
+ :scope[data-ui-search-result-row-state~="selected"]:not(:focus-visible):not(:disabled) {
130
+ outline: var(--ui-border-width) solid Highlight;
131
+ outline-offset: calc(-1 * var(--ui-border-width));
132
+ }
133
+ }
134
+
116
135
  /* A component that sets its display still honours the hidden attribute on its root. */
117
136
  :scope[hidden] {
118
137
  display: none;
@@ -121,6 +140,8 @@
121
140
  @scope ([data-component~="ui-search-result-row"]) to ([data-component]) {
122
141
  /* This component's hooks style the element they are set on, and never a nested one. */
123
142
 
143
+ /* Slot wrappers own their line boxes even when an app makes buttons inherit body typography. */
144
+
124
145
  /* An unused region takes no space. */
125
146
 
126
147
  :where([data-slotted], [data-slotted] *):is([slot="title"]),
@@ -130,5 +151,8 @@
130
151
  margin: 0;
131
152
  }
132
153
 
154
+ @media (forced-colors: active) {
155
+ }
156
+
133
157
  /* A component that sets its display still honours the hidden attribute on its root. */
134
158
  }
@@ -97,7 +97,7 @@
97
97
  margin-inline: auto;
98
98
  overflow: hidden;
99
99
  background: var(--_ui-search-shell-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
100
- border: 1px solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
100
+ border: var(--ui-border-width) solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
101
101
  border-radius: var(--_ui-search-shell-radius, var(--ui-overlay-radius, var(--ui-radius-dialog)));
102
102
  box-shadow: var(--_ui-search-shell-shadow, var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl))));
103
103
  }
@@ -184,7 +184,7 @@
184
184
  inline-size: 100%;
185
185
  min-block-size: var(--ui-control-min-block-size);
186
186
  padding: var(--ui-space-2) var(--ui-space-3);
187
- border: 1px solid var(--ui-control-border);
187
+ border: var(--ui-border-width) solid var(--ui-control-border);
188
188
  border-radius: var(--ui-field-radius, var(--ui-radius-md));
189
189
  background: var(--ui-control-surface);
190
190
  color: var(--ui-text-primary);
@@ -194,8 +194,8 @@
194
194
 
195
195
  :where([data-slotted], [data-slotted] *):is(input[slot="search"]:focus-visible) {
196
196
  border-color: var(--_ui-search-shell-focus-color, var(--ui-control-focus));
197
- outline: 2px solid var(--ui-focus-ring);
198
- outline-offset: 2px;
197
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
198
+ outline-offset: var(--ui-focus-width);
199
199
  }
200
200
 
201
201
  /* Laid out like the dialog's action row: actions right-aligned, spaced as buttons, no fill. */
@@ -11,19 +11,19 @@
11
11
 
12
12
  :scope[data-ui-section-state~="variant=card"] {
13
13
  padding: var(--ui-space-5);
14
- border: 1px solid var(--ui-border-strong);
14
+ border: var(--ui-border-width) solid var(--ui-border-strong);
15
15
  border-radius: var(--ui-radius-lg);
16
16
  background: var(--ui-surface-raised);
17
17
  }
18
18
 
19
19
  :scope[data-ui-section-state~="variant=divided"] {
20
20
  padding-block-start: var(--ui-space-6);
21
- border-block-start: 1px solid var(--ui-border-divider);
21
+ border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
22
22
  }
23
23
 
24
24
  :scope[data-ui-section-state~="variant=card"][data-ui-section-state~="tone=danger"] {
25
25
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
26
- border-inline-start: 4px solid var(--ui-danger);
26
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
27
27
  background: var(--ui-danger-soft);
28
28
  }
29
29
 
@@ -50,7 +50,7 @@
50
50
  min-block-size: var(--ui-control-size-md);
51
51
  margin: 0;
52
52
  padding: var(--ui-space-2) var(--ui-space-3);
53
- border: 1px solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
53
+ border: var(--ui-border-width) solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
54
54
  border-radius: var(--ui-select-radius, var(--ui-field-radius, var(--ui-radius-md)));
55
55
  background-color: var(--ui-select-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
56
56
  color: var(--ui-text-primary);
@@ -98,7 +98,11 @@
98
98
  box-shadow: var(
99
99
  --ui-select-invalid-focus-shadow,
100
100
  var(--ui-control-inset),
101
- 0 0 0 3px color-mix(in srgb, var(--ui-select-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
101
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
102
+ in srgb,
103
+ var(--ui-select-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
104
+ transparent
105
+ )
102
106
  );
103
107
  }
104
108
 
@@ -12,13 +12,13 @@
12
12
  align-self: stretch;
13
13
  margin: 0;
14
14
  border: 0;
15
- border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
15
+ border-block-start: var(--ui-border-width) solid var(--ui-separator-color, var(--ui-border-divider));
16
16
  }
17
17
 
18
18
  :scope[aria-orientation="vertical"] {
19
19
  block-size: auto;
20
20
  border-block-start: 0;
21
- border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
21
+ border-inline-start: var(--ui-border-width) solid var(--ui-separator-color, var(--ui-border-divider));
22
22
  }
23
23
  }
24
24
  @scope ([data-component~="ui-separator"]) to ([data-component]) {
@@ -31,12 +31,12 @@
31
31
  max-inline-size: 100%;
32
32
  min-block-size: 0;
33
33
  background: var(--ui-sidebar-surface, var(--ui-surface-default));
34
- border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
34
+ border-inline-end: var(--ui-border-width) solid var(--ui-sidebar-border, var(--ui-border-divider));
35
35
  }
36
36
 
37
37
  :scope[data-ui-sidebar-state~="side=end"] {
38
38
  border-inline-end: 0;
39
- border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
39
+ border-inline-start: var(--ui-border-width) solid var(--ui-sidebar-border, var(--ui-border-divider));
40
40
  }
41
41
 
42
42
  /* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
@@ -111,7 +111,7 @@
111
111
  inset-inline-start: 50%;
112
112
  inline-size: 6px;
113
113
  block-size: 22px;
114
- border: 1px solid var(--ui-border-strong);
114
+ border: var(--ui-border-width) solid var(--ui-border-strong);
115
115
  border-radius: var(--ui-radius-round);
116
116
  background: var(--ui-surface-elevated);
117
117
  opacity: 0;
@@ -19,7 +19,7 @@
19
19
 
20
20
  :scope[data-ui-status-message-state~="layout=panel"] {
21
21
  padding: var(--ui-space-6);
22
- border: 1px dashed var(--ui-border-strong);
22
+ border: var(--ui-border-width) dashed var(--ui-border-strong);
23
23
  border-radius: var(--ui-radius-lg);
24
24
  }
25
25
 
@@ -58,7 +58,7 @@
58
58
  width: var(--_ui-switch-track-width, 2.5rem);
59
59
  height: var(--_ui-switch-track-height, 1.5rem);
60
60
  padding: 0;
61
- border: 1px solid var(--ui-control-border, var(--ui-border-strong));
61
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
62
62
  border-radius: var(--ui-radius-round);
63
63
  background-color: var(--ui-control-surface, var(--ui-surface-default));
64
64
  box-shadow: var(--ui-control-inset);
@@ -91,8 +91,8 @@
91
91
  }
92
92
 
93
93
  input:focus-visible {
94
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
95
- outline-offset: 2px;
94
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
95
+ outline-offset: var(--ui-focus-width);
96
96
  }
97
97
 
98
98
  :scope[data-ui-switch-state~="disabled"] {
@@ -41,8 +41,8 @@
41
41
  }
42
42
 
43
43
  :scope:focus-visible {
44
- outline: 2px solid var(--ui-focus-ring);
45
- outline-offset: -2px;
44
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
45
+ outline-offset: calc(-1 * var(--ui-focus-width));
46
46
  }
47
47
 
48
48
  :scope[data-ui-table-state~="density=compact"] {
@@ -92,7 +92,7 @@
92
92
  :where([data-slotted], [data-slotted] *):is(td) {
93
93
  block-size: var(--_row-size);
94
94
  padding: var(--_pad-block) var(--_pad-inline);
95
- border-block-end: 1px solid var(--ui-border-subtle);
95
+ border-block-end: var(--ui-border-width) solid var(--ui-border-subtle);
96
96
  text-align: start;
97
97
  vertical-align: middle;
98
98
  }