@elevasis/ui 1.11.2 → 1.12.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.
@@ -1,8 +1,9 @@
1
1
  export { ActivityTrendChart, CombinedTrendChart, CostTrendChart, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, HeroStatsRow, getSeriesColor, useCyberColors } from '../chunk-CC6BRHQK.js';
2
- import '../chunk-YGYF6G7W.js';
2
+ import '../chunk-YHTK43DV.js';
3
3
  import '../chunk-ARZM3OTI.js';
4
4
  import '../chunk-LHQTTUL2.js';
5
5
  import '../chunk-ELJIFLCB.js';
6
+ import '../chunk-SZHARWKU.js';
6
7
  import '../chunk-FCFLBMVI.js';
7
8
  import '../chunk-6TMW6VQ2.js';
8
9
  import '../chunk-FWZJH3TL.js';
@@ -1,7 +1,9 @@
1
- import { NavigationButton, ElevasisLoader } from './chunk-YGYF6G7W.js';
1
+ import { NavigationButton } from './chunk-YHTK43DV.js';
2
+ import { useAppearance } from './chunk-HRG3KPL6.js';
3
+ import { ElevasisLoader } from './chunk-SZHARWKU.js';
2
4
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
3
- import { Collapse, HoverCard, Stack, Group, Text, UnstyledButton, Tooltip, ScrollArea, Menu, Avatar, useComputedColorScheme, Container, Loader, Title, Button, Box, Center, useMantineColorScheme, Switch, Code } from '@mantine/core';
4
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
+ import { Collapse, HoverCard, Stack, Group, Text, UnstyledButton, Tooltip, ScrollArea, Menu, Avatar, Container, Loader, Title, Button, Box, Center, useMantineColorScheme, Switch, Code } from '@mantine/core';
5
7
  import { IconLayoutSidebarLeftExpand, IconLayoutSidebarLeftCollapse, IconUser, IconLogout, IconAlertCircle, IconChevronDown, IconChevronRight, IconMoonStars, IconSun } from '@tabler/icons-react';
6
8
  import { createContext, memo, useEffect, createElement, useContext, useState } from 'react';
7
9
 
@@ -11,274 +13,6 @@ var sidebarCollapsedWidth = 72;
11
13
  var sidebarTransitionDuration = 200;
12
14
  var sidebarHoverDelay = 100;
13
15
  var topbarHeight = 54;
