@elevasis/ui 1.19.0 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/api/index.js +2 -2
  2. package/dist/auth/index.js +3 -3
  3. package/dist/charts/index.css +14 -0
  4. package/dist/charts/index.js +8 -6
  5. package/dist/{chunk-7ATCF6UL.js → chunk-3DIU726S.js} +11 -4
  6. package/dist/chunk-4SY4EQSK.js +68 -0
  7. package/dist/{chunk-2Z7LYTIX.js → chunk-AQ5MQDSS.js} +30 -17
  8. package/dist/chunk-AWMZCYKH.js +639 -0
  9. package/dist/{chunk-BVNAC4SQ.js → chunk-C7AD6N23.js} +38 -48
  10. package/dist/{chunk-ZFCG5SHW.js → chunk-COTI2QPO.js} +1 -1
  11. package/dist/{chunk-WAPZN2U3.js → chunk-EMN755L5.js} +7 -41
  12. package/dist/{chunk-LBY7FVFD.js → chunk-ERVB3QJQ.js} +31 -715
  13. package/dist/chunk-GBMNCNHX.js +105 -0
  14. package/dist/{chunk-MBZDE6UT.js → chunk-IOKL7BKE.js} +9 -1
  15. package/dist/{chunk-35UWYH2A.js → chunk-JFRG2JJE.js} +8 -2
  16. package/dist/chunk-JIABC3AE.js +2622 -0
  17. package/dist/chunk-JZEXFQ6N.js +671 -0
  18. package/dist/chunk-LGKLC5MG.js +44 -0
  19. package/dist/chunk-MG3NF7QL.js +63 -0
  20. package/dist/{chunk-KBLGVZBD.js → chunk-NNKKBSJN.js} +2 -22
  21. package/dist/{chunk-JNBHUCKW.js → chunk-NVOCKXUQ.js} +1 -1
  22. package/dist/chunk-OFAXUZPZ.js +2411 -0
  23. package/dist/chunk-PDHTXPSF.js +12 -0
  24. package/dist/chunk-QJ2S46NI.js +23 -0
  25. package/dist/{chunk-NUULWBAD.js → chunk-R3R367QY.js} +1 -1
  26. package/dist/{chunk-UANJP5P7.js → chunk-R7WLWGPO.js} +5 -5
  27. package/dist/{chunk-CC3SDRIF.js → chunk-RWQIFKMJ.js} +1 -1
  28. package/dist/chunk-UMFPUM7Q.js +1281 -0
  29. package/dist/{chunk-KNJKCD73.js → chunk-VLTVZXP6.js} +4 -4
  30. package/dist/chunk-WWEMNIHW.js +37 -0
  31. package/dist/{chunk-UTWJZEOJ.js → chunk-XOTN3X3Z.js} +3 -3
  32. package/dist/components/index.css +14 -0
  33. package/dist/components/index.d.ts +41 -7
  34. package/dist/components/index.js +564 -5023
  35. package/dist/components/navigation/index.js +2 -63
  36. package/dist/features/auth/index.css +579 -0
  37. package/dist/features/auth/index.d.ts +2557 -0
  38. package/dist/features/auth/index.js +125 -0
  39. package/dist/features/dashboard/index.css +579 -0
  40. package/dist/features/dashboard/index.d.ts +244 -0
  41. package/dist/features/dashboard/index.js +650 -0
  42. package/dist/features/monitoring/index.css +579 -0
  43. package/dist/features/monitoring/index.d.ts +121 -0
  44. package/dist/features/monitoring/index.js +538 -0
  45. package/dist/features/operations/index.css +14 -0
  46. package/dist/features/operations/index.d.ts +1675 -2
  47. package/dist/features/operations/index.js +2148 -28
  48. package/dist/features/settings/index.css +579 -0
  49. package/dist/features/settings/index.d.ts +2589 -0
  50. package/dist/features/settings/index.js +1437 -0
  51. package/dist/hooks/index.css +14 -0
  52. package/dist/hooks/index.d.ts +29 -11
  53. package/dist/hooks/index.js +13 -13
  54. package/dist/hooks/published.css +14 -0
  55. package/dist/hooks/published.d.ts +29 -11
  56. package/dist/hooks/published.js +12 -12
  57. package/dist/index.css +14 -0
  58. package/dist/index.d.ts +41 -12
  59. package/dist/index.js +15 -15
  60. package/dist/initialization/index.js +2 -2
  61. package/dist/layout/index.d.ts +7 -1
  62. package/dist/layout/index.js +7 -5
  63. package/dist/organization/index.js +2 -2
  64. package/dist/provider/index.css +14 -0
  65. package/dist/provider/index.d.ts +1 -1
  66. package/dist/provider/index.js +10 -10
  67. package/dist/provider/published.d.ts +1 -1
  68. package/dist/provider/published.js +6 -6
  69. package/dist/theme/index.d.ts +1 -1
  70. package/dist/theme/index.js +3 -3
  71. package/dist/theme/presets/__tests__/getPreset.test.d.ts +2 -0
  72. package/dist/theme/presets/__tests__/getPreset.test.d.ts.map +1 -0
  73. package/dist/theme/presets/__tests__/getPreset.test.js +92 -0
  74. package/dist/theme/presets/cyber-volt.d.ts +12 -0
  75. package/dist/theme/presets/cyber-volt.d.ts.map +1 -0
  76. package/dist/theme/presets/cyber-volt.js +70 -0
  77. package/dist/theme/presets/regal.d.ts +8 -0
  78. package/dist/theme/presets/regal.d.ts.map +1 -0
  79. package/dist/theme/presets/regal.js +69 -0
  80. package/dist/theme/presets/rose-gold.d.ts +12 -0
  81. package/dist/theme/presets/rose-gold.d.ts.map +1 -0
  82. package/dist/theme/presets/rose-gold.js +76 -0
  83. package/dist/types/index.d.ts +1 -1
  84. package/dist/utils/index.d.ts +12 -1
  85. package/dist/utils/index.js +1 -1
  86. package/dist/zustand/index.d.ts +80 -0
  87. package/dist/zustand/index.js +105 -0
  88. package/package.json +55 -4
  89. package/dist/chunk-2YW3LDFT.js +0 -1542
  90. package/dist/theme/presets/cyber-void.d.ts +0 -12
  91. package/dist/theme/presets/cyber-void.d.ts.map +0 -1
  92. package/dist/theme/presets/cyber-void.js +0 -75
  93. package/dist/{chunk-DVKEEY5J.js → chunk-TUXTSEAF.js} +1 -1
  94. package/dist/{chunk-U2522LSW.js → chunk-V7XHGJQZ.js} +1 -1
