@procaaso/alphinity-ui-components 1.0.5 → 1.0.6

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/index.d.cts CHANGED
@@ -1106,11 +1106,30 @@ declare const exampleDiagram: Diagram;
1106
1106
  */
1107
1107
  declare const mockSymbolLibrary: Record<string, SymbolDefinition>;
1108
1108
  /**
1109
- * Get symbol definition by ID
1109
+ * Register a custom symbol definition
1110
+ * @param symbol - The symbol definition to register
1111
+ * @example
1112
+ * registerSymbol({
1113
+ * id: 'my-custom-valve',
1114
+ * name: 'My Custom Valve',
1115
+ * category: 'valve',
1116
+ * viewBox: { x: 0, y: 0, width: 100, height: 100 },
1117
+ * ports: [...],
1118
+ * svgContent: '...',
1119
+ * });
1120
+ */
1121
+ declare function registerSymbol(symbol: SymbolDefinition): void;
1122
+ /**
1123
+ * Register multiple custom symbols at once
1124
+ * @param symbols - Array of symbol definitions or a record of symbols
1125
+ */
1126
+ declare function registerSymbols(symbols: SymbolDefinition[] | Record<string, SymbolDefinition>): void;
1127
+ /**
1128
+ * Get symbol definition by ID (checks both mock library and custom symbols)
1110
1129
  */
1111
1130
  declare function getSymbolDefinition(symbolId: string): SymbolDefinition | undefined;
1112
1131
  /**
1113
- * Get all available symbol IDs
1132
+ * Get all available symbol IDs (includes both mock library and custom symbols)
1114
1133
  */
1115
1134
  declare function getAvailableSymbols(): string[];
1116
1135
 
