@threadlabs/looma 0.17.0 → 0.17.2

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 (229) 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 +12 -2
  58. package/editor/extensions/preset.d.ts +6 -1
  59. package/package.json +1 -1
  60. package/styles/ui-avatar-group.css +8 -5
  61. package/styles/ui-badge.css +10 -5
  62. package/styles/ui-breadcrumb-item.css +2 -1
  63. package/styles/ui-button.css +19 -25
  64. package/styles/ui-callout.css +3 -1
  65. package/styles/ui-card.css +4 -2
  66. package/styles/ui-checkbox.css +38 -8
  67. package/styles/ui-combobox.css +27 -8
  68. package/styles/ui-context-menu.css +2 -2
  69. package/styles/ui-description-item.css +1 -1
  70. package/styles/ui-description-list.css +2 -0
  71. package/styles/ui-dialog.css +1 -22
  72. package/styles/ui-disclosure.css +2 -2
  73. package/styles/ui-editor-insert-table-grid.css +2 -2
  74. package/styles/ui-editor-mention-menu.css +3 -3
  75. package/styles/ui-editor-slash-menu-item.css +6 -1
  76. package/styles/ui-editor-slash-menu.css +4 -4
  77. package/styles/ui-editor-table-context-menu.css +2 -2
  78. package/styles/ui-editor-table-toolbar.css +4 -4
  79. package/styles/ui-editor-toolbar.css +5 -5
  80. package/styles/ui-floating-action-button.css +3 -1
  81. package/styles/ui-icon-button.css +53 -18
  82. package/styles/ui-list-item.css +1 -1
  83. package/styles/ui-list.css +41 -6
  84. package/styles/ui-menu-item.css +43 -5
  85. package/styles/ui-menu.css +3 -3
  86. package/styles/ui-meter.css +4 -1
  87. package/styles/ui-nav-item.css +0 -1
  88. package/styles/ui-page-header.css +1 -0
  89. package/styles/ui-popover.css +1 -1
  90. package/styles/ui-radio.css +5 -2
  91. package/styles/ui-scroll-area.css +10 -16
  92. package/styles/ui-search-result-row.css +3 -2
  93. package/styles/ui-search-shell.css +7 -7
  94. package/styles/ui-section.css +5 -3
  95. package/styles/ui-separator.css +2 -2
  96. package/styles/ui-sidebar.css +2 -2
  97. package/styles/ui-spinner.css +27 -6
  98. package/styles/ui-status-message.css +1 -1
  99. package/styles/ui-switch.css +17 -8
  100. package/styles/ui-table.css +1 -1
  101. package/styles/ui-tabs.css +60 -51
  102. package/styles/ui-toast-region.css +1 -1
  103. package/styles/ui-toast.css +1 -1
  104. package/styles/ui-tooltip.css +12 -12
  105. package/styles/ui-top-bar.css +1 -1
  106. package/styles/ui-tree-item.css +2 -1
  107. package/theme-dark.css +4 -4
  108. package/theme-light.css +3 -3
  109. package/tokens.css +9 -6
  110. package/vanilla/UiButton.d.ts +1 -0
  111. package/vanilla/UiButton.js +17 -19
  112. package/vanilla/UiCombobox.js +162 -159
  113. package/vanilla/UiDialog.js +2 -2
  114. package/vanilla/UiIconButton.d.ts +1 -0
  115. package/vanilla/UiIconButton.js +1 -4
  116. package/vanilla/UiList.d.ts +3 -1
  117. package/vanilla/UiList.js +36 -19
  118. package/vanilla/UiMenu.d.ts +1 -0
  119. package/vanilla/UiMenu.js +1 -1
  120. package/vanilla/UiMenuItem.js +10 -13
  121. package/vanilla/UiScrollArea.js +11 -6
  122. package/vanilla/UiSearchShell.js +2 -2
  123. package/vanilla/UiSpinner.js +2 -4
  124. package/vue/UiAvatarGroup.vue +8 -5
  125. package/vue/UiBadge.vue +10 -5
  126. package/vue/UiBreadcrumbItem.vue +2 -1
  127. package/vue/UiButton.d.ts +2 -0
  128. package/vue/UiButton.vue +31 -28
  129. package/vue/UiCallout.vue +3 -2
  130. package/vue/UiCard.vue +4 -2
  131. package/vue/UiCheckbox.vue +36 -8
  132. package/vue/UiCombobox.d.ts +1 -1
  133. package/vue/UiCombobox.vue +55 -35
  134. package/vue/UiContextMenu.vue +2 -2
  135. package/vue/UiDescriptionItem.vue +1 -1
  136. package/vue/UiDescriptionList.vue +2 -0
  137. package/vue/UiDialog.d.ts +3 -3
  138. package/vue/UiDialog.vue +3 -27
  139. package/vue/UiDisclosure.vue +2 -2
  140. package/vue/UiEditorInsertTableGrid.vue +2 -2
  141. package/vue/UiEditorMentionMenu.d.ts +1 -1
  142. package/vue/UiEditorMentionMenu.vue +4 -3
  143. package/vue/UiEditorSlashMenu.vue +6 -4
  144. package/vue/UiEditorSlashMenuItem.vue +6 -1
  145. package/vue/UiEditorTableContextMenu.vue +2 -2
  146. package/vue/UiEditorTableToolbar.vue +4 -4
  147. package/vue/UiEditorToolbar.vue +5 -5
  148. package/vue/UiFloatingActionButton.vue +3 -1
  149. package/vue/UiIconButton.d.ts +2 -0
  150. package/vue/UiIconButton.vue +61 -19
  151. package/vue/UiList.d.ts +7 -1
  152. package/vue/UiList.vue +57 -6
  153. package/vue/UiListItem.vue +1 -1
  154. package/vue/UiMenu.d.ts +2 -0
  155. package/vue/UiMenu.vue +6 -3
  156. package/vue/UiMenuItem.d.ts +3 -3
  157. package/vue/UiMenuItem.vue +47 -7
  158. package/vue/UiMeter.vue +4 -1
  159. package/vue/UiNavItem.vue +0 -1
  160. package/vue/UiPageHeader.vue +1 -0
  161. package/vue/UiPopover.vue +1 -1
  162. package/vue/UiRadio.vue +5 -2
  163. package/vue/UiScrollArea.vue +24 -18
  164. package/vue/UiSearchResultRow.vue +3 -2
  165. package/vue/UiSearchShell.vue +8 -8
  166. package/vue/UiSection.vue +5 -3
  167. package/vue/UiSeparator.vue +2 -2
  168. package/vue/UiSidebar.vue +2 -2
  169. package/vue/UiSpinner.vue +28 -7
  170. package/vue/UiStatusMessage.vue +1 -1
  171. package/vue/UiSwitch.vue +20 -9
  172. package/vue/UiTable.vue +1 -1
  173. package/vue/UiTabs.vue +25 -12
  174. package/vue/UiToast.vue +1 -1
  175. package/vue/UiToastRegion.vue +1 -1
  176. package/vue/UiTooltip.vue +12 -12
  177. package/vue/UiTopBar.vue +1 -1
  178. package/vue/UiTreeItem.vue +2 -1
  179. package/vue/chunks/UiAvatarGroup.js +1 -1
  180. package/vue/chunks/UiBadge.js +1 -1
  181. package/vue/chunks/UiBreadcrumbItem.js +1 -1
  182. package/vue/chunks/UiButton.js +28 -23
  183. package/vue/chunks/UiCallout.js +1 -1
  184. package/vue/chunks/UiCard.js +1 -1
  185. package/vue/chunks/UiCheckbox.js +1 -1
  186. package/vue/chunks/UiCombobox.js +80 -77
  187. package/vue/chunks/UiContextMenu.js +1 -1
  188. package/vue/chunks/UiDescriptionItem.js +1 -1
  189. package/vue/chunks/UiDescriptionList.js +1 -1
  190. package/vue/chunks/UiDialog.js +7 -4
  191. package/vue/chunks/UiDisclosure.js +1 -1
  192. package/vue/chunks/UiEditorInsertTableGrid.js +1 -1
  193. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  194. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  195. package/vue/chunks/UiEditorSlashMenuItem.js +1 -1
  196. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  197. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  198. package/vue/chunks/UiEditorToolbar.js +1 -1
  199. package/vue/chunks/UiFloatingActionButton.js +1 -1
  200. package/vue/chunks/UiIconButton.js +13 -8
  201. package/vue/chunks/UiList.js +17 -5
  202. package/vue/chunks/UiListItem.js +1 -1
  203. package/vue/chunks/UiMenu.js +10 -2
  204. package/vue/chunks/UiMenuItem.js +1 -4
  205. package/vue/chunks/UiMeter.js +1 -1
  206. package/vue/chunks/UiNavItem.js +1 -1
  207. package/vue/chunks/UiPageHeader.js +1 -1
  208. package/vue/chunks/UiPopover.js +1 -1
  209. package/vue/chunks/UiRadio.js +1 -1
  210. package/vue/chunks/UiScrollArea.js +22 -3
  211. package/vue/chunks/UiSearchResultRow.js +1 -1
  212. package/vue/chunks/UiSearchShell.js +2 -2
  213. package/vue/chunks/UiSection.js +1 -1
  214. package/vue/chunks/UiSeparator.js +1 -1
  215. package/vue/chunks/UiSidebar.js +1 -1
  216. package/vue/chunks/UiSpinner.js +7 -5
  217. package/vue/chunks/UiStatusMessage.js +1 -1
  218. package/vue/chunks/UiSwitch.js +1 -1
  219. package/vue/chunks/UiTable.js +1 -1
  220. package/vue/chunks/UiTabs.js +1 -1
  221. package/vue/chunks/UiToast.js +1 -1
  222. package/vue/chunks/UiToastRegion.js +1 -1
  223. package/vue/chunks/UiTooltip.js +1 -1
  224. package/vue/chunks/UiTopBar.js +1 -1
  225. package/vue/chunks/UiTreeItem.js +1 -1
  226. package/vue/components.css +1231 -1032
  227. package/vue/editor/code-block-view.d.ts +29 -0
  228. package/vue/editor/index.js +70 -4
  229. package/vue/index.js +1 -1
