@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
@@ -1,5 +1,7 @@
1
1
  <template component="ui-search-result-row">
2
2
  <defs>
3
+ <prop name="density" type="keyword" values="comfortable, compact" default="comfortable"
4
+ >Compact keeps a title and location together in a 3.125rem row for small destination pickers; comfortable preserves the existing rich result spacing.</prop>
3
5
  <prop name="disabled" type="boolean" default="false"
4
6
  >Disables the row's button, so it cannot be chosen or focused, and gives it a flat muted treatment.</prop>
5
7
  <prop name="selected" type="boolean" default="false"
@@ -61,14 +63,23 @@
61
63
  align-items: flex-start;
62
64
  gap: var(--ui-search-result-row-gap, var(--ui-space-3));
63
65
  background: var(--ui-search-result-row-surface, transparent);
64
- border: 1px solid var(--ui-search-result-row-border, transparent);
65
- border-radius: var(--ui-radius-md);
66
+ border: var(--ui-border-width) solid var(--ui-search-result-row-border, transparent);
67
+ border-radius: var(--ui-selection-radius);
66
68
  color: inherit;
67
69
  cursor: pointer;
68
70
  text-align: left;
69
71
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease);
70
72
  }
71
73
 
74
+ :host-state([density="compact"]) {
75
+ min-block-size: var(--ui-search-result-row-min-height, 3.125rem);
76
+ padding-block: var(--ui-search-result-row-padding-block, var(--ui-space-1));
77
+ padding-inline: var(--ui-search-result-row-padding-inline, var(--ui-space-2));
78
+ gap: var(--ui-search-result-row-gap, var(--ui-space-2));
79
+ align-items: center;
80
+ font-family: var(--ui-font-family-sans, sans-serif);
81
+ }
82
+
72
83
  :host:hover:enabled {
73
84
  background: var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%));
74
85
  }
@@ -76,13 +87,14 @@
76
87
  :host-state([selected]) {
77
88
  background: var(
78
89
  --ui-search-result-row-selected-bg,
79
- var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
90
+ var(--ui-selection-surface)
80
91
  );
92
+ color: var(--ui-selection-text);
81
93
  }
82
94
 
83
95
  :host:focus-visible {
84
- outline: 2px solid var(--ui-focus-ring);
85
- outline-offset: -2px;
96
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
97
+ outline-offset: calc(-1 * var(--ui-focus-width));
86
98
  }
87
99
 
88
100
  :host:disabled {
@@ -127,6 +139,13 @@
127
139
  margin: 0;
128
140
  }
129
141
 
142
+ @media (forced-colors: active) {
143
+ :host-state([selected]):not(:focus-visible):not(:disabled) {
144
+ outline: var(--ui-border-width) solid Highlight;
145
+ outline-offset: calc(-1 * var(--ui-border-width));
146
+ }
147
+ }
148
+
130
149
  /* A component that sets its display still honours the hidden attribute on its root. */
131
150
  :host[hidden] {
132
151
  display: none;
@@ -122,7 +122,7 @@
122
122
  margin-inline: auto;
123
123
  overflow: hidden;
124
124
  background: var(--_ui-search-shell-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
125
- border: 1px solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
125
+ border: var(--ui-border-width) solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
126
126
  border-radius: var(--_ui-search-shell-radius, var(--ui-overlay-radius, var(--ui-radius-dialog)));
127
127
  box-shadow: var(--_ui-search-shell-shadow, var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl))));
128
128
  }
@@ -136,7 +136,7 @@
136
136
  inline-size: 100%;
137
137
  min-block-size: var(--ui-control-min-block-size);
138
138
  padding: var(--ui-space-2) var(--ui-space-3);
139
- border: 1px solid var(--ui-control-border);
139
+ border: var(--ui-border-width) solid var(--ui-control-border);
140
140
  border-radius: var(--ui-field-radius, var(--ui-radius-md));
141
141
  background: var(--ui-control-surface);
142
142
  color: var(--ui-text-primary);
@@ -146,8 +146,8 @@
146
146
 
