@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
@@ -154,8 +154,8 @@
154
154
  gap: var(--ui-space-1);
155
155
  padding: var(--ui-space-1);
156
156
  background: color-mix(in srgb, var(--ui-surface) 94%, transparent);
157
- border: 1px solid var(--ui-border-strong);
158
- border-radius: calc(var(--ui-radius-md) + 2px);
157
+ border: var(--ui-border-width) solid var(--ui-border-strong);
158
+ border-radius: calc(var(--ui-radius-md) + 2 * var(--ui-border-width));
159
159
  box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
160
160
  backdrop-filter: blur(10px);
161
161
  }
@@ -245,7 +245,7 @@
245
245
  max-width: min(17rem, calc(100vw - 24px));
246
246
  padding: var(--ui-space-1);
247
247
  background: var(--ui-surface);
248
- border: 1px solid var(--ui-border-strong);
248
+ border: var(--ui-border-width) solid var(--ui-border-strong);
249
249
  border-radius: var(--ui-radius-md);
250
250
  box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
251
251
  display: flex;
@@ -260,7 +260,7 @@
260
260
  .menu-section + .menu-section {
261
261
  margin-top: var(--ui-space-1);
262
262
  padding-top: var(--ui-space-1);
263
- border-top: 1px solid var(--ui-border-divider);
263
+ border-top: var(--ui-border-width) solid var(--ui-border-divider);
264
264
  }
265
265
 