@@ -89,14 +89,14 @@
89
89
  margin-inline: auto;
90
90
  overflow: hidden;
91
91
  background: var(--_ui-search-shell-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
92
- border: 1px solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-default)));
92
+ border: 1px solid var(--_ui-search-shell-border, var(--ui-overlay-border, var(--ui-border-strong)));
93
93
  border-radius: var(--_ui-search-shell-radius, var(--ui-overlay-radius, var(--ui-radius-dialog)));
94
94
  box-shadow: var(--_ui-search-shell-shadow, var(--ui-overlay-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl))));
95
95
  }
96
96
 
97
97
  .search {
98
98
  padding: var(--ui-space-3);
99
- border-block-end: 1px solid var(--ui-border-default);
99
+ border-block-end: 1px solid var(--ui-border-divider);
100
100
  transition: border-color var(--ui-motion-fast) var(--ui-motion-ease), box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
101
101
  }
102
102
 
@@ -107,7 +107,7 @@
107
107
  }
108
108
 
109
109
  .status,
110
- .footer {
110
+ .actions {
111
111
  flex-shrink: 0;
112
112
  padding: var(--ui-space-2) var(--ui-space-4);
113
113
  color: var(--ui-text-secondary);
@@ -115,22 +115,22 @@
115
115
  }
116
116
 
117
117
  .status {
118
- border-block-end: 1px solid var(--ui-border-default);
118
+ border-block-end: 1px solid var(--ui-border-divider);
119
119
  }
120
120
 
121
121
  /* Laid out like the dialog's action row: actions right-aligned, spaced as buttons, no fill. */
122
- .footer {
122
+ .actions {
123
123
  display: flex;
124
124
  flex-wrap: wrap;
125
125
  align-items: center;
126
126
  justify-content: flex-end;
127
127
  gap: var(--ui-space-2);
128
128
  padding: var(--ui-space-3) var(--ui-space-4);
129
- border-block-start: 1px solid var(--ui-border-default);
129
+ border-block-start: 1px solid var(--ui-border-divider);
130
130
  }
131
131
 
132
132
  .status:empty,
133
- .footer:empty {
133
+ .actions:empty {
134
134
  display: none;
135
135
  }
136
136
 
@@ -11,18 +11,20 @@
11
11
 
12
12
  :scope[data-ui-section-state~="variant=card"] {
13
13
  padding: var(--ui-space-5);
14
- border: 1px solid var(--ui-border-default);
14
+ border: 1px solid var(--ui-border-strong);
15
15
  border-radius: var(--ui-radius-lg);
16
16
  background: var(--ui-surface-raised);
17
17
  }
18
18
 
19
19
  :scope[data-ui-section-state~="variant=divided"] {
20
20
  padding-block-start: var(--ui-space-6);
21
- border-block-start: 1px solid var(--ui-border-default);
21
+ border-block-start: 1px solid var(--ui-border-divider);
22
22
  }
23
23
 
24
24
  :scope[data-ui-section-state~="variant=card"][data-ui-section-state~="tone=danger"] {
25
- border-color: var(--ui-danger);
25
+ border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
26
+ border-inline-start: 4px solid var(--ui-danger);
27
+ background: var(--ui-danger-soft);
26
28
  }
27
29
 
28
30
  .head {
@@ -12,13 +12,13 @@
12
12
  align-self: stretch;
13
13
  margin: 0;
14
14
  border: 0;
15
- border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-default));
15
+ border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
16
16
  }
17
17
 
18
18
  :scope[aria-orientation="vertical"] {
19
19
  block-size: auto;
20
20
  border-block-start: 0;
21
- border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-default));
21
+ border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-divider));
22
22
  }
