@threadlabs/looma 0.6.4 → 0.7.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 (259) hide show
  1. package/components/ui-button/ui-button.html +103 -81
  2. package/components/ui-checkbox/ui-checkbox.html +4 -1
  3. package/components/ui-combobox/ui-combobox.html +40 -3
  4. package/components/ui-combobox/ui-combobox.js +27 -5
  5. package/components/ui-select/ui-select.html +3 -5
  6. package/dist/index.js +1 -1
  7. package/package.json +2 -2
  8. package/styles/ui-affordance-scope.css +1 -1
  9. package/styles/ui-avatar-group.css +1 -1
  10. package/styles/ui-avatar.css +1 -1
  11. package/styles/ui-badge.css +1 -1
  12. package/styles/ui-button.css +112 -80
  13. package/styles/ui-callout.css +1 -1
  14. package/styles/ui-checkbox.css +5 -2
  15. package/styles/ui-cluster.css +1 -1
  16. package/styles/ui-combobox.css +38 -1
  17. package/styles/ui-container.css +1 -1
  18. package/styles/ui-context-menu.css +1 -1
  19. package/styles/ui-dialog.css +1 -1
  20. package/styles/ui-disclosure.css +1 -1
  21. package/styles/ui-editable.css +1 -1
  22. package/styles/ui-editor-insert-table-grid.css +1 -1
  23. package/styles/ui-editor-mention-menu.css +1 -1
  24. package/styles/ui-editor-slash-menu.css +1 -1
  25. package/styles/ui-editor-table-context-menu.css +1 -1
  26. package/styles/ui-editor-table-overlay.css +1 -1
  27. package/styles/ui-editor-table-toolbar.css +1 -1
  28. package/styles/ui-editor-toolbar.css +1 -1
  29. package/styles/ui-floating-action-button.css +1 -1
  30. package/styles/ui-form-field.css +1 -1
  31. package/styles/ui-grid.css +1 -1
  32. package/styles/ui-icon-button.css +1 -1
  33. package/styles/ui-icon.css +1 -1
  34. package/styles/ui-input.css +1 -1
  35. package/styles/ui-menu-item.css +1 -1
  36. package/styles/ui-menu.css +1 -1
  37. package/styles/ui-popover.css +1 -1
  38. package/styles/ui-radio-group.css +1 -1
  39. package/styles/ui-radio.css +1 -1
  40. package/styles/ui-reel.css +1 -1
  41. package/styles/ui-search-result-row.css +1 -1
  42. package/styles/ui-search-shell.css +1 -1
  43. package/styles/ui-select.css +4 -5
  44. package/styles/ui-separator.css +1 -1
  45. package/styles/ui-sidebar.css +1 -1
  46. package/styles/ui-stack.css +1 -1
  47. package/styles/ui-switch.css +1 -1
  48. package/styles/ui-switcher.css +1 -1
  49. package/styles/ui-tabs.css +1 -1
  50. package/styles/ui-textarea.css +1 -1
  51. package/styles/ui-toast-region.css +1 -1
  52. package/styles/ui-tooltip.css +1 -1
  53. package/styles/ui-top-bar.css +1 -1
  54. package/styles/ui-tree-item.css +1 -1
  55. package/styles/ui-tree.css +1 -1
  56. package/theme-dark.css +6 -30
  57. package/theme-high-contrast.css +30 -20
  58. package/theme-light.css +2 -16
  59. package/tokens.css +33 -24
  60. package/vanilla/UiAffordanceScope.d.ts +1 -1
  61. package/vanilla/UiAffordanceScope.js +1 -1
  62. package/vanilla/UiAvatar.d.ts +1 -1
  63. package/vanilla/UiAvatar.js +1 -1
  64. package/vanilla/UiAvatarGroup.d.ts +1 -1
  65. package/vanilla/UiAvatarGroup.js +1 -1
  66. package/vanilla/UiBadge.d.ts +1 -1
  67. package/vanilla/UiBadge.js +1 -1
  68. package/vanilla/UiButton.d.ts +2 -2
  69. package/vanilla/UiButton.js +2 -2
  70. package/vanilla/UiCallout.d.ts +1 -1
  71. package/vanilla/UiCallout.js +1 -1
  72. package/vanilla/UiCheckbox.d.ts +1 -1
  73. package/vanilla/UiCheckbox.js +1 -1
  74. package/vanilla/UiCluster.d.ts +1 -1
  75. package/vanilla/UiCluster.js +1 -1
  76. package/vanilla/UiCombobox.d.ts +1 -1
  77. package/vanilla/UiCombobox.js +2 -2
  78. package/vanilla/UiContainer.d.ts +1 -1
  79. package/vanilla/UiContainer.js +1 -1
  80. package/vanilla/UiContextMenu.d.ts +1 -1
  81. package/vanilla/UiContextMenu.js +1 -1
  82. package/vanilla/UiDialog.d.ts +1 -1
  83. package/vanilla/UiDialog.js +1 -1
  84. package/vanilla/UiDisclosure.d.ts +1 -1
  85. package/vanilla/UiDisclosure.js +1 -1
  86. package/vanilla/UiEditable.d.ts +1 -1
  87. package/vanilla/UiEditable.js +1 -1
  88. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  89. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  90. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  91. package/vanilla/UiEditorMentionMenu.js +1 -1
  92. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  93. package/vanilla/UiEditorSlashMenu.js +1 -1
  94. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  95. package/vanilla/UiEditorTableContextMenu.js +1 -1
  96. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  97. package/vanilla/UiEditorTableOverlay.js +1 -1
  98. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  99. package/vanilla/UiEditorTableToolbar.js +1 -1
  100. package/vanilla/UiEditorToolbar.d.ts +1 -1
  101. package/vanilla/UiEditorToolbar.js +1 -1
  102. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  103. package/vanilla/UiFloatingActionButton.js +1 -1
  104. package/vanilla/UiFormField.d.ts +1 -1
  105. package/vanilla/UiFormField.js +1 -1
  106. package/vanilla/UiGrid.d.ts +1 -1
  107. package/vanilla/UiGrid.js +1 -1
  108. package/vanilla/UiIcon.d.ts +1 -1
  109. package/vanilla/UiIcon.js +1 -1
  110. package/vanilla/UiIconButton.d.ts +1 -1
  111. package/vanilla/UiIconButton.js +1 -1
  112. package/vanilla/UiInput.d.ts +1 -1
  113. package/vanilla/UiInput.js +1 -1
  114. package/vanilla/UiMenu.d.ts +1 -1
  115. package/vanilla/UiMenu.js +1 -1
  116. package/vanilla/UiMenuItem.d.ts +1 -1
  117. package/vanilla/UiMenuItem.js +1 -1
  118. package/vanilla/UiPopover.d.ts +1 -1
  119. package/vanilla/UiPopover.js +1 -1
  120. package/vanilla/UiRadio.d.ts +1 -1
  121. package/vanilla/UiRadio.js +1 -1
  122. package/vanilla/UiRadioGroup.d.ts +1 -1
  123. package/vanilla/UiRadioGroup.js +1 -1
  124. package/vanilla/UiReel.d.ts +1 -1
  125. package/vanilla/UiReel.js +1 -1
  126. package/vanilla/UiSearchResultRow.d.ts +1 -1
  127. package/vanilla/UiSearchResultRow.js +1 -1
  128. package/vanilla/UiSearchShell.d.ts +1 -1
  129. package/vanilla/UiSearchShell.js +1 -1
  130. package/vanilla/UiSelect.d.ts +1 -2
  131. package/vanilla/UiSelect.js +4 -7
  132. package/vanilla/UiSeparator.d.ts +1 -1
  133. package/vanilla/UiSeparator.js +1 -1
  134. package/vanilla/UiSidebar.d.ts +1 -1
  135. package/vanilla/UiSidebar.js +1 -1
  136. package/vanilla/UiStack.d.ts +1 -1
  137. package/vanilla/UiStack.js +1 -1
  138. package/vanilla/UiSwitch.d.ts +1 -1
  139. package/vanilla/UiSwitch.js +1 -1
  140. package/vanilla/UiSwitcher.d.ts +1 -1
  141. package/vanilla/UiSwitcher.js +1 -1
  142. package/vanilla/UiTabs.d.ts +1 -1
  143. package/vanilla/UiTabs.js +1 -1
  144. package/vanilla/UiTextarea.d.ts +1 -1
  145. package/vanilla/UiTextarea.js +1 -1
  146. package/vanilla/UiToastRegion.d.ts +1 -1
  147. package/vanilla/UiToastRegion.js +1 -1
  148. package/vanilla/UiTooltip.d.ts +1 -1
  149. package/vanilla/UiTooltip.js +1 -1
  150. package/vanilla/UiTopBar.d.ts +1 -1
  151. package/vanilla/UiTopBar.js +1 -1
  152. package/vanilla/UiTree.d.ts +1 -1
  153. package/vanilla/UiTree.js +1 -1
  154. package/vanilla/UiTreeItem.d.ts +1 -1
  155. package/vanilla/UiTreeItem.js +1 -1
  156. package/vue/UiAffordanceScope.vue +8 -84
  157. package/vue/UiAvatar.d.ts +1 -1
  158. package/vue/UiAvatar.vue +9 -106
  159. package/vue/UiAvatarGroup.vue +9 -96
  160. package/vue/UiBadge.vue +1 -1
  161. package/vue/UiButton.d.ts +2 -2
  162. package/vue/UiButton.vue +104 -97
  163. package/vue/UiCallout.vue +1 -1
  164. package/vue/UiCheckbox.vue +26 -124
  165. package/vue/UiCluster.vue +1 -1
  166. package/vue/UiCombobox.d.ts +1 -1
  167. package/vue/UiCombobox.vue +270 -479
  168. package/vue/UiContainer.vue +1 -1
  169. package/vue/UiContextMenu.vue +34 -141
  170. package/vue/UiDialog.vue +25 -126
  171. package/vue/UiDisclosure.vue +26 -138
  172. package/vue/UiEditable.vue +46 -158
  173. package/vue/UiEditorInsertTableGrid.vue +19 -138
  174. package/vue/UiEditorMentionMenu.vue +17 -124
  175. package/vue/UiEditorSlashMenu.vue +17 -109
  176. package/vue/UiEditorTableContextMenu.vue +34 -122
  177. package/vue/UiEditorTableOverlay.vue +61 -167
  178. package/vue/UiEditorTableToolbar.vue +34 -142
  179. package/vue/UiEditorToolbar.vue +1 -1
  180. package/vue/UiFloatingActionButton.vue +1 -1
  181. package/vue/UiFormField.vue +7 -79
  182. package/vue/UiGrid.vue +1 -1
  183. package/vue/UiIcon.vue +8 -84
  184. package/vue/UiIconButton.vue +7 -79
  185. package/vue/UiInput.vue +7 -79
  186. package/vue/UiMenu.vue +42 -127
  187. package/vue/UiMenuItem.vue +1 -1
  188. package/vue/UiPopover.vue +25 -121
  189. package/vue/UiRadio.vue +22 -123
  190. package/vue/UiRadioGroup.d.ts +1 -1
  191. package/vue/UiRadioGroup.vue +32 -119
  192. package/vue/UiReel.vue +1 -1
  193. package/vue/UiSearchResultRow.vue +1 -1
  194. package/vue/UiSearchShell.vue +25 -121
  195. package/vue/UiSelect.d.ts +0 -2
  196. package/vue/UiSelect.vue +9 -85
  197. package/vue/UiSeparator.vue +1 -1
  198. package/vue/UiSidebar.vue +32 -133
  199. package/vue/UiStack.vue +1 -1
  200. package/vue/UiSwitch.vue +22 -123
  201. package/vue/UiSwitcher.vue +1 -1
  202. package/vue/UiTabs.vue +24 -128
  203. package/vue/UiTextarea.vue +7 -79
  204. package/vue/UiToastRegion.vue +37 -126
  205. package/vue/UiTooltip.vue +25 -124
  206. package/vue/UiTopBar.vue +1 -1
  207. package/vue/UiTree.vue +56 -137
  208. package/vue/UiTreeItem.vue +28 -144
  209. package/vue/chunks/UiAffordanceScope.js +9 -78
  210. package/vue/chunks/UiAvatar.js +13 -89
  211. package/vue/chunks/UiAvatarGroup.js +10 -80
  212. package/vue/chunks/UiBadge.js +1 -1
  213. package/vue/chunks/UiButton.js +3 -3
  214. package/vue/chunks/UiCallout.js +1 -1
  215. package/vue/chunks/UiCheckbox.js +17 -95
  216. package/vue/chunks/UiCluster.js +1 -1
  217. package/vue/chunks/UiCombobox.js +115 -326
  218. package/vue/chunks/UiContainer.js +1 -1
  219. package/vue/chunks/UiContextMenu.js +21 -113
  220. package/vue/chunks/UiDialog.js +20 -99
  221. package/vue/chunks/UiDisclosure.js +22 -112
  222. package/vue/chunks/UiEditable.js +32 -128
  223. package/vue/chunks/UiEditorInsertTableGrid.js +22 -116
  224. package/vue/chunks/UiEditorMentionMenu.js +18 -116
  225. package/vue/chunks/UiEditorSlashMenu.js +15 -101
  226. package/vue/chunks/UiEditorTableContextMenu.js +12 -91
  227. package/vue/chunks/UiEditorTableOverlay.js +29 -120
  228. package/vue/chunks/UiEditorTableToolbar.js +16 -111
  229. package/vue/chunks/UiEditorToolbar.js +1 -1
  230. package/vue/chunks/UiFloatingActionButton.js +1 -1
  231. package/vue/chunks/UiFormField.js +8 -73
  232. package/vue/chunks/UiGrid.js +1 -1
  233. package/vue/chunks/UiIcon.js +9 -78
  234. package/vue/chunks/UiIconButton.js +8 -73
  235. package/vue/chunks/UiInput.js +8 -73
  236. package/vue/chunks/UiMenu.js +25 -111
  237. package/vue/chunks/UiMenuItem.js +1 -1
  238. package/vue/chunks/UiPopover.js +18 -105
  239. package/vue/chunks/UiRadio.js +17 -95
  240. package/vue/chunks/UiRadioGroup.js +23 -105
  241. package/vue/chunks/UiReel.js +1 -1
  242. package/vue/chunks/UiSearchResultRow.js +1 -1
  243. package/vue/chunks/UiSearchShell.js +17 -94
  244. package/vue/chunks/UiSelect.js +8 -79
  245. package/vue/chunks/UiSeparator.js +1 -1
  246. package/vue/chunks/UiSidebar.js +23 -108
  247. package/vue/chunks/UiStack.js +1 -1
  248. package/vue/chunks/UiSwitch.js +17 -95
  249. package/vue/chunks/UiSwitcher.js +1 -1
  250. package/vue/chunks/UiTabs.js +22 -103
  251. package/vue/chunks/UiTextarea.js +8 -73
  252. package/vue/chunks/UiToastRegion.js +27 -112
  253. package/vue/chunks/UiTooltip.js +18 -106
  254. package/vue/chunks/UiTopBar.js +1 -1
  255. package/vue/chunks/UiTree.js +31 -109
  256. package/vue/chunks/UiTreeItem.js +29 -119
  257. package/vue/chunks/host.js +101 -0
  258. package/vue/components.css +844 -797
  259. package/vue/host.ts +154 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.6.4",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -77,7 +77,7 @@
