@threadlabs/looma 0.16.5 → 0.17.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 (230) hide show
  1. package/components/ui-avatar-group/ui-avatar-group.html +8 -5
  2. package/components/ui-avatar-group/ui-avatar-group.js +3 -3
  3. package/components/ui-badge/ui-badge.html +10 -5
  4. package/components/ui-breadcrumb-item/ui-breadcrumb-item.html +2 -1
  5. package/components/ui-button/ui-button.html +33 -26
  6. package/components/ui-button/ui-button.js +2 -2
  7. package/components/ui-callout/ui-callout.html +3 -1
  8. package/components/ui-card/ui-card.html +5 -3
  9. package/components/ui-checkbox/ui-checkbox.html +36 -8
  10. package/components/ui-combobox/ui-combobox.html +72 -45
  11. package/components/ui-combobox/ui-combobox.js +7 -2
  12. package/components/ui-context-menu/ui-context-menu.html +2 -2
  13. package/components/ui-description-item/ui-description-item.html +1 -1
  14. package/components/ui-description-list/ui-description-list.html +2 -0
  15. package/components/ui-dialog/ui-dialog.html +3 -23
  16. package/components/ui-disclosure/ui-disclosure.html +2 -2
  17. package/components/ui-editor-insert-table-grid/ui-editor-insert-table-grid.html +2 -2
  18. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +3 -3
  19. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +4 -4
  20. package/components/ui-editor-slash-menu-item/ui-editor-slash-menu-item.html +6 -1
  21. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +2 -2
  22. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +4 -4
  23. package/components/ui-editor-toolbar/ui-editor-toolbar.html +5 -5
  24. package/components/ui-floating-action-button/ui-floating-action-button.html +4 -2
  25. package/components/ui-icon-button/ui-icon-button.html +57 -17
  26. package/components/ui-icon-button/ui-icon-button.js +1 -1
  27. package/components/ui-list/ui-list.html +46 -6
  28. package/components/ui-list-item/ui-list-item.html +1 -1
  29. package/components/ui-menu/ui-menu.html +4 -3
  30. package/components/ui-menu/ui-menu.js +9 -3
  31. package/components/ui-menu-item/ui-menu-item.html +43 -6
  32. package/components/ui-meter/ui-meter.html +4 -1
  33. package/components/ui-nav-item/ui-nav-item.html +0 -1
  34. package/components/ui-page-header/ui-page-header.html +1 -0
  35. package/components/ui-popover/ui-popover.html +1 -1
  36. package/components/ui-radio/ui-radio.html +5 -2
  37. package/components/ui-scroll-area/ui-scroll-area.html +9 -14
  38. package/components/ui-scroll-area/ui-scroll-area.js +32 -0
  39. package/components/ui-search-result-row/ui-search-result-row.html +5 -3
  40. package/components/ui-search-shell/ui-search-shell.html +8 -8
  41. package/components/ui-section/ui-section.html +5 -3
  42. package/components/ui-separator/ui-separator.html +2 -2
  43. package/components/ui-sidebar/ui-sidebar.html +2 -2
  44. package/components/ui-spinner/ui-spinner.html +28 -8
  45. package/components/ui-status-message/ui-status-message.html +1 -1
  46. package/components/ui-switch/ui-switch.html +17 -8
  47. package/components/ui-table/ui-table.html +1 -1
  48. package/components/ui-tabs/ui-tabs.html +21 -12
  49. package/components/ui-toast/ui-toast.html +1 -1
  50. package/components/ui-toast-region/ui-toast-region.html +1 -1
  51. package/components/ui-tooltip/ui-tooltip.html +12 -12
  52. package/components/ui-tooltip/ui-tooltip.js +1 -1
  53. package/components/ui-top-bar/ui-top-bar.html +1 -1
  54. package/components/ui-tree/ui-tree.js +4 -1
  55. package/components/ui-tree-item/ui-tree-item.html +2 -1
  56. package/dist/index.js +15 -14
  57. package/editor/chunks/extensions.js +3 -4
  58. package/editor/extensions/index.d.ts +1 -1
  59. package/editor/extensions/preset.d.ts +5 -0
  60. package/package.json +1 -1
  61. package/styles/ui-avatar-group.css +8 -5
  62. package/styles/ui-badge.css +10 -5
  63. package/styles/ui-breadcrumb-item.css +2 -1
  64. package/styles/ui-button.css +19 -25
  65. package/styles/ui-callout.css +3 -1
  66. package/styles/ui-card.css +4 -2
  67. package/styles/ui-checkbox.css +38 -8
  68. package/styles/ui-combobox.css +27 -8
  69. package/styles/ui-context-menu.css +2 -2
  70. package/styles/ui-description-item.css +1 -1
  71. package/styles/ui-description-list.css +2 -0
  72. package/styles/ui-dialog.css +1 -22
  73. package/styles/ui-disclosure.css +2 -2
  74. package/styles/ui-editor-insert-table-grid.css +2 -2
  75. package/styles/ui-editor-mention-menu.css +3 -3
  76. package/styles/ui-editor-slash-menu-item.css +6 -1
  77. package/styles/ui-editor-slash-menu.css +4 -4
  78. package/styles/ui-editor-table-context-menu.css +2 -2
  79. package/styles/ui-editor-table-toolbar.css +4 -4
  80. package/styles/ui-editor-toolbar.css +5 -5
  81. package/styles/ui-floating-action-button.css +3 -1
  82. package/styles/ui-icon-button.css +53 -18
  83. package/styles/ui-list-item.css +1 -1
  84. package/styles/ui-list.css +41 -6
  85. package/styles/ui-menu-item.css +43 -5
  86. package/styles/ui-menu.css +3 -3
  87. package/styles/ui-meter.css +4 -1
  88. package/styles/ui-nav-item.css +0 -1
  89. package/styles/ui-page-header.css +1 -0
  90. package/styles/ui-popover.css +1 -1
  91. package/styles/ui-radio.css +5 -2
  92. package/styles/ui-scroll-area.css +10 -16
  93. package/styles/ui-search-result-row.css +3 -2
  94. package/styles/ui-search-shell.css +7 -7
  95. package/styles/ui-section.css +5 -3
  96. package/styles/ui-separator.css +2 -2
  97. package/styles/ui-sidebar.css +2 -2
  98. package/styles/ui-spinner.css +27 -6
  99. package/styles/ui-status-message.css +1 -1
  100. package/styles/ui-switch.css +17 -8
  101. package/styles/ui-table.css +1 -1
  102. package/styles/ui-tabs.css +60 -51
  103. package/styles/ui-toast-region.css +1 -1
  104. package/styles/ui-toast.css +1 -1
  105. package/styles/ui-tooltip.css +12 -12
  106. package/styles/ui-top-bar.css +1 -1
  107. package/styles/ui-tree-item.css +2 -1
  108. package/theme-dark.css +4 -4
  109. package/theme-light.css +3 -3
  110. package/tokens.css +9 -6
  111. package/vanilla/UiButton.d.ts +1 -0
  112. package/vanilla/UiButton.js +17 -19
  113. package/vanilla/UiCombobox.js +162 -159
  114. package/vanilla/UiDialog.js +2 -2
  115. package/vanilla/UiIconButton.d.ts +1 -0
  116. package/vanilla/UiIconButton.js +1 -4
  117. package/vanilla/UiList.d.ts +3 -1
  118. package/vanilla/UiList.js +36 -19
  119. package/vanilla/UiMenu.d.ts +1 -0
  120. package/vanilla/UiMenu.js +1 -1
  121. package/vanilla/UiMenuItem.js +10 -13
  122. package/vanilla/UiScrollArea.js +11 -6
  123. package/vanilla/UiSearchShell.js +2 -2
  124. package/vanilla/UiSpinner.js +2 -4
  125. package/vue/UiAvatarGroup.vue +8 -5
  126. package/vue/UiBadge.vue +10 -5
  127. package/vue/UiBreadcrumbItem.vue +2 -1
  128. package/vue/UiButton.d.ts +2 -0
  129. package/vue/UiButton.vue +31 -28
  130. package/vue/UiCallout.vue +3 -2
  131. package/vue/UiCard.vue +4 -2
  132. package/vue/UiCheckbox.vue +36 -8
  133. package/vue/UiCombobox.d.ts +1 -1
  134. package/vue/UiCombobox.vue +55 -35
  135. package/vue/UiContextMenu.vue +2 -2
  136. package/vue/UiDescriptionItem.vue +1 -1
  137. package/vue/UiDescriptionList.vue +2 -0
  138. package/vue/UiDialog.d.ts +3 -3
  139. package/vue/UiDialog.vue +3 -27
  140. package/vue/UiDisclosure.vue +2 -2
  141. package/vue/UiEditorInsertTableGrid.vue +2 -2
  142. package/vue/UiEditorMentionMenu.d.ts +1 -1
  143. package/vue/UiEditorMentionMenu.vue +4 -3
  144. package/vue/UiEditorSlashMenu.vue +6 -4
  145. package/vue/UiEditorSlashMenuItem.vue +6 -1
  146. package/vue/UiEditorTableContextMenu.vue +2 -2
  147. package/vue/UiEditorTableToolbar.vue +4 -4
  148. package/vue/UiEditorToolbar.vue +5 -5
  149. package/vue/UiFloatingActionButton.vue +3 -1
  150. package/vue/UiIconButton.d.ts +2 -0
  151. package/vue/UiIconButton.vue +61 -19
  152. package/vue/UiList.d.ts +7 -1
  153. package/vue/UiList.vue +57 -6
  154. package/vue/UiListItem.vue +1 -1
  155. package/vue/UiMenu.d.ts +2 -0
  156. package/vue/UiMenu.vue +6 -3
  157. package/vue/UiMenuItem.d.ts +3 -3
  158. package/vue/UiMenuItem.vue +47 -7
  159. package/vue/UiMeter.vue +4 -1
  160. package/vue/UiNavItem.vue +0 -1
  161. package/vue/UiPageHeader.vue +1 -0
  162. package/vue/UiPopover.vue +1 -1
  163. package/vue/UiRadio.vue +5 -2
  164. package/vue/UiScrollArea.vue +24 -18
  165. package/vue/UiSearchResultRow.vue +3 -2
  166. package/vue/UiSearchShell.vue +8 -8
  167. package/vue/UiSection.vue +5 -3
  168. package/vue/UiSeparator.vue +2 -2
  169. package/vue/UiSidebar.vue +2 -2
  170. package/vue/UiSpinner.vue +28 -7
  171. package/vue/UiStatusMessage.vue +1 -1
  172. package/vue/UiSwitch.vue +20 -9
  173. package/vue/UiTable.vue +1 -1
  174. package/vue/UiTabs.vue +25 -12
  175. package/vue/UiToast.vue +1 -1
  176. package/vue/UiToastRegion.vue +1 -1
  177. package/vue/UiTooltip.vue +12 -12
  178. package/vue/UiTopBar.vue +1 -1
  179. package/vue/UiTreeItem.vue +2 -1
  180. package/vue/chunks/UiAvatarGroup.js +1 -1
  181. package/vue/chunks/UiBadge.js +1 -1
  182. package/vue/chunks/UiBreadcrumbItem.js +1 -1
  183. package/vue/chunks/UiButton.js +28 -23
  184. package/vue/chunks/UiCallout.js +1 -1
  185. package/vue/chunks/UiCard.js +1 -1
  186. package/vue/chunks/UiCheckbox.js +1 -1
  187. package/vue/chunks/UiCombobox.js +80 -77
  188. package/vue/chunks/UiContextMenu.js +1 -1
  189. package/vue/chunks/UiDescriptionItem.js +1 -1
  190. package/vue/chunks/UiDescriptionList.js +1 -1
  191. package/vue/chunks/UiDialog.js +7 -4
  192. package/vue/chunks/UiDisclosure.js +1 -1
  193. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  194. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  195. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  196. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  197. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  198. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  199. package/vue/chunks/UiEditorToolbar.js +1 -1
  200. package/vue/chunks/UiFloatingActionButton.js +1 -1
  201. package/vue/chunks/UiIconButton.js +13 -8
  202. package/vue/chunks/UiList.js +17 -5
  203. package/vue/chunks/UiListItem.js +1 -1
  204. package/vue/chunks/UiMenu.js +10 -2
  205. package/vue/chunks/UiMenuItem.js +1 -4
  206. package/vue/chunks/UiMeter.js +1 -1
  207. package/vue/chunks/UiNavItem.js +1 -1
  208. package/vue/chunks/UiPageHeader.js +1 -1
  209. package/vue/chunks/UiPopover.js +1 -1
  210. package/vue/chunks/UiRadio.js +1 -1
  211. package/vue/chunks/UiScrollArea.js +22 -3
  212. package/vue/chunks/UiSearchResultRow.js +1 -1
  213. package/vue/chunks/UiSearchShell.js +2 -2
  214. package/vue/chunks/UiSection.js +1 -1
  215. package/vue/chunks/UiSeparator.js +1 -1
  216. package/vue/chunks/UiSidebar.js +1 -1
  217. package/vue/chunks/UiSpinner.js +7 -5
  218. package/vue/chunks/UiStatusMessage.js +1 -1
  219. package/vue/chunks/UiSwitch.js +1 -1
  220. package/vue/chunks/UiTable.js +1 -1
  221. package/vue/chunks/UiTabs.js +1 -1
  222. package/vue/chunks/UiToast.js +1 -1
  223. package/vue/chunks/UiToastRegion.js +1 -1
  224. package/vue/chunks/UiTooltip.js +1 -1
  225. package/vue/chunks/UiTopBar.js +1 -1
  226. package/vue/chunks/UiTreeItem.js +1 -1
  227. package/vue/components.css +1238 -1032
  228. package/vue/editor/LoomaEditor.d.ts +12 -1
  229. package/vue/editor/index.js +7 -1
  230. package/vue/index.js +1 -1