23
23
  }
24
24
  @scope ([data-component~="ui-separator"]) to ([data-component]) {
@@ -31,12 +31,12 @@
31
31
  max-inline-size: 100%;
32
32
  min-block-size: 0;
33
33
  background: var(--ui-sidebar-surface, var(--ui-surface-default));
34
- border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-default));
34
+ border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
35
35
  }
36
36
 
37
37
  :scope[data-ui-sidebar-state~="side=end"] {
38
38
  border-inline-end: 0;
39
- border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-default));
39
+ border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-divider));
40
40
  }
41
41
 
42
42
  /* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
@@ -1,19 +1,40 @@
1
1
  /* Generated by HTML Next 1.0.0-alpha.7. Do not edit. */
2
- @keyframes ui-spinner-turn {
3
- to {
2
+ @keyframes ui-spinner-chase {
3
+ 0% {
4
+ transform: rotate(0);
5
+ }
6
+ 70% {
7
+ transform: rotate(160deg);
8
+ }
9
+ 100% {
4
10
  transform: rotate(1turn);
5
11
  }
6
12
  }
7
13
  @scope ([data-component~="ui-spinner"]) to ([data-component], [data-slotted]) {
8
- /* Something is on its way. It turns in the current text colour; with reduced motion it holds still,
14
+ /* Something is on its way. The ring chases in the current text colour; with reduced motion it holds still,
9
15
  and the label (or the text beside it) still says what is happening. */
10
16
  :scope {
11
17
  display: inline-flex;
12
18
  flex: none;
19
+ align-items: center;
20
+ justify-content: center;
21
+ inline-size: 1em;
22
+ block-size: 1em;
13
23
  color: currentColor;
14
24
  font-size: var(--ui-font-size-lg);
15
25
  line-height: 1;
16
- animation: ui-spinner-turn 0.8s linear infinite;
26
+ }
27
+
28
+ .ring {
29
+ display: block;
30
+ box-sizing: border-box;
31
+ inline-size: 100%;
32
+ block-size: 100%;
33
+ border: 2px solid transparent;
34
+ border-block-start-color: currentColor;
35
+ border-inline-end-color: color-mix(in srgb, currentColor 52%, transparent);
36
+ border-radius: 50%;
37
+ animation: ui-spinner-chase 1s linear infinite;
17
38
  }
18
39
 
19
40
  :scope[data-ui-spinner-state~="size=sm"] {
@@ -21,7 +42,7 @@
21
42
  }
22
43
 
23
44
  @media (prefers-reduced-motion: reduce) {
24
- :scope {
45
+ .ring {
25
46
  animation: none;
26
47
  }
27
48
  }
@@ -32,7 +53,7 @@
32
53
  }
33
54
  }
34
55
  @scope ([data-component~="ui-spinner"]) to ([data-component]) {
35
- /* Something is on its way. It turns in the current text colour; with reduced motion it holds still,
56
+ /* Something is on its way. The ring chases in the current text colour; with reduced motion it holds still,
36
57
  and the label (or the text beside it) still says what is happening. */
37
58
 
38
59
  @media (prefers-reduced-motion: reduce) {
@@ -19,7 +19,7 @@
19
19
 
20
20
  :scope[data-ui-status-message-state~="layout=panel"] {
21
21
  padding: var(--ui-space-6);
22
- border: 1px dashed var(--ui-border-default);
22
+ border: 1px dashed var(--ui-border-strong);
23
23
  border-radius: var(--ui-radius-lg);
24
24
  }
25
25
 
@@ -58,12 +58,12 @@
58
58
  width: var(--_ui-switch-track-width, 2.5rem);
59
59
  height: var(--_ui-switch-track-height, 1.5rem);
60
60
  padding: 0;
61
- border: 1px solid var(--ui-control-border-hover, var(--ui-border-strong));
61
+ border: 1px solid var(--ui-control-border, var(--ui-border-strong));
62
62
  border-radius: var(--ui-radius-round);
63
- background: var(--ui-control-surface, var(--ui-surface-default));
64
- box-shadow: inset 0 1px 2px color-mix(in srgb, var(--ui-text-primary) 10%, transparent);
63
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
64
+ box-shadow: var(--ui-control-inset);
65
65
  cursor: pointer;
66
- transition: background-color var(--ui-motion-fast) var(--ui-motion-ease), border-color var(--ui-motion-fast) var(--ui-motion-ease);
66
+ transition: background-color var(--ui-motion-base) var(--ui-motion-ease), border-color var(--ui-motion-base) var(--ui-motion-ease);
67
67
  margin: 0;
68
68
  }
69
69
 
@@ -77,11 +77,11 @@
77
77
  border-radius: var(--ui-radius-round);
78
78
  background: var(--ui-text-secondary);
79
79
  box-shadow: var(--ui-shadow-xs);
80
- transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
80
+ transition: transform var(--ui-motion-base) var(--ui-motion-ease), background-color var(--ui-motion-base) var(--ui-motion-ease);
81
81
  }
82
82
 
83
83
  input:checked {
84
- background: var(--ui-accent-solid);
84
+ background-color: var(--ui-accent-solid);
85
85
  border-color: var(--ui-accent-solid);
86
86
  }
87
87
 
@@ -99,12 +99,21 @@
99
99
  color: var(--ui-disabled-text);
100
100
  cursor: not-allowed;
101
101
  }
102
+ :scope[data-ui-switch-state~="disabled"] .description {
103
+ color: var(--ui-disabled-text);
104
+ }
102
105
  :scope[data-ui-switch-state~="disabled"] input {
103
- border-color: var(--ui-border-default);
104
- background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
106
+ border-color: var(--ui-disabled-border);
107
+ background-color: var(--ui-disabled-surface);
108
+ box-shadow: none;
105
109
  cursor: not-allowed;
106
110
  }
107
111
 
112
+ :scope[data-ui-switch-state~="disabled"] input::after {
113
+ background-color: var(--ui-disabled-text);
114
+ box-shadow: none;
115
+ }
116
+
108
117
  @media (prefers-reduced-motion: reduce) {
109
118
  input, input::after {
110
119
  transition: none;
@@ -100,7 +100,7 @@
100
100
  :where([data-slotted], [data-slotted] *):is(thead th) {
101
101
  block-size: auto;
102
102
  padding-block: var(--ui-space-2);
103
- border-block-end-color: var(--ui-border-default);
103
+ border-block-end-color: var(--ui-border-divider);
104
104
  background: var(--ui-surface);
105
105
  color: var(--ui-text-muted);
106
106
  font-weight: var(--ui-font-medium);
@@ -52,10 +52,50 @@
52
52
  overflow-y: hidden;
53
53
  overscroll-behavior: contain;
54
54
  scrollbar-width: thin;
55
- border-block-end: 1px solid var(--ui-border-default);
55
+ border-block-end: 1px solid var(--ui-border-divider);
56
56
  }
57
57
 
58
- .list button {
58
+ /* Centre the glyphs, not the line box: a label without descenders otherwise reads high. */
59
+ /* Centre the glyphs, not the line box: a label without descenders otherwise reads high.
60
+ * Trimming applies to block containers, so the box is a block with centred content. */
61
+ @supports (text-box-trim: trim-both) {
62
+ }
63
+
64
+ :scope[data-ui-tabs-state~="stretch"] .list {
65
+ grid-auto-columns: minmax(max-content, 1fr);
66
+ }
67
+
68
+ .panels {
69
+ min-inline-size: 0;
70
+ }
71
+
72
+ :scope[data-ui-tabs-state~="orientation=vertical"] {
73
+ grid-template-columns: max-content minmax(0, 1fr);
74
+ align-items: start;
75
+ }
76
+
77
+ :scope[data-ui-tabs-state~="orientation=vertical"] .list {
78
+ grid-auto-flow: row;
79
+ grid-auto-columns: auto;
80
+ border-block-end: 0;
81
+ border-inline-end: 1px solid var(--ui-border-divider);
82
+ }
83
+
84
+ @media (prefers-reduced-motion: reduce) {
85
+ }
86
+
87
+ /* A component that sets its display still honours the hidden attribute on its root. */
88
+ :scope[hidden] {
89
+ display: none;
90
+ }
91
+ }
92
+ @scope ([data-component~="ui-tabs"]) to ([data-component]) {
93
+ /* This component's hooks style the element they are set on, and never a nested one. */
94
+
95
+ /* Density resolves into the tab row's own values; the public tokens still override them. */
96
+
97
+ .list button,
98
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]) {
59
99
  min-block-size: var(--_ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
60
100
  margin: 0 0 -1px;
61
101
  padding: var(--_ui-tabs-tab-padding-block, var(--_tab-padding-block)) var(--_ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
@@ -77,7 +117,8 @@
77
117
  /* Centre the glyphs, not the line box: a label without descenders otherwise reads high.
78
118
  * Trimming applies to block containers, so the box is a block with centred content. */
79
119
  @supports (text-box-trim: trim-both) {
80
- .list button {
120
+ .list button,
121
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]) {
81
122
  display: block;
82
123
  text-align: center;
83
124
  align-content: center;
@@ -86,83 +127,51 @@
86
127
  }
87
128
  }
88
129
 
89
- :scope[data-ui-tabs-state~="stretch"] .list {
90
- grid-auto-columns: minmax(max-content, 1fr);
91
- }
92
-
93
- .list button {
130
+ .list button,
131
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]) {
94
132
  white-space: nowrap;
95
133
  }
96
134
 
97
- .list button:hover {
135
+ .list button:hover,
136
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]:hover) {
98
137
  color: var(--ui-text-primary);
99
138
  background: var(--ui-surface-muted);
100
139
  }
101
- .list button[aria-selected="true"] {
140
+ .list button[aria-selected="true"],
141
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"][aria-selected="true"]) {
102
142
  color: var(--ui-accent-solid);
103
143
  border-block-end-color: var(--ui-accent-solid);
104
144
  }
105
- .list button:focus-visible {
145
+ .list button:focus-visible,
146
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]:focus-visible) {
106
147
  position: relative;
107
148
  outline: none;
108
149
  box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
109
150
  border-radius: var(--ui-radius-sm);
110
151
  }
111
-
112
- .panels {
113
- min-inline-size: 0;
114
- }
115
-
116
- :scope[data-ui-tabs-state~="orientation=vertical"] {
117
- grid-template-columns: max-content minmax(0, 1fr);
118
- align-items: start;
119
- }
120
-
121
- :scope[data-ui-tabs-state~="orientation=vertical"] .list {
122
- grid-auto-flow: row;
123
- grid-auto-columns: auto;
124
- border-block-end: 0;
125
- border-inline-end: 1px solid var(--ui-border-default);
152
+ .panels > :where([data-slotted], [data-slotted] *):is(*) {
153
+ padding: var(--ui-space-4);
126
154
  }
127
155
 
128
- :scope[data-ui-tabs-state~="orientation=vertical"] .list button {
156
+ :scope[data-ui-tabs-state~="orientation=vertical"] .list button,
157
+ :scope[data-ui-tabs-state~="orientation=vertical"] .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]) {
129
158
  margin: 0 -1px 0 0;
130
159
  border-block-end: 0;
131
160
  border-inline-end: 2px solid transparent;
132
161
  text-align: start;
133
162
  }
134
163
 
135
- :scope[data-ui-tabs-state~="orientation=vertical"] .list button[aria-selected="true"] {
164
+ :scope[data-ui-tabs-state~="orientation=vertical"] .list button[aria-selected="true"],
165
+ :scope[data-ui-tabs-state~="orientation=vertical"] .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"][aria-selected="true"]) {
136
166
  border-inline-end-color: var(--ui-accent-solid);
137
167
  }
138
168
 
139
169
  @media (prefers-reduced-motion: reduce) {
140
- .list button {
170
+ .list button,
171
+ .list > :where([data-slotted], [data-slotted] *):is(button[slot="tab"]) {
141
172
  transition: none;
142
173
  }
143
174
  }
144
175
 
145
- /* A component that sets its display still honours the hidden attribute on its root. */
146
- :scope[hidden] {
147
- display: none;
148
- }
149
- }
150
- @scope ([data-component~="ui-tabs"]) to ([data-component]) {
151
- /* This component's hooks style the element they are set on, and never a nested one. */
152
-
153
- /* Density resolves into the tab row's own values; the public tokens still override them. */
154
-
155
- /* Centre the glyphs, not the line box: a label without descenders otherwise reads high. */
156
- /* Centre the glyphs, not the line box: a label without descenders otherwise reads high.
157
- * Trimming applies to block containers, so the box is a block with centred content. */
158
- @supports (text-box-trim: trim-both) {
159
- }
160
- :where([data-slotted], [data-slotted] *):is(*) {
161
- padding: var(--ui-space-4);
162
- }
163
-
164
- @media (prefers-reduced-motion: reduce) {
165
- }
166
-
167
176
  /* A component that sets its display still honours the hidden attribute on its root. */
168
177
  }
@@ -129,7 +129,7 @@
129
129
  grid-template-columns: 1fr auto;
130
130
  gap: var(--ui-space-2);
131
131
  align-items: start;
132
- border: 1px solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-default)));
132
+ border: 1px solid var(--_ui-toast-region-border, var(--ui-overlay-border, var(--ui-border-strong)));
133
133
  border-radius: var(--_ui-toast-region-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
134
134
  padding: var(--ui-space-3) var(--ui-space-4);
135
135
  background: var(--_ui-toast-region-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
@@ -32,7 +32,7 @@
32
32
  inline-size: 100%;
33
33
  margin: 0;
34
34
  padding: var(--ui-space-3) var(--ui-space-4);
35
- border: 1px solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-default)));
35
+ border: 1px solid var(--ui-toast-border, var(--ui-overlay-border, var(--ui-border-strong)));
36
36
  border-inline-start: 3px solid var(--ui-toast-accent, var(--_ui-toast-accent));