147
147
  :slotted(input[slot="search"]:focus-visible) {
148
148
  border-color: var(--_ui-search-shell-focus-color, var(--ui-control-focus));
149
- outline: 2px solid var(--ui-focus-ring);
150
- outline-offset: 2px;
149
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
150
+ outline-offset: var(--ui-focus-width);
151
151
  }
152
152
 
153
153
  .status,
@@ -30,19 +30,19 @@
30
30
 
31
31
  :host-state([variant="card"]) {
32
32
  padding: var(--ui-space-5);
33
- border: 1px solid var(--ui-border-strong);
33
+ border: var(--ui-border-width) solid var(--ui-border-strong);
34
34
  border-radius: var(--ui-radius-lg);
35
35
  background: var(--ui-surface-raised);
36
36
  }
37
37
 
38
38
  :host-state([variant="divided"]) {
39
39
  padding-block-start: var(--ui-space-6);
40
- border-block-start: 1px solid var(--ui-border-divider);
40
+ border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
41
41
  }
42
42
 
43
43
  :host-state([variant="card"][tone="danger"]) {
44
44
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
45
- border-inline-start: 4px solid var(--ui-danger);
45
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
46
46
  background: var(--ui-danger-soft);
47
47
  }
48
48
 
@@ -64,7 +64,7 @@
64
64
  min-block-size: var(--ui-control-size-md);
65
65
  margin: 0;
66
66
  padding: var(--ui-space-2) var(--ui-space-3);
67
- border: 1px solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
67
+ border: var(--ui-border-width) solid var(--ui-select-border, var(--ui-control-border, var(--ui-border-strong)));
68
68
  border-radius: var(--ui-select-radius, var(--ui-field-radius, var(--ui-radius-md)));
69
69
  background-color: var(--ui-select-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
70
70
  color: var(--ui-text-primary);
@@ -112,7 +112,11 @@
112
112
  box-shadow: var(
113
113
  --ui-select-invalid-focus-shadow,
114
114
  var(--ui-control-inset),
115
- 0 0 0 3px color-mix(in srgb, var(--ui-select-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
115
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
116
+ in srgb,
117
+ var(--ui-select-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
118
+ transparent
119
+ )
116
120
  );
117
121
  }
118
122
 
@@ -17,13 +17,13 @@
17
17
  align-self: stretch;
18
18
  margin: 0;
19
19
  border: 0;
20
- border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
20
+ border-block-start: var(--ui-border-width) solid var(--ui-separator-color, var(--ui-border-divider));
21
21
  }
22
22
 
23
23
  :host[aria-orientation="vertical"] {
24
24
  block-size: auto;
25
25
  border-block-start: 0;
26
- border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
26
+ border-inline-start: var(--ui-border-width) solid var(--ui-separator-color, var(--ui-border-divider));
27
27
  }
28
28
  </style>
29
29
  </template>
@@ -69,12 +69,12 @@
69
69
  max-inline-size: 100%;
70
70
  min-block-size: 0;
71
71
  background: var(--ui-sidebar-surface, var(--ui-surface-default));
72
- border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
72
+ border-inline-end: var(--ui-border-width) solid var(--ui-sidebar-border, var(--ui-border-divider));
73
73
  }
74
74
 
75
75
  :host-state([side="end"]) {
76
76
  border-inline-end: 0;
77
- border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
77
+ border-inline-start: var(--ui-border-width) solid var(--ui-sidebar-border, var(--ui-border-divider));
78
78
  }
79
79
 