@@ -1,16 +1,10 @@
1
+ import { CardHeader, APIErrorAlert, TrendIndicator, EmptyState, StatCard } from './chunk-AWMZCYKH.js';
1
2
  import { getTimeRangeLabel, getTimeRangeDates, useErrorTrends, formatBucketTime } from './chunk-LXHZYSMQ.js';
2
- import { ResourceStatusColors } from './chunk-ELJIFLCB.js';
3
- import { getErrorInfo, getErrorTitle, getResourceIcon } from './chunk-MBZDE6UT.js';
4
- import { useAuthContext } from './chunk-BRJ3QZ4E.js';
5
- import { useRouterContext } from './chunk-Q7DJKLEN.js';
6
3
  import { useRef, useState, useLayoutEffect, useEffect, useMemo, useCallback } from 'react';
7
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { useComputedColorScheme, Group, Text, Box, Stack, Center, Title, Button, Loader, Badge, Collapse, ScrollArea, Card, Skeleton, Select, Alert, Code, ThemeIcon, Paper, Grid, NumberFormatter, Space, Tooltip as Tooltip$1, SimpleGrid, SegmentedControl } from '@mantine/core';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import { useComputedColorScheme, Group, Text, Box, Stack, Center, Loader, Paper, Button, NumberFormatter, Badge, Space, Tooltip as Tooltip$1, SimpleGrid, Alert, SegmentedControl } from '@mantine/core';
9
6
  import { ResponsiveContainer, AreaChart, CartesianGrid, XAxis, YAxis, Tooltip, ReferenceLine as ReferenceLine$1, Area, PieChart, Pie, Cell } from 'recharts';
10
- import { IconMinus, IconTrendingUp, IconTrendingDown, IconChevronUp, IconChevronDown, IconAlertCircle, IconClock, IconInfoCircle, IconChevronRight, IconDownload, IconChartLine, IconApps, IconPlayerPlay, IconChartBar, IconAlertTriangle, IconRocket } from '@tabler/icons-react';
11
- import Markdown from 'react-markdown';
12
- import { Prism } from 'react-syntax-highlighter';
13
- import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism';
7
+ import { IconActivity, IconDownload, IconChartLine, IconInfoCircle, IconApps, IconPlayerPlay, IconChartBar, IconAlertTriangle, IconRocket, IconAlertCircle } from '@tabler/icons-react';
14
8
 
15
9
  function ChartFrame({ h, debounceMs = 150, children }) {
16
10
  const ref = useRef(null);
@@ -274,7 +268,7 @@ function CyberLegendItem({ color, label }) {
274
268
  }
275
269
  }
276
270
  ),
277
- /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", style: { letterSpacing: "0.03em" }, children: label })
271
+ /* @__PURE__ */ jsx(Text, { size: "xs", style: { color: "var(--color-text-subtle)", letterSpacing: "0.03em" }, children: label })
278
272
  ] });
279
273
  }