37
37
  border-radius: var(--ui-toast-radius, var(--ui-overlay-radius, var(--ui-radius-lg)));
38
38
  background: var(--ui-toast-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
@@ -76,15 +76,15 @@
76
76
  }
77
77
 
78
78
  .surface {
79
- --_tooltip-line: var(--_ui-tooltip-border, var(--ui-overlay-border, var(--ui-border-default)));
79
+ --_tooltip-line: var(--_ui-tooltip-border, var(--ui-overlay-border, var(--ui-border-strong)));
80
80
  position: relative;
81
81
  box-sizing: border-box;
82
82
  max-inline-size: var(--_ui-tooltip-max-inline-size, 18rem);
83
83
  border: 1px solid var(--_tooltip-line);
84
- border-radius: var(--_ui-tooltip-radius, var(--ui-overlay-radius, var(--ui-radius-sm)));
84
+ border-radius: var(--_ui-tooltip-radius, var(--ui-overlay-radius, var(--ui-radius-md)));
85
85
  background: var(--_ui-tooltip-surface, var(--ui-overlay-surface, var(--ui-surface-elevated)));
86
86
  color: var(--_ui-tooltip-text, var(--ui-text-primary));
87
- padding: var(--ui-space-1) var(--ui-space-2);
87
+ padding: var(--ui-space-2) var(--ui-space-3);
88
88
  font-family: var(--ui-font-family-sans);
89
89
  font-size: var(--ui-font-size-sm);
90
90
  line-height: var(--ui-line-height-tight);
@@ -104,20 +104,20 @@
104
104
  position: absolute;
105
105
  z-index: 1;
106
106
  inset-inline-start: var(--ui-space-3);
107
- inset-block-end: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
108
- inline-size: var(--_ui-tooltip-arrow-size, 0.5rem);
109
- block-size: var(--_ui-tooltip-arrow-size, 0.5rem);
107
+ inset-block-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
108
+ inline-size: var(--_ui-tooltip-arrow-size, 0.625rem);
109
+ block-size: var(--_ui-tooltip-arrow-size, 0.625rem);
110
110
  box-sizing: border-box;
111
111
  background: inherit;
112
112
  border: 0 solid var(--_tooltip-line);
113
113
  border-inline-end-width: 1px;
114
114
  border-block-end-width: 1px;
115
115
  border-end-end-radius: 1px;
116
- transform: rotate(45deg);
116
+ transform: rotate(45deg) scaleX(1.25) scaleY(0.85);
117
117
  }