@@ -14,9 +14,14 @@
14
14
  background: var(--ui-accent-subtle);
15
15
  }
16
16
  :scope[aria-disabled="true"] {
17
- opacity: 0.6;
17
+ background: var(--ui-disabled-surface);
18
18
  cursor: not-allowed;
19
19
  }
20
+ :scope[aria-disabled="true"] .title,
21
+ :scope[aria-disabled="true"] .description,
22
+ :scope[aria-disabled="true"] .icon {
23
+ color: var(--ui-disabled-text);
24
+ }
20
25
 
21
26
  .icon {
22
27
  display: flex;
@@ -6,7 +6,7 @@
6
6
 
7
7
  :scope {
8
8
  background: var(--ui-surface);
9
- border: 1px solid var(--ui-border);
9
+ border: 1px solid var(--ui-border-strong);
10
10
  border-radius: var(--ui-radius-dialog);
11
11
  box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
12
12
  overflow: hidden;
@@ -26,7 +26,7 @@
26
26
  align-items: center;
27
27
  gap: var(--ui-space-2);
28
28
  padding: var(--ui-space-3) var(--ui-space-4);
29
- border-bottom: 1px solid var(--ui-border);
29
+ border-bottom: 1px solid var(--ui-border-divider);
30
30
  font-size: var(--ui-font-size-xs);
31
31
  color: var(--ui-text-muted);
32
32
  font-weight: var(--ui-font-semibold);
@@ -34,7 +34,7 @@
34
34
  letter-spacing: 0.05em;
35
35
  }
36
36
 
37
- .header:not(:has(> *)), .footer:not(:has(> *)), .empty:not(:has(> *)) {
37
+ :scope > .header:empty, :scope > .footer:empty, :scope > .empty:empty {
38
38
  display: none;
39
39
  }
40
40
 
@@ -151,7 +151,7 @@
151
151
 
152
152
  .footer {
153
153
  padding: var(--ui-space-2) var(--ui-space-3);
154
- border-top: 1px solid var(--ui-border);
154
+ border-top: 1px solid var(--ui-border-divider);
155
155
  font-size: var(--ui-font-size-xs);
156
156
  color: var(--ui-text-muted);
157
157
  }
@@ -8,7 +8,7 @@
8
8
  max-height: min(28rem, calc(100vh - 24px));
9
9
  padding: var(--ui-space-2);
10
10
  background: var(--ui-surface);
11
- border: 1px solid var(--ui-border);
11
+ border: 1px solid var(--ui-border-strong);
12
12
  border-radius: var(--ui-radius-lg);
13
13
  box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
14
14
  display: flex;
@@ -110,7 +110,7 @@
110
110
 
111
111
  .sep {
112
112
  height: 1px;
113
- background: var(--ui-border);
113
+ background: var(--ui-border-divider);
114
114
  margin: var(--ui-space-1) 0;
115
115
  }
116
116
 
@@ -35,7 +35,7 @@
35
35
  gap: var(--ui-space-1);
36
36
  padding: var(--ui-space-1);
37
37
  background: color-mix(in srgb, var(--ui-surface) 94%, transparent);
38
- border: 1px solid var(--ui-border);
38
+ border: 1px solid var(--ui-border-strong);
39
39
  border-radius: calc(var(--ui-radius-md) + 2px);
40
40
  box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
41
41
  backdrop-filter: blur(10px);
@@ -51,7 +51,7 @@
51
51
  .sep {
52
52
  width: 1px;
53
53
  align-self: stretch;
54
- background: var(--ui-border);
54
+ background: var(--ui-border-divider);
55
55
  }
56
56
 
57
57
  .overflow {
@@ -124,7 +124,7 @@
124
124
  min-width: 12rem;
125
125
  padding: var(--ui-space-1);
126
126
  background: var(--ui-surface);
127
- border: 1px solid var(--ui-border);
127
+ border: 1px solid var(--ui-border-strong);
128
128
  border-radius: var(--ui-radius-md);
129
129
  box-shadow: var(--ui-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));
130
130
  display: flex;
@@ -136,7 +136,7 @@
136
136
  .menu-section + .menu-section {
137
137
  margin-top: var(--ui-space-1);
138
138
  padding-top: var(--ui-space-1);
139
- border-top: 1px solid color-mix(in srgb, var(--ui-border) 80%, transparent);
139
+ border-top: 1px solid var(--ui-border-divider);
140
140
  }
141
141
 
142
142
  .menu-heading {
@@ -9,7 +9,7 @@
9
9
  padding: var(--ui-editor-toolbar-padding-block, 6px) var(--ui-editor-toolbar-padding-inline, 12px);
10
10
  min-height: var(--ui-editor-toolbar-min-height, 48px);
11
11
  background: var(--ui-editor-toolbar-surface, var(--ui-surface));
12
- border-bottom: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
12
+ border-bottom: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
13
13
  }
14
14
 
15
15
  /* One row, always. When the controls outgrow the space, the row scrolls sideways rather than
@@ -64,7 +64,7 @@
64
64
  min-height: auto;
65
65
  padding: var(--ui-editor-toolbar-floating-padding, 4px);
66
66
  background: color-mix(in srgb, var(--ui-editor-toolbar-surface, var(--ui-surface)) 96%, transparent);
67
- border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
67
+ border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
68
68
  border-radius: var(--ui-editor-toolbar-floating-radius, var(--ui-radius-lg));
69
69
  box-shadow: var(--ui-editor-toolbar-floating-shadow, var(--ui-shadow-lg, 0 10px 24px rgb(0 0 0 / 0.12)));
70
70
  backdrop-filter: blur(10px);
@@ -78,7 +78,7 @@
78
78
  left: 0;
79
79
  right: 0;
80
80
  min-height: var(--ui-editor-toolbar-mobile-min-height, 56px);
81
- border-top: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
81
+ border-top: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-divider));
82
82
  border-bottom: none;
83
83
  box-shadow: var(--ui-editor-toolbar-mobile-shadow, 0 -2px 8px rgb(0 0 0 / 0.06));
84
84
  }
@@ -87,7 +87,7 @@
87
87
  position: relative;
88
88
  inset: auto;
89
89
  min-height: auto;
90
- border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
90
+ border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border-strong));
91
91
  border-radius: var(--ui-editor-toolbar-floating-radius, var(--ui-radius-lg));
92
92
  box-shadow: var(--ui-editor-toolbar-floating-shadow, var(--ui-shadow-lg, 0 10px 24px rgb(0 0 0 / 0.12)));
93
93
  }
@@ -138,7 +138,7 @@
138
138
  :where([data-slotted], [data-slotted] *):is(.divider) {
139
139
  width: 1px;
140
140
  height: 20px;
141
- background: var(--ui-editor-toolbar-divider, var(--ui-border));
141
+ background: var(--ui-editor-toolbar-divider, var(--ui-border-divider));
142
142
  flex-shrink: 0;
143
143
  margin: 0 var(--ui-editor-toolbar-divider-margin, 4px);
144
144
  }
@@ -61,7 +61,9 @@
61
61
  }
62
62
 
63
63
  :scope:disabled {
64
- opacity: 0.6;
64
+ background: var(--ui-disabled-surface);
65
+ color: var(--ui-disabled-text);
66
+ box-shadow: none;
65
67
  cursor: not-allowed;
66
68
  }
67
69
 
@@ -102,15 +102,30 @@
102
102
  pointer-events: none;
103
103
  }
104
104
 
105
- /* At rest an anticipatory button shows only its guide dot; proximity, hover, or focus reveals the
106
- * surface and icon. The root is the native button, so hiding it outright would hide the dot
107
- * too, and slotted icons sit outside this scope; `color: transparent` hides currentColor icons. */
105
+ :scope[data-ui-icon-button-state~="anticipatory"]:disabled::before {
106
+ opacity: 0;
107
+ }
108
+
109
+ /* At rest an anticipatory button shows only its guide dot. The icon grows into place when
110
+ proximity, hover, or focus reveals it; the button's hit area and guide remain stable. */
111
+ :scope[data-ui-icon-button-state~="anticipatory"] .content {
112
+ opacity: 1;
113
+ transform: scale(1);
114
+ transition: opacity var(--ui-motion-fast) var(--ui-motion-ease), transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
115
+ }
116
+
108
117
  @media (hover: hover) and (pointer: fine) {
109
- :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], [data-ui-proximity="near"], :hover, :focus-visible) {
118
+ :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [data-ui-proximity="near"], :hover, :focus-visible) {
110
119
  border-color: transparent;
111
120
  background: transparent;
112
121
  box-shadow: none;
113
- color: transparent;
122
+ }
123
+
124
+ :scope[data-ui-icon-button-state~="anticipatory"]:not(:scope[data-ui-icon-button-state~="variant=solid"], :scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"], :disabled, [data-ui-proximity="near"], :hover, :focus-visible)
125
+ .content {
126
+ opacity: 0;
127
+ transform: scale(0.65);
128
+ transition-duration: var(--ui-motion-fast);
114
129
  }
115
130
  }
116
131
 
@@ -140,7 +155,7 @@
140
155
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
141
156
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
142
157
  color var(--ui-motion-fast) var(--ui-motion-ease),
143
- box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
158
+ box-shadow var(--ui-motion-base) var(--ui-motion-ease),
144
159
  transform var(--ui-motion-fast) var(--ui-motion-ease);
145
160
  }