80
80
  /* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
@@ -149,7 +149,7 @@
149
149
  inset-inline-start: 50%;
150
150
  inline-size: 6px;
151
151
  block-size: 22px;
152
- border: 1px solid var(--ui-border-strong);
152
+ border: var(--ui-border-width) solid var(--ui-border-strong);
153
153
  border-radius: var(--ui-radius-round);
154
154
  background: var(--ui-surface-elevated);
155
155
  opacity: 0;
@@ -1,8 +1,8 @@
1
1
  <template component="ui-stack">
2
2
  <defs>
3
- <prop name="gap" type="keyword" values="xs, s, m, l, xl"
4
- >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,
5
- set on the stack itself, overrides it; set on an ancestor, it does nothing.</prop>
3
+ <prop name="gap" type="keyword" values="none, xs, s, m, l, xl"
4
+ >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
5
+ custom property, set on the stack itself, overrides it; set on an ancestor, it does nothing.</prop>
6
6
  <prop name="align" type="keyword" values="start, center, end, stretch"
7
7
  >How items sit across the stack: stretch (the default) makes each fill the stack's width; start, center, and end keep each at its own width, against the
8
8
  start, in the middle, or against the end.</prop>
@@ -29,6 +29,9 @@
29
29
  margin: 0;
30
30
  }
31
31
 
32
+ :host-state([gap="none"]) {
33
+ --_layout-gap: 0px;
34
+ }
32
35
  :host-state([gap="xs"]) {
33
36
  --_layout-gap: var(--ui-space-2);
34
37
  }
@@ -36,7 +36,7 @@
36
36
 
37
37
  :host-state([layout="panel"]) {
38
38
  padding: var(--ui-space-6);
39
- border: 1px dashed var(--ui-border-strong);
39
+ border: var(--ui-border-width) dashed var(--ui-border-strong);
40
40
  border-radius: var(--ui-radius-lg);
41
41
  }
42
42
 
@@ -95,7 +95,7 @@
95
95
  width: var(--_ui-switch-track-width, 2.5rem);
96
96
  height: var(--_ui-switch-track-height, 1.5rem);
97
97
  padding: 0;
98
- border: 1px solid var(--ui-control-border, var(--ui-border-strong));
98
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
99
99
  border-radius: var(--ui-radius-round);
100
100
  background-color: var(--ui-control-surface, var(--ui-surface-default));
101
101
  box-shadow: var(--ui-control-inset);
@@ -128,8 +128,8 @@
128
128
  }
129
129
 
130
130
  input:focus-visible {
131
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
132
- outline-offset: 2px;
131
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
132
+ outline-offset: var(--ui-focus-width);
133
133
  }
134
134
 
135
135
  :host-state([disabled]) {
@@ -51,8 +51,8 @@
51
51
  }
52
52
 
53
53
  :host:focus-visible {
54
- outline: 2px solid var(--ui-focus-ring);
55
- outline-offset: -2px;
54
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
55
+ outline-offset: calc(-1 * var(--ui-focus-width));
56
56
  }
57
57
 
58
58
  :host-state([density="compact"]) {
@@ -85,7 +85,7 @@
85
85
  :slotted(td) {
86
86
  block-size: var(--_row-size);
87
87
  padding: var(--_pad-block) var(--_pad-inline);
88
- border-block-end: 1px solid var(--ui-border-subtle);
88
+ border-block-end: var(--ui-border-width) solid var(--ui-border-subtle);
89
89
  text-align: start;
90
90
  vertical-align: middle;
91
91
  }
@@ -94,16 +94,16 @@
94
94
  overflow-y: hidden;
95
95
  overscroll-behavior: contain;
96
96
  scrollbar-width: thin;
97
- border-block-end: 1px solid var(--ui-border-divider);
97
+ border-block-end: var(--ui-border-width) solid var(--ui-border-divider);
98
98
  }
99
99
 
100
100
  .list button,
101
101
  .list > :slotted(button[slot="tab"]) {
102
102
  min-block-size: var(--_ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
103
- margin: 0 0 -1px;
103
+ margin: 0 0 calc(-1 * var(--ui-border-width));
104
104
  padding: var(--_ui-tabs-tab-padding-block, var(--_tab-padding-block)) var(--_ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
105
105
  border: 0;
106
- border-block-end: 2px solid transparent;
106
+ border-block-end: var(--ui-accent-line-width) solid transparent;
107
107
  background: transparent;
108
108
  color: var(--ui-text-secondary);
109
109
  font: inherit;
@@ -153,7 +153,7 @@
153
153
  .list > :slotted(button[slot="tab"]:focus-visible) {
154
154
  position: relative;
155
155
  outline: none;
156
- box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
156
+ box-shadow: inset 0 0 0 var(--ui-focus-width) color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
157
157
  border-radius: var(--ui-radius-sm);
158
158
  }
159
159
 
@@ -173,14 +173,14 @@
173
173
  grid-auto-flow: row;
174
174
  grid-auto-columns: auto;
175
175
  border-block-end: 0;
176
- border-inline-end: 1px solid var(--ui-border-divider);
176
+ border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
177
177
  }
178
178
 
179
179
  :host-state([orientation="vertical"]) .list button,
180
180
  :host-state([orientation="vertical"]) .list > :slotted(button[slot="tab"]) {
181
- margin: 0 -1px 0 0;
181
+ margin: 0 calc(-1 * var(--ui-border-width)) 0 0;
182
182
  border-block-end: 0;
183
- border-inline-end: 2px solid transparent;
183
+ border-inline-end: var(--ui-accent-line-width) solid transparent;
184
184
  text-align: start;
185
185
  }
186
186
 
@@ -1,5 +1,9 @@
1
1
  <template component="ui-text">
2
2
  <defs>
3
+ <prop name="font" type="keyword" values="inherit, sans" default="inherit"
4
+ >Use sans for UI text rendered outside its original font context; inherit preserves the surrounding typeface.</prop>
5
+ <prop name="wrap" type="keyword" values="normal, anywhere" default="normal"
6
+ >Use anywhere for unbroken values such as long destinations; ordinary prose keeps its normal wrapping.</prop>
3
7
  <prop name="size" type="keyword" values="inherit, xs, sm, md, lg" default="inherit"
4
8
  >The step on the type scale. inherit (the default) keeps the size of the text around it; xs is for fine print, sm for supporting text such as help and
5
9
  metadata, md is body text, and lg is a lead paragraph.</prop>
@@ -129,6 +133,14 @@
129
133
  text-align: center;
130
134
  }
131
135
 
136
+ :host-state([font="sans"]) {
137
+ font-family: var(--ui-font-family-sans, sans-serif);
138
+ }
139
+
140
+ :host-state([wrap="anywhere"]) {
141
+ overflow-wrap: anywhere;
142
+ }
143
+
132
144
  /* A component that sets its display still honours the hidden attribute on its root. */
