@bendyline/squisq-editor-react 1.6.1 → 1.6.2

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 (44) hide show
  1. package/dist/index.d.ts +87 -41
  2. package/dist/index.js +8263 -6705
  3. package/dist/index.js.map +1 -1
  4. package/dist/styles/index.css +841 -91
  5. package/package.json +4 -4
  6. package/src/BlockPropertiesPopover.tsx +23 -7
  7. package/src/EditorShell.tsx +65 -20
  8. package/src/MediaBin.tsx +171 -28
  9. package/src/PreviewControls.tsx +177 -44
  10. package/src/PreviewPanel.tsx +2 -0
  11. package/src/TemplateAnnotation.ts +22 -7
  12. package/src/TemplateContentPreview.tsx +56 -0
  13. package/src/TemplatePicker.tsx +295 -128
  14. package/src/ThemeCustomizerPanel.tsx +22 -15
  15. package/src/Toolbar.tsx +527 -207
  16. package/src/TransitionPicker.tsx +8 -1
  17. package/src/ViewSwitcher.tsx +4 -4
  18. package/src/WysiwygEditor.tsx +45 -3
  19. package/src/__tests__/buildPreviewDocTransition.test.ts +1 -2
  20. package/src/__tests__/editorShellProps.test.tsx +268 -1
  21. package/src/__tests__/headingTransition.test.ts +59 -9
  22. package/src/__tests__/imageEditorShell.test.tsx +23 -0
  23. package/src/__tests__/mediaReferences.test.ts +82 -0
  24. package/src/__tests__/previewControls.test.tsx +94 -1
  25. package/src/__tests__/templateAnnotationRoundTrip.test.ts +23 -2
  26. package/src/__tests__/templateContentPreview.test.ts +101 -0
  27. package/src/__tests__/tiptapBridge.test.ts +47 -0
  28. package/src/diagram/DiagramWidget.tsx +6 -4
  29. package/src/headingTransition.ts +96 -21
  30. package/src/index.ts +2 -1
  31. package/src/mediaReferences.ts +299 -0
  32. package/src/scene/Scene.tsx +53 -7
  33. package/src/scene/SceneBlockWidget.tsx +6 -3
  34. package/src/scene/SceneSelection.tsx +19 -15
  35. package/src/scene/SceneSideToolbar.tsx +89 -0
  36. package/src/scene/layers/DiagramEdges.tsx +4 -3
  37. package/src/scene/layers/edgeGeometry.ts +23 -4
  38. package/src/scene/scene.css +142 -2
  39. package/src/scene/tools/ConnectTool.ts +113 -24
  40. package/src/scene/tools/DrawingConnectTool.ts +86 -16
  41. package/src/scene/tools/SceneTool.ts +2 -0
  42. package/src/styles/editor.css +862 -101
  43. package/src/templateContentPreviewResolver.ts +353 -0
  44. package/src/tiptapBridge.ts +60 -33
@@ -103,7 +103,7 @@
103
103
  align-items: center;
104
104
  flex-wrap: nowrap;
105
105
  padding: 0 12px 0 0;
106
- gap: 2px;
106
+ gap: 1px;
107
107
  background: rgba(0, 0, 0, 0.07);
108
108
  container-type: inline-size;
109
109
  container-name: squisq-toolbar;
@@ -149,6 +149,15 @@
149
149
  min-width: 0;
150
150
  }
151
151
 
152
+ /* Contextual groups (template/transition pickers, table controls) sit at the
153
+ end of the actions row. When measurement marks one as clipped it moves into
154
+ the ··· overflow menu; hide the cropped inline original rather than painting
155
+ half of it. `visibility` (not `display`) keeps its layout box so the
156
+ measurement still notices when it fits again. */
157
+ .squisq-toolbar-contextual--clipped {
158
+ visibility: hidden;
159
+ }
160
+
152
161
  .squisq-toolbar-view-tab {
153
162
  /* Top padding is asymmetric — bumped 4px above the bottom — so the
154
163
  label sits more vertically centered alongside the neighboring
@@ -224,6 +233,7 @@
224
233
  justify-content: center;
225
234
  width: 32px;
226
235
  height: 28px;
236
+ flex-shrink: 0;
227
237
  border: none;
228
238
  border-radius: 4px;
229
239
  background: transparent;
@@ -256,6 +266,32 @@
256
266
  color: #1d4ed8;
257
267
  }
258
268
 
269
+ .squisq-toolbar-files-toggle {
270
+ position: relative;
271
+ }
272
+
273
+ .squisq-toolbar-files-badge {
274
+ position: absolute;
275
+ right: 1px;
276
+ bottom: 1px;
277
+ min-width: 14px;
278
+ height: 14px;
279
+ padding: 0 3px;
280
+ border: 1.5px solid #e5e7eb;
281
+ border-radius: 999px;
282
+ background: #2563eb;
283
+ color: #ffffff;
284
+ box-sizing: border-box;
285
+ display: inline-flex;
286
+ align-items: center;
287
+ justify-content: center;
288
+ font-size: 9px;
289
+ font-weight: 700;
290
+ line-height: 1;
291
+ pointer-events: none;
292
+ z-index: 1;
293
+ }
294
+
259
295
  /* Font Awesome glyphs sit a touch larger than the 13px text labels so
260
296
  icon buttons read at a comfortable weight against H1–H6 etc. They
261
297
  render in a lighter color than the text labels by default. */
@@ -381,6 +417,18 @@
381
417
  max-width: 100%;
382
418
  }
383
419
 
420
+ /* Section heading for the per-block controls (template/transition pickers)
421
+ when they fold into the overflow menu — names the block they configure. */
422
+ .squisq-toolbar-overflow-heading {
423
+ padding: 4px 12px 2px;
424
+ font-size: 11px;
425
+ font-weight: 600;
426
+ letter-spacing: 0.04em;
427
+ text-transform: uppercase;
428
+ color: #9ca3af;
429
+ user-select: none;
430
+ }
431
+
384
432
  /* ─── Insert Menu Dropdown ──────────────────────────── */
385
433
 
386
434
  .squisq-insert-menu {
@@ -539,6 +587,154 @@
539
587
  }
540
588
 
541
589
  /* The gallery popover panel — rendered in a portal with fixed positioning */
