@threadlabs/looma 0.12.7 → 0.13.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 (192) hide show
  1. package/components/ui-action-bar/ui-action-bar.html +10 -1
  2. package/components/ui-avatar/ui-avatar.html +18 -0
  3. package/components/ui-avatar-group/ui-avatar-group.html +16 -2
  4. package/components/ui-badge/ui-badge.html +42 -0
  5. package/components/ui-button/ui-button.html +70 -0
  6. package/components/ui-callout/ui-callout.html +55 -4
  7. package/components/ui-checkbox/ui-checkbox.html +15 -2
  8. package/components/ui-cluster/ui-cluster.html +7 -1
  9. package/components/ui-combobox/ui-combobox.html +64 -10
  10. package/components/ui-container/ui-container.html +12 -1
  11. package/components/ui-context-menu/ui-context-menu.html +10 -1
  12. package/components/ui-dialog/ui-dialog.html +21 -4
  13. package/components/ui-disclosure/ui-disclosure.html +22 -3
  14. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +2 -2
  15. package/components/ui-editor-table-context-menu/ui-editor-table-context-menu.html +2 -2
  16. package/components/ui-editor-table-overlay/ui-editor-table-overlay.html +8 -8
  17. package/components/ui-editor-table-toolbar/ui-editor-table-toolbar.html +3 -3
  18. package/components/ui-floating-action-button/ui-floating-action-button.html +14 -0
  19. package/components/ui-form-field/ui-form-field.html +10 -1
  20. package/components/ui-grid/ui-grid.html +11 -1
  21. package/components/ui-icon/ui-icon.html +17 -3
  22. package/components/ui-icon-button/ui-icon-button.html +81 -3
  23. package/components/ui-input/ui-input.html +67 -12
  24. package/components/ui-input-group/ui-input-group.html +14 -13
  25. package/components/ui-list/ui-list.html +10 -0
  26. package/components/ui-list-item/ui-list-item.html +22 -1
  27. package/components/ui-menu/ui-menu.html +17 -5
  28. package/components/ui-menu-item/ui-menu-item.html +30 -3
  29. package/components/ui-nav-item/ui-nav-item.html +14 -0
  30. package/components/ui-popover/ui-popover.html +6 -0
  31. package/components/ui-radio/ui-radio.html +15 -2
  32. package/components/ui-reel/ui-reel.html +15 -2
  33. package/components/ui-search-result-row/ui-search-result-row.html +34 -0
  34. package/components/ui-search-shell/ui-search-shell.html +65 -11
  35. package/components/ui-select/ui-select.html +14 -0
  36. package/components/ui-separator/ui-separator.html +9 -2
  37. package/components/ui-sidebar/ui-sidebar.html +22 -1
  38. package/components/ui-stack/ui-stack.html +7 -1
  39. package/components/ui-switch/ui-switch.html +20 -2
  40. package/components/ui-switcher/ui-switcher.html +18 -5
  41. package/components/ui-tabs/ui-tabs.html +21 -2
  42. package/components/ui-textarea/ui-textarea.html +14 -0
  43. package/components/ui-toast-region/ui-toast-region.html +16 -2
  44. package/components/ui-tooltip/ui-tooltip.html +62 -13
  45. package/components/ui-top-bar/ui-top-bar.html +34 -1
  46. package/components/ui-tree/ui-tree.html +27 -4
  47. package/components/ui-tree-item/ui-tree-item.html +39 -10
  48. package/components/ui-tree-item/ui-tree-item.js +1 -1
  49. package/dist/index.js +1 -1
  50. package/package.json +1 -1
  51. package/styles/ui-action-bar.css +14 -3
  52. package/styles/ui-avatar-group.css +20 -4
  53. package/styles/ui-avatar.css +22 -2
  54. package/styles/ui-badge.css +46 -2
  55. package/styles/ui-button.css +74 -2
  56. package/styles/ui-callout.css +59 -6
  57. package/styles/ui-checkbox.css +19 -4
  58. package/styles/ui-cluster.css +10 -2
  59. package/styles/ui-combobox.css +67 -12
  60. package/styles/ui-container.css +14 -2
  61. package/styles/ui-context-menu.css +14 -3
  62. package/styles/ui-dialog.css +25 -6
  63. package/styles/ui-disclosure.css +26 -5
  64. package/styles/ui-editor-slash-menu.css +2 -2
  65. package/styles/ui-editor-table-context-menu.css +2 -2
  66. package/styles/ui-editor-table-overlay.css +8 -8
  67. package/styles/ui-editor-table-toolbar.css +3 -3
  68. package/styles/ui-floating-action-button.css +18 -2
  69. package/styles/ui-form-field.css +14 -3
  70. package/styles/ui-grid.css +14 -2
  71. package/styles/ui-icon-button.css +85 -5
  72. package/styles/ui-icon.css +21 -5
  73. package/styles/ui-input-group.css +14 -13
  74. package/styles/ui-input.css +72 -14
  75. package/styles/ui-list-item.css +26 -3
  76. package/styles/ui-list.css +14 -2
  77. package/styles/ui-menu-item.css +34 -5
  78. package/styles/ui-menu.css +21 -6
  79. package/styles/ui-nav-item.css +18 -2
  80. package/styles/ui-popover.css +10 -2
  81. package/styles/ui-radio.css +19 -4
  82. package/styles/ui-reel.css +18 -3
  83. package/styles/ui-search-result-row.css +38 -2
  84. package/styles/ui-search-shell.css +69 -13
  85. package/styles/ui-select.css +18 -2
  86. package/styles/ui-separator.css +14 -2
  87. package/styles/ui-sidebar.css +26 -3
  88. package/styles/ui-stack.css +10 -2
  89. package/styles/ui-switch.css +24 -4
  90. package/styles/ui-switcher.css +21 -6
  91. package/styles/ui-tabs.css +25 -4
  92. package/styles/ui-textarea.css +18 -2
  93. package/styles/ui-toast-region.css +20 -4
  94. package/styles/ui-tooltip.css +66 -15
  95. package/styles/ui-top-bar.css +38 -3
  96. package/styles/ui-tree-item.css +43 -12
  97. package/styles/ui-tree.css +33 -6
  98. package/vue/UiActionBar.vue +12 -3
  99. package/vue/UiAvatar.vue +18 -0
  100. package/vue/UiAvatarGroup.vue +16 -2
  101. package/vue/UiBadge.vue +42 -0
  102. package/vue/UiButton.vue +70 -0
  103. package/vue/UiCallout.vue +55 -4
  104. package/vue/UiCheckbox.vue +15 -2
  105. package/vue/UiCluster.vue +6 -0
  106. package/vue/UiCombobox.vue +64 -10
  107. package/vue/UiContainer.vue +10 -0
  108. package/vue/UiContextMenu.vue +10 -1
  109. package/vue/UiDialog.vue +21 -4
  110. package/vue/UiDisclosure.vue +22 -3
  111. package/vue/UiEditorSlashMenu.vue +2 -2
  112. package/vue/UiEditorTableContextMenu.vue +2 -2
  113. package/vue/UiEditorTableOverlay.vue +8 -8
  114. package/vue/UiEditorTableToolbar.vue +3 -3
  115. package/vue/UiFloatingActionButton.vue +14 -0
  116. package/vue/UiFormField.vue +10 -1
  117. package/vue/UiGrid.vue +10 -0
  118. package/vue/UiIcon.vue +17 -3
  119. package/vue/UiIconButton.vue +81 -3
  120. package/vue/UiInput.vue +89 -14
  121. package/vue/UiInputGroup.vue +14 -13
  122. package/vue/UiList.vue +12 -2
  123. package/vue/UiListItem.vue +30 -9
  124. package/vue/UiMenu.vue +17 -5
  125. package/vue/UiMenuItem.vue +42 -4
  126. package/vue/UiNavItem.vue +17 -3
  127. package/vue/UiPopover.vue +6 -0
  128. package/vue/UiRadio.vue +15 -2
  129. package/vue/UiReel.vue +14 -1
  130. package/vue/UiSearchResultRow.vue +34 -0
  131. package/vue/UiSearchShell.vue +66 -12
  132. package/vue/UiSelect.vue +14 -0
  133. package/vue/UiSeparator.vue +9 -2
  134. package/vue/UiSidebar.vue +22 -1
  135. package/vue/UiStack.vue +6 -0
  136. package/vue/UiSwitch.vue +20 -2
  137. package/vue/UiSwitcher.vue +17 -4
  138. package/vue/UiTabs.vue +22 -3
  139. package/vue/UiTextarea.vue +14 -0
  140. package/vue/UiToastRegion.vue +16 -2
  141. package/vue/UiTooltip.vue +62 -13
  142. package/vue/UiTopBar.vue +34 -1
  143. package/vue/UiTree.vue +28 -5
  144. package/vue/UiTreeItem.vue +46 -11
  145. package/vue/chunks/UiActionBar.js +1 -1
  146. package/vue/chunks/UiAvatar.js +1 -1
  147. package/vue/chunks/UiAvatarGroup.js +1 -1
  148. package/vue/chunks/UiBadge.js +1 -1
  149. package/vue/chunks/UiButton.js +1 -1
  150. package/vue/chunks/UiCallout.js +1 -1
  151. package/vue/chunks/UiCheckbox.js +1 -1
  152. package/vue/chunks/UiCluster.js +1 -1
  153. package/vue/chunks/UiCombobox.js +1 -1
  154. package/vue/chunks/UiContainer.js +1 -1
  155. package/vue/chunks/UiContextMenu.js +1 -1
  156. package/vue/chunks/UiDialog.js +1 -1
  157. package/vue/chunks/UiDisclosure.js +1 -1
  158. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  159. package/vue/chunks/UiEditorTableContextMenu.js +1 -1
  160. package/vue/chunks/UiEditorTableOverlay.js +1 -1
  161. package/vue/chunks/UiEditorTableToolbar.js +1 -1
  162. package/vue/chunks/UiFloatingActionButton.js +1 -1
  163. package/vue/chunks/UiFormField.js +1 -1
  164. package/vue/chunks/UiGrid.js +1 -1
  165. package/vue/chunks/UiIcon.js +1 -1
  166. package/vue/chunks/UiIconButton.js +1 -1
  167. package/vue/chunks/UiInput.js +1 -1
  168. package/vue/chunks/UiInputGroup.js +1 -1
  169. package/vue/chunks/UiList.js +1 -1
  170. package/vue/chunks/UiListItem.js +1 -1
  171. package/vue/chunks/UiMenu.js +1 -1
  172. package/vue/chunks/UiMenuItem.js +1 -1
  173. package/vue/chunks/UiNavItem.js +1 -1
  174. package/vue/chunks/UiPopover.js +1 -1
  175. package/vue/chunks/UiRadio.js +1 -1
  176. package/vue/chunks/UiReel.js +1 -1
  177. package/vue/chunks/UiSearchResultRow.js +1 -1
  178. package/vue/chunks/UiSearchShell.js +1 -1
  179. package/vue/chunks/UiSelect.js +1 -1
  180. package/vue/chunks/UiSeparator.js +1 -1
  181. package/vue/chunks/UiSidebar.js +1 -1
  182. package/vue/chunks/UiStack.js +1 -1
  183. package/vue/chunks/UiSwitch.js +1 -1
  184. package/vue/chunks/UiSwitcher.js +1 -1
  185. package/vue/chunks/UiTabs.js +1 -1
  186. package/vue/chunks/UiTextarea.js +1 -1
  187. package/vue/chunks/UiToastRegion.js +1 -1
  188. package/vue/chunks/UiTooltip.js +1 -1
  189. package/vue/chunks/UiTopBar.js +1 -1
  190. package/vue/chunks/UiTree.js +1 -1
  191. package/vue/chunks/UiTreeItem.js +1 -1
  192. package/vue/components.css +1929 -897
