@replicated/portal-components 0.0.19 → 0.0.21

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 (244) hide show
  1. package/components/metadata/registry.json +2 -2
  2. package/components/metadata/registry.md +2 -2
  3. package/dist/actions/change-team.js +66 -7
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +3 -1
  6. package/dist/actions/index.d.ts +3 -1
  7. package/dist/actions/index.js +182 -465
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +3 -1
  10. package/dist/actions/install-actions.d.ts +3 -1
  11. package/dist/actions/install-actions.js +58 -5
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +3 -1
  14. package/dist/actions/service-account.d.ts +3 -1
  15. package/dist/actions/service-account.js +58 -5
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +3 -1
  18. package/dist/actions/support-bundles.d.ts +3 -1
  19. package/dist/actions/support-bundles.js +58 -5
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +3 -1
  22. package/dist/actions/team-settings.d.ts +3 -1
  23. package/dist/actions/team-settings.js +91 -27
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.d.mts +24 -0
  26. package/dist/actions/trial-signup.d.ts +24 -0
  27. package/dist/actions/trial-signup.js +482 -0
  28. package/dist/actions/trial-signup.js.map +1 -0
  29. package/dist/actions/user-settings.d.mts +3 -1
  30. package/dist/actions/user-settings.d.ts +3 -1
  31. package/dist/actions/user-settings.js +58 -5
  32. package/dist/actions/user-settings.js.map +1 -1
  33. package/dist/airgap-instances.d.mts +3 -1
  34. package/dist/airgap-instances.d.ts +3 -1
  35. package/dist/airgap-instances.js +41 -112
  36. package/dist/airgap-instances.js.map +1 -1
  37. package/dist/branding-BsMSywts.d.mts +36 -0
  38. package/dist/branding-BsMSywts.d.ts +36 -0
  39. package/dist/error-page.js +10 -2
  40. package/dist/error-page.js.map +1 -1
  41. package/dist/error.js +10 -2
  42. package/dist/error.js.map +1 -1
  43. package/dist/esm/actions/change-team.js +66 -7
  44. package/dist/esm/actions/change-team.js.map +1 -1
  45. package/dist/esm/actions/index.js +181 -462
  46. package/dist/esm/actions/index.js.map +1 -1
  47. package/dist/esm/actions/install-actions.js +58 -5
  48. package/dist/esm/actions/install-actions.js.map +1 -1
  49. package/dist/esm/actions/service-account.js +58 -5
  50. package/dist/esm/actions/service-account.js.map +1 -1
  51. package/dist/esm/actions/support-bundles.js +58 -5
  52. package/dist/esm/actions/support-bundles.js.map +1 -1
  53. package/dist/esm/actions/team-settings.js +91 -27
  54. package/dist/esm/actions/team-settings.js.map +1 -1
  55. package/dist/esm/actions/trial-signup.js +478 -0
  56. package/dist/esm/actions/trial-signup.js.map +1 -0
  57. package/dist/esm/actions/user-settings.js +58 -5
  58. package/dist/esm/actions/user-settings.js.map +1 -1
  59. package/dist/esm/airgap-instances.js +40 -112
  60. package/dist/esm/airgap-instances.js.map +1 -1
  61. package/dist/esm/error-page.js +10 -2
  62. package/dist/esm/error-page.js.map +1 -1
  63. package/dist/esm/error.js +10 -2
  64. package/dist/esm/error.js.map +1 -1
  65. package/dist/esm/helm-install-wizard.js +118 -79
  66. package/dist/esm/helm-install-wizard.js.map +1 -1
  67. package/dist/esm/index.js +706 -438
  68. package/dist/esm/index.js.map +1 -1
  69. package/dist/esm/install-actions.js +40 -5
  70. package/dist/esm/install-actions.js.map +1 -1
  71. package/dist/esm/install-card.js +9 -6
  72. package/dist/esm/install-card.js.map +1 -1
  73. package/dist/esm/install-targets.js +9 -2
  74. package/dist/esm/install-targets.js.map +1 -1
  75. package/dist/esm/instance-card.js +39 -111
  76. package/dist/esm/instance-card.js.map +1 -1
  77. package/dist/esm/join-team.js +9 -3
  78. package/dist/esm/join-team.js.map +1 -1
  79. package/dist/esm/license-card.js +24 -22
  80. package/dist/esm/license-card.js.map +1 -1
  81. package/dist/esm/license-details.js +128 -334
  82. package/dist/esm/license-details.js.map +1 -1
  83. package/dist/esm/linux-install-wizard.js +95 -41
  84. package/dist/esm/linux-install-wizard.js.map +1 -1
  85. package/dist/esm/login.js +20 -4
  86. package/dist/esm/login.js.map +1 -1
  87. package/dist/esm/middleware.js +33 -0
  88. package/dist/esm/middleware.js.map +1 -0
  89. package/dist/esm/online-instance-list.js +40 -112
  90. package/dist/esm/online-instance-list.js.map +1 -1
  91. package/dist/esm/release-history-panel.js +27 -14
  92. package/dist/esm/release-history-panel.js.map +1 -1
  93. package/dist/esm/saml-callback-client.js +82 -0
  94. package/dist/esm/saml-callback-client.js.map +1 -0
  95. package/dist/esm/saml-handlers.js +138 -0
  96. package/dist/esm/saml-handlers.js.map +1 -0
  97. package/dist/esm/security-card.js +53 -38
  98. package/dist/esm/security-card.js.map +1 -1
  99. package/dist/esm/service-accounts-tab.js +800 -0
  100. package/dist/esm/service-accounts-tab.js.map +1 -0
  101. package/dist/esm/support-bundle-collection-card.js +48 -24
  102. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  103. package/dist/esm/support-bundles-card.js +10 -5
  104. package/dist/esm/support-bundles-card.js.map +1 -1
  105. package/dist/esm/support-card.js +37 -5
  106. package/dist/esm/support-card.js.map +1 -1
  107. package/dist/esm/team-selection.js +5 -1
  108. package/dist/esm/team-selection.js.map +1 -1
  109. package/dist/esm/team-settings-card.js +5 -2
  110. package/dist/esm/team-settings-card.js.map +1 -1
  111. package/dist/esm/team-settings.js +7 -2
  112. package/dist/esm/team-settings.js.map +1 -1
  113. package/dist/esm/top-nav-user-menu.js +5 -1
  114. package/dist/esm/top-nav-user-menu.js.map +1 -1
  115. package/dist/esm/top-nav.js +175 -62
  116. package/dist/esm/top-nav.js.map +1 -1
  117. package/dist/esm/trial-signup.js +256 -0
  118. package/dist/esm/trial-signup.js.map +1 -0
  119. package/dist/esm/update-layout.js +175 -62
  120. package/dist/esm/update-layout.js.map +1 -1
  121. package/dist/esm/updates-card.js +15 -4
  122. package/dist/esm/updates-card.js.map +1 -1
  123. package/dist/esm/upload-support-bundle-modal.js +9 -4
  124. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  125. package/dist/esm/user-settings-card.js +5 -2
  126. package/dist/esm/user-settings-card.js.map +1 -1
  127. package/dist/esm/user-settings.js +12 -6
  128. package/dist/esm/user-settings.js.map +1 -1
  129. package/dist/esm/utils/index.js +204 -13
  130. package/dist/esm/utils/index.js.map +1 -1
  131. package/dist/fetch-license-iTyF7_GY.d.mts +81 -0
  132. package/dist/fetch-license-iTyF7_GY.d.ts +81 -0
  133. package/dist/helm-install-wizard.d.mts +11 -3
  134. package/dist/helm-install-wizard.d.ts +11 -3
  135. package/dist/helm-install-wizard.js +118 -79
  136. package/dist/helm-install-wizard.js.map +1 -1
  137. package/dist/{index-BAiVrSSR.d.mts → index-DyzJ0yKD.d.mts} +48 -50
  138. package/dist/{index-DWt-N5od.d.ts → index-sMbq94M7.d.ts} +48 -50
  139. package/dist/index.d.mts +8 -2
  140. package/dist/index.d.ts +8 -2
  141. package/dist/index.js +726 -438
  142. package/dist/index.js.map +1 -1
  143. package/dist/install-actions.d.mts +4 -2
  144. package/dist/install-actions.d.ts +4 -2
  145. package/dist/install-actions.js +40 -5
  146. package/dist/install-actions.js.map +1 -1
  147. package/dist/install-card.d.mts +2 -3
  148. package/dist/install-card.d.ts +2 -3
  149. package/dist/install-card.js +9 -6
  150. package/dist/install-card.js.map +1 -1
  151. package/dist/install-targets.js +9 -2
  152. package/dist/install-targets.js.map +1 -1
  153. package/dist/instance-card.d.mts +3 -1
  154. package/dist/instance-card.d.ts +3 -1
  155. package/dist/instance-card.js +40 -111
  156. package/dist/instance-card.js.map +1 -1
  157. package/dist/join-team.js +9 -3
  158. package/dist/join-team.js.map +1 -1
  159. package/dist/license-card.d.mts +2 -3
  160. package/dist/license-card.d.ts +2 -3
  161. package/dist/license-card.js +24 -22
  162. package/dist/license-card.js.map +1 -1
  163. package/dist/license-details.js +128 -334
  164. package/dist/license-details.js.map +1 -1
  165. package/dist/linux-install-wizard.d.mts +9 -3
  166. package/dist/linux-install-wizard.d.ts +9 -3
  167. package/dist/linux-install-wizard.js +95 -41
  168. package/dist/linux-install-wizard.js.map +1 -1
  169. package/dist/login.d.mts +4 -0
  170. package/dist/login.d.ts +4 -0
  171. package/dist/login.js +20 -4
  172. package/dist/login.js.map +1 -1
  173. package/dist/middleware.d.mts +13 -0
  174. package/dist/middleware.d.ts +13 -0
  175. package/dist/middleware.js +35 -0
  176. package/dist/middleware.js.map +1 -0
  177. package/dist/online-instance-list.d.mts +3 -1
  178. package/dist/online-instance-list.d.ts +3 -1
  179. package/dist/online-instance-list.js +41 -112
  180. package/dist/online-instance-list.js.map +1 -1
  181. package/dist/pending-installations.d.mts +3 -1
  182. package/dist/pending-installations.d.ts +3 -1
  183. package/dist/release-history-panel.js +27 -14
  184. package/dist/release-history-panel.js.map +1 -1
  185. package/dist/saml-callback-client.d.mts +36 -0
  186. package/dist/saml-callback-client.d.ts +36 -0
  187. package/dist/saml-callback-client.js +88 -0
  188. package/dist/saml-callback-client.js.map +1 -0
  189. package/dist/saml-handlers.d.mts +50 -0
  190. package/dist/saml-handlers.d.ts +50 -0
  191. package/dist/saml-handlers.js +141 -0
  192. package/dist/saml-handlers.js.map +1 -0
  193. package/dist/security-card.d.mts +3 -1
  194. package/dist/security-card.d.ts +3 -1
  195. package/dist/security-card.js +53 -38
  196. package/dist/security-card.js.map +1 -1
  197. package/dist/service-accounts-tab.d.mts +51 -0
  198. package/dist/service-accounts-tab.d.ts +51 -0
  199. package/dist/service-accounts-tab.js +802 -0
  200. package/dist/service-accounts-tab.js.map +1 -0
  201. package/dist/styles.css +375 -127
  202. package/dist/support-bundle-collection-card.d.mts +1 -1
  203. package/dist/support-bundle-collection-card.d.ts +1 -1
  204. package/dist/support-bundle-collection-card.js +47 -23
  205. package/dist/support-bundle-collection-card.js.map +1 -1
  206. package/dist/support-bundles-card.d.mts +4 -2
  207. package/dist/support-bundles-card.d.ts +4 -2
  208. package/dist/support-bundles-card.js +10 -5
  209. package/dist/support-bundles-card.js.map +1 -1
  210. package/dist/support-card.js +37 -5
  211. package/dist/support-card.js.map +1 -1
  212. package/dist/team-selection.js +5 -1
  213. package/dist/team-selection.js.map +1 -1
  214. package/dist/team-settings-card.js +5 -2
  215. package/dist/team-settings-card.js.map +1 -1
  216. package/dist/team-settings.js +7 -2
  217. package/dist/team-settings.js.map +1 -1
  218. package/dist/{top-nav-IRIn66wS.d.ts → top-nav-BUQAGoG1.d.mts} +14 -2
  219. package/dist/{top-nav-IRIn66wS.d.mts → top-nav-CEqw0KpO.d.ts} +14 -2
  220. package/dist/top-nav-user-menu.js +5 -1
  221. package/dist/top-nav-user-menu.js.map +1 -1
  222. package/dist/top-nav.d.mts +2 -1
  223. package/dist/top-nav.d.ts +2 -1
  224. package/dist/top-nav.js +175 -62
  225. package/dist/top-nav.js.map +1 -1
  226. package/dist/trial-signup.d.mts +31 -0
  227. package/dist/trial-signup.d.ts +31 -0
  228. package/dist/trial-signup.js +258 -0
  229. package/dist/trial-signup.js.map +1 -0
  230. package/dist/update-layout.js +175 -62
  231. package/dist/update-layout.js.map +1 -1
  232. package/dist/updates-card.js +15 -4
  233. package/dist/updates-card.js.map +1 -1
  234. package/dist/upload-support-bundle-modal.js +9 -4
  235. package/dist/upload-support-bundle-modal.js.map +1 -1
  236. package/dist/user-settings-card.js +5 -2
  237. package/dist/user-settings-card.js.map +1 -1
  238. package/dist/user-settings.js +12 -6
  239. package/dist/user-settings.js.map +1 -1
  240. package/dist/utils/index.d.mts +74 -16
  241. package/dist/utils/index.d.ts +74 -16
  242. package/dist/utils/index.js +215 -12
  243. package/dist/utils/index.js.map +1 -1
  244. package/package.json +37 -2
