@bendyline/squisq-editor-react 1.6.0 → 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 (68) hide show
  1. package/README.md +57 -10
  2. package/dist/index.d.ts +476 -105
  3. package/dist/index.js +8703 -6741
  4. package/dist/index.js.map +1 -1
  5. package/dist/styles/fa-brands-400-AHOAZHCU.woff2 +0 -0
  6. package/dist/styles/fa-regular-400-VRZYIBIZ.woff2 +0 -0
  7. package/dist/styles/fa-solid-900-MDEYK55F.woff2 +0 -0
  8. package/dist/styles/fa-v4compatibility-ETEVP6IB.woff2 +0 -0
  9. package/dist/styles/index.css +14617 -0
  10. package/package.json +15 -7
  11. package/src/BlockPropertiesPopover.tsx +23 -7
  12. package/src/EditorContext.tsx +22 -16
  13. package/src/EditorShell.tsx +121 -35
  14. package/src/MediaBin.tsx +171 -28
  15. package/src/OutlinePanel.tsx +26 -4
  16. package/src/PreviewControls.tsx +475 -145
  17. package/src/PreviewPanel.tsx +17 -9
  18. package/src/RawEditor.tsx +10 -4
  19. package/src/TemplateAnnotation.ts +22 -7
  20. package/src/TemplateContentPreview.tsx +56 -0
  21. package/src/TemplatePicker.tsx +295 -128
  22. package/src/ThemeCustomizerPanel.tsx +22 -15
  23. package/src/Toolbar.tsx +547 -217
  24. package/src/TransitionPicker.tsx +8 -1
  25. package/src/VersionHistoryPanel.tsx +2 -2
  26. package/src/ViewSwitcher.tsx +4 -4
  27. package/src/WysiwygEditor.tsx +45 -3
  28. package/src/__tests__/buildPreviewDocTransition.test.ts +1 -2
  29. package/src/__tests__/codeContextSectionView.test.tsx +95 -0
  30. package/src/__tests__/codeContextZoneManager.test.ts +127 -0
  31. package/src/__tests__/diffContextSections.test.ts +39 -0
  32. package/src/__tests__/editorShellCodeContext.test.tsx +86 -0
  33. package/src/__tests__/editorShellProps.test.tsx +363 -0
  34. package/src/__tests__/headingTransition.test.ts +59 -9
  35. package/src/__tests__/imageEditorShell.test.tsx +23 -0
  36. package/src/__tests__/mediaReferences.test.ts +82 -0
  37. package/src/__tests__/previewControls.test.tsx +163 -0
  38. package/src/__tests__/templateAnnotationRoundTrip.test.ts +23 -2
  39. package/src/__tests__/templateContentPreview.test.ts +101 -0
  40. package/src/__tests__/tiptapBridge.test.ts +47 -0
  41. package/src/__tests__/useJsonEditorTokens.test.ts +59 -0
  42. package/src/__tests__/useMediaRecorder.test.ts +17 -0
  43. package/src/codeContext/CodeContextSectionView.tsx +124 -0
  44. package/src/codeContext/CodeContextZoneManager.ts +149 -0
  45. package/src/codeContext/CodeContextZones.tsx +121 -0
  46. package/src/codeContext/diffContextSections.ts +38 -0
  47. package/src/codeContext/types.ts +75 -0
  48. package/src/diagram/DiagramWidget.tsx +6 -4
  49. package/src/headingTransition.ts +96 -21
  50. package/src/index.ts +34 -2
  51. package/src/jsonEditor/useJsonEditorTokens.ts +13 -43
  52. package/src/mediaReferences.ts +299 -0
  53. package/src/recorder/hooks/useMediaRecorder.ts +9 -10
  54. package/src/scene/Scene.tsx +53 -7
  55. package/src/scene/SceneBlockWidget.tsx +6 -3
  56. package/src/scene/SceneSelection.tsx +19 -15
  57. package/src/scene/SceneSideToolbar.tsx +89 -0
  58. package/src/scene/layers/DiagramEdges.tsx +4 -3
  59. package/src/scene/layers/edgeGeometry.ts +23 -4
  60. package/src/scene/scene.css +142 -2
  61. package/src/scene/tools/ConnectTool.ts +113 -24
  62. package/src/scene/tools/DrawingConnectTool.ts +86 -16
  63. package/src/scene/tools/SceneTool.ts +2 -0
  64. package/src/styles/code-context.css +155 -0
  65. package/src/styles/editor.css +991 -84
  66. package/src/styles/index.css +1 -0
  67. package/src/templateContentPreviewResolver.ts +353 -0
  68. 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: '{';