266
266
  .menu-heading {
@@ -294,7 +294,7 @@
294
294
  width: 14px;
295
295
  height: 14px;
296
296
  flex: 0 0 14px;
297
- border: 1px solid color-mix(in srgb, var(--ui-border) 80%, #000);
297
+ border: var(--ui-border-width) solid color-mix(in srgb, var(--ui-border) 80%, #000);
298
298
  border-radius: var(--ui-radius-round);
299
299
  background: var(--_swatch);
300
300
  }
@@ -13,7 +13,7 @@
13
13
  padding: var(--ui-editor-toolbar-padding-block, 6px) var(--ui-editor-toolbar-padding-inline, 12px);
14
14
  min-height: var(--ui-editor-toolbar-min-height, 48px);
15
15
  background: var(--ui-editor-toolbar-surface, var(--ui-surface));
16
- border-bottom: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
16
+ border-bottom: var(--ui-border-width) solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
17
17
  }
18
18
 
19
19
  /* One row, always. When the controls outgrow the space, the row scrolls sideways rather than
@@ -80,7 +80,7 @@
80
80
  min-height: auto;
81
81
  padding: var(--ui-editor-toolbar-floating-padding, 4px);
82
82
  background: color-mix(in srgb, var(--ui-editor-toolbar-surface, var(--ui-surface)) 96%, transparent);
83
- border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
83
+ border: var(--ui-border-width) solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
84
84
  border-radius: var(--ui-editor-toolbar-floating-radius, var(--ui-radius-lg));
85
85
  box-shadow: var(--ui-editor-toolbar-floating-shadow, var(--ui-shadow-lg, 0 10px 24px rgb(0 0 0 / 0.12)));
86
86
  backdrop-filter: blur(10px);
@@ -94,7 +94,7 @@
94
94
  left: 0;
95
95
  right: 0;
96
96
  min-height: var(--ui-editor-toolbar-mobile-min-height, 56px);
97
- border-top: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
97
+ border-top: var(--ui-border-width) solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
98
98
  border-bottom: none;
99
99
  box-shadow: var(--ui-editor-toolbar-mobile-shadow, 0 -2px 8px rgb(0 0 0 / 0.06));
100
100
  }
@@ -103,7 +103,7 @@
103
103
  position: relative;
104
104
  inset: auto;
105
105
  min-height: auto;
106
- border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
106
+ border: var(--ui-border-width) solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
107
107
  border-radius: var(--ui-editor-toolbar-floating-radius, var(--ui-radius-lg));
108
108
  box-shadow: var(--ui-editor-toolbar-floating-shadow, var(--ui-shadow-lg, 0 10px 24px rgb(0 0 0 / 0.12)));
109
109
  }
@@ -64,8 +64,8 @@
64
64
  }
65
65
 
66
66
  :host:focus-visible {
67
- outline: 2px solid var(--ui-focus-ring);
68
- outline-offset: 2px;
67
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
68
+ outline-offset: var(--ui-focus-width);
69
69
  }
70
70
 
71
71
  :host:disabled {
@@ -24,9 +24,11 @@
24
24
  'circle-x': [{ tag: 'circle', cx: '12', cy: '12', r: '10' }, { tag: 'path', d: 'm15 9-6 6' }, { tag: 'path', d: 'm9 9 6 6' }],
25
25
  'code-xml': [{ tag: 'path', d: 'm18 16 4-4-4-4' }, { tag: 'path', d: 'm6 8-4 4 4 4' }, { tag: 'path', d: 'm14.5 4-5 16' }],
26
26
  'columns': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2' }, { tag: 'path', d: 'M9 3v18' }, { tag: 'path', d: 'M15 3v18' }],
27
+ 'compass': [{ tag: 'path', d: 'm16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z' }, { tag: 'circle', cx: '12', cy: '12', r: '10' }],
27
28
  'credit-card': [{ tag: 'rect', width: '20', height: '14', x: '2', y: '5', rx: '2' }, { tag: 'line', x1: '2', x2: '22', y1: '10', y2: '10' }],
28
29
  'ellipsis': [{ tag: 'circle', cx: '12', cy: '12', r: '1' }, { tag: 'circle', cx: '19', cy: '12', r: '1' }, { tag: 'circle', cx: '5', cy: '12', r: '1' }],
29
30
  'eraser': [{ tag: 'path', d: 'M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21' }, { tag: 'path', d: 'm5.082 11.09 8.828 8.828' }],
31
+ 'external-link': [{ tag: 'path', d: 'M15 3h6v6' }, { tag: 'path', d: 'M10 14 21 3' }, { tag: 'path', d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' }],
30
32
  'file-text': [{ tag: 'path', d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z' }, { tag: 'path', d: 'M14 2v5a1 1 0 0 0 1 1h5' }, { tag: 'path', d: 'M10 9H8' }, { tag: 'path', d: 'M16 13H8' }, { tag: 'path', d: 'M16 17H8' }],
31
33
  'folder': [{ tag: 'path', d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z' }],
32
34
  'grip-horizontal': [{ tag: 'circle', cx: '12', cy: '9', r: '1' }, { tag: 'circle', cx: '19', cy: '9', r: '1' }, { tag: 'circle', cx: '5', cy: '9', r: '1' }, { tag: 'circle', cx: '12', cy: '15', r: '1' }, { tag: 'circle', cx: '19', cy: '15', r: '1' }, { tag: 'circle', cx: '5', cy: '15', r: '1' }],
@@ -36,6 +38,7 @@
36
38
  'heading-3': [{ tag: 'path', d: 'M4 12h8' }, { tag: 'path', d: 'M4 18V6' }, { tag: 'path', d: 'M12 18V6' }, { tag: 'path', d: 'M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2' }, { tag: 'path', d: 'M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2' }],
37
39
  'help': [{ tag: 'circle', cx: '12', cy: '12', r: '10' }, { tag: 'path', d: 'M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3' }, { tag: 'path', d: 'M12 17h.01' }],
38
40
  'highlighter': [{ tag: 'path', d: 'm9 11-6 6v3h9l3-3' }, { tag: 'path', d: 'm22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4' }],
41
+ 'history': [{ tag: 'path', d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8' }, { tag: 'path', d: 'M3 3v5h5' }, { tag: 'path', d: 'M12 7v5l4 2' }],
39
42
  'image': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2', ry: '2' }, { tag: 'circle', cx: '9', cy: '9', r: '2' }, { tag: 'path', d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21' }],
40
43
  'info': [{ tag: 'circle', cx: '12', cy: '12', r: '10' }, { tag: 'path', d: 'M12 16v-4' }, { tag: 'path', d: 'M12 8h.01' }],
41
44
  'italic': [{ tag: 'line', x1: '19', x2: '10', y1: '4', y2: '4' }, { tag: 'line', x1: '14', x2: '5', y1: '20', y2: '20' }, { tag: 'line', x1: '15', x2: '9', y1: '4', y2: '20' }],
@@ -53,12 +56,14 @@
53
56
  'panel-left': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2' }, { tag: 'path', d: 'M9 3v18' }],
54
57
  'panel-right': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2' }, { tag: 'path', d: 'M15 3v18' }],
55
58
  'panel-top': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2' }, { tag: 'path', d: 'M3 9h18' }],
59
+ 'pencil': [{ tag: 'path', d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z' }, { tag: 'path', d: 'm15 5 4 4' }],
56
60
  'pilcrow': [{ tag: 'path', d: 'M13 4v16' }, { tag: 'path', d: 'M17 4v16' }, { tag: 'path', d: 'M19 4H9.5a4.5 4.5 0 0 0 0 9H13' }],
57
61
  'plus': [{ tag: 'path', d: 'M5 12h14' }, { tag: 'path', d: 'M12 5v14' }],
58
62
  'quote': [{ tag: 'path', d: 'M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z' }, { tag: 'path', d: 'M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z' }],
59
63
  'receipt': [{ tag: 'path', d: 'M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z' }, { tag: 'path', d: 'M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8' }, { tag: 'path', d: 'M12 17.5v-11' }],
60
64
  'redo': [{ tag: 'path', d: 'm15 14 5-5-5-5' }, { tag: 'path', d: 'M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13' }],
61
65
  'rows': [{ tag: 'rect', width: '18', height: '18', x: '3', y: '3', rx: '2' }, { tag: 'path', d: 'M21 9H3' }, { tag: 'path', d: 'M21 15H3' }],
66
+ 'search': [{ tag: 'path', d: 'm21 21-4.34-4.34' }, { tag: 'circle', cx: '11', cy: '11', r: '8' }],
62
67
  'settings': [{ tag: 'path', d: 'M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915' }, { tag: 'circle', cx: '12', cy: '12', r: '3' }],
63
68
  'split': [{ tag: 'path', d: 'M16 3h5v5' }, { tag: 'path', d: 'M8 3H3v5' }, { tag: 'path', d: 'M12 22v-8.3a4 4 0 0 0-1.172-2.872L3 3' }, { tag: 'path', d: 'm15 9 6-6' }],
64
69
  'strikethrough': [{ tag: 'path', d: 'M16 4H9a3 3 0 0 0-2.83 4' }, { tag: 'path', d: 'M14 12a4 4 0 0 1 0 8H6' }, { tag: 'line', x1: '4', x2: '20', y1: '12', y2: '12' }],
@@ -69,6 +74,7 @@
69
74
  'truck': [{ tag: 'path', d: 'M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2' }, { tag: 'path', d: 'M15 18H9' }, { tag: 'path', d: 'M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14' }, { tag: 'circle', cx: '17', cy: '18', r: '2' }, { tag: 'circle', cx: '7', cy: '18', r: '2' }],
70
75
  'underline': [{ tag: 'path', d: 'M6 4v6a6 6 0 0 0 12 0V4' }, { tag: 'line', x1: '4', x2: '20', y1: '20', y2: '20' }],
71
76
  'undo': [{ tag: 'path', d: 'M9 14 4 9l5-5' }, { tag: 'path', d: 'M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11' }],
77
+ 'unlink': [{ tag: 'path', d: 'm18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71' }, { tag: 'path', d: 'm5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71' }, { tag: 'line', x1: '8', x2: '8', y1: '2', y2: '5' }, { tag: 'line', x1: '2', x2: '5', y1: '8', y2: '8' }, { tag: 'line', x1: '16', x2: '16', y1: '19', y2: '22' }, { tag: 'line', x1: '19', x2: '22', y1: '16', y2: '16' }],
72
78
  'user-round': [{ tag: 'circle', cx: '12', cy: '8', r: '5' }, { tag: 'path', d: 'M20 21a8 8 0 0 0-16 0' }],
73
79
  'users': [{ tag: 'path', d: 'M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2' }, { tag: 'path', d: 'M16 3.128a4 4 0 0 1 0 7.744' }, { tag: 'path', d: 'M22 21v-2a4 4 0 0 0-3-3.87' }, { tag: 'circle', cx: '9', cy: '7', r: '4' }],
74
80
  'x': [{ tag: 'path', d: 'M18 6 6 18' }, { tag: 'path', d: 'm6 6 12 12' }],
@@ -177,7 +177,7 @@
177
177
  min-block-size: var(--ui-icon-button-size, var(--_size));
178
178
  padding: 0;
179
179
  margin: 0;
180
- border: 1px solid transparent;
180
+ border: var(--ui-border-width) solid transparent;
181
181
  border-radius: var(--ui-icon-button-radius, var(--ui-action-radius, var(--ui-radius-md)));
182
182
  background-color: var(--ui-icon-button-surface, transparent);
183
183
  color: inherit;
@@ -102,7 +102,8 @@
102
102
  margin: 0;
103
103
  padding: var(--ui-space-2) var(--ui-space-3);
104
104
  appearance: none;
105
- border: var(--ui-input-border-width, var(--_ui-default-input-border-width, 1px)) solid
105
+ padding-inline-start: var(--_ui-default-input-padding-inline-start, var(--ui-space-3));
106
+ border: var(--ui-input-border-width, var(--_ui-default-input-border-width, var(--ui-border-width))) solid
106
107
  var(--ui-input-border, var(--_ui-default-input-border, var(--ui-control-border, var(--ui-border-strong))));
107
108
  border-radius: var(--ui-input-radius, var(--_ui-default-input-radius, var(--ui-field-radius, var(--ui-radius-md))));
108
109
  background: var(--ui-input-surface, var(--_ui-default-input-surface, var(--ui-control-surface, var(--ui-surface-elevated))));
@@ -171,7 +172,11 @@
171
172
  var(
172
173
  --_ui-default-input-invalid-focus-shadow,
173
174
  var(--ui-control-inset),
174
- 0 0 0 3px color-mix(in srgb, var(--ui-input-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
175
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
176
+ in srgb,
177
+ var(--ui-input-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
178
+ transparent
179
+ )
175
180
  )
176
181
  );
177
182
  }
@@ -186,8 +191,8 @@
186
191
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
187
192
  @media (forced-colors: active) {
188
193
  :host:focus-visible {
189
- outline: var(--ui-input-focus-outline, var(--_ui-default-input-focus-outline, 2px solid Highlight));
190
- outline-offset: 1px;
194
+ outline: var(--ui-input-focus-outline, var(--_ui-default-input-focus-outline, var(--ui-focus-width) solid Highlight));
195
+ outline-offset: var(--ui-border-width);
191
196
  }
192
197
  }
193
198
 
@@ -1,5 +1,7 @@
1
1
  <template component="ui-input-group" controller="./ui-input-group.js">
2
2
  <defs>
3
+ <prop name="prefixKind" type="keyword" values="text, icon" default="text"
4
+ >Text affixes have their own framing. An icon prefix shares the field surface and uses one compact icon-to-value gap.</prop>
3
5
  <prop name="disabled" type="boolean" default="false">Fades the group's framing to match a disabled input inside it. Disable the input itself too.</prop>
4
6
  </defs>
5
7
  <div>
@@ -52,7 +54,7 @@
52
54
  min-inline-size: 0;
53
55
  min-block-size: var(--ui-control-size-md);
54
56
  /* The frame reads the shared control tokens with a lone Input's fallbacks, so the two match. */
55
- border: 1px solid var(--ui-control-border, var(--ui-border-strong));
57
+ border: var(--ui-border-width) solid var(--ui-control-border, var(--ui-border-strong));
56
58
  border-radius: var(--ui-input-group-radius, var(--ui-field-radius, var(--ui-radius-md)));
57
59
  background: var(--ui-control-surface, var(--ui-surface-elevated));
58
60
  box-shadow: var(--ui-control-inset);
@@ -98,15 +100,19 @@
98
100
  box-shadow: var(
99
101
  --ui-input-group-invalid-focus-shadow,
100
102
  var(--ui-control-inset),
101
- 0 0 0 3px color-mix(in srgb, var(--ui-input-group-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%, transparent)
103
+ 0 0 0 calc(var(--ui-focus-width) * 1.5) color-mix(
104
+ in srgb,
105
+ var(--ui-input-group-invalid-border, var(--ui-field-danger, var(--ui-danger-solid))) 22%,
106
+ transparent
107
+ )
102
108
  );
103
109
  }
104
110
 
105
111
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
106
112
  @media (forced-colors: active) {
107
113
  :host:has(input:focus-visible) {
108
- outline: 2px solid Highlight;
109
- outline-offset: 1px;
114
+ outline: var(--ui-focus-width) solid Highlight;
115
+ outline-offset: var(--ui-border-width);
110
116
  }
111
117
  }
112
118
 
@@ -141,11 +147,20 @@
141
147
  }