14
- var KEYFRAMES = `
15
- @keyframes elevasis-grain-shift {
16
- 0%, 100% { transform: translate(0, 0); }
17
- 10% { transform: translate(-2%, -3%); }
18
- 20% { transform: translate(3%, 1%); }
19
- 30% { transform: translate(-1%, 4%); }
20
- 40% { transform: translate(4%, -2%); }
21
- 50% { transform: translate(-3%, 2%); }
22
- 60% { transform: translate(2%, -4%); }
23
- 70% { transform: translate(-4%, 1%); }
24
- 80% { transform: translate(1%, 3%); }
25
- 90% { transform: translate(3%, -1%); }
26
- }
27
- `;
28
- function FilmGrain({ darkOpacity = 0.02, lightOpacity = 0.06, className }) {
29
- const colorScheme = useComputedColorScheme();
30
- const opacity = colorScheme === "dark" ? darkOpacity : lightOpacity;
31
- return /* @__PURE__ */ jsxs(
32
- "div",
33
- {
34
- className,
35
- style: {
36
- position: "absolute",
37
- inset: 0,
38
- pointerEvents: "none",
39
- overflow: "clip",
40
- opacity,
41
- mixBlendMode: colorScheme === "dark" ? "screen" : "multiply"
42
- },
43
- children: [
44
- /* @__PURE__ */ jsx("style", { children: KEYFRAMES }),
45
- /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, children: /* @__PURE__ */ jsx("filter", { id: "elevasis-grain", children: /* @__PURE__ */ jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.65", numOctaves: "3", stitchTiles: "stitch" }) }) }),
46
- /* @__PURE__ */ jsx(
47
- "div",
48
- {
49
- style: {
50
- position: "absolute",
51
- inset: "-50%",
52
- width: "200%",
53
- height: "200%",
54
- filter: "url(#elevasis-grain)",
55
- animation: "elevasis-grain-shift 0.8s steps(4) infinite",
56
- willChange: "transform"
57
- }
58
- }
59
- )
60
- ]
61
- }
62
- );
63
- }
64
- var KEYFRAMES2 = `
65
- @keyframes elevasis-orb-float-0 {
66
- 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.5; }
67
- 25% { transform: translate(12vw, -8vh) scale(1.2); opacity: 0.8; }
68
- 50% { transform: translate(-5vw, -15vh) scale(0.9); opacity: 0.4; }
69
- 75% { transform: translate(8vw, 5vh) scale(1.1); opacity: 0.7; }
70
- }
71
- @keyframes elevasis-orb-float-1 {
72
- 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; }
73
- 30% { transform: translate(-10vw, 6vh) scale(0.85); opacity: 0.3; }
74
- 60% { transform: translate(7vw, 12vh) scale(1.15); opacity: 0.7; }
75
- }
76
- @keyframes elevasis-orb-float-2 {
77
- 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.4; }
78
- 20% { transform: translate(6vw, 10vh) scale(1.3); opacity: 0.7; }
79
- 50% { transform: translate(-8vw, -4vh) scale(0.8); opacity: 0.3; }
80
- 80% { transform: translate(3vw, -12vh) scale(1.1); opacity: 0.6; }
81
- }
82
- `;
83
- var ORB_CONFIGS = [
84
- { top: "10%", left: "15%", size: "25vw", anim: "elevasis-orb-float-0", dur: "22s" },
85
- { top: "60%", left: "70%", size: "30vw", anim: "elevasis-orb-float-1", dur: "28s" },
86
- { top: "30%", left: "50%", size: "20vw", anim: "elevasis-orb-float-2", dur: "32s" },
87
- { top: "75%", left: "20%", size: "22vw", anim: "elevasis-orb-float-0", dur: "26s" },
88
- { top: "5%", left: "75%", size: "18vw", anim: "elevasis-orb-float-1", dur: "30s" },
89
- { top: "45%", left: "5%", size: "24vw", anim: "elevasis-orb-float-2", dur: "24s" }
90
- ];
91
- function FloatingOrbs({
92
- color = "var(--color-primary)",
93
- count = 6,
94
- className
95
- }) {
96
- const orbs = ORB_CONFIGS.slice(0, count);
97
- return /* @__PURE__ */ jsxs(
98
- "div",
99
- {
100
- className,
101
- style: {
102
- position: "absolute",
103
- inset: 0,
104
- pointerEvents: "none",
105
- overflow: "clip"
106
- },
107
- children: [
108
- /* @__PURE__ */ jsx("style", { children: KEYFRAMES2 }),
109
- orbs.map((orb, i) => /* @__PURE__ */ jsx(
110
- "div",
111
- {
112
- style: {
113
- position: "absolute",
114
- top: orb.top,
115
- left: orb.left,
116
- width: orb.size,
117
- height: orb.size,
118
- borderRadius: "50%",
119
- background: `radial-gradient(circle at center, color-mix(in srgb, ${color} 3%, transparent) 0%, transparent 70%)`,
120
- filter: "blur(40px)",
121
- animation: `${orb.anim} ${orb.dur} ease-in-out infinite`,
122
- willChange: "transform, opacity"
123
- }
124
- },
125
- i
126
- ))
127
- ]
128
- }
129
- );
130
- }
131
- function PerspectiveGrid({
132
- glowColor = "rgba(123, 123, 123, 0.1)",
133
- className
134
- }) {
135
- const colorScheme = useComputedColorScheme();
136
- const lineColor = colorScheme === "dark" ? "rgba(90, 90, 90, 0.1)" : "rgba(120, 120, 120, 0.1)";
137
- return /* @__PURE__ */ jsxs(
138
- "div",
139
- {
140
- className,
141
- style: {
142
- position: "absolute",
143
- inset: 0,
144
- pointerEvents: "none",
145
- overflow: "hidden",
146
- perspective: "500px"
147
- },
148
- children: [
149
- /* @__PURE__ */ jsx(
150
- "div",
151
- {
152
- style: {
153
- position: "absolute",
154
- bottom: 0,
155
- left: "50%",
156
- transform: "translateX(-50%)",
157
- width: "100%",
158
- height: "60%",
159
- background: `radial-gradient(ellipse 90% 75% at 50% 112%, ${glowColor} -15%, transparent 45%)`,
160
- pointerEvents: "none"
161
- }
162
- }
163
- ),
164
- /* @__PURE__ */ jsx(
165
- "div",
166
- {
167
- style: {
168
- position: "absolute",
169
- left: "-50%",
170
- right: "-50%",
171
- bottom: 0,
172
- height: "70%",
173
- backgroundImage: `
174
- linear-gradient(${lineColor} 2px, transparent 1px),
175
- linear-gradient(90deg, ${lineColor} 2px, transparent 1px)
176
- `,
177
- backgroundSize: "120px 100px",
178
- transform: "rotateX(60deg)",
179
- transformOrigin: "bottom center",
180
- maskImage: "linear-gradient(to bottom, transparent 0%, black 100%, black 100%, transparent 100%)",
181
- WebkitMaskImage: "linear-gradient(to bottom, transparent 0%, black 100%, black 100%, transparent 100%)"
182
- }
183
- }
184
- )
185
- ]
186
- }
187
- );
188
- }
189
- var KEYFRAMES3 = `
190
- @keyframes elevasis-glow-drift {
191
- 0% { transform: translateY(0) scale(1); opacity: 1; }
192
- 20% { transform: translateY(-8%) scale(1.12); opacity: 0.7; }
193
- 40% { transform: translateY(3%) scale(0.92); opacity: 1; }
194
- 60% { transform: translateY(5%) scale(1.08); opacity: 0.8; }
195
- 80% { transform: translateY(-4%) scale(0.95); opacity: 0.9; }
196
- 100% { transform: translateY(0) scale(1); opacity: 1; }
197
- }
198
- @keyframes elevasis-glow-drift-alt {
199
- 0% { transform: translateY(0) scale(1); opacity: 0.8; }
200
- 25% { transform: translateY(6%) scale(0.9); opacity: 1; }
201
- 50% { transform: translateY(-7%) scale(1.15); opacity: 0.7; }
202
- 75% { transform: translateY(-5%) scale(1.05); opacity: 0.9; }
203
- 100% { transform: translateY(0) scale(1); opacity: 0.8; }
204
- }
205
- @keyframes elevasis-glow-drift-slow {
206
- 0% { transform: translateY(0) scale(1); opacity: 0.9; }
207
- 33% { transform: translateY(-4%) scale(1.1); opacity: 0.6; }
208
- 66% { transform: translateY(6%) scale(0.88); opacity: 1; }
209
- 100% { transform: translateY(0) scale(1); opacity: 0.9; }
210
- }
211
- `;
212
- function RadiantGlow({
213
- color = "var(--color-primary)",
214
- opacity = 1,
215
- className
216
- }) {
217
- return /* @__PURE__ */ jsxs(
218
- "div",
219
- {
220
- className,
221
- style: {
222
- position: "absolute",
223
- inset: 0,
224
- pointerEvents: "none",
225
- overflow: "clip",
226
- opacity
227
- },
228
- children: [
229
- /* @__PURE__ */ jsx("style", { children: KEYFRAMES3 }),
230
- /* @__PURE__ */ jsx(
231
- "div",
232
- {
233
- style: {
234
- position: "absolute",
235
- top: "-80%",
236
- left: "50%",
237
- transform: "translateX(-50%)",
238
- width: "200%",
239
- height: "200%",
240
- background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.8%, transparent) 0%, transparent 70%)`,
241
- animation: "elevasis-glow-drift 20s ease-in-out infinite",
242
- willChange: "transform"
243
- }
244
- }
245
- ),
246
- /* @__PURE__ */ jsx(
247
- "div",
248
- {
249
- style: {
250
- position: "absolute",
251
- bottom: "-70%",
252
- left: "50%",
253
- transform: "translateX(-50%)",
254
- width: "180%",
255
- height: "180%",
256
- background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.6%, transparent) 0%, transparent 65%)`,
257
- animation: "elevasis-glow-drift-alt 24s ease-in-out infinite",
258
- willChange: "transform"
259
- }
260
- }
261
- ),
262
- /* @__PURE__ */ jsx(
263
- "div",
264
- {
265
- style: {
266
- position: "absolute",
267
- top: "-20%",
268
- left: "50%",
269
- transform: "translateX(-50%)",
270
- width: "120%",
271
- height: "120%",
272
- background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.6%, transparent) 0%, transparent 60%)`,
273
- animation: "elevasis-glow-drift-slow 28s ease-in-out infinite",
274
- willChange: "transform"
275
- }
276
- }
277
- )
278
- ]
279
- }
280
- );
281
- }
282
16
  function Vignette({ strength = 0.35, className }) {
283
17
  return /* @__PURE__ */ jsx(
284
18
  "div",
@@ -294,6 +28,7 @@ function Vignette({ strength = 0.35, className }) {
294
28
  );
295
29
  }
296
30
  var AppShellContainer = ({ children }) => {
31
+ const { background } = useAppearance();
297
32
  return /* @__PURE__ */ jsxs(
298
33
  "div",
299
34
  {
@@ -304,10 +39,7 @@ var AppShellContainer = ({ children }) => {
304
39
  position: "relative"
305
40
  },
306
41
  children: [
307
- /* @__PURE__ */ jsx(PerspectiveGrid, {}),
308
- /* @__PURE__ */ jsx(RadiantGlow, {}),
309
- /* @__PURE__ */ jsx(FloatingOrbs, {}),
310
- /* @__PURE__ */ jsx(FilmGrain, {}),
42
+ background,
311
43
  children
312
44
  ]
313
45
  }
@@ -1344,7 +1076,8 @@ var SubshellSidebarSection = ({
1344
1076
  // src/components/layout/sub-shell/constants.ts
1345
1077
  var subsidebarWidth = 200;
1346
1078
  function SubshellLoader() {
1347
- return /* @__PURE__ */ jsx(Center, { mih: "calc(100vh - 70px)", children: /* @__PURE__ */ jsx(Loader, { size: "lg", loaders: { elevasis: ElevasisLoader }, type: "elevasis" }) });
1079
+ const { loader } = useAppearance();
1080
+ return /* @__PURE__ */ jsx(Center, { mih: "calc(100vh - 70px)", children: loader });
1348
1081
  }
1349
1082
  var TopbarContainer = ({ children }) => {
1350
1083
  const { isCollapsed } = useSidebar();
@@ -1435,4 +1168,4 @@ var Topbar = ({ version, leftContent, children }) => {
1435
1168
  ] });
1436
1169
  };
1437
1170
 
1438
- export { AppShellCenteredContainer, AppShellContainer, AppShellContentContainer, AppShellError, AppShellLoader, AppShellRightSideContainer, AppShellRightSideOuterContainer, AppTopbarAdjusterWrapper, CollapsibleSidebarGroup, FilmGrain, FloatingOrbs, LinksGroup, PageContainer, PerspectiveGrid, RadiantGlow, Sidebar, SidebarListItem, SidebarProvider, SubshellContainer, SubshellContentContainer, SubshellLoader, SubshellRightSideContainer, SubshellSidebar, SubshellSidebarSection, Topbar, TopbarContainer, Vignette, sidebarCollapsedWidth, sidebarHoverDelay, sidebarTransitionDuration, sidebarWidth, subsidebarWidth, topbarHeight, useSidebar, useSidebarCollapse };
1171
+ export { AppShellCenteredContainer, AppShellContainer, AppShellContentContainer, AppShellError, AppShellLoader, AppShellRightSideContainer, AppShellRightSideOuterContainer, AppTopbarAdjusterWrapper, CollapsibleSidebarGroup, LinksGroup, PageContainer, Sidebar, SidebarListItem, SidebarProvider, SubshellContainer, SubshellContentContainer, SubshellLoader, SubshellRightSideContainer, SubshellSidebar, SubshellSidebarSection, Topbar, TopbarContainer, Vignette, sidebarCollapsedWidth, sidebarHoverDelay, sidebarTransitionDuration, sidebarWidth, subsidebarWidth, topbarHeight, useSidebar, useSidebarCollapse };
@@ -1,7 +1,7 @@
1
1
  import { getTimeRangeDates, observabilityKeys } from './chunk-ARZM3OTI.js';
2
2
  import { useSupabase } from './chunk-JGJSZ3UE.js';
3
3
  import { GRAPH_CONSTANTS } from './chunk-F6RBK7NJ.js';
4
- import { useNotificationAdapter } from './chunk-564T2YKH.js';
4
+ import { useNotificationAdapter } from './chunk-I427OSNH.js';
5
5
  import { HTTP_HEADERS } from './chunk-RULQSZYX.js';
6
6
  import { STALE_TIME_MONITORING, REFETCH_INTERVAL_DASHBOARD, REFETCH_INTERVAL_RUNNING, WS_MAX_RETRIES_BEFORE_ERROR, WS_RECONNECT_BASE_DELAY, WS_RECONNECT_MAX_DELAY, STALE_TIME_DEFAULT, STALE_TIME_ADMIN } from './chunk-FCFLBMVI.js';
7
7
  import { useStableAccessToken } from './chunk-FWZJH3TL.js';
@@ -10,7 +10,7 @@ import { useOrganization } from './chunk-DD3CCMCZ.js';
10
10
  import { useAuthContext } from './chunk-7PLEQFHO.js';
11
11
  import { useQuery, useQueryClient, useMutation, useQueries } from '@tanstack/react-query';
12
12
  import { z } from 'zod';
13
- import { useCallback, useMemo, useState, useRef, useEffect, useId } from 'react';
13
+ import { useState, useCallback, useMemo, useRef, useEffect, useId } from 'react';
14
14
  import { useNavigate, useSearch } from '@tanstack/react-router';
15
15
  import { create } from 'zustand';
16
16
  import { persist } from 'zustand/middleware';
@@ -534,6 +534,28 @@ function useResourceDefinition(resourceId, enabled = true) {
534
534
  retryDelay: (attemptIndex) => Math.min(1e3 * 2 ** attemptIndex, 3e4)
535
535
  });
536
536
  }
537
+ function useArchivedLogs(executionId) {
538
+ const { apiRequest } = useElevasisServices();
539
+ const [logs, setLogs] = useState(null);
540
+ const [isLoading, setIsLoading] = useState(false);
541
+ const [error, setError] = useState(null);
542
+ const fetch = useCallback(async () => {
543
+ if (!executionId || isLoading) return;
544
+ setIsLoading(true);
545
+ setError(null);
546
+ try {
547
+ const response = await apiRequest(
548
+ `/observability/executions/${executionId}/archived-logs`
549
+ );
550
+ setLogs(response.logs);
551
+ } catch (err) {
552
+ setError(err instanceof Error ? err.message : "Failed to load archived logs");
553
+ } finally {
554
+ setIsLoading(false);
555
+ }
556
+ }, [executionId, apiRequest, isLoading]);
557
+ return { logs, isLoading, error, fetch };
558
+ }
537
559
  function useActivityTrend(params = {}) {
538
560
  const { apiRequest, isReady, organizationId } = useElevasisServices();
539
561
  return useQuery({
@@ -2547,4 +2569,4 @@ function useResourceExecutions({ resourceId, timeRange, enabled = true }) {
2547
2569
  });
2548
2570
  }
2549
2571
 
2550
- export { CredentialNameSchema, OperationsService, UuidSchema, createUseFeatureAccess, executionsKeys, isSessionCapable, operationsKeys, scheduleKeys, sessionsKeys, sortData, useActivities, useActivityTrend, useArchiveSession, useBatchDelete, useBatchedResourcesHealth, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useCommandQueue, useCommandQueueTotals, useCommandViewData, useCommandViewLayout, useCommandViewStats, useCommandViewStore, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateSchedule, useCreateSession, useDashboardMetrics, useDeleteExecution, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeploymentDocs, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useExecuteAsync, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionPanelState, useExecutions, useGetExecutionHistory, useGetSchedule, useGraphStats, useListSchedules, useMarkAllAsRead, useMarkAsRead, useNotificationCount, useNotifications, usePaginationState, usePatchTask, usePauseSchedule, useRecentExecutionsByResource, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResourceDefinition, useResourceErrors, useResourceExecutions, useResources, useResourcesHealth, useResumeSchedule, useRetryExecution, useSSEConnection, useScheduledTasks, useSession, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useSubmitAction, useSuccessNotification, useTableSelection, useTableSort, useTestNotification, useTopFailingResources, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateSchedule, useWarningNotification };
2572
+ export { CredentialNameSchema, OperationsService, UuidSchema, createUseFeatureAccess, executionsKeys, isSessionCapable, operationsKeys, scheduleKeys, sessionsKeys, sortData, useActivities, useActivityTrend, useArchiveSession, useArchivedLogs, useBatchDelete, useBatchedResourcesHealth, useBulkDeleteExecutions, useBusinessImpact, useCancelExecution, useCancelSchedule, useCheckpointTasks, useCommandQueue, useCommandQueueTotals, useCommandViewData, useCommandViewLayout, useCommandViewStats, useCommandViewStore, useCostBreakdown, useCostByModel, useCostSummary, useCostTrends, useCreateSchedule, useCreateSession, useDashboardMetrics, useDeleteExecution, useDeleteSchedule, useDeleteSession, useDeleteTask, useDeploymentDocs, useErrorAnalysis, useErrorDetail, useErrorDetails, useErrorDistribution, useErrorNotification, useExecuteAsync, useExecution, useExecutionHealth, useExecutionLogSSE, useExecutionLogs, useExecutionPanelState, useExecutions, useGetExecutionHistory, useGetSchedule, useGraphStats, useListSchedules, useMarkAllAsRead, useMarkAsRead, useNotificationCount, useNotifications, usePaginationState, usePatchTask, usePauseSchedule, useRecentExecutionsByResource, useResolveAllErrors, useResolveError, useResolveErrorsByExecution, useResourceDefinition, useResourceErrors, useResourceExecutions, useResources, useResourcesHealth, useResumeSchedule, useRetryExecution, useSSEConnection, useScheduledTasks, useSession, useSessionExecution, useSessionExecutions, useSessionMessages, useSessionWebSocket, useSessions, useSortedData, useSubmitAction, useSuccessNotification, useTableSelection, useTableSort, useTestNotification, useTopFailingResources, useUnresolveError, useUnresolvedErrors, useUpdateAnchor, useUpdateSchedule, useWarningNotification };
@@ -0,0 +1,295 @@
1
+ import { createContext, useContext } from 'react';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { useComputedColorScheme } from '@mantine/core';
4
+
5
+ // src/provider/AppearanceContext.tsx
6
+ var AppearanceContext = createContext(null);
7
+ function AppearanceProvider({ value, children }) {
8
+ return /* @__PURE__ */ jsx(AppearanceContext.Provider, { value, children });
9
+ }
10
+ function useAppearance() {
11
+ const ctx = useContext(AppearanceContext);
12
+ if (!ctx) {
13
+ throw new Error("useAppearance must be used within an AppearanceProvider (ElevasisCoreProvider)");
14
+ }
15
+ return ctx;
16
+ }
17
+ function PerspectiveGrid({
18
+ glowColor = "rgba(123, 123, 123, 0.1)",
19
+ className
20
+ }) {
21
+ const colorScheme = useComputedColorScheme();
22
+ const lineColor = colorScheme === "dark" ? "rgba(90, 90, 90, 0.1)" : "rgba(120, 120, 120, 0.1)";
23
+ return /* @__PURE__ */ jsxs(
24
+ "div",
25
+ {
26
+ className,
27
+ style: {
28
+ position: "absolute",
29
+ inset: 0,
30
+ pointerEvents: "none",
31
+ overflow: "hidden",
32
+ perspective: "500px"
33
+ },
34
+ children: [
35
+ /* @__PURE__ */ jsx(
36
+ "div",
37
+ {
38
+ style: {
39
+ position: "absolute",
40
+ bottom: 0,
41
+ left: "50%",
42
+ transform: "translateX(-50%)",
43
+ width: "100%",
44
+ height: "60%",
45
+ background: `radial-gradient(ellipse 90% 75% at 50% 112%, ${glowColor} -15%, transparent 45%)`,
46
+ pointerEvents: "none"
47
+ }
48
+ }
49
+ ),
50
+ /* @__PURE__ */ jsx(
51
+ "div",
52
+ {
53
+ style: {
54
+ position: "absolute",
55
+ left: "-50%",
56
+ right: "-50%",
57
+ bottom: 0,
58
+ height: "70%",
59
+ backgroundImage: `
60
+ linear-gradient(${lineColor} 2px, transparent 1px),
61
+ linear-gradient(90deg, ${lineColor} 2px, transparent 1px)
62
+ `,
63
+ backgroundSize: "120px 100px",
64
+ transform: "rotateX(60deg)",
65
+ transformOrigin: "bottom center",
66
+ maskImage: "linear-gradient(to bottom, transparent 0%, black 100%, black 100%, transparent 100%)",
67
+ WebkitMaskImage: "linear-gradient(to bottom, transparent 0%, black 100%, black 100%, transparent 100%)"
68
+ }
69
+ }
70
+ )
71
+ ]
72
+ }
73
+ );
74
+ }
75
+ var KEYFRAMES = `
76
+ @keyframes elevasis-glow-drift {
77
+ 0% { transform: translateY(0) scale(1); opacity: 1; }
78
+ 20% { transform: translateY(-8%) scale(1.12); opacity: 0.7; }
79
+ 40% { transform: translateY(3%) scale(0.92); opacity: 1; }
80
+ 60% { transform: translateY(5%) scale(1.08); opacity: 0.8; }
81
+ 80% { transform: translateY(-4%) scale(0.95); opacity: 0.9; }
82
+ 100% { transform: translateY(0) scale(1); opacity: 1; }
83
+ }
84
+ @keyframes elevasis-glow-drift-alt {
85
+ 0% { transform: translateY(0) scale(1); opacity: 0.8; }
86
+ 25% { transform: translateY(6%) scale(0.9); opacity: 1; }
87
+ 50% { transform: translateY(-7%) scale(1.15); opacity: 0.7; }
88
+ 75% { transform: translateY(-5%) scale(1.05); opacity: 0.9; }
89
+ 100% { transform: translateY(0) scale(1); opacity: 0.8; }
90
+ }
91
+ @keyframes elevasis-glow-drift-slow {
92
+ 0% { transform: translateY(0) scale(1); opacity: 0.9; }
93
+ 33% { transform: translateY(-4%) scale(1.1); opacity: 0.6; }
94
+ 66% { transform: translateY(6%) scale(0.88); opacity: 1; }
95
+ 100% { transform: translateY(0) scale(1); opacity: 0.9; }
96
+ }
97
+ `;
98
+ function RadiantGlow({
99
+ color = "var(--color-primary)",
100
+ opacity = 1,
101
+ className
102
+ }) {
103
+ return /* @__PURE__ */ jsxs(
104
+ "div",
105
+ {
106
+ className,
107
+ style: {
108
+ position: "absolute",
109
+ inset: 0,
110
+ pointerEvents: "none",
111
+ overflow: "clip",
112
+ opacity
113
+ },
114
+ children: [
115
+ /* @__PURE__ */ jsx("style", { children: KEYFRAMES }),
116
+ /* @__PURE__ */ jsx(
117
+ "div",
118
+ {
119
+ style: {
120
+ position: "absolute",
121
+ top: "-80%",
122
+ left: "50%",
123
+ transform: "translateX(-50%)",
124
+ width: "200%",
125
+ height: "200%",
126
+ background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.8%, transparent) 0%, transparent 70%)`,
127
+ animation: "elevasis-glow-drift 20s ease-in-out infinite",
128
+ willChange: "transform"
129
+ }
130
+ }
131
+ ),
132
+ /* @__PURE__ */ jsx(
133
+ "div",
134
+ {
135
+ style: {
136
+ position: "absolute",
137
+ bottom: "-70%",
138
+ left: "50%",
139
+ transform: "translateX(-50%)",
140
+ width: "180%",
141
+ height: "180%",
142
+ background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.6%, transparent) 0%, transparent 65%)`,
143
+ animation: "elevasis-glow-drift-alt 24s ease-in-out infinite",
144
+ willChange: "transform"
145
+ }
146
+ }
147
+ ),
148
+ /* @__PURE__ */ jsx(
149
+ "div",
150
+ {
151
+ style: {
152
+ position: "absolute",
153
+ top: "-20%",
154
+ left: "50%",
155
+ transform: "translateX(-50%)",
156
+ width: "120%",
157
+ height: "120%",
158
+ background: `radial-gradient(ellipse at center, color-mix(in srgb, ${color} 0.6%, transparent) 0%, transparent 60%)`,
159
+ animation: "elevasis-glow-drift-slow 28s ease-in-out infinite",
160
+ willChange: "transform"
161
+ }
162
+ }
163
+ )
164
+ ]
165
+ }
166
+ );
167
+ }
168
+ var KEYFRAMES2 = `
169
+ @keyframes elevasis-orb-float-0 {
170
+ 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.5; }
171
+ 25% { transform: translate(12vw, -8vh) scale(1.2); opacity: 0.8; }
172
+ 50% { transform: translate(-5vw, -15vh) scale(0.9); opacity: 0.4; }
173
+ 75% { transform: translate(8vw, 5vh) scale(1.1); opacity: 0.7; }
174
+ }
175
+ @keyframes elevasis-orb-float-1 {
176
+ 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; }
177
+ 30% { transform: translate(-10vw, 6vh) scale(0.85); opacity: 0.3; }
178
+ 60% { transform: translate(7vw, 12vh) scale(1.15); opacity: 0.7; }
179
+ }
180
+ @keyframes elevasis-orb-float-2 {
181
+ 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.4; }
182
+ 20% { transform: translate(6vw, 10vh) scale(1.3); opacity: 0.7; }
183
+ 50% { transform: translate(-8vw, -4vh) scale(0.8); opacity: 0.3; }
184
+ 80% { transform: translate(3vw, -12vh) scale(1.1); opacity: 0.6; }
185
+ }
186
+ `;
187
+ var ORB_CONFIGS = [
188
+ { top: "10%", left: "15%", size: "25vw", anim: "elevasis-orb-float-0", dur: "22s" },
189
+ { top: "60%", left: "70%", size: "30vw", anim: "elevasis-orb-float-1", dur: "28s" },
190
+ { top: "30%", left: "50%", size: "20vw", anim: "elevasis-orb-float-2", dur: "32s" },
191
+ { top: "75%", left: "20%", size: "22vw", anim: "elevasis-orb-float-0", dur: "26s" },
192
+ { top: "5%", left: "75%", size: "18vw", anim: "elevasis-orb-float-1", dur: "30s" },
193
+ { top: "45%", left: "5%", size: "24vw", anim: "elevasis-orb-float-2", dur: "24s" }
194
+ ];
195
+ function FloatingOrbs({
196
+ color = "var(--color-primary)",
197
+ count = 6,
198
+ className
199
+ }) {
200
+ const orbs = ORB_CONFIGS.slice(0, count);
201
+ return /* @__PURE__ */ jsxs(
202
+ "div",
203
+ {
204
+ className,
205
+ style: {
206
+ position: "absolute",
207
+ inset: 0,
208
+ pointerEvents: "none",
209
+ overflow: "clip"
210
+ },
211
+ children: [
212
+ /* @__PURE__ */ jsx("style", { children: KEYFRAMES2 }),
213
+ orbs.map((orb, i) => /* @__PURE__ */ jsx(
214
+ "div",
215
+ {
216
+ style: {
217
+ position: "absolute",
218
+ top: orb.top,
219
+ left: orb.left,
220
+ width: orb.size,
221
+ height: orb.size,
222
+ borderRadius: "50%",
223
+ background: `radial-gradient(circle at center, color-mix(in srgb, ${color} 3%, transparent) 0%, transparent 70%)`,
224
+ filter: "blur(40px)",
225
+ animation: `${orb.anim} ${orb.dur} ease-in-out infinite`,
226
+ willChange: "transform, opacity"
227
+ }
228
+ },
229
+ i
230
+ ))
231
+ ]
232
+ }
233
+ );
234
+ }
235
+ var KEYFRAMES3 = `
236
+ @keyframes elevasis-grain-shift {
237
+ 0%, 100% { transform: translate(0, 0); }
238
+ 10% { transform: translate(-2%, -3%); }
239
+ 20% { transform: translate(3%, 1%); }
240
+ 30% { transform: translate(-1%, 4%); }
241
+ 40% { transform: translate(4%, -2%); }
242
+ 50% { transform: translate(-3%, 2%); }
243
+ 60% { transform: translate(2%, -4%); }
244
+ 70% { transform: translate(-4%, 1%); }
245
+ 80% { transform: translate(1%, 3%); }
246
+ 90% { transform: translate(3%, -1%); }
247
+ }
248
+ `;
249
+ function FilmGrain({ darkOpacity = 0.02, lightOpacity = 0.06, className }) {
250
+ const colorScheme = useComputedColorScheme();
251
+ const opacity = colorScheme === "dark" ? darkOpacity : lightOpacity;
252
+ return /* @__PURE__ */ jsxs(
253
+ "div",
254
+ {
255
+ className,
256
+ style: {
257
+ position: "absolute",
258
+ inset: 0,
259
+ pointerEvents: "none",
260
+ overflow: "clip",
261
+ opacity,
262
+ mixBlendMode: colorScheme === "dark" ? "screen" : "multiply"
263
+ },
264
+ children: [
265
+ /* @__PURE__ */ jsx("style", { children: KEYFRAMES3 }),
266
+ /* @__PURE__ */ jsx("svg", { style: { position: "absolute", width: 0, height: 0 }, children: /* @__PURE__ */ jsx("filter", { id: "elevasis-grain", children: /* @__PURE__ */ jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.65", numOctaves: "3", stitchTiles: "stitch" }) }) }),
267
+ /* @__PURE__ */ jsx(
268
+ "div",
269
+ {
270
+ style: {
271
+ position: "absolute",
272
+ inset: "-50%",
273
+ width: "200%",
274
+ height: "200%",
275
+ filter: "url(#elevasis-grain)",
276
+ animation: "elevasis-grain-shift 0.8s steps(4) infinite",
277
+ willChange: "transform"
278
+ }
279
+ }
280
+ )
281
+ ]
282
+ }
283
+ );
284
+ }
285
+ function AppBackground({ children }) {
286
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
287
+ /* @__PURE__ */ jsx(PerspectiveGrid, {}),
288
+ /* @__PURE__ */ jsx(RadiantGlow, {}),
289
+ /* @__PURE__ */ jsx(FloatingOrbs, {}),
290
+ /* @__PURE__ */ jsx(FilmGrain, {}),
291
+ children
292
+ ] });
293
+ }
294
+
295
+ export { AppBackground, AppearanceProvider, FilmGrain, FloatingOrbs, PerspectiveGrid, RadiantGlow, useAppearance };