@elevasis/ui 1.21.0 → 1.23.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 (47) hide show
  1. package/dist/charts/index.js +2 -2
  2. package/dist/{chunk-CYJILY7M.js → chunk-5266RV46.js} +2 -2
  3. package/dist/{chunk-V422ET6W.js → chunk-7TLPKXC2.js} +2 -2
  4. package/dist/{chunk-UZWZY7TJ.js → chunk-HOYZWSNV.js} +90 -79
  5. package/dist/{chunk-BC6TJEON.js → chunk-IAZT3VO6.js} +157 -38
  6. package/dist/{chunk-2WLVOFK7.js → chunk-MRBYKPRI.js} +4 -3
  7. package/dist/{chunk-FVBYSDM4.js → chunk-N5SDJP44.js} +1 -1
  8. package/dist/{chunk-3DIU726S.js → chunk-NVSKJG3L.js} +25 -4
  9. package/dist/{chunk-NL6EFQYE.js → chunk-PCOE5EBU.js} +4 -4
  10. package/dist/{chunk-MOBXWBES.js → chunk-QGQECEOT.js} +458 -411
  11. package/dist/{chunk-CRFV2TVK.js → chunk-U3LCNE7V.js} +2 -2
  12. package/dist/{chunk-ST2RSBQ3.js → chunk-VDGE7JR6.js} +3 -3
  13. package/dist/components/index.css +0 -3
  14. package/dist/components/index.d.ts +37 -37
  15. package/dist/components/index.js +13 -15
  16. package/dist/features/auth/index.css +0 -3
  17. package/dist/features/dashboard/index.css +0 -3
  18. package/dist/features/dashboard/index.js +6 -7
  19. package/dist/features/monitoring/index.css +0 -3
  20. package/dist/features/monitoring/index.js +7 -8
  21. package/dist/features/operations/index.css +0 -3
  22. package/dist/features/operations/index.js +8 -9
  23. package/dist/features/settings/index.css +0 -3
  24. package/dist/features/settings/index.js +6 -7
  25. package/dist/hooks/index.css +0 -3
  26. package/dist/hooks/index.d.ts +1 -1
  27. package/dist/hooks/index.js +3 -4
  28. package/dist/hooks/published.css +0 -3
  29. package/dist/hooks/published.d.ts +1 -1
  30. package/dist/hooks/published.js +3 -4
  31. package/dist/index.css +0 -3
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.js +4 -5
  34. package/dist/layout/index.d.ts +1 -1
  35. package/dist/layout/index.js +1 -2
  36. package/dist/provider/index.css +0 -3
  37. package/dist/provider/index.d.ts +1 -1
  38. package/dist/provider/index.js +3 -4
  39. package/dist/provider/published.d.ts +1 -1
  40. package/dist/theme/index.d.ts +1 -1
  41. package/dist/theme/index.js +3 -3
  42. package/dist/types/index.d.ts +1 -1
  43. package/package.json +3 -3
  44. package/dist/chunk-R3R367QY.js +0 -14
  45. package/dist/theme/presets/synapse.d.ts +0 -10
  46. package/dist/theme/presets/synapse.d.ts.map +0 -1
  47. package/dist/theme/presets/synapse.js +0 -75
@@ -1,5 +1,5 @@
1
- export { ActivityTrendChart, ChartFrame, CombinedTrendChart, CostTrendChart, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, HeroStatsRow, getSeriesColor, useCyberColors } from '../chunk-FVBYSDM4.js';
2
- import '../chunk-BC6TJEON.js';
1
+ export { ActivityTrendChart, ChartFrame, CombinedTrendChart, CostTrendChart, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, HeroStatsRow, getSeriesColor, useCyberColors } from '../chunk-N5SDJP44.js';
2
+ import '../chunk-IAZT3VO6.js';
3
3
  import '../chunk-3KMDHCAR.js';
4
4
  import '../chunk-NNKKBSJN.js';
5
5
  import '../chunk-QJ2S46NI.js';
@@ -1,5 +1,5 @@
1
- import { useCyberColors, CyberLegendItem, CyberAreaChart } from './chunk-FVBYSDM4.js';
2
- import { CardHeader, EmptyState } from './chunk-BC6TJEON.js';
1
+ import { useCyberColors, CyberLegendItem, CyberAreaChart } from './chunk-N5SDJP44.js';
2
+ import { CardHeader, EmptyState } from './chunk-IAZT3VO6.js';
3
3
  import { useResourcesHealth } from './chunk-EDAYKRPJ.js';
4
4
  import { getTimeRangeDates, formatBucketTime } from './chunk-LXHZYSMQ.js';
5
5
  import { Paper, Center, Loader, Group } from '@mantine/core';
@@ -1,6 +1,6 @@
1
1
  import { FilterBar } from './chunk-PDHTXPSF.js';
