@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,18 @@
1
+ export { ChatHeader, ChatInputArea, ChatInterface, ChatSidebar, ConfirmationInputModal, ConfirmationModal, MessageBubble } from '../chunk-S66I2PYB.js';
2
+ export { ExecutionLogsTable, ResourceHealthChart, getHealthColor } from '../chunk-NE36BUGQ.js';
3
+ import '../chunk-W7ZBF5AA.js';
4
+ export { ActionModal, CustomModal, TaskCard, getIcon, iconMap } from '../chunk-ZGHDPDTF.js';
5
+ import '../chunk-J3FALDQE.js';
6
+ export { FormFieldRenderer } from '../chunk-PSLKGOBZ.js';
7
+ export { NotificationBell, NotificationItem, NotificationList, NotificationPanel } from '../chunk-PYL4XW6H.js';
8
+ import '../chunk-JKERRYVS.js';
9
+ export { AgentDefinitionDisplay, CollapsibleJsonSection, ConfigCard, ContractDisplay, NewKnowledgeMapEdge, NewKnowledgeMapGraph, NewKnowledgeMapNode, ResourceDefinitionSection, ToolsListDisplay, WorkflowDefinitionDisplay, useNewKnowledgeMapLayout } from '../chunk-OXVOHOP3.js';
10
+ import '../chunk-6BJOYF6E.js';
11
+ import '../chunk-HUWJXLLF.js';
12
+ export { APIErrorAlert, CollapsibleSection, ContextViewer, CustomSelector, DetailCardSkeleton, EmptyState, JsonViewer, ListSkeleton, NavigationButton, PageNotFound, PageTitleCaption, ResourceCard, StatCard, StatCardSkeleton, StatsCardSkeleton, TabCountBadge, TimeRangeSelector, TrendIndicator, catalogItemToResourceDefinition } from '../chunk-OUHGHTE7.js';
13
+ export { StyledMarkdown } from '../chunk-3KMDHCAR.js';
14
+ import '../chunk-YZ6GTZXL.js';
15
+ import '../chunk-KA7LO7U5.js';
16
+ import '../chunk-7AI5ZYJ4.js';
17
+ import '../chunk-7PLEQFHO.js';
18
+ import '../chunk-Q7DJKLEN.js';
@@ -0,0 +1,66 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /** Time-bucketed health data point */
4
+ interface ResourceHealthDataPoint {
5
+ time: string;
6
+ success: number;
7
+ failure: number;
8
+ warning: number;
9
+ rate: number;
10
+ }
11
+ /** Health data for a single resource */
12
+ interface ResourceHealth {
13
+ entityType: string;
14
+ entityId: string;
15
+ entityName: string | null;
16
+ trendData: ResourceHealthDataPoint[];
17
+ summary: {
18
+ total: number;
19
+ successRate: number;
20
+ };
21
+ }
22
+
23
+ type ExecutionStatus = 'pending' | 'running' | 'completed' | 'failed' | 'warning';
24
+
25
+ interface ExecutionLogEntry {
26
+ id: string;
27
+ resourceId: string;
28
+ resourceName: string;
29
+ resourceType: 'workflow' | 'agent' | 'pipeline';
30
+ status: ExecutionStatus;
31
+ startTime: number;
32
+ endTime?: number;
33
+ duration?: number;
34
+ resourceStatus: 'dev' | 'prod';
35
+ resourceVersion?: string | null;
36
+ apiVersion?: string | null;
37
+ sdkVersion?: string | null;
38
+ }
39
+ interface ExecutionLogsTableProps {
40
+ executions: ExecutionLogEntry[];
41
+ isLoading: boolean;
42
+ onRowClick?: (params: {
43
+ resourceType: string;
44
+ resourceId: string;
45
+ executionId: string;
46
+ }) => void;
47
+ }
48
+ declare function ExecutionLogsTable({ executions, isLoading, onRowClick }: ExecutionLogsTableProps): react_jsx_runtime.JSX.Element;
49
+
50
+ /**
51
+ * Get chart color based on success rate
52
+ */
53
+ declare function getHealthColor(successRate: number, hasExecutions?: boolean): string;
54
+ interface ResourceHealthChartProps {
55
+ healthData: ResourceHealth | undefined;
56
+ hasExecutions?: boolean;
57
+ width?: number | string;
58
+ height?: number;
59
+ }
60
+ /**
61
+ * Mini health chart for resource cards
62
+ */
63
+ declare function ResourceHealthChart({ healthData, hasExecutions, width, height }: ResourceHealthChartProps): react_jsx_runtime.JSX.Element;
64
+
65
+ export { ExecutionLogsTable, ResourceHealthChart, getHealthColor };
66
+ export type { ExecutionLogEntry, ExecutionLogsTableProps };
@@ -0,0 +1,2 @@
1
+ export { ExecutionLogsTable, ResourceHealthChart, getHealthColor } from '../../chunk-NE36BUGQ.js';
2
+ import '../../chunk-6BJOYF6E.js';
@@ -0,0 +1,54 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import React from 'react';
3
+
4
+ interface BreadcrumbItem {
5
+ label: string;
6
+ path?: string;
7
+ isActive?: boolean;
8
+ }
9
+ interface UseBreadcrumbsOptions {
10
+ /** Navigation items to match against for proper labels */
11
+ navItems?: Array<{
12
+ label: string;
13
+ link?: string;
14
+ links?: Array<{
15
+ label: string;
16
+ link?: string;
17
+ links?: Array<{
18
+ label: string;
19
+ link: string;
20
+ }>;
21
+ }>;
22
+ }>;
23
+ }
24
+ declare const useBreadcrumbs: (options?: UseBreadcrumbsOptions) => BreadcrumbItem[];
25
+
26
+ interface LinkItem {
27
+ label: string;
28
+ link: string;
29
+ onClick?: () => void;
30
+ }
31
+ interface LinksGroupProps {
32
+ icon: React.ComponentType<{
33
+ size?: number;
34
+ stroke?: number;
35
+ }>;
36
+ label: string;
37
+ initiallyOpened?: boolean;
38
+ links?: LinkItem[];
39
+ link?: string;
40
+ onClick?: () => void;
41
+ currentPath?: string;
42
+ opened?: boolean;
43
+ onToggle?: () => void;
44
+ /** Optional tour target ID for onboarding highlights */
45
+ dataOnboardingTourId?: string;
46
+ }
47
+
48
+ interface BreadcrumbsProps extends UseBreadcrumbsOptions {
49
+ navItems: LinksGroupProps[];
50
+ }
51
+ declare const Breadcrumbs: ({ navItems }: BreadcrumbsProps) => react_jsx_runtime.JSX.Element;
52
+
53
+ export { Breadcrumbs, useBreadcrumbs };
54
+ export type { BreadcrumbItem, BreadcrumbsProps, UseBreadcrumbsOptions };
@@ -0,0 +1,91 @@
1
+ import { useRouterContext } from '../../chunk-Q7DJKLEN.js';
2
+ import { Text, Anchor, Breadcrumbs as Breadcrumbs$1 } from '@mantine/core';
3
+ import { useMemo } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var useBreadcrumbs = (options = {}) => {
7
+ const { currentPath } = useRouterContext();
8
+ const { navItems = [] } = options;
9
+ return useMemo(() => {
10
+ const segments = currentPath.split("/").filter(Boolean);
11
+ if (segments.length === 0) {
12
+ return [{ label: "Dashboard", isActive: true }];
13
+ }
14
+ const breadcrumbs = [{ label: "Dashboard", path: "/" }];
15
+ let currentSegmentPath = "";
16
+ for (let i = 0; i < segments.length; i++) {
17
+ currentSegmentPath += `/${segments[i]}`;
18
+ const isLast = i === segments.length - 1;
19
+ let label = formatSegmentLabel(segments[i]);
20
+ let matchedItem = null;
21
+ for (const navItem of navItems) {
22
+ if (navItem.link === currentSegmentPath) {
23
+ matchedItem = navItem;
24
+ break;
25
+ }
26
+ if (navItem.links) {
27
+ for (const subItem of navItem.links) {
28
+ if (subItem.link === currentSegmentPath) {
29
+ if (i === 0 && subItem.label === "Overview") {
30
+ matchedItem = { label: navItem.label };
31
+ } else {
32
+ matchedItem = subItem;
33
+ }
34
+ break;
35
+ }
36
+ if (subItem.links) {
37
+ for (const nestedLink of subItem.links) {
38
+ if (nestedLink.link === currentSegmentPath) {
39
+ matchedItem = nestedLink;
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ if (matchedItem) break;
45
+ }
46
+ }
47
+ if (matchedItem) break;
48
+ }
49
+ if (matchedItem) {
50
+ label = matchedItem.label;
51
+ }
52
+ breadcrumbs.push({
53
+ label,
54
+ path: isLast ? void 0 : currentSegmentPath,
55
+ isActive: isLast
56
+ });
57
+ }
58
+ return breadcrumbs;
59
+ }, [currentPath, navItems]);
60
+ };
61
+ function formatSegmentLabel(segment) {
62
+ return segment.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
63
+ }
64
+ var Breadcrumbs = ({ navItems }) => {
65
+ const { Link } = useRouterContext();
66
+ const breadcrumbs = useBreadcrumbs({ navItems });
67
+ const items = breadcrumbs.map((item) => {
68
+ const isActive = item.isActive;
69
+ if (isActive) {
70
+ return /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: "var(--color-text)", children: item.label }, item.path || item.label);
71
+ }
72
+ return item.path ? /* @__PURE__ */ jsx(
73
+ Anchor,
74
+ {
75
+ component: Link,
76
+ to: item.path,
77
+ size: "sm",
78
+ style: {
79
+ color: "var(--color-text-subtle)",
80
+ textDecoration: "none"
81
+ },
82
+ c: "dimmed",
83
+ children: item.label
84
+ },
85
+ item.path
86
+ ) : /* @__PURE__ */ jsx(Text, { size: "sm", c: "var(--color-text-subtle)", children: item.label }, item.label);
87
+ });
88
+ return /* @__PURE__ */ jsx(Breadcrumbs$1, { separator: "/", children: items });
89
+ };
90
+
91
+ export { Breadcrumbs, useBreadcrumbs };
@@ -0,0 +1,52 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * Wire-format DTO for notification API responses.
5
+ * Dates are ISO 8601 strings (not Date objects like the domain Notification type).
6
+ * Used by frontend hooks that consume /api/notifications.
7
+ */
8
+ interface NotificationDTO {
9
+ id: string;
10
+ userId: string;
11
+ organizationId: string;
12
+ category: string;
13
+ title: string;
14
+ message: string;
15
+ actionUrl: string | null;
16
+ read: boolean;
17
+ readAt: string | null;
18
+ createdAt: string;
19
+ }
20
+
21
+ interface NotificationItemProps {
22
+ notification: NotificationDTO;
23
+ onClose?: () => void;
24
+ onNavigate?: (url: string) => void;
25
+ }
26
+ declare function NotificationItem({ notification, onClose, onNavigate }: NotificationItemProps): react_jsx_runtime.JSX.Element;
27
+
28
+ interface NotificationListProps {
29
+ notifications: NotificationDTO[];
30
+ isLoading?: boolean;
31
+ onClose?: () => void;
32
+ onNavigate?: (url: string) => void;
33
+ }
34
+ declare function NotificationList({ notifications, isLoading, onClose, onNavigate }: NotificationListProps): react_jsx_runtime.JSX.Element;
35
+
36
+ interface NotificationPanelProps {
37
+ notifications: NotificationDTO[];
38
+ isLoading?: boolean;
39
+ onClose?: () => void;
40
+ onNavigate?: (url: string) => void;
41
+ }
42
+ declare function NotificationPanel({ notifications, isLoading, onClose, onNavigate }: NotificationPanelProps): react_jsx_runtime.JSX.Element;
43
+
44
+ interface NotificationBellProps {
45
+ /** Override unread count (e.g., from SSE-enhanced source) */
46
+ unreadCount?: number;
47
+ /** Callback for navigation when notification is clicked */
48
+ onNavigate?: (url: string) => void;
49
+ }
50
+ declare function NotificationBell({ unreadCount, onNavigate }: NotificationBellProps): react_jsx_runtime.JSX.Element;
51
+
52
+ export { NotificationBell, NotificationItem, NotificationList, NotificationPanel };
@@ -0,0 +1,4 @@
1
+ export { NotificationBell, NotificationItem, NotificationList, NotificationPanel } from '../../chunk-PYL4XW6H.js';
2
+ import '../../chunk-JKERRYVS.js';
3
+ import '../../chunk-KA7LO7U5.js';
4
+ import '../../chunk-7AI5ZYJ4.js';
@@ -0,0 +1,388 @@
1
+ /* src/graph/Graph.globals.css */
2
+ /* src/graph/Graph.module.css */
3
+ @keyframes edgeFlow {
4
+ 0% {
5
+ stroke-dashoffset: 24;
6
+ }
7
+ 100% {
8
+ stroke-dashoffset: 0;
9
+ }
10
+ }
11
+ @keyframes edgeFlowReverse {
12
+ 0% {
13
+ stroke-dashoffset: 0;
14
+ }
15
+ 100% {
16
+ stroke-dashoffset: 24;
17
+ }
18
+ }
19
+ @keyframes pulse {
20
+ 0%, 100% {
21
+ opacity: 0.6;
22
+ }
23
+ 50% {
24
+ opacity: 1;
25
+ }
26
+ }
27
+ @keyframes livePulse {
28
+ 0%, 100% {
29
+ opacity: 1;
30
+ }
31
+ 50% {
32
+ opacity: 0.6;
33
+ }
34
+ }
35
+ .livePulse {
36
+ animation: livePulse 2s ease-in-out infinite;
37
+ }
38
+ @keyframes glowPulse {
39
+ 0%, 100% {
40
+ 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));
41
+ }
42
+ 50% {
43
+ 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));
44
+ }
45
+ }
46
+ @keyframes nodeEnter {
47
+ 0% {
48
+ opacity: 0;
49
+ transform: scale(0.8) translateY(10px);
50
+ }
51
+ 100% {
52
+ opacity: 1;
53
+ transform: scale(1) translateY(0);
54
+ }
55
+ }
56
+ @keyframes handlePulse {
57
+ 0%, 100% {
58
+ transform: scale(1);
59
+ box-shadow: 0 0 0 0 var(--handle-color, color-mix(in srgb, var(--color-primary) 40%, transparent));
60
+ }
61
+ 50% {
62
+ transform: scale(1.2);
63
+ box-shadow: 0 0 0 4px var(--handle-color, color-mix(in srgb, var(--color-primary) 0%, transparent));
64
+ }
65
+ }
66
+ @keyframes gridMove {
67
+ 0% {
68
+ background-position: 0 0;
69
+ }
70
+ 100% {
71
+ background-position: 40px 40px;
72
+ }
73
+ }
74
+ @keyframes labelFadeIn {
75
+ 0% {
76
+ opacity: 0;
77
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(0.8);
78
+ }
79
+ 100% {
80
+ opacity: 1;
81
+ transform: translate(-50%, -50%) translate(var(--label-x), var(--label-y)) scale(1);
82
+ }
83
+ }
84
+ @keyframes scanLine {
85
+ 0% {
86
+ transform: translateY(-100%);
87
+ opacity: 0;
88
+ }
89
+ 50% {
90
+ opacity: 0.5;
91
+ }
92
+ 100% {
93
+ transform: translateY(100%);
94
+ opacity: 0;
95
+ }
96
+ }
97
+ .graphContainer :global(.react-flow__node.selected),
98
+ .graphContainer :global(.react-flow__node:focus),
99
+ .graphContainer :global(.react-flow__node:focus-visible) {
100
+ outline: none !important;
101
+ }
102
+ .graphContainer :global(.react-flow__node.selected > *) {
103
+ box-shadow: none;
104
+ }
105
+ .graphContainer {
106
+ position: relative;
107
+ background-image:
108
+ linear-gradient(color-mix(in srgb, var(--color-primary) 5%, transparent) 1px, transparent 1px),
109
+ linear-gradient(
110
+ 90deg,
111
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 1px,
112
+ transparent 1px),
113
+ radial-gradient(
114
+ ellipse at 50% 50%,
115
+ color-mix(in srgb, var(--color-primary) 5%, transparent) 0%,
116
+ transparent 70%);
117
+ background-color: var(--color-background);
118
+ background-size:
119
+ 40px 40px,
120
+ 40px 40px,
121
+ 100% 100%;
122
+ animation: gridMove 20s linear infinite;
123
+ }
124
+ [data-mantine-color-scheme=dark] .graphContainer {
125
+ background-image:
126
+ linear-gradient(color-mix(in srgb, var(--color-primary) 9%, transparent) 1px, transparent 1px),
127
+ linear-gradient(
128
+ 90deg,
129
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 1px,
130
+ transparent 1px),
131
+ radial-gradient(
132
+ ellipse at 50% 50%,
133
+ color-mix(in srgb, var(--color-primary) 9%, transparent) 0%,
134
+ transparent 70%);
135
+ background-color: var(--color-background);
136
+ background-size:
137
+ 40px 40px,
138
+ 40px 40px,
139
+ 100% 100%;
140
+ }
141
+ .node {
142
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
143
+ position: relative;
144
+ }
145
+ .node :global(.react-flow__node.selected),
146
+ .node :global(.react-flow__node:focus),
147
+ .node :global(.react-flow__node:focus-visible) {
148
+ outline: none !important;
149
+ box-shadow: none !important;
150
+ }
151
+ .node:nth-child(1) {
152
+ animation-delay: 0.05s;
153
+ }
154
+ .node:nth-child(2) {
155
+ animation-delay: 0.1s;
156
+ }
157
+ .node:nth-child(3) {
158
+ animation-delay: 0.15s;
159
+ }
160
+ .node:nth-child(4) {
161
+ animation-delay: 0.2s;
162
+ }
163
+ .node:nth-child(5) {
164
+ animation-delay: 0.25s;
165
+ }
166
+ .node:nth-child(6) {
167
+ animation-delay: 0.3s;
168
+ }
169
+ .node:nth-child(7) {
170
+ animation-delay: 0.35s;
171
+ }
172
+ .node:nth-child(8) {
173
+ animation-delay: 0.4s;
174
+ }
175
+ .node:nth-child(9) {
176
+ animation-delay: 0.45s;
177
+ }
178
+ .node:nth-child(10) {
179
+ animation-delay: 0.5s;
180
+ }
181
+ .node:nth-child(11) {
182
+ animation-delay: 0.55s;
183
+ }
184
+ .node:nth-child(12) {
185
+ animation-delay: 0.6s;
186
+ }
187
+ .nodeCard {
188
+ position: relative;
189
+ border-radius: var(--mantine-radius-md);
190
+ overflow: hidden;
191
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
192
+ }
193
+ .nodeCard::before {
194
+ content: "";
195
+ position: absolute;
196
+ inset: 0;
197
+ background:
198
+ linear-gradient(
199
+ 135deg,
200
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 10%, transparent)) 0%,
201
+ transparent 50%,
202
+ var(--node-color-light, color-mix(in srgb, var(--color-primary) 5%, transparent)) 100%);
203
+ pointer-events: none;
204
+ opacity: 0;
205
+ transition: opacity 0.3s ease;
206
+ }
207
+ .nodeCard::after {
208
+ content: "";
209
+ position: absolute;
210
+ left: 0;
211
+ right: 0;
212
+ height: 30%;
213
+ background:
214
+ linear-gradient(
215
+ 180deg,
216
+ transparent 0%,
217
+ var(--node-color-glow, color-mix(in srgb, var(--color-primary) 10%, transparent)) 50%,
218
+ transparent 100%);
219
+ pointer-events: none;
220
+ opacity: 0;
221
+ }
222
+ .nodeCard:hover::before,
223
+ .nodeCardSelected::before {
224
+ opacity: 1;
225
+ }
226
+ .nodeCard:hover::after,
227
+ .nodeCardSelected::after {
228
+ animation: scanLine 3s ease-in-out infinite;
229
+ }
230
+ .nodeCard:hover {
231
+ transform: translateY(-2px) scale(1.02);
232
+ }
233
+ .nodeCardSelected {
234
+ transform: translateY(-2px) scale(1.02);
235
+ animation: glowPulse 2s ease-in-out infinite;
236
+ }
237
+ .nodeAgent {
238
+ --glow-color: rgba(139, 92, 246, 0.4);
239
+ --node-color-light: rgba(139, 92, 246, 0.1);
240
+ --node-color-glow: rgba(139, 92, 246, 0.15);
241
+ --handle-color: rgba(139, 92, 246, 0.5);
242
+ --gradient-start: rgba(139, 92, 246, 0.15);
243
+ --gradient-end: rgba(139, 92, 246, 0.05);
244
+ }
245
+ .nodeWorkflow {
246
+ --glow-color: rgba(59, 130, 246, 0.4);
247
+ --node-color-light: rgba(59, 130, 246, 0.1);
248
+ --node-color-glow: rgba(59, 130, 246, 0.15);
249
+ --handle-color: rgba(59, 130, 246, 0.5);
250
+ --gradient-start: rgba(59, 130, 246, 0.15);
251
+ --gradient-end: rgba(59, 130, 246, 0.05);
252
+ }
253
+ .nodeTrigger {
254
+ --glow-color: rgba(249, 115, 22, 0.4);
255
+ --node-color-light: rgba(249, 115, 22, 0.1);
256
+ --node-color-glow: rgba(249, 115, 22, 0.15);
257
+ --handle-color: rgba(249, 115, 22, 0.5);
258
+ --gradient-start: rgba(249, 115, 22, 0.15);
259
+ --gradient-end: rgba(249, 115, 22, 0.05);
260
+ }
261
+ .nodeIntegration {
262
+ --glow-color: rgba(20, 184, 166, 0.4);
263
+ --node-color-light: rgba(20, 184, 166, 0.1);
264
+ --node-color-glow: rgba(20, 184, 166, 0.15);
265
+ --handle-color: rgba(20, 184, 166, 0.5);
266
+ --gradient-start: rgba(20, 184, 166, 0.15);
267
+ --gradient-end: rgba(20, 184, 166, 0.05);
268
+ }
269
+ .nodeExternal {
270
+ --glow-color: rgba(107, 114, 128, 0.4);
271
+ --node-color-light: rgba(107, 114, 128, 0.1);
272
+ --node-color-glow: rgba(107, 114, 128, 0.15);
273
+ --handle-color: rgba(107, 114, 128, 0.5);
274
+ --gradient-start: rgba(107, 114, 128, 0.15);
275
+ --gradient-end: rgba(107, 114, 128, 0.05);
276
+ }
277
+ .nodeHuman {
278
+ --glow-color: rgba(245, 158, 11, 0.4);
279
+ --node-color-light: rgba(245, 158, 11, 0.1);
280
+ --node-color-glow: rgba(245, 158, 11, 0.15);
281
+ --handle-color: rgba(245, 158, 11, 0.5);
282
+ --gradient-start: rgba(245, 158, 11, 0.15);
283
+ --gradient-end: rgba(245, 158, 11, 0.05);
284
+ }
285
+ .nodePrimary {
286
+ --glow-color: rgba(37, 99, 235, 0.4);
287
+ --node-color-light: rgba(37, 99, 235, 0.1);
288
+ --node-color-glow: rgba(37, 99, 235, 0.15);
289
+ --handle-color: rgba(37, 99, 235, 0.5);
290
+ --gradient-start: rgba(37, 99, 235, 0.15);
291
+ --gradient-end: rgba(37, 99, 235, 0.05);
292
+ }
293
+ .handle {
294
+ transition: all 0.2s ease;
295
+ }
296
+ .handle:hover {
297
+ animation: handlePulse 1s ease-in-out infinite;
298
+ }
299
+ .nodeIcon {
300
+ transition: all 0.3s ease;
301
+ }
302
+ .badge {
303
+ transition: all 0.2s ease;
304
+ backdrop-filter: blur(4px);
305
+ }
306
+ .nodeCard:hover .badge {
307
+ transform: scale(1.05);
308
+ }
309
+ .badgeProd {
310
+ box-shadow: 0 0 8px rgba(34, 197, 94, 0.3);
311
+ }
312
+ .edge {
313
+ transition: all 0.3s ease;
314
+ }
315
+ .edgeAnimated {
316
+ stroke-dasharray: 8 4;
317
+ animation: edgeFlow 1s linear infinite;
318
+ }
319
+ .edgeGlow {
320
+ filter: drop-shadow(0 0 3px var(--edge-color, color-mix(in srgb, var(--color-primary) 50%, transparent)));
321
+ }
322
+ .edgeHighlighted {
323
+ stroke-width: 3px;
324
+ }
325
+ .edgeLabel {
326
+ backdrop-filter: blur(8px);
327
+ border: 1px solid rgba(255, 255, 255, 0.1);
328
+ 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));
329
+ transition: box-shadow 0.2s ease;
330
+ }
331
+ .edgeLabel:hover {
332
+ 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));
333
+ }
334
+ .legend {
335
+ backdrop-filter: var(--glass-blur);
336
+ background: var(--glass-background);
337
+ border: 1px solid color-mix(in srgb, var(--color-primary) 20%, transparent);
338
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1), 0 0 40px color-mix(in srgb, var(--color-primary) 10%, transparent);
339
+ }
340
+ [data-mantine-color-scheme=dark] .legend {
341
+ border-color: color-mix(in srgb, var(--color-primary) 30%, transparent);
342
+ }
343
+ .legendDot {
344
+ transition: all 0.2s ease;
345
+ box-shadow: 0 0 8px currentColor;
346
+ }
347
+ .legendDot:hover {
348
+ transform: scale(1.3);
349
+ box-shadow: 0 0 12px currentColor;
350
+ }
351
+ .nodeHighlighted .nodeCard {
352
+ transform: translateY(-2px) scale(1.02);
353
+ }
354
+ .nodeHighlighted .nodeCard::before {
355
+ opacity: 1;
356
+ }
357
+ .nodeHighlighted .nodeCard::after {
358
+ animation: scanLine 3s ease-in-out infinite;
359
+ }
360
+ .nodeDimmed {
361
+ opacity: 0.3;
362
+ filter: grayscale(0.5);
363
+ transition: all 0.3s ease;
364
+ }
365
+ .edgeHighlighted {
366
+ stroke-width: 4px !important;
367
+ }
368
+ .edgeDimmed {
369
+ opacity: 0.15;
370
+ transition: all 0.3s ease;
371
+ }
372
+ .edgeLabelDimmed {
373
+ opacity: 0.15;
374
+ transition: opacity 0.3s ease;
375
+ }
376
+ @media (prefers-reduced-motion: reduce) {
377
+ .node,
378
+ .nodeCard::after,
379
+ .edgeAnimated,
380
+ .nodeIcon,
381
+ .handle:hover,
382
+ .graphContainer {
383
+ animation: none;
384
+ }
385
+ .nodeCard:hover {
386
+ transform: none;
387
+ }
388
+ }