@threadlabs/looma 0.15.5 → 0.15.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9065,6 +9065,12 @@ function setActiveTableCellBackground(editor, backgroundColor) {
9065
9065
  * Default Tiptap extension preset for Looma editor.
9066
9066
  * Uses the Vanilla JS Tiptap API; apps provide @tiptap/core and Looma ships the preset extensions.
9067
9067
  */
9068
+ var StoredOnlyHighlight = Highlight.extend({
9069
+ parseHTML: () => [],
9070
+ addKeyboardShortcuts: () => ({}),
9071
+ addInputRules: () => [],
9072
+ addPasteRules: () => []
9073
+ });
9068
9074
  var lowlight = createLowlight(common);
9069
9075
  /**
9070
9076
  * Complete Looma table schema as one Tiptap extension.
@@ -9105,7 +9111,7 @@ function getLoomaTableExtensions() {
9105
9111
  * framework's Tiptap editor hook.
9106
9112
  */
9107
9113
  function getDefaultEditorExtensions(options = {}) {
9108
- const { placeholder = "Type “/” for commands, or start writing…", linkOpenOnClick = false, imageInline = false, mention = createLoomaMentionExtension() } = options;
9114
+ const { placeholder = "Type “/” for commands, or start writing…", linkOpenOnClick = false, imageInline = false, mention = createLoomaMentionExtension(), disableHighlight = false } = options;
9109
9115
  return [
9110
9116
  Document,
9111
9117
  Paragraph,
@@ -9139,7 +9145,7 @@ function getDefaultEditorExtensions(options = {}) {
9139
9145
  }
9140
9146
  }),
9141
9147
  Image.configure({ inline: imageInline }),
9142
- Highlight.configure({ multicolor: false }),
9148
+ (disableHighlight ? StoredOnlyHighlight : Highlight).configure({ multicolor: false }),
9143
9149
  Code,
9144
9150
  LoomaSmartPaste,
9145
9151
  CodeBlockLowlight.configure({ lowlight }),
@@ -17,6 +17,13 @@ export interface DefaultEditorExtensionsOptions {
17
17
  imageInline?: boolean;
18
18
  /** Custom mention extension, the Looma default, or false to omit mentions. */
19
19
  mention?: AnyExtension | false;
20
+ /**
21
+ * Removes every way for authors to apply the highlight mark: the Mod-Shift-H
22
+ * shortcut, `==text==` typing and paste rules, and `<mark>` parsing from
23
+ * pasted or HTML content. Highlights already stored in a document still load
24
+ * and render. Use it when the application reserves highlighting for itself.
25
+ */
26
+ disableHighlight?: boolean;
20
27
  }
21
28
  /**
22
29
  * Complete Looma table schema as one Tiptap extension.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@threadlabs/looma",
3
- "version": "0.15.5",
3
+ "version": "0.15.7",
4
4
  "type": "module",
5
5
  "description": "Looma components as HTML, Vue, and plain DOM, with design tokens.",
6
6
  "license": "MIT",
@@ -256,27 +256,27 @@
256
256
  );
257
257
  }
258
258
 
259
- /* A hovered row reads its whole name: the label slides far enough to show the end, waits
260
- there, and comes back. Only when it actually overflows — the controller measures by how
259
+ /* A hovered row reads its whole name: the label slides far enough to show the end, rests
260
+ there, and starts again. Only when it actually overflows — the controller measures by how
261
261
  much — after the controls have taken their place over its end — and hands over the distance
262
262
  and a duration from it, so every name moves at the same speed. */
263
263
  .row[data-ui-marquee] > .label > .label-text {
264
- /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
265
- and forth under the pointer is harder to read than one that arrives and holds. */
264
+ /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
265
+ long enough to read rather than sliding back and forth. */
266
266
  animation: ui-tree-item-marquee var(--_marquee-duration) linear 0.5s 1 normal forwards;
267
267
  will-change: transform;
268
268
  }
269
269
 
270
270
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
271
271
  slides, the label reaches back under the icon (the controller measures how far) with its text
272
- where it was, and fades out across that stretch, gone by the icon's middle: the name slips
273
- under the icon rather than stopping at a hard edge beside it. */
272
+ where it was, and fades out across the gap before the icon, fully gone where the icon begins
273
+ to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
274
274
  .row[data-ui-marquee] > .label {
275
275
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
276
276
  padding-inline-start: calc(var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2)));