2
- import { CyberAreaChart } from './chunk-FVBYSDM4.js';
3
- import { APIErrorAlert, CardHeader, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, EmptyState } from './chunk-BC6TJEON.js';
2
+ import { CyberAreaChart } from './chunk-N5SDJP44.js';
3
+ import { APIErrorAlert, CardHeader, StatsCardSkeleton, TrendIndicator, DetailCardSkeleton, EmptyState } from './chunk-IAZT3VO6.js';
4
4
  import { useResolveError, useResolveAllErrors, usePaginationState, useErrorDetails, useMarkAsRead } from './chunk-EDAYKRPJ.js';
5
5
  import { formatBucketTime } from './chunk-LXHZYSMQ.js';
6
6
  import { formatDuration } from './chunk-XA34RETF.js';
@@ -1,6 +1,6 @@
1
1
  import { FilterBar } from './chunk-PDHTXPSF.js';
2
2
  import { CustomModal } from './chunk-GBMNCNHX.js';
3
- import { ListSkeleton, EmptyState, PageTitleCaption, CardHeader, APIErrorAlert } from './chunk-BC6TJEON.js';
3
+ import { ListSkeleton, EmptyState, PageTitleCaption, CardHeader, APIErrorAlert } from './chunk-IAZT3VO6.js';
4
4
  import { AppShellLoader } from './chunk-WWEMNIHW.js';
5
5
  import { useDeleteCredential, useCreateCredential, useCredentials, MEMBERSHIP_STATUS_COLORS, transformMembershipToTableRow, CredentialSchemas } from './chunk-FATKFO7X.js';
6
6
  import { formatDateTime } from './chunk-IOKL7BKE.js';
@@ -535,85 +535,96 @@ function OrganizationMembershipsList({
535
535
  subtitle: loading ? "Loading memberships..." : `Showing ${filteredRows.length} ${filteredRows.length === 1 ? "membership" : "memberships"}`
536
536
  }
537
537
  ),