@@ -76,23 +76,77 @@ useComponentHost(controllerModule.default, {
76
76
  </template>
77
77
 
78
78
  <style scoped>
79
+ /* This component's hooks style the element they are set on, and never a nested one. */
80
+ @property --ui-search-shell-border {
81
+ syntax: "*";
82
+ inherits: false;
83
+ }
84
+ @property --ui-search-shell-focus-color {
85
+ syntax: "*";
86
+ inherits: false;
87
+ }
88
+ @property --ui-search-shell-max-height {
89
+ syntax: "*";
90
+ inherits: false;
91
+ }
92
+ @property --ui-search-shell-max-width {
93
+ syntax: "*";
94
+ inherits: false;
95
+ }
96
+ @property --ui-search-shell-padding-top {
97
+ syntax: "*";
98
+ inherits: false;
99
+ }
100
+ @property --ui-search-shell-radius {
101
+ syntax: "*";
102
+ inherits: false;
103
+ }
104
+ @property --ui-search-shell-shadow {
105
+ syntax: "*";
106
+ inherits: false;
107
+ }
108
+ @property --ui-search-shell-surface {
109
+ syntax: "*";
110
+ inherits: false;
111
+ }
112
+ @property --ui-search-shell-viewport-gap {
113
+ syntax: "*";
114
+ inherits: false;
115
+ }
116
+ @property --ui-search-shell-z-index {
117
+ syntax: "*";
118
+ inherits: false;
119
+ }
120
+
79
121
  [data-component~="ui-search-shell"] {
122
+ /* Hooks do not inherit, so the parts below read them from the root. */
123
+ --_ui-search-shell-z-index: var(--ui-search-shell-z-index);
124
+ --_ui-search-shell-padding-top: var(--ui-search-shell-padding-top);
125
+ --_ui-search-shell-viewport-gap: var(--ui-search-shell-viewport-gap);
126
+ --_ui-search-shell-max-width: var(--ui-search-shell-max-width);
127
+ --_ui-search-shell-max-height: var(--ui-search-shell-max-height);
128
+ --_ui-search-shell-surface: var(--ui-search-shell-surface);
129
+ --_ui-search-shell-border: var(--ui-search-shell-border);
130
+ --_ui-search-shell-radius: var(--ui-search-shell-radius);
131
+ --_ui-search-shell-shadow: var(--ui-search-shell-shadow);
132
+ --_ui-search-shell-focus-color: var(--ui-search-shell-focus-color);
133
+
80
134
  display: contents;
81
135
  }
82
136
 
83
137
  dialog {
84
138
  position: fixed;
85
139
  inset: 0;
86
- z-index: var(--ui-search-shell-z-index, 400);
140
+ z-index: var(--_ui-search-shell-z-index, 400);
87
141
  box-sizing: border-box;
88
142
  inline-size: 100%;
89
143
  max-inline-size: none;
90
144
  block-size: 100%;
91
145
  max-block-size: none;
92
146
  margin: 0;
93
- padding: var(--ui-search-shell-padding-top, 10vh)
94
- var(--ui-search-shell-viewport-gap, var(--ui-space-4))
95
- var(--ui-search-shell-viewport-gap, var(--ui-space-4));
147
+ padding: var(--_ui-search-shell-padding-top, 10vh)
148
+ var(--_ui-search-shell-viewport-gap, var(--ui-space-4))
149
+ var(--_ui-search-shell-viewport-gap, var(--ui-space-4));
96
150
  overflow: auto;
97
151
  border: 0;
98
152
  background: var(--ui-overlay-backdrop);
@@ -107,14 +161,14 @@ dialog::backdrop {
107
161
  position: relative;
108
162
  display: flex;
109
163
  flex-direction: column;
110
- inline-size: min(100%, var(--ui-search-shell-max-width, 40rem));
111
- max-block-size: var(--ui-search-shell-max-height, 80vh);
164
+ inline-size: min(100%, var(--_ui-search-shell-max-width, 40rem));
165
+ max-block-size: var(--_ui-search-shell-max-height, 80vh);
112
166
  margin-inline: auto;
113
167
  overflow: hidden;
114
- background: var(--ui-search-shell-surface, var(--ui-surface-elevated));
115
- border: 1px solid var(--ui-search-shell-border, var(--ui-border-default));
116
- border-radius: var(--ui-search-shell-radius, var(--ui-radius-dialog));
117
- box-shadow: var(--ui-search-shell-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)));
168
+ background: var(--_ui-search-shell-surface, var(--ui-surface-elevated));
169
+ border: 1px solid var(--_ui-search-shell-border, var(--ui-border-default));
170
+ border-radius: var(--_ui-search-shell-radius, var(--ui-radius-dialog));
171
+ box-shadow: var(--_ui-search-shell-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)));
118
172
  }
