@shumoku/core 0.2.0 → 0.2.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.
Files changed (56) hide show
  1. package/dist/icons/build-icons.js +3 -3
  2. package/dist/icons/build-icons.js.map +1 -1
  3. package/dist/icons/generated-icons.js +10 -10
  4. package/dist/icons/generated-icons.js.map +1 -1
  5. package/dist/index.d.ts +3 -4
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -8
  8. package/dist/index.js.map +1 -1
  9. package/dist/layout/hierarchical.d.ts +1 -1
  10. package/dist/layout/hierarchical.d.ts.map +1 -1
  11. package/dist/layout/hierarchical.js +82 -66
  12. package/dist/layout/hierarchical.js.map +1 -1
  13. package/dist/layout/index.d.ts +1 -1
  14. package/dist/layout/index.d.ts.map +1 -1
  15. package/dist/layout/index.js.map +1 -1
  16. package/dist/models/types.d.ts.map +1 -1
  17. package/dist/models/types.js +13 -13
  18. package/dist/models/types.js.map +1 -1
  19. package/dist/themes/dark.d.ts.map +1 -1
  20. package/dist/themes/dark.js +1 -1
  21. package/dist/themes/dark.js.map +1 -1
  22. package/dist/themes/index.d.ts +3 -3
  23. package/dist/themes/index.d.ts.map +1 -1
  24. package/dist/themes/index.js +4 -4
  25. package/dist/themes/index.js.map +1 -1
  26. package/dist/themes/modern.d.ts.map +1 -1
  27. package/dist/themes/modern.js.map +1 -1
  28. package/dist/themes/types.d.ts.map +1 -1
  29. package/dist/themes/utils.d.ts +1 -1
  30. package/dist/themes/utils.d.ts.map +1 -1
  31. package/dist/themes/utils.js +5 -4
  32. package/dist/themes/utils.js.map +1 -1
  33. package/package.json +88 -92
  34. package/src/constants.ts +35 -35
  35. package/src/icons/build-icons.ts +12 -6
  36. package/src/icons/generated-icons.ts +12 -12
  37. package/src/index.test.ts +66 -0
  38. package/src/index.ts +6 -13
  39. package/src/layout/hierarchical.ts +1251 -1221
  40. package/src/layout/index.ts +1 -1
  41. package/src/models/types.ts +47 -37
  42. package/src/themes/dark.ts +15 -15
  43. package/src/themes/index.ts +7 -7
  44. package/src/themes/modern.ts +22 -22
  45. package/src/themes/types.ts +26 -26
  46. package/src/themes/utils.ts +25 -24
  47. package/dist/renderer/index.d.ts +0 -6
  48. package/dist/renderer/index.d.ts.map +0 -1
  49. package/dist/renderer/index.js +0 -5
  50. package/dist/renderer/index.js.map +0 -1
  51. package/dist/renderer/svg.d.ts +0 -131
  52. package/dist/renderer/svg.d.ts.map +0 -1
  53. package/dist/renderer/svg.js +0 -1031
  54. package/dist/renderer/svg.js.map +0 -1
  55. package/src/renderer/index.ts +0 -6
  56. package/src/renderer/svg.ts +0 -1277
@@ -2,14 +2,14 @@
2
2
  * Theme utilities
3
3
  */
4
4
 
5
- import type { Theme, ThemeOptions, DeepPartial } from './types.js'
5
+ import type { DeepPartial, Theme, ThemeOptions } from './types.js'
6
6
 
7
7
  /**
8
8
  * Merge theme with overrides
9
9
  */
10
10
  export function mergeTheme(base: Theme, overrides?: DeepPartial<Theme>): Theme {
11
11
  if (!overrides) return base
12
-
12
+
13
13
  return deepMerge(base, overrides) as Theme
14
14
  }
15
15
 
