pict-section-flow 0.0.10 → 0.0.13

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 (88) hide show
  1. package/.claude/launch.json +1 -1
  2. package/README.md +176 -0
  3. package/docs/.nojekyll +0 -0
  4. package/docs/Architecture.md +303 -0
  5. package/docs/Custom-Styling.md +275 -0
  6. package/docs/Data_Model.md +158 -0
  7. package/docs/Event_System.md +156 -0
  8. package/docs/Getting_Started.md +237 -0
  9. package/docs/Implementation_Reference.md +528 -0
  10. package/docs/Layout_Persistence.md +117 -0
  11. package/docs/README.md +115 -52
  12. package/docs/_cover.md +11 -0
  13. package/docs/_sidebar.md +52 -0
  14. package/docs/_topbar.md +8 -0
  15. package/docs/api/PictFlowCard.md +216 -0
  16. package/docs/api/PictFlowCardPropertiesPanel.md +235 -0
  17. package/docs/api/addConnection.md +101 -0
  18. package/docs/api/addNode.md +137 -0
  19. package/docs/api/autoLayout.md +77 -0
  20. package/docs/api/getFlowData.md +112 -0
  21. package/docs/api/marshalToView.md +95 -0
  22. package/docs/api/openPanel.md +128 -0
  23. package/docs/api/registerHandler.md +174 -0
  24. package/docs/api/registerNodeType.md +142 -0
  25. package/docs/api/removeConnection.md +57 -0
  26. package/docs/api/removeNode.md +80 -0
  27. package/docs/api/saveLayout.md +152 -0
  28. package/docs/api/screenToSVGCoords.md +68 -0
  29. package/docs/api/selectNode.md +116 -0
  30. package/docs/api/setTheme.md +168 -0
  31. package/docs/api/setZoom.md +97 -0
  32. package/docs/api/toggleFullscreen.md +68 -0
  33. package/docs/card-help/EACH.md +19 -0
  34. package/docs/card-help/FREAD.md +24 -0
  35. package/docs/card-help/FWRITE.md +24 -0
  36. package/docs/card-help/GET.md +22 -0
  37. package/docs/card-help/ITE.md +23 -0
  38. package/docs/card-help/LOG.md +23 -0
  39. package/docs/card-help/NOTE.md +17 -0
  40. package/docs/card-help/PREV.md +18 -0
  41. package/docs/card-help/SET.md +27 -0
  42. package/docs/card-help/SPKL.md +22 -0
  43. package/docs/card-help/STAT.md +23 -0
  44. package/docs/card-help/SW.md +25 -0
  45. package/docs/css/docuserve.css +73 -0
  46. package/docs/index.html +39 -0
  47. package/docs/retold-catalog.json +169 -0
  48. package/docs/retold-keyword-index.json +13942 -0
  49. package/example_applications/simple_cards/package.json +1 -0
  50. package/example_applications/simple_cards/source/card-help-content.js +16 -0
  51. package/example_applications/simple_cards/source/cards/FlowCard-Comment.js +2 -0
  52. package/example_applications/simple_cards/source/cards/FlowCard-DataPreview.js +2 -0
  53. package/example_applications/simple_cards/source/cards/FlowCard-Each.js +2 -0
  54. package/example_applications/simple_cards/source/cards/FlowCard-FileRead.js +2 -0
  55. package/example_applications/simple_cards/source/cards/FlowCard-FileWrite.js +2 -0
  56. package/example_applications/simple_cards/source/cards/FlowCard-GetValue.js +2 -0
  57. package/example_applications/simple_cards/source/cards/FlowCard-IfThenElse.js +2 -0
  58. package/example_applications/simple_cards/source/cards/FlowCard-LogValues.js +2 -0
  59. package/example_applications/simple_cards/source/cards/FlowCard-SetValue.js +2 -0
  60. package/example_applications/simple_cards/source/cards/FlowCard-Sparkline.js +2 -0
  61. package/example_applications/simple_cards/source/cards/FlowCard-StatusMonitor.js +2 -0
  62. package/example_applications/simple_cards/source/cards/FlowCard-Switch.js +2 -0
  63. package/package.json +11 -7
  64. package/scripts/generate-card-help.js +214 -0
  65. package/source/Pict-Section-Flow.js +4 -0
  66. package/source/PictFlowCard.js +3 -1
  67. package/source/providers/PictProvider-Flow-CSS.js +245 -152
  68. package/source/providers/PictProvider-Flow-ConnectorShapes.js +24 -0
  69. package/source/providers/PictProvider-Flow-Geometry.js +195 -38
  70. package/source/providers/PictProvider-Flow-PanelChrome.js +14 -12
  71. package/source/services/PictService-Flow-ConnectionHandleManager.js +263 -0
  72. package/source/services/PictService-Flow-ConnectionRenderer.js +134 -183
  73. package/source/services/PictService-Flow-DataManager.js +338 -0
  74. package/source/services/PictService-Flow-InteractionManager.js +165 -7
  75. package/source/services/PictService-Flow-PathGenerator.js +282 -0
  76. package/source/services/PictService-Flow-PortRenderer.js +269 -0
  77. package/source/services/PictService-Flow-RenderManager.js +281 -0
  78. package/source/services/PictService-Flow-Tether.js +6 -42
  79. package/source/views/PictView-Flow-Node.js +2 -220
  80. package/source/views/PictView-Flow-PropertiesPanel.js +89 -44
  81. package/source/views/PictView-Flow.js +130 -882
  82. package/test/ConnectionHandleManager_tests.js +717 -0
  83. package/test/ConnectionRenderer_tests.js +591 -0
  84. package/test/DataManager_tests.js +859 -0
  85. package/test/Geometry_tests.js +767 -0
  86. package/test/PathGenerator_tests.js +978 -0
  87. package/test/PortRenderer_tests.js +367 -0
  88. package/test/RenderManager_tests.js +756 -0
