@replicated/portal-components 0.0.11 → 0.0.12

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 (51) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/datadog/tracer.d.ts +3 -0
  4. package/datadog/tracer.js +82 -0
  5. package/datadog/tracer.ts +101 -0
  6. package/dist/esm/index.js +91 -64
  7. package/dist/esm/index.js.map +1 -1
  8. package/dist/esm/install-card.js +8 -21
  9. package/dist/esm/install-card.js.map +1 -1
  10. package/dist/esm/license-card.js +8 -12
  11. package/dist/esm/license-card.js.map +1 -1
  12. package/dist/esm/license-details.js +1 -1
  13. package/dist/esm/license-details.js.map +1 -1
  14. package/dist/esm/support-card.js +4 -6
  15. package/dist/esm/support-card.js.map +1 -1
  16. package/dist/esm/team-settings-card.js +8 -13
  17. package/dist/esm/team-settings-card.js.map +1 -1
  18. package/dist/esm/top-nav.js +69 -29
  19. package/dist/esm/top-nav.js.map +1 -1
  20. package/dist/esm/update-layout.js +69 -29
  21. package/dist/esm/update-layout.js.map +1 -1
  22. package/dist/esm/updates-card.js +8 -14
  23. package/dist/esm/updates-card.js.map +1 -1
  24. package/dist/esm/utils/observability/index.js +193 -0
  25. package/dist/esm/utils/observability/index.js.map +1 -0
  26. package/dist/index.js +91 -64
  27. package/dist/index.js.map +1 -1
  28. package/dist/install-card.js +8 -21
  29. package/dist/install-card.js.map +1 -1
  30. package/dist/license-card.js +8 -12
  31. package/dist/license-card.js.map +1 -1
  32. package/dist/license-details.js +1 -1
  33. package/dist/license-details.js.map +1 -1
  34. package/dist/styles.css +2 -2
  35. package/dist/support-card.js +4 -6
  36. package/dist/support-card.js.map +1 -1
  37. package/dist/team-settings-card.js +8 -13
  38. package/dist/team-settings-card.js.map +1 -1
  39. package/dist/top-nav.js +69 -29
  40. package/dist/top-nav.js.map +1 -1
  41. package/dist/update-layout.js +69 -29
  42. package/dist/update-layout.js.map +1 -1
  43. package/dist/updates-card.js +8 -14
  44. package/dist/updates-card.js.map +1 -1
  45. package/dist/utils/observability/index.d.mts +13 -0
  46. package/dist/utils/observability/index.d.ts +13 -0
  47. package/dist/utils/observability/index.js +198 -0
  48. package/dist/utils/observability/index.js.map +1 -0
  49. package/instrumentation.d.ts +8 -0
  50. package/instrumentation.js +22 -0
  51. package/package.json +16 -3
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.11",
3
- "generatedAt": "2026-01-12T15:51:07Z",
2
+ "version": "0.0.12",
3
+ "generatedAt": "2026-01-14T21:54:09.489Z",
4
4
  "components": [
5
5
  {
6
6
  "name": "Button",
@@ -1,7 +1,7 @@
1
1
  # Component Registry
2
2
 
3
- - Version: 0.0.11
4
- - Generated: 2026-01-12T15:51:07Z
3
+ - Version: 0.0.12
4
+ - Generated: 2026-01-14T21:54:09.489Z
5
5
 
6
6
  ## Button
7
7
 
@@ -0,0 +1,3 @@
1
+ import type { Tracer } from 'dd-trace';
2
+ declare let tracer: Tracer | null;
3
+ export default tracer;
@@ -0,0 +1,82 @@
1
+ const rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();
2
+ const isEnabled = rawFlag === 'true';
3
+ process.env.DD_TRACE_ENABLED = isEnabled ? '1' : '0';
4
+ let tracer = null;
5
+ if (isEnabled) {
6
+ const serviceName = process.env.DD_SERVICE || 'enterprise-portal';
7
+ const environment = process.env.DD_ENV || process.env.NODE_ENV || 'development';
8
+ const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || '0.0.0-dev';
9
+ const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || '127.0.0.1';
10
+ const agentPort = process.env.DD_TRACE_AGENT_PORT || '8126';
11
+ process.env.DD_SERVICE = serviceName;
12
+ process.env.DD_ENV = environment;
13
+ if (version) {
14
+ process.env.DD_VERSION = version;
15
+ }
16
+ process.env.DD_AGENT_HOST = agentHost;
17
+ process.env.DD_TRACE_AGENT_PORT = agentPort;
18
+ const dbmPropagationMode = (process.env.DD_DBM_PROPAGATION_MODE || 'full');
19
+ process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
20
+ try {
21
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
22
+ const ddTrace = require('dd-trace');
23
+ tracer = ddTrace.init({
24
+ service: serviceName,
25
+ env: environment,
26
+ version,
27
+ logInjection: true,
28
+ runtimeMetrics: true,
29
+ appsec: false,
30
+ profiling: false,
31
+ startupLogs: true, // Enable for debugging
32
+ });
33
+ console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
34
+ // Disable low-level network instrumentation for localhost connections
35
+ tracer.use('dns', false);
36
+ tracer.use('net', false);
37
+ // Configure http plugin to normalize route patterns
38
+ tracer.use('http', {
39
+ server: {
40
+ hooks: {
41
+ request: (span, req) => {
42
+ if (!span)
43
+ return;
44
+ const url = req?.url || '';
45
+ const method = req?.method || 'GET';
46
+ const path = url.split('?')[0];
47
+ // Drop Next.js internal requests
48
+ if (path.startsWith('/_next/')) {
49
+ // @ts-expect-error - using internal property to drop the trace
50
+ span.context()._trace.isRecording = false;
51
+ return;
52
+ }
53
+ const routePattern = getRoutePattern(path);
54
+ span.setTag('resource.name', `${method} ${routePattern}`);
55
+ span.setTag('http.route', routePattern);
56
+ }
57
+ }
58
+ }
59
+ });
60
+ }
61
+ catch (err) {
62
+ // Do not crash the app if tracing fails to initialize
63
+ console.error('[datadog] failed to initialize tracing', err);
64
+ tracer = null;
65
+ }
66
+ }
67
+ // Function to convert actual paths to route patterns
68
+ const getRoutePattern = (path) => {
69
+ // Define route patterns for dynamic routes in enterprise portal
70
+ const routePatterns = [
71
+ // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
72
+ { pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: '/update/instance/[instanceId]$1' },
73
+ ];
74
+ for (const { pattern, replacement } of routePatterns) {
75
+ if (pattern.test(path)) {
76
+ return path.replace(pattern, replacement);
77
+ }
78
+ }
79
+ // Return original path if no pattern matches
80
+ return path;
81
+ };
82
+ export default tracer;
@@ -0,0 +1,101 @@
1
+ import type { Tracer, Span, init as ddTraceInit } from 'dd-trace';
2
+ import type { IncomingMessage } from 'http';
3
+
4
+ const rawFlag = String(process.env.USE_DATADOG_APM || '').toLowerCase();
5
+ const isEnabled = rawFlag === 'true';
6
+
7
+ process.env.DD_TRACE_ENABLED = isEnabled ? '1' : '0';
8
+
9
+ let tracer: Tracer | null = null;
10
+
11
+ if (isEnabled) {
12
+ const serviceName = process.env.DD_SERVICE || 'enterprise-portal';
13
+ const environment = process.env.DD_ENV || process.env.NODE_ENV || 'development';
14
+ const version = process.env.DD_VERSION || process.env.NEXT_PUBLIC_VERSION || '0.0.0-dev';
15
+
16
+ const agentHost = process.env.DD_AGENT_HOST || process.env.DATADOG_AGENT_HOST || '127.0.0.1';
17
+ const agentPort = process.env.DD_TRACE_AGENT_PORT || '8126';
18
+
19
+ process.env.DD_SERVICE = serviceName;
20
+ process.env.DD_ENV = environment;
21
+ if (version) {
22
+ process.env.DD_VERSION = version;
23
+ }
24
+ process.env.DD_AGENT_HOST = agentHost;
25
+ process.env.DD_TRACE_AGENT_PORT = agentPort;
26
+
27
+ const dbmPropagationMode = (process.env.DD_DBM_PROPAGATION_MODE || 'full') as 'disabled' | 'service' | 'full';
28
+
29
+ process.env.DD_DBM_PROPAGATION_MODE = dbmPropagationMode;
30
+
31
+ try {
32
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
33
+ const ddTrace = require('dd-trace');
34
+ tracer = (ddTrace.init as typeof ddTraceInit)({
35
+ service: serviceName,
36
+ env: environment,
37
+ version,
38
+ logInjection: true,
39
+ runtimeMetrics: true,
40
+ appsec: false,
41
+ profiling: false,
42
+ startupLogs: true, // Enable for debugging
43
+ }) as Tracer;
44
+
45
+ console.log(`[datadog] Tracer initialized: service=${serviceName}, env=${environment}, version=${version}, agent=${agentHost}:${agentPort}`);
46
+
47
+ // Disable low-level network instrumentation for localhost connections
48
+ tracer.use('dns', false);
49
+ tracer.use('net', false);
50
+ // Configure http plugin to normalize route patterns
51
+ tracer.use('http', {
52
+ server: {
53
+ hooks: {
54
+ request: (span?: Span, req?: IncomingMessage) => {
55
+ if (!span) return;
56
+
57
+ const url = req?.url || '';
58
+ const method = req?.method || 'GET';
59
+ const path = url.split('?')[0];
60
+
61
+ // Drop Next.js internal requests
62
+ if (path.startsWith('/_next/')) {
63
+ // @ts-expect-error - using internal property to drop the trace
64
+ span.context()._trace.isRecording = false;
65
+ return;
66
+ }
67
+
68
+ const routePattern = getRoutePattern(path);
69
+
70
+ span.setTag('resource.name', `${method} ${routePattern}`);
71
+ span.setTag('http.route', routePattern);
72
+ }
73
+ }
74
+ }
75
+ });
76
+ } catch (err) {
77
+ // Do not crash the app if tracing fails to initialize
78
+ console.error('[datadog] failed to initialize tracing', err);
79
+ tracer = null;
80
+ }
81
+ }
82
+
83
+ // Function to convert actual paths to route patterns
84
+ const getRoutePattern = (path: string): string => {
85
+ // Define route patterns for dynamic routes in enterprise portal
86
+ const routePatterns = [
87
+ // Update instance routes - normalize dynamic segments (capture suffix to preserve sub-routes)
88
+ { pattern: /^\/update\/instance\/[^/]+(.*)$/, replacement: '/update/instance/[instanceId]$1' },
89
+ ];
90
+
91
+ for (const { pattern, replacement } of routePatterns) {
92
+ if (pattern.test(path)) {
93
+ return path.replace(pattern, replacement);
94
+ }
95
+ }
96
+
97
+ // Return original path if no pattern matches
98
+ return path;
99
+ }
100
+
101
+ export default tracer;
package/dist/esm/index.js CHANGED
@@ -10,7 +10,7 @@ import Link from 'next/link';
10
10
 
11
11
  // package.json
12
12
  var package_default = {
13
- version: "0.0.11"};
13
+ version: "0.0.12"};
14
14
 
15
15
  // src/tokens/index.ts
16
16
  var baseTokens = {
@@ -1447,7 +1447,7 @@ var LicenseDetails = async ({
1447
1447
  console.debug("[portal-components] license response", response.raw);
1448
1448
  const { license } = response;
1449
1449
  const rows = buildPrimaryRows(license);
1450
- return /* @__PURE__ */ jsxs("div", { className: "rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1450
+ return /* @__PURE__ */ jsxs("div", { className: "rounded border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
1451
1451
  /* @__PURE__ */ jsxs("header", { className: "flex flex-col border-b border-gray-100 pb-6", children: [
1452
1452
  /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold text-gray-900", children: title }),
1453
1453
  description ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600", children: description }) : null
@@ -1474,10 +1474,14 @@ var defaultTopNavLinks = [
1474
1474
  className: "h-4 w-4",
1475
1475
  fill: "none",
1476
1476
  stroke: "currentColor",
1477
- strokeWidth: "1.5",
1477
+ strokeWidth: "2",
1478
+ strokeLinecap: "round",
1479
+ strokeLinejoin: "round",
1478
1480
  children: [
1479
- /* @__PURE__ */ jsx("path", { d: "M4 13h6V3H4z" }),
1480
- /* @__PURE__ */ jsx("path", { d: "M14 21h6V3h-6z" })
1481
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "9", x: "3", y: "3", rx: "1" }),
1482
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "5", x: "14", y: "3", rx: "1" }),
1483
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "9", x: "14", y: "12", rx: "1" }),
1484
+ /* @__PURE__ */ jsx("rect", { width: "7", height: "5", x: "3", y: "16", rx: "1" })
1481
1485
  ]
1482
1486
  }
1483
1487
  )
@@ -1492,11 +1496,13 @@ var defaultTopNavLinks = [
1492
1496
  className: "h-4 w-4",
1493
1497
  fill: "none",
1494
1498
  stroke: "currentColor",
1495
- strokeWidth: "1.5",
1499
+ strokeWidth: "2",
1500
+ strokeLinecap: "round",
1501
+ strokeLinejoin: "round",
1496
1502
  children: [
1497
- /* @__PURE__ */ jsx("path", { d: "M12 3v12" }),
1498
- /* @__PURE__ */ jsx("path", { d: "m7 11 5 5 5-5" }),
1499
- /* @__PURE__ */ jsx("path", { d: "M5 21h14" })
1503
+ /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
1504
+ /* @__PURE__ */ jsx("polyline", { points: "7 10 12 15 17 10" }),
1505
+ /* @__PURE__ */ jsx("line", { x1: "12", x2: "12", y1: "15", y2: "3" })
1500
1506
  ]
1501
1507
  }
1502
1508
  )
@@ -1512,10 +1518,13 @@ var defaultTopNavLinks = [
1512
1518
  className: "h-4 w-4",
1513
1519
  fill: "none",
1514
1520
  stroke: "currentColor",
1515
- strokeWidth: "1.5",
1521
+ strokeWidth: "2",
1522
+ strokeLinecap: "round",
1523
+ strokeLinejoin: "round",
1516
1524
  children: [
1517
- /* @__PURE__ */ jsx("path", { d: "M12 5v14" }),
1518
- /* @__PURE__ */ jsx("path", { d: "M5 12h14" })
1525
+ /* @__PURE__ */ jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }),
1526
+ /* @__PURE__ */ jsx("polyline", { points: "7 10 12 15 17 10" }),
1527
+ /* @__PURE__ */ jsx("line", { x1: "12", x2: "12", y1: "15", y2: "3" })
1519
1528
  ]
1520
1529
  }
1521
1530
  )
