@particle-academy/fancy-flow 0.26.0 → 0.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -562,96 +562,163 @@ svg.react-flow__connectionline {
562
562
  }
563
563
 
564
564
  /* src/styles.css */
565
+ .ff-editor,
566
+ .ff-canvas,
567
+ .ff-palette,
568
+ .ff-panel,
569
+ .ff-run-feed,
570
+ .ff-prompt {
571
+ --ff-font:
572
+ ui-sans-serif,
573
+ system-ui,
574
+ -apple-system,
575
+ "Segoe UI",
576
+ Roboto,
577
+ sans-serif;
578
+ --ff-mono:
579
+ ui-monospace,
580
+ "SF Mono",
581
+ "JetBrains Mono",
582
+ Menlo,
583
+ Consolas,
584
+ monospace;
585
+ --ff-surface: #ffffff;
586
+ --ff-surface-2: #f4f4f5;
587
+ --ff-surface-3: #fafafa;
588
+ --ff-canvas-bg: #ffffff;
589
+ --ff-canvas-dot: rgba(9, 9, 11, 0.09);
590
+ --ff-node-bg: #ffffff;
591
+ --ff-fg: #18181b;
592
+ --ff-fg-muted: #52525b;
593
+ --ff-fg-subtle: #71717a;
594
+ --ff-fg-faint: #a1a1aa;
595
+ --ff-border: #e4e4e7;
596
+ --ff-border-strong: #d4d4d8;
597
+ --ff-edge: #9ca3af;
598
+ --ff-accent: #8b5cf6;
599
+ --ff-accent-soft: rgba(139, 92, 246, 0.12);
600
+ --ff-accent-ring: rgba(139, 92, 246, 0.22);
601
+ --ff-run: #10b981;
602
+ --ff-run-hover: #059669;
603
+ --ff-danger: #ef4444;
604
+ --ff-warn: #d97706;
605
+ --ff-warn-soft: rgba(245, 158, 11, 0.15);
606
+ --ff-feed-node: #7c3aed;
607
+ --ff-feed-ok: #059669;
608
+ --ff-radius: 12px;
609
+ --ff-radius-md: 8px;
610
+ --ff-radius-sm: 6px;
611
+ --ff-shadow-sm: 0 1px 2px rgba(0,0,0,.05);
612
+ --ff-shadow-md: 0 1px 2px rgba(0,0,0,.04), 0 4px 12px rgba(0,0,0,.06);
613
+ --ff-shadow-lg: 0 10px 20px -6px rgba(0,0,0,.12), 0 4px 8px -6px rgba(0,0,0,.08);
614
+ }
615
+ .dark :is(.ff-editor, .ff-canvas, .ff-palette, .ff-panel, .ff-run-feed, .ff-prompt),
616
+ [data-theme=dark] :is(.ff-editor, .ff-canvas, .ff-palette, .ff-panel, .ff-run-feed, .ff-prompt) {
617
+ --ff-surface: #1c1c22;
618
+ --ff-surface-2: #141419;
619
+ --ff-surface-3: #27272a;
620
+ --ff-canvas-bg: #0a0a0c;
621
+ --ff-canvas-dot: rgba(255, 255, 255, 0.10);
622
+ --ff-node-bg: #1c1c22;
623
+ --ff-fg: #fafafa;
624
+ --ff-fg-muted: #d4d4d8;
625
+ --ff-fg-subtle: #a1a1aa;
626
+ --ff-fg-faint: #71717a;
627
+ --ff-border: #3f3f46;
628
+ --ff-border-strong: #52525b;
629
+ --ff-edge: #71717a;
630
+ --ff-accent: #a78bfa;
631
+ --ff-accent-soft: rgba(167, 139, 250, 0.16);
632
+ --ff-accent-ring: rgba(167, 139, 250, 0.30);
633
+ --ff-warn: #fb923c;
634
+ --ff-warn-soft: rgba(251, 146, 60, 0.16);
635
+ --ff-feed-node: #c4b5fd;
636
+ --ff-feed-ok: #34d399;
637
+ --ff-shadow-md: 0 1px 2px rgba(0,0,0,.4), 0 6px 16px rgba(0,0,0,.5);
638
+ --ff-shadow-lg: 0 12px 28px -8px rgba(0,0,0,.6), 0 4px 10px -6px rgba(0,0,0,.5);
639
+ }
640
+ @media (prefers-color-scheme: dark) {
641
+ :is(.ff-editor, .ff-canvas, .ff-palette, .ff-panel, .ff-run-feed, .ff-prompt):not(.ff-canvas--light):not(.ff-canvas--light *) {
642
+ --ff-surface: #1c1c22;
643
+ --ff-surface-2: #141419;
644
+ --ff-surface-3: #27272a;
645
+ --ff-canvas-bg: #0a0a0c;
646
+ --ff-canvas-dot: rgba(255, 255, 255, 0.10);
647
+ --ff-node-bg: #1c1c22;
648
+ --ff-fg: #fafafa;
649
+ --ff-fg-muted: #d4d4d8;
650
+ --ff-fg-subtle: #a1a1aa;
651
+ --ff-fg-faint: #71717a;
652
+ --ff-border: #3f3f46;
653
+ --ff-border-strong: #52525b;
654
+ --ff-edge: #71717a;
655
+ --ff-accent: #a78bfa;
656
+ --ff-accent-soft: rgba(167, 139, 250, 0.16);
657
+ --ff-accent-ring: rgba(167, 139, 250, 0.30);
658
+ --ff-warn: #fb923c;
659
+ --ff-warn-soft: rgba(251, 146, 60, 0.16);
660
+ --ff-feed-node: #c4b5fd;
661
+ --ff-feed-ok: #34d399;
662
+ --ff-shadow-md: 0 1px 2px rgba(0,0,0,.4), 0 6px 16px rgba(0,0,0,.5);
663
+ --ff-shadow-lg: 0 12px 28px -8px rgba(0,0,0,.6), 0 4px 10px -6px rgba(0,0,0,.5);
664
+ }
665
+ }
565
666
  .ff-canvas {
566
667
  display: flex;
567
668
  flex-direction: column;
568
- border: 1px solid #e4e4e7;
569
- border-radius: 12px;
669
+ border: 1px solid var(--ff-border);
670
+ border-radius: var(--ff-radius);
570
671
  overflow: hidden;
571
- background: white;
572
- }
573
- .dark .ff-canvas {
574
- background: #0a0a0a;
575
- border-color: #3f3f46;
576
- }
577
- @media (prefers-color-scheme: dark) {
578
- .ff-canvas:not(.ff-canvas--light) {
579
- background: #0a0a0a;
580
- border-color: #3f3f46;
581
- }
672
+ background: var(--ff-canvas-bg);
582
673
  }
583
674
  .ff-canvas__toolbar {
584
- border-bottom: 1px solid #e4e4e7;
585
- padding: 6px 8px;
675
+ border-bottom: 1px solid var(--ff-border);
676
+ padding: 8px 10px;
586
677
  display: flex;
587
678
  gap: 6px;
588
679
  align-items: center;
589
- background: rgba(244, 244, 245, 0.6);
590
- font-family:
591
- ui-sans-serif,
592
- system-ui,
593
- sans-serif;
680
+ flex-wrap: wrap;
681
+ background: var(--ff-surface-2);
682
+ color: var(--ff-fg-muted);
683
+ font-family: var(--ff-font);
594
684
  font-size: 12px;
595
685
  }
596
- .dark .ff-canvas__toolbar {
597
- background: rgba(24, 24, 27, 0.6);
598
- border-color: #3f3f46;
599
- color: #e4e4e7;
600
- }
601
- @media (prefers-color-scheme: dark) {
602
- .ff-canvas__toolbar {
603
- background: rgba(24, 24, 27, 0.6);
604
- border-color: #3f3f46;
605
- color: #e4e4e7;
606
- }
607
- }
608
686
  .ff-canvas__surface {
609
687
  flex: 1;
610
688
  min-height: 0;
611
689
  position: relative;
690
+ background: var(--ff-canvas-bg);
612
691
  }
