@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/components/ui-tree-item/ui-tree-item.html +39 -29
- package/components/ui-tree-item/ui-tree-item.js +17 -11
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/styles/ui-tree-item.css +44 -32
- package/vanilla/UiTreeItem.js +1 -1
- package/vue/UiTreeItem.vue +49 -29
- package/vue/chunks/UiTreeItem.js +15 -5
- package/vue/components.css +103 -87
package/package.json
CHANGED
package/styles/ui-tree-item.css
CHANGED
|
@@ -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
|
-
/*
|
|
186
|
-
|
|
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
|
|
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
|
|
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
|
-
/*
|
|
417
|
-
|
|
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;
|
package/vanilla/UiTreeItem.js
CHANGED
|
@@ -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;
|
package/vue/UiTreeItem.vue
CHANGED
|
@@ -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
|
-
/*
|
|
359
|
-
|
|
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
|
|
364
|
-
#000
|
|
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
|
|
374
|
-
#000
|
|
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;
|
package/vue/chunks/UiTreeItem.js
CHANGED
|
@@ -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 = {
|
|
26
|
-
|
|
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-
|
|
237
|
+
}), [["__scopeId", "data-v-3778b642"]]);
|
|
228
238
|
//#endregion
|
|
229
239
|
export { UiTreeItem_default as t };
|