538
- /* @__PURE__ */ jsxs(FilterBar, { children: [
539
- /* @__PURE__ */ jsx(
540
- TextInput,
541
- {
542
- placeholder: "Search organizations or roles...",
543
- leftSection: /* @__PURE__ */ jsx(IconSearch, { size: 16 }),
544
- value: searchTerm,
545
- onChange: (event) => setSearchTerm(event.currentTarget.value),
546
- style: { flex: 1 },
547
- disabled: loading
548
- }
549
- ),
550
- /* @__PURE__ */ jsx(
551
- Select,
552
- {
553
- placeholder: "Filter by status",
554
- value: statusFilter,
555
- onChange: (value) => setStatusFilter(value),
556
- data: [
557
- { value: "", label: "All Statuses" },
558
- { value: "active", label: "Active" },
559
- { value: "inactive", label: "Inactive" }
560
- ],
561
- style: { minWidth: 150 },
562
- clearable: true,
563
- disabled: loading
564
- }
565
- )
566
- ] }),
567
- /* @__PURE__ */ jsx(Table.ScrollContainer, { minWidth: 700, children: /* @__PURE__ */ jsxs(Table, { children: [
568
- /* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
569
- /* @__PURE__ */ jsx(Table.Th, { children: "Organization" }),
570
- /* @__PURE__ */ jsx(Table.Th, { children: "Role" }),
571
- /* @__PURE__ */ jsx(Table.Th, { children: "Status" }),
572
- /* @__PURE__ */ jsx(Table.Th, { children: "Joined" }),
573
- /* @__PURE__ */ jsx(Table.Th, { align: "right", children: "Actions" })
574
- ] }) }),
575
- /* @__PURE__ */ jsx(Table.Tbody, { children: loading ? /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, { colSpan: 5, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) }) }) : filteredRows.length === 0 ? /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, { colSpan: 5, children: /* @__PURE__ */ jsx(
576
- EmptyState,
577
- {
578
- icon: IconBuilding,
579
- title: "No memberships found",
580
- description: searchTerm || statusFilter ? "Try adjusting your search or filter criteria" : "You are not a member of any organizations yet"
581
- }
582
- ) }) }) : filteredRows.map((row) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
583
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsxs(Group, { gap: "sm", children: [
584
- /* @__PURE__ */ jsx(IconBuilding, { size: 16 }),
585
- /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { fw: 500, size: "sm", children: row.organizationName }) })
538
+ /* @__PURE__ */ jsxs(Stack, { children: [
539
+ /* @__PURE__ */ jsxs(FilterBar, { children: [
540
+ /* @__PURE__ */ jsx(
541
+ TextInput,
542
+ {
543
+ placeholder: "Search organizations or roles...",
544
+ leftSection: /* @__PURE__ */ jsx(IconSearch, { size: 16 }),
545
+ value: searchTerm,
546
+ onChange: (event) => setSearchTerm(event.currentTarget.value),
547
+ style: { flex: 1 },
548
+ disabled: loading
549
+ }
550
+ ),
551
+ /* @__PURE__ */ jsx(
552
+ Select,
553
+ {
554
+ placeholder: "Filter by status",
555
+ value: statusFilter,
556
+ onChange: (value) => setStatusFilter(value),
557
+ data: [
558
+ { value: "", label: "All Statuses" },
559
+ { value: "active", label: "Active" },
560
+ { value: "inactive", label: "Inactive" }
561
+ ],
562
+ style: { minWidth: 150 },
563
+ clearable: true,
564
+ disabled: loading
565
+ }
566
+ )
567
+ ] }),
568
+ /* @__PURE__ */ jsx(Table.ScrollContainer, { minWidth: 700, children: /* @__PURE__ */ jsxs(Table, { children: [
569
+ /* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
570
+ /* @__PURE__ */ jsx(Table.Th, { children: "Organization" }),
571
+ /* @__PURE__ */ jsx(Table.Th, { children: "Role" }),
572
+ /* @__PURE__ */ jsx(Table.Th, { children: "Status" }),
573
+ /* @__PURE__ */ jsx(Table.Th, { children: "Joined" }),
574
+ /* @__PURE__ */ jsx(Table.Th, { align: "right", children: "Actions" })
586
575
  ] }) }),
587
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Badge, { variant: "light", color: "blue", size: "sm", children: row.role }) }),
588
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(MembershipStatusBadge, { status: row.status }) }),
589
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: row.joinedAt.toLocaleDateString() }) }),
590
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
591
- row.canEdit && onEditRole && /* @__PURE__ */ jsx(
592
- ActionIcon,
593
- {
594
- variant: "subtle",
595
- size: "sm",
596
- color: "blue",
597
- onClick: () => onEditRole(row.id),
598
- disabled: row.status !== "active",
599
- children: /* @__PURE__ */ jsx(IconEdit, { size: 16 })
600
- }
601
- ),
602
- row.canRemove && onLeaveOrganization && row.status === "active" && /* @__PURE__ */ jsx(ActionIcon, { variant: "subtle", size: "sm", color: "red", onClick: () => onLeaveOrganization(row.id), children: /* @__PURE__ */ jsx(IconUserX, { size: 16 }) }),
603
- row.status === "inactive" && /* @__PURE__ */ jsx(
604
- ActionIcon,
605
- {
606
- variant: "subtle",
607
- size: "sm",
608
- color: "green",
609
- disabled: true,
610
- title: "Contact admin to reactivate",
611
- children: /* @__PURE__ */ jsx(IconUserCheck, { size: 16 })
612
- }
613
- )
614
- ] }) })
615
- ] }, row.id)) })
616
- ] }) })
576
+ /* @__PURE__ */ jsx(Table.Tbody, { children: loading ? /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, { colSpan: 5, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) }) }) : filteredRows.length === 0 ? /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, { colSpan: 5, children: /* @__PURE__ */ jsx(
577
+ EmptyState,
578
+ {
579
+ icon: IconBuilding,
580
+ title: "No memberships found",
581
+ description: searchTerm || statusFilter ? "Try adjusting your search or filter criteria" : "You are not a member of any organizations yet"
582
+ }
583
+ ) }) }) : filteredRows.map((row) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
584
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsxs(Group, { gap: "sm", children: [
585
+ /* @__PURE__ */ jsx(IconBuilding, { size: 16 }),
586
+ /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { fw: 500, size: "sm", children: row.organizationName }) })
587
+ ] }) }),
588
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Badge, { variant: "light", color: "blue", size: "sm", children: row.role }) }),
589
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(MembershipStatusBadge, { status: row.status }) }),
590
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: row.joinedAt.toLocaleDateString() }) }),
591
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
592
+ row.canEdit && onEditRole && /* @__PURE__ */ jsx(
593
+ ActionIcon,
594
+ {
595
+ variant: "subtle",
596
+ size: "sm",
597
+ color: "blue",
598
+ onClick: () => onEditRole(row.id),
599
+ disabled: row.status !== "active",
600
+ children: /* @__PURE__ */ jsx(IconEdit, { size: 16 })
601
+ }
602
+ ),
603
+ row.canRemove && onLeaveOrganization && row.status === "active" && /* @__PURE__ */ jsx(
604
+ ActionIcon,
605
+ {
606
+ variant: "subtle",
607
+ size: "sm",
608
+ color: "red",
609
+ onClick: () => onLeaveOrganization(row.id),
610
+ children: /* @__PURE__ */ jsx(IconUserX, { size: 16 })
611
+ }
612
+ ),
613
+ row.status === "inactive" && /* @__PURE__ */ jsx(
614
+ ActionIcon,
615
+ {
616
+ variant: "subtle",
617
+ size: "sm",
618
+ color: "green",
619
+ disabled: true,
620
+ title: "Contact admin to reactivate",
621
+ children: /* @__PURE__ */ jsx(IconUserCheck, { size: 16 })
622
+ }
623
+ )
624
+ ] }) })
625
+ ] }, row.id)) })
626
+ ] }) })
627
+ ] })
617
628
  ] });
