@replicated/portal-components 0.0.21 → 0.0.22

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 (182) 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 +39 -0
  4. package/dist/actions/change-team.js.map +1 -1
  5. package/dist/actions/index.d.mts +1 -1
  6. package/dist/actions/index.d.ts +1 -1
  7. package/dist/actions/index.js +40 -0
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/install-actions.d.mts +1 -1
  10. package/dist/actions/install-actions.d.ts +1 -1
  11. package/dist/actions/install-actions.js +39 -0
  12. package/dist/actions/install-actions.js.map +1 -1
  13. package/dist/actions/service-account.d.mts +1 -1
  14. package/dist/actions/service-account.d.ts +1 -1
  15. package/dist/actions/service-account.js +39 -0
  16. package/dist/actions/service-account.js.map +1 -1
  17. package/dist/actions/support-bundles.d.mts +1 -1
  18. package/dist/actions/support-bundles.d.ts +1 -1
  19. package/dist/actions/support-bundles.js +39 -0
  20. package/dist/actions/support-bundles.js.map +1 -1
  21. package/dist/actions/team-settings.d.mts +1 -1
  22. package/dist/actions/team-settings.d.ts +1 -1
  23. package/dist/actions/team-settings.js +39 -0
  24. package/dist/actions/team-settings.js.map +1 -1
  25. package/dist/actions/trial-signup.js +39 -0
  26. package/dist/actions/trial-signup.js.map +1 -1
  27. package/dist/actions/user-settings.d.mts +1 -1
  28. package/dist/actions/user-settings.d.ts +1 -1
  29. package/dist/actions/user-settings.js +39 -0
  30. package/dist/actions/user-settings.js.map +1 -1
  31. package/dist/airgap-instances.d.mts +1 -1
  32. package/dist/airgap-instances.d.ts +1 -1
  33. package/dist/airgap-instances.js +3 -2
  34. package/dist/airgap-instances.js.map +1 -1
  35. package/dist/esm/actions/change-team.js +39 -0
  36. package/dist/esm/actions/change-team.js.map +1 -1
  37. package/dist/esm/actions/index.js +40 -1
  38. package/dist/esm/actions/index.js.map +1 -1
  39. package/dist/esm/actions/install-actions.js +39 -0
  40. package/dist/esm/actions/install-actions.js.map +1 -1
  41. package/dist/esm/actions/service-account.js +39 -0
  42. package/dist/esm/actions/service-account.js.map +1 -1
  43. package/dist/esm/actions/support-bundles.js +39 -0
  44. package/dist/esm/actions/support-bundles.js.map +1 -1
  45. package/dist/esm/actions/team-settings.js +39 -0
  46. package/dist/esm/actions/team-settings.js.map +1 -1
  47. package/dist/esm/actions/trial-signup.js +39 -0
  48. package/dist/esm/actions/trial-signup.js.map +1 -1
  49. package/dist/esm/actions/user-settings.js +39 -0
  50. package/dist/esm/actions/user-settings.js.map +1 -1
  51. package/dist/esm/airgap-instances.js +3 -2
  52. package/dist/esm/airgap-instances.js.map +1 -1
  53. package/dist/esm/helm-install-wizard.js +414 -189
  54. package/dist/esm/helm-install-wizard.js.map +1 -1
  55. package/dist/esm/index.js +89 -64
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/install-actions.js +39 -0
  58. package/dist/esm/install-actions.js.map +1 -1
  59. package/dist/esm/instance-card.js +2 -1
  60. package/dist/esm/instance-card.js.map +1 -1
  61. package/dist/esm/license-details.js +39 -0
  62. package/dist/esm/license-details.js.map +1 -1
  63. package/dist/esm/linux-install-wizard.js +310 -166
  64. package/dist/esm/linux-install-wizard.js.map +1 -1
  65. package/dist/esm/logout-action.js +187 -0
  66. package/dist/esm/logout-action.js.map +1 -0
  67. package/dist/esm/logout-button.js +32 -0
  68. package/dist/esm/logout-button.js.map +1 -0
  69. package/dist/esm/markdown-renderer.js +16 -0
  70. package/dist/esm/markdown-renderer.js.map +1 -0
  71. package/dist/esm/middleware.js +3 -3
  72. package/dist/esm/middleware.js.map +1 -1
  73. package/dist/esm/online-instance-list.js +3 -2
  74. package/dist/esm/online-instance-list.js.map +1 -1
  75. package/dist/esm/saml-callback-client.js +5 -2
  76. package/dist/esm/saml-callback-client.js.map +1 -1
  77. package/dist/esm/saml-handlers.js +104 -0
  78. package/dist/esm/saml-handlers.js.map +1 -1
  79. package/dist/esm/support-bundle-collection-card.js +3 -2
  80. package/dist/esm/support-bundle-collection-card.js.map +1 -1
  81. package/dist/esm/support-bundles-card.js +2 -2
  82. package/dist/esm/support-bundles-card.js.map +1 -1
  83. package/dist/esm/support-card.js +39 -0
  84. package/dist/esm/support-card.js.map +1 -1
  85. package/dist/esm/top-nav-menu-close.js +46 -0
  86. package/dist/esm/top-nav-menu-close.js.map +1 -0
  87. package/dist/esm/top-nav.js +149 -59
  88. package/dist/esm/top-nav.js.map +1 -1
  89. package/dist/esm/trial-signup.js +6 -3
  90. package/dist/esm/trial-signup.js.map +1 -1
  91. package/dist/esm/update-layout.js +149 -59
  92. package/dist/esm/update-layout.js.map +1 -1
  93. package/dist/esm/upload-support-bundle-modal.js +2 -2
  94. package/dist/esm/upload-support-bundle-modal.js.map +1 -1
  95. package/dist/esm/user-menu-dropdown.js +52 -0
  96. package/dist/esm/user-menu-dropdown.js.map +1 -0
  97. package/dist/esm/user-settings.js +5 -5
  98. package/dist/esm/user-settings.js.map +1 -1
  99. package/dist/esm/utils/index.js +39 -0
  100. package/dist/esm/utils/index.js.map +1 -1
  101. package/dist/helm-install-wizard.d.mts +18 -7
  102. package/dist/helm-install-wizard.d.ts +18 -7
  103. package/dist/helm-install-wizard.js +418 -189
  104. package/dist/helm-install-wizard.js.map +1 -1
  105. package/dist/{index-sMbq94M7.d.ts → index-DXy7RxOX.d.ts} +18 -1
  106. package/dist/{index-DyzJ0yKD.d.mts → index-JX9-CIMA.d.mts} +18 -1
  107. package/dist/index.d.mts +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +89 -64
  110. package/dist/index.js.map +1 -1
  111. package/dist/install-actions.d.mts +2 -2
  112. package/dist/install-actions.d.ts +2 -2
  113. package/dist/install-actions.js +39 -0
  114. package/dist/install-actions.js.map +1 -1
  115. package/dist/instance-card.d.mts +1 -1
  116. package/dist/instance-card.d.ts +1 -1
  117. package/dist/instance-card.js +2 -1
  118. package/dist/instance-card.js.map +1 -1
  119. package/dist/license-details.js +39 -0
  120. package/dist/license-details.js.map +1 -1
  121. package/dist/linux-install-wizard.d.mts +17 -7
  122. package/dist/linux-install-wizard.d.ts +17 -7
  123. package/dist/linux-install-wizard.js +314 -166
  124. package/dist/linux-install-wizard.js.map +1 -1
  125. package/dist/logout-action.d.mts +7 -0
  126. package/dist/logout-action.d.ts +7 -0
  127. package/dist/logout-action.js +189 -0
  128. package/dist/logout-action.js.map +1 -0
  129. package/dist/logout-button.d.mts +16 -0
  130. package/dist/logout-button.d.ts +16 -0
  131. package/dist/logout-button.js +34 -0
  132. package/dist/logout-button.js.map +1 -0
  133. package/dist/markdown-renderer.d.mts +12 -0
  134. package/dist/markdown-renderer.d.ts +12 -0
  135. package/dist/markdown-renderer.js +22 -0
  136. package/dist/markdown-renderer.js.map +1 -0
  137. package/dist/middleware.js +3 -3
  138. package/dist/middleware.js.map +1 -1
  139. package/dist/online-instance-list.d.mts +1 -1
  140. package/dist/online-instance-list.d.ts +1 -1
  141. package/dist/online-instance-list.js +3 -2
  142. package/dist/online-instance-list.js.map +1 -1
  143. package/dist/pending-installations.d.mts +1 -1
  144. package/dist/pending-installations.d.ts +1 -1
  145. package/dist/saml-callback-client.js +5 -2
  146. package/dist/saml-callback-client.js.map +1 -1
  147. package/dist/saml-handlers.js +104 -0
  148. package/dist/saml-handlers.js.map +1 -1
  149. package/dist/security-card.d.mts +1 -1
  150. package/dist/security-card.d.ts +1 -1
  151. package/dist/styles.css +39 -0
  152. package/dist/support-bundle-collection-card.js +3 -2
  153. package/dist/support-bundle-collection-card.js.map +1 -1
  154. package/dist/support-bundles-card.d.mts +2 -2
  155. package/dist/support-bundles-card.d.ts +2 -2
  156. package/dist/support-bundles-card.js +2 -2
  157. package/dist/support-bundles-card.js.map +1 -1
  158. package/dist/support-card.js +39 -0
  159. package/dist/support-card.js.map +1 -1
  160. package/dist/top-nav-menu-close.d.mts +10 -0
  161. package/dist/top-nav-menu-close.d.ts +10 -0
  162. package/dist/top-nav-menu-close.js +48 -0
  163. package/dist/top-nav-menu-close.js.map +1 -0
  164. package/dist/top-nav.js +149 -59
  165. package/dist/top-nav.js.map +1 -1
  166. package/dist/trial-signup.js +6 -3
  167. package/dist/trial-signup.js.map +1 -1
  168. package/dist/update-layout.js +149 -59
  169. package/dist/update-layout.js.map +1 -1
  170. package/dist/upload-support-bundle-modal.js +2 -2
  171. package/dist/upload-support-bundle-modal.js.map +1 -1
  172. package/dist/user-menu-dropdown.d.mts +25 -0
  173. package/dist/user-menu-dropdown.d.ts +25 -0
  174. package/dist/user-menu-dropdown.js +59 -0
  175. package/dist/user-menu-dropdown.js.map +1 -0
  176. package/dist/user-settings.js +5 -5
  177. package/dist/user-settings.js.map +1 -1
  178. package/dist/utils/index.d.mts +1 -1
  179. package/dist/utils/index.d.ts +1 -1
  180. package/dist/utils/index.js +39 -0
  181. package/dist/utils/index.js.map +1 -1
  182. package/package.json +29 -2
