@elevasis/ui 1.19.0 → 1.20.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 (94) hide show
  1. package/dist/api/index.js +2 -2
  2. package/dist/auth/index.js +3 -3
  3. package/dist/charts/index.css +14 -0
  4. package/dist/charts/index.js +8 -6
  5. package/dist/{chunk-7ATCF6UL.js → chunk-3DIU726S.js} +11 -4
  6. package/dist/chunk-4SY4EQSK.js +68 -0
  7. package/dist/{chunk-2Z7LYTIX.js → chunk-AQ5MQDSS.js} +30 -17
  8. package/dist/chunk-AWMZCYKH.js +639 -0
  9. package/dist/{chunk-BVNAC4SQ.js → chunk-C7AD6N23.js} +38 -48
  10. package/dist/{chunk-ZFCG5SHW.js → chunk-COTI2QPO.js} +1 -1
  11. package/dist/{chunk-WAPZN2U3.js → chunk-EMN755L5.js} +7 -41
  12. package/dist/{chunk-LBY7FVFD.js → chunk-ERVB3QJQ.js} +31 -715
  13. package/dist/chunk-GBMNCNHX.js +105 -0
  14. package/dist/{chunk-MBZDE6UT.js → chunk-IOKL7BKE.js} +9 -1
  15. package/dist/{chunk-35UWYH2A.js → chunk-JFRG2JJE.js} +8 -2
  16. package/dist/chunk-JIABC3AE.js +2622 -0
  17. package/dist/chunk-JZEXFQ6N.js +671 -0
  18. package/dist/chunk-LGKLC5MG.js +44 -0
  19. package/dist/chunk-MG3NF7QL.js +63 -0
  20. package/dist/{chunk-KBLGVZBD.js → chunk-NNKKBSJN.js} +2 -22
  21. package/dist/{chunk-JNBHUCKW.js → chunk-NVOCKXUQ.js} +1 -1
  22. package/dist/chunk-OFAXUZPZ.js +2411 -0
  23. package/dist/chunk-PDHTXPSF.js +12 -0
  24. package/dist/chunk-QJ2S46NI.js +23 -0
  25. package/dist/{chunk-NUULWBAD.js → chunk-R3R367QY.js} +1 -1
  26. package/dist/{chunk-UANJP5P7.js → chunk-R7WLWGPO.js} +5 -5
  27. package/dist/{chunk-CC3SDRIF.js → chunk-RWQIFKMJ.js} +1 -1
  28. package/dist/chunk-UMFPUM7Q.js +1281 -0
  29. package/dist/{chunk-KNJKCD73.js → chunk-VLTVZXP6.js} +4 -4
  30. package/dist/chunk-WWEMNIHW.js +37 -0
  31. package/dist/{chunk-UTWJZEOJ.js → chunk-XOTN3X3Z.js} +3 -3
  32. package/dist/components/index.css +14 -0
  33. package/dist/components/index.d.ts +41 -7
  34. package/dist/components/index.js +564 -5023
  35. package/dist/components/navigation/index.js +2 -63
  36. package/dist/features/auth/index.css +579 -0
  37. package/dist/features/auth/index.d.ts +2557 -0
  38. package/dist/features/auth/index.js +125 -0
  39. package/dist/features/dashboard/index.css +579 -0
  40. package/dist/features/dashboard/index.d.ts +244 -0
  41. package/dist/features/dashboard/index.js +650 -0
  42. package/dist/features/monitoring/index.css +579 -0
  43. package/dist/features/monitoring/index.d.ts +121 -0
  44. package/dist/features/monitoring/index.js +538 -0
  45. package/dist/features/operations/index.css +14 -0
  46. package/dist/features/operations/index.d.ts +1675 -2
  47. package/dist/features/operations/index.js +2148 -28
  48. package/dist/features/settings/index.css +579 -0
  49. package/dist/features/settings/index.d.ts +2589 -0
  50. package/dist/features/settings/index.js +1437 -0
  51. package/dist/hooks/index.css +14 -0
  52. package/dist/hooks/index.d.ts +29 -11
  53. package/dist/hooks/index.js +13 -13
  54. package/dist/hooks/published.css +14 -0
  55. package/dist/hooks/published.d.ts +29 -11
  56. package/dist/hooks/published.js +12 -12
  57. package/dist/index.css +14 -0
  58. package/dist/index.d.ts +41 -12
  59. package/dist/index.js +15 -15
  60. package/dist/initialization/index.js +2 -2
  61. package/dist/layout/index.d.ts +7 -1
  62. package/dist/layout/index.js +7 -5
  63. package/dist/organization/index.js +2 -2
  64. package/dist/provider/index.css +14 -0
  65. package/dist/provider/index.d.ts +1 -1
  66. package/dist/provider/index.js +10 -10
  67. package/dist/provider/published.d.ts +1 -1
  68. package/dist/provider/published.js +6 -6
  69. package/dist/theme/index.d.ts +1 -1
  70. package/dist/theme/index.js +3 -3
  71. package/dist/theme/presets/__tests__/getPreset.test.d.ts +2 -0
  72. package/dist/theme/presets/__tests__/getPreset.test.d.ts.map +1 -0
  73. package/dist/theme/presets/__tests__/getPreset.test.js +92 -0
  74. package/dist/theme/presets/cyber-volt.d.ts +12 -0
  75. package/dist/theme/presets/cyber-volt.d.ts.map +1 -0
  76. package/dist/theme/presets/cyber-volt.js +70 -0
  77. package/dist/theme/presets/regal.d.ts +8 -0
  78. package/dist/theme/presets/regal.d.ts.map +1 -0
  79. package/dist/theme/presets/regal.js +69 -0
  80. package/dist/theme/presets/rose-gold.d.ts +12 -0
  81. package/dist/theme/presets/rose-gold.d.ts.map +1 -0
  82. package/dist/theme/presets/rose-gold.js +76 -0
  83. package/dist/types/index.d.ts +1 -1
  84. package/dist/utils/index.d.ts +12 -1
  85. package/dist/utils/index.js +1 -1
  86. package/dist/zustand/index.d.ts +80 -0
  87. package/dist/zustand/index.js +105 -0
  88. package/package.json +55 -4
  89. package/dist/chunk-2YW3LDFT.js +0 -1542
  90. package/dist/theme/presets/cyber-void.d.ts +0 -12
  91. package/dist/theme/presets/cyber-void.d.ts.map +0 -1
  92. package/dist/theme/presets/cyber-void.js +0 -75
  93. package/dist/{chunk-DVKEEY5J.js → chunk-TUXTSEAF.js} +1 -1
  94. package/dist/{chunk-U2522LSW.js → chunk-V7XHGJQZ.js} +1 -1