@@ -9,7 +9,7 @@ interface SupportBundleCollectionCardProps {
9
9
  showHelm?: boolean;
10
10
  /** Callback when the upload button is clicked. If not provided, button is hidden. */
11
11
  onUploadClick?: () => void;
12
- /** Primary brand color for buttons. Defaults to "#6366f1". */
12
+ /** Primary brand color for buttons. Uses CSS variable --portal-branding-primary by default. */
13
13
  primaryColor?: string;
14
14
  }
15
15
  declare const SupportBundleCollectionCard: {
@@ -9,7 +9,7 @@ interface SupportBundleCollectionCardProps {
9
9
  showHelm?: boolean;
10
10
  /** Callback when the upload button is clicked. If not provided, button is hidden. */
11
11
  onUploadClick?: () => void;
12
- /** Primary brand color for buttons. Defaults to "#6366f1". */
12
+ /** Primary brand color for buttons. Uses CSS variable --portal-branding-primary by default. */
13
13
  primaryColor?: string;
14
14
  }
15
15
  declare const SupportBundleCollectionCard: {
@@ -8,6 +8,28 @@ var jsxRuntime = require('react/jsx-runtime');
8
8
  * Enterprise Portal Components
9
9
  * This file is generated by tsup. Do not edit manually.
10
10
  */
11
+
12
+ // src/utils/constants.ts
13
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
14
+ function useCopyToClipboard(resetDelay = 2e3) {
15
+ const [copied, setCopied] = react.useState(false);
16
+ const copy = react.useCallback(async (text) => {
17
+ if (!navigator.clipboard) {
18
+ console.warn("[useCopyToClipboard] Clipboard API not available");
19
+ return false;
20
+ }
21
+ try {
22
+ await navigator.clipboard.writeText(text);
23
+ setCopied(true);
24
+ setTimeout(() => setCopied(false), resetDelay);
25
+ return true;
26
+ } catch (error) {
27
+ console.error("[useCopyToClipboard] Failed to copy:", error);
28
+ return false;
29
+ }
30
+ }, [resetDelay]);
31
+ return { copy, copied };
32
+ }
11
33
  var getInstructionsByTab = (appSlug) => ({
12
34
  Linux: {
13
35
  title: "UI based collection",
@@ -31,7 +53,8 @@ var getInstructionsByTab = (appSlug) => ({
31
53
  "a",
32
54
  {
33
55
  href: "https://krew.sigs.k8s.io/docs/user-guide/setup/install/",
34
- className: "text-indigo-500 hover:text-indigo-400",
56
+ className: "hover:opacity-80",
57
+ style: { color: `var(--portal-branding-secondary, ${DEFAULT_SECONDARY_COLOR})` },
35
58
  target: "_blank",
36
59
  rel: "noreferrer",
37
60
  children: "https://krew.sigs.k8s.io/docs/user-guide/setup/install/"
@@ -54,30 +77,31 @@ var getInstructionsByTab = (appSlug) => ({
54
77
  });
55
78
  var tabButtonBase = "w-full rounded-lg px-4 py-2 text-left text-sm font-medium transition";
56
79
  var cliWrapperClass = "mt-4 rounded-lg bg-gray-900 px-4 py-3 font-mono text-sm text-gray-100 shadow-inner flex items-center justify-between";
57
- var CommandBlock = ({ command }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cliWrapperClass, role: "group", "aria-label": "Copy support bundle command", children: [
58
- /* @__PURE__ */ jsxRuntime.jsx("code", { className: "bg-transparent text-gray-100", children: command }),
59
- /* @__PURE__ */ jsxRuntime.jsx(
60
- "button",
61
- {
62
- type: "button",
63
- className: "rounded-md bg-gray-800 px-2 py-1 text-xs font-semibold text-white transition hover:bg-gray-700",
64
- onClick: async () => {
65
- try {
66
- await navigator.clipboard?.writeText(command);
67
- } catch (error) {
68
- console.error("[SupportBundleCollection] copy failed", error);
69
- }
70
- },
71
- children: "Copy"
72
- }
73
- )
74
- ] });
80
+ var CommandBlock = ({ command }) => {
81
+ const { copy, copied } = useCopyToClipboard();
82
+ const handleCopy = () => copy(command);
83
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cliWrapperClass, role: "group", "aria-label": "Copy support bundle command", children: [
84
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "bg-transparent text-gray-100", children: command }),
85
+ /* @__PURE__ */ jsxRuntime.jsx(
86
+ "button",
87
+ {
88
+ type: "button",
89
+ className: "rounded-md bg-gray-800 px-2 py-1 text-xs font-semibold text-white transition-all duration-200 hover:bg-gray-700 flex items-center gap-1",
90
+ onClick: handleCopy,
91
+ children: copied ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
92
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "h-3 w-3 text-green-400", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
93
+ "Copied"
94
+ ] }) : "Copy"
95
+ }
96
+ )
97
+ ] });
98
+ };
75
99
  var SupportBundleCollectionCard = ({
76
100
  appSlug = "APP_SLUG",
77
101
  showLinux = true,
78
102
  showHelm = true,
79
103
  onUploadClick,
80
- primaryColor = "#6366f1"
104
+ primaryColor
81
105
  }) => {
82
106
  const availableTabs = react.useMemo(() => {
83
107
  const tabs = [];
@@ -109,8 +133,8 @@ var SupportBundleCollectionCard = ({
109
133
  {
110
134
  type: "button",
111
135
  onClick: onUploadClick,
112
- className: "inline-flex items-center gap-2 rounded-full px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:opacity-90",
113
- style: { backgroundColor: primaryColor },
136
+ className: "inline-flex items-center gap-2 rounded-full px-4 py-2 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90",
137
+ style: { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` },
114
138
  children: [
115
139
  /* @__PURE__ */ jsxRuntime.jsxs(
116
140
  "svg",
@@ -143,7 +167,7 @@ var SupportBundleCollectionCard = ({
143
167
  type: "button",
144
168
  onClick: () => setActiveTab(tab),
145
169
  className: `${tabButtonBase} ${isActive ? "text-white shadow" : "text-gray-600 hover:bg-white"}`,
146
- style: isActive ? { backgroundColor: primaryColor } : void 0,
170
+ style: isActive ? { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` } : void 0,
147
171
  children: tab
148
172
  },
149
173
  tab
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/support-bundle-collection-card.tsx"],"names":["jsxs","Fragment","jsx","useMemo","useState","useEffect"],"mappings":"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","file":"support-bundle-collection-card.js","sourcesContent":["\"use client\";\n\nimport { type ReactNode, useState, useMemo, useEffect } from \"react\";\n\ntype Platform = \"Linux\" | \"Helm\";\n\ntype StepInstruction = {\n title: string;\n description: ReactNode;\n command?: string;\n notes?: ReactNode[];\n};\n\ntype Instruction = {\n title: string;\n description: ReactNode;\n cli?: string;\n footer?: ReactNode;\n steps?: StepInstruction[];\n};\n\ninterface SupportBundleCollectionCardProps {\n /** App slug used in the Linux CLI command. Defaults to \"APP_SLUG\" placeholder. */\n appSlug?: string;\n /** Whether to show the Linux tab. Defaults to true. */\n showLinux?: boolean;\n /** Whether to show the Helm tab. Defaults to true. */\n showHelm?: boolean;\n /** Callback when the upload button is clicked. If not provided, button is hidden. */\n onUploadClick?: () => void;\n /** Primary brand color for buttons. Defaults to \"#6366f1\". */\n primaryColor?: string;\n}\n\nconst getInstructionsByTab = (appSlug: string): Record<Platform, Instruction> => ({\n Linux: {\n title: \"UI based collection\",\n description:\n \"Log in to the Admin Console and go to the Troubleshoot tab. Click Analyze to generate a support bundle. After the analysis completes, you can download the bundle or send it directly to the vendor if enabled.\",\n cli: `sudo ./${appSlug} support-bundle`,\n footer:\n \"The support bundle will be saved as a .tar.gz file in your current directory. While sensitive information is automatically redacted, we recommend reviewing the contents before uploading for analysis.\"\n },\n Helm: {\n title: \"CLI based collection\",\n description:\n \"For Helm installations, you'll need to use the kubectl support-bundle plugin to collect diagnostics.\",\n steps: [\n {\n title: \"Step 1: Install the support-bundle plugin\",\n description: \"First, install the kubectl support-bundle plugin using krew:\",\n command: \"kubectl krew install support-bundle\",\n notes: [\n <>\n If you don't have krew installed, follow the instructions at{\" \"}\n <a\n href=\"https://krew.sigs.k8s.io/docs/user-guide/setup/install/\"\n className=\"text-indigo-500 hover:text-indigo-400\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n https://krew.sigs.k8s.io/docs/user-guide/setup/install/\n </a>\n </>\n ]\n },\n {\n title: \"Step 2: Generate a support bundle\",\n description: \"Run the following command to collect diagnostics from your Kubernetes cluster:\",\n command: \"kubectl support-bundle --load-cluster-specs\",\n notes: [\n \"This command will automatically detect and collect diagnostics from your Kubernetes cluster.\",\n \"The support bundle will be saved as a .tar.gz file in your current directory. While sensitive information is automatically redacted, we recommend reviewing the contents before uploading for analysis.\"\n ]\n }\n ]\n }\n});\n\nconst tabButtonBase =\n \"w-full rounded-lg px-4 py-2 text-left text-sm font-medium transition\";\n\nconst cliWrapperClass =\n \"mt-4 rounded-lg bg-gray-900 px-4 py-3 font-mono text-sm text-gray-100 shadow-inner flex items-center justify-between\";\n\nconst CommandBlock = ({ command }: { command: string }) => (\n <div className={cliWrapperClass} role=\"group\" aria-label=\"Copy support bundle command\">\n <code className=\"bg-transparent text-gray-100\">{command}</code>\n <button\n type=\"button\"\n className=\"rounded-md bg-gray-800 px-2 py-1 text-xs font-semibold text-white transition hover:bg-gray-700\"\n onClick={async () => {\n try {\n await navigator.clipboard?.writeText(command);\n } catch (error) {\n console.error(\"[SupportBundleCollection] copy failed\", error);\n }\n }}\n >\n Copy\n </button>\n </div>\n);\n\nexport const SupportBundleCollectionCard = ({\n appSlug = \"APP_SLUG\",\n showLinux = true,\n showHelm = true,\n onUploadClick,\n primaryColor = \"#6366f1\"\n}: SupportBundleCollectionCardProps) => {\n // Build available tabs based on props\n const availableTabs = useMemo(() => {\n const tabs: Platform[] = [];\n if (showLinux) tabs.push(\"Linux\");\n if (showHelm) tabs.push(\"Helm\");\n return tabs;\n }, [showLinux, showHelm]);\n\n // Default to first available tab\n const [activeTab, setActiveTab] = useState<Platform>(() => availableTabs[0] ?? \"Linux\");\n\n // Update active tab when available tabs change (e.g., when parent changes showLinux/showHelm)\n useEffect(() => {\n const firstAvailableTab = availableTabs[0];\n if (firstAvailableTab && !availableTabs.includes(activeTab)) {\n setActiveTab(firstAvailableTab);\n }\n }, [availableTabs, activeTab]);\n\n // Get instructions with dynamic app slug\n const instructionsByTab = useMemo(() => getInstructionsByTab(appSlug), [appSlug]);\n const activeInstructions = instructionsByTab[activeTab];\n\n // If no tabs available, don't render\n if (availableTabs.length === 0) {\n return null;\n }\n\n const showTabs = availableTabs.length > 1;\n\n return (\n <section className=\"rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]\">\n <header className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">Support Bundle Collection</h2>\n <p className=\"mt-1 text-sm text-gray-500\">\n {showTabs\n ? \"Choose your deployment method to view the recommended collection steps.\"\n : \"Follow these steps to collect a support bundle.\"}\n </p>\n </div>\n {onUploadClick && (\n <button\n type=\"button\"\n onClick={onUploadClick}\n className=\"inline-flex items-center gap-2 rounded-full px-4 py-2 text-sm font-semibold text-white shadow-sm transition hover:opacity-90\"\n style={{ backgroundColor: primaryColor }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"h-4 w-4\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 16V3\" />\n <path d=\"M8 7l4-4 4 4\" />\n <path d=\"M5 21h14\" />\n </svg>\n Upload a support bundle\n </button>\n )}\n </header>\n <div className=\"mt-6 flex flex-col gap-6 lg:flex-row\">\n {showTabs && (\n <nav className=\"flex w-full flex-col gap-2 rounded-2xl border border-gray-200 bg-gray-50 p-4 lg:w-52\">\n {availableTabs.map((tab) => {\n const isActive = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setActiveTab(tab)}\n className={`${tabButtonBase} ${\n isActive\n ? \"text-white shadow\"\n : \"text-gray-600 hover:bg-white\"\n }`}\n style={isActive ? { backgroundColor: primaryColor } : undefined}\n >\n {tab}\n </button>\n );\n })}\n </nav>\n )}\n <article className=\"flex-1 rounded-2xl border border-gray-200 bg-white p-6 shadow-sm\">\n <div className=\"space-y-5\">\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {activeInstructions.title}\n </h3>\n <p className=\"mt-2 text-sm text-gray-600\">\n {activeInstructions.description}\n </p>\n </div>\n {activeInstructions.steps?.length ? (\n <div className=\"space-y-6\">\n {activeInstructions.steps.map((step) => (\n <div key={step.title} className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-gray-900\">{step.title}</h4>\n <p className=\"text-sm text-gray-600\">{step.description}</p>\n {step.command ? <CommandBlock command={step.command} /> : null}\n {step.notes?.map((note, index) => (\n <p key={`${step.title}-note-${index}`} className=\"text-sm text-gray-600\">\n {note}\n </p>\n ))}\n </div>\n ))}\n </div>\n ) : (\n <>\n {activeInstructions.cli ? (\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">CLI based collection</h4>\n <p className=\"mt-2 text-sm text-gray-600\">\n To collect diagnostics about your environment, SSH onto a controller node and run the following command:\n </p>\n <CommandBlock command={activeInstructions.cli} />\n </div>\n ) : null}\n {activeInstructions.footer ? (\n <p className=\"text-xs text-gray-500 leading-relaxed\">\n {activeInstructions.footer}\n </p>\n ) : null}\n </>\n )}\n </div>\n </article>\n </div>\n </section>\n );\n};\n\nSupportBundleCollectionCard.displayName = \"SupportBundleCollectionCard\";\n"]}
1
+ {"version":3,"sources":["../src/utils/constants.ts","../src/utils/clipboard.ts","../src/components/support-bundle-collection-card.tsx"],"names":["useState","useCallback","jsxs","Fragment","jsx","useMemo","useEffect"],"mappings":"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","file":"support-bundle-collection-card.js","sourcesContent":["/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const DEFAULT_FAVICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\n\n/**\n * Hook for copy-to-clipboard functionality with visual feedback\n * @param resetDelay - Time in milliseconds before resetting copied state (default: 2000)\n * @returns Object with copy function and copied state\n */\nexport function useCopyToClipboard(resetDelay = 2000) {\n const [copied, setCopied] = useState(false);\n\n const copy = useCallback(async (text: string): Promise<boolean> => {\n if (!navigator.clipboard) {\n console.warn(\"[useCopyToClipboard] Clipboard API not available\");\n return false;\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), resetDelay);\n return true;\n } catch (error) {\n console.error(\"[useCopyToClipboard] Failed to copy:\", error);\n return false;\n }\n }, [resetDelay]);\n\n return { copy, copied };\n}\n\n/**\n * Simple utility function to copy text to clipboard\n * @param text - Text to copy\n * @returns Promise that resolves to true if successful, false otherwise\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n if (!navigator.clipboard) {\n console.warn(\"[copyToClipboard] Clipboard API not available\");\n return false;\n }\n\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch (error) {\n console.error(\"[copyToClipboard] Failed to copy:\", error);\n return false;\n }\n}\n","\"use client\";\n\nimport { type ReactNode, useState, useMemo, useEffect } from \"react\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\nimport { useCopyToClipboard } from \"../utils/clipboard\";\n\ntype Platform = \"Linux\" | \"Helm\";\n\ntype StepInstruction = {\n title: string;\n description: ReactNode;\n command?: string;\n notes?: ReactNode[];\n};\n\ntype Instruction = {\n title: string;\n description: ReactNode;\n cli?: string;\n footer?: ReactNode;\n steps?: StepInstruction[];\n};\n\ninterface SupportBundleCollectionCardProps {\n /** App slug used in the Linux CLI command. Defaults to \"APP_SLUG\" placeholder. */\n appSlug?: string;\n /** Whether to show the Linux tab. Defaults to true. */\n showLinux?: boolean;\n /** Whether to show the Helm tab. Defaults to true. */\n showHelm?: boolean;\n /** Callback when the upload button is clicked. If not provided, button is hidden. */\n onUploadClick?: () => void;\n /** Primary brand color for buttons. Uses CSS variable --portal-branding-primary by default. */\n primaryColor?: string;\n}\n\nconst getInstructionsByTab = (appSlug: string): Record<Platform, Instruction> => ({\n Linux: {\n title: \"UI based collection\",\n description:\n \"Log in to the Admin Console and go to the Troubleshoot tab. Click Analyze to generate a support bundle. After the analysis completes, you can download the bundle or send it directly to the vendor if enabled.\",\n cli: `sudo ./${appSlug} support-bundle`,\n footer:\n \"The support bundle will be saved as a .tar.gz file in your current directory. While sensitive information is automatically redacted, we recommend reviewing the contents before uploading for analysis.\"\n },\n Helm: {\n title: \"CLI based collection\",\n description:\n \"For Helm installations, you'll need to use the kubectl support-bundle plugin to collect diagnostics.\",\n steps: [\n {\n title: \"Step 1: Install the support-bundle plugin\",\n description: \"First, install the kubectl support-bundle plugin using krew:\",\n command: \"kubectl krew install support-bundle\",\n notes: [\n <>\n If you don't have krew installed, follow the instructions at{\" \"}\n <a\n href=\"https://krew.sigs.k8s.io/docs/user-guide/setup/install/\"\n className=\"hover:opacity-80\"\n style={{ color: `var(--portal-branding-secondary, ${DEFAULT_SECONDARY_COLOR})` }}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n https://krew.sigs.k8s.io/docs/user-guide/setup/install/\n </a>\n </>\n ]\n },\n {\n title: \"Step 2: Generate a support bundle\",\n description: \"Run the following command to collect diagnostics from your Kubernetes cluster:\",\n command: \"kubectl support-bundle --load-cluster-specs\",\n notes: [\n \"This command will automatically detect and collect diagnostics from your Kubernetes cluster.\",\n \"The support bundle will be saved as a .tar.gz file in your current directory. While sensitive information is automatically redacted, we recommend reviewing the contents before uploading for analysis.\"\n ]\n }\n ]\n }\n});\n\nconst tabButtonBase =\n \"w-full rounded-lg px-4 py-2 text-left text-sm font-medium transition\";\n\nconst cliWrapperClass =\n \"mt-4 rounded-lg bg-gray-900 px-4 py-3 font-mono text-sm text-gray-100 shadow-inner flex items-center justify-between\";\n\nconst CommandBlock = ({ command }: { command: string }) => {\n const { copy, copied } = useCopyToClipboard();\n\n const handleCopy = () => copy(command);\n\n return (\n <div className={cliWrapperClass} role=\"group\" aria-label=\"Copy support bundle command\">\n <code className=\"bg-transparent text-gray-100\">{command}</code>\n <button\n type=\"button\"\n className=\"rounded-md bg-gray-800 px-2 py-1 text-xs font-semibold text-white transition-all duration-200 hover:bg-gray-700 flex items-center gap-1\"\n onClick={handleCopy}\n >\n {copied ? (\n <>\n <svg className=\"h-3 w-3 text-green-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n Copied\n </>\n ) : (\n \"Copy\"\n )}\n </button>\n </div>\n );\n};\n\nexport const SupportBundleCollectionCard = ({\n appSlug = \"APP_SLUG\",\n showLinux = true,\n showHelm = true,\n onUploadClick,\n primaryColor\n}: SupportBundleCollectionCardProps) => {\n // Build available tabs based on props\n const availableTabs = useMemo(() => {\n const tabs: Platform[] = [];\n if (showLinux) tabs.push(\"Linux\");\n if (showHelm) tabs.push(\"Helm\");\n return tabs;\n }, [showLinux, showHelm]);\n\n // Default to first available tab\n const [activeTab, setActiveTab] = useState<Platform>(() => availableTabs[0] ?? \"Linux\");\n\n // Update active tab when available tabs change (e.g., when parent changes showLinux/showHelm)\n useEffect(() => {\n const firstAvailableTab = availableTabs[0];\n if (firstAvailableTab && !availableTabs.includes(activeTab)) {\n setActiveTab(firstAvailableTab);\n }\n }, [availableTabs, activeTab]);\n\n // Get instructions with dynamic app slug\n const instructionsByTab = useMemo(() => getInstructionsByTab(appSlug), [appSlug]);\n const activeInstructions = instructionsByTab[activeTab];\n\n // If no tabs available, don't render\n if (availableTabs.length === 0) {\n return null;\n }\n\n const showTabs = availableTabs.length > 1;\n\n return (\n <section className=\"rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]\">\n <header className=\"flex flex-wrap items-center justify-between gap-4\">\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">Support Bundle Collection</h2>\n <p className=\"mt-1 text-sm text-gray-500\">\n {showTabs\n ? \"Choose your deployment method to view the recommended collection steps.\"\n : \"Follow these steps to collect a support bundle.\"}\n </p>\n </div>\n {onUploadClick && (\n <button\n type=\"button\"\n onClick={onUploadClick}\n className=\"inline-flex items-center gap-2 rounded-full px-4 py-2 text-sm font-semibold text-white shadow-sm transition-opacity duration-200 hover:opacity-90\"\n style={{ backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className=\"h-4 w-4\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 16V3\" />\n <path d=\"M8 7l4-4 4 4\" />\n <path d=\"M5 21h14\" />\n </svg>\n Upload a support bundle\n </button>\n )}\n </header>\n <div className=\"mt-6 flex flex-col gap-6 lg:flex-row\">\n {showTabs && (\n <nav className=\"flex w-full flex-col gap-2 rounded-2xl border border-gray-200 bg-gray-50 p-4 lg:w-52\">\n {availableTabs.map((tab) => {\n const isActive = tab === activeTab;\n return (\n <button\n key={tab}\n type=\"button\"\n onClick={() => setActiveTab(tab)}\n className={`${tabButtonBase} ${\n isActive\n ? \"text-white shadow\"\n : \"text-gray-600 hover:bg-white\"\n }`}\n style={isActive ? { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` } : undefined}\n >\n {tab}\n </button>\n );\n })}\n </nav>\n )}\n <article className=\"flex-1 rounded-2xl border border-gray-200 bg-white p-6 shadow-sm\">\n <div className=\"space-y-5\">\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {activeInstructions.title}\n </h3>\n <p className=\"mt-2 text-sm text-gray-600\">\n {activeInstructions.description}\n </p>\n </div>\n {activeInstructions.steps?.length ? (\n <div className=\"space-y-6\">\n {activeInstructions.steps.map((step) => (\n <div key={step.title} className=\"space-y-3\">\n <h4 className=\"text-sm font-semibold text-gray-900\">{step.title}</h4>\n <p className=\"text-sm text-gray-600\">{step.description}</p>\n {step.command ? <CommandBlock command={step.command} /> : null}\n {step.notes?.map((note, index) => (\n <p key={`${step.title}-note-${index}`} className=\"text-sm text-gray-600\">\n {note}\n </p>\n ))}\n </div>\n ))}\n </div>\n ) : (\n <>\n {activeInstructions.cli ? (\n <div>\n <h4 className=\"text-sm font-semibold text-gray-900\">CLI based collection</h4>\n <p className=\"mt-2 text-sm text-gray-600\">\n To collect diagnostics about your environment, SSH onto a controller node and run the following command:\n </p>\n <CommandBlock command={activeInstructions.cli} />\n </div>\n ) : null}\n {activeInstructions.footer ? (\n <p className=\"text-xs text-gray-500 leading-relaxed\">\n {activeInstructions.footer}\n </p>\n ) : null}\n </>\n )}\n </div>\n </article>\n </div>\n </section>\n );\n};\n\nSupportBundleCollectionCard.displayName = \"SupportBundleCollectionCard\";\n"]}
@@ -1,6 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { s as SupportBundleSummary } from './index-BAiVrSSR.mjs';
2
+ import { q as SupportBundleSummary } from './index-DyzJ0yKD.mjs';
3
+ import './fetch-license-iTyF7_GY.mjs';
3
4
  import './actions/change-team.mjs';
5
+ import './actions/trial-signup.mjs';
4
6
 
5
7
  interface SupportBundlesCardProps {
6
8
  totalCount: number;
@@ -9,7 +11,7 @@ interface SupportBundlesCardProps {
9
11
  onDownload?: (bundleId: string) => Promise<string>;
10
12
  /** Callback to delete a bundle. */
11
13
  onDelete?: (bundleId: string) => Promise<void>;
12
- /** Primary brand color. Defaults to "#6366f1". */
14
+ /** Primary brand color. Defaults to DEFAULT_SECONDARY_COLOR. */
13
15
  primaryColor?: string;
14
16
  }
15
17
  declare const SupportBundlesCard: {
@@ -1,6 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { s as SupportBundleSummary } from './index-DWt-N5od.js';
2
+ import { q as SupportBundleSummary } from './index-sMbq94M7.js';
3
+ import './fetch-license-iTyF7_GY.js';
3
4
  import './actions/change-team.js';
5
+ import './actions/trial-signup.js';
4
6
 
5
7
  interface SupportBundlesCardProps {
6
8
  totalCount: number;
@@ -9,7 +11,7 @@ interface SupportBundlesCardProps {
9
11
  onDownload?: (bundleId: string) => Promise<string>;
10
12
  /** Callback to delete a bundle. */
11
13
  onDelete?: (bundleId: string) => Promise<void>;
12
- /** Primary brand color. Defaults to "#6366f1". */
14
+ /** Primary brand color. Defaults to DEFAULT_SECONDARY_COLOR. */
13
15
  primaryColor?: string;
14
16
  }
15
17
  declare const SupportBundlesCard: {
@@ -9,14 +9,19 @@ var jsxRuntime = require('react/jsx-runtime');
9
9
  * This file is generated by tsup. Do not edit manually.
10
10
  */
11
11
 
12
- var formatBytes = (bytes, decimals = 1) => {
12
+
13
+ // src/utils/format.ts
14
+ function formatBytes(bytes, decimals = 1) {
13
15
  if (bytes === 0) return "0 Bytes";
14
16
  const k = 1024;
15
17
  const dm = decimals < 0 ? 0 : decimals;
16
18
  const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
17
19
  const i = Math.floor(Math.log(bytes) / Math.log(k));
18
20
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
19
- };
21
+ }
22
+
23
+ // src/utils/constants.ts
24
+ var DEFAULT_SECONDARY_COLOR = "#6366f1";
20
25
  var DownloadIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsxs(
21
26
  "svg",
22
27
  {
@@ -104,7 +109,7 @@ var SupportBundlesCard = ({
104
109
  bundles,
105
110
  onDownload,
106
111
  onDelete,
107
- primaryColor = "#6366f1"
112
+ primaryColor = DEFAULT_SECONDARY_COLOR
108
113
  }) => {
109
114
  const [downloadingId, setDownloadingId] = react.useState(null);
110
115
  const [deletingId, setDeletingId] = react.useState(null);
@@ -180,7 +185,7 @@ var SupportBundlesCard = ({
180
185
  ] })
181
186
  ] }),
182
187
  error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700", children: error }),
183
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4", children: bundles.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500", children: "No support bundles have been uploaded yet." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-xl border border-gray-200", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full divide-y divide-gray-200", children: [
188
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4", children: bundles.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500", children: "No support bundles have been uploaded yet." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto rounded-xl border border-gray-200", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full min-w-[700px] divide-y divide-gray-200", children: [
184
189
  /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "bg-gray-50", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
185
190
  /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Instance" }),
186
191
  /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Date Collected" }),
@@ -290,7 +295,7 @@ var SupportBundlesCard = ({
290
295
  type: "button",
291
296
  onClick: handleDeleteConfirm,
292
297
  disabled: deletingId !== null,
293
- className: "rounded-lg px-4 py-2 text-sm font-medium text-white transition hover:opacity-90 disabled:opacity-50",
298
+ className: "rounded-lg px-4 py-2 text-sm font-medium text-white transition-opacity duration-200 hover:opacity-90 disabled:opacity-50",
294
299
  style: { backgroundColor: primaryColor },
295
300
  children: deletingId !== null ? "Deleting..." : "Delete"
296
301
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/support-bundles-card.tsx"],"names":["jsxs","jsx","useState","useCallback","Fragment"],"mappings":"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","file":"support-bundles-card.js","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { SupportBundleSummary } from \"../actions\";\n\ninterface SupportBundlesCardProps {\n totalCount: number;\n bundles: SupportBundleSummary[];\n /** Callback to download a bundle. Returns a signed URL. */\n onDownload?: (bundleId: string) => Promise<string>;\n /** Callback to delete a bundle. */\n onDelete?: (bundleId: string) => Promise<void>;\n /** Primary brand color. Defaults to \"#6366f1\". */\n primaryColor?: string;\n}\n\nconst formatBytes = (bytes: number, decimals = 1): string => {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n};\n\nconst DownloadIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12 3v14\" />\n <path d=\"M8 13l4 4 4-4\" />\n <path d=\"M5 21h14\" />\n </svg>\n);\n\nconst TrashIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n);\n\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n);\n\nconst PendingIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeDasharray=\"4 2\" />\n </svg>\n);\n\nconst AlertTriangleIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nexport const SupportBundlesCard = ({\n totalCount,\n bundles,\n onDownload,\n onDelete,\n primaryColor = \"#6366f1\"\n}: SupportBundlesCardProps) => {\n const [downloadingId, setDownloadingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [bundleToDelete, setBundleToDelete] = useState<SupportBundleSummary | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleDownload = useCallback(async (bundleId: string) => {\n if (!onDownload) return;\n\n setError(null);\n setDownloadingId(bundleId);\n\n try {\n const signedUrl = await onDownload(bundleId);\n // Trigger download via temporary link\n const link = document.createElement(\"a\");\n link.href = signedUrl;\n link.setAttribute(\"download\", \"\");\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to download bundle\");\n } finally {\n setDownloadingId(null);\n }\n }, [onDownload]);\n\n const handleDeleteClick = useCallback((bundle: SupportBundleSummary) => {\n setBundleToDelete(bundle);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!onDelete || !bundleToDelete) return;\n\n setError(null);\n setDeletingId(bundleToDelete.id);\n\n try {\n await onDelete(bundleToDelete.id);\n setBundleToDelete(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete bundle\");\n setBundleToDelete(null);\n } finally {\n setDeletingId(null);\n }\n }, [onDelete, bundleToDelete]);\n\n const handleDeleteCancel = useCallback(() => {\n setBundleToDelete(null);\n }, []);\n\n const isActionDisabled = downloadingId !== null || deletingId !== null;\n\n const renderIssues = (insights: SupportBundleSummary[\"insights\"]) => {\n const errors = insights?.filter((i) => i.level === \"error\")?.length ?? 0;\n const warnings = insights?.filter((i) => i.level === \"warn\")?.length ?? 0;\n\n if (!errors && !warnings) {\n return (\n <span className=\"text-gray-400\">No issues found</span>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {errors > 0 && (\n <span className=\"inline-flex items-center gap-1 text-red-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {errors} {errors === 1 ? \"error\" : \"errors\"}\n </span>\n )}\n {warnings > 0 && (\n <span className=\"inline-flex items-center gap-1 text-yellow-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {warnings} {warnings === 1 ? \"warning\" : \"warnings\"}\n </span>\n )}\n </div>\n );\n };\n\n return (\n <>\n <section className=\"rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]\">\n <header className=\"flex items-center justify-between\">\n <h2 className=\"text-xl font-semibold text-gray-900\">Support Bundles</h2>\n {totalCount > 0 && (\n <span className=\"text-sm text-gray-500\">{totalCount} total</span>\n )}\n </header>\n\n {error && (\n <div className=\"mt-4 rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700\">\n {error}\n </div>\n )}\n\n <div className=\"mt-4\">\n {bundles.length === 0 ? (\n <p className=\"rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500\">\n No support bundles have been uploaded yet.\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-xl border border-gray-200\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Instance\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Date Collected\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Status\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Issues\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Size\n </th>\n {(onDownload || onDelete) && (\n <th scope=\"col\" className=\"relative px-4 py-3\">\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200 bg-white\">\n {bundles.map((bundle) => {\n const isDownloading = downloadingId === bundle.id;\n const isDeleting = deletingId === bundle.id;\n const status = bundle.status ?? \"uploaded\";\n const isUploaded = status === \"uploaded\";\n\n return (\n <tr key={bundle.id}>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-900\">\n {(bundle.instanceId || bundle.id).slice(0, 7)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.createdAt\n ? new Date(bundle.createdAt).toLocaleString()\n : \"Unknown\"}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3\">\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${\n isUploaded\n ? \"bg-green-50 text-green-700\"\n : \"bg-yellow-50 text-yellow-700\"\n }`}\n >\n {isUploaded ? (\n <CheckIcon className=\"h-3 w-3\" />\n ) : (\n <PendingIcon className=\"h-3 w-3\" />\n )}\n {status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm\">\n {renderIssues(bundle.insights)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.size ? formatBytes(bundle.size) : \"—\"}\n </td>\n {(onDownload || onDelete) && (\n <td className=\"whitespace-nowrap px-4 py-3 text-right text-sm font-medium\">\n <div className=\"flex items-center justify-end gap-3\">\n {onDownload && (\n <button\n type=\"button\"\n onClick={() => handleDownload(bundle.id)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-gray-600 hover:text-gray-900 disabled:opacity-50\"\n >\n <DownloadIcon className=\"h-4 w-4\" />\n {isDownloading ? \"Downloading...\" : \"Download\"}\n </button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => handleDeleteClick(bundle)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-red-600 hover:text-red-700 disabled:opacity-50\"\n >\n <TrashIcon className=\"h-4 w-4\" />\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </button>\n )}\n </div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </section>\n\n {/* Delete Confirmation Modal */}\n {bundleToDelete && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-modal-title\"\n >\n <div className=\"w-full max-w-md rounded-2xl bg-white p-6 shadow-xl\">\n <h3 id=\"delete-modal-title\" className=\"text-lg font-semibold text-gray-900\">\n Confirm Deletion\n </h3>\n <p className=\"mt-2 text-sm text-gray-600\">\n Are you sure you want to delete this support bundle? This action cannot be undone.\n </p>\n <div className=\"mt-4 rounded-lg bg-gray-50 p-3 text-sm text-gray-700\">\n <div className=\"mb-1\">\n <span className=\"font-medium\">Instance ID:</span>{\" \"}\n {(bundleToDelete.instanceId || bundleToDelete.id).slice(0, 7)}\n </div>\n <div className=\"mb-1\">\n <span className=\"font-medium\">Date Collected:</span>{\" \"}\n {bundleToDelete.createdAt\n ? new Date(bundleToDelete.createdAt).toLocaleString()\n : \"Unknown\"}\n </div>\n {bundleToDelete.size && (\n <div className=\"mb-1\">\n <span className=\"font-medium\">Size:</span> {formatBytes(bundleToDelete.size)}\n </div>\n )}\n <div>\n <span className=\"font-medium\">Status:</span>{\" \"}\n {(bundleToDelete.status ?? \"uploaded\").charAt(0).toUpperCase() +\n (bundleToDelete.status ?? \"uploaded\").slice(1)}\n </div>\n </div>\n <div className=\"mt-6 flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={handleDeleteCancel}\n disabled={deletingId !== null}\n className=\"rounded-lg bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-200 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteConfirm}\n disabled={deletingId !== null}\n className=\"rounded-lg px-4 py-2 text-sm font-medium text-white transition hover:opacity-90 disabled:opacity-50\"\n style={{ backgroundColor: primaryColor }}\n >\n {deletingId !== null ? \"Deleting...\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n};\n\nSupportBundlesCard.displayName = \"SupportBundlesCard\";\n"]}
1
+ {"version":3,"sources":["../src/utils/format.ts","../src/utils/constants.ts","../src/components/support-bundles-card.tsx"],"names":["jsxs","jsx","useState","useCallback","Fragment"],"mappings":"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","file":"support-bundles-card.js","sourcesContent":["/**\n * Format bytes to human-readable string\n * @param bytes - Number of bytes\n * @param decimals - Number of decimal places (default: 1)\n * @returns Formatted string (e.g., \"1.5 MB\")\n */\nexport function formatBytes(bytes: number, decimals = 1): string {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n\n/**\n * Format date string to short numeric date (no time)\n * @param dateString - ISO date string or null/undefined\n * @returns Formatted string (e.g., \"01/27/2026\") or \"Never\" if no date\n */\nexport function formatDateShort(dateString?: string | null): string {\n if (!dateString) return \"Never\";\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return dateString;\n }\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\"\n });\n}\n\n/**\n * Format date string to human-readable local timestamp\n * @param dateString - ISO date string or null/undefined\n * @returns Formatted string (e.g., \"Jan 27, 2026, 10:32 PM\") or \"Never\" if no date\n */\nexport function formatDate(dateString?: string | null): string {\n if (!dateString) return \"Never\";\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return dateString;\n }\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true\n });\n}\n\n/**\n * Format date string to human-readable UTC timestamp\n * @param dateString - ISO date string\n * @returns Formatted string (e.g., \"01/27/2026, 22:32:39 UTC\")\n */\nexport function formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return dateString;\n }\n return date.toLocaleString(\"en-US\", {\n timeZone: \"UTC\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false\n }) + \" UTC\";\n}\n\n/**\n * Format date string to user-friendly local timestamp with 12-hour time\n * @param dateString - ISO date string or null/undefined\n * @returns Formatted string (e.g., \"1/27/2026, 10:32 PM\") or \"N/A\" if not provided\n */\nexport function formatDateTimeLocal(dateString?: string | null): string {\n if (!dateString) return \"N/A\";\n\n try {\n const date = new Date(dateString);\n if (isNaN(date.getTime())) {\n return dateString;\n }\n return date.toLocaleDateString(\"en-US\", {\n month: \"numeric\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true\n });\n } catch {\n return \"N/A\";\n }\n}\n","/**\n * Default globe favicon matching the CiGlobe icon (Circum Icons)\n * Used as fallback when custom branding doesn't provide a favicon\n */\nexport const DEFAULT_FAVICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='1.5'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cellipse cx='12' cy='12' rx='4' ry='10'/%3E%3Cpath d='M2 12h20'/%3E%3C/svg%3E\";\n\n/**\n * Default primary brand color\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#4f46e5\";\n\n/**\n * Default secondary brand color\n */\nexport const DEFAULT_SECONDARY_COLOR = \"#6366f1\";\n\n/**\n * Check if the API origin is HTTP (used for repldev environments)\n * This determines cookie security settings for cross-origin iframes\n * @returns true if the API origin starts with http:// (not https://)\n */\nexport const isHttpApiOrigin = (): boolean => {\n return process.env.REPLICATED_APP_ORIGIN?.startsWith('http://') || false;\n};\n","\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { SupportBundleSummary } from \"../actions\";\nimport { formatBytes } from \"../utils/format\";\nimport { DEFAULT_SECONDARY_COLOR } from \"../utils/constants\";\n\ninterface SupportBundlesCardProps {\n totalCount: number;\n bundles: SupportBundleSummary[];\n /** Callback to download a bundle. Returns a signed URL. */\n onDownload?: (bundleId: string) => Promise<string>;\n /** Callback to delete a bundle. */\n onDelete?: (bundleId: string) => Promise<void>;\n /** Primary brand color. Defaults to DEFAULT_SECONDARY_COLOR. */\n primaryColor?: string;\n}\n\nconst DownloadIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12 3v14\" />\n <path d=\"M8 13l4 4 4-4\" />\n <path d=\"M5 21h14\" />\n </svg>\n);\n\nconst TrashIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n);\n\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n);\n\nconst PendingIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeDasharray=\"4 2\" />\n </svg>\n);\n\nconst AlertTriangleIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nexport const SupportBundlesCard = ({\n totalCount,\n bundles,\n onDownload,\n onDelete,\n primaryColor = DEFAULT_SECONDARY_COLOR\n}: SupportBundlesCardProps) => {\n const [downloadingId, setDownloadingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [bundleToDelete, setBundleToDelete] = useState<SupportBundleSummary | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleDownload = useCallback(async (bundleId: string) => {\n if (!onDownload) return;\n\n setError(null);\n setDownloadingId(bundleId);\n\n try {\n const signedUrl = await onDownload(bundleId);\n // Trigger download via temporary link\n const link = document.createElement(\"a\");\n link.href = signedUrl;\n link.setAttribute(\"download\", \"\");\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to download bundle\");\n } finally {\n setDownloadingId(null);\n }\n }, [onDownload]);\n\n const handleDeleteClick = useCallback((bundle: SupportBundleSummary) => {\n setBundleToDelete(bundle);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!onDelete || !bundleToDelete) return;\n\n setError(null);\n setDeletingId(bundleToDelete.id);\n\n try {\n await onDelete(bundleToDelete.id);\n setBundleToDelete(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete bundle\");\n setBundleToDelete(null);\n } finally {\n setDeletingId(null);\n }\n }, [onDelete, bundleToDelete]);\n\n const handleDeleteCancel = useCallback(() => {\n setBundleToDelete(null);\n }, []);\n\n const isActionDisabled = downloadingId !== null || deletingId !== null;\n\n const renderIssues = (insights: SupportBundleSummary[\"insights\"]) => {\n const errors = insights?.filter((i) => i.level === \"error\")?.length ?? 0;\n const warnings = insights?.filter((i) => i.level === \"warn\")?.length ?? 0;\n\n if (!errors && !warnings) {\n return (\n <span className=\"text-gray-400\">No issues found</span>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {errors > 0 && (\n <span className=\"inline-flex items-center gap-1 text-red-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {errors} {errors === 1 ? \"error\" : \"errors\"}\n </span>\n )}\n {warnings > 0 && (\n <span className=\"inline-flex items-center gap-1 text-yellow-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {warnings} {warnings === 1 ? \"warning\" : \"warnings\"}\n </span>\n )}\n </div>\n );\n };\n\n return (\n <>\n <section className=\"rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]\">\n <header className=\"flex items-center justify-between\">\n <h2 className=\"text-xl font-semibold text-gray-900\">Support Bundles</h2>\n {totalCount > 0 && (\n <span className=\"text-sm text-gray-500\">{totalCount} total</span>\n )}\n </header>\n\n {error && (\n <div className=\"mt-4 rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700\">\n {error}\n </div>\n )}\n\n <div className=\"mt-4\">\n {bundles.length === 0 ? (\n <p className=\"rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500\">\n No support bundles have been uploaded yet.\n </p>\n ) : (\n <div className=\"overflow-x-auto rounded-xl border border-gray-200\">\n <table className=\"w-full min-w-[700px] divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Instance\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Date Collected\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Status\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Issues\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Size\n </th>\n {(onDownload || onDelete) && (\n <th scope=\"col\" className=\"relative px-4 py-3\">\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200 bg-white\">\n {bundles.map((bundle) => {\n const isDownloading = downloadingId === bundle.id;\n const isDeleting = deletingId === bundle.id;\n const status = bundle.status ?? \"uploaded\";\n const isUploaded = status === \"uploaded\";\n\n return (\n <tr key={bundle.id}>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-900\">\n {(bundle.instanceId || bundle.id).slice(0, 7)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.createdAt\n ? new Date(bundle.createdAt).toLocaleString()\n : \"Unknown\"}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3\">\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${\n isUploaded\n ? \"bg-green-50 text-green-700\"\n : \"bg-yellow-50 text-yellow-700\"\n }`}\n >\n {isUploaded ? (\n <CheckIcon className=\"h-3 w-3\" />\n ) : (\n <PendingIcon className=\"h-3 w-3\" />\n )}\n {status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm\">\n {renderIssues(bundle.insights)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.size ? formatBytes(bundle.size) : \"—\"}\n </td>\n {(onDownload || onDelete) && (\n <td className=\"whitespace-nowrap px-4 py-3 text-right text-sm font-medium\">\n <div className=\"flex items-center justify-end gap-3\">\n {onDownload && (\n <button\n type=\"button\"\n onClick={() => handleDownload(bundle.id)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-gray-600 hover:text-gray-900 disabled:opacity-50\"\n >\n <DownloadIcon className=\"h-4 w-4\" />\n {isDownloading ? \"Downloading...\" : \"Download\"}\n </button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => handleDeleteClick(bundle)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-red-600 hover:text-red-700 disabled:opacity-50\"\n >\n <TrashIcon className=\"h-4 w-4\" />\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </button>\n )}\n </div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </section>\n\n {/* Delete Confirmation Modal */}\n {bundleToDelete && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-modal-title\"\n >\n <div className=\"w-full max-w-md rounded-2xl bg-white p-6 shadow-xl\">\n <h3 id=\"delete-modal-title\" className=\"text-lg font-semibold text-gray-900\">\n Confirm Deletion\n </h3>\n <p className=\"mt-2 text-sm text-gray-600\">\n Are you sure you want to delete this support bundle? This action cannot be undone.\n </p>\n <div className=\"mt-4 rounded-lg bg-gray-50 p-3 text-sm text-gray-700\">\n <div className=\"mb-1\">\n <span className=\"font-medium\">Instance ID:</span>{\" \"}\n {(bundleToDelete.instanceId || bundleToDelete.id).slice(0, 7)}\n </div>\n <div className=\"mb-1\">\n <span className=\"font-medium\">Date Collected:</span>{\" \"}\n {bundleToDelete.createdAt\n ? new Date(bundleToDelete.createdAt).toLocaleString()\n : \"Unknown\"}\n </div>\n {bundleToDelete.size && (\n <div className=\"mb-1\">\n <span className=\"font-medium\">Size:</span> {formatBytes(bundleToDelete.size)}\n </div>\n )}\n <div>\n <span className=\"font-medium\">Status:</span>{\" \"}\n {(bundleToDelete.status ?? \"uploaded\").charAt(0).toUpperCase() +\n (bundleToDelete.status ?? \"uploaded\").slice(1)}\n </div>\n </div>\n <div className=\"mt-6 flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={handleDeleteCancel}\n disabled={deletingId !== null}\n className=\"rounded-lg bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-200 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteConfirm}\n disabled={deletingId !== null}\n className=\"rounded-lg px-4 py-2 text-sm font-medium text-white transition-opacity duration-200 hover:opacity-90 disabled:opacity-50\"\n style={{ backgroundColor: primaryColor }}\n >\n {deletingId !== null ? \"Deleting...\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n};\n\nSupportBundlesCard.displayName = \"SupportBundlesCard\";\n"]}
@@ -13,7 +13,18 @@ var Link__default = /*#__PURE__*/_interopDefault(Link);
13
13
  * Enterprise Portal Components
14
14
  * This file is generated by tsup. Do not edit manually.
15
15
  */
16
+ var __defProp = Object.defineProperty;
17
+ var __export = (target, all) => {
18
+ for (var name in all)
19
+ __defProp(target, name, { get: all[name], enumerable: true });
20
+ };
16
21
 
22
+ // datadog/tracer.ts
23
+ var tracer_exports = {};
24
+ __export(tracer_exports, {
25
+ default: () => tracer_default
26
+ });
27
+ var tracer_default;
17
28
 
18
29
  // src/utils/api-client.ts
19
30
  function isRedirectError(error) {
@@ -41,8 +52,17 @@ async function handle401() {
41
52
  const { redirect } = await import('next/navigation');
42
53
  return redirect("/?expired=1");
43
54
  }
55
+ function isErrorPage(url) {
56
+ try {
57
+ const urlObj = new URL(url);
58
+ return urlObj.pathname === "/error";
59
+ } catch {
60
+ return url === "/error" || url.startsWith("/error?");
61
+ }
62
+ }
44
63
  async function handleServerError(statusCode) {
45
64
  const { redirect } = await import('next/navigation');
65
+ const { cookies } = await import('next/headers');
46
66
  let sourceUrl;
47
67
  try {
48
68
  const { headers } = await import('next/headers');
@@ -50,12 +70,20 @@ async function handleServerError(statusCode) {
50
70
  const referer = headersList.get("referer");
51
71
  const host = headersList.get("host");
52
72
  const pathname = headersList.get("x-invoke-path") || headersList.get("x-forwarded-path");
53
- if (referer) {
73
+ if (referer && !isErrorPage(referer)) {
54
74
  sourceUrl = referer;
55
75
  } else if (host && pathname) {
56
76
  const protocol = headersList.get("x-forwarded-proto") || "https";
57
77
  sourceUrl = `${protocol}://${host}${pathname}`;
58
78
  }
79
+ if (!sourceUrl || isErrorPage(sourceUrl)) {
80
+ const cookieStore = await cookies();
81
+ const preservedSource = cookieStore.get("portal_error_source");
82
+ if (preservedSource?.value) {
83
+ sourceUrl = decodeURIComponent(preservedSource.value);
84
+ cookieStore.delete("portal_error_source");
85
+ }
86
+ }
59
87
  } catch (error) {
60
88
  console.debug("[portal-components] Could not determine source URL", error);
61
89
  }
@@ -98,11 +126,15 @@ var fetchCustomBrandingImpl = async () => {
98
126
  const payload = await response.json();
99
127
  const brandingObject = {
100
128
  logo: payload.logoUrl,
101
- title: payload.appName,
102
- customColor1: payload.primaryColor,
103
- customColor2: payload.secondaryColor,
129
+ title: payload.title,
130
+ primaryColor: payload.primaryColor,
131
+ secondaryColor: payload.secondaryColor,
104
132
  favicon: payload.faviconUrl,
105
- supportPortalLink: payload.supportPortalLink || ""
133
+ supportPortalLink: payload.supportPortalLink || "",
134
+ background: payload.background,
135
+ backgroundImage: payload.backgroundImage,
136
+ customColor1: payload.customColor1,
137
+ customColor2: payload.customColor2
106
138
  };
107
139
  const brandingData = buffer.Buffer.from(JSON.stringify(brandingObject)).toString("base64");
108
140
  return {