118
118
 
119
119
  :scope[data-ui-actual-placement="bottom"] .surface::after {
120
- inset-block-start: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
120
+ inset-block-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
121
121
  inset-block-end: auto;
122
122
  border-inline-end-width: 0;
123
123
  border-block-end-width: 0;
@@ -128,7 +128,7 @@
128
128
  }
129
129
 
130
130
  :scope[data-ui-actual-align="center"] .surface::after {
131
- inset-inline-start: calc(50% - var(--_ui-tooltip-arrow-size, 0.5rem) / 2);
131
+ inset-inline-start: calc(50% - var(--_ui-tooltip-arrow-size, 0.625rem) / 2);
132
132
  }
133
133
 
134
134
  :scope[data-ui-actual-align="end"] .surface::after {
@@ -138,20 +138,20 @@
138
138
 
139
139
  :scope[data-ui-actual-placement="left"] .surface::after,
140
140
  :scope[data-ui-actual-placement="right"] .surface::after {
141
- inset-block-start: calc(50% - var(--_ui-tooltip-arrow-size, 0.5rem) / 2);
141
+ inset-block-start: calc(50% - var(--_ui-tooltip-arrow-size, 0.625rem) / 2);
142
142
  inset-block-end: auto;
143
143
  border: 0 solid var(--_tooltip-line);
144
144
  }
145
145
 
146
146
  :scope[data-ui-actual-placement="left"] .surface::after {
147
147
  inset-inline-start: auto;
148
- inset-inline-end: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
148
+ inset-inline-end: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
149
149
  border-inline-end-width: 1px;
150
150
  border-block-end-width: 1px;
151
151
  }
152
152
 
153
153
  :scope[data-ui-actual-placement="right"] .surface::after {
154
- inset-inline-start: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
154
+ inset-inline-start: calc(var(--_ui-tooltip-arrow-size, 0.625rem) / -2 - 0.5px);
155
155
  inset-inline-end: auto;
156
156
  border-inline-start-width: 1px;
157
157
  border-block-start-width: 1px;
@@ -45,7 +45,7 @@
45
45
  padding-inline-start: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-left));
