pict-section-flow 0.0.19 → 1.0.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.
@@ -14,8 +14,8 @@ When a host application registers `pict-provider-theme`:
14
14
  ```javascript
15
15
  const libPictProviderTheme = require('pict-provider-theme');
16
16
  pict.addProvider('Theme', libPictProviderTheme.default_configuration, libPictProviderTheme);
17
- pict.providers.Theme.registerTheme(require('pict-provider-theme/source/themes/retold-default.json'));
18
- pict.providers.Theme.applyTheme('retold-default', 'system');
17
+ pict.providers.Theme.registerTheme(require('pict-provider-theme/source/themes/pict-default.json'));
18
+ pict.providers.Theme.applyTheme('pict-default', 'system');
19
19
  ```
20
20
 
21
21
  …the flow editor automatically detects it during `onBeforeInitialize` (duck-typed via `applyTheme`/`onApply`/`listThemes`) and subscribes to its `onApply` hook. On every host theme change the editor:
@@ -0,0 +1,18 @@
1
+ {
2
+ "Hash": "pict-section-flow",
3
+ "Name": "Pict Section Flow",
4
+ "Tagline": "Flow diagram section for visual workflow and process representations",
5
+ "Palette": "mix",
6
+ "Icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"frame-pict-section-flow-filled-light\">\n\t\t\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\" fill=\"#36d1d8\"/>\n\t\t<g clip-path=\"url(#frame-pict-section-flow-filled-light)\"><path d=\"M 16 26 L 48 66 L 80 26 Z\" fill=\"rgba(255,255,255,0.18)\"/>\n\t\t\t\t\t<path d=\"M 24 16 L 48 44 L 72 16 Z\" fill=\"#dc9958\" opacity=\"0.9\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"28\" font-weight=\"600\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">PSF</text>\n\t</svg>",
7
+ "IconType": "svg",
8
+ "Favicon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-pict-section-flow-light\">\n\t\t\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\" fill=\"#36d1d8\"/>\n\t\t<g clip-path=\"url(#fav-pict-section-flow-light)\"><path d=\"M 16 26 L 48 66 L 80 26 Z\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#ffffff\" letter-spacing=\"-1\">P</text>\n\t</svg>",
9
+ "FaviconDark": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" width=\"96\" height=\"96\">\n\t\t<defs>\n\t\t\t<clipPath id=\"fav-pict-section-flow-dark\">\n\t\t\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\"/>\n\t\t\t</clipPath>\n\t\t</defs>\n\t\t<path d=\"M 2 48\n\t\t\tC 2 18.0222416, 18.0222416 2, 48 2\n\t\t\tC 77.9777584 2, 94 18.0222416, 94 48\n\t\t\tC 94 77.9777584, 77.9777584 94, 48 94\n\t\t\tC 18.0222416 94, 2 77.9777584, 2 48 Z\" fill=\"#87dfe2\"/>\n\t\t<g clip-path=\"url(#fav-pict-section-flow-dark)\"><path d=\"M 16 26 L 48 66 L 80 26 Z\" fill=\"rgba(255,255,255,0.22)\"/></g>\n\t\t<text x=\"48\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\"\n\t\t\tfont-family=\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\"\n\t\t\tfont-size=\"60\" font-weight=\"800\"\n\t\t\tfill=\"#101418\" letter-spacing=\"-1\">P</text>\n\t</svg>",
10
+ "Colors": {
11
+ "Primary": "#36d1d8",
12
+ "Secondary": "#dc9958",
13
+ "PrimaryLight": "#36d1d8",
14
+ "PrimaryDark": "#87dfe2",
15
+ "SecondaryLight": "#dc9958",
16
+ "SecondaryDark": "#e9c7a7"
17
+ }
18
+ }
package/docs/index.html CHANGED
@@ -8,8 +8,6 @@
8
8
 
9
9
  <title>Pict-Section-Flow v0.0.17 Documentation</title>
10
10
 
11
- <!-- Application Stylesheet -->
12
- <link href="css/docuserve.css" rel="stylesheet">
13
11
  <!-- KaTeX stylesheet for LaTeX equation rendering -->