@@ -1531,15 +1540,34 @@ var defaultTopNavLinks = [
1531
1540
  className: "h-4 w-4",
1532
1541
  fill: "none",
1533
1542
  stroke: "currentColor",
1534
- strokeWidth: "1.5",
1543
+ strokeWidth: "2",
1544
+ strokeLinecap: "round",
1545
+ strokeLinejoin: "round",
1535
1546
  children: [
1536
- /* @__PURE__ */ jsx("path", { d: "M4 4v6h6" }),
1537
- /* @__PURE__ */ jsx("path", { d: "M20 20v-6h-6" }),
1538
- /* @__PURE__ */ jsx("path", { d: "M4 10c1.5-4 6-6 10-4m6 4c-1.5 4-6 6-10 4" })
1547
+ /* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }),
1548
+ /* @__PURE__ */ jsx("path", { d: "M21 3v5h-5" })
1539
1549
  ]
1540
1550
  }
1541
1551
  )
1542
1552
  },
1553
+ {
1554
+ label: "Security",
1555
+ href: "/security",
1556
+ icon: /* @__PURE__ */ jsx(
1557
+ "svg",
1558
+ {
1559
+ xmlns: "http://www.w3.org/2000/svg",
1560
+ viewBox: "0 0 24 24",
1561
+ className: "h-4 w-4",
1562
+ fill: "none",
1563
+ stroke: "currentColor",
1564
+ strokeWidth: "2",
1565
+ strokeLinecap: "round",
1566
+ strokeLinejoin: "round",
1567
+ children: /* @__PURE__ */ jsx("path", { d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" })
1568
+ }
1569
+ )
1570
+ },
1543
1571
  {
1544
1572
  label: "Release History",
1545
1573
  href: "/release-history",
@@ -1551,10 +1579,15 @@ var defaultTopNavLinks = [
1551
1579
  className: "h-4 w-4",
1552
1580
  fill: "none",
1553
1581
  stroke: "currentColor",
1554
- strokeWidth: "1.5",
1582
+ strokeWidth: "2",
1583
+ strokeLinecap: "round",
1584
+ strokeLinejoin: "round",
1555
1585
  children: [
1556
- /* @__PURE__ */ jsx("path", { d: "M12 8v4l3 2" }),
1557
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" })
1586
+ /* @__PURE__ */ jsx("path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" }),
1587
+ /* @__PURE__ */ jsx("path", { d: "M14 2v4a2 2 0 0 0 2 2h4" }),
1588
+ /* @__PURE__ */ jsx("path", { d: "M10 9H8" }),
1589
+ /* @__PURE__ */ jsx("path", { d: "M16 13H8" }),
1590
+ /* @__PURE__ */ jsx("path", { d: "M16 17H8" })
1558
1591
  ]
1559
1592
  }
1560
1593
  )
@@ -1570,12 +1603,13 @@ var defaultTopNavLinks = [
1570
1603
  className: "h-4 w-4",
1571
1604
  fill: "none",
1572
1605
  stroke: "currentColor",
1573
- strokeWidth: "1.5",
1606
+ strokeWidth: "2",
1607
+ strokeLinecap: "round",
1608
+ strokeLinejoin: "round",
1574
1609
  children: [
1575
- /* @__PURE__ */ jsx("rect", { width: "14", height: "18", x: "5", y: "3", rx: "2" }),
1576
- /* @__PURE__ */ jsx("path", { d: "M9 7h6" }),
1577
- /* @__PURE__ */ jsx("path", { d: "M9 11h6" }),
1578
- /* @__PURE__ */ jsx("path", { d: "M9 15h6" })
1610
+ /* @__PURE__ */ jsx("path", { d: "m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4" }),
1611
+ /* @__PURE__ */ jsx("path", { d: "m21 2-9.6 9.6" }),
1612
+ /* @__PURE__ */ jsx("circle", { cx: "7.5", cy: "15.5", r: "5.5" })
1579
1613
  ]
1580
1614
  }
1581
1615
  )