146
161
 
@@ -201,13 +216,16 @@
201
216
  }
202
217
 
203
218
  :scope[data-ui-icon-button-state~="variant=outline"] {
204
- border-color: var(--ui-icon-button-border, var(--ui-border-default));
219
+ border-color: var(--ui-icon-button-border, var(--ui-control-border, var(--ui-border-strong)));
205
220
  background: var(--ui-icon-button-outline-surface, var(--ui-surface-default));
221
+ background-image: var(--ui-raised-highlight);
206
222
  color: var(--ui-icon-button-outline-text, var(--ui-text-primary));
223
+ box-shadow: var(--ui-raised);
207
224
  }
208
225
 
209
226
  :scope[data-ui-icon-button-state~="variant=solid"] {
210
227
  background: var(--ui-icon-button-solid-surface, var(--ui-accent-solid));
228
+ background-image: var(--ui-raised-highlight);
211
229
  color: var(--ui-icon-button-solid-text, var(--ui-text-on-accent));
212
230
  box-shadow: var(
213
231
  --ui-icon-button-solid-shadow,
@@ -222,7 +240,7 @@
222
240
  }
223
241
 
224
242
  :scope[data-ui-icon-button-state~="variant=outline"]:hover:enabled:not([aria-disabled="true"]) {
225
- border-color: var(--ui-icon-button-hover-border, var(--ui-border-strong));
243
+ border-color: var(--ui-icon-button-hover-border, var(--ui-control-border-hover, var(--ui-control-border)));
226
244
  }
227
245
 
228
246
  :scope[data-ui-icon-button-state~="variant=solid"]:hover:enabled:not([aria-disabled="true"]) {
@@ -233,30 +251,45 @@
233
251
  transform: scale(var(--ui-icon-button-active-scale, 0.96));
234
252
  }
235
253
 
236
- :scope[data-ui-icon-button-state~="pending"] {
254
+ :is(:scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"]) {
237
255
  cursor: progress;
238
256
  }
239
257
 
240
258
  .content {
241
- display: contents;
259
+ display: inline-flex;
260
+ align-items: center;
261
+ justify-content: center;
242
262
  }
243
263
 
244
- :scope[data-ui-icon-button-state~="pending"] .content {
264
+ :is(:scope[data-ui-icon-button-state~="loading"], :scope[data-ui-icon-button-state~="pending"]) .content {
245
265
  display: none;
246
266
  }
247
267
 
268
+ @media (prefers-reduced-motion: reduce) {
269
+ :scope[data-ui-icon-button-state~="anticipatory"] .content {
270
+ transition: none;
271
+ }
272
+ }
273
+
248
274
  :scope:focus-visible {
249
275
  outline: none;
250
276
  box-shadow: var(--ui-focus-halo);
251
277
  }
252
278
 
253
- /* Disabled colours fall back to each variant's own; ghost takes only the icon colour. */
254
- /* Disabled washes the button out the way Button does: the same shape, one filter. */
279
+ /* Disabled is a flat neutral control, independent of the active variant's tone. */
255
280
  :scope:disabled {
281
+ border-color: var(--ui-disabled-border);
282
+ background: var(--ui-disabled-surface);
283
+ color: var(--ui-disabled-text);
256
284
  filter: var(--ui-icon-button-disabled-filter, var(--ui-disabled-filter));
257
285
  opacity: var(--ui-icon-button-disabled-opacity, 1);
258
286
  cursor: not-allowed;
259
287
  box-shadow: none;
288
+ background-image: none;
289
+ }
290
+
291
+ :scope[data-ui-icon-button-state~="variant=ghost"]:disabled {
292
+ border-color: transparent;
260
293
  }
261
294
 
262
295
  :scope {
@@ -283,9 +316,9 @@
283
316
  @scope ([data-component~="ui-icon-button"]) to ([data-component]) {
284
317
  /* This component's hooks style the element they are set on, and never a nested one. */
285
318
 
286
- /* At rest an anticipatory button shows only its guide dot; proximity, hover, or focus reveals the
287
- * surface and icon. The root is the native button, so hiding it outright would hide the dot
288
- * too, and slotted icons sit outside this scope; `color: transparent` hides currentColor icons. */
319
+ /* At rest an anticipatory button shows only its guide dot. The icon grows into place when
320
+ proximity, hover, or focus reveals it; the button's hit area and guide remain stable. */
321
+
289
322
  @media (hover: hover) and (pointer: fine) {
290
323
  }
291
324
 
@@ -297,8 +330,10 @@
297
330
  @media (pointer: coarse) {
298
331
  }
299
332
 
300
- /* Disabled colours fall back to each variant's own; ghost takes only the icon colour. */
301
- /* Disabled washes the button out the way Button does: the same shape, one filter. */
333
+ @media (prefers-reduced-motion: reduce) {
334
+ }
335
+
336
+ /* Disabled is a flat neutral control, independent of the active variant's tone. */
302
337
 
303
338
  :where([data-slotted], [data-slotted] *):is(svg) {
304
339
  inline-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
@@ -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-default);
51
+ border: 1px solid var(--ui-border-strong);
52
52
  border-radius: var(--ui-radius-lg);
53
53
  background: var(--ui-surface-raised);
54
54
  }
@@ -10,32 +10,50 @@
10
10
  @scope ([data-component~="ui-list"]) to ([data-component], [data-slotted]) {
11
11
  /* This component's hooks style the element they are set on, and never a nested one. */
12
12
 
13
- /* A list of items (ui-list-item). It owns the spacing between them, so a view never sets it. The
13
+ /* A list of native li elements or structured ui-list-item components. It owns the spacing between them, so a view never sets it. The
14
14
  explicit list role keeps the list announced as one: some browsers drop it from a list with no
15
15
  markers. */
16
16
  :scope {
17
+ --_list-gap: var(--ui-list-gap, var(--ui-space-1));
18
+ --_list-min-item-width: var(--ui-list-min-item-width, 14rem);
17
19
  display: flex;
18
20
  flex-direction: column;
19
- gap: var(--ui-list-gap, var(--ui-space-1));
21
+ inline-size: 100%;
22
+ gap: var(--_list-gap);
20
23
  min-inline-size: 0;
21
24
  margin: 0;
22
25
  padding: 0;
23
26
  list-style: none;
24
27
  }
25
28
 
29
+ :scope[data-ui-list-state~="as=ol"],
30
+ :scope[data-ui-list-state~="markers=disc"] {
31
+ padding-inline-start: var(--ui-space-5);
32
+ }
33
+
34
+ :scope[data-ui-list-state~="as=ol"] {
35
+ list-style: decimal;
36
+ }
37
+
38
+ :scope[data-ui-list-state~="markers=disc"] {
39
+ list-style: disc;
40
+ }
41
+
26
42
  /* Compact passes its size to the items through private properties, which cross into each item. */
27
43
  :scope[data-ui-list-state~="density=compact"] {
44
+ --_list-gap: var(--ui-list-gap, var(--ui-space-2));
28
45
  --_ui-list-item-min-size: 0;
29
46
  --_ui-list-item-padding-block: 0;
30
47
  --_ui-list-item-padding-inline: 0;
31
48
  --_ui-list-item-title-weight: var(--ui-font-normal);
32
- gap: var(--ui-list-gap, var(--ui-space-2));
49
+ --_ui-list-native-padding-block: 0;
50
+ --_ui-list-native-padding-inline: 0;
33
51
  }
34
52
 
35
53
  :scope[data-ui-list-state~="layout=grid"] {
54
+ --_list-gap: var(--ui-list-gap, var(--ui-space-3));
36
55
  display: grid;
37
- grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--ui-list-min-item-width, 14rem)), 1fr));
38
- gap: var(--ui-list-gap, var(--ui-space-3));
56
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--_list-min-item-width)), 1fr));
39
57
  }
