@threadlabs/looma 0.9.2 → 0.10.1

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.
Files changed (49) hide show
  1. package/components/shared/form-reset.js +21 -0
  2. package/components/ui-checkbox/ui-checkbox.html +17 -4
  3. package/components/ui-checkbox/ui-checkbox.js +9 -0
  4. package/components/ui-combobox/ui-combobox.html +23 -11
  5. package/components/ui-combobox/ui-combobox.js +31 -12
  6. package/components/ui-editable/ui-editable.html +3 -1
  7. package/components/ui-editable/ui-editable.js +7 -6
  8. package/components/ui-editor-toolbar/ui-editor-toolbar.html +70 -20
  9. package/components/ui-editor-toolbar/ui-editor-toolbar.js +24 -0
  10. package/components/ui-input/ui-input.html +2 -2
  11. package/components/ui-input/ui-input.js +5 -2
  12. package/components/ui-radio/ui-radio.html +3 -1
  13. package/components/ui-radio/ui-radio.js +11 -0
  14. package/components/ui-radio-group/ui-radio-group.html +7 -5
  15. package/components/ui-radio-group/ui-radio-group.js +16 -3
  16. package/components/ui-search-result-row/ui-search-result-row.html +3 -3
  17. package/components/ui-select/ui-select.html +3 -1
  18. package/components/ui-select/ui-select.js +5 -2
  19. package/components/ui-switch/ui-switch.html +7 -4
  20. package/components/ui-switch/ui-switch.js +9 -0
  21. package/components/ui-textarea/ui-textarea.html +2 -2
  22. package/components/ui-textarea/ui-textarea.js +5 -2
  23. package/components/ui-tree-item/ui-tree-item.html +2 -2
  24. package/dist/index.js +20 -19
  25. package/package.json +1 -1
  26. package/styles/ui-editor-toolbar.css +72 -18
  27. package/vanilla/UiCheckbox.d.ts +1 -0
  28. package/vanilla/UiCheckbox.js +7 -4
  29. package/vanilla/UiCombobox.js +113 -99
  30. package/vanilla/UiEditorToolbar.js +11 -6
  31. package/vanilla/UiRadioGroup.js +7 -1
  32. package/vanilla/UiSearchResultRow.js +4 -1
  33. package/vanilla/UiSwitch.d.ts +1 -0
  34. package/vanilla/UiSwitch.js +7 -4
  35. package/vue/UiCheckbox.d.ts +2 -0
  36. package/vue/UiCheckbox.vue +3 -0
  37. package/vue/UiCombobox.vue +27 -4
  38. package/vue/UiEditorToolbar.vue +90 -20
  39. package/vue/UiRadioGroup.vue +2 -0
  40. package/vue/UiSearchResultRow.vue +1 -0
  41. package/vue/UiSwitch.d.ts +2 -0
  42. package/vue/UiSwitch.vue +3 -0
  43. package/vue/chunks/UiCheckbox.js +4 -1
  44. package/vue/chunks/UiCombobox.js +67 -39
  45. package/vue/chunks/UiEditorToolbar.js +33 -4
  46. package/vue/chunks/UiRadioGroup.js +8 -2
  47. package/vue/chunks/UiSearchResultRow.js +7 -2
  48. package/vue/chunks/UiSwitch.js +4 -1
  49. package/vue/components.css +159 -115
@@ -549,7 +549,7 @@
549
549
  display: none;
550
550
  }
551
551
 