@@ -1177,4 +1196,4 @@ interface SimulationOptions {
1177
1196
  */
1178
1197
  declare function useSimulation(telemetry: TelemetryMap, updateTelemetryBatch: (updates: Array<any>) => void, options?: SimulationOptions): void;
1179
1198
 
1180
- export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, ControlPanel, type ControlPanelProps, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeInstance, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
1199
+ export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, ControlPanel, type ControlPanelProps, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeInstance, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
package/dist/index.d.ts CHANGED
@@ -1106,11 +1106,30 @@ declare const exampleDiagram: Diagram;
1106
1106
  */
1107
1107
  declare const mockSymbolLibrary: Record<string, SymbolDefinition>;
1108
1108
  /**
1109
- * Get symbol definition by ID
1109
+ * Register a custom symbol definition
1110
+ * @param symbol - The symbol definition to register
1111
+ * @example
1112
+ * registerSymbol({
1113
+ * id: 'my-custom-valve',
1114
+ * name: 'My Custom Valve',
1115
+ * category: 'valve',
1116
+ * viewBox: { x: 0, y: 0, width: 100, height: 100 },
1117
+ * ports: [...],
1118
+ * svgContent: '...',
1119
+ * });
1120
+ */
1121
+ declare function registerSymbol(symbol: SymbolDefinition): void;
1122
+ /**
1123
+ * Register multiple custom symbols at once
1124
+ * @param symbols - Array of symbol definitions or a record of symbols
1125
+ */
1126
+ declare function registerSymbols(symbols: SymbolDefinition[] | Record<string, SymbolDefinition>): void;
1127
+ /**
1128
+ * Get symbol definition by ID (checks both mock library and custom symbols)
1110
1129
  */
1111
1130
  declare function getSymbolDefinition(symbolId: string): SymbolDefinition | undefined;
1112
1131
  /**
1113
- * Get all available symbol IDs
1132
+ * Get all available symbol IDs (includes both mock library and custom symbols)
1114
1133
  */
1115
1134
  declare function getAvailableSymbols(): string[];
1116
1135
 
@@ -1177,4 +1196,4 @@ interface SimulationOptions {
1177
1196
  */
1178
1197
  declare function useSimulation(telemetry: TelemetryMap, updateTelemetryBatch: (updates: Array<any>) => void, options?: SimulationOptions): void;
1179
1198
 
1180
- export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, ControlPanel, type ControlPanelProps, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeInstance, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
1199
+ export { type AnchorType, Button, type ButtonProps, CardHeader, CardUnit, CardValue, CircularGauge, type CircularGaugeProps, ControlPanel, type ControlPanelProps, DEFAULT_THRESHOLDS, DashboardCard, type DataBinding, type Diagram, type DiagramMetadata, type DisplayMode, DisplayModeToggle, type DragPoint, type DragState, EquipmentIndicator, type EquipmentIndicatorProps, EquipmentIndicatorWithSparkline, type EquipmentIndicatorWithSparklineProps, FixedSVGContainer, FooterPanel, FullscreenContainer, FullscreenWorkspace, type FullscreenWorkspaceProps, type FullscreenWorkspaceTab, type KeyboardShortcutsOptions, LeftPanel, LeftToggleButton, LegacyValueEntry, type LegacyValueEntryProps, type ModeConfig, NodeConfigPanel, type NodeConfigPanelProps, type NodeInstance, type Overlay, type OverlayContent, type OverlayTheme, type OverlayType, PIDCanvas, type PIDCanvasControls, type PIDCanvasFeatures, type PIDCanvasProps, PanelContent, PanelTabs, type PipeEdge, type PipeStyle, type Point, type PortDefinition, type PortInstance, type PortType, RightPanel, RightToggleButton, SVGArea, SVGLockedOverlay, type SVGLockedOverlayProps, ScrollableSVGWrapper, type SelectionState, Selector, type SelectorOption, type SelectorProps, type SimulationOptions, Sparkline, type SparklineProps, StatusIndicator, type StatusIndicatorProps, type SymbolCategory, type SymbolDefinition, SymbolLibrary, type SymbolLibraryProps, type SymbolMetadata, type TelemetryBinding, type TelemetryMap, type TelemetryStatus$1 as TelemetryStatus, type TelemetryValue, ThemeProvider, ThemeToggle, type ThemeToggleProps, type Thresholds, type Transform, TrendLine, type TrendLineProps, type UseDragOptions, type UseDragResult, type UseSelectionOptions, type UseSelectionResult, type UseTelemetryOptions, type UseTelemetryResult, type UseTelemetryStatusOptions, type UseViewBoxOptions, type UseViewBoxResult, ValueEntry, type ValueEntryProps, type ViewBox, ZoomButton, ZoomControls, calculateThresholdStatus, exampleDiagram, exportDiagram, generateRoutePoints, getAvailableSymbols, getPortWorldPosition, getSymbolDefinition, importDiagram, mockSymbolLibrary, nodeHasPort, overlayStyles, registerSymbol, registerSymbols, useDrag, useKeyboardShortcuts, useSelection, useSimulation, useTelemetry, useTelemetryStatus, useTheme, useViewBox, validateDiagram };
package/dist/index.js CHANGED
@@ -1702,13 +1702,13 @@ var mockSymbolLibrary = {
1702
1702
  id: "valve-gate",
1703
1703
  name: "Gate Valve (Powered)",
1704
1704
  category: "valve",
1705
- viewBox: { x: 0, y: 0, width: 52, height: 52 },
1705
+ viewBox: { x: 0, y: 0, width: 26, height: 26 },
1706
1706
  ports: [
1707
- { id: "inlet", x: 0, y: 36, type: "inlet", direction: "in" },
1708
- { id: "outlet", x: 52, y: 36, type: "outlet", direction: "out" }
1707
+ { id: "inlet", x: 0, y: 18, type: "inlet", direction: "in" },
1708
+ { id: "outlet", x: 26, y: 18, type: "outlet", direction: "out" }
1709
1709
  ],
1710
1710
  svgContent: `
1711
- <g>
1711
+ <g transform="scale(0.5)">
1712
1712
  <!-- Actuator box -->
1713
1713
  <rect x="16.74" y="0" width="18.02" height="18.02" fill="var(--symbol-fill, #edeeef)" stroke="var(--symbol-stroke, #666666)" pointer-events="all"/>
1714
1714
  <!-- Actuator stem -->
@@ -1726,13 +1726,13 @@ var mockSymbolLibrary = {
1726
1726
  id: "pump-positive-displacement",
1727
1727
  name: "Positive Displacement Pump",
1728
1728
  category: "pump",
1729
- viewBox: { x: 0, y: 0, width: 56.25, height: 56.25 },
1729
+ viewBox: { x: 0, y: 0, width: 28.125, height: 28.125 },
1730
1730
  ports: [
1731
- { id: "inlet", x: 0, y: 28.125, type: "inlet", direction: "in" },
1732
- { id: "outlet", x: 56.25, y: 28.125, type: "outlet", direction: "out" }
1731
+ { id: "inlet", x: 0, y: 14.0625, type: "inlet", direction: "in" },
1732
+ { id: "outlet", x: 28.125, y: 14.0625, type: "outlet", direction: "out" }
1733
1733
  ],
1734
1734
  svgContent: `
1735
- <g transform="scale(0.5625)">
1735
+ <g transform="scale(0.28125)">
1736
1736
  <!-- Outer circle -->
1737
1737
  <ellipse
1738
1738
  cx="50"
@@ -1774,13 +1774,13 @@ var mockSymbolLibrary = {
1774
1774
  id: "vannefold-bottom",
1775
1775
  name: "Vannefold Block (Bottom)",
1776
1776
  category: "valve",
1777
- viewBox: { x: -0.5, y: -0.5, width: 88, height: 67.785156 },
1777
+ viewBox: { x: -0.25, y: -0.25, width: 44, height: 33.892578 },
1778
1778
  ports: [
1779
- { id: "bottom-inlet", x: 0, y: 25, type: "control", direction: "in" },
1780
- { id: "top-outlet", x: 48, y: 65, type: "control", direction: "out" }
1779
+ { id: "bottom-inlet", x: 0, y: 12.5, type: "control", direction: "in" },
1780
+ { id: "top-outlet", x: 24, y: 32.5, type: "control", direction: "out" }
1781
1781
  ],
1782
1782
  svgContent: `
1783
- <g>
1783
+ <g transform="scale(0.5)">
1784
1784
  <!-- Bottom inlet pipe -->
1785
1785
  <path
1786
1786
  d="M 3,29.785156 H 0 v -10 h 3 m 14,10 h 3 v -10 h -3 m -15,8 h 16 m -16,-6 h 16"
@@ -1838,13 +1838,13 @@ var mockSymbolLibrary = {
1838
1838
  id: "vannefold-middle",
1839
1839
  name: "Vannefold Block (Middle)",
1840
1840
  category: "valve",
1841
- viewBox: { x: -0.5, y: -0.5, width: 95, height: 53.097656 },
1841
+ viewBox: { x: -0.25, y: -0.25, width: 47.5, height: 26.548828 },
1842
1842
  ports: [
1843
- { id: "left-inlet", x: 0, y: 27.3125, type: "control", direction: "in" },
1844
- { id: "right-outlet", x: 95, y: 27.3125, type: "control", direction: "out" }
1843
+ { id: "left-inlet", x: 0, y: 13.65625, type: "control", direction: "in" },
1844
+ { id: "right-outlet", x: 47.5, y: 13.65625, type: "control", direction: "out" }
1845
1845
  ],
1846
1846
  svgContent: `
1847
- <g>
1847
+ <g transform="scale(0.5)">
1848
1848
  <!-- Left inlet pipe -->
1849
1849
  <path
1850
1850
  d="M 3,22.3125 H 0 v 10 H 3 m 14,-10 h 3 v 10 h -3 m -15,-8 h 16 m -16,6 h 16"
@@ -1893,13 +1893,13 @@ var mockSymbolLibrary = {
1893
1893
  id: "vannefold-top",
1894
1894
  name: "Vannefold Block (Top)",
1895
1895
  category: "valve",
1896
- viewBox: { x: -0.5, y: -0.5, width: 95, height: 60.785156 },
1896
+ viewBox: { x: -0.25, y: -0.25, width: 47.5, height: 30.392578 },
1897
1897
  ports: [
1898
- { id: "bottom-inlet", x: 0, y: 35, type: "control", direction: "in" },
1899
- { id: "top-outlet", x: 48, y: 0, type: "control", direction: "out" }
1898
+ { id: "bottom-inlet", x: 0, y: 17.5, type: "control", direction: "in" },
1899
+ { id: "top-outlet", x: 24, y: 0, type: "control", direction: "out" }
1900
1900
  ],
1901
1901
  svgContent: `
1902
- <g>
1902
+ <g transform="scale(0.5)">
1903
1903
  <!-- Bottom inlet pipe -->
1904
1904
  <path
1905
1905
  d="M 3,30 H 0 V 40 H 3 M 17,30 h 3 V 40 H 17 M 2,32 H 18 M 2,38 H 18"
@@ -1949,13 +1949,13 @@ var mockSymbolLibrary = {
1949
1949
  id: "vannefold-top-top-inlet",
1950
1950
  name: "Vannefold Block (Top, Top Inlet)",
1951
1951
  category: "valve",
1952
- viewBox: { x: 0, y: 0, width: 88, height: 67.576004 },
1952
+ viewBox: { x: 0, y: 0, width: 44, height: 33.788002 },
1953
1953
  ports: [
1954
- { id: "top-inlet", x: 47, y: 0, type: "control", direction: "in" },
1955
- { id: "bottom-outlet", x: 0, y: 42, type: "control", direction: "out" }
1954
+ { id: "top-inlet", x: 23.5, y: 0, type: "control", direction: "in" },
1955
+ { id: "bottom-outlet", x: 0, y: 21, type: "control", direction: "out" }
1956
1956
  ],
1957
1957
  svgContent: `
1958
- <g>
1958
+ <g transform="scale(0.5)">
1959
1959
  <!-- Top inlet pipe flange -->
1960
1960
  <path
1961
1961
  d="M 52,3 V 1.3598666e-8 H 42 V 3 m 10,14 v 3 H 42 V 17 M 50,2 V 18 M 44,2 v 16"
@@ -2013,13 +2013,13 @@ var mockSymbolLibrary = {
2013
2013
  id: "vannefold-left",
2014
2014
  name: "Vannefold Block (Left)",
2015
2015
  category: "valve",
2016
- viewBox: { x: 0, y: 0, width: 67.785156, height: 88.5 },
2016
+ viewBox: { x: 0, y: 0, width: 33.892578, height: 44.25 },
2017
2017
  ports: [
2018
- { id: "left-inlet", x: 0, y: 41.5, type: "control", direction: "in" },
2019
- { id: "right-outlet", x: 42, y: 87, type: "control", direction: "out" }
2018
+ { id: "left-inlet", x: 0, y: 20.75, type: "control", direction: "in" },
2019
+ { id: "right-outlet", x: 21, y: 43.5, type: "control", direction: "out" }
2020
2020
  ],
2021
2021
  svgContent: `
2022
- <g>
2022
+ <g transform="scale(0.5)">
2023
2023
  <!-- Left inlet pipe flange -->
2024
2024
  <path
2025
2025
  d="M 3,46.5 H 2.8789924e-8 v -10 H 3 m 14,10 h 3 v -10 h -3 m -15,8 h 16 m -16,-6 h 16"
@@ -2076,13 +2076,13 @@ var mockSymbolLibrary = {
2076
2076
  id: "vannefold-right",
2077
2077
  name: "Vannefold Block (Right)",
2078
2078
  category: "valve",
2079
- viewBox: { x: 0, y: 0, width: 67.785156, height: 88.5 },
2079
+ viewBox: { x: 0, y: 0, width: 33.892578, height: 44.25 },
2080
2080
  ports: [
2081
- { id: "right-inlet", x: 67.785156, y: 41.5, type: "control", direction: "in" },
2082
- { id: "left-outlet", x: 24.785156, y: 87.5, type: "control", direction: "out" }
2081
+ { id: "right-inlet", x: 33.892578, y: 20.75, type: "control", direction: "in" },
2082
+ { id: "left-outlet", x: 12.392578, y: 43.75, type: "control", direction: "out" }
2083
2083
  ],
2084
2084
  svgContent: `
2085
- <g>
2085
+ <g transform="scale(0.5)">
2086
2086
  <!-- Right inlet pipe flange -->
2087
2087
  <path
2088
2088
  d="m 63.785156,46.5 h 3 v -10 h -3 m -14,10 h -3 v -10 h 3 m 15,8 h -16 m 16,-6 h -16"
@@ -2139,16 +2139,16 @@ var mockSymbolLibrary = {
2139
2139
  id: "pixer",
2140
2140
  name: "Pixer",
2141
2141
  category: "pump",
2142
- viewBox: { x: 0, y: 0, width: 50.625, height: 46.6875 },
2142
+ viewBox: { x: 0, y: 0, width: 25.3125, height: 23.34375 },
2143
2143
  ports: [
2144
- { id: "right-outlet", x: 50.625, y: 30.9375, type: "control", direction: "out" },
2145
- { id: "left-outlet", x: 0, y: 30.9375, type: "control", direction: "out" },
2146
- { id: "left-inlet", x: 50.625, y: 19.6875, type: "control", direction: "in" },
2147
- { id: "right-inlet", x: 0, y: 19.6875, type: "control", direction: "in" },
2148
- { id: "top-inlet", x: 25.3125, y: 0, type: "control", direction: "in" }
2144
+ { id: "right-outlet", x: 25.3125, y: 15.46875, type: "control", direction: "out" },
2145
+ { id: "left-outlet", x: 0, y: 15.46875, type: "control", direction: "out" },
2146
+ { id: "left-inlet", x: 25.3125, y: 9.84375, type: "control", direction: "in" },
2147
+ { id: "right-inlet", x: 0, y: 9.84375, type: "control", direction: "in" },
2148
+ { id: "top-inlet", x: 12.65625, y: 0, type: "control", direction: "in" }
2149
2149
  ],
2150
2150
  svgContent: `
2151
- <g transform="scale(0.196875) translate(-195, -186)">
2151
+ <g transform="scale(0.0984375) translate(-195, -186)">
2152
2152
  <!-- Top mounting flange -->
2153
2153
  <rect
2154
2154
  width="141.313"
@@ -2413,16 +2413,16 @@ var mockSymbolLibrary = {
2413
2413
  id: "pixer-barb",
2414
2414
  name: "Pixer (Hose Barb)",
2415
2415
  category: "pump",
2416
- viewBox: { x: 0, y: 0, width: 50.625, height: 46.6875 },
2416
+ viewBox: { x: 0, y: 0, width: 25.3125, height: 23.34375 },
2417
2417
  ports: [
2418
- { id: "right-outlet", x: 50.625, y: 30.9375, type: "control", direction: "out" },
2419
- { id: "left-outlet", x: 0, y: 30.9375, type: "control", direction: "out" },
2420
- { id: "left-inlet", x: 50.625, y: 19.6875, type: "control", direction: "in" },
2421
- { id: "right-inlet", x: 0, y: 19.6875, type: "control", direction: "in" },
2422
- { id: "top-inlet", x: 25.3125, y: 0, type: "control", direction: "in" }
2418
+ { id: "right-outlet", x: 25.3125, y: 15.46875, type: "control", direction: "out" },
2419
+ { id: "left-outlet", x: 0, y: 15.46875, type: "control", direction: "out" },
2420
+ { id: "left-inlet", x: 25.3125, y: 9.84375, type: "control", direction: "in" },
2421
+ { id: "right-inlet", x: 0, y: 9.84375, type: "control", direction: "in" },
2422
+ { id: "top-inlet", x: 12.65625, y: 0, type: "control", direction: "in" }
2423
2423
  ],
2424
2424
  svgContent: `
2425
- <g transform="scale(0.196875) translate(-195, -186)">
2425
+ <g transform="scale(0.0984375) translate(-195, -186)">
2426
2426
  <!-- Hose barb ridges at top -->
2427
2427
  <rect
2428
2428
  width="20"
@@ -2704,15 +2704,15 @@ var mockSymbolLibrary = {
2704
2704
  id: "vessel-balloon",
2705
2705
  name: "Vessel",
2706
2706
  category: "vessel",
2707
- viewBox: { x: 0, y: 0, width: 50.625, height: 91 },
2707
+ viewBox: { x: 0, y: 0, width: 25.3125, height: 45.5 },
2708
2708
  ports: [
2709
- { id: "top", type: "inlet", x: 25.3125, y: 0 },
2710
- { id: "left", type: "inlet", x: 5, y: 39 },
2711
- { id: "right", type: "outlet", x: 45.625, y: 39 },
2712
- { id: "bottom", type: "outlet", x: 25.3125, y: 91 }
2709
+ { id: "top", type: "inlet", x: 12.65625, y: 0 },
2710
+ { id: "left", type: "inlet", x: 2.5, y: 19.5 },
2711
+ { id: "right", type: "outlet", x: 22.8125, y: 19.5 },
2712
+ { id: "bottom", type: "outlet", x: 12.65625, y: 45.5 }
2713
2713
  ],
2714
2714
  svgContent: `
2715
- <g transform="scale(0.196875) translate(-195, -100)">
2715
+ <g transform="scale(0.0984375) translate(-195, -100)">
2716
2716
  <!-- Top opening nozzle -->
2717
2717
  <rect
2718
2718
  width="65"
@@ -2777,19 +2777,53 @@ var mockSymbolLibrary = {
2777
2777
  tags: ["vessel", "storage", "tank", "balloon"]
2778
2778
  }
2779
2779
  },
2780
+ "hollow-fiber": {
2781
+ id: "hollow-fiber",
2782
+ name: "Hollow Fiber",
2783
+ category: "other",
2784
+ viewBox: { x: 0, y: 0, width: 30, height: 109 },
2785
+ ports: [
2786
+ { id: "top-left", type: "outlet", x: 10, y: 2.75 },
2787
+ { id: "top-right", type: "outlet", x: 24.5, y: 22.25 },
2788
+ { id: "bottom-left", type: "inlet", x: 10, y: 106.25 },
2789
+ { id: "bottom-right", type: "inlet", x: 24.5, y: 87.25 }
2790
+ ],
2791
+ svgContent: `
2792
+ <g transform="scale(0.5)">
2793
+ <!-- Top left flange -->
2794
+ <rect x="10.5" y="0.5" width="20" height="10" rx="1.5" ry="1.5" fill="var(--symbol-fill, #eaeaea)" stroke="var(--symbol-stroke, #000000)" />
2795
+
2796
+ <!-- Top right flange -->
2797
+ <rect x="39.5" y="39.5" width="20" height="10" rx="1.5" ry="1.5" fill="var(--symbol-fill, #eaeaea)" stroke="var(--symbol-stroke, #000000)" />
2798
+
2799
+ <!-- Bottom left flange -->
2800
+ <rect x="10.5" y="207.5" width="20" height="10" rx="1.5" ry="1.5" fill="var(--symbol-fill, #eaeaea)" stroke="var(--symbol-stroke, #000000)" />
2801
+
2802
+ <!-- Bottom right flange -->
2803
+ <rect x="39.5" y="169.5" width="20" height="10" rx="1.5" ry="1.5" fill="var(--symbol-fill, #eaeaea)" stroke="var(--symbol-stroke, #000000)" />
2804
+
2805
+ <!-- Main vessel body -->
2806
+ <rect x="0.5" y="9.5" width="40" height="199.5" rx="6" ry="6" fill="var(--symbol-fill, #eaeaea)" stroke="var(--symbol-stroke, #000000)" />
2807
+ </g>
2808
+ `,
2809
+ metadata: {
2810
+ description: "Hollow fiber filter module with multiple inlet/outlet connections",
2811
+ tags: ["filter", "hollow-fiber", "filtration", "separation", "membrane"]
2812
+ }
2813
+ },
2780
2814
  "psr-f": {
2781
2815
  id: "psr-f",
2782
2816
  name: "PSR F",
2783
2817
  category: "instrument",
2784
- viewBox: { x: 0, y: 0, width: 57, height: 57 },
2818
+ viewBox: { x: 0, y: 0, width: 28.5, height: 28.5 },
2785
2819
  ports: [
2786
- { id: "top", type: "signal", x: 28.5, y: 14.25 },
2787
- { id: "right", type: "signal", x: 42.75, y: 28.5 },
2788
- { id: "bottom", type: "signal", x: 28.5, y: 42.75 },
2789
- { id: "left", type: "signal", x: 14.25, y: 28.5 }
2820
+ { id: "top", type: "signal", x: 14.25, y: 7.125 },
2821
+ { id: "right", type: "signal", x: 21.375, y: 14.25 },
2822
+ { id: "bottom", type: "signal", x: 14.25, y: 21.375 },
2823
+ { id: "left", type: "signal", x: 7.125, y: 14.25 }
2790
2824
  ],
2791
2825
  svgContent: `
2792
- <g transform="scale(0.5) translate(28.5, 28.5)">
2826
+ <g transform="scale(0.25) translate(28.5, 28.5)">
2793
2827
  <!-- Circle background -->
2794
2828
  <ellipse
2795
2829
  cx="28.5"
@@ -2823,15 +2857,15 @@ var mockSymbolLibrary = {
2823
2857
  id: "psr-p",
2824
2858
  name: "PSR P",
2825
2859
  category: "instrument",
2826
- viewBox: { x: 0, y: 0, width: 57, height: 57 },
2860
+ viewBox: { x: 0, y: 0, width: 28.5, height: 28.5 },
2827
2861
  ports: [
2828
- { id: "top", type: "signal", x: 28.5, y: 14.25 },
2829
- { id: "right", type: "signal", x: 42.75, y: 28.5 },
2830
- { id: "bottom", type: "signal", x: 28.5, y: 42.75 },
2831
- { id: "left", type: "signal", x: 14.25, y: 28.5 }
2862
+ { id: "top", type: "signal", x: 14.25, y: 7.125 },
2863
+ { id: "right", type: "signal", x: 21.375, y: 14.25 },
2864
+ { id: "bottom", type: "signal", x: 14.25, y: 21.375 },
2865
+ { id: "left", type: "signal", x: 7.125, y: 14.25 }
2832
2866
  ],
2833
2867
  svgContent: `
2834
- <g transform="scale(0.5) translate(28.5, 28.5)">
2868
+ <g transform="scale(0.25) translate(28.5, 28.5)">
2835
2869
  <!-- Circle background -->
2836
2870
  <ellipse
2837
2871
  cx="28.5"
@@ -2862,11 +2896,22 @@ var mockSymbolLibrary = {
2862
2896
  }
2863
2897
  }
2864
2898
  };
2899
+ var customSymbols = {};
2900
+ function registerSymbol(symbol) {
2901
+ customSymbols[symbol.id] = symbol;
2902
+ }
2903
+ function registerSymbols(symbols) {
2904
+ if (Array.isArray(symbols)) {
2905
+ symbols.forEach((symbol) => registerSymbol(symbol));
2906
+ } else {
2907
+ Object.values(symbols).forEach((symbol) => registerSymbol(symbol));
2908
+ }
2909
+ }
2865
2910
  function getSymbolDefinition(symbolId) {
2866
- return mockSymbolLibrary[symbolId];
2911
+ return customSymbols[symbolId] ?? mockSymbolLibrary[symbolId];
2867
2912
  }
2868
2913
  function getAvailableSymbols() {
2869
- return Object.keys(mockSymbolLibrary);
2914
+ return [...Object.keys(customSymbols), ...Object.keys(mockSymbolLibrary)];
2870
2915
  }
2871
2916
 
2872
2917
  // src/components/PIDCanvas/NodeRenderer.tsx
@@ -6495,6 +6540,8 @@ export {
6495
6540
  mockSymbolLibrary,
6496
6541
  nodeHasPort,
6497
6542
  overlayStyles,
6543
+ registerSymbol,
6544
+ registerSymbols,
6498
6545
  useDrag,
6499
6546
  useKeyboardShortcuts,
6500
6547
  useSelection,