277
277
  mask-image: linear-gradient(
278
278
  to right,
279
- transparent calc(var(--_marquee-lead, 0px) / 2),
279
+ transparent var(--_marquee-icon-width, 0px),
280
280
  #000 calc(var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))),
281
281
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
282
282
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
@@ -286,7 +286,7 @@
286
286
  .row[data-ui-marquee] > .label:dir(rtl) {
287
287
  mask-image: linear-gradient(
288
288
  to left,
289
- transparent calc(var(--_marquee-lead, 0px) / 2),
289
+ transparent var(--_marquee-icon-width, 0px),
290
290
  #000 calc(var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))),
291
291
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
292
292
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
@@ -520,15 +520,15 @@
520
520
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
521
521
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
522
522
 
523
- /* A hovered row reads its whole name: the label slides far enough to show the end, waits
524
- there, and comes back. Only when it actually overflows — the controller measures by how
523
+ /* A hovered row reads its whole name: the label slides far enough to show the end, rests
524
+ there, and starts again. Only when it actually overflows — the controller measures by how
525
525
  much — after the controls have taken their place over its end — and hands over the distance
526
526
  and a duration from it, so every name moves at the same speed. */
527
527
 
528
528
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
529
529
  slides, the label reaches back under the icon (the controller measures how far) with its text
530
- where it was, and fades out across that stretch, gone by the icon's middle: the name slips
531
- under the icon rather than stopping at a hard edge beside it. */
530
+ where it was, and fades out across the gap before the icon, fully gone where the icon begins
531
+ to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
532
532
 
533
533
  /* Reduced motion keeps the fade, which already says the name continues. */
534
534
  @media (prefers-reduced-motion: reduce) {
@@ -449,21 +449,21 @@ useComponentHost(controllerModule.default, {
449
449
  );
450
450
  }
451
451
 
452
- /* A hovered row reads its whole name: the label slides far enough to show the end, waits
453
- there, and comes back. Only when it actually overflows — the controller measures by how
452
+ /* A hovered row reads its whole name: the label slides far enough to show the end, rests
453
+ there, and starts again. Only when it actually overflows — the controller measures by how
454
454
  much — after the controls have taken their place over its end — and hands over the distance
455
455
  and a duration from it, so every name moves at the same speed. */
456
456
  .row[data-ui-marquee] > .label > .label-text {
457
- /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
458
- and forth under the pointer is harder to read than one that arrives and holds. */
457
+ /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
458
+ long enough to read rather than sliding back and forth. */
459
459
  animation: ui-tree-item-marquee var(--_marquee-duration) linear 0.5s 1 normal forwards;
460
460
  will-change: transform;
461
461
  }
462
462
 
463
463
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
464
464
  slides, the label reaches back under the icon (the controller measures how far) with its text
465
- where it was, and fades out across that stretch, gone by the icon's middle: the name slips
466
- under the icon rather than stopping at a hard edge beside it. */
465
+ where it was, and fades out across the gap before the icon, fully gone where the icon begins
466
+ to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
467
467
  .row[data-ui-marquee] > .label {
468
468
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
469
469
  padding-inline-start: calc(
@@ -471,7 +471,7 @@ useComponentHost(controllerModule.default, {
471
471
  );
472
472
  mask-image: linear-gradient(
473
473
  to right,
474
- transparent calc(var(--_marquee-lead, 0px) / 2),
474
+ transparent var(--_marquee-icon-width, 0px),
475
475
  #000 calc(
476
476
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
477
477
  ),
@@ -483,7 +483,7 @@ useComponentHost(controllerModule.default, {
483
483
  .row[data-ui-marquee] > .label:dir(rtl) {
484
484
  mask-image: linear-gradient(
485
485
  to left,
486
- transparent calc(var(--_marquee-lead, 0px) / 2),
486
+ transparent var(--_marquee-icon-width, 0px),
487
487
  #000 calc(
488
488
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
489
489
  ),
@@ -252,6 +252,6 @@ var UiTreeItem_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
252
252
  ], 16, _hoisted_1);
253
253
  };
254
254
  }
255
- }), [["__scopeId", "data-v-ad0fbbba"]]);
255
+ }), [["__scopeId", "data-v-12522ec8"]]);
256
256
  //#endregion