552
- [data-component~="ui-checkbox"][data-v-964081a0] {
552
+ [data-component~="ui-checkbox"][data-v-44d93832] {
553
553
  display: inline-flex;
554
554
  align-items: flex-start;
555
555
  gap: var(--ui-checkbox-gap, var(--ui-space-2));
@@ -557,11 +557,11 @@
557
557
  color: var(--ui-text-primary);
558
558
  cursor: pointer;
559
559
  }
560
- .label[data-v-964081a0] {
560
+ .label[data-v-44d93832] {
561
561
  min-inline-size: 0;
562
562
  line-height: var(--ui-line-height-md);
563
563
  }
564
- input[data-v-964081a0] {
564
+ input[data-v-44d93832] {
565
565
  appearance: none;
566
566
  -webkit-appearance: none;
567
567
  position: relative;
@@ -579,20 +579,20 @@ input[data-v-964081a0] {
579
579
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
580
580
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
581
581
  }
582
- input[data-v-964081a0]::after {
582
+ input[data-v-44d93832]::after {
583
583
  content: "";
584
584
  position: absolute;
585
585
  opacity: 0;
586
586
  }
587
- input[data-v-964081a0]:checked,
588
- input[data-v-964081a0]:indeterminate {
587
+ input[data-v-44d93832]:checked,
588
+ input[data-v-44d93832]:indeterminate {
589
589
  border-color: var(--ui-accent-solid);
590
590
  background: var(--ui-accent-solid);
591
591
  box-shadow: inset 0 1px 2px color-mix(in srgb, #000 16%, transparent);
592
592
  }
593
593
 
594
594
  /* Centre the tick's box, then lift it: a rotated L's ink sits ~0.11rem below its box centre. */
595
- input[data-v-964081a0]:checked::after {
595
+ input[data-v-44d93832]:checked::after {
596
596
  inset: 0;
597
597
  margin: auto;
598
598
  inline-size: 0.32rem;
@@ -605,7 +605,7 @@ input[data-v-964081a0]:checked::after {
605
605
  opacity: 1;
606
606
  transform: translateY(-0.11rem) rotate(45deg);
607
607
  }
608
- input[data-v-964081a0]:indeterminate::after {
608
+ input[data-v-44d93832]:indeterminate::after {
609
609
  inset: 50% 0.23rem auto;
610
610
  block-size: 0.125rem;
611
611
  border-radius: var(--ui-radius-round);
@@ -613,25 +613,25 @@ input[data-v-964081a0]:indeterminate::after {
613
613
  opacity: 1;
614
614
  transform: translateY(-50%);
615
615
  }
616
- input[data-v-964081a0]:hover:enabled {
616
+ input[data-v-44d93832]:hover:enabled {
617
617
  border-color: var(--ui-accent-solid);
618
618
  }
619
- input[data-v-964081a0]:focus-visible {
619
+ input[data-v-44d93832]:focus-visible {
620
620
  outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
621
621
  outline-offset: 2px;
622
622
  }
623
- [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"][data-v-964081a0] {
623
+ [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"][data-v-44d93832] {
624
624
  color: var(--ui-text-muted);
625
625
  cursor: not-allowed;
626
626
  }
627
- [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"] input[data-v-964081a0] {
627
+ [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"] input[data-v-44d93832] {
628
628
  border-color: var(--ui-border-default);
629
629
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
630
630
  cursor: not-allowed;
631
631
  }
632
632
 
633
633
  /* A component that sets its display still honours the hidden attribute on its root. */
634
- [data-component~="ui-checkbox"][hidden][data-v-964081a0] {
634
+ [data-component~="ui-checkbox"][hidden][data-v-44d93832] {
635
635
  display: none;
636
636
  }
637
637
 
@@ -770,27 +770,27 @@ input[data-v-964081a0]:focus-visible {
770
770
  }
771
771
  }
772
772
 
773
- [data-component~="ui-combobox"][data-v-3b8b0ecf] {
773
+ [data-component~="ui-combobox"][data-v-cd33b9b7] {
774
774
  display: grid;
775
775
  gap: var(--ui-space-1);
776
776
  min-inline-size: 0;
777
777
  color: var(--ui-text-primary);
778
778
  font: inherit;
779
779
  }
780
- label[data-v-3b8b0ecf] {
780
+ label[data-v-cd33b9b7] {
781
781
  color: var(--ui-combobox-label-text, var(--ui-text-primary));
782
782
  font-size: var(--ui-combobox-label-font-size, var(--ui-font-size-sm));
783
783
  font-weight: 500;
784
784
  }
785
785
  /* The field and anything that annotates it sit on one row; the help button is beside the box,
786
786
  not inside it, because a control's box holds its value. */
787
- .control[data-v-3b8b0ecf] {
787
+ .control[data-v-cd33b9b7] {
788
788
  display: flex;
789
789
  align-items: center;
790
790
  gap: var(--ui-space-2);
791
791
  min-inline-size: 0;
792
792
  }
793
- .field[data-v-3b8b0ecf] {
793
+ .field[data-v-cd33b9b7] {
794
794
  flex: 1 1 auto;
795
795
  display: flex;
796
796
  min-inline-size: 0;
@@ -802,14 +802,14 @@ label[data-v-3b8b0ecf] {
802
802
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
803
803
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
804
804
  }
805
- .field[data-v-3b8b0ecf]:focus-within {
805
+ .field[data-v-cd33b9b7]:focus-within {
806
806
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
807
807
  box-shadow:
808
808
  var(--ui-control-inset),
809
809
  var(--ui-control-focus-halo-shadow);
810
810
  }
811
811
  /* A ghost icon button: the affordance is the mark, not a box around it. */
812
- .help[data-v-3b8b0ecf] {
812
+ .help[data-v-cd33b9b7] {
813
813
  flex: none;
814
814
  display: inline-flex;
815
815
  align-items: center;
@@ -826,28 +826,28 @@ label[data-v-3b8b0ecf] {
826
826
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
827
827
  color var(--ui-motion-fast) var(--ui-motion-ease);
828
828
  }
829
- .help[data-v-3b8b0ecf]:hover:enabled,
830
- .help[aria-expanded="true"][data-v-3b8b0ecf] {
829
+ .help[data-v-cd33b9b7]:hover:enabled,
830
+ .help[aria-expanded="true"][data-v-cd33b9b7] {
831
831
  background: color-mix(in srgb, currentColor 8%, transparent);
832
832
  color: var(--ui-text-primary);
833
833
  }
834
- .help[data-v-3b8b0ecf]:focus-visible {
834
+ .help[data-v-cd33b9b7]:focus-visible {
835
835
  outline: none;
836
836
  box-shadow: var(--ui-focus-halo);
837
837
  }
838
- .help[data-v-3b8b0ecf]:disabled {
838
+ .help[data-v-cd33b9b7]:disabled {
839
839
  color: var(--ui-disabled-text);
840
840
  cursor: not-allowed;
841
841
  }
842
- .help-icon[data-v-3b8b0ecf] {
842
+ .help-icon[data-v-cd33b9b7] {
843
843
  inline-size: var(--ui-icon-size-sm);
844
844
  block-size: var(--ui-icon-size-sm);
845
845
  }
846
- input[data-v-3b8b0ecf]::selection {
846
+ input[data-v-cd33b9b7]::selection {
847
847
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
848
848
  color: inherit;
849
849
  }
850
- input[data-v-3b8b0ecf] {
850
+ input[data-v-cd33b9b7] {
851
851
  appearance: none;
852
852
  width: 100%;
853
853
  min-inline-size: 0;
@@ -863,11 +863,11 @@ input[data-v-3b8b0ecf] {
863
863
  margin: 0;
864
864
  outline: none;
865
865
  }
866
- [data-component~="ui-combobox"][data-ui-combobox-state~="size=sm"] input[data-v-3b8b0ecf] {
866
+ [data-component~="ui-combobox"][data-ui-combobox-state~="size=sm"] input[data-v-cd33b9b7] {
867
867
  min-block-size: calc(var(--ui-control-size-sm) - 2px);
868
868
  padding: var(--ui-space-1) var(--ui-space-2);
869
869
  }
870
- button[data-v-3b8b0ecf] {
870
+ button[data-v-cd33b9b7] {
871
871
  appearance: none;
872
872
  display: inline-grid;
873
873
  place-items: center;
@@ -882,31 +882,31 @@ button[data-v-3b8b0ecf] {
882
882
  padding: 0 var(--ui-space-1);
883
883
  cursor: pointer;
884
884
  }
885
- .affordance-icon[data-v-3b8b0ecf] {
885
+ .affordance-icon[data-v-cd33b9b7] {
886
886
  display: block;
887
887
  inline-size: var(--ui-icon-size-sm);
888
888
  block-size: var(--ui-icon-size-sm);
889
889
  }
890
- button[data-v-3b8b0ecf]:hover:enabled {
890
+ button[data-v-cd33b9b7]:hover:enabled {
891
891
  background: var(--ui-surface-muted);
892
892
  color: var(--ui-text-primary);
893
893
  }
894
- button[data-v-3b8b0ecf]:focus-visible {
894
+ button[data-v-cd33b9b7]:focus-visible {
895
895
  outline: none;
896
896
  background: var(--ui-surface-muted);
897
897
  box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
898
898
  }
899
- input[data-v-3b8b0ecf]:disabled, button[data-v-3b8b0ecf]:disabled {
899
+ input[data-v-cd33b9b7]:disabled, button[data-v-cd33b9b7]:disabled {
900
900
  color: var(--ui-text-muted);
901
901
  cursor: not-allowed;
902
902
  }
903
- .field[data-v-3b8b0ecf]:has(input:disabled) {
903
+ .field[data-v-cd33b9b7]:has(input:disabled) {
904
904
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
905
905
  }
906
- [data-component~="ui-combobox"][data-ui-combobox-state~="validationStatus=error"] .field[data-v-3b8b0ecf] {
906
+ [data-component~="ui-combobox"][data-ui-combobox-state~="validationStatus=error"] .field[data-v-cd33b9b7] {
907
907
  border-color: var(--ui-danger-solid, var(--ui-accent-active));
908
908
  }
909
- .popup[data-v-3b8b0ecf] {
909
+ .popup[data-v-cd33b9b7] {
910
910
  box-sizing: border-box;
911
911
  min-inline-size: 12rem;
912
912
  max-inline-size: calc(100vw - 1rem);
@@ -920,40 +920,40 @@ input[data-v-3b8b0ecf]:disabled, button[data-v-3b8b0ecf]:disabled {
920
920
  color: var(--ui-text-primary);
921
921
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
922
922
  }
923
- [hidden][data-v-3b8b0ecf] {
923
+ [hidden][data-v-cd33b9b7] {
924
924
  display: none;
925
925
  }
926
- .option[data-v-3b8b0ecf] {
926
+ .option[data-v-cd33b9b7] {
927
927
  padding: var(--ui-space-2) var(--ui-space-3);
928
928
  border-radius: var(--ui-radius-sm);
929
929
  cursor: pointer;
930
930
  overflow-wrap: anywhere;
931
931
  }
932
- .option[data-v-3b8b0ecf]:hover, .option.active[data-v-3b8b0ecf] {
932
+ .option[data-v-cd33b9b7]:hover, .option.active[data-v-cd33b9b7] {
933
933
  background: var(--ui-surface-muted);
934
934
  outline: 1px solid var(--ui-focus-ring);
935
935
  outline-offset: -1px;
936
936
  }
937
- .option[aria-disabled="true"][data-v-3b8b0ecf] {
937
+ .option[aria-disabled="true"][data-v-cd33b9b7] {
938
938
  color: var(--ui-text-muted);
939
939
  cursor: not-allowed;
940
940
  }
941
- .primary[data-v-3b8b0ecf] {
941
+ .primary[data-v-cd33b9b7] {
942
942
  display: block;
943
943
  color: var(--ui-combobox-option-text, var(--ui-text-primary));
944
944
  font-weight: 500;
945
945
  }
946
- .message[data-v-3b8b0ecf], .group[data-v-3b8b0ecf] {
946
+ .message[data-v-cd33b9b7], .group[data-v-cd33b9b7] {
947
947
  color: var(--ui-combobox-message-text, var(--ui-text-secondary));
948
948
  font-weight: 400;
949
949
  font-size: var(--ui-font-size-sm);
950
950
  line-height: var(--ui-line-height-md);
951
951
  overflow-wrap: anywhere;
952
952
  }
953
- .group[data-v-3b8b0ecf], .popup .message[data-v-3b8b0ecf] {
953
+ .group[data-v-cd33b9b7], .popup .message[data-v-cd33b9b7] {
954
954
  padding: var(--ui-space-2) var(--ui-space-3);
955
955
  }
956
- .sr-only[data-v-3b8b0ecf] {
956
+ .sr-only[data-v-cd33b9b7] {
957
957
  position: absolute;
958
958
  inline-size: 1px;
959
959
  block-size: 1px;
@@ -962,16 +962,16 @@ input[data-v-3b8b0ecf]:disabled, button[data-v-3b8b0ecf]:disabled {
962
962
  white-space: nowrap;
963
963
  }
964
964
  @media (pointer: coarse) {
965
- button[data-v-3b8b0ecf] {
965
+ button[data-v-cd33b9b7] {
966
966
  min-inline-size: 2.75rem;
967
967
  min-block-size: 2.75rem;
968
968
  }
969
969
  }
970
970
  @media (forced-colors: active) {
971
- .field[data-v-3b8b0ecf], .popup[data-v-3b8b0ecf] {
971
+ .field[data-v-cd33b9b7], .popup[data-v-cd33b9b7] {
972
972
  border-color: CanvasText;
973
973
  }
974
- .option.active[data-v-3b8b0ecf] {
974
+ .option.active[data-v-cd33b9b7] {
975
975
  outline-color: Highlight;
976
976
  }
977
977
  }
@@ -979,12 +979,12 @@ button[data-v-3b8b0ecf] {
979
979
  /* Multiple mode: every option carries a checkbox, so a list that takes several answers says so
980
980
  before anything is picked. aria-selected is the state; this draws it.
981
981
  Longhands, not shorthands: lowering drops a shorthand that omits a component. */
982
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-3b8b0ecf] {
982
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-cd33b9b7] {
983
983
  display: flex;
984
984
  gap: var(--ui-space-2);
985
985
  align-items: center;
986
986
  }
987
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-3b8b0ecf]::before {
987
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-cd33b9b7]::before {
988
988
  content: "";
989
989
  flex: none;
990
990
  inline-size: 1.125rem;
@@ -999,7 +999,7 @@ button[data-v-3b8b0ecf] {
999
999
  background-size: 0.7rem;
1000
1000
  }
1001
1001
  [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"]
1002
- .option[aria-selected="true"][data-v-3b8b0ecf]::before {
1002
+ .option[aria-selected="true"][data-v-cd33b9b7]::before {
1003
1003
  border-color: var(--ui-accent-solid);
1004
1004
  background-color: var(--ui-accent-solid);
1005
1005
  background-image: var(
@@ -1009,20 +1009,20 @@ button[data-v-3b8b0ecf] {
1009
1009
  }
1010
1010
 
1011
1011
  /* Multiple mode: chips wrap before the cursor on one flexible field line. */
1012
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .field[data-v-3b8b0ecf] {
1012
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .field[data-v-cd33b9b7] {
1013
1013
  flex-wrap: wrap;
1014
1014
  align-items: center;
1015
1015
  gap: var(--ui-space-1);
1016
1016
  min-block-size: var(--ui-combobox-item-min-block-size, 2.5rem);
1017
1017
  padding: var(--ui-space-1);
1018
1018
  }
1019
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] input[data-v-3b8b0ecf] {
1019
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] input[data-v-cd33b9b7] {
1020
1020
  flex: 1 0 var(--ui-combobox-item-input-min-inline-size, 5rem);
1021
1021
  width: auto;
1022
1022
  min-block-size: 1.75rem;
1023
1023
  padding: var(--ui-space-0-5) var(--ui-space-1);
1024
1024
  }
1025
- .item[data-v-3b8b0ecf] {
1025
+ .item[data-v-cd33b9b7] {
1026
1026
  appearance: none;
1027
1027
  display: inline-flex;
1028
1028
  min-inline-size: 0;
@@ -1036,16 +1036,16 @@ button[data-v-3b8b0ecf] {
1036
1036
  font: inherit;
1037
1037
  cursor: default;
1038
1038
  }
1039
- .item[data-v-3b8b0ecf]:focus-visible {
1039
+ .item[data-v-cd33b9b7]:focus-visible {
1040
1040
  outline: 2px solid var(--ui-focus-ring);
1041
1041
  outline-offset: 1px;
1042
1042
  }
1043
- .item[data-v-3b8b0ecf]:disabled {
1043
+ .item[data-v-cd33b9b7]:disabled {
1044
1044
  opacity: 0.6;
1045
1045
  }
1046
1046
 
1047
1047
  /* A component that sets its display still honours the hidden attribute on its root. */
1048
- [data-component~="ui-combobox"][hidden][data-v-3b8b0ecf] {
1048
+ [data-component~="ui-combobox"][hidden][data-v-cd33b9b7] {
1049
1049
  display: none;
1050
1050
  }
1051
1051
 
@@ -2349,46 +2349,88 @@ svg[data-v-7b1048a0] {
2349
2349
  display: none;
2350
2350
  }
2351
2351
 
2352
- [data-component~="ui-editor-toolbar"][data-v-b71db5ba] {
2352
+ [data-component~="ui-editor-toolbar"][data-v-e776f060] {
2353
+ /* The colour the edge fades blend into: whatever the toolbar is painted with. */
2354
+ --_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
2355
+
2353
2356
  position: sticky;
2354
2357
  top: 0;
2355
2358
  z-index: var(--ui-editor-toolbar-z-index, 10);
2356
2359
  display: flex;
2357
2360
  align-items: center;
2358
- justify-content: flex-start;
2359
- gap: var(--ui-editor-toolbar-gap, 2px);
2360
2361
  padding: var(--ui-editor-toolbar-padding-block, 6px)
2361
2362
  var(--ui-editor-toolbar-padding-inline, 12px);
2362
2363
  min-height: var(--ui-editor-toolbar-min-height, 48px);
2363
- /* More controls than the column is wide is normal at a readable measure, so the row wraps.
2364
- Scrolling hid the tail behind an invisible scrollbar. */
2365
- flex-wrap: wrap;
2366
- row-gap: var(--ui-editor-toolbar-row-gap, var(--ui-editor-toolbar-gap, 2px));
2367
2364
  background: var(--ui-editor-toolbar-surface, var(--ui-surface));
2368
2365
  border-bottom: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
2369
2366
  }
2370
- [data-component~="ui-editor-toolbar"][data-v-b71db5ba]::-webkit-scrollbar {
2367
+
2368
+ /* One row, always. When the controls outgrow the space, the row scrolls sideways rather than
2369
+ wrapping into several lines, and a fade at each edge that has more to show says so. */
2370
+ .strip[data-v-e776f060] {
2371
+ display: flex;
2372
+ flex: 1 1 auto;
2373
+ align-items: center;
2374
+ justify-content: flex-start;
2375
+ gap: var(--ui-editor-toolbar-gap, 2px);
2376
+ min-width: 0;
2377
+ overflow-x: auto;
2378
+ overflow-y: hidden;
2379
+ overscroll-behavior-inline: contain;
2380
+ scrollbar-width: none;
2381
+ }
2382
+ .strip[data-v-e776f060]::-webkit-scrollbar {
2371
2383
  display: none;
2372
2384
  }
2373
- [data-component~="ui-editor-toolbar"] > [data-v-b71db5ba-s] {
2385
+ .strip > [data-v-e776f060-s] {
2374
2386
  flex: 0 0 auto;
2375
2387
  }
2376
- .divider[data-v-b71db5ba-s] {
2388
+
2389
+ /* The fades are mattes laid over the strip in the toolbar's own colour, not a mask, so a floating
2390
+ toolbar's border and shadow stay whole. Each appears only while that edge hides controls. */
2391
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]::before,
2392
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]::after {
2393
+ position: absolute;
2394
+ z-index: 1;
2395
+ inset-block: 0;
2396
+ inline-size: var(--ui-editor-toolbar-fade-size, 32px);
2397
+ content: "";
2398
+ opacity: 0;
2399
+ pointer-events: none;
2400
+ transition: opacity var(--ui-motion-fast, 120ms) var(--ui-motion-ease, ease);
2401
+ }
2402
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]::before {
2403
+ inset-inline-start: 0;
2404
+ background: linear-gradient(to right, var(--_matte), transparent);
2405
+ }
2406
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]::after {
2407
+ inset-inline-end: 0;
2408
+ background: linear-gradient(to left, var(--_matte), transparent);
2409
+ }
2410
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]:dir(rtl)::before {
2411
+ background: linear-gradient(to left, var(--_matte), transparent);
2412
+ }
2413
+ [data-component~="ui-editor-toolbar"][data-v-e776f060]:dir(rtl)::after {
2414
+ background: linear-gradient(to right, var(--_matte), transparent);
2415
+ }
2416
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="overflowStart"][data-v-e776f060]::before,
2417
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="overflowEnd"][data-v-e776f060]::after {
2418
+ opacity: 1;
2419
+ }
2420
+ .divider[data-v-e776f060-s] {
2377
2421
  width: 1px;
2378
2422
  height: 20px;
2379
2423
  background: var(--ui-editor-toolbar-divider, var(--ui-border));
2380
2424
  flex-shrink: 0;
2381
2425
  margin: 0 var(--ui-editor-toolbar-divider-margin, 4px);
2382
2426
  }
2383
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-b71db5ba] {
2384
- flex-wrap: nowrap;
2385
- position: static;
2427
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-e776f060] {
2428
+ position: relative;
2386
2429
  top: auto;
2387
2430
  width: max-content;
2388
2431
  max-width: min(calc(100vw - 24px), 100%);
2389
2432
  min-height: auto;
2390
2433
  padding: var(--ui-editor-toolbar-floating-padding, 4px);
2391
- overflow-x: visible;
2392
2434
  background: color-mix(
2393
2435
  in srgb,
2394
2436
  var(--ui-editor-toolbar-surface, var(--ui-surface)) 96%,
@@ -2403,7 +2445,7 @@ svg[data-v-7b1048a0] {
2403
2445
  backdrop-filter: blur(10px);
2404
2446
  }
2405
2447
  @media (max-width: 767px) {
2406
- [data-component~="ui-editor-toolbar"][data-v-b71db5ba] {
2448
+ [data-component~="ui-editor-toolbar"][data-v-e776f060] {
2407
2449
  position: fixed;
2408
2450
  top: auto;
2409
2451
  bottom: env(safe-area-inset-bottom);
@@ -2414,8 +2456,8 @@ svg[data-v-7b1048a0] {
2414
2456
  border-bottom: none;
2415
2457
  box-shadow: var(--ui-editor-toolbar-mobile-shadow, 0 -2px 8px rgb(0 0 0 / 0.06));
2416
2458
  }
2417
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-b71db5ba] {
2418
- position: static;
2459
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-e776f060] {
2460
+ position: relative;
2419
2461
  inset: auto;
2420
2462
  min-height: auto;
2421
2463
  border: 1px solid var(--ui-editor-toolbar-border, var(--ui-border));
@@ -2428,10 +2470,11 @@ svg[data-v-7b1048a0] {
2428
2470
  }
2429
2471
 
2430
2472
  /* Inside LoomaEditor's sticky shell, the shell is the sticky surface. */
2431
- .looma-editor__sticky-toolbar-shell [data-component~="ui-editor-toolbar"][data-v-b71db5ba] {
2432
- position: static;
2473
+ .looma-editor__sticky-toolbar-shell [data-component~="ui-editor-toolbar"][data-v-e776f060] {
2474
+ --_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
2475
+
2476
+ position: relative;
2433
2477
  min-height: var(--ui-editor-toolbar-min-height, 48px);
2434
- overscroll-behavior-inline: contain;
2435
2478
  background: transparent;
2436
2479
  border: 0;
2437
2480
  box-shadow: none;
@@ -2439,24 +2482,25 @@ svg[data-v-7b1048a0] {
2439
2482
 
2440
2483
  /* Inside LoomaEditor's mobile shell, the toolbar is a scroll-snapping strip. */
2441
2484
  .looma-editor__mobile-toolbar-shell
2442
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-b71db5ba] {
2485
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-e776f060] {
2443
2486
  width: 100%;
2444
2487
  max-width: none;
2445
2488
  min-height: 100%;
2446
2489
  padding: 0;
2447
- overflow-x: auto;
2448
- overflow-y: hidden;
2449
- overscroll-behavior-inline: contain;
2450
- scroll-snap-type: x mandatory;
2451
2490
  background: transparent;
2452
2491
  border: 0;
2453
2492
  border-radius: 0;
2454
2493
  box-shadow: none;
2455
2494
  backdrop-filter: none;
2456
2495
  }
2496
+ .looma-editor__mobile-toolbar-shell
2497
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"]
2498
+ .strip[data-v-e776f060] {
2499
+ scroll-snap-type: x mandatory;
2500
+ }
2457
2501
 
2458
2502
  /* A component that sets its display still honours the hidden attribute on its root. */
2459
- [data-component~="ui-editor-toolbar"][hidden][data-v-b71db5ba] {
2503
+ [data-component~="ui-editor-toolbar"][hidden][data-v-e776f060] {
2460
2504
  display: none;
2461
2505
  }
2462
2506
 
@@ -3060,7 +3104,7 @@ input[data-v-2c20c2e3]:focus-visible {
3060
3104
  display: none;
3061
3105
  }
3062
3106
 
3063
- [data-component~="ui-radio-group"][data-v-cd639df6] {
3107
+ [data-component~="ui-radio-group"][data-v-f54344c6] {
3064
3108
  display: inline-flex;
3065
3109
  align-items: center;
3066
3110
  gap: var(--ui-space-2);
@@ -3069,7 +3113,7 @@ input[data-v-2c20c2e3]:focus-visible {
3069
3113
  padding: 0;
3070
3114
  border: 0;
3071
3115
  }
3072
- legend[data-v-cd639df6] {
3116
+ legend[data-v-f54344c6] {
3073
3117
  float: inline-start;
3074
3118
  inline-size: 100%;
3075
3119
  margin: 0 0 var(--ui-space-2);
@@ -3077,16 +3121,16 @@ legend[data-v-cd639df6] {
3077
3121
  color: var(--ui-text-primary);
3078
3122
  font-weight: var(--ui-font-medium);
3079
3123
  }
3080
- legend[data-v-cd639df6] + * {
3124
+ legend[data-v-f54344c6] + * {
3081
3125
  clear: both;
3082
3126
  }
3083
- [data-component~="ui-radio-group"][data-ui-radio-group-state~="orientation=vertical"][data-v-cd639df6] {
3127
+ [data-component~="ui-radio-group"][data-ui-radio-group-state~="orientation=vertical"][data-v-f54344c6] {
3084
3128
  display: inline-grid;
3085
3129
  justify-items: start;
3086
3130
  }
3087
3131
 
3088
3132
  /* A component that sets its display still honours the hidden attribute on its root. */
3089
- [data-component~="ui-radio-group"][hidden][data-v-cd639df6] {
3133
+ [data-component~="ui-radio-group"][hidden][data-v-f54344c6] {
3090
3134
  display: none;
3091
3135
  }
3092
3136
 
@@ -3146,7 +3190,7 @@ legend[data-v-cd639df6] + * {
3146
3190
  display: none;
3147
3191
  }
3148
3192
 
3149
- [data-component~="ui-search-result-row"][data-v-9f29c4b0] {
3193
+ [data-component~="ui-search-result-row"][data-v-c2562cce] {
3150
3194
  appearance: none;
3151
3195
  inline-size: 100%;
3152
3196
  min-block-size: var(--ui-search-result-row-min-height, 56px);
@@ -3164,62 +3208,62 @@ legend[data-v-cd639df6] + * {
3164
3208
  text-align: left;
3165
3209
  transition: background-color var(--ui-motion-fast) var(--ui-motion-ease);
3166
3210
  }
3167
- [data-component~="ui-search-result-row"][data-v-9f29c4b0]:last-child {
3211
+ [data-component~="ui-search-result-row"][data-v-c2562cce]:last-child {
3168
3212
  border-block-end: none;
3169
3213
  }
3170
- [data-component~="ui-search-result-row"][data-v-9f29c4b0]:hover:enabled {
3214
+ [data-component~="ui-search-result-row"][data-v-c2562cce]:hover:enabled {
3171
3215
  background: var(
3172
3216
  --ui-search-result-row-hover-surface,
3173
3217
  color-mix(in srgb, var(--ui-surface) 85%, black 3%)
3174
3218
  );
3175
3219
  }
3176
- [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="selected"][data-v-9f29c4b0] {
3220
+ [data-component~="ui-search-result-row"][data-ui-search-result-row-state~="selected"][data-v-c2562cce] {
3177
3221
  background: var(
3178
3222
  --ui-search-result-row-selected-bg,
3179
3223
  var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%))
3180
3224
  );
3181
3225
  }
3182
- [data-component~="ui-search-result-row"][data-v-9f29c4b0]:focus-visible {
3226
+ [data-component~="ui-search-result-row"][data-v-c2562cce]:focus-visible {
3183
3227
  outline: 2px solid var(--ui-focus-ring);
3184
3228
  outline-offset: -2px;
3185
3229
  }
3186
- [data-component~="ui-search-result-row"][data-v-9f29c4b0]:disabled {
3230
+ [data-component~="ui-search-result-row"][data-v-c2562cce]:disabled {
3187
3231
  opacity: 0.6;
3188
3232
  cursor: not-allowed;
3189
3233
  }
3190
- .leading[data-v-9f29c4b0],
3191
- .trailing[data-v-9f29c4b0] {
3234
+ .leading[data-v-c2562cce],
3235
+ .trailing[data-v-c2562cce] {
3192
3236
  display: inline-flex;
3193
3237
  align-items: flex-start;
3194
3238
  flex-shrink: 0;
3195
3239
  }
3196
- .content[data-v-9f29c4b0] {
3240
+ .content[data-v-c2562cce] {
3197
3241
  min-inline-size: 0;
3198
3242
  flex: 1;
3199
3243
  display: flex;
3200
3244
  flex-direction: column;
3201
3245
  }
3202
- .title[data-v-9f29c4b0],
3203
- .meta[data-v-9f29c4b0],
3204
- .excerpt[data-v-9f29c4b0] {
3246
+ .title[data-v-c2562cce],
3247
+ .meta[data-v-c2562cce],
3248
+ .excerpt[data-v-c2562cce] {
3205
3249
  display: block;
3206
3250
  min-inline-size: 0;
3207
3251
  }
3208
3252
 
3209
3253
  /* An unused region takes no space. */
3210
- .leading[data-v-9f29c4b0]:empty,
3211
- .meta[data-v-9f29c4b0]:empty,
3212
- .excerpt[data-v-9f29c4b0]:empty,
3213
- .trailing[data-v-9f29c4b0]:empty {
3254
+ .leading[data-v-c2562cce]:empty,
3255
+ .meta[data-v-c2562cce]:empty,
3256
+ .excerpt[data-v-c2562cce]:empty,
3257
+ .trailing[data-v-c2562cce]:empty {
3214
3258
  display: none;
3215
3259
  }
3216
- [slot="title"][data-v-9f29c4b0-s],[slot="meta"][data-v-9f29c4b0-s],[slot="excerpt"][data-v-9f29c4b0-s] {
3260
+ [slot="title"][data-v-c2562cce-s],[slot="meta"][data-v-c2562cce-s],[slot="excerpt"][data-v-c2562cce-s] {
3217
3261
  display: block;
3218
3262
  margin: 0;
3219
3263
  }
3220
3264
 
3221
3265
  /* A component that sets its display still honours the hidden attribute on its root. */
3222
- [data-component~="ui-search-result-row"][hidden][data-v-9f29c4b0] {
3266
+ [data-component~="ui-search-result-row"][hidden][data-v-c2562cce] {
3223
3267
  display: none;
3224
3268
  }
3225
3269
 
@@ -3614,7 +3658,7 @@ hr[aria-orientation="vertical"][data-v-f07c3800] {
3614
3658
  display: none;
3615
3659
  }
3616
3660
 
3617
- [data-component~="ui-switch"][data-v-529fe437] {
3661
+ [data-component~="ui-switch"][data-v-aeb44053] {
3618
3662
  display: inline-flex;
3619
3663
  align-items: flex-start;
3620
3664
  gap: var(--ui-switch-gap, var(--ui-space-2));
@@ -3622,11 +3666,11 @@ hr[aria-orientation="vertical"][data-v-f07c3800] {
3622
3666
  color: var(--ui-text-primary);
3623
3667
  cursor: pointer;
3624
3668
  }
3625
- .label[data-v-529fe437] {
3669
+ .label[data-v-aeb44053] {
3626
3670
  min-inline-size: 0;
3627
3671
  line-height: var(--ui-line-height-md);
3628
3672
  }
3629
- input[data-v-529fe437] {
3673
+ input[data-v-aeb44053] {
3630
3674
  appearance: none;
3631
3675
  -webkit-appearance: none;
3632
3676
  position: relative;
@@ -3644,7 +3688,7 @@ input[data-v-529fe437] {
3644
3688
  border-color var(--ui-motion-fast) var(--ui-motion-ease);
3645
3689
  margin: 0;
3646
3690
  }
3647
- input[data-v-529fe437]::after {
3691
+ input[data-v-aeb44053]::after {
3648
3692
  content: "";
3649
3693
  position: absolute;
3650
3694
  top: 3px;
@@ -3656,35 +3700,35 @@ input[data-v-529fe437]::after {
3656
3700
  box-shadow: var(--ui-shadow-xs);
3657
3701
  transition: transform var(--ui-motion-fast) var(--ui-motion-ease);
3658
3702
  }
3659
- input[data-v-529fe437]:checked {
3703
+ input[data-v-aeb44053]:checked {
3660
3704
  background: var(--ui-accent-solid);
3661
3705
  border-color: var(--ui-accent-solid);
3662
3706
  }
3663
- input[data-v-529fe437]:checked::after {
3707
+ input[data-v-aeb44053]:checked::after {
3664
3708
  transform: translateX(1rem);
3665
3709
  background: var(--ui-text-on-accent);
3666
3710
  }
3667
- input[data-v-529fe437]:focus-visible {
3711
+ input[data-v-aeb44053]:focus-visible {
3668
3712
  outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
3669
3713
  outline-offset: 2px;
3670
3714
  }
3671
- [data-component~="ui-switch"][data-ui-switch-state~="disabled"][data-v-529fe437] {
3715
+ [data-component~="ui-switch"][data-ui-switch-state~="disabled"][data-v-aeb44053] {
3672
3716
  color: var(--ui-text-muted);
3673
3717
  cursor: not-allowed;
3674
3718
  }
3675
- [data-component~="ui-switch"][data-ui-switch-state~="disabled"] input[data-v-529fe437] {
3719
+ [data-component~="ui-switch"][data-ui-switch-state~="disabled"] input[data-v-aeb44053] {
3676
3720
  border-color: var(--ui-border-default);
3677
3721
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
3678
3722
  cursor: not-allowed;
3679
3723
  }
3680
3724
  @media (prefers-reduced-motion: reduce) {
3681
- input[data-v-529fe437], input[data-v-529fe437]::after {
3725
+ input[data-v-aeb44053], input[data-v-aeb44053]::after {
3682
3726
  transition: none;
3683
3727
  }
3684
3728
  }
3685
3729
 
3686
3730
  /* A component that sets its display still honours the hidden attribute on its root. */
3687
- [data-component~="ui-switch"][hidden][data-v-529fe437] {
3731
+ [data-component~="ui-switch"][hidden][data-v-aeb44053] {
3688
3732
  display: none;
3689
3733
  }
3690
3734