618
629
  }
619
630
  function WebhookUrlDisplayModal({ opened, endpoint, webhookUrl, onClose }) {
@@ -1,11 +1,11 @@
1
1
  import { StyledMarkdown } from './chunk-3KMDHCAR.js';
2
2
  import { ResourceStatusColors } from './chunk-ELJIFLCB.js';
3
- import { getErrorInfo, getErrorTitle, getResourceIcon } from './chunk-IOKL7BKE.js';
3
+ import { getErrorInfo, getErrorTitle, getResourceIcon, formatTimeAgo } from './chunk-IOKL7BKE.js';
4
4
  import { useAuthContext } from './chunk-BRJ3QZ4E.js';
5
5
  import { useRouterContext } from './chunk-Q7DJKLEN.js';
6
- import { Center, Stack, Title, Text, Button, Box, Loader, Badge, Group, Collapse, ScrollArea, Card, Skeleton, Select, Alert, Code, ThemeIcon, Paper, Space } from '@mantine/core';
6
+ import { Center, Stack, Title, Text, Button, Box, Loader, Badge, Group, Collapse, ScrollArea, Card, Select, Alert, Code, ThemeIcon, Paper, Grid, Timeline, Space } from '@mantine/core';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { IconMinus, IconTrendingUp, IconTrendingDown, IconChevronUp, IconChevronDown, IconAlertCircle, IconClock, IconInfoCircle, IconChevronRight } from '@tabler/icons-react';
8
+ import { IconMinus, IconTrendingUp, IconTrendingDown, IconChevronUp, IconChevronDown, IconAlertCircle, IconClock, IconInfoCircle, IconChevronRight, IconInbox, IconHeartHandshake, IconUserOff, IconMailForward, IconBell, IconCalendarEvent, IconCalendarCancel, IconMessageReply, IconCircleCheck, IconCreditCard, IconX, IconEye, IconSend, IconFileText, IconArrowRight, IconPlus, IconActivity } from '@tabler/icons-react';
9
9
  import { useState } from 'react';
10
10
  import { Prism } from 'react-syntax-highlighter';
11
11
  import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism';
@@ -107,30 +107,14 @@ var PageTitleCaption = ({ title, caption, rightSection }) => {
107
107
  rightSection
108
108
  ] });
109
109
  };
110
- function StatsCardSkeleton({ chartHeight = 120, withChart = true, statCount = 3 }) {
111
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
112
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
113
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "xl", children: [
114
- /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
115
- statCount >= 2 && /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
116
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
117
- ] }),
118
- withChart && /* @__PURE__ */ jsx(Skeleton, { height: chartHeight })
119
- ] });
110
+ function StatsCardSkeleton({ chartHeight = 200 }) {
111
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { mih: chartHeight, children: /* @__PURE__ */ jsx(Loader, { size: "md" }) }) });
120
112
  }
121
113
  function ListSkeleton({ rows = 3, rowHeight = 50 }) {
122
- return /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: rowHeight }, i)) });
114
+ return /* @__PURE__ */ jsx(Stack, { children: /* @__PURE__ */ jsx(Center, { mih: rows * rowHeight, children: /* @__PURE__ */ jsx(Loader, { size: "md" }) }) });
123
115
  }
124
116
  function DetailCardSkeleton({ rows = 3 }) {
125
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
126
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
127
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "lg", children: [
128
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
129
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
130
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
131
- ] }),
132
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: 60 }, i)) })
133
- ] });
117
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { mih: rows * 60 + 100, children: /* @__PURE__ */ jsx(Loader, { size: "md" }) }) });
134
118
  }