280
274
  var COLOR_MAP = {
@@ -471,7 +465,15 @@ function CyberDonut({
471
465
  const isEmpty = filtered.length === 0;
472
466
  const pieData = isEmpty ? [{ name: "Empty", value: 1, color: "var(--color-border)" }] : filtered;
473
467
  return /* @__PURE__ */ jsxs(Stack, { gap: 6, align: "center", children: [
474
- title && /* @__PURE__ */ jsx(Text, { size: "xs", fw: 600, c: "dimmed", style: { letterSpacing: "0.03em", textTransform: "uppercase" }, children: title }),
468
+ title && /* @__PURE__ */ jsx(
469
+ Text,
470
+ {
471
+ size: "xs",
472
+ fw: 600,
473
+ style: { color: "var(--color-text)", letterSpacing: "0.03em", textTransform: "uppercase" },
474
+ children: title
475
+ }
476
+ ),
475
477
  /* @__PURE__ */ jsxs(Box, { style: { width: size, height: size, position: "relative" }, children: [
476
478
  /* @__PURE__ */ jsx(ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxs(PieChart, { children: [
477
479
  !isEmpty && /* @__PURE__ */ jsx("defs", { children: filtered.map((_, i) => /* @__PURE__ */ jsxs("filter", { id: `${glowId}-${i}`, x: "-20%", y: "-20%", width: "140%", height: "140%", children: [
@@ -570,701 +572,6 @@ function CyberDonut({
570
572
  ] }, seg.name)) })
571
573
  ] });
572
574
  }
573
- function EmptyState({ icon: Icon, title, description, action, py = "xl" }) {
574
- return /* @__PURE__ */ jsx(Center, { py, children: /* @__PURE__ */ jsxs(Stack, { align: "center", gap: "xs", children: [
575
- /* @__PURE__ */ jsx(Icon, { size: 48, style: { opacity: 0.5 } }),
576
- /* @__PURE__ */ jsx(Title, { order: 4, children: title }),
577
- description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", ta: "center", children: description }),
578
- action && /* @__PURE__ */ jsx(Button, { variant: "light", onClick: action.onClick, leftSection: action.icon, mt: "sm", children: action.label })
579
- ] }) });
580
- }
581
- function TabCountBadge({ count, isLoading }) {
582
- return /* @__PURE__ */ jsx(Box, { miw: 20, h: 20, style: { display: "flex", alignItems: "center", justifyContent: "center" }, children: isLoading ? /* @__PURE__ */ jsx(Loader, { size: 12 }) : /* @__PURE__ */ jsx(Badge, { size: "sm", variant: "light", circle: count < 10, children: count }) });
583
- }
584
- function TrendIndicator({ current, previous, inverse }) {
585
- const change = previous === 0 ? 0 : (current - previous) / previous * 100;
586
- const isPositive = inverse ? change < 0 : change > 0;
587
- const isFlat = Math.abs(change) < 0.1;
588
- const color = isFlat ? "gray" : isPositive ? "green" : "red";
589
- const Icon = isFlat ? IconMinus : change > 0 ? IconTrendingUp : IconTrendingDown;
590
- return /* @__PURE__ */ jsxs(Group, { gap: 4, children: [
591
- /* @__PURE__ */ jsx(Icon, { size: 12 }),
592
- /* @__PURE__ */ jsx(Badge, { size: "sm", color, variant: "light", children: isFlat ? "No change" : `${isPositive ? "+" : ""}${Math.abs(change).toFixed(1)}%` })
593
- ] });
594
- }
595
- function CollapsibleSection({
596
- title,
597
- count,
598
- countLabel,
599
- children,
600
- emptyMessage,
601
- defaultExpanded = true,
602
- maxHeight = 300
603
- }) {
604
- const [expanded, setExpanded] = useState(defaultExpanded);
605
- const isEmpty = count === 0;
606
- return /* @__PURE__ */ jsxs(
607
- "div",
608
- {
609
- style: {
610
- borderRadius: "8px",
611
- padding: "8px",
612
- border: "1px solid var(--color-border)",
613
- boxShadow: "var(--standard-box-shadow)"
614
- },
615
- children: [
616
- /* @__PURE__ */ jsxs(
617
- Group,
618
- {
619
- gap: "xs",
620
- mb: expanded ? "xs" : 0,
621
- justify: "space-between",
622
- align: "center",
623
- style: { cursor: "pointer" },
624
- onClick: () => setExpanded(!expanded),
625
- children: [
626
- /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "center", style: { flex: 1 }, children: [
627
- typeof title === "string" ? /* @__PURE__ */ jsx(
628
- Text,
629
- {
630
- fw: 600,
631
- size: "sm",
632
- c: "var(--color-text)",
633
- style: { fontFamily: "var(--elevasis-font-family-subtitle)" },
634
- children: title
635
- }
636
- ) : title,
637
- count !== void 0 && countLabel && /* @__PURE__ */ jsxs(Badge, { size: "sm", variant: "light", color: "gray", children: [
638
- count,
639
- " ",
640
- count === 1 ? countLabel.replace(/s$/, "") : countLabel
641
- ] })
642
- ] }),
643
- expanded ? /* @__PURE__ */ jsx(IconChevronUp, { size: 16 }) : /* @__PURE__ */ jsx(IconChevronDown, { size: 16 })
644
- ]
645
- }
646
- ),
647
- /* @__PURE__ */ jsx(Collapse, { in: expanded, children: isEmpty && emptyMessage ? /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: emptyMessage }) : /* @__PURE__ */ jsx(ScrollArea, { h: maxHeight, type: "scroll", offsetScrollbars: true, children }) })
648
- ]
649
- }
650
- );
651
- }
652
- var PageTitleCaption = ({ title, caption, rightSection }) => {
653
- const renderCaption = () => {
654
- if (!caption) return null;
655
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Text, { c: "dimmed", style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: caption }) });
656
- };
657
- const titleContent = /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column" }, children: [
658
- /* @__PURE__ */ jsx(Title, { order: 1, children: title }),
659
- /* @__PURE__ */ jsx(Space, { h: "4" }),
660
- renderCaption()
661
- ] });
662
- if (!rightSection) {
663
- return titleContent;
664
- }
665
- return /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "end", children: [
666
- titleContent,
667
- rightSection
668
- ] });
669
- };
670
- function StatsCardSkeleton({ chartHeight = 120, withChart = true, statCount = 3 }) {
671
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
672
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
673
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "xl", children: [
674
- /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
675
- statCount >= 2 && /* @__PURE__ */ jsx(Skeleton, { height: 60, width: 100 }),
676
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
677
- ] }),
678
- withChart && /* @__PURE__ */ jsx(Skeleton, { height: chartHeight })
679
- ] });
680
- }
681
- function ListSkeleton({ rows = 3, rowHeight = 50 }) {
682
- return /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: rowHeight }, i)) });
683
- }
684
- function DetailCardSkeleton({ rows = 3 }) {
685
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
686
- /* @__PURE__ */ jsx(Skeleton, { height: 24, width: 150, mb: "md" }),
687
- /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "lg", children: [
688
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
689
- /* @__PURE__ */ jsx(Skeleton, { height: 80, width: 100 }),
690
- /* @__PURE__ */ jsx(Skeleton, { height: 40, circle: true })
691
- ] }),
692
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: Array.from({ length: rows }, (_, i) => /* @__PURE__ */ jsx(Skeleton, { height: 60 }, i)) })
693
- ] });
694
- }
695
- function CustomSelector({
696
- value,
697
- onChange,
698
- data,
699
- leftSection,
700
- placeholder,
701
- w,
702
- withCheckIcon = false,
703
- disabled
704
- }) {
705
- return /* @__PURE__ */ jsx(
706
- Select,
707
- {
708
- value,
709
- onChange,
710
- data,
711
- leftSection,
712
- placeholder,
713
- w,
714
- size: "xs",
715
- variant: "unstyled",
716
- withCheckIcon,
717
- disabled,
718
- styles: {
719
- wrapper: {
720
- border: "1px solid var(--color-border)",
721
- borderRadius: "var(--mantine-radius-default)",
722
- backgroundColor: "var(--color-surface)",
723
- transition: "border-color 150ms ease, background-color 150ms ease",
724
- "&:hover": {
725
- borderColor: "var(--color-border-hover, var(--mantine-color-dark-3))"
726
- }
727
- },
728
- input: {
729
- fontSize: "var(--mantine-font-size-xs)",
730
- fontWeight: 500,
731
- height: "30px",
732
- minHeight: "30px",
733
- paddingLeft: leftSection ? "30px" : void 0,
734
- borderRadius: "var(--mantine-radius-default)",
735
- cursor: "pointer"
736
- },
737
- section: {
738
- color: "var(--color-text-subtle)"
739
- },
740
- dropdown: {
741
- border: "1px solid var(--color-border)",
742
- backgroundColor: "var(--color-surface)",
743
- boxShadow: "var(--card-shadow)"
744
- },
745
- option: {
746
- fontSize: "var(--mantine-font-size-xs)"
747
- }
748
- }
749
- }
750
- );
751
- }
752
- function APIErrorAlert({
753
- error,
754
- title,
755
- showRequestId = true,
756
- icon = /* @__PURE__ */ jsx(IconAlertCircle, {}),
757
- color = "red"
758
- }) {
759
- const { message, code, requestId, retryAfter } = getErrorInfo(error);
760
- const alertTitle = title || getErrorTitle(code);
761
- return /* @__PURE__ */ jsxs(Alert, { icon, title: alertTitle, color, variant: "light", children: [
762
- /* @__PURE__ */ jsx(Text, { size: "sm", children: message }),
763
- retryAfter && /* @__PURE__ */ jsxs(Text, { size: "sm", mt: "xs", children: [
764
- "Please wait ",
765
- retryAfter,
766
- " seconds before retrying."
767
- ] }),
768
- showRequestId && requestId && /* @__PURE__ */ jsxs(Text, { size: "xs", c: "dimmed", mt: "xs", children: [
769
- "Request ID: ",
770
- /* @__PURE__ */ jsx(Code, { children: requestId })
771
- ] })
772
- ] });
773
- }
774
-
775
- // src/components/display/StatCard.module.css.js
776
- var StatCard_module_css_default = { "heroCard": "heroCard", "iconRing": "iconRing", "iconRingSm": "iconRingSm", "heroValue": "heroValue", "heroValueSm": "heroValueSm", "heroLabel": "heroLabel", "heroLabelSm": "heroLabelSm" };
777
- function StatCard(props) {
778
- if (props.variant === "hero") {
779
- return /* @__PURE__ */ jsx(HeroStatCard, { ...props });
780
- }
781
- const { label, value, icon: IconComponent, color } = props;
782
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
783
- /* @__PURE__ */ jsx(ThemeIcon, { size: "lg", variant: "light", color, children: /* @__PURE__ */ jsx(IconComponent, { size: 18 }) }),
784
- /* @__PURE__ */ jsxs("div", { children: [
785
- /* @__PURE__ */ jsx(Text, { size: "xs", c: "dimmed", children: label }),
786
- /* @__PURE__ */ jsx(Text, { size: "lg", fw: 600, style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: value })
787
- ] })
788
- ] }) });
789
- }
790
- function HeroStatCard({
791
- icon: IconComponent,
792
- value,
793
- label,
794
- valueColor,
795
- isLoading,
796
- size = "sm",
797
- children
798
- }) {
799
- const sm = size === "sm";
800
- const iconSize = sm ? 36 : 46;
801
- if (isLoading) {
802
- 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: [
803
- /* @__PURE__ */ jsx(Skeleton, { circle: true, height: iconSize }),
804
- /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
805
- /* @__PURE__ */ jsx(Skeleton, { height: sm ? 24 : 32, width: 60 }),
806
- /* @__PURE__ */ jsx(Skeleton, { height: 12, width: 80 })
807
- ] })
808
- ] }) });
809
- }
810
- 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: [
811
- /* @__PURE__ */ jsx("div", { className: sm ? StatCard_module_css_default.iconRingSm : StatCard_module_css_default.iconRing, children: /* @__PURE__ */ jsx(IconComponent, { size: sm ? 18 : 22 }) }),
812
- /* @__PURE__ */ jsxs(Stack, { gap: 2, style: { flex: children ? 1 : void 0 }, children: [
813
- /* @__PURE__ */ jsx(
814
- "span",
815
- {
816
- className: sm ? StatCard_module_css_default.heroValueSm : StatCard_module_css_default.heroValue,
817
- style: valueColor ? { color: valueColor } : void 0,
818
- children: value
819
- }
820
- ),
821
- children ? /* @__PURE__ */ jsxs(Group, { gap: "sm", wrap: "nowrap", style: { flex: 1 }, children: [
822
- /* @__PURE__ */ jsx("span", { className: sm ? StatCard_module_css_default.heroLabelSm : StatCard_module_css_default.heroLabel, children: label }),
823
- /* @__PURE__ */ jsx("div", { style: { flex: 1 }, children })
824
- ] }) : /* @__PURE__ */ jsx("span", { className: sm ? StatCard_module_css_default.heroLabelSm : StatCard_module_css_default.heroLabel, children: label })
825
- ] })
826
- ] }) });
827
- }
828
- function StatCardSkeleton() {
829
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Skeleton, { height: 60 }) });
830
- }
831
- var customCodeTheme = Object.fromEntries(
832
- Object.entries(oneDark).map(([key, value]) => [
833
- key,
834
- typeof value === "object" && value !== null ? { ...value, background: "none", backgroundColor: "none" } : value
835
- ])
836
- );
837
- var defaultComponents = {
838
- h1: ({ children }) => /* @__PURE__ */ jsx(Title, { order: 3, c: "var(--color-primary)", mb: "xs", mt: "md", children }),
839
- h2: ({ children }) => /* @__PURE__ */ jsx(Title, { order: 4, c: "var(--color-primary)", mb: "xs", mt: "sm", children }),
840
- ul: ({ children }) => /* @__PURE__ */ jsx("ul", { style: { margin: "0.5rem 0", paddingLeft: "1.5rem" }, children }),
841
- ol: ({ children }) => /* @__PURE__ */ jsx("ol", { style: { margin: "0.5rem 0", paddingLeft: "1.5rem" }, children }),
842
- li: ({ children }) => /* @__PURE__ */ jsx("li", { style: { marginBottom: "0.25rem", fontSize: "var(--mantine-font-size-sm)" }, children }),
843
- code: ({ className, children, ...props }) => {
844
- const match = /language-(\w+)/.exec(className || "");
845
- const codeString = String(children).replace(/\n$/, "");
846
- if (match) {
847
- return /* @__PURE__ */ jsx(
848
- Prism,
849
- {
850
- style: customCodeTheme,
851
- language: match[1],
852
- PreTag: "div",
853
- customStyle: {
854
- margin: "0.5rem 0",
855
- borderRadius: "var(--mantine-radius-default)",
856
- fontSize: "0.8rem"
857
- },
858
- children: codeString
859
- }
860
- );
861
- }
862
- return /* @__PURE__ */ jsx(Code, { ...props, children });
863
- },
864
- pre: ({ children }) => /* @__PURE__ */ jsx(Fragment, { children }),
865
- blockquote: ({ children }) => /* @__PURE__ */ jsx(Box, { pl: "sm", my: "xs", style: { borderLeft: "2px solid var(--color-border)" }, children }),
866
- p: ({ children }) => /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children }),
867
- strong: ({ children }) => /* @__PURE__ */ jsx(Text, { component: "span", fw: 700, children }),
868
- em: ({ children }) => /* @__PURE__ */ jsx(Text, { component: "span", fs: "italic", children })
869
- };
870
- function StyledMarkdown({ children, components, className, style }) {
871
- const mergedComponents = components ? { ...defaultComponents, ...components } : defaultComponents;
872
- return /* @__PURE__ */ jsx("div", { className, style, children: /* @__PURE__ */ jsx(Markdown, { components: mergedComponents, children }) });
873
- }
874
- var jsonTheme = Object.fromEntries(
875
- Object.entries(oneDark).map(([key, value]) => [
876
- key,
877
- typeof value === "object" && value !== null ? { ...value, background: "none", backgroundColor: "none" } : value
878
- ])
879
- );
880
- function JsonViewer({ data, maxHeight, fontSize = "0.8rem" }) {
881
- const jsonString = typeof data === "string" ? data : JSON.stringify(data, null, 2);
882
- return /* @__PURE__ */ jsx(
883
- Prism,
884
- {
885
- language: "json",
886
- style: jsonTheme,
887
- customStyle: {
888
- margin: 0,
889
- fontSize,
890
- maxHeight,
891
- overflow: maxHeight ? "auto" : void 0,
892
- overflowX: "auto"
893
- },
894
- children: jsonString
895
- }
896
- );
897
- }
898
- var subtleMarkdownComponents = {
899
- p: ({ children }) => /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, c: "var(--color-text-subtle)", style: { whiteSpace: "pre-wrap" }, children })
900
- };
901
- var subtleMarkdownWrapperStyle = {
902
- display: "flex",
903
- flexDirection: "column",
904
- gap: 8
905
- };
906
- function ContextViewer({ data }) {
907
- return /* @__PURE__ */ jsx(ContextNode, { data, depth: 0 });
908
- }
909
- function ContextNode({ data, depth }) {
910
- if (data === null || data === void 0) {
911
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "No context provided" });
912
- }
913
- if (typeof data === "string") {
914
- return /* @__PURE__ */ jsx(StyledMarkdown, { components: subtleMarkdownComponents, style: subtleMarkdownWrapperStyle, children: data });
915
- }
916
- if (typeof data === "number" || typeof data === "boolean") {
917
- return /* @__PURE__ */ jsx(Text, { size: "sm", children: String(data) });
918
- }
919
- if (Array.isArray(data)) {
920
- return /* @__PURE__ */ jsx(ArrayView, { items: data, depth });
921
- }
922
- if (typeof data === "object") {
923
- return /* @__PURE__ */ jsx(ObjectView, { data, depth });
924
- }
925
- return /* @__PURE__ */ jsx(Text, { size: "sm", children: String(data) });
926
- }
927
- function formatLabel(key) {
928
- return key.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
929
- }
930
- function hasMarkdown(value) {
931
- return /(\*\*.+\*\*|^#{1,6}\s|^\s*[-*]\s|\[.+\]\(.+\)|^\|.+\|$|^>\s|```)/.test(value);
932
- }
933
- function NestedSection({ title, children }) {
934
- const [expanded, setExpanded] = useState(true);
935
- return /* @__PURE__ */ jsxs(Stack, { gap: 6, children: [
936
- /* @__PURE__ */ jsxs(Group, { gap: 4, style: { cursor: "pointer", userSelect: "none" }, onClick: () => setExpanded((v) => !v), children: [
937
- /* @__PURE__ */ jsx(
938
- IconChevronRight,
939
- {
940
- size: 14,
941
- color: "var(--color-primary)",
942
- style: {
943
- transition: "transform 150ms ease",
944
- transform: expanded ? "rotate(90deg)" : "rotate(0deg)",
945
- flexShrink: 0
946
- }
947
- }
948
- ),
949
- /* @__PURE__ */ jsx(Text, { size: "sm", fw: 600, style: { fontFamily: "var(--mantine-font-family-headings)" }, children: title })
950
- ] }),
951
- expanded && /* @__PURE__ */ jsx(Box, { pl: "sm", style: { borderLeft: "2px solid var(--color-border)" }, children })
952
- ] });
953
- }
954
- function PrimitiveValue({ value }) {
955
- if (value === null || value === void 0) {
956
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "\u2014" });
957
- }
958
- if (typeof value === "boolean") {
959
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children: value ? "Yes" : "No" });
960
- }
961
- if (typeof value === "number") {
962
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, children: value.toLocaleString() });
963
- }
964
- const str = String(value);
965
- if (hasMarkdown(str)) {
966
- return /* @__PURE__ */ jsx(StyledMarkdown, { components: subtleMarkdownComponents, children: str });
967
- }
968
- return /* @__PURE__ */ jsx(Text, { size: "sm", m: 0, c: "var(--color-text-subtle)", style: { whiteSpace: "pre-wrap" }, children: str });
969
- }
970
- function ArrayView({ items, depth }) {
971
- if (items.length === 0) {
972
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "Empty list" });
973
- }
974
- const allPrimitive = items.every((item) => typeof item !== "object" || item === null);
975
- if (allPrimitive) {
976
- return /* @__PURE__ */ jsx(Stack, { gap: 2, children: items.map((item, i) => /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "flex-start", children: [
977
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { userSelect: "none" }, children: "\u2022" }),
978
- /* @__PURE__ */ jsx(PrimitiveValue, { value: item })
979
- ] }, i)) });
980
- }
981
- return /* @__PURE__ */ jsx(Stack, { gap: "sm", children: items.map((item, i) => /* @__PURE__ */ jsx(Paper, { p: "sm", style: { border: "1px solid var(--color-border)" }, children: /* @__PURE__ */ jsx(ContextNode, { data: item, depth: depth + 1 }) }, i)) });
982
- }
983
- function ObjectView({ data, depth }) {
984
- const entries = Object.entries(data);
985
- if (entries.length === 0) {
986
- return /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", fs: "italic", children: "Empty" });
987
- }
988
- const simpleEntries = [];
989
- const complexEntries = [];
990
- for (const [key, value] of entries) {
991
- if (value === null || value === void 0 || typeof value === "boolean" || typeof value === "number") {
992
- simpleEntries.push([key, value]);
993
- } else if (typeof value === "string") {
994
- if (hasMarkdown(value) || value.length > 120) {
995
- complexEntries.push([key, value]);
996
- } else {
997
- simpleEntries.push([key, value]);
998
- }
999
- } else {
1000
- complexEntries.push([key, value]);
1001
- }
1002
- }
1003
- return /* @__PURE__ */ jsxs(Stack, { gap: 10, children: [
1004
- simpleEntries.length > 0 && /* @__PURE__ */ jsx(Stack, { gap: 6, children: simpleEntries.map(([key, value]) => /* @__PURE__ */ jsxs(Group, { gap: "sm", align: "flex-start", wrap: "nowrap", children: [
1005
- /* @__PURE__ */ jsx(
1006
- Text,
1007
- {
1008
- size: "sm",
1009
- style: { minWidth: 140, flexShrink: 0, fontFamily: "var(--mantine-font-family-headings)" },
1010
- children: formatLabel(key)
1011
- }
1012
- ),
1013
- /* @__PURE__ */ jsx(PrimitiveValue, { value })
1014
- ] }, key)) }),
1015
- complexEntries.map(([key, value]) => /* @__PURE__ */ jsx(NestedSection, { title: formatLabel(key), children: /* @__PURE__ */ jsx(ContextNode, { data: value, depth: depth + 1 }) }, key))
1016
- ] });
1017
- }
1018
- var TIME_RANGE_OPTIONS = [
1019
- { value: "1h", label: "Last 1 hour" },
1020
- { value: "24h", label: "Last 24 hours" },
1021
- { value: "7d", label: "Last 7 days" },
1022
- { value: "30d", label: "Last 30 days" }
1023
- ];
1024
- function TimeRangeSelector({ value, onChange, width = 180 }) {
1025
- return /* @__PURE__ */ jsx(
1026
- CustomSelector,
1027
- {
1028
- value,
1029
- onChange: (newValue) => newValue && onChange(newValue),
1030
- data: TIME_RANGE_OPTIONS,
1031
- leftSection: /* @__PURE__ */ jsx(IconClock, { size: 16, color: "var(--color-text-subtle)" }),
1032
- w: width,
1033
- withCheckIcon: true
1034
- }
1035
- );
1036
- }
1037
- function PageNotFound() {
1038
- const { currentPath, navigate } = useRouterContext();
1039
- const { user, isLoading } = useAuthContext();
1040
- const isAuthPage = currentPath === "/login" || currentPath === "/auth-redirect";
1041
- const shouldShowSidebar = user && !isLoading && !isAuthPage;
1042
- const height = shouldShowSidebar ? "100%" : "100vh";
1043
- return /* @__PURE__ */ jsx(Center, { h: height, bg: "var(--color-background)", children: /* @__PURE__ */ jsxs(Stack, { align: "center", justify: "center", children: [
1044
- /* @__PURE__ */ jsx(IconInfoCircle, { size: 60, color: "var(--color-text-subtle)" }),
1045
- /* @__PURE__ */ jsx(Title, { order: 1, children: "Page Not Found" }),
1046
- /* @__PURE__ */ jsx(Text, { c: "dimmed", size: "lg", children: "The page you are looking for does not exist." }),
1047
- /* @__PURE__ */ jsx(Group, { justify: "center", children: /* @__PURE__ */ jsx(Button, { size: "md", onClick: () => navigate("/"), children: "Go Home" }) })
1048
- ] }) });
1049
- }
1050
- function ResourceCard({
1051
- resource,
1052
- onClick,
1053
- layout = "stack",
1054
- rightSection,
1055
- topSection,
1056
- lastRunLabel,
1057
- dormant = false,
1058
- style,
1059
- ...rest
1060
- }) {
1061
- const Icon = getResourceIcon(resource.type);
1062
- if (!Icon) {
1063
- return /* @__PURE__ */ jsx(Card, { shadow: "sm", withBorder: true, children: /* @__PURE__ */ jsxs(Text, { children: [
1064
- "Invalid resource type: ",
1065
- resource.type
1066
- ] }) });
1067
- }
1068
- const cardStyle = {
1069
- cursor: "pointer",
1070
- ...layout === "grid" || layout === "card" ? { transition: "box-shadow var(--duration-fast) var(--easing)" } : {},
1071
- ...style
1072
- };
1073
- const iconSize = layout === "grid" ? 28 : 20;
1074
- const details = /* @__PURE__ */ jsxs(Group, { gap: "sm", wrap: "nowrap", children: [
1075
- /* @__PURE__ */ jsx(Icon, { size: iconSize, color: "var(--color-primary)" }),
1076
- /* @__PURE__ */ jsxs(Stack, { gap: 4, style: { flex: 1, minWidth: 0 }, children: [
1077
- /* @__PURE__ */ jsxs(Group, { gap: "xs", align: "center", children: [
1078
- /* @__PURE__ */ jsx(
1079
- Text,
1080
- {
1081
- fw: 600,
1082
- size: "sm",
1083
- style: { fontFamily: "var(--elevasis-font-family-subtitle)" },
1084
- ...layout === "stack" ? { lineClamp: 1 } : { truncate: true },
1085
- children: resource.name
1086
- }
1087
- ),
1088
- /* @__PURE__ */ jsx(Badge, { variant: "light", size: layout === "grid" ? "xs" : "sm", children: resource.type })
1089
- ] }),
1090
- resource.description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", ...layout === "stack" ? { lineClamp: 1 } : { truncate: true }, children: resource.description }),
1091
- /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
1092
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "outline", size: "xs", children: [
1093
- "v",
1094
- resource.version
1095
- ] }),
1096
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "outline", size: layout === "grid" ? "xs" : "sm", children: resource.status.toUpperCase() })
1097
- ] }),
1098
- lastRunLabel && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", children: lastRunLabel }),
1099
- /* @__PURE__ */ jsx(Text, { size: layout === "grid" ? "sm" : "xs", c: "dimmed", ff: "monospace", children: resource.resourceId })
1100
- ] })
1101
- ] });
1102
- if (layout === "card") {
1103
- return /* @__PURE__ */ jsx(
1104
- Card,
1105
- {
1106
- withBorder: true,
1107
- padding: 0,
1108
- style: cardStyle,
1109
- onClick: () => onClick(resource),
1110
- "data-resource-id": rest["data-resource-id"],
1111
- children: /* @__PURE__ */ jsxs(Stack, { gap: 8, p: "sm", pb: "xs", children: [
1112
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", justify: "space-between", children: [
1113
- /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { minWidth: 0 }, children: [
1114
- /* @__PURE__ */ jsx(Icon, { size: 20, color: "var(--color-primary)", style: { flexShrink: 0 } }),
1115
- /* @__PURE__ */ jsx(Text, { fw: 600, size: "md", style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, truncate: true, children: resource.name })
1116
- ] }),
1117
- /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", style: { flexShrink: 0 }, children: [
1118
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "light", size: "sm", children: [
1119
- "v",
1120
- resource.version
1121
- ] }),
1122
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "light", size: "sm", children: resource.status.toUpperCase() })
1123
- ] })
1124
- ] }),
1125
- resource.description && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, children: resource.description }),
1126
- /* @__PURE__ */ jsxs(Group, { gap: "xs", justify: "space-between", wrap: "nowrap", children: [
1127
- rightSection || /* @__PURE__ */ jsx("span", {}),
1128
- lastRunLabel && /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap" }, children: lastRunLabel })
1129
- ] }),
1130
- topSection
1131
- ] })
1132
- }
1133
- );
1134
- }
1135
- if (layout === "row") {
1136
- const [hovered, setHovered] = useState(false);
1137
- const baseBackground = dormant ? "var(--glass-background)" : "var(--color-surface)";
1138
- return /* @__PURE__ */ jsx(
1139
- Card,
1140
- {
1141
- padding: 0,
1142
- style: {
1143
- cursor: "pointer",
1144
- border: "1px solid var(--color-border)",
1145
- transition: "background 150ms ease",
1146
- background: hovered ? "var(--active-background)" : baseBackground,
1147
- ...dormant ? { backdropFilter: "var(--glass-blur)", WebkitBackdropFilter: "var(--glass-blur)" } : {},
1148
- ...style
1149
- },
1150
- onClick: () => onClick(resource),
1151
- onMouseEnter: () => setHovered(true),
1152
- onMouseLeave: () => setHovered(false),
1153
- "data-resource-id": rest["data-resource-id"],
1154
- children: /* @__PURE__ */ jsxs(
1155
- "div",
1156
- {
1157
- style: {
1158
- display: "grid",
1159
- gridTemplateColumns: "18px 200px 120px 1fr 180px 140px 14px",
1160
- alignItems: "center",
1161
- gap: "var(--mantine-spacing-sm)"
1162
- },
1163
- children: [
1164
- /* @__PURE__ */ jsx(Icon, { size: 18, color: "var(--color-primary)" }),
1165
- /* @__PURE__ */ jsx(Text, { fw: 600, size: "md", truncate: true, style: { fontFamily: "var(--elevasis-font-family-subtitle)" }, children: resource.name }),
1166
- /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", children: [
1167
- resource.version && /* @__PURE__ */ jsxs(Badge, { variant: "light", size: "sm", children: [
1168
- "v",
1169
- resource.version
1170
- ] }),
1171
- /* @__PURE__ */ jsx(Badge, { color: ResourceStatusColors[resource.status], variant: "light", size: "sm", children: resource.status.toUpperCase() })
1172
- ] }),
1173
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", truncate: true, style: { minWidth: 0 }, children: resource.description || "" }),
1174
- /* @__PURE__ */ jsx("div", { style: { whiteSpace: "nowrap" }, children: rightSection }),
1175
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", style: { whiteSpace: "nowrap", textAlign: "right" }, children: lastRunLabel || "" }),
1176
- /* @__PURE__ */ jsx(
1177
- IconChevronRight,
1178
- {
1179
- size: 14,
1180
- style: {
1181
- opacity: hovered ? 0.7 : 0,
1182
- transition: "opacity 150ms ease"
1183
- }
1184
- }
1185
- )
1186
- ]
1187
- }
1188
- )
1189
- }
1190
- );
1191
- }
1192
- if (layout === "grid") {
1193
- return /* @__PURE__ */ jsx(
1194
- Card,
1195
- {
1196
- withBorder: true,
1197
- padding: "sm",
1198
- style: cardStyle,
1199
- onClick: () => onClick(resource),
1200
- "data-resource-id": rest["data-resource-id"],
1201
- children: /* @__PURE__ */ jsxs(Grid, { gutter: "sm", align: "center", children: [
1202
- /* @__PURE__ */ jsx(Grid.Col, { span: 8, children: details }),
1203
- rightSection && /* @__PURE__ */ jsx(Grid.Col, { span: 4, children: /* @__PURE__ */ jsx(Group, { justify: "flex-end", gap: "md", wrap: "nowrap", children: rightSection }) })
1204
- ] })
1205
- }
1206
- );
1207
- }
1208
- return /* @__PURE__ */ jsx(
1209
- Card,
1210
- {
1211
- shadow: "sm",
1212
- withBorder: true,
1213
- style: cardStyle,
1214
- onClick: () => onClick(resource),
1215
- "data-resource-id": rest["data-resource-id"],
1216
- children: /* @__PURE__ */ jsx(Stack, { children: details })
1217
- }
1218
- );
1219
- }
1220
-
1221
- // src/components/display/ResourceCardAdapters.ts
1222
- function catalogItemToResourceDefinition(item) {
1223
- return {
1224
- resourceId: item.resourceId,
1225
- name: item.resourceName,
1226
- description: item.description || "",
1227
- version: item.version,
1228
- type: item.resourceType,
1229
- status: item.status
1230
- };
1231
- }
1232
- function CardHeader({ icon, title, subtitle, rightSection }) {
1233
- return /* @__PURE__ */ jsxs(Group, { justify: "space-between", mb: "md", children: [
1234
- subtitle ? /* @__PURE__ */ jsxs("div", { children: [
1235
- /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
1236
- icon,
1237
- /* @__PURE__ */ jsx(Title, { order: 3, children: title })
1238
- ] }),
1239
- /* @__PURE__ */ jsx(Text, { size: "sm", c: "dimmed", mt: 2, children: subtitle })
1240
- ] }) : /* @__PURE__ */ jsxs(Group, { gap: "xs", children: [
1241
- icon,
1242
- /* @__PURE__ */ jsx(Title, { order: 3, children: title })
1243
- ] }),
1244
- rightSection
1245
- ] });
1246
- }
1247
- var SIZE_MAP = {
1248
- sm: { dot: 7, inner: 6, outer: 12 },
1249
- md: { dot: 10, inner: 8, outer: 16 },
1250
- lg: { dot: 12, inner: 10, outer: 20 }
1251
- };
1252
- function GlowDot({ color, size = "md" }) {
1253
- const { dot, inner, outer } = SIZE_MAP[size];
1254
- return /* @__PURE__ */ jsx(
1255
- "div",
1256
- {
1257
- style: {
1258
- width: dot,
1259
- height: dot,
1260
- borderRadius: "50%",
1261
- backgroundColor: color,
1262
- boxShadow: `0 0 ${inner}px ${color}, 0 0 ${outer}px ${color}40`,
1263
- flexShrink: 0
1264
- }
1265
- }
1266
- );
1267
- }
1268
575
  var GRANULARITY_MAP = {
1269
576
  "1h": "hour",
1270
577
  "24h": "hour",
@@ -1309,8 +616,15 @@ function ActivityTrendChart({ timestamps, total, isLoading, timeRange }) {
1309
616
  if (isLoading) {
1310
617
  return /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) });