257
257
  export { UiTreeItem_default as t };
@@ -7704,7 +7704,7 @@ to {
7704
7704
  syntax: "*";
7705
7705
  inherits: false;
7706
7706
  }
7707
- [data-component~="ui-tree-item"][data-v-ad0fbbba] {
7707
+ [data-component~="ui-tree-item"][data-v-12522ec8] {
7708
7708
  /* Hooks do not inherit, so the parts below read them from the root. The tree's density
7709
7709
  sets the defaults, in --_ui-default-*. */
7710
7710
  --_ui-tree-item-min-block-size: var(
@@ -7726,7 +7726,7 @@ to {
7726
7726
  min-inline-size: 0;
7727
7727
  margin-inline-start: calc(var(--ui-tree-item-depth, 0) * var(--_ui-tree-indent, 16px));
7728
7728
  }
7729
- .row[data-v-ad0fbbba] {
7729
+ .row[data-v-12522ec8] {
7730
7730
  position: relative;
7731
7731
  display: grid;
7732
7732
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr);
@@ -7743,38 +7743,38 @@ to {
7743
7743
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
7744
7744
  min-block-size var(--ui-motion-base) var(--ui-motion-ease);
7745
7745
  }
7746
- .row[data-v-ad0fbbba]:hover,
7747
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-ad0fbbba],
7748
- .row[data-v-ad0fbbba]:focus-within {
7746
+ .row[data-v-12522ec8]:hover,
7747
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="selected"] .row[data-v-12522ec8],
7748
+ .row[data-v-12522ec8]:focus-within {
7749
7749
  color: var(--ui-text-primary);
7750
7750
  background: var(--ui-surface-muted);
7751
7751
  }
7752
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-ad0fbbba] {
7752
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="disabled"] .row[data-v-12522ec8] {
7753
7753
  opacity: 0.55;
7754
7754
  }
7755
- [data-component~="ui-tree-item"][data-dragging] .row[data-v-ad0fbbba] {
7755
+ [data-component~="ui-tree-item"][data-dragging] .row[data-v-12522ec8] {
7756
7756
  opacity: 0.42;
7757
7757
  }
7758
- [data-component~="ui-tree-item"][data-v-ad0fbbba]:focus {
7758
+ [data-component~="ui-tree-item"][data-v-12522ec8]:focus {
7759
7759
  outline: none;
7760
7760
  }
7761
- [data-component~="ui-tree-item"]:focus-visible .row[data-v-ad0fbbba] {
7761
+ [data-component~="ui-tree-item"]:focus-visible .row[data-v-12522ec8] {
7762
7762
  box-shadow: 0 0 0 2px var(--ui-focus-ring);
7763
7763
  }
7764
7764
 
7765
7765
  /* Child combinators: drop feedback belongs to this item's own row, not the rows nested in it. */
7766
- [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-ad0fbbba] {
7766
+ [data-component~="ui-tree-item"][data-drop-position="inside"] > .row[data-v-12522ec8] {
7767
7767
  background: var(--ui-accent-subtle);
7768
7768
  box-shadow: inset 0 0 0 1px var(--_ui-tree-drop-color, var(--ui-accent-solid));
7769
7769
  }
7770
- .disclosure[data-v-ad0fbbba],
7771
- .disclosure-spacer[data-v-ad0fbbba] {
7770
+ .disclosure[data-v-12522ec8],
7771
+ .disclosure-spacer[data-v-12522ec8] {
7772
7772
  grid-column: 1;
7773
7773
  grid-row: 1;
7774
7774
  inline-size: var(--_tree-disclosure-size);
7775
7775
  block-size: 28px;
7776
7776
  }
7777
- .disclosure[data-v-ad0fbbba] {
7777
+ .disclosure[data-v-12522ec8] {
7778
7778
  display: grid;
7779
7779
  /* Start-aligned: the chevron's ink, not its hit area, aligns with the content above it. */
7780
7780
  place-items: center start;
@@ -7785,10 +7785,10 @@ to {
7785
7785
  border-radius: var(--ui-radius-sm);
7786
7786
  cursor: pointer;
7787
7787
  }
7788
- .disclosure[hidden][data-v-ad0fbbba] {
7788
+ .disclosure[hidden][data-v-12522ec8] {
7789
7789
  display: none;
7790
7790
  }
7791
- .selection-hit[data-v-ad0fbbba] {
7791
+ .selection-hit[data-v-12522ec8] {
7792
7792
  display: none;
7793
7793
  grid-column: 2;
7794
7794
  grid-row: 1;
@@ -7797,29 +7797,29 @@ to {
7797
7797
  block-size: var(--_ui-tree-item-min-block-size, var(--_tree-row-min-height));
7798
7798
  cursor: pointer;
7799
7799
  }
7800
- .selection-checkbox[data-v-ad0fbbba] {
7800
+ .selection-checkbox[data-v-12522ec8] {
7801
7801
  inline-size: 1rem;
7802
7802
  block-size: 1rem;
7803
7803
  margin: 0;
7804
7804
  accent-color: var(--ui-accent-solid);
7805
7805
  }
7806
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row[data-v-ad0fbbba] {
7806
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row[data-v-12522ec8] {
7807
7807
  grid-template-columns: var(--_tree-disclosure-size) 1.25rem auto minmax(0, 1fr);
7808
7808
  }
7809
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .selection-hit[data-v-ad0fbbba] {
7809
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .selection-hit[data-v-12522ec8] {
7810
7810
  display: grid;
7811
7811
  }
7812
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .leading[data-v-ad0fbbba] {
7812
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .leading[data-v-12522ec8] {
7813
7813
  grid-column: 3;
7814
7814
  }
7815
- [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .label[data-v-ad0fbbba] {
7815
+ [data-component~="ui-tree-item"][data-selection-mode="multiple"] > .row > .label[data-v-12522ec8] {
7816
7816
  grid-column: 4;
7817
7817
  }
7818
- .disclosure[data-v-ad0fbbba]:hover {
7818
+ .disclosure[data-v-12522ec8]:hover {
7819
7819
  color: var(--ui-text-primary);
7820
7820
  background: var(--ui-surface-elevated);
7821
7821
  }
7822
- .disclosure-icon[data-v-ad0fbbba] {
7822
+ .disclosure-icon[data-v-12522ec8] {
7823
7823
  display: grid;
7824
7824
  place-items: center;
7825
7825
  inline-size: 12px;
@@ -7827,7 +7827,7 @@ to {
7827
7827
  transform: rotate(-90deg);
7828
7828
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
7829
7829
  }
7830
- .disclosure-icon[data-v-ad0fbbba]::before {
7830
+ .disclosure-icon[data-v-12522ec8]::before {
7831
7831
  display: block;
7832
7832
  inline-size: 0.375rem;
7833
7833
  block-size: 0.375rem;
@@ -7837,19 +7837,19 @@ to {
7837
7837
  /* A chevron's ink sits below its box centre; lift it so it centres optically (in either rotation). */
7838
7838
  transform: translateY(-20%) rotate(45deg);
7839
7839
  }
7840
- [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-ad0fbbba] {
7840
+ [data-component~="ui-tree-item"][aria-expanded="true"] .disclosure-icon[data-v-12522ec8] {
7841
7841
  transform: rotate(0deg);
7842
7842
  }
7843
7843
 
7844
7844
  /* Lucide grip-vertical, filling the handle as in Looma 0.2. */
7845
- .drag-handle svg[data-v-ad0fbbba] {
7845
+ .drag-handle svg[data-v-12522ec8] {
7846
7846
  display: block;
7847
7847
  inline-size: 100%;
7848
7848
  block-size: 100%;
7849
7849
  }
7850
7850
 
7851
7851
  /* Slotted content is outside this scope, so :has() cannot see it; hide only a truly empty slot. */
7852
- .leading[data-v-ad0fbbba] {
7852
+ .leading[data-v-12522ec8] {
7853
7853
  display: inline-grid;
7854
7854
  place-items: center;
7855
7855
  grid-column: 2;
@@ -7862,12 +7862,12 @@ to {
7862
7862
  position: relative;
7863
7863
  z-index: 1;
7864
7864
  }
7865
- .leading[data-v-ad0fbbba]:empty {
7865
+ .leading[data-v-12522ec8]:empty {
7866
7866
  display: none;
7867
7867
  }
7868
7868
 
7869
7869
  /* Icons match the label's size (as in Knit's tree): an unsized SVG would otherwise render 300×150. */
7870
- svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7870
+ svg[data-v-12522ec8-s],img[data-v-12522ec8-s] {
7871
7871
  display: block;
7872
7872
  inline-size: 1em;
7873
7873
  block-size: 1em;
@@ -7876,7 +7876,7 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7876
7876
 
7877
7877
  /* The label spans the row's height and centres its content, so slotted content (a link) can
7878
7878
  stretch to fill the row as its own hit area; the padding tokens remove the inset. */
7879
- .label[data-v-ad0fbbba] {
7879
+ .label[data-v-12522ec8] {
7880
7880
  grid-column: 3;
7881
7881
  grid-row: 1;
7882
7882
  align-self: stretch;
@@ -7894,7 +7894,7 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7894
7894
 
7895
7895
  /* Slotted label content fills the cell, so a link is the row's hit area rather than sizing to
7896
7896
  its own text and reading as overflow. */
7897
- .label-text[data-v-ad0fbbba] {
7897
+ .label-text[data-v-12522ec8] {
7898
7898
  display: flex;
7899
7899
  align-items: center;
7900
7900
  /* Stretches, so slotted content can still be the row's full-height hit area. */
@@ -7904,15 +7904,15 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7904
7904
  inline-size: 100%;
7905
7905
  white-space: nowrap;
7906
7906
  }
7907
- .label-text > [data-v-ad0fbbba-s] {
7907
+ .label-text > [data-v-12522ec8-s] {
7908
7908
  flex: 1 1 auto;
7909
7909
  min-inline-size: 0;
7910
7910
  }
7911
7911
 
7912
7912
  /* The controls sit over the label's end, so the text fades out where they begin. The fade is
7913
7913
  the truncation mark while it shows: an ellipsis under it would read as a second one. */
7914
- .row:hover > .label[data-v-ad0fbbba],
7915
- .row:focus-within > .label[data-v-ad0fbbba] {
7914
+ .row:hover > .label[data-v-12522ec8],
7915
+ .row:focus-within > .label[data-v-12522ec8] {
7916
7916
  text-overflow: clip;
7917
7917
  mask-image: linear-gradient(
7918
7918
  to right,
@@ -7920,8 +7920,8 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7920
7920
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
7921
7921
  );
7922
7922
  }
7923
- .row:hover > .label[data-v-ad0fbbba]:dir(rtl),
7924
- .row:focus-within > .label[data-v-ad0fbbba]:dir(rtl) {
7923
+ .row:hover > .label[data-v-12522ec8]:dir(rtl),
7924
+ .row:focus-within > .label[data-v-12522ec8]:dir(rtl) {
7925
7925
  mask-image: linear-gradient(
7926
7926
  to left,
7927
7927
  #000 calc(100% - var(--_tree-actions-width, 1.75rem) - var(--ui-space-3)),
@@ -7929,29 +7929,29 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7929
7929
  );
7930
7930
  }
7931
7931
 
7932
- /* A hovered row reads its whole name: the label slides far enough to show the end, waits
7933
- there, and comes back. Only when it actually overflows — the controller measures by how
7932
+ /* A hovered row reads its whole name: the label slides far enough to show the end, rests
7933
+ there, and starts again. Only when it actually overflows — the controller measures by how
7934
7934
  much — after the controls have taken their place over its end — and hands over the distance
7935
7935
  and a duration from it, so every name moves at the same speed. */
7936
- .row[data-ui-marquee] > .label > .label-text[data-v-ad0fbbba] {
7937
- /* Once, and it stays at the end while the pointer is there: a name that keeps sliding back
7938
- and forth under the pointer is harder to read than one that arrives and holds. */
7939
- animation: ui-tree-item-marquee-ad0fbbba var(--_marquee-duration) linear 0.5s 1 normal forwards;
7936
+ .row[data-ui-marquee] > .label > .label-text[data-v-12522ec8] {
7937
+ /* Once per pass: the controller restarts it after a rest at the end, so the name holds still
7938
+ long enough to read rather than sliding back and forth. */
7939
+ animation: ui-tree-item-marquee-12522ec8 var(--_marquee-duration) linear 0.5s 1 normal forwards;
7940
7940
  will-change: transform;
7941
7941
  }
7942
7942
 
7943
7943
  /* This comes after the hover fade, which it replaces at the same specificity. While the name
7944
7944
  slides, the label reaches back under the icon (the controller measures how far) with its text
7945
- where it was, and fades out across that stretch, gone by the icon's middle: the name slips
7946
- under the icon rather than stopping at a hard edge beside it. */
7947
- .row[data-ui-marquee] > .label[data-v-ad0fbbba] {
7945
+ where it was, and fades out across the gap before the icon, fully gone where the icon begins
7946
+ to cover it: the name slips under the icon rather than stopping at a hard edge beside it. */
7947
+ .row[data-ui-marquee] > .label[data-v-12522ec8] {
7948
7948
  margin-inline-start: calc(-1 * var(--_marquee-lead, 0px));
7949
7949
  padding-inline-start: calc(
7950
7950
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
7951
7951
  );
7952
7952
  mask-image: linear-gradient(
7953
7953
  to right,
7954
- transparent calc(var(--_marquee-lead, 0px) / 2),
7954
+ transparent var(--_marquee-icon-width, 0px),
7955
7955
  #000 calc(
7956
7956
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
7957
7957
  ),
@@ -7959,10 +7959,10 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7959
7959
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
7960
7960
  );
7961
7961
  }
7962
- .row[data-ui-marquee] > .label[data-v-ad0fbbba]:dir(rtl) {
7962
+ .row[data-ui-marquee] > .label[data-v-12522ec8]:dir(rtl) {
7963
7963
  mask-image: linear-gradient(
7964
7964
  to left,
7965
- transparent calc(var(--_marquee-lead, 0px) / 2),
7965
+ transparent var(--_marquee-icon-width, 0px),
7966
7966
  #000 calc(
7967
7967
  var(--_marquee-lead, 0px) + var(--_ui-tree-item-label-padding-inline, var(--ui-space-2))
7968
7968
  ),
@@ -7970,7 +7970,7 @@ svg[data-v-ad0fbbba-s],img[data-v-ad0fbbba-s] {
7970
7970
  transparent calc(100% - var(--_tree-actions-width, 1.75rem))
7971
7971
  );
7972
7972
  }
7973
- @keyframes ui-tree-item-marquee-ad0fbbba {
7973
+ @keyframes ui-tree-item-marquee-12522ec8 {
7974
7974
  from {
7975
7975
  transform: translateX(0);
7976
7976
  }
@@ -7981,15 +7981,15 @@ to {
7981
7981
 
7982
7982
  /* Reduced motion keeps the fade, which already says the name continues. */
7983
7983
  @media (prefers-reduced-motion: reduce) {
7984
- .row[data-ui-marquee] > .label > .label-text[data-v-ad0fbbba] {
7984
+ .row[data-ui-marquee] > .label > .label-text[data-v-12522ec8] {
7985
7985
  animation: none;
7986
7986
  }
7987
7987
  }
7988
- .row:hover > .label > [data-v-ad0fbbba-s],
7989
- .row:focus-within > .label > [data-v-ad0fbbba-s] {
7988
+ .row:hover > .label > [data-v-12522ec8-s],
7989
+ .row:focus-within > .label > [data-v-12522ec8-s] {
7990
7990
  text-overflow: clip;
7991
7991
  }
7992
- .actions[data-v-ad0fbbba] {
7992
+ .actions[data-v-12522ec8] {
7993
7993
  position: absolute;
7994
7994
  z-index: 1;
7995
7995
  inset-block: 0;
@@ -8001,18 +8001,18 @@ to {
8001
8001
  pointer-events: none;
8002
8002
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
8003
8003
  }
8004
- .row:hover > .actions[data-v-ad0fbbba],
8005
- .row:focus-within > .actions[data-v-ad0fbbba] {
8004
+ .row:hover > .actions[data-v-12522ec8],
8005
+ .row:focus-within > .actions[data-v-12522ec8] {
8006
8006
  opacity: 1;
8007
8007
  pointer-events: auto;
8008
8008
  }
8009
8009
 
8010
8010
  /* Without hover there is no reveal, so the controls keep their own column. */
8011
8011
  @media (hover: none) {
8012
- .row[data-v-ad0fbbba] {
8012
+ .row[data-v-12522ec8] {
8013
8013
  grid-template-columns: var(--_tree-disclosure-size) auto minmax(0, 1fr) auto;
8014
8014
  }
8015
- .actions[data-v-ad0fbbba] {
8015
+ .actions[data-v-12522ec8] {
8016
8016
  position: static;
8017
8017
  grid-column: 4;
8018
8018
  grid-row: 1;
@@ -8027,7 +8027,7 @@ to {
8027
8027
  empty column, right before the icon; a branch's disclosure is there, so its handle sits just
8028
8028
  outside the row. It is bare until pointed at: a resting surface behind it read as a faint
8029
8029
  patch rather than as a control. */
8030
- .drag-handle[data-v-ad0fbbba] {
8030
+ .drag-handle[data-v-12522ec8] {
8031
8031
  position: absolute;
8032
8032
  z-index: 2;
8033
8033
  inset-block-start: 50%;
@@ -8048,24 +8048,24 @@ to {
8048
8048
  transform: translateY(-50%);
8049
8049
  transition: opacity var(--ui-motion-fast) var(--ui-motion-ease);
8050
8050
  }
8051
- .row:hover .drag-handle[data-v-ad0fbbba],
8052
- .drag-handle[data-v-ad0fbbba]:hover,
8053
- .drag-handle[data-v-ad0fbbba]:focus-visible,
8054
- [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-ad0fbbba] {
8051
+ .row:hover .drag-handle[data-v-12522ec8],
8052
+ .drag-handle[data-v-12522ec8]:hover,
8053
+ .drag-handle[data-v-12522ec8]:focus-visible,
8054
+ [data-component~="ui-tree-item"][data-dragging] > .row > .drag-handle[data-v-12522ec8] {
8055
8055
  opacity: 1;
8056
8056
  }
8057
- [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-ad0fbbba] {
8057
+ [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"] > .row > .drag-handle[data-v-12522ec8] {
8058
8058
  inset-inline-start: calc(-1 * var(--_tree-disclosure-size) - 2px);
8059
8059
  }
8060
- .drag-handle[data-v-ad0fbbba]:hover,
8061
- .drag-handle[data-v-ad0fbbba]:focus-visible {
8060
+ .drag-handle[data-v-12522ec8]:hover,
8061
+ .drag-handle[data-v-12522ec8]:focus-visible {
8062
8062
  color: var(--ui-text-primary);
8063
8063
  background: var(--ui-surface-hover);
8064
8064
  }
8065
- .drag-handle[data-v-ad0fbbba]:active {
8065
+ .drag-handle[data-v-12522ec8]:active {
8066
8066
  cursor: grabbing;
8067
8067
  }
8068
- .drop-indicator[data-v-ad0fbbba] {
8068
+ .drop-indicator[data-v-12522ec8] {
8069
8069
  position: absolute;
8070
8070
  z-index: 3;
8071
8071
  inset-inline: 1px;
@@ -8075,8 +8075,8 @@ to {
8075
8075
  background: var(--_ui-tree-drop-color, var(--ui-accent-solid));
8076
8076
  pointer-events: none;
8077
8077
  }
8078
- .drop-indicator[data-v-ad0fbbba]::before,
8079
- .drop-indicator[data-v-ad0fbbba]::after {
8078
+ .drop-indicator[data-v-12522ec8]::before,
8079
+ .drop-indicator[data-v-12522ec8]::after {
8080
8080
  content: "";
8081
8081
  position: absolute;
8082
8082
  inset-block-start: 50%;
@@ -8087,34 +8087,34 @@ to {
8087
8087
  background: var(--ui-surface-elevated);
8088
8088
  transform: translateY(-50%);
8089
8089
  }
8090
- .drop-indicator[data-v-ad0fbbba]::before {
8090
+ .drop-indicator[data-v-12522ec8]::before {
8091
8091
  inset-inline-start: -1px;
8092
8092
  }
8093
- .drop-indicator[data-v-ad0fbbba]::after {
8093
+ .drop-indicator[data-v-12522ec8]::after {
8094
8094
  inset-inline-end: -1px;
8095
8095
  }
8096
- [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-ad0fbbba] {
8096
+ [data-component~="ui-tree-item"][data-drop-position="before"] > .row > .row-drop-indicator[data-v-12522ec8] {
8097
8097
  display: block;
8098
8098
  inset-block-start: -1px;
8099
8099
  }
8100
- [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-ad0fbbba] {
8100
+ [data-component~="ui-tree-item"][data-drop-position="after"] > .subtree-drop-indicator[data-v-12522ec8] {
8101
8101
  display: block;
8102
8102
  inset-block-end: -1px;
8103
8103
  }
8104
- .children[hidden][data-v-ad0fbbba] {
8104
+ .children[hidden][data-v-12522ec8] {
8105
8105
  display: none;
8106
8106
  }
8107
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-ad0fbbba] {
8107
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"][data-v-12522ec8] {
8108
8108
  --_tree-row-min-height: 44px;
8109
8109
  }
8110
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row[data-v-ad0fbbba] {
8110
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .row[data-v-12522ec8] {
8111
8111
  grid-template-columns: 44px var(--_tree-disclosure-size) auto minmax(0, 1fr);
8112
8112
  }
8113
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-ad0fbbba],
8113
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .drag-handle[data-v-12522ec8],
8114
8114
  html[data-ui-input-modality="touch"]
8115
8115
  [data-component~="ui-tree-item"][data-ui-tree-item-state~="isContainer"]
8116
8116
  > .row
8117
- > .drag-handle[data-v-ad0fbbba] {
8117
+ > .drag-handle[data-v-12522ec8] {
8118
8118
  position: relative;
8119
8119
  grid-column: 1;
8120
8120
  grid-row: 1;
@@ -8126,24 +8126,24 @@ html[data-ui-input-modality="touch"]
8126
8126
  transform: none;
8127
8127
  cursor: pointer;
8128
8128
  }
8129
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .disclosure[data-v-ad0fbbba] {
8129
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .disclosure[data-v-12522ec8] {
8130
8130
  grid-column: 2;
8131
8131
  }
8132
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .leading[data-v-ad0fbbba] {
8132
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .leading[data-v-12522ec8] {
8133
8133
  grid-column: 3;
8134
8134
  }
8135
- html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .label[data-v-ad0fbbba] {
8135
+ html[data-ui-input-modality="touch"] [data-component~="ui-tree-item"] .label[data-v-12522ec8] {
8136
8136
  grid-column: 4;
8137
8137
  }
8138
8138
  html[data-ui-input-modality="touch"]
8139
8139
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8140
- > .row[data-v-ad0fbbba] {
8140
+ > .row[data-v-12522ec8] {
8141
8141
  grid-template-columns: 44px var(--_tree-disclosure-size) 44px auto minmax(0, 1fr);
8142
8142
  }
8143
8143
  html[data-ui-input-modality="touch"]
8144
8144
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8145
8145
  > .row
8146
- > .selection-hit[data-v-ad0fbbba] {
8146
+ > .selection-hit[data-v-12522ec8] {
8147
8147
  grid-column: 3;
8148
8148
  inline-size: 44px;
8149
8149
  block-size: 44px;
@@ -8151,25 +8151,25 @@ html[data-ui-input-modality="touch"]
8151
8151
  html[data-ui-input-modality="touch"]
8152
8152
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8153
8153
  > .row
8154
- > .leading[data-v-ad0fbbba] {
8154
+ > .leading[data-v-12522ec8] {
8155
8155
  grid-column: 4;
8156
8156
  }
8157
8157
  html[data-ui-input-modality="touch"]
8158
8158
  [data-component~="ui-tree-item"][data-selection-mode="multiple"]
8159
8159
  > .row
8160
- > .label[data-v-ad0fbbba] {
8160
+ > .label[data-v-12522ec8] {
8161
8161
  grid-column: 5;
8162
8162
  }
8163
8163
  @media (prefers-reduced-motion: reduce) {
8164
- .row[data-v-ad0fbbba],
8165
- .disclosure-icon[data-v-ad0fbbba],
8166
- .drag-handle[data-v-ad0fbbba] {
8164
+ .row[data-v-12522ec8],
8165
+ .disclosure-icon[data-v-12522ec8],
8166
+ .drag-handle[data-v-12522ec8] {
8167
8167
  transition: none;
8168
8168
  }
8169
8169
  }
8170
8170
 
8171
8171
  /* A component that sets its display still honours the hidden attribute on its root. */
8172
- [data-component~="ui-tree-item"][hidden][data-v-ad0fbbba] {
8172
+ [data-component~="ui-tree-item"][hidden][data-v-12522ec8] {
8173
8173
  display: none;
8174
8174
  }
8175
8175
  /**