40
58
 
41
59
  /* A component that sets its display still honours the hidden attribute on its root. */
@@ -46,10 +64,27 @@
46
64
  @scope ([data-component~="ui-list"]) to ([data-component]) {
47
65
  /* This component's hooks style the element they are set on, and never a nested one. */
48
66
 
49
- /* A list of items (ui-list-item). It owns the spacing between them, so a view never sets it. The
67
+ /* A list of native li elements or structured ui-list-item components. It owns the spacing between them, so a view never sets it. The
50
68
  explicit list role keeps the list announced as one: some browsers drop it from a list with no
51
69
  markers. */
52
70
 
71
+ :scope > :where([data-slotted], [data-slotted] *):is(li) {
72
+ box-sizing: border-box;
73
+ min-inline-size: 0;
74
+ padding: var(--_ui-list-native-padding-block, var(--ui-space-2)) var(--_ui-list-native-padding-inline, var(--ui-space-3));
75
+ border-radius: var(--ui-radius-md);
76
+ color: var(--ui-text-primary);
77
+ list-style: inherit;
78
+ }
79
+
80
+ :scope > :where([data-slotted], [data-slotted] *):is(li.card) {
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);
83
+ border-radius: var(--ui-radius-lg);
84
+ background: var(--ui-surface-raised);
85
+ list-style: none;
86
+ }
87
+
53
88
  /* Compact passes its size to the items through private properties, which cross into each item. */