142
148
 
143
149
  .affix:has([slot="prefix"]) {
144
- border-inline-end: 1px solid var(--ui-border-divider);
150
+ border-inline-end: var(--ui-border-width) solid var(--ui-border-divider);
145
151
  }
146
152
 
147
153
  .affix:has([slot="suffix"]) {
148
- border-inline-start: 1px solid var(--ui-border-divider);
154
+ border-inline-start: var(--ui-border-width) solid var(--ui-border-divider);
155
+ }
156
+
157
+ :host-state([prefixKind="icon"]) {
158
+ --_ui-default-input-padding-inline-start: var(--ui-space-2);
159
+ }
160
+ :host-state([prefixKind="icon"]) .affix:first-child {
161
+ padding-inline-end: 0;
162
+ border-inline-end: 0;
163
+ background: transparent;
149
164
  }
150
165
 
151
166
  /* Centred rather than padded above and below: the group is exactly a lone Input's height, so a
@@ -65,7 +65,7 @@
65
65
 
66
66
  :host > :slotted(li.card) {
67
67
  padding: var(--_ui-list-native-padding-block, var(--ui-space-3)) var(--_ui-list-native-padding-inline, var(--ui-space-4));
68
- border: 1px solid var(--ui-border-strong);
68
+ border: var(--ui-border-width) solid var(--ui-border-strong);
69
69
  border-radius: var(--ui-radius-lg);
70
70
  background: var(--ui-surface-raised);
71
71
  list-style: none;
@@ -56,7 +56,7 @@
56
56
  min-block-size: var(--_ui-list-item-min-size, var(--ui-control-size, 2.5rem));
57
57
  padding-block: var(--ui-list-item-padding-block, var(--_ui-list-item-padding-block, var(--ui-space-2)));
58
58
  padding-inline: var(--ui-list-item-padding-inline, var(--_ui-list-item-padding-inline, var(--ui-space-3)));
59
- border-radius: var(--ui-radius-md);
59
+ border-radius: var(--ui-selection-radius);
60
60
  color: var(--ui-text-primary);
61
61
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), border-color var(--ui-motion-fast) var(--ui-motion-ease);
62
62
  }
@@ -64,7 +64,7 @@
64
64
  :host-state([variant="card"]) {
65
65
  padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
66
66
  padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
67
- border: 1px solid var(--ui-border-strong);
67
+ border: var(--ui-border-width) solid var(--ui-border-strong);
68
68
  border-radius: var(--ui-radius-lg);
69
69
  background: var(--ui-surface-raised);
70
70
  }
@@ -78,11 +78,12 @@
78
78
  }
79
79
 
80
80
  :host-state([current]) {
81
- background: var(--ui-surface-hover);
81
+ background: var(--ui-selection-surface);
82
+ color: var(--ui-selection-text);
82
83
  }
83
84
 
84
85
  :host:has(.title a[href]:focus-visible) {
85
- box-shadow: 0 0 0 2px var(--ui-focus-ring);
86
+ box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
86
87
  }
87
88
 
88
89
  .leading,
@@ -98,6 +99,10 @@
98
99
  font-size: var(--_ui-list-item-icon-size, var(--ui-font-size-lg));
99
100
  }
100
101
 
102
+ :host-state([current]) .leading {
103
+ color: var(--ui-selection-text);
104
+ }
105
+
101
106
  /* Trailing controls take their own clicks, above the title link's stretched hit area. */
