@elevasis/ui 1.0.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.
Files changed (97) hide show
  1. package/dist/api/index.d.ts +87 -0
  2. package/dist/api/index.js +3 -0
  3. package/dist/auth/context.d.ts +19 -0
  4. package/dist/auth/context.js +1 -0
  5. package/dist/auth/index.d.ts +85 -0
  6. package/dist/auth/index.js +3 -0
  7. package/dist/chunk-3KMDHCAR.js +52 -0
  8. package/dist/chunk-5UWFGBFM.js +129 -0
  9. package/dist/chunk-6BJOYF6E.js +8 -0
  10. package/dist/chunk-6M6OLGQY.js +36 -0
  11. package/dist/chunk-7AI5ZYJ4.js +202 -0
  12. package/dist/chunk-7PLEQFHO.js +18 -0
  13. package/dist/chunk-GDV44UWF.js +138 -0
  14. package/dist/chunk-GEFB5YIR.js +338 -0
  15. package/dist/chunk-HBRMWW6V.js +43 -0
  16. package/dist/chunk-HUWJXLLF.js +681 -0
  17. package/dist/chunk-J3FALDQE.js +176 -0
  18. package/dist/chunk-JKERRYVS.js +109 -0
  19. package/dist/chunk-KA7LO7U5.js +28 -0
  20. package/dist/chunk-LHQTTUL2.js +27 -0
  21. package/dist/chunk-MAAS6CGR.js +1299 -0
  22. package/dist/chunk-NE36BUGQ.js +146 -0
  23. package/dist/chunk-NGXCFBCS.js +398 -0
  24. package/dist/chunk-OEYU5O27.js +235 -0
  25. package/dist/chunk-OUHGHTE7.js +748 -0
  26. package/dist/chunk-OXVOHOP3.js +661 -0
  27. package/dist/chunk-PSLKGOBZ.js +58 -0
  28. package/dist/chunk-PYL4XW6H.js +107 -0
  29. package/dist/chunk-Q47SPRY7.js +1 -0
  30. package/dist/chunk-Q7DJKLEN.js +18 -0
  31. package/dist/chunk-RJCA5672.js +1664 -0
  32. package/dist/chunk-S66I2PYB.js +748 -0
  33. package/dist/chunk-W7ZBF5AA.js +1 -0
  34. package/dist/chunk-WNWKOCGJ.js +1067 -0
  35. package/dist/chunk-XCYKC6OZ.js +1 -0
  36. package/dist/chunk-YULUKCS6.js +56 -0
  37. package/dist/chunk-YZ6GTZXL.js +48 -0
  38. package/dist/chunk-ZGHDPDTF.js +379 -0
  39. package/dist/components/command-queue/index.css +53 -0
  40. package/dist/components/command-queue/index.d.ts +204 -0
  41. package/dist/components/command-queue/index.js +10 -0
  42. package/dist/components/forms/index.d.ts +56 -0
  43. package/dist/components/forms/index.js +2 -0
  44. package/dist/components/index.css +443 -0
  45. package/dist/components/index.d.ts +1354 -0
  46. package/dist/components/index.js +18 -0
  47. package/dist/components/monitoring/index.d.ts +66 -0
  48. package/dist/components/monitoring/index.js +2 -0
  49. package/dist/components/navigation/index.d.ts +54 -0
  50. package/dist/components/navigation/index.js +91 -0
  51. package/dist/components/notifications/index.d.ts +52 -0
  52. package/dist/components/notifications/index.js +4 -0
  53. package/dist/components/resource-definition/index.css +388 -0
  54. package/dist/components/resource-definition/index.d.ts +301 -0
  55. package/dist/components/resource-definition/index.js +3 -0
  56. package/dist/display/index.css +53 -0
  57. package/dist/display/index.d.ts +606 -0
  58. package/dist/display/index.js +6 -0
  59. package/dist/execution/index.css +388 -0
  60. package/dist/execution/index.d.ts +1090 -0
  61. package/dist/execution/index.js +4 -0
  62. package/dist/graph/index.css +388 -0
  63. package/dist/graph/index.d.ts +429 -0
  64. package/dist/graph/index.js +1 -0
  65. package/dist/hooks/index.d.ts +1927 -0
  66. package/dist/hooks/index.js +6 -0
  67. package/dist/hooks/published.d.ts +1653 -0
  68. package/dist/hooks/published.js +4 -0
  69. package/dist/index.css +505 -0
  70. package/dist/index.d.ts +7284 -0
  71. package/dist/index.js +31 -0
  72. package/dist/initialization/index.d.ts +2325 -0
  73. package/dist/initialization/index.js +4 -0
  74. package/dist/organization/index.d.ts +225 -0
  75. package/dist/organization/index.js +4 -0
  76. package/dist/profile/index.d.ts +2265 -0
  77. package/dist/profile/index.js +3 -0
  78. package/dist/provider/index.css +61 -0
  79. package/dist/provider/index.d.ts +291 -0
  80. package/dist/provider/index.js +7 -0
  81. package/dist/provider/published.d.ts +198 -0
  82. package/dist/provider/published.js +6 -0
  83. package/dist/router/context.d.ts +19 -0
  84. package/dist/router/context.js +1 -0
  85. package/dist/router/index.d.ts +31 -0
  86. package/dist/router/index.js +2 -0
  87. package/dist/sse/index.d.ts +83 -0
  88. package/dist/sse/index.js +185 -0
  89. package/dist/supabase/index.d.ts +4289 -0
  90. package/dist/supabase/index.js +47 -0
  91. package/dist/typeform/index.d.ts +458 -0
  92. package/dist/typeform/index.js +1976 -0
  93. package/dist/typeform/schemas.d.ts +67 -0
  94. package/dist/typeform/schemas.js +1 -0
  95. package/dist/utils/index.d.ts +177 -0
  96. package/dist/utils/index.js +1 -0
  97. package/package.json +88 -0