135
119
  function CustomSelector({
136
120
  value,
@@ -239,13 +223,7 @@ function HeroStatCard({
239
223
  const sm = size === "sm";
240
224
  const iconSize = sm ? 36 : 46;
241
225
  if (isLoading) {
242
- return /* @__PURE__ */ jsx(Paper, { p: sm ? "md" : "lg", className: StatCard_module_css_default.heroCard, children: /* @__PURE__ */ jsxs(Group, { gap: sm ? "sm" : "md", wrap: "nowrap", children: [
243
- /* @__PURE__ */ jsx(Skeleton, { circle: true, height: iconSize }),
244
- /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
245
- /* @__PURE__ */ jsx(Skeleton, { height: sm ? 24 : 32, width: 60 }),
246
- /* @__PURE__ */ jsx(Skeleton, { height: 12, width: 80 })
247
- ] })
248
- ] }) });
226
+ return /* @__PURE__ */ jsx(Paper, { p: sm ? "md" : "lg", className: StatCard_module_css_default.heroCard, children: /* @__PURE__ */ jsx(Center, { mih: iconSize + 16, children: /* @__PURE__ */ jsx(Loader, { size: "sm" }) }) });
249
227
  }
250
228
  return /* @__PURE__ */ jsx(Paper, { p: sm ? "md" : "lg", className: StatCard_module_css_default.heroCard, children: /* @__PURE__ */ jsxs(Group, { gap: sm ? "sm" : "md", wrap: "nowrap", children: [
251
229
  /* @__PURE__ */ jsx("div", { className: sm ? StatCard_module_css_default.iconRingSm : StatCard_module_css_default.iconRing, children: /* @__PURE__ */ jsx(IconComponent, { size: sm ? 18 : 22 }) }),
@@ -266,7 +244,7 @@ function HeroStatCard({
266
244
  ] }) });
267
245
  }
268
246
  function StatCardSkeleton() {
269
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Skeleton, { height: 60 }) });
247
+ return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { mih: 60, children: /* @__PURE__ */ jsx(Loader, { size: "sm" }) }) });
270
248
  }
271
249
  var jsonTheme = Object.fromEntries(
272
250
  Object.entries(oneDark).map(([key, value]) => [
@@ -449,13 +427,14 @@ function ResourceCard({
449
427
  onClick,
450
428
  layout = "stack",
451
429
  rightSection,
430
+ topSection,
452
431
  lastRunLabel,
453
432
  style,
454
433
  ...rest
455
434
  }) {
456
435
  const Icon = getResourceIcon(resource.type);
457
436
  if (!Icon) {
458
- return /* @__PURE__ */ jsx(Paper, { shadow: "sm", withBorder: true, children: /* @__PURE__ */ jsxs(Text, { children: [
437
+ return /* @__PURE__ */ jsx(Card, { shadow: "sm", withBorder: true, children: /* @__PURE__ */ jsxs(Text, { children: [
459
438
  "Invalid resource type: ",
460
439
  resource.type
461
440
  ] }) });
@@ -494,13 +473,55 @@ function ResourceCard({
494
473
  /* @__PURE__ */ jsx(Text, { size: layout === "grid" ? "sm" : "xs", c: "dimmed", ff: "monospace", children: resource.resourceId })
495
474
  ] })
496
475
  ] });
497
- if (layout === "row") {
476
+ if (layout === "card") {
498
477
  return /* @__PURE__ */ jsx(
499
- Paper,
478
+ Card,
500
479
  {
501
480
  withBorder: true,
502
- style: { cursor: "pointer", ...style },
481
+ padding: 0,
482
+ style: cardStyle,
483
+ onClick: () => onClick(resource),
484
+ "data-resource-id": rest["data-resource-id"],
485
+ children: /* @__PURE__ */ jsxs(Stack, { gap: 8, p: "sm", pb: "xs", children: [
486
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", justify: "space-between", children: [
487
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { minWidth: 0 }, children: [
488
+ /* @__PURE__ */ jsx(Icon, { size: 20, color: "var(--color-primary)", style: { flexShrink: 0 } }),
489
+ /* @__PURE__ */ jsx(Text, { fw: 600, size: "md", style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, truncate: true, children: resource.name })
490
+ ] }),
491
+ /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", style: { flexShrink: 0 }, children: [
492
+ resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "light", size: "sm", children: [
493
+ "v",
494
+ resource.version
495
+ ] }),
496
+ /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "light", size: "sm", children: resource.status.toUpperCase() })
497
+ ] })
498
+ ] }),
499
+ resource.description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, children: resource.description }),
500
+ /* @__PURE__ */ jsxs(Group, { gap: "xs", justify: "space-between", wrap: "nowrap", children: [
501
+ rightSection || /* @__PURE__ */ jsx("span", {}),
502
+ lastRunLabel && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap" }, children: lastRunLabel })
503
+ ] }),
504
+ topSection
505
+ ] })
506
+ }
507
+ );
508
+ }
509
+ if (layout === "row") {
510
+ const [hovered, setHovered] = useState(false);
511
+ return /* @__PURE__ */ jsx(
512
+ Card,
513
+ {
514
+ padding: 0,
515
+ style: {
516
+ cursor: "pointer",
517
+ border: "1px solid var(--color-border)",
518
+ transition: "background 150ms ease",
519
+ background: hovered ? "var(--active-background)" : "var(--color-surface)",
520
+ ...style
521
+ },
503
522
  onClick: () => onClick(resource),
523
+ onMouseEnter: () => setHovered(true),
524
+ onMouseLeave: () => setHovered(false),
504
525
  "data-resource-id": rest["data-resource-id"],
505
526
  children: /* @__PURE__ */ jsxs(
506
527
  "div",
@@ -524,15 +545,40 @@ function ResourceCard({
524
545
  /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, style: { minWidth: 0 }, children: resource.description || "" }),
525
546
  /* @__PURE__ */ jsx("div", { style: { whiteSpace: "nowrap" }, children: rightSection }),
526
547
  /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap", textAlign: "right" }, children: lastRunLabel || "" }),
527
- /* @__PURE__ */ jsx(IconChevronRight, { size: 14, style: { opacity: 0.3 } })
548
+ /* @__PURE__ */ jsx(
549
+ IconChevronRight,
550
+ {
551
+ size: 14,
552
+ style: {
553
+ opacity: hovered ? 0.7 : 0,
554
+ transition: "opacity 150ms ease"
555
+ }
556
+ }
557
+ )
528
558
  ]
529
559
  }
530
560
  )
531
561
  }