102
107
  .trailing {
103
108
  position: relative;
@@ -159,6 +164,17 @@
159
164
  display: none;
160
165
  }
161
166
 
167
+ @media (forced-colors: active) {
168
+ :host:has(a:focus-visible) {
169
+ outline: var(--ui-focus-width) solid Highlight;
170
+ outline-offset: calc(-1 * var(--ui-focus-width));
171
+ }
172
+ :host-state([current]):not(:has(a:focus-visible)) {
173
+ outline: var(--ui-border-width) solid Highlight;
174
+ outline-offset: calc(-1 * var(--ui-border-width));
175
+ }
176
+ }
177
+
162
178
  /* A component that sets its display still honours the hidden attribute on its root. */
163
179
  :host[hidden] {
164
180
  display: none;
@@ -105,7 +105,7 @@
105
105
  min-inline-size: 0;
106
106
  margin: 0;
107
107
  padding: var(--ui-space-1);
108
- border: 1px solid var(--ui-listbox-border, var(--ui-control-border));
108
+ border: var(--ui-border-width) solid var(--ui-listbox-border, var(--ui-control-border));
109
109
  border-radius: var(--ui-listbox-radius, var(--ui-field-radius, var(--ui-radius-md)));
110
110
  background: var(--ui-listbox-surface, var(--ui-control-surface));
111
111
  color: var(--ui-text-primary);
@@ -149,8 +149,8 @@
149
149
 
150
150
  :host:focus-visible {
151
151
  border-color: var(--ui-control-focus);
152
- outline: 2px solid var(--ui-focus-ring);
153
- outline-offset: 2px;
152
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
153
+ outline-offset: var(--ui-focus-width);
154
154
  box-shadow: var(--ui-listbox-focus-shadow, var(--ui-focus-halo));
155
155
  }
156
156
 
@@ -111,7 +111,7 @@
111
111
  max-inline-size: inherit;
112
112
  padding: var(--ui-space-1);
113
113
  background: var(--_ui-menu-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
114
- border: 1px solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-strong)));
114
+ border: var(--ui-border-width) solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-strong)));
115
115
  border-radius: var(--_ui-menu-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
116
116
  box-shadow: var(--_ui-menu-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
117
117
  max-block-size: inherit;
@@ -123,7 +123,7 @@
123
123
  block-size: 0;
124
124
  margin: var(--ui-space-1) 0;
125
125
  border: 0;
126
- border-block-start: 1px solid var(--ui-border-divider);
126
+ border-block-start: var(--ui-border-width) solid var(--ui-border-divider);
127
127
  }
128
128
 
129
129
  :host:not(:host-state([internalOpen])):not(:host-state([inline])) {
@@ -81,7 +81,7 @@
81
81
  padding: var(--ui-menu-item-padding-block, var(--_ui-default-menu-item-padding-block, var(--ui-space-2)))
82
82
  var(--ui-menu-item-padding-inline, var(--_ui-default-menu-item-padding-inline, var(--ui-space-3)));
83
83
  text-align: left;
84
- border-radius: var(--ui-menu-item-radius, var(--_ui-default-menu-item-radius, var(--ui-radius-md)));
84
+ border-radius: var(--ui-menu-item-radius, var(--_ui-default-menu-item-radius, var(--ui-selection-radius)));
85
85
  color: var(--ui-text-primary);
86
86
  font-size: var(--ui-menu-item-font-size, var(--_ui-default-menu-item-font-size, var(--ui-font-size-md)));
87
87
  font-weight: var(--ui-font-medium);
@@ -107,7 +107,7 @@
107
107
  box-sizing: border-box;
108
108
  inline-size: var(--_ui-default-menu-indicator-size, var(--ui-icon-size-sm));
109
109
  block-size: var(--_ui-default-menu-indicator-size, var(--ui-icon-size-sm));
110
- border: 1.5px solid var(--ui-control-border);
110
+ border: var(--ui-border-width) solid var(--ui-control-border);
111
111
  border-radius: var(--ui-radius-sm);
112
112
  color: var(--ui-surface);
113
113
  --_ui-default-icon-size: 0.75rem;
@@ -159,8 +159,8 @@
159
159
  }
160
160
 
161
161
  :host:focus-visible {
162
- outline: 2px solid var(--ui-focus-ring);
163
- outline-offset: -2px;
162
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
163
+ outline-offset: calc(-1 * var(--ui-focus-width));
164
164
  }
165
165
 
166
166
  :host[aria-disabled="true"] {
@@ -59,7 +59,7 @@
59
59
  background: var(--ui-border);
60
60
  box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1), inset 0 -1px rgb(255 255 255 / 0.22);
61
61
  /* Unseen until forced colours draw it, where the track's own colour is gone. */
62
- outline: 1px solid transparent;
62
+ outline: var(--ui-border-width) solid transparent;
63
63
  }