@@ -1591,10 +1625,16 @@ var defaultTopNavLinks = [
1591
1625
  className: "h-4 w-4",
1592
1626
  fill: "none",
1593
1627
  stroke: "currentColor",
1594
- strokeWidth: "1.5",
1628
+ strokeWidth: "2",
1629
+ strokeLinecap: "round",
1630
+ strokeLinejoin: "round",
1595
1631
  children: [
1596
- /* @__PURE__ */ jsx("path", { d: "M18 16a6 6 0 1 0-12 0v2h12Z" }),
1597
- /* @__PURE__ */ jsx("circle", { cx: "12", cy: "7", r: "4" })
1632
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
1633
+ /* @__PURE__ */ jsx("path", { d: "m4.93 4.93 4.24 4.24" }),
1634
+ /* @__PURE__ */ jsx("path", { d: "m14.83 9.17 4.24-4.24" }),
1635
+ /* @__PURE__ */ jsx("path", { d: "m14.83 14.83 4.24 4.24" }),
1636
+ /* @__PURE__ */ jsx("path", { d: "m9.17 14.83-4.24 4.24" }),
1637
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "4" })
1598
1638
  ]
1599
1639
  }
1600
1640
  )
@@ -1694,7 +1734,7 @@ var TopNav = async ({
1694
1734
  return /* @__PURE__ */ jsx(
1695
1735
  "div",
1696
1736
  {
1697
- className: "relative flex h-[165px] w-full items-start justify-center",
1737
+ className: "relative flex h-[280px] w-full items-start justify-center",
1698
1738
  style: {
1699
1739
  backgroundImage: `linear-gradient(to top, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0) 33%), linear-gradient(${gradientStart}, ${gradientEnd})`,
1700
1740
  backgroundRepeat: "no-repeat",
@@ -1721,7 +1761,7 @@ var TopNav = async ({
1721
1761
  brandTitle ? /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold text-gray-900", children: brandTitle }) : null
1722
1762
  ] }) : /* @__PURE__ */ jsx("div", {}),
1723
1763
  /* @__PURE__ */ jsxs("details", { className: "group relative", children: [
1724
- /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 list-none", children: [
1764
+ /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center gap-2 text-sm font-medium text-gray-600 hover:text-gray-900 list-none", children: [
1725
1765
  /* @__PURE__ */ jsxs(
1726
1766
  "svg",
1727
1767
  {
@@ -1793,12 +1833,12 @@ var TopNav = async ({
1793
1833
  const className = `flex items-center gap-2 px-4 py-1 transition text-gray-500 ${isActive ? "underline underline-offset-8 decoration-2" : ""}`;
1794
1834
  if (href) {
1795
1835
  return /* @__PURE__ */ jsxs(Link, { href, className, children: [
1796
- /* @__PURE__ */ jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1836
+ /* @__PURE__ */ jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1797
1837
  /* @__PURE__ */ jsx("span", { children: label })
1798
1838
  ] }, label);
1799
1839
  }
1800
1840
  return /* @__PURE__ */ jsxs("button", { className, type: "button", children: [
1801
- /* @__PURE__ */ jsx("span", { className: isActive ? "text-rose-600" : "text-gray-500", children: icon }),
1841
+ /* @__PURE__ */ jsx("span", { className: isActive ? "text-gray-900" : "text-gray-500", children: icon }),
1802
1842
  /* @__PURE__ */ jsx("span", { children: label })
1803
1843
  ] }, label);
1804
1844
  }) })
@@ -1806,7 +1846,7 @@ var TopNav = async ({
1806
1846
  }
1807
1847
  );
1808
1848
  };
1809
- var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
1849
+ var GlobeIcon = (props) => /* @__PURE__ */ jsx(
1810
1850
  "svg",
1811
1851
  {
1812
1852
  xmlns: "http://www.w3.org/2000/svg",
@@ -1814,16 +1854,14 @@ var GlobeIcon = (props) => /* @__PURE__ */ jsxs(
1814
1854
  fill: "none",
1815
1855
  stroke: "currentColor",
1816
1856
  strokeWidth: 1.5,
1857
+ strokeLinecap: "round",
1858
+ strokeLinejoin: "round",
1817
1859
  "aria-hidden": "true",
1818
1860
  ...props,
1819
- children: [
1820
- /* @__PURE__ */ jsx("circle", { cx: 12, cy: 12, r: 10 }),
1821
- /* @__PURE__ */ jsx("path", { d: "M2 12h20" }),
1822
- /* @__PURE__ */ jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10Z" })
1823
- ]
1861
+ children: /* @__PURE__ */ jsx("path", { d: "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" })
1824
1862
  }
1825
1863
  );
1826
- var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
1864
+ var AirGapIcon = (props) => /* @__PURE__ */ jsx(
1827
1865
  "svg",
1828
1866
  {
1829
1867
  xmlns: "http://www.w3.org/2000/svg",
@@ -1831,15 +1869,11 @@ var AirGapIcon = (props) => /* @__PURE__ */ jsxs(
1831
1869
  fill: "none",
1832
1870
  stroke: "currentColor",
1833
1871
  strokeWidth: 1.5,
1872
+ strokeLinecap: "round",
1873
+ strokeLinejoin: "round",
1834
1874
  "aria-hidden": "true",
1835
1875
  ...props,
1836
- children: [
1837
- /* @__PURE__ */ jsx("path", { d: "m4 4 16 16" }),
1838
- /* @__PURE__ */ jsx("path", { d: "M7.5 4.5a8 8 0 0 1 9 0" }),
1839
- /* @__PURE__ */ jsx("path", { d: "M4.5 7.5a8 8 0 0 0 0 9" }),
1840
- /* @__PURE__ */ jsx("path", { d: "M16.5 19.5a8 8 0 0 0 0-9" }),
1841
- /* @__PURE__ */ jsx("path", { d: "M7 12a5 5 0 0 0 5 5" })
1842
- ]
1876
+ children: /* @__PURE__ */ jsx("path", { d: "M13.181 8.68a4.503 4.503 0 0 1 1.903 6.405m-9.768-2.782L3.56 14.06a4.5 4.5 0 0 0 6.364 6.365l3.129-3.129m5.614-5.615 1.757-1.757a4.5 4.5 0 0 0-6.364-6.365l-4.5 4.5c-.258.26-.479.541-.661.84m1.903 6.405a4.495 4.495 0 0 1-1.242-.88 4.483 4.483 0 0 1-1.062-1.683m6.587 2.345 5.907 5.907m-5.907-5.907L8.898 8.898M2.991 2.99 8.898 8.9" })
1843
1877
  }
1844
1878
  );
1845
1879
  var baseCardClass = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -1880,7 +1914,7 @@ var UpdatesCard = ({
1880
1914
  /* @__PURE__ */ jsx("footer", { className: footerClass, children: /* @__PURE__ */ jsx(Link, { href: "/update", children: "View updates \u2192" }) })
1881
1915
  ] });
1882
1916
  UpdatesCard.displayName = "UpdatesCard";
1883
- var UploadIcon = (props) => /* @__PURE__ */ jsxs(
1917
+ var UploadIcon = (props) => /* @__PURE__ */ jsx(
1884
1918
  "svg",
1885
1919
  {
1886
1920
  xmlns: "http://www.w3.org/2000/svg",
@@ -1888,13 +1922,11 @@ var UploadIcon = (props) => /* @__PURE__ */ jsxs(
1888
1922
  fill: "none",
1889
1923
  stroke: "currentColor",
1890
1924
  strokeWidth: 1.5,
1925
+ strokeLinecap: "round",
1926
+ strokeLinejoin: "round",
1891
1927
  "aria-hidden": "true",
1892
1928
  ...props,
1893
- children: [
1894
- /* @__PURE__ */ jsx("path", { d: "M12 16V3" }),
1895
- /* @__PURE__ */ jsx("path", { d: "M8 7l4-4 4 4" }),
1896
- /* @__PURE__ */ jsx("path", { d: "M5 21h14" })
1897
- ]
1929
+ children: /* @__PURE__ */ jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5" })
1898
1930
  }
1899
1931
  );
1900
1932
  var baseCardClass2 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";
@@ -2301,7 +2333,7 @@ var UserSettingsCard = () => /* @__PURE__ */ jsxs("section", { className: baseCa
2301
2333
  /* @__PURE__ */ jsx("footer", { className: footerClass3, children: /* @__PURE__ */ jsx(Link, { href: "/user-settings", children: "View user settings \u2192" }) })
2302
2334
  ] });
2303
2335
  UserSettingsCard.displayName = "UserSettingsCard";
2304
- var UsersIcon = (props) => /* @__PURE__ */ jsxs(
2336
+ var UsersIcon = (props) => /* @__PURE__ */ jsx(
2305
2337
  "svg",
2306
2338
  {
2307
2339
  xmlns: "http://www.w3.org/2000/svg",
@@ -2309,17 +2341,14 @@ var UsersIcon = (props) => /* @__PURE__ */ jsxs(
2309
2341
  fill: "none",
2310
2342
  stroke: "currentColor",
2311
2343
  strokeWidth: 1.5,
2344
+ strokeLinecap: "round",
2345
+ strokeLinejoin: "round",
2312
2346
  "aria-hidden": "true",
2313
2347
  ...props,
2314
- children: [
2315
- /* @__PURE__ */ jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2" }),
2316
- /* @__PURE__ */ jsx("circle", { cx: 10, cy: 8, r: 4 }),
2317
- /* @__PURE__ */ jsx("path", { d: "M20 21v-2a4 4 0 0 0-3-3.87" }),
2318
- /* @__PURE__ */ jsx("path", { d: "M17 3a4 4 0 0 1 0 8" })
2319
- ]
2348
+ children: /* @__PURE__ */ jsx("path", { d: "M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" })
2320
2349
  }
2321
2350
  );
2322
- var KeyIcon = (props) => /* @__PURE__ */ jsxs(
2351
+ var KeyIcon = (props) => /* @__PURE__ */ jsx(
2323
2352
  "svg",
2324
2353
  {
2325
2354
  xmlns: "http://www.w3.org/2000/svg",
@@ -2327,13 +2356,11 @@ var KeyIcon = (props) => /* @__PURE__ */ jsxs(
2327
2356
  fill: "none",
2328
2357
  stroke: "currentColor",
2329
2358
  strokeWidth: 1.5,
2359
+ strokeLinecap: "round",
2360
+ strokeLinejoin: "round",
2330
2361
  "aria-hidden": "true",
2331
2362
  ...props,
2332
- children: [
2333
- /* @__PURE__ */ jsx("circle", { cx: 7, cy: 15, r: 4 }),
2334
- /* @__PURE__ */ jsx("path", { d: "m10.85 12.15 4.3-4.3a2 2 0 0 1 2.83 0l.47.47a2 2 0 0 1 0 2.83l-4.3 4.3" }),
2335
- /* @__PURE__ */ jsx("path", { d: "M16 11l1.5 1.5" })
2336
- ]
2363
+ children: /* @__PURE__ */ jsx("path", { d: "M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z" })
2337
2364
  }
2338
2365
  );
2339
2366
  var baseCardClass4 = "flex h-full flex-col rounded-xl border border-gray-200 bg-white p-6 shadow-[0_16px_32px_rgba(15,23,42,0.05)]";