532
562
  );
533
563
  }
564
+ if (layout === "grid") {
565
+ return /* @__PURE__ */ jsx(
566
+ Card,
567
+ {
568
+ withBorder: true,
569
+ padding: "sm",
570
+ style: cardStyle,
571
+ onClick: () => onClick(resource),
572
+ "data-resource-id": rest["data-resource-id"],
573
+ children: /* @__PURE__ */ jsxs(Grid, { gutter: "sm", align: "center", children: [
574
+ /* @__PURE__ */ jsx(Grid.Col, { span: 8, children: details }),
575
+ rightSection && /* @__PURE__ */ jsx(Grid.Col, { span: 4, children: /* @__PURE__ */ jsx(Group, { justify: "flex-end", gap: "md", wrap: "nowrap", children: rightSection }) })
576
+ ] })
577
+ }
578
+ );
579
+ }
534
580
  return /* @__PURE__ */ jsx(
535
- Paper,
581
+ Card,
536
582
  {
537
583
  shadow: "sm",
538
584
  withBorder: true,
@@ -592,5 +638,78 @@ function GlowDot({ color, size = "md" }) {
592
638
  }
593
639
  );
594
640
  }
641
+ var STATUS_COLORS = {
642
+ // Project
643
+ active: "blue",
644
+ on_track: "green",
645
+ at_risk: "yellow",
646
+ blocked: "red",
647
+ completed: "teal",
648
+ paused: "gray",
649
+ // Milestone
650
+ upcoming: "gray",
651
+ in_progress: "blue",
652
+ overdue: "red",
653
+ // Task
654
+ pending: "gray",
655
+ planned: "gray",
656
+ submitted: "yellow",
657
+ approved: "green",
658
+ rejected: "red",
659
+ revision_requested: "orange",
660
+ cancelled: "gray",
661
+ // Note
662
+ call_note: "blue",
663
+ status_update: "green",
664
+ issue: "yellow",
665
+ blocker: "red"
666
+ };
667
+ function StatusBadge({ status, ...props }) {
668
+ const label = status.split("_").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
669
+ return /* @__PURE__ */ jsx(Badge, { variant: "light", color: STATUS_COLORS[status] || "gray", size: "sm", ...props, children: label });
670
+ }
671
+ var ICON_MAP = {
672
+ deal_created: IconPlus,
673
+ stage_change: IconArrowRight,
674
+ discovery_submitted: IconFileText,
675
+ proposal_generated: IconFileText,
676
+ proposal_sent: IconSend,
677
+ proposal_reviewed: IconEye,
678
+ closed_lost: IconX,
679
+ fees_updated: IconCreditCard,
680
+ closed_won: IconCircleCheck,
681
+ reply_received: IconMessageReply,
682
+ booking_cancelled: IconCalendarCancel,
683
+ booking_rescheduled: IconCalendarEvent,
684
+ reminder_sent: IconBell,
685
+ reply_sent_to_lead: IconMailForward,
686
+ followup_email_sent: IconMailForward,
687
+ no_show: IconUserOff,
688
+ moved_to_nurturing: IconHeartHandshake
689
+ };
690
+ function ActivityTimeline({ activities }) {
691
+ if (!activities.length) {
692
+ return /* @__PURE__ */ jsx(EmptyState, { icon: IconInbox, title: "No activity events yet" });
693
+ }
694
+ const sorted = [...activities].reverse();
695
+ return /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Timeline, { active: sorted.length - 1, bulletSize: 28, lineWidth: 2, color: "var(--color-primary)", children: sorted.map((activity, index) => {
696
+ const Icon = ICON_MAP[activity.type] || IconActivity;
697
+ return /* @__PURE__ */ jsx(
698
+ Timeline.Item,
699
+ {
700
+ bullet: /* @__PURE__ */ jsx(ThemeIcon, { size: 28, variant: "filled", color: "var(--color-primary)", radius: "xl", children: /* @__PURE__ */ jsx(Icon, { size: 14 }) }),
701
+ children: /* @__PURE__ */ jsxs(Stack, { gap: 2, children: [
702
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, children: activity.title }),
703
+ activity.description && /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: activity.description }),
704
+ /* @__PURE__ */ jsxs(Text, { size: "xs", c: "dimmed", children: [
705
+ formatTimeAgo(activity.occurredAt),
706
+ activity.actor && ` by ${activity.actor}`
707
+ ] })
708
+ ] })
709
+ },
710
+ index
711
+ );
712
+ }) }) });
713
+ }
595
714
 