613
- .dark .react-flow__background pattern circle {
614
- fill: rgba(255, 255, 255, 0.10);
692
+ .react-flow__background pattern circle {
693
+ fill: var(--ff-canvas-dot);
615
694
  }
616
695
  .ff-node {
617
696
  min-width: 200px;
618
697
  max-width: 280px;
619
- background: white;
620
- border: 1px solid #d4d4d8;
621
- border-radius: 8px;
622
- font-family:
623
- ui-sans-serif,
624
- system-ui,
625
- sans-serif;
698
+ background: var(--ff-node-bg);
699
+ border: 1px solid var(--ff-border-strong);
700
+ border-radius: var(--ff-radius-md);
701
+ font-family: var(--ff-font);
626
702
  font-size: 12px;
627
- color: #18181b;
628
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04), 0 4px 12px rgba(0, 0, 0, 0.06);
703
+ color: var(--ff-fg);
704
+ box-shadow: var(--ff-shadow-md);
629
705
  transition: box-shadow 200ms, border-color 200ms;
630
706
  overflow: hidden;
631
707
  }
632
- .dark .ff-node {
633
- background: #1c1917;
634
- color: #fafafa;
635
- border-color: #3f3f46;
636
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 6px 16px rgba(0, 0, 0, 0.5);
637
- }
638
- @media (prefers-color-scheme: dark) {
639
- .ff-node {
640
- background: #1c1917;
641
- color: #fafafa;
642
- border-color: #3f3f46;
643
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 6px 16px rgba(0, 0, 0, 0.5);
644
- }
708
+ .ff-node:hover {
709
+ border-color: var(--ff-border);
710
+ box-shadow: var(--ff-shadow-lg);
645
711
  }
646
712
  .ff-node--selected {
647
- box-shadow: 0 0 0 2px currentColor, 0 4px 16px rgba(0, 0, 0, 0.20);
713
+ border-color: var(--ff-accent);
714
+ box-shadow: 0 0 0 3px var(--ff-accent-ring), var(--ff-shadow-lg);
648
715
  }
649
716
  .ff-node__header {
650
717
  display: flex;
651
718
  align-items: center;
652
719
  gap: 8px;
653
720
  padding: 7px 10px;
654
- color: white;
721
+ color: #fff;
655
722
  font-weight: 600;
656
723
  }
657
724
  .ff-node__icon {
@@ -662,7 +729,7 @@ svg.react-flow__connectionline {
662
729
  font-size: 10px;
663
730
  letter-spacing: 0.06em;
664
731
  font-weight: 700;
665
- opacity: 0.85;
732
+ opacity: 0.9;
666
733
  text-transform: uppercase;
667
734
  }
668
735
  .ff-node__label {
@@ -673,15 +740,7 @@ svg.react-flow__connectionline {
673
740
  margin: 0;
674
741
  padding: 8px 10px 0;
675
742
  font-size: 11px;
676
- color: #71717a;
677
- }
678
- .dark .ff-node__desc {
679
- color: #a1a1aa;
680
- }
681
- @media (prefers-color-scheme: dark) {
682
- .ff-node__desc {
683
- color: #a1a1aa;
684
- }
743
+ color: var(--ff-fg-subtle);
685
744
  }
686
745
  .ff-node__body {
687
746
  padding: 8px 10px 10px;
@@ -690,31 +749,20 @@ svg.react-flow__connectionline {
690
749
  margin: 0;
691
750
  padding: 4px 10px 8px;
692
751
  font-size: 11px;
693
- color: #71717a;
694
- }
695
- .dark .ff-node__status-text {
696
- color: #a1a1aa;
697
- }
698
- @media (prefers-color-scheme: dark) {
699
- .ff-node__status-text {
700
- color: #a1a1aa;
701
- }
752
+ color: var(--ff-fg-subtle);
702
753
  }
703
754
  .ff-node--status-error .ff-node__status-text {
704
- color: #dc2626;
705
- }
706
- .dark .ff-node--status-error .ff-node__status-text {
707
- color: #f87171;
755
+ color: var(--ff-danger);
708
756
  }
709
757
  .ff-node--status-running {
710
758
  animation: ff-pulse 1.4s ease-in-out infinite;
711
759
  }
712
760
  @keyframes ff-pulse {
713
761
  0%, 100% {
714
- box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4), 0 4px 12px rgba(0, 0, 0, 0.06);
762
+ box-shadow: 0 0 0 0 var(--ff-accent-ring), var(--ff-shadow-md);
715
763
  }
716
764
  50% {
717
- box-shadow: 0 0 0 6px rgba(59, 130, 246, 0.05), 0 4px 12px rgba(0, 0, 0, 0.06);
765
+ box-shadow: 0 0 0 6px transparent, var(--ff-shadow-md);
718
766
  }
719
767
  }
720
768
  .ff-node__dot {
@@ -740,41 +788,45 @@ svg.react-flow__connectionline {
740
788
  display: flex;
741
789
  justify-content: space-between;
742
790
  font-size: 11px;
743
- color: #71717a;
791
+ color: var(--ff-fg-subtle);
744
792
  }
745
- .dark .ff-subgraph__meta {
746
- color: #a1a1aa;
793
+ .ff-node__summary {
794
+ list-style: none;
795
+ padding: 0;
796
+ margin: 0;
797
+ display: flex;
798
+ flex-direction: column;
799
+ gap: 2px;
747
800
  }
748
- @media (prefers-color-scheme: dark) {
749
- .ff-subgraph__meta {
750
- color: #a1a1aa;
751
- }
801
+ .ff-node__summary li {
802
+ display: flex;
803
+ gap: 6px;
804
+ font-size: 11px;
752
805
  }
753
- .ff-note {
754
- background: #fef3c7;
755
- border: 1px solid rgba(0, 0, 0, 0.06);
756
- border-radius: 6px;
757
- padding: 8px 10px;
758
- font-family:
759
- ui-sans-serif,
760
- system-ui,
761
- sans-serif;
762
- font-size: 12px;
763
- color: #1f2937;
764
- min-width: 180px;
765
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06), 0 4px 12px rgba(0, 0, 0, 0.06);
766
- color-scheme: light;
806
+ .ff-node__summary-key {
807
+ color: var(--ff-fg-subtle);
767
808
  }
768
- .ff-note--selected {
769
- box-shadow: 0 0 0 2px #a855f7, 0 4px 12px rgba(0, 0, 0, 0.2);
809
+ .ff-node__summary-value {
810
+ font-family: var(--ff-mono);
770
811
  }
771
- .ff-note__title {
772
- font-weight: 600;
773
- margin-bottom: 4px;
812
+ .ff-node__summary-more {
813
+ color: var(--ff-fg-subtle);
814
+ font-size: 10px;
774
815
  }
775
- .ff-note__body {
816
+ .ff-node__body-empty {
817
+ font-size: 11px;
818
+ color: var(--ff-fg-faint);
819
+ font-style: italic;
820
+ }
821
+ .ff-node__output {
776
822
  margin: 0;
777
- white-space: pre-wrap;
823
+ padding: 4px 10px 8px;
824
+ font-size: 11px;
825
+ font-family: var(--ff-mono);
826
+ color: var(--ff-feed-ok);
827
+ overflow: hidden;
828
+ text-overflow: ellipsis;
829
+ white-space: nowrap;
778
830
  }
779
831
  .react-flow__node-trigger,
780
832
  .react-flow__node-action,
@@ -791,176 +843,272 @@ svg.react-flow__connectionline {
791
843
  .react-flow__handle {
792
844
  width: 10px;
793
845
  height: 10px;
794
- background: white;
795
- border: 2px solid #94a3b8;
846
+ background: var(--ff-surface);
847
+ border: 2px solid var(--ff-border-strong);
796
848
  border-radius: 50%;
797
849
  }
798
- .dark .react-flow__handle {
799
- background: #18181b;
800
- border-color: #71717a;
801
- }
802
- @media (prefers-color-scheme: dark) {
803
- .react-flow__handle {
804
- background: #18181b;
805
- border-color: #71717a;
806
- }
807
- }
808
850
  .react-flow__handle:hover {
809
- background: #3b82f6;
810
- border-color: #3b82f6;
851
+ background: var(--ff-accent);
852
+ border-color: var(--ff-accent);
811
853
  }
812
- .dark .react-flow__edge-path {
813
- stroke: #71717a;
814
- }
815
- @media (prefers-color-scheme: dark) {
816
- .react-flow__edge-path {
817
- stroke: #71717a;
818
- }
854
+ .react-flow__edge-path {
855
+ stroke: var(--ff-edge);
819
856
  }
820
857
  .react-flow__connection-path {
821
- stroke: #3b82f6;
858
+ stroke: var(--ff-accent);
822
859
  stroke-width: 2;
823
860
  }
824
- .dark .react-flow__controls,
825
- .react-flow__controls.ff-controls {
861
+ .react-flow__controls {
826
862
  background: transparent;
827
863
  box-shadow: none;
828
864
  }
829
- .dark .react-flow__controls .react-flow__controls-button {
830
- background: #18181b !important;
831
- border-color: #3f3f46 !important;
832
- border-bottom-color: #3f3f46 !important;
833
- color: #fafafa !important;
865
+ .react-flow__controls .react-flow__controls-button {
866
+ background: var(--ff-surface) !important;
867
+ border-color: var(--ff-border) !important;
868
+ border-bottom-color: var(--ff-border) !important;
869
+ color: var(--ff-fg) !important;
870
+ border-radius: var(--ff-radius-sm);
834
871
  }
835
- .dark .react-flow__controls .react-flow__controls-button:hover {
836
- background: #27272a !important;
872
+ .react-flow__controls .react-flow__controls-button:hover {
873
+ background: var(--ff-surface-3) !important;
837
874
  }
838
- .dark .react-flow__controls .react-flow__controls-button svg,
839
- .dark .react-flow__controls .react-flow__controls-button svg path,
840
- .dark .react-flow__controls .react-flow__controls-button svg polyline,
841
- .dark .react-flow__controls .react-flow__controls-button svg polygon {
875
+ .react-flow__controls .react-flow__controls-button svg,
876
+ .react-flow__controls .react-flow__controls-button svg path,
877
+ .react-flow__controls .react-flow__controls-button svg polyline,
878
+ .react-flow__controls .react-flow__controls-button svg polygon {
842
879
  fill: currentColor !important;
843
880
  stroke: currentColor !important;
844
881
  }
882
+ .react-flow__resize-control.line {
883
+ border-color: var(--ff-accent-ring);
884
+ }
885
+ .react-flow__resize-control.handle {
886
+ width: 8px;
887
+ height: 8px;
888
+ border-radius: 2px;
889
+ border: 1px solid var(--ff-surface);
890
+ background: var(--ff-accent);
891
+ }
892
+ .ff-lane {
893
+ width: 100%;
894
+ height: 100%;
895
+ box-sizing: border-box;
896
+ background: var(--ff-accent-soft);
897
+ border: 1px dashed var(--ff-border-strong);
898
+ border-radius: var(--ff-radius-md);
899
+ overflow: hidden;
900
+ }
901
+ .ff-lane--selected {
902
+ border-style: solid;
903
+ border-color: var(--ff-accent);
904
+ }
905
+ .ff-lane__header {
906
+ display: flex;
907
+ align-items: center;
908
+ height: 22px;
909
+ padding: 0 8px;
910
+ color: #fff;
911
+ font-size: 11px;
912
+ font-weight: 600;
913
+ font-family: var(--ff-font);
914
+ border-radius: 7px 7px 0 0;
915
+ }
916
+ .ff-lane__title {
917
+ overflow: hidden;
918
+ text-overflow: ellipsis;
919
+ white-space: nowrap;
920
+ }
921
+ .ff-note {
922
+ width: 100%;
923
+ height: 100%;
924
+ box-sizing: border-box;
925
+ padding: 8px 10px;
926
+ border: 1px solid transparent;
927
+ border-radius: var(--ff-radius-md);
928
+ font-family: var(--ff-font);
929
+ box-shadow: var(--ff-shadow-sm);
930
+ overflow: hidden;
931
+ display: flex;
932
+ flex-direction: column;
933
+ gap: 4px;
934
+ }
935
+ .ff-note--selected {
936
+ box-shadow: 0 0 0 2px currentColor;
937
+ }
938
+ .ff-note__title {
939
+ font-size: 11px;
940
+ font-weight: 700;
941
+ text-transform: uppercase;
942
+ letter-spacing: 0.04em;
943
+ }
944
+ .ff-note__body {
945
+ flex: 1;
946
+ min-height: 0;
947
+ font-size: 12px;
948
+ line-height: 1.5;
949
+ color: var(--ff-fg-muted);
950
+ white-space: pre-wrap;
951
+ overflow: auto;
952
+ }
953
+ .ff-note__placeholder {
954
+ color: var(--ff-fg-faint);
955
+ font-style: italic;
956
+ }
957
+ .ff-note__input {
958
+ flex: 1;
959
+ min-height: 0;
960
+ width: 100%;
961
+ resize: none;
962
+ border: none;
963
+ outline: none;
964
+ background: transparent;
965
+ font: inherit;
966
+ font-size: 12px;
967
+ line-height: 1.5;
968
+ color: inherit;
969
+ }
845
970
  .ff-run-controls {
846
971
  display: flex;
847
972
  gap: 6px;
848
973
  }
849
974
  .ff-run-controls__btn {
850
- border: 0;
851
- border-radius: 6px;
975
+ border: 1px solid var(--ff-border);
976
+ border-radius: var(--ff-radius-sm);
852
977
  padding: 6px 12px;
853
978
  font: inherit;
854
979
  font-size: 12px;
855
980
  font-weight: 500;
856
981
  cursor: pointer;
857
- background: #e4e4e7;
858
- color: #18181b;
982
+ background: var(--ff-surface);
983
+ color: var(--ff-fg);
984
+ transition: background 150ms, border-color 150ms;
859
985
  }
860
- .dark .ff-run-controls__btn {
861
- background: #27272a;
862
- color: #fafafa;
986
+ .ff-run-controls__btn:hover:not(:disabled) {
987
+ background: var(--ff-surface-3);
863
988
  }
864
989
  .ff-run-controls__btn--run {
865
- background: #10b981;
866
- color: white;
990
+ background: var(--ff-run);
991
+ border-color: var(--ff-run-hover);
992
+ color: #fff;
867
993
  }
868
- .dark .ff-run-controls__btn--run {
869
- background: #10b981;
870
- color: white;
994
+ .ff-run-controls__btn--run:hover:not(:disabled) {
995
+ background: var(--ff-run-hover);
871
996
  }
872
997
  .ff-run-controls__btn--cancel {
873
- background: #ef4444;
874
- color: white;
998
+ background: var(--ff-danger);
999
+ border-color: var(--ff-danger);
1000
+ color: #fff;
875
1001
  }
876
1002
  .ff-run-controls__btn:disabled {
877
1003
  opacity: 0.5;
878
1004
  cursor: default;
879
1005
  }
880
1006
  .ff-run-feed {
881
- font-family: ui-monospace, monospace;
882
- font-size: 11px;
883
- background: #0a0a0a;
884
- color: #fafafa;
885
- border-radius: 8px;
886
- padding: 8px 10px;
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ font-family: var(--ff-mono);
1010
+ background: var(--ff-surface-2);
1011
+ color: var(--ff-fg);
1012
+ border: 1px solid var(--ff-border);
1013
+ border-radius: var(--ff-radius-md);
1014
+ overflow: hidden;
1015
+ max-height: 260px;
1016
+ }
1017
+ .ff-run-feed__header {
1018
+ display: flex;
1019
+ align-items: center;
1020
+ gap: 8px;
1021
+ padding: 7px 12px;
1022
+ border-bottom: 1px solid var(--ff-border);
1023
+ font-family: var(--ff-font);
1024
+ font-size: 11.5px;
1025
+ font-weight: 600;
1026
+ color: var(--ff-fg-muted);
1027
+ flex-shrink: 0;
1028
+ }
1029
+ .ff-run-feed__title {
1030
+ color: var(--ff-accent);
1031
+ font-family: var(--ff-mono);
1032
+ }
1033
+ .ff-run-feed__badge {
1034
+ font-family: var(--ff-font);
1035
+ font-size: 10px;
1036
+ font-weight: 600;
1037
+ color: var(--ff-warn);
1038
+ background: var(--ff-warn-soft);
1039
+ padding: 1px 8px;
1040
+ border-radius: 999px;
1041
+ }
1042
+ .ff-run-feed__count {
1043
+ margin-left: auto;
1044
+ font-family: var(--ff-mono);
1045
+ font-size: 10.5px;
1046
+ color: var(--ff-fg-faint);
1047
+ }
1048
+ .ff-run-feed__body {
1049
+ flex: 1;
1050
+ min-height: 0;
887
1051
  overflow: auto;
888
- max-height: 240px;
889
- border: 1px solid #1f1f23;
1052
+ padding: 8px 12px;
1053
+ font-size: 11px;
1054
+ line-height: 1.7;
890
1055
  }
891
1056
  .ff-run-feed__empty {
892
- color: #71717a;
1057
+ color: var(--ff-fg-subtle);
893
1058
  margin: 0;
894
1059
  }
895
1060
  .ff-run-feed__row {
896
1061
  display: flex;
897
- gap: 8px;
1062
+ gap: 9px;
898
1063
  padding: 1px 0;
899
- }
900
- .ff-run-feed__row--error .ff-run-feed__text {
901
- color: #f87171;
902
- }
903
- .ff-run-feed__row--warn .ff-run-feed__text {
904
- color: #fbbf24;
905
- }
906
- .ff-run-feed__row--status .ff-run-feed__text {
907
- color: #93c5fd;
1064
+ white-space: pre-wrap;
1065
+ word-break: break-word;
908
1066
  }
909
1067
  .ff-run-feed__time {
910
- color: #71717a;
1068
+ color: var(--ff-fg-faint);
1069
+ flex-shrink: 0;
911
1070
  }
912
1071
  .ff-run-feed__node {
913
- color: #c4b5fd;
1072
+ color: var(--ff-feed-node);
1073
+ flex-shrink: 0;
914
1074
  }
915
1075
  .ff-run-feed__text {
916
1076
  flex: 1;
1077
+ min-width: 0;
917
1078
  }
918
- .ff-node__summary {
919
- list-style: none;
920
- padding: 0;
921
- margin: 0;
922
- display: flex;
923
- flex-direction: column;
924
- gap: 2px;
925
- }
926
- .ff-node__summary li {
927
- display: flex;
928
- gap: 6px;
929
- font-size: 11px;
930
- }
931
- .ff-node__summary-key {
932
- color: #71717a;
933
- }
934
- .dark .ff-node__summary-key {
935
- color: #a1a1aa;
936
- }
937
- .ff-node__summary-value {
938
- font-family: ui-monospace, monospace;
1079
+ .ff-run-feed__row--error .ff-run-feed__text {
1080
+ color: var(--ff-danger);
939
1081
  }
940
- .ff-node__summary-more {
941
- color: #71717a;
942
- font-size: 10px;
1082
+ .ff-run-feed__row--warn .ff-run-feed__text {
1083
+ color: var(--ff-warn);
943
1084
  }
944
- .ff-node__body-empty {
945
- font-size: 11px;
946
- color: #a1a1aa;
947
- font-style: italic;
1085
+ .ff-run-feed__row--status .ff-run-feed__text {
1086
+ color: var(--ff-feed-node);
948
1087
  }
949
1088
  .ff-editor {
950
1089
  display: grid;
951
- grid-template-columns: 220px 1fr 320px;
952
- gap: 12px;
953
- font-family:
954
- ui-sans-serif,
955
- system-ui,
956
- sans-serif;
1090
+ grid-template-columns: 216px 1fr 300px;
1091
+ gap: 0;
1092
+ font-family: var(--ff-font);
1093
+ background: var(--ff-surface);
1094
+ border: 1px solid var(--ff-border);
1095
+ border-radius: var(--ff-radius);
1096
+ overflow: hidden;
1097
+ box-shadow: var(--ff-shadow-md);
957
1098
  }
958
1099
  .ff-editor__main {
959
1100
  display: flex;
960
1101
  flex-direction: column;
961
- gap: 8px;
962
1102
  min-width: 0;
1103
+ min-height: 0;
963
1104
  position: relative;
1105
+ background: var(--ff-canvas-bg);
1106
+ }
1107
+ .ff-editor__main .ff-canvas {
1108
+ flex: 1;
1109
+ min-height: 0;
1110
+ border: none;
1111
+ border-radius: 0;
964
1112
  }
965
1113
  .ff-editor__empty {
966
1114
  position: absolute;
@@ -974,33 +1122,52 @@ svg.react-flow__connectionline {
974
1122
  .ff-editor__empty > * {
975
1123
  pointer-events: auto;
976
1124
  }
1125
+ .ff-editor__palette {
1126
+ border: none;
1127
+ border-right: 1px solid var(--ff-border);
1128
+ border-radius: 0;
1129
+ background: var(--ff-surface-2);
1130
+ }
977
1131
  .ff-editor__panel-wrap {
978
1132
  display: flex;
979
1133
  flex-direction: column;
980
- gap: 8px;
981
1134
  min-height: 0;
1135
+ border-left: 1px solid var(--ff-border);
1136
+ background: var(--ff-surface-2);
1137
+ }
1138
+ .ff-editor__panel {
1139
+ flex: 1;
1140
+ min-height: 0;
1141
+ border: none;
1142
+ border-radius: 0;
1143
+ background: transparent;
982
1144
  }
983
1145
  .ff-editor__panel-footer {
984
1146
  flex-shrink: 0;
985
1147
  display: flex;
986
1148
  flex-wrap: wrap;
987
1149
  gap: 6px;
1150
+ padding: 0 12px 12px;
1151
+ }
1152
+ .ff-editor__feed {
1153
+ flex-shrink: 0;
1154
+ height: 168px;
1155
+ max-height: none;
1156
+ border: none;
1157
+ border-top: 1px solid var(--ff-border);
1158
+ border-radius: 0;
988
1159
  }
989
1160
  .ff-editor__ctx {
990
1161
  position: fixed;
991
1162
  z-index: 50;
992
- min-width: 140px;
1163
+ min-width: 150px;
993
1164
  padding: 4px;
994
1165
  display: flex;
995
1166
  flex-direction: column;
996
- background: white;
997
- border: 1px solid #d4d4d8;
998
- border-radius: 8px;
999
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
1000
- }
1001
- .dark .ff-editor__ctx {
1002
- background: #18181b;
1003
- border-color: #3f3f46;
1167
+ background: var(--ff-surface);
1168
+ border: 1px solid var(--ff-border-strong);
1169
+ border-radius: var(--ff-radius-md);
1170
+ box-shadow: var(--ff-shadow-lg);
1004
1171
  }
1005
1172
  .ff-editor__ctx-item {
1006
1173
  border: 0;
@@ -1013,129 +1180,109 @@ svg.react-flow__connectionline {
1013
1180
  color: inherit;
1014
1181
  }
1015
1182
  .ff-editor__ctx-item:hover {
1016
- background: rgba(0, 0, 0, 0.05);
1017
- }
1018
- .dark .ff-editor__ctx-item:hover {
1019
- background: #27272a;
1183
+ background: var(--ff-surface-3);
1020
1184
  }
1021
1185
  .ff-editor__ctx-item--danger {
1022
- color: #dc2626;
1023
- }
1024
- .dark .ff-editor__ctx-item--danger {
1025
- color: #f87171;
1026
- }
1027
- .ff-editor__feed {
1028
- flex-shrink: 0;
1186
+ color: var(--ff-danger);
1029
1187
  }
1030
1188
  .ff-editor__sep {
1031
1189
  width: 1px;
1032
1190
  align-self: stretch;
1033
- background: #e4e4e7;
1034
- }
1035
- .dark .ff-editor__sep {
1036
- background: #3f3f46;
1191
+ background: var(--ff-border);
1192
+ margin: 0 3px;
1037
1193
  }
1038
1194
  .ff-editor__btn {
1039
- border: 1px solid #d4d4d8;
1040
- background: transparent;
1195
+ display: inline-flex;
1196
+ align-items: center;
1197
+ gap: 6px;
1198
+ border: 1px solid var(--ff-border);
1199
+ background: var(--ff-surface);
1041
1200
  cursor: pointer;
1042
- border-radius: 6px;
1043
- padding: 4px 10px;
1044
- color: inherit;
1201
+ border-radius: var(--ff-radius-sm);
1202
+ padding: 5px 11px;
1203
+ color: var(--ff-fg-muted);
1045
1204
  font-size: 12px;
1205
+ font-weight: 500;
1206
+ transition: background 150ms, color 150ms;
1046
1207
  }
1047
1208
  .ff-editor__btn:hover:not(:disabled) {
1048
- background: rgba(0, 0, 0, 0.04);
1209
+ background: var(--ff-surface-3);
1210
+ color: var(--ff-fg);
1049
1211
  }
1050
1212
  .ff-editor__btn:disabled {
1051
1213
  opacity: 0.45;
1052
1214
  cursor: not-allowed;
1053
1215
  }
1054
- .dark .ff-editor__btn {
1055
- border-color: #3f3f46;
1056
- }
1057
- .dark .ff-editor__btn:hover {
1058
- background: #27272a;
1059
- }
1060
1216
  .ff-editor__count {
1061
1217
  margin-left: auto;
1218
+ font-family: var(--ff-mono);
1062
1219
  font-size: 11px;
1063
- color: #71717a;
1064
- }
1065
- .dark .ff-editor__count {
1066
- color: #a1a1aa;
1220
+ color: var(--ff-fg-faint);
1067
1221
  }
1068
1222
  .ff-palette {
1069
1223
  display: flex;
1070
1224
  flex-direction: column;
1071
- background: white;
1072
- border: 1px solid #e4e4e7;
1073
- border-radius: 12px;
1225
+ background: var(--ff-surface-2);
1226
+ border: 1px solid var(--ff-border);
1227
+ border-radius: var(--ff-radius);
1074
1228
  overflow: hidden;
1075
1229
  font-size: 13px;
1076
- color: #18181b;
1077
- }
1078
- .dark .ff-palette {
1079
- background: #18181b;
1080
- color: #fafafa;
1081
- border-color: #3f3f46;
1230
+ color: var(--ff-fg);
1082
1231
  }
1083
1232
  .ff-palette__search {
1084
- padding: 8px;
1085
- border-bottom: 1px solid #e4e4e7;
1086
- }
1087
- .dark .ff-palette__search {
1088
- border-color: #3f3f46;
1233
+ padding: 10px;
1234
+ border-bottom: 1px solid var(--ff-border);
1089
1235
  }
1090
1236
  .ff-palette__search-input {
1091
1237
  width: 100%;
1092
- padding: 6px 10px;
1093
- border: 1px solid #d4d4d8;
1094
- border-radius: 6px;
1095
- background: transparent;
1238
+ padding: 7px 10px;
1239
+ border: 1px solid var(--ff-border);
1240
+ border-radius: var(--ff-radius-sm);
1241
+ background: var(--ff-surface);
1096
1242
  color: inherit;
1097
1243
  font: inherit;
1244
+ font-size: 12.5px;
1245
+ outline: none;
1246
+ transition: border-color 150ms, box-shadow 150ms;
1098
1247
  }
1099
- .dark .ff-palette__search-input {
1100
- border-color: #3f3f46;
1248
+ .ff-palette__search-input:focus {
1249
+ border-color: var(--ff-accent);
1250
+ box-shadow: 0 0 0 3px var(--ff-accent-soft);
1101
1251
  }
1102
1252
  .ff-palette__list {
1103
1253
  flex: 1;
1104
1254
  overflow: auto;
1105
- padding: 4px;
1255
+ padding: 8px;
1106
1256
  }
1107
1257
  .ff-palette__group {
1108
- padding: 4px 0;
1258
+ padding: 2px 0;
1109
1259
  }
1110
1260
  .ff-palette__group-label {
1111
- font-size: 10px;
1112
- letter-spacing: 0.06em;
1261
+ font-size: 9.5px;
1262
+ letter-spacing: 0.07em;
1113
1263
  text-transform: uppercase;
1114
- color: #71717a;
1115
- padding: 4px 8px;
1116
- }
1117
- .dark .ff-palette__group-label {
1118
- color: #a1a1aa;
1264
+ color: var(--ff-fg-faint);
1265
+ font-weight: 700;
1266
+ padding: 11px 8px 6px;
1119
1267
  }
1120
1268
  .ff-palette__row {
1121
1269
  width: 100%;
1122
1270
  display: flex;
1123
- align-items: center;
1124
- gap: 8px;
1125
- padding: 6px 8px;
1126
- border: 0;
1271
+ align-items: flex-start;
1272
+ gap: 9px;
1273
+ padding: 8px;
1274
+ border: 1px solid transparent;
1127
1275
  background: transparent;
1128
1276
  cursor: grab;
1129
- border-radius: 6px;
1277
+ border-radius: var(--ff-radius-md);
1130
1278
  text-align: left;
1131
1279
  color: inherit;
1132
1280
  font: inherit;
1281
+ transition: background 130ms, border-color 130ms;
1133
1282
  }
1134
1283
  .ff-palette__row:hover {
1135
- background: rgba(0, 0, 0, 0.04);
1136
- }
1137
- .dark .ff-palette__row:hover {
1138
- background: #27272a;
1284
+ background: var(--ff-surface-3);
1285
+ border-color: var(--ff-border);
1139
1286
  }
1140
1287
  .ff-palette__row:active {
1141
1288
  cursor: grabbing;
@@ -1144,7 +1291,7 @@ svg.react-flow__connectionline {
1144
1291
  flex-shrink: 0;
1145
1292
  width: 24px;
1146
1293
  height: 24px;
1147
- border-radius: 6px;
1294
+ border-radius: 7px;
1148
1295
  display: inline-flex;
1149
1296
  align-items: center;
1150
1297
  justify-content: center;
@@ -1157,35 +1304,32 @@ svg.react-flow__connectionline {
1157
1304
  min-width: 0;
1158
1305
  }
1159
1306
  .ff-palette__row-label {
1160
- font-size: 12px;
1161
- font-weight: 500;
1307
+ font-size: 12.5px;
1308
+ font-weight: 600;
1309
+ line-height: 1.2;
1162
1310
  }
1163
1311
  .ff-palette__row-desc {
1164
- font-size: 11px;
1165
- color: #71717a;
1166
- white-space: nowrap;
1312
+ font-size: 10.5px;
1313
+ color: var(--ff-fg-faint);
1314
+ line-height: 1.35;
1315
+ margin-top: 2px;
1167
1316
  overflow: hidden;
1168
1317
  text-overflow: ellipsis;
1169
- }
1170
- .dark .ff-palette__row-desc {
1171
- color: #a1a1aa;
1318
+ display: -webkit-box;
1319
+ -webkit-line-clamp: 1;
1320
+ -webkit-box-orient: vertical;
1172
1321
  }
1173
1322
  .ff-panel {
1174
- background: white;
1175
- border: 1px solid #e4e4e7;
1176
- border-radius: 12px;
1177
- padding: 12px;
1323
+ background: var(--ff-surface-2);
1324
+ border: 1px solid var(--ff-border);
1325
+ border-radius: var(--ff-radius);
1326
+ padding: 14px;
1178
1327
  display: flex;
1179
1328
  flex-direction: column;
1180
- gap: 10px;
1329
+ gap: 12px;
1181
1330
  overflow: auto;
1182
1331
  font-size: 13px;
1183
- color: #18181b;
1184
- }
1185
- .dark .ff-panel {
1186
- background: #18181b;
1187
- color: #fafafa;
1188
- border-color: #3f3f46;
1332
+ color: var(--ff-fg);
1189
1333
  }
1190
1334
  .ff-panel--empty {
1191
1335
  align-items: center;
@@ -1193,38 +1337,64 @@ svg.react-flow__connectionline {
1193
1337
  }
1194
1338
  .ff-panel__empty {
1195
1339
  font-size: 12px;
1196
- color: #a1a1aa;
1340
+ color: var(--ff-fg-faint);
1341
+ text-align: center;
1197
1342
  }
1198
1343
  .ff-panel__header {
1344
+ display: flex;
1345
+ align-items: center;
1346
+ gap: 10px;
1347
+ }
1348
+ .ff-panel__head-icon {
1349
+ flex-shrink: 0;
1350
+ width: 28px;
1351
+ height: 28px;
1352
+ border-radius: var(--ff-radius-sm);
1353
+ display: grid;
1354
+ place-items: center;
1355
+ color: #fff;
1356
+ font-size: 15px;
1357
+ }
1358
+ .ff-panel__head-text {
1199
1359
  display: flex;
1200
1360
  flex-direction: column;
1201
- gap: 4px;
1361
+ min-width: 0;
1362
+ gap: 1px;
1363
+ }
1364
+ .ff-panel__head-kind {
1365
+ font-size: 9.5px;
1366
+ font-weight: 700;
1367
+ letter-spacing: 0.06em;
1368
+ text-transform: uppercase;
1369
+ color: var(--ff-fg-faint);
1370
+ }
1371
+ .ff-panel__head-name {
1372
+ font-size: 13.5px;
1373
+ font-weight: 600;
1374
+ overflow: hidden;
1375
+ text-overflow: ellipsis;
1376
+ white-space: nowrap;
1202
1377
  }
1203
1378
  .ff-panel__kind-tag {
1204
1379
  align-self: flex-start;
1205
1380
  font-size: 10px;
1206
1381
  letter-spacing: 0.06em;
1207
1382
  text-transform: uppercase;
1208
- background: rgba(168, 85, 247, 0.12);
1209
- color: #a855f7;
1383
+ background: var(--ff-accent-soft);
1384
+ color: var(--ff-accent);
1210
1385
  padding: 2px 8px;
1211
1386
  border-radius: 999px;
1212
1387
  }
1213
1388
  .ff-panel__kind-desc {
1214
1389
  margin: 0;
1215
1390
  font-size: 12px;
1216
- color: #71717a;
1217
- }
1218
- .dark .ff-panel__kind-desc {
1219
- color: #a1a1aa;
1391
+ color: var(--ff-fg-subtle);
1392
+ line-height: 1.5;
1220
1393
  }
1221
1394
  .ff-panel__divider {
1222
1395
  border: 0;
1223
- border-top: 1px solid #e4e4e7;
1224
- margin: 4px 0;
1225
- }
1226
- .dark .ff-panel__divider {
1227
- border-top-color: #3f3f46;
1396
+ border-top: 1px solid var(--ff-border);
1397
+ margin: 2px 0;
1228
1398
  }
1229
1399
  .ff-panel__actions {
1230
1400
  margin-top: auto;
@@ -1232,73 +1402,66 @@ svg.react-flow__connectionline {
1232
1402
  }
1233
1403
  .ff-panel__delete {
1234
1404
  width: 100%;
1235
- padding: 7px 10px;
1405
+ padding: 8px 10px;
1236
1406
  font-size: 13px;
1237
1407
  font-weight: 500;
1238
- color: #dc2626;
1408
+ color: var(--ff-danger);
1239
1409
  background: transparent;
1240
- border: 1px solid #fca5a5;
1241
- border-radius: 6px;
1410
+ border: 1px solid var(--ff-danger);
1411
+ border-radius: var(--ff-radius-sm);
1242
1412
  cursor: pointer;
1413
+ opacity: 0.85;
1414
+ transition: opacity 150ms, background 150ms;
1243
1415
  }
1244
1416
  .ff-panel__delete:hover {
1245
- background: #fef2f2;
1246
- border-color: #dc2626;
1247
- }
1248
- .dark .ff-panel__delete {
1249
- color: #f87171;
1250
- border-color: #7f1d1d;
1251
- }
1252
- .dark .ff-panel__delete:hover {
1253
- background: rgba(127, 29, 29, 0.25);
1254
- border-color: #f87171;
1417
+ opacity: 1;
1418
+ background: rgba(239, 68, 68, 0.08);
1255
1419
  }
1256
1420
  .ff-panel__field {
1257
1421
  display: flex;
1258
1422
  flex-direction: column;
1259
- gap: 4px;
1423
+ gap: 5px;
1260
1424
  }
1261
1425
  .ff-panel__label {
1262
1426
  font-size: 12px;
1263
- font-weight: 500;
1427
+ font-weight: 600;
1428
+ color: var(--ff-fg-muted);
1264
1429
  }
1265
1430
  .ff-panel__hint {
1266
1431
  font-size: 11px;
1267
- color: #71717a;
1432
+ color: var(--ff-fg-faint);
1268
1433
  margin: 0;
1269
- }
1270
- .dark .ff-panel__hint {
1271
- color: #a1a1aa;
1434
+ line-height: 1.4;
1272
1435
  }
1273
1436
  .ff-panel__required {
1274
- color: #dc2626;
1437
+ color: var(--ff-danger);
1275
1438
  }
1276
1439
  .ff-panel__input {
1277
1440
  width: 100%;
1278
- padding: 6px 8px;
1279
- border: 1px solid #d4d4d8;
1280
- border-radius: 6px;
1281
- background: transparent;
1441
+ padding: 7px 10px;
1442
+ border: 1px solid var(--ff-border);
1443
+ border-radius: var(--ff-radius-sm);
1444
+ background: var(--ff-surface);
1282
1445
  color: inherit;
1283
1446
  font: inherit;
1284
- font-size: 12px;
1447
+ font-size: 12.5px;
1285
1448
  box-sizing: border-box;
1449
+ outline: none;
1450
+ transition: border-color 150ms, box-shadow 150ms;
1286
1451
  }
1287
1452
  .ff-panel__input:focus {
1288
- outline: 2px solid #a855f7;
1289
- outline-offset: -1px;
1290
- }
1291
- .dark .ff-panel__input {
1292
- border-color: #3f3f46;
1453
+ border-color: var(--ff-accent);
1454
+ box-shadow: 0 0 0 3px var(--ff-accent-soft);
1293
1455
  }
1294
1456
  .ff-panel__input--textarea {
1295
1457
  font-family: inherit;
1296
1458
  resize: vertical;
1459
+ line-height: 1.5;
1297
1460
  }
1298
1461
  .ff-panel__input--expression,
1299
1462
  .ff-panel__input--json {
1300
- font-family: ui-monospace, monospace;
1301
- font-size: 11px;
1463
+ font-family: var(--ff-mono);
1464
+ font-size: 11.5px;
1302
1465
  }
1303
1466
  .ff-panel__switch {
1304
1467
  display: inline-flex;
@@ -1311,7 +1474,7 @@ svg.react-flow__connectionline {
1311
1474
  .ff-panel__switch-slider {
1312
1475
  width: 32px;
1313
1476
  height: 18px;
1314
- background: #d4d4d8;
1477
+ background: var(--ff-border-strong);
1315
1478
  border-radius: 999px;
1316
1479
  position: relative;
1317
1480
  transition: background 200ms;
@@ -1323,12 +1486,12 @@ svg.react-flow__connectionline {
1323
1486
  top: 2px;
1324
1487
  width: 14px;
1325
1488
  height: 14px;
1326
- background: white;
1489
+ background: #fff;
1327
1490
  border-radius: 50%;
1328
1491
  transition: left 200ms;
1329
1492
  }
1330
1493
  .ff-panel__switch input:checked + .ff-panel__switch-slider {
1331
- background: #a855f7;
1494
+ background: var(--ff-accent);
1332
1495
  }
1333
1496
  .ff-panel__switch input:checked + .ff-panel__switch-slider::before {
1334
1497
  left: 16px;
@@ -1338,12 +1501,9 @@ svg.react-flow__connectionline {
1338
1501
  }
1339
1502
  .ff-panel__issue {
1340
1503
  font-size: 11px;
1341
- color: #b45309;
1504
+ color: var(--ff-warn);
1342
1505
  margin: 2px 0;
1343
1506
  }
1344
- .dark .ff-panel__issue {
1345
- color: #fbbf24;
1346
- }
1347
1507
  .ff-repeater {
1348
1508
  display: flex;
1349
1509
  flex-direction: column;
@@ -1351,25 +1511,18 @@ svg.react-flow__connectionline {
1351
1511
  }
1352
1512
  .ff-repeater__empty {
1353
1513
  font-size: 11px;
1354
- color: #71717a;
1514
+ color: var(--ff-fg-subtle);
1355
1515
  margin: 0;
1356
1516
  font-style: italic;
1357
1517
  }
1358
- .dark .ff-repeater__empty {
1359
- color: #a1a1aa;
1360
- }
1361
1518
  .ff-repeater__row {
1362
1519
  display: flex;
1363
1520
  flex-direction: column;
1364
1521
  gap: 6px;
1365
- border: 1px solid #e4e4e7;
1366
- border-radius: 6px;
1367
- padding: 8px;
1368
- background: #fafafa;
1369
- }
1370
- .dark .ff-repeater__row {
1371
- border-color: #3f3f46;
1372
- background: #27272a;
1522
+ border: 1px solid var(--ff-border);
1523
+ border-radius: var(--ff-radius-sm);
1524
+ padding: 10px;
1525
+ background: var(--ff-surface);
1373
1526
  }
1374
1527
  .ff-repeater__row-head {
1375
1528
  display: flex;
@@ -1380,14 +1533,11 @@ svg.react-flow__connectionline {
1380
1533
  .ff-repeater__row-title {
1381
1534
  font-size: 11px;
1382
1535
  font-weight: 600;
1383
- color: #52525b;
1536
+ color: var(--ff-fg-muted);
1384
1537
  overflow: hidden;
1385
1538
  text-overflow: ellipsis;
1386
1539
  white-space: nowrap;
1387
1540
  }
1388
- .dark .ff-repeater__row-title {
1389
- color: #d4d4d8;
1390
- }
1391
1541
  .ff-repeater__row-actions {
1392
1542
  display: flex;
1393
1543
  gap: 2px;
@@ -1401,27 +1551,19 @@ svg.react-flow__connectionline {
1401
1551
  font-size: 11px;
1402
1552
  line-height: 1;
1403
1553
  padding: 3px 5px;
1404
- color: #71717a;
1554
+ color: var(--ff-fg-subtle);
1405
1555
  }
1406
1556
  .ff-repeater__btn:hover:not(:disabled) {
1407
- background: #e4e4e7;
1408
- color: #18181b;
1409
- }
1410
- .dark .ff-repeater__btn:hover:not(:disabled) {
1411
- background: #3f3f46;
1412
- color: #fafafa;
1557
+ background: var(--ff-surface-3);
1558
+ color: var(--ff-fg);
1413
1559
  }
1414
1560
  .ff-repeater__btn:disabled {
1415
1561
  opacity: .35;
1416
1562
  cursor: not-allowed;
1417
1563
  }
1418
1564
  .ff-repeater__btn--danger:hover:not(:disabled) {
1419
- background: #fee2e2;
1420
- color: #b91c1c;
1421
- }
1422
- .dark .ff-repeater__btn--danger:hover:not(:disabled) {
1423
- background: #7f1d1d;
1424
- color: #fecaca;
1565
+ background: rgba(239, 68, 68, 0.12);
1566
+ color: var(--ff-danger);
1425
1567
  }
1426
1568
  .ff-repeater__cell {
1427
1569
  display: flex;
@@ -1430,34 +1572,27 @@ svg.react-flow__connectionline {
1430
1572
  }
1431
1573
  .ff-panel__label--sub {
1432
1574
  font-size: 11px;
1433
- color: #71717a;
1575
+ color: var(--ff-fg-subtle);
1434
1576
  font-weight: 400;
1435
1577
  }
1436
- .dark .ff-panel__label--sub {
1437
- color: #a1a1aa;
1438
- }
1439
1578
  .ff-repeater__add {
1440
1579
  align-self: flex-start;
1441
- border: 1px dashed #d4d4d8;
1580
+ border: 1px dashed var(--ff-border-strong);
1442
1581
  background: transparent;
1443
- border-radius: 6px;
1444
- padding: 5px 10px;
1582
+ border-radius: var(--ff-radius-sm);
1583
+ padding: 6px 11px;
1445
1584
  font-size: 11px;
1446
- color: #52525b;
1585
+ color: var(--ff-fg-muted);
1447
1586
  cursor: pointer;
1448
1587
  }
1449
1588
  .ff-repeater__add:hover:not(:disabled) {
1450
- border-color: #a855f7;
1451
- color: #a855f7;
1589
+ border-color: var(--ff-accent);
1590
+ color: var(--ff-accent);
1452
1591
  }
1453
1592
  .ff-repeater__add:disabled {
1454
1593
  opacity: .4;
1455
1594
  cursor: not-allowed;
1456
1595
  }
1457
- .dark .ff-repeater__add {
1458
- border-color: #52525b;
1459
- color: #d4d4d8;
1460
- }
1461
1596
  .ff-keyvalue {
1462
1597
  display: flex;
1463
1598
  flex-direction: column;
@@ -1474,15 +1609,12 @@ svg.react-flow__connectionline {
1474
1609
  font-size: 10px;
1475
1610
  text-transform: uppercase;
1476
1611
  letter-spacing: .04em;
1477
- color: #a1a1aa;
1612
+ color: var(--ff-fg-faint);
1478
1613
  }
1479
1614
  .ff-panel__hint--missing {
1480
- color: #b45309;
1615
+ color: var(--ff-warn);
1481
1616
  font-style: italic;
1482
1617
  }
1483
- .dark .ff-panel__hint--missing {
1484
- color: #fbbf24;
1485
- }
1486
1618
  .ff-editor__edge-label {
1487
1619
  padding: 6px;
1488
1620
  min-width: 200px;
@@ -1496,156 +1628,36 @@ svg.react-flow__connectionline {
1496
1628
  gap: 6px;
1497
1629
  }
1498
1630
  .ff-rich-preview__frame {
1499
- border: 1px solid #e4e4e7;
1500
- border-radius: 6px;
1631
+ border: 1px solid var(--ff-border);
1632
+ border-radius: var(--ff-radius-sm);
1501
1633
  overflow: hidden;
1502
1634
  max-height: 180px;
1503
- background: #fff;
1504
- }
1505
- .dark .ff-rich-preview__frame {
1506
- border-color: #3f3f46;
1507
- background: #18181b;
1635
+ background: var(--ff-surface);
1508
1636
  }
1509
1637
  .ff-rich-preview__unavailable {
1510
- border: 1px dashed #d4d4d8;
1511
- border-radius: 6px;
1638
+ border: 1px dashed var(--ff-border-strong);
1639
+ border-radius: var(--ff-radius-sm);
1512
1640
  padding: 10px;
1513
1641
  font-size: 11px;
1514
- color: #71717a;
1642
+ color: var(--ff-fg-subtle);
1515
1643
  line-height: 1.5;
1516
1644
  }
1517
- .dark .ff-rich-preview__unavailable {
1518
- border-color: #52525b;
1519
- color: #a1a1aa;
1520
- }
1521
1645
  .ff-rich-preview__unavailable code {
1522
1646
  font-size: 10px;
1523
- background: #f4f4f5;
1647
+ background: var(--ff-surface-3);
1524
1648
  padding: 1px 4px;
1525
1649
  border-radius: 3px;
1526
1650
  }
1527
- .dark .ff-rich-preview__unavailable code {
1528
- background: #27272a;
1529
- }
1530
1651
  .ff-rich-preview__title {
1531
1652
  font-size: 11px;
1532
1653
  font-weight: 600;
1533
- color: #52525b;
1534
- }
1535
- .dark .ff-rich-preview__title {
1536
- color: #d4d4d8;
1654
+ color: var(--ff-fg-muted);
1537
1655
  }
1538
1656
  .ff-node--resizable {
1539
1657
  max-width: none;
1540
1658
  width: 100%;
1541
1659
  height: 100%;
1542
1660
  }
1543
- .react-flow__resize-control.line {
1544
- border-color: rgba(0, 0, 0, 0.15);
1545
- }
1546
- .react-flow__resize-control.handle {
1547
- width: 8px;
1548
- height: 8px;
1549
- border-radius: 2px;
1550
- border: 1px solid #fff;
1551
- }
1552
- .dark .react-flow__resize-control.line {
1553
- border-color: rgba(255, 255, 255, 0.18);
1554
- }
1555
- .dark .react-flow__resize-control.handle {
1556
- border-color: #1c1917;
1557
- }
1558
- .ff-lane {
1559
- width: 100%;
1560
- height: 100%;
1561
- box-sizing: border-box;
1562
- background: rgba(100, 116, 139, 0.06);
1563
- border: 1px dashed #cbd5e1;
1564
- border-radius: 8px;
1565
- overflow: hidden;
1566
- }
1567
- .ff-lane--selected {
1568
- border-style: solid;
1569
- }
1570
- .ff-lane__header {
1571
- display: flex;
1572
- align-items: center;
1573
- height: 22px;
1574
- padding: 0 8px;
1575
- color: #fff;
1576
- font-size: 11px;
1577
- font-weight: 600;
1578
- font-family:
1579
- ui-sans-serif,
1580
- system-ui,
1581
- sans-serif;
1582
- border-radius: 7px 7px 0 0;
1583
- }
1584
- .ff-lane__title {
1585
- overflow: hidden;
1586
- text-overflow: ellipsis;
1587
- white-space: nowrap;
1588
- }
1589
- .ff-note {
1590
- width: 100%;
1591
- height: 100%;
1592
- box-sizing: border-box;
1593
- padding: 8px 10px;
1594
- border: 1px solid transparent;
1595
- border-radius: 8px;
1596
- font-family:
1597
- ui-sans-serif,
1598
- system-ui,
1599
- sans-serif;
1600
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
1601
- overflow: hidden;
1602
- display: flex;
1603
- flex-direction: column;
1604
- gap: 4px;
1605
- }
1606
- .ff-note--selected {
1607
- box-shadow: 0 0 0 1px currentColor;
1608
- }
1609
- .ff-note__title {
1610
- font-size: 11px;
1611
- font-weight: 700;
1612
- text-transform: uppercase;
1613
- letter-spacing: 0.04em;
1614
- }
1615
- .ff-note__body {
1616
- flex: 1;
1617
- min-height: 0;
1618
- font-size: 12px;
1619
- line-height: 1.5;
1620
- color: #3f3f46;
1621
- white-space: pre-wrap;
1622
- overflow: auto;
1623
- }
1624
- .dark .ff-note__body {
1625
- color: #e4e4e7;
1626
- }
1627
- @media (prefers-color-scheme: dark) {
1628
- .ff-note__body:not(.ff-canvas--light *) {
1629
- color: #e4e4e7;
1630
- }
1631
- }
1632
- .ff-note__placeholder {
1633
- color: #a1a1aa;
1634
- font-style: italic;
1635
- }
1636
- .ff-note__input {
1637
- flex: 1;
1638
- min-height: 0;
1639
- width: 100%;
1640
- resize: none;
1641
- border: none;
1642
- outline: none;
1643
- background: transparent;
1644
- font: inherit;
1645
- font-size: 12px;
1646
- line-height: 1.5;
1647
- color: inherit;
1648
- }
1649
1661
  .ff-prompt-overlay {
1650
1662
  position: absolute;
1651
1663
  inset: 0;
@@ -1653,57 +1665,34 @@ svg.react-flow__connectionline {
1653
1665
  display: grid;
1654
1666
  place-items: center;
1655
1667
  padding: 16px;
1656
- background: rgba(9, 9, 11, 0.45);
1657
- backdrop-filter: blur(1px);
1668
+ background: rgba(9, 9, 11, 0.5);
1669
+ backdrop-filter: blur(2px);
1658
1670
  }
1659
1671
  .ff-prompt {
1660
1672
  width: 100%;
1661
1673
  max-width: 420px;
1662
1674
  max-height: 100%;
1663
1675
  overflow: auto;
1664
- padding: 16px;
1665
- border-radius: 12px;
1666
- background: #fff;
1667
- border: 1px solid #e4e4e7;
1668
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.25);
1669
- font-family:
1670
- ui-sans-serif,
1671
- system-ui,
1672
- sans-serif;
1673
- }
1674
- .dark .ff-prompt {
1675
- background: #18181b;
1676
- border-color: #3f3f46;
1677
- }
1678
- @media (prefers-color-scheme: dark) {
1679
- .ff-prompt:not(.ff-canvas--light *) {
1680
- background: #18181b;
1681
- border-color: #3f3f46;
1682
- }
1676
+ padding: 18px;
1677
+ border-radius: var(--ff-radius);
1678
+ background: var(--ff-surface);
1679
+ border: 1px solid var(--ff-border);
1680
+ box-shadow: var(--ff-shadow-lg);
1681
+ font-family: var(--ff-font);
1682
+ color: var(--ff-fg);
1683
1683
  }
1684
1684
  .ff-prompt__title {
1685
1685
  font-size: 14px;
1686
1686
  font-weight: 600;
1687
- color: #18181b;
1688
- margin-bottom: 8px;
1689
- }
1690
- .dark .ff-prompt__title {
1691
- color: #fafafa;
1692
- }
1693
- @media (prefers-color-scheme: dark) {
1694
- .ff-prompt__title:not(.ff-canvas--light *) {
1695
- color: #fafafa;
1696
- }
1687
+ color: var(--ff-fg);
1688
+ margin-bottom: 10px;
1697
1689
  }
1698
1690
  .ff-prompt__desc {
1699
1691
  font-size: 13px;
1700
1692
  line-height: 1.5;
1701
- color: #52525b;
1693
+ color: var(--ff-fg-subtle);
1702
1694
  margin-bottom: 12px;
1703
1695
  }
1704
- .dark .ff-prompt__desc {
1705
- color: #a1a1aa;
1706
- }
1707
1696
  .ff-prompt__fields {
1708
1697
  display: flex;
1709
1698
  flex-direction: column;
@@ -1713,37 +1702,31 @@ svg.react-flow__connectionline {
1713
1702
  .ff-prompt__field {
1714
1703
  display: flex;
1715
1704
  flex-direction: column;
1716
- gap: 4px;
1705
+ gap: 5px;
1717
1706
  }
1718
1707
  .ff-prompt__label {
1719
1708
  font-size: 12px;
1720
1709
  font-weight: 500;
1721
- color: #3f3f46;
1722
- }
1723
- .dark .ff-prompt__label {
1724
- color: #d4d4d8;
1710
+ color: var(--ff-fg-muted);
1725
1711
  }
1726
1712
  .ff-prompt__req {
1727
- color: #ef4444;
1713
+ color: var(--ff-danger);
1728
1714
  }
1729
1715
  .ff-prompt__input {
1730
1716
  width: 100%;
1731
1717
  box-sizing: border-box;
1732
1718
  padding: 8px 10px;
1733
1719
  font-size: 13px;
1734
- border-radius: 8px;
1735
- border: 1px solid #d4d4d8;
1736
- background: #fff;
1737
- color: #18181b;
1720
+ border-radius: var(--ff-radius-sm);
1721
+ border: 1px solid var(--ff-border);
1722
+ background: var(--ff-surface);
1723
+ color: var(--ff-fg);
1738
1724
  outline: none;
1725
+ transition: border-color 150ms, box-shadow 150ms;
1739
1726
  }
1740
1727
  .ff-prompt__input:focus {
1741
- border-color: #0ea5e9;
1742
- }
1743
- .dark .ff-prompt__input {
1744
- background: #27272a;
1745
- border-color: #3f3f46;
1746
- color: #fafafa;
1728
+ border-color: var(--ff-accent);
1729
+ box-shadow: 0 0 0 3px var(--ff-accent-soft);
1747
1730
  }
1748
1731
  .ff-prompt__switch {
1749
1732
  width: 16px;
@@ -1755,24 +1738,23 @@ svg.react-flow__connectionline {
1755
1738
  gap: 8px;
1756
1739
  }
1757
1740
  .ff-prompt__btn {
1758
- padding: 7px 14px;
1741
+ padding: 8px 14px;
1759
1742
  font-size: 13px;
1760
1743
  font-weight: 500;
1761
- border-radius: 8px;
1744
+ border-radius: var(--ff-radius-sm);
1762
1745
  border: 1px solid transparent;
1763
1746
  cursor: pointer;
1764
1747
  }
1765
1748
  .ff-prompt__btn--ghost {
1766
1749
  background: transparent;
1767
- border-color: #d4d4d8;
1768
- color: #52525b;
1750
+ border-color: var(--ff-border-strong);
1751
+ color: var(--ff-fg-muted);
1769
1752
  }
1770
- .dark .ff-prompt__btn--ghost {
1771
- border-color: #3f3f46;
1772
- color: #d4d4d8;
1753
+ .ff-prompt__btn--ghost:hover {
1754
+ background: var(--ff-surface-3);
1773
1755
  }
1774
1756
  .ff-prompt__btn--primary {
1775
- background: #0ea5e9;
1757
+ background: var(--ff-accent);
1776
1758
  color: #fff;
1777
1759
  }
1778
1760
  .ff-prompt__btn--primary:disabled {
@@ -1781,37 +1763,26 @@ svg.react-flow__connectionline {
1781
1763
  }
1782
1764
  .ff-prompt__btn--danger {
1783
1765
  background: transparent;
1784
- border-color: #ef4444;
1785
- color: #ef4444;
1786
- }
1787
- .ff-node__output {
1788
- margin: 0;
1789
- padding: 4px 10px 8px;
1790
- font-size: 11px;
1791
- font-family:
1792
- ui-monospace,
1793
- "SF Mono",
1794
- Menlo,
1795
- monospace;
1796
- color: #059669;
1797
- overflow: hidden;
1798
- text-overflow: ellipsis;
1799
- white-space: nowrap;
1800
- }
1801
- .dark .ff-node__output {
1802
- color: #34d399;
1766
+ border-color: var(--ff-danger);
1767
+ color: var(--ff-danger);
1803
1768
  }
1804
1769
  .ff-helper-line {
1805
- background: #3b82f6;
1770
+ background: var(--ff-accent);
1806
1771
  }
1807
- .dark .ff-lane {
1808
- background: rgba(148, 163, 184, 0.08);
1809
- border-color: #3f3f46;
1772
+ @media (max-width: 1024px) {
1773
+ .ff-editor {
1774
+ grid-template-columns: 190px 1fr;
1775
+ }
1776
+ .ff-editor__panel-wrap {
1777
+ display: none;
1778
+ }
1810
1779
  }
1811
- @media (prefers-color-scheme: dark) {
1812
- .ff-lane:not(.ff-canvas--light *) {
1813
- background: rgba(148, 163, 184, 0.08);
1814
- border-color: #3f3f46;
1780
+ @media (max-width: 720px) {
1781
+ .ff-editor {
1782
+ grid-template-columns: 1fr;
1783
+ }
1784
+ .ff-editor__palette {
1785
+ display: none;
1815
1786
  }
1816
1787
  }
1817
1788
  /*# sourceMappingURL=styles.css.map */