46
46
  padding-inline-end: max(var(--ui-top-bar-padding-inline, var(--ui-space-4)), env(safe-area-inset-right));
47
47
  background: var(--ui-top-bar-surface, var(--ui-surface-elevated));
48
- border-block-end: 1px solid var(--ui-top-bar-border, var(--ui-border-default));
48
+ border-block-end: 1px solid var(--ui-top-bar-border, var(--ui-border-divider));
49
49
  }
50
50
 
51
51
  .leading,
@@ -74,7 +74,8 @@
74
74
  }
75
75
 
76
76
  :scope[data-ui-tree-item-state~="disabled"] .row {
77
- opacity: 0.55;
77
+ color: var(--ui-disabled-text);
78
+ background: var(--ui-disabled-surface);
78
79
  }
79
80
 
80
81
  :scope[data-dragging] .row {
package/theme-dark.css CHANGED
@@ -13,7 +13,7 @@
13
13
  --ui-on-danger: #1a1a1a;
14
14
 
15
15
  --ui-accent: #a99bf5;
16
- --ui-danger: #ef6f86;
16
+ --ui-danger: #ff6b6b;
17
17
  --ui-success: #33cc66;
18
18
  --ui-warning: #ffaa22;
19
19
  --ui-info: #4d9fff;
@@ -23,7 +23,7 @@
23
23
  --ui-shadow-lg: 0 10px 28px rgb(0 0 0 / 0.55), 0 4px 10px rgb(0 0 0 / 0.35);
24
24
  --ui-control-inset: inset 0 1px 2px rgb(0 0 0 / 0.35);
25
25
  --ui-raised: 0 1px 2px rgb(0 0 0 / 0.4), inset 0 1px 0 rgb(255 255 255 / 0.06);
26
- --ui-disabled-filter: saturate(0.2) contrast(0.75) brightness(0.8);
26
+ --ui-disabled-filter: none;
27
27
  --ui-raised-highlight: linear-gradient(rgb(255 255 255 / 0.04), rgb(255 255 255 / 0));
28
28
  --ui-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a0a09c' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
29
29
  }