package/dist/styles.css CHANGED
@@ -714,6 +714,14 @@ video {
714
714
  margin-bottom: 1.5rem;
715
715
  }
716
716
 
717
+ .ml-0 {
718
+ margin-left: 0px;
719
+ }
720
+
721
+ .ml-1 {
722
+ margin-left: 0.25rem;
723
+ }
724
+
717
725
  .ml-1\.5 {
718
726
  margin-left: 0.375rem;
719
727
  }
@@ -726,6 +734,10 @@ video {
726
734
  margin-left: 0.75rem;
727
735
  }
728
736
 
737
+ .ml-4 {
738
+ margin-left: 1rem;
739
+ }
740
+
729
741
  .ml-6 {
730
742
  margin-left: 1.5rem;
731
743
  }
@@ -951,6 +963,10 @@ video {
951
963
  width: 1.25rem;
952
964
  }
953
965
 
966
+ .w-52 {
967
+ width: 13rem;
968
+ }
969
+
954
970
  .w-6 {
955
971
  width: 1.5rem;
956
972
  }
@@ -1840,6 +1856,10 @@ video {
1840
1856
  padding-bottom: 1.5rem;
1841
1857
  }
1842
1858
 
1859
+ .pl-0 {
1860
+ padding-left: 0px;
1861
+ }
1862
+
1843
1863
  .pl-12 {
1844
1864
  padding-left: 3rem;
1845
1865
  }