133
145
  :host[hidden] {
134
146
  display: none;
@@ -58,7 +58,7 @@
58
58
  padding: var(--ui-space-2) var(--ui-space-3);
59
59
  appearance: none;
60
60
  resize: vertical;
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-textarea-radius, var(--ui-field-radius, var(--ui-radius-md)));
63
63
  background: var(--ui-control-surface, var(--ui-surface-elevated));
64
64
  color: var(--ui-text-primary);
@@ -102,7 +102,11 @@
102
102
  box-shadow: var(
103
103
  --ui-textarea-invalid-focus-shadow,
104
104
  var(--ui-control-inset),
105
- 0 0 0 3px color-mix(in srgb, var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
105
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
106
+ in srgb,
107
+ var(--ui-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
108
+ transparent
109
+ )
106
110
  );
107
111
  }
108
112
 
@@ -52,8 +52,8 @@
52
52
  inline-size: 100%;
53
53
  margin: 0;
54
54
  padding: var(--ui-space-3) var(--ui-space-4);
55
- border: 1px solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-strong)));
56
- border-inline-start: 3px solid var(--ui-toast-accent, var(--_ui-toast-accent));
55
+ border: var(--ui-border-width) solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-strong)));
56
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-toast-accent, var(--_ui-toast-accent));
57
57
  border-radius: var(--ui-toast-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
58
58
  background: var(--ui-toast-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
59
59
  color: var(--ui-text-primary);
@@ -140,7 +140,7 @@
140
140
  grid-template-columns: 1fr auto;
141
141
  gap: var(--ui-space-2);
142
142
  align-items: start;
143
- border: 1px solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-strong)));
143
+ border: var(--ui-border-width) solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-strong)));
144
144
  border-radius: var(--_ui-toast-region-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
145
145
  padding: var(--ui-space-3) var(--ui-space-4);
146
146
  background: var(--_ui-toast-region-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
@@ -150,16 +150,16 @@
150
150
  }
151
151
 
152
152
  .toast[data-tone="info"] {
153
- border-inline-start: 3px solid var(--ui-info-solid);
153
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-info-solid);
154
154
  }
155
155
  .toast[data-tone="success"] {
156
- border-inline-start: 3px solid var(--ui-success-solid);
156
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-success-solid);
157
157
  }