54
89
 
55
90
  /* A component that sets its display still honours the hidden attribute on its root. */
@@ -29,7 +29,7 @@
29
29
  :scope {
30
30
  display: flex;
31
31
  align-items: center;
32
- gap: var(--ui-space-5);
32
+ gap: var(--ui-space-2);
33
33
  box-sizing: border-box;
34
34
  width: 100%;
35
35
  padding: var(--ui-menu-item-padding-block, var(--_ui-default-menu-item-padding-block, var(--ui-space-2)))
@@ -52,16 +52,43 @@
52
52
 
53
53
  .indicator {
54
54
  display: inline-flex;
55
- place-items: center;
55
+ align-items: center;
56
+ justify-content: center;
56
57
  flex: none;
57
- inline-size: var(--ui-icon-size-md);
58
- color: var(--ui-accent-solid);
58
+ box-sizing: border-box;
59
+ inline-size: var(--ui-icon-size-sm);
60
+ block-size: var(--ui-icon-size-sm);
61
+ border: 1.5px solid var(--ui-control-border);
62
+ border-radius: var(--ui-radius-sm);
63
+ color: var(--ui-surface);
64
+ --_ui-default-icon-size: 0.75rem;
59
65
  }
60
66
 
61
67
  :scope[data-ui-menu-item-state~="type=action"] .indicator {
62
68
  display: none;
63
69
  }
64
70
 
71
+ :scope[data-ui-menu-item-state~="type=checkbox"][aria-checked="true"] .indicator {
72
+ border-color: var(--ui-accent);
73
+ background: var(--ui-accent);
74
+ }
75
+
76
+ :scope[data-ui-menu-item-state~="type=radio"] .indicator {
77
+ border-radius: var(--ui-radius-round);
78
+ }
79
+
80
+ :scope[data-ui-menu-item-state~="type=radio"][aria-checked="true"] .indicator {
81
+ border-color: var(--ui-accent);
82
+ }
83
+
84
+ :scope[data-ui-menu-item-state~="type=radio"][aria-checked="true"] .indicator::after {
85
+ content: "";
86
+ inline-size: 0.375rem;
87
+ block-size: 0.375rem;
88
+ border-radius: var(--ui-radius-round);
89
+ background: var(--ui-accent);
90
+ }
91
+
65
92
  .shortcut {
66
93
  margin-inline-start: auto;
67
94
  color: var(--ui-text-secondary);
@@ -92,10 +119,21 @@
92
119
  }
93
120
 
94
121
  :scope[aria-disabled="true"] {
95
- opacity: 0.6;
122
+ background: var(--ui-disabled-surface);
123
+ color: var(--ui-disabled-text);
96
124
  cursor: not-allowed;
97
125
  }
98
126
 
127
+ :scope[aria-disabled="true"] .indicator {
128
+ border-color: var(--ui-disabled-border);
129
+ background: transparent;
130
+ color: var(--ui-disabled-text);
131
+ }
132
+
133
+ :scope[aria-disabled="true"] .indicator::after {
134
+ background: var(--ui-disabled-text);
135
+ }
136
+
99
137
  @media (forced-colors: active) {
100
138
  :scope:focus-visible {
101
139
  outline-color: Highlight;
@@ -65,7 +65,7 @@
65
65
  max-inline-size: inherit;
66
66
  padding: var(--ui-space-1);
67
67
  background: var(--_ui-menu-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
68
- border: 1px solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-default)));
68
+ border: 1px solid var(--_ui-menu-border, var(--ui-overlay-border, var(--ui-border-strong)));
69
69
  border-radius: var(--_ui-menu-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
70
70
  box-shadow: var(--_ui-menu-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
71
71
  max-block-size: inherit;
@@ -77,10 +77,10 @@
77
77
  block-size: 0;
78
78
  margin: var(--ui-space-1) 0;
79
79
  border: 0;
80
- border-block-start: 1px solid var(--ui-border-default);
80
+ border-block-start: 1px solid var(--ui-border-divider);
81
81
  }
82
82
 
83
- :scope:not(:scope[data-ui-menu-state~="internalOpen"]) {
83
+ :scope:not(:scope[data-ui-menu-state~="internalOpen"]):not(:scope[data-ui-menu-state~="inline"]) {
84
84
  display: none;
85
85
  }
86
86
 
@@ -20,6 +20,7 @@
20
20
  overflow: hidden;
21
21
  border-radius: var(--ui-radius-round);
22
22
  background: var(--ui-border);
23
+ box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1), inset 0 -1px rgb(255 255 255 / 0.22);
23
24
  /* Unseen until forced colours draw it, where the track's own colour is gone. */
24
25
  outline: 1px solid transparent;
25
26
  }
@@ -32,7 +33,9 @@
32
33
  .fill {
33
34
  display: block;
34
35
  block-size: 100%;
35
- background: var(--_meter-fill);
36
+ background-color: var(--_meter-fill);
37
+ background-image: linear-gradient(to bottom, rgb(255 255 255 / 0.26), transparent 70%);
38
+ box-shadow: inset 0 1px rgb(255 255 255 / 0.26), inset 0 -1px rgb(0 0 0 / 0.1);
36
39
  }
37
40
 
38
41
  :scope[data-ui-meter-state~="tone=accent"] {
@@ -76,7 +76,6 @@
76
76
  inset-inline-start: 0;
77
77
  display: none;
78
78
  border-inline-start: var(--_indicator-width) solid var(--_indicator-color);
79
- border-radius: var(--ui-radius-round);
80
79
  }
81
80
 
82
81
  :scope[aria-current] .indicator {
@@ -6,6 +6,7 @@
6
6
  :scope {
7
7
  display: flex;
8
8
  flex-wrap: wrap;
9
+ inline-size: 100%;
9
10
  align-items: center;
10
11
  gap: var(--ui-space-3) var(--ui-space-4);
11
12
  min-inline-size: 0;
@@ -53,7 +53,7 @@
53
53
  overflow: auto;
54
54
  padding: var(--ui-space-3);
55
55
  background: var(--_ui-popover-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
56
- border: 1px solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-default)));
56
+ border: 1px solid var(--_ui-popover-border, var(--ui-overlay-border, var(--ui-border-strong)));
57
57
  border-radius: var(--_ui-popover-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
58
58
  box-shadow: var(--_ui-popover-shadow, var(--ui-overlay-shadow, var(--ui-elevation-overlay, var(--ui-shadow-lg))));
59
59
  }
@@ -49,7 +49,7 @@
49
49
  flex: 0 0 auto;
50
50
  inline-size: var(--_ui-radio-size, 1.125rem);
51
51
  block-size: var(--_ui-radio-size, 1.125rem);
52
- margin: 0.125em 0 0;
52
+ margin: calc(0.125em + 1px) 0 0;
53
53
  accent-color: var(--ui-accent-solid);
54
54
  cursor: pointer;
55
55
  }