77
77
  "./*.css"
78
78
  ],
79
79
  "dependencies": {
80
- "@nextwebwg/html-next": "^1.0.0-alpha.2",
80
+ "@nextwebwg/html-next": "^1.0.0-alpha.3",
81
81
  "lowlight": "^3.3.0",
82
82
  "markdown-it": "14.3.1",
83
83
  "lucide": "~0.554.0"
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-affordance-scope"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: contents;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-avatar-group"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  /* Avatars separate with a tight, crisp edge, matching Looma's 1px borders rather than the
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-avatar"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-grid;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-badge"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_badge-surface: var(--ui-surface-subtle);
@@ -1,15 +1,23 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-button"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
+ --_hue: var(--ui-accent);
5
+ --_hue-hover: var(--ui-accent-hover);
6
+ --_hue-active: var(--ui-accent-active);
7
+ --_hue-text: var(--ui-accent-active);
8
+ --_on-hue: var(--ui-on-accent);
9
+
10
+ --_tone: var(--_hue);
11
+ --_tone-hover: var(--_hue-hover);
12
+ --_tone-active: var(--_hue-active);
13
+ --_tone-text: var(--_hue-text);
14
+ --_on-tone: var(--_on-hue);
15
+
4
16
  display: inline-flex;
5
17
  align-items: center;
6
18
  justify-content: center;
7
19
  vertical-align: middle;
8
- color: var(--ui-action-secondary-text, var(--ui-text-primary));
9
- }
10
-
11
- :scope[data-ui-button-state~="variant=solid"] {
12
- color: var(--ui-action-primary-text, var(--ui-text-on-accent));
20
+ color: var(--_tone-text);
13
21
  }
14
22
 
15
23
  :scope[data-ui-button-state~="align=start"] {
@@ -25,23 +33,24 @@
25
33
  :scope {
26
34
  appearance: none;
27
35
  min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
28
- border: 1px solid var(--ui-button-border, var(--ui-border-strong));
36
+ border-style: solid;
37
+ border-width: 1px;
38
+ border-color: var(--ui-button-border, var(--_tone));
29
39
  border-radius: var(--ui-button-radius, var(--ui-radius-md));
30
- background: var(--ui-button-surface, var(--ui-surface-elevated));
31
- color: var(--ui-button-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
40
+ background-color: var(--ui-button-surface, oklch(from var(--_tone) l c h / 5%));
41
+ color: var(--ui-button-text, var(--_tone-text));
32
42
  font: inherit;
33
43
  font-weight: var(--ui-font-medium);
34
44
  line-height: var(--ui-line-height-tight);
35
45
  padding: var(--ui-space-2) var(--ui-space-3);
36
46
  background-image: var(--ui-raised-highlight);
37
- box-shadow: var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs)));
47
+ box-shadow: var(--ui-button-shadow, var(--ui-raised));
38
48
  cursor: pointer;
39
49
  transition:
40
50
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
41
51
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
42
52
  color var(--ui-motion-fast) var(--ui-motion-ease),
43
- box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
44
- transform var(--ui-motion-fast) var(--ui-motion-ease);
53
+ box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
45
54
  margin: 0;
46
55
  }
47
56
 
@@ -65,128 +74,141 @@
65
74
  }
66
75
 
67
76
  :scope:hover:enabled {
68
- background: var(--ui-action-secondary-surface-hover, var(--ui-surface-muted));
69
- border-color: var(--ui-control-border-hover, var(--ui-border-strong));
77
+ border-color: var(--ui-button-hover-border, var(--_tone-hover));
78
+ background-color: var(--ui-button-hover-surface, oklch(from var(--_tone) l c h / 12%));
70
79
  }
71
80
 
81
+ /* Pressed reads as pressed in: the highlight goes, and the shadow moves inside. */
72
82
  :scope:active:enabled {
73
- background: var(--ui-surface-subtle);
74
- }
75
-
76
- :scope[data-ui-button-state~="variant=solid"] {
77
- border-color: var(--ui-action-primary-surface, var(--ui-accent-solid));
78
- background: var(--ui-action-primary-surface, var(--ui-accent-solid));
79
- color: var(--ui-action-primary-text, var(--ui-text-on-accent));
80
- box-shadow: var(--ui-button-solid-shadow, inset 0 1px rgb(255 255 255 / 0.16), var(--ui-shadow-xs));
83
+ background-color: var(--ui-button-active-surface, oklch(from var(--_tone) l c h / 18%));
84
+ background-image: none;
85
+ box-shadow: var(--ui-pressed);
81
86
  }
82
87
 
83
- :scope[data-ui-button-state~="variant=solid"]:hover:enabled {
84
- background: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
85
- border-color: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
86
- box-shadow: var(--ui-shadow-sm);
87
- transform: translateY(-1px);
88
+ :scope[data-ui-button-state~="variant=solid"], :scope[data-ui-button-state~="variant=danger"] {
89
+ border-color: var(--_tone);
90
+ background-color: var(--_tone);
91
+ color: var(--_on-tone);
92
+ box-shadow: var(--ui-button-solid-shadow, var(--ui-raised));
88
93
  }
89
94
 
90
- :scope[data-ui-button-state~="variant=solid"]:active:enabled {
91
- background: var(--ui-action-primary-surface-active, var(--ui-accent-active));
92
- border-color: var(--ui-action-primary-surface-active, var(--ui-accent-active));
93
- box-shadow: none;
94
- transform: translateY(0);
95
+ :is(:scope[data-ui-button-state~="variant=solid"], :scope[data-ui-button-state~="variant=danger"]):hover:enabled {
96
+ background-color: var(--_tone-hover);
97
+ border-color: var(--_tone-hover);
95
98
  }
96
99
 
97
- :scope[data-ui-button-state~="variant=danger"] {
98
- border-color: var(--ui-danger-solid);
99
- background: var(--ui-danger-solid);
100
- color: var(--ui-text-on-accent);
101
- box-shadow: var(--ui-button-danger-shadow, inset 0 1px rgb(255 255 255 / 0.14), var(--ui-shadow-xs));
100
+ :is(:scope[data-ui-button-state~="variant=solid"], :scope[data-ui-button-state~="variant=danger"]):active:enabled {
101
+ background-color: var(--_tone-active);
102
+ border-color: var(--_tone-active);
103
+ background-image: none;
104
+ box-shadow: var(--ui-pressed);
102
105
  }
103
106
 
104
- :scope[data-ui-button-state~="variant=danger"]:hover:enabled {
105
- background: var(--ui-danger-hover);
106
- border-color: var(--ui-danger-hover);
107
- box-shadow: var(--ui-shadow-sm);
108
- transform: translateY(-1px);
107
+ /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
108
+ destructive secondary action, not a special case. */
109
+ :scope[data-ui-button-state~="tone=neutral"] {
110
+ --_hue: var(--ui-text);
111
+ --_hue-hover: var(--ui-text);
112
+ --_hue-active: var(--ui-text);
113
+ --_hue-text: var(--ui-text);
114
+ --_on-hue: var(--ui-surface);
109
115
  }
110
116
 
111
- :scope[data-ui-button-state~="variant=danger"]:active:enabled {
112
- box-shadow: none;
113
- transform: translateY(0);
117
+ :scope[data-ui-button-state~="tone=danger"], :scope[data-ui-button-state~="variant=danger"] {
118
+ --_hue: var(--ui-danger);
119
+ --_hue-hover: var(--ui-danger-hover);
120
+ --_hue-active: var(--ui-danger-hover);
121
+ --_hue-text: var(--ui-danger-hover);
122
+ --_on-hue: var(--ui-on-danger);
114
123
  }
115
124
 
116
- /* An accent-tinted secondary action: the outline, ghost, and link variants in the accent colour.
117
- Solid and danger already carry their own intent. */
118
- :scope[data-ui-button-state~="tone=accent"]:scope[data-ui-button-state~="variant=outline"] {
119
- border-color: var(--ui-button-accent-border, var(--ui-accent));
120
- background: var(--ui-button-accent-surface, var(--ui-accent-subtle));
121
- color: var(--ui-button-accent-text, var(--ui-accent-active));
125
+ :scope[data-ui-button-state~="tone=success"] {
126
+ --_hue: var(--ui-success);
127
+ --_hue-hover: color-mix(in srgb, var(--ui-success) 85%, #000);
128
+ --_hue-active: color-mix(in srgb, var(--ui-success) 75%, #000);
129
+ --_hue-text: color-mix(in srgb, var(--ui-success) 85%, #000);
130
+ --_on-hue: var(--ui-surface);
122
131
  }
123
132
 
124
- :scope[data-ui-button-state~="tone=accent"]:scope[data-ui-button-state~="variant=outline"]:hover:enabled {
125
- border-color: var(--ui-button-accent-hover-border, var(--ui-accent-hover));
126
- background: var(--ui-button-accent-hover-surface, color-mix(in srgb, var(--ui-accent) 16%, var(--ui-surface)));
133
+ :scope[data-ui-button-state~="tone=warning"] {
134
+ --_hue: var(--ui-warning);
135
+ --_hue-hover: color-mix(in srgb, var(--ui-warning) 85%, #000);
136
+ --_hue-active: color-mix(in srgb, var(--ui-warning) 75%, #000);
137
+ --_hue-text: color-mix(in srgb, var(--ui-warning) 85%, #000);
138
+ --_on-hue: var(--ui-surface);
127
139
  }
128
140
 
129
- :scope[data-ui-button-state~="tone=accent"]:is(:scope[data-ui-button-state~="variant=ghost"], :scope[data-ui-button-state~="variant=link"]) {
130
- color: var(--ui-button-accent-text, var(--ui-accent-active));
141
+ :scope[data-ui-button-state~="tone=info"] {
142
+ --_hue: var(--ui-info);
143
+ --_hue-hover: color-mix(in srgb, var(--ui-info) 85%, #000);
144
+ --_hue-active: color-mix(in srgb, var(--ui-info) 75%, #000);
145
+ --_hue-text: color-mix(in srgb, var(--ui-info) 85%, #000);
146
+ --_on-hue: var(--ui-surface);
131
147
  }
132
148
 
133
149
  :scope[data-ui-button-state~="variant=ghost"] {
134
150
  border-color: transparent;
135
151
  background: transparent;
136
152
  box-shadow: none;
137
- color: var(--ui-button-ghost-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
153
+ color: var(--ui-button-ghost-text, var(--_tone-text));
138
154
  }
139
155
 
140
156
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
141
157
  :scope[data-ui-button-state~="variant=ghost"]:hover:enabled {
142
- background: var(--ui-button-ghost-hover-surface, color-mix(in srgb, currentColor 8%, transparent));
158
+ background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / 10%));
143
159
  border-color: transparent;
144
160
  }
145
161
 
146
162
  :scope[data-ui-button-state~="variant=ghost"]:active:enabled {
147
- background: var(--ui-button-ghost-active-surface, color-mix(in srgb, currentColor 14%, transparent));
163
+ background-color: var(--ui-button-ghost-active-surface, oklch(from var(--_tone) l c h / 16%));
148
164
  border-color: transparent;
165
+ box-shadow: var(--ui-pressed);
149
166
  }
150
167
 
151
168
  /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
152
169
  :scope:focus-visible {
153
170
  outline: none;
154
171
  box-shadow:
155
- var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs))),
172
+ var(--ui-button-shadow, var(--ui-raised)),
156
173
  var(--ui-focus-halo);
157
174
  }
158
175
 
159
176
  :scope[data-ui-button-state~="variant=solid"]:focus-visible {
160
177
  box-shadow:
161
- var(--ui-button-solid-shadow, inset 0 1px rgb(255 255 255 / 0.16), var(--ui-shadow-xs)),
178
+ var(--ui-button-solid-shadow, var(--ui-raised)),
162
179
  var(--ui-focus-halo);
163
180
  }
164
181
 
165
- /* Disabled colours fall back to each variant's own; ghost and link take only the text colour. */
182
+ /* Disabled drops the tone rather than the shape: every variant keeps its own structure, so a
183
+ disabled outline is still an outline and a disabled ghost is still text. Intent goes — an
184
+ unavailable action says "unavailable", not "unavailable, and destructive" — and so do the
185
+ highlight and shadow, because nothing that cannot be pressed should look raised. */
166
186
  :scope:disabled {
187
+ /* Derived from the tone itself, not from a separate disabled palette: faded toward the
188
+ page, which desaturates it at the same time. Toward the page rather than toward white,
189
+ so a dark theme dims where a light one lightens — the same rule, both schemes. */
190
+ --_tone: color-mix(in oklab, var(--_hue) 58%, var(--ui-surface));
191
+ --_tone-hover: var(--_tone);
192
+ --_tone-active: var(--_tone);
193
+ --_tone-text: color-mix(in oklab, var(--_hue-text) 72%, var(--ui-surface));
194
+ --_on-tone: var(--_tone-text);
195
+
167
196
  opacity: var(--ui-button-disabled-opacity, 1);
168
197
  cursor: not-allowed;
169
- border-color: var(--ui-button-disabled-border, var(--ui-border));
170
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
171
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
172
- }
173
-
174
- :scope[data-ui-button-state~="variant=solid"]:disabled {
175
- border-color: var(--ui-button-disabled-border, var(--ui-border));
176
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
177
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
198
+ background-image: none;
199
+ box-shadow: none;
178
200
  }
179
201
 
180
- :scope[data-ui-button-state~="variant=danger"]:disabled {
181
- border-color: var(--ui-button-disabled-border, var(--ui-border));
182
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
183
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
202
+ /* A filled button keeps its fill, faded further so its text stays legible on it. */
203
+ :is(:scope[data-ui-button-state~="variant=solid"], :scope[data-ui-button-state~="variant=danger"]):disabled {
204
+ --_tone: color-mix(in oklab, var(--_hue) 34%, var(--ui-surface));
184
205
  }
185
206
 
207
+ /* Ghost has no hover to fall back on, so disabled is the one state it has to state outright:
208
+ it takes a surface, light and tinted, rather than reading as plain text. */
186
209
  :scope[data-ui-button-state~="variant=ghost"]:disabled {
187
- background: none;
210
+ background-color: color-mix(in oklab, var(--_hue) 28%, var(--ui-surface));
188
211
  border-color: transparent;
189
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
190
212
  }
191
213
 
192
214
  @media (pointer: coarse) {
@@ -248,14 +270,24 @@
248
270
  @supports (text-box-trim: trim-both) {
249
271
  }
250
272
 
251
- /* An accent-tinted secondary action: the outline, ghost, and link variants in the accent colour.
252
- Solid and danger already carry their own intent. */
273
+ /* Pressed reads as pressed in: the highlight goes, and the shadow moves inside. */
274
+
275
+ /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
276
+ destructive secondary action, not a special case. */
253
277
 
254
278
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
255
279
 
256
280
  /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
257
281
 
258
- /* Disabled colours fall back to each variant's own; ghost and link take only the text colour. */
282
+ /* Disabled drops the tone rather than the shape: every variant keeps its own structure, so a
283
+ disabled outline is still an outline and a disabled ghost is still text. Intent goes — an
284
+ unavailable action says "unavailable", not "unavailable, and destructive" — and so do the
285
+ highlight and shadow, because nothing that cannot be pressed should look raised. */
286
+
287
+ /* A filled button keeps its fill, faded further so its text stays legible on it. */
288
+
289
+ /* Ghost has no hover to fall back on, so disabled is the one state it has to state outright:
290
+ it takes a surface, light and tinted, rather than reading as plain text. */
259
291
 
260
292
  @media (pointer: coarse) {
261
293
  }
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-callout"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_callout-surface: var(--ui-info-soft);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-checkbox"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-flex;
@@ -52,7 +52,10 @@
52
52
  margin: auto;
53
53
  inline-size: 0.32rem;
54
54
  block-size: 0.58rem;
55
- border: solid var(--ui-text-on-accent);
55
+ /* Longhands, not `border: solid var(...)`: lowering drops a shorthand that omits a
56
+ component, which left the tick with no style and no colour. */
57
+ border-style: solid;
58
+ border-color: var(--ui-text-on-accent);
56
59
  border-width: 0 0.125rem 0.125rem 0;
57
60
  opacity: 1;
58
61
  transform: translateY(-0.11rem) rotate(45deg);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-cluster"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_layout-gap: var(--ui-space-3);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-combobox"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: grid;
@@ -208,6 +208,39 @@
208
208
  }
209
209
  }
210
210
 
211
+ /* Multiple mode: every option carries a checkbox, so a list that takes several answers says so
212
+ before anything is picked. aria-selected is the state; this draws it.
213
+ Longhands, not shorthands: lowering drops a shorthand that omits a component. */
214
+ :scope[data-ui-combobox-state~="multiple"] .option {
215
+ display: flex;
216
+ gap: var(--ui-space-2);
217
+ align-items: center;
218
+ }
219
+
220
+ :scope[data-ui-combobox-state~="multiple"] .option::before {
221
+ content: "";
222
+ flex: none;
223
+ inline-size: 1.125rem;
224
+ block-size: 1.125rem;
225
+ border-style: solid;
226
+ border-width: 1px;
227
+ border-color: var(--ui-control-border-hover, var(--ui-border-strong));
228
+ border-radius: var(--ui-radius-sm);
229
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
230
+ background-repeat: no-repeat;
231
+ background-position: center;
232
+ background-size: 0.7rem;
233
+ }
234
+
235
+ :scope[data-ui-combobox-state~="multiple"] .option[aria-selected="true"]::before {
236
+ border-color: var(--ui-accent-solid);
237
+ background-color: var(--ui-accent-solid);
238
+ background-image: var(
239
+ --ui-combobox-option-check,
240
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 5 5 9-9'/%3E%3C/svg%3E")
241
+ );
242
+ }
243
+
211
244
  /* Multiple mode: chips wrap before the cursor on one flexible field line. */
212
245
  :scope[data-ui-combobox-state~="multiple"] .field {
213
246
  flex-wrap: wrap;
@@ -258,6 +291,10 @@
258
291
  @media (forced-colors: active) {
259
292
  }
260
293
 
294
+ /* Multiple mode: every option carries a checkbox, so a list that takes several answers says so
295
+ before anything is picked. aria-selected is the state; this draws it.
296
+ Longhands, not shorthands: lowering drops a shorthand that omits a component. */
297
+
261
298
  /* Multiple mode: chips wrap before the cursor on one flexible field line. */
262
299
 
263
300
  /* A component that sets its display still honours the hidden attribute on its root. */
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-container"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_container-measure: 65ch;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-context-menu"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: contents;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @keyframes ui-dialog-enter {
3
3
  from {
4
4
  opacity: 0;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-disclosure"]) to ([data-component], [data-slotted]) {
3
3
  /* Density resolves into the summary row's own values; the public tokens still override them. */
4
4
  :scope {
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editable"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: flex;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-insert-table-grid"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  padding: var(--ui-space-3);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-mention-menu"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  user-select: none;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-slash-menu"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  user-select: none;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-table-context-menu"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  min-width: 14rem;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-table-overlay"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: block;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-table-toolbar"]) to ([data-component], [data-slotted]) {
3
3
  .looma-editor__mobile-toolbar-shell :scope {
4
4
  min-width: max-content;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-editor-toolbar"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  position: sticky;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-floating-action-button"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  position: fixed;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-form-field"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: grid;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-grid"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_grid-gap: var(--ui-space-4);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-icon-button"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-flex;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-icon"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-flex;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-input"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  box-sizing: border-box;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-menu-item"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: block;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-menu"]) to ([data-component], [data-slotted]) {
3
3
  /* Compact sets the part tokens its items read, so nothing has to rescale a global. */
4
4
  :scope[data-ui-menu-state~="density=compact"] {
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-popover"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  box-sizing: border-box;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-radio-group"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-flex;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-radio"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: inline-flex;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-reel"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  --_reel-gap: var(--ui-space-4);
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-search-result-row"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  appearance: none;
@@ -1,4 +1,4 @@
1
- /* Generated by HTML Next 1.0.0-alpha.2. Do not edit. */
1
+ /* Generated by HTML Next 1.0.0-alpha.3. Do not edit. */
2
2
  @scope ([data-component~="ui-search-shell"]) to ([data-component], [data-slotted]) {
3
3
  :scope {
4
4
  display: contents;