@threadlabs/looma 0.6.3 → 0.6.5

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 (250) hide show
  1. package/components/ui-tree-item/ui-tree-item.html +68 -12
  2. package/components/ui-tree-item/ui-tree-item.js +9 -1
  3. package/dist/index.js +1 -1
  4. package/package.json +2 -2
  5. package/styles/ui-affordance-scope.css +1 -1
  6. package/styles/ui-avatar-group.css +1 -1
  7. package/styles/ui-avatar.css +1 -1
  8. package/styles/ui-badge.css +1 -1
  9. package/styles/ui-button.css +1 -1
  10. package/styles/ui-callout.css +1 -1
  11. package/styles/ui-checkbox.css +1 -1
  12. package/styles/ui-cluster.css +1 -1
  13. package/styles/ui-combobox.css +1 -1
  14. package/styles/ui-container.css +1 -1
  15. package/styles/ui-context-menu.css +1 -1
  16. package/styles/ui-dialog.css +1 -1
  17. package/styles/ui-disclosure.css +1 -1
  18. package/styles/ui-editable.css +1 -1
  19. package/styles/ui-editor-insert-table-grid.css +1 -1
  20. package/styles/ui-editor-mention-menu.css +1 -1
  21. package/styles/ui-editor-slash-menu.css +1 -1
  22. package/styles/ui-editor-table-context-menu.css +1 -1
  23. package/styles/ui-editor-table-overlay.css +1 -1
  24. package/styles/ui-editor-table-toolbar.css +1 -1
  25. package/styles/ui-editor-toolbar.css +1 -1
  26. package/styles/ui-floating-action-button.css +1 -1
  27. package/styles/ui-form-field.css +1 -1
  28. package/styles/ui-grid.css +1 -1
  29. package/styles/ui-icon-button.css +1 -1
  30. package/styles/ui-icon.css +1 -1
  31. package/styles/ui-input.css +1 -1
  32. package/styles/ui-menu-item.css +1 -1
  33. package/styles/ui-menu.css +1 -1
  34. package/styles/ui-popover.css +1 -1
  35. package/styles/ui-radio-group.css +1 -1
  36. package/styles/ui-radio.css +1 -1
  37. package/styles/ui-reel.css +1 -1
  38. package/styles/ui-search-result-row.css +1 -1
  39. package/styles/ui-search-shell.css +1 -1
  40. package/styles/ui-select.css +1 -1
  41. package/styles/ui-separator.css +1 -1
  42. package/styles/ui-sidebar.css +1 -1
  43. package/styles/ui-stack.css +1 -1
  44. package/styles/ui-switch.css +1 -1
  45. package/styles/ui-switcher.css +1 -1
  46. package/styles/ui-tabs.css +1 -1
  47. package/styles/ui-textarea.css +1 -1
  48. package/styles/ui-toast-region.css +1 -1
  49. package/styles/ui-tooltip.css +1 -1
  50. package/styles/ui-top-bar.css +1 -1
  51. package/styles/ui-tree-item.css +75 -12
  52. package/styles/ui-tree.css +1 -1
  53. package/vanilla/UiAffordanceScope.d.ts +1 -1
  54. package/vanilla/UiAffordanceScope.js +1 -1
  55. package/vanilla/UiAvatar.d.ts +1 -1
  56. package/vanilla/UiAvatar.js +1 -1
  57. package/vanilla/UiAvatarGroup.d.ts +1 -1
  58. package/vanilla/UiAvatarGroup.js +1 -1
  59. package/vanilla/UiBadge.d.ts +1 -1
  60. package/vanilla/UiBadge.js +1 -1
  61. package/vanilla/UiButton.d.ts +1 -1
  62. package/vanilla/UiButton.js +1 -1
  63. package/vanilla/UiCallout.d.ts +1 -1
  64. package/vanilla/UiCallout.js +1 -1
  65. package/vanilla/UiCheckbox.d.ts +1 -1
  66. package/vanilla/UiCheckbox.js +1 -1
  67. package/vanilla/UiCluster.d.ts +1 -1
  68. package/vanilla/UiCluster.js +1 -1
  69. package/vanilla/UiCombobox.d.ts +1 -1
  70. package/vanilla/UiCombobox.js +1 -1
  71. package/vanilla/UiContainer.d.ts +1 -1
  72. package/vanilla/UiContainer.js +1 -1
  73. package/vanilla/UiContextMenu.d.ts +1 -1
  74. package/vanilla/UiContextMenu.js +1 -1
  75. package/vanilla/UiDialog.d.ts +1 -1
  76. package/vanilla/UiDialog.js +1 -1
  77. package/vanilla/UiDisclosure.d.ts +1 -1
  78. package/vanilla/UiDisclosure.js +1 -1
  79. package/vanilla/UiEditable.d.ts +1 -1
  80. package/vanilla/UiEditable.js +1 -1
  81. package/vanilla/UiEditorInsertTableGrid.d.ts +1 -1
  82. package/vanilla/UiEditorInsertTableGrid.js +1 -1
  83. package/vanilla/UiEditorMentionMenu.d.ts +1 -1
  84. package/vanilla/UiEditorMentionMenu.js +1 -1
  85. package/vanilla/UiEditorSlashMenu.d.ts +1 -1
  86. package/vanilla/UiEditorSlashMenu.js +1 -1
  87. package/vanilla/UiEditorTableContextMenu.d.ts +1 -1
  88. package/vanilla/UiEditorTableContextMenu.js +1 -1
  89. package/vanilla/UiEditorTableOverlay.d.ts +1 -1
  90. package/vanilla/UiEditorTableOverlay.js +1 -1
  91. package/vanilla/UiEditorTableToolbar.d.ts +1 -1
  92. package/vanilla/UiEditorTableToolbar.js +1 -1
  93. package/vanilla/UiEditorToolbar.d.ts +1 -1
  94. package/vanilla/UiEditorToolbar.js +1 -1
  95. package/vanilla/UiFloatingActionButton.d.ts +1 -1
  96. package/vanilla/UiFloatingActionButton.js +1 -1
  97. package/vanilla/UiFormField.d.ts +1 -1
  98. package/vanilla/UiFormField.js +1 -1
  99. package/vanilla/UiGrid.d.ts +1 -1
  100. package/vanilla/UiGrid.js +1 -1
  101. package/vanilla/UiIcon.d.ts +1 -1
  102. package/vanilla/UiIcon.js +1 -1
  103. package/vanilla/UiIconButton.d.ts +1 -1
  104. package/vanilla/UiIconButton.js +1 -1
  105. package/vanilla/UiInput.d.ts +1 -1
  106. package/vanilla/UiInput.js +1 -1
  107. package/vanilla/UiMenu.d.ts +1 -1
  108. package/vanilla/UiMenu.js +1 -1
  109. package/vanilla/UiMenuItem.d.ts +1 -1
  110. package/vanilla/UiMenuItem.js +1 -1
  111. package/vanilla/UiPopover.d.ts +1 -1
  112. package/vanilla/UiPopover.js +1 -1
  113. package/vanilla/UiRadio.d.ts +1 -1
  114. package/vanilla/UiRadio.js +1 -1
  115. package/vanilla/UiRadioGroup.d.ts +1 -1
  116. package/vanilla/UiRadioGroup.js +1 -1
  117. package/vanilla/UiReel.d.ts +1 -1
  118. package/vanilla/UiReel.js +1 -1
  119. package/vanilla/UiSearchResultRow.d.ts +1 -1
  120. package/vanilla/UiSearchResultRow.js +1 -1
  121. package/vanilla/UiSearchShell.d.ts +1 -1
  122. package/vanilla/UiSearchShell.js +1 -1
  123. package/vanilla/UiSelect.d.ts +1 -1
  124. package/vanilla/UiSelect.js +1 -1
  125. package/vanilla/UiSeparator.d.ts +1 -1
  126. package/vanilla/UiSeparator.js +1 -1
  127. package/vanilla/UiSidebar.d.ts +1 -1
  128. package/vanilla/UiSidebar.js +1 -1
  129. package/vanilla/UiStack.d.ts +1 -1
  130. package/vanilla/UiStack.js +1 -1
  131. package/vanilla/UiSwitch.d.ts +1 -1
  132. package/vanilla/UiSwitch.js +1 -1
  133. package/vanilla/UiSwitcher.d.ts +1 -1
  134. package/vanilla/UiSwitcher.js +1 -1
  135. package/vanilla/UiTabs.d.ts +1 -1
  136. package/vanilla/UiTabs.js +1 -1
  137. package/vanilla/UiTextarea.d.ts +1 -1
  138. package/vanilla/UiTextarea.js +1 -1
  139. package/vanilla/UiToastRegion.d.ts +1 -1
  140. package/vanilla/UiToastRegion.js +1 -1
  141. package/vanilla/UiTooltip.d.ts +1 -1
  142. package/vanilla/UiTooltip.js +1 -1
  143. package/vanilla/UiTopBar.d.ts +1 -1
  144. package/vanilla/UiTopBar.js +1 -1
  145. package/vanilla/UiTree.d.ts +1 -1
  146. package/vanilla/UiTree.js +1 -1
  147. package/vanilla/UiTreeItem.d.ts +1 -1
  148. package/vanilla/UiTreeItem.js +2 -2
  149. package/vue/UiAffordanceScope.vue +8 -84
  150. package/vue/UiAvatar.d.ts +1 -1
  151. package/vue/UiAvatar.vue +9 -106
  152. package/vue/UiAvatarGroup.vue +9 -96
  153. package/vue/UiBadge.vue +1 -1
  154. package/vue/UiButton.vue +1 -1
  155. package/vue/UiCallout.vue +1 -1
  156. package/vue/UiCheckbox.vue +22 -123
  157. package/vue/UiCluster.vue +1 -1
  158. package/vue/UiCombobox.d.ts +1 -1
  159. package/vue/UiCombobox.vue +224 -475
  160. package/vue/UiContainer.vue +1 -1
  161. package/vue/UiContextMenu.vue +34 -141
  162. package/vue/UiDialog.vue +25 -126
  163. package/vue/UiDisclosure.vue +26 -138
  164. package/vue/UiEditable.vue +46 -158
  165. package/vue/UiEditorInsertTableGrid.vue +19 -138
  166. package/vue/UiEditorMentionMenu.vue +17 -124
  167. package/vue/UiEditorSlashMenu.vue +17 -109
  168. package/vue/UiEditorTableContextMenu.vue +34 -122
  169. package/vue/UiEditorTableOverlay.vue +61 -167
  170. package/vue/UiEditorTableToolbar.vue +34 -142
  171. package/vue/UiEditorToolbar.vue +1 -1
  172. package/vue/UiFloatingActionButton.vue +1 -1
  173. package/vue/UiFormField.vue +7 -79
  174. package/vue/UiGrid.vue +1 -1
  175. package/vue/UiIcon.vue +8 -84
  176. package/vue/UiIconButton.vue +7 -79
  177. package/vue/UiInput.vue +7 -79
  178. package/vue/UiMenu.vue +42 -127
  179. package/vue/UiMenuItem.vue +1 -1
  180. package/vue/UiPopover.vue +25 -121
  181. package/vue/UiRadio.vue +22 -123
  182. package/vue/UiRadioGroup.d.ts +1 -1
  183. package/vue/UiRadioGroup.vue +32 -119
  184. package/vue/UiReel.vue +1 -1
  185. package/vue/UiSearchResultRow.vue +1 -1
  186. package/vue/UiSearchShell.vue +25 -121
  187. package/vue/UiSelect.vue +7 -79
  188. package/vue/UiSeparator.vue +1 -1
  189. package/vue/UiSidebar.vue +32 -133
  190. package/vue/UiStack.vue +1 -1
  191. package/vue/UiSwitch.vue +22 -123
  192. package/vue/UiSwitcher.vue +1 -1
  193. package/vue/UiTabs.vue +24 -128
  194. package/vue/UiTextarea.vue +7 -79
  195. package/vue/UiToastRegion.vue +37 -126
  196. package/vue/UiTooltip.vue +25 -124
  197. package/vue/UiTopBar.vue +1 -1
  198. package/vue/UiTree.vue +56 -137
  199. package/vue/UiTreeItem.vue +97 -153
  200. package/vue/chunks/UiAffordanceScope.js +9 -78
  201. package/vue/chunks/UiAvatar.js +13 -89
  202. package/vue/chunks/UiAvatarGroup.js +10 -80
  203. package/vue/chunks/UiBadge.js +1 -1
  204. package/vue/chunks/UiButton.js +1 -1
  205. package/vue/chunks/UiCallout.js +1 -1
  206. package/vue/chunks/UiCheckbox.js +17 -95
  207. package/vue/chunks/UiCluster.js +1 -1
  208. package/vue/chunks/UiCombobox.js +114 -325
  209. package/vue/chunks/UiContainer.js +1 -1
  210. package/vue/chunks/UiContextMenu.js +21 -113
  211. package/vue/chunks/UiDialog.js +20 -99
  212. package/vue/chunks/UiDisclosure.js +22 -112
  213. package/vue/chunks/UiEditable.js +32 -128
  214. package/vue/chunks/UiEditorInsertTableGrid.js +22 -116
  215. package/vue/chunks/UiEditorMentionMenu.js +18 -116
  216. package/vue/chunks/UiEditorSlashMenu.js +15 -101
  217. package/vue/chunks/UiEditorTableContextMenu.js +12 -91
  218. package/vue/chunks/UiEditorTableOverlay.js +29 -120
  219. package/vue/chunks/UiEditorTableToolbar.js +16 -111
  220. package/vue/chunks/UiEditorToolbar.js +1 -1
  221. package/vue/chunks/UiFloatingActionButton.js +1 -1
  222. package/vue/chunks/UiFormField.js +8 -73
  223. package/vue/chunks/UiGrid.js +1 -1
  224. package/vue/chunks/UiIcon.js +9 -78
  225. package/vue/chunks/UiIconButton.js +8 -73
  226. package/vue/chunks/UiInput.js +8 -73
  227. package/vue/chunks/UiMenu.js +25 -111
  228. package/vue/chunks/UiMenuItem.js +1 -1
  229. package/vue/chunks/UiPopover.js +18 -105
  230. package/vue/chunks/UiRadio.js +17 -95
  231. package/vue/chunks/UiRadioGroup.js +23 -105
  232. package/vue/chunks/UiReel.js +1 -1
  233. package/vue/chunks/UiSearchResultRow.js +1 -1
  234. package/vue/chunks/UiSearchShell.js +17 -94
  235. package/vue/chunks/UiSelect.js +8 -73
  236. package/vue/chunks/UiSeparator.js +1 -1
  237. package/vue/chunks/UiSidebar.js +23 -108
  238. package/vue/chunks/UiStack.js +1 -1
  239. package/vue/chunks/UiSwitch.js +17 -95
  240. package/vue/chunks/UiSwitcher.js +1 -1
  241. package/vue/chunks/UiTabs.js +22 -103
  242. package/vue/chunks/UiTextarea.js +8 -73
  243. package/vue/chunks/UiToastRegion.js +27 -112
  244. package/vue/chunks/UiTooltip.js +18 -106
  245. package/vue/chunks/UiTopBar.js +1 -1
  246. package/vue/chunks/UiTree.js +31 -109
  247. package/vue/chunks/UiTreeItem.js +35 -118
  248. package/vue/chunks/host.js +101 -0
  249. package/vue/components.css +759 -707
  250. package/vue/host.ts +154 -0