@@ -42,7 +42,7 @@
42
42
  --ui-on-danger: #1a1a1a;
43
43
 
44
44
  --ui-accent: #a99bf5;
45
- --ui-danger: #ef6f86;
45
+ --ui-danger: #ff6b6b;
46
46
  --ui-success: #33cc66;
47
47
  --ui-warning: #ffaa22;
48
48
  --ui-info: #4d9fff;
@@ -52,7 +52,7 @@
52
52
  --ui-shadow-lg: 0 10px 28px rgb(0 0 0 / 0.55), 0 4px 10px rgb(0 0 0 / 0.35);
53
53
  --ui-control-inset: inset 0 1px 2px rgb(0 0 0 / 0.35);
54
54
  --ui-raised: 0 1px 2px rgb(0 0 0 / 0.4), inset 0 1px 0 rgb(255 255 255 / 0.06);
55
- --ui-disabled-filter: saturate(0.2) contrast(0.75) brightness(0.8);
55
+ --ui-disabled-filter: none;
56
56
  --ui-raised-highlight: linear-gradient(rgb(255 255 255 / 0.04), rgb(255 255 255 / 0));
57
57
  --ui-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23a0a09c' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
58
58
  }
package/theme-light.css CHANGED
@@ -12,10 +12,10 @@
12
12
  --ui-on-danger: #ffffff;