590
+ .squisq-template-gallery-dialog {
591
+ --squisq-template-gallery-backdrop: rgba(17, 24, 39, 0.34);
592
+ --squisq-template-gallery-backdrop-blur: 1px;
593
+ --squisq-template-gallery-panel-bg: #ffffff;
594
+ --squisq-template-gallery-panel-border: #e5e7eb;
595
+ --squisq-template-gallery-panel-shadow:
596
+ 0 24px 70px rgba(15, 23, 42, 0.24), 0 8px 24px rgba(15, 23, 42, 0.16);
597
+ --squisq-template-gallery-header-bg: #ffffff;
598
+ --squisq-template-gallery-header-border: #e5e7eb;
599
+ --squisq-template-gallery-title: #111827;
600
+ --squisq-template-gallery-close-color: #64748b;
601
+ --squisq-template-gallery-close-bg: rgba(255, 255, 255, 0.9);
602
+ --squisq-template-gallery-close-border: #e2e8f0;
603
+ --squisq-template-gallery-close-hover-color: #0f172a;
604
+ --squisq-template-gallery-close-hover-border: #c7d2fe;
605
+ --squisq-template-gallery-close-hover-shadow: 0 1px 4px rgba(99, 102, 241, 0.16);
606
+ --squisq-template-gallery-bg: #ffffff;
607
+ --squisq-template-gallery-text: #111827;
608
+ --squisq-template-gallery-border: #e5e7eb;
609
+ --squisq-template-gallery-shadow: 0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 6px rgba(0, 0, 0, 0.06);
610
+ --squisq-template-gallery-search-bg: #ffffff;
611
+ --squisq-template-gallery-search-border: #f3f4f6;
612
+ --squisq-template-gallery-search-icon: #9ca3af;
613
+ --squisq-template-gallery-search-input: #111827;
614
+ --squisq-template-gallery-search-placeholder: #9ca3af;
615
+ --squisq-template-gallery-empty: #6b7280;
616
+ --squisq-template-gallery-option-bg: #fbfdff;
617
+ --squisq-template-gallery-option-border: #e5e7eb;
618
+ --squisq-template-gallery-option-hover-bg: #f9fafb;
619
+ --squisq-template-gallery-option-hover-border: #c7d2fe;
620
+ --squisq-template-gallery-option-hover-shadow: 0 1px 3px rgba(99, 102, 241, 0.08);
621
+ --squisq-template-gallery-card-bg: transparent;
622
+ --squisq-template-gallery-card-border: #e5e7eb;
623
+ --squisq-template-gallery-card-hover-bg: #f9fafb;
624
+ --squisq-template-gallery-card-hover-border: #a5b4fc;
625
+ --squisq-template-gallery-card-hover-shadow: 0 1px 4px rgba(99, 102, 241, 0.1);
626
+ --squisq-template-gallery-selected-bg: #eef2ff;
627
+ --squisq-template-gallery-selected-border: #6366f1;
628
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px rgba(99, 102, 241, 0.15);
629
+ --squisq-template-gallery-card-icon-bg: #f8fafc;
630
+ --squisq-template-gallery-card-icon-border: #e5e7eb;
631
+ --squisq-template-gallery-content-preview-bg: #f1f5f9;
632
+ --squisq-template-gallery-preview-warning-bg: rgba(17, 24, 39, 0.9);
633
+ --squisq-template-gallery-preview-warning-border: rgba(255, 255, 255, 0.22);
634
+ --squisq-template-gallery-preview-warning-text: #ffffff;
635
+ --squisq-template-gallery-name: #111827;
636
+ --squisq-template-gallery-description: #6b7280;
637
+ --squisq-template-gallery-new-bg: #f5f3ff;
638
+ --squisq-template-gallery-new-border: #a5b4fc;
639
+ --squisq-template-gallery-new-hover-bg: #ede9fe;
640
+ --squisq-template-gallery-new-hover-border: #818cf8;
641
+ --squisq-template-gallery-new-plus-color: #6366f1;
642
+ --squisq-template-gallery-new-plus-bg: #ffffff;
643
+ --squisq-template-gallery-new-plus-border: #c4b5fd;
644
+ --squisq-template-gallery-new-label: #4338ca;
645
+ --squisq-template-gallery-new-desc: #6b7280;
646
+ --squisq-template-gallery-section-border: #e5e7eb;
647
+ --squisq-template-gallery-section-title: #6b7280;
648
+ box-sizing: border-box;
649
+ display: flex;
650
+ align-items: center;
651
+ justify-content: center;
652
+ min-width: 0;
653
+ min-height: 0;
654
+ padding: 0;
655
+ background: var(--squisq-template-gallery-backdrop);
656
+ backdrop-filter: blur(var(--squisq-template-gallery-backdrop-blur));
657
+ font-family: var(
658
+ --squisq-ux-font,
659
+ -apple-system,
660
+ BlinkMacSystemFont,
661
+ 'Segoe UI',
662
+ 'Noto Sans',
663
+ Helvetica,
664
+ Arial,
665
+ sans-serif
666
+ );
667
+ }
668
+
669
+ .squisq-template-gallery-dialog-panel {
670
+ position: relative;
671
+ display: flex;
672
+ flex-direction: column;
673
+ width: min(90vw, calc(100% - 32px));
674
+ height: calc(100% - 32px);
675
+ max-height: calc(100% - 32px);
676
+ min-width: 0;
677
+ min-height: 0;
678
+ overflow: hidden;
679
+ background: var(--squisq-template-gallery-panel-bg);
680
+ border: 1px solid var(--squisq-template-gallery-panel-border);
681
+ border-radius: 12px;
682
+ box-shadow: var(--squisq-template-gallery-panel-shadow);
683
+ }
684
+
685
+ .squisq-template-gallery-dialog-header {
686
+ display: flex;
687
+ align-items: center;
688
+ justify-content: space-between;
689
+ gap: 12px;
690
+ flex: 0 0 auto;
691
+ min-width: 0;
692
+ padding: 12px 14px 12px 16px;
693
+ background: var(--squisq-template-gallery-header-bg);
694
+ border-bottom: 1px solid var(--squisq-template-gallery-header-border);
695
+ }
696
+
697
+ .squisq-template-gallery-dialog-title {
698
+ min-width: 0;
699
+ margin: 0;
700
+ overflow: hidden;
701
+ color: var(--squisq-template-gallery-title);
702
+ font-size: 15px;
703
+ font-weight: 700;
704
+ line-height: 1.3;
705
+ text-overflow: ellipsis;
706
+ white-space: nowrap;
707
+ }
708
+
709
+ .squisq-template-gallery-dialog-close {
710
+ display: inline-flex;
711
+ align-items: center;
712
+ justify-content: center;
713
+ flex: 0 0 auto;
714
+ width: 28px;
715
+ height: 28px;
716
+ padding: 0;
717
+ color: var(--squisq-template-gallery-close-color);
718
+ background: var(--squisq-template-gallery-close-bg);
719
+ border: 1px solid var(--squisq-template-gallery-close-border);
720
+ border-radius: 6px;
721
+ cursor: pointer;
722
+ }
723
+
724
+ .squisq-template-gallery-dialog-close:hover {
725
+ color: var(--squisq-template-gallery-close-hover-color);
726
+ border-color: var(--squisq-template-gallery-close-hover-border);
727
+ box-shadow: var(--squisq-template-gallery-close-hover-shadow);
728
+ }
729
+
730
+ .squisq-template-gallery-dialog-body {
731
+ display: flex;
732
+ flex: 1 1 auto;
733
+ min-width: 0;
734
+ min-height: 0;
735
+ overflow: hidden;
736
+ }
737
+
542
738
  .squisq-template-gallery {
543
739
  width: 420px;
544
740
  max-width: calc(100vw - 24px);
@@ -548,16 +744,256 @@
548
744
  stretching alongside the page scrollbar. */
549
745
  max-height: calc(100vh - 72px);
550
746
  overflow-y: auto;
551
- background: #fff;
552
- border: 1px solid #e5e7eb;
747
+ background: var(--squisq-template-gallery-bg, #fff);
748
+ border: 1px solid var(--squisq-template-gallery-border, #e5e7eb);
553
749
  border-radius: 10px;
554
- box-shadow:
750
+ box-shadow: var(
751
+ --squisq-template-gallery-shadow,
555
752
  0 8px 24px rgba(0, 0, 0, 0.12),
556
- 0 2px 6px rgba(0, 0, 0, 0.06);
753
+ 0 2px 6px rgba(0, 0, 0, 0.06)
754
+ );
557
755
  padding: 8px;
558
756
  animation: squisq-gallery-appear 0.12s ease-out;
559
757
  }
560
758
 
759
+ .squisq-template-gallery-dialog .squisq-template-gallery {
760
+ flex: 1 1 auto;
761
+ width: 100%;
762
+ height: auto;
763
+ max-width: none;
764
+ max-height: none;
765
+ min-height: 0;
766
+ box-sizing: border-box;
767
+ padding: 0 12px 12px;
768
+ border: 0;
769
+ border-radius: 0;
770
+ box-shadow: none;
771
+ animation: none;
772
+ }
773
+
774
+ .squisq-template-gallery-dialog .squisq-template-gallery-search {
775
+ z-index: 3;
776
+ margin: 0 -12px;
777
+ padding: 2px 16px 26px;
778
+ border-bottom: 0;
779
+ }
780
+
781
+ .squisq-template-gallery-dialog .squisq-template-gallery-search::after {
782
+ content: '';
783
+ position: absolute;
784
+ left: 0;
785
+ right: 0;
786
+ bottom: 18px;
787
+ height: 1px;
788
+ background: var(--squisq-template-gallery-search-border, #f3f4f6);
789
+ pointer-events: none;
790
+ }
791
+
792
+ .squisq-template-gallery-dialog .squisq-template-gallery-grid {
793
+ grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
794
+ }
795
+
796
+ .squisq-template-gallery-dialog[data-theme='dark'] {
797
+ --squisq-template-gallery-backdrop: rgba(2, 6, 23, 0.64);
798
+ --squisq-template-gallery-backdrop-blur: 2px;
799
+ --squisq-template-gallery-panel-bg: #111827;
800
+ --squisq-template-gallery-panel-border: #334155;
801
+ --squisq-template-gallery-panel-shadow:
802
+ 0 24px 70px rgba(0, 0, 0, 0.55), 0 8px 24px rgba(0, 0, 0, 0.35);
803
+ --squisq-template-gallery-header-bg: #111827;
804
+ --squisq-template-gallery-header-border: #334155;
805
+ --squisq-template-gallery-title: #f3f4f6;
806
+ --squisq-template-gallery-close-color: #cbd5e1;
807
+ --squisq-template-gallery-close-bg: #0f172a;
808
+ --squisq-template-gallery-close-border: #334155;
809
+ --squisq-template-gallery-close-hover-color: #ffffff;
810
+ --squisq-template-gallery-close-hover-border: #818cf8;
811
+ --squisq-template-gallery-close-hover-shadow: 0 1px 6px rgba(129, 140, 248, 0.22);
812
+ --squisq-template-gallery-bg: #111827;
813
+ --squisq-template-gallery-text: #e5e7eb;
814
+ --squisq-template-gallery-search-bg: #111827;
815
+ --squisq-template-gallery-search-border: #334155;
816
+ --squisq-template-gallery-search-icon: #64748b;
817
+ --squisq-template-gallery-search-input: #f9fafb;
818
+ --squisq-template-gallery-search-placeholder: #64748b;
819
+ --squisq-template-gallery-empty: #94a3b8;
820
+ --squisq-template-gallery-option-bg: #0f172a;
821
+ --squisq-template-gallery-option-border: #334155;
822
+ --squisq-template-gallery-option-hover-bg: #1e293b;
823
+ --squisq-template-gallery-option-hover-border: #6366f1;
824
+ --squisq-template-gallery-option-hover-shadow: 0 1px 5px rgba(99, 102, 241, 0.18);
825
+ --squisq-template-gallery-card-bg: #0f172a;
826
+ --squisq-template-gallery-card-border: #334155;
827
+ --squisq-template-gallery-card-hover-bg: #1e293b;
828
+ --squisq-template-gallery-card-hover-border: #6366f1;
829
+ --squisq-template-gallery-card-hover-shadow: 0 1px 5px rgba(99, 102, 241, 0.18);
830
+ --squisq-template-gallery-selected-bg: #1e1b4b;
831
+ --squisq-template-gallery-selected-border: #818cf8;
832
+ --squisq-template-gallery-selected-shadow: 0 0 0 2px rgba(129, 140, 248, 0.24);
833
+ --squisq-template-gallery-card-icon-bg: #020617;
834
+ --squisq-template-gallery-card-icon-border: #334155;
835
+ --squisq-template-gallery-content-preview-bg: #020617;
836
+ --squisq-template-gallery-preview-warning-bg: rgba(15, 23, 42, 0.94);
837
+ --squisq-template-gallery-preview-warning-border: #475569;
838
+ --squisq-template-gallery-preview-warning-text: #f8fafc;
839
+ --squisq-template-gallery-name: #f3f4f6;
840
+ --squisq-template-gallery-description: #94a3b8;
841
+ --squisq-template-gallery-new-bg: #151437;
842
+ --squisq-template-gallery-new-border: #4f46e5;
843
+ --squisq-template-gallery-new-hover-bg: #1e1b4b;
844
+ --squisq-template-gallery-new-hover-border: #818cf8;
845
+ --squisq-template-gallery-new-plus-color: #c4b5fd;
846
+ --squisq-template-gallery-new-plus-bg: #0f172a;
847
+ --squisq-template-gallery-new-plus-border: #6366f1;
848
+ --squisq-template-gallery-new-label: #f3f4f6;
849
+ --squisq-template-gallery-new-desc: #94a3b8;
850
+ --squisq-template-gallery-section-border: #334155;
851
+ --squisq-template-gallery-section-title: #cbd5e1;
852
+ background: var(--squisq-template-gallery-backdrop);
853
+ backdrop-filter: blur(var(--squisq-template-gallery-backdrop-blur));
854
+ }
855
+
856
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-dialog-panel {
857
+ background: var(--squisq-template-gallery-panel-bg);
858
+ border-color: var(--squisq-template-gallery-panel-border);
859
+ box-shadow: var(--squisq-template-gallery-panel-shadow);
860
+ }
861
+
862
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-dialog-header {
863
+ background: var(--squisq-template-gallery-header-bg);
864
+ border-bottom-color: var(--squisq-template-gallery-header-border);
865
+ }
866
+
867
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-dialog-title {
868
+ color: var(--squisq-template-gallery-title);
869
+ }
870
+
871
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-dialog-close {
872
+ color: var(--squisq-template-gallery-close-color);
873
+ background: var(--squisq-template-gallery-close-bg);
874
+ border-color: var(--squisq-template-gallery-close-border);
875
+ }
876
+
877
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-dialog-close:hover {
878
+ color: var(--squisq-template-gallery-close-hover-color);
879
+ border-color: var(--squisq-template-gallery-close-hover-border);
880
+ box-shadow: var(--squisq-template-gallery-close-hover-shadow);
881
+ }
882
+
883
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery {
884
+ background: var(--squisq-template-gallery-bg);
885
+ color: var(--squisq-template-gallery-text);
886
+ }
887
+
888
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-search {
889
+ background: var(--squisq-template-gallery-search-bg);
890
+ border-bottom-color: var(--squisq-template-gallery-search-border);
891
+ }
892
+
893
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-search-icon {
894
+ color: var(--squisq-template-gallery-search-icon);
895
+ }
896
+
897
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-search-input {
898
+ color: var(--squisq-template-gallery-search-input);
899
+ }
900
+
901
+ .squisq-template-gallery-dialog[data-theme='dark']
902
+ .squisq-template-gallery-search-input::placeholder {
903
+ color: var(--squisq-template-gallery-search-placeholder);
904
+ }
905
+
906
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-empty {
907
+ color: var(--squisq-template-gallery-empty);
908
+ }
909
+
910
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-none {
911
+ background: var(--squisq-template-gallery-option-bg);
912
+ border-color: var(--squisq-template-gallery-option-border);
913
+ }
914
+
915
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-none:hover {
916
+ background: var(--squisq-template-gallery-option-hover-bg);
917
+ border-color: var(--squisq-template-gallery-option-hover-border);
918
+ box-shadow: var(--squisq-template-gallery-option-hover-shadow);
919
+ }
920
+
921
+ .squisq-template-gallery-dialog[data-theme='dark']
922
+ .squisq-template-gallery-none.squisq-template-gallery-card--selected {
923
+ background: var(--squisq-template-gallery-selected-bg);
924
+ border-color: var(--squisq-template-gallery-selected-border);
925
+ }
926
+
927
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-none-label {
928
+ color: var(--squisq-template-gallery-section-title);
929
+ }
930
+
931
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-none-desc {
932
+ color: var(--squisq-template-gallery-description);
933
+ }
934
+
935
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card {
936
+ background: var(--squisq-template-gallery-card-bg);
937
+ border-color: var(--squisq-template-gallery-card-border);
938
+ }
939
+
940
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card:hover {
941
+ background: var(--squisq-template-gallery-card-hover-bg);
942
+ border-color: var(--squisq-template-gallery-card-hover-border);
943
+ box-shadow: var(--squisq-template-gallery-card-hover-shadow);
944
+ }
945
+
946
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card--selected {
947
+ background: var(--squisq-template-gallery-selected-bg);
948
+ border-color: var(--squisq-template-gallery-selected-border);
949
+ box-shadow: var(--squisq-template-gallery-selected-shadow);
950
+ }
951
+
952
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card-icon {
953
+ background: var(--squisq-template-gallery-card-icon-bg);
954
+ border-color: var(--squisq-template-gallery-card-icon-border);
955
+ }
956
+
957
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-content-preview {
958
+ background: var(--squisq-template-gallery-content-preview-bg);
959
+ }
960
+
961
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card-name,
962
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-new-label {
963
+ color: var(--squisq-template-gallery-name);
964
+ }
965
+
966
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-card-desc,
967
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-new-desc {
968
+ color: var(--squisq-template-gallery-description);
969
+ }
970
+
971
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-new {
972
+ background: var(--squisq-template-gallery-new-bg);
973
+ border-color: var(--squisq-template-gallery-new-border);
974
+ }
975
+
976
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-new:hover {
977
+ background: var(--squisq-template-gallery-new-hover-bg);
978
+ border-color: var(--squisq-template-gallery-new-hover-border);
979
+ }
980
+
981
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-new-plus {
982
+ color: var(--squisq-template-gallery-new-plus-color);
983
+ background: var(--squisq-template-gallery-new-plus-bg);
984
+ border-color: var(--squisq-template-gallery-new-plus-border);
985
+ }
986
+
987
+ .squisq-template-gallery-dialog[data-theme='dark']
988
+ .squisq-template-gallery-section
989
+ + .squisq-template-gallery-section {
990
+ border-top-color: var(--squisq-template-gallery-section-border);
991
+ }
992
+
993
+ .squisq-template-gallery-dialog[data-theme='dark'] .squisq-template-gallery-section-title {
994
+ color: var(--squisq-template-gallery-section-title);
995
+ }
996
+
561
997
  @keyframes squisq-gallery-appear {
562
998
  from {
563
999
  opacity: 0;
@@ -580,12 +1016,12 @@
580
1016
  gap: 6px;
581
1017
  padding: 4px 8px;
582
1018
  margin: -4px -4px 8px;
583
- background: #fff;
584
- border-bottom: 1px solid #f3f4f6;
1019
+ background: var(--squisq-template-gallery-search-bg, #fff);
1020
+ border-bottom: 1px solid var(--squisq-template-gallery-search-border, #f3f4f6);
585
1021
  }
586
1022
 
587
1023
  .squisq-template-gallery-search-icon {
588
- color: #9ca3af;
1024
+ color: var(--squisq-template-gallery-search-icon, #9ca3af);
589
1025
  flex-shrink: 0;
590
1026
  }
591
1027
 
@@ -597,12 +1033,12 @@
597
1033
  outline: none;
598
1034
  font: inherit;
599
1035
  font-size: 13px;
600
- color: #111827;
1036
+ color: var(--squisq-template-gallery-search-input, #111827);
601
1037
  background: transparent;
602
1038
  }
603
1039
 
604
1040
  .squisq-template-gallery-search-input::placeholder {
605
- color: #9ca3af;
1041
+ color: var(--squisq-template-gallery-search-placeholder, #9ca3af);
606
1042
  }
607
1043
 
608
1044
  /* Hide the native clear button on type="search" — the popover handles
@@ -615,7 +1051,7 @@
615
1051
  padding: 24px 12px;
616
1052
  text-align: center;
617
1053
  font-size: 12px;
618
- color: #6b7280;
1054
+ color: var(--squisq-template-gallery-empty, #6b7280);
619
1055
  }
620
1056
 
621
1057
  /* "— none —" row at the top */
@@ -625,34 +1061,42 @@
625
1061
  gap: 10px;
626
1062
  width: 100%;
627
1063
  padding: 6px 10px;
628
- border: 1px solid transparent;
1064
+ border: 1px solid var(--squisq-template-gallery-option-border, #e5e7eb);
629
1065
  border-radius: 7px;
630
- background: none;
1066
+ background: var(--squisq-template-gallery-option-bg, #fbfdff);
631
1067
  cursor: pointer;
632
1068
  text-align: left;
633
1069
  margin-bottom: 6px;
634
- transition: background 0.1s;
1070
+ transition:
1071
+ background 0.1s,
1072
+ border-color 0.1s,
1073
+ box-shadow 0.1s;
635
1074
  }
636
1075
 
637
1076
  .squisq-template-gallery-none:hover {
638
- background: #f9fafb;
1077
+ background: var(--squisq-template-gallery-option-hover-bg, #f9fafb);
1078
+ border-color: var(--squisq-template-gallery-option-hover-border, #c7d2fe);
1079
+ box-shadow: var(
1080
+ --squisq-template-gallery-option-hover-shadow,
1081
+ 0 1px 3px rgba(99, 102, 241, 0.08)
1082
+ );
639
1083
  }
640
1084
 
641
1085
  .squisq-template-gallery-none.squisq-template-gallery-card--selected {
642
- background: #eef2ff;
643
- border-color: #c7d2fe;
1086
+ background: var(--squisq-template-gallery-selected-bg, #eef2ff);
1087
+ border-color: var(--squisq-template-gallery-selected-border, #c7d2fe);
644
1088
  }
645
1089
 
646
1090
  .squisq-template-gallery-none-label {
647
1091
  font-size: 12px;
648
1092
  font-weight: 600;
649
- color: #6b7280;
1093
+ color: var(--squisq-template-gallery-section-title, #6b7280);
650
1094
  white-space: nowrap;
651
1095
  }
652
1096
 
653
1097
  .squisq-template-gallery-none-desc {
654
1098
  font-size: 11px;
655
- color: #9ca3af;
1099
+ color: var(--squisq-template-gallery-description, #9ca3af);
656
1100
  }
657
1101
 
658
1102
  /* Grid of template cards */
@@ -675,12 +1119,13 @@
675
1119
  /* Individual template card */
676
1120
  .squisq-template-gallery-card {
677
1121
  display: flex;
1122
+ flex-direction: column;
678
1123
  align-items: flex-start;
679
- gap: 10px;
680
- padding: 8px 10px;
681
- border: 1px solid #e5e7eb;
1124
+ gap: 8px;
1125
+ padding: 8px;
1126
+ border: 1px solid var(--squisq-template-gallery-card-border, #e5e7eb);
682
1127
  border-radius: 7px;
683
- background: none;
1128
+ background: var(--squisq-template-gallery-card-bg, transparent);
684
1129
  cursor: pointer;
685
1130
  text-align: left;
686
1131
  transition:
@@ -690,23 +1135,29 @@
690
1135
  }
691
1136
 
692
1137
  .squisq-template-gallery-card:hover {
693
- background: #f9fafb;
694
- border-color: #a5b4fc;
695
- box-shadow: 0 1px 4px rgba(99, 102, 241, 0.1);
1138
+ background: var(--squisq-template-gallery-card-hover-bg, #f9fafb);
1139
+ border-color: var(--squisq-template-gallery-card-hover-border, #a5b4fc);
1140
+ box-shadow: var(--squisq-template-gallery-card-hover-shadow, 0 1px 4px rgba(99, 102, 241, 0.1));
696
1141
  }
697
1142
 
698
1143
  .squisq-template-gallery-card--selected {
699
- background: #eef2ff;
700
- border-color: #6366f1;
701
- box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.15);
1144
+ background: var(--squisq-template-gallery-selected-bg, #eef2ff);
1145
+ border-color: var(--squisq-template-gallery-selected-border, #6366f1);
1146
+ box-shadow: var(--squisq-template-gallery-selected-shadow, 0 0 0 2px rgba(99, 102, 241, 0.15));
702
1147
  }
703
1148
 
704
1149
  .squisq-template-gallery-card-icon {
1150
+ display: flex;
1151
+ align-items: center;
1152
+ justify-content: center;
1153
+ width: 100%;
1154
+ aspect-ratio: 16 / 9;
1155
+ min-height: 64px;
705
1156
  flex-shrink: 0;
706
1157
  border-radius: 4px;
707
1158
  overflow: hidden;
708
- background: #f8fafc;
709
- border: 1px solid #e5e7eb;
1159
+ background: var(--squisq-template-gallery-card-icon-bg, #f8fafc);
1160
+ border: 1px solid var(--squisq-template-gallery-card-icon-border, #e5e7eb);
710
1161
  line-height: 0;
711
1162
  }
712
1163
 
@@ -714,24 +1165,94 @@
714
1165
  display: block;
715
1166
  }
716
1167
 
1168
+ .squisq-template-gallery-card-icon .squisq-template-picker-icon {
1169
+ width: 100%;
1170
+ height: 100%;
1171
+ }
1172
+
1173
+ .squisq-template-gallery-none > .squisq-template-picker-icon {
1174
+ width: 56px;
1175
+ height: 40px;
1176
+ flex-shrink: 0;
1177
+ }
1178
+
1179
+ .squisq-template-gallery-card-icon .squisq-template-thumbnail {
1180
+ display: block;
1181
+ width: 100%;
1182
+ height: 100%;
1183
+ }
1184
+
1185
+ .squisq-template-gallery-content-preview {
1186
+ position: relative;
1187
+ width: 100%;
1188
+ height: 100%;
1189
+ background: var(--squisq-template-gallery-content-preview-bg, #f1f5f9);
1190
+ }
1191
+
1192
+ .squisq-template-gallery-content-preview svg {
1193
+ width: 100%;
1194
+ height: 100%;
1195
+ display: block;
1196
+ }
1197
+
1198
+ .squisq-template-gallery-content-preview-fallback {
1199
+ display: flex;
1200
+ align-items: center;
1201
+ justify-content: center;
1202
+ width: 100%;
1203
+ height: 100%;
1204
+ }
1205
+
1206
+ .squisq-template-gallery-content-preview-fallback > svg {
1207
+ width: 100%;
1208
+ height: 100%;
1209
+ display: block;
1210
+ }
1211
+
1212
+ .squisq-template-gallery-content-preview-warning {
1213
+ position: absolute;
1214
+ left: 50%;
1215
+ top: 50%;
1216
+ max-width: calc(100% - 16px);
1217
+ padding: 3px 6px;
1218
+ transform: translate(-50%, -50%);
1219
+ border: 1px solid var(--squisq-template-gallery-preview-warning-border, rgba(255, 255, 255, 0.22));
1220
+ border-radius: 4px;
1221
+ background: var(--squisq-template-gallery-preview-warning-bg, rgba(17, 24, 39, 0.9));
1222
+ color: var(--squisq-template-gallery-preview-warning-text, #ffffff);
1223
+ font-size: 10px;
1224
+ font-weight: 600;
1225
+ line-height: 1.2;
1226
+ text-align: center;
1227
+ pointer-events: none;
1228
+ }
1229
+
717
1230
  .squisq-template-gallery-card-body {
718
1231
  display: flex;
719
1232
  flex-direction: column;
720
1233
  gap: 3px;
1234
+ width: 100%;
721
1235
  min-width: 0;
722
1236
  }
723
1237
 
724
1238
  .squisq-template-gallery-card-name {
725
1239
  font-size: 12px;
726
1240
  font-weight: 600;
727
- color: #111827;
1241
+ color: var(--squisq-template-gallery-name, #111827);
728
1242
  line-height: 1.3;
1243
+ overflow: hidden;
1244
+ text-overflow: ellipsis;
1245
+ white-space: nowrap;
729
1246
  }
730
1247
 
731
1248
  .squisq-template-gallery-card-desc {
732
1249
  font-size: 11px;
733
- color: #6b7280;
1250
+ color: var(--squisq-template-gallery-description, #6b7280);
734
1251
  line-height: 1.4;
1252
+ display: -webkit-box;
1253
+ -webkit-line-clamp: 2;
1254
+ -webkit-box-orient: vertical;
1255
+ overflow: hidden;
735
1256
  }
736
1257
 
737
1258
  /* "+ New custom template" card pinned at the top of the gallery */
@@ -742,9 +1263,9 @@
742
1263
  width: 100%;
743
1264
  padding: 8px 12px;
744
1265
  margin-bottom: 6px;
745
- border: 1px dashed #a5b4fc;
1266
+ border: 1px dashed var(--squisq-template-gallery-new-border, #a5b4fc);
746
1267
  border-radius: 7px;
747
- background: #f5f3ff;
1268
+ background: var(--squisq-template-gallery-new-bg, #f5f3ff);
748
1269
  cursor: pointer;
749
1270
  text-align: left;
750
1271
  transition:
@@ -753,8 +1274,8 @@
753
1274
  }
754
1275
 
755
1276
  .squisq-template-gallery-new:hover {
756
- background: #ede9fe;
757
- border-color: #818cf8;
1277
+ background: var(--squisq-template-gallery-new-hover-bg, #ede9fe);
1278
+ border-color: var(--squisq-template-gallery-new-hover-border, #818cf8);
758
1279
  border-style: solid;
759
1280
  }
760
1281
 
@@ -768,9 +1289,9 @@
768
1289
  font-size: 20px;
769
1290
  font-weight: 600;
770
1291
  line-height: 1;
771
- color: #6366f1;
772
- background: #ffffff;
773
- border: 1px solid #c4b5fd;
1292
+ color: var(--squisq-template-gallery-new-plus-color, #6366f1);
1293
+ background: var(--squisq-template-gallery-new-plus-bg, #ffffff);
1294
+ border: 1px solid var(--squisq-template-gallery-new-plus-border, #c4b5fd);
774
1295
  border-radius: 6px;
775
1296
  }
776
1297
 
@@ -784,12 +1305,12 @@
784
1305
  .squisq-template-gallery-new-label {
785
1306
  font-size: 12px;
786
1307
  font-weight: 600;
787
- color: #4338ca;
1308
+ color: var(--squisq-template-gallery-new-label, #4338ca);
788
1309
  }
789
1310
 
790
1311
  .squisq-template-gallery-new-desc {
791
1312
  font-size: 11px;
792
- color: #6b7280;
1313
+ color: var(--squisq-template-gallery-new-desc, #6b7280);
793
1314
  line-height: 1.4;
794
1315
  }
795
1316
 
@@ -797,14 +1318,14 @@
797
1318
  .squisq-template-gallery-section + .squisq-template-gallery-section {
798
1319
  margin-top: 14px;
799
1320
  padding-top: 10px;
800
- border-top: 1px solid #e5e7eb;
1321
+ border-top: 1px solid var(--squisq-template-gallery-section-border, #e5e7eb);
801
1322
  }
802
1323
 
803
1324
  .squisq-template-gallery-section-title {
804
1325
  margin: 4px 4px 8px;
805
1326
  font-size: 10px;
806
1327
  font-weight: 700;
807
- color: #6b7280;
1328
+ color: var(--squisq-template-gallery-section-title, #6b7280);
808
1329
  text-transform: uppercase;
809
1330
  letter-spacing: 0.06em;
810
1331
  }
@@ -853,41 +1374,86 @@
853
1374
  .squisq-template-badge {
854
1375
  display: inline-flex;
855
1376
  align-items: center;
856
- gap: 4px;
1377
+ gap: 1px;
857
1378
  margin-left: 8px;
858
- padding: 1px 6px 1px 8px;
1379
+ padding: 0;
859
1380
  font-size: 11px;
860
1381
  font-weight: 600;
861
1382
  font-family: inherit;
862
- color: #6d28d9;
863
- background: #ede9fe;
864
- border: 1px solid #c4b5fd;
865
- border-radius: 10px;
866
- vertical-align: middle;
1383
+ color: #c3a47d;
1384
+ background: transparent;
1385
+ border: 0;
1386
+ border-radius: 0;
1387
+ vertical-align: baseline;
1388
+ transform: translateY(2px);
867
1389
  user-select: none;
868
- line-height: 1.6;
1390
+ line-height: 1;
869
1391
  cursor: pointer;
1392
+ transition:
1393
+ color 0.15s ease,
1394
+ opacity 0.15s ease;
1395
+ }
1396
+
1397
+ .squisq-template-badge-core {
1398
+ display: inline-flex;
1399
+ align-items: center;
1400
+ gap: 4px;
1401
+ padding: 1px 7px;
1402
+ color: #7c4a16;
1403
+ background: #f8f0e3;
1404
+ border: 1px solid #d8c2a2;
1405
+ border-radius: 0;
1406
+ line-height: 1.6;
870
1407
  transition:
871
1408
  background 0.15s ease,
872
1409
  border-color 0.15s ease;
873
1410
  }
874
1411
 
875
- .squisq-template-badge:hover,
1412
+ .squisq-template-badge:hover .squisq-template-badge-core,
1413
+ .squisq-template-badge:focus-visible .squisq-template-badge-core {
1414
+ background: #ead6b8;
1415
+ border-color: #bb9563;
1416
+ }
1417
+
876
1418
  .squisq-template-badge:focus-visible {
877
- background: #ddd6fe;
878
- border-color: #a78bfa;
879
1419
  outline: none;
880
1420
  }
881
1421
 
882
1422
  .squisq-template-badge::before {
883
- content: attr(data-template-label);
1423
+ content: '{';
1424
+ }
1425
+
1426
+ .squisq-template-badge::after {
1427
+ content: '}';
884
1428
  }
885
1429
 
1430
+ .squisq-template-badge::before,
886
1431
  .squisq-template-badge::after {
1432
+ display: inline-flex;
1433
+ position: relative;
1434
+ top: -1px;
1435
+ align-items: center;
1436
+ min-height: 22px;
1437
+ font-size: 22px;
1438
+ font-weight: 500;
1439
+ line-height: 1;
1440
+ opacity: 0.64;
1441
+ }
1442
+
1443
+ .squisq-template-badge-core::before {
1444
+ content: attr(data-template-label);
1445
+ }
1446
+
1447
+ .squisq-template-badge-core::before,
1448
+ .squisq-template-badge-core::after {
1449
+ transform: translateY(1px);
1450
+ }
1451
+
1452
+ .squisq-template-badge-core::after {
887
1453
  content: '▾';
888
1454
  font-size: 9px;
889
1455
  line-height: 1;
890
- opacity: 0.7;
1456
+ opacity: 0.62;
891
1457
  }
892
1458
 
893
1459
  /* Empty variant — subtle affordance on plain headings that opens the
@@ -896,13 +1462,14 @@
896
1462
  .squisq-template-badge.squisq-template-badge--empty {
897
1463
  color: #94a3b8;
898
1464
  background: transparent;
899
- border-color: #d1d5db;
900
- border-style: dashed;
901
1465
  opacity: 0.5;
902
1466
  }
903
1467
 
904
- .squisq-template-badge.squisq-template-badge--empty::before {
905
- content: 'Block';
1468
+ .squisq-template-badge.squisq-template-badge--empty .squisq-template-badge-core {
1469
+ color: #94a3b8;
1470
+ background: transparent;
1471
+ border-color: #d1d5db;
1472
+ border-style: dashed;
906
1473
  font-weight: 500;
907
1474
  }
908
1475
 
@@ -913,9 +1480,14 @@
913
1480
  .squisq-template-badge.squisq-template-badge--empty:hover,
914
1481
  .squisq-template-badge.squisq-template-badge--empty:focus-visible {
915
1482
  opacity: 1;
916
- color: #6d28d9;
917
- background: #ede9fe;
918
- border-color: #c4b5fd;
1483
+ color: #b89266;
1484
+ }
1485
+
1486
+ .squisq-template-badge.squisq-template-badge--empty:hover .squisq-template-badge-core,
1487
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible .squisq-template-badge-core {
1488
+ color: #7c4a16;
1489
+ background: #f1e2ca;
1490
+ border-color: #d8c2a2;
919
1491
  border-style: solid;
920
1492
  }
921
1493
 
@@ -1190,16 +1762,16 @@
1190
1762
  font-family: var(--squisq-theme-title-font, var(--squisq-theme-body-font, inherit));
1191
1763
  }
1192
1764
 
1193
- /* Headings start blocks, so they get generous space ABOVE (a clear break from
1194
- the previous block) and a tighter margin BELOW so the heading stays visually
1195
- grouped with the content it introduces. */
1765
+ /* Headings start blocks, so they get a clear break from the previous block and
1766
+ tighter space below to stay visually grouped with their content. H1/H2 use
1767
+ modest top margins because their themed font size already creates separation. */
1196
1768
  .squisq-wysiwyg-editor h1 {
1197
1769
  font-size: 2em;
1198
- margin: 1em 0 0.4em;
1770
+ margin: 0.45em 0 0.4em;
1199
1771
  }
1200
1772
  .squisq-wysiwyg-editor h2 {
1201
1773
  font-size: 1.5em;
1202
- margin: 1.15em 0 0.35em;
1774
+ margin: 0.65em 0 0.35em;
1203
1775
  }
1204
1776
  .squisq-wysiwyg-editor h3 {
1205
1777
  font-size: 1.17em;
@@ -1416,24 +1988,6 @@
1416
1988
 
1417
1989
  /* ─── Preview Controls ──────────────────────────────── */
1418
1990
 
1419
- /* Left-side preview switches: the segmented mode switch and the aspect-ratio
1420
- switch, separated by a divider. Natural width; sits just after the view
1421
- tabs and never shrinks. */
1422
- .squisq-preview-left-controls {
1423
- display: flex;
1424
- align-items: center;
1425
- gap: 8px;
1426
- margin-left: 8px;
1427
- flex: 0 0 auto;
1428
- }
1429
-
1430
- .squisq-preview-seg-divider {
1431
- width: 1px;
1432
- height: 20px;
1433
- background: var(--squisq-border, #d1d5db);
1434
- flex: 0 0 auto;
1435
- }
1436
-
1437
1991
  /* Segmented switch — a row of connected buttons (display mode: Video /
1438
1992
  Slideshow / Document / Page; aspect ratio: 16:9 / 1:1 / 9:16 / 4:3),
1439
1993
  replacing the old "Mode:" / "Format:" dropdowns. */
@@ -1509,12 +2063,19 @@
1509
2063
  display: flex;
1510
2064
  align-items: center;
1511
2065
  gap: 6px;
1512
- flex: 1 1 auto;
2066
+ flex: 1 1 0;
1513
2067
  min-width: 0;
1514
2068
  position: relative;
1515
2069
  padding-left: 9px;
1516
2070
  }
1517
2071
 
2072
+ .squisq-preview-controls[data-has-overflow='true'] {
2073
+ /* The compact ellipsis trigger needs real flex-row width. Without this, the
2074
+ filler can shrink below the trigger's painted width and the next toolbar
2075
+ buttons visually collide with it at intermediate widths. */
2076
+ min-width: 41px;
2077
+ }
2078
+
1518
2079
  /* Hidden probe: renders every control at natural width so the fit measurement
1519
2080
  has per-control widths to work from. Absolutely positioned + hidden so it
1520
2081
  never affects layout or catches pointer events. */
@@ -1531,7 +2092,7 @@
1531
2092
  pointer-events: none;
1532
2093
  }
1533
2094
 
1534
- /* Inline row sits at its natural width (the overflow gear, when present, sits
2095
+ /* Inline row sits at its natural width (the ellipsis trigger, when present, sits
1535
2096
  just after it); it never wraps — controls that don't fit move to the menu. */
1536
2097
  .squisq-preview-controls-inline {
1537
2098
  display: flex;
@@ -1555,20 +2116,19 @@
1555
2116
  }
1556
2117
 
1557
2118
  .squisq-preview-controls-popover {
1558
- position: absolute;
1559
- top: 100%;
1560
- right: 0;
2119
+ position: fixed;
1561
2120
  z-index: 80;
1562
2121
  background: var(--squisq-bg, #fff);
1563
2122
  border: 1px solid var(--squisq-border, #d1d5db);
1564
2123
  border-radius: 6px;
1565
2124
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
1566
2125
  padding: 8px 12px;
1567
- margin-top: 4px;
2126
+ box-sizing: border-box;
1568
2127
  display: flex;
1569
2128
  flex-direction: column;
1570
2129
  gap: 8px;
1571
2130
  min-width: 180px;
2131
+ max-width: calc(100vw - 16px);
1572
2132
  }
1573
2133
 
1574
2134
  .squisq-preview-control--compact {
@@ -1583,6 +2143,26 @@
1583
2143
  min-width: 0;
1584
2144
  }
1585
2145
 
2146
+ .squisq-preview-checkbox {
2147
+ display: inline-flex;
2148
+ align-items: center;
2149
+ gap: 6px;
2150
+ color: var(--squisq-text, #1f2937);
2151
+ font-size: 12px;
2152
+ font-weight: 500;
2153
+ line-height: 1;
2154
+ white-space: nowrap;
2155
+ cursor: pointer;
2156
+ }
2157
+
2158
+ .squisq-preview-checkbox input {
2159
+ width: 13px;
2160
+ height: 13px;
2161
+ margin: 0;
2162
+ accent-color: #2563eb;
2163
+ cursor: pointer;
2164
+ }
2165
+
1586
2166
  /* Link color follows the active theme's primary when "Theme styling →
1587
2167
  Fonts & colors" is on, otherwise falls back to the historical blue.
1588
2168
  In both cases we blend toward the surface text color so the link
@@ -1738,6 +2318,12 @@
1738
2318
  color: #93c5fd;
1739
2319
  }
1740
2320
 
2321
+ .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-files-badge {
2322
+ border-color: #111827;
2323
+ background: #60a5fa;
2324
+ color: #111827;
2325
+ }
2326
+
1741
2327
  .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-separator {
1742
2328
  background: #4b5563;
1743
2329
  }
@@ -1779,6 +2365,10 @@
1779
2365
  color: #d1d5db;
1780
2366
  }
1781
2367
 
2368
+ .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-overflow-heading {
2369
+ color: #6b7280;
2370
+ }
2371
+
1782
2372
  .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-overflow-item:hover {
1783
2373
  background: #374151;
1784
2374
  }
@@ -1896,6 +2486,10 @@
1896
2486
  border-color: #374151;
1897
2487
  }
1898
2488
 
2489
+ .squisq-editor-shell[data-theme='dark'] .squisq-template-gallery-content-preview {
2490
+ background: #0f172a;
2491
+ }
2492
+
1899
2493
  .squisq-editor-shell[data-theme='dark'] .squisq-template-gallery-card-name {
1900
2494
  color: #f3f4f6;
1901
2495
  }
@@ -1906,24 +2500,53 @@
1906
2500
 
1907
2501
  /* Template badge (dark) */
1908
2502
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge {
1909
- color: #a78bfa;
1910
- background: #2e1065;
1911
- border-color: #6d28d9;
2503
+ color: #f0b75a;
2504
+ background: transparent;
2505
+ border-color: transparent;
2506
+ }
2507
+
2508
+ .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::before,
2509
+ .squisq-editor-shell[data-theme='dark'] .squisq-template-badge::after {
2510
+ color: #d79a45;
2511
+ opacity: 0.82;
2512
+ }
2513
+
2514
+ .squisq-editor-shell[data-theme='dark'] .squisq-template-badge-core {
2515
+ color: #ffe3ad;
2516
+ background: #3a2818;
2517
+ border-color: #d79a45;
1912
2518
  }
1913
2519
 
1914
2520
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge.squisq-template-badge--empty {
1915
- color: #64748b;
2521
+ color: #e0a84d;
1916
2522
  background: transparent;
1917
- border-color: #374151;
2523
+ opacity: 0.92;
2524
+ }
2525
+
2526
+ .squisq-editor-shell[data-theme='dark']
2527
+ .squisq-template-badge.squisq-template-badge--empty
2528
+ .squisq-template-badge-core {
2529
+ color: #e7c08a;
2530
+ background: rgba(58, 40, 24, 0.34);
2531
+ border-color: #c6842e;
1918
2532
  border-style: dashed;
1919
2533
  }
1920
2534
 
1921
2535
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge.squisq-template-badge--empty:hover,
1922
2536
  .squisq-editor-shell[data-theme='dark']
1923
2537
  .squisq-template-badge.squisq-template-badge--empty:focus-visible {
1924
- color: #c4b5fd;
1925
- background: #2e1065;
1926
- border-color: #6d28d9;
2538
+ color: #f0b75a;
2539
+ }
2540
+
2541
+ .squisq-editor-shell[data-theme='dark']
2542
+ .squisq-template-badge.squisq-template-badge--empty:hover
2543
+ .squisq-template-badge-core,
2544
+ .squisq-editor-shell[data-theme='dark']
2545
+ .squisq-template-badge.squisq-template-badge--empty:focus-visible
2546
+ .squisq-template-badge-core {
2547
+ color: #ffe3ad;
2548
+ background: #3a2818;
2549
+ border-color: #d79a45;
1927
2550
  border-style: solid;
1928
2551
  }
1929
2552
 
@@ -2155,6 +2778,16 @@
2155
2778
  border-bottom: 1px solid #f3f4f6;
2156
2779
  }
2157
2780
 
2781
+ .squisq-media-bin-item:hover,
2782
+ .squisq-media-bin-item:focus-visible {
2783
+ background: #f3f4f6;
2784
+ }
2785
+
2786
+ .squisq-media-bin-item:focus-visible {
2787
+ outline: 2px solid #93c5fd;
2788
+ outline-offset: -2px;
2789
+ }
2790
+
2158
2791
  .squisq-media-bin-thumb {
2159
2792
  width: 32px;
2160
2793
  height: 32px;
@@ -2187,11 +2820,82 @@
2187
2820
  white-space: nowrap;
2188
2821
  }
2189
2822
 
2823
+ .squisq-media-bin-detail-row {
2824
+ display: flex;
2825
+ align-items: center;
2826
+ gap: 6px;
2827
+ min-height: 14px;
2828
+ }
2829
+
2190
2830
  .squisq-media-bin-size {
2191
2831
  font-size: 10px;
2192
2832
  color: #9ca3af;
2193
2833
  }
2194
2834
 
2835
+ .squisq-media-bin-unused-badge {
2836
+ display: inline-flex;
2837
+ align-items: center;
2838
+ height: 14px;
2839
+ padding: 0 5px;
2840
+ border-radius: 999px;
2841
+ background: #fef3c7;
2842
+ color: #92400e;
2843
+ font-size: 9px;
2844
+ font-weight: 700;
2845
+ line-height: 1;
2846
+ text-transform: uppercase;
2847
+ }
2848
+
2849
+ .squisq-media-bin-context-menu {
2850
+ position: fixed;
2851
+ z-index: 1000;
2852
+ min-width: 152px;
2853
+ padding: 4px;
2854
+ border: 1px solid #d1d5db;
2855
+ border-radius: 6px;
2856
+ background: #fff;
2857
+ box-shadow:
2858
+ 0 12px 28px rgba(15, 23, 42, 0.18),
2859
+ 0 2px 6px rgba(15, 23, 42, 0.12);
2860
+ }
2861
+
2862
+ .squisq-media-bin-context-menu-item {
2863
+ width: 100%;
2864
+ display: flex;
2865
+ align-items: center;
2866
+ gap: 8px;
2867
+ padding: 7px 9px;
2868
+ border: 0;
2869
+ border-radius: 4px;
2870
+ background: transparent;
2871
+ color: #374151;
2872
+ cursor: pointer;
2873
+ font: inherit;
2874
+ font-size: 12px;
2875
+ text-align: left;
2876
+ }
2877
+
2878
+ .squisq-media-bin-context-menu-item:hover,
2879
+ .squisq-media-bin-context-menu-item:focus-visible {
2880
+ background: #f3f4f6;
2881
+ outline: none;
2882
+ }
2883
+
2884
+ .squisq-media-bin-context-menu-item--danger {
2885
+ color: #b91c1c;
2886
+ }
2887
+
2888
+ .squisq-media-bin-context-menu-item--danger:hover,
2889
+ .squisq-media-bin-context-menu-item--danger:focus-visible {
2890
+ background: #fee2e2;
2891
+ color: #991b1b;
2892
+ }
2893
+
2894
+ .squisq-media-bin-context-menu-item:disabled {
2895
+ cursor: default;
2896
+ opacity: 0.55;
2897
+ }
2898
+
2195
2899
  /* ─── Media Bin (dark) ───────────────────────────────── */
2196
2900
 
2197
2901
  .squisq-media-bin--dark,
@@ -2228,6 +2932,13 @@
2228
2932
  border-bottom-color: #2d3748;
2229
2933
  }
2230
2934
 
2935
+ .squisq-media-bin--dark .squisq-media-bin-item:hover,
2936
+ .squisq-media-bin--dark .squisq-media-bin-item:focus-visible,
2937
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-item:hover,
2938
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-item:focus-visible {
2939
+ background: #273449;
2940
+ }
2941
+
2231
2942
  .squisq-media-bin--dark .squisq-media-bin-icon,
2232
2943
  .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-icon {
2233
2944
  background: #374151;
@@ -2243,11 +2954,51 @@
2243
2954
  color: #6b7280;
2244
2955
  }
2245
2956
 
2957
+ .squisq-media-bin--dark .squisq-media-bin-unused-badge,
2958
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-unused-badge {
2959
+ background: #78350f;
2960
+ color: #fde68a;
2961
+ }
2962
+
2246
2963
  .squisq-media-bin--dark .squisq-media-bin-empty,
2247
2964
  .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-empty {
2248
2965
  color: #6b7280;
2249
2966
  }
2250
2967
 
2968
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu,
2969
+ .squisq-media-bin--dark .squisq-media-bin-context-menu {
2970
+ border-color: #4b5563;
2971
+ background: #111827;
2972
+ box-shadow:
2973
+ 0 12px 28px rgba(0, 0, 0, 0.42),
2974
+ 0 2px 6px rgba(0, 0, 0, 0.3);
2975
+ }
2976
+
2977
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item,
2978
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item {
2979
+ color: #d1d5db;
2980
+ }
2981
+
2982
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item:hover,
2983
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item:focus-visible,
2984
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item:hover,
2985
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item:focus-visible {
2986
+ background: #1f2937;
2987
+ }
2988
+
2989
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item--danger,
2990
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item--danger {
2991
+ color: #fca5a5;
2992
+ }
2993
+
2994
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item--danger:hover,
2995
+ .squisq-editor-shell[data-theme='dark'] .squisq-media-bin-context-menu-item--danger:focus-visible,
2996
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item--danger:hover,
2997
+ .squisq-media-bin--dark .squisq-media-bin-context-menu-item--danger:focus-visible {
2998
+ background: #450a0a;
2999
+ color: #fecaca;
3000
+ }
3001
+
2251
3002
  /* ============================================
2252
3003
  Drop Zone Overlay
2253
3004
  ============================================ */
@@ -3071,6 +3822,16 @@
3071
3822
  margin-left: 2px;
3072
3823
  }
3073
3824
 
3825
+ .squisq-theme-customizer-trigger--label {
3826
+ width: auto;
3827
+ min-width: 0;
3828
+ padding: 4px 12px;
3829
+ }
3830
+
3831
+ .squisq-theme-customizer-trigger-label {
3832
+ line-height: 1;
3833
+ }
3834
+
3074
3835
  .squisq-theme-customizer-popover {
3075
3836
  position: absolute;
3076
3837
  top: 100%;