@@ -63,7 +63,7 @@
63
63
  </button>
64
64
  <span class="leading"><slot name="leading"></slot></span>
65
65
  <span class="label"><slot name="label"><template $value="label"></template></slot></span>
66
- <span class="actions"><slot name="actions"></slot></span>
66
+ <span class="actions" $ref="actions"><slot name="actions"></slot></span>
67
67
  <span class="drop-indicator row-drop-indicator" aria-hidden="true"></span>
68
68
  </div>
69
69
  <div class="children" $ref="children" role="group" :hidden="not (isContainer and internalExpanded)"><slot></slot></div>
@@ -72,6 +72,7 @@
72
72
  <style>
73
73
  :host {
74
74
  --_tree-row-min-height: 32px;
75
+ --_tree-disclosure-size: 16px;
75
76
 
76
77
  position: relative;
77
78
  display: block;
@@ -82,7 +83,7 @@
82
83
  .row {
83
84
  position: relative;
84
85
  display: grid;
85
- grid-template-columns: 20px auto minmax(0, 1fr) auto;
86
+ grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
86
87
  align-items: center;
87
88
  min-block-size: var(--ui-tree-item-min-block-size, var(--_tree-row-min-height));
88
89
  min-inline-size: 0;
@@ -130,13 +131,14 @@
130
131
  .disclosure-spacer {
131
132
  grid-column: 1;
132
133
  grid-row: 1;
133
- inline-size: 20px;
134
+ inline-size: var(--_tree-disclosure-size);
134
135
  block-size: 28px;
135
136
  }
136
137
 
137
138
  .disclosure {
138
139
  display: grid;
139
- place-items: center;
140
+ /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
141
+ place-items: center start;
140
142
  padding: 0;
141
143
  color: var(--ui-text-muted);
142
144
  background: transparent;
@@ -157,18 +159,18 @@
157
159
  .disclosure-icon {
158
160
  display: grid;
159
161
  place-items: center;
160
- inline-size: 14px;
161
- block-size: 14px;
162
+ inline-size: 12px;
163
+ block-size: 12px;
162
164
  transform: rotate(-90deg);
163
165
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
164
166
  }
165
167
 
166
168
  .disclosure-icon::before {
167
169
  display: block;
168
- inline-size: 0.45rem;
169
- block-size: 0.45rem;
170
- border-inline-end: 2px solid currentColor;
171
- border-block-end: 2px solid currentColor;
170
+ inline-size: 0.375rem;
171
+ block-size: 0.375rem;
172
+ border-inline-end: 1.5px solid currentColor;
173
+ border-block-end: 1.5px solid currentColor;
172
174
  content: "";
173
175
  /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
174
176
  transform: translateY(-20%) rotate(45deg);
@@ -229,12 +231,66 @@
229
231
  min-inline-size: 0;
230
232
  }
231
233
 
234
+ /* The controls sit over the label's end, so the text fades out where they begin. The fade is
235
+ the truncation mark while it shows: an ellipsis under it would read as a second one. */
236
+ .row:hover > .label,
237
+ .row:focus-within > .label {
238
+ text-overflow: clip;
239
+ mask-image: linear-gradient(
240
+ to right,
241
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
242
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
243
+ );
244
+ }
245
+
246
+ .row:hover > .label:dir(rtl),
247
+ .row:focus-within > .label:dir(rtl) {
248
+ mask-image: linear-gradient(
249
+ to left,
250
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
251
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
252
+ );
253
+ }
254
+
255
+ .row:hover > .label > :slotted(*),
256
+ .row:focus-within > .label > :slotted(*) {
257
+ text-overflow: clip;
258
+ }
259
+
232
260
  .actions {
233
- grid-column: 4;
234
- grid-row: 1;
261
+ position: absolute;
262
+ z-index: 1;
263
+ inset-block: 0;
264
+ inset-inline-end: 0;
235
265
  display: inline-flex;
236
266
  align-items: center;
237
267
  min-inline-size: 0;
268
+ opacity: 0;
269
+ pointer-events: none;
270
+ transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
271
+ }
272
+
273
+ .row:hover > .actions,
274
+ .row:focus-within > .actions {
275
+ opacity: 1;
276
+ pointer-events: auto;
277
+ }
278
+
279
+ /* Without hover there is no reveal, so the controls keep their own column. */
280
+ @media (hover: none) {
281
+ .row {
282
+ grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
283
+ }
284
+
285
+ .actions {
286
+ position: static;
287
+ grid-column: 4;
288
+ grid-row: 1;
289
+ padding-inline-start: 0;
290
+ background: none;
291
+ opacity: 1;
292
+ pointer-events: auto;
293
+ }
238
294
  }
239
295
 
240
296
  .drag-handle {
@@ -11,7 +11,7 @@ function parentItem(element) {
11
11
  /** Synchronizes an inferred tree hierarchy after nested component lowering. */
12
12
  export default function controller(host) {
13
13
  const element = host.element;
14
- const { row, disclosure, children } = host.refs;
14
+ const { row, disclosure, children, actions } = host.refs;
15
15
  // Touch use enlarges rows and hides drag handles (see the template's styles).
16
16
  trackInputModality(element.ownerDocument);
17
17
  const childItems = () => Array.from(children?.children ?? [])
@@ -81,9 +81,17 @@ export default function controller(host) {
81
81
  updateLevel();
82
82
  const stop = host.effect(apply);
83
83
  apply();
84
+ // The label's fade has to end where the controls begin, and only the controls know their width.
85
+ const actionsSize = new ResizeObserver(([entry]) => {
86
+ const width = entry.borderBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;
87
+ element.style.setProperty("--_tree-actions-width", `${width}px`);
88
+ });
89
+ if (actions) actionsSize.observe(actions);
90
+
84
91
  return () => {
85
92
  stop?.();
86
93
  observer.disconnect();
94
+ actionsSize.disconnect();
87
95
  element.removeEventListener("ui-tree-auto-expand", onAutoExpand);
88
96
  element.removeEventListener("ui-tree-structure-sync", onStructure);
89
97
  element.removeEventListener("ui-tree-roving-tab-stop", onRoving);