@rm-graph/core 0.1.0

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.
@@ -0,0 +1,328 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ // src/themes/defaultTheme.ts
9
+ var lightTheme = {
10
+ name: "light",
11
+ backgroundColor: "#f8f9fa",
12
+ textColor: "#495057",
13
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
14
+ colorPalette: [
15
+ "#4285f4",
16
+ // Blue (Channel 1)
17
+ "#34a853",
18
+ // Green (Channel 2)
19
+ "#fbbc04",
20
+ // Orange/Yellow (Channel 3)
21
+ "#ea4335",
22
+ // Red (Channel 4)
23
+ "#9c27b0",
24
+ // Purple
25
+ "#00bcd4",
26
+ // Cyan
27
+ "#ff9800",
28
+ // Orange
29
+ "#8bc34a",
30
+ // Light Green
31
+ "#e91e63",
32
+ // Pink
33
+ "#607d8b"
34
+ // Blue Grey
35
+ ],
36
+ axis: {
37
+ lineColor: "#dee2e6",
38
+ labelColor: "#6c757d",
39
+ titleColor: "#495057",
40
+ gridLineColor: "#e9ecef"
41
+ },
42
+ tooltip: {
43
+ backgroundColor: "#212529",
44
+ textColor: "#ffffff",
45
+ borderColor: "#495057",
46
+ borderRadius: 6
47
+ },
48
+ legend: {
49
+ textColor: "#495057",
50
+ backgroundColor: "transparent"
51
+ },
52
+ title: {
53
+ color: "#212529",
54
+ fontSize: 18,
55
+ fontWeight: "600"
56
+ }
57
+ };
58
+ var darkTheme = {
59
+ name: "dark",
60
+ backgroundColor: "#0f172a",
61
+ textColor: "#e2e8f0",
62
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
63
+ colorPalette: [
64
+ "#818cf8",
65
+ // Indigo (lighter)
66
+ "#fbbf24",
67
+ // Amber (lighter)
68
+ "#34d399",
69
+ // Emerald (lighter)
70
+ "#f87171",
71
+ // Red (lighter)
72
+ "#a78bfa",
73
+ // Violet (lighter)
74
+ "#22d3ee",
75
+ // Cyan (lighter)
76
+ "#fb923c",
77
+ // Orange (lighter)
78
+ "#a3e635",
79
+ // Lime (lighter)
80
+ "#f472b6",
81
+ // Pink (lighter)
82
+ "#2dd4bf"
83
+ // Teal (lighter)
84
+ ],
85
+ axis: {
86
+ lineColor: "#334155",
87
+ labelColor: "#94a3b8",
88
+ titleColor: "#cbd5e1",
89
+ gridLineColor: "#1e293b"
90
+ },
91
+ tooltip: {
92
+ backgroundColor: "#1e293b",
93
+ textColor: "#f1f5f9",
94
+ borderColor: "#475569",
95
+ borderRadius: 8
96
+ },
97
+ legend: {
98
+ textColor: "#cbd5e1",
99
+ backgroundColor: "transparent"
100
+ },
101
+ title: {
102
+ color: "#f8fafc",
103
+ fontSize: 18,
104
+ fontWeight: "600"
105
+ }
106
+ };
107
+ var modernTheme = {
108
+ name: "modern",
109
+ backgroundColor: "#fafafa",
110
+ textColor: "#18181b",
111
+ fontFamily: '"Inter", system-ui, sans-serif',
112
+ colorPalette: [
113
+ "#7c3aed",
114
+ // Violet
115
+ "#2563eb",
116
+ // Blue
117
+ "#059669",
118
+ // Green
119
+ "#dc2626",
120
+ // Red
121
+ "#d97706",
122
+ // Amber
123
+ "#0891b2",
124
+ // Cyan
125
+ "#c026d3",
126
+ // Fuchsia
127
+ "#4f46e5",
128
+ // Indigo
129
+ "#16a34a",
130
+ // Green
131
+ "#9333ea"
132
+ // Purple
133
+ ],
134
+ axis: {
135
+ lineColor: "#e4e4e7",
136
+ labelColor: "#71717a",
137
+ titleColor: "#3f3f46",
138
+ gridLineColor: "#f4f4f5"
139
+ },
140
+ tooltip: {
141
+ backgroundColor: "#18181b",
142
+ textColor: "#fafafa",
143
+ borderColor: "#27272a",
144
+ borderRadius: 12
145
+ },
146
+ legend: {
147
+ textColor: "#3f3f46",
148
+ backgroundColor: "transparent"
149
+ },
150
+ title: {
151
+ color: "#09090b",
152
+ fontSize: 20,
153
+ fontWeight: "700"
154
+ }
155
+ };
156
+ var midnightTheme = {
157
+ name: "midnight",
158
+ backgroundColor: "#030712",
159
+ textColor: "#d1d5db",
160
+ fontFamily: '"JetBrains Mono", monospace',
161
+ colorPalette: [
162
+ "#22d3ee",
163
+ // Cyan
164
+ "#a855f7",
165
+ // Purple
166
+ "#4ade80",
167
+ // Green
168
+ "#fb7185",
169
+ // Pink
170
+ "#facc15",
171
+ // Yellow
172
+ "#38bdf8",
173
+ // Sky
174
+ "#f472b6",
175
+ // Pink
176
+ "#2dd4bf",
177
+ // Teal
178
+ "#c084fc",
179
+ // Purple
180
+ "#fbbf24"
181
+ // Amber
182
+ ],
183
+ axis: {
184
+ lineColor: "#1f2937",
185
+ labelColor: "#6b7280",
186
+ titleColor: "#9ca3af",
187
+ gridLineColor: "#111827"
188
+ },
189
+ tooltip: {
190
+ backgroundColor: "#111827",
191
+ textColor: "#f9fafb",
192
+ borderColor: "#22d3ee",
193
+ borderRadius: 4
194
+ },
195
+ legend: {
196
+ textColor: "#9ca3af",
197
+ backgroundColor: "transparent"
198
+ },
199
+ title: {
200
+ color: "#f3f4f6",
201
+ fontSize: 18,
202
+ fontWeight: "500"
203
+ }
204
+ };
205
+
206
+ // src/themes/ThemeManager.ts
207
+ var ThemeManager = class _ThemeManager {
208
+ constructor() {
209
+ this.themes = /* @__PURE__ */ new Map();
210
+ this.currentTheme = "light";
211
+ this.registerTheme(lightTheme);
212
+ this.registerTheme(darkTheme);
213
+ this.registerTheme(modernTheme);
214
+ this.registerTheme(midnightTheme);
215
+ }
216
+ /**
217
+ * Get the singleton instance of ThemeManager
218
+ */
219
+ static getInstance() {
220
+ if (!_ThemeManager.instance) {
221
+ _ThemeManager.instance = new _ThemeManager();
222
+ }
223
+ return _ThemeManager.instance;
224
+ }
225
+ /**
226
+ * Register a custom theme
227
+ */
228
+ registerTheme(theme) {
229
+ if (!theme.name) {
230
+ throw new Error("Theme must have a name");
231
+ }
232
+ this.themes.set(theme.name, theme);
233
+ }
234
+ /**
235
+ * Get a theme by name
236
+ */
237
+ getTheme(name) {
238
+ const theme = this.themes.get(name);
239
+ if (!theme) {
240
+ console.warn(`Theme "${name}" not found, falling back to light theme`);
241
+ return this.themes.get("light");
242
+ }
243
+ return theme;
244
+ }
245
+ /**
246
+ * Set the global default theme
247
+ */
248
+ setDefaultTheme(name) {
249
+ if (!this.themes.has(name)) {
250
+ throw new Error(`Theme "${name}" is not registered`);
251
+ }
252
+ this.currentTheme = name;
253
+ }
254
+ /**
255
+ * Get the current default theme name
256
+ */
257
+ getDefaultThemeName() {
258
+ return this.currentTheme;
259
+ }
260
+ /**
261
+ * Get the current default theme configuration
262
+ */
263
+ getDefaultTheme() {
264
+ return this.themes.get(this.currentTheme);
265
+ }
266
+ /**
267
+ * Get all registered theme names
268
+ */
269
+ getAvailableThemes() {
270
+ return Array.from(this.themes.keys());
271
+ }
272
+ /**
273
+ * Check if a theme is registered
274
+ */
275
+ hasTheme(name) {
276
+ return this.themes.has(name);
277
+ }
278
+ /**
279
+ * Resolve theme from string name or ThemeConfig object
280
+ */
281
+ resolveTheme(theme) {
282
+ if (!theme) {
283
+ return this.getDefaultTheme();
284
+ }
285
+ if (typeof theme === "string") {
286
+ return this.getTheme(theme);
287
+ }
288
+ return this.mergeThemes(this.getDefaultTheme(), theme);
289
+ }
290
+ /**
291
+ * Merge two themes, with override taking precedence
292
+ */
293
+ mergeThemes(base, override) {
294
+ return {
295
+ ...base,
296
+ ...override,
297
+ axis: {
298
+ ...base.axis,
299
+ ...override.axis
300
+ },
301
+ tooltip: {
302
+ ...base.tooltip,
303
+ ...override.tooltip
304
+ },
305
+ legend: {
306
+ ...base.legend,
307
+ ...override.legend
308
+ },
309
+ title: {
310
+ ...base.title,
311
+ ...override.title
312
+ },
313
+ colorPalette: override.colorPalette ?? base.colorPalette
314
+ };
315
+ }
316
+ /**
317
+ * Get color from palette by index (cycles through palette)
318
+ */
319
+ getColorFromPalette(theme, index) {
320
+ const palette = theme.colorPalette ?? lightTheme.colorPalette;
321
+ return palette[index % palette.length];
322
+ }
323
+ };
324
+ var getThemeManager = () => ThemeManager.getInstance();
325
+
326
+ export { ThemeManager, __require, darkTheme, getThemeManager, lightTheme, midnightTheme, modernTheme };
327
+ //# sourceMappingURL=chunk-Q2ZHY445.mjs.map
328
+ //# sourceMappingURL=chunk-Q2ZHY445.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/themes/defaultTheme.ts","../src/themes/ThemeManager.ts"],"names":[],"mappings":"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","file":"chunk-Q2ZHY445.mjs","sourcesContent":["import type { ThemeConfig } from \"../types\";\r\n\r\n/**\r\n * Default light theme - clean white background with subtle grid\r\n */\r\nexport const lightTheme: ThemeConfig = {\r\n name: \"light\",\r\n backgroundColor: \"#f8f9fa\",\r\n textColor: \"#495057\",\r\n fontFamily:\r\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n colorPalette: [\r\n \"#4285f4\", // Blue (Channel 1)\r\n \"#34a853\", // Green (Channel 2)\r\n \"#fbbc04\", // Orange/Yellow (Channel 3)\r\n \"#ea4335\", // Red (Channel 4)\r\n \"#9c27b0\", // Purple\r\n \"#00bcd4\", // Cyan\r\n \"#ff9800\", // Orange\r\n \"#8bc34a\", // Light Green\r\n \"#e91e63\", // Pink\r\n \"#607d8b\", // Blue Grey\r\n ],\r\n axis: {\r\n lineColor: \"#dee2e6\",\r\n labelColor: \"#6c757d\",\r\n titleColor: \"#495057\",\r\n gridLineColor: \"#e9ecef\",\r\n },\r\n tooltip: {\r\n backgroundColor: \"#212529\",\r\n textColor: \"#ffffff\",\r\n borderColor: \"#495057\",\r\n borderRadius: 6,\r\n },\r\n legend: {\r\n textColor: \"#495057\",\r\n backgroundColor: \"transparent\",\r\n },\r\n title: {\r\n color: \"#212529\",\r\n fontSize: 18,\r\n fontWeight: \"600\",\r\n },\r\n};\r\n\r\n/**\r\n * Default dark theme\r\n */\r\nexport const darkTheme: ThemeConfig = {\r\n name: \"dark\",\r\n backgroundColor: \"#0f172a\",\r\n textColor: \"#e2e8f0\",\r\n fontFamily:\r\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\r\n colorPalette: [\r\n \"#818cf8\", // Indigo (lighter)\r\n \"#fbbf24\", // Amber (lighter)\r\n \"#34d399\", // Emerald (lighter)\r\n \"#f87171\", // Red (lighter)\r\n \"#a78bfa\", // Violet (lighter)\r\n \"#22d3ee\", // Cyan (lighter)\r\n \"#fb923c\", // Orange (lighter)\r\n \"#a3e635\", // Lime (lighter)\r\n \"#f472b6\", // Pink (lighter)\r\n \"#2dd4bf\", // Teal (lighter)\r\n ],\r\n axis: {\r\n lineColor: \"#334155\",\r\n labelColor: \"#94a3b8\",\r\n titleColor: \"#cbd5e1\",\r\n gridLineColor: \"#1e293b\",\r\n },\r\n tooltip: {\r\n backgroundColor: \"#1e293b\",\r\n textColor: \"#f1f5f9\",\r\n borderColor: \"#475569\",\r\n borderRadius: 8,\r\n },\r\n legend: {\r\n textColor: \"#cbd5e1\",\r\n backgroundColor: \"transparent\",\r\n },\r\n title: {\r\n color: \"#f8fafc\",\r\n fontSize: 18,\r\n fontWeight: \"600\",\r\n },\r\n};\r\n\r\n/**\r\n * Modern gradient theme with vibrant colors\r\n */\r\nexport const modernTheme: ThemeConfig = {\r\n name: \"modern\",\r\n backgroundColor: \"#fafafa\",\r\n textColor: \"#18181b\",\r\n fontFamily: '\"Inter\", system-ui, sans-serif',\r\n colorPalette: [\r\n \"#7c3aed\", // Violet\r\n \"#2563eb\", // Blue\r\n \"#059669\", // Green\r\n \"#dc2626\", // Red\r\n \"#d97706\", // Amber\r\n \"#0891b2\", // Cyan\r\n \"#c026d3\", // Fuchsia\r\n \"#4f46e5\", // Indigo\r\n \"#16a34a\", // Green\r\n \"#9333ea\", // Purple\r\n ],\r\n axis: {\r\n lineColor: \"#e4e4e7\",\r\n labelColor: \"#71717a\",\r\n titleColor: \"#3f3f46\",\r\n gridLineColor: \"#f4f4f5\",\r\n },\r\n tooltip: {\r\n backgroundColor: \"#18181b\",\r\n textColor: \"#fafafa\",\r\n borderColor: \"#27272a\",\r\n borderRadius: 12,\r\n },\r\n legend: {\r\n textColor: \"#3f3f46\",\r\n backgroundColor: \"transparent\",\r\n },\r\n title: {\r\n color: \"#09090b\",\r\n fontSize: 20,\r\n fontWeight: \"700\",\r\n },\r\n};\r\n\r\n/**\r\n * Midnight theme - deep dark with neon accents\r\n */\r\nexport const midnightTheme: ThemeConfig = {\r\n name: \"midnight\",\r\n backgroundColor: \"#030712\",\r\n textColor: \"#d1d5db\",\r\n fontFamily: '\"JetBrains Mono\", monospace',\r\n colorPalette: [\r\n \"#22d3ee\", // Cyan\r\n \"#a855f7\", // Purple\r\n \"#4ade80\", // Green\r\n \"#fb7185\", // Pink\r\n \"#facc15\", // Yellow\r\n \"#38bdf8\", // Sky\r\n \"#f472b6\", // Pink\r\n \"#2dd4bf\", // Teal\r\n \"#c084fc\", // Purple\r\n \"#fbbf24\", // Amber\r\n ],\r\n axis: {\r\n lineColor: \"#1f2937\",\r\n labelColor: \"#6b7280\",\r\n titleColor: \"#9ca3af\",\r\n gridLineColor: \"#111827\",\r\n },\r\n tooltip: {\r\n backgroundColor: \"#111827\",\r\n textColor: \"#f9fafb\",\r\n borderColor: \"#22d3ee\",\r\n borderRadius: 4,\r\n },\r\n legend: {\r\n textColor: \"#9ca3af\",\r\n backgroundColor: \"transparent\",\r\n },\r\n title: {\r\n color: \"#f3f4f6\",\r\n fontSize: 18,\r\n fontWeight: \"500\",\r\n },\r\n};\r\n\r\n","import type { ThemeConfig } from \"../types\";\r\nimport { lightTheme, darkTheme, modernTheme, midnightTheme } from \"./defaultTheme\";\r\n\r\n/**\r\n * ThemeManager - Manages chart themes and provides theme resolution\r\n */\r\nexport class ThemeManager {\r\n private static instance: ThemeManager;\r\n private themes: Map<string, ThemeConfig> = new Map();\r\n private currentTheme: string = \"light\";\r\n\r\n private constructor() {\r\n // Register built-in themes\r\n this.registerTheme(lightTheme);\r\n this.registerTheme(darkTheme);\r\n this.registerTheme(modernTheme);\r\n this.registerTheme(midnightTheme);\r\n }\r\n\r\n /**\r\n * Get the singleton instance of ThemeManager\r\n */\r\n public static getInstance(): ThemeManager {\r\n if (!ThemeManager.instance) {\r\n ThemeManager.instance = new ThemeManager();\r\n }\r\n return ThemeManager.instance;\r\n }\r\n\r\n /**\r\n * Register a custom theme\r\n */\r\n public registerTheme(theme: ThemeConfig): void {\r\n if (!theme.name) {\r\n throw new Error(\"Theme must have a name\");\r\n }\r\n this.themes.set(theme.name, theme);\r\n }\r\n\r\n /**\r\n * Get a theme by name\r\n */\r\n public getTheme(name: string): ThemeConfig {\r\n const theme = this.themes.get(name);\r\n if (!theme) {\r\n console.warn(`Theme \"${name}\" not found, falling back to light theme`);\r\n return this.themes.get(\"light\")!;\r\n }\r\n return theme;\r\n }\r\n\r\n /**\r\n * Set the global default theme\r\n */\r\n public setDefaultTheme(name: string): void {\r\n if (!this.themes.has(name)) {\r\n throw new Error(`Theme \"${name}\" is not registered`);\r\n }\r\n this.currentTheme = name;\r\n }\r\n\r\n /**\r\n * Get the current default theme name\r\n */\r\n public getDefaultThemeName(): string {\r\n return this.currentTheme;\r\n }\r\n\r\n /**\r\n * Get the current default theme configuration\r\n */\r\n public getDefaultTheme(): ThemeConfig {\r\n return this.themes.get(this.currentTheme)!;\r\n }\r\n\r\n /**\r\n * Get all registered theme names\r\n */\r\n public getAvailableThemes(): string[] {\r\n return Array.from(this.themes.keys());\r\n }\r\n\r\n /**\r\n * Check if a theme is registered\r\n */\r\n public hasTheme(name: string): boolean {\r\n return this.themes.has(name);\r\n }\r\n\r\n /**\r\n * Resolve theme from string name or ThemeConfig object\r\n */\r\n public resolveTheme(theme?: ThemeConfig | string): ThemeConfig {\r\n if (!theme) {\r\n return this.getDefaultTheme();\r\n }\r\n if (typeof theme === \"string\") {\r\n return this.getTheme(theme);\r\n }\r\n // Merge with default theme for any missing properties\r\n return this.mergeThemes(this.getDefaultTheme(), theme);\r\n }\r\n\r\n /**\r\n * Merge two themes, with override taking precedence\r\n */\r\n public mergeThemes(base: ThemeConfig, override: Partial<ThemeConfig>): ThemeConfig {\r\n return {\r\n ...base,\r\n ...override,\r\n axis: {\r\n ...base.axis,\r\n ...override.axis,\r\n },\r\n tooltip: {\r\n ...base.tooltip,\r\n ...override.tooltip,\r\n },\r\n legend: {\r\n ...base.legend,\r\n ...override.legend,\r\n },\r\n title: {\r\n ...base.title,\r\n ...override.title,\r\n },\r\n colorPalette: override.colorPalette ?? base.colorPalette,\r\n };\r\n }\r\n\r\n /**\r\n * Get color from palette by index (cycles through palette)\r\n */\r\n public getColorFromPalette(theme: ThemeConfig, index: number): string {\r\n const palette = theme.colorPalette ?? lightTheme.colorPalette!;\r\n return palette[index % palette.length];\r\n }\r\n}\r\n\r\n// Export singleton getter for convenience\r\nexport const getThemeManager = (): ThemeManager => ThemeManager.getInstance();\r\n\r\n"]}