@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.
@@ -3123,7 +3123,7 @@ svg[data-v-bcedd63e-s] {
3123
3123
  display: none;
3124
3124
  }
3125
3125
 
3126
- [data-component~="ui-input"][data-v-f84acfe8] {
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-f84acfe8]::selection {
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-f84acfe8]::placeholder {
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-f84acfe8]:hover:not(:focus):not(:disabled) {
3158
- border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
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-f84acfe8]:focus-visible {
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-f84acfe8],
3172
- [data-component~="ui-input"][data-v-f84acfe8]:is(:user-invalid, [data-user-invalid]) {
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-f84acfe8]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
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-f84acfe8]:disabled {
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-f84acfe8] {
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-935b1197] {
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
- [data-component~="ui-list"][data-ui-list-state~="layout=grid"][data-v-935b1197] {
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-935b1197] {
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-d61daf46] {
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(--ui-list-item-padding-block, var(--ui-space-2));
3237
- padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-3));
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-d61daf46] {
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-d61daf46]:has(.title a[href]:hover) {
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-d61daf46]:has(.title
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-d61daf46] {
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-d61daf46]:has(.title a[href]:focus-visible) {
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-d61daf46],
3265
- .trailing[data-v-d61daf46] {
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-d61daf46] {
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-d61daf46] {
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-d61daf46] {
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-d61daf46],
3291
- .description[data-v-d61daf46] {
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-d61daf46] {
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-d61daf46] {
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-d61daf46-s] {
3396
+ .title > a[data-v-30896b18-s] {
3309
3397
  color: inherit;
3310
3398
  text-decoration: none;
3311
3399
  }
3312
- .title > a[data-v-d61daf46-s]:focus-visible {
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-d61daf46-s]::after {
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-d61daf46]:empty,
3325
- .description[data-v-d61daf46]:empty,
3326
- .trailing[data-v-d61daf46]:empty {
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-d61daf46] {
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-3778b642] {
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-3778b642] {
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-3778b642]:hover,
5022
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-3778b642],
5023
- .row[data-v-3778b642]:focus-within {
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-3778b642] {
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-3778b642] {
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-3778b642]:focus {
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-3778b642] {
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-3778b642] {
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-3778b642],
5046
- .disclosure-spacer[data-v-3778b642] {
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-3778b642] {
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-3778b642] {
5151
+ .disclosure[hidden][data-v-dab96891] {
5064
5152
  display: none;
5065
5153
  }
5066
- .disclosure[data-v-3778b642]:hover {
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-3778b642] {
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-3778b642]::before {
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-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642]:empty {
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-3778b642-s],img[data-v-3778b642-s] {
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-3778b642] {
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-3778b642] {
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-3778b642-s] {
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-3778b642],
5163
- .row:focus-within > .label[data-v-3778b642] {
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-3778b642]:dir(rtl),
5172
- .row:focus-within > .label[data-v-3778b642]:dir(rtl) {
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 a longer name travels no faster. */
5184
- .row[data-ui-marquee] > .label > .label-text[data-v-3778b642] {
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-3778b642 var(--_marquee-duration) linear 0.5s 1 normal forwards;
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-3778b642] {
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-3778b642]:dir(rtl) {
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-3778b642 {
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-3778b642] {
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-3778b642-s],
5237
- .row:focus-within > .label > [data-v-3778b642-s] {
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-3778b642] {
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-3778b642],
5253
- .row:focus-within > .actions[data-v-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642],
5300
- .drag-handle[data-v-3778b642]:hover,
5301
- .drag-handle[data-v-3778b642]:focus-visible,
5302
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-3778b642] {
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-3778b642] {
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-3778b642]:hover,
5309
- .drag-handle[data-v-3778b642]:focus-visible {
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-3778b642]:active {
5401
+ .drag-handle[data-v-dab96891]:active {
5314
5402
  cursor: grabbing;
5315
5403
  }
5316
- .drop-indicator[data-v-3778b642] {
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-3778b642]::before,
5327
- .drop-indicator[data-v-3778b642]::after {
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-3778b642]::before {
5426
+ .drop-indicator[data-v-dab96891]::before {
5339
5427
  inset-inline-start: -1px;
5340
5428
  }
5341
- .drop-indicator[data-v-3778b642]::after {
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-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642] {
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-3778b642],
5363
- .disclosure-icon[data-v-3778b642],
5364
- .drag-handle[data-v-3778b642] {
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-3778b642] {
5458
+ [data-component~="ui-tree-item"][hidden][data-v-dab96891] {
5371
5459
  display: none;
5372
5460
  }
5373
5461
  /**