@@ -39,9 +39,17 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
39
39
  Node-type classes (.pict-flow-node-{type}) can scope-override
40
40
  any variable for per-type variation. */
41
41
 
42
+ /* Text */
43
+ --pf-text-primary: #2c3e50;
44
+ --pf-text-heading: #1a252f;
45
+ --pf-text-secondary: #7f8c8d;
46
+ --pf-text-tertiary: #8e99a4;
47
+ --pf-text-placeholder: #95a5a6;
48
+
42
49
  /* Node */
43
50
  --pf-node-body-fill: #ffffff;
44
51
  --pf-node-body-stroke: #d0d4d8;
52
+ --pf-node-body-stroke-hover: #b0b8c0;
45
53
  --pf-node-body-stroke-width: 1;
46
54
  --pf-node-body-radius: 8px;
47
55
  --pf-node-shadow: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.10));
@@ -55,6 +63,16 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
55
63
  --pf-node-type-label-fill: #a0a8b0;
56
64
  --pf-node-selected-stroke: #3498db;
57
65
 
66
+ /* Node Variants */
67
+ --pf-node-start-fill: #eafaf1;
68
+ --pf-node-start-stroke: #27ae60;
69
+ --pf-node-end-fill: #e8f8f5;
70
+ --pf-node-end-stroke: #1abc9c;
71
+ --pf-node-halt-fill: #fdedec;
72
+ --pf-node-halt-stroke: #e74c3c;
73
+ --pf-node-decision-fill: #fff9e6;
74
+ --pf-node-decision-stroke: #f39c12;
75
+
58
76
  /* Ports */
59
77
  --pf-port-input-fill: #3498db;
60
78
  --pf-port-output-fill: #2ecc71;
@@ -77,6 +95,11 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
77
95
  --pf-connection-value-stroke: #f1c40f;
78
96
  --pf-connection-error-stroke: #e74c3c;
79
97
 
98
+ /* Connections */
99
+ --pf-connection-stroke: #95a5a6;
100
+ --pf-connection-stroke-hover: #7f8c8d;
101
+ --pf-connection-selected-stroke: #3498db;
102
+
80
103
  /* Panels */
81
104
  --pf-panel-bg: #ffffff;
82
105
  --pf-panel-border: #d0d4d8;
@@ -86,9 +109,44 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
86
109
  --pf-panel-titlebar-border: #e8eaed;
87
110
  --pf-panel-title-color: #2c3e50;
88
111
 
89
- /* Connections */
90
- --pf-connection-stroke: #95a5a6;
91
- --pf-connection-selected-stroke: #3498db;
112
+ /* Tabs */
113
+ --pf-tab-text: #8e99a4;
114
+ --pf-tab-text-hover: #5a6a7a;
115
+ --pf-tab-active-border: var(--pf-node-selected-stroke);
116
+ --pf-resize-handle-hover: #e0e3e6;
117
+
118
+ /* Forms & Inputs */
119
+ --pf-input-border: #d5d8dc;
120
+ --pf-input-border-focus: #3498db;
121
+ --pf-divider-light: #ecf0f1;
122
+ --pf-divider-medium: #e8eaed;
123
+
124
+ /* Buttons */
125
+ --pf-button-border: #bdc3c7;
126
+ --pf-button-hover-border: #95a5a6;
127
+ --pf-button-hover-bg: #ecf0f1;
128
+ --pf-button-active-bg: #d5dbdb;
129
+ --pf-button-danger-text: #e74c3c;
130
+ --pf-button-danger-hover-bg: #fdedec;
131
+ --pf-button-close-color: #b0b8c0;
132
+
133
+ /* Badges */
134
+ --pf-badge-category-bg: #f0f2f4;
135
+ --pf-badge-category-text: #6b7b8d;
136
+ --pf-badge-code-bg: #eaf2f8;
137
+ --pf-badge-code-text: #2980b9;
138
+
139
+ /* Info Panel */
140
+ --pf-port-item-bg: #f8f9fa;
141
+
142
+ /* Toolbar */
143
+ --pf-toolbar-bg: #ffffff;
144
+ --pf-toolbar-border: #e0e0e0;
145
+
146
+ /* Palette Cards */
147
+ --pf-card-border: #d5d8dc;
148
+ --pf-card-hover-bg: #eaf2f8;
149
+ --pf-card-hover-shadow: 0 1px 3px rgba(52, 152, 219, 0.15);
92
150
 
93
151
  /* Canvas */
94
152
  --pf-canvas-bg: #fafafa;
@@ -100,7 +158,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
100
158
  min-height: 400px;
101
159
  overflow: hidden;
102
160
  background-color: var(--pf-canvas-bg);
103
- border: 1px solid #e0e0e0;
161
+ border: 1px solid var(--pf-toolbar-border);
104
162
  border-radius: 4px;
105
163
  display: flex;
106
164
  flex-direction: column;
@@ -147,7 +205,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
147
205
  filter: var(--pf-node-shadow-hover);
148
206
  }
149
207
  .pict-flow-node:hover .pict-flow-node-body {
150
- stroke: #b0b8c0;
208
+ stroke: var(--pf-node-body-stroke-hover);
151
209
  stroke-width: 1.5;
152
210
  }