@@ -26,7 +26,7 @@ export function createTheme(options: ThemeOptions): Theme {
26
26
  */
27
27
  export function applyThemeToCSS(theme: Theme, root: HTMLElement = document.documentElement): void {
28
28
  const prefix = '--shumoku'
29
-
29
+
30
30
  // Colors
31
31
  root.style.setProperty(`${prefix}-bg`, theme.colors.background)
32
32
  root.style.setProperty(`${prefix}-surface`, theme.colors.surface)
@@ -38,34 +38,34 @@ export function applyThemeToCSS(theme: Theme, root: HTMLElement = document.docum
38
38
  root.style.setProperty(`${prefix}-warning`, theme.colors.warning)
39
39
  root.style.setProperty(`${prefix}-error`, theme.colors.error)
40
40
  root.style.setProperty(`${prefix}-info`, theme.colors.info)
41
-
41
+
42
42
  // Dimensions
43
43
  root.style.setProperty(`${prefix}-radius-sm`, `${theme.dimensions.radius.small}px`)
44
44
  root.style.setProperty(`${prefix}-radius-md`, `${theme.dimensions.radius.medium}px`)
45
45
  root.style.setProperty(`${prefix}-radius-lg`, `${theme.dimensions.radius.large}px`)
46
-
46
+
47
47
  // Spacing
48
48
  root.style.setProperty(`${prefix}-space-xs`, `${theme.dimensions.spacing.xs}px`)
49
49
  root.style.setProperty(`${prefix}-space-sm`, `${theme.dimensions.spacing.sm}px`)
50
50
  root.style.setProperty(`${prefix}-space-md`, `${theme.dimensions.spacing.md}px`)
51
51
  root.style.setProperty(`${prefix}-space-lg`, `${theme.dimensions.spacing.lg}px`)
52
52
  root.style.setProperty(`${prefix}-space-xl`, `${theme.dimensions.spacing.xl}px`)
53
-
53
+
54
54
  // Typography
55
55
  root.style.setProperty(`${prefix}-font-sans`, theme.typography.fontFamily.sans)
56
56
  root.style.setProperty(`${prefix}-font-mono`, theme.typography.fontFamily.mono)
57
-
57
+
58
58
  // Shadows
59
59
  const shadowToCSS = (shadow: Theme['shadows'][keyof Theme['shadows']]) => {
60
60
  const alpha = shadow.alpha || 1
61
61
  const color = hexToRgba(shadow.color, alpha)
62
62
  return `${shadow.offsetX}px ${shadow.offsetY}px ${shadow.blur}px ${color}`
63
63
  }
64
-
64
+
65
65
  root.style.setProperty(`${prefix}-shadow-sm`, shadowToCSS(theme.shadows.small))
66
66
  root.style.setProperty(`${prefix}-shadow-md`, shadowToCSS(theme.shadows.medium))
67
67
  root.style.setProperty(`${prefix}-shadow-lg`, shadowToCSS(theme.shadows.large))
68
-
68
+
69
69
  // Set theme variant
70
70
  root.setAttribute('data-theme', theme.variant)
71
71
  }
@@ -76,11 +76,11 @@ export function applyThemeToCSS(theme: Theme, root: HTMLElement = document.docum
76
76
  export function getThemeFromCSS(root: HTMLElement = document.documentElement): Partial<Theme> {
77
77
  const prefix = '--shumoku'
78
78
  const style = getComputedStyle(root)
79
-
79
+
80
80
  const getVar = (name: string) => style.getPropertyValue(`${prefix}-${name}`).trim()
81
-
81
+
82
82
  return {
83
- variant: root.getAttribute('data-theme') as 'light' | 'dark' || 'light',
83
+ variant: (root.getAttribute('data-theme') as 'light' | 'dark') || 'light',
84
84
  colors: {
85
85
  background: getVar('bg'),
86
86
  surface: getVar('surface'),
@@ -99,29 +99,30 @@ export function getThemeFromCSS(root: HTMLElement = document.documentElement): P
99
99
  /**
100
100
  * Convert hex color to rgba
101
101
  */
102
- function hexToRgba(hex: string, alpha: number = 1): string {
102
+ function hexToRgba(hex: string, alpha = 1): string {
103
103
  if (hex === 'transparent') return 'transparent'
104
-
104
+
105
105
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
106
106
  if (!result) return hex
107
-
108
- const r = parseInt(result[1], 16)
109
- const g = parseInt(result[2], 16)
110
- const b = parseInt(result[3], 16)
111
-
107
+
108
+ const r = Number.parseInt(result[1], 16)
109
+ const g = Number.parseInt(result[2], 16)
110
+ const b = Number.parseInt(result[3], 16)
111
+
112
112
  return `rgba(${r}, ${g}, ${b}, ${alpha})`
113
113
  }
114
114
 
115
115
  /**
116
116
  * Deep merge utility
117
117
  */
118
+ // biome-ignore lint/suspicious/noExplicitAny: generic deep merge requires any types
118
119
  function deepMerge(target: any, source: any): any {
119
120
  if (!source) return target
120
-
121
+
121
122
  const result = { ...target }
122
-
123
+
123
124
  for (const key in source) {
124
- if (source.hasOwnProperty(key)) {
125
+ if (Object.hasOwn(source, key)) {
125
126
  if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
126
127
  result[key] = deepMerge(target[key] || {}, source[key])
127
128
  } else {
@@ -129,7 +130,7 @@ function deepMerge(target: any, source: any): any {
129
130
  }
130
131
  }
131
132
  }
132
-
133
+
133
134
  return result
134
135
  }
135
136
 
@@ -140,4 +141,4 @@ function getDefaultTheme(): Theme {
140
141
  // Lazy import to avoid circular dependency
141
142
  const { modernTheme } = require('./modern')
142
143
  return modernTheme
143
- }
144
+ }
@@ -1,6 +0,0 @@
1
- /**
2
- * Shumoku Renderers
3
- */
4
- export { SVGRenderer, svgRenderer } from './svg.js';
5
- export type { SVGRendererOptions } from './svg.js';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Shumoku Renderers
3
- */
4
- export { SVGRenderer, svgRenderer } from './svg.js';
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA"}
@@ -1,131 +0,0 @@
1
- /**
2
- * SVG Renderer
3
- * Renders NetworkGraph to SVG
4
- */
5
- import type { NetworkGraph, LayoutResult } from '../models/index.js';
6
- export interface SVGRendererOptions {
7
- /** Font family */
8
- fontFamily?: string;
9
- /** Include interactive elements */
10
- interactive?: boolean;
11
- }
12
- export declare class SVGRenderer {
13
- private options;
14
- private themeColors;
15
- private iconTheme;
16
- constructor(options?: SVGRendererOptions);
17
- /**
18
- * Get theme colors based on theme type
19
- */
20
- private getThemeColors;
21
- /**
22
- * Get icon theme variant based on theme type
23
- */
24
- private getIconTheme;
25
- render(graph: NetworkGraph, layout: LayoutResult): string;
26
- /**
27
- * Calculate legend dimensions without rendering
28
- */
29
- private calculateLegendDimensions;
30
- /**
31
- * Parse legend settings from various input formats
32
- */
33
- private getLegendSettings;
34
- /**
35
- * Render legend showing visual elements used in the diagram
36
- */
37
- private renderLegend;
38
- /**
39
- * Render bandwidth indicator for legend
40
- */
41
- private renderBandwidthLegendIcon;
42
- private renderHeader;
43
- private renderDefs;
44
- private renderStyles;
45
- private renderSubgraph;
46
- /** Render node background (shape only) */
47
- private renderNodeBackground;
48
- /** Render node foreground (content + ports) */
49
- private renderNodeForeground;
50
- /**
51
- * Render ports on a node
52
- */
53
- private renderPorts;
54
- private renderNodeShape;
55
- /**
56
- * Calculate icon dimensions for a node
57
- */
58
- private calculateIconInfo;
59
- /**
60
- * Render node content (icon + label) with dynamic vertical centering
61
- */
62
- private renderNodeContent;
63
- private renderLink;
64
- private formatEndpointLabels;
65
- /**
66
- * Calculate position for endpoint label near the port (not along the line)
67
- * This avoids label clustering at the center of links
68
- * Labels are placed based on port position relative to node center
69
- */
70
- private getEndpointLabelPosition;
71
- /**
72
- * Render endpoint labels (IP) with white background
73
- */
74
- private renderEndpointLabels;
75
- private getLinkStrokeWidth;
76
- /**
77
- * Bandwidth rendering configuration - line count represents speed
78
- * 1G → 1 line
79
- * 10G → 2 lines
80
- * 25G → 3 lines
81
- * 40G → 4 lines
82
- * 100G → 5 lines
83
- */
84
- private getBandwidthConfig;
85
- /**
86
- * Render bandwidth lines (single or multiple parallel lines)
87
- */
88
- private renderBandwidthLines;
89
- /**
90
- * Generate SVG path string from points with rounded corners
91
- */
92
- private generatePath;
93
- /**
94
- * Calculate offsets for parallel lines (centered around 0)
95
- */
96
- private calculateLineOffsets;
97
- /**
98
- * Offset points perpendicular to line direction, handling each segment properly
99
- * For orthogonal paths, this maintains parallel lines through bends
100
- */
101
- private offsetPoints;
102
- /**
103
- * Get perpendicular unit vector for a line segment
104
- */
105
- private getPerpendicular;
106
- /**
107
- * Get default link type based on redundancy
108
- */
109
- private getDefaultLinkType;
110
- /**
111
- * Get default arrow type based on redundancy
112
- */
113
- private getDefaultArrowType;
114
- /**
115
- * VLAN color palette - distinct colors for different VLANs
116
- */
117
- private static readonly VLAN_COLORS;
118
- /**
119
- * Get stroke color based on VLANs
120
- */
121
- private getVlanStroke;
122
- private getLinkDasharray;
123
- private getMidPoint;
124
- private escapeXml;
125
- /**
126
- * Simple string hash for consistent but varied label placement
127
- */
128
- private hashString;
129
- }
130
- export declare const svgRenderer: SVGRenderer;
131
- //# sourceMappingURL=svg.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/renderer/svg.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EAWb,MAAM,oBAAoB,CAAA;AAuE3B,MAAM,WAAW,kBAAkB;IACjC,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAWD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,SAAS,CAA8B;gBAEnC,OAAO,CAAC,EAAE,kBAAkB;IAIxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM;IAsEzD;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2BjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;OAEG;IACH,OAAO,CAAC,YAAY;IA+EpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAcjC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,cAAc;IA2EtB,0CAA0C;IAC1C,OAAO,CAAC,oBAAoB;IAkB5B,+CAA+C;IAC/C,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAiEnB,OAAO,CAAC,eAAe;IA2DvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyEzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,UAAU;IAgElB,OAAO,CAAC,oBAAoB;IAO5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAmFhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6C5B;;OAEG;IACH,OAAO,CAAC,YAAY;IA+CpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAsCpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAalC;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,UAAU;CASnB;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAA"}