@threadlabs/looma 0.10.5 → 0.10.7
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-combobox/ui-combobox.js +2 -1
- package/components/ui-tree-item/ui-tree-item.html +20 -6
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/styles/ui-tree-item.css +25 -6
- package/vue/UiTreeItem.vue +21 -6
- package/vue/chunks/UiTreeItem.js +6 -2
- package/vue/components.css +81 -68
package/package.json
CHANGED
package/styles/ui-tree-item.css
CHANGED
|
@@ -268,19 +268,23 @@
|
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
+
/* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
|
|
272
|
+
empty column, right before the icon; a branch's disclosure is there, so its handle sits just
|
|
273
|
+
outside the row. It is bare until pointed at: a resting surface behind it read as a faint
|
|
274
|
+
patch rather than as a control. */
|
|
271
275
|
.drag-handle {
|
|
272
276
|
position: absolute;
|
|
273
277
|
z-index: 2;
|
|
274
278
|
inset-block-start: 50%;
|
|
275
|
-
inset-inline-start:
|
|
276
|
-
inline-size:
|
|
277
|
-
block-size:
|
|
279
|
+
inset-inline-start: 0;
|
|
280
|
+
inline-size: var(--_tree-disclosure-size);
|
|
281
|
+
block-size: 24px;
|
|
278
282
|
display: grid;
|
|
279
283
|
place-items: center;
|
|
280
|
-
padding:
|
|
284
|
+
padding: 5px 2px;
|
|
281
285
|
color: var(--ui-text-muted);
|
|
282
|
-
background:
|
|
283
|
-
border:
|
|
286
|
+
background: transparent;
|
|
287
|
+
border: 0;
|
|
284
288
|
border-radius: var(--ui-radius-sm);
|
|
285
289
|
cursor: grab;
|
|
286
290
|
/* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
|
|
@@ -297,6 +301,16 @@
|
|
|
297
301
|
opacity: 1;
|
|
298
302
|
}
|
|
299
303
|
|
|
304
|
+
:scope[data-ui-tree-item-state~="isContainer"] > .row > .drag-handle {
|
|
305
|
+
inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.drag-handle:hover,
|
|
309
|
+
.drag-handle:focus-visible {
|
|
310
|
+
color: var(--ui-text-primary);
|
|
311
|
+
background: var(--ui-surface-hover);
|
|
312
|
+
}
|
|
313
|
+
|
|
300
314
|
.drag-handle:active {
|
|
301
315
|
cursor: grabbing;
|
|
302
316
|
}
|
|
@@ -418,6 +432,11 @@
|
|
|
418
432
|
@media (hover: none) {
|
|
419
433
|
}
|
|
420
434
|
|
|
435
|
+
/* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
|
|
436
|
+
empty column, right before the icon; a branch's disclosure is there, so its handle sits just
|
|
437
|
+
outside the row. It is bare until pointed at: a resting surface behind it read as a faint
|
|
438
|
+
patch rather than as a control. */
|
|
439
|
+
|
|
421
440
|
@media (prefers-reduced-motion: reduce) {
|
|
422
441
|
}
|
|
423
442
|
|
package/vue/UiTreeItem.vue
CHANGED
|
@@ -64,6 +64,7 @@ const hostState = computed(() =>
|
|
|
64
64
|
[
|
|
65
65
|
props.selected && 'selected',
|
|
66
66
|
props.disabled && 'disabled',
|
|
67
|
+
isContainer.value && 'isContainer',
|
|
67
68
|
].filter(Boolean).join(' ')
|
|
68
69
|
)
|
|
69
70
|
|
|
@@ -455,19 +456,23 @@ useComponentHost(controllerModule.default, {
|
|
|
455
456
|
}
|
|
456
457
|
}
|
|
457
458
|
|
|
459
|
+
/* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
|
|
460
|
+
empty column, right before the icon; a branch's disclosure is there, so its handle sits just
|
|
461
|
+
outside the row. It is bare until pointed at: a resting surface behind it read as a faint
|
|
462
|
+
patch rather than as a control. */
|
|
458
463
|
.drag-handle {
|
|
459
464
|
position: absolute;
|
|
460
465
|
z-index: 2;
|
|
461
466
|
inset-block-start: 50%;
|
|
462
|
-
inset-inline-start:
|
|
463
|
-
inline-size:
|
|
464
|
-
block-size:
|
|
467
|
+
inset-inline-start: 0;
|
|
468
|
+
inline-size: var(--_tree-disclosure-size);
|
|
469
|
+
block-size: 24px;
|
|
465
470
|
display: grid;
|
|
466
471
|
place-items: center;
|
|
467
|
-
padding:
|
|
472
|
+
padding: 5px 2px;
|
|
468
473
|
color: var(--ui-text-muted);
|
|
469
|
-
background:
|
|
470
|
-
border:
|
|
474
|
+
background: transparent;
|
|
475
|
+
border: 0;
|
|
471
476
|
border-radius: var(--ui-radius-sm);
|
|
472
477
|
cursor: grab;
|
|
473
478
|
/* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
|
|
@@ -484,6 +489,16 @@ useComponentHost(controllerModule.default, {
|
|
|
484
489
|
opacity: 1;
|
|
485
490
|
}
|
|
486
491
|
|
|
492
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle {
|
|
493
|
+
inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
.drag-handle:hover,
|
|
497
|
+
.drag-handle:focus-visible {
|
|
498
|
+
color: var(--ui-text-primary);
|
|
499
|
+
background: var(--ui-surface-hover);
|
|
500
|
+
}
|
|
501
|
+
|
|
487
502
|
.drag-handle:active {
|
|
488
503
|
cursor: grabbing;
|
|
489
504
|
}
|
package/vue/chunks/UiTreeItem.js
CHANGED
|
@@ -87,7 +87,11 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
|
|
|
87
87
|
const tabStop = ref(false);
|
|
88
88
|
const isContainer = ref(false);
|
|
89
89
|
/** The values the styles' :host-state() rules test. */
|
|
90
|
-
const hostState = computed(() => [
|
|
90
|
+
const hostState = computed(() => [
|
|
91
|
+
props.selected && "selected",
|
|
92
|
+
props.disabled && "disabled",
|
|
93
|
+
isContainer.value && "isContainer"
|
|
94
|
+
].filter(Boolean).join(" "));
|
|
91
95
|
const isExpandDetail = (detail) => detail !== null && typeof detail === "object" && !Array.isArray(detail) && typeof detail["id"] === "string" && typeof detail["expanded"] === "boolean" && (detail["trigger"] === "keyboard" || detail["trigger"] === "pointer" || detail["trigger"] === "programmatic") && Object.keys(detail).every((key) => [
|
|
92
96
|
"id",
|
|
93
97
|
"expanded",
|
|
@@ -220,6 +224,6 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
|
|
|
220
224
|
], 16, _hoisted_1);
|
|
221
225
|
};
|
|
222
226
|
}
|
|
223
|
-
}), [["__scopeId", "data-v-
|
|
227
|
+
}), [["__scopeId", "data-v-a950b4d2"]]);
|
|
224
228
|
//#endregion
|
|
225
229
|
export { UiTreeItem_default as t };
|
package/vue/components.css
CHANGED
|
@@ -4130,7 +4130,7 @@ to {
|
|
|
4130
4130
|
display: none;
|
|
4131
4131
|
}
|
|
4132
4132
|
|
|
4133
|
-
[data-component~="ui-tree-item"][data-v-
|
|
4133
|
+
[data-component~="ui-tree-item"][data-v-a950b4d2] {
|
|
4134
4134
|
--_tree-row-min-height: 32px;
|
|
4135
4135
|
--_tree-disclosure-size: 16px;
|
|
4136
4136
|
|
|
@@ -4139,7 +4139,7 @@ to {
|
|
|
4139
4139
|
min-inline-size: 0;
|
|
4140
4140
|
margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--ui-tree-indent, 16px));
|
|
4141
4141
|
}
|
|
4142
|
-
.row[data-v-
|
|
4142
|
+
.row[data-v-a950b4d2] {
|
|
4143
4143
|
position: relative;
|
|
4144
4144
|
display: grid;
|
|
4145
4145
|
grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
|
|
@@ -4156,38 +4156,38 @@ to {
|
|
|
4156
4156
|
box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
|
|
4157
4157
|
min-block-size var(--ui-motion-base) var(--ui-motion-ease);
|
|
4158
4158
|
}
|
|
4159
|
-
.row[data-v-
|
|
4160
|
-
[data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-
|
|
4161
|
-
.row[data-v-
|
|
4159
|
+
.row[data-v-a950b4d2]:hover,
|
|
4160
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-a950b4d2],
|
|
4161
|
+
.row[data-v-a950b4d2]:focus-within {
|
|
4162
4162
|
color: var(--ui-text-primary);
|
|
4163
4163
|
background: var(--ui-surface-muted);
|
|
4164
4164
|
}
|
|
4165
|
-
[data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-
|
|
4165
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-a950b4d2] {
|
|
4166
4166
|
opacity: 0.55;
|
|
4167
4167
|
}
|
|
4168
|
-
[data-component~="ui-tree-item"][data-dragging] .row[data-v-
|
|
4168
|
+
[data-component~="ui-tree-item"][data-dragging] .row[data-v-a950b4d2] {
|
|
4169
4169
|
opacity: 0.42;
|
|
4170
4170
|
}
|
|
4171
|
-
[data-component~="ui-tree-item"][data-v-
|
|
4171
|
+
[data-component~="ui-tree-item"][data-v-a950b4d2]:focus {
|
|
4172
4172
|
outline: none;
|
|
4173
4173
|
}
|
|
4174
|
-
[data-component~="ui-tree-item"]:focus-visible .row[data-v-
|
|
4174
|
+
[data-component~="ui-tree-item"]:focus-visible .row[data-v-a950b4d2] {
|
|
4175
4175
|
box-shadow: 0 0 0 2px var(--ui-focus-ring);
|
|
4176
4176
|
}
|
|
4177
4177
|
|
|
4178
4178
|
/* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
|
|
4179
|
-
[data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-
|
|
4179
|
+
[data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-a950b4d2] {
|
|
4180
4180
|
background: var(--ui-accent-subtle);
|
|
4181
4181
|
box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
4182
4182
|
}
|
|
4183
|
-
.disclosure[data-v-
|
|
4184
|
-
.disclosure-spacer[data-v-
|
|
4183
|
+
.disclosure[data-v-a950b4d2],
|
|
4184
|
+
.disclosure-spacer[data-v-a950b4d2] {
|
|
4185
4185
|
grid-column: 1;
|
|
4186
4186
|
grid-row: 1;
|
|
4187
4187
|
inline-size: var(--_tree-disclosure-size);
|
|
4188
4188
|
block-size: 28px;
|
|
4189
4189
|
}
|
|
4190
|
-
.disclosure[data-v-
|
|
4190
|
+
.disclosure[data-v-a950b4d2] {
|
|
4191
4191
|
display: grid;
|
|
4192
4192
|
/* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
|
|
4193
4193
|
place-items: center start;
|
|
@@ -4198,14 +4198,14 @@ to {
|
|
|
4198
4198
|
border-radius: var(--ui-radius-sm);
|
|
4199
4199
|
cursor: pointer;
|
|
4200
4200
|
}
|
|
4201
|
-
.disclosure[hidden][data-v-
|
|
4201
|
+
.disclosure[hidden][data-v-a950b4d2] {
|
|
4202
4202
|
display: none;
|
|
4203
4203
|
}
|
|
4204
|
-
.disclosure[data-v-
|
|
4204
|
+
.disclosure[data-v-a950b4d2]:hover {
|
|
4205
4205
|
color: var(--ui-text-primary);
|
|
4206
4206
|
background: var(--ui-surface-elevated);
|
|
4207
4207
|
}
|
|
4208
|
-
.disclosure-icon[data-v-
|
|
4208
|
+
.disclosure-icon[data-v-a950b4d2] {
|
|
4209
4209
|
display: grid;
|
|
4210
4210
|
place-items: center;
|
|
4211
4211
|
inline-size: 12px;
|
|
@@ -4213,7 +4213,7 @@ to {
|
|
|
4213
4213
|
transform: rotate(-90deg);
|
|
4214
4214
|
transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
|
|
4215
4215
|
}
|
|
4216
|
-
.disclosure-icon[data-v-
|
|
4216
|
+
.disclosure-icon[data-v-a950b4d2]::before {
|
|
4217
4217
|
display: block;
|
|
4218
4218
|
inline-size: 0.375rem;
|
|
4219
4219
|
block-size: 0.375rem;
|
|
@@ -4223,19 +4223,19 @@ to {
|
|
|
4223
4223
|
/* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
|
|
4224
4224
|
transform: translateY(-20%) rotate(45deg);
|
|
4225
4225
|
}
|
|
4226
|
-
[data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-
|
|
4226
|
+
[data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-a950b4d2] {
|
|
4227
4227
|
transform: rotate(0deg);
|
|
4228
4228
|
}
|
|
4229
4229
|
|
|
4230
4230
|
/* Lucide grip-vertical, filling the handle as in Looma 0.2. */
|
|
4231
|
-
.drag-handle svg[data-v-
|
|
4231
|
+
.drag-handle svg[data-v-a950b4d2] {
|
|
4232
4232
|
display: block;
|
|
4233
4233
|
inline-size: 100%;
|
|
4234
4234
|
block-size: 100%;
|
|
4235
4235
|
}
|
|
4236
4236
|
|
|
4237
4237
|
/* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
|
|
4238
|
-
.leading[data-v-
|
|
4238
|
+
.leading[data-v-a950b4d2] {
|
|
4239
4239
|
display: inline-grid;
|
|
4240
4240
|
place-items: center;
|
|
4241
4241
|
grid-column: 2;
|
|
@@ -4245,12 +4245,12 @@ to {
|
|
|
4245
4245
|
margin-inline-start: var(--ui-space-1);
|
|
4246
4246
|
color: var(--ui-text-muted);
|
|
4247
4247
|
}
|
|
4248
|
-
.leading[data-v-
|
|
4248
|
+
.leading[data-v-a950b4d2]:empty {
|
|
4249
4249
|
display: none;
|
|
4250
4250
|
}
|
|
4251
4251
|
|
|
4252
4252
|
/* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
|
|
4253
|
-
svg[data-v-
|
|
4253
|
+
svg[data-v-a950b4d2-s],img[data-v-a950b4d2-s] {
|
|
4254
4254
|
display: block;
|
|
4255
4255
|
inline-size: 1em;
|
|
4256
4256
|
block-size: 1em;
|
|
@@ -4259,7 +4259,7 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4259
4259
|
|
|
4260
4260
|
/* The label spans the row's height and centres its content, so slotted content (a link) can
|
|
4261
4261
|
stretch to fill the row as its own hit area; the padding tokens remove the inset. */
|
|
4262
|
-
.label[data-v-
|
|
4262
|
+
.label[data-v-a950b4d2] {
|
|
4263
4263
|
grid-column: 3;
|
|
4264
4264
|
grid-row: 1;
|
|
4265
4265
|
align-self: stretch;
|
|
@@ -4274,7 +4274,7 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4274
4274
|
|
|
4275
4275
|
/* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
|
|
4276
4276
|
its own text and reading as overflow. */
|
|
4277
|
-
.label-text[data-v-
|
|
4277
|
+
.label-text[data-v-a950b4d2] {
|
|
4278
4278
|
display: flex;
|
|
4279
4279
|
align-items: center;
|
|
4280
4280
|
/* Stretches, so slotted content can still be the row's full-height hit area. */
|
|
@@ -4284,7 +4284,7 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4284
4284
|
inline-size: 100%;
|
|
4285
4285
|
white-space: nowrap;
|
|
4286
4286
|
}
|
|
4287
|
-
.label-text > [data-v-
|
|
4287
|
+
.label-text > [data-v-a950b4d2-s] {
|
|
4288
4288
|
flex: 1 1 auto;
|
|
4289
4289
|
min-inline-size: 0;
|
|
4290
4290
|
}
|
|
@@ -4293,16 +4293,16 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4293
4293
|
there, and comes back. Only when it actually overflows — the controller measures by how
|
|
4294
4294
|
much — after the controls have taken their place over its end — and hands over the distance
|
|
4295
4295
|
and a duration from it, so a longer name travels no faster. */
|
|
4296
|
-
.row[data-ui-marquee] > .label > .label-text[data-v-
|
|
4296
|
+
.row[data-ui-marquee] > .label > .label-text[data-v-a950b4d2] {
|
|
4297
4297
|
/* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
|
|
4298
4298
|
and forth under the pointer is harder to read than one that arrives and holds. */
|
|
4299
|
-
animation: ui-tree-item-marquee-
|
|
4299
|
+
animation: ui-tree-item-marquee-a950b4d2 var(--_marquee-duration) linear 0.5s 1 normal forwards;
|
|
4300
4300
|
will-change: transform;
|
|
4301
4301
|
}
|
|
4302
4302
|
|
|
4303
4303
|
/* While it slides, the start fades too: the name is leaving the cell at both ends, and a hard
|
|
4304
4304
|
edge beside the icon reads as a collision rather than as more text. */
|
|
4305
|
-
.row[data-ui-marquee] > .label[data-v-
|
|
4305
|
+
.row[data-ui-marquee] > .label[data-v-a950b4d2] {
|
|
4306
4306
|
mask-image: linear-gradient(
|
|
4307
4307
|
to right,
|
|
4308
4308
|
transparent 0,
|
|
@@ -4311,7 +4311,7 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4311
4311
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
4312
4312
|
);
|
|
4313
4313
|
}
|
|
4314
|
-
.row[data-ui-marquee] > .label[data-v-
|
|
4314
|
+
.row[data-ui-marquee] > .label[data-v-a950b4d2]:dir(rtl) {
|
|
4315
4315
|
mask-image: linear-gradient(
|
|
4316
4316
|
to left,
|
|
4317
4317
|
transparent 0,
|
|
@@ -4320,7 +4320,7 @@ svg[data-v-171d033f-s],img[data-v-171d033f-s] {
|
|
|
4320
4320
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
4321
4321
|
);
|
|
4322
4322
|
}
|
|
4323
|
-
@keyframes ui-tree-item-marquee-
|
|
4323
|
+
@keyframes ui-tree-item-marquee-a950b4d2 {
|
|
4324
4324
|
from {
|
|
4325
4325
|
transform: translateX(0);
|
|
4326
4326
|
}
|
|
@@ -4331,15 +4331,15 @@ to {
|
|
|
4331
4331
|
|
|
4332
4332
|
/* Reduced motion keeps the fade, which already says the name continues. */
|
|
4333
4333
|
@media (prefers-reduced-motion: reduce) {
|
|
4334
|
-
.row[data-ui-marquee] > .label > .label-text[data-v-
|
|
4334
|
+
.row[data-ui-marquee] > .label > .label-text[data-v-a950b4d2] {
|
|
4335
4335
|
animation: none;
|
|
4336
4336
|
}
|
|
4337
4337
|
}
|
|
4338
4338
|
|
|
4339
4339
|
/* The controls sit over the label's end, so the text fades out where they begin. The fade is
|
|
4340
4340
|
the truncation mark while it shows: an ellipsis under it would read as a second one. */
|
|
4341
|
-
.row:hover > .label[data-v-
|
|
4342
|
-
.row:focus-within > .label[data-v-
|
|
4341
|
+
.row:hover > .label[data-v-a950b4d2],
|
|
4342
|
+
.row:focus-within > .label[data-v-a950b4d2] {
|
|
4343
4343
|
text-overflow: clip;
|
|
4344
4344
|
mask-image: linear-gradient(
|
|
4345
4345
|
to right,
|
|
@@ -4347,19 +4347,19 @@ to {
|
|
|
4347
4347
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
4348
4348
|
);
|
|
4349
4349
|
}
|
|
4350
|
-
.row:hover > .label[data-v-
|
|
4351
|
-
.row:focus-within > .label[data-v-
|
|
4350
|
+
.row:hover > .label[data-v-a950b4d2]:dir(rtl),
|
|
4351
|
+
.row:focus-within > .label[data-v-a950b4d2]:dir(rtl) {
|
|
4352
4352
|
mask-image: linear-gradient(
|
|
4353
4353
|
to left,
|
|
4354
4354
|
#000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
|
|
4355
4355
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
4356
4356
|
);
|
|
4357
4357
|
}
|
|
4358
|
-
.row:hover > .label > [data-v-
|
|
4359
|
-
.row:focus-within > .label > [data-v-
|
|
4358
|
+
.row:hover > .label > [data-v-a950b4d2-s],
|
|
4359
|
+
.row:focus-within > .label > [data-v-a950b4d2-s] {
|
|
4360
4360
|
text-overflow: clip;
|
|
4361
4361
|
}
|
|
4362
|
-
.actions[data-v-
|
|
4362
|
+
.actions[data-v-a950b4d2] {
|
|
4363
4363
|
position: absolute;
|
|
4364
4364
|
z-index: 1;
|
|
4365
4365
|
inset-block: 0;
|
|
@@ -4371,18 +4371,18 @@ to {
|
|
|
4371
4371
|
pointer-events: none;
|
|
4372
4372
|
transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
|
|
4373
4373
|
}
|
|
4374
|
-
.row:hover > .actions[data-v-
|
|
4375
|
-
.row:focus-within > .actions[data-v-
|
|
4374
|
+
.row:hover > .actions[data-v-a950b4d2],
|
|
4375
|
+
.row:focus-within > .actions[data-v-a950b4d2] {
|
|
4376
4376
|
opacity: 1;
|
|
4377
4377
|
pointer-events: auto;
|
|
4378
4378
|
}
|
|
4379
4379
|
|
|
4380
4380
|
/* Without hover there is no reveal, so the controls keep their own column. */
|
|
4381
4381
|
@media (hover: none) {
|
|
4382
|
-
.row[data-v-
|
|
4382
|
+
.row[data-v-a950b4d2] {
|
|
4383
4383
|
grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
|
|
4384
4384
|
}
|
|
4385
|
-
.actions[data-v-
|
|
4385
|
+
.actions[data-v-a950b4d2] {
|
|
4386
4386
|
position: static;
|
|
4387
4387
|
grid-column: 4;
|
|
4388
4388
|
grid-row: 1;
|
|
@@ -4392,19 +4392,24 @@ to {
|
|
|
4392
4392
|
pointer-events: auto;
|
|
4393
4393
|
}
|
|
4394
4394
|
}
|
|
4395
|
-
|
|
4395
|
+
|
|
4396
|
+
/* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
|
|
4397
|
+
empty column, right before the icon; a branch's disclosure is there, so its handle sits just
|
|
4398
|
+
outside the row. It is bare until pointed at: a resting surface behind it read as a faint
|
|
4399
|
+
patch rather than as a control. */
|
|
4400
|
+
.drag-handle[data-v-a950b4d2] {
|
|
4396
4401
|
position: absolute;
|
|
4397
4402
|
z-index: 2;
|
|
4398
4403
|
inset-block-start: 50%;
|
|
4399
|
-
inset-inline-start:
|
|
4400
|
-
inline-size:
|
|
4401
|
-
block-size:
|
|
4404
|
+
inset-inline-start: 0;
|
|
4405
|
+
inline-size: var(--_tree-disclosure-size);
|
|
4406
|
+
block-size: 24px;
|
|
4402
4407
|
display: grid;
|
|
4403
4408
|
place-items: center;
|
|
4404
|
-
padding:
|
|
4409
|
+
padding: 5px 2px;
|
|
4405
4410
|
color: var(--ui-text-muted);
|
|
4406
|
-
background:
|
|
4407
|
-
border:
|
|
4411
|
+
background: transparent;
|
|
4412
|
+
border: 0;
|
|
4408
4413
|
border-radius: var(--ui-radius-sm);
|
|
4409
4414
|
cursor: grab;
|
|
4410
4415
|
/* Hidden until the row is hovered, but always hittable: the handle sits outside the row, and moving
|
|
@@ -4413,16 +4418,24 @@ to {
|
|
|
4413
4418
|
transform: translateY(-50%);
|
|
4414
4419
|
transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
|
|
4415
4420
|
}
|
|
4416
|
-
.row:hover .drag-handle[data-v-
|
|
4417
|
-
.drag-handle[data-v-
|
|
4418
|
-
.drag-handle[data-v-
|
|
4419
|
-
[data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-
|
|
4421
|
+
.row:hover .drag-handle[data-v-a950b4d2],
|
|
4422
|
+
.drag-handle[data-v-a950b4d2]:hover,
|
|
4423
|
+
.drag-handle[data-v-a950b4d2]:focus-visible,
|
|
4424
|
+
[data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-a950b4d2] {
|
|
4420
4425
|
opacity: 1;
|
|
4421
4426
|
}
|
|
4422
|
-
.drag-handle[data-v-
|
|
4427
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-a950b4d2] {
|
|
4428
|
+
inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
|
|
4429
|
+
}
|
|
4430
|
+
.drag-handle[data-v-a950b4d2]:hover,
|
|
4431
|
+
.drag-handle[data-v-a950b4d2]:focus-visible {
|
|
4432
|
+
color: var(--ui-text-primary);
|
|
4433
|
+
background: var(--ui-surface-hover);
|
|
4434
|
+
}
|
|
4435
|
+
.drag-handle[data-v-a950b4d2]:active {
|
|
4423
4436
|
cursor: grabbing;
|
|
4424
4437
|
}
|
|
4425
|
-
.drop-indicator[data-v-
|
|
4438
|
+
.drop-indicator[data-v-a950b4d2] {
|
|
4426
4439
|
position: absolute;
|
|
4427
4440
|
z-index: 3;
|
|
4428
4441
|
inset-inline: 1px;
|
|
@@ -4432,8 +4445,8 @@ to {
|
|
|
4432
4445
|
background: var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
4433
4446
|
pointer-events: none;
|
|
4434
4447
|
}
|
|
4435
|
-
.drop-indicator[data-v-
|
|
4436
|
-
.drop-indicator[data-v-
|
|
4448
|
+
.drop-indicator[data-v-a950b4d2]::before,
|
|
4449
|
+
.drop-indicator[data-v-a950b4d2]::after {
|
|
4437
4450
|
content: "";
|
|
4438
4451
|
position: absolute;
|
|
4439
4452
|
inset-block-start: 50%;
|
|
@@ -4444,39 +4457,39 @@ to {
|
|
|
4444
4457
|
background: var(--ui-surface-elevated);
|
|
4445
4458
|
transform: translateY(-50%);
|
|
4446
4459
|
}
|
|
4447
|
-
.drop-indicator[data-v-
|
|
4460
|
+
.drop-indicator[data-v-a950b4d2]::before {
|
|
4448
4461
|
inset-inline-start: -1px;
|
|
4449
4462
|
}
|
|
4450
|
-
.drop-indicator[data-v-
|
|
4463
|
+
.drop-indicator[data-v-a950b4d2]::after {
|
|
4451
4464
|
inset-inline-end: -1px;
|
|
4452
4465
|
}
|
|
4453
|
-
[data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-
|
|
4466
|
+
[data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-a950b4d2] {
|
|
4454
4467
|
display: block;
|
|
4455
4468
|
inset-block-start: -1px;
|
|
4456
4469
|
}
|
|
4457
|
-
[data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-
|
|
4470
|
+
[data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-a950b4d2] {
|
|
4458
4471
|
display: block;
|
|
4459
4472
|
inset-block-end: -1px;
|
|
4460
4473
|
}
|
|
4461
|
-
.children[hidden][data-v-
|
|
4474
|
+
.children[hidden][data-v-a950b4d2] {
|
|
4462
4475
|
display: none;
|
|
4463
4476
|
}
|
|
4464
|
-
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-
|
|
4477
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-a950b4d2] {
|
|
4465
4478
|
--_tree-row-min-height: 44px;
|
|
4466
4479
|
}
|
|
4467
|
-
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-
|
|
4480
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-a950b4d2] {
|
|
4468
4481
|
display: none;
|
|
4469
4482
|
}
|
|
4470
4483
|
@media (prefers-reduced-motion: reduce) {
|
|
4471
|
-
.row[data-v-
|
|
4472
|
-
.disclosure-icon[data-v-
|
|
4473
|
-
.drag-handle[data-v-
|
|
4484
|
+
.row[data-v-a950b4d2],
|
|
4485
|
+
.disclosure-icon[data-v-a950b4d2],
|
|
4486
|
+
.drag-handle[data-v-a950b4d2] {
|
|
4474
4487
|
transition: none;
|
|
4475
4488
|
}
|
|
4476
4489
|
}
|
|
4477
4490
|
|
|
4478
4491
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
4479
|
-
[data-component~="ui-tree-item"][hidden][data-v-
|
|
4492
|
+
[data-component~="ui-tree-item"][hidden][data-v-a950b4d2] {
|
|
4480
4493
|
display: none;
|
|
4481
4494
|
}
|
|
4482
4495
|
/**
|