884
1424
  }
885
1425
 
886
1426
  .squisq-template-badge::after {
1427
+ content: '}';
1428
+ }
1429
+
1430
+ .squisq-template-badge::before,
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,39 +1988,147 @@
1416
1988
 
1417
1989
  /* ─── Preview Controls ──────────────────────────────── */
1418
1990
 
1991
+ /* Segmented switch — a row of connected buttons (display mode: Video /
1992
+ Slideshow / Document / Page; aspect ratio: 16:9 / 1:1 / 9:16 / 4:3),
1993
+ replacing the old "Mode:" / "Format:" dropdowns. */
1994
+ .squisq-preview-seg {
1995
+ display: inline-flex;
1996
+ align-items: center;
1997
+ flex: 0 0 auto;
1998
+ border: 1px solid var(--squisq-border, #d1d5db);
1999
+ border-radius: 6px;
2000
+ overflow: hidden;
2001
+ background: var(--squisq-input-bg, #fff);
2002
+ }
2003
+
2004
+ .squisq-preview-seg-btn {
2005
+ appearance: none;
2006
+ border: none;
2007
+ border-left: 1px solid var(--squisq-border, #d1d5db);
2008
+ background: transparent;
2009
+ color: #4b5563;
2010
+ font-size: 12px;
2011
+ font-weight: 500;
2012
+ line-height: 1;
2013
+ padding: 6px 11px;
2014
+ cursor: pointer;
2015
+ white-space: nowrap;
2016
+ transition:
2017
+ background 0.12s,
2018
+ color 0.12s;
2019
+ }
2020
+
2021
+ /* Icon segments (aspect ratio) center their glyph and use tighter, square-ish
2022
+ padding so the row of ratio icons reads as a compact cluster. */
2023
+ .squisq-preview-seg-btn--icon {
2024
+ display: flex;
2025
+ align-items: center;
2026
+ justify-content: center;
2027
+ padding: 4px 8px;
2028
+ }
2029
+
2030
+ .squisq-preview-seg-btn--icon svg {
2031
+ display: block;
2032
+ }
2033
+
2034
+ /* Font Awesome glyph segments (captions: cc / social) — size the webfont
2035
+ glyph to sit level with the SVG aspect-ratio icons. */
2036
+ .squisq-preview-seg-btn--icon > i {
2037
+ font-size: 15px;
2038
+ line-height: 1;
2039
+ }
2040
+
2041
+ .squisq-preview-seg-btn:first-child {
2042
+ border-left: none;
2043
+ }
2044
+
2045
+ .squisq-preview-seg-btn:hover {
2046
+ background: #f3f4f6;
2047
+ color: #111827;
2048
+ }
2049
+
2050
+ .squisq-preview-seg-btn--active,
2051
+ .squisq-preview-seg-btn--active:hover {
2052
+ background: #2563eb;
2053
+ color: #fff;
2054
+ }
2055
+
2056
+ /* Flex-filler root: spans the toolbar's leftover width, which is the budget
2057
+ PreviewToolbarControls measures to decide how many controls stay inline vs
2058
+ fold into the overflow menu. It also pushes the right-side toolbar buttons
2059
+ to the far edge (replacing the preview-mode spacer). `position: relative`
2060
+ anchors the hidden measurement probe; the 9px lead offsets the first
2061
+ control from the view-tabs divider. */
2062
+ .squisq-preview-controls {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ gap: 6px;
2066
+ flex: 1 1 0;
2067
+ min-width: 0;
2068
+ position: relative;
2069
+ padding-left: 9px;
2070
+ }
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
+
2079
+ /* Hidden probe: renders every control at natural width so the fit measurement
2080
+ has per-control widths to work from. Absolutely positioned + hidden so it
2081
+ never affects layout or catches pointer events. */
2082
+ .squisq-preview-controls-probe {
2083
+ position: absolute;
2084
+ top: 0;
2085
+ left: 0;
2086
+ display: flex;
2087
+ align-items: center;
2088
+ gap: 6px;
2089
+ flex-wrap: nowrap;
2090
+ white-space: nowrap;
2091
+ visibility: hidden;
2092
+ pointer-events: none;
2093
+ }
2094
+
2095
+ /* Inline row sits at its natural width (the ellipsis trigger, when present, sits
2096
+ just after it); it never wraps — controls that don't fit move to the menu. */
1419
2097
  .squisq-preview-controls-inline {
1420
2098
  display: flex;
1421
2099
  align-items: center;
1422
2100
  gap: 6px;
1423
- flex-wrap: wrap;
1424
- padding: 2px 0 2px 9px;
2101
+ flex-wrap: nowrap;
2102
+ flex: 0 0 auto;
1425
2103
  }
1426
2104
 
1427
- .squisq-preview-controls-inline .squisq-preview-control {
2105
+ .squisq-preview-controls-inline .squisq-preview-control,
2106
+ .squisq-preview-controls-probe .squisq-preview-control {
1428
2107
  display: flex;
1429
2108
  align-items: center;
1430
2109
  gap: 4px;
2110
+ flex-shrink: 0;
1431
2111
  }
1432
2112
 
1433
2113
  .squisq-preview-controls-compact {
1434
2114
  position: relative;
2115
+ flex: 0 0 auto;
1435
2116
  }
1436
2117
 
1437
2118
  .squisq-preview-controls-popover {
1438
- position: absolute;
1439
- top: 100%;
1440
- right: 0;
2119
+ position: fixed;
1441
2120
  z-index: 80;
1442
2121
  background: var(--squisq-bg, #fff);
1443
2122
  border: 1px solid var(--squisq-border, #d1d5db);
1444
2123
  border-radius: 6px;
1445
2124
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
1446
2125
  padding: 8px 12px;
1447
- margin-top: 4px;
2126
+ box-sizing: border-box;
1448
2127
  display: flex;
1449
2128
  flex-direction: column;
1450
2129
  gap: 8px;
1451
2130
  min-width: 180px;
2131
+ max-width: calc(100vw - 16px);
1452
2132
  }
1453
2133
 
1454
2134
  .squisq-preview-control--compact {
@@ -1463,6 +2143,26 @@
1463
2143
  min-width: 0;
1464
2144
  }
1465
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
+
1466
2166
  /* Link color follows the active theme's primary when "Theme styling →
1467
2167
  Fonts & colors" is on, otherwise falls back to the historical blue.
1468
2168
  In both cases we blend toward the surface text color so the link
@@ -1618,10 +2318,42 @@
1618
2318
  color: #93c5fd;
1619
2319
  }
1620
2320
 
2321
+ .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-files-badge {
2322
+ border-color: #111827;
2323
+ background: #60a5fa;
2324
+ color: #111827;
2325
+ }
2326
+
1621
2327
  .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-separator {
1622
2328
  background: #4b5563;
1623
2329
  }
1624
2330
 
2331
+ /* Segmented switches — mode + aspect ratio (dark) */
2332
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg-divider {
2333
+ background: #4b5563;
2334
+ }
2335
+
2336
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg {
2337
+ border-color: #4b5563;
2338
+ background: #111827;
2339
+ }
2340
+
2341
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg-btn {
2342
+ color: #d1d5db;
2343
+ border-left-color: #4b5563;
2344
+ }
2345
+
2346
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg-btn:hover {
2347
+ background: #374151;
2348
+ color: #f9fafb;
2349
+ }
2350
+
2351
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg-btn--active,
2352
+ .squisq-editor-shell[data-theme='dark'] .squisq-preview-seg-btn--active:hover {
2353
+ background: #2563eb;
2354
+ color: #fff;
2355
+ }
2356
+
1625
2357
  /* Overflow menu (dark) */
1626
2358
  .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-overflow-menu {
1627
2359
  background: #1f2937;
@@ -1633,6 +2365,10 @@
1633
2365
  color: #d1d5db;
1634
2366
  }
1635
2367
 
2368
+ .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-overflow-heading {
2369
+ color: #6b7280;
2370
+ }
2371
+
1636
2372
  .squisq-editor-shell[data-theme='dark'] .squisq-toolbar-overflow-item:hover {
1637
2373
  background: #374151;
1638
2374
  }
@@ -1750,6 +2486,10 @@
1750
2486
  border-color: #374151;
1751
2487
  }
1752
2488
 
2489
+ .squisq-editor-shell[data-theme='dark'] .squisq-template-gallery-content-preview {
2490
+ background: #0f172a;
2491
+ }
2492
+
1753
2493
  .squisq-editor-shell[data-theme='dark'] .squisq-template-gallery-card-name {
1754
2494
  color: #f3f4f6;
1755
2495
  }
@@ -1760,24 +2500,53 @@
1760
2500
 
1761
2501
  /* Template badge (dark) */
1762
2502
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge {
1763
- color: #a78bfa;
1764
- background: #2e1065;
1765
- 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;
1766
2518
  }
1767
2519
 
1768
2520
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge.squisq-template-badge--empty {
1769
- color: #64748b;
2521
+ color: #e0a84d;
1770
2522
  background: transparent;
1771
- 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;
1772
2532
  border-style: dashed;
1773
2533
  }
1774
2534
 
1775
2535
  .squisq-editor-shell[data-theme='dark'] .squisq-template-badge.squisq-template-badge--empty:hover,
1776
2536
  .squisq-editor-shell[data-theme='dark']
1777
2537
  .squisq-template-badge.squisq-template-badge--empty:focus-visible {
1778
- color: #c4b5fd;
1779
- background: #2e1065;
1780
- 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;
1781
2550
  border-style: solid;
1782
2551
  }
1783
2552
 
@@ -2009,6 +2778,16 @@
2009
2778
  border-bottom: 1px solid #f3f4f6;
2010
2779
  }
2011
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
+
2012
2791
  .squisq-media-bin-thumb {
2013
2792
  width: 32px;
2014
2793
  height: 32px;
@@ -2041,11 +2820,82 @@
2041
2820
  white-space: nowrap;
2042
2821
  }
2043
2822
 
2823
+ .squisq-media-bin-detail-row {
2824
+ display: flex;
2825
+ align-items: center;
2826
+ gap: 6px;
2827
+ min-height: 14px;
2828
+ }
2829
+
2044
2830
  .squisq-media-bin-size {
2045
2831
  font-size: 10px;
2046
2832
  color: #9ca3af;
2047
2833
  }
2048
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
+
2049
2899
  /* ─── Media Bin (dark) ───────────────────────────────── */
2050
2900
 
2051
2901
  .squisq-media-bin--dark,
@@ -2082,6 +2932,13 @@
2082
2932
  border-bottom-color: #2d3748;
2083
2933
  }
2084
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
+
2085
2942
  .squisq-media-bin--dark .squisq-media-bin-icon,
2086
2943
  .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-icon {
2087
2944
  background: #374151;
@@ -2097,11 +2954,51 @@
2097
2954
  color: #6b7280;
2098
2955
  }
2099
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
+
2100
2963
  .squisq-media-bin--dark .squisq-media-bin-empty,
2101
2964
  .squisq-editor-shell[data-theme='dark'] .squisq-media-bin .squisq-media-bin-empty {
2102
2965
  color: #6b7280;
2103
2966
  }
2104
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
+
2105
3002
  /* ============================================
2106
3003
  Drop Zone Overlay
2107
3004
  ============================================ */
@@ -2925,6 +3822,16 @@
2925
3822
  margin-left: 2px;
2926
3823
  }
2927
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
+
2928
3835
  .squisq-theme-customizer-popover {
2929
3836
  position: absolute;
2930
3837
  top: 100%;