1311
618
  }
1312
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
1313
- /* @__PURE__ */ jsx(CardHeader, { title: "Activity Trend", subtitle: `${total} activities in ${getTimeRangeLabel(timeRange)}` }),
619
+ return /* @__PURE__ */ jsxs(Paper, { withBorder: true, children: [
620
+ /* @__PURE__ */ jsx(
621
+ CardHeader,
622
+ {
623
+ icon: /* @__PURE__ */ jsx(IconActivity, { size: 18 }),
624
+ title: "Activity Trend",
625
+ subtitle: `${total} activities in ${getTimeRangeLabel(timeRange)}`
626
+ }
627
+ ),
1314
628
  /* @__PURE__ */ jsx(
1315
629
  CyberAreaChart,
1316
630
  {
@@ -1366,13 +680,14 @@ function CostTrendChart({ data, summaryData, isLoading, error }) {
1366
680
  return /* @__PURE__ */ jsx(APIErrorAlert, { error, title: "Failed to load cost trends" });
1367
681
  }
1368
682
  if (isLoading) {
1369
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) });
683
+ return /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) });
1370
684
  }
1371
685
  const granularityLabel = data?.granularity === "hour" ? "Hourly" : "Daily";
1372
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
686
+ return /* @__PURE__ */ jsxs(Paper, { withBorder: true, children: [
1373
687
  /* @__PURE__ */ jsx(
1374
688
  CardHeader,
1375
689
  {
690
+ icon: /* @__PURE__ */ jsx(IconChartLine, { size: 18 }),
1376
691
  title: `Cost Trend (${granularityLabel})`,
1377
692
  rightSection: /* @__PURE__ */ jsx(Button, { variant: "subtle", size: "xs", leftSection: /* @__PURE__ */ jsx(IconDownload, { size: 14 }), onClick: handleExport, children: "Export CSV" })
1378
693
  }
@@ -1541,7 +856,7 @@ function CombinedTrendChart({
1541
856
  return /* @__PURE__ */ jsx(APIErrorAlert, { error, title: "Failed to load trend data" });
1542
857
  }
1543
858
  if (isLoading) {
1544
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) });
859
+ return /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { p: "xl", children: /* @__PURE__ */ jsx(Loader, {}) }) });
1545
860
  }