596
- export { APIErrorAlert, CardHeader, CollapsibleSection, ContextViewer, CustomSelector, DetailCardSkeleton, EmptyState, GlowDot, JsonViewer, ListSkeleton, PageNotFound, PageTitleCaption, ResourceCard, StatCard, StatCardSkeleton, StatsCardSkeleton, TabCountBadge, TimeRangeSelector, TrendIndicator, catalogItemToResourceDefinition };
715
+ export { APIErrorAlert, ActivityTimeline, CardHeader, CollapsibleSection, ContextViewer, CustomSelector, DetailCardSkeleton, EmptyState, GlowDot, JsonViewer, ListSkeleton, PageNotFound, PageTitleCaption, ResourceCard, StatCard, StatCardSkeleton, StatsCardSkeleton, StatusBadge, TabCountBadge, TimeRangeSelector, TrendIndicator, catalogItemToResourceDefinition };
@@ -1,4 +1,4 @@
1
- import { usePresetsContext } from './chunk-MOBXWBES.js';
1
+ import { usePresetsContext } from './chunk-QGQECEOT.js';
2
2
  import { useMemo } from 'react';
3
3
 
4
4
  var BUILT_IN_NAMES = /* @__PURE__ */ new Set([
@@ -16,8 +16,9 @@ var BUILT_IN_NAMES = /* @__PURE__ */ new Set([
16
16
  "canopy",
17
17
  "slate",
18
18
  "cyber-strike",
19
- "cyber-punk",
20
- "cyber-void"
19
+ "cyber-chrome",
20
+ "cyber-void",
21
+ "quarry"
21
22
  ]);
22
23
  function titleCase(str) {
23
24
  return str.replace(/(^|-)(\w)/g, (_, sep, char) => (sep ? " " : "") + char.toUpperCase());
@@ -1,4 +1,4 @@
1
- import { CardHeader, APIErrorAlert, TrendIndicator, EmptyState, StatCard } from './chunk-BC6TJEON.js';
1
+ import { CardHeader, APIErrorAlert, TrendIndicator, EmptyState, StatCard } from './chunk-IAZT3VO6.js';
2
2
  import { getTimeRangeLabel, getTimeRangeDates, useErrorTrends, formatBucketTime } from './chunk-LXHZYSMQ.js';
3
3
  import { useRef, useState, useLayoutEffect, useEffect, useMemo, useCallback } from 'react';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -276,8 +276,17 @@ function FilmGrain({ darkOpacity = 0.02, lightOpacity = 0.06, className }) {
276
276
  }
277
277
  );
278
278
  }
279
+ function AppBackground({ children }) {
280
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
281
+ /* @__PURE__ */ jsx(PerspectiveGrid, {}),
282
+ /* @__PURE__ */ jsx(RadiantGlow, {}),
283
+ /* @__PURE__ */ jsx(FloatingOrbs, {}),
284
+ /* @__PURE__ */ jsx(FilmGrain, {}),
285
+ children
286
+ ] });
287
+ }
279
288
  var randRange = (min, max) => min + Math.random() * (max - min);