@@ -63,6 +63,9 @@
63
63
  color: var(--ui-disabled-text);
64
64
  cursor: not-allowed;
65
65
  }
66
+ :scope[data-ui-radio-state~="disabled"] .description {
67
+ color: var(--ui-disabled-text);
68
+ }
66
69
  :scope[data-ui-radio-state~="disabled"] input {
67
70
  cursor: not-allowed;
68
71
  }
@@ -89,7 +92,7 @@
89
92
 
90
93
  :scope[data-ui-radio-state~="size=sm"] input,
91
94
  :scope[data-ui-radio-state~="size=lg"] input {
92
- margin-top: calc((var(--_line) - var(--_ui-radio-size, 1.125rem)) / 2);
95
+ margin-top: calc((var(--_line) - var(--_ui-radio-size, 1.125rem)) / 2 + 1px);
93
96
  }
94
97
 
95
98
  @media (pointer: coarse) {
@@ -1,9 +1,8 @@
1
1
  /* Generated by HTML Next 1.0.0-alpha.7. Do not edit. */
2
2
  @scope ([data-component~="ui-scroll-area"]) to ([data-component], [data-slotted]) {
3
- /* A region that scrolls when its content outgrows it. Each edge that hides content fades, growing
4
- in as the content leaves that edge (the scroll fade in tokens.css), so the reader can tell there
5
- is more; an edge with nothing past it stays crisp, and content that fits shows no fade. The
6
- fade is a mask, so it blends into whatever is behind the area without knowing its colour. */
3
+ /* The controller sets each fade length from overflow and scroll position. The mask blends
4
+ into whatever is behind the area without needing to know its colour. Before upgrade, its
5
+ zero-length defaults leave the authored scroll area fully visible. */
7
6
  :scope {
8
7
  display: block;
9
8
  box-sizing: border-box;
@@ -22,20 +21,16 @@
22
21
  #000 calc(100% - var(--_ui-scroll-fade-end)),
23
22
  transparent
24
23
  );
25
- animation: ui-scroll-fade-start linear, ui-scroll-fade-start-hold linear, ui-scroll-fade-end-hold linear, ui-scroll-fade-end linear;
26
- animation-timeline: scroll(self block);
27
- animation-range:
28
- 0 var(--_ui-scroll-fade-size),
29
- var(--_ui-scroll-fade-size) calc(100% + 1px),
30
- -1px calc(100% - var(--_ui-scroll-fade-size)),
31
- calc(100% - var(--_ui-scroll-fade-size)) 100%;
24
+ }
25
+
26
+ .content {
27
+ display: flow-root;
32
28
  }
33
29
 
34
30
  :scope[data-ui-scroll-area-state~="orientation=horizontal"] {
35
31
  overflow-x: auto;
36
32
  overflow-y: hidden;
37
33
  --_ui-scroll-fade-direction: var(--_ui-scroll-fade-inline);
38
- animation-timeline: scroll(self inline);
39
34
  }
40
35
 
41
36
  :scope:dir(rtl) {
@@ -48,10 +43,9 @@
48
43
  }
49
44
  }
