@insforge/react 0.4.7 → 0.4.9
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/README.md +55 -95
- package/dist/atoms.cjs +81 -93
- package/dist/atoms.cjs.map +1 -1
- package/dist/atoms.d.cts +4 -4
- package/dist/atoms.d.ts +4 -4
- package/dist/atoms.js +81 -93
- package/dist/atoms.js.map +1 -1
- package/dist/components.cjs +128 -130
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +128 -130
- package/dist/components.js.map +1 -1
- package/dist/forms.cjs +108 -124
- package/dist/forms.cjs.map +1 -1
- package/dist/forms.d.cts +2 -4
- package/dist/forms.d.ts +2 -4
- package/dist/forms.js +108 -124
- package/dist/forms.js.map +1 -1
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js.map +1 -1
- package/dist/index.cjs +148 -155
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -4
- package/dist/index.d.ts +1 -4
- package/dist/index.js +148 -155
- package/dist/index.js.map +1 -1
- package/dist/router.cjs +11 -21
- package/dist/router.cjs.map +1 -1
- package/dist/router.d.cts +5 -4
- package/dist/router.d.ts +5 -4
- package/dist/router.js +11 -21
- package/dist/router.js.map +1 -1
- package/dist/styles.css +43 -71
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -5,7 +5,7 @@ if (typeof document !== 'undefined' && typeof window !== 'undefined') {
|
|
|
5
5
|
if (!document.getElementById(styleId)) {
|
|
6
6
|
const style = document.createElement('style');
|
|
7
7
|
style.id = styleId;
|
|
8
|
-
style.textContent = "/**\n * InsForge React Component Library Styles\n * Traditional CSS with scoped class names (no Tailwind)\n */\n\n/* ============================================\n FONTS\n ============================================ */\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap');\n\n/* ============================================\n CSS VARIABLES\n ============================================ */\n:root {\n /* Colors */\n --if-color-primary: #000000;\n --if-color-primary-hover: #1f1f1f;\n --if-color-text: #000000;\n --if-color-text-secondary: #828282;\n --if-color-text-muted: #a3a3a3;\n --if-color-border: #d4d4d4;\n --if-color-border-focus: #000000;\n --if-color-bg-white: #ffffff;\n --if-color-bg-light: #fafafa;\n --if-color-bg-hover: #f9fafb;\n --if-color-error: #dc2626;\n --if-color-error-bg: #fee2e2;\n --if-color-success: #16a34a;\n\n /* Spacing */\n --if-space-1: 0.25rem; /* 4px */\n --if-space-2: 0.5rem; /* 8px */\n --if-space-3: 0.75rem; /* 12px */\n --if-space-4: 1rem; /* 16px */\n --if-space-6: 1.5rem; /* 24px */\n --if-space-8: 2rem; /* 32px */\n\n /* Border Radius */\n --if-radius-xs: 0.125rem; /* 2px */\n --if-radius-sm: 0.25rem; /* 4px */\n --if-radius-md: 0.375rem; /* 6px */\n --if-radius-lg: 0.5rem; /* 8px */\n --if-radius-xl: 0.75rem; /* 12px */\n\n /* Typography */\n --if-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --if-font-family-manrope:\n 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --if-font-size-xs: 0.75rem; /* 12px */\n --if-font-size-sm: 0.875rem; /* 14px */\n --if-font-size-base: 1rem; /* 16px */\n --if-font-size-lg: 1.125rem; /* 18px */\n --if-font-size-xl: 1.25rem; /* 20px */\n --if-font-size-2xl: 1.5rem; /* 24px */\n\n /* Shadows */\n --if-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --if-shadow-md: 0 1px 2px 0 rgba(0, 0, 0, 0.1);\n --if-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n\n /* Transitions */\n --if-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --if-transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* ============================================\n AUTH CONTAINER\n ============================================ */\n.if-authContainer {\n width: 100%;\n max-width: 400px;\n border-radius: var(--if-radius-xl);\n overflow: hidden;\n box-shadow: var(--if-shadow-lg);\n}\n\n.if-authCard {\n background-color: var(--if-color-bg-white);\n padding: var(--if-space-6);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-6);\n}\n\n/* ============================================\n AUTH HEADER\n ============================================ */\n.if-authHeader {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n gap: var(--if-space-2);\n}\n\n.if-authHeader-title {\n font-size: var(--if-font-size-2xl);\n font-weight: 600;\n color: var(--if-color-text);\n line-height: 2rem;\n margin: 0;\n font-family: var(--if-font-family);\n}\n\n.if-authHeader-subtitle {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text-secondary);\n line-height: 1.5rem;\n margin: 0;\n font-family: var(--if-font-family);\n}\n\n/* ============================================\n FORM FIELD\n ============================================ */\n.if-formField {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-1);\n}\n\n.if-formField-label {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text);\n line-height: 1.5rem;\n font-family: var(--if-font-family);\n}\n\n.if-formField-input {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n align-self: stretch;\n padding: var(--if-space-2) var(--if-space-3);\n border-radius: var(--if-radius-sm);\n border: 1px solid var(--if-color-border);\n background-color: var(--if-color-bg-white);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n line-height: 1.25rem;\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n transition: border-color var(--if-transition-base);\n}\n\n.if-formField-input::placeholder {\n color: var(--if-color-text-muted);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n}\n\n.if-formField-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n/* ============================================\n PASSWORD FIELD\n ============================================ */\n.if-passwordField {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-1);\n}\n\n.if-passwordField-labelRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.if-passwordField-label {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text);\n line-height: 1.5rem;\n font-family: var(--if-font-family);\n}\n\n.if-passwordField-forgotLink {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text-secondary);\n text-decoration: none;\n transition: color var(--if-transition-fast);\n font-family: var(--if-font-family);\n}\n\n.if-passwordField-inputWrapper {\n position: relative;\n width: 100%;\n}\n\n.if-passwordField-input {\n width: 100%;\n display: flex;\n align-items: center;\n align-self: stretch;\n padding: var(--if-space-2) var(--if-space-3);\n padding-right: 2.5rem; /* Space for toggle button */\n border-radius: var(--if-radius-sm);\n border: 1px solid var(--if-color-border);\n background-color: var(--if-color-bg-white);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n line-height: 1.25rem;\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n transition: border-color var(--if-transition-base);\n}\n\n.if-passwordField-input::placeholder {\n color: var(--if-color-text-muted);\n}\n\n.if-passwordField-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n.if-passwordField-toggleButton {\n position: absolute;\n right: var(--if-space-1);\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--if-space-1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--if-color-text-secondary);\n transition: color var(--if-transition-fast);\n}\n\n/* ============================================\n SUBMIT BUTTON\n ============================================ */\n.if-submitButton {\n border-radius: var(--if-radius-sm);\n background-color: var(--if-color-primary);\n height: 2.5rem;\n width: 100%;\n display: flex;\n margin-top: var(--if-space-4);\n padding: var(--if-space-2) var(--if-space-4);\n justify-content: center;\n align-items: center;\n gap: 0.625rem;\n align-self: stretch;\n color: var(--if-color-bg-white);\n font-weight: 600;\n font-family: var(--if-font-family-manrope);\n font-size: var(--if-font-size-base);\n line-height: normal;\n border: none;\n cursor: pointer;\n transition: background-color var(--if-transition-base);\n}\n\n.if-submitButton:hover:not(:disabled) {\n background-color: var(--if-color-primary-hover);\n}\n\n.if-submitButton:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.if-submitButton-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Spinner animation */\n@keyframes if-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.if-submitButton-spinner {\n animation: if-spin 1s linear infinite;\n}\n\n/* ============================================\n OAUTH BUTTON\n ============================================ */\n.if-oauthButton {\n display: flex;\n width: 100%;\n height: 2.25rem;\n padding: var(--if-space-2) var(--if-space-3);\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-3);\n border-radius: var(--if-radius-md);\n border: 1px solid #e4e4e7;\n background-color: var(--if-color-bg-white);\n box-shadow: var(--if-shadow-md);\n color: #09090b;\n text-align: center;\n font-size: var(--if-font-size-sm);\n font-weight: 500;\n line-height: 1.25rem;\n cursor: pointer;\n transition: all var(--if-transition-base);\n font-family: var(--if-font-family);\n}\n\n.if-oauthButton:hover:not(:disabled) {\n background-color: var(--if-color-bg-hover);\n border-color: #9ca3af;\n}\n\n.if-oauthButton:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.if-oauthButton-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.125rem;\n height: 1.125rem;\n}\n\n.if-oauthButton-full {\n justify-content: center;\n}\n\n.if-oauthButton-short {\n justify-content: center;\n padding: var(--if-space-2);\n gap: var(--if-space-2);\n}\n\n.if-oauthButton-icon-only {\n justify-content: center;\n gap: 0;\n}\n\n/* ============================================\n OAUTH PROVIDERS CONTAINER\n ============================================ */\n.if-oauthProviders {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-3);\n width: 100%;\n}\n\n/* ============================================\n AUTH LINK\n ============================================ */\n.if-authLink {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-1);\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-authLink-text {\n font-weight: 400;\n}\n\n.if-authLink-link {\n font-weight: 600;\n color: var(--if-color-text);\n text-decoration: none;\n transition: opacity var(--if-transition-fast);\n}\n\n/* ============================================\n AUTH DIVIDER\n ============================================ */\n.if-authDivider {\n display: flex;\n align-items: center;\n text-align: center;\n width: 100%;\n gap: var(--if-space-3);\n}\n\n.if-authDivider-line {\n flex: 1;\n border-top: 1px solid var(--if-color-border);\n}\n\n.if-authDivider-text {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n font-weight: 400;\n font-family: var(--if-font-family-manrope);\n}\n\n/* ============================================\n ERROR BANNER\n ============================================ */\n.if-errorBanner {\n padding: var(--if-space-3);\n background-color: var(--if-color-error-bg);\n border-radius: var(--if-radius-md);\n border: 1px solid var(--if-color-error);\n}\n\n.if-errorBanner-content {\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n}\n\n.if-errorBanner-icon {\n width: 1.5rem;\n height: 1.5rem;\n flex-shrink: 0;\n color: var(--if-color-error);\n}\n\n.if-errorBanner-text {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-error);\n font-weight: 400;\n font-family: var(--if-font-family);\n margin: 0;\n}\n\n/* ============================================\n AUTH BRANDING\n ============================================ */\n.if-authBranding {\n background-color: var(--if-color-bg-light);\n padding: var(--if-space-4) var(--if-space-2);\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-1);\n}\n\n.if-authBranding-text {\n font-size: var(--if-font-size-xs);\n font-weight: 500;\n color: var(--if-color-text);\n font-family: var(--if-font-family-manrope);\n margin: 0;\n}\n\n/* ============================================\n VERIFICATION CODE INPUT\n ============================================ */\n.if-verificationCode {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-4);\n}\n\n.if-verificationCode-description {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n text-align: center;\n font-family: var(--if-font-family);\n}\n\n.if-verificationCode-email {\n font-weight: 600;\n color: var(--if-color-text);\n}\n\n.if-verificationCode-inputContainer {\n display: flex;\n gap: var(--if-space-2);\n justify-content: center;\n}\n\n.if-verificationCode-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: var(--if-font-size-xl);\n font-weight: 600;\n border: 2px solid var(--if-color-border);\n border-radius: var(--if-radius-md);\n transition: border-color var(--if-transition-base);\n font-family: var(--if-font-family);\n}\n\n.if-verificationCode-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n/* ============================================\n VERIFICATION STEP\n ============================================ */\n.if-verificationStep {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-6);\n align-items: stretch;\n}\n\n.if-verificationStep-description {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n text-align: center;\n margin: 0;\n font-family: var(--if-font-family);\n}\n\n.if-verificationStep-codeContainer {\n width: 100%;\n background-color: #f5f5f5;\n border-radius: var(--if-radius-lg);\n padding: var(--if-space-4) var(--if-space-4) var(--if-space-6);\n display: flex;\n flex-direction: column;\n gap: var(--if-space-4);\n}\n\n.if-verificationStep-codeInputWrapper {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-3);\n margin-top: var(--if-space-2);\n}\n\n.if-verificationStep-verifyingText {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n text-align: center;\n font-family: var(--if-font-family);\n}\n\n.if-verificationStep-resendContainer {\n width: 100%;\n font-size: var(--if-font-size-sm);\n text-align: center;\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-verificationStep-resendButton {\n color: var(--if-color-text);\n font-weight: 500;\n transition: all var(--if-transition-base);\n background: none;\n border: none;\n padding: 0;\n font-family: var(--if-font-family);\n font-size: var(--if-font-size-sm);\n}\n\n.if-verificationStep-resendButton:not(:disabled) {\n cursor: pointer;\n text-decoration: underline;\n}\n\n.if-verificationStep-resendButton:disabled {\n cursor: not-allowed;\n text-decoration: none;\n opacity: 0.5;\n}\n\n/* ============================================\n PASSWORD STRENGTH INDICATOR\n ============================================ */\n.if-passwordStrength {\n margin-top: var(--if-space-2);\n}\n\n.if-passwordStrength-bar {\n height: 4px;\n background-color: #e5e7eb;\n border-radius: 2px;\n overflow: hidden;\n margin-bottom: var(--if-space-2);\n}\n\n.if-passwordStrength-fill {\n height: 100%;\n transition:\n width var(--if-transition-base),\n background-color var(--if-transition-base);\n}\n\n.if-passwordStrength-fill.weak {\n background-color: #ef4444;\n width: 33%;\n}\n\n.if-passwordStrength-fill.medium {\n background-color: #f59e0b;\n width: 66%;\n}\n\n.if-passwordStrength-fill.strong {\n background-color: var(--if-color-success);\n width: 100%;\n}\n\n.if-passwordStrength-text {\n font-size: var(--if-font-size-xs);\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-passwordStrength-requirements {\n margin-top: var(--if-space-2);\n font-size: var(--if-font-size-xs);\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-passwordStrength-requirement {\n display: flex;\n align-items: center;\n gap: var(--if-space-1);\n margin-bottom: var(--if-space-1);\n}\n\n.if-passwordStrength-requirement.met {\n color: var(--if-color-success);\n}\n\n.if-passwordStrength-requirement.unmet {\n color: var(--if-color-text-muted);\n}\n\n/* ============================================\n FORM CONTAINER\n ============================================ */\n.if-form {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n/* ============================================\n USER BUTTON\n ============================================ */\n.if-userButton-container {\n position: relative;\n display: inline-block;\n}\n\n.if-userButton {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--if-space-2);\n padding: var(--if-space-2);\n border-radius: 9999px;\n background-color: transparent;\n border: none;\n cursor: pointer;\n transition: all var(--if-transition-base);\n}\n\n.if-userButton:hover {\n opacity: 0.8;\n}\n\n.if-userButton-detailed {\n background-color: var(--if-color-bg-white);\n border: 1px solid var(--if-color-border);\n border-radius: var(--if-radius-sm);\n padding: var(--if-space-2);\n}\n\n.if-userButton-detailed:hover {\n background-color: var(--if-color-bg-light);\n opacity: 1;\n}\n\n.if-userButton-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 9999px;\n background-color: var(--if-color-primary);\n color: var(--if-color-bg-white);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: var(--if-font-size-sm);\n font-family: var(--if-font-family);\n overflow: hidden;\n}\n\n.if-userButton-avatarImage {\n border-radius: 9999px;\n object-fit: cover;\n width: 100%;\n height: 100%;\n}\n\n.if-userButton-avatarInitials {\n color: var(--if-color-bg-white);\n font-weight: 600;\n font-size: var(--if-font-size-sm);\n}\n\n.if-userButton-info {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.125rem;\n}\n\n.if-userButton-name {\n font-size: var(--if-font-size-sm);\n font-weight: 600;\n color: var(--if-color-text);\n line-height: 1.25rem;\n text-align: left;\n font-family: var(--if-font-family);\n}\n\n.if-userButton-email {\n font-size: var(--if-font-size-xs);\n color: var(--if-color-text-secondary);\n line-height: 1rem;\n text-align: left;\n font-family: var(--if-font-family);\n}\n\n.if-userButton-menu {\n position: absolute;\n margin-top: var(--if-space-2);\n background-color: var(--if-color-bg-white);\n border: 1px solid var(--if-color-border);\n border-radius: var(--if-radius-md);\n box-shadow: var(--if-shadow-lg);\n padding: var(--if-space-2);\n min-width: 200px;\n z-index: 50;\n}\n\n.if-userButton-menuItem {\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n padding: var(--if-space-2);\n border-radius: var(--if-radius-sm);\n cursor: pointer;\n transition: background-color var(--if-transition-fast);\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n background: none;\n border: none;\n width: 100%;\n text-align: left;\n}\n\n.if-userButton-menuItem:hover {\n background-color: var(--if-color-bg-light);\n}\n\n.if-userButton-menuItem-signout {\n color: var(--if-color-error);\n}\n\n.if-userButton-menuItem-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* ============================================\n EMAIL VERIFICATION STATUS\n ============================================ */\n.if-verifyStatus-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n.if-verifyStatus-container-stretch {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n.if-verifyStatus-spinner {\n border-radius: 9999px;\n height: 3rem;\n width: 3rem;\n border-bottom: 2px solid var(--if-color-primary);\n}\n\n.if-verifyStatus-successContent {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--if-space-4);\n}\n\n.if-verifyStatus-successIcon {\n width: 4rem;\n height: 4rem;\n border-radius: 9999px;\n background-color: #d1fae5;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.if-verifyStatus-successIconSvg {\n width: 2rem;\n height: 2rem;\n color: #059669;\n}\n\n.if-verifyStatus-textCenter {\n text-align: center;\n}\n\n/* ============================================\n UTILITY CLASSES\n ============================================ */\n.if-hidden {\n display: none;\n}\n\n.if-visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n";
|
|
8
|
+
style.textContent = "/**\n * InsForge React Component Library Styles\n * Traditional CSS with scoped class names (no Tailwind)\n */\n\n/* ============================================\n FONTS\n ============================================ */\n@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');\n@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap');\n\n/* ============================================\n CSS VARIABLES\n ============================================ */\n:root {\n /* Colors */\n --if-color-primary: #000000;\n --if-color-primary-hover: #1f1f1f;\n --if-color-text: #000000;\n --if-color-text-secondary: #828282;\n --if-color-text-muted: #a3a3a3;\n --if-color-border: #d4d4d4;\n --if-color-border-focus: #000000;\n --if-color-bg-white: #ffffff;\n --if-color-bg-light: #fafafa;\n --if-color-bg-hover: #f9fafb;\n --if-color-error: #dc2626;\n --if-color-error-bg: #fee2e2;\n --if-color-success: #16a34a;\n\n /* Spacing */\n --if-space-1: 0.25rem; /* 4px */\n --if-space-2: 0.5rem; /* 8px */\n --if-space-3: 0.75rem; /* 12px */\n --if-space-4: 1rem; /* 16px */\n --if-space-6: 1.5rem; /* 24px */\n --if-space-8: 2rem; /* 32px */\n\n /* Border Radius */\n --if-radius-xs: 0.125rem; /* 2px */\n --if-radius-sm: 0.25rem; /* 4px */\n --if-radius-md: 0.375rem; /* 6px */\n --if-radius-lg: 0.5rem; /* 8px */\n --if-radius-xl: 0.75rem; /* 12px */\n\n /* Typography */\n --if-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --if-font-family-manrope:\n 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;\n --if-font-size-xs: 0.75rem; /* 12px */\n --if-font-size-sm: 0.875rem; /* 14px */\n --if-font-size-base: 1rem; /* 16px */\n --if-font-size-lg: 1.125rem; /* 18px */\n --if-font-size-xl: 1.25rem; /* 20px */\n --if-font-size-2xl: 1.5rem; /* 24px */\n\n /* Shadows */\n --if-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --if-shadow-md: 0 1px 2px 0 rgba(0, 0, 0, 0.1);\n --if-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n\n /* Transitions */\n --if-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --if-transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* ============================================\n AUTH CONTAINER\n ============================================ */\n.if-authContainer {\n width: 100%;\n max-width: 400px;\n border-radius: var(--if-radius-xl);\n overflow: hidden;\n box-shadow: var(--if-shadow-lg);\n}\n\n.if-authCard {\n background-color: var(--if-color-bg-white);\n padding: var(--if-space-6);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-6);\n}\n\n/* ============================================\n AUTH HEADER\n ============================================ */\n.if-authHeader {\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n gap: var(--if-space-2);\n}\n\n.if-authHeader-title {\n font-size: var(--if-font-size-2xl);\n font-weight: 600;\n color: var(--if-color-text);\n line-height: 2rem;\n margin: 0;\n font-family: var(--if-font-family);\n}\n\n.if-authHeader-subtitle {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text-secondary);\n line-height: 1.5rem;\n margin: 0;\n font-family: var(--if-font-family);\n}\n\n/* ============================================\n FORM FIELD\n ============================================ */\n.if-formField {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-1);\n}\n\n.if-formField-label {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text);\n line-height: 1.5rem;\n font-family: var(--if-font-family);\n}\n\n.if-formField-input {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n align-self: stretch;\n padding: var(--if-space-2) var(--if-space-3);\n border-radius: var(--if-radius-sm);\n border: 1px solid var(--if-color-border);\n background-color: var(--if-color-bg-white);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n line-height: 1.25rem;\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n transition: border-color var(--if-transition-base);\n}\n\n.if-formField-input::placeholder {\n color: var(--if-color-text-muted);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n}\n\n.if-formField-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n/* ============================================\n PASSWORD FIELD\n ============================================ */\n.if-passwordField {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: stretch;\n gap: var(--if-space-1);\n}\n\n.if-passwordField-labelRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.if-passwordField-label {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text);\n line-height: 1.5rem;\n font-family: var(--if-font-family);\n}\n\n.if-passwordField-forgotLink {\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n color: var(--if-color-text-secondary);\n text-decoration: none;\n transition: color var(--if-transition-fast);\n font-family: var(--if-font-family);\n}\n\n.if-passwordField-inputWrapper {\n position: relative;\n width: 100%;\n}\n\n.if-passwordField-input {\n width: 100%;\n display: flex;\n align-items: center;\n align-self: stretch;\n padding: var(--if-space-2) var(--if-space-3);\n padding-right: 2.5rem; /* Space for toggle button */\n border-radius: var(--if-radius-sm);\n border: 1px solid var(--if-color-border);\n background-color: var(--if-color-bg-white);\n font-size: var(--if-font-size-sm);\n font-weight: 400;\n line-height: 1.25rem;\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n transition: border-color var(--if-transition-base);\n}\n\n.if-passwordField-input::placeholder {\n color: var(--if-color-text-muted);\n}\n\n.if-passwordField-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n.if-passwordField-toggleButton {\n position: absolute;\n right: var(--if-space-1);\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: var(--if-space-1);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--if-color-text-secondary);\n transition: color var(--if-transition-fast);\n}\n\n/* ============================================\n SUBMIT BUTTON\n ============================================ */\n.if-submitButton {\n border-radius: var(--if-radius-sm);\n background-color: var(--if-color-primary);\n height: 2.5rem;\n width: 100%;\n display: flex;\n margin-top: var(--if-space-4);\n padding: var(--if-space-2) var(--if-space-4);\n justify-content: center;\n align-items: center;\n gap: 0.625rem;\n align-self: stretch;\n color: var(--if-color-bg-white);\n font-weight: 600;\n font-family: var(--if-font-family-manrope);\n font-size: var(--if-font-size-base);\n line-height: normal;\n border: none;\n cursor: pointer;\n transition: background-color var(--if-transition-base);\n}\n\n.if-submitButton:hover:not(:disabled) {\n background-color: var(--if-color-primary-hover);\n}\n\n.if-submitButton:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.if-submitButton-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Spinner animation */\n@keyframes if-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n.if-submitButton-spinner {\n animation: if-spin 1s linear infinite;\n}\n\n/* ============================================\n OAUTH BUTTON\n ============================================ */\n.if-oauthButton {\n display: flex;\n width: 100%;\n height: 2.25rem;\n padding: var(--if-space-2) var(--if-space-3);\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-3);\n border-radius: var(--if-radius-md);\n border: 1px solid #e4e4e7;\n background-color: var(--if-color-bg-white);\n box-shadow: var(--if-shadow-md);\n color: #09090b;\n text-align: center;\n font-size: var(--if-font-size-sm);\n font-weight: 500;\n line-height: 1.25rem;\n cursor: pointer;\n transition: all var(--if-transition-base);\n font-family: var(--if-font-family);\n}\n\n.if-oauthButton:hover:not(:disabled) {\n background-color: var(--if-color-bg-hover);\n border-color: #9ca3af;\n}\n\n.if-oauthButton:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.if-oauthButton-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.125rem;\n height: 1.125rem;\n}\n\n.if-oauthButton-full {\n justify-content: center;\n}\n\n.if-oauthButton-short {\n justify-content: center;\n padding: var(--if-space-2);\n gap: var(--if-space-2);\n}\n\n.if-oauthButton-icon-only {\n justify-content: center;\n gap: 0;\n}\n\n/* ============================================\n OAUTH PROVIDERS CONTAINER\n ============================================ */\n.if-oauthProviders {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-3);\n width: 100%;\n}\n\n/* ============================================\n AUTH LINK\n ============================================ */\n.if-authLink {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-1);\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-authLink-text {\n font-weight: 400;\n}\n\n.if-authLink-link {\n font-weight: 600;\n color: var(--if-color-text);\n text-decoration: none;\n transition: opacity var(--if-transition-fast);\n}\n\n/* ============================================\n AUTH DIVIDER\n ============================================ */\n.if-authDivider {\n display: flex;\n align-items: center;\n text-align: center;\n width: 100%;\n gap: var(--if-space-3);\n}\n\n.if-authDivider-line {\n flex: 1;\n border-top: 1px solid var(--if-color-border);\n}\n\n.if-authDivider-text {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n font-weight: 400;\n font-family: var(--if-font-family-manrope);\n}\n\n/* ============================================\n ERROR BANNER\n ============================================ */\n.if-errorBanner {\n padding: var(--if-space-3);\n background-color: var(--if-color-error-bg);\n border-radius: var(--if-radius-md);\n border: 1px solid var(--if-color-error);\n}\n\n.if-errorBanner-content {\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n}\n\n.if-errorBanner-icon {\n width: 1.5rem;\n height: 1.5rem;\n flex-shrink: 0;\n color: var(--if-color-error);\n}\n\n.if-errorBanner-text {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-error);\n font-weight: 400;\n font-family: var(--if-font-family);\n margin: 0;\n}\n\n/* ============================================\n AUTH BRANDING\n ============================================ */\n.if-authBranding {\n background-color: var(--if-color-bg-light);\n padding: var(--if-space-4) var(--if-space-2);\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: var(--if-space-1);\n}\n\n.if-authBranding-text {\n font-size: var(--if-font-size-xs);\n font-weight: 500;\n color: var(--if-color-text);\n font-family: var(--if-font-family-manrope);\n margin: 0;\n}\n\n/* ============================================\n VERIFICATION CODE INPUT\n ============================================ */\n.if-verificationCode-inputContainer {\n display: flex;\n gap: var(--if-space-3);\n justify-content: center;\n}\n\n.if-verificationCode-input {\n width: 3rem;\n height: 3rem;\n text-align: center;\n font-size: var(--if-font-size-base);\n font-weight: 600;\n border: 1px solid var(--if-color-border);\n border-radius: var(--if-radius-sm);\n transition: border-color var(--if-transition-base);\n font-family: var(--if-font-family-manrope);\n}\n\n.if-verificationCode-input:focus {\n outline: none;\n border-color: var(--if-color-border-focus);\n}\n\n/* ============================================\n VERIFICATION STEP\n ============================================ */\n.if-verificationStep {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-6);\n align-items: stretch;\n}\n\n.if-verificationStep-descriptionContainer {\n width: 100%;\n background-color: #f5f5f5;\n border-radius: var(--if-radius-lg);\n padding: var(--if-space-3) var(--if-space-3) var(--if-space-6) var(--if-space-3);\n display: flex;\n flex-direction: column;\n gap: var(--if-space-3);\n}\n\n.if-verificationStep-descriptionTitle {\n color: var(--black, #000);\n font-family: var(--if-font-family);\n font-size: var(--if-font-size-base);\n font-style: normal;\n font-weight: 600;\n line-height: 24px;\n}\n\n.if-verificationStep-description,\n.if-verificationStep-codeDescription {\n font-size: var(--if-font-size-sm);\n color: #525252;\n text-align: left;\n font-family: var(--if-font-family);\n margin: 0;\n}\n\n.if-verificationLink-email,\n.if-verificationCode-email {\n font-weight: 500;\n color: var(--if-color-text);\n}\n\n.if-verificationStep-codeContainer {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 40px;\n}\n\n.if-verificationStep-codeInputWrapper {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-6);\n}\n\n.if-verificationStep-verifyingText {\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text-secondary);\n text-align: center;\n font-family: var(--if-font-family);\n}\n\n.if-verificationStep-resendContainer {\n width: 100%;\n font-size: var(--if-font-size-sm);\n text-align: center;\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-verificationStep-resendButton {\n color: var(--if-color-text);\n font-weight: 500;\n transition: all var(--if-transition-base);\n background: none;\n border: none;\n padding: 0;\n font-family: var(--if-font-family);\n font-size: var(--if-font-size-sm);\n}\n\n.if-verificationStep-resendButton:not(:disabled) {\n cursor: pointer;\n}\n\n.if-verificationStep-resendButton:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ============================================\n PASSWORD STRENGTH INDICATOR\n ============================================ */\n.if-passwordStrength {\n margin-top: var(--if-space-2);\n}\n\n.if-passwordStrength-fill {\n height: 100%;\n transition:\n width var(--if-transition-base),\n background-color var(--if-transition-base);\n}\n\n.if-passwordStrength-text {\n font-size: var(--if-font-size-xs);\n color: var(--if-color-text-secondary);\n font-family: var(--if-font-family);\n}\n\n.if-passwordStrength-requirements {\n display: flex;\n flex-direction: column;\n gap: var(--if-space-2);\n font-size: var(--if-font-size-sm);\n color: #525252;\n font-family: var(--if-font-family);\n}\n\n.if-passwordStrength-requirement {\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n}\n\n/* ============================================\n FORM CONTAINER\n ============================================ */\n.if-form {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n/* ============================================\n USER BUTTON\n ============================================ */\n.if-userButton-container {\n position: relative;\n display: inline-block;\n}\n\n.if-userButton {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--if-space-2);\n padding: var(--if-space-2);\n border-radius: 9999px;\n background-color: transparent;\n border: none;\n cursor: pointer;\n transition: all var(--if-transition-base);\n}\n\n.if-userButton:hover {\n opacity: 0.8;\n}\n\n.if-userButton-detailed {\n background-color: var(--if-color-bg-white);\n border: 1px solid var(--if-color-border);\n border-radius: var(--if-radius-sm);\n padding: var(--if-space-2);\n}\n\n.if-userButton-detailed:hover {\n background-color: var(--if-color-bg-light);\n opacity: 1;\n}\n\n.if-userButton-avatar {\n width: 2rem;\n height: 2rem;\n border-radius: 9999px;\n background-color: var(--if-color-primary);\n color: var(--if-color-bg-white);\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: var(--if-font-size-sm);\n font-family: var(--if-font-family);\n overflow: hidden;\n}\n\n.if-userButton-avatarImage {\n border-radius: 9999px;\n object-fit: cover;\n width: 100%;\n height: 100%;\n}\n\n.if-userButton-avatarInitials {\n color: var(--if-color-bg-white);\n font-weight: 600;\n font-size: var(--if-font-size-sm);\n}\n\n.if-userButton-info {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.125rem;\n}\n\n.if-userButton-name {\n font-size: var(--if-font-size-sm);\n font-weight: 600;\n color: var(--if-color-text);\n line-height: 1.25rem;\n text-align: left;\n font-family: var(--if-font-family);\n}\n\n.if-userButton-email {\n font-size: var(--if-font-size-xs);\n color: var(--if-color-text-secondary);\n line-height: 1rem;\n text-align: left;\n font-family: var(--if-font-family);\n}\n\n.if-userButton-menu {\n position: absolute;\n margin-top: var(--if-space-2);\n background-color: var(--if-color-bg-white);\n border: 1px solid var(--if-color-border);\n border-radius: var(--if-radius-md);\n box-shadow: var(--if-shadow-lg);\n padding: var(--if-space-2);\n min-width: 200px;\n z-index: 50;\n}\n\n.if-userButton-menuItem {\n display: flex;\n align-items: center;\n gap: var(--if-space-2);\n padding: var(--if-space-2);\n border-radius: var(--if-radius-sm);\n cursor: pointer;\n transition: background-color var(--if-transition-fast);\n font-size: var(--if-font-size-sm);\n color: var(--if-color-text);\n font-family: var(--if-font-family);\n background: none;\n border: none;\n width: 100%;\n text-align: left;\n}\n\n.if-userButton-menuItem:hover {\n background-color: var(--if-color-bg-light);\n}\n\n.if-userButton-menuItem-signout {\n color: var(--if-color-error);\n}\n\n.if-userButton-menuItem-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* ============================================\n EMAIL VERIFICATION STATUS\n ============================================ */\n.if-verifyStatus-container {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n.if-verifyStatus-container-stretch {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n justify-content: center;\n gap: var(--if-space-6);\n}\n\n.if-verifyStatus-spinner {\n border-radius: 9999px;\n height: 3rem;\n width: 3rem;\n border-bottom: 2px solid var(--if-color-primary);\n}\n\n.if-verifyStatus-successContent {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--if-space-4);\n}\n\n.if-verifyStatus-successIcon {\n width: 4rem;\n height: 4rem;\n border-radius: 9999px;\n background-color: #d1fae5;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.if-verifyStatus-successIconSvg {\n width: 2rem;\n height: 2rem;\n color: #059669;\n}\n\n.if-verifyStatus-textCenter {\n text-align: center;\n}\n\n/* ============================================\n UTILITY CLASSES\n ============================================ */\n.if-hidden {\n display: none;\n}\n\n.if-visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n";
|
|
9
9
|
if (document.head) {
|
|
10
10
|
document.head.appendChild(style);
|
|
11
11
|
}
|
|
@@ -338,10 +338,15 @@ function InsforgeProvider({
|
|
|
338
338
|
);
|
|
339
339
|
const loginWithOAuth = react.useCallback(
|
|
340
340
|
async (provider, redirectTo) => {
|
|
341
|
-
const sdkResult = await insforge.auth.signInWithOAuth({
|
|
342
|
-
|
|
341
|
+
const sdkResult = await insforge.auth.signInWithOAuth({
|
|
342
|
+
provider,
|
|
343
|
+
redirectTo: redirectTo || afterSignInUrl
|
|
344
|
+
});
|
|
345
|
+
if (sdkResult.error) {
|
|
346
|
+
throw new Error(sdkResult.error.message);
|
|
347
|
+
}
|
|
343
348
|
},
|
|
344
|
-
[insforge]
|
|
349
|
+
[insforge, afterSignInUrl]
|
|
345
350
|
);
|
|
346
351
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
347
352
|
InsforgeContext.Provider,
|
|
@@ -497,34 +502,27 @@ function AuthPasswordStrengthIndicator({
|
|
|
497
502
|
config
|
|
498
503
|
}) {
|
|
499
504
|
const requirements = createRequirements(config);
|
|
500
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-passwordStrength if-internal-ps6w3k", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-passwordStrength-requirements", children: requirements.map((req) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
"
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
522
|
-
),
|
|
523
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: req.label })
|
|
524
|
-
]
|
|
525
|
-
},
|
|
526
|
-
req.label
|
|
527
|
-
)) }) });
|
|
505
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-passwordStrength if-internal-ps6w3k", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-passwordStrength-requirements", children: requirements.map((req) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-passwordStrength-requirement", children: [
|
|
506
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
507
|
+
"div",
|
|
508
|
+
{
|
|
509
|
+
style: {
|
|
510
|
+
display: "flex",
|
|
511
|
+
alignItems: "center",
|
|
512
|
+
justifyContent: "center",
|
|
513
|
+
width: "1rem",
|
|
514
|
+
height: "1rem",
|
|
515
|
+
borderRadius: "50%",
|
|
516
|
+
border: "2px solid",
|
|
517
|
+
borderColor: req.test(password) ? "transparent" : "#9ca3af",
|
|
518
|
+
backgroundColor: req.test(password) ? "#059669" : "white",
|
|
519
|
+
transition: "all 0.2s"
|
|
520
|
+
},
|
|
521
|
+
children: req.test(password) && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { style: { width: "0.75rem", height: "0.75rem", color: "white" } })
|
|
522
|
+
}
|
|
523
|
+
),
|
|
524
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: req.label })
|
|
525
|
+
] }, req.label)) }) });
|
|
528
526
|
}
|
|
529
527
|
function createRequirements(config) {
|
|
530
528
|
const requirements = [];
|
|
@@ -592,11 +590,12 @@ function AuthPasswordField({
|
|
|
592
590
|
onFocus,
|
|
593
591
|
...props
|
|
594
592
|
}) {
|
|
593
|
+
const [searchParams] = reactRouterDom.useSearchParams();
|
|
595
594
|
const [showPassword, setShowPassword] = react.useState(false);
|
|
596
595
|
const [showStrength, setShowStrength] = react.useState(false);
|
|
597
596
|
const resolvedForgotPasswordHref = react.useMemo(
|
|
598
|
-
() => forgotPasswordLink ?
|
|
599
|
-
[forgotPasswordLink]
|
|
597
|
+
() => forgotPasswordLink ? resolveAuthUrl(forgotPasswordLink.href, searchParams) : void 0,
|
|
598
|
+
[forgotPasswordLink, searchParams]
|
|
600
599
|
);
|
|
601
600
|
const handleFocus = (e) => {
|
|
602
601
|
if (showStrengthIndicator) {
|
|
@@ -937,7 +936,6 @@ function AuthOAuthProviders({
|
|
|
937
936
|
function AuthVerificationCodeInput({
|
|
938
937
|
length = 6,
|
|
939
938
|
value,
|
|
940
|
-
email,
|
|
941
939
|
onChange,
|
|
942
940
|
disabled = false,
|
|
943
941
|
onComplete
|
|
@@ -985,58 +983,42 @@ function AuthVerificationCodeInput({
|
|
|
985
983
|
}
|
|
986
984
|
}
|
|
987
985
|
};
|
|
988
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
". Enter it below to proceed."
|
|
994
|
-
] }),
|
|
995
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-verificationCode-inputContainer", children: Array.from({ length }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
996
|
-
"input",
|
|
997
|
-
{
|
|
998
|
-
ref: (el) => {
|
|
999
|
-
inputRefs.current[index] = el;
|
|
1000
|
-
},
|
|
1001
|
-
type: "text",
|
|
1002
|
-
inputMode: "numeric",
|
|
1003
|
-
maxLength: 1,
|
|
1004
|
-
value: value[index] || "",
|
|
1005
|
-
onChange: (e) => handleChange(index, e.target.value),
|
|
1006
|
-
onKeyDown: (e) => handleKeyDown(index, e),
|
|
1007
|
-
onPaste: handlePaste,
|
|
1008
|
-
disabled,
|
|
1009
|
-
className: "if-verificationCode-input",
|
|
1010
|
-
autoComplete: "one-time-code"
|
|
986
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-verificationCode-inputContainer", children: Array.from({ length }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
987
|
+
"input",
|
|
988
|
+
{
|
|
989
|
+
ref: (el) => {
|
|
990
|
+
inputRefs.current[index] = el;
|
|
1011
991
|
},
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
992
|
+
type: "text",
|
|
993
|
+
inputMode: "numeric",
|
|
994
|
+
maxLength: 1,
|
|
995
|
+
value: value[index] || "",
|
|
996
|
+
onChange: (e) => handleChange(index, e.target.value),
|
|
997
|
+
onKeyDown: (e) => handleKeyDown(index, e),
|
|
998
|
+
onPaste: handlePaste,
|
|
999
|
+
disabled,
|
|
1000
|
+
className: "if-verificationCode-input",
|
|
1001
|
+
autoComplete: "one-time-code"
|
|
1002
|
+
},
|
|
1003
|
+
index
|
|
1004
|
+
)) });
|
|
1015
1005
|
}
|
|
1016
1006
|
function AuthEmailVerificationStep({
|
|
1017
1007
|
email,
|
|
1018
|
-
method
|
|
1019
|
-
onVerifyCode
|
|
1008
|
+
method,
|
|
1009
|
+
onVerifyCode,
|
|
1010
|
+
emailSent = false
|
|
1020
1011
|
}) {
|
|
1021
1012
|
const { sendVerificationEmail } = useInsforge();
|
|
1022
1013
|
const [resendDisabled, setResendDisabled] = react.useState(true);
|
|
1023
|
-
const [resendCountdown, setResendCountdown] = react.useState(60);
|
|
1014
|
+
const [resendCountdown, setResendCountdown] = react.useState(emailSent ? 60 : 0);
|
|
1024
1015
|
const [isSending, setIsSending] = react.useState(false);
|
|
1025
1016
|
const [verificationCode, setVerificationCode] = react.useState("");
|
|
1026
1017
|
const [isVerifying, setIsVerifying] = react.useState(false);
|
|
1027
|
-
const
|
|
1028
|
-
|
|
1029
|
-
const sendInitialEmail = async () => {
|
|
1030
|
-
try {
|
|
1031
|
-
await sendVerificationEmail(email);
|
|
1032
|
-
} catch (error) {
|
|
1033
|
-
console.error("Failed to send verification email:", error);
|
|
1034
|
-
}
|
|
1035
|
-
};
|
|
1036
|
-
void sendInitialEmail();
|
|
1037
|
-
}, [email, sendVerificationEmail]);
|
|
1018
|
+
const isLinkMethod = method === "link";
|
|
1019
|
+
const displayDescription = isLinkMethod ? "We've sent an email to {email}. Please check your email to confirm your account before signing in. The confirmation link expires in 10 minutes." : "We've sent a verification code to your inbox at {email}. Enter it below to proceed.";
|
|
1038
1020
|
react.useEffect(() => {
|
|
1039
|
-
if (resendCountdown > 0) {
|
|
1021
|
+
if (emailSent && resendCountdown > 0) {
|
|
1040
1022
|
const timer = setInterval(() => {
|
|
1041
1023
|
setResendCountdown((prev) => {
|
|
1042
1024
|
if (prev <= 1) {
|
|
@@ -1048,7 +1030,7 @@ function AuthEmailVerificationStep({
|
|
|
1048
1030
|
}, 1e3);
|
|
1049
1031
|
return () => clearInterval(timer);
|
|
1050
1032
|
}
|
|
1051
|
-
}, [resendCountdown]);
|
|
1033
|
+
}, [emailSent, resendCountdown]);
|
|
1052
1034
|
const handleResend = async () => {
|
|
1053
1035
|
setResendDisabled(true);
|
|
1054
1036
|
setResendCountdown(60);
|
|
@@ -1074,23 +1056,29 @@ function AuthEmailVerificationStep({
|
|
|
1074
1056
|
setVerificationCode("");
|
|
1075
1057
|
}
|
|
1076
1058
|
};
|
|
1077
|
-
const displayDescription = defaultDescription;
|
|
1078
|
-
const isLinkMethod = method === "link";
|
|
1079
1059
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep", children: [
|
|
1080
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1060
|
+
isLinkMethod && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep-descriptionContainer", children: [
|
|
1061
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "if-verificationStep-descriptionTitle", children: "Verify Your Email" }),
|
|
1062
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "if-verificationStep-description", children: displayDescription.split("{email}").map((part, index, array) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1063
|
+
part,
|
|
1064
|
+
index < array.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "if-verificationLink-email", children: email })
|
|
1065
|
+
] }, index)) })
|
|
1066
|
+
] }),
|
|
1084
1067
|
!isLinkMethod && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep-codeContainer", children: [
|
|
1085
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1068
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep-codeInputWrapper", children: [
|
|
1069
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "if-verificationStep-codeDescription", children: displayDescription.split("{email}").map((part, index, array) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1070
|
+
part,
|
|
1071
|
+
index < array.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "if-verificationCode-email", children: email })
|
|
1072
|
+
] }, index)) }),
|
|
1073
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1074
|
+
AuthVerificationCodeInput,
|
|
1075
|
+
{
|
|
1076
|
+
value: verificationCode,
|
|
1077
|
+
onChange: setVerificationCode,
|
|
1078
|
+
disabled: isVerifying
|
|
1079
|
+
}
|
|
1080
|
+
)
|
|
1081
|
+
] }),
|
|
1094
1082
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1095
1083
|
AuthSubmitButton,
|
|
1096
1084
|
{
|
|
@@ -1100,7 +1088,7 @@ function AuthEmailVerificationStep({
|
|
|
1100
1088
|
onClick: () => {
|
|
1101
1089
|
void handleSubmit();
|
|
1102
1090
|
},
|
|
1103
|
-
children: isVerifying ? "Verifying..." : "
|
|
1091
|
+
children: isVerifying ? "Verifying..." : "Continue"
|
|
1104
1092
|
}
|
|
1105
1093
|
)
|
|
1106
1094
|
] }),
|
|
@@ -1132,6 +1120,8 @@ function AuthResetPasswordVerificationStep({
|
|
|
1132
1120
|
const [isSending, setIsSending] = react.useState(false);
|
|
1133
1121
|
const [verificationCode, setVerificationCode] = react.useState("");
|
|
1134
1122
|
const [isVerifying, setIsVerifying] = react.useState(false);
|
|
1123
|
+
const isLinkMethod = method === "link";
|
|
1124
|
+
const displayDescription = isLinkMethod ? "We have sent an email to {email}. Please check your email to reset your password. The link expires in 10 minutes." : "We've sent a reset password code to your inbox at {email}. Enter it below to proceed.";
|
|
1135
1125
|
react.useEffect(() => {
|
|
1136
1126
|
if (resendCountdown > 0) {
|
|
1137
1127
|
const timer = setInterval(() => {
|
|
@@ -1171,17 +1161,20 @@ function AuthResetPasswordVerificationStep({
|
|
|
1171
1161
|
setVerificationCode("");
|
|
1172
1162
|
}
|
|
1173
1163
|
};
|
|
1174
|
-
const isLinkMethod = method === "link";
|
|
1175
|
-
const description = isLinkMethod ? `We've sent a password reset link to ${email}. Please check your email and click the link to reset your password. The link will expire in 10 minutes.` : `We've sent a 6-digit verification code to ${email}. Please enter it below to reset your password. The code will expire in 10 minutes.`;
|
|
1176
1164
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep", children: [
|
|
1177
|
-
/* @__PURE__ */ jsxRuntime.
|
|
1165
|
+
isLinkMethod && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep-descriptionContainer", children: [
|
|
1166
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "if-verificationStep-descriptionTitle", children: "Check Your Email" }),
|
|
1167
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "if-verificationStep-description", children: displayDescription.split("{email}").map((part, index, array) => /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1168
|
+
part,
|
|
1169
|
+
index < array.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "if-verificationLink-email", children: email })
|
|
1170
|
+
] }, index)) })
|
|
1171
|
+
] }),
|
|
1178
1172
|
!isLinkMethod && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "if-verificationStep-codeContainer", children: [
|
|
1179
1173
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "if-verificationStep-codeInputWrapper", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1180
1174
|
AuthVerificationCodeInput,
|
|
1181
1175
|
{
|
|
1182
1176
|
value: verificationCode,
|
|
1183
1177
|
onChange: setVerificationCode,
|
|
1184
|
-
email,
|
|
1185
1178
|
disabled: isVerifying
|
|
1186
1179
|
}
|
|
1187
1180
|
) }),
|
|
@@ -1224,7 +1217,6 @@ function SignInForm({
|
|
|
1224
1217
|
error,
|
|
1225
1218
|
loading = false,
|
|
1226
1219
|
oauthLoading = null,
|
|
1227
|
-
availableProviders = [],
|
|
1228
1220
|
onOAuthClick,
|
|
1229
1221
|
authConfig,
|
|
1230
1222
|
title = "Welcome Back",
|
|
@@ -1234,7 +1226,7 @@ function SignInForm({
|
|
|
1234
1226
|
passwordLabel = "Password",
|
|
1235
1227
|
passwordPlaceholder = "\u2022\u2022\u2022\u2022\u2022\u2022",
|
|
1236
1228
|
forgotPasswordText = "Forget Password?",
|
|
1237
|
-
forgotPasswordUrl,
|
|
1229
|
+
forgotPasswordUrl = "/forgot-password",
|
|
1238
1230
|
submitButtonText = "Sign In",
|
|
1239
1231
|
loadingButtonText = "Signing in...",
|
|
1240
1232
|
signUpText = "Don't have an account?",
|
|
@@ -1245,15 +1237,17 @@ function SignInForm({
|
|
|
1245
1237
|
onVerifyCode
|
|
1246
1238
|
}) {
|
|
1247
1239
|
return /* @__PURE__ */ jsxRuntime.jsxs(AuthContainer, { children: [
|
|
1248
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1249
|
-
|
|
1240
|
+
/* @__PURE__ */ jsxRuntime.jsx(AuthHeader, { title, subtitle }),
|
|
1241
|
+
/* @__PURE__ */ jsxRuntime.jsx(AuthErrorBanner, { error: error || "" }),
|
|
1242
|
+
showVerificationStep ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1243
|
+
AuthEmailVerificationStep,
|
|
1250
1244
|
{
|
|
1251
|
-
|
|
1252
|
-
|
|
1245
|
+
email,
|
|
1246
|
+
method: authConfig.verifyEmailMethod,
|
|
1247
|
+
onVerifyCode,
|
|
1248
|
+
emailSent: false
|
|
1253
1249
|
}
|
|
1254
|
-
),
|
|
1255
|
-
/* @__PURE__ */ jsxRuntime.jsx(AuthErrorBanner, { error: error || "" }),
|
|
1256
|
-
showVerificationStep ? /* @__PURE__ */ jsxRuntime.jsx(AuthEmailVerificationStep, { email, onVerifyCode }) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, noValidate: true, className: "if-form if-internal-fm9k2p", children: [
|
|
1250
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, noValidate: true, className: "if-form if-internal-fm9k2p", children: [
|
|
1257
1251
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1258
1252
|
AuthFormField,
|
|
1259
1253
|
{
|
|
@@ -1288,12 +1282,12 @@ function SignInForm({
|
|
|
1288
1282
|
] }),
|
|
1289
1283
|
!showVerificationStep && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1290
1284
|
/* @__PURE__ */ jsxRuntime.jsx(AuthLink, { text: signUpText, linkText: signUpLinkText, href: signUpUrl }),
|
|
1291
|
-
|
|
1285
|
+
authConfig.oAuthProviders.length > 0 && onOAuthClick && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1292
1286
|
/* @__PURE__ */ jsxRuntime.jsx(AuthDivider, { text: dividerText }),
|
|
1293
1287
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1294
1288
|
AuthOAuthProviders,
|
|
1295
1289
|
{
|
|
1296
|
-
providers:
|
|
1290
|
+
providers: authConfig.oAuthProviders,
|
|
1297
1291
|
onClick: onOAuthClick,
|
|
1298
1292
|
disabled: loading || oauthLoading !== null,
|
|
1299
1293
|
loading: oauthLoading
|
|
@@ -1350,7 +1344,7 @@ function SignIn({ onError, ...uiProps }) {
|
|
|
1350
1344
|
async function handleVerifyCode(code) {
|
|
1351
1345
|
setError("");
|
|
1352
1346
|
try {
|
|
1353
|
-
const result = await verifyEmail(
|
|
1347
|
+
const result = await verifyEmail(code, email);
|
|
1354
1348
|
if (result?.error) {
|
|
1355
1349
|
throw new Error(result.error.message || "Verification failed");
|
|
1356
1350
|
}
|
|
@@ -1368,7 +1362,15 @@ function SignIn({ onError, ...uiProps }) {
|
|
|
1368
1362
|
}
|
|
1369
1363
|
}
|
|
1370
1364
|
function handleOAuth(provider) {
|
|
1371
|
-
|
|
1365
|
+
try {
|
|
1366
|
+
loginWithOAuth(provider, redirectUrl || "");
|
|
1367
|
+
} catch (err) {
|
|
1368
|
+
const errorMessage = err instanceof Error ? err.message : "OAuth login failed";
|
|
1369
|
+
setError(errorMessage);
|
|
1370
|
+
if (onError) {
|
|
1371
|
+
onError(new Error(errorMessage));
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1372
1374
|
}
|
|
1373
1375
|
if (!authConfig) {
|
|
1374
1376
|
return null;
|
|
@@ -1384,7 +1386,6 @@ function SignIn({ onError, ...uiProps }) {
|
|
|
1384
1386
|
error,
|
|
1385
1387
|
loading,
|
|
1386
1388
|
oauthLoading,
|
|
1387
|
-
availableProviders: authConfig?.oAuthProviders || [],
|
|
1388
1389
|
onOAuthClick: handleOAuth,
|
|
1389
1390
|
authConfig,
|
|
1390
1391
|
showVerificationStep: step === "awaiting-verification",
|
|
@@ -1402,7 +1403,6 @@ function SignUpForm({
|
|
|
1402
1403
|
error,
|
|
1403
1404
|
loading = false,
|
|
1404
1405
|
oauthLoading = null,
|
|
1405
|
-
availableProviders = [],
|
|
1406
1406
|
onOAuthClick,
|
|
1407
1407
|
authConfig,
|
|
1408
1408
|
title = "Get Started",
|
|
@@ -1421,15 +1421,17 @@ function SignUpForm({
|
|
|
1421
1421
|
onVerifyCode
|
|
1422
1422
|
}) {
|
|
1423
1423
|
return /* @__PURE__ */ jsxRuntime.jsxs(AuthContainer, { children: [
|
|
1424
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1425
|
-
|
|
1424
|
+
/* @__PURE__ */ jsxRuntime.jsx(AuthHeader, { title, subtitle }),
|
|
1425
|
+
/* @__PURE__ */ jsxRuntime.jsx(AuthErrorBanner, { error: error || "" }),
|
|
1426
|
+
showVerificationStep ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1427
|
+
AuthEmailVerificationStep,
|
|
1426
1428
|
{
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
+
email,
|
|
1430
|
+
method: authConfig.verifyEmailMethod,
|
|
1431
|
+
onVerifyCode,
|
|
1432
|
+
emailSent: true
|
|
1429
1433
|
}
|
|
1430
|
-
),
|
|
1431
|
-
/* @__PURE__ */ jsxRuntime.jsx(AuthErrorBanner, { error: error || "" }),
|
|
1432
|
-
showVerificationStep ? /* @__PURE__ */ jsxRuntime.jsx(AuthEmailVerificationStep, { email, onVerifyCode }) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, noValidate: true, className: "if-form if-internal-fm9k2p", children: [
|
|
1434
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit, noValidate: true, className: "if-form if-internal-fm9k2p", children: [
|
|
1433
1435
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1434
1436
|
AuthFormField,
|
|
1435
1437
|
{
|
|
@@ -1452,7 +1454,6 @@ function SignUpForm({
|
|
|
1452
1454
|
value: password,
|
|
1453
1455
|
onChange: (e) => onPasswordChange(e.target.value),
|
|
1454
1456
|
required: true,
|
|
1455
|
-
minLength: authConfig.passwordMinLength,
|
|
1456
1457
|
autoComplete: "new-password",
|
|
1457
1458
|
showStrengthIndicator: true,
|
|
1458
1459
|
authConfig
|
|
@@ -1462,12 +1463,12 @@ function SignUpForm({
|
|
|
1462
1463
|
] }),
|
|
1463
1464
|
!showVerificationStep && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1464
1465
|
/* @__PURE__ */ jsxRuntime.jsx(AuthLink, { text: signInText, linkText: signInLinkText, href: signInUrl }),
|
|
1465
|
-
|
|
1466
|
+
authConfig.oAuthProviders.length > 0 && onOAuthClick && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1466
1467
|
/* @__PURE__ */ jsxRuntime.jsx(AuthDivider, { text: dividerText }),
|
|
1467
1468
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1468
1469
|
AuthOAuthProviders,
|
|
1469
1470
|
{
|
|
1470
|
-
providers:
|
|
1471
|
+
providers: authConfig.oAuthProviders,
|
|
1471
1472
|
onClick: onOAuthClick,
|
|
1472
1473
|
disabled: loading || oauthLoading !== null,
|
|
1473
1474
|
loading: oauthLoading
|
|
@@ -1620,7 +1621,7 @@ function SignUp({ onError, ...uiProps }) {
|
|
|
1620
1621
|
async function handleVerifyCode(code) {
|
|
1621
1622
|
setError("");
|
|
1622
1623
|
try {
|
|
1623
|
-
const result = await verifyEmail(
|
|
1624
|
+
const result = await verifyEmail(code, email);
|
|
1624
1625
|
if (result?.error) {
|
|
1625
1626
|
throw new Error(result.error.message || "Verification failed");
|
|
1626
1627
|
}
|
|
@@ -1638,7 +1639,15 @@ function SignUp({ onError, ...uiProps }) {
|
|
|
1638
1639
|
}
|
|
1639
1640
|
}
|
|
1640
1641
|
function handleOAuth(provider) {
|
|
1641
|
-
|
|
1642
|
+
try {
|
|
1643
|
+
loginWithOAuth(provider, redirectUrl || "");
|
|
1644
|
+
} catch (err) {
|
|
1645
|
+
const errorMessage = err instanceof Error ? err.message : "OAuth login failed";
|
|
1646
|
+
setError(errorMessage);
|
|
1647
|
+
if (onError) {
|
|
1648
|
+
onError(new Error(errorMessage));
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1642
1651
|
}
|
|
1643
1652
|
if (!authConfig) {
|
|
1644
1653
|
return null;
|
|
@@ -1654,7 +1663,6 @@ function SignUp({ onError, ...uiProps }) {
|
|
|
1654
1663
|
error,
|
|
1655
1664
|
loading,
|
|
1656
1665
|
oauthLoading,
|
|
1657
|
-
availableProviders: authConfig?.oAuthProviders || [],
|
|
1658
1666
|
onOAuthClick: handleOAuth,
|
|
1659
1667
|
authConfig,
|
|
1660
1668
|
showVerificationStep: step === "awaiting-verification",
|
|
@@ -1670,10 +1678,10 @@ function ForgotPasswordForm({
|
|
|
1670
1678
|
error,
|
|
1671
1679
|
loading = false,
|
|
1672
1680
|
title = "Forgot Password?",
|
|
1673
|
-
subtitle = "Enter your email address and we'll send you a
|
|
1681
|
+
subtitle = "Enter your email address and we'll send you a {method} to reset your password.",
|
|
1674
1682
|
emailLabel = "Email",
|
|
1675
1683
|
emailPlaceholder = "example@email.com",
|
|
1676
|
-
submitButtonText = "
|
|
1684
|
+
submitButtonText = "Reset Password",
|
|
1677
1685
|
loadingButtonText = "Sending...",
|
|
1678
1686
|
backToSignInText = "Remember your password?",
|
|
1679
1687
|
backToSignInUrl = "/sign-in",
|
|
@@ -1682,14 +1690,9 @@ function ForgotPasswordForm({
|
|
|
1682
1690
|
onVerifyCode,
|
|
1683
1691
|
onResendEmail
|
|
1684
1692
|
}) {
|
|
1693
|
+
const displaySubtitle = subtitle.replace("{method}", resetPasswordMethod);
|
|
1685
1694
|
return /* @__PURE__ */ jsxRuntime.jsxs(AuthContainer, { children: [
|
|
1686
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1687
|
-
AuthHeader,
|
|
1688
|
-
{
|
|
1689
|
-
title: showVerificationStep ? resetPasswordMethod === "link" ? "Check Your Email" : "Enter Reset Code" : title,
|
|
1690
|
-
subtitle: showVerificationStep ? "" : subtitle
|
|
1691
|
-
}
|
|
1692
|
-
),
|
|
1695
|
+
/* @__PURE__ */ jsxRuntime.jsx(AuthHeader, { title, subtitle: displaySubtitle }),
|
|
1693
1696
|
/* @__PURE__ */ jsxRuntime.jsx(AuthErrorBanner, { error: error || "" }),
|
|
1694
1697
|
showVerificationStep ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1695
1698
|
AuthResetPasswordVerificationStep,
|
|
@@ -2397,46 +2400,36 @@ function useUser() {
|
|
|
2397
2400
|
const { user, isLoaded, updateUser, setUser } = useInsforge();
|
|
2398
2401
|
return { user, isLoaded, updateUser, setUser };
|
|
2399
2402
|
}
|
|
2400
|
-
function RedirectToAuth({
|
|
2403
|
+
function RedirectToAuth({
|
|
2404
|
+
baseUrl,
|
|
2405
|
+
path,
|
|
2406
|
+
afterSignInUrl
|
|
2407
|
+
}) {
|
|
2401
2408
|
react.useEffect(() => {
|
|
2402
|
-
const currentUrl = window.location.
|
|
2409
|
+
const currentUrl = window.location.origin + afterSignInUrl;
|
|
2403
2410
|
const authUrl = new URL(path, baseUrl);
|
|
2404
2411
|
authUrl.searchParams.set("redirect", currentUrl);
|
|
2405
2412
|
window.location.replace(authUrl.toString());
|
|
2406
|
-
}, [baseUrl, path]);
|
|
2413
|
+
}, [baseUrl, path, afterSignInUrl]);
|
|
2407
2414
|
return null;
|
|
2408
2415
|
}
|
|
2409
2416
|
function getInsforgeRoutes(config) {
|
|
2410
|
-
const { baseUrl, builtInAuth = true, paths = {} } = config;
|
|
2411
|
-
const {
|
|
2412
|
-
signIn = "/sign-in",
|
|
2413
|
-
signUp = "/sign-up",
|
|
2414
|
-
verifyEmail = "/verify-email",
|
|
2415
|
-
forgotPassword = "/forgot-password",
|
|
2416
|
-
resetPassword = "/reset-password"
|
|
2417
|
-
} = paths;
|
|
2417
|
+
const { baseUrl, builtInAuth = true, paths = {}, afterSignInUrl = "/" } = config;
|
|
2418
|
+
const { signIn = "/sign-in", signUp = "/sign-up", forgotPassword = "/forgot-password" } = paths;
|
|
2418
2419
|
const routes = [];
|
|
2419
2420
|
if (builtInAuth) {
|
|
2420
2421
|
routes.push(
|
|
2421
2422
|
{
|
|
2422
2423
|
path: signIn,
|
|
2423
|
-
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/sign-in" })
|
|
2424
|
+
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/sign-in", afterSignInUrl })
|
|
2424
2425
|
},
|
|
2425
2426
|
{
|
|
2426
2427
|
path: signUp,
|
|
2427
|
-
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/sign-up" })
|
|
2428
|
-
},
|
|
2429
|
-
{
|
|
2430
|
-
path: verifyEmail,
|
|
2431
|
-
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/verify-email" })
|
|
2428
|
+
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/sign-up", afterSignInUrl })
|
|
2432
2429
|
},
|
|
2433
2430
|
{
|
|
2434
2431
|
path: forgotPassword,
|
|
2435
2432
|
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/forgot-password" })
|
|
2436
|
-
},
|
|
2437
|
-
{
|
|
2438
|
-
path: resetPassword,
|
|
2439
|
-
element: /* @__PURE__ */ jsxRuntime.jsx(RedirectToAuth, { baseUrl, path: "/auth/reset-password" })
|
|
2440
2433
|
}
|
|
2441
2434
|
);
|
|
2442
2435
|
}
|