@entropy-softworks/ui 2026.7.31
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/CHANGELOG.md +96 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/lib/components/auth/LockOverlay.d.ts +22 -0
- package/lib/components/auth/LockOverlay.d.ts.map +1 -0
- package/lib/components/auth/LockOverlay.jsx +82 -0
- package/lib/components/auth/LockOverlay.jsx.map +1 -0
- package/lib/components/auth/PasswordStrengthMeter.d.ts +12 -0
- package/lib/components/auth/PasswordStrengthMeter.d.ts.map +1 -0
- package/lib/components/auth/PasswordStrengthMeter.jsx +81 -0
- package/lib/components/auth/PasswordStrengthMeter.jsx.map +1 -0
- package/lib/components/auth/ProtectedRoute.d.ts +24 -0
- package/lib/components/auth/ProtectedRoute.d.ts.map +1 -0
- package/lib/components/auth/ProtectedRoute.jsx +56 -0
- package/lib/components/auth/ProtectedRoute.jsx.map +1 -0
- package/lib/components/auth/PwnedPasswordWarning.d.ts +13 -0
- package/lib/components/auth/PwnedPasswordWarning.d.ts.map +1 -0
- package/lib/components/auth/PwnedPasswordWarning.jsx +29 -0
- package/lib/components/auth/PwnedPasswordWarning.jsx.map +1 -0
- package/lib/components/auth/index.d.ts +5 -0
- package/lib/components/auth/index.d.ts.map +1 -0
- package/lib/components/auth/index.js +5 -0
- package/lib/components/auth/index.js.map +1 -0
- package/lib/components/bottom-nav.d.ts +25 -0
- package/lib/components/bottom-nav.d.ts.map +1 -0
- package/lib/components/bottom-nav.jsx +51 -0
- package/lib/components/bottom-nav.jsx.map +1 -0
- package/lib/components/button.d.ts +16 -0
- package/lib/components/button.d.ts.map +1 -0
- package/lib/components/button.jsx +73 -0
- package/lib/components/button.jsx.map +1 -0
- package/lib/components/card.d.ts +22 -0
- package/lib/components/card.d.ts.map +1 -0
- package/lib/components/card.jsx +36 -0
- package/lib/components/card.jsx.map +1 -0
- package/lib/components/checkbox.d.ts +12 -0
- package/lib/components/checkbox.d.ts.map +1 -0
- package/lib/components/checkbox.jsx +16 -0
- package/lib/components/checkbox.jsx.map +1 -0
- package/lib/components/connection-settings.d.ts +41 -0
- package/lib/components/connection-settings.d.ts.map +1 -0
- package/lib/components/connection-settings.jsx +354 -0
- package/lib/components/connection-settings.jsx.map +1 -0
- package/lib/components/context-menu.d.ts +52 -0
- package/lib/components/context-menu.d.ts.map +1 -0
- package/lib/components/context-menu.jsx +24 -0
- package/lib/components/context-menu.jsx.map +1 -0
- package/lib/components/data-table.d.ts +59 -0
- package/lib/components/data-table.d.ts.map +1 -0
- package/lib/components/data-table.jsx +101 -0
- package/lib/components/data-table.jsx.map +1 -0
- package/lib/components/dialog.d.ts +58 -0
- package/lib/components/dialog.d.ts.map +1 -0
- package/lib/components/dialog.jsx +197 -0
- package/lib/components/dialog.jsx.map +1 -0
- package/lib/components/dropdown-menu.d.ts +55 -0
- package/lib/components/dropdown-menu.d.ts.map +1 -0
- package/lib/components/dropdown-menu.jsx +38 -0
- package/lib/components/dropdown-menu.jsx.map +1 -0
- package/lib/components/entropy-boot-splash.d.ts +24 -0
- package/lib/components/entropy-boot-splash.d.ts.map +1 -0
- package/lib/components/entropy-boot-splash.jsx +83 -0
- package/lib/components/entropy-boot-splash.jsx.map +1 -0
- package/lib/components/entropy-mark-animated.d.ts +20 -0
- package/lib/components/entropy-mark-animated.d.ts.map +1 -0
- package/lib/components/entropy-mark-animated.jsx +148 -0
- package/lib/components/entropy-mark-animated.jsx.map +1 -0
- package/lib/components/entropy-mark-geometry.d.ts +8 -0
- package/lib/components/entropy-mark-geometry.d.ts.map +1 -0
- package/lib/components/entropy-mark-geometry.js +10 -0
- package/lib/components/entropy-mark-geometry.js.map +1 -0
- package/lib/components/entropy-mark-sequential.d.ts +12 -0
- package/lib/components/entropy-mark-sequential.d.ts.map +1 -0
- package/lib/components/entropy-mark-sequential.jsx +53 -0
- package/lib/components/entropy-mark-sequential.jsx.map +1 -0
- package/lib/components/entropy-mark.d.ts +29 -0
- package/lib/components/entropy-mark.d.ts.map +1 -0
- package/lib/components/entropy-mark.jsx +66 -0
- package/lib/components/entropy-mark.jsx.map +1 -0
- package/lib/components/error-boundary.d.ts +31 -0
- package/lib/components/error-boundary.d.ts.map +1 -0
- package/lib/components/error-boundary.jsx +40 -0
- package/lib/components/error-boundary.jsx.map +1 -0
- package/lib/components/index.d.ts +41 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +43 -0
- package/lib/components/index.js.map +1 -0
- package/lib/components/input.d.ts +26 -0
- package/lib/components/input.d.ts.map +1 -0
- package/lib/components/input.jsx +95 -0
- package/lib/components/input.jsx.map +1 -0
- package/lib/components/item-icon.d.ts +32 -0
- package/lib/components/item-icon.d.ts.map +1 -0
- package/lib/components/item-icon.jsx +54 -0
- package/lib/components/item-icon.jsx.map +1 -0
- package/lib/components/label.d.ts +13 -0
- package/lib/components/label.d.ts.map +1 -0
- package/lib/components/label.jsx +9 -0
- package/lib/components/label.jsx.map +1 -0
- package/lib/components/legal-dialog.d.ts +18 -0
- package/lib/components/legal-dialog.d.ts.map +1 -0
- package/lib/components/legal-dialog.jsx +31 -0
- package/lib/components/legal-dialog.jsx.map +1 -0
- package/lib/components/license-gate.d.ts +17 -0
- package/lib/components/license-gate.d.ts.map +1 -0
- package/lib/components/license-gate.jsx +21 -0
- package/lib/components/license-gate.jsx.map +1 -0
- package/lib/components/logo.d.ts +15 -0
- package/lib/components/logo.d.ts.map +1 -0
- package/lib/components/logo.jsx +20 -0
- package/lib/components/logo.jsx.map +1 -0
- package/lib/components/onboarding-wizard.d.ts +89 -0
- package/lib/components/onboarding-wizard.d.ts.map +1 -0
- package/lib/components/onboarding-wizard.jsx +185 -0
- package/lib/components/onboarding-wizard.jsx.map +1 -0
- package/lib/components/pagination.d.ts +43 -0
- package/lib/components/pagination.d.ts.map +1 -0
- package/lib/components/pagination.jsx +72 -0
- package/lib/components/pagination.jsx.map +1 -0
- package/lib/components/password-generator.d.ts +15 -0
- package/lib/components/password-generator.d.ts.map +1 -0
- package/lib/components/password-generator.jsx +273 -0
- package/lib/components/password-generator.jsx.map +1 -0
- package/lib/components/pin-pad.d.ts +20 -0
- package/lib/components/pin-pad.d.ts.map +1 -0
- package/lib/components/pin-pad.jsx +93 -0
- package/lib/components/pin-pad.jsx.map +1 -0
- package/lib/components/popover.d.ts +27 -0
- package/lib/components/popover.d.ts.map +1 -0
- package/lib/components/popover.jsx +18 -0
- package/lib/components/popover.jsx.map +1 -0
- package/lib/components/profile/ProfileDialog.d.ts +25 -0
- package/lib/components/profile/ProfileDialog.d.ts.map +1 -0
- package/lib/components/profile/ProfileDialog.jsx +71 -0
- package/lib/components/profile/ProfileDialog.jsx.map +1 -0
- package/lib/components/profile/ProfileTab.d.ts +12 -0
- package/lib/components/profile/ProfileTab.d.ts.map +1 -0
- package/lib/components/profile/ProfileTab.jsx +112 -0
- package/lib/components/profile/ProfileTab.jsx.map +1 -0
- package/lib/components/profile/SecurityTab.d.ts +32 -0
- package/lib/components/profile/SecurityTab.d.ts.map +1 -0
- package/lib/components/profile/SecurityTab.jsx +145 -0
- package/lib/components/profile/SecurityTab.jsx.map +1 -0
- package/lib/components/profile/index.d.ts +4 -0
- package/lib/components/profile/index.d.ts.map +1 -0
- package/lib/components/profile/index.js +4 -0
- package/lib/components/profile/index.js.map +1 -0
- package/lib/components/segmented-toggle.d.ts +28 -0
- package/lib/components/segmented-toggle.d.ts.map +1 -0
- package/lib/components/segmented-toggle.jsx +64 -0
- package/lib/components/segmented-toggle.jsx.map +1 -0
- package/lib/components/separator.d.ts +13 -0
- package/lib/components/separator.d.ts.map +1 -0
- package/lib/components/separator.jsx +16 -0
- package/lib/components/separator.jsx.map +1 -0
- package/lib/components/server-settings.d.ts +27 -0
- package/lib/components/server-settings.d.ts.map +1 -0
- package/lib/components/server-settings.jsx +307 -0
- package/lib/components/server-settings.jsx.map +1 -0
- package/lib/components/settings/AccountSection.d.ts +26 -0
- package/lib/components/settings/AccountSection.d.ts.map +1 -0
- package/lib/components/settings/AccountSection.jsx +32 -0
- package/lib/components/settings/AccountSection.jsx.map +1 -0
- package/lib/components/settings/DangerZoneSection.d.ts +13 -0
- package/lib/components/settings/DangerZoneSection.d.ts.map +1 -0
- package/lib/components/settings/DangerZoneSection.jsx +16 -0
- package/lib/components/settings/DangerZoneSection.jsx.map +1 -0
- package/lib/components/settings/GeneralSection.d.ts +11 -0
- package/lib/components/settings/GeneralSection.d.ts.map +1 -0
- package/lib/components/settings/GeneralSection.jsx +12 -0
- package/lib/components/settings/GeneralSection.jsx.map +1 -0
- package/lib/components/settings/SupportSection.d.ts +11 -0
- package/lib/components/settings/SupportSection.d.ts.map +1 -0
- package/lib/components/settings/SupportSection.jsx +22 -0
- package/lib/components/settings/SupportSection.jsx.map +1 -0
- package/lib/components/settings/index.d.ts +5 -0
- package/lib/components/settings/index.d.ts.map +1 -0
- package/lib/components/settings/index.js +5 -0
- package/lib/components/settings/index.js.map +1 -0
- package/lib/components/settings-row.d.ts +28 -0
- package/lib/components/settings-row.d.ts.map +1 -0
- package/lib/components/settings-row.jsx +68 -0
- package/lib/components/settings-row.jsx.map +1 -0
- package/lib/components/skeleton.d.ts +8 -0
- package/lib/components/skeleton.d.ts.map +1 -0
- package/lib/components/skeleton.jsx +24 -0
- package/lib/components/skeleton.jsx.map +1 -0
- package/lib/components/social-connections.d.ts +15 -0
- package/lib/components/social-connections.d.ts.map +1 -0
- package/lib/components/social-connections.jsx +31 -0
- package/lib/components/social-connections.jsx.map +1 -0
- package/lib/components/stat-card.d.ts +29 -0
- package/lib/components/stat-card.d.ts.map +1 -0
- package/lib/components/stat-card.jsx +36 -0
- package/lib/components/stat-card.jsx.map +1 -0
- package/lib/components/tag-chip.d.ts +18 -0
- package/lib/components/tag-chip.d.ts.map +1 -0
- package/lib/components/tag-chip.jsx +54 -0
- package/lib/components/tag-chip.jsx.map +1 -0
- package/lib/components/tag-multi-select.d.ts +27 -0
- package/lib/components/tag-multi-select.d.ts.map +1 -0
- package/lib/components/tag-multi-select.jsx +65 -0
- package/lib/components/tag-multi-select.jsx.map +1 -0
- package/lib/components/text.d.ts +22 -0
- package/lib/components/text.d.ts.map +1 -0
- package/lib/components/text.jsx +43 -0
- package/lib/components/text.jsx.map +1 -0
- package/lib/components/toast/ToastPortal.d.ts +11 -0
- package/lib/components/toast/ToastPortal.d.ts.map +1 -0
- package/lib/components/toast/ToastPortal.jsx +15 -0
- package/lib/components/toast/ToastPortal.jsx.map +1 -0
- package/lib/components/toast/ToastPortal.web.d.ts +14 -0
- package/lib/components/toast/ToastPortal.web.d.ts.map +1 -0
- package/lib/components/toast/ToastPortal.web.jsx +39 -0
- package/lib/components/toast/ToastPortal.web.jsx.map +1 -0
- package/lib/components/toast/index.d.ts +3 -0
- package/lib/components/toast/index.d.ts.map +1 -0
- package/lib/components/toast/index.js +3 -0
- package/lib/components/toast/index.js.map +1 -0
- package/lib/components/toast/toast-config.d.ts +14 -0
- package/lib/components/toast/toast-config.d.ts.map +1 -0
- package/lib/components/toast/toast-config.jsx +24 -0
- package/lib/components/toast/toast-config.jsx.map +1 -0
- package/lib/components/tooltip.d.ts +30 -0
- package/lib/components/tooltip.d.ts.map +1 -0
- package/lib/components/tooltip.jsx +14 -0
- package/lib/components/tooltip.jsx.map +1 -0
- package/lib/components/totp-display.d.ts +23 -0
- package/lib/components/totp-display.d.ts.map +1 -0
- package/lib/components/totp-display.jsx +132 -0
- package/lib/components/totp-display.jsx.map +1 -0
- package/lib/components/user-avatar.d.ts +18 -0
- package/lib/components/user-avatar.d.ts.map +1 -0
- package/lib/components/user-avatar.jsx +25 -0
- package/lib/components/user-avatar.jsx.map +1 -0
- package/lib/context/AppConfigContext.d.ts +56 -0
- package/lib/context/AppConfigContext.d.ts.map +1 -0
- package/lib/context/AppConfigContext.jsx +14 -0
- package/lib/context/AppConfigContext.jsx.map +1 -0
- package/lib/context/NavigationContext.d.ts +42 -0
- package/lib/context/NavigationContext.d.ts.map +1 -0
- package/lib/context/NavigationContext.jsx +53 -0
- package/lib/context/NavigationContext.jsx.map +1 -0
- package/lib/context/NotificationContext.d.ts +32 -0
- package/lib/context/NotificationContext.d.ts.map +1 -0
- package/lib/context/NotificationContext.jsx +49 -0
- package/lib/context/NotificationContext.jsx.map +1 -0
- package/lib/context/ThemeContext.d.ts +12 -0
- package/lib/context/ThemeContext.d.ts.map +1 -0
- package/lib/context/ThemeContext.jsx +66 -0
- package/lib/context/ThemeContext.jsx.map +1 -0
- package/lib/context/index.d.ts +5 -0
- package/lib/context/index.d.ts.map +1 -0
- package/lib/context/index.js +5 -0
- package/lib/context/index.js.map +1 -0
- package/lib/flags.d.ts +9 -0
- package/lib/flags.d.ts.map +1 -0
- package/lib/flags.js +37 -0
- package/lib/flags.js.map +1 -0
- package/lib/forms/form-error.d.ts +12 -0
- package/lib/forms/form-error.d.ts.map +1 -0
- package/lib/forms/form-error.jsx +14 -0
- package/lib/forms/form-error.jsx.map +1 -0
- package/lib/forms/index.d.ts +3 -0
- package/lib/forms/index.d.ts.map +1 -0
- package/lib/forms/index.js +3 -0
- package/lib/forms/index.js.map +1 -0
- package/lib/forms/shake-field.d.ts +18 -0
- package/lib/forms/shake-field.d.ts.map +1 -0
- package/lib/forms/shake-field.jsx +30 -0
- package/lib/forms/shake-field.jsx.map +1 -0
- package/lib/hooks/index.d.ts +6 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +6 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useAuth.d.ts +109 -0
- package/lib/hooks/useAuth.d.ts.map +1 -0
- package/lib/hooks/useAuth.jsx +404 -0
- package/lib/hooks/useAuth.jsx.map +1 -0
- package/lib/hooks/useAutoLock.d.ts +22 -0
- package/lib/hooks/useAutoLock.d.ts.map +1 -0
- package/lib/hooks/useAutoLock.js +85 -0
- package/lib/hooks/useAutoLock.js.map +1 -0
- package/lib/hooks/useDebouncedValue.d.ts +19 -0
- package/lib/hooks/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/useDebouncedValue.js +29 -0
- package/lib/hooks/useDebouncedValue.js.map +1 -0
- package/lib/hooks/useShakeAnimation.d.ts +17 -0
- package/lib/hooks/useShakeAnimation.d.ts.map +1 -0
- package/lib/hooks/useShakeAnimation.js +22 -0
- package/lib/hooks/useShakeAnimation.js.map +1 -0
- package/lib/hooks/useUploadBlobUrl.d.ts +13 -0
- package/lib/hooks/useUploadBlobUrl.d.ts.map +1 -0
- package/lib/hooks/useUploadBlobUrl.js +60 -0
- package/lib/hooks/useUploadBlobUrl.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +47 -0
- package/lib/index.js.map +1 -0
- package/lib/screens/auth/AccountPickerScreen.d.ts +24 -0
- package/lib/screens/auth/AccountPickerScreen.d.ts.map +1 -0
- package/lib/screens/auth/AccountPickerScreen.jsx +47 -0
- package/lib/screens/auth/AccountPickerScreen.jsx.map +1 -0
- package/lib/screens/auth/AuthScreen.d.ts +59 -0
- package/lib/screens/auth/AuthScreen.d.ts.map +1 -0
- package/lib/screens/auth/AuthScreen.jsx +594 -0
- package/lib/screens/auth/AuthScreen.jsx.map +1 -0
- package/lib/screens/auth/ConsentScreen.d.ts +27 -0
- package/lib/screens/auth/ConsentScreen.d.ts.map +1 -0
- package/lib/screens/auth/ConsentScreen.jsx +55 -0
- package/lib/screens/auth/ConsentScreen.jsx.map +1 -0
- package/lib/screens/auth/ErrorScreen.d.ts +20 -0
- package/lib/screens/auth/ErrorScreen.d.ts.map +1 -0
- package/lib/screens/auth/ErrorScreen.jsx +43 -0
- package/lib/screens/auth/ErrorScreen.jsx.map +1 -0
- package/lib/screens/auth/ExpiredLinkScreen.d.ts +19 -0
- package/lib/screens/auth/ExpiredLinkScreen.d.ts.map +1 -0
- package/lib/screens/auth/ExpiredLinkScreen.jsx +38 -0
- package/lib/screens/auth/ExpiredLinkScreen.jsx.map +1 -0
- package/lib/screens/auth/ForgotPasswordScreen.d.ts +4 -0
- package/lib/screens/auth/ForgotPasswordScreen.d.ts.map +1 -0
- package/lib/screens/auth/ForgotPasswordScreen.jsx +123 -0
- package/lib/screens/auth/ForgotPasswordScreen.jsx.map +1 -0
- package/lib/screens/auth/ImportDataScreen.d.ts +17 -0
- package/lib/screens/auth/ImportDataScreen.d.ts.map +1 -0
- package/lib/screens/auth/ImportDataScreen.jsx +73 -0
- package/lib/screens/auth/ImportDataScreen.jsx.map +1 -0
- package/lib/screens/auth/LoginScreen.d.ts +38 -0
- package/lib/screens/auth/LoginScreen.d.ts.map +1 -0
- package/lib/screens/auth/LoginScreen.jsx +326 -0
- package/lib/screens/auth/LoginScreen.jsx.map +1 -0
- package/lib/screens/auth/MfaChallengeScreen.d.ts +4 -0
- package/lib/screens/auth/MfaChallengeScreen.d.ts.map +1 -0
- package/lib/screens/auth/MfaChallengeScreen.jsx +139 -0
- package/lib/screens/auth/MfaChallengeScreen.jsx.map +1 -0
- package/lib/screens/auth/MfaEnrollScreen.d.ts +12 -0
- package/lib/screens/auth/MfaEnrollScreen.d.ts.map +1 -0
- package/lib/screens/auth/MfaEnrollScreen.jsx +267 -0
- package/lib/screens/auth/MfaEnrollScreen.jsx.map +1 -0
- package/lib/screens/auth/PasskeyEnrollScreen.d.ts +18 -0
- package/lib/screens/auth/PasskeyEnrollScreen.d.ts.map +1 -0
- package/lib/screens/auth/PasskeyEnrollScreen.jsx +51 -0
- package/lib/screens/auth/PasskeyEnrollScreen.jsx.map +1 -0
- package/lib/screens/auth/PrivacyPolicyScreen.d.ts +19 -0
- package/lib/screens/auth/PrivacyPolicyScreen.d.ts.map +1 -0
- package/lib/screens/auth/PrivacyPolicyScreen.jsx +143 -0
- package/lib/screens/auth/PrivacyPolicyScreen.jsx.map +1 -0
- package/lib/screens/auth/RegisterScreen.d.ts +14 -0
- package/lib/screens/auth/RegisterScreen.d.ts.map +1 -0
- package/lib/screens/auth/RegisterScreen.jsx +296 -0
- package/lib/screens/auth/RegisterScreen.jsx.map +1 -0
- package/lib/screens/auth/ResetPasswordScreen.d.ts +12 -0
- package/lib/screens/auth/ResetPasswordScreen.d.ts.map +1 -0
- package/lib/screens/auth/ResetPasswordScreen.jsx +276 -0
- package/lib/screens/auth/ResetPasswordScreen.jsx.map +1 -0
- package/lib/screens/auth/ServerConfigScreen.d.ts +18 -0
- package/lib/screens/auth/ServerConfigScreen.d.ts.map +1 -0
- package/lib/screens/auth/ServerConfigScreen.jsx +259 -0
- package/lib/screens/auth/ServerConfigScreen.jsx.map +1 -0
- package/lib/screens/auth/TermsOfServiceScreen.d.ts +30 -0
- package/lib/screens/auth/TermsOfServiceScreen.d.ts.map +1 -0
- package/lib/screens/auth/TermsOfServiceScreen.jsx +130 -0
- package/lib/screens/auth/TermsOfServiceScreen.jsx.map +1 -0
- package/lib/screens/auth/VerifyEmailScreen.d.ts +4 -0
- package/lib/screens/auth/VerifyEmailScreen.d.ts.map +1 -0
- package/lib/screens/auth/VerifyEmailScreen.jsx +249 -0
- package/lib/screens/auth/VerifyEmailScreen.jsx.map +1 -0
- package/lib/screens/auth/WelcomeScreen.d.ts +17 -0
- package/lib/screens/auth/WelcomeScreen.d.ts.map +1 -0
- package/lib/screens/auth/WelcomeScreen.jsx +58 -0
- package/lib/screens/auth/WelcomeScreen.jsx.map +1 -0
- package/lib/screens/auth/index.d.ts +19 -0
- package/lib/screens/auth/index.d.ts.map +1 -0
- package/lib/screens/auth/index.js +19 -0
- package/lib/screens/auth/index.js.map +1 -0
- package/lib/screens/index.d.ts +2 -0
- package/lib/screens/index.d.ts.map +1 -0
- package/lib/screens/index.js +2 -0
- package/lib/screens/index.js.map +1 -0
- package/lib/services/api-config.d.ts +87 -0
- package/lib/services/api-config.d.ts.map +1 -0
- package/lib/services/api-config.js +202 -0
- package/lib/services/api-config.js.map +1 -0
- package/lib/services/auth.service.d.ts +140 -0
- package/lib/services/auth.service.d.ts.map +1 -0
- package/lib/services/auth.service.js +376 -0
- package/lib/services/auth.service.js.map +1 -0
- package/lib/services/favicon.d.ts +46 -0
- package/lib/services/favicon.d.ts.map +1 -0
- package/lib/services/favicon.js +84 -0
- package/lib/services/favicon.js.map +1 -0
- package/lib/services/hibp-cache.d.ts +23 -0
- package/lib/services/hibp-cache.d.ts.map +1 -0
- package/lib/services/hibp-cache.js +56 -0
- package/lib/services/hibp-cache.js.map +1 -0
- package/lib/services/hibp.d.ts +28 -0
- package/lib/services/hibp.d.ts.map +1 -0
- package/lib/services/hibp.js +92 -0
- package/lib/services/hibp.js.map +1 -0
- package/lib/services/index.d.ts +8 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +7 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/passkey.d.ts +10 -0
- package/lib/services/passkey.d.ts.map +1 -0
- package/lib/services/passkey.js +192 -0
- package/lib/services/passkey.js.map +1 -0
- package/lib/utils/api-fetch.d.ts +11 -0
- package/lib/utils/api-fetch.d.ts.map +1 -0
- package/lib/utils/api-fetch.js +52 -0
- package/lib/utils/api-fetch.js.map +1 -0
- package/lib/utils/clipboard.d.ts +31 -0
- package/lib/utils/clipboard.d.ts.map +1 -0
- package/lib/utils/clipboard.js +66 -0
- package/lib/utils/clipboard.js.map +1 -0
- package/lib/utils/cn.d.ts +9 -0
- package/lib/utils/cn.d.ts.map +1 -0
- package/lib/utils/cn.js +12 -0
- package/lib/utils/cn.js.map +1 -0
- package/lib/utils/debounce.d.ts +13 -0
- package/lib/utils/debounce.d.ts.map +1 -0
- package/lib/utils/debounce.js +28 -0
- package/lib/utils/debounce.js.map +1 -0
- package/lib/utils/error.d.ts +9 -0
- package/lib/utils/error.d.ts.map +1 -0
- package/lib/utils/error.js +11 -0
- package/lib/utils/error.js.map +1 -0
- package/lib/utils/fetch.d.ts +17 -0
- package/lib/utils/fetch.d.ts.map +1 -0
- package/lib/utils/fetch.js +29 -0
- package/lib/utils/fetch.js.map +1 -0
- package/lib/utils/http-error.d.ts +41 -0
- package/lib/utils/http-error.d.ts.map +1 -0
- package/lib/utils/http-error.js +63 -0
- package/lib/utils/http-error.js.map +1 -0
- package/lib/utils/index.d.ts +11 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +11 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/palette.d.ts +46 -0
- package/lib/utils/palette.d.ts.map +1 -0
- package/lib/utils/palette.js +75 -0
- package/lib/utils/palette.js.map +1 -0
- package/lib/utils/password.d.ts +20 -0
- package/lib/utils/password.d.ts.map +1 -0
- package/lib/utils/password.js +51 -0
- package/lib/utils/password.js.map +1 -0
- package/lib/utils/settings-storage.d.ts +3 -0
- package/lib/utils/settings-storage.d.ts.map +1 -0
- package/lib/utils/settings-storage.js +62 -0
- package/lib/utils/settings-storage.js.map +1 -0
- package/lib/utils/validation.d.ts +29 -0
- package/lib/utils/validation.d.ts.map +1 -0
- package/lib/utils/validation.js +58 -0
- package/lib/utils/validation.js.map +1 -0
- package/package.json +204 -0
- package/src/components/__tests__/data-table.test.ts +94 -0
- package/src/components/__tests__/pagination.test.ts +73 -0
- package/src/components/__tests__/stat-card.test.ts +21 -0
- package/src/components/auth/LockOverlay.tsx +122 -0
- package/src/components/auth/PasswordStrengthMeter.tsx +96 -0
- package/src/components/auth/ProtectedRoute.tsx +91 -0
- package/src/components/auth/PwnedPasswordWarning.tsx +54 -0
- package/src/components/auth/index.ts +10 -0
- package/src/components/bottom-nav.tsx +99 -0
- package/src/components/button.tsx +144 -0
- package/src/components/card.tsx +82 -0
- package/src/components/checkbox.tsx +48 -0
- package/src/components/connection-settings.tsx +583 -0
- package/src/components/context-menu.tsx +95 -0
- package/src/components/data-table.tsx +223 -0
- package/src/components/dialog.tsx +376 -0
- package/src/components/dropdown-menu.tsx +120 -0
- package/src/components/entropy-boot-splash.tsx +114 -0
- package/src/components/entropy-mark-animated.tsx +260 -0
- package/src/components/entropy-mark-geometry.ts +11 -0
- package/src/components/entropy-mark-sequential.tsx +132 -0
- package/src/components/entropy-mark.tsx +135 -0
- package/src/components/error-boundary.tsx +70 -0
- package/src/components/index.ts +156 -0
- package/src/components/input.tsx +246 -0
- package/src/components/item-icon.tsx +111 -0
- package/src/components/label.tsx +25 -0
- package/src/components/legal-dialog.tsx +47 -0
- package/src/components/license-gate.tsx +28 -0
- package/src/components/logo.tsx +34 -0
- package/src/components/onboarding-wizard.tsx +353 -0
- package/src/components/pagination.tsx +154 -0
- package/src/components/password-generator.tsx +393 -0
- package/src/components/pin-pad.tsx +156 -0
- package/src/components/popover.tsx +38 -0
- package/src/components/profile/ProfileDialog.tsx +129 -0
- package/src/components/profile/ProfileTab.tsx +151 -0
- package/src/components/profile/SecurityTab.tsx +229 -0
- package/src/components/profile/index.ts +3 -0
- package/src/components/segmented-toggle.tsx +119 -0
- package/src/components/separator.tsx +41 -0
- package/src/components/server-settings.tsx +442 -0
- package/src/components/settings/AccountSection.tsx +76 -0
- package/src/components/settings/DangerZoneSection.tsx +37 -0
- package/src/components/settings/GeneralSection.tsx +39 -0
- package/src/components/settings/SupportSection.tsx +53 -0
- package/src/components/settings/index.ts +4 -0
- package/src/components/settings-row.tsx +126 -0
- package/src/components/skeleton.tsx +48 -0
- package/src/components/social-connections.tsx +55 -0
- package/src/components/stat-card.tsx +64 -0
- package/src/components/tag-chip.tsx +78 -0
- package/src/components/tag-multi-select.tsx +136 -0
- package/src/components/text.tsx +77 -0
- package/src/components/toast/ToastPortal.tsx +16 -0
- package/src/components/toast/ToastPortal.web.tsx +47 -0
- package/src/components/toast/index.ts +2 -0
- package/src/components/toast/toast-config.tsx +31 -0
- package/src/components/tooltip.tsx +30 -0
- package/src/components/totp-display.tsx +207 -0
- package/src/components/user-avatar.tsx +46 -0
- package/src/context/AppConfigContext.tsx +76 -0
- package/src/context/NavigationContext.tsx +75 -0
- package/src/context/NotificationContext.tsx +69 -0
- package/src/context/ThemeContext.tsx +83 -0
- package/src/context/__tests__/NavigationContext.test.tsx +53 -0
- package/src/context/index.ts +24 -0
- package/src/flags.ts +44 -0
- package/src/forms/form-error.tsx +20 -0
- package/src/forms/index.ts +2 -0
- package/src/forms/shake-field.tsx +52 -0
- package/src/hooks/__tests__/useUploadBlobUrl.test.tsx +77 -0
- package/src/hooks/index.ts +18 -0
- package/src/hooks/useAuth.tsx +567 -0
- package/src/hooks/useAutoLock.ts +110 -0
- package/src/hooks/useDebouncedValue.ts +32 -0
- package/src/hooks/useShakeAnimation.ts +42 -0
- package/src/hooks/useUploadBlobUrl.ts +75 -0
- package/src/index.ts +48 -0
- package/src/screens/auth/AccountPickerScreen.tsx +103 -0
- package/src/screens/auth/AuthScreen.tsx +941 -0
- package/src/screens/auth/ConsentScreen.tsx +118 -0
- package/src/screens/auth/ErrorScreen.tsx +96 -0
- package/src/screens/auth/ExpiredLinkScreen.tsx +87 -0
- package/src/screens/auth/ForgotPasswordScreen.tsx +182 -0
- package/src/screens/auth/ImportDataScreen.tsx +112 -0
- package/src/screens/auth/LoginScreen.tsx +484 -0
- package/src/screens/auth/MfaChallengeScreen.tsx +216 -0
- package/src/screens/auth/MfaEnrollScreen.tsx +388 -0
- package/src/screens/auth/PasskeyEnrollScreen.tsx +96 -0
- package/src/screens/auth/PrivacyPolicyScreen.tsx +249 -0
- package/src/screens/auth/RegisterScreen.tsx +430 -0
- package/src/screens/auth/ResetPasswordScreen.tsx +377 -0
- package/src/screens/auth/ServerConfigScreen.tsx +388 -0
- package/src/screens/auth/TermsOfServiceScreen.tsx +236 -0
- package/src/screens/auth/VerifyEmailScreen.tsx +310 -0
- package/src/screens/auth/WelcomeScreen.tsx +78 -0
- package/src/screens/auth/index.ts +36 -0
- package/src/screens/index.ts +1 -0
- package/src/services/__tests__/api-config.test.ts +67 -0
- package/src/services/__tests__/favicon.test.ts +88 -0
- package/src/services/__tests__/hibp-cache.test.ts +37 -0
- package/src/services/__tests__/hibp.test.ts +39 -0
- package/src/services/api-config.ts +260 -0
- package/src/services/auth.service.ts +498 -0
- package/src/services/favicon.ts +102 -0
- package/src/services/hibp-cache.ts +71 -0
- package/src/services/hibp.ts +120 -0
- package/src/services/index.ts +52 -0
- package/src/services/passkey.ts +213 -0
- package/src/types/external.d.ts +24 -0
- package/src/utils/__tests__/clipboard.test.ts +59 -0
- package/src/utils/__tests__/cn.test.ts +24 -0
- package/src/utils/__tests__/debounce.test.ts +42 -0
- package/src/utils/__tests__/error.test.ts +18 -0
- package/src/utils/__tests__/http-error.test.ts +33 -0
- package/src/utils/__tests__/palette.test.ts +22 -0
- package/src/utils/__tests__/password.test.ts +55 -0
- package/src/utils/__tests__/settings-storage.test.ts +15 -0
- package/src/utils/__tests__/validation.test.ts +52 -0
- package/src/utils/api-fetch.ts +61 -0
- package/src/utils/clipboard.ts +69 -0
- package/src/utils/cn.ts +12 -0
- package/src/utils/debounce.ts +33 -0
- package/src/utils/error.ts +10 -0
- package/src/utils/fetch.ts +33 -0
- package/src/utils/http-error.ts +81 -0
- package/src/utils/index.ts +23 -0
- package/src/utils/palette.ts +105 -0
- package/src/utils/password.ts +64 -0
- package/src/utils/settings-storage.ts +68 -0
- package/src/utils/validation.ts +71 -0
- package/styles/globals.css +262 -0
- package/tailwind-preset.js +163 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggable navigation surface used by entropy-ui's auth screens.
|
|
3
|
+
*
|
|
4
|
+
* The shared screens used to call `useRouter()` from `expo-router`
|
|
5
|
+
* directly, which made them un-usable in non-Expo bundles (the browser-
|
|
6
|
+
* extension popup, future Electron / web targets without the Expo
|
|
7
|
+
* router runtime). Routing through this context lets every consumer
|
|
8
|
+
* supply its own router implementation — expo-router on mobile / web,
|
|
9
|
+
* a stack-reducer adapter inside the extension popup, etc.
|
|
10
|
+
*
|
|
11
|
+
* When no consumer is wrapped in `<NavigationProvider>`, `useNavigation`
|
|
12
|
+
* falls back to `expo-router`'s `useRouter()`, so the existing mobile
|
|
13
|
+
* client keeps working unchanged.
|
|
14
|
+
*/
|
|
15
|
+
import React, { createContext, useContext, useMemo } from "react";
|
|
16
|
+
import { useRouter } from "expo-router";
|
|
17
|
+
const NavigationContext = createContext(null);
|
|
18
|
+
/**
|
|
19
|
+
* Override the default expo-router-backed navigation for everything
|
|
20
|
+
* rendered below this provider. Apps without expo-router supply this
|
|
21
|
+
* with their own stack-reducer adapter; everyone else can ignore it.
|
|
22
|
+
*/
|
|
23
|
+
export function NavigationProvider({ router, children }) {
|
|
24
|
+
const value = useMemo(() => router, [router]);
|
|
25
|
+
return <NavigationContext.Provider value={value}>{children}</NavigationContext.Provider>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Hook used by entropy-ui screens to navigate. Returns the override
|
|
29
|
+
* router supplied by `NavigationProvider` when present; otherwise
|
|
30
|
+
* delegates to `expo-router`'s `useRouter()`.
|
|
31
|
+
*/
|
|
32
|
+
export function useNavigation() {
|
|
33
|
+
const override = useContext(NavigationContext);
|
|
34
|
+
const expoRouter = useRouter();
|
|
35
|
+
// Memoize the expo-router adapter so consumers using the returned
|
|
36
|
+
// value as a `useEffect`/`useCallback` dep don't see a fresh
|
|
37
|
+
// reference every render. `useRouter()` itself returns a stable
|
|
38
|
+
// object across renders, so an empty-dep memo would also work, but
|
|
39
|
+
// depending on `expoRouter` is defensive against future changes.
|
|
40
|
+
const expoAdapter = useMemo(() => ({
|
|
41
|
+
push(target) {
|
|
42
|
+
expoRouter.push(target);
|
|
43
|
+
},
|
|
44
|
+
replace(target) {
|
|
45
|
+
expoRouter.replace(target);
|
|
46
|
+
},
|
|
47
|
+
back() {
|
|
48
|
+
expoRouter.back();
|
|
49
|
+
},
|
|
50
|
+
}), [expoRouter]);
|
|
51
|
+
return override ?? expoAdapter;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=NavigationContext.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationContext.jsx","sourceRoot":"","sources":["../../src/context/NavigationContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AAanD,MAAM,iBAAiB,GAAG,aAAa,CAAmB,IAAI,CAAC,CAAC;AAOhE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAA2B;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC3F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,SAAS,EAAE,CAAC;IAC/B,kEAAkE;IAClE,6DAA6D;IAC7D,gEAAgE;IAChE,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC;QACL,IAAI,CAAC,MAAM;YACT,UAAU,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,MAAM;YACZ,UAAU,CAAC,OAAO,CAAC,MAAc,CAAC,CAAC;QACrC,CAAC;QACD,IAAI;YACF,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;KACF,CAAC,EACF,CAAC,UAAU,CAAC,CACb,CAAC;IACF,OAAO,QAAQ,IAAI,WAAW,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification context — provides a `push()` helper that surfaces
|
|
3
|
+
* toast-style notifications via `react-native-toast-message`.
|
|
4
|
+
*
|
|
5
|
+
* Mount `<NotificationProvider>` somewhere above the components that
|
|
6
|
+
* consume `useNotificationContext()`. The `<Toast />` component itself
|
|
7
|
+
* must be rendered separately in the app root (see
|
|
8
|
+
* `react-native-toast-message` docs).
|
|
9
|
+
*
|
|
10
|
+
* The vault notification provider also bridged a WebSocket service into
|
|
11
|
+
* this context to dispatch server-pushed toasts; that piece is
|
|
12
|
+
* app-specific and not included here. Consumers that need it can build
|
|
13
|
+
* a thin wrapper around this provider.
|
|
14
|
+
*/
|
|
15
|
+
import React from "react";
|
|
16
|
+
export type NotificationLevel = "success" | "error" | "warning" | "info";
|
|
17
|
+
export interface ToastOptions {
|
|
18
|
+
level: NotificationLevel;
|
|
19
|
+
title: string;
|
|
20
|
+
message?: string;
|
|
21
|
+
/** Milliseconds before auto-dismiss. Defaults to 4000. */
|
|
22
|
+
ttl_ms?: number;
|
|
23
|
+
}
|
|
24
|
+
interface NotificationContextValue {
|
|
25
|
+
push: (options: ToastOptions) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare function NotificationProvider({ children }: {
|
|
28
|
+
children: React.ReactNode;
|
|
29
|
+
}): React.JSX.Element;
|
|
30
|
+
export declare function useNotificationContext(): NotificationContextValue;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=NotificationContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationContext.d.ts","sourceRoot":"","sources":["../../src/context/NotificationContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAA0D,MAAM,OAAO,CAAC;AAG/E,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,wBAAwB;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CACvC;AAaD,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAiB/E;AAED,wBAAgB,sBAAsB,IAAI,wBAAwB,CAMjE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notification context — provides a `push()` helper that surfaces
|
|
3
|
+
* toast-style notifications via `react-native-toast-message`.
|
|
4
|
+
*
|
|
5
|
+
* Mount `<NotificationProvider>` somewhere above the components that
|
|
6
|
+
* consume `useNotificationContext()`. The `<Toast />` component itself
|
|
7
|
+
* must be rendered separately in the app root (see
|
|
8
|
+
* `react-native-toast-message` docs).
|
|
9
|
+
*
|
|
10
|
+
* The vault notification provider also bridged a WebSocket service into
|
|
11
|
+
* this context to dispatch server-pushed toasts; that piece is
|
|
12
|
+
* app-specific and not included here. Consumers that need it can build
|
|
13
|
+
* a thin wrapper around this provider.
|
|
14
|
+
*/
|
|
15
|
+
import React, { createContext, useCallback, useContext, useMemo } from "react";
|
|
16
|
+
import Toast from "react-native-toast-message";
|
|
17
|
+
const NotificationContext = createContext(null);
|
|
18
|
+
const LEVEL_TO_TOAST_TYPE = {
|
|
19
|
+
success: "success",
|
|
20
|
+
error: "error",
|
|
21
|
+
// react-native-toast-message only ships success/error/info — warnings
|
|
22
|
+
// map onto error so they show with the warning-coloured icon.
|
|
23
|
+
warning: "error",
|
|
24
|
+
info: "info",
|
|
25
|
+
};
|
|
26
|
+
export function NotificationProvider({ children }) {
|
|
27
|
+
const push = useCallback((options) => {
|
|
28
|
+
Toast.show({
|
|
29
|
+
type: LEVEL_TO_TOAST_TYPE[options.level],
|
|
30
|
+
text1: options.title,
|
|
31
|
+
text2: options.message,
|
|
32
|
+
visibilityTime: options.ttl_ms ?? 4000,
|
|
33
|
+
});
|
|
34
|
+
}, []);
|
|
35
|
+
// Memoize the context value so an inline-object identity churn
|
|
36
|
+
// doesn't re-render every consumer on each NotificationProvider
|
|
37
|
+
// render. `push` is already `useCallback`-stable, so the memo
|
|
38
|
+
// effectively pins the value across the provider's lifetime.
|
|
39
|
+
const value = useMemo(() => ({ push }), [push]);
|
|
40
|
+
return <NotificationContext.Provider value={value}>{children}</NotificationContext.Provider>;
|
|
41
|
+
}
|
|
42
|
+
export function useNotificationContext() {
|
|
43
|
+
const ctx = useContext(NotificationContext);
|
|
44
|
+
if (!ctx) {
|
|
45
|
+
throw new Error("useNotificationContext must be used inside <NotificationProvider>");
|
|
46
|
+
}
|
|
47
|
+
return ctx;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=NotificationContext.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotificationContext.jsx","sourceRoot":"","sources":["../../src/context/NotificationContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,KAAK,MAAM,4BAA4B,CAAC;AAgB/C,MAAM,mBAAmB,GAAG,aAAa,CAAkC,IAAI,CAAC,CAAC;AAEjF,MAAM,mBAAmB,GAA4D;IACnF,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,sEAAsE;IACtE,8DAA8D;IAC9D,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,EAAE,QAAQ,EAAiC;IAC9E,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,OAAqB,EAAE,EAAE;QACjD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,cAAc,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;SACvC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,+DAA+D;IAC/D,gEAAgE;IAChE,8DAA8D;IAC9D,6DAA6D;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export type ThemePreference = "light" | "dark" | "system";
|
|
3
|
+
interface ThemeContextValue {
|
|
4
|
+
preference: ThemePreference;
|
|
5
|
+
setPreference: (pref: ThemePreference) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function ThemeProvider({ children }: {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}): React.JSX.Element;
|
|
10
|
+
export declare function useTheme(): ThemeContextValue;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=ThemeContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeContext.d.ts","sourceRoot":"","sources":["../../src/context/ThemeContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+E,MAAM,OAAO,CAAC;AAKpG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAiB1D,UAAU,iBAAiB;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,aAAa,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAChD;AAOD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBA8CxE;AAED,wBAAgB,QAAQ,sBAEvB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React, { createContext, useContext, useEffect, useState, useMemo, useCallback } from "react";
|
|
2
|
+
import { colorScheme } from "nativewind";
|
|
3
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
4
|
+
import { getStoragePrefix } from "../services/api-config";
|
|
5
|
+
function themeKey() {
|
|
6
|
+
return `@${getStoragePrefix()}/theme-preference`;
|
|
7
|
+
}
|
|
8
|
+
function applyTheme(isDark) {
|
|
9
|
+
colorScheme.set(isDark ? "dark" : "light");
|
|
10
|
+
if (typeof document !== "undefined") {
|
|
11
|
+
if (isDark) {
|
|
12
|
+
document.documentElement.classList.add("dark");
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
document.documentElement.classList.remove("dark");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const ThemeContext = createContext({
|
|
20
|
+
preference: "system",
|
|
21
|
+
setPreference: () => { },
|
|
22
|
+
});
|
|
23
|
+
export function ThemeProvider({ children }) {
|
|
24
|
+
const [preference, setPreferenceState] = useState("system");
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
AsyncStorage.getItem(themeKey())
|
|
27
|
+
.then((stored) => {
|
|
28
|
+
if (stored === "light" || stored === "dark" || stored === "system") {
|
|
29
|
+
setPreferenceState(stored);
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
.catch(() => { });
|
|
33
|
+
}, []);
|
|
34
|
+
const setPreference = useCallback((pref) => {
|
|
35
|
+
AsyncStorage.setItem(themeKey(), pref).catch(() => { });
|
|
36
|
+
setPreferenceState(pref);
|
|
37
|
+
}, []);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (preference !== "system") {
|
|
40
|
+
applyTheme(preference === "dark");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (typeof window !== "undefined" && typeof window.matchMedia === "function") {
|
|
44
|
+
// Web system mode: react-native-css-interop's internal Appearance
|
|
45
|
+
// listener uses the removed `MediaQueryList.addListener` API
|
|
46
|
+
// (Chrome 121+) so it never fires. Drive it ourselves via
|
|
47
|
+
// `addEventListener` instead.
|
|
48
|
+
const mq = window.matchMedia("(prefers-color-scheme: dark)");
|
|
49
|
+
applyTheme(mq.matches);
|
|
50
|
+
const handler = (e) => applyTheme(e.matches);
|
|
51
|
+
mq.addEventListener("change", handler);
|
|
52
|
+
return () => mq.removeEventListener("change", handler);
|
|
53
|
+
}
|
|
54
|
+
// Native system mode: react-native-css-interop's Appearance listener
|
|
55
|
+
// already tracks OS changes. Calling colorScheme.set("system") would
|
|
56
|
+
// pass null to the Android native module which rejects non-nullable
|
|
57
|
+
// parameters and crashes — leave it alone.
|
|
58
|
+
return undefined;
|
|
59
|
+
}, [preference]);
|
|
60
|
+
const contextValue = useMemo(() => ({ preference, setPreference }), [preference, setPreference]);
|
|
61
|
+
return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;
|
|
62
|
+
}
|
|
63
|
+
export function useTheme() {
|
|
64
|
+
return useContext(ThemeContext);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ThemeContext.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeContext.jsx","sourceRoot":"","sources":["../../src/context/ThemeContext.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AppConfigProvider, useAppConfig, type AppConfig, type AppRoutes, type LogoComponent, } from "./AppConfigContext";
|
|
2
|
+
export { ThemeProvider, useTheme, type ThemePreference } from "./ThemeContext";
|
|
3
|
+
export { NavigationProvider, useNavigation, type AppRouter, type NavigationProviderProps, type RouteTarget, } from "./NavigationContext";
|
|
4
|
+
export { NotificationProvider, useNotificationContext, type NotificationLevel, type ToastOptions, } from "./NotificationContext";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,SAAS,EACd,KAAK,uBAAuB,EAC5B,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AppConfigProvider, useAppConfig, } from "./AppConfigContext";
|
|
2
|
+
export { ThemeProvider, useTheme } from "./ThemeContext";
|
|
3
|
+
export { NavigationProvider, useNavigation, } from "./NavigationContext";
|
|
4
|
+
export { NotificationProvider, useNotificationContext, } from "./NotificationContext";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,GAIb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAwB,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EACL,kBAAkB,EAClB,aAAa,GAId,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,uBAAuB,CAAC"}
|
package/lib/flags.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const DISABLE_BRANDING: boolean;
|
|
2
|
+
export declare const ENABLE_LICENSING: boolean;
|
|
3
|
+
/** True when Entropy company branding should render (the common case). */
|
|
4
|
+
export declare function brandingEnabled(): boolean;
|
|
5
|
+
/** Licensing flag + (future) status. Hook form for ergonomic consumption. */
|
|
6
|
+
export declare function useLicensing(): {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB,SAAsD,CAAC;AAIpF,eAAO,MAAM,gBAAgB,SAA4C,CAAC;AAU1E,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,IAAI;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAEnD"}
|
package/lib/flags.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Build-time feature flags shared across Entropy Softworks apps.
|
|
2
|
+
//
|
|
3
|
+
// Expo inlines `EXPO_PUBLIC_*` env vars at bundle time, so these resolve to
|
|
4
|
+
// constants in each app's build. Both default OFF-state when unset:
|
|
5
|
+
//
|
|
6
|
+
// EXPO_PUBLIC_DISABLE_BRANDING default false → Entropy branding shown.
|
|
7
|
+
// Self-hosters may set "true" to strip Entropy logo / boot splash /
|
|
8
|
+
// "An Entropy Softworks product" byline + entropy-related legal content.
|
|
9
|
+
// It does NOT touch the product's own logo/branding. SaaS ships "false".
|
|
10
|
+
//
|
|
11
|
+
// EXPO_PUBLIC_ENABLE_LICENSING default false → no licensing gate active.
|
|
12
|
+
// SaaS production ships "true" and a separate app supplies the actual
|
|
13
|
+
// licensing/subscription integration. Self-hosters leave it off; the gate
|
|
14
|
+
// wiring is present everywhere either way.
|
|
15
|
+
//
|
|
16
|
+
// INVARIANT: licensing requires Entropy branding. Licensing is only ever used
|
|
17
|
+
// by Entropy's own SaaS deployments, which always carry the company branding
|
|
18
|
+
// and legal content — so ENABLE_LICENSING is coerced off (with a warning)
|
|
19
|
+
// whenever DISABLE_BRANDING is set. There is no valid unbranded+licensed
|
|
20
|
+
// configuration.
|
|
21
|
+
export const DISABLE_BRANDING = process.env.EXPO_PUBLIC_DISABLE_BRANDING === "true";
|
|
22
|
+
const RAW_ENABLE_LICENSING = process.env.EXPO_PUBLIC_ENABLE_LICENSING === "true";
|
|
23
|
+
export const ENABLE_LICENSING = RAW_ENABLE_LICENSING && !DISABLE_BRANDING;
|
|
24
|
+
if (RAW_ENABLE_LICENSING && DISABLE_BRANDING) {
|
|
25
|
+
console.warn("[entropy-ui] EXPO_PUBLIC_ENABLE_LICENSING ignored: licensing requires " +
|
|
26
|
+
"Entropy branding and legal content (EXPO_PUBLIC_DISABLE_BRANDING must " +
|
|
27
|
+
"be false). Licensing has been disabled for this build.");
|
|
28
|
+
}
|
|
29
|
+
/** True when Entropy company branding should render (the common case). */
|
|
30
|
+
export function brandingEnabled() {
|
|
31
|
+
return !DISABLE_BRANDING;
|
|
32
|
+
}
|
|
33
|
+
/** Licensing flag + (future) status. Hook form for ergonomic consumption. */
|
|
34
|
+
export function useLicensing() {
|
|
35
|
+
return { enabled: ENABLE_LICENSING };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=flags.js.map
|
package/lib/flags.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,4EAA4E;AAC5E,oEAAoE;AACpE,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,iBAAiB;AAEjB,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM,CAAC;AAEpF,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM,CAAC;AAEjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,IAAI,CAAC,gBAAgB,CAAC;AAE1E,IAAI,oBAAoB,IAAI,gBAAgB,EAAE,CAAC;IAC7C,OAAO,CAAC,IAAI,CACV,wEAAwE;QACtE,wEAAwE;QACxE,wDAAwD,CAC3D,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,gBAAgB,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface FormErrorProps {
|
|
3
|
+
message?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Fixed-height slot for a single form-level error message. Always
|
|
7
|
+
* rendered so the form layout does not shift when errors appear or
|
|
8
|
+
* clear.
|
|
9
|
+
*/
|
|
10
|
+
export default function FormError({ message }: FormErrorProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=form-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-error.d.ts","sourceRoot":"","sources":["../../src/forms/form-error.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,cAAc,qBAM5D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import { ErrorText } from "../components/text";
|
|
4
|
+
/**
|
|
5
|
+
* Fixed-height slot for a single form-level error message. Always
|
|
6
|
+
* rendered so the form layout does not shift when errors appear or
|
|
7
|
+
* clear.
|
|
8
|
+
*/
|
|
9
|
+
export default function FormError({ message }) {
|
|
10
|
+
return (<View style={{ minHeight: 20, justifyContent: "center" }}>
|
|
11
|
+
{message ? <ErrorText className="text-center">{message}</ErrorText> : null}
|
|
12
|
+
</View>);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=form-error.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-error.jsx","sourceRoot":"","sources":["../../src/forms/form-error.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAM/C;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,OAAO,EAAkB;IAC3D,OAAO,CACL,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CACvD;MAAA,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAC5E;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type useShakeAnimation } from "../hooks/useShakeAnimation";
|
|
3
|
+
type ShakeControl = ReturnType<typeof useShakeAnimation>;
|
|
4
|
+
interface ShakeFieldProps {
|
|
5
|
+
shake: ShakeControl;
|
|
6
|
+
label?: string;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
flashRadius?: number;
|
|
9
|
+
/** When `false`, only the red flash runs — no rotation. Defaults to `true`. */
|
|
10
|
+
rotate?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Wraps a form field so it can shake + flash red when validation fails.
|
|
14
|
+
* The label renders outside the shake wrapper so only the input rocks.
|
|
15
|
+
*/
|
|
16
|
+
export default function ShakeField({ shake, label, children, flashRadius, rotate, }: ShakeFieldProps): React.JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=shake-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake-field.d.ts","sourceRoot":"","sources":["../../src/forms/shake-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEzD,UAAU,eAAe;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAe,EACf,MAAa,GACd,EAAE,eAAe,qBAwBjB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { View } from "react-native";
|
|
3
|
+
import Animated from "react-native-reanimated";
|
|
4
|
+
import { Label } from "../components/text";
|
|
5
|
+
/**
|
|
6
|
+
* Wraps a form field so it can shake + flash red when validation fails.
|
|
7
|
+
* The label renders outside the shake wrapper so only the input rocks.
|
|
8
|
+
*/
|
|
9
|
+
export default function ShakeField({ shake, label, children, flashRadius = 8, rotate = true, }) {
|
|
10
|
+
return (<View>
|
|
11
|
+
{label ? <Label className="mb-2">{label}</Label> : null}
|
|
12
|
+
<Animated.View style={[rotate ? shake.animatedStyle : undefined, { position: "relative" }]}>
|
|
13
|
+
{children}
|
|
14
|
+
<Animated.View style={[
|
|
15
|
+
shake.flashStyle,
|
|
16
|
+
{
|
|
17
|
+
pointerEvents: "none",
|
|
18
|
+
position: "absolute",
|
|
19
|
+
left: 0,
|
|
20
|
+
right: 0,
|
|
21
|
+
top: 0,
|
|
22
|
+
bottom: 0,
|
|
23
|
+
borderRadius: flashRadius,
|
|
24
|
+
backgroundColor: "#EF4444",
|
|
25
|
+
},
|
|
26
|
+
]}/>
|
|
27
|
+
</Animated.View>
|
|
28
|
+
</View>);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=shake-field.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake-field.jsx","sourceRoot":"","sources":["../../src/forms/shake-field.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAc3C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,CAAC,EACf,MAAM,GAAG,IAAI,GACG;IAChB,OAAO,CACL,CAAC,IAAI,CACH;MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CACvD;MAAA,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CACzF;QAAA,CAAC,QAAQ,CACT;QAAA,CAAC,QAAQ,CAAC,IAAI,CACZ,KAAK,CAAC,CAAC;YACL,KAAK,CAAC,UAAU;YAChB;gBACE,aAAa,EAAE,MAAM;gBACrB,QAAQ,EAAE,UAAU;gBACpB,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,CAAC;gBACT,YAAY,EAAE,WAAW;gBACzB,eAAe,EAAE,SAAS;aAC3B;SACF,CAAC,EAEN;MAAA,EAAE,QAAQ,CAAC,IAAI,CACjB;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AuthProvider, useAuth, useRole, useRequireAuth, useSession, type AuthProviderProps, type AuthContextType, type PasskeyLoginResult, } from "./useAuth";
|
|
2
|
+
export { useShakeAnimation } from "./useShakeAnimation";
|
|
3
|
+
export { useDebouncedValue } from "./useDebouncedValue";
|
|
4
|
+
export { useAutoLock, type UseAutoLockOptions } from "./useAutoLock";
|
|
5
|
+
export { useUploadBlobUrl, type UploadBlobUrlResult } from "./useUploadBlobUrl";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AuthProvider, useAuth, useRole, useRequireAuth, useSession, } from "./useAuth";
|
|
2
|
+
export { useShakeAnimation } from "./useShakeAnimation";
|
|
3
|
+
export { useDebouncedValue } from "./useDebouncedValue";
|
|
4
|
+
export { useAutoLock } from "./useAutoLock";
|
|
5
|
+
export { useUploadBlobUrl } from "./useUploadBlobUrl";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,UAAU,GAIX,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAA4B,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type Href } from "expo-router";
|
|
3
|
+
import { type AuthResponse, type User } from "../services/auth.service";
|
|
4
|
+
/**
|
|
5
|
+
* Outcome of a passkey login attempt. Used by apps with a client-side
|
|
6
|
+
* unlock step (e.g. vault's symmetric-key derivation) so the login
|
|
7
|
+
* screen can route to either the home tab or a password-prompt dialog.
|
|
8
|
+
*
|
|
9
|
+
* `unlocked: true` — the authenticator honored PRF and the local
|
|
10
|
+
* unlock work is done. Route to `routes.home`.
|
|
11
|
+
* `unlocked: false` — server accepted the assertion and the session
|
|
12
|
+
* is established, but the consumer still needs
|
|
13
|
+
* the master password. The login screen renders
|
|
14
|
+
* its unlock dialog and calls `unlockWithPassword`.
|
|
15
|
+
*/
|
|
16
|
+
export interface PasskeyLoginResult {
|
|
17
|
+
unlocked: boolean;
|
|
18
|
+
user: User;
|
|
19
|
+
}
|
|
20
|
+
interface AuthContextType {
|
|
21
|
+
user: User | null;
|
|
22
|
+
isLoading: boolean;
|
|
23
|
+
isAuthenticated: boolean;
|
|
24
|
+
login: (email: string, password: string) => Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Drive a passkey ceremony end-to-end. Available when the consumer
|
|
27
|
+
* provided `loginWithPasskey` to `AuthProvider`; throws otherwise.
|
|
28
|
+
* `signal` aborts an in-flight WebAuthn ceremony on web — wire it
|
|
29
|
+
* to a `useEffect` cleanup so unmounting the screen tears the OS
|
|
30
|
+
* prompt down instead of leaving an orphaned resolution.
|
|
31
|
+
*/
|
|
32
|
+
loginWithPasskey: (email?: string, signal?: AbortSignal) => Promise<PasskeyLoginResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Complete a non-PRF passkey unlock by deriving the local key from
|
|
35
|
+
* the master password. Available when the consumer provided
|
|
36
|
+
* `unlockWithPassword` to `AuthProvider`.
|
|
37
|
+
*/
|
|
38
|
+
unlockWithPassword: (password: string) => Promise<void>;
|
|
39
|
+
register: (email: string, username: string | undefined, password: string, displayName?: string) => Promise<void>;
|
|
40
|
+
logout: () => Promise<void>;
|
|
41
|
+
refreshUser: () => Promise<void>;
|
|
42
|
+
deleteAccount: (password: string) => Promise<void>;
|
|
43
|
+
checkAuth: () => Promise<void>;
|
|
44
|
+
error: string | null;
|
|
45
|
+
clearError: () => void;
|
|
46
|
+
}
|
|
47
|
+
export interface AuthProviderProps {
|
|
48
|
+
children: React.ReactNode;
|
|
49
|
+
/**
|
|
50
|
+
* Optional hook called after a successful login. Vault wires its
|
|
51
|
+
* `KeyManager.unlock(password)` here; bootstrap leaves it unset.
|
|
52
|
+
* Throwing rolls the login back via `AuthService.logout()` and bubbles
|
|
53
|
+
* the error to the caller.
|
|
54
|
+
*/
|
|
55
|
+
onAfterLogin?: (password: string, response: AuthResponse) => Promise<void> | void;
|
|
56
|
+
/** Optional post-register hook (mirror of `onAfterLogin`). */
|
|
57
|
+
onAfterRegister?: (password: string, response: AuthResponse) => Promise<void> | void;
|
|
58
|
+
/**
|
|
59
|
+
* Optional pre-logout hook. Vault wires `KeyManager.lock()` and
|
|
60
|
+
* websocket teardown here; failures are swallowed to keep logout
|
|
61
|
+
* idempotent.
|
|
62
|
+
*/
|
|
63
|
+
onBeforeLogout?: () => Promise<void> | void;
|
|
64
|
+
/**
|
|
65
|
+
* Optional pre-checkAuth hook. Vault uses this to fetch the server's
|
|
66
|
+
* HIBP policy alongside the initial session probe.
|
|
67
|
+
*/
|
|
68
|
+
onBeforeCheckAuth?: () => Promise<void> | void;
|
|
69
|
+
/**
|
|
70
|
+
* Optional passkey-ceremony driver. When provided, `useAuth()` exposes
|
|
71
|
+
* `loginWithPasskey`; the consumer owns the WebAuthn round-trip and the
|
|
72
|
+
* post-assertion vault unlock. Returning `{ unlocked: true }` finishes
|
|
73
|
+
* the flow; returning `{ unlocked: false }` keeps the session but tells
|
|
74
|
+
* the screen to collect the master password and call `unlockWithPassword`.
|
|
75
|
+
*/
|
|
76
|
+
loginWithPasskey?: (email?: string, signal?: AbortSignal) => Promise<PasskeyLoginResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Optional master-password unlock. Used by the passkey flow when the
|
|
79
|
+
* authenticator did not honor PRF.
|
|
80
|
+
*/
|
|
81
|
+
unlockWithPassword?: (password: string) => Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Optional telemetry hook. Invoked with every error AuthProvider
|
|
84
|
+
* would otherwise swallow into a `__DEV__`-gated `console.warn` —
|
|
85
|
+
* post-login hook throw, post-register hook throw, refreshUser
|
|
86
|
+
* failure, logout API failure, etc. Wire this to Sentry / Rollbar /
|
|
87
|
+
* your structured-log shipper to get production visibility into
|
|
88
|
+
* paths the UI hides from the user.
|
|
89
|
+
*
|
|
90
|
+
* The `context` string identifies the call site (`"login-hook"`,
|
|
91
|
+
* `"register-hook"`, `"refresh-user"`, `"logout"`, …) so the
|
|
92
|
+
* consumer can route or filter without parsing the error message.
|
|
93
|
+
*/
|
|
94
|
+
onError?: (error: unknown, context: string) => void;
|
|
95
|
+
}
|
|
96
|
+
export declare function AuthProvider({ children, onAfterLogin, onAfterRegister, onBeforeLogout, onBeforeCheckAuth, loginWithPasskey: providedLoginWithPasskey, unlockWithPassword: providedUnlockWithPassword, onError, }: AuthProviderProps): React.JSX.Element;
|
|
97
|
+
export declare function useAuth(): AuthContextType;
|
|
98
|
+
export type { AuthContextType };
|
|
99
|
+
export declare function useRole(requiredRole: "Admin" | "User"): boolean;
|
|
100
|
+
export declare function useRequireAuth(redirectTo?: Href): {
|
|
101
|
+
isAuthenticated: boolean;
|
|
102
|
+
isLoading: boolean;
|
|
103
|
+
};
|
|
104
|
+
export declare function useSession(): {
|
|
105
|
+
user: User | null;
|
|
106
|
+
};
|
|
107
|
+
export { validateEmail, validatePassword, validateUsername } from "../utils/validation";
|
|
108
|
+
export default useAuth;
|
|
109
|
+
//# sourceMappingURL=useAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAoB,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;;OAMG;IACH,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACxF;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,QAAQ,EAAE,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAID,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClF,8DAA8D;IAC9D,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrF;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzF;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAAE,wBAAwB,EAC1C,kBAAkB,EAAE,0BAA0B,EAC9C,OAAO,GACR,EAAE,iBAAiB,qBAqWnB;AAED,wBAAgB,OAAO,IAAI,eAAe,CAMzC;AAED,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,wBAAgB,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAS/D;AAED,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI;;;EAa/C;AAED,wBAAgB,UAAU;;EAuCzB;AAKD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAExF,eAAe,OAAO,CAAC"}
|