64
64
 
65
65
  :host-state([size="sm"]) {
@@ -1,9 +1,14 @@
1
1
  <template component="ui-nav-item">
2
2
  <defs>
3
+ <prop name="variant" type="keyword" values="surface, line" default="surface"
4
+ >surface marks the current row with a quiet filled surface and shared corners. line uses square corners and a continuous logical start edge. Both retain the
5
+ resting label weight and expose aria-current.</prop>
6
+ <prop name="density" type="keyword" values="comfortable, compact" default="comfortable"
7
+ >Compact uses smaller type and row spacing to sit alongside a compact tree; comfortable keeps the regular navigation row.</prop>
3
8
  <prop name="current" type="keyword" values="true, false, page, step, location" default="false"
4
- >Marks the item as where you are: it takes the selected surface, a stronger label, and a bar on its start edge, and states aria-current, which assistive
5
- technology announces. "true" means the current page (aria-current="page"); "step" marks the current step of a process, and "location" the current place in
6
- a set, such as a section of a record. Set it on one item at a time.</prop>
9
+ >Marks the item as where you are: it takes the selected surface, the selected text, and the chosen surface or line treatment, and states aria-current, which
10
+ assistive technology announces. "true" means the current page (aria-current="page"); "step" marks the current step of a process, and "location" the
11
+ current place in a set, such as a section of a record. Set it on one item at a time.</prop>
7
12
  <prop name="href" type="string"
8
13
  >The link's destination. Pair it with as="a" so the item renders as a real link: a router, a modified click, and "open in new tab" all work. Without it the
9
14
  item is a button, for switching views inside the app.</prop>
@@ -63,7 +68,7 @@
63
68
  belongs to. Label and description are one line each and end in an ellipsis, so every item in a
64
69
  navigation has the same height and the rail never grows sideways. */
65
70
  :host {
66
- --_indicator-width: var(--ui-nav-item-indicator-width, 3px);
71
+ --_indicator-width: var(--ui-nav-item-indicator-width, var(--ui-accent-line-width));
67
72
  --_indicator-color: var(--ui-nav-item-indicator-color, var(--ui-accent));
68
73
  position: relative;
69
74
  box-sizing: border-box;
@@ -77,11 +82,11 @@
77
82
  padding-block: var(--ui-space-2);
78
83
  padding-inline: var(--ui-space-3);
79
84
  border: 0;
80
- border-radius: var(--ui-radius-md);
85
+ border-radius: var(--ui-selection-radius);
81
86
  background: transparent;
82
87
  color: var(--ui-text-secondary);
83
88
  font: inherit;
84
- font-weight: var(--ui-font-medium);
89
+ font-weight: var(--ui-font-normal);
85
90
  text-align: start;
86
91
  text-decoration: none;
87
92
  cursor: pointer;
@@ -97,32 +102,43 @@
97
102
  /* The ring is an outline, drawn inside the item: forced colors keep an outline where they drop a
98
103
  box shadow, and a scrolling rail cannot clip a ring that stays within the item. */
99
104
  :host:focus-visible {
100
- outline: 2px solid var(--ui-focus-ring);
101
- outline-offset: -2px;
105
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring);
106
+ outline-offset: calc(-1 * var(--ui-focus-width));
102
107
  }
103
108
 
104
109
  :host[aria-current] {
105
- background: var(--ui-nav-item-current-surface, var(--ui-accent-soft));
106
- color: var(--ui-accent-subtle-text, var(--ui-text-primary));
107
- font-weight: var(--ui-font-semibold);
110
+ background: var(--ui-nav-item-current-surface, var(--ui-selection-surface));
111
+ color: var(--ui-selection-text);
112
+ }
113
+
114
+ :host-state([variant="line"]) {
115
+ border-radius: 0;
108
116
  }
109
117
 
110
- /* The bar on the start edge is a border, not a fill: forced colors replace backgrounds but keep a
118
+ /* A line treatment has straight corners and a continuous edge. Surface treatment has
119
+ shared rounded corners and no edge marker; never combine the two geometries.
120
+ The line is a border, not a fill: forced colors replace backgrounds but keep a
111
121
  border, so the current item stays marked in high contrast. Logical edges mirror it in a
112
122
  right-to-left page. */
113
123
  .indicator {
114
124
  position: absolute;
115
- inset-block: var(--ui-space-2);
125
+ inset-block: 0;
116
126
  inset-inline-start: 0;
117
127
  display: none;
118
128
  border-inline-start: var(--_indicator-width) solid var(--_indicator-color);
119
129
  }
120
130
 
121
- :host[aria-current] .indicator {
131
+ :host-state([variant="line"])[aria-current] .indicator {
122
132
  display: block;
123
133
  }
124
134
 
125
135
  @media (forced-colors: active) {
136
+ /* System colors may erase the selected fill. Trace the complete surface, without
137
+ creating an edge stripe; the stronger keyboard focus outline keeps precedence. */
138
+ :host-state([variant="surface"])[aria-current]:not(:focus-visible) {
139
+ outline: var(--ui-border-width) solid Highlight;
140
+ outline-offset: calc(-1 * var(--ui-border-width));
141
+ }
126
142
  .indicator {
127
143
  border-inline-start-color: Highlight;
128
144
  }
@@ -165,6 +181,22 @@
165
181
  line-height: var(--ui-line-height-tight);
166
182
  }
167
183
 
184
+ :host-state([density="compact"]) {
185
+ min-block-size: var(--ui-control-size-sm);
186
+ padding-block: var(--ui-space-1);
187
+ padding-inline: var(--ui-space-2);
188
+ }
189
+ :host-state([density="compact"]) .leading,
190
+ :host-state([density="compact"]) .label {
191
+ font-size: var(--ui-font-size-sm);
192
+ }
193
+
194
+ @media (pointer: coarse) {
195
+ :host-state([density="compact"]) {
196
+ min-block-size: var(--ui-control-min-block-size);
197
+ }
198
+ }
199
+
168
200
  /* An unused region takes no space. */
169
201
  .leading:empty,
170
202
  .description:empty {
@@ -1,5 +1,7 @@
1
1
  <template component="ui-popover" controller="./ui-popover.js">
2
2
  <defs>
3
+ <prop name="size" type="keyword" values="content, sm, md, lg" default="content"
4
+ >Optional size preset. content keeps the existing intrinsic sizing; the other sizes constrain the surface for compact, medium, or large content.</prop>
3
5
  <prop name="open" type="boolean" default="false">Whether the popover is open initially or when set externally.</prop>
4
6
  <prop name="for" type="string" default="">ID of the control that toggles and anchors the popover.</prop>
5
7
  <prop
@@ -86,7 +88,7 @@
86
88
  overflow: auto;
87
89
  padding: var(--_ui-popover-padding, var(--ui-space-3));
88
90
  background: var(--_ui-popover-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
89
- border: 1px solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
91
+ border: var(--ui-border-width) solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
90
92
  border-radius: var(--_ui-popover-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
91
93
  box-shadow: var(--_ui-popover-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
92
94
  }
@@ -120,6 +122,19 @@
120
122
  }
121
123
  }
122
124
 
125
+ :host-state([size="sm"]) {
126
+ inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
127
+ max-inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
128
+ }
129
+ :host-state([size="md"]) {
130
+ inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
131
+ max-inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
132
+ }
133
+ :host-state([size="lg"]) {
134
+ inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
135
+ max-inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
136
+ }
137
+
123
138
  :host[hidden] {
124
139
  display: none;
125
140
  }
@@ -86,8 +86,8 @@
86
86
  }
87
87
 
88
88
  input:focus-visible {
89
- outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
90
- outline-offset: 2px;
89
+ outline: var(--ui-focus-width) solid var(--ui-focus-ring, var(--ui-accent-solid));
90
+ outline-offset: var(--ui-focus-width);
91
91
  }
92
92
 
93
93
  :host-state([disabled]) {
@@ -1,5 +1,7 @@
1
1
  <template component="ui-scroll-area" controller="./ui-scroll-area.js">
2
2
  <defs>
3
+ <prop name="size" type="keyword" values="content, sm, md, lg" default="content"
4
+ >Optional height preset. content keeps intrinsic sizing; sm fits three compact 3.125rem result rows, md is 20rem, and lg is 30rem.</prop>
3
5
  <prop name="orientation" type="keyword" values="vertical, horizontal" default="vertical"
4
6
  >The direction the content scrolls. Vertical scrolls up and down and clips sideways overflow; horizontal scrolls sideways and clips vertical
5
7
  overflow.</prop>
@@ -43,6 +45,16 @@
43
45
  --_ui-scroll-fade-inline: to left;
44
46
  }
45
47
 
48
+ :host-state([size="sm"]) {
49
+ max-block-size: 9.375rem;
50
+ }
51
+ :host-state([size="md"]) {
52
+ max-block-size: 20rem;
53
+ }
54
+ :host-state([size="lg"]) {
55
+ max-block-size: 30rem;
56
+ }
57
+
46
58
  /* A component that sets its display still honours the hidden attribute on its root. */
47
59
  :host[hidden] {
48
60
  display: none;