153
211
  .pict-flow-node.selected {
@@ -234,7 +292,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
234
292
  box-sizing: border-box;
235
293
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
236
294
  font-size: 11px;
237
- color: #2c3e50;
295
+ color: var(--pf-text-primary);
238
296
  pointer-events: auto;
239
297
  }
240
298
  .pict-flow-node-body-content-canvas {
@@ -253,23 +311,23 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
253
311
  {
254
312
  return /*css*/`
255
313
  .pict-flow-node-decision .pict-flow-node-body {
256
- fill: #fff9e6;
257
- stroke: #f39c12;
314
+ fill: var(--pf-node-decision-fill);
315
+ stroke: var(--pf-node-decision-stroke);
258
316
  stroke-width: 1.5;
259
317
  }
260
318
  .pict-flow-node-start .pict-flow-node-body {
261
- fill: #eafaf1;
262
- stroke: #27ae60;
319
+ fill: var(--pf-node-start-fill);
320
+ stroke: var(--pf-node-start-stroke);
263
321
  stroke-width: 1.5;
264
322
  }
265
323
  .pict-flow-node-end .pict-flow-node-body {
266
- fill: #e8f8f5;
267
- stroke: #1abc9c;
324
+ fill: var(--pf-node-end-fill);
325
+ stroke: var(--pf-node-end-stroke);
268
326
  stroke-width: 1.5;
269
327
  }
270
328
  .pict-flow-node-halt .pict-flow-node-body {
271
- fill: #fdedec;
272
- stroke: #e74c3c;
329
+ fill: var(--pf-node-halt-fill);
330
+ stroke: var(--pf-node-halt-stroke);
273
331
  stroke-width: 1.5;
274
332
  }
275
333
  `;
@@ -357,7 +415,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
357
415
  transition: stroke 0.15s;
358
416
  }
359
417
  .pict-flow-connection:hover {
360
- stroke: #7f8c8d;
418
+ stroke: var(--pf-connection-stroke-hover);
361
419
  stroke-width: 3;
362
420
  }
363
421
  .pict-flow-connection.selected {
@@ -388,7 +446,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
388
446
  }
389
447
  .pict-flow-drag-connection {
390
448
  fill: none;
391
- stroke: #3498db;
449
+ stroke: var(--pf-node-selected-stroke);
392
450
  stroke-width: 2;
393
451
  stroke-dasharray: 6 3;
394
452
  pointer-events: none;
@@ -405,8 +463,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
405
463
  {
406
464
  return /*css*/`
407
465
  .pict-flow-connection-handle {
408
- fill: #ffffff;
409
- stroke: #3498db;
466
+ fill: var(--pf-panel-bg);
467
+ stroke: var(--pf-node-selected-stroke);
410
468
  stroke-width: 2;
411
469
  cursor: grab;
412
470
  transition: r 0.15s;
@@ -417,8 +475,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
417
475
  stroke-width: 2.5;
418
476
  }
419
477
  .pict-flow-connection-handle-midpoint {
420
- fill: #ffffff;
421
- stroke: #e67e22;
478
+ fill: var(--pf-panel-bg);
479
+ stroke: var(--pf-port-setting-fill);
422
480
  stroke-width: 2;
423
481
  cursor: grab;
424
482
  transition: r 0.15s;
@@ -441,14 +499,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
441
499
  return /*css*/`
442
500
  .pict-flow-tether-line {
443
501
  fill: none;
444
- stroke: #95a5a6;
502
+ stroke: var(--pf-connection-stroke);
445
503
  stroke-width: 1.5;
446
504
  stroke-dasharray: 6 4;
447
505
  pointer-events: visibleStroke;
448
506
  cursor: pointer;
449
507
  }
450
508
  .pict-flow-tether-line.selected {
451
- stroke: #3498db;
509
+ stroke: var(--pf-node-selected-stroke);
452
510
  stroke-width: 2;
453
511
  }
454
512
  .pict-flow-tether-hitarea {
@@ -458,8 +516,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
458
516
  cursor: pointer;
459
517
  }
460
518
  .pict-flow-tether-handle {
461
- fill: #ffffff;
462
- stroke: #3498db;
519
+ fill: var(--pf-panel-bg);
520
+ stroke: var(--pf-node-selected-stroke);
463
521
  stroke-width: 2;
464
522
  cursor: grab;
465
523
  transition: r 0.15s;
@@ -470,8 +528,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
470
528
  stroke-width: 2.5;
471
529
  }
472
530
  .pict-flow-tether-handle-midpoint {
473
- fill: #ffffff;
474
- stroke: #e67e22;
531
+ fill: var(--pf-panel-bg);
532
+ stroke: var(--pf-port-setting-fill);
475
533
  stroke-width: 2;
476
534
  cursor: grab;
477
535
  transition: r 0.15s;
@@ -545,7 +603,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
545
603
  }
546
604
  .pict-flow-panel-close-btn {
547
605
  cursor: pointer;
548
- color: #b0b8c0;
606
+ color: var(--pf-button-close-color);
549
607
  font-size: 14px;
550
608
  line-height: 1;
551
609
  padding: 4px;
@@ -555,13 +613,18 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
555
613
  transition: background-color 0.15s, color 0.15s;
556
614
  }
557
615
  .pict-flow-panel-close-btn:hover {
558
- color: #e74c3c;
616
+ color: var(--pf-button-danger-text);
559
617
  background-color: rgba(231, 76, 60, 0.08);
560
618
  }
561
- .pict-flow-panel-body {
619
+ .pict-flow-panel-content {
562
620
  flex: 1;
563
- overflow: auto;
621
+ overflow-y: auto;
622
+ min-height: 0;
623
+ padding: 0;
624
+ }
625
+ .pict-flow-panel-tab-pane {
564
626
  padding: 10px 12px;
627
+ box-sizing: border-box;
565
628
  }
566
629
  `;
567
630
  }
@@ -578,13 +641,13 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
578
641
  padding: 2px 0;
579
642
  font-size: 12px;
580
643
  line-height: 1.5;
581
- color: #2c3e50;
644
+ color: var(--pf-text-primary);
582
645
  }
583
646
  .pict-flow-info-panel-header {
584
647
  font-size: 13px;
585
648
  font-weight: 600;
586
649
  margin-bottom: 6px;
587
- color: #1a252f;
650
+ color: var(--pf-text-heading);
588
651
  }
589
652
  .pict-flow-info-panel-header.with-icon {
590
653
  font-size: 14px;
@@ -594,7 +657,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
594
657
  }
595
658
  .pict-flow-info-panel-description {
596
659
  font-size: 11px;
597
- color: #7f8c8d;
660
+ color: var(--pf-text-secondary);
598
661
  margin-bottom: 10px;
599
662
  line-height: 1.45;
600
663
  }
@@ -611,12 +674,12 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
611
674
  font-size: 10px;
612
675
  }
613
676
  .pict-flow-info-panel-badge.category {
614
- background: #f0f2f4;
615
- color: #6b7b8d;
677
+ background: var(--pf-badge-category-bg);
678
+ color: var(--pf-badge-category-text);
616
679
  }
617
680
  .pict-flow-info-panel-badge.code {
618
- background: #eaf2f8;
619
- color: #2980b9;
681
+ background: var(--pf-badge-code-bg);
682
+ color: var(--pf-badge-code-text);
620
683
  font-family: "SF Mono", "Fira Code", monospace;
621
684
  }
622
685
  .pict-flow-info-panel-section {
@@ -627,14 +690,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
627
690
  font-weight: 600;
628
691
  text-transform: uppercase;
629
692
  letter-spacing: 0.5px;
630
- color: #8e99a4;
693
+ color: var(--pf-text-tertiary);
631
694
  margin-bottom: 4px;
632
695
  padding-bottom: 2px;
633
- border-bottom: 1px solid #f0f2f4;
696
+ border-bottom: 1px solid var(--pf-divider-light);
634
697
  }
635
698
  .pict-flow-info-panel-port {
636
699
  padding: 3px 8px;
637
- background: #f8f9fa;
700
+ background: var(--pf-port-item-bg);
638
701
  margin-bottom: 3px;
639
702
  font-size: 11px;
640
703
  border-radius: 3px;
@@ -662,14 +725,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
662
725
  border-left-color: var(--pf-port-error-fill);
663
726
  }
664
727
  .pict-flow-info-panel-port-constraint {
665
- color: #8e99a4;
728
+ color: var(--pf-text-tertiary);
666
729
  font-size: 10px;
667
730
  }
668
731
  /* Port summary section appended below form panels */
669
732
  .pict-flow-port-summary {
670
733
  margin-top: 12px;
671
734
  padding-top: 8px;
672
- border-top: 1px solid #e8eaed;
735
+ border-top: 1px solid var(--pf-divider-medium);
673
736
  }
674
737
  .pict-flow-info-panel-port.event {
675
738
  border-left: 3px solid var(--pf-port-event-in-fill);
@@ -682,51 +745,12 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
682
745
 
683
746
  // ── Node Properties Editor ────────────────────────────────────────────
684
747
  /**
685
- * CSS for the collapsible node properties editor at the bottom of panels.
748
+ * CSS for the node properties editor fields used in the Appearance tab.
686
749
  * @returns {string}
687
750
  */
688
751
  getNodePropsEditorCSS()
689
752
  {
690
753
  return /*css*/`
691
- .pict-flow-panel-node-props {
692
- border-top: 1px solid var(--pf-panel-titlebar-border);
693
- flex-shrink: 0;
694
- }
695
- .pict-flow-panel-node-props-header {
696
- display: flex;
697
- align-items: center;
698
- gap: 6px;
699
- padding: 6px 12px;
700
- cursor: pointer;
701
- user-select: none;
702
- -webkit-user-select: none;
703
- background: var(--pf-panel-titlebar-bg);
704
- transition: background-color 0.15s;
705
- }
706
- .pict-flow-panel-node-props-header:hover {
707
- background: #eef0f2;
708
- }
709
- .pict-flow-panel-node-props-chevron {
710
- font-size: 8px;
711
- color: #95a5a6;
712
- transition: transform 0.2s;
713
- display: inline-block;
714
- }
715
- .pict-flow-panel-node-props-chevron.expanded {
716
- transform: rotate(90deg);
717
- }
718
- .pict-flow-panel-node-props-title {
719
- font-size: 10px;
720
- font-weight: 600;
721
- text-transform: uppercase;
722
- letter-spacing: 0.5px;
723
- color: #8e99a4;
724
- }
725
- .pict-flow-panel-node-props-body {
726
- padding: 8px 12px;
727
- max-height: 240px;
728
- overflow-y: auto;
729
- }
730
754
  .pict-flow-node-props-fields {
731
755
  display: flex;
732
756
  flex-direction: column;
@@ -739,14 +763,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
739
763
  }
740
764
  .pict-flow-node-props-label {
741
765
  font-size: 11px;
742
- color: #7f8c8d;
766
+ color: var(--pf-text-secondary);
743
767
  min-width: 72px;
744
768
  flex-shrink: 0;
745
769
  }
746
770
  .pict-flow-node-props-input {
747
771
  flex: 1;
748
772
  padding: 3px 6px;
749
- border: 1px solid #d5d8dc;
773
+ border: 1px solid var(--pf-input-border);
750
774
  border-radius: 3px;
751
775
  font-size: 11px;
752
776
  outline: none;
@@ -754,7 +778,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
754
778
  min-width: 0;
755
779
  }
756
780
  .pict-flow-node-props-input:focus {
757
- border-color: #3498db;
781
+ border-color: var(--pf-input-border-focus);
758
782
  }
759
783
  .pict-flow-node-props-color {
760
784
  width: 28px;
@@ -766,6 +790,74 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
766
790
  `;
767
791
  }
768
792
 
793
+ // ── Panel Tabs & Resize ───────────────────────────────────────────────
794
+ /**
795
+ * CSS for the tab bar, tab panes, resize handle, and help content.
796
+ * @returns {string}
797
+ */
798
+ getPanelTabsCSS()
799
+ {
800
+ return /*css*/`
801
+ .pict-flow-panel-resize-handle {
802
+ height: 6px;
803
+ cursor: ns-resize;
804
+ background: transparent;
805
+ flex-shrink: 0;
806
+ transition: background-color 0.15s;
807
+ border-top: 1px solid var(--pf-panel-titlebar-border);
808
+ display: flex;
809
+ align-items: center;
810
+ justify-content: center;
811
+ }
812
+ .pict-flow-panel-resize-handle::after {
813
+ content: '';
814
+ width: 24px;
815
+ height: 2px;
816
+ border-radius: 1px;
817
+ background: var(--pf-resize-handle-hover);
818
+ transition: background-color 0.15s, width 0.15s;
819
+ }
820
+ .pict-flow-panel-resize-handle:hover::after {
821
+ background: var(--pf-button-hover-border);
822
+ width: 32px;
823
+ }
824
+ .pict-flow-panel-tabbar {
825
+ display: flex;
826
+ flex-shrink: 0;
827
+ border-top: 1px solid var(--pf-panel-titlebar-border);
828
+ background: var(--pf-panel-titlebar-bg);
829
+ }
830
+ .pict-flow-panel-tab {
831
+ flex: 1;
832
+ padding: 5px 8px;
833
+ font-size: 11px;
834
+ text-align: center;
835
+ cursor: pointer;
836
+ color: var(--pf-tab-text);
837
+ border-top: 2px solid transparent;
838
+ transition: color 0.15s, border-top-color 0.15s;
839
+ user-select: none;
840
+ -webkit-user-select: none;
841
+ }
842
+ .pict-flow-panel-tab:hover {
843
+ color: var(--pf-tab-text-hover);
844
+ }
845
+ .pict-flow-panel-tab.active {
846
+ border-top-color: var(--pf-node-selected-stroke);
847
+ color: var(--pf-panel-title-color);
848
+ font-weight: 600;
849
+ }
850
+ .pict-flow-panel-help-content {
851
+ font-size: 12px;
852
+ line-height: 1.5;
853
+ color: var(--pf-text-primary);
854
+ }
855
+ .pict-flow-panel-help-content p {
856
+ margin: 0 0 8px 0;
857
+ }
858
+ `;
859
+ }
860
+
769
861
  // ── Fullscreen ─────────────────────────────────────────────────────────
770
862
  /**
771
863
  * CSS for fullscreen mode.
@@ -804,8 +896,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
804
896
  align-items: center;
805
897
  gap: 0.5em;
806
898
  padding: 0.5em 0.75em;
807
- background-color: #ffffff;
808
- border-bottom: 1px solid #e0e0e0;
899
+ background-color: var(--pf-toolbar-bg);
900
+ border-bottom: 1px solid var(--pf-toolbar-border);
809
901
  flex-wrap: wrap;
810
902
  }
811
903
  .pict-flow-toolbar-group {
@@ -813,7 +905,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
813
905
  align-items: center;
814
906
  gap: 0.25em;
815
907
  padding-right: 0.75em;
816
- border-right: 1px solid #e0e0e0;
908
+ border-right: 1px solid var(--pf-toolbar-border);
817
909
  }
818
910
  .pict-flow-toolbar-group:last-child {
819
911
  border-right: none;
@@ -825,10 +917,10 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
825
917
  justify-content: center;
826
918
  gap: 0.35em;
827
919
  padding: 0.35em 0.65em;
828
- border: 1px solid #bdc3c7;
920
+ border: 1px solid var(--pf-button-border);
829
921
  border-radius: 4px;
830
- background-color: #fff;
831
- color: #2c3e50;
922
+ background-color: var(--pf-toolbar-bg);
923
+ color: var(--pf-text-primary);
832
924
  font-size: 0.85em;
833
925
  cursor: pointer;
834
926
  transition: background-color 0.15s, border-color 0.15s;
@@ -836,18 +928,18 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
836
928
  -webkit-user-select: none;
837
929
  }
838
930
  .pict-flow-toolbar-btn:hover {
839
- background-color: #ecf0f1;
840
- border-color: #95a5a6;
931
+ background-color: var(--pf-button-hover-bg);
932
+ border-color: var(--pf-button-hover-border);
841
933
  }
842
934
  .pict-flow-toolbar-btn:active {
843
- background-color: #d5dbdb;
935
+ background-color: var(--pf-button-active-bg);
844
936
  }
845
937
  .pict-flow-toolbar-btn.danger {
846
- color: #e74c3c;
847
- border-color: #e74c3c;
938
+ color: var(--pf-button-danger-text);
939
+ border-color: var(--pf-button-danger-text);
848
940
  }
849
941
  .pict-flow-toolbar-btn.danger:hover {
850
- background-color: #fdedec;
942
+ background-color: var(--pf-button-danger-hover-bg);
851
943
  }
852
944
  .pict-flow-toolbar-btn-icon {
853
945
  display: inline-flex;
@@ -873,16 +965,16 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
873
965
  }
874
966
  .pict-flow-toolbar-label {
875
967
  font-size: 0.8em;
876
- color: #7f8c8d;
968
+ color: var(--pf-text-secondary);
877
969
  margin-right: 0.25em;
878
970
  }
879
971
  .pict-flow-toolbar-select {
880
972
  padding: 0.3em 0.5em;
881
- border: 1px solid #bdc3c7;
973
+ border: 1px solid var(--pf-button-border);
882
974
  border-radius: 4px;
883
975
  font-size: 0.85em;
884
- background-color: #fff;
885
- color: #2c3e50;
976
+ background-color: var(--pf-toolbar-bg);
977
+ color: var(--pf-text-primary);
886
978
  }
887
979
  `;
888
980
  }
@@ -906,10 +998,10 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
906
998
  font-weight: 700;
907
999
  text-transform: uppercase;
908
1000
  letter-spacing: 0.05em;
909
- color: #95a5a6;
1001
+ color: var(--pf-text-placeholder);
910
1002
  margin-bottom: 0.35em;
911
1003
  padding-bottom: 0.2em;
912
- border-bottom: 1px solid #ecf0f1;
1004
+ border-bottom: 1px solid var(--pf-divider-light);
913
1005
  }
914
1006
  .pict-flow-palette-cards {
915
1007
  display: flex;
@@ -921,9 +1013,9 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
921
1013
  align-items: center;
922
1014
  gap: 0.35em;
923
1015
  padding: 0.35em 0.6em;
924
- border: 1px solid #d5d8dc;
1016
+ border: 1px solid var(--pf-card-border);
925
1017
  border-radius: 4px;
926
- background-color: #ffffff;
1018
+ background-color: var(--pf-panel-bg);
927
1019
  font-size: 0.8em;
928
1020
  cursor: pointer;
929
1021
  transition: background-color 0.15s, border-color 0.15s, box-shadow 0.15s;
@@ -932,9 +1024,9 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
932
1024
  position: relative;
933
1025
  }
934
1026
  .pict-flow-palette-card:hover {
935
- background-color: #eaf2f8;
936
- border-color: #3498db;
937
- box-shadow: 0 1px 3px rgba(52, 152, 219, 0.15);
1027
+ background-color: var(--pf-card-hover-bg);
1028
+ border-color: var(--pf-node-selected-stroke);
1029
+ box-shadow: var(--pf-card-hover-shadow);
938
1030
  }
939
1031
  .pict-flow-palette-card.disabled {
940
1032
  opacity: 0.45;
@@ -953,12 +1045,12 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
953
1045
  }
954
1046
  .pict-flow-palette-card-title {
955
1047
  font-weight: 500;
956
- color: #2c3e50;
1048
+ color: var(--pf-text-primary);
957
1049
  white-space: nowrap;
958
1050
  }
959
1051
  .pict-flow-palette-card-code {
960
1052
  font-size: 0.8em;
961
- color: #95a5a6;
1053
+ color: var(--pf-text-placeholder);
962
1054
  font-family: monospace;
963
1055
  }
964
1056
  .pict-flow-toolbar-select.layout-select {
@@ -982,8 +1074,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
982
1074
  .pict-flow-toolbar-popup {
983
1075
  position: absolute;
984
1076
  z-index: 1000;
985
- background: #ffffff;
986
- border: 1px solid #d5d8dc;
1077
+ background: var(--pf-panel-bg);
1078
+ border: 1px solid var(--pf-card-border);
987
1079
  border-radius: 6px;
988
1080
  box-shadow: 0 4px 16px rgba(0,0,0,0.12);
989
1081
  min-width: 240px;
@@ -996,7 +1088,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
996
1088
  .pict-flow-popup-search-wrapper {
997
1089
  position: relative;
998
1090
  padding: 0.4em 0.5em;
999
- border-bottom: 1px solid #ecf0f1;
1091
+ border-bottom: 1px solid var(--pf-divider-light);
1000
1092
  }
1001
1093
  .pict-flow-popup-search-icon {
1002
1094
  position: absolute;
@@ -1011,14 +1103,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1011
1103
  .pict-flow-popup-search {
1012
1104
  width: 100%;
1013
1105
  padding: 0.4em 0.5em 0.4em 2em;
1014
- border: 1px solid #d5d8dc;
1106
+ border: 1px solid var(--pf-input-border);
1015
1107
  border-radius: 4px;
1016
1108
  font-size: 0.9em;
1017
1109
  outline: none;
1018
1110
  box-sizing: border-box;
1019
1111
  }
1020
1112
  .pict-flow-popup-search:focus {
1021
- border-color: #3498db;
1113
+ border-color: var(--pf-input-border-focus);
1022
1114
  }
1023
1115
  .pict-flow-popup-list-item {
1024
1116
  display: flex;
@@ -1029,7 +1121,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1029
1121
  transition: background-color 0.1s;
1030
1122
  }
1031
1123
  .pict-flow-popup-list-item:hover {
1032
- background-color: #eaf2f8;
1124
+ background-color: var(--pf-card-hover-bg);
1033
1125
  }
1034
1126
  .pict-flow-popup-list-item-icon {
1035
1127
  display: inline-flex;
@@ -1039,25 +1131,25 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1039
1131
  }
1040
1132
  .pict-flow-popup-list-item-label {
1041
1133
  flex: 1;
1042
- color: #2c3e50;
1134
+ color: var(--pf-text-primary);
1043
1135
  font-weight: 500;
1044
1136
  }
1045
1137
  .pict-flow-popup-list-item-code {
1046
1138
  font-size: 0.8em;
1047
- color: #95a5a6;
1139
+ color: var(--pf-text-placeholder);
1048
1140
  font-family: monospace;
1049
- background: #f0f3f5;
1141
+ background: var(--pf-badge-category-bg);
1050
1142
  padding: 0.1em 0.4em;
1051
1143
  border-radius: 3px;
1052
1144
  }
1053
1145
  .pict-flow-popup-divider {
1054
1146
  height: 1px;
1055
- background: #ecf0f1;
1147
+ background: var(--pf-divider-light);
1056
1148
  margin: 0.25em 0;
1057
1149
  }
1058
1150
  .pict-flow-popup-list-empty {
1059
1151
  text-align: center;
1060
- color: #95a5a6;
1152
+ color: var(--pf-text-placeholder);
1061
1153
  padding: 1.5em 0.75em;
1062
1154
  font-size: 0.9em;
1063
1155
  }
@@ -1068,11 +1160,11 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1068
1160
  padding: 0.45em 0.75em;
1069
1161
  cursor: pointer;
1070
1162
  transition: background-color 0.1s;
1071
- color: #2c3e50;
1163
+ color: var(--pf-text-primary);
1072
1164
  font-weight: 500;
1073
1165
  }
1074
1166
  .pict-flow-popup-layout-save:hover {
1075
- background-color: #eaf2f8;
1167
+ background-color: var(--pf-card-hover-bg);
1076
1168
  }
1077
1169
  .pict-flow-popup-layout-save-icon {
1078
1170
  display: inline-flex;
@@ -1089,14 +1181,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1089
1181
  .pict-flow-popup-layout-save-input {
1090
1182
  flex: 1;
1091
1183
  padding: 0.35em 0.5em;
1092
- border: 1px solid #d5d8dc;
1184
+ border: 1px solid var(--pf-input-border);
1093
1185
  border-radius: 4px;
1094
1186
  font-size: 0.9em;
1095
1187
  outline: none;
1096
1188
  box-sizing: border-box;
1097
1189
  }
1098
1190
  .pict-flow-popup-layout-save-input:focus {
1099
- border-color: #3498db;
1191
+ border-color: var(--pf-input-border-focus);
1100
1192
  }
1101
1193
  .pict-flow-popup-layout-save-confirm {
1102
1194
  display: inline-flex;
@@ -1104,17 +1196,17 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1104
1196
  justify-content: center;
1105
1197
  width: 28px;
1106
1198
  height: 28px;
1107
- border: 1px solid #d5d8dc;
1199
+ border: 1px solid var(--pf-input-border);
1108
1200
  border-radius: 4px;
1109
- background: #fff;
1201
+ background: var(--pf-panel-bg);
1110
1202
  cursor: pointer;
1111
1203
  flex-shrink: 0;
1112
1204
  transition: background-color 0.15s, border-color 0.15s;
1113
1205
  line-height: 1;
1114
1206
  }
1115
1207
  .pict-flow-popup-layout-save-confirm:hover {
1116
- background-color: #eaf2f8;
1117
- border-color: #3498db;
1208
+ background-color: var(--pf-card-hover-bg);
1209
+ border-color: var(--pf-input-border-focus);
1118
1210
  }
1119
1211
  .pict-flow-popup-layout-row {
1120
1212
  display: flex;
@@ -1124,11 +1216,11 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1124
1216
  transition: background-color 0.1s;
1125
1217
  }
1126
1218
  .pict-flow-popup-layout-row:hover {
1127
- background-color: #eaf2f8;
1219
+ background-color: var(--pf-card-hover-bg);
1128
1220
  }
1129
1221
  .pict-flow-popup-layout-name {
1130
1222
  flex: 1;
1131
- color: #2c3e50;
1223
+ color: var(--pf-text-primary);
1132
1224
  }
1133
1225
  .pict-flow-popup-layout-delete {
1134
1226
  display: none;
@@ -1136,7 +1228,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1136
1228
  justify-content: center;
1137
1229
  border: none;
1138
1230
  background: none;
1139
- color: #e74c3c;
1231
+ color: var(--pf-button-danger-text);
1140
1232
  cursor: pointer;
1141
1233
  padding: 2px 4px;
1142
1234
  border-radius: 3px;
@@ -1146,7 +1238,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1146
1238
  display: inline-flex;
1147
1239
  }
1148
1240
  .pict-flow-popup-layout-delete:hover {
1149
- background-color: #fdedec;
1241
+ background-color: var(--pf-button-danger-hover-bg);
1150
1242
  }
1151
1243
  .pict-flow-popup-settings-section {
1152
1244
  padding: 0.5em 0.75em;
@@ -1155,7 +1247,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1155
1247
  display: block;
1156
1248
  font-size: 0.8em;
1157
1249
  font-weight: 600;
1158
- color: #7f8c8d;
1250
+ color: var(--pf-text-secondary);
1159
1251
  text-transform: uppercase;
1160
1252
  letter-spacing: 0.05em;
1161
1253
  margin-bottom: 0.35em;
@@ -1163,17 +1255,17 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1163
1255
  .pict-flow-popup-settings-select {
1164
1256
  width: 100%;
1165
1257
  padding: 0.4em 0.5em;
1166
- border: 1px solid #d5d8dc;
1258
+ border: 1px solid var(--pf-input-border);
1167
1259
  border-radius: 4px;
1168
1260
  font-size: 0.9em;
1169
- background: #fff;
1170
- color: #2c3e50;
1261
+ background: var(--pf-panel-bg);
1262
+ color: var(--pf-text-primary);
1171
1263
  cursor: pointer;
1172
1264
  outline: none;
1173
1265
  box-sizing: border-box;
1174
1266
  }
1175
1267
  .pict-flow-popup-settings-select:focus {
1176
- border-color: #3498db;
1268
+ border-color: var(--pf-input-border-focus);
1177
1269
  }
1178
1270
  .pict-flow-popup-settings-slider-row {
1179
1271
  display: flex;
@@ -1185,7 +1277,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1185
1277
  -webkit-appearance: none;
1186
1278
  appearance: none;
1187
1279
  height: 4px;
1188
- background: #d5d8dc;
1280
+ background: var(--pf-input-border);
1189
1281
  border-radius: 2px;
1190
1282
  outline: none;
1191
1283
  cursor: pointer;
@@ -1195,21 +1287,21 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1195
1287
  appearance: none;
1196
1288
  width: 14px;
1197
1289
  height: 14px;
1198
- background: #3498db;
1290
+ background: var(--pf-node-selected-stroke);
1199
1291
  border-radius: 50%;
1200
1292
  cursor: pointer;
1201
1293
  }
1202
1294
  .pict-flow-popup-settings-slider::-moz-range-thumb {
1203
1295
  width: 14px;
1204
1296
  height: 14px;
1205
- background: #3498db;
1297
+ background: var(--pf-node-selected-stroke);
1206
1298
  border-radius: 50%;
1207
1299
  cursor: pointer;
1208
1300
  border: none;
1209
1301
  }
1210
1302
  .pict-flow-popup-settings-slider-value {
1211
1303
  font-size: 0.85em;
1212
- color: #7f8c8d;
1304
+ color: var(--pf-text-secondary);
1213
1305
  min-width: 2.5em;
1214
1306
  text-align: right;
1215
1307
  }
@@ -1238,8 +1330,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1238
1330
  width: 36px;
1239
1331
  height: 36px;
1240
1332
  border-radius: 6px;
1241
- border: 1px solid #d5d8dc;
1242
- background-color: #ffffff;
1333
+ border: 1px solid var(--pf-card-border);
1334
+ background-color: var(--pf-toolbar-bg);
1243
1335
  box-shadow: 0 2px 6px rgba(0,0,0,0.1);
1244
1336
  cursor: pointer;
1245
1337
  display: flex;
@@ -1248,7 +1340,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1248
1340
  transition: background-color 0.15s, box-shadow 0.15s;
1249
1341
  }
1250
1342
  .pict-flow-toolbar-expand-btn:hover {
1251
- background-color: #ecf0f1;
1343
+ background-color: var(--pf-button-hover-bg);
1252
1344
  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
1253
1345
  }
1254
1346
  `;
@@ -1270,8 +1362,8 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1270
1362
  gap: 2px;
1271
1363
  padding: 4px;
1272
1364
  border-radius: 8px;
1273
- border: 1px solid #d5d8dc;
1274
- background-color: #ffffff;
1365
+ border: 1px solid var(--pf-card-border);
1366
+ background-color: var(--pf-toolbar-bg);
1275
1367
  box-shadow: 0 4px 16px rgba(0,0,0,0.12);
1276
1368
  pointer-events: auto;
1277
1369
  }
@@ -1285,7 +1377,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1285
1377
  transition: background-color 0.15s;
1286
1378
  }
1287
1379
  .pict-flow-floating-grip:hover {
1288
- background-color: #ecf0f1;
1380
+ background-color: var(--pf-button-hover-bg);
1289
1381
  }
1290
1382
  .pict-flow-floating-grip:active {
1291
1383
  cursor: grabbing;
@@ -1303,14 +1395,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1303
1395
  transition: background-color 0.15s;
1304
1396
  }
1305
1397
  .pict-flow-floating-btn:hover {
1306
- background-color: #ecf0f1;
1398
+ background-color: var(--pf-button-hover-bg);
1307
1399
  }
1308
1400
  .pict-flow-floating-btn.danger:hover {
1309
- background-color: #fdedec;
1401
+ background-color: var(--pf-button-danger-hover-bg);
1310
1402
  }
1311
1403
  .pict-flow-floating-separator {
1312
1404
  height: 1px;
1313
- background-color: #ecf0f1;
1405
+ background-color: var(--pf-divider-light);
1314
1406
  margin: 2px 4px;
1315
1407
  }
1316
1408
  /* Collapsed floating toolbar — grip-only draggable square */
@@ -1411,7 +1503,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1411
1503
  stroke-width: 2;
1412
1504
  }
1413
1505
  .pict-flow-node:hover .pict-flow-node-bracket {
1414
- stroke: #b0b8c0;
1506
+ stroke: var(--pf-node-body-stroke-hover);
1415
1507
  stroke-width: 1.5;
1416
1508
  }
1417
1509
 
@@ -1461,6 +1553,7 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1461
1553
  this.getPanelCSS() +
1462
1554
  this.getInfoPanelCSS() +
1463
1555
  this.getNodePropsEditorCSS() +
1556
+ this.getPanelTabsCSS() +
1464
1557
  this.getBracketNodeCSS() +
1465
1558
  this.getFullscreenCSS() +
1466
1559
  this.getToolbarCSS() +