@threadlabs/looma 0.11.2 → 0.11.4

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.
@@ -622,7 +622,7 @@ ol[data-v-0d86d58e] {
622
622
  display: none;
623
623
  }
624
624
 
625
- [data-component~="ui-callout"][data-v-2fd6ab30] {
625
+ [data-component~="ui-callout"][data-v-36fb7e55] {
626
626
  --_callout-surface: var(--ui-info-soft);
627
627
  --_callout-border: var(--ui-info-solid);
628
628
  --_callout-icon: var(--ui-info-solid);
@@ -648,43 +648,51 @@ ol[data-v-0d86d58e] {
648
648
  }
649
649
 
650
650
  /* One line box tall, so the icon centres on the first line of text. */
651
- .icon[data-v-2fd6ab30] {
651
+ .icon[data-v-36fb7e55] {
652
652
  display: grid;
653
653
  place-items: center;
654
654
  inline-size: var(--ui-callout-icon-column, 1.125rem);
655
655
  block-size: 1lh;
656
656
  color: var(--ui-callout-icon, var(--_callout-icon));
657
657
  }
658
- .icon svg[data-v-2fd6ab30] {
658
+ .icon svg[data-v-36fb7e55] {
659
659
  inline-size: var(--ui-callout-icon-size, 1.125rem);
660
660
  block-size: var(--ui-callout-icon-size, 1.125rem);
661
661
  }
662
- .content[data-v-2fd6ab30] {
662
+ .content[data-v-36fb7e55] {
663
663
  min-inline-size: 0;
664
664
  }
665
- [data-component~="ui-callout"][data-ui-callout-state~="tone=note"][data-v-2fd6ab30] {
665
+ [data-component~="ui-callout"][data-ui-callout-state~="tone=note"][data-v-36fb7e55] {
666
666
  --_callout-surface: var(--ui-surface-muted);
667
667
  --_callout-border: var(--ui-border-strong);
668
668
  --_callout-icon: var(--ui-text-secondary);
669
669
  }
670
- [data-component~="ui-callout"][data-ui-callout-state~="tone=warning"][data-v-2fd6ab30] {
670
+ [data-component~="ui-callout"][data-ui-callout-state~="tone=warning"][data-v-36fb7e55] {
671
671
  --_callout-surface: var(--ui-warning-soft);
672
672
  --_callout-border: var(--ui-warning-solid);
673
673
  --_callout-icon: var(--ui-warning-solid);
674
674
  }
675
- [data-component~="ui-callout"][data-ui-callout-state~="tone=success"][data-v-2fd6ab30] {
675
+ [data-component~="ui-callout"][data-ui-callout-state~="tone=success"][data-v-36fb7e55] {
676
676
  --_callout-surface: var(--ui-success-soft);
677
677
  --_callout-border: var(--ui-success-solid);
678
678
  --_callout-icon: var(--ui-success-solid);
679
679
  }
680
- [data-component~="ui-callout"][data-ui-callout-state~="tone=danger"][data-v-2fd6ab30] {
680
+ [data-component~="ui-callout"][data-ui-callout-state~="tone=danger"][data-v-36fb7e55] {
681
681
  --_callout-surface: var(--ui-danger-soft);
682
682
  --_callout-border: var(--ui-danger-solid);
683
683
  --_callout-icon: var(--ui-danger-solid);
684
684
  }
685
685
 
686
+ /* A link in the callout's text is underlined, so it reads as a link by more than colour. */
687
+ .content a[data-v-36fb7e55-s] {
688
+ color: var(--ui-accent-active);
689
+ text-decoration: underline;
690
+ text-decoration-thickness: 0.06em;
691
+ text-underline-offset: 0.18em;
692
+ }
693
+
686
694
  /* A component that sets its display still honours the hidden attribute on its root. */
687
- [data-component~="ui-callout"][hidden][data-v-2fd6ab30] {
695
+ [data-component~="ui-callout"][hidden][data-v-36fb7e55] {
688
696
  display: none;
689
697
  }
690
698
 
@@ -2869,7 +2877,7 @@ svg[data-v-dc9b5621-s] {
2869
2877
  display: none;
2870
2878
  }
2871
2879
 
2872
- [data-component~="ui-form-field"][data-v-eba1e76b] {
2880
+ [data-component~="ui-form-field"][data-v-4df6c2a6] {
2873
2881
  display: grid;
2874
2882
  gap: var(--ui-space-2);
2875
2883
  min-inline-size: 0;
@@ -2879,30 +2887,32 @@ svg[data-v-dc9b5621-s] {
2879
2887
 
2880
2888
  /* Each named region styles whatever fills it, however it was slotted (slot="…" in HTML, #label
2881
2889
  in Vue), and generates no box of its own, so an empty region adds no gap. */
2882
- .label[data-v-eba1e76b],
2883
- .help[data-v-eba1e76b],
2884
- .error[data-v-eba1e76b] {
2890
+ .label[data-v-4df6c2a6],
2891
+ .help[data-v-4df6c2a6],
2892
+ .error[data-v-4df6c2a6] {
2885
2893
  display: contents;
2886
2894
  }
2887
- .label[data-v-eba1e76b] {
2895
+ .label[data-v-4df6c2a6] {
2888
2896
  color: var(--ui-text-secondary);
2889
2897
  font-size: var(--ui-font-size-sm);
2890
2898
  }
2891
- .help[data-v-eba1e76b] {
2899
+ .help[data-v-4df6c2a6] {
2892
2900
  color: var(--ui-text-muted);
2893
2901
  font-size: var(--ui-font-size-sm);
2894
2902
  line-height: var(--ui-line-height-md);
2895
2903
  }
2896
- .help > [data-v-eba1e76b-s] {
2904
+ .help > [data-v-4df6c2a6-s] {
2897
2905
  min-block-size: var(--ui-form-field-help-min-block-size, 0);
2898
2906
  }
2899
- .error[data-v-eba1e76b],[role="alert"][data-v-eba1e76b-s] {
2900
- color: var(--ui-accent-active);
2907
+
2908
+ /* An error reads in the danger colour, the one the invalid control's border takes. */
2909
+ .error[data-v-4df6c2a6],[role="alert"][data-v-4df6c2a6-s] {
2910
+ color: var(--ui-danger);
2901
2911
  font-size: var(--ui-font-size-sm);
2902
2912
  }
2903
2913
 
2904
2914
  /* A component that sets its display still honours the hidden attribute on its root. */
2905
- [data-component~="ui-form-field"][hidden][data-v-eba1e76b] {
2915
+ [data-component~="ui-form-field"][hidden][data-v-4df6c2a6] {
2906
2916
  display: none;
2907
2917
  }
2908
2918
 
@@ -3123,7 +3133,7 @@ svg[data-v-bcedd63e-s] {
3123
3133
  display: none;
3124
3134
  }
3125
3135
 
3126
- [data-component~="ui-input"][data-v-12ffae5a] {
3136
+ [data-component~="ui-input"][data-v-c19f8322] {
3127
3137
  box-sizing: border-box;
3128
3138
  display: inline-block;
3129
3139
  inline-size: 100%;
@@ -3146,21 +3156,21 @@ svg[data-v-bcedd63e-s] {
3146
3156
  }
3147
3157
 
3148
3158
  /* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
3149
- [data-component~="ui-input"][data-v-12ffae5a]::selection {
3159
+ [data-component~="ui-input"][data-v-c19f8322]::selection {
3150
3160
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
3151
3161
  color: inherit;
3152
3162
  }
3153
- [data-component~="ui-input"][data-v-12ffae5a]::placeholder {
3163
+ [data-component~="ui-input"][data-v-c19f8322]::placeholder {
3154
3164
  color: var(--ui-control-placeholder, var(--ui-text-secondary));
3155
3165
  opacity: 1;
3156
3166
  }
3157
- [data-component~="ui-input"][data-v-12ffae5a]:hover:not(:focus):not(:disabled) {
3167
+ [data-component~="ui-input"][data-v-c19f8322]:hover:not(:focus):not(:disabled) {
3158
3168
  border-color: var(
3159
3169
  --ui-input-border-hover,
3160
3170
  var(--ui-control-border-hover, var(--ui-text-secondary))
3161
3171
  );
3162
3172
  }
3163
- [data-component~="ui-input"][data-v-12ffae5a]:focus-visible {
3173
+ [data-component~="ui-input"][data-v-c19f8322]:focus-visible {
3164
3174
  border-color: var(--ui-input-focus-border, var(--ui-control-focus, var(--ui-accent-solid)));
3165
3175
  outline: none;
3166
3176
  box-shadow: var(
@@ -3171,16 +3181,18 @@ svg[data-v-bcedd63e-s] {
3171
3181
  }
3172
3182
 
3173
3183
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
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]) {
3176
- border-color: var(--ui-danger-solid);
3184
+ [data-component~="ui-input"][aria-invalid="true"][data-v-c19f8322],
3185
+ [data-component~="ui-input"][data-v-c19f8322]:is(:user-invalid, [data-user-invalid]) {
3186
+ border-color: var(--ui-input-invalid-border, var(--ui-danger-solid));
3177
3187
  }
3178
- [data-component~="ui-input"][data-v-12ffae5a]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
3179
- box-shadow:
3188
+ [data-component~="ui-input"][data-v-c19f8322]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
3189
+ box-shadow: var(
3190
+ --ui-input-invalid-focus-shadow,
3180
3191
  var(--ui-control-inset),
3181
- 0 0 0 3px color-mix(in srgb, var(--ui-danger-solid) 22%, transparent);
3192
+ 0 0 0 3px color-mix(in srgb, var(--ui-danger-solid) 22%, transparent)
3193
+ );
3182
3194
  }
3183
- [data-component~="ui-input"][data-v-12ffae5a]:disabled {
3195
+ [data-component~="ui-input"][data-v-c19f8322]:disabled {
3184
3196
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
3185
3197
  color: var(--ui-text-muted);
3186
3198
  box-shadow: none;
@@ -3191,7 +3203,7 @@ svg[data-v-bcedd63e-s] {
3191
3203
  * scroll vertically inside the field. Native inputs already center their single line. */
3192
3204
 
3193
3205
  /* A component that sets its display still honours the hidden attribute on its root. */
3194
- [data-component~="ui-input"][hidden][data-v-12ffae5a] {
3206
+ [data-component~="ui-input"][hidden][data-v-c19f8322] {
3195
3207
  display: none;
3196
3208
  }
3197
3209
 
@@ -3201,10 +3213,12 @@ svg[data-v-bcedd63e-s] {
3201
3213
  its custom properties, so it is still the one ui-input, with its form behaviour intact. The
3202
3214
  affixes are plain text beside the input, so name the input with a label that says what the
3203
3215
  whole value is. */
3204
- [data-component~="ui-input-group"][data-v-0a135fc1] {
3216
+ [data-component~="ui-input-group"][data-v-42ff173c] {
3205
3217
  --ui-input-border: transparent;
3206
3218
  --ui-input-border-hover: transparent;
3207
3219
  --ui-input-focus-border: transparent;
3220
+ --ui-input-invalid-border: transparent;
3221
+ --ui-input-invalid-focus-shadow: none;
3208
3222
  --ui-input-shadow: none;
3209
3223
  --ui-input-focus-shadow: none;
3210
3224
  --ui-input-radius: 0;
@@ -3225,28 +3239,28 @@ svg[data-v-bcedd63e-s] {
3225
3239
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
3226
3240
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
3227
3241
  }
3228
- [data-component~="ui-input-group"][data-v-0a135fc1]:hover:not(:focus-within) {
3242
+ [data-component~="ui-input-group"][data-v-42ff173c]:hover:not(:focus-within) {
3229
3243
  border-color: var(--ui-text-secondary);
3230
3244
  }
3231
- [data-component~="ui-input-group"][data-v-0a135fc1]:focus-within {
3245
+ [data-component~="ui-input-group"][data-v-42ff173c]:focus-within {
3232
3246
  border-color: var(--ui-accent-solid);
3233
3247
  box-shadow:
3234
3248
  var(--ui-control-inset),
3235
3249
  var(--ui-control-focus-halo-shadow);
3236
3250
  }
3237
- [data-component~="ui-input-group"][data-v-0a135fc1]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
3251
+ [data-component~="ui-input-group"][data-v-42ff173c]:has([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])) {
3238
3252
  border-color: var(--ui-danger-solid);
3239
3253
  }
3240
- [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-0a135fc1] {
3254
+ [data-component~="ui-input-group"][data-ui-input-group-state~="disabled"][data-v-42ff173c] {
3241
3255
  background: var(--ui-surface-muted);
3242
3256
  box-shadow: none;
3243
3257
  }
3244
- .field[data-v-0a135fc1] {
3258
+ .field[data-v-42ff173c] {
3245
3259
  display: flex;
3246
3260
  flex: 1;
3247
3261
  min-inline-size: 0;
3248
3262
  }
3249
- .affix[data-v-0a135fc1] {
3263
+ .affix[data-v-42ff173c] {
3250
3264
  display: inline-flex;
3251
3265
  flex: none;
3252
3266
  align-items: center;
@@ -3256,12 +3270,12 @@ svg[data-v-bcedd63e-s] {
3256
3270
  font-size: var(--ui-font-size-sm);
3257
3271
  white-space: nowrap;
3258
3272
  }
3259
- .affix[data-v-0a135fc1]:empty {
3273
+ .affix[data-v-42ff173c]:empty {
3260
3274
  display: none;
3261
3275
  }
3262
3276
 
3263
3277
  /* A component that sets its display still honours the hidden attribute on its root. */
3264
- [data-component~="ui-input-group"][hidden][data-v-0a135fc1] {
3278
+ [data-component~="ui-input-group"][hidden][data-v-42ff173c] {
3265
3279
  display: none;
3266
3280
  }
3267
3281
 
@@ -4788,72 +4802,81 @@ input[data-v-26ab3add], input[data-v-26ab3add]::after {
4788
4802
 
4789
4803
  /* Running text, set on the type scale and in a tone that says what it is, so a view never styles
4790
4804
  text of its own. The root is a paragraph unless as= names a span, div, small, strong, or label. */
4791
- [data-component~="ui-text"][data-v-70a75450] {
4805
+ [data-component~="ui-text"][data-v-b83a3ab9] {
4792
4806
  margin: 0;
4793
4807
  min-inline-size: 0;
4794
4808
  color: var(--ui-text-primary);
4795
4809
  text-align: start;
4796
4810
  }
4797
- [data-component~="ui-text"][data-ui-text-state~="size=xs"][data-v-70a75450] {
4811
+ [data-component~="ui-text"][data-ui-text-state~="size=xs"][data-v-b83a3ab9] {
4798
4812
  font-size: var(--ui-font-size-xs);
4799
4813
  line-height: var(--ui-line-height);
4800
4814
  }
4801
- [data-component~="ui-text"][data-ui-text-state~="size=sm"][data-v-70a75450] {
4815
+ [data-component~="ui-text"][data-ui-text-state~="size=sm"][data-v-b83a3ab9] {
4802
4816
  font-size: var(--ui-font-size-sm);
4803
4817
  line-height: var(--ui-line-height);
4804
4818
  }
4805
- [data-component~="ui-text"][data-ui-text-state~="size=md"][data-v-70a75450] {
4819
+ [data-component~="ui-text"][data-ui-text-state~="size=md"][data-v-b83a3ab9] {
4806
4820
  font-size: var(--ui-font-size-md);
4807
4821
  line-height: var(--ui-line-height);
4808
4822
  }
4809
- [data-component~="ui-text"][data-ui-text-state~="size=lg"][data-v-70a75450] {
4823
+ [data-component~="ui-text"][data-ui-text-state~="size=lg"][data-v-b83a3ab9] {
4810
4824
  font-size: var(--ui-font-size-lg);
4811
4825
  line-height: var(--ui-line-height-relaxed);
4812
4826
  }
4813
- [data-component~="ui-text"][data-ui-text-state~="tone=secondary"][data-v-70a75450] {
4827
+ [data-component~="ui-text"][data-ui-text-state~="tone=secondary"][data-v-b83a3ab9] {
4814
4828
  color: var(--ui-text-secondary);
4815
4829
  }
4816
- [data-component~="ui-text"][data-ui-text-state~="tone=muted"][data-v-70a75450] {
4830
+ [data-component~="ui-text"][data-ui-text-state~="tone=muted"][data-v-b83a3ab9] {
4817
4831
  color: var(--ui-text-muted);
4818
4832
  }
4819
- [data-component~="ui-text"][data-ui-text-state~="tone=accent"][data-v-70a75450] {
4833
+ [data-component~="ui-text"][data-ui-text-state~="tone=accent"][data-v-b83a3ab9] {
4820
4834
  color: var(--ui-accent-active);
4821
4835
  }
4822
- [data-component~="ui-text"][data-ui-text-state~="tone=danger"][data-v-70a75450] {
4836
+ [data-component~="ui-text"][data-ui-text-state~="tone=danger"][data-v-b83a3ab9] {
4823
4837
  color: var(--ui-danger);
4824
4838
  }
4825
- [data-component~="ui-text"][data-ui-text-state~="tone=success"][data-v-70a75450] {
4839
+ [data-component~="ui-text"][data-ui-text-state~="tone=success"][data-v-b83a3ab9] {
4826
4840
  color: var(--ui-success);
4827
4841
  }
4828
- [data-component~="ui-text"][data-ui-text-state~="weight=normal"][data-v-70a75450] {
4842
+ [data-component~="ui-text"][data-ui-text-state~="weight=normal"][data-v-b83a3ab9] {
4829
4843
  font-weight: var(--ui-font-normal);
4830
4844
  }
4831
- [data-component~="ui-text"][data-ui-text-state~="weight=medium"][data-v-70a75450] {
4845
+ [data-component~="ui-text"][data-ui-text-state~="weight=medium"][data-v-b83a3ab9] {
4832
4846
  font-weight: var(--ui-font-medium);
4833
4847
  }
4834
- [data-component~="ui-text"][data-ui-text-state~="weight=semibold"][data-v-70a75450] {
4848
+ [data-component~="ui-text"][data-ui-text-state~="weight=semibold"][data-v-b83a3ab9] {
4835
4849
  font-weight: var(--ui-font-semibold);
4836
4850
  }
4837
- [data-component~="ui-text"][data-ui-text-state~="variant=eyebrow"][data-v-70a75450] {
4851
+ [data-component~="ui-text"][data-ui-text-state~="variant=eyebrow"][data-v-b83a3ab9] {
4838
4852
  font-size: var(--ui-font-size-xs);
4839
4853
  font-weight: var(--ui-font-semibold);
4840
4854
  letter-spacing: 0.06em;
4841
4855
  text-transform: uppercase;
4842
4856
  }
4843
- [data-component~="ui-text"][data-ui-text-state~="variant=code"][data-v-70a75450] {
4857
+ [data-component~="ui-text"][data-ui-text-state~="variant=code"][data-v-b83a3ab9] {
4844
4858
  font-family: var(--ui-font-family-mono);
4845
4859
  }
4846
- [data-component~="ui-text"][data-ui-text-state~="truncate"][data-v-70a75450] {
4860
+
4861
+ /* A link in running text is underlined, so it stands apart from the words around it by more than
4862
+ colour. */
4863
+ [data-component~="ui-text"] a[data-v-b83a3ab9-s] {
4864
+ color: var(--ui-accent-active);
4865
+ text-decoration: underline;
4866
+ text-decoration-thickness: 0.06em;
4867
+ text-underline-offset: 0.18em;
4868
+ }
4869
+ [data-component~="ui-text"][data-ui-text-state~="truncate"][data-v-b83a3ab9] {
4847
4870
  overflow: hidden;
4848
4871
  text-overflow: ellipsis;
4849
4872
  white-space: nowrap;
4850
4873
  }
4851
- [data-component~="ui-text"][data-ui-text-state~="align=center"][data-v-70a75450] {
4874
+ [data-component~="ui-text"][data-ui-text-state~="align=center"][data-v-b83a3ab9] {
4852
4875
  text-align: center;
4853
4876
  }
4854
4877
 
4855
4878
  /* A component that sets its display still honours the hidden attribute on its root. */
4856
- [data-component~="ui-text"][hidden][data-v-70a75450] {
4879
+ [data-component~="ui-text"][hidden][data-v-b83a3ab9] {
4857
4880
  display: none;
4858
4881
  }
4859
4882
 
@@ -5080,7 +5103,7 @@ to {
5080
5103
  display: none;
5081
5104
  }
5082
5105
 
5083
- [data-component~="ui-tree-item"][data-v-3778b642] {
5106
+ [data-component~="ui-tree-item"][data-v-dab96891] {
5084
5107
  --_tree-row-min-height: 32px;
5085
5108
  --_tree-disclosure-size: 16px;
5086
5109
 
@@ -5089,7 +5112,7 @@ to {
5089
5112
  min-inline-size: 0;
5090
5113
  margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--ui-tree-indent, 16px));
5091
5114
  }
5092
- .row[data-v-3778b642] {
5115
+ .row[data-v-dab96891] {
5093
5116
  position: relative;
5094
5117
  display: grid;
5095
5118
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
@@ -5106,38 +5129,38 @@ to {
5106
5129
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
5107
5130
  min-block-size var(--ui-motion-base) var(--ui-motion-ease);
5108
5131
  }
5109
- .row[data-v-3778b642]:hover,
5110
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-3778b642],
5111
- .row[data-v-3778b642]:focus-within {
5132
+ .row[data-v-dab96891]:hover,
5133
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-dab96891],
5134
+ .row[data-v-dab96891]:focus-within {
5112
5135
  color: var(--ui-text-primary);
5113
5136
  background: var(--ui-surface-muted);
5114
5137
  }
5115
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-3778b642] {
5138
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-dab96891] {
5116
5139
  opacity: 0.55;
5117
5140
  }
5118
- [data-component~="ui-tree-item"][data-dragging] .row[data-v-3778b642] {
5141
+ [data-component~="ui-tree-item"][data-dragging] .row[data-v-dab96891] {
5119
5142
  opacity: 0.42;
5120
5143
  }
5121
- [data-component~="ui-tree-item"][data-v-3778b642]:focus {
5144
+ [data-component~="ui-tree-item"][data-v-dab96891]:focus {
5122
5145
  outline: none;
5123
5146
  }
5124
- [data-component~="ui-tree-item"]:focus-visible .row[data-v-3778b642] {
5147
+ [data-component~="ui-tree-item"]:focus-visible .row[data-v-dab96891] {
5125
5148
  box-shadow: 0 0 0 2px var(--ui-focus-ring);
5126
5149
  }
5127
5150
 
5128
5151
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
5129
- [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-3778b642] {
5152
+ [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-dab96891] {
5130
5153
  background: var(--ui-accent-subtle);
5131
5154
  box-shadow: inset 0 0 0 1px var(--ui-tree-drop-color, var(--ui-accent-solid));
5132
5155
  }
5133
- .disclosure[data-v-3778b642],
5134
- .disclosure-spacer[data-v-3778b642] {
5156
+ .disclosure[data-v-dab96891],
5157
+ .disclosure-spacer[data-v-dab96891] {
5135
5158
  grid-column: 1;
5136
5159
  grid-row: 1;
5137
5160
  inline-size: var(--_tree-disclosure-size);
5138
5161
  block-size: 28px;
5139
5162
  }
5140
- .disclosure[data-v-3778b642] {
5163
+ .disclosure[data-v-dab96891] {
5141
5164
  display: grid;
5142
5165
  /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
5143
5166
  place-items: center start;
@@ -5148,14 +5171,14 @@ to {
5148
5171
  border-radius: var(--ui-radius-sm);
5149
5172
  cursor: pointer;
5150
5173
  }
5151
- .disclosure[hidden][data-v-3778b642] {
5174
+ .disclosure[hidden][data-v-dab96891] {
5152
5175
  display: none;
5153
5176
  }
5154
- .disclosure[data-v-3778b642]:hover {
5177
+ .disclosure[data-v-dab96891]:hover {
5155
5178
  color: var(--ui-text-primary);
5156
5179
  background: var(--ui-surface-elevated);
5157
5180
  }
5158
- .disclosure-icon[data-v-3778b642] {
5181
+ .disclosure-icon[data-v-dab96891] {
5159
5182
  display: grid;
5160
5183
  place-items: center;
5161
5184
  inline-size: 12px;
@@ -5163,7 +5186,7 @@ to {
5163
5186
  transform: rotate(-90deg);
5164
5187
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
5165
5188
  }
5166
- .disclosure-icon[data-v-3778b642]::before {
5189
+ .disclosure-icon[data-v-dab96891]::before {
5167
5190
  display: block;
5168
5191
  inline-size: 0.375rem;
5169
5192
  block-size: 0.375rem;
@@ -5173,19 +5196,19 @@ to {
5173
5196
  /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
5174
5197
  transform: translateY(-20%) rotate(45deg);
5175
5198
  }
5176
- [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-3778b642] {
5199
+ [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-dab96891] {
5177
5200
  transform: rotate(0deg);
5178
5201
  }
5179
5202
 
5180
5203
  /* Lucide grip-vertical, filling the handle as in Looma 0.2. */
5181
- .drag-handle svg[data-v-3778b642] {
5204
+ .drag-handle svg[data-v-dab96891] {
5182
5205
  display: block;
5183
5206
  inline-size: 100%;
5184
5207
  block-size: 100%;
5185
5208
  }
5186
5209
 
5187
5210
  /* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
5188
- .leading[data-v-3778b642] {
5211
+ .leading[data-v-dab96891] {
5189
5212
  display: inline-grid;
5190
5213
  place-items: center;
5191
5214
  grid-column: 2;
@@ -5198,12 +5221,12 @@ to {
5198
5221
  position: relative;
5199
5222
  z-index: 1;
5200
5223
  }
5201
- .leading[data-v-3778b642]:empty {
5224
+ .leading[data-v-dab96891]:empty {
5202
5225
  display: none;
5203
5226
  }
5204
5227
 
5205
5228
  /* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
5206
- svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5229
+ svg[data-v-dab96891-s],img[data-v-dab96891-s] {
5207
5230
  display: block;
5208
5231
  inline-size: 1em;
5209
5232
  block-size: 1em;
@@ -5212,7 +5235,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5212
5235
 
5213
5236
  /* The label spans the row's height and centres its content, so slotted content (a link) can
5214
5237
  stretch to fill the row as its own hit area; the padding tokens remove the inset. */
5215
- .label[data-v-3778b642] {
5238
+ .label[data-v-dab96891] {
5216
5239
  grid-column: 3;
5217
5240
  grid-row: 1;
5218
5241
  align-self: stretch;
@@ -5230,7 +5253,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5230
5253
 
5231
5254
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
5232
5255
  its own text and reading as overflow. */
5233
- .label-text[data-v-3778b642] {
5256
+ .label-text[data-v-dab96891] {
5234
5257
  display: flex;
5235
5258
  align-items: center;
5236
5259
  /* Stretches, so slotted content can still be the row's full-height hit area. */
@@ -5240,15 +5263,15 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5240
5263
  inline-size: 100%;
5241
5264
  white-space: nowrap;
5242
5265
  }
5243
- .label-text > [data-v-3778b642-s] {
5266
+ .label-text > [data-v-dab96891-s] {
5244
5267
  flex: 1 1 auto;
5245
5268
  min-inline-size: 0;
5246
5269
  }
5247
5270
 
5248
5271
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
5249
5272
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
5250
- .row:hover > .label[data-v-3778b642],
5251
- .row:focus-within > .label[data-v-3778b642] {
5273
+ .row:hover > .label[data-v-dab96891],
5274
+ .row:focus-within > .label[data-v-dab96891] {
5252
5275
  text-overflow: clip;
5253
5276
  mask-image: linear-gradient(
5254
5277
  to right,
@@ -5256,8 +5279,8 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5256
5279
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5257
5280
  );
5258
5281
  }
5259
- .row:hover > .label[data-v-3778b642]:dir(rtl),
5260
- .row:focus-within > .label[data-v-3778b642]:dir(rtl) {
5282
+ .row:hover > .label[data-v-dab96891]:dir(rtl),
5283
+ .row:focus-within > .label[data-v-dab96891]:dir(rtl) {
5261
5284
  mask-image: linear-gradient(
5262
5285
  to left,
5263
5286
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
@@ -5268,11 +5291,11 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5268
5291
  /* A hovered row reads its whole name: the label slides far enough to show the end, waits
5269
5292
  there, and comes back. Only when it actually overflows — the controller measures by how
5270
5293
  much — after the controls have taken their place over its end — and hands over the distance
5271
- and a duration from it, so a longer name travels no faster. */
5272
- .row[data-ui-marquee] > .label > .label-text[data-v-3778b642] {
5294
+ and a duration from it, so every name moves at the same speed. */
5295
+ .row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
5273
5296
  /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
5274
5297
  and forth under the pointer is harder to read than one that arrives and holds. */
5275
- animation: ui-tree-item-marquee-3778b642 var(--_marquee-duration) linear 0.5s 1 normal forwards;
5298
+ animation: ui-tree-item-marquee-dab96891 var(--_marquee-duration) linear 0.5s 1 normal forwards;
5276
5299
  will-change: transform;
5277
5300
  }
5278
5301
 
@@ -5280,7 +5303,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5280
5303
  slides, the label reaches back under the icon (the controller measures how far) with its text
5281
5304
  where it was, and fades out across that stretch, gone by the icon's middle: the name slips
5282
5305
  under the icon rather than stopping at a hard edge beside it. */
5283
- .row[data-ui-marquee] > .label[data-v-3778b642] {
5306
+ .row[data-ui-marquee] > .label[data-v-dab96891] {
5284
5307
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
5285
5308
  padding-inline-start: calc(
5286
5309
  var(--_marquee-lead, 0px) + var(--ui-tree-item-label-padding-inline, var(--ui-space-2))
@@ -5295,7 +5318,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5295
5318
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5296
5319
  );
5297
5320
  }
5298
- .row[data-ui-marquee] > .label[data-v-3778b642]:dir(rtl) {
5321
+ .row[data-ui-marquee] > .label[data-v-dab96891]:dir(rtl) {
5299
5322
  mask-image: linear-gradient(
5300
5323
  to left,
5301
5324
  transparent calc(var(--_marquee-lead, 0px) / 2),
@@ -5306,7 +5329,7 @@ svg[data-v-3778b642-s],img[data-v-3778b642-s] {
5306
5329
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
5307
5330
  );
5308
5331
  }
5309
- @keyframes ui-tree-item-marquee-3778b642 {
5332
+ @keyframes ui-tree-item-marquee-dab96891 {
5310
5333
  from {
5311
5334
  transform: translateX(0);
5312
5335
  }
@@ -5317,15 +5340,15 @@ to {
5317
5340
 
5318
5341
  /* Reduced motion keeps the fade, which already says the name continues. */
5319
5342
  @media (prefers-reduced-motion: reduce) {
5320
- .row[data-ui-marquee] > .label > .label-text[data-v-3778b642] {
5343
+ .row[data-ui-marquee] > .label > .label-text[data-v-dab96891] {
5321
5344
  animation: none;
5322
5345
  }
5323
5346
  }
5324
- .row:hover > .label > [data-v-3778b642-s],
5325
- .row:focus-within > .label > [data-v-3778b642-s] {
5347
+ .row:hover > .label > [data-v-dab96891-s],
5348
+ .row:focus-within > .label > [data-v-dab96891-s] {
5326
5349
  text-overflow: clip;
5327
5350
  }
5328
- .actions[data-v-3778b642] {
5351
+ .actions[data-v-dab96891] {
5329
5352
  position: absolute;
5330
5353
  z-index: 1;
5331
5354
  inset-block: 0;
@@ -5337,18 +5360,18 @@ to {
5337
5360
  pointer-events: none;
5338
5361
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
5339
5362
  }
5340
- .row:hover > .actions[data-v-3778b642],
5341
- .row:focus-within > .actions[data-v-3778b642] {
5363
+ .row:hover > .actions[data-v-dab96891],
5364
+ .row:focus-within > .actions[data-v-dab96891] {
5342
5365
  opacity: 1;
5343
5366
  pointer-events: auto;
5344
5367
  }
5345
5368
 
5346
5369
  /* Without hover there is no reveal, so the controls keep their own column. */
5347
5370
  @media (hover: none) {
5348
- .row[data-v-3778b642] {
5371
+ .row[data-v-dab96891] {
5349
5372
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
5350
5373
  }
5351
- .actions[data-v-3778b642] {
5374
+ .actions[data-v-dab96891] {
5352
5375
  position: static;
5353
5376
  grid-column: 4;
5354
5377
  grid-row: 1;
@@ -5363,7 +5386,7 @@ to {
5363
5386
  empty column, right before the icon; a branch's disclosure is there, so its handle sits just
5364
5387
  outside the row. It is bare until pointed at: a resting surface behind it read as a faint
5365
5388
  patch rather than as a control. */
5366
- .drag-handle[data-v-3778b642] {
5389
+ .drag-handle[data-v-dab96891] {
5367
5390
  position: absolute;
5368
5391
  z-index: 2;
5369
5392
  inset-block-start: 50%;
@@ -5384,24 +5407,24 @@ to {
5384
5407
  transform: translateY(-50%);
5385
5408
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
5386
5409
  }
5387
- .row:hover .drag-handle[data-v-3778b642],
5388
- .drag-handle[data-v-3778b642]:hover,
5389
- .drag-handle[data-v-3778b642]:focus-visible,
5390
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-3778b642] {
5410
+ .row:hover .drag-handle[data-v-dab96891],
5411
+ .drag-handle[data-v-dab96891]:hover,
5412
+ .drag-handle[data-v-dab96891]:focus-visible,
5413
+ [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-dab96891] {
5391
5414
  opacity: 1;
5392
5415
  }
5393
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-3778b642] {
5416
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-dab96891] {
5394
5417
  inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
5395
5418
  }
5396
- .drag-handle[data-v-3778b642]:hover,
5397
- .drag-handle[data-v-3778b642]:focus-visible {
5419
+ .drag-handle[data-v-dab96891]:hover,
5420
+ .drag-handle[data-v-dab96891]:focus-visible {
5398
5421
  color: var(--ui-text-primary);
5399
5422
  background: var(--ui-surface-hover);
5400
5423
  }
5401
- .drag-handle[data-v-3778b642]:active {
5424
+ .drag-handle[data-v-dab96891]:active {
5402
5425
  cursor: grabbing;
5403
5426
  }
5404
- .drop-indicator[data-v-3778b642] {
5427
+ .drop-indicator[data-v-dab96891] {
5405
5428
  position: absolute;
5406
5429
  z-index: 3;
5407
5430
  inset-inline: 1px;
@@ -5411,8 +5434,8 @@ to {
5411
5434
  background: var(--ui-tree-drop-color, var(--ui-accent-solid));
5412
5435
  pointer-events: none;
5413
5436
  }
5414
- .drop-indicator[data-v-3778b642]::before,
5415
- .drop-indicator[data-v-3778b642]::after {
5437
+ .drop-indicator[data-v-dab96891]::before,
5438
+ .drop-indicator[data-v-dab96891]::after {
5416
5439
  content: "";
5417
5440
  position: absolute;
5418
5441
  inset-block-start: 50%;
@@ -5423,39 +5446,39 @@ to {
5423
5446
  background: var(--ui-surface-elevated);
5424
5447
  transform: translateY(-50%);
5425
5448
  }
5426
- .drop-indicator[data-v-3778b642]::before {
5449
+ .drop-indicator[data-v-dab96891]::before {
5427
5450
  inset-inline-start: -1px;
5428
5451
  }
5429
- .drop-indicator[data-v-3778b642]::after {
5452
+ .drop-indicator[data-v-dab96891]::after {
5430
5453
  inset-inline-end: -1px;
5431
5454
  }
5432
- [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-3778b642] {
5455
+ [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-dab96891] {
5433
5456
  display: block;
5434
5457
  inset-block-start: -1px;
5435
5458
  }
5436
- [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-3778b642] {
5459
+ [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-dab96891] {
5437
5460
  display: block;
5438
5461
  inset-block-end: -1px;
5439
5462
  }
5440
- .children[hidden][data-v-3778b642] {
5463
+ .children[hidden][data-v-dab96891] {
5441
5464
  display: none;
5442
5465
  }
5443
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-3778b642] {
5466
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-dab96891] {
5444
5467
  --_tree-row-min-height: 44px;
5445
5468
  }
5446
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-3778b642] {
5469
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-dab96891] {
5447
5470
  display: none;
5448
5471
  }
5449
5472
  @media (prefers-reduced-motion: reduce) {
5450
- .row[data-v-3778b642],
5451
- .disclosure-icon[data-v-3778b642],
5452
- .drag-handle[data-v-3778b642] {
5473
+ .row[data-v-dab96891],
5474
+ .disclosure-icon[data-v-dab96891],
5475
+ .drag-handle[data-v-dab96891] {
5453
5476
  transition: none;
5454
5477
  }
5455
5478
  }
5456
5479
 
5457
5480
  /* A component that sets its display still honours the hidden attribute on its root. */
5458
- [data-component~="ui-tree-item"][hidden][data-v-3778b642] {
5481
+ [data-component~="ui-tree-item"][hidden][data-v-dab96891] {
5459
5482
  display: none;
5460
5483
  }
5461
5484
  /**