1546
861
  const errorTrendsMap = new Map(errorTrends?.map((trend) => [trend.time, trend.errorCount]) || []);
1547
862
  const successErrorData = healthData?.trendData.length ? healthData.trendData.map((d) => {
@@ -1560,12 +875,13 @@ function CombinedTrendChart({
1560
875
  const peakPeriod = healthData?.peakPeriod ?? "";
1561
876
  const dataGranularity = healthData?.granularity ?? granularity;
1562
877
  if (!successErrorData.length) {
1563
- return /* @__PURE__ */ jsx(Card, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { h: 300, children: /* @__PURE__ */ jsx(Alert, { icon: /* @__PURE__ */ jsx(IconAlertCircle, {}), color: "gray", variant: "light", children: "No trend data available for the selected time range" }) }) });
878
+ return /* @__PURE__ */ jsx(Paper, { withBorder: true, children: /* @__PURE__ */ jsx(Center, { h: 300, children: /* @__PURE__ */ jsx(Alert, { icon: /* @__PURE__ */ jsx(IconAlertCircle, {}), color: "gray", variant: "light", children: "No trend data available for the selected time range" }) }) });
1564
879
  }
1565
- return /* @__PURE__ */ jsxs(Card, { withBorder: true, children: [
880
+ return /* @__PURE__ */ jsxs(Paper, { withBorder: true, children: [
1566
881
  /* @__PURE__ */ jsx(
1567
882
  CardHeader,
1568
883
  {
884
+ icon: /* @__PURE__ */ jsx(IconChartLine, { size: 18 }),
1569
885
  title: "Execution Trends",
1570
886
  subtitle: `${getTimeRangeLabel(timeRange)} - ${dataGranularity === "hour" ? "Hourly" : "Daily"} data`,
1571
887
  rightSection: /* @__PURE__ */ jsxs(Group, { gap: "sm", children: [
@@ -1631,4 +947,4 @@ function CombinedTrendChart({
1631
947
  ] });
1632
948
  }
1633
949
 
1634
- export { APIErrorAlert, ActivityTrendChart, CardHeader, ChartFrame, CollapsibleSection, CombinedTrendChart, ContextViewer, CostTrendChart, CustomSelector, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, DetailCardSkeleton, EmptyState, GlowDot, HeroStatsRow, JsonViewer, ListSkeleton, PageNotFound, PageTitleCaption, ResourceCard, StatCard, StatCardSkeleton, StatsCardSkeleton, StyledMarkdown, TabCountBadge, TimeRangeSelector, TrendIndicator, catalogItemToResourceDefinition, getSeriesColor, useCyberColors };
950
+ export { ActivityTrendChart, ChartFrame, CombinedTrendChart, CostTrendChart, CyberAreaChart, CyberDonut, CyberDonutTooltip, CyberLegendItem, HeroStatsRow, getSeriesColor, useCyberColors };