280
- var FLUX_SPARKS = Array.from({ length: 32 }, () => {
289
+ var FLUX_SPARKS = Array.from({ length: 30 }, () => {
281
290
  const duration = randRange(12, 70);
282
291
  const pulse = randRange(0.8, 2.2);
283
292
  return {
@@ -291,7 +300,7 @@ var FLUX_SPARKS = Array.from({ length: 32 }, () => {
291
300
  pulseDelay: -randRange(0, pulse)
292
301
  };
293
302
  });
294
- var FLUX_MOTES = Array.from({ length: 19 }, () => {
303
+ var FLUX_MOTES = Array.from({ length: 18 }, () => {
295
304
  const duration = randRange(18, 90);
296
305
  const pulse = randRange(1.6, 4);
297
306
  return {
@@ -483,7 +492,7 @@ function CyberParticles({ variant: _variant, className }) {
483
492
  );
484
493
  }
485
494
  function CyberBackground({ variant }) {
486
- const glowColor = variant === "volt" ? "color-mix(in srgb, var(--color-primary) 12%, transparent)" : void 0;
495
+ const glowColor = variant === "chrome" ? void 0 : variant === "volt" || variant === "void" ? "color-mix(in srgb, var(--color-primary) 25%, transparent)" : "color-mix(in srgb, var(--color-primary) 35%, transparent)";
487
496
  return /* @__PURE__ */ jsxs(Fragment, { children: [
488
497
  /* @__PURE__ */ jsx(PerspectiveGrid, { lineColor: "var(--color-border)", prominentGlow: true, glowColor }),
489
498
  /* @__PURE__ */ jsx(RadiantGlow, {}),
@@ -545,6 +554,12 @@ var STYLE = `
545
554
  --wavy-mote-core: rgba(140, 205, 155, 0.85);
546
555
  --wavy-mote-halo: rgba(140, 205, 155, 0.3);
547
556
  }
557
+ .wavy-bg-root[data-variant="quarry"] {
558
+ --wavy-wave-front: #dde0e4;
559
+ --wavy-wave-back: #e6e9ed;
560
+ --wavy-mote-core: rgba(150, 158, 170, 0.85);
561
+ --wavy-mote-halo: rgba(150, 158, 170, 0.3);
562
+ }
548
563
  /* Variant palettes (dark mode overrides) */
549
564
  [data-mantine-color-scheme="dark"] .wavy-bg-root[data-variant="nirvana"] {
550
565
  --wavy-wave-front: #140804;
@@ -570,6 +585,12 @@ var STYLE = `
570
585
  --wavy-mote-core: rgba(74, 168, 96, 0.4);
571
586
  --wavy-mote-halo: rgba(74, 168, 96, 0.12);
572
587
  }
588
+ [data-mantine-color-scheme="dark"] .wavy-bg-root[data-variant="quarry"] {
589
+ --wavy-wave-front: #0d0c0a;
590
+ --wavy-wave-back: #070605;
591
+ --wavy-mote-core: rgba(168, 164, 156, 0.4);
592
+ --wavy-mote-halo: rgba(168, 164, 156, 0.12);
593
+ }
573
594
  .wavy-bg-layer {
574
595
  position: absolute;
575
596
  top: 0;
@@ -706,4 +727,4 @@ function WaveBackground({ variant }) {
706
727
  ] });
707
728
  }
708
729
 
709
- export { CyberBackground, CyberParticles, FilmGrain, FloatingOrbs, PerspectiveGrid, RadiantGlow, WaveBackground };
730
+ export { AppBackground, CyberBackground, CyberParticles, FilmGrain, FloatingOrbs, PerspectiveGrid, RadiantGlow, WaveBackground };
@@ -1,8 +1,8 @@
1
1
  import { SubshellSidebarSection } from './chunk-AWT255UH.js';
2
2
  import { CustomModal, ConfirmationModal } from './chunk-GBMNCNHX.js';
3
- import { BaseNode, useGraphTheme, BaseEdge, GraphBackground, GraphLegend, GraphFitViewButton, GraphFitViewHandler } from './chunk-ST2RSBQ3.js';
4
- import { useCyberColors, CyberDonut } from './chunk-FVBYSDM4.js';
5
- import { JsonViewer, CardHeader, PageTitleCaption, CollapsibleSection, ContextViewer } from './chunk-BC6TJEON.js';
3
+ import { BaseNode, useGraphTheme, BaseEdge, GraphBackground, GraphLegend, GraphFitViewButton, GraphFitViewHandler } from './chunk-VDGE7JR6.js';
4
+ import { useCyberColors, CyberDonut } from './chunk-N5SDJP44.js';
5
+ import { JsonViewer, CardHeader, PageTitleCaption, CollapsibleSection, ContextViewer } from './chunk-IAZT3VO6.js';
6
6
  import { StyledMarkdown } from './chunk-3KMDHCAR.js';
7
7
  import { useCommandViewLayout, useErrorDetail, useExecution, useArchivedLogs, useDeleteExecution, useRetryExecution, useCancelExecution, useCommandQueueTotals, useSubmitAction, useDeleteTask, showApiErrorNotification, showSuccessNotification } from './chunk-EDAYKRPJ.js';
8
8
  import { Graph_module_css_default, useDirectedChainHighlighting, useNodeSelection, GRAPH_CONSTANTS, useGraphHighlighting, calculateGraphHeight } from './chunk-F6RBK7NJ.js';
@@ -1850,7 +1850,7 @@ function CommandQueueTaskRow({ task, onClick, onDelete }) {
1850
1850
  cursor: "pointer",
1851
1851
  border: "1px solid var(--color-border)",
1852
1852
  transition: "background var(--duration-fast) var(--easing)",
1853
- background: hovered ? "var(--active-background)" : "var(--glass-background)"
1853
+ background: hovered ? "var(--active-background)" : "var(--color-surface)"
1854
1854
  },
1855
1855
  onClick: (e) => {
1856
1856
  if (e.target.closest("[data-menu-dropdown]") || e.target.closest("button")) {