50
45
  @scope ([data-component~="ui-scroll-area"]) to ([data-component]) {
51
- /* A region that scrolls when its content outgrows it. Each edge that hides content fades, growing
52
- in as the content leaves that edge (the scroll fade in tokens.css), so the reader can tell there
53
- is more; an edge with nothing past it stays crisp, and content that fits shows no fade. The
54
- fade is a mask, so it blends into whatever is behind the area without knowing its colour. */
46
+ /* The controller sets each fade length from overflow and scroll position. The mask blends
47
+ into whatever is behind the area without needing to know its colour. Before upgrade, its
48
+ zero-length defaults leave the authored scroll area fully visible. */
55
49
 
56
50
  /* A component that sets its display still honours the hidden attribute on its root. */
57
51
  }
@@ -46,7 +46,7 @@
46
46
  gap: var(--ui-search-result-row-gap, var(--ui-space-3));
47
47
  background: var(--ui-search-result-row-surface, transparent);
48
48
  border: none;
49
- border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border));
49
+ border-block-end: 1px solid var(--ui-search-result-row-border, var(--ui-border-divider));
50
50
  color: inherit;
51
51
  cursor: pointer;
52
52
  text-align: left;
@@ -74,7 +74,8 @@
74
74
  }
75
75
 
76
76
  :scope:disabled {
77
- opacity: 0.6;
77
+ background: var(--ui-disabled-surface);
78
+ color: var(--ui-disabled-text);
78
79
  cursor: not-allowed;
79
80
  }
80
81