@@ -1,63 +1,2 @@
1
- import { useRouterContext } from '../../chunk-Q7DJKLEN.js';
2
- import { useMemo } from 'react';
3
-
4
- var useBreadcrumbs = (options = {}) => {
5
- const { currentPath } = useRouterContext();
6
- const { navItems = [] } = options;
7
- return useMemo(() => {
8
- const segments = currentPath.split("/").filter(Boolean);
9
- if (segments.length === 0) {
10
- return [{ label: "Dashboard", isActive: true }];
11
- }
12
- const breadcrumbs = [{ label: "Dashboard", path: "/" }];
13
- let currentSegmentPath = "";
14
- for (let i = 0; i < segments.length; i++) {
15
- currentSegmentPath += `/${segments[i]}`;
16
- const isLast = i === segments.length - 1;
17
- let label = formatSegmentLabel(segments[i]);
18
- let matchedItem = null;
19
- for (const navItem of navItems) {
20
- if (navItem.link === currentSegmentPath) {
21
- matchedItem = navItem;
22
- break;
23
- }
24
- if (navItem.links) {
25
- for (const subItem of navItem.links) {
26
- if (subItem.link === currentSegmentPath) {
27
- if (i === 0 && subItem.label === "Overview") {
28
- matchedItem = { label: navItem.label };
29
- } else {
30
- matchedItem = subItem;
31
- }
32
- break;
33
- }
34
- if (subItem.links) {
35
- for (const nestedLink of subItem.links) {
36
- if (nestedLink.link === currentSegmentPath) {
37
- matchedItem = nestedLink;
38
- break;
39
- }
40
- }
41
- }
42
- if (matchedItem) break;
43
- }
44
- }
45
- if (matchedItem) break;
46
- }
47
- if (matchedItem) {
48
- label = matchedItem.label;
49
- }
50
- breadcrumbs.push({
51
- label,
52
- path: isLast ? void 0 : currentSegmentPath,
53
- isActive: isLast
54
- });
55
- }
56
- return breadcrumbs;
57
- }, [currentPath, navItems]);
58
- };
59
- function formatSegmentLabel(segment) {
60
- return segment.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
61
- }
62
-
63
- export { useBreadcrumbs };
1
+ export { useBreadcrumbs } from '../../chunk-MG3NF7QL.js';
2
+ import '../../chunk-Q7DJKLEN.js';
@@ -0,0 +1,579 @@
1
+ /* src/components/display/StatCard.module.css */
2
+ .heroCard {
3
+ background: var(--glass-background);
4
+ backdrop-filter: var(--glass-blur);
5
+ border: 1px solid var(--color-border);
6
+ }
7
+ .iconRing {
8
+ position: relative;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ width: 46px;
13
+ height: 46px;
14
+ border-radius: 50%;
15
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
16
+ border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
17
+ color: var(--color-primary);
18
+ flex-shrink: 0;
19
+ box-shadow: 0 0 12px color-mix(in srgb, var(--color-primary) 15%, transparent);
20
+ }
21
+ .iconRingSm {
22
+ position: relative;
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ width: 36px;
27
+ height: 36px;
28
+ border-radius: 50%;
29
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
30
+ border: 1px solid color-mix(in srgb, var(--color-primary) 25%, transparent);
31
+ color: var(--color-primary);
32
+ flex-shrink: 0;
33
+ box-shadow: 0 0 8px color-mix(in srgb, var(--color-primary) 12%, transparent);
34
+ }
35
+ .heroValue {
36
+ font-family: var(--elevasis-font-family-subtitle);
37
+ font-size: 1.85rem;
38
+ font-weight: 800;
39
+ line-height: 1;
40
+ letter-spacing: -0.02em;
41
+ font-variant-numeric: tabular-nums;
42
+ }
43
+ [data-mantine-color-scheme=dark] .heroValue {
44
+ text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary) 20%, transparent);
45
+ }
46
+ .heroValueSm {
47
+ font-family: var(--elevasis-font-family-subtitle);
48
+ font-size: 1.35rem;
49
+ font-weight: 700;
50
+ line-height: 1;
51
+ letter-spacing: -0.02em;
52
+ font-variant-numeric: tabular-nums;
53
+ }
54
+ .heroLabel {
55
+ font-size: 0.68rem;
56
+ font-weight: 700;
57
+ text-transform: uppercase;
58
+ letter-spacing: 0.12em;
59
+ color: var(--color-text-dimmed);
60
+ }
61
+ .heroLabelSm {
62
+ font-size: 0.62rem;
63
+ font-weight: 700;
64
+ text-transform: uppercase;
65
+ letter-spacing: 0.12em;
66
+ color: var(--color-text-dimmed);
67
+ }
68
+
69
+ /* src/components/display/ElevasisLoader.module.css */
70
+ .wrapper {
71
+ display: inline-flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ width: var(--loader-size);
75
+ height: var(--loader-size);
76
+ overflow: visible;
77
+ }
78
+ .loader {
79
+ width: 100%;
80
+ height: 100%;
81
+ display: block;
82
+ overflow: visible;
83
+ }
84
+ .chevron {
85
+ stroke: var(--loader-color);
86
+ stroke-width: 2;
87
+ stroke-linecap: square;
88
+ stroke-linejoin: miter;
89
+ fill: none;
90
+ opacity: 0.15;
91
+ animation: chevronPulse 2s ease-in-out infinite;
92
+ filter: drop-shadow(0 0 1.5px var(--loader-color));
93
+ }
94
+ [data-mantine-color-scheme=light] .chevron {
95
+ filter: none;
96
+ }
97
+ .c1 {
98
+ animation-delay: 0s;
99
+ }
100
+ .c2 {
101
+ animation-delay: 0.2s;
102
+ }
103
+ .c3 {
104
+ animation-delay: 0.4s;
105
+ }
106
+ @keyframes chevronPulse {
107
+ 0%, 100% {
108
+ opacity: 0.12;
109
+ filter: drop-shadow(0 0 1px var(--loader-color));
110
+ }
111
+ 40%, 60% {
112
+ opacity: 1;
113
+ filter: drop-shadow(0 0 3px var(--loader-color));
114
+ }
115
+ }
116
+ [data-mantine-color-scheme=light] .chevron {
117
+ animation-name: chevronPulseLight;
118
+ }
119
+ @keyframes chevronPulseLight {
120
+ 0%, 100% {
121
+ opacity: 0.2;
122
+ }
123
+ 40%, 60% {
124
+ opacity: 1;
125
+ }
126
+ }
127
+
128
+ /* src/theme/custom.css */
129
+ .mantine-Accordion-control:hover {
130
+ background-color: var(--color-surface-hover);
131
+ }
132
+ .mantine-Menu-item:hover:not([data-disabled]) {
133
+ background-color: var(--color-surface-hover);
134
+ }
135
+ .mantine-Select-option:hover {
136
+ background-color: var(--color-surface-hover) !important;
137
+ }
138
+ [data-mantine-color-scheme=dark] .mantine-Tabs-root {
139
+ --tab-border-color: var(--color-border);
140
+ }
141
+ .mantine-Tabs-tab:hover {
142
+ background-color: var(--color-surface-hover);
143
+ }
144
+ .mantine-Pagination-control:not([data-active]) {
145
+ background: var(--color-surface);
146
+ }
147
+ ::-webkit-scrollbar {
148
+ width: 5px;
149
+ height: 5px;
150
+ }
151
+ ::-webkit-scrollbar-track {
152
+ background: transparent;
153
+ }
154
+ ::-webkit-scrollbar-thumb {
155
+ background: color-mix(in srgb, var(--color-text-subtle) 50%, var(--color-border));
156
+ border-radius: 4px;
157
+ }
158
+ ::-webkit-scrollbar-thumb:hover {
159
+ background: var(--color-text-subtle);
160
+ }
161
+ .mantine-Skeleton-root[data-visible]::after {
162
+ background-color: color-mix(in srgb, var(--color-text-subtle) 30%, var(--color-surface)) !important;
163
+ }
164
+ .mantine-Checkbox-input {
165
+ background-color: var(--color-surface);
166
+ border-color: var(--color-border);
167
+ }
168
+ .mantine-Checkbox-input:checked {
169
+ background-color: var(--color-primary);
170
+ border-color: var(--color-primary);
171
+ }
172
+ .mantine-Switch-root:has(input:not(:checked)) .mantine-Switch-track {
173
+ background-color: var(--color-surface-hover);
174
+ border-color: var(--color-border);
175
+ }
176
+ .mantine-Timeline-root {
177
+ --tl-color: var(--color-primary);
178
+ }
179
+ .mantine-Timeline-item {
180
+ --item-border-color: var(--color-border);
181
+ }
182
+ .mantine-Timeline-itemBullet {
183
+ border-color: var(--color-border);
184
+ }
185
+ .mantine-Timeline-itemBullet:where([data-with-child]) {
186
+ background-color: var(--color-primary);
187
+ border-color: var(--color-primary);
188
+ }
189
+ .recharts-surface:focus {
190
+ outline: none;
191
+ }
192
+
193
+ /* src/graph/Graph.module.css */
194
+ @keyframes edgeFlow {
195
+ 0% {
196
+ stroke-dashoffset: 24;
197
+ }
198
+ 100% {
199
+ stroke-dashoffset: 0;
200
+ }
201
+ }
202
+ @keyframes edgeFlowReverse {
203
+ 0% {
204
+ stroke-dashoffset: 0;
205
+ }
206
+ 100% {
207
+ stroke-dashoffset: 24;
208
+ }
209
+ }
210
+ @keyframes pulse {
211
+ 0%, 100% {
212
+ opacity: 0.6;
213
+ }
214
+ 50% {
215
+ opacity: 1;
216
+ }
217
+ }
218
+ @keyframes livePulse {
219
+ 0%, 100% {
220
+ opacity: 1;
221
+ }
222
+ 50% {
223
+ opacity: 0.6;
224
+ }
225
+ }
226
+ .livePulse {
227
+ animation: livePulse 2s ease-in-out infinite;
228
+ }
229
+ @keyframes glowPulse {
230
+ 0%, 100% {
231
+ box-shadow: 0 0 5px var(--glow-color, color-mix(in srgb, var(--color-primary) 30%, transparent)), 0 0 15px var(--glow-color, color-mix(in srgb, var(--color-primary) 10%, transparent));
232
+ }
233
+ 50% {
234
+ box-shadow: 0 0 10px var(--glow-color, color-mix(in srgb, var(--color-primary) 50%, transparent)), 0 0 20px var(--glow-color, color-mix(in srgb, var(--color-primary) 20%, transparent));
235
+ }
236
+ }
237
+ @keyframes nodeEnter {
238
+ 0% {
239
+ opacity: 0;
240
+ transform: scale(0.8) translateY(10px);
241
+ }
242
+ 100% {
243
+ opacity: 1;
244
+ transform: scale(1) translateY(0);
245
+ }
246
+ }
247
+ @keyframes handlePulse {
248
+ 0%, 100% {
249
+ transform: scale(1);
250
+ box-shadow: 0 0 0 0 var(--handle-color, color-mix(in srgb, var(--color-primary) 40%, transparent));
251
+ }
252
+ 50% {
253
+ transform: scale(1.2);
254
+ box-shadow: 0 0 0 4px var(--handle-color, color-mix(in srgb, var(--color-primary) 0%, transparent));
255
+ }
256
+ }
257
+ @keyframes gridMove {
258
+ 0% {
259
+ background-position: 0 0;
260
+ }
261
+ 100% {
262
+ background-position: 40px 40px;
263
+ }
264
+ }
265
+ @keyframes labelFadeIn {
266
+ 0% {
267
+ opacity: 0;
268
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(0.8);
269
+ }
270
+ 100% {
271
+ opacity: 1;
272
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(1);
273
+ }
274
+ }
275
+ @keyframes scanLine {
276
+ 0% {
277
+ transform: translateY(-100%);
278
+ opacity: 0;
279
+ }
280
+ 50% {
281
+ opacity: 0.5;
282
+ }
283
+ 100% {
284
+ transform: translateY(100%);
285
+ opacity: 0;
286
+ }
287
+ }
288
+ .graphContainer :global(.react-flow__node.selected),
289
+ .graphContainer :global(.react-flow__node:focus),
290
+ .graphContainer :global(.react-flow__node:focus-visible) {
291
+ outline: none !important;
292
+ }
293
+ .graphContainer :global(.react-flow__node.selected > *) {
294
+ box-shadow: none;
295
+ }
296
+ .graphContainer {
297
+ position: relative;
298
+ background-image:
299
+ linear-gradient(color-mix(in srgb, var(--color-primary) 5%, transparent) 1px, transparent 1px),
300
+ linear-gradient(
301
+ 90deg,
302
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 1px,
303
+ transparent 1px),
304
+ radial-gradient(
305
+ ellipse at 50% 50%,
306
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 0%,
307
+ transparent 70%);
308
+ background-color: color-mix(in srgb, var(--color-background) 50%, var(--glass-background));
309
+ backdrop-filter: var(--glass-blur);
310
+ background-size:
311
+ 40px 40px,
312
+ 40px 40px,
313
+ 100% 100%;
314
+ animation: gridMove 20s linear infinite;
315
+ }
316
+ [data-mantine-color-scheme=dark] .graphContainer {
317
+ background-image:
318
+ linear-gradient(color-mix(in srgb, var(--color-primary) 9%, transparent) 1px, transparent 1px),
319
+ linear-gradient(
320
+ 90deg,
321
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 1px,
322
+ transparent 1px),
323
+ radial-gradient(
324
+ ellipse at 50% 50%,
325
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 0%,
326
+ transparent 70%);
327
+ background-size:
328
+ 40px 40px,
329
+ 40px 40px,
330
+ 100% 100%;
331
+ }
332
+ .node {
333
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
334
+ position: relative;
335
+ }
336
+ .node :global(.react-flow__node.selected),
337
+ .node :global(.react-flow__node:focus),
338
+ .node :global(.react-flow__node:focus-visible) {
339
+ outline: none !important;
340
+ box-shadow: none !important;
341
+ }
342
+ .node:nth-child(1) {
343
+ animation-delay: 0.05s;
344
+ }
345
+ .node:nth-child(2) {
346
+ animation-delay: 0.1s;
347
+ }
348
+ .node:nth-child(3) {
349
+ animation-delay: 0.15s;
350
+ }
351
+ .node:nth-child(4) {
352
+ animation-delay: 0.2s;
353
+ }
354
+ .node:nth-child(5) {
355
+ animation-delay: 0.25s;
356
+ }
357
+ .node:nth-child(6) {
358
+ animation-delay: 0.3s;
359
+ }
360
+ .node:nth-child(7) {
361
+ animation-delay: 0.35s;
362
+ }
363
+ .node:nth-child(8) {
364
+ animation-delay: 0.4s;
365
+ }
366
+ .node:nth-child(9) {
367
+ animation-delay: 0.45s;
368
+ }
369
+ .node:nth-child(10) {
370
+ animation-delay: 0.5s;
371
+ }
372
+ .node:nth-child(11) {
373
+ animation-delay: 0.55s;
374
+ }
375
+ .node:nth-child(12) {
376
+ animation-delay: 0.6s;
377
+ }
378
+ .nodeCard {
379
+ position: relative;
380
+ border-radius: var(--mantine-radius-md);
381
+ overflow: hidden;
382
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
383
+ }
384
+ .nodeCard::before {
385
+ content: "";
386
+ position: absolute;
387
+ inset: 0;
388
+ background:
389
+ linear-gradient(
390
+ 135deg,
391
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 10%, transparent)) 0%,
392
+ transparent 50%,
393
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 5%, transparent)) 100%);
394
+ pointer-events: none;
395
+ opacity: 0;
396
+ transition: opacity 0.3s ease;
397
+ }
398
+ .nodeCard::after {
399
+ content: "";
400
+ position: absolute;
401
+ left: 0;
402
+ right: 0;
403
+ height: 30%;
404
+ background:
405
+ linear-gradient(
406
+ 180deg,
407
+ transparent 0%,
408
+ var(--node-color-glow, color-mix(in srgb, var(--color-primary) 10%, transparent)) 50%,
409
+ transparent 100%);
410
+ pointer-events: none;
411
+ opacity: 0;
412
+ }
413
+ .nodeCard:hover::before,
414
+ .nodeCardSelected::before {
415
+ opacity: 1;
416
+ }
417
+ .nodeCard:hover::after,
418
+ .nodeCardSelected::after {
419
+ animation: scanLine 3s ease-in-out infinite;
420
+ }
421
+ .nodeCard:hover {
422
+ transform: translateY(-2px) scale(1.02);
423
+ }
424
+ .nodeCardSelected {
425
+ transform: translateY(-2px) scale(1.02);
426
+ animation: glowPulse 2s ease-in-out infinite;
427
+ }
428
+ .nodeAgent {
429
+ --glow-color: rgba(139, 92, 246, 0.4);
430
+ --node-color-light: rgba(139, 92, 246, 0.1);
431
+ --node-color-glow: rgba(139, 92, 246, 0.15);
432
+ --handle-color: rgba(139, 92, 246, 0.5);
433
+ --gradient-start: rgba(139, 92, 246, 0.15);
434
+ --gradient-end: rgba(139, 92, 246, 0.05);
435
+ }
436
+ .nodeWorkflow {
437
+ --glow-color: rgba(59, 130, 246, 0.4);
438
+ --node-color-light: rgba(59, 130, 246, 0.1);
439
+ --node-color-glow: rgba(59, 130, 246, 0.15);
440
+ --handle-color: rgba(59, 130, 246, 0.5);
441
+ --gradient-start: rgba(59, 130, 246, 0.15);
442
+ --gradient-end: rgba(59, 130, 246, 0.05);
443
+ }
444
+ .nodeTrigger {
445
+ --glow-color: rgba(249, 115, 22, 0.4);
446
+ --node-color-light: rgba(249, 115, 22, 0.1);
447
+ --node-color-glow: rgba(249, 115, 22, 0.15);
448
+ --handle-color: rgba(249, 115, 22, 0.5);
449
+ --gradient-start: rgba(249, 115, 22, 0.15);
450
+ --gradient-end: rgba(249, 115, 22, 0.05);
451
+ }
452
+ .nodeIntegration {
453
+ --glow-color: rgba(20, 184, 166, 0.4);
454
+ --node-color-light: rgba(20, 184, 166, 0.1);
455
+ --node-color-glow: rgba(20, 184, 166, 0.15);
456
+ --handle-color: rgba(20, 184, 166, 0.5);
457
+ --gradient-start: rgba(20, 184, 166, 0.15);
458
+ --gradient-end: rgba(20, 184, 166, 0.05);
459
+ }
460
+ .nodeExternal {
461
+ --glow-color: rgba(107, 114, 128, 0.4);
462
+ --node-color-light: rgba(107, 114, 128, 0.1);
463
+ --node-color-glow: rgba(107, 114, 128, 0.15);
464
+ --handle-color: rgba(107, 114, 128, 0.5);
465
+ --gradient-start: rgba(107, 114, 128, 0.15);
466
+ --gradient-end: rgba(107, 114, 128, 0.05);
467
+ }
468
+ .nodeHuman {
469
+ --glow-color: rgba(245, 158, 11, 0.4);
470
+ --node-color-light: rgba(245, 158, 11, 0.1);
471
+ --node-color-glow: rgba(245, 158, 11, 0.15);
472
+ --handle-color: rgba(245, 158, 11, 0.5);
473
+ --gradient-start: rgba(245, 158, 11, 0.15);
474
+ --gradient-end: rgba(245, 158, 11, 0.05);
475
+ }
476
+ .nodePrimary {
477
+ --glow-color: rgba(37, 99, 235, 0.4);
478
+ --node-color-light: rgba(37, 99, 235, 0.1);
479
+ --node-color-glow: rgba(37, 99, 235, 0.15);
480
+ --handle-color: rgba(37, 99, 235, 0.5);
481
+ --gradient-start: rgba(37, 99, 235, 0.15);
482
+ --gradient-end: rgba(37, 99, 235, 0.05);
483
+ }
484
+ .handle {
485
+ transition: all 0.2s ease;
486
+ }
487
+ .handle:hover {
488
+ animation: handlePulse 1s ease-in-out infinite;
489
+ }
490
+ .nodeIcon {
491
+ transition: all 0.3s ease;
492
+ }
493
+ .badge {
494
+ transition: all 0.2s ease;
495
+ backdrop-filter: blur(4px);
496
+ }
497
+ .nodeCard:hover .badge {
498
+ transform: scale(1.05);
499
+ }
500
+ .badgeProd {
501
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.3);
502
+ }
503
+ .edge {
504
+ transition: all 0.3s ease;
505
+ }
506
+ .edgeAnimated {
507
+ stroke-dasharray: 8 4;
508
+ animation: edgeFlow 1s linear infinite;
509
+ }
510
+ .edgeGlow {
511
+ filter: drop-shadow(0 0 3px var(--edge-color, color-mix(in srgb, var(--color-primary) 50%, transparent)));
512
+ }
513
+ .edgeHighlighted {
514
+ stroke-width: 3px;
515
+ }
516
+ .edgeLabel {
517
+ backdrop-filter: blur(8px);
518
+ border: 1px solid rgba(255, 255, 255, 0.1);
519
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15), 0 0 20px var(--label-glow, color-mix(in srgb, var(--color-primary) 20%, transparent));
520
+ transition: box-shadow 0.2s ease;
521
+ }
522
+ .edgeLabel:hover {
523
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2), 0 0 30px var(--label-glow, color-mix(in srgb, var(--color-primary) 30%, transparent));
524
+ }
525
+ .legend {
526
+ backdrop-filter: var(--glass-blur);
527
+ background: var(--glass-background);
528
+ border: 1px solid color-mix(in srgb, var(--color-primary) 20%, transparent);
529
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1), 0 0 40px color-mix(in srgb, var(--color-primary) 10%, transparent);
530
+ }
531
+ [data-mantine-color-scheme=dark] .legend {
532
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
533
+ }
534
+ .legendDot {
535
+ transition: all 0.2s ease;
536
+ box-shadow: 0 0 8px currentColor;
537
+ }
538
+ .legendDot:hover {
539
+ transform: scale(1.3);
540
+ box-shadow: 0 0 12px currentColor;
541
+ }
542
+ .nodeHighlighted .nodeCard {
543
+ transform: translateY(-2px) scale(1.02);
544
+ }
545
+ .nodeHighlighted .nodeCard::before {
546
+ opacity: 1;
547
+ }
548
+ .nodeHighlighted .nodeCard::after {
549
+ animation: scanLine 3s ease-in-out infinite;
550
+ }
551
+ .nodeDimmed {
552
+ opacity: 0.3;
553
+ filter: grayscale(0.5);
554
+ transition: all 0.3s ease;
555
+ }
556
+ .edgeHighlighted {
557
+ stroke-width: 4px !important;
558
+ }
559
+ .edgeDimmed {
560
+ opacity: 0.15;
561
+ transition: all 0.3s ease;
562
+ }
563
+ .edgeLabelDimmed {
564
+ opacity: 0.15;
565
+ transition: opacity 0.3s ease;
566
+ }
567
+ @media (prefers-reduced-motion: reduce) {
568
+ .node,
569
+ .nodeCard::after,
570
+ .edgeAnimated,
571
+ .nodeIcon,
572
+ .handle:hover,
573
+ .graphContainer {
574
+ animation: none;
575
+ }
576
+ .nodeCard:hover {
577
+ transform: none;
578
+ }
579
+ }