158
158
  .toast[data-tone="warning"] {
159
- border-inline-start: 3px solid var(--ui-warning-solid);
159
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-warning-solid);
160
160
  }
161
161
  .toast[data-tone="danger"] {
162
- border-inline-start: 3px solid var(--ui-danger-solid);
162
+ border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger-solid);
163
163
  }
164
164
 
165
165
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
@@ -117,7 +117,7 @@
117
117
  position: relative;
118
118
  box-sizing: border-box;
119
119
  max-inline-size: var(--_ui-tooltip-max-inline-size, 18rem);
120
- border: 1px solid var(--_tooltip-line);
120
+ border: var(--ui-border-width) solid var(--_tooltip-line);
121
121
  border-radius: var(--_ui-tooltip-radius, var(--ui-overlay-radius, var(--ui-radius-md)));
122
122
  background: var(--_ui-tooltip-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
123
123
  color: var(--_ui-tooltip-text, var(--ui-text-primary));
@@ -165,27 +165,27 @@
165
165
  position: absolute;
166
166
  z-index: 1;
167
167
  inset-inline-start: var(--ui-space-3);
168
- inset-block-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
168
+ inset-block-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - var(--ui-border-width) / 2);
169
169
  inline-size: var(--_ui-tooltip-arrow-size, 0.625rem);
170
170
  block-size: var(--_ui-tooltip-arrow-size, 0.625rem);
171
171
  box-sizing: border-box;
172
172
  background: inherit;
173
173
  border: 0 solid var(--_tooltip-line);
174
- border-inline-end-width: 1px;
175
- border-block-end-width: 1px;
176
- border-end-end-radius: 1px;
174
+ border-inline-end-width: var(--ui-border-width);
175
+ border-block-end-width: var(--ui-border-width);
176
+ border-end-end-radius: var(--ui-border-width);
177
177
  transform: rotate(45deg) scaleX(1.25) scaleY(0.85);
178
178
  }
179
179
 
180
180
  :host[data-ui-actual-placement="bottom"] .surface::after {
181
- inset-block-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
181
+ inset-block-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - var(--ui-border-width) / 2);
182
182
  inset-block-end: auto;
183
183
  border-inline-end-width: 0;
184
184
  border-block-end-width: 0;
185
- border-inline-start-width: 1px;
186
- border-block-start-width: 1px;
185
+ border-inline-start-width: var(--ui-border-width);
186
+ border-block-start-width: var(--ui-border-width);
187
187
  border-end-end-radius: 0;
188
- border-start-start-radius: 1px;
188
+ border-start-start-radius: var(--ui-border-width);
189
189
  }
190
190
 
191
191
  :host[data-ui-actual-align="center"] .surface::after {
@@ -206,16 +206,16 @@
206
206
 
207
207
  :host[data-ui-actual-placement="left"] .surface::after {
208
208
  inset-inline-start: auto;
209
- inset-inline-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
210
- border-inline-end-width: 1px;
211
- border-block-start-width: 1px;
209
+ inset-inline-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - var(--ui-border-width) / 2);
210
+ border-inline-end-width: var(--ui-border-width);
211
+ border-block-start-width: var(--ui-border-width);
212
212
  }
213
213
 
214
214
  :host[data-ui-actual-placement="right"] .surface::after {
215
- inset-inline-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
215
+ inset-inline-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - var(--ui-border-width) / 2);
216
216
  inset-inline-end: auto;
217
- border-inline-start-width: 1px;
218
- border-block-end-width: 1px;
217
+ border-inline-start-width: var(--ui-border-width);
218
+ border-block-end-width: var(--ui-border-width);
219
219
  }
220
220
 
221
221
  :host[data-ui-actual-placement="left"][data-ui-actual-align="start"] .surface::after,
@@ -51,7 +51,7 @@
51
51
  padding-inline-start: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-left));
52
52
  padding-inline-end: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-right));
53
53
  background: var(--ui-top-bar-surface, var(--ui-surface-elevated));
54
- border-block-end: 1px solid var(--ui-top-bar-border, var(--ui-border-divider));
54
+ border-block-end: var(--ui-border-width) solid var(--ui-top-bar-border, var(--ui-border-divider));
55
55
  }
56
56
 
57
57
  .leading,