14
12
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css">
15
13
  <!-- PICT Dynamic View CSS Container -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pict-section-flow",
3
- "version": "0.0.19",
3
+ "version": "1.0.1",
4
4
  "description": "Pict Section Flow Diagram",
5
5
  "main": "source/Pict-Section-Flow.js",
6
6
  "scripts": {
@@ -21,8 +21,8 @@
21
21
  "devDependencies": {
22
22
  "chai": "^6.2.2",
23
23
  "mocha": "^11.7.5",
24
- "pict": "^1.0.367",
25
- "pict-docuserve": "^0.1.6",
24
+ "pict": "^1.0.369",
25
+ "pict-docuserve": "^1.3.2",
26
26
  "pict-router": "^1.0.10",
27
27
  "quackage": "^1.2.3"
28
28
  }
@@ -79,7 +79,7 @@ class PictFlowCard extends libFableServiceProviderBase
79
79
  this.cardEnabled = (typeof tmpOptions.Enabled === 'boolean') ? tmpOptions.Enabled : true;
80
80
 
81
81
  // --- Card appearance ---
82
- this.cardTitleBarColor = (tmpOptions.TitleBarColor) ? tmpOptions.TitleBarColor : '#2c3e50';
82
+ this.cardTitleBarColor = (tmpOptions.TitleBarColor) ? tmpOptions.TitleBarColor : 'var(--theme-color-text-primary, #2c3e50)';
83
83
  this.cardBodyStyle = (tmpOptions.BodyStyle) ? tmpOptions.BodyStyle : {};
84
84
  this.cardWidth = (typeof tmpOptions.Width === 'number') ? tmpOptions.Width : 180;
85
85
  this.cardHeight = (typeof tmpOptions.Height === 'number') ? tmpOptions.Height : 80;
@@ -261,7 +261,7 @@ module.exports.default_configuration =
261
261
  Inputs: [],
262
262
  Outputs: [],
263
263
  Enabled: true,
264
- TitleBarColor: '#2c3e50',
264
+ TitleBarColor: 'var(--theme-color-text-primary, #2c3e50)',
265
265
  BodyStyle: {},
266
266
  Width: 180,
267
267
  Height: 80,
@@ -70,13 +70,13 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
70
70
  --pf-node-selected-stroke: var(--theme-color-brand-primary, #3498db);
71
71
 
72
72
  /* Node Variants */
73
- --pf-node-start-fill: #eafaf1;
73
+ --pf-node-start-fill: var(--theme-color-background-hover, #eafaf1);
74
74
  --pf-node-start-stroke: var(--theme-color-status-success, #27ae60);
75
- --pf-node-end-fill: #e8f8f5;
76
- --pf-node-end-stroke: #1abc9c;
77
- --pf-node-halt-fill: #fdedec;
75
+ --pf-node-end-fill: var(--theme-color-background-hover, #e8f8f5);
76
+ --pf-node-end-stroke: var(--theme-color-brand-primary, #1abc9c);
77
+ --pf-node-halt-fill: var(--theme-color-background-hover, #fdedec);
78
78
  --pf-node-halt-stroke: var(--theme-color-status-error, #e74c3c);
79
- --pf-node-decision-fill: #fff9e6;
79
+ --pf-node-decision-fill: var(--theme-color-background-hover, #fff9e6);
80
80
  --pf-node-decision-stroke: var(--theme-color-status-warning, #f39c12);
81
81
 
82
82
  /* ── Color roles ───────────────────────────────────────
@@ -118,15 +118,15 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
118
118
  /* Port Type Colors */
119
119
  --pf-port-event-in-fill: var(--theme-color-status-info, #3498db);
120
120
  --pf-port-event-out-fill: var(--theme-color-status-success, #2ecc71);
121
- --pf-port-setting-fill: #e67e22;
122
- --pf-port-value-fill: #f1c40f;
121
+ --pf-port-setting-fill: var(--theme-color-status-warning, #e67e22);
122
+ --pf-port-value-fill: var(--theme-color-status-warning, #f1c40f);
123
123
  --pf-port-error-fill: var(--theme-color-status-error, #e74c3c);
124
124
 
125
125
  /* Connection Type Colors (match source port) */
126
126
  --pf-connection-event-in-stroke: var(--theme-color-status-info, #3498db);
127
127
  --pf-connection-event-out-stroke: var(--theme-color-status-success, #2ecc71);
128
- --pf-connection-setting-stroke: #e67e22;
129
- --pf-connection-value-stroke: #f1c40f;
128
+ --pf-connection-setting-stroke: var(--theme-color-status-warning, #e67e22);
129
+ --pf-connection-value-stroke: var(--theme-color-status-warning, #f1c40f);
130
130
  --pf-connection-error-stroke: var(--theme-color-status-error, #e74c3c);
131
131
 
132
132
  /* Connections */
@@ -161,14 +161,14 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
161
161
  --pf-button-hover-bg: var(--theme-color-background-hover, #ecf0f1);
162
162
  --pf-button-active-bg: var(--theme-color-background-selected, #d5dbdb);
163
163
  --pf-button-danger-text: var(--theme-color-status-error, #e74c3c);
164
- --pf-button-danger-hover-bg: #fdedec;
164
+ --pf-button-danger-hover-bg: var(--theme-color-background-hover, #fdedec);
165
165
  --pf-button-close-color: var(--theme-color-text-muted, #b0b8c0);
166
166
 
167
167
  /* Badges */
168
168
  --pf-badge-category-bg: var(--theme-color-background-tertiary, #f0f2f4);
169
169
  --pf-badge-category-text: var(--theme-color-text-secondary, #6b7b8d);
170
- --pf-badge-code-bg: #eaf2f8;
171
- --pf-badge-code-text: #2980b9;
170
+ --pf-badge-code-bg: var(--theme-color-background-hover, #eaf2f8);
171
+ --pf-badge-code-text: var(--theme-color-status-info, #2980b9);
172
172
 
173
173
  /* Info Panel */
174
174
  --pf-port-item-bg: var(--theme-color-background-secondary, #f8f9fa);
@@ -1978,6 +1978,32 @@ class PictProviderFlowCSS extends libFableServiceProviderBase
1978
1978
  this.log.warn('PictProviderFlowCSS: CSSMap not available; CSS not registered.');
1979
1979
  }
1980
1980
  }
1981
+
1982
+ /**
1983
+ * Register the active renderer's CSS overrides (GeometryCSS + AdditionalCSS).
1984
+ *
1985
+ * The renderer's CSS is registered at priority 501 — one higher than the
1986
+ * base container CSS — so its `.pict-flow-container { --pf-*: ... }`
1987
+ * declarations win the cascade against the equally-specific defaults in
1988
+ * `generateCSS()`. Called by PictView-Flow.setRenderer() after the
1989
+ * Flow-Renderer provider switches its active renderer.
1990
+ *
1991
+ * @param {Object} pRenderer - the active renderer definition (from PictProviderFlowRenderer)
1992
+ */
1993
+ registerRendererCSS(pRenderer)
1994
+ {
1995
+ if (!this.fable || !this.fable.CSSMap) { return; }
1996
+ this.fable.CSSMap.removeCSS('PictSectionFlow-Renderer-CSS');
1997
+ if (!pRenderer) { this.fable.CSSMap.injectCSS(); return; }
1998
+
1999
+ let tmpCSS = '';
2000
+ if (pRenderer.GeometryCSS) { tmpCSS += pRenderer.GeometryCSS; }
2001
+ if (pRenderer.AdditionalCSS) { tmpCSS += '\n' + pRenderer.AdditionalCSS; }
2002
+ if (tmpCSS.trim().length === 0) { this.fable.CSSMap.injectCSS(); return; }
2003
+
2004
+ this.fable.CSSMap.addCSS('PictSectionFlow-Renderer-CSS', tmpCSS, 501, 'PictProviderFlowCSS');
2005
+ this.fable.CSSMap.injectCSS();
2006
+ }
1981
2007
  }
1982
2008
 
1983
2009
  module.exports = PictProviderFlowCSS;
@@ -87,7 +87,7 @@ class PictProviderFlowConnectorShapes extends libFableServiceProviderBase
87
87
  RefX: '7.5',
88
88
  RefY: '3.5',
89
89
  Points: '0 0, 5 3.5, 0 7',
90
- Fill: '#95a5a6'
90
+ Fill: 'var(--theme-color-border-default, #95a5a6)'
91
91
  },
92
92
  'arrowhead-connection-selected':
93
93
  {
@@ -96,7 +96,7 @@ class PictProviderFlowConnectorShapes extends libFableServiceProviderBase
96
96
  RefX: '7.5',
97
97
  RefY: '3.5',
98
98
  Points: '0 0, 5 3.5, 0 7',
99
- Fill: '#3498db'
99
+ Fill: 'var(--theme-color-status-info, #3498db)'
100
100
  },
101
101
  'arrowhead-tether':
102
102
  {
@@ -105,7 +105,7 @@ class PictProviderFlowConnectorShapes extends libFableServiceProviderBase
105
105
  RefX: '6',
106
106
  RefY: '3',
107
107
  Points: '0 0, 4 3, 0 6',
108
- Fill: '#95a5a6'
108
+ Fill: 'var(--theme-color-border-default, #95a5a6)'
109
109
  }
110
110
  };
111
111
 
@@ -426,11 +426,11 @@ class PictProviderFlowConnectorShapes extends libFableServiceProviderBase
426
426
  // Per-port-type connection arrowheads
427
427
  let tmpPortTypeColors =
428
428
  {
429
- 'event-in': '#3498db',
430
- 'event-out': '#2ecc71',
431
- 'setting': '#e67e22',
432
- 'value': '#f1c40f',
433
- 'error': '#e74c3c'
429
+ 'event-in': 'var(--theme-color-status-info, #3498db)',
430
+ 'event-out': 'var(--theme-color-status-success, #2ecc71)',
431
+ 'setting': 'var(--theme-color-status-warning, #e67e22)',
432
+ 'value': 'var(--theme-color-status-warning, #f1c40f)',
433
+ 'error': 'var(--theme-color-status-error, #e74c3c)'
434
434
  };
435
435
 
436
436
  for (let tmpType in tmpPortTypeColors)
@@ -4,8 +4,8 @@ const libFableServiceProviderBase = require('fable-serviceproviderbase');
4
4
  * PictProvider-Flow-Icons
5
5
  *
6
6
  * Centralized SVG icon provider for the flow diagram.
7
- * All icons use a duotone style: 2px outline (#2c3e50) with
8
- * subtle filled accent shapes (#d5e8f7).
7
+ * All icons use a duotone style: 2px outline (var(--theme-color-text-primary, #2c3e50)) with
8
+ * subtle filled accent shapes (var(--theme-color-background-secondary, #d5e8f7)).
9
9
  *
10
10
  * Each icon is registered as a pict template with hash `Flow-Icon-{key}`,
11
11
  * making them individually overridable by consumers.
@@ -18,7 +18,7 @@ const _ProviderConfiguration =
18
18
 
19
19
  // ── Default Icon SVG Markup ────────────────────────────────────────────────
20
20
  // All icons: viewBox="0 0 24 24", duotone style
21
- // Accent fill: #d5e8f7, Stroke: #2c3e50, Stroke-width: 2
21
+ // Accent fill: var(--theme-color-background-secondary, #d5e8f7), Stroke: var(--theme-color-text-primary, #2c3e50), Stroke-width: 2
22
22
  //
23
23
  // The {FlowIconSize} placeholder is replaced at render time with the
24
24
  // requested pixel size. Each template is a self-contained <svg> element.
@@ -27,71 +27,71 @@ const _DefaultIcons =
27
27
  {
28
28
  // ── FlowCard Icons ─────────────────────────────────────────────────────
29
29
 
30
- 'ITE': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="6" r="3" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><circle cx="6" cy="18" r="2.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><circle cx="18" cy="18" r="2.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M12 9v2M9.5 12.5L6 15.5M14.5 12.5L18 15.5" stroke="#2c3e50" stroke-width="2"/></svg>',
30
+ 'ITE': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="6" r="3" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><circle cx="6" cy="18" r="2.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><circle cx="18" cy="18" r="2.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 9v2M9.5 12.5L6 15.5M14.5 12.5L18 15.5" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
31
31
 
32
- 'SW': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M3 12h5M16 12h5M14.8 9.2l3.7-5.2M14.8 14.8l3.7 5.2" stroke="#2c3e50" stroke-width="2"/></svg>',
32
+ 'SW': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M3 12h5M16 12h5M14.8 9.2l3.7-5.2M14.8 14.8l3.7 5.2" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
33
33
 
34
- 'EACH': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="14" y="3" width="7" height="7" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="3" y="14" width="7" height="7" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="14" y="14" width="7" height="7" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/></svg>',
34
+ 'EACH': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="14" y="3" width="7" height="7" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="3" y="14" width="7" height="7" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="14" y="14" width="7" height="7" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
35
35
 
36
- 'FREAD': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-7-7z" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M13 2v7h7" stroke="#2c3e50" stroke-width="2"/><path d="M9 13h6M9 17h4" stroke="#2c3e50" stroke-width="2"/></svg>',
36
+ 'FREAD': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-7-7z" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M13 2v7h7" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M9 13h6M9 17h4" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
37
37
 
38
- 'FWRITE': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-7-7z" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M13 2v7h7" stroke="#2c3e50" stroke-width="2"/><path d="M12 13v5M9.5 15.5L12 13l2.5 2.5" stroke="#2c3e50" stroke-width="2"/></svg>',
38
+ 'FWRITE': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-7-7z" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M13 2v7h7" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 13v5M9.5 15.5L12 13l2.5 2.5" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
39
39
 
40
- 'LOG': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><circle cx="7.5" cy="8" r="1" fill="#2c3e50"/><circle cx="7.5" cy="12" r="1" fill="#2c3e50"/><circle cx="7.5" cy="16" r="1" fill="#2c3e50"/><path d="M11 8h5.5M11 12h5.5M11 16h3.5" stroke="#2c3e50" stroke-width="2"/></svg>',
40
+ 'LOG': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><circle cx="7.5" cy="8" r="1" fill="var(--theme-color-text-primary, #2c3e50)"/><circle cx="7.5" cy="12" r="1" fill="var(--theme-color-text-primary, #2c3e50)"/><circle cx="7.5" cy="16" r="1" fill="var(--theme-color-text-primary, #2c3e50)"/><path d="M11 8h5.5M11 12h5.5M11 16h3.5" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
41
41
 
42
- 'GET': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M21 21l-5.15-5.15" stroke="#2c3e50" stroke-width="2"/></svg>',
42
+ 'GET': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="10.5" cy="10.5" r="6.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M21 21l-5.15-5.15" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
43
43
 
44
- 'SET': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4.5 1.5L4 16Z" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M14 6l3 3" stroke="#2c3e50" stroke-width="2"/></svg>',
44
+ 'SET': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4.5 1.5L4 16Z" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M14 6l3 3" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
45
45
 
46
46
  // ── UI Icons ───────────────────────────────────────────────────────────
47
47
 
48
- 'fullscreen': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/></svg>',
48
+ 'fullscreen': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 3h6v6"/><path d="M9 21H3v-6"/><path d="M21 3l-7 7"/><path d="M3 21l7-7"/></svg>',
49
49
 
50
- 'exit-fullscreen': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/></svg>',
50
+ 'exit-fullscreen': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 14h6v6"/><path d="M20 10h-6V4"/><path d="M14 10l7-7"/><path d="M3 21l7-7"/></svg>',
51
51
 
52
- 'close': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',
52
+ 'close': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',
53
53
 
54
- 'chevron-down': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>',
54
+ 'chevron-down': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>',
55
55
 
56
56
  // ── Toolbar & Popup Icons ─────────────────────────────────────────────
57
57
 
58
- 'search': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="#2c3e50" stroke-width="2"/></svg>',
58
+ 'search': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
59
59
 
60
- 'cards': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="16" height="12" rx="2" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M6 7V5a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-2" stroke="#2c3e50" stroke-width="2"/></svg>',
60
+ 'cards': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="16" height="12" rx="2" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M6 7V5a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-2" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
61
61
 
62
- 'layout': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="8" height="10" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="13" y="3" width="8" height="6" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="3" y="15" width="8" height="6" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="13" y="11" width="8" height="10" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/></svg>',
62
+ 'layout': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="8" height="10" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="13" y="3" width="8" height="6" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="3" y="15" width="8" height="6" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="13" y="11" width="8" height="10" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
63
63
 
64
- 'collapse': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M8 12h8" stroke="#2c3e50" stroke-width="2"/></svg>',
64
+ 'collapse': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M8 12h8" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
65
65
 
66
- 'expand': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M12 8v8M8 12h8" stroke="#2c3e50" stroke-width="2"/></svg>',
66
+ 'expand': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 8v8M8 12h8" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
67
67
 
68
- 'grip': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="#2c3e50"><circle cx="9" cy="5" r="1.5"/><circle cx="15" cy="5" r="1.5"/><circle cx="9" cy="12" r="1.5"/><circle cx="15" cy="12" r="1.5"/><circle cx="9" cy="19" r="1.5"/><circle cx="15" cy="19" r="1.5"/></svg>',
68
+ 'grip': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="var(--theme-color-text-primary, #2c3e50)"><circle cx="9" cy="5" r="1.5"/><circle cx="15" cy="5" r="1.5"/><circle cx="9" cy="12" r="1.5"/><circle cx="15" cy="12" r="1.5"/><circle cx="9" cy="19" r="1.5"/><circle cx="15" cy="19" r="1.5"/></svg>',
69
69
 
70
- 'settings': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3" fill="#d5e8f7"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>',
70
+ 'settings': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3" fill="var(--theme-color-background-secondary, #d5e8f7)"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>',
71
71
 
72
- 'plus': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M12 8v8M8 12h8" stroke="#2c3e50" stroke-width="2"/></svg>',
72
+ 'plus': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 8v8M8 12h8" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
73
73
 
74
- 'trash': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18" stroke="#2c3e50" stroke-width="2"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" stroke="#2c3e50" stroke-width="2"/><rect x="5" y="6" width="14" height="14" rx="2" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M10 11v6M14 11v6" stroke="#2c3e50" stroke-width="2"/></svg>',
74
+ 'trash': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="5" y="6" width="14" height="14" rx="2" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M10 11v6M14 11v6" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
75
75
 
76
- 'save': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M17 21v-8H7v8" stroke="#2c3e50" stroke-width="2"/><path d="M7 3v5h8" stroke="#2c3e50" stroke-width="2"/></svg>',
76
+ 'save': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M17 21v-8H7v8" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M7 3v5h8" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
77
77
 
78
- 'auto-layout': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="2" width="8" height="6" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="2" y="16" width="8" height="6" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><rect x="14" y="16" width="8" height="6" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M12 8v4M6 16v-4h12v4" stroke="#2c3e50" stroke-width="2"/></svg>',
78
+ 'auto-layout': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="2" width="8" height="6" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="2" y="16" width="8" height="6" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="14" y="16" width="8" height="6" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 8v4M6 16v-4h12v4" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
79
79
 
80
- 'zoom-in': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="#2c3e50" stroke-width="2"/><path d="M11 8v6M8 11h6" stroke="#2c3e50" stroke-width="2"/></svg>',
80
+ 'zoom-in': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M11 8v6M8 11h6" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
81
81
 
82
- 'zoom-out': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="#2c3e50" stroke-width="2"/><path d="M8 11h6" stroke="#2c3e50" stroke-width="2"/></svg>',
82
+ 'zoom-out': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M21 21l-4.35-4.35" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M8 11h6" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
83
83
 
84
- 'zoom-fit': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7V3h4"/><path d="M17 3h4v4"/><path d="M21 17v4h-4"/><path d="M7 21H3v-4"/><rect x="7" y="7" width="10" height="10" rx="1.5" fill="#d5e8f7"/></svg>',
84
+ 'zoom-fit': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 7V3h4"/><path d="M17 3h4v4"/><path d="M21 17v4h-4"/><path d="M7 21H3v-4"/><rect x="7" y="7" width="10" height="10" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)"/></svg>',
85
85
 
86
- 'dock': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="4" rx="1.5" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M12 20V11M8 14l4-4 4 4" stroke="#2c3e50" stroke-width="2"/></svg>',
86
+ 'dock': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="4" rx="1.5" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M12 20V11M8 14l4-4 4 4" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
87
87
 
88
- 'restore': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="#2c3e50" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/></svg>',
88
+ 'restore': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 3-6.7L3 8"/><path d="M3 3v5h5"/></svg>',
89
89
 
90
- 'delete-node': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18" stroke="#2c3e50" stroke-width="2"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" stroke="#2c3e50" stroke-width="2"/><rect x="5" y="6" width="14" height="14" rx="2" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><path d="M10 11v6M14 11v6" stroke="#2c3e50" stroke-width="2"/></svg>',
90
+ 'delete-node': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><rect x="5" y="6" width="14" height="14" rx="2" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><path d="M10 11v6M14 11v6" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/></svg>',
91
91
 
92
92
  // ── Fallback ───────────────────────────────────────────────────────────
93
93
 
94
- 'default': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="4" fill="#d5e8f7" stroke="#2c3e50" stroke-width="2"/><circle cx="12" cy="12" r="2.5" fill="#2c3e50"/></svg>'
94
+ 'default': '<svg xmlns="http://www.w3.org/2000/svg" width="{FlowIconSize}" height="{FlowIconSize}" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="4" fill="var(--theme-color-background-secondary, #d5e8f7)" stroke="var(--theme-color-text-primary, #2c3e50)" stroke-width="2"/><circle cx="12" cy="12" r="2.5" fill="var(--theme-color-text-primary, #2c3e50)"/></svg>'
95
95
  };
96
96
 
97
97
  class PictProviderFlowIcons extends libFableServiceProviderBase
@@ -19,7 +19,7 @@ const _DefaultNodeTypes =
19
19
  { Hash: null, Direction: 'output', Side: 'right', Label: 'Out' }
20
20
  ],
21
21
  ColorRole: 'neutral',
22
- TitleBarColor: '#2c3e50',
22
+ TitleBarColor: 'var(--theme-color-text-primary, #2c3e50)',
23
23
  BodyStyle: {}
24
24
  },
25
25
  'start':
@@ -33,11 +33,11 @@ const _DefaultNodeTypes =
33
33
  { Hash: null, Direction: 'output', Side: 'right', Label: 'Out' }
34
34
  ],
35
35
  ColorRole: 'success',
36
- TitleBarColor: '#27ae60',
36
+ TitleBarColor: 'var(--theme-color-status-success, #27ae60)',
37
37
  BodyStyle:
38
38
  {
39
- 'fill': '#eafaf1',
40
- 'stroke': '#27ae60'
39
+ 'fill': 'var(--theme-color-background-hover, #eafaf1)',
40
+ 'stroke': 'var(--theme-color-status-success, #27ae60)'
41
41
  }
42
42
  },
43
43
  'end':
@@ -51,11 +51,11 @@ const _DefaultNodeTypes =
51
51
  { Hash: null, Direction: 'input', Side: 'left', Label: 'In' }
52
52
  ],
53
53
  ColorRole: 'accent',
54
- TitleBarColor: '#1abc9c',
54
+ TitleBarColor: 'var(--theme-color-brand-primary, #1abc9c)',
55
55
  BodyStyle:
56
56
  {
57
57
  'fill': '#e8f8f5',
58
- 'stroke': '#1abc9c'
58
+ 'stroke': 'var(--theme-color-brand-primary, #1abc9c)'
59
59
  }
60
60
  },
61
61
  'halt':
@@ -69,11 +69,11 @@ const _DefaultNodeTypes =
69
69
  { Hash: null, Direction: 'input', Side: 'left', Label: 'In' }
70
70
  ],
71
71
  ColorRole: 'error',
72
- TitleBarColor: '#e74c3c',
72
+ TitleBarColor: 'var(--theme-color-status-error, #e74c3c)',
73
73
  BodyStyle:
74
74
  {
75
- 'fill': '#fdedec',
76
- 'stroke': '#e74c3c'
75
+ 'fill': 'var(--theme-color-background-hover, #fdedec)',
76
+ 'stroke': 'var(--theme-color-status-error, #e74c3c)'
77
77
  }
78
78
  },
79
79
  'decision':