119
173
 
120
174
  .search {
@@ -127,8 +181,8 @@ dialog::backdrop {
127
181
 
128
182
  /* The search region shows where typing goes, whatever the author put in it. */
129
183
  .search:focus-within {
130
- border-block-end-color: var(--ui-search-shell-focus-color, var(--ui-control-focus));
131
- box-shadow: inset 0 -1px 0 var(--ui-search-shell-focus-color, var(--ui-control-focus));
184
+ border-block-end-color: var(--_ui-search-shell-focus-color, var(--ui-control-focus));
185
+ box-shadow: inset 0 -1px 0 var(--_ui-search-shell-focus-color, var(--ui-control-focus));
132
186
  }
133
187
 
134
188
  :slotted(input[slot="search"]) {
package/vue/UiSelect.vue CHANGED
@@ -54,6 +54,20 @@ useComponentHost(controllerModule.default, {
54
54
  </template>
55
55
 
56
56
  <style scoped>
57
+ /* This component's hooks style the element they are set on, and never a nested one. */
58
+ @property --ui-select-focus-shadow {
59
+ syntax: "*";
60
+ inherits: false;
61
+ }
62
+ @property --ui-select-radius {
63
+ syntax: "*";
64
+ inherits: false;
65
+ }
66
+ @property --ui-select-shadow {
67
+ syntax: "*";
68
+ inherits: false;
69
+ }
70
+
57
71
  [data-component~="ui-select"] {
58
72
  box-sizing: border-box;
59
73
  display: inline-block;
@@ -17,7 +17,14 @@ withDefaults(
17
17
  </template>
18
18
 
19
19
  <style scoped>
20
- hr {
20
+ /* This component's hooks style the element they are set on, and never a nested one. */
21
+ @property --ui-separator-color {
22
+ syntax: "*";
23
+ inherits: false;
24
+ }
25
+
26
+ /* The root is the hr, so the rules name :host; a bare hr matches only a descendant. */
27
+ [data-component~="ui-separator"] {
21
28
  box-sizing: border-box;
22
29
  align-self: stretch;
23
30
  margin: 0;
@@ -25,7 +32,7 @@ hr {
25
32
  border-block-start: 1px solid var(--ui-separator-color, var(--ui-border-default));
26
33
  }
27
34
 
28
- hr[aria-orientation="vertical"] {
35
+ [data-component~="ui-separator"][aria-orientation="vertical"] {
29
36
  block-size: auto;
30
37
  border-block-start: 0;
31
38
  border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-default));
package/vue/UiSidebar.vue CHANGED
@@ -115,7 +115,28 @@ useComponentHost(controllerModule.default, {
115
115
  </template>
116
116
 
117
117
  <style scoped>
118
+ /* This component's hooks style the element they are set on, and never a nested one. */
119
+ @property --ui-sidebar-backdrop {
120
+ syntax: "*";
121
+ inherits: false;
122
+ }
123
+ @property --ui-sidebar-border {
124
+ syntax: "*";
125
+ inherits: false;
126
+ }
127
+ @property --ui-sidebar-surface {
128
+ syntax: "*";
129
+ inherits: false;
130
+ }
131
+ @property --ui-sidebar-width {
132
+ syntax: "*";
133
+ inherits: false;
134
+ }
135
+
118
136
  [data-component~="ui-sidebar"] {
137
+ /* Hooks do not inherit, so the parts below read them from the root. */
138
+ --_ui-sidebar-backdrop: var(--ui-sidebar-backdrop);
139
+
119
140
  position: relative;
120
141
  box-sizing: border-box;
121
142
  display: flex;
@@ -276,7 +297,7 @@ useComponentHost(controllerModule.default, {
276
297
  }
277
298
 
278
299
  [data-component~="ui-sidebar"][popover]::backdrop {
279
- background: var(--ui-sidebar-backdrop, rgb(0 0 0 / 0.32));
300
+ background: var(--_ui-sidebar-backdrop, rgb(0 0 0 / 0.32));
280
301
  }
281
302
 
282
303
  @media (prefers-reduced-motion: reduce) {
package/vue/UiStack.vue CHANGED
@@ -27,6 +27,12 @@ const hostState = computed(() =>
27
27
  </template>
28
28
 
29
29
  <style scoped>
30
+ /* This component's hooks style the element they are set on, and never a nested one. */
31
+ @property --ui-stack-gap {
32
+ syntax: "*";
33
+ inherits: false;
34
+ }
35
+
30
36
  [data-component~="ui-stack"] {
31
37
  --_layout-gap: var(--ui-space-4);
32
38
  display: flex;
package/vue/UiSwitch.vue CHANGED
@@ -93,7 +93,25 @@ useComponentHost(controllerModule.default, {
93
93
  </template>
94
94
 
95
95
  <style scoped>
96
+ /* This component's hooks style the element they are set on, and never a nested one. */
97
+ @property --ui-switch-gap {
98
+ syntax: "*";
99
+ inherits: false;
100
+ }
101
+ @property --ui-switch-track-height {
102
+ syntax: "*";
103
+ inherits: false;
104
+ }
105
+ @property --ui-switch-track-width {
106
+ syntax: "*";
107
+ inherits: false;
108
+ }
109
+
96
110
  [data-component~="ui-switch"] {
111
+ /* Hooks do not inherit, so the parts below read them from the root. */
112
+ --_ui-switch-track-width: var(--ui-switch-track-width);
113
+ --_ui-switch-track-height: var(--ui-switch-track-height);
114
+
97
115
  display: inline-flex;
98
116
  align-items: flex-start;
99
117
  gap: var(--ui-switch-gap, var(--ui-space-2));
@@ -130,8 +148,8 @@ input {
130
148
  -webkit-appearance: none;
131
149
  position: relative;
132
150
  flex: 0 0 auto;
133
- width: var(--ui-switch-track-width, 2.5rem);
134
- height: var(--ui-switch-track-height, 1.5rem);
151
+ width: var(--_ui-switch-track-width, 2.5rem);
152
+ height: var(--_ui-switch-track-height, 1.5rem);
135
153
  padding: 0;
136
154
  border: 1px solid var(--ui-control-border-hover, var(--ui-border-strong));
137
155
  border-radius: 999px;
@@ -31,7 +31,20 @@ const hostState = computed(() =>
31
31
  </template>
32
32
 
33
33
  <style scoped>
34
+ /* This component's hooks style the element they are set on, and never a nested one. */
35
+ @property --ui-switcher-gap {
36
+ syntax: "*";
37
+ inherits: false;
38
+ }
39
+ @property --ui-switcher-threshold {
40
+ syntax: "*";
41
+ inherits: false;
42
+ }
43
+
34
44
  [data-component~="ui-switcher"] {
45
+ /* Hooks do not inherit, so the parts below read them from the root. */
46
+ --_ui-switcher-threshold: var(--ui-switcher-threshold);
47
+
35
48
  --_switcher-gap: var(--ui-space-4);
36
49
  display: flex;
37
50
  flex-wrap: wrap;
@@ -45,7 +58,7 @@ const hostState = computed(() =>
45
58
  min-inline-size: 0;
46
59
  flex-grow: 1;
47
60
  /* The large multiplier makes the basis flip as a group at the intrinsic threshold. */
48
- flex-basis: calc((var(--ui-switcher-threshold, 30rem) - 100%) * 999);
61
+ flex-basis: calc((var(--_ui-switcher-threshold, 30rem) - 100%) * 999);
49
62
  }
50
63
 
51
64
  [data-component~="ui-switcher"][data-ui-switcher-state~="gap=xs"] {
@@ -64,13 +77,13 @@ const hostState = computed(() =>
64
77
  --_switcher-gap: var(--ui-space-6);
65
78
  }
66
79
  [data-component~="ui-switcher"][data-ui-switcher-state~="threshold=xs"] > :slotted(*) {
67
- flex-basis: calc((var(--ui-switcher-threshold, 20rem) - 100%) * 999);
80
+ flex-basis: calc((var(--_ui-switcher-threshold, 20rem) - 100%) * 999);
68
81
  }
69
82
  [data-component~="ui-switcher"][data-ui-switcher-state~="threshold=md"] > :slotted(*) {
70
- flex-basis: calc((var(--ui-switcher-threshold, 45rem) - 100%) * 999);
83
+ flex-basis: calc((var(--_ui-switcher-threshold, 45rem) - 100%) * 999);
71
84
  }
72
85
  [data-component~="ui-switcher"][data-ui-switcher-state~="threshold=lg"] > :slotted(*) {
73
- flex-basis: calc((var(--ui-switcher-threshold, 60rem) - 100%) * 999);
86
+ flex-basis: calc((var(--_ui-switcher-threshold, 60rem) - 100%) * 999);
74
87
  }
75
88
  [data-component~="ui-switcher"][data-ui-switcher-state~="align=start"] {
76
89
  align-items: flex-start;
package/vue/UiTabs.vue CHANGED
@@ -100,8 +100,27 @@ useComponentHost(controllerModule.default, {
100
100
  </template>
101
101
 
102
102
  <style scoped>
103
+ /* This component's hooks style the element they are set on, and never a nested one. */
104
+ @property --ui-tabs-tab-min-block-size {
105
+ syntax: "*";
106
+ inherits: false;
107
+ }
108
+ @property --ui-tabs-tab-padding-block {
109
+ syntax: "*";
110
+ inherits: false;
111
+ }
112
+ @property --ui-tabs-tab-padding-inline {
113
+ syntax: "*";
114
+ inherits: false;
115
+ }
116
+
103
117
  /* Density resolves into the tab row's own values; the public tokens still override them. */
104
118
  [data-component~="ui-tabs"] {
119
+ /* Hooks do not inherit, so the parts below read them from the root. */
120
+ --_ui-tabs-tab-min-block-size: var(--ui-tabs-tab-min-block-size);
121
+ --_ui-tabs-tab-padding-block: var(--ui-tabs-tab-padding-block);
122
+ --_ui-tabs-tab-padding-inline: var(--ui-tabs-tab-padding-inline);
123
+
105
124
  --_tab-min-block-size: var(--ui-control-size);
106
125
  --_tab-padding-block: var(--ui-space-2);
107
126
  --_tab-padding-inline: var(--ui-space-3);
@@ -137,10 +156,10 @@ useComponentHost(controllerModule.default, {
137
156
  }
138
157
 
139
158
  .list button {
140
- min-block-size: var(--ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
159
+ min-block-size: var(--_ui-tabs-tab-min-block-size, var(--_tab-min-block-size));
141
160
  margin: 0 0 -1px;
142
- padding: var(--ui-tabs-tab-padding-block, var(--_tab-padding-block))
143
- var(--ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
161
+ padding: var(--_ui-tabs-tab-padding-block, var(--_tab-padding-block))
162
+ var(--_ui-tabs-tab-padding-inline, var(--_tab-padding-inline));
144
163
  border: 0;
145
164
  border-block-end: 2px solid transparent;
146
165
  background: transparent;
@@ -58,6 +58,20 @@ useComponentHost(controllerModule.default, {
58
58
  </template>
59
59
 
60
60
  <style scoped>
61
+ /* This component's hooks style the element they are set on, and never a nested one. */
62
+ @property --ui-textarea-focus-shadow {
63
+ syntax: "*";
64
+ inherits: false;
65
+ }
66
+ @property --ui-textarea-radius {
67
+ syntax: "*";
68
+ inherits: false;
69
+ }
70
+ @property --ui-textarea-shadow {
71
+ syntax: "*";
72
+ inherits: false;
73
+ }
74
+
61
75
  [data-component~="ui-textarea"] {
62
76
  box-sizing: border-box;
63
77
  display: inline-block;
@@ -132,7 +132,21 @@ defineExpose({
132
132
  </template>
133
133
 
134
134
  <style scoped>
135
+ /* This component's hooks style the element they are set on, and never a nested one. */
136
+ @property --ui-toast-region-enter-duration {
137
+ syntax: "*";
138
+ inherits: false;
139
+ }
140
+ @property --ui-toast-region-exit-duration {
141
+ syntax: "*";
142
+ inherits: false;
143
+ }
144
+
135
145
  [data-component~="ui-toast-region"] {
146
+ /* Hooks do not inherit, so the parts below read them from the root. */
147
+ --_ui-toast-region-enter-duration: var(--ui-toast-region-enter-duration);
148
+ --_ui-toast-region-exit-duration: var(--ui-toast-region-exit-duration);
149
+
136
150
  position: fixed;
137
151
  top: calc(var(--ui-space-4) + env(safe-area-inset-top));
138
152
  right: auto;
@@ -175,13 +189,13 @@ defineExpose({
175
189
  background: var(--ui-surface-elevated);
176
190
  color: var(--ui-text-primary);
177
191
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
178
- animation: ui-toast-enter var(--ui-toast-region-enter-duration, 0.32s)
192
+ animation: ui-toast-enter var(--_ui-toast-region-enter-duration, 0.32s)
179
193
  var(--ui-motion-ease-out, cubic-bezier(0.16, 1, 0.3, 1)) both;
180
194
  }
181
195
 
182
196
  /* Leaving slides on down and fades; the controller removes the toast when this ends. */
183
197
  .toast.closing {
184
- animation: ui-toast-exit var(--ui-toast-region-exit-duration, 0.22s) var(--ui-motion-ease) both;
198
+ animation: ui-toast-exit var(--_ui-toast-region-exit-duration, 0.22s) var(--ui-motion-ease) both;
185
199
  pointer-events: none;
186
200
  }
187
201
 
package/vue/UiTooltip.vue CHANGED
@@ -96,7 +96,56 @@ useComponentHost(controllerModule.default, {
96
96
  </template>
97
97
 
98
98
  <style scoped>
99
+ /* This component's hooks style the element they are set on, and never a nested one. */
100
+ @property --ui-tooltip-arrow-size {
101
+ syntax: "*";
102
+ inherits: false;
103
+ }
104
+ @property --ui-tooltip-border {
105
+ syntax: "*";
106
+ inherits: false;
107
+ }
108
+ @property --ui-tooltip-inverse-surface {
109
+ syntax: "*";
110
+ inherits: false;
111
+ }
112
+ @property --ui-tooltip-inverse-text {
113
+ syntax: "*";
114
+ inherits: false;
115
+ }
116
+ @property --ui-tooltip-max-inline-size {
117
+ syntax: "*";
118
+ inherits: false;
119
+ }
120
+ @property --ui-tooltip-radius {
121
+ syntax: "*";
122
+ inherits: false;
123
+ }
124
+ @property --ui-tooltip-shadow {
125
+ syntax: "*";
126
+ inherits: false;
127
+ }
128
+ @property --ui-tooltip-surface {
129
+ syntax: "*";
130
+ inherits: false;
131
+ }
132
+ @property --ui-tooltip-text {
133
+ syntax: "*";
134
+ inherits: false;
135
+ }
136
+
99
137
  [data-component~="ui-tooltip"] {
138
+ /* Hooks do not inherit, so the parts below read them from the root. */
139
+ --_ui-tooltip-border: var(--ui-tooltip-border);
140
+ --_ui-tooltip-max-inline-size: var(--ui-tooltip-max-inline-size);
141
+ --_ui-tooltip-radius: var(--ui-tooltip-radius);
142
+ --_ui-tooltip-surface: var(--ui-tooltip-surface);
143
+ --_ui-tooltip-text: var(--ui-tooltip-text);
144
+ --_ui-tooltip-shadow: var(--ui-tooltip-shadow);
145
+ --_ui-tooltip-inverse-surface: var(--ui-tooltip-inverse-surface);
146
+ --_ui-tooltip-inverse-text: var(--ui-tooltip-inverse-text);
147
+ --_ui-tooltip-arrow-size: var(--ui-tooltip-arrow-size);
148
+
100
149
  position: fixed;
101
150
  inset: auto;
102
151
  margin: 0;
@@ -119,25 +168,25 @@ useComponentHost(controllerModule.default, {
119
168
  }
120
169
 
121
170
  .surface {
122
- --_tooltip-line: var(--ui-tooltip-border, var(--ui-border-default));
171
+ --_tooltip-line: var(--_ui-tooltip-border, var(--ui-border-default));
123
172
  position: relative;
124
173
  box-sizing: border-box;
125
- max-inline-size: var(--ui-tooltip-max-inline-size, 18rem);
174
+ max-inline-size: var(--_ui-tooltip-max-inline-size, 18rem);
126
175
  border: 1px solid var(--_tooltip-line);
127
- border-radius: var(--ui-tooltip-radius, var(--ui-radius-sm));
128
- background: var(--ui-tooltip-surface, var(--ui-surface-elevated));
129
- color: var(--ui-tooltip-text, var(--ui-text-primary));
176
+ border-radius: var(--_ui-tooltip-radius, var(--ui-radius-sm));
177
+ background: var(--_ui-tooltip-surface, var(--ui-surface-elevated));
178
+ color: var(--_ui-tooltip-text, var(--ui-text-primary));
130
179
  padding: var(--ui-space-1) var(--ui-space-2);
131
180
  font-family: var(--ui-font-family-sans);
132
181
  font-size: var(--ui-font-size-sm);
133
182
  line-height: var(--ui-line-height-tight);
134
- box-shadow: var(--ui-tooltip-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)));
183
+ box-shadow: var(--_ui-tooltip-shadow, var(--ui-elevation-tooltip, var(--ui-shadow-md)));
135
184
  }
136
185
 
137
186
  [data-component~="ui-tooltip"][data-ui-tooltip-state~="inverse"] .surface {
138
- --_tooltip-line: var(--ui-tooltip-inverse-surface, var(--ui-text-primary));
139
- background: var(--ui-tooltip-inverse-surface, var(--ui-text-primary));
140
- color: var(--ui-tooltip-inverse-text, var(--ui-surface-default));
187
+ --_tooltip-line: var(--_ui-tooltip-inverse-surface, var(--ui-text-primary));
188
+ background: var(--_ui-tooltip-inverse-surface, var(--ui-text-primary));
189
+ color: var(--_ui-tooltip-inverse-text, var(--ui-surface-default));
141
190
  }
142
191
 
143
192
  /* A rotated square shares the surface fill and draws the two outward border edges. Its centre sits on
@@ -147,9 +196,9 @@ useComponentHost(controllerModule.default, {
147
196
  position: absolute;
148
197
  z-index: 1;
149
198
  inset-inline-start: var(--ui-space-3);
150
- inset-block-end: calc(var(--ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
151
- inline-size: var(--ui-tooltip-arrow-size, 0.5rem);
152
- block-size: var(--ui-tooltip-arrow-size, 0.5rem);
199
+ inset-block-end: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
200
+ inline-size: var(--_ui-tooltip-arrow-size, 0.5rem);
201
+ block-size: var(--_ui-tooltip-arrow-size, 0.5rem);
153
202
  box-sizing: border-box;
154
203
  background: inherit;
155
204
  border: 0 solid var(--_tooltip-line);
@@ -161,7 +210,7 @@ useComponentHost(controllerModule.default, {
161
210
 
162
211
  :is([data-component~="ui-tooltip"][data-ui-tooltip-state~="placement=bottom"], [data-component~="ui-tooltip"][data-ui-tooltip-state~="placement=bottom-start"], [data-component~="ui-tooltip"][data-ui-tooltip-state~="placement=bottom-end"])
163
212
  .surface::after {
164
- inset-block-start: calc(var(--ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
213
+ inset-block-start: calc(var(--_ui-tooltip-arrow-size, 0.5rem) / -2 - 0.5px);
165
214
  inset-block-end: auto;
166
215
  border-inline-end-width: 0;
167
216
  border-block-end-width: 0;
package/vue/UiTopBar.vue CHANGED
@@ -13,7 +13,40 @@ defineOptions({ inheritAttrs: false })
13
13
  </template>
14
14
 
15
15
  <style scoped>
16
+ /* This component's hooks style the element they are set on, and never a nested one. */
17
+ @property --ui-top-bar-actions-gap {
18
+ syntax: "*";
19
+ inherits: false;
20
+ }
21
+ @property --ui-top-bar-border {
22
+ syntax: "*";
23
+ inherits: false;
24
+ }
25
+ @property --ui-top-bar-gap {
26
+ syntax: "*";
27
+ inherits: false;
28
+ }
29
+ @property --ui-top-bar-height {
30
+ syntax: "*";
31
+ inherits: false;
32
+ }
33
+ @property --ui-top-bar-padding-inline {
34
+ syntax: "*";
35
+ inherits: false;
36
+ }
37
+ @property --ui-top-bar-surface {
38
+ syntax: "*";
39
+ inherits: false;
40
+ }
41
+ @property --ui-top-bar-z-index {
42
+ syntax: "*";
43
+ inherits: false;
44
+ }
45
+
16
46
  [data-component~="ui-top-bar"] {
47
+ /* Hooks do not inherit, so the parts below read them from the root. */
48
+ --_ui-top-bar-actions-gap: var(--ui-top-bar-actions-gap);
49
+
17
50
  position: sticky;
18
51
  inset-block-start: 0;
19
52
  z-index: var(--ui-top-bar-z-index, 100);
@@ -43,7 +76,7 @@ defineOptions({ inheritAttrs: false })
43
76
  }
44
77
 
45
78
  .actions {
46
- gap: var(--ui-top-bar-actions-gap, var(--ui-space-1));
79
+ gap: var(--_ui-top-bar-actions-gap, var(--ui-space-1));
47
80
  }
48
81
 
49
82
  .title {
package/vue/UiTree.vue CHANGED
@@ -130,19 +130,42 @@ useComponentHost(controllerModule.default, {
130
130
  </template>
131
131
 
132
132
  <style scoped>
133
+ /* This component's hooks style the element they are set on, and never a nested one. */
134
+ @property --ui-tree-drop-color {
135
+ syntax: "*";
136
+ inherits: false;
137
+ }
138
+ @property --ui-tree-gutter {
139
+ syntax: "*";
140
+ inherits: false;
141
+ }
142
+ @property --ui-tree-indent {
143
+ syntax: "*";
144
+ inherits: false;
145
+ }
146
+
133
147
  /* Reaches the items the way density does, so the setting lives on the tree the way a reader
134
- thinks about it: this list scrolls its long names. */
148
+ thinks about it: this list scrolls its long names. */
135
149
  [data-component~="ui-tree"][data-ui-tree-state~="marquee"] {
136
- --ui-tree-item-marquee: 1;
150
+ --_ui-default-tree-item-marquee: 1;
137
151
  }
138
152
 
153
+ /* The items' defaults for this density: an item's own hook still wins. */
139
154
  [data-component~="ui-tree"][data-ui-tree-state~="density=compact"] {
140
- --ui-tree-item-min-block-size: var(--ui-control-size-sm);
141
- --ui-tree-item-font-size: var(--ui-font-size-sm);
142
- --ui-tree-item-label-padding-block: 0;
155
+ --_ui-default-tree-item-min-block-size: var(--ui-control-size-sm);
156
+ --_ui-default-tree-item-font-size: var(--ui-font-size-sm);
157
+ --_ui-default-tree-item-label-padding-block: 0;
143
158
  }
144
159
 
145
160
  [data-component~="ui-tree"] {
161
+ /* Hooks do not inherit: the tree hands its own to its items here, and a tree nested in an item
162
+ starts again from its own settings. */
163
+ --_ui-tree-indent: var(--ui-tree-indent);
164
+ --_ui-tree-drop-color: var(--ui-tree-drop-color);
165
+ --_ui-default-tree-item-marquee: initial;
166
+ --_ui-default-tree-item-min-block-size: initial;
167
+ --_ui-default-tree-item-font-size: initial;
168
+ --_ui-default-tree-item-label-padding-block: initial;
146
169
  display: block;
147
170
  min-inline-size: 0;
148
171
  padding-inline-start: var(--ui-tree-gutter, 0px);