@@ -157,7 +157,7 @@
157
157
  min-block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
158
158
  min-inline-size: 0;
159
159
  font-size: var(--_ui-tree-item-font-size, var(--ui-font-size-sm));
160
- border-radius: var(--ui-radius-md);
160
+ border-radius: var(--ui-selection-radius);
161
161
  color: var(--ui-text-secondary);
162
162
  transition:
163
163
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
@@ -168,12 +168,20 @@
168
168
  }
169
169
 
170
170
  .row:hover,
171
- :host-state([selected]) .row,
172
171
  .row:focus-within {
173
172
  color: var(--ui-text-primary);
174
173
  background: var(--ui-surface-muted);
175
174
  }
176
175
 
176
+ /* Selection is the same surface recipe as destination and choice rows. */
177
+ :host-state([selected]) > .row {
178
+ color: var(--ui-selection-text);
179
+ background: var(--ui-selection-surface);
180
+ }
181
+ :host-state([selected]):not([aria-disabled="true"]) > .row > .leading {
182
+ color: var(--ui-selection-text);
183
+ }
184
+
177
185
  :host-state([disabled]) .row {
178
186
  color: var(--ui-disabled-text);
179
187
  background: var(--ui-disabled-surface);
@@ -188,13 +196,13 @@
188
196
  }
189
197
 
190
198
  :host:focus-visible .row {
191
- box-shadow: 0 0 0 2px var(--ui-focus-ring);
199
+ box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
192
200
  }
193
201
 
194
202
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
195
203
  :host[data-drop-position="inside"] > .row {
196
204
  background: var(--ui-accent-subtle);
197
- box-shadow: inset 0 0 0 1px var(--_ui-tree-drop-color, var(--ui-accent-solid));
205
+ box-shadow: inset 0 0 0 var(--ui-accent-line-width) var(--_ui-tree-drop-color, var(--ui-accent-solid));
198
206
  }
199
207
 
200
208
  .disclosure,
@@ -517,7 +525,7 @@
517
525
  z-index: 3;
518
526
  inset-inline: 1px;
519
527
  display: none;
520
- block-size: 2px;
528
+ block-size: var(--ui-accent-line-width);
521
529
  border-radius: var(--ui-radius-round);
522
530
  background: var(--_ui-tree-drop-color, var(--ui-accent-solid));
523
531
  pointer-events: none;
@@ -530,7 +538,7 @@
530
538
  inset-block-start: 50%;
531
539
  inline-size: 7px;
532
540
  block-size: 7px;
533
- border: 2px solid var(--_ui-tree-drop-color, var(--ui-accent-solid));
541
+ border: var(--ui-accent-line-width) solid var(--_ui-tree-drop-color, var(--ui-accent-solid));
534
542
  border-radius: var(--ui-radius-round);
535
543
  background: var(--ui-surface-elevated);
536
544
  transform: translateY(-50%);
@@ -545,12 +553,12 @@
545
553
 
546
554
  :host[data-drop-position="before"] > .row > .row-drop-indicator {
547
555
  display: block;
548
- inset-block-start: -1px;
556
+ inset-block-start: calc(-0.5 * var(--ui-accent-line-width));
549
557
  }
550
558
 
551
559
  :host[data-drop-position="after"] > .subtree-drop-indicator {
552
560
  display: block;
553
- inset-block-end: -1px;
561
+ inset-block-end: calc(-0.5 * var(--ui-accent-line-width));
554
562
  }
555
563
 
556
564
  .children[hidden] {
@@ -612,6 +620,17 @@
612
620
  }
613
621
  }
614
622
 
623
+ @media (forced-colors: active) {
624
+ :host:focus-visible > .row {
625
+ outline: var(--ui-focus-width) solid Highlight;
626
+ outline-offset: calc(-1 * var(--ui-focus-width));
627
+ }
628
+ :host-state([selected]):not(:focus-visible):not([aria-disabled="true"]) > .row {
629
+ outline: var(--ui-border-width) solid Highlight;
630
+ outline-offset: calc(-1 * var(--ui-border-width));
631
+ }
632
+ }
633
+
615
634
  /* A component that sets its display still honours the hidden attribute on its root. */
616
635
  :host[hidden] {
617
636
  display: none;