@threadlabs/looma 0.23.14 → 0.23.15

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.
@@ -4820,7 +4820,7 @@ svg[data-v-7bb0fe2e-s] {
4820
4820
  syntax: "*";
4821
4821
  inherits: false;
4822
4822
  }
4823
- [data-component~="ui-input"][data-v-762209e1] {
4823
+ [data-component~="ui-input"][data-v-e45d8c3f] {
4824
4824
  box-sizing: border-box;
4825
4825
  display: inline-block;
4826
4826
  inline-size: var(--ui-input-inline-size, 100%);
@@ -4860,7 +4860,7 @@ svg[data-v-7bb0fe2e-s] {
4860
4860
  }
4861
4861
 
4862
4862
  /* Each size reads the hook and then an Input Group's default first, so a group, which draws the frame, can zero it. */
4863
- [data-component~="ui-input"][data-ui-input-state~="size=sm"][data-v-762209e1] {
4863
+ [data-component~="ui-input"][data-ui-input-state~="size=sm"][data-v-e45d8c3f] {
4864
4864
  min-block-size: var(
4865
4865
  --ui-input-min-block-size,
4866
4866
  var(--_ui-default-input-min-block-size, var(--ui-control-size-sm))
@@ -4868,7 +4868,7 @@ svg[data-v-7bb0fe2e-s] {
4868
4868
  padding: var(--ui-space-1) var(--ui-space-2);
4869
4869
  font-size: var(--ui-font-size-sm);
4870
4870
  }
4871
- [data-component~="ui-input"][data-ui-input-state~="size=lg"][data-v-762209e1] {
4871
+ [data-component~="ui-input"][data-ui-input-state~="size=lg"][data-v-e45d8c3f] {
4872
4872
  min-block-size: var(
4873
4873
  --ui-input-min-block-size,
4874
4874
  var(--_ui-default-input-min-block-size, var(--ui-control-size-lg))
@@ -4880,31 +4880,35 @@ svg[data-v-7bb0fe2e-s] {
4880
4880
  /* Under touch a small field is still a touch-sized target, as a small button is, and keeps
4881
4881
  body-size text: below 16px, iOS zooms the page into the focused field. */
4882
4882
  @media (pointer: coarse) {
4883
- [data-component~="ui-input"][data-ui-input-state~="size=sm"][data-v-762209e1] {
4883
+ [data-component~="ui-input"][data-v-e45d8c3f],
4884
+ [data-component~="ui-input"][data-ui-input-state~="size=sm"][data-v-e45d8c3f],
4885
+ [data-component~="ui-input"][data-ui-input-state~="size=lg"][data-v-e45d8c3f] {
4886
+ font-size: var(--ui-font-size-md);
4887
+ }
4888
+ [data-component~="ui-input"][data-ui-input-state~="size=sm"][data-v-e45d8c3f] {
4884
4889
  min-block-size: var(
4885
4890
  --ui-input-min-block-size,
4886
4891
  var(--_ui-default-input-min-block-size, var(--ui-control-min-block-size))
4887
4892
  );
4888
- font-size: inherit;
4889
4893
  }
4890
4894
  }
4891
4895
 
4892
4896
  /* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
4893
- [data-component~="ui-input"][data-v-762209e1]::selection {
4897
+ [data-component~="ui-input"][data-v-e45d8c3f]::selection {
4894
4898
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
4895
4899
  color: inherit;
4896
4900
  }
4897
- [data-component~="ui-input"][data-v-762209e1]::placeholder {
4901
+ [data-component~="ui-input"][data-v-e45d8c3f]::placeholder {
4898
4902
  color: var(--ui-control-placeholder, var(--ui-text-secondary));
4899
4903
  opacity: 1;
4900
4904
  }
4901
- [data-component~="ui-input"][data-v-762209e1]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
4905
+ [data-component~="ui-input"][data-v-e45d8c3f]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
4902
4906
  border-color: var(
4903
4907
  --ui-input-border-hover,
4904
4908
  var(--_ui-default-input-border-hover, var(--ui-control-border-hover, var(--ui-text-secondary)))
4905
4909
  );
4906
4910
  }
4907
- [data-component~="ui-input"][data-v-762209e1]:focus-visible {
4911
+ [data-component~="ui-input"][data-v-e45d8c3f]:focus-visible {
4908
4912
  border-color: var(
4909
4913
  --ui-input-focus-border,
4910
4914
  var(--_ui-default-input-focus-border, var(--ui-control-focus, var(--ui-accent-solid)))
@@ -4921,14 +4925,14 @@ svg[data-v-7bb0fe2e-s] {
4921
4925
  }
4922
4926
 
4923
4927
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
4924
- [data-component~="ui-input"][aria-invalid="true"][data-v-762209e1],
4925
- [data-component~="ui-input"][data-v-762209e1]:is(:user-invalid, [data-user-invalid]) {
4928
+ [data-component~="ui-input"][aria-invalid="true"][data-v-e45d8c3f],
4929
+ [data-component~="ui-input"][data-v-e45d8c3f]:is(:user-invalid, [data-user-invalid]) {
4926
4930
  border-color: var(
4927
4931
  --ui-input-invalid-border,
4928
4932
  var(--_ui-default-input-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)))
4929
4933
  );
4930
4934
  }
4931
- [data-component~="ui-input"][data-v-762209e1]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
4935
+ [data-component~="ui-input"][data-v-e45d8c3f]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
4932
4936
  box-shadow: var(
4933
4937
  --ui-input-invalid-focus-shadow,
4934
4938
  var(
@@ -4942,7 +4946,7 @@ svg[data-v-7bb0fe2e-s] {
4942
4946
  )
4943
4947
  );
4944
4948
  }
4945
- [data-component~="ui-input"][data-v-762209e1]:disabled {
4949
+ [data-component~="ui-input"][data-v-e45d8c3f]:disabled {
4946
4950
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
4947
4951
  color: var(--ui-disabled-text);
4948
4952
  box-shadow: none;
@@ -4951,7 +4955,7 @@ svg[data-v-7bb0fe2e-s] {
4951
4955
 
4952
4956
  /* Forced colors drop box shadows, so the focus ring becomes an outline. */
4953
4957
  @media (forced-colors: active) {
4954
- [data-component~="ui-input"][data-v-762209e1]:focus-visible {
4958
+ [data-component~="ui-input"][data-v-e45d8c3f]:focus-visible {
4955
4959
  outline: var(
4956
4960
  --ui-input-focus-outline,
4957
4961
  var(--_ui-default-input-focus-outline, var(--ui-focus-width) solid Highlight)
@@ -4964,7 +4968,7 @@ svg[data-v-7bb0fe2e-s] {
4964
4968
  * scroll vertically inside the field. Native inputs already center their single line. */
4965
4969
 
4966
4970
  /* A component that sets its display still honours the hidden attribute on its root. */
4967
- [data-component~="ui-input"][hidden][data-v-762209e1] {
4971
+ [data-component~="ui-input"][hidden][data-v-e45d8c3f] {
4968
4972
  display: none;
4969
4973
  }
4970
4974
 
@@ -8459,7 +8463,7 @@ to {
8459
8463
  syntax: "*";
8460
8464
  inherits: false;
8461
8465
  }
8462
- [data-component~="ui-tree-item"][data-v-d2b1bbe0] {
8466
+ [data-component~="ui-tree-item"][data-v-fd74ff6c] {
8463
8467
  /* Hooks do not inherit, so the parts below read them from the root. The tree's density
8464
8468
  sets the defaults, in --_ui-default-*. */
8465
8469
  --_ui-tree-item-min-block-size: var(
@@ -8481,7 +8485,7 @@ to {
8481
8485
  min-inline-size: 0;
8482
8486
  margin-inline-start: calc(var(--_ui-tree-item-indent-step, 0) * var(--_ui-tree-indent, 16px));
8483
8487
  }
8484
- .row[data-v-d2b1bbe0] {
8488
+ .row[data-v-fd74ff6c] {
8485
8489
  position: relative;
8486
8490
  display: grid;
8487
8491
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
@@ -8498,54 +8502,54 @@ to {
8498
8502
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
8499
8503
  min-block-size var(--ui-motion-base) var(--ui-motion-ease);
8500
8504
  }
8501
- .row[data-v-d2b1bbe0]:hover,
8502
- .row[data-v-d2b1bbe0]:focus-within {
8505
+ .row[data-v-fd74ff6c]:hover,
8506
+ .row[data-v-fd74ff6c]:focus-within {
8503
8507
  color: var(--ui-text-primary);
8504
8508
  background: var(--ui-surface-muted);
8505
8509
  }
8506
8510
 
8507
8511
  /* Selection is the same surface recipe as destination and choice rows. */
8508
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] > .row[data-v-d2b1bbe0] {
8512
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] > .row[data-v-fd74ff6c] {
8509
8513
  color: var(--ui-selection-text);
8510
8514
  background: var(--ui-selection-surface);
8511
8515
  }
8512
8516
  [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"]:not([aria-disabled="true"])
8513
8517
  > .row
8514
- > .leading[data-v-d2b1bbe0] {
8518
+ > .leading[data-v-fd74ff6c] {
8515
8519
  color: var(--ui-selection-text);
8516
8520
  }
8517
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-d2b1bbe0] {
8521
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-fd74ff6c] {
8518
8522
  color: var(--ui-disabled-text);
8519
8523
  background: var(--ui-disabled-surface);
8520
8524
  }
8521
- [data-component~="ui-tree-item"][data-dragging]:not([data-move-source]) .row[data-v-d2b1bbe0] {
8525
+ [data-component~="ui-tree-item"][data-dragging]:not([data-move-source]) .row[data-v-fd74ff6c] {
8522
8526
  opacity: 0.42;
8523
8527
  }
8524
- [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-d2b1bbe0],
8525
- [data-component~="ui-tree-item"][data-move-source] > .row > .leading[data-v-d2b1bbe0] {
8528
+ [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-fd74ff6c],
8529
+ [data-component~="ui-tree-item"][data-move-source] > .row > .leading[data-v-fd74ff6c] {
8526
8530
  opacity: 0.42;
8527
8531
  }
8528
- [data-component~="ui-tree-item"][data-v-d2b1bbe0]:focus {
8532
+ [data-component~="ui-tree-item"][data-v-fd74ff6c]:focus {
8529
8533
  outline: none;
8530
8534
  }
8531
- [data-component~="ui-tree-item"]:focus-visible .row[data-v-d2b1bbe0] {
8535
+ [data-component~="ui-tree-item"]:focus-visible .row[data-v-fd74ff6c] {
8532
8536
  box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
8533
8537
  }
8534
8538
 
8535
8539
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
8536
- [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-d2b1bbe0] {
8540
+ [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-fd74ff6c] {
8537
8541
  background: var(--ui-accent-subtle);
8538
8542
  box-shadow: inset 0 0 0 var(--ui-accent-line-width)
8539
8543
  var(--_ui-tree-drop-color, var(--ui-accent-solid));
8540
8544
  }
8541
- .disclosure[data-v-d2b1bbe0],
8542
- .disclosure-spacer[data-v-d2b1bbe0] {
8545
+ .disclosure[data-v-fd74ff6c],
8546
+ .disclosure-spacer[data-v-fd74ff6c] {
8543
8547
  grid-column: 1;
8544
8548
  grid-row: 1;
8545
8549
  inline-size: var(--_tree-disclosure-size);
8546
8550
  block-size: 28px;
8547
8551
  }
8548
- .disclosure[data-v-d2b1bbe0] {
8552
+ .disclosure[data-v-fd74ff6c] {
8549
8553
  display: grid;
8550
8554
  /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
8551
8555
  place-items: center start;
@@ -8556,10 +8560,10 @@ to {
8556
8560
  border-radius: var(--ui-radius-sm);
8557
8561
  cursor: pointer;
8558
8562
  }
8559
- .disclosure[hidden][data-v-d2b1bbe0] {
8563
+ .disclosure[hidden][data-v-fd74ff6c] {
8560
8564
  display: none;
8561
8565
  }
8562
- .selection-hit[data-v-d2b1bbe0] {
8566
+ .selection-hit[data-v-fd74ff6c] {
8563
8567
  display: none;
8564
8568
  grid-column: 2;
8565
8569
  grid-row: 1;
@@ -8568,29 +8572,29 @@ to {
8568
8572
  block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
8569
8573
  cursor: pointer;
8570
8574
  }
8571
- .selection-checkbox[data-v-d2b1bbe0] {
8575
+ .selection-checkbox[data-v-fd74ff6c] {
8572
8576
  inline-size: 1rem;
8573
8577
  block-size: 1rem;
8574
8578
  margin: 0;
8575
8579
  accent-color: var(--ui-accent-solid);
8576
8580
  }
8577
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row[data-v-d2b1bbe0] {
8581
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row[data-v-fd74ff6c] {
8578
8582
  grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr);
8579
8583
  }
8580
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .selection-hit[data-v-d2b1bbe0] {
8584
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .selection-hit[data-v-fd74ff6c] {
8581
8585
  display: grid;
8582
8586
  }
8583
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .leading[data-v-d2b1bbe0] {
8587
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .leading[data-v-fd74ff6c] {
8584
8588
  grid-column: 3;
8585
8589
  }
8586
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .label[data-v-d2b1bbe0] {
8590
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .label[data-v-fd74ff6c] {
8587
8591
  grid-column: 4;
8588
8592
  }
8589
- .disclosure[data-v-d2b1bbe0]:hover {
8593
+ .disclosure[data-v-fd74ff6c]:hover {
8590
8594
  color: var(--ui-text-primary);
8591
8595
  background: var(--ui-surface-elevated);
8592
8596
  }
8593
- .disclosure-icon[data-v-d2b1bbe0] {
8597
+ .disclosure-icon[data-v-fd74ff6c] {
8594
8598
  display: grid;
8595
8599
  place-items: center;
8596
8600
  inline-size: 12px;
@@ -8598,7 +8602,7 @@ to {
8598
8602
  transform: rotate(-90deg);
8599
8603
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
8600
8604
  }
8601
- .disclosure-icon[data-v-d2b1bbe0]::before {
8605
+ .disclosure-icon[data-v-fd74ff6c]::before {
8602
8606
  display: block;
8603
8607
  inline-size: 0.375rem;
8604
8608
  block-size: 0.375rem;
@@ -8608,19 +8612,19 @@ to {
8608
8612
  /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
8609
8613
  transform: translateY(-20%) rotate(45deg);
8610
8614
  }
8611
- [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-d2b1bbe0] {
8615
+ [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-fd74ff6c] {
8612
8616
  transform: rotate(0deg);
8613
8617
  }
8614
8618
 
8615
8619
  /* Lucide grip-vertical, filling the handle as in Looma 0.2. */
8616
- .drag-handle svg[data-v-d2b1bbe0] {
8620
+ .drag-handle svg[data-v-fd74ff6c] {
8617
8621
  display: block;
8618
8622
  inline-size: 100%;
8619
8623
  block-size: 100%;
8620
8624
  }
8621
8625
 
8622
8626
  /* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
8623
- .leading[data-v-d2b1bbe0] {
8627
+ .leading[data-v-fd74ff6c] {
8624
8628
  display: inline-grid;
8625
8629
  place-items: center;
8626
8630
  grid-column: 2;
@@ -8633,12 +8637,12 @@ to {
8633
8637
  position: relative;
8634
8638
  z-index: 1;
8635
8639
  }
8636
- .leading[data-v-d2b1bbe0]:empty {
8640
+ .leading[data-v-fd74ff6c]:empty {
8637
8641
  display: none;
8638
8642
  }
8639
8643
 
8640
8644
  /* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
8641
- svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8645
+ svg[data-v-fd74ff6c-s],img[data-v-fd74ff6c-s] {
8642
8646
  display: block;
8643
8647
  inline-size: 1em;
8644
8648
  block-size: 1em;
@@ -8647,7 +8651,7 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8647
8651
 
8648
8652
  /* The label spans the row's height and centres its content, so slotted content (a link) can
8649
8653
  stretch to fill the row as its own hit area; the padding tokens remove the inset. */
8650
- .label[data-v-d2b1bbe0] {
8654
+ .label[data-v-fd74ff6c] {
8651
8655
  grid-column: 3;
8652
8656
  grid-row: 1;
8653
8657
  align-self: stretch;
@@ -8665,7 +8669,7 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8665
8669
 
8666
8670
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
8667
8671
  its own text and reading as overflow. */
8668
- .label-text[data-v-d2b1bbe0] {
8672
+ .label-text[data-v-fd74ff6c] {
8669
8673
  display: flex;
8670
8674
  align-items: center;
8671
8675
  /* Stretches, so slotted content can still be the row's full-height hit area. */
@@ -8675,16 +8679,16 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8675
8679
  inline-size: 100%;
8676
8680
  white-space: nowrap;
8677
8681
  }
8678
- .label-text > [data-v-d2b1bbe0-s] {
8682
+ .label-text > [data-v-fd74ff6c-s] {
8679
8683
  flex: 1 1 auto;
8680
8684
  min-inline-size: 0;
8681
8685
  }
8682
8686
 
8683
8687
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
8684
8688
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
8685
- .row:hover > .label[data-v-d2b1bbe0],
8686
- .row:focus-within > .label[data-v-d2b1bbe0],
8687
- [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-d2b1bbe0] {
8689
+ .row:hover > .label[data-v-fd74ff6c],
8690
+ .row:focus-within > .label[data-v-fd74ff6c],
8691
+ [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-fd74ff6c] {
8688
8692
  text-overflow: clip;
8689
8693
  mask-image: linear-gradient(
8690
8694
  to right,
@@ -8692,9 +8696,9 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8692
8696
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
8693
8697
  );
8694
8698
  }
8695
- .row:hover > .label[data-v-d2b1bbe0]:dir(rtl),
8696
- .row:focus-within > .label[data-v-d2b1bbe0]:dir(rtl),
8697
- [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-d2b1bbe0]:dir(rtl) {
8699
+ .row:hover > .label[data-v-fd74ff6c]:dir(rtl),
8700
+ .row:focus-within > .label[data-v-fd74ff6c]:dir(rtl),
8701
+ [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-fd74ff6c]:dir(rtl) {
8698
8702
  mask-image: linear-gradient(
8699
8703
  to left,
8700
8704
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-1)),
@@ -8706,10 +8710,10 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8706
8710
  there, and starts again. Only when it actually overflows — the controller measures by how
8707
8711
  much — after the controls have taken their place over its end — and hands over the distance
8708
8712
  and a duration from it, so every name moves at the same speed. */
8709
- .row[data-ui-marquee] > .label > .label-text[data-v-d2b1bbe0] {
8713
+ .row[data-ui-marquee] > .label > .label-text[data-v-fd74ff6c] {
8710
8714
  /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
8711
8715
  long enough to read rather than sliding back and forth. */
8712
- animation: ui-tree-item-marquee-d2b1bbe0 var(--_marquee-duration) linear 0.5s 1 normal forwards;
8716
+ animation: ui-tree-item-marquee-fd74ff6c var(--_marquee-duration) linear 0.5s 1 normal forwards;
8713
8717
  will-change: transform;
8714
8718
  }
8715
8719
 
@@ -8717,7 +8721,7 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8717
8721
  slides, the label reaches back under the icon (the controller measures how far) with its text
8718
8722
  where it was, and fades out across the gap before the icon, fully gone where the icon begins
8719
8723
  to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
8720
- .row[data-ui-marquee] > .label[data-v-d2b1bbe0] {
8724
+ .row[data-ui-marquee] > .label[data-v-fd74ff6c] {
8721
8725
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
8722
8726
  padding-inline-start: calc(
8723
8727
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
@@ -8732,7 +8736,7 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8732
8736
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
8733
8737
  );
8734
8738
  }
8735
- .row[data-ui-marquee] > .label[data-v-d2b1bbe0]:dir(rtl) {
8739
+ .row[data-ui-marquee] > .label[data-v-fd74ff6c]:dir(rtl) {
8736
8740
  mask-image: linear-gradient(
8737
8741
  to left,
8738
8742
  transparent var(--_marquee-icon-width, 0px),
@@ -8743,7 +8747,7 @@ svg[data-v-d2b1bbe0-s],img[data-v-d2b1bbe0-s] {
8743
8747
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
8744
8748
  );
8745
8749
  }
8746
- @keyframes ui-tree-item-marquee-d2b1bbe0 {
8750
+ @keyframes ui-tree-item-marquee-fd74ff6c {
8747
8751
  from {
8748
8752
  transform: translateX(0);
8749
8753
  }
@@ -8754,15 +8758,15 @@ to {
8754
8758
 
8755
8759
  /* Reduced motion keeps the fade, which already says the name continues. */
8756
8760
  @media (prefers-reduced-motion: reduce) {
8757
- .row[data-ui-marquee] > .label > .label-text[data-v-d2b1bbe0] {
8761
+ .row[data-ui-marquee] > .label > .label-text[data-v-fd74ff6c] {
8758
8762
  animation: none;
8759
8763
  }
8760
8764
  }
8761
- .row:hover > .label > [data-v-d2b1bbe0-s],
8762
- .row:focus-within > .label > [data-v-d2b1bbe0-s] {
8765
+ .row:hover > .label > [data-v-fd74ff6c-s],
8766
+ .row:focus-within > .label > [data-v-fd74ff6c-s] {
8763
8767
  text-overflow: clip;
8764
8768
  }
8765
- .actions[data-v-d2b1bbe0] {
8769
+ .actions[data-v-fd74ff6c] {
8766
8770
  position: absolute;
8767
8771
  z-index: 1;
8768
8772
  inset-block: 0;
@@ -8774,19 +8778,19 @@ to {
8774
8778
  pointer-events: none;
8775
8779
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
8776
8780
  }
8777
- .row:hover > .actions[data-v-d2b1bbe0],
8778
- .row:focus-within > .actions[data-v-d2b1bbe0],
8779
- [data-component~="ui-tree-item"][data-move-source] > .row > .actions[data-v-d2b1bbe0] {
8781
+ .row:hover > .actions[data-v-fd74ff6c],
8782
+ .row:focus-within > .actions[data-v-fd74ff6c],
8783
+ [data-component~="ui-tree-item"][data-move-source] > .row > .actions[data-v-fd74ff6c] {
8780
8784
  opacity: 1;
8781
8785
  pointer-events: auto;
8782
8786
  }
8783
8787
 
8784
8788
  /* Without hover there is no reveal, so the controls keep their own column. */
8785
- @media (hover: none) {
8786
- .row[data-v-d2b1bbe0] {
8789
+ @media (hover: none), (pointer: coarse) {
8790
+ .row[data-v-fd74ff6c] {
8787
8791
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
8788
8792
  }
8789
- .actions[data-v-d2b1bbe0] {
8793
+ .actions[data-v-fd74ff6c] {
8790
8794
  position: static;
8791
8795
  grid-column: 4;
8792
8796
  grid-row: 1;
@@ -8795,13 +8799,43 @@ to {
8795
8799
  opacity: 1;
8796
8800
  pointer-events: auto;
8797
8801
  }
8802
+ .row:is(:hover, :focus-within) > .label[data-v-fd74ff6c],
8803
+ .row:is(:hover, :focus-within) > .label[data-v-fd74ff6c]:dir(rtl),
8804
+ [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-fd74ff6c],
8805
+ [data-component~="ui-tree-item"][data-move-source] > .row > .label[data-v-fd74ff6c]:dir(rtl) {
8806
+ mask-image: none;
8807
+ }
8808
+ .row[data-ui-marquee] > .label[data-v-fd74ff6c] {
8809
+ mask-image: linear-gradient(
8810
+ to right,
8811
+ transparent var(--_marquee-icon-width, 0px),
8812
+ #000 calc(
8813
+ var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
8814
+ )
8815
+ );
8816
+ }
8817
+ .row[data-ui-marquee] > .label[data-v-fd74ff6c]:dir(rtl) {
8818
+ mask-image: linear-gradient(
8819
+ to left,
8820
+ transparent var(--_marquee-icon-width, 0px),
8821
+ #000 calc(
8822
+ var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
8823
+ )
8824
+ );
8825
+ }
8826
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row[data-v-fd74ff6c] {
8827
+ grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr) auto;
8828
+ }
8829
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .actions[data-v-fd74ff6c] {
8830
+ grid-column: 5;
8831
+ }
8798
8832
  }
8799
8833
 
8800
8834
  /* The handle sits beside what it drags. A leaf row has no disclosure, so the handle takes that
8801
8835
  empty column, right before the icon; a branch's disclosure is there, so its handle sits just
8802
8836
  outside the row. It is bare until pointed at: a resting surface behind it read as a faint
8803
8837
  patch rather than as a control. */
8804
- .drag-handle[data-v-d2b1bbe0] {
8838
+ .drag-handle[data-v-fd74ff6c] {
8805
8839
  position: absolute;
8806
8840
  z-index: 2;
8807
8841
  inset-block-start: 50%;
@@ -8822,24 +8856,24 @@ to {
8822
8856
  transform: translateY(-50%);
8823
8857
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
8824
8858
  }
8825
- .row:hover .drag-handle[data-v-d2b1bbe0],
8826
- .drag-handle[data-v-d2b1bbe0]:hover,
8827
- .drag-handle[data-v-d2b1bbe0]:focus-visible,
8828
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-d2b1bbe0] {
8859
+ .row:hover .drag-handle[data-v-fd74ff6c],
8860
+ .drag-handle[data-v-fd74ff6c]:hover,
8861
+ .drag-handle[data-v-fd74ff6c]:focus-visible,
8862
+ [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-fd74ff6c] {
8829
8863
  opacity: 1;
8830
8864
  }
8831
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-d2b1bbe0] {
8865
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-fd74ff6c] {
8832
8866
  inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
8833
8867
  }
8834
- .drag-handle[data-v-d2b1bbe0]:hover,
8835
- .drag-handle[data-v-d2b1bbe0]:focus-visible {
8868
+ .drag-handle[data-v-fd74ff6c]:hover,
8869
+ .drag-handle[data-v-fd74ff6c]:focus-visible {
8836
8870
  color: var(--ui-text-primary);
8837
8871
  background: var(--ui-surface-hover);
8838
8872
  }
8839
- .drag-handle[data-v-d2b1bbe0]:active {
8873
+ .drag-handle[data-v-fd74ff6c]:active {
8840
8874
  cursor: grabbing;
8841
8875
  }
8842
- .drop-indicator[data-v-d2b1bbe0] {
8876
+ .drop-indicator[data-v-fd74ff6c] {
8843
8877
  position: absolute;
8844
8878
  z-index: 3;
8845
8879
  inset-inline: 1px;
@@ -8849,8 +8883,8 @@ to {
8849
8883
  background: var(--_ui-tree-drop-color, var(--ui-accent-solid));
8850
8884
  pointer-events: none;
8851
8885
  }
8852
- .drop-indicator[data-v-d2b1bbe0]::before,
8853
- .drop-indicator[data-v-d2b1bbe0]::after {
8886
+ .drop-indicator[data-v-fd74ff6c]::before,
8887
+ .drop-indicator[data-v-fd74ff6c]::after {
8854
8888
  content: "";
8855
8889
  position: absolute;
8856
8890
  inset-block-start: 50%;
@@ -8861,34 +8895,34 @@ to {
8861
8895
  background: var(--ui-surface-elevated);
8862
8896
  transform: translateY(-50%);
8863
8897
  }
8864
- .drop-indicator[data-v-d2b1bbe0]::before {
8898
+ .drop-indicator[data-v-fd74ff6c]::before {
8865
8899
  inset-inline-start: -1px;
8866
8900
  }
8867
- .drop-indicator[data-v-d2b1bbe0]::after {
8901
+ .drop-indicator[data-v-fd74ff6c]::after {
8868
8902
  inset-inline-end: -1px;
8869
8903
  }
8870
- [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-d2b1bbe0] {
8904
+ [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-fd74ff6c] {
8871
8905
  display: block;
8872
8906
  inset-block-start: calc(-0.5 * var(--ui-accent-line-width));
8873
8907
  }
8874
- [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-d2b1bbe0] {
8908
+ [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-fd74ff6c] {
8875
8909
  display: block;
8876
8910
  inset-block-end: calc(-0.5 * var(--ui-accent-line-width));
8877
8911
  }
8878
- .children[hidden][data-v-d2b1bbe0] {
8912
+ .children[hidden][data-v-fd74ff6c] {
8879
8913
  display: none;
8880
8914
  }
8881
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-d2b1bbe0] {
8915
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-fd74ff6c] {
8882
8916
  --_tree-row-min-height: 44px;
8883
8917
  }
8884
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row[data-v-d2b1bbe0] {
8918
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row[data-v-fd74ff6c] {
8885
8919
  grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr);
8886
8920
  }
8887
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-d2b1bbe0],
8921
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-fd74ff6c],
8888
8922
  html[data-ui-input-modality="touch"]
8889
8923
  [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"]
8890
8924
  > .row
8891
- > .drag-handle[data-v-d2b1bbe0] {
8925
+ > .drag-handle[data-v-fd74ff6c] {
8892
8926
  position: relative;
8893
8927
  grid-column: 1;
8894
8928
  grid-row: 1;
@@ -8900,24 +8934,24 @@ html[data-ui-input-modality="touch"]
8900
8934
  transform: none;
8901
8935
  cursor: pointer;
8902
8936
  }
8903
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .disclosure[data-v-d2b1bbe0] {
8937
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .disclosure[data-v-fd74ff6c] {
8904
8938
  grid-column: 2;
8905
8939
  }
8906
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .leading[data-v-d2b1bbe0] {
8940
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .leading[data-v-fd74ff6c] {
8907
8941
  grid-column: 3;
8908
8942
  }
8909
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .label[data-v-d2b1bbe0] {
8943
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .label[data-v-fd74ff6c] {
8910
8944
  grid-column: 4;
8911
8945
  }
8912
8946
  html[data-ui-input-modality="touch"]
8913
8947
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8914
- > .row[data-v-d2b1bbe0] {
8948
+ > .row[data-v-fd74ff6c] {
8915
8949
  grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr);
8916
8950
  }
8917
8951
  html[data-ui-input-modality="touch"]
8918
8952
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8919
8953
  > .row
8920
- > .selection-hit[data-v-d2b1bbe0] {
8954
+ > .selection-hit[data-v-fd74ff6c] {
8921
8955
  grid-column: 3;
8922
8956
  inline-size: 44px;
8923
8957
  block-size: 44px;
@@ -8925,36 +8959,55 @@ html[data-ui-input-modality="touch"]
8925
8959
  html[data-ui-input-modality="touch"]
8926
8960
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8927
8961
  > .row
8928
- > .leading[data-v-d2b1bbe0] {
8962
+ > .leading[data-v-fd74ff6c] {
8929
8963
  grid-column: 4;
8930
8964
  }
8931
8965
  html[data-ui-input-modality="touch"]
8932
8966
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8933
8967
  > .row
8934
- > .label[data-v-d2b1bbe0] {
8968
+ > .label[data-v-fd74ff6c] {
8935
8969
  grid-column: 5;
8936
8970
  }
8971
+ @media (hover: none), (pointer: coarse) {
8972
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row[data-v-fd74ff6c] {
8973
+ grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
8974
+ }
8975
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .actions[data-v-fd74ff6c] {
8976
+ grid-column: 5;
8977
+ }
8978
+ html[data-ui-input-modality="touch"]
8979
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8980
+ > .row[data-v-fd74ff6c] {
8981
+ grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr) auto;
8982
+ }
8983
+ html[data-ui-input-modality="touch"]
8984
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8985
+ > .row
8986
+ > .actions[data-v-fd74ff6c] {
8987
+ grid-column: 6;
8988
+ }
8989
+ }
8937
8990
  @media (prefers-reduced-motion: reduce) {
8938
- .row[data-v-d2b1bbe0],
8939
- .disclosure-icon[data-v-d2b1bbe0],
8940
- .drag-handle[data-v-d2b1bbe0] {
8991
+ .row[data-v-fd74ff6c],
8992
+ .disclosure-icon[data-v-fd74ff6c],
8993
+ .drag-handle[data-v-fd74ff6c] {
8941
8994
  transition: none;
8942
8995
  }
8943
8996
  }
8944
8997
  @media (forced-colors: active) {
8945
- [data-component~="ui-tree-item"]:focus-visible > .row[data-v-d2b1bbe0] {
8998
+ [data-component~="ui-tree-item"]:focus-visible > .row[data-v-fd74ff6c] {
8946
8999
  outline: var(--ui-focus-width) solid Highlight;
8947
9000
  outline-offset: calc(-1 * var(--ui-focus-width));
8948
9001
  }
8949
9002
  [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"]:not(:focus-visible):not([aria-disabled="true"])
8950
- > .row[data-v-d2b1bbe0] {
9003
+ > .row[data-v-fd74ff6c] {
8951
9004
  outline: var(--ui-border-width) solid Highlight;
8952
9005
  outline-offset: calc(-1 * var(--ui-border-width));
8953
9006
  }
8954
9007
  }
8955
9008
 
8956
9009
  /* A component that sets its display still honours the hidden attribute on its root. */
8957
- [data-component~="ui-tree-item"][hidden][data-v-d2b1bbe0] {
9010
+ [data-component~="ui-tree-item"][hidden][data-v-fd74ff6c] {
8958
9011
  display: none;
8959
9012
  }
8960
9013
  /**
@@ -23,9 +23,10 @@ export type LoomaImageUploader = (file: File) => Promise<string | LoomaImageUplo
23
23
  /**
24
24
  * Chooses whether formatting controls follow a selection, occupy persistent
25
25
  * editor chrome, or open from an app-owned button (`popover`, with a text-only
26
- * bubble for selections); it does not alter document commands or stored content.
26
+ * bubble for selections). `contextual` exposes all commands at a focused caret
27
+ * as well as a selection; it does not alter document commands or stored content.
27
28
  */
28
- export type LoomaEditorToolbarMode = "bubble" | "sticky" | "popover";
29
+ export type LoomaEditorToolbarMode = "bubble" | "sticky" | "popover" | "contextual";
29
30
  /** A destination supplied by the host application, such as a page or record. */
30
31
  export interface LoomaLinkTarget {
31
32
  id: string;