@threadlabs/looma 0.11.1 → 0.11.3
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-input/ui-input.html +4 -4
- package/components/ui-input-group/ui-input-group.html +86 -0
- package/components/ui-list/ui-list.html +12 -0
- package/components/ui-list-item/ui-list-item.html +4 -4
- package/components/ui-tree-item/ui-tree-item.html +1 -1
- package/components/ui-tree-item/ui-tree-item.js +2 -5
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/styles/ui-input-group.css +87 -0
- package/styles/ui-input.css +4 -4
- package/styles/ui-list-item.css +4 -4
- package/styles/ui-list.css +11 -0
- package/styles/ui-tree-item.css +2 -2
- package/vanilla/UiInputGroup.d.ts +14 -0
- package/vanilla/UiInputGroup.js +53 -0
- package/vanilla/UiList.d.ts +1 -0
- package/vanilla/UiList.js +3 -1
- package/vanilla/index.js +1 -0
- package/vue/UiInput.vue +7 -4
- package/vue/UiInputGroup.d.ts +22 -0
- package/vue/UiInputGroup.js +2 -0
- package/vue/UiInputGroup.vue +113 -0
- package/vue/UiList.d.ts +2 -0
- package/vue/UiList.vue +12 -0
- package/vue/UiListItem.vue +10 -4
- package/vue/UiTreeItem.vue +1 -1
- package/vue/chunks/UiInput.js +1 -1
- package/vue/chunks/UiInputGroup.js +31 -0
- package/vue/chunks/UiList.js +6 -3
- package/vue/chunks/UiListItem.js +1 -1
- package/vue/chunks/UiTreeItem.js +1 -1
- package/vue/components.css +197 -109
- package/vue/index.d.ts +1 -0
- package/vue/index.js +2 -1
package/vue/components.css
CHANGED
|
@@ -3123,7 +3123,7 @@ svg[data-v-bcedd63e-s] {
|
|
|
3123
3123
|
display: none;
|
|
3124
3124
|
}
|
|
3125
3125
|
|
|
3126
|
-
[data-component~="ui-input"][data-v-
|
|
3126
|
+
[data-component~="ui-input"][data-v-12ffae5a] {
|
|
3127
3127
|
box-sizing: border-box;
|
|
3128
3128
|
display: inline-block;
|
|
3129
3129
|
inline-size: 100%;
|
|
@@ -3132,9 +3132,9 @@ svg[data-v-bcedd63e-s] {
|
|
|
3132
3132
|
margin: 0;
|
|
3133
3133
|
padding: var(--ui-space-2) var(--ui-space-3);
|
|
3134
3134
|
appearance: none;
|
|
3135
|
-
border: 1px solid var(--ui-control-border, var(--ui-border-strong));
|
|
3135
|
+
border: 1px solid var(--ui-input-border, var(--ui-control-border, var(--ui-border-strong)));
|
|
3136
3136
|
border-radius: var(--ui-input-radius, var(--ui-radius-md));
|
|
3137
|
-
background: var(--ui-control-surface, var(--ui-surface-elevated));
|
|
3137
|
+
background: var(--ui-input-surface, var(--ui-control-surface, var(--ui-surface-elevated)));
|
|
3138
3138
|
color: var(--ui-text-primary);
|
|
3139
3139
|
font: inherit;
|
|
3140
3140
|
line-height: var(--ui-line-height-md);
|
|
@@ -3146,19 +3146,22 @@ svg[data-v-bcedd63e-s] {
|
|
|
3146
3146
|
}
|
|
3147
3147
|
|
|
3148
3148
|
/* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
|
|
3149
|
-
[data-component~="ui-input"][data-v-
|
|
3149
|
+
[data-component~="ui-input"][data-v-12ffae5a]::selection {
|
|
3150
3150
|
background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
|
|
3151
3151
|
color: inherit;
|
|
3152
3152
|
}
|
|
3153
|
-
[data-component~="ui-input"][data-v-
|
|
3153
|
+
[data-component~="ui-input"][data-v-12ffae5a]::placeholder {
|
|
3154
3154
|
color: var(--ui-control-placeholder, var(--ui-text-secondary));
|
|
3155
3155
|
opacity: 1;
|
|
3156
3156
|
}
|
|
3157
|
-
[data-component~="ui-input"][data-v-
|
|
3158
|
-
border-color: var(
|
|
3157
|
+
[data-component~="ui-input"][data-v-12ffae5a]:hover:not(:focus):not(:disabled) {
|
|
3158
|
+
border-color: var(
|
|
3159
|
+
--ui-input-border-hover,
|
|
3160
|
+
var(--ui-control-border-hover, var(--ui-text-secondary))
|
|
3161
|
+
);
|
|
3159
3162
|
}
|
|
3160
|
-
[data-component~="ui-input"][data-v-
|
|
3161
|
-
border-color: var(--ui-control-focus, var(--ui-accent-solid));
|
|
3163
|
+
[data-component~="ui-input"][data-v-12ffae5a]:focus-visible {
|
|
3164
|
+
border-color: var(--ui-input-focus-border, var(--ui-control-focus, var(--ui-accent-solid)));
|
|
3162
3165
|
outline: none;
|
|
3163
3166
|
box-shadow: var(
|
|
3164
3167
|
--ui-input-focus-shadow,
|
|
@@ -3168,16 +3171,16 @@ svg[data-v-bcedd63e-s] {
|
|
|
3168
3171
|
}
|
|
3169
3172
|
|
|
3170
3173
|
/* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
|
|
3171
|
-
[data-component~="ui-input"][aria-invalid="true"][data-v-
|
|
3172
|
-
[data-component~="ui-input"][data-v-
|
|
3174
|
+
[data-component~="ui-input"][aria-invalid="true"][data-v-12ffae5a],
|
|
3175
|
+
[data-component~="ui-input"][data-v-12ffae5a]:is(:user-invalid, [data-user-invalid]) {
|
|
3173
3176
|
border-color: var(--ui-danger-solid);
|
|
3174
3177
|
}
|
|
3175
|
-
[data-component~="ui-input"][data-v-
|
|
3178
|
+
[data-component~="ui-input"][data-v-12ffae5a]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
|
|
3176
3179
|
box-shadow:
|
|
3177
3180
|
var(--ui-control-inset),
|
|
3178
3181
|
0 0 0 3px color-mix(in srgb, var(--ui-danger-solid) 22%, transparent);
|
|
3179
3182
|
}
|
|
3180
|
-
[data-component~="ui-input"][data-v-
|
|
3183
|
+
[data-component~="ui-input"][data-v-12ffae5a]:disabled {
|
|
3181
3184
|
background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
|
|
3182
3185
|
color: var(--ui-text-muted);
|
|
3183
3186
|
box-shadow: none;
|
|
@@ -3188,14 +3191,84 @@ svg[data-v-bcedd63e-s] {
|
|
|
3188
3191
|
* scroll vertically inside the field. Native inputs already center their single line. */
|
|
3189
3192
|
|
|
3190
3193
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
3191
|
-
[data-component~="ui-input"][hidden][data-v-
|
|
3194
|
+
[data-component~="ui-input"][hidden][data-v-12ffae5a] {
|
|
3195
|
+
display: none;
|
|
3196
|
+
}
|
|
3197
|
+
|
|
3198
|
+
/* An input with fixed text before or after it, such as a domain after a site's name
|
|
3199
|
+
("acme" + ".example.com") or slashes around a path. The group draws the field's border and
|
|
3200
|
+
focus ring around the input and its affixes together; the input inside drops its own through
|
|
3201
|
+
its custom properties, so it is still the one ui-input, with its form behaviour intact. The
|
|
3202
|
+
affixes are plain text beside the input, so name the input with a label that says what the
|
|
3203
|
+
whole value is. */
|
|
3204
|
+
[data-component~="ui-input-group"][data-v-0a135fc1] {
|
|
3205
|
+
--ui-input-border: transparent;
|
|
3206
|
+
--ui-input-border-hover: transparent;
|
|
3207
|
+
--ui-input-focus-border: transparent;
|
|
3208
|
+
--ui-input-shadow: none;
|
|
3209
|
+
--ui-input-focus-shadow: none;
|
|
3210
|
+
--ui-input-radius: 0;
|
|
3211
|
+
--ui-input-surface: transparent;
|
|
3212
|
+
|
|
3213
|
+
display: flex;
|
|
3214
|
+
align-items: stretch;
|
|
3215
|
+
box-sizing: border-box;
|
|
3216
|
+
inline-size: 100%;
|
|
3217
|
+
min-inline-size: 0;
|
|
3218
|
+
min-block-size: var(--ui-control-size-md);
|
|
3219
|
+
border: 1px solid var(--ui-border-strong);
|
|
3220
|
+
border-radius: var(--ui-radius-md);
|
|
3221
|
+
background: var(--ui-surface-elevated);
|
|
3222
|
+
box-shadow: var(--ui-control-inset);
|
|
3223
|
+
overflow: hidden;
|
|
3224
|
+
transition:
|
|
3225
|
+
border-color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
3226
|
+
box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
|
|
3227
|
+
}
|
|
3228
|
+
[data-component~="ui-input-group"][data-v-0a135fc1]:hover:not(:focus-within) {
|
|
3229
|
+
border-color: var(--ui-text-secondary);
|
|
3230
|
+
}
|
|
3231
|
+
[data-component~="ui-input-group"][data-v-0a135fc1]:focus-within {
|
|
3232
|
+
border-color: var(--ui-accent-solid);
|
|
3233
|
+
box-shadow:
|
|
3234
|
+
var(--ui-control-inset),
|
|
3235
|
+
var(--ui-control-focus-halo-shadow);
|
|
3236
|
+
}
|
|
3237
|
+
[data-component~="ui-input-group"][data-v-0a135fc1]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
|
|
3238
|
+
border-color: var(--ui-danger-solid);
|
|
3239
|
+
}
|
|
3240
|
+
[data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-0a135fc1] {
|
|
3241
|
+
background: var(--ui-surface-muted);
|
|
3242
|
+
box-shadow: none;
|
|
3243
|
+
}
|
|
3244
|
+
.field[data-v-0a135fc1] {
|
|
3245
|
+
display: flex;
|
|
3246
|
+
flex: 1;
|
|
3247
|
+
min-inline-size: 0;
|
|
3248
|
+
}
|
|
3249
|
+
.affix[data-v-0a135fc1] {
|
|
3250
|
+
display: inline-flex;
|
|
3251
|
+
flex: none;
|
|
3252
|
+
align-items: center;
|
|
3253
|
+
padding-inline: var(--ui-space-2);
|
|
3254
|
+
color: var(--ui-text-secondary);
|
|
3255
|
+
font-family: var(--ui-font-family-mono);
|
|
3256
|
+
font-size: var(--ui-font-size-sm);
|
|
3257
|
+
white-space: nowrap;
|
|
3258
|
+
}
|
|
3259
|
+
.affix[data-v-0a135fc1]:empty {
|
|
3260
|
+
display: none;
|
|
3261
|
+
}
|
|
3262
|
+
|
|
3263
|
+
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
3264
|
+
[data-component~="ui-input-group"][hidden][data-v-0a135fc1] {
|
|
3192
3265
|
display: none;
|
|
3193
3266
|
}
|
|
3194
3267
|
|
|
3195
3268
|
/* A list of items (ui-list-item). It owns the spacing between them, so a view never sets it. The
|
|
3196
3269
|
explicit list role keeps the list announced as one: some browsers drop it from a list with no
|
|
3197
3270
|
markers. */
|
|
3198
|
-
[data-component~="ui-list"][data-v-
|
|
3271
|
+
[data-component~="ui-list"][data-v-9e6cf63f] {
|
|
3199
3272
|
display: flex;
|
|
3200
3273
|
flex-direction: column;
|
|
3201
3274
|
gap: var(--ui-list-gap, var(--ui-space-1));
|
|
@@ -3204,7 +3277,16 @@ svg[data-v-bcedd63e-s] {
|
|
|
3204
3277
|
padding: 0;
|
|
3205
3278
|
list-style: none;
|
|
3206
3279
|
}
|
|
3207
|
-
|
|
3280
|
+
|
|
3281
|
+
/* Compact passes its size to the items through private properties, which cross into each item. */
|
|
3282
|
+
[data-component~="ui-list"][data-ui-list-state~="density=compact"][data-v-9e6cf63f] {
|
|
3283
|
+
--_ui-list-item-min-size: 0;
|
|
3284
|
+
--_ui-list-item-padding-block: 0;
|
|
3285
|
+
--_ui-list-item-padding-inline: 0;
|
|
3286
|
+
--_ui-list-item-title-weight: var(--ui-font-normal);
|
|
3287
|
+
gap: var(--ui-list-gap, var(--ui-space-2));
|
|
3288
|
+
}
|
|
3289
|
+
[data-component~="ui-list"][data-ui-list-state~="layout=grid"][data-v-9e6cf63f] {
|
|
3208
3290
|
display: grid;
|
|
3209
3291
|
grid-template-columns:
|
|
3210
3292
|
repeat(auto-fill, minmax(min(100%, var(--ui-list-min-item-width, 14rem)), 1fr));
|
|
@@ -3212,7 +3294,7 @@ svg[data-v-bcedd63e-s] {
|
|
|
3212
3294
|
}
|
|
3213
3295
|
|
|
3214
3296
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
3215
|
-
[data-component~="ui-list"][hidden][data-v-
|
|
3297
|
+
[data-component~="ui-list"][hidden][data-v-9e6cf63f] {
|
|
3216
3298
|
display: none;
|
|
3217
3299
|
}
|
|
3218
3300
|
|
|
@@ -3225,95 +3307,101 @@ svg[data-v-bcedd63e-s] {
|
|
|
3225
3307
|
padding follow it too, and the item takes the link's focus ring. The link stays a real link, so
|
|
3226
3308
|
a router, a modified click, and "open in new tab" all work. Trailing controls sit above it and
|
|
3227
3309
|
stay their own. */
|
|
3228
|
-
[data-component~="ui-list-item"][data-v-
|
|
3310
|
+
[data-component~="ui-list-item"][data-v-30896b18] {
|
|
3229
3311
|
position: relative;
|
|
3230
3312
|
box-sizing: border-box;
|
|
3231
3313
|
display: flex;
|
|
3232
3314
|
align-items: center;
|
|
3233
3315
|
gap: var(--ui-list-item-gap, var(--ui-space-3));
|
|
3234
3316
|
min-inline-size: 0;
|
|
3235
|
-
min-block-size: var(--ui-control-size, 2.5rem);
|
|
3236
|
-
padding-block: var(
|
|
3237
|
-
|
|
3317
|
+
min-block-size: var(--_ui-list-item-min-size, var(--ui-control-size, 2.5rem));
|
|
3318
|
+
padding-block: var(
|
|
3319
|
+
--ui-list-item-padding-block,
|
|
3320
|
+
var(--_ui-list-item-padding-block, var(--ui-space-2))
|
|
3321
|
+
);
|
|
3322
|
+
padding-inline: var(
|
|
3323
|
+
--ui-list-item-padding-inline,
|
|
3324
|
+
var(--_ui-list-item-padding-inline, var(--ui-space-3))
|
|
3325
|
+
);
|
|
3238
3326
|
border-radius: var(--ui-radius-md);
|
|
3239
3327
|
color: var(--ui-text-primary);
|
|
3240
3328
|
transition:
|
|
3241
3329
|
background-color var(--ui-motion-fast) var(--ui-motion-ease),
|
|
3242
3330
|
border-color var(--ui-motion-fast) var(--ui-motion-ease);
|
|
3243
3331
|
}
|
|
3244
|
-
[data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-
|
|
3332
|
+
[data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-30896b18] {
|
|
3245
3333
|
padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
|
|
3246
3334
|
padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
|
|
3247
3335
|
border: 1px solid var(--ui-border-default);
|
|
3248
3336
|
border-radius: var(--ui-radius-lg);
|
|
3249
3337
|
background: var(--ui-surface-raised);
|
|
3250
3338
|
}
|
|
3251
|
-
[data-component~="ui-list-item"][data-v-
|
|
3339
|
+
[data-component~="ui-list-item"][data-v-30896b18]:has(.title a[href]:hover) {
|
|
3252
3340
|
background: var(--ui-surface-hover);
|
|
3253
3341
|
}
|
|
3254
|
-
[data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-
|
|
3342
|
+
[data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-30896b18]:has(.title
|
|
3255
3343
|
a[href]:hover) {
|
|
3256
3344
|
border-color: var(--ui-border-strong);
|
|
3257
3345
|
}
|
|
3258
|
-
[data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-
|
|
3346
|
+
[data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-30896b18] {
|
|
3259
3347
|
background: var(--ui-surface-hover);
|
|
3260
3348
|
}
|
|
3261
|
-
[data-component~="ui-list-item"][data-v-
|
|
3349
|
+
[data-component~="ui-list-item"][data-v-30896b18]:has(.title a[href]:focus-visible) {
|
|
3262
3350
|
box-shadow: 0 0 0 2px var(--ui-focus-ring);
|
|
3263
3351
|
}
|
|
3264
|
-
.leading[data-v-
|
|
3265
|
-
.trailing[data-v-
|
|
3352
|
+
.leading[data-v-30896b18],
|
|
3353
|
+
.trailing[data-v-30896b18] {
|
|
3266
3354
|
display: inline-flex;
|
|
3267
3355
|
flex: none;
|
|
3268
3356
|
align-items: center;
|
|
3269
3357
|
gap: var(--ui-space-2);
|
|
3270
3358
|
}
|
|
3271
|
-
.leading[data-v-
|
|
3359
|
+
.leading[data-v-30896b18] {
|
|
3272
3360
|
color: var(--ui-text-muted);
|
|
3273
3361
|
font-size: var(--ui-list-item-icon-size, var(--ui-font-size-lg));
|
|
3274
3362
|
}
|
|
3275
3363
|
|
|
3276
3364
|
/* Trailing controls take their own clicks, above the title link's stretched hit area. */
|
|
3277
|
-
.trailing[data-v-
|
|
3365
|
+
.trailing[data-v-30896b18] {
|
|
3278
3366
|
position: relative;
|
|
3279
3367
|
z-index: 1;
|
|
3280
3368
|
color: var(--ui-text-muted);
|
|
3281
3369
|
font-size: var(--ui-font-size-sm);
|
|
3282
3370
|
}
|
|
3283
|
-
.content[data-v-
|
|
3371
|
+
.content[data-v-30896b18] {
|
|
3284
3372
|
display: flex;
|
|
3285
3373
|
flex: 1;
|
|
3286
3374
|
flex-direction: column;
|
|
3287
3375
|
gap: var(--ui-space-0-5, 2px);
|
|
3288
3376
|
min-inline-size: 0;
|
|
3289
3377
|
}
|
|
3290
|
-
.title[data-v-
|
|
3291
|
-
.description[data-v-
|
|
3378
|
+
.title[data-v-30896b18],
|
|
3379
|
+
.description[data-v-30896b18] {
|
|
3292
3380
|
display: block;
|
|
3293
3381
|
min-inline-size: 0;
|
|
3294
3382
|
overflow: hidden;
|
|
3295
3383
|
text-overflow: ellipsis;
|
|
3296
3384
|
white-space: nowrap;
|
|
3297
3385
|
}
|
|
3298
|
-
.title[data-v-
|
|
3386
|
+
.title[data-v-30896b18] {
|
|
3299
3387
|
font-size: var(--ui-font-size-md);
|
|
3300
|
-
font-weight: var(--ui-font-medium);
|
|
3388
|
+
font-weight: var(--_ui-list-item-title-weight, var(--ui-font-medium));
|
|
3301
3389
|
line-height: var(--ui-line-height-tight);
|
|
3302
3390
|
}
|
|
3303
|
-
.description[data-v-
|
|
3391
|
+
.description[data-v-30896b18] {
|
|
3304
3392
|
color: var(--ui-text-muted);
|
|
3305
3393
|
font-size: var(--ui-font-size-sm);
|
|
3306
3394
|
line-height: var(--ui-line-height-tight);
|
|
3307
3395
|
}
|
|
3308
|
-
.title > a[data-v-
|
|
3396
|
+
.title > a[data-v-30896b18-s] {
|
|
3309
3397
|
color: inherit;
|
|
3310
3398
|
text-decoration: none;
|
|
3311
3399
|
}
|
|
3312
|
-
.title > a[data-v-
|
|
3400
|
+
.title > a[data-v-30896b18-s]:focus-visible {
|
|
3313
3401
|
outline: none;
|
|
3314
3402
|
box-shadow: none;
|
|
3315
3403
|
}
|
|
3316
|
-
.title > a[href][data-v-
|
|
3404
|
+
.title > a[href][data-v-30896b18-s]::after {
|
|
3317
3405
|
position: absolute;
|
|
3318
3406
|
inset: 0;
|
|
3319
3407
|
border-radius: inherit;
|
|
@@ -3321,14 +3409,14 @@ svg[data-v-bcedd63e-s] {
|
|
|
3321
3409
|
}
|
|
3322
3410
|
|
|
3323
3411
|
/* An unused region takes no space. */
|
|
3324
|
-
.leading[data-v-
|
|
3325
|
-
.description[data-v-
|
|
3326
|
-
.trailing[data-v-
|
|
3412
|
+
.leading[data-v-30896b18]:empty,
|
|
3413
|
+
.description[data-v-30896b18]:empty,
|
|
3414
|
+
.trailing[data-v-30896b18]:empty {
|
|
3327
3415
|
display: none;
|
|
3328
3416
|
}
|
|
3329
3417
|
|
|
3330
3418
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
3331
|
-
[data-component~="ui-list-item"][hidden][data-v-
|
|
3419
|
+
[data-component~="ui-list-item"][hidden][data-v-30896b18] {
|
|
3332
3420
|
display: none;
|
|
3333
3421
|
}
|
|
3334
3422
|
|
|
@@ -4992,7 +5080,7 @@ to {
|
|
|
4992
5080
|
display: none;
|
|
4993
5081
|
}
|
|
4994
5082
|
|
|
4995
|
-
[data-component~="ui-tree-item"][data-v-
|
|
5083
|
+
[data-component~="ui-tree-item"][data-v-dab96891] {
|
|
4996
5084
|
--_tree-row-min-height: 32px;
|
|
4997
5085
|
--_tree-disclosure-size: 16px;
|
|
4998
5086
|
|
|
@@ -5001,7 +5089,7 @@ to {
|
|
|
5001
5089
|
min-inline-size: 0;
|
|
5002
5090
|
margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--ui-tree-indent, 16px));
|
|
5003
5091
|
}
|
|
5004
|
-
.row[data-v-
|
|
5092
|
+
.row[data-v-dab96891] {
|
|
5005
5093
|
position: relative;
|
|
5006
5094
|
display: grid;
|
|
5007
5095
|
grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
|
|
@@ -5018,38 +5106,38 @@ to {
|
|
|
5018
5106
|
box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
|
|
5019
5107
|
min-block-size var(--ui-motion-base) var(--ui-motion-ease);
|
|
5020
5108
|
}
|
|
5021
|
-
.row[data-v-
|
|
5022
|
-
[data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-
|
|
5023
|
-
.row[data-v-
|
|
5109
|
+
.row[data-v-dab96891]:hover,
|
|
5110
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-dab96891],
|
|
5111
|
+
.row[data-v-dab96891]:focus-within {
|
|
5024
5112
|
color: var(--ui-text-primary);
|
|
5025
5113
|
background: var(--ui-surface-muted);
|
|
5026
5114
|
}
|
|
5027
|
-
[data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-
|
|
5115
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-dab96891] {
|
|
5028
5116
|
opacity: 0.55;
|
|
5029
5117
|
}
|
|
5030
|
-
[data-component~="ui-tree-item"][data-dragging] .row[data-v-
|
|
5118
|
+
[data-component~="ui-tree-item"][data-dragging] .row[data-v-dab96891] {
|
|
5031
5119
|
opacity: 0.42;
|
|
5032
5120
|
}
|
|
5033
|
-
[data-component~="ui-tree-item"][data-v-
|
|
5121
|
+
[data-component~="ui-tree-item"][data-v-dab96891]:focus {
|
|
5034
5122
|
outline: none;
|
|
5035
5123
|
}
|
|
5036
|
-
[data-component~="ui-tree-item"]:focus-visible .row[data-v-
|
|
5124
|
+
[data-component~="ui-tree-item"]:focus-visible .row[data-v-dab96891] {
|
|
5037
5125
|
box-shadow: 0 0 0 2px var(--ui-focus-ring);
|
|
5038
5126
|
}
|
|
5039
5127
|
|
|
5040
5128
|
/* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
|
|
5041
|
-
[data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-
|
|
5129
|
+
[data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-dab96891] {
|
|
5042
5130
|
background: var(--ui-accent-subtle);
|
|
5043
5131
|
box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
5044
5132
|
}
|
|
5045
|
-
.disclosure[data-v-
|
|
5046
|
-
.disclosure-spacer[data-v-
|
|
5133
|
+
.disclosure[data-v-dab96891],
|
|
5134
|
+
.disclosure-spacer[data-v-dab96891] {
|
|
5047
5135
|
grid-column: 1;
|
|
5048
5136
|
grid-row: 1;
|
|
5049
5137
|
inline-size: var(--_tree-disclosure-size);
|
|
5050
5138
|
block-size: 28px;
|
|
5051
5139
|
}
|
|
5052
|
-
.disclosure[data-v-
|
|
5140
|
+
.disclosure[data-v-dab96891] {
|
|
5053
5141
|
display: grid;
|
|
5054
5142
|
/* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
|
|
5055
5143
|
place-items: center start;
|
|
@@ -5060,14 +5148,14 @@ to {
|
|
|
5060
5148
|
border-radius: var(--ui-radius-sm);
|
|
5061
5149
|
cursor: pointer;
|
|
5062
5150
|
}
|
|
5063
|
-
.disclosure[hidden][data-v-
|
|
5151
|
+
.disclosure[hidden][data-v-dab96891] {
|
|
5064
5152
|
display: none;
|
|
5065
5153
|
}
|
|
5066
|
-
.disclosure[data-v-
|
|
5154
|
+
.disclosure[data-v-dab96891]:hover {
|
|
5067
5155
|
color: var(--ui-text-primary);
|
|
5068
5156
|
background: var(--ui-surface-elevated);
|
|
5069
5157
|
}
|
|
5070
|
-
.disclosure-icon[data-v-
|
|
5158
|
+
.disclosure-icon[data-v-dab96891] {
|
|
5071
5159
|
display: grid;
|
|
5072
5160
|
place-items: center;
|
|
5073
5161
|
inline-size: 12px;
|
|
@@ -5075,7 +5163,7 @@ to {
|
|
|
5075
5163
|
transform: rotate(-90deg);
|
|
5076
5164
|
transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
|
|
5077
5165
|
}
|
|
5078
|
-
.disclosure-icon[data-v-
|
|
5166
|
+
.disclosure-icon[data-v-dab96891]::before {
|
|
5079
5167
|
display: block;
|
|
5080
5168
|
inline-size: 0.375rem;
|
|
5081
5169
|
block-size: 0.375rem;
|
|
@@ -5085,19 +5173,19 @@ to {
|
|
|
5085
5173
|
/* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
|
|
5086
5174
|
transform: translateY(-20%) rotate(45deg);
|
|
5087
5175
|
}
|
|
5088
|
-
[data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-
|
|
5176
|
+
[data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-dab96891] {
|
|
5089
5177
|
transform: rotate(0deg);
|
|
5090
5178
|
}
|
|
5091
5179
|
|
|
5092
5180
|
/* Lucide grip-vertical, filling the handle as in Looma 0.2. */
|
|
5093
|
-
.drag-handle svg[data-v-
|
|
5181
|
+
.drag-handle svg[data-v-dab96891] {
|
|
5094
5182
|
display: block;
|
|
5095
5183
|
inline-size: 100%;
|
|
5096
5184
|
block-size: 100%;
|
|
5097
5185
|
}
|
|
5098
5186
|
|
|
5099
5187
|
/* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
|
|
5100
|
-
.leading[data-v-
|
|
5188
|
+
.leading[data-v-dab96891] {
|
|
5101
5189
|
display: inline-grid;
|
|
5102
5190
|
place-items: center;
|
|
5103
5191
|
grid-column: 2;
|
|
@@ -5110,12 +5198,12 @@ to {
|
|
|
5110
5198
|
position: relative;
|
|
5111
5199
|
z-index: 1;
|
|
5112
5200
|
}
|
|
5113
|
-
.leading[data-v-
|
|
5201
|
+
.leading[data-v-dab96891]:empty {
|
|
5114
5202
|
display: none;
|
|
5115
5203
|
}
|
|
5116
5204
|
|
|
5117
5205
|
/* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
|
|
5118
|
-
svg[data-v-
|
|
5206
|
+
svg[data-v-dab96891-s],img[data-v-dab96891-s] {
|
|
5119
5207
|
display: block;
|
|
5120
5208
|
inline-size: 1em;
|
|
5121
5209
|
block-size: 1em;
|
|
@@ -5124,7 +5212,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5124
5212
|
|
|
5125
5213
|
/* The label spans the row's height and centres its content, so slotted content (a link) can
|
|
5126
5214
|
stretch to fill the row as its own hit area; the padding tokens remove the inset. */
|
|
5127
|
-
.label[data-v-
|
|
5215
|
+
.label[data-v-dab96891] {
|
|
5128
5216
|
grid-column: 3;
|
|
5129
5217
|
grid-row: 1;
|
|
5130
5218
|
align-self: stretch;
|
|
@@ -5142,7 +5230,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5142
5230
|
|
|
5143
5231
|
/* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
|
|
5144
5232
|
its own text and reading as overflow. */
|
|
5145
|
-
.label-text[data-v-
|
|
5233
|
+
.label-text[data-v-dab96891] {
|
|
5146
5234
|
display: flex;
|
|
5147
5235
|
align-items: center;
|
|
5148
5236
|
/* Stretches, so slotted content can still be the row's full-height hit area. */
|
|
@@ -5152,15 +5240,15 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5152
5240
|
inline-size: 100%;
|
|
5153
5241
|
white-space: nowrap;
|
|
5154
5242
|
}
|
|
5155
|
-
.label-text > [data-v-
|
|
5243
|
+
.label-text > [data-v-dab96891-s] {
|
|
5156
5244
|
flex: 1 1 auto;
|
|
5157
5245
|
min-inline-size: 0;
|
|
5158
5246
|
}
|
|
5159
5247
|
|
|
5160
5248
|
/* The controls sit over the label's end, so the text fades out where they begin. The fade is
|
|
5161
5249
|
the truncation mark while it shows: an ellipsis under it would read as a second one. */
|
|
5162
|
-
.row:hover > .label[data-v-
|
|
5163
|
-
.row:focus-within > .label[data-v-
|
|
5250
|
+
.row:hover > .label[data-v-dab96891],
|
|
5251
|
+
.row:focus-within > .label[data-v-dab96891] {
|
|
5164
5252
|
text-overflow: clip;
|
|
5165
5253
|
mask-image: linear-gradient(
|
|
5166
5254
|
to right,
|
|
@@ -5168,8 +5256,8 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5168
5256
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
5169
5257
|
);
|
|
5170
5258
|
}
|
|
5171
|
-
.row:hover > .label[data-v-
|
|
5172
|
-
.row:focus-within > .label[data-v-
|
|
5259
|
+
.row:hover > .label[data-v-dab96891]:dir(rtl),
|
|
5260
|
+
.row:focus-within > .label[data-v-dab96891]:dir(rtl) {
|
|
5173
5261
|
mask-image: linear-gradient(
|
|
5174
5262
|
to left,
|
|
5175
5263
|
#000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
|
|
@@ -5180,11 +5268,11 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5180
5268
|
/* A hovered row reads its whole name: the label slides far enough to show the end, waits
|
|
5181
5269
|
there, and comes back. Only when it actually overflows — the controller measures by how
|
|
5182
5270
|
much — after the controls have taken their place over its end — and hands over the distance
|
|
5183
|
-
and a duration from it, so
|
|
5184
|
-
.row[data-ui-marquee] > .label > .label-text[data-v-
|
|
5271
|
+
and a duration from it, so every name moves at the same speed. */
|
|
5272
|
+
.row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
|
|
5185
5273
|
/* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
|
|
5186
5274
|
and forth under the pointer is harder to read than one that arrives and holds. */
|
|
5187
|
-
animation: ui-tree-item-marquee-
|
|
5275
|
+
animation: ui-tree-item-marquee-dab96891 var(--_marquee-duration) linear 0.5s 1 normal forwards;
|
|
5188
5276
|
will-change: transform;
|
|
5189
5277
|
}
|
|
5190
5278
|
|
|
@@ -5192,7 +5280,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5192
5280
|
slides, the label reaches back under the icon (the controller measures how far) with its text
|
|
5193
5281
|
where it was, and fades out across that stretch, gone by the icon's middle: the name slips
|
|
5194
5282
|
under the icon rather than stopping at a hard edge beside it. */
|
|
5195
|
-
.row[data-ui-marquee] > .label[data-v-
|
|
5283
|
+
.row[data-ui-marquee] > .label[data-v-dab96891] {
|
|
5196
5284
|
margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
|
|
5197
5285
|
padding-inline-start: calc(
|
|
5198
5286
|
var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
|
|
@@ -5207,7 +5295,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5207
5295
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
5208
5296
|
);
|
|
5209
5297
|
}
|
|
5210
|
-
.row[data-ui-marquee] > .label[data-v-
|
|
5298
|
+
.row[data-ui-marquee] > .label[data-v-dab96891]:dir(rtl) {
|
|
5211
5299
|
mask-image: linear-gradient(
|
|
5212
5300
|
to left,
|
|
5213
5301
|
transparent calc(var(--_marquee-lead, 0px) / 2),
|
|
@@ -5218,7 +5306,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
|
|
|
5218
5306
|
transparent calc(100% - var(--_tree-actions-width, 1.75rem))
|
|
5219
5307
|
);
|
|
5220
5308
|
}
|
|
5221
|
-
@keyframes ui-tree-item-marquee-
|
|
5309
|
+
@keyframes ui-tree-item-marquee-dab96891 {
|
|
5222
5310
|
from {
|
|
5223
5311
|
transform: translateX(0);
|
|
5224
5312
|
}
|
|
@@ -5229,15 +5317,15 @@ to {
|
|
|
5229
5317
|
|
|
5230
5318
|
/* Reduced motion keeps the fade, which already says the name continues. */
|
|
5231
5319
|
@media (prefers-reduced-motion: reduce) {
|
|
5232
|
-
.row[data-ui-marquee] > .label > .label-text[data-v-
|
|
5320
|
+
.row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
|
|
5233
5321
|
animation: none;
|
|
5234
5322
|
}
|
|
5235
5323
|
}
|
|
5236
|
-
.row:hover > .label > [data-v-
|
|
5237
|
-
.row:focus-within > .label > [data-v-
|
|
5324
|
+
.row:hover > .label > [data-v-dab96891-s],
|
|
5325
|
+
.row:focus-within > .label > [data-v-dab96891-s] {
|
|
5238
5326
|
text-overflow: clip;
|
|
5239
5327
|
}
|
|
5240
|
-
.actions[data-v-
|
|
5328
|
+
.actions[data-v-dab96891] {
|
|
5241
5329
|
position: absolute;
|
|
5242
5330
|
z-index: 1;
|
|
5243
5331
|
inset-block: 0;
|
|
@@ -5249,18 +5337,18 @@ to {
|
|
|
5249
5337
|
pointer-events: none;
|
|
5250
5338
|
transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
|
|
5251
5339
|
}
|
|
5252
|
-
.row:hover > .actions[data-v-
|
|
5253
|
-
.row:focus-within > .actions[data-v-
|
|
5340
|
+
.row:hover > .actions[data-v-dab96891],
|
|
5341
|
+
.row:focus-within > .actions[data-v-dab96891] {
|
|
5254
5342
|
opacity: 1;
|
|
5255
5343
|
pointer-events: auto;
|
|
5256
5344
|
}
|
|
5257
5345
|
|
|
5258
5346
|
/* Without hover there is no reveal, so the controls keep their own column. */
|
|
5259
5347
|
@media (hover: none) {
|
|
5260
|
-
.row[data-v-
|
|
5348
|
+
.row[data-v-dab96891] {
|
|
5261
5349
|
grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
|
|
5262
5350
|
}
|
|
5263
|
-
.actions[data-v-
|
|
5351
|
+
.actions[data-v-dab96891] {
|
|
5264
5352
|
position: static;
|
|
5265
5353
|
grid-column: 4;
|
|
5266
5354
|
grid-row: 1;
|
|
@@ -5275,7 +5363,7 @@ to {
|
|
|
5275
5363
|
empty column, right before the icon; a branch's disclosure is there, so its handle sits just
|
|
5276
5364
|
outside the row. It is bare until pointed at: a resting surface behind it read as a faint
|
|
5277
5365
|
patch rather than as a control. */
|
|
5278
|
-
.drag-handle[data-v-
|
|
5366
|
+
.drag-handle[data-v-dab96891] {
|
|
5279
5367
|
position: absolute;
|
|
5280
5368
|
z-index: 2;
|
|
5281
5369
|
inset-block-start: 50%;
|
|
@@ -5296,24 +5384,24 @@ to {
|
|
|
5296
5384
|
transform: translateY(-50%);
|
|
5297
5385
|
transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
|
|
5298
5386
|
}
|
|
5299
|
-
.row:hover .drag-handle[data-v-
|
|
5300
|
-
.drag-handle[data-v-
|
|
5301
|
-
.drag-handle[data-v-
|
|
5302
|
-
[data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-
|
|
5387
|
+
.row:hover .drag-handle[data-v-dab96891],
|
|
5388
|
+
.drag-handle[data-v-dab96891]:hover,
|
|
5389
|
+
.drag-handle[data-v-dab96891]:focus-visible,
|
|
5390
|
+
[data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-dab96891] {
|
|
5303
5391
|
opacity: 1;
|
|
5304
5392
|
}
|
|
5305
|
-
[data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-
|
|
5393
|
+
[data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-dab96891] {
|
|
5306
5394
|
inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
|
|
5307
5395
|
}
|
|
5308
|
-
.drag-handle[data-v-
|
|
5309
|
-
.drag-handle[data-v-
|
|
5396
|
+
.drag-handle[data-v-dab96891]:hover,
|
|
5397
|
+
.drag-handle[data-v-dab96891]:focus-visible {
|
|
5310
5398
|
color: var(--ui-text-primary);
|
|
5311
5399
|
background: var(--ui-surface-hover);
|
|
5312
5400
|
}
|
|
5313
|
-
.drag-handle[data-v-
|
|
5401
|
+
.drag-handle[data-v-dab96891]:active {
|
|
5314
5402
|
cursor: grabbing;
|
|
5315
5403
|
}
|
|
5316
|
-
.drop-indicator[data-v-
|
|
5404
|
+
.drop-indicator[data-v-dab96891] {
|
|
5317
5405
|
position: absolute;
|
|
5318
5406
|
z-index: 3;
|
|
5319
5407
|
inset-inline: 1px;
|
|
@@ -5323,8 +5411,8 @@ to {
|
|
|
5323
5411
|
background: var(--ui-tree-drop-color, var(--ui-accent-solid));
|
|
5324
5412
|
pointer-events: none;
|
|
5325
5413
|
}
|
|
5326
|
-
.drop-indicator[data-v-
|
|
5327
|
-
.drop-indicator[data-v-
|
|
5414
|
+
.drop-indicator[data-v-dab96891]::before,
|
|
5415
|
+
.drop-indicator[data-v-dab96891]::after {
|
|
5328
5416
|
content: "";
|
|
5329
5417
|
position: absolute;
|
|
5330
5418
|
inset-block-start: 50%;
|
|
@@ -5335,39 +5423,39 @@ to {
|
|
|
5335
5423
|
background: var(--ui-surface-elevated);
|
|
5336
5424
|
transform: translateY(-50%);
|
|
5337
5425
|
}
|
|
5338
|
-
.drop-indicator[data-v-
|
|
5426
|
+
.drop-indicator[data-v-dab96891]::before {
|
|
5339
5427
|
inset-inline-start: -1px;
|
|
5340
5428
|
}
|
|
5341
|
-
.drop-indicator[data-v-
|
|
5429
|
+
.drop-indicator[data-v-dab96891]::after {
|
|
5342
5430
|
inset-inline-end: -1px;
|
|
5343
5431
|
}
|
|
5344
|
-
[data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-
|
|
5432
|
+
[data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-dab96891] {
|
|
5345
5433
|
display: block;
|
|
5346
5434
|
inset-block-start: -1px;
|
|
5347
5435
|
}
|
|
5348
|
-
[data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-
|
|
5436
|
+
[data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-dab96891] {
|
|
5349
5437
|
display: block;
|
|
5350
5438
|
inset-block-end: -1px;
|
|
5351
5439
|
}
|
|
5352
|
-
.children[hidden][data-v-
|
|
5440
|
+
.children[hidden][data-v-dab96891] {
|
|
5353
5441
|
display: none;
|
|
5354
5442
|
}
|
|
5355
|
-
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-
|
|
5443
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-dab96891] {
|
|
5356
5444
|
--_tree-row-min-height: 44px;
|
|
5357
5445
|
}
|
|
5358
|
-
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-
|
|
5446
|
+
html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-dab96891] {
|
|
5359
5447
|
display: none;
|
|
5360
5448
|
}
|
|
5361
5449
|
@media (prefers-reduced-motion: reduce) {
|
|
5362
|
-
.row[data-v-
|
|
5363
|
-
.disclosure-icon[data-v-
|
|
5364
|
-
.drag-handle[data-v-
|
|
5450
|
+
.row[data-v-dab96891],
|
|
5451
|
+
.disclosure-icon[data-v-dab96891],
|
|
5452
|
+
.drag-handle[data-v-dab96891] {
|
|
5365
5453
|
transition: none;
|
|
5366
5454
|
}
|
|
5367
5455
|
}
|
|
5368
5456
|
|
|
5369
5457
|
/* A component that sets its display still honours the hidden attribute on its root. */
|
|
5370
|
-
[data-component~="ui-tree-item"][hidden][data-v-
|
|
5458
|
+
[data-component~="ui-tree-item"][hidden][data-v-dab96891] {
|
|
5371
5459
|
display: none;
|
|
5372
5460
|
}
|
|
5373
5461
|
/**
|