@replicated/portal-components 0.0.27 → 0.0.29
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.
- package/components/metadata/registry.json +2 -2
- package/components/metadata/registry.md +2 -2
- package/dist/actions/branding-actions.d.mts +1 -1
- package/dist/actions/branding-actions.d.ts +1 -1
- package/dist/actions/branding-actions.js +15 -5
- package/dist/actions/branding-actions.js.map +1 -1
- package/dist/actions/change-team.js +13 -3
- package/dist/actions/change-team.js.map +1 -1
- package/dist/actions/index.d.mts +1 -1
- package/dist/actions/index.d.ts +1 -1
- package/dist/actions/index.js +16 -15
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/install-actions.d.mts +1 -1
- package/dist/actions/install-actions.d.ts +1 -1
- package/dist/actions/install-actions.js +13 -3
- package/dist/actions/install-actions.js.map +1 -1
- package/dist/actions/invite-actions.js +13 -3
- package/dist/actions/invite-actions.js.map +1 -1
- package/dist/actions/magic-link-actions.d.mts +1 -1
- package/dist/actions/magic-link-actions.d.ts +1 -1
- package/dist/actions/magic-link-actions.js +15 -5
- package/dist/actions/magic-link-actions.js.map +1 -1
- package/dist/actions/service-account.d.mts +1 -1
- package/dist/actions/service-account.d.ts +1 -1
- package/dist/actions/service-account.js +13 -3
- package/dist/actions/service-account.js.map +1 -1
- package/dist/actions/support-bundles.d.mts +1 -1
- package/dist/actions/support-bundles.d.ts +1 -1
- package/dist/actions/support-bundles.js +13 -3
- package/dist/actions/support-bundles.js.map +1 -1
- package/dist/actions/team-settings.d.mts +1 -1
- package/dist/actions/team-settings.d.ts +1 -1
- package/dist/actions/team-settings.js +13 -3
- package/dist/actions/team-settings.js.map +1 -1
- package/dist/actions/trial-signup-actions.js +13 -3
- package/dist/actions/trial-signup-actions.js.map +1 -1
- package/dist/actions/trial-signup.js +13 -3
- package/dist/actions/trial-signup.js.map +1 -1
- package/dist/actions/user-settings.d.mts +1 -1
- package/dist/actions/user-settings.d.ts +1 -1
- package/dist/actions/user-settings.js +13 -3
- package/dist/actions/user-settings.js.map +1 -1
- package/dist/airgap-instances.d.mts +1 -1
- package/dist/airgap-instances.d.ts +1 -1
- package/dist/api/saml.js +13 -3
- package/dist/api/saml.js.map +1 -1
- package/dist/api/support-bundles.js +13 -3
- package/dist/api/support-bundles.js.map +1 -1
- package/dist/{branding-DmsrDTNE.d.mts → branding-C5H0L6Vi.d.mts} +13 -1
- package/dist/{branding-DmsrDTNE.d.ts → branding-C5H0L6Vi.d.ts} +13 -1
- package/dist/esm/actions/branding-actions.js +15 -5
- package/dist/esm/actions/branding-actions.js.map +1 -1
- package/dist/esm/actions/change-team.js +13 -3
- package/dist/esm/actions/change-team.js.map +1 -1
- package/dist/esm/actions/index.js +16 -15
- package/dist/esm/actions/index.js.map +1 -1
- package/dist/esm/actions/install-actions.js +13 -3
- package/dist/esm/actions/install-actions.js.map +1 -1
- package/dist/esm/actions/invite-actions.js +13 -3
- package/dist/esm/actions/invite-actions.js.map +1 -1
- package/dist/esm/actions/magic-link-actions.js +15 -5
- package/dist/esm/actions/magic-link-actions.js.map +1 -1
- package/dist/esm/actions/service-account.js +13 -3
- package/dist/esm/actions/service-account.js.map +1 -1
- package/dist/esm/actions/support-bundles.js +13 -3
- package/dist/esm/actions/support-bundles.js.map +1 -1
- package/dist/esm/actions/team-settings.js +13 -3
- package/dist/esm/actions/team-settings.js.map +1 -1
- package/dist/esm/actions/trial-signup-actions.js +13 -3
- package/dist/esm/actions/trial-signup-actions.js.map +1 -1
- package/dist/esm/actions/trial-signup.js +13 -3
- package/dist/esm/actions/trial-signup.js.map +1 -1
- package/dist/esm/actions/user-settings.js +13 -3
- package/dist/esm/actions/user-settings.js.map +1 -1
- package/dist/esm/api/saml.js +13 -3
- package/dist/esm/api/saml.js.map +1 -1
- package/dist/esm/api/support-bundles.js +13 -3
- package/dist/esm/api/support-bundles.js.map +1 -1
- package/dist/esm/helm-install-wizard.js +13 -3
- package/dist/esm/helm-install-wizard.js.map +1 -1
- package/dist/esm/index.js +51 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install-actions.js +13 -3
- package/dist/esm/install-actions.js.map +1 -1
- package/dist/esm/license-details.js +13 -3
- package/dist/esm/license-details.js.map +1 -1
- package/dist/esm/linux-install-wizard.js +13 -3
- package/dist/esm/linux-install-wizard.js.map +1 -1
- package/dist/esm/support-card.js +13 -3
- package/dist/esm/support-card.js.map +1 -1
- package/dist/esm/top-nav.js +34 -7
- package/dist/esm/top-nav.js.map +1 -1
- package/dist/esm/update-layout.js +34 -7
- package/dist/esm/update-layout.js.map +1 -1
- package/dist/esm/use-verify-magic-link.js +4 -3
- package/dist/esm/use-verify-magic-link.js.map +1 -1
- package/dist/esm/user-menu-dropdown.js +6 -3
- package/dist/esm/user-menu-dropdown.js.map +1 -1
- package/dist/esm/utils/index.js +44 -5
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/helm-install-wizard.d.mts +2 -2
- package/dist/helm-install-wizard.d.ts +2 -2
- package/dist/helm-install-wizard.js +13 -3
- package/dist/helm-install-wizard.js.map +1 -1
- package/dist/{index-Bcp17Mf3.d.ts → index-7ibNULXY.d.ts} +3 -1
- package/dist/{index-DaH1bSuO.d.mts → index-CITwEYtK.d.mts} +3 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +51 -8
- package/dist/index.js.map +1 -1
- package/dist/install-actions.d.mts +2 -2
- package/dist/install-actions.d.ts +2 -2
- package/dist/install-actions.js +13 -3
- package/dist/install-actions.js.map +1 -1
- package/dist/instance-card.d.mts +1 -1
- package/dist/instance-card.d.ts +1 -1
- package/dist/license-details.js +13 -3
- package/dist/license-details.js.map +1 -1
- package/dist/linux-install-wizard.d.mts +2 -2
- package/dist/linux-install-wizard.d.ts +2 -2
- package/dist/linux-install-wizard.js +13 -3
- package/dist/linux-install-wizard.js.map +1 -1
- package/dist/online-instance-list.d.mts +1 -1
- package/dist/online-instance-list.d.ts +1 -1
- package/dist/pending-installations.d.mts +1 -1
- package/dist/pending-installations.d.ts +1 -1
- package/dist/security-card.d.mts +1 -1
- package/dist/security-card.d.ts +1 -1
- package/dist/styles.css +16 -0
- package/dist/support-bundles-card.d.mts +1 -1
- package/dist/support-bundles-card.d.ts +1 -1
- package/dist/support-card.js +13 -3
- package/dist/support-card.js.map +1 -1
- package/dist/{top-nav-8f2U69MF.d.ts → top-nav-B2FVC4rl.d.ts} +1 -1
- package/dist/{top-nav-B2yA3PC7.d.mts → top-nav-Cf8zMq1A.d.mts} +1 -1
- package/dist/top-nav.d.mts +2 -2
- package/dist/top-nav.d.ts +2 -2
- package/dist/top-nav.js +34 -7
- package/dist/top-nav.js.map +1 -1
- package/dist/update-layout.js +34 -7
- package/dist/update-layout.js.map +1 -1
- package/dist/use-verify-magic-link.d.mts +3 -2
- package/dist/use-verify-magic-link.d.ts +3 -2
- package/dist/use-verify-magic-link.js +4 -3
- package/dist/use-verify-magic-link.js.map +1 -1
- package/dist/user-menu-dropdown.d.mts +2 -1
- package/dist/user-menu-dropdown.d.ts +2 -1
- package/dist/user-menu-dropdown.js +6 -3
- package/dist/user-menu-dropdown.js.map +1 -1
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.js +44 -4
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,11 +15,12 @@ interface VerifyActionResult {
|
|
|
15
15
|
message?: string;
|
|
16
16
|
isExpired?: boolean;
|
|
17
17
|
}
|
|
18
|
-
type VerifyAction = (code: string) => Promise<VerifyActionResult>;
|
|
18
|
+
type VerifyAction = (code: string, isPreview?: boolean) => Promise<VerifyActionResult>;
|
|
19
19
|
interface UseVerifyMagicLinkOptions {
|
|
20
20
|
verifyAction: VerifyAction;
|
|
21
21
|
onSuccess?: () => void;
|
|
22
22
|
redirectUrl?: string;
|
|
23
|
+
isPreview?: boolean;
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
26
|
* Shared hook for magic link and trial signup verification.
|
|
@@ -29,6 +30,6 @@ interface UseVerifyMagicLinkOptions {
|
|
|
29
30
|
* Note: The verifyAction should be selected based on the verification type
|
|
30
31
|
* (regular magic link vs trial signup) before calling this hook.
|
|
31
32
|
*/
|
|
32
|
-
declare function useVerifyMagicLink({ verifyAction, onSuccess, redirectUrl }: UseVerifyMagicLinkOptions): VerifyState;
|
|
33
|
+
declare function useVerifyMagicLink({ verifyAction, onSuccess, redirectUrl, isPreview }: UseVerifyMagicLinkOptions): VerifyState;
|
|
33
34
|
|
|
34
35
|
export { type UseVerifyMagicLinkOptions, type VerifyAction, type VerifyActionResult, type VerifyState, useVerifyMagicLink };
|
|
@@ -15,11 +15,12 @@ interface VerifyActionResult {
|
|
|
15
15
|
message?: string;
|
|
16
16
|
isExpired?: boolean;
|
|
17
17
|
}
|
|
18
|
-
type VerifyAction = (code: string) => Promise<VerifyActionResult>;
|
|
18
|
+
type VerifyAction = (code: string, isPreview?: boolean) => Promise<VerifyActionResult>;
|
|
19
19
|
interface UseVerifyMagicLinkOptions {
|
|
20
20
|
verifyAction: VerifyAction;
|
|
21
21
|
onSuccess?: () => void;
|
|
22
22
|
redirectUrl?: string;
|
|
23
|
+
isPreview?: boolean;
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
26
|
* Shared hook for magic link and trial signup verification.
|
|
@@ -29,6 +30,6 @@ interface UseVerifyMagicLinkOptions {
|
|
|
29
30
|
* Note: The verifyAction should be selected based on the verification type
|
|
30
31
|
* (regular magic link vs trial signup) before calling this hook.
|
|
31
32
|
*/
|
|
32
|
-
declare function useVerifyMagicLink({ verifyAction, onSuccess, redirectUrl }: UseVerifyMagicLinkOptions): VerifyState;
|
|
33
|
+
declare function useVerifyMagicLink({ verifyAction, onSuccess, redirectUrl, isPreview }: UseVerifyMagicLinkOptions): VerifyState;
|
|
33
34
|
|
|
34
35
|
export { type UseVerifyMagicLinkOptions, type VerifyAction, type VerifyActionResult, type VerifyState, useVerifyMagicLink };
|
|
@@ -12,7 +12,8 @@ var navigation = require('next/navigation');
|
|
|
12
12
|
function useVerifyMagicLink({
|
|
13
13
|
verifyAction,
|
|
14
14
|
onSuccess,
|
|
15
|
-
redirectUrl = "/"
|
|
15
|
+
redirectUrl = "/",
|
|
16
|
+
isPreview
|
|
16
17
|
}) {
|
|
17
18
|
const router = navigation.useRouter();
|
|
18
19
|
const [state, setState] = react.useState({ status: "verifying" });
|
|
@@ -37,7 +38,7 @@ function useVerifyMagicLink({
|
|
|
37
38
|
}
|
|
38
39
|
if (verifyingRef.current) return;
|
|
39
40
|
verifyingRef.current = true;
|
|
40
|
-
verifyAction(code).then((result) => {
|
|
41
|
+
verifyAction(code, isPreview).then((result) => {
|
|
41
42
|
if (result.success) {
|
|
42
43
|
setState({
|
|
43
44
|
status: "success",
|
|
@@ -67,7 +68,7 @@ function useVerifyMagicLink({
|
|
|
67
68
|
message: "An unexpected error occurred. Please try again."
|
|
68
69
|
});
|
|
69
70
|
});
|
|
70
|
-
}, [verifyAction, router, redirectUrl, onSuccess]);
|
|
71
|
+
}, [verifyAction, router, redirectUrl, onSuccess, isPreview]);
|
|
71
72
|
return state;
|
|
72
73
|
}
|
|
73
74
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-verify-magic-link.ts"],"names":["useRouter","useState","useRef","useEffect"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-verify-magic-link.ts"],"names":["useRouter","useState","useRef","useEffect"],"mappings":";;;;;;;;;;AAkCO,SAAS,kBAAA,CAAmB;AAAA,EACjC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,GAAA;AAAA,EACd;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,SAASA,oBAAA,EAAU;AACzB,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIC,eAAsB,EAAE,MAAA,EAAQ,aAAa,CAAA;AACvE,EAAA,MAAM,YAAA,GAAeC,aAAO,KAAK,CAAA;AAEjC,EAAAC,eAAA,CAAU,MAAM;AAEd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,IAAA;AAE7B,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,CAAA,EAAG;AAC7B,MAAA,QAAA,CAAS;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,IAAK,EAAA;AAExD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAGvB,IAAA,YAAA,CAAa,IAAA,EAAM,SAAS,CAAA,CACzB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,QAAA,CAAS;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,CAAA;AAGD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,EAAU;AAAA,QACZ;AAGA,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,QACzB,GAAG,IAAI,CAAA;AAAA,MACT,CAAA,MAAA,IAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,QAAA,CAAS;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,SAC5B,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,SAC5B,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,GAAG,CAAA;AAC9D,MAAA,QAAA,CAAS;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACL,GAAG,CAAC,YAAA,EAAc,QAAQ,WAAA,EAAa,SAAA,EAAW,SAAS,CAAC,CAAA;AAE5D,EAAA,OAAO,KAAA;AACT","file":"use-verify-magic-link.js","sourcesContent":["\"use client\";\n\nimport { useEffect, useState, useRef } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\nexport type VerifyState = \n | { status: \"verifying\" }\n | { status: \"success\"; message: string }\n | { status: \"expired\"; message: string }\n | { status: \"error\"; message: string };\n\nexport interface VerifyActionResult {\n success: boolean;\n message?: string;\n isExpired?: boolean;\n}\n\nexport type VerifyAction = (code: string, isPreview?: boolean) => Promise<VerifyActionResult>;\n\nexport interface UseVerifyMagicLinkOptions {\n verifyAction: VerifyAction;\n onSuccess?: () => void;\n redirectUrl?: string;\n isPreview?: boolean;\n}\n\n/**\n * Shared hook for magic link and trial signup verification.\n * Extracts the code from URL hash, calls the verification action,\n * handles all error states, and redirects on success.\n * \n * Note: The verifyAction should be selected based on the verification type\n * (regular magic link vs trial signup) before calling this hook.\n */\nexport function useVerifyMagicLink({\n verifyAction,\n onSuccess,\n redirectUrl = \"/\",\n isPreview\n}: UseVerifyMagicLinkOptions) {\n const router = useRouter();\n const [state, setState] = useState<VerifyState>({ status: \"verifying\" });\n const verifyingRef = useRef(false);\n\n useEffect(() => {\n // Extract code from URL hash\n if (typeof window === \"undefined\") return;\n\n const hash = window.location.hash;\n \n if (!hash || hash.length <= 1) {\n setState({ \n status: \"error\", \n message: \"No verification code found. Please use the link from your email.\" \n });\n return;\n }\n\n // Remove the # and any trailing path segments, trim whitespace\n const code = hash.substring(1).split(\"/\")[0]?.trim() || \"\";\n \n if (!code) {\n setState({ \n status: \"error\", \n message: \"Invalid verification code. Please use the link from your email.\" \n });\n return;\n }\n\n // Prevent duplicate verification attempts\n if (verifyingRef.current) return;\n verifyingRef.current = true;\n\n // Auto-verify on mount\n verifyAction(code, isPreview)\n .then((result) => {\n if (result.success) {\n setState({ \n status: \"success\", \n message: \"Verified! Redirecting to the portal...\" \n });\n \n // Call success callback if provided\n if (onSuccess) {\n onSuccess();\n }\n \n // Redirect to dashboard after a short delay\n setTimeout(() => {\n router.push(redirectUrl);\n }, 1500);\n } else if (result.isExpired) {\n setState({ \n status: \"expired\", \n message: result.message || \"Magic link has expired. A new link has been sent to your email.\" \n });\n } else {\n setState({ \n status: \"error\", \n message: result.message || \"Failed to verify. Please try again.\" \n });\n }\n })\n .catch((err) => {\n console.error(\"[use-verify-magic-link] Unexpected error:\", err);\n setState({ \n status: \"error\", \n message: \"An unexpected error occurred. Please try again.\" \n });\n });\n }, [verifyAction, router, redirectUrl, onSuccess, isPreview]);\n\n return state;\n}\n"]}
|
|
@@ -5,12 +5,13 @@ interface UserMenuDropdownProps {
|
|
|
5
5
|
displayLabel: string;
|
|
6
6
|
children: ReactNode;
|
|
7
7
|
className?: string;
|
|
8
|
+
dark?: boolean;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Reusable user menu dropdown component using HTML details element.
|
|
11
12
|
* Works with TopNavMenuClose for click-away behavior.
|
|
12
13
|
*/
|
|
13
|
-
declare function UserMenuDropdown({ displayLabel, children, className }: UserMenuDropdownProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
declare function UserMenuDropdown({ displayLabel, children, className, dark }: UserMenuDropdownProps): react_jsx_runtime.JSX.Element;
|
|
14
15
|
|
|
15
16
|
interface UserMenuItemProps {
|
|
16
17
|
href: string;
|
|
@@ -5,12 +5,13 @@ interface UserMenuDropdownProps {
|
|
|
5
5
|
displayLabel: string;
|
|
6
6
|
children: ReactNode;
|
|
7
7
|
className?: string;
|
|
8
|
+
dark?: boolean;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Reusable user menu dropdown component using HTML details element.
|
|
11
12
|
* Works with TopNavMenuClose for click-away behavior.
|
|
12
13
|
*/
|
|
13
|
-
declare function UserMenuDropdown({ displayLabel, children, className }: UserMenuDropdownProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
declare function UserMenuDropdown({ displayLabel, children, className, dark }: UserMenuDropdownProps): react_jsx_runtime.JSX.Element;
|
|
14
15
|
|
|
15
16
|
interface UserMenuItemProps {
|
|
16
17
|
href: string;
|
|
@@ -16,10 +16,13 @@ var Link__default = /*#__PURE__*/_interopDefault(Link);
|
|
|
16
16
|
function UserMenuDropdown({
|
|
17
17
|
displayLabel,
|
|
18
18
|
children,
|
|
19
|
-
className = ""
|
|
19
|
+
className = "",
|
|
20
|
+
dark = false
|
|
20
21
|
}) {
|
|
22
|
+
const summaryClass = dark ? "flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white/90 hover:bg-white/10 transition-colors list-none border border-transparent hover:border-white/20" : "flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors list-none border border-transparent hover:border-gray-200";
|
|
23
|
+
const chevronClass = dark ? "h-4 w-4 text-white/50 transition-transform group-open:rotate-180" : "h-4 w-4 text-gray-500 transition-transform group-open:rotate-180";
|
|
21
24
|
return /* @__PURE__ */ jsxRuntime.jsxs("details", { className: `group relative ${className}`, children: [
|
|
22
|
-
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className:
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: summaryClass, children: [
|
|
23
26
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.User, { className: "h-4 w-4" }),
|
|
24
27
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: displayLabel }),
|
|
25
28
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -34,7 +37,7 @@ function UserMenuDropdown({
|
|
|
34
37
|
strokeWidth: "2",
|
|
35
38
|
strokeLinecap: "round",
|
|
36
39
|
strokeLinejoin: "round",
|
|
37
|
-
className:
|
|
40
|
+
className: chevronClass,
|
|
38
41
|
children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "6 9 12 15 18 9" })
|
|
39
42
|
}
|
|
40
43
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/user-menu-dropdown.tsx","../src/components/user-menu-item.tsx"],"names":["jsxs","jsx","User","Link"],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/components/user-menu-dropdown.tsx","../src/components/user-menu-item.tsx"],"names":["jsxs","jsx","User","Link"],"mappings":";;;;;;;;;;;;;;;AAcO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,IAAA,GAAO;AACT,CAAA,EAA0B;AACxB,EAAA,MAAM,YAAA,GAAe,OACjB,6LAAA,GACA,4LAAA;AACJ,EAAA,MAAM,YAAA,GAAe,OACjB,kEAAA,GACA,kEAAA;AAEJ,EAAA,uBACEA,eAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,EAC7C,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,SAAA,EAAA,EAAQ,WAAW,YAAA,EAClB,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAACC,gBAAA,EAAA,EAAK,WAAU,SAAA,EAAU,CAAA;AAAA,sBAC1BD,cAAA,CAAC,UAAM,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,sBACpBA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,4BAAA;AAAA,UACN,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,GAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,SAAA,EAAW,YAAA;AAAA,UAEX,QAAA,kBAAAA,cAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA;AAAA;AACpC,KAAA,EACF,CAAA;AAAA,oBACAA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6FAAA,EACZ,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;ACxCO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,QAAA,EAAS,EAAsB;AAClE,EAAA,uBACEA,cAAAA;AAAA,IAACE,qBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA,EAAU,mFAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ","file":"user-menu-dropdown.js","sourcesContent":["import type { ReactNode } from \"react\";\nimport { User } from \"lucide-react\";\n\nexport interface UserMenuDropdownProps {\n displayLabel: string;\n children: ReactNode;\n className?: string;\n dark?: boolean;\n}\n\n/**\n * Reusable user menu dropdown component using HTML details element.\n * Works with TopNavMenuClose for click-away behavior.\n */\nexport function UserMenuDropdown({\n displayLabel,\n children,\n className = \"\",\n dark = false\n}: UserMenuDropdownProps) {\n const summaryClass = dark\n ? \"flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white/90 hover:bg-white/10 transition-colors list-none border border-transparent hover:border-white/20\"\n : \"flex cursor-pointer items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 transition-colors list-none border border-transparent hover:border-gray-200\";\n const chevronClass = dark\n ? \"h-4 w-4 text-white/50 transition-transform group-open:rotate-180\"\n : \"h-4 w-4 text-gray-500 transition-transform group-open:rotate-180\";\n\n return (\n <details className={`group relative ${className}`}>\n <summary className={summaryClass}>\n <User className=\"h-4 w-4\" />\n <span>{displayLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={chevronClass}\n >\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </summary>\n <div className=\"absolute right-0 mt-2 w-52 rounded-lg border border-gray-200 bg-white py-1.5 shadow-xl z-50\">\n {children}\n </div>\n </details>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Link from \"next/link\";\n\nexport interface UserMenuItemProps {\n href: string;\n children: ReactNode;\n}\n\n/**\n * Styled menu item for use within UserMenuDropdown.\n * Provides consistent styling across all portal templates.\n */\nexport function UserMenuItem({ href, children }: UserMenuItemProps) {\n return (\n <Link\n href={href}\n className=\"block w-full px-4 py-2.5 text-sm text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {children}\n </Link>\n );\n}\n"]}
|
package/dist/utils/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { a as BackgroundType, B as BrandingResult, d as decodeBranding, n as normalizeColor, s as sanitizeUrlForCss } from '../branding-
|
|
2
|
-
import { a1 as DownloadPortalRelease } from '../index-
|
|
1
|
+
export { a as BackgroundType, B as BrandingResult, d as decodeBranding, i as isDarkColor, n as normalizeColor, s as sanitizeUrlForCss } from '../branding-C5H0L6Vi.mjs';
|
|
2
|
+
import { a1 as DownloadPortalRelease } from '../index-CITwEYtK.mjs';
|
|
3
3
|
import { ReleaseEntry } from '../release-history-panel.mjs';
|
|
4
4
|
export { U as UploadSupportBundleResult, u as uploadSupportBundleWithProgress } from '../upload-with-progress-D760HthX.mjs';
|
|
5
5
|
import '../fetch-license-iTyF7_GY.mjs';
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { a as BackgroundType, B as BrandingResult, d as decodeBranding, n as normalizeColor, s as sanitizeUrlForCss } from '../branding-
|
|
2
|
-
import { a1 as DownloadPortalRelease } from '../index-
|
|
1
|
+
export { a as BackgroundType, B as BrandingResult, d as decodeBranding, i as isDarkColor, n as normalizeColor, s as sanitizeUrlForCss } from '../branding-C5H0L6Vi.js';
|
|
2
|
+
import { a1 as DownloadPortalRelease } from '../index-7ibNULXY.js';
|
|
3
3
|
import { ReleaseEntry } from '../release-history-panel.js';
|
|
4
4
|
export { U as UploadSupportBundleResult, u as uploadSupportBundleWithProgress } from '../upload-with-progress-D760HthX.js';
|
|
5
5
|
import '../fetch-license-iTyF7_GY.js';
|
package/dist/utils/index.js
CHANGED
|
@@ -132,6 +132,21 @@ var sanitizeUrlForCss = (url) => {
|
|
|
132
132
|
const escaped = trimmed.replace(/\\/g, "\\\\").replace(/\)/g, "\\)").replace(/"/g, '\\"').replace(/'/g, "\\'").replace(/[\x00-\x1F\x7F]/g, "");
|
|
133
133
|
return escaped;
|
|
134
134
|
};
|
|
135
|
+
var isDarkColor = (hex) => {
|
|
136
|
+
if (!hex) return false;
|
|
137
|
+
const normalized = normalizeColor(hex);
|
|
138
|
+
if (!normalized) return false;
|
|
139
|
+
let h = normalized.replace("#", "");
|
|
140
|
+
if (h.length === 3) {
|
|
141
|
+
h = h.charAt(0) + h.charAt(0) + h.charAt(1) + h.charAt(1) + h.charAt(2) + h.charAt(2);
|
|
142
|
+
}
|
|
143
|
+
const r = parseInt(h.substring(0, 2), 16) / 255;
|
|
144
|
+
const g = parseInt(h.substring(2, 4), 16) / 255;
|
|
145
|
+
const b = parseInt(h.substring(4, 6), 16) / 255;
|
|
146
|
+
const toLinear = (c) => c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
147
|
+
const luminance = 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
|
|
148
|
+
return luminance < 0.5;
|
|
149
|
+
};
|
|
135
150
|
var decodeBranding = ({ brandingData }) => {
|
|
136
151
|
if (!brandingData || typeof brandingData !== "string") {
|
|
137
152
|
return {
|
|
@@ -157,6 +172,13 @@ var decodeBranding = ({ brandingData }) => {
|
|
|
157
172
|
const backgroundImage = sanitizeUrlForCss(parsed.backgroundImage);
|
|
158
173
|
const backgroundGradientStart = normalizeColor(parsed.customColor1);
|
|
159
174
|
const backgroundGradientEnd = normalizeColor(parsed.customColor2);
|
|
175
|
+
const headerColor = normalizeColor(parsed.headerColor);
|
|
176
|
+
const headerGradientEnd = normalizeColor(parsed.headerGradientEnd);
|
|
177
|
+
const sidebarColor = normalizeColor(parsed.sidebarColor);
|
|
178
|
+
const sidebarGradientEnd = normalizeColor(parsed.sidebarGradientEnd);
|
|
179
|
+
const contentBackgroundColor = normalizeColor(parsed.contentBackgroundColor);
|
|
180
|
+
const contentBackgroundGradientEnd = normalizeColor(parsed.contentBackgroundGradientEnd);
|
|
181
|
+
const customCSS = typeof parsed.customCSS === "string" ? parsed.customCSS : void 0;
|
|
160
182
|
return {
|
|
161
183
|
logo,
|
|
162
184
|
title,
|
|
@@ -168,7 +190,14 @@ var decodeBranding = ({ brandingData }) => {
|
|
|
168
190
|
background,
|
|
169
191
|
backgroundImage,
|
|
170
192
|
backgroundGradientStart,
|
|
171
|
-
backgroundGradientEnd
|
|
193
|
+
backgroundGradientEnd,
|
|
194
|
+
headerColor,
|
|
195
|
+
headerGradientEnd,
|
|
196
|
+
sidebarColor,
|
|
197
|
+
sidebarGradientEnd,
|
|
198
|
+
contentBackgroundColor,
|
|
199
|
+
contentBackgroundGradientEnd,
|
|
200
|
+
customCSS
|
|
172
201
|
};
|
|
173
202
|
} catch (error) {
|
|
174
203
|
console.debug("[portal-components] unable to parse branding JSON", error);
|
|
@@ -183,14 +212,17 @@ var decodeBranding = ({ brandingData }) => {
|
|
|
183
212
|
var getApiOrigin = () => {
|
|
184
213
|
return (process.env.REPLICATED_APP_ORIGIN || "https://replicated.app").replace(/\/+$/, "");
|
|
185
214
|
};
|
|
186
|
-
var fetchCustomBrandingImpl = async () => {
|
|
215
|
+
var fetchCustomBrandingImpl = async (version) => {
|
|
187
216
|
const appSlug = process.env.PORTAL_APP_SLUG;
|
|
188
217
|
if (!appSlug) {
|
|
189
218
|
throw new Error("PORTAL_APP_SLUG is not configured");
|
|
190
219
|
}
|
|
191
|
-
|
|
220
|
+
let url = `${getApiOrigin()}/enterprise-portal/public/branding?app_slug=${encodeURIComponent(
|
|
192
221
|
appSlug
|
|
193
222
|
)}`;
|
|
223
|
+
if (version) {
|
|
224
|
+
url += `&version=${encodeURIComponent(version)}`;
|
|
225
|
+
}
|
|
194
226
|
if (process.env.NODE_ENV !== "production") {
|
|
195
227
|
console.debug(
|
|
196
228
|
"[portal-components] fetching custom branding via %s (Enterprise Portal API)",
|
|
@@ -219,7 +251,14 @@ var fetchCustomBrandingImpl = async () => {
|
|
|
219
251
|
background: payload.background,
|
|
220
252
|
backgroundImage: payload.backgroundImage,
|
|
221
253
|
customColor1: payload.customColor1,
|
|
222
|
-
customColor2: payload.customColor2
|
|
254
|
+
customColor2: payload.customColor2,
|
|
255
|
+
headerColor: payload.headerColor,
|
|
256
|
+
headerGradientEnd: payload.headerGradientEnd,
|
|
257
|
+
sidebarColor: payload.sidebarColor,
|
|
258
|
+
sidebarGradientEnd: payload.sidebarGradientEnd,
|
|
259
|
+
contentBackgroundColor: payload.contentBackgroundColor,
|
|
260
|
+
contentBackgroundGradientEnd: payload.contentBackgroundGradientEnd,
|
|
261
|
+
customCSS: payload.customCSS
|
|
223
262
|
};
|
|
224
263
|
const brandingData = buffer.Buffer.from(JSON.stringify(brandingObject)).toString("base64");
|
|
225
264
|
return {
|
|
@@ -454,6 +493,7 @@ exports.formatDate = formatDate;
|
|
|
454
493
|
exports.formatDateShort = formatDateShort;
|
|
455
494
|
exports.formatDateTime = formatDateTime;
|
|
456
495
|
exports.formatDateTimeLocal = formatDateTimeLocal;
|
|
496
|
+
exports.isDarkColor = isDarkColor;
|
|
457
497
|
exports.isHttpApiOrigin = isHttpApiOrigin;
|
|
458
498
|
exports.isRedirectError = isRedirectError;
|
|
459
499
|
exports.normalizeColor = normalizeColor;
|