13
13
 
14
14
  --ui-accent: #5b55d6;
15
- --ui-danger: #b4233f;
15
+ --ui-danger: #c92d1e;
16
16
  --ui-success: #007a33;
17
- /* Deep amber, so a solid warning surface carries white text like the other tones (5:1). */
18
- --ui-warning: #b45309;
17
+ /* Rich amber, with enough depth for white text on solid warning surfaces. */
18
+ --ui-warning: #ba5b0b;
19
19
  --ui-info: #0066cc;
20
20
  }
21
21
  }
package/tokens.css CHANGED
@@ -11,9 +11,9 @@
11
11
  the two surfaces either side of it, and the ink. Everything else — hovers, tints, borders,
12
12
  muted text, disabled — is mixed from them further down, so a theme sets these and stops. */
13
13
  --ui-accent: #5b55d6;
14
- --ui-danger: #b4233f;
14
+ --ui-danger: #c92d1e;
15
15
  --ui-success: #007a33;
16
- --ui-warning: #b45309;
16
+ --ui-warning: #ba5b0b;
17
17
  --ui-info: #0066cc;
18
18
  --ui-on-accent: #ffffff;
19
19
  --ui-on-danger: #ffffff;
@@ -115,7 +115,7 @@
115
115
  --ui-elevation-dialog: var(--ui-shadow-lg);
116
116
  --ui-overlay-backdrop: rgba(0, 0, 0, 0.4);
117
117
  --ui-control-inset: inset 0 1px 2px rgb(0 0 0 / 0.07), inset 0 1px 0 rgb(0 0 0 / 0.02);
118
- --ui-raised: 0 1px 2px rgb(0 0 0 / 0.07), 0 1px 1px rgb(0 0 0 / 0.04);
118
+ --ui-raised: 0 2px 4px rgb(0 0 0 / 0.12), 0 1px 1px rgb(0 0 0 / 0.06);
119
119
  --ui-raised-highlight: linear-gradient(rgb(255 255 255 / 0.16), rgb(255 255 255 / 0));
120
120
  /* The counterpart to --ui-raised: a pressed control takes its shadow inside. */
121
121
  --ui-pressed: inset 0 1px 2px rgb(0 0 0 / 0.12);
@@ -131,6 +131,8 @@
131
131
  --ui-text-secondary: color-mix(in oklab, var(--ui-text) 80%, var(--ui-surface));
132
132
  --ui-text-muted: color-mix(in oklab, var(--ui-text) 62%, var(--ui-surface));
133
133
  --ui-border: color-mix(in oklab, var(--ui-text) 12%, var(--ui-surface));
134
+ /* Lines divide content; stronger edges enclose surfaces; control edges identify inputs. */
135
+ --ui-border-divider: color-mix(in oklab, var(--ui-border) 50%, var(--ui-border-strong));
134
136
  --ui-border-strong: color-mix(in oklab, var(--ui-text) 25%, var(--ui-surface));
135
137
  --ui-control-border: color-mix(in oklab, var(--ui-text) 48%, var(--ui-surface));
136
138
 
@@ -146,9 +148,10 @@
146
148
  Lighter than muted text, which must stay readable; disabled text is exempt from contrast. */
147
149
  --ui-disabled-surface: var(--ui-surface-sunken);
148
150
  --ui-disabled-text: color-mix(in oklab, var(--ui-text) 45%, var(--ui-surface));
149
- /* A disabled button keeps its own look, washed out: less colour, less contrast, toward the page.
150
- A filter rather than a second palette, so every variant and tone fades the same way. */
151
- --ui-disabled-filter: saturate(0.2) contrast(0.75) brightness(1.25);
151
+ --ui-disabled-border: color-mix(in oklab, var(--ui-text) 20%, var(--ui-surface));
152
+ /* Component filter hooks remain available, but the default disabled state uses the explicit
153
+ neutral surface, text, and border above so a colored outline cannot still look active. */
154
+ --ui-disabled-filter: none;
152
155
 
153
156
  --ui-focus-ring: var(--ui-accent);
154
157
 
@@ -10,6 +10,7 @@ export interface UiButtonProps {
10
10
  as?: "button" | "a" | null;
11
11
  disabled?: boolean | null;
12
12
  href?: string | null;
13
+ loading?: boolean | null;
13
14
  pending?: boolean | null;
14
15
  rel?: string | null;
15
16
  size?: "sm" | "md" | "lg" | null;