@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
@@ -0,0 +1,31 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface TrialSignupProps {
4
+ appSlug: string;
5
+ branding: {
6
+ logo?: string;
7
+ title?: string;
8
+ primaryColor?: string;
9
+ secondaryColor?: string;
10
+ } | null;
11
+ trialExpirationDays: number;
12
+ licenseType: string;
13
+ termsAndConditionsUrl: string;
14
+ defaultTitle?: string;
15
+ createTrialSignup: (payload: {
16
+ appSlug: string;
17
+ company: string;
18
+ email: string;
19
+ }) => Promise<{
20
+ success: boolean;
21
+ error?: string;
22
+ }>;
23
+ verifyTrialSignup: (code: string) => Promise<{
24
+ success: boolean;
25
+ error?: string;
26
+ redirectUrl?: string;
27
+ }>;
28
+ }
29
+ declare function TrialSignup({ appSlug, branding, trialExpirationDays, licenseType, termsAndConditionsUrl, defaultTitle, createTrialSignup, verifyTrialSignup, }: TrialSignupProps): react_jsx_runtime.JSX.Element;
30
+
31
+ export { TrialSignup, type TrialSignupProps };
@@ -0,0 +1,31 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface TrialSignupProps {
4
+ appSlug: string;
5
+ branding: {
6
+ logo?: string;
7
+ title?: string;
8
+ primaryColor?: string;
9
+ secondaryColor?: string;
10
+ } | null;
11
+ trialExpirationDays: number;
12
+ licenseType: string;
13
+ termsAndConditionsUrl: string;
14
+ defaultTitle?: string;
15
+ createTrialSignup: (payload: {
16
+ appSlug: string;
17
+ company: string;
18
+ email: string;
19
+ }) => Promise<{
20
+ success: boolean;
21
+ error?: string;
22
+ }>;
23
+ verifyTrialSignup: (code: string) => Promise<{
24
+ success: boolean;
25
+ error?: string;
26
+ redirectUrl?: string;
27
+ }>;
28
+ }
29
+ declare function TrialSignup({ appSlug, branding, trialExpirationDays, licenseType, termsAndConditionsUrl, defaultTitle, createTrialSignup, verifyTrialSignup, }: TrialSignupProps): react_jsx_runtime.JSX.Element;
30
+
31
+ export { TrialSignup, type TrialSignupProps };
@@ -0,0 +1,258 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var navigation = require('next/navigation');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ /**
9
+ * Enterprise Portal Components
10
+ * This file is generated by tsup. Do not edit manually.
11
+ */
12
+
13
+ function TrialSignup({
14
+ appSlug,
15
+ branding,
16
+ trialExpirationDays,
17
+ licenseType,
18
+ termsAndConditionsUrl,
19
+ defaultTitle = "Enterprise Portal",
20
+ createTrialSignup,
21
+ verifyTrialSignup
22
+ }) {
23
+ const [companyName, setCompanyName] = react.useState("");
24
+ const [email, setEmail] = react.useState("");
25
+ const [isCodeSent, setIsCodeSent] = react.useState(false);
26
+ const [validationCode, setValidationCode] = react.useState("");
27
+ const [termsAccepted, setTermsAccepted] = react.useState(false);
28
+ const [showTermsError, setShowTermsError] = react.useState(false);
29
+ const [error, setError] = react.useState("");
30
+ const [isPending, startTransition] = react.useTransition();
31
+ const router = navigation.useRouter();
32
+ const primaryColor = branding?.primaryColor || "#6366f1";
33
+ const secondaryColor = branding?.secondaryColor || "#6366f1";
34
+ const handleSubmit = async (e) => {
35
+ e.preventDefault();
36
+ setError("");
37
+ setShowTermsError(false);
38
+ if (termsAndConditionsUrl && !termsAccepted) {
39
+ setShowTermsError(true);
40
+ return;
41
+ }
42
+ startTransition(async () => {
43
+ const result = await createTrialSignup({
44
+ appSlug,
45
+ company: companyName,
46
+ email
47
+ });
48
+ if (result.success) {
49
+ setIsCodeSent(true);
50
+ } else {
51
+ setError(result.error || "An error occurred. Please try again.");
52
+ }
53
+ });
54
+ };
55
+ const handleValidateCode = async (e) => {
56
+ e.preventDefault();
57
+ setError("");
58
+ startTransition(async () => {
59
+ const result = await verifyTrialSignup(validationCode);
60
+ if (result.success && result.redirectUrl) {
61
+ router.push(result.redirectUrl);
62
+ router.refresh();
63
+ } else {
64
+ setError(result.error || "Verification failed. Please try again.");
65
+ }
66
+ });
67
+ };
68
+ const handleUseDifferentEmail = () => {
69
+ setIsCodeSent(false);
70
+ setCompanyName("");
71
+ setEmail("");
72
+ setValidationCode("");
73
+ setError("");
74
+ };
75
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-[480px] rounded-lg border-2 border-solid p-8", style: { borderColor: secondaryColor, minHeight: branding?.logo ? "342px" : "242px" }, children: [
76
+ branding?.logo && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ jsxRuntime.jsx(
77
+ "img",
78
+ {
79
+ src: branding.logo,
80
+ alt: branding?.title || "Logo",
81
+ className: "max-w-[360px] max-h-[48px]"
82
+ }
83
+ ) }),
84
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-center mb-2", children: branding?.title || defaultTitle }),
85
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-center text-gray-600 mb-6", children: licenseType === "community" ? "Get your community license" : `Start your ${trialExpirationDays} day trial` }),
86
+ !isCodeSent && /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit, className: "w-full", children: [
87
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "company-name", className: "block mb-2 text-gray-600", children: "Company name" }),
89
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
90
+ /* @__PURE__ */ jsxRuntime.jsx(
91
+ "svg",
92
+ {
93
+ className: "absolute w-5 h-5 text-gray-400 pointer-events-none",
94
+ style: { left: "12px", top: "50%", transform: "translateY(-50%)" },
95
+ fill: "none",
96
+ stroke: "currentColor",
97
+ viewBox: "0 0 24 24",
98
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4" })
99
+ }
100
+ ),
101
+ /* @__PURE__ */ jsxRuntime.jsx(
102
+ "input",
103
+ {
104
+ id: "company-name",
105
+ type: "text",
106
+ placeholder: "Your company",
107
+ className: "portal-input w-full py-2.5",
108
+ style: { paddingLeft: "44px" },
109
+ value: companyName,
110
+ onChange: (e) => setCompanyName(e.target.value),
111
+ required: true,
112
+ disabled: isPending
113
+ }
114
+ )
115
+ ] })
116
+ ] }),
117
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4", children: [
118
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "email", className: "block mb-2 text-gray-600", children: "Work email address" }),
119
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
120
+ /* @__PURE__ */ jsxRuntime.jsx(
121
+ "svg",
122
+ {
123
+ className: "absolute w-5 h-5 text-gray-400 pointer-events-none",
124
+ style: { left: "12px", top: "50%", transform: "translateY(-50%)" },
125
+ fill: "none",
126
+ stroke: "currentColor",
127
+ viewBox: "0 0 24 24",
128
+ children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" })
129
+ }
130
+ ),
131
+ /* @__PURE__ */ jsxRuntime.jsx(
132
+ "input",
133
+ {
134
+ id: "email",
135
+ type: "email",
136
+ placeholder: "you@company.com",
137
+ className: "portal-input w-full py-2.5",
138
+ style: { paddingLeft: "44px" },
139
+ value: email,
140
+ onChange: (e) => setEmail(e.target.value),
141
+ required: true,
142
+ disabled: isPending
143
+ }
144
+ )
145
+ ] })
146
+ ] }),
147
+ termsAndConditionsUrl && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
148
+ /* @__PURE__ */ jsxRuntime.jsx(
149
+ "input",
150
+ {
151
+ type: "checkbox",
152
+ id: "terms-checkbox",
153
+ checked: termsAccepted,
154
+ onChange: (e) => {
155
+ setTermsAccepted(e.target.checked);
156
+ if (e.target.checked) {
157
+ setShowTermsError(false);
158
+ }
159
+ },
160
+ className: "mt-1 min-w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500",
161
+ required: true,
162
+ disabled: isPending
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: "terms-checkbox", className: "text-sm text-gray-600 leading-relaxed", children: [
166
+ "I agree to the",
167
+ " ",
168
+ /* @__PURE__ */ jsxRuntime.jsx(
169
+ "a",
170
+ {
171
+ href: termsAndConditionsUrl,
172
+ target: "_blank",
173
+ rel: "noopener noreferrer",
174
+ className: "text-blue-600 hover:underline font-medium",
175
+ style: { color: primaryColor },
176
+ children: "Terms and Conditions"
177
+ }
178
+ )
179
+ ] })
180
+ ] }) }),
181
+ showTermsError && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: "Please accept the Terms and Conditions to continue." }),
182
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: error }),
183
+ /* @__PURE__ */ jsxRuntime.jsx(
184
+ "button",
185
+ {
186
+ type: "submit",
187
+ className: "w-full flex justify-center items-center bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
188
+ style: { background: primaryColor, borderColor: primaryColor },
189
+ disabled: !companyName.trim() || !email.trim() || isPending || !!termsAndConditionsUrl && !termsAccepted,
190
+ children: isPending ? "Creating account..." : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
191
+ "Create account",
192
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "ml-2 h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M14 5l7 7m0 0l-7 7m7-7H3" }) })
193
+ ] })
194
+ }
195
+ ),
196
+ /* @__PURE__ */ jsxRuntime.jsx(
197
+ "a",
198
+ {
199
+ href: "/login",
200
+ className: "hover:underline font-semibold mt-4 text-center cursor-pointer block",
201
+ style: { color: secondaryColor },
202
+ children: "Already have an account? Sign in"
203
+ }
204
+ )
205
+ ] }),
206
+ isCodeSent && /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleValidateCode, className: "w-full", children: [
207
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
208
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-1", children: [
209
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "code", className: "block text-sm font-medium text-gray-700", children: "Verification code" }),
210
+ /* @__PURE__ */ jsxRuntime.jsx(
211
+ "button",
212
+ {
213
+ type: "button",
214
+ onClick: handleUseDifferentEmail,
215
+ className: "text-sm text-blue-600 hover:text-blue-700 hover:underline",
216
+ style: { color: primaryColor },
217
+ children: "Use different email"
218
+ }
219
+ )
220
+ ] }),
221
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1", children: /* @__PURE__ */ jsxRuntime.jsx(
222
+ "input",
223
+ {
224
+ id: "code",
225
+ name: "code",
226
+ type: "text",
227
+ value: validationCode,
228
+ onChange: (e) => setValidationCode(e.target.value),
229
+ className: "portal-input w-full",
230
+ placeholder: "Enter 12-digit code",
231
+ required: true,
232
+ disabled: isPending
233
+ }
234
+ ) }),
235
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-2 text-sm text-gray-600 mb-4 text-pretty", children: [
236
+ "A verification code has been sent to ",
237
+ email,
238
+ ". Please check your inbox."
239
+ ] })
240
+ ] }),
241
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-red-600 mb-4 text-center text-sm", children: error }),
242
+ /* @__PURE__ */ jsxRuntime.jsx(
243
+ "button",
244
+ {
245
+ type: "submit",
246
+ className: "w-full bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
247
+ style: { background: primaryColor, borderColor: primaryColor },
248
+ disabled: !validationCode.trim() || isPending,
249
+ children: isPending ? "Verifying..." : licenseType === "community" ? "Verify code and get license" : "Verify code and start trial"
250
+ }
251
+ )
252
+ ] })
253
+ ] });
254
+ }
255
+
256
+ exports.TrialSignup = TrialSignup;
257
+ //# sourceMappingURL=trial-signup.js.map
258
+ //# sourceMappingURL=trial-signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/trial-signup.tsx"],"names":["useState","useTransition","useRouter","jsxs","jsx","Fragment"],"mappings":"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","file":"trial-signup.js","sourcesContent":["\"use client\";\n\nimport { useState, useTransition, FormEvent } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\nexport interface TrialSignupProps {\n appSlug: string;\n branding: {\n logo?: string;\n title?: string;\n primaryColor?: string;\n secondaryColor?: string;\n } | null;\n trialExpirationDays: number;\n licenseType: string;\n termsAndConditionsUrl: string;\n defaultTitle?: string;\n createTrialSignup: (payload: {\n appSlug: string;\n company: string;\n email: string;\n }) => Promise<{ success: boolean; error?: string }>;\n verifyTrialSignup: (code: string) => Promise<{\n success: boolean;\n error?: string;\n redirectUrl?: string;\n }>;\n}\n\nexport function TrialSignup({\n appSlug,\n branding,\n trialExpirationDays,\n licenseType,\n termsAndConditionsUrl,\n defaultTitle = \"Enterprise Portal\",\n createTrialSignup,\n verifyTrialSignup,\n}: TrialSignupProps) {\n const [companyName, setCompanyName] = useState(\"\");\n const [email, setEmail] = useState(\"\");\n const [isCodeSent, setIsCodeSent] = useState(false);\n const [validationCode, setValidationCode] = useState(\"\");\n const [termsAccepted, setTermsAccepted] = useState(false);\n const [showTermsError, setShowTermsError] = useState(false);\n const [error, setError] = useState(\"\");\n const [isPending, startTransition] = useTransition();\n const router = useRouter();\n\n const primaryColor = branding?.primaryColor || \"#6366f1\";\n const secondaryColor = branding?.secondaryColor || \"#6366f1\";\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n setShowTermsError(false);\n\n // Validate terms acceptance if required\n if (termsAndConditionsUrl && !termsAccepted) {\n setShowTermsError(true);\n return;\n }\n\n startTransition(async () => {\n const result = await createTrialSignup({\n appSlug,\n company: companyName,\n email,\n });\n\n if (result.success) {\n setIsCodeSent(true);\n } else {\n setError(result.error || \"An error occurred. Please try again.\");\n }\n });\n };\n\n const handleValidateCode = async (e: FormEvent) => {\n e.preventDefault();\n setError(\"\");\n\n startTransition(async () => {\n const result = await verifyTrialSignup(validationCode);\n\n if (result.success && result.redirectUrl) {\n // Redirect to dashboard\n router.push(result.redirectUrl);\n router.refresh();\n } else {\n setError(result.error || \"Verification failed. Please try again.\");\n }\n });\n };\n\n const handleUseDifferentEmail = () => {\n setIsCodeSent(false);\n setCompanyName(\"\");\n setEmail(\"\");\n setValidationCode(\"\");\n setError(\"\");\n };\n\n return (\n <div className=\"w-[480px] rounded-lg border-2 border-solid p-8\" style={{ borderColor: secondaryColor, minHeight: branding?.logo ? \"342px\" : \"242px\" }}>\n {/* Logo */}\n {branding?.logo && (\n <div className=\"flex justify-center mb-4\">\n <img\n src={branding.logo}\n alt={branding?.title || \"Logo\"}\n className=\"max-w-[360px] max-h-[48px]\"\n />\n </div>\n )}\n\n {/* Title */}\n <h1 className=\"text-2xl font-bold text-center mb-2\">\n {branding?.title || defaultTitle}\n </h1>\n\n {/* Subtitle */}\n <p className=\"text-center text-gray-600 mb-6\">\n {licenseType === \"community\"\n ? \"Get your community license\"\n : `Start your ${trialExpirationDays} day trial`}\n </p>\n\n {/* Step 1: Company and Email Form */}\n {!isCodeSent && (\n <form onSubmit={handleSubmit} className=\"w-full\">\n {/* Company Name */}\n <div className=\"mb-4\">\n <label htmlFor=\"company-name\" className=\"block mb-2 text-gray-600\">\n Company name\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\" />\n </svg>\n <input\n id=\"company-name\"\n type=\"text\"\n placeholder=\"Your company\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Email */}\n <div className=\"mb-4\">\n <label htmlFor=\"email\" className=\"block mb-2 text-gray-600\">\n Work email address\n </label>\n <div className=\"relative\">\n <svg \n className=\"absolute w-5 h-5 text-gray-400 pointer-events-none\" \n style={{ left: \"12px\", top: \"50%\", transform: \"translateY(-50%)\" }}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n <input\n id=\"email\"\n type=\"email\"\n placeholder=\"you@company.com\"\n className=\"portal-input w-full py-2.5\"\n style={{ paddingLeft: \"44px\" }}\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n required\n disabled={isPending}\n />\n </div>\n </div>\n\n {/* Terms and Conditions */}\n {termsAndConditionsUrl && (\n <div className=\"mb-4\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n id=\"terms-checkbox\"\n checked={termsAccepted}\n onChange={(e) => {\n setTermsAccepted(e.target.checked);\n if (e.target.checked) {\n setShowTermsError(false);\n }\n }}\n className=\"mt-1 min-w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n required\n disabled={isPending}\n />\n <label htmlFor=\"terms-checkbox\" className=\"text-sm text-gray-600 leading-relaxed\">\n I agree to the{\" \"}\n <a\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:underline font-medium\"\n style={{ color: primaryColor }}\n >\n Terms and Conditions\n </a>\n </label>\n </div>\n </div>\n )}\n\n {/* Terms Error */}\n {showTermsError && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n Please accept the Terms and Conditions to continue.\n </div>\n )}\n\n {/* API Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Submit Button */}\n <button\n type=\"submit\"\n className=\"w-full flex justify-center items-center bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={\n !companyName.trim() ||\n !email.trim() ||\n isPending ||\n (!!termsAndConditionsUrl && !termsAccepted)\n }\n >\n {isPending ? (\n \"Creating account...\"\n ) : (\n <>\n Create account\n <svg className=\"ml-2 h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M14 5l7 7m0 0l-7 7m7-7H3\" />\n </svg>\n </>\n )}\n </button>\n\n {/* Login Link */}\n <a\n href=\"/login\"\n className=\"hover:underline font-semibold mt-4 text-center cursor-pointer block\"\n style={{ color: secondaryColor }}\n >\n Already have an account? Sign in\n </a>\n </form>\n )}\n\n {/* Step 2: Verification Code Form */}\n {isCodeSent && (\n <form onSubmit={handleValidateCode} className=\"w-full\">\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label htmlFor=\"code\" className=\"block text-sm font-medium text-gray-700\">\n Verification code\n </label>\n <button\n type=\"button\"\n onClick={handleUseDifferentEmail}\n className=\"text-sm text-blue-600 hover:text-blue-700 hover:underline\"\n style={{ color: primaryColor }}\n >\n Use different email\n </button>\n </div>\n <div className=\"mt-1\">\n <input\n id=\"code\"\n name=\"code\"\n type=\"text\"\n value={validationCode}\n onChange={(e) => setValidationCode(e.target.value)}\n className=\"portal-input w-full\"\n placeholder=\"Enter 12-digit code\"\n required\n disabled={isPending}\n />\n </div>\n <p className=\"mt-2 text-sm text-gray-600 mb-4 text-pretty\">\n A verification code has been sent to {email}. Please check your inbox.\n </p>\n </div>\n\n {/* Verification Error */}\n {error && (\n <div className=\"text-red-600 mb-4 text-center text-sm\">\n {error}\n </div>\n )}\n\n {/* Verify Button */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-600 hover:bg-blue-700 text-white py-2 rounded font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ background: primaryColor, borderColor: primaryColor }}\n disabled={!validationCode.trim() || isPending}\n >\n {isPending\n ? \"Verifying...\"\n : licenseType === \"community\"\n ? \"Verify code and get license\"\n : \"Verify code and start trial\"}\n </button>\n </form>\n )}\n </div>\n );\n}\n"]}