@@ -0,0 +1,204 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode } from 'react';
4
+ import { IconCheck } from '@tabler/icons-react';
5
+ import { UseFormReturnType } from '@mantine/form';
6
+
7
+ /**
8
+ * Shared form field types for dynamic form generation
9
+ * Used by: Command Queue, Execution Runner UI, future form-based features
10
+ */
11
+ /**
12
+ * Supported form field types for action payloads
13
+ * Maps to Mantine form components
14
+ */
15
+ type FormFieldType = 'text' | 'textarea' | 'number' | 'select' | 'checkbox' | 'radio' | 'richtext';
16
+ /**
17
+ * Form field definition
18
+ */
19
+ interface FormField {
20
+ /** Field key in payload object */
21
+ name: string;
22
+ /** Field label for UI */
23
+ label: string;
24
+ /** Field type (determines UI component) */
25
+ type: FormFieldType;
26
+ /** Default value */
27
+ defaultValue?: unknown;
28
+ /** Required field */
29
+ required?: boolean;
30
+ /** Placeholder text */
31
+ placeholder?: string;
32
+ /** Help text */
33
+ description?: string;
34
+ /** Options for select/radio */
35
+ options?: Array<{
36
+ label: string;
37
+ value: string | number;
38
+ }>;
39
+ /** Min/max for number */
40
+ min?: number;
41
+ max?: number;
42
+ /** Path to context value for pre-filling (dot notation, e.g., 'proposal.summary') */
43
+ defaultValueFromContext?: string;
44
+ }
45
+ /**
46
+ * Form schema for action payload collection
47
+ */
48
+ interface FormSchema {
49
+ /** Form title */
50
+ title?: string;
51
+ /** Form description */
52
+ description?: string;
53
+ /** Form fields */
54
+ fields: FormField[];
55
+ }
56
+
57
+ /**
58
+ * Action configuration for HITL tasks
59
+ * Defines available user actions and their behavior
60
+ */
61
+ interface ActionConfig {
62
+ /** Unique action identifier (e.g., 'approve', 'retry', 'escalate') */
63
+ id: string;
64
+ /** Display label for UI button */
65
+ label: string;
66
+ /** Button variant/style */
67
+ type: 'primary' | 'secondary' | 'danger' | 'outline';
68
+ /** Tabler icon name (e.g., 'IconCheck', 'IconRefresh') */
69
+ icon?: string;
70
+ /** Button color (Mantine theme colors) */
71
+ color?: string;
72
+ /** Button variant (Mantine button variant, e.g., 'light', 'filled', 'outline') */
73
+ variant?: string;
74
+ /** Execution target (agent/workflow to invoke) */
75
+ target?: {
76
+ resourceType: 'agent' | 'workflow';
77
+ resourceId: string;
78
+ /**
79
+ * Optional session ID for agent continuation.
80
+ * If provided, invokes a new turn on the existing session instead of standalone execution.
81
+ * Only valid when resourceType is 'agent'.
82
+ */
83
+ sessionId?: string;
84
+ };
85
+ /** Form schema for collecting action-specific data */
86
+ form?: FormSchema;
87
+ /** Payload template for pre-filling forms */
88
+ payloadTemplate?: unknown;
89
+ /** Requires confirmation dialog */
90
+ requiresConfirmation?: boolean;
91
+ /** Confirmation message */
92
+ confirmationMessage?: string;
93
+ /** Help text / tooltip */
94
+ description?: string;
95
+ }
96
+
97
+ /**
98
+ * Origin resource type - where an execution/task originated from.
99
+ * Used for audit trails and tracking execution lineage.
100
+ */
101
+ type OriginResourceType = 'agent' | 'workflow' | 'scheduler' | 'api';
102
+ /**
103
+ * Origin tracking metadata - who/what created this execution/task.
104
+ * Used by both TaskScheduler and CommandQueue for complete audit trails.
105
+ */
106
+ interface OriginTracking {
107
+ originExecutionId: string;
108
+ originResourceType: OriginResourceType;
109
+ originResourceId: string;
110
+ }
111
+
112
+ /**
113
+ * Command queue task with flexible action system
114
+ */
115
+ interface Task extends OriginTracking {
116
+ id: string;
117
+ organizationId: string;
118
+ actions: ActionConfig[];
119
+ context: unknown;
120
+ selectedAction?: string;
121
+ actionPayload?: unknown;
122
+ description?: string;
123
+ priority: number;
124
+ /** Optional checkpoint identifier for grouping related human approval tasks */
125
+ humanCheckpoint?: string;
126
+ status: TaskStatus;
127
+ /**
128
+ * Target resource tracking — mirrors origin columns.
129
+ * Set when task is created; patchable to redirect execution to a different resource.
130
+ */
131
+ targetResourceId?: string;
132
+ targetResourceType?: 'agent' | 'workflow';
133
+ /**
134
+ * Execution ID for the action that runs AFTER user approval.
135
+ * NULL until execution starts.
136
+ *
137
+ * Naming distinction:
138
+ * - originExecutionId = Parent execution that CREATED the HITL task
139
+ * - targetExecutionId = Child execution that RUNS AFTER user approval
140
+ */
141
+ targetExecutionId?: string;
142
+ createdAt: Date;
143
+ completedAt?: Date;
144
+ completedBy?: string;
145
+ expiresAt?: Date;
146
+ idempotencyKey?: string | null;
147
+ }
148
+ /**
149
+ * Task status values
150
+ * - pending: awaiting action
151
+ * - processing: execution in progress after user approval
152
+ * - completed: action was taken and execution succeeded
153
+ * - failed: execution failed, task can be retried
154
+ * - expired: timed out before action
155
+ */
156
+ type TaskStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'expired';
157
+
158
+ interface TaskCardProps {
159
+ task: Task;
160
+ onViewExecution?: (params: {
161
+ resourceType: string;
162
+ resourceId: string;
163
+ executionId: string;
164
+ }) => void;
165
+ richTextRenderer?: (props: {
166
+ content: string;
167
+ onChange: (content: string) => void;
168
+ placeholder?: string;
169
+ }) => ReactNode;
170
+ }
171
+ declare function TaskCard({ task, onViewExecution, richTextRenderer }: TaskCardProps): react_jsx_runtime.JSX.Element;
172
+
173
+ interface ActionModalProps {
174
+ action: ActionConfig;
175
+ task: Task;
176
+ opened: boolean;
177
+ onClose: () => void;
178
+ onSubmit: (payload: unknown, notes?: string) => void;
179
+ richTextRenderer?: (props: {
180
+ content: string;
181
+ onChange: (content: string) => void;
182
+ placeholder?: string;
183
+ }) => ReactNode;
184
+ error?: unknown;
185
+ isPending?: boolean;
186
+ }
187
+ declare function ActionModal({ action, task, opened, onClose, onSubmit, richTextRenderer, error, isPending }: ActionModalProps): react_jsx_runtime.JSX.Element | null;
188
+
189
+ declare const iconMap: Record<string, typeof IconCheck>;
190
+ /** Allowed icon names: IconCheck, IconX, IconRefresh, IconAlertTriangle, IconEdit, IconEye, IconRocket, IconMessageCircle, IconArrowUp, IconClock, IconFileText, IconSend, IconMail */
191
+ declare function getIcon(iconName?: string): typeof IconCheck | null;
192
+
193
+ interface FormFieldRendererProps {
194
+ field: FormField;
195
+ form: UseFormReturnType<any>;
196
+ richTextRenderer?: (props: {
197
+ content: string;
198
+ onChange: (content: string) => void;
199
+ placeholder?: string;
200
+ }) => ReactNode;
201
+ }
202
+ declare function FormFieldRenderer({ field, form, richTextRenderer }: FormFieldRendererProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
203
+
204
+ export { ActionModal, FormFieldRenderer, TaskCard, getIcon, iconMap };
@@ -0,0 +1,10 @@
1
+ export { ActionModal, TaskCard, getIcon, iconMap } from '../../chunk-ZGHDPDTF.js';
2
+ import '../../chunk-J3FALDQE.js';
3
+ export { FormFieldRenderer } from '../../chunk-PSLKGOBZ.js';
4
+ import '../../chunk-OUHGHTE7.js';
5
+ import '../../chunk-3KMDHCAR.js';
6
+ import '../../chunk-YZ6GTZXL.js';
7
+ import '../../chunk-KA7LO7U5.js';
8
+ import '../../chunk-7AI5ZYJ4.js';
9
+ import '../../chunk-7PLEQFHO.js';
10
+ import '../../chunk-Q7DJKLEN.js';
@@ -0,0 +1,56 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as react from 'react';
3
+ import { ReactNode } from 'react';
4
+ import { UseFormReturnType } from '@mantine/form';
5
+
6
+ /**
7
+ * Shared form field types for dynamic form generation
8
+ * Used by: Command Queue, Execution Runner UI, future form-based features
9
+ */
10
+ /**
11
+ * Supported form field types for action payloads
12
+ * Maps to Mantine form components
13
+ */
14
+ type FormFieldType = 'text' | 'textarea' | 'number' | 'select' | 'checkbox' | 'radio' | 'richtext';
15
+ /**
16
+ * Form field definition
17
+ */
18
+ interface FormField {
19
+ /** Field key in payload object */
20
+ name: string;
21
+ /** Field label for UI */
22
+ label: string;
23
+ /** Field type (determines UI component) */
24
+ type: FormFieldType;
25
+ /** Default value */
26
+ defaultValue?: unknown;
27
+ /** Required field */
28
+ required?: boolean;
29
+ /** Placeholder text */
30
+ placeholder?: string;
31
+ /** Help text */
32
+ description?: string;
33
+ /** Options for select/radio */
34
+ options?: Array<{
35
+ label: string;
36
+ value: string | number;
37
+ }>;
38
+ /** Min/max for number */
39
+ min?: number;
40
+ max?: number;
41
+ /** Path to context value for pre-filling (dot notation, e.g., 'proposal.summary') */
42
+ defaultValueFromContext?: string;
43
+ }
44
+
45
+ interface FormFieldRendererProps {
46
+ field: FormField;
47
+ form: UseFormReturnType<any>;
48
+ richTextRenderer?: (props: {
49
+ content: string;
50
+ onChange: (content: string) => void;
51
+ placeholder?: string;
52
+ }) => ReactNode;
53
+ }
54
+ declare function FormFieldRenderer({ field, form, richTextRenderer }: FormFieldRendererProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
55
+
56
+ export { FormFieldRenderer };
@@ -0,0 +1,2 @@
1
+ import '../../chunk-W7ZBF5AA.js';
2
+ export { FormFieldRenderer } from '../../chunk-PSLKGOBZ.js';
@@ -0,0 +1,443 @@
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
+ composes: iconRing;
23
+ width: 36px;
24
+ height: 36px;
25
+ box-shadow: 0 0 8px color-mix(in srgb, var(--color-primary) 12%, transparent);
26
+ }
27
+ .heroValue {
28
+ font-family: var(--elevasis-font-family-subtitle);
29
+ font-size: 1.85rem;
30
+ font-weight: 800;
31
+ line-height: 1;
32
+ letter-spacing: -0.02em;
33
+ font-variant-numeric: tabular-nums;
34
+ }
35
+ [data-mantine-color-scheme=dark] .heroValue {
36
+ text-shadow: 0 0 20px color-mix(in srgb, var(--color-primary) 20%, transparent);
37
+ }
38
+ .heroValueSm {
39
+ composes: heroValue;
40
+ font-size: 1.35rem;
41
+ font-weight: 700;
42
+ }
43
+ .heroLabel {
44
+ font-size: 0.68rem;
45
+ font-weight: 700;
46
+ text-transform: uppercase;
47
+ letter-spacing: 0.12em;
48
+ color: var(--color-text-dimmed);
49
+ }
50
+ .heroLabelSm {
51
+ composes: heroLabel;
52
+ font-size: 0.62rem;
53
+ }
54
+
55
+ /* src/graph/Graph.globals.css */
56
+
57
+ /* src/graph/Graph.module.css */
58
+ @keyframes edgeFlow {
59
+ 0% {
60
+ stroke-dashoffset: 24;
61
+ }
62
+ 100% {
63
+ stroke-dashoffset: 0;
64
+ }
65
+ }
66
+ @keyframes edgeFlowReverse {
67
+ 0% {
68
+ stroke-dashoffset: 0;
69
+ }
70
+ 100% {
71
+ stroke-dashoffset: 24;
72
+ }
73
+ }
74
+ @keyframes pulse {
75
+ 0%, 100% {
76
+ opacity: 0.6;
77
+ }
78
+ 50% {
79
+ opacity: 1;
80
+ }
81
+ }
82
+ @keyframes livePulse {
83
+ 0%, 100% {
84
+ opacity: 1;
85
+ }
86
+ 50% {
87
+ opacity: 0.6;
88
+ }
89
+ }
90
+ .livePulse {
91
+ animation: livePulse 2s ease-in-out infinite;
92
+ }
93
+ @keyframes glowPulse {
94
+ 0%, 100% {
95
+ 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));
96
+ }
97
+ 50% {
98
+ 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));
99
+ }
100
+ }
101
+ @keyframes nodeEnter {
102
+ 0% {
103
+ opacity: 0;
104
+ transform: scale(0.8) translateY(10px);
105
+ }
106
+ 100% {
107
+ opacity: 1;
108
+ transform: scale(1) translateY(0);
109
+ }
110
+ }
111
+ @keyframes handlePulse {
112
+ 0%, 100% {
113
+ transform: scale(1);
114
+ box-shadow: 0 0 0 0 var(--handle-color, color-mix(in srgb, var(--color-primary) 40%, transparent));
115
+ }
116
+ 50% {
117
+ transform: scale(1.2);
118
+ box-shadow: 0 0 0 4px var(--handle-color, color-mix(in srgb, var(--color-primary) 0%, transparent));
119
+ }
120
+ }
121
+ @keyframes gridMove {
122
+ 0% {
123
+ background-position: 0 0;
124
+ }
125
+ 100% {
126
+ background-position: 40px 40px;
127
+ }
128
+ }
129
+ @keyframes labelFadeIn {
130
+ 0% {
131
+ opacity: 0;
132
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(0.8);
133
+ }
134
+ 100% {
135
+ opacity: 1;
136
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(1);
137
+ }
138
+ }
139
+ @keyframes scanLine {
140
+ 0% {
141
+ transform: translateY(-100%);
142
+ opacity: 0;
143
+ }
144
+ 50% {
145
+ opacity: 0.5;
146
+ }
147
+ 100% {
148
+ transform: translateY(100%);
149
+ opacity: 0;
150
+ }
151
+ }
152
+ .graphContainer :global(.react-flow__node.selected),
153
+ .graphContainer :global(.react-flow__node:focus),
154
+ .graphContainer :global(.react-flow__node:focus-visible) {
155
+ outline: none !important;
156
+ }
157
+ .graphContainer :global(.react-flow__node.selected > *) {
158
+ box-shadow: none;
159
+ }
160
+ .graphContainer {
161
+ position: relative;
162
+ background-image:
163
+ linear-gradient(color-mix(in srgb, var(--color-primary) 5%, transparent) 1px, transparent 1px),
164
+ linear-gradient(
165
+ 90deg,
166
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 1px,
167
+ transparent 1px),
168
+ radial-gradient(
169
+ ellipse at 50% 50%,
170
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 0%,
171
+ transparent 70%);
172
+ background-color: var(--color-background);
173
+ background-size:
174
+ 40px 40px,
175
+ 40px 40px,
176
+ 100% 100%;
177
+ animation: gridMove 20s linear infinite;
178
+ }
179
+ [data-mantine-color-scheme=dark] .graphContainer {
180
+ background-image:
181
+ linear-gradient(color-mix(in srgb, var(--color-primary) 9%, transparent) 1px, transparent 1px),
182
+ linear-gradient(
183
+ 90deg,
184
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 1px,
185
+ transparent 1px),
186
+ radial-gradient(
187
+ ellipse at 50% 50%,
188
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 0%,
189
+ transparent 70%);
190
+ background-color: var(--color-background);
191
+ background-size:
192
+ 40px 40px,
193
+ 40px 40px,
194
+ 100% 100%;
195
+ }
196
+ .node {
197
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
198
+ position: relative;
199
+ }
200
+ .node :global(.react-flow__node.selected),
201
+ .node :global(.react-flow__node:focus),
202
+ .node :global(.react-flow__node:focus-visible) {
203
+ outline: none !important;
204
+ box-shadow: none !important;
205
+ }
206
+ .node:nth-child(1) {
207
+ animation-delay: 0.05s;
208
+ }
209
+ .node:nth-child(2) {
210
+ animation-delay: 0.1s;
211
+ }
212
+ .node:nth-child(3) {
213
+ animation-delay: 0.15s;
214
+ }
215
+ .node:nth-child(4) {
216
+ animation-delay: 0.2s;
217
+ }
218
+ .node:nth-child(5) {
219
+ animation-delay: 0.25s;
220
+ }
221
+ .node:nth-child(6) {
222
+ animation-delay: 0.3s;
223
+ }
224
+ .node:nth-child(7) {
225
+ animation-delay: 0.35s;
226
+ }
227
+ .node:nth-child(8) {
228
+ animation-delay: 0.4s;
229
+ }
230
+ .node:nth-child(9) {
231
+ animation-delay: 0.45s;
232
+ }
233
+ .node:nth-child(10) {
234
+ animation-delay: 0.5s;
235
+ }
236
+ .node:nth-child(11) {
237
+ animation-delay: 0.55s;
238
+ }
239
+ .node:nth-child(12) {
240
+ animation-delay: 0.6s;
241
+ }
242
+ .nodeCard {
243
+ position: relative;
244
+ border-radius: var(--mantine-radius-md);
245
+ overflow: hidden;
246
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
247
+ }
248
+ .nodeCard::before {
249
+ content: "";
250
+ position: absolute;
251
+ inset: 0;
252
+ background:
253
+ linear-gradient(
254
+ 135deg,
255
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 10%, transparent)) 0%,
256
+ transparent 50%,
257
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 5%, transparent)) 100%);
258
+ pointer-events: none;
259
+ opacity: 0;
260
+ transition: opacity 0.3s ease;
261
+ }
262
+ .nodeCard::after {
263
+ content: "";
264
+ position: absolute;
265
+ left: 0;
266
+ right: 0;
267
+ height: 30%;
268
+ background:
269
+ linear-gradient(
270
+ 180deg,
271
+ transparent 0%,
272
+ var(--node-color-glow, color-mix(in srgb, var(--color-primary) 10%, transparent)) 50%,
273
+ transparent 100%);
274
+ pointer-events: none;
275
+ opacity: 0;
276
+ }
277
+ .nodeCard:hover::before,
278
+ .nodeCardSelected::before {
279
+ opacity: 1;
280
+ }
281
+ .nodeCard:hover::after,
282
+ .nodeCardSelected::after {
283
+ animation: scanLine 3s ease-in-out infinite;
284
+ }
285
+ .nodeCard:hover {
286
+ transform: translateY(-2px) scale(1.02);
287
+ }
288
+ .nodeCardSelected {
289
+ transform: translateY(-2px) scale(1.02);
290
+ animation: glowPulse 2s ease-in-out infinite;
291
+ }
292
+ .nodeAgent {
293
+ --glow-color: rgba(139, 92, 246, 0.4);
294
+ --node-color-light: rgba(139, 92, 246, 0.1);
295
+ --node-color-glow: rgba(139, 92, 246, 0.15);
296
+ --handle-color: rgba(139, 92, 246, 0.5);
297
+ --gradient-start: rgba(139, 92, 246, 0.15);
298
+ --gradient-end: rgba(139, 92, 246, 0.05);
299
+ }
300
+ .nodeWorkflow {
301
+ --glow-color: rgba(59, 130, 246, 0.4);
302
+ --node-color-light: rgba(59, 130, 246, 0.1);
303
+ --node-color-glow: rgba(59, 130, 246, 0.15);
304
+ --handle-color: rgba(59, 130, 246, 0.5);
305
+ --gradient-start: rgba(59, 130, 246, 0.15);
306
+ --gradient-end: rgba(59, 130, 246, 0.05);
307
+ }
308
+ .nodeTrigger {
309
+ --glow-color: rgba(249, 115, 22, 0.4);
310
+ --node-color-light: rgba(249, 115, 22, 0.1);
311
+ --node-color-glow: rgba(249, 115, 22, 0.15);
312
+ --handle-color: rgba(249, 115, 22, 0.5);
313
+ --gradient-start: rgba(249, 115, 22, 0.15);
314
+ --gradient-end: rgba(249, 115, 22, 0.05);
315
+ }
316
+ .nodeIntegration {
317
+ --glow-color: rgba(20, 184, 166, 0.4);
318
+ --node-color-light: rgba(20, 184, 166, 0.1);
319
+ --node-color-glow: rgba(20, 184, 166, 0.15);
320
+ --handle-color: rgba(20, 184, 166, 0.5);
321
+ --gradient-start: rgba(20, 184, 166, 0.15);
322
+ --gradient-end: rgba(20, 184, 166, 0.05);
323
+ }
324
+ .nodeExternal {
325
+ --glow-color: rgba(107, 114, 128, 0.4);
326
+ --node-color-light: rgba(107, 114, 128, 0.1);
327
+ --node-color-glow: rgba(107, 114, 128, 0.15);
328
+ --handle-color: rgba(107, 114, 128, 0.5);
329
+ --gradient-start: rgba(107, 114, 128, 0.15);
330
+ --gradient-end: rgba(107, 114, 128, 0.05);
331
+ }
332
+ .nodeHuman {
333
+ --glow-color: rgba(245, 158, 11, 0.4);
334
+ --node-color-light: rgba(245, 158, 11, 0.1);
335
+ --node-color-glow: rgba(245, 158, 11, 0.15);
336
+ --handle-color: rgba(245, 158, 11, 0.5);
337
+ --gradient-start: rgba(245, 158, 11, 0.15);
338
+ --gradient-end: rgba(245, 158, 11, 0.05);
339
+ }
340
+ .nodePrimary {
341
+ --glow-color: rgba(37, 99, 235, 0.4);
342
+ --node-color-light: rgba(37, 99, 235, 0.1);
343
+ --node-color-glow: rgba(37, 99, 235, 0.15);
344
+ --handle-color: rgba(37, 99, 235, 0.5);
345
+ --gradient-start: rgba(37, 99, 235, 0.15);
346
+ --gradient-end: rgba(37, 99, 235, 0.05);
347
+ }
348
+ .handle {
349
+ transition: all 0.2s ease;
350
+ }
351
+ .handle:hover {
352
+ animation: handlePulse 1s ease-in-out infinite;
353
+ }
354
+ .nodeIcon {
355
+ transition: all 0.3s ease;
356
+ }
357
+ .badge {
358
+ transition: all 0.2s ease;
359
+ backdrop-filter: blur(4px);
360
+ }
361
+ .nodeCard:hover .badge {
362
+ transform: scale(1.05);
363
+ }
364
+ .badgeProd {
365
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.3);
366
+ }
367
+ .edge {
368
+ transition: all 0.3s ease;
369
+ }
370
+ .edgeAnimated {
371
+ stroke-dasharray: 8 4;
372
+ animation: edgeFlow 1s linear infinite;
373
+ }
374
+ .edgeGlow {
375
+ filter: drop-shadow(0 0 3px var(--edge-color, color-mix(in srgb, var(--color-primary) 50%, transparent)));
376
+ }
377
+ .edgeHighlighted {
378
+ stroke-width: 3px;
379
+ }
380
+ .edgeLabel {
381
+ backdrop-filter: blur(8px);
382
+ border: 1px solid rgba(255, 255, 255, 0.1);
383
+ 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));
384
+ transition: box-shadow 0.2s ease;
385
+ }
386
+ .edgeLabel:hover {
387
+ 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));
388
+ }
389
+ .legend {
390
+ backdrop-filter: var(--glass-blur);
391
+ background: var(--glass-background);
392
+ border: 1px solid color-mix(in srgb, var(--color-primary) 20%, transparent);
393
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1), 0 0 40px color-mix(in srgb, var(--color-primary) 10%, transparent);
394
+ }
395
+ [data-mantine-color-scheme=dark] .legend {
396
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
397
+ }
398
+ .legendDot {
399
+ transition: all 0.2s ease;
400
+ box-shadow: 0 0 8px currentColor;
401
+ }
402
+ .legendDot:hover {
403
+ transform: scale(1.3);
404
+ box-shadow: 0 0 12px currentColor;
405
+ }
406
+ .nodeHighlighted .nodeCard {
407
+ transform: translateY(-2px) scale(1.02);
408
+ }
409
+ .nodeHighlighted .nodeCard::before {
410
+ opacity: 1;
411
+ }
412
+ .nodeHighlighted .nodeCard::after {
413
+ animation: scanLine 3s ease-in-out infinite;
414
+ }
415
+ .nodeDimmed {
416
+ opacity: 0.3;
417
+ filter: grayscale(0.5);
418
+ transition: all 0.3s ease;
419
+ }
420
+ .edgeHighlighted {
421
+ stroke-width: 4px !important;
422
+ }
423
+ .edgeDimmed {
424
+ opacity: 0.15;
425
+ transition: all 0.3s ease;
426
+ }
427
+ .edgeLabelDimmed {
428
+ opacity: 0.15;
429
+ transition: opacity 0.3s ease;
430
+ }
431
+ @media (prefers-reduced-motion: reduce) {
432
+ .node,
433
+ .nodeCard::after,
434
+ .edgeAnimated,
435
+ .nodeIcon,
436
+ .handle:hover,
437
+ .graphContainer {
438
+ animation: none;
439
+ }
440
+ .nodeCard:hover {
441
+ transform: none;
442
+ }
443
+ }