@@ -1888,6 +1908,10 @@ video {
1888
1908
  text-align: right;
1889
1909
  }
1890
1910
 
1911
+ .align-text-bottom {
1912
+ vertical-align: text-bottom;
1913
+ }
1914
+
1891
1915
  .font-mono {
1892
1916
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1893
1917
  }
@@ -2678,6 +2702,11 @@ body {
2678
2702
  padding-bottom: 0px;
2679
2703
  }
2680
2704
 
2705
+ .hover\:border-gray-200:hover {
2706
+ --tw-border-opacity: 1;
2707
+ border-color: rgb(229 231 235 / var(--tw-border-opacity, 1));
2708
+ }
2709
+
2681
2710
  .hover\:border-gray-300:hover {
2682
2711
  --tw-border-opacity: 1;
2683
2712
  border-color: rgb(209 213 219 / var(--tw-border-opacity, 1));
@@ -2728,6 +2757,11 @@ body {
2728
2757
  background-color: rgb(254 226 226 / var(--tw-bg-opacity, 1));
2729
2758
  }
2730
2759
 
2760
+ .hover\:bg-red-50:hover {
2761
+ --tw-bg-opacity: 1;
2762
+ background-color: rgb(254 242 242 / var(--tw-bg-opacity, 1));
2763
+ }
2764
+
2731
2765
  .hover\:bg-red-700:hover {
2732
2766
  --tw-bg-opacity: 1;
2733
2767
  background-color: rgb(185 28 28 / var(--tw-bg-opacity, 1));
@@ -2885,6 +2919,11 @@ body {
2885
2919
  opacity: 0.6;
2886
2920
  }
2887
2921
 
2922
+ .group[open] .group-open\:rotate-180 {
2923
+ --tw-rotate: 180deg;
2924
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
2925
+ }
2926
+
2888
2927
  .group:hover .group-hover\:opacity-100 {
2889
2928
  opacity: 1;
2890
2929
  }
@@ -10,6 +10,7 @@ var jsxRuntime = require('react/jsx-runtime');
10
10
  */
11
11
 
12
12
  // src/utils/constants.ts
13
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
13
14
  var DEFAULT_SECONDARY_COLOR = "#6366f1";
14
15
  function useCopyToClipboard(resetDelay = 2e3) {
15
16
  const [copied, setCopied] = react.useState(false);
@@ -134,7 +135,7 @@ var SupportBundleCollectionCard = ({
134
135
  type: "button",
135
136
  onClick: onUploadClick,
136
137
  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})` },
138
+ style: { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_PRIMARY_COLOR})` },
138
139
  children: [
139
140
  /* @__PURE__ */ jsxRuntime.jsxs(
140
141
  "svg",
@@ -167,7 +168,7 @@ var SupportBundleCollectionCard = ({
167
168
  type: "button",
168
169
  onClick: () => setActiveTab(tab),
169
170
  className: `${tabButtonBase} ${isActive ? "text-white shadow" : "text-gray-600 hover:bg-white"}`,
170
- style: isActive ? { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_SECONDARY_COLOR})` } : void 0,
171
+ style: isActive ? { backgroundColor: primaryColor ?? `var(--portal-branding-primary, ${DEFAULT_PRIMARY_COLOR})` } : void 0,
171
172
  children: tab
172
173
  },
173
174
  tab
@@ -1 +1 @@
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
+ {"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_PRIMARY_COLOR, 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_PRIMARY_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_PRIMARY_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,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { q as SupportBundleSummary } from './index-DyzJ0yKD.mjs';
2
+ import { q as SupportBundleSummary } from './index-JX9-CIMA.mjs';
3
3
  import './fetch-license-iTyF7_GY.mjs';
4
4
  import './actions/change-team.mjs';
5
5
  import './actions/trial-signup.mjs';
@@ -11,7 +11,7 @@ interface SupportBundlesCardProps {
11
11
  onDownload?: (bundleId: string) => Promise<string>;
12
12
  /** Callback to delete a bundle. */
13
13
  onDelete?: (bundleId: string) => Promise<void>;
14
- /** Primary brand color. Defaults to DEFAULT_SECONDARY_COLOR. */
14
+ /** Primary brand color. Defaults to DEFAULT_PRIMARY_COLOR. */
15
15
  primaryColor?: string;
16
16
  }
17
17
  declare const SupportBundlesCard: {
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { q as SupportBundleSummary } from './index-sMbq94M7.js';
2
+ import { q as SupportBundleSummary } from './index-DXy7RxOX.js';
3
3
  import './fetch-license-iTyF7_GY.js';
4
4
  import './actions/change-team.js';
5
5
  import './actions/trial-signup.js';
@@ -11,7 +11,7 @@ interface SupportBundlesCardProps {
11
11
  onDownload?: (bundleId: string) => Promise<string>;
12
12
  /** Callback to delete a bundle. */
13
13
  onDelete?: (bundleId: string) => Promise<void>;
14
- /** Primary brand color. Defaults to DEFAULT_SECONDARY_COLOR. */
14
+ /** Primary brand color. Defaults to DEFAULT_PRIMARY_COLOR. */
15
15
  primaryColor?: string;
16
16
  }
17
17
  declare const SupportBundlesCard: {
@@ -21,7 +21,7 @@ function formatBytes(bytes, decimals = 1) {
21
21
  }
22
22
 
23
23
  // src/utils/constants.ts
24
- var DEFAULT_SECONDARY_COLOR = "#6366f1";
24
+ var DEFAULT_PRIMARY_COLOR = "#4f46e5";
25
25
  var DownloadIcon = ({ className }) => /* @__PURE__ */ jsxRuntime.jsxs(
26
26
  "svg",
27
27
  {
@@ -109,7 +109,7 @@ var SupportBundlesCard = ({
109
109
  bundles,
110
110
  onDownload,
111
111
  onDelete,
112
- primaryColor = DEFAULT_SECONDARY_COLOR
112
+ primaryColor = DEFAULT_PRIMARY_COLOR
113
113
  }) => {
114
114
  const [downloadingId, setDownloadingId] = react.useState(null);
115
115
  const [deletingId, setDeletingId] = react.useState(null);
@@ -1 +1 @@
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"]}
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_PRIMARY_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_PRIMARY_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_PRIMARY_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"]}
@@ -252,6 +252,45 @@ var listSupportBundles = defineServerAction({
252
252
  };
253
253
  }
254
254
  });
255
+ var fetchDocumentationImpl = async () => {
256
+ const { cookies } = await import('next/headers');
257
+ const sessionStore = await cookies();
258
+ const session = sessionStore.get("portal_session");
259
+ const token = session?.value;
260
+ if (!token) {
261
+ throw new Error("Authentication required");
262
+ }
263
+ const url = `${getApiOrigin()}/enterprise-portal/documentation`;
264
+ if (process.env.NODE_ENV !== "production") {
265
+ console.debug(
266
+ "[portal-components] fetching documentation via %s (Enterprise Portal API)",
267
+ url
268
+ );
269
+ }
270
+ const response = await authenticatedFetch(url, {
271
+ method: "GET",
272
+ token,
273
+ headers: {
274
+ accept: "application/json"
275
+ }
276
+ });
277
+ if (!response.ok) {
278
+ throw new Error(
279
+ `Documentation request failed (${response.status} ${response.statusText})`
280
+ );
281
+ }
282
+ const data = await response.json();
283
+ return {
284
+ helmPreInstall: data.helmPreInstall || "",
285
+ helmPostInstall: data.helmPostInstall || "",
286
+ embeddedClusterPreInstall: data.embeddedClusterPreInstall || "",
287
+ embeddedClusterPostInstall: data.embeddedClusterPostInstall || "",
288
+ helmInstallUrl: data.helmInstallUrl || "",
289
+ embeddedClusterInstallUrl: data.embeddedClusterInstallUrl || "",
290
+ valuesOverrideUrl: data.valuesOverrideUrl || ""
291
+ };
292
+ };
293
+ react.cache(fetchDocumentationImpl);
255
294
  var UploadIcon = (props) => /* @__PURE__ */ jsxRuntime.jsx(
256
295
  "svg",
257
296
  {