@threadlabs/looma 0.10.10 → 0.10.11

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.10.10",
3
+ "version": "0.10.11",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -136,6 +136,9 @@
136
136
  block-size: 1em;
137
137
  margin-inline-start: var(--ui-space-1);
138
138
  color: var(--ui-text-muted);
139
+ /* Above the label, so a sliding name passes under the icon. */
140
+ position: relative;
141
+ z-index: 1;
139
142
  }
140
143
 
141
144
  .leading:empty {
@@ -156,6 +159,9 @@
156
159
  /* The cell clips: a name longer than the row slides inside it rather than over its icons. */
157
160
  overflow: hidden;
158
161
  padding: var(--ui-tree-item-label-padding-block, var(--ui-space-1)) var(--ui-tree-item-label-padding-inline, var(--ui-space-2));
162
+ /* The length of the fade before the controls. The label's one flex child lays out no gap; this
163
+ is where the controller reads the length in pixels to stop a sliding name before the fade. */
164
+ column-gap: var(--ui-space-3);
159
165
  }
160
166
 
161
167
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
@@ -171,6 +177,27 @@
171
177
  white-space: nowrap;
172
178
  }
173
179
 
180
+ /* The controls sit over the label's end, so the text fades out where they begin. The fade is
181
+ the truncation mark while it shows: an ellipsis under it would read as a second one. */
182
+ .row:hover > .label,
183
+ .row:focus-within > .label {
184
+ text-overflow: clip;
185
+ mask-image: linear-gradient(
186
+ to right,
187
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
188
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
189
+ );
190
+ }
191
+
192
+ .row:hover > .label:dir(rtl),
193
+ .row:focus-within > .label:dir(rtl) {
194
+ mask-image: linear-gradient(
195
+ to left,
196
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
197
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
198
+ );
199
+ }
200
+
174
201
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
175
202
  there, and comes back. Only when it actually overflows — the controller measures by how
176
203
  much — after the controls have taken their place over its end — and hands over the distance
@@ -182,13 +209,17 @@
182
209
  will-change: transform;
183
210
  }
184
211
 
185
- /* While it slides, the start fades too: the name is leaving the cell at both ends, and a hard
186
- edge beside the icon reads as a collision rather than as more text. */
212
+ /* This comes after the hover fade, which it replaces at the same specificity. While the name
213
+ slides, the label reaches back under the icon (the controller measures how far) with its text
214
+ where it was, and fades out across that stretch, gone by the icon's middle: the name slips
215
+ under the icon rather than stopping at a hard edge beside it. */
187
216
  .row[data-ui-marquee] > .label {
217
+ margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
218
+ padding-inline-start: calc(var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2)));
188
219
  mask-image: linear-gradient(
189
220
  to right,
190
- transparent 0,
191
- #000 var(--ui-space-2),
221
+ transparent calc(var(--_marquee-lead, 0px) / 2),
222
+ #000 calc(var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))),
192
223
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
193
224
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
194
225
  );
@@ -197,8 +228,8 @@
197
228
  .row[data-ui-marquee] > .label:dir(rtl) {
198
229
  mask-image: linear-gradient(
199
230
  to left,
200
- transparent 0,
201
- #000 var(--ui-space-2),
231
+ transparent calc(var(--_marquee-lead, 0px) / 2),
232
+ #000 calc(var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))),
202
233
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
203
234
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
204
235
  );
@@ -211,27 +242,6 @@
211
242
  }
212
243
  }
213
244
 
214
- /* The controls sit over the label's end, so the text fades out where they begin. The fade is
215
- the truncation mark while it shows: an ellipsis under it would read as a second one. */
216
- .row:hover > .label,
217
- .row:focus-within > .label {
218
- text-overflow: clip;
219
- mask-image: linear-gradient(
220
- to right,
221
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
222
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
223
- );
224
- }
225
-
226
- .row:hover > .label:dir(rtl),
227
- .row:focus-within > .label:dir(rtl) {
228
- mask-image: linear-gradient(
229
- to left,
230
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
231
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
232
- );
233
- }
234
-
235
245
  .actions {
236
246
  position: absolute;
237
247
  z-index: 1;
@@ -408,21 +418,23 @@
408
418
  min-inline-size: 0;
409
419
  }
410
420
 
421
+ /* The controls sit over the label's end, so the text fades out where they begin. The fade is
422
+ the truncation mark while it shows: an ellipsis under it would read as a second one. */
423
+
411
424
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
412
425
  there, and comes back. Only when it actually overflows — the controller measures by how
413
426
  much — after the controls have taken their place over its end — and hands over the distance
414
427
  and a duration from it, so a longer name travels no faster. */
415
428
 
416
- /* While it slides, the start fades too: the name is leaving the cell at both ends, and a hard
417
- edge beside the icon reads as a collision rather than as more text. */
429
+ /* This comes after the hover fade, which it replaces at the same specificity. While the name
430
+ slides, the label reaches back under the icon (the controller measures how far) with its text
431
+ where it was, and fades out across that stretch, gone by the icon's middle: the name slips
432
+ under the icon rather than stopping at a hard edge beside it. */
418
433
 
419
434
  /* Reduced motion keeps the fade, which already says the name continues. */
420
435
  @media (prefers-reduced-motion: reduce) {
421
436
  }
422
437
 
423
- /* The controls sit over the label's end, so the text fades out where they begin. The fade is
424
- the truncation mark while it shows: an ellipsis under it would read as a second one. */
425
-
426
438
  .row:hover > .label > :where([data-slotted], [data-slotted] *):is(*),
427
439
  .row:focus-within > .label > :where([data-slotted], [data-slotted] *):is(*) {
428
440
  text-overflow: clip;
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-tree-item/ui-tree-item.js";
4
4
  import "../styles/ui-tree-item.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-tree-item","props":{"accepts":{"type":"string","required":false,"target":{"attribute":"data-accepts"},"default":""},"container":{"type":"boolean","required":false,"target":{"attribute":"container"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"aria-disabled"},"default":false},"dragType":{"type":"string","required":false,"target":{"attribute":"data-drag-type"},"default":"item"},"dropDepth":{"type":"number","required":false,"target":{"attribute":"data-drop-depth"}},"dropScope":{"type":"string","required":false,"target":{"attribute":"data-drop-scope"},"default":""},"expanded":{"type":"boolean","required":false,"target":{"attribute":"expanded"},"default":false},"itemId":{"type":"string","required":false,"target":{"attribute":"data-item-id"},"default":""},"label":{"type":"string","required":false,"target":{"attribute":"aria-label"},"default":""},"marquee":{"type":"boolean","required":false,"target":{"attribute":"marquee"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"aria-selected"},"default":false},"sortable":{"type":"boolean","required":false,"target":{"attribute":"sortable"},"default":false},"subtreeDepth":{"type":"number","required":false,"target":{"attribute":"data-subtree-depth"}}}},"template":{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"role","value":"treeitem"},{"kind":"attribute","name":"aria-label","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}},{"kind":"attribute","name":"aria-level","expression":"structuralLevel","expressionPlan":{"source":"structuralLevel","ast":{"kind":"id","name":"structuralLevel"},"dependencies":["structuralLevel"]}},{"kind":"attribute","name":"aria-selected","expression":"selected","expressionPlan":{"source":"selected","ast":{"kind":"id","name":"selected"},"dependencies":["selected"]}},{"kind":"attribute","name":"aria-disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"data-item-id","expression":"itemId","expressionPlan":{"source":"itemId","ast":{"kind":"id","name":"itemId"},"dependencies":["itemId"]}},{"kind":"attribute","name":"data-drag-type","expression":"dragType","expressionPlan":{"source":"dragType","ast":{"kind":"id","name":"dragType"},"dependencies":["dragType"]}},{"kind":"attribute","name":"data-drop-scope","expression":"dropScope","expressionPlan":{"source":"dropScope","ast":{"kind":"id","name":"dropScope"},"dependencies":["dropScope"]}},{"kind":"attribute","name":"data-accepts","expression":"accepts","expressionPlan":{"source":"accepts","ast":{"kind":"id","name":"accepts"},"dependencies":["accepts"]}},{"kind":"attribute","name":"data-drop-depth","expression":"dropDepth","expressionPlan":{"source":"dropDepth","ast":{"kind":"id","name":"dropDepth"},"dependencies":["dropDepth"]}},{"kind":"attribute","name":"data-subtree-depth","expression":"subtreeDepth","expressionPlan":{"source":"subtreeDepth","ast":{"kind":"id","name":"subtreeDepth"},"dependencies":["subtreeDepth"]}}],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"row"}],"children":[{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"drag-handle"},{"kind":"literal","name":"type","value":"button"},{"kind":"literal","name":"draggable","value":"true"},{"kind":"attribute","name":"aria-label","expression":"format('Drag %s to reorder', label)","expressionPlan":{"source":"format('Drag %s to reorder', label)","ast":{"kind":"call","fn":"format","args":[{"kind":"literal","value":"Drag %s to reorder"},{"kind":"id","name":"label"}]},"dependencies":["label"]}}],"children":[{"kind":"element","name":"svg","attributes":[{"kind":"literal","name":"aria-hidden","value":"true"},{"kind":"literal","name":"focusable","value":"false"},{"kind":"literal","name":"viewBox","value":"0 0 24 24"},{"kind":"literal","name":"fill","value":"none"},{"kind":"literal","name":"stroke","value":"currentColor"},{"kind":"literal","name":"stroke-width","value":"2"},{"kind":"literal","name":"stroke-linecap","value":"round"},{"kind":"literal","name":"stroke-linejoin","value":"round"}],"children":[{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"12"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"5"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"19"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"12"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"5"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"19"},{"kind":"literal","name":"r","value":"1"}],"children":[]}]}],"flow":{"kind":"if","test":"sortable and not disabled","testPlan":{"source":"sortable and not disabled","ast":{"kind":"binary","op":"and","left":{"kind":"id","name":"sortable"},"right":{"kind":"unary","op":"not","operand":{"kind":"id","name":"disabled"}}},"dependencies":["disabled","sortable"]}},"ref":"dragHandle"},{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"disclosure"},{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"hidden","expression":"not isContainer","expressionPlan":{"source":"not isContainer","ast":{"kind":"unary","op":"not","operand":{"kind":"id","name":"isContainer"}},"dependencies":["isContainer"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"disclosure-icon"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}],"ref":"disclosure"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label-text"}],"children":[{"kind":"slot","fallback":[{"kind":"element","name":"template","attributes":[{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[]}],"name":"label"}],"ref":"labelText"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"actions"}],"children":[{"kind":"slot","fallback":[],"name":"actions"}],"ref":"actions"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"drop-indicator row-drop-indicator"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}],"ref":"row"},{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"children"},{"kind":"literal","name":"role","value":"group"},{"kind":"attribute","name":"hidden","expression":"not (isContainer and internalExpanded)","expressionPlan":{"source":"not (isContainer and internalExpanded)","ast":{"kind":"unary","op":"not","operand":{"kind":"binary","op":"and","left":{"kind":"id","name":"isContainer"},"right":{"kind":"id","name":"internalExpanded"}}},"dependencies":["internalExpanded","isContainer"]}}],"children":[{"kind":"slot"}],"ref":"children"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"drop-indicator subtree-drop-indicator"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}]},"declarations":[{"kind":"state","name":"internalExpanded","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"structuralLevel","expression":{"source":"1","ast":{"kind":"literal","value":1},"dependencies":[]}},{"kind":"state","name":"tabStop","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"isContainer","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"expand","type":"object({ id: string, expanded: boolean, trigger: keyboard | pointer | programmatic })","bubbles":false,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"div","choices":["div"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-tree-item","props":{"accepts":{"type":"string","required":false,"target":{"attribute":"data-accepts"},"default":""},"container":{"type":"boolean","required":false,"target":{"attribute":"container"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"aria-disabled"},"default":false},"dragType":{"type":"string","required":false,"target":{"attribute":"data-drag-type"},"default":"item"},"dropDepth":{"type":"number","required":false,"target":{"attribute":"data-drop-depth"}},"dropScope":{"type":"string","required":false,"target":{"attribute":"data-drop-scope"},"default":""},"expanded":{"type":"boolean","required":false,"target":{"attribute":"expanded"},"default":false},"itemId":{"type":"string","required":false,"target":{"attribute":"data-item-id"},"default":""},"label":{"type":"string","required":false,"target":{"attribute":"aria-label"},"default":""},"marquee":{"type":"boolean","required":false,"target":{"attribute":"marquee"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"aria-selected"},"default":false},"sortable":{"type":"boolean","required":false,"target":{"attribute":"sortable"},"default":false},"subtreeDepth":{"type":"number","required":false,"target":{"attribute":"data-subtree-depth"}}}},"template":{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"role","value":"treeitem"},{"kind":"attribute","name":"aria-label","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}},{"kind":"attribute","name":"aria-level","expression":"structuralLevel","expressionPlan":{"source":"structuralLevel","ast":{"kind":"id","name":"structuralLevel"},"dependencies":["structuralLevel"]}},{"kind":"attribute","name":"aria-selected","expression":"selected","expressionPlan":{"source":"selected","ast":{"kind":"id","name":"selected"},"dependencies":["selected"]}},{"kind":"attribute","name":"aria-disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"data-item-id","expression":"itemId","expressionPlan":{"source":"itemId","ast":{"kind":"id","name":"itemId"},"dependencies":["itemId"]}},{"kind":"attribute","name":"data-drag-type","expression":"dragType","expressionPlan":{"source":"dragType","ast":{"kind":"id","name":"dragType"},"dependencies":["dragType"]}},{"kind":"attribute","name":"data-drop-scope","expression":"dropScope","expressionPlan":{"source":"dropScope","ast":{"kind":"id","name":"dropScope"},"dependencies":["dropScope"]}},{"kind":"attribute","name":"data-accepts","expression":"accepts","expressionPlan":{"source":"accepts","ast":{"kind":"id","name":"accepts"},"dependencies":["accepts"]}},{"kind":"attribute","name":"data-drop-depth","expression":"dropDepth","expressionPlan":{"source":"dropDepth","ast":{"kind":"id","name":"dropDepth"},"dependencies":["dropDepth"]}},{"kind":"attribute","name":"data-subtree-depth","expression":"subtreeDepth","expressionPlan":{"source":"subtreeDepth","ast":{"kind":"id","name":"subtreeDepth"},"dependencies":["subtreeDepth"]}}],"children":[{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"row"}],"children":[{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"drag-handle"},{"kind":"literal","name":"type","value":"button"},{"kind":"literal","name":"draggable","value":"true"},{"kind":"attribute","name":"aria-label","expression":"format('Drag %s to reorder', label)","expressionPlan":{"source":"format('Drag %s to reorder', label)","ast":{"kind":"call","fn":"format","args":[{"kind":"literal","value":"Drag %s to reorder"},{"kind":"id","name":"label"}]},"dependencies":["label"]}}],"children":[{"kind":"element","name":"svg","attributes":[{"kind":"literal","name":"aria-hidden","value":"true"},{"kind":"literal","name":"focusable","value":"false"},{"kind":"literal","name":"viewBox","value":"0 0 24 24"},{"kind":"literal","name":"fill","value":"none"},{"kind":"literal","name":"stroke","value":"currentColor"},{"kind":"literal","name":"stroke-width","value":"2"},{"kind":"literal","name":"stroke-linecap","value":"round"},{"kind":"literal","name":"stroke-linejoin","value":"round"}],"children":[{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"12"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"5"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"9"},{"kind":"literal","name":"cy","value":"19"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"12"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"5"},{"kind":"literal","name":"r","value":"1"}],"children":[]},{"kind":"element","name":"circle","attributes":[{"kind":"literal","name":"cx","value":"15"},{"kind":"literal","name":"cy","value":"19"},{"kind":"literal","name":"r","value":"1"}],"children":[]}]}],"flow":{"kind":"if","test":"sortable and not disabled","testPlan":{"source":"sortable and not disabled","ast":{"kind":"binary","op":"and","left":{"kind":"id","name":"sortable"},"right":{"kind":"unary","op":"not","operand":{"kind":"id","name":"disabled"}}},"dependencies":["disabled","sortable"]}},"ref":"dragHandle"},{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"class","value":"disclosure"},{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"hidden","expression":"not isContainer","expressionPlan":{"source":"not isContainer","ast":{"kind":"unary","op":"not","operand":{"kind":"id","name":"isContainer"}},"dependencies":["isContainer"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"disclosure-icon"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}],"ref":"disclosure"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}],"ref":"leading"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label-text"}],"children":[{"kind":"slot","fallback":[{"kind":"element","name":"template","attributes":[{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[]}],"name":"label"}],"ref":"labelText"}],"ref":"label"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"actions"}],"children":[{"kind":"slot","fallback":[],"name":"actions"}],"ref":"actions"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"drop-indicator row-drop-indicator"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}],"ref":"row"},{"kind":"element","name":"div","attributes":[{"kind":"literal","name":"class","value":"children"},{"kind":"literal","name":"role","value":"group"},{"kind":"attribute","name":"hidden","expression":"not (isContainer and internalExpanded)","expressionPlan":{"source":"not (isContainer and internalExpanded)","ast":{"kind":"unary","op":"not","operand":{"kind":"binary","op":"and","left":{"kind":"id","name":"isContainer"},"right":{"kind":"id","name":"internalExpanded"}}},"dependencies":["internalExpanded","isContainer"]}}],"children":[{"kind":"slot"}],"ref":"children"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"drop-indicator subtree-drop-indicator"},{"kind":"literal","name":"aria-hidden","value":"true"}],"children":[]}]},"declarations":[{"kind":"state","name":"internalExpanded","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"structuralLevel","expression":{"source":"1","ast":{"kind":"literal","value":1},"dependencies":[]}},{"kind":"state","name":"tabStop","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"state","name":"isContainer","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"expand","type":"object({ id: string, expanded: boolean, trigger: keyboard | pointer | programmatic })","bubbles":false,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"div","choices":["div"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiTreeItem(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, as, ...componentProps } = options;
@@ -51,6 +51,8 @@ const root = ref<HTMLElement | null>(null)
51
51
  const rowElement = useTemplateRef<HTMLElement>('row')
52
52
  const dragHandleElement = useTemplateRef<HTMLElement>('dragHandle')
53
53
  const disclosureElement = useTemplateRef<HTMLElement>('disclosure')
54
+ const leadingElement = useTemplateRef<HTMLElement>('leading')
55
+ const labelElement = useTemplateRef<HTMLElement>('label')
54
56
  const labelTextElement = useTemplateRef<HTMLElement>('labelText')
55
57
  const actionsElement = useTemplateRef<HTMLElement>('actions')
56
58
  const childrenElement = useTemplateRef<HTMLElement>('children')
@@ -92,6 +94,8 @@ useComponentHost(controllerModule.default, {
92
94
  row: rowElement,
93
95
  dragHandle: dragHandleElement,
94
96
  disclosure: disclosureElement,
97
+ leading: leadingElement,
98
+ label: labelElement,
95
99
  labelText: labelTextElement,
96
100
  actions: actionsElement,
97
101
  children: childrenElement,
@@ -154,8 +158,8 @@ useComponentHost(controllerModule.default, {
154
158
  >
155
159
  <span class="disclosure-icon" aria-hidden="true"></span>
156
160
  </button>
157
- <span class="leading"><slot name="leading" /></span>
158
- <span class="label"><span class="label-text" ref="labelText"><slot name="label">{{
161
+ <span class="leading" ref="leading"><slot name="leading" /></span>
162
+ <span class="label" ref="label"><span class="label-text" ref="labelText"><slot name="label">{{
159
163
  label
160
164
  }}</slot></span></span>
161
165
  <span class="actions" ref="actions"><slot name="actions" /></span>
@@ -296,6 +300,9 @@ useComponentHost(controllerModule.default, {
296
300
  block-size: 1em;
297
301
  margin-inline-start: var(--ui-space-1);
298
302
  color: var(--ui-text-muted);
303
+ /* Above the label, so a sliding name passes under the icon. */
304
+ position: relative;
305
+ z-index: 1;
299
306
  }
300
307
 
301
308
  .leading:empty {
@@ -324,6 +331,9 @@ useComponentHost(controllerModule.default, {
324
331
  overflow: hidden;
325
332
  padding: var(--ui-tree-item-label-padding-block, var(--ui-space-1))
326
333
  var(--ui-tree-item-label-padding-inline, var(--ui-space-2));
334
+ /* The length of the fade before the controls. The label's one flex child lays out no gap; this
335
+ is where the controller reads the length in pixels to stop a sliding name before the fade. */
336
+ column-gap: var(--ui-space-3);
327
337
  }
328
338
 
329
339
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
@@ -344,6 +354,27 @@ useComponentHost(controllerModule.default, {
344
354
  min-inline-size: 0;
345
355
  }
346
356
 
357
+ /* The controls sit over the label's end, so the text fades out where they begin. The fade is
358
+ the truncation mark while it shows: an ellipsis under it would read as a second one. */
359
+ .row:hover > .label,
360
+ .row:focus-within > .label {
361
+ text-overflow: clip;
362
+ mask-image: linear-gradient(
363
+ to right,
364
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
365
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
366
+ );
367
+ }
368
+
369
+ .row:hover > .label:dir(rtl),
370
+ .row:focus-within > .label:dir(rtl) {
371
+ mask-image: linear-gradient(
372
+ to left,
373
+ #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
374
+ transparent calc(100% - var(--_tree-actions-width, 1.75rem))
375
+ );
376
+ }
377
+
347
378
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
348
379
  there, and comes back. Only when it actually overflows — the controller measures by how
349
380
  much — after the controls have taken their place over its end — and hands over the distance
@@ -355,13 +386,21 @@ useComponentHost(controllerModule.default, {
355
386
  will-change: transform;
356
387
  }
357
388
 
358
- /* While it slides, the start fades too: the name is leaving the cell at both ends, and a hard
359
- edge beside the icon reads as a collision rather than as more text. */
389
+ /* This comes after the hover fade, which it replaces at the same specificity. While the name
390
+ slides, the label reaches back under the icon (the controller measures how far) with its text
391
+ where it was, and fades out across that stretch, gone by the icon's middle: the name slips
392
+ under the icon rather than stopping at a hard edge beside it. */
360
393
  .row[data-ui-marquee] > .label {
394
+ margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
395
+ padding-inline-start: calc(
396
+ var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
397
+ );
361
398
  mask-image: linear-gradient(
362
399
  to right,
363
- transparent 0,
364
- #000 var(--ui-space-2),
400
+ transparent calc(var(--_marquee-lead, 0px) / 2),
401
+ #000 calc(
402
+ var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
403
+ ),
365
404
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
366
405
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
367
406
  );
@@ -370,8 +409,10 @@ useComponentHost(controllerModule.default, {
370
409
  .row[data-ui-marquee] > .label:dir(rtl) {
371
410
  mask-image: linear-gradient(
372
411
  to left,
373
- transparent 0,
374
- #000 var(--ui-space-2),
412
+ transparent calc(var(--_marquee-lead, 0px) / 2),
413
+ #000 calc(
414
+ var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
415
+ ),
375
416
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
376
417
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
377
418
  );
@@ -394,27 +435,6 @@ useComponentHost(controllerModule.default, {
394
435
  }
395
436
  }
396
437
 
397
- /* The controls sit over the label's end, so the text fades out where they begin. The fade is
398
- the truncation mark while it shows: an ellipsis under it would read as a second one. */
399
- .row:hover > .label,
400
- .row:focus-within > .label {
401
- text-overflow: clip;
402
- mask-image: linear-gradient(
403
- to right,
404
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
405
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
406
- );
407
- }
408
-
409
- .row:hover > .label:dir(rtl),
410
- .row:focus-within > .label:dir(rtl) {
411
- mask-image: linear-gradient(
412
- to left,
413
- #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
414
- transparent calc(100% - var(--_tree-actions-width, 1.75rem))
415
- );
416
- }
417
-
418
438
  .row:hover > .label > :slotted(*),
419
439
  .row:focus-within > .label > :slotted(*) {
420
440
  text-overflow: clip;
@@ -22,8 +22,14 @@ var _hoisted_2 = {
22
22
  };
23
23
  var _hoisted_3 = ["aria-label"];
24
24
  var _hoisted_4 = ["disabled", "hidden"];
25
- var _hoisted_5 = { class: "leading" };
26
- var _hoisted_6 = { class: "label" };
25
+ var _hoisted_5 = {
26
+ class: "leading",
27
+ ref: "leading"
28
+ };
29
+ var _hoisted_6 = {
30
+ class: "label",
31
+ ref: "label"
32
+ };
27
33
  var _hoisted_7 = {
28
34
  class: "label-text",
29
35
  ref: "labelText"
@@ -79,6 +85,8 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
79
85
  const rowElement = useTemplateRef("row");
80
86
  const dragHandleElement = useTemplateRef("dragHandle");
81
87
  const disclosureElement = useTemplateRef("disclosure");
88
+ const leadingElement = useTemplateRef("leading");
89
+ const labelElement = useTemplateRef("label");
82
90
  const labelTextElement = useTemplateRef("labelText");
83
91
  const actionsElement = useTemplateRef("actions");
84
92
  const childrenElement = useTemplateRef("children");
@@ -114,6 +122,8 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
114
122
  row: rowElement,
115
123
  dragHandle: dragHandleElement,
116
124
  disclosure: disclosureElement,
125
+ leading: leadingElement,
126
+ label: labelElement,
117
127
  labelText: labelTextElement,
118
128
  actions: actionsElement,
119
129
  children: childrenElement
@@ -203,8 +213,8 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
203
213
  class: "disclosure-icon",
204
214
  "aria-hidden": "true"
205
215
  }, null, -1)])], 8, _hoisted_4),
206
- createElementVNode("span", _hoisted_5, [renderSlot(_ctx.$slots, "leading")]),
207
- createElementVNode("span", _hoisted_6, [createElementVNode("span", _hoisted_7, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])], 512)]),
216
+ createElementVNode("span", _hoisted_5, [renderSlot(_ctx.$slots, "leading")], 512),
217
+ createElementVNode("span", _hoisted_6, [createElementVNode("span", _hoisted_7, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])], 512)], 512),
208
218
  createElementVNode("span", _hoisted_8, [renderSlot(_ctx.$slots, "actions")], 512),
209
219
  _cache[2] || (_cache[2] = createElementVNode("span", {
210
220
  class: "drop-indicator row-drop-indicator",
@@ -224,6 +234,6 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
224
234
  ], 16, _hoisted_1);
225
235
  };
226
236
  }
227
- }), [["__scopeId", "data-v-a950b4d2"]]);
237
+ }), [["__scopeId", "data-v-3778b642"]]);
228
238
  //#endregion
229
239
  export { UiTreeItem_default as t };