@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.
Files changed (590) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/LICENSE +21 -0
  3. package/README.md +115 -0
  4. package/lib/components/auth/LockOverlay.d.ts +22 -0
  5. package/lib/components/auth/LockOverlay.d.ts.map +1 -0
  6. package/lib/components/auth/LockOverlay.jsx +82 -0
  7. package/lib/components/auth/LockOverlay.jsx.map +1 -0
  8. package/lib/components/auth/PasswordStrengthMeter.d.ts +12 -0
  9. package/lib/components/auth/PasswordStrengthMeter.d.ts.map +1 -0
  10. package/lib/components/auth/PasswordStrengthMeter.jsx +81 -0
  11. package/lib/components/auth/PasswordStrengthMeter.jsx.map +1 -0
  12. package/lib/components/auth/ProtectedRoute.d.ts +24 -0
  13. package/lib/components/auth/ProtectedRoute.d.ts.map +1 -0
  14. package/lib/components/auth/ProtectedRoute.jsx +56 -0
  15. package/lib/components/auth/ProtectedRoute.jsx.map +1 -0
  16. package/lib/components/auth/PwnedPasswordWarning.d.ts +13 -0
  17. package/lib/components/auth/PwnedPasswordWarning.d.ts.map +1 -0
  18. package/lib/components/auth/PwnedPasswordWarning.jsx +29 -0
  19. package/lib/components/auth/PwnedPasswordWarning.jsx.map +1 -0
  20. package/lib/components/auth/index.d.ts +5 -0
  21. package/lib/components/auth/index.d.ts.map +1 -0
  22. package/lib/components/auth/index.js +5 -0
  23. package/lib/components/auth/index.js.map +1 -0
  24. package/lib/components/bottom-nav.d.ts +25 -0
  25. package/lib/components/bottom-nav.d.ts.map +1 -0
  26. package/lib/components/bottom-nav.jsx +51 -0
  27. package/lib/components/bottom-nav.jsx.map +1 -0
  28. package/lib/components/button.d.ts +16 -0
  29. package/lib/components/button.d.ts.map +1 -0
  30. package/lib/components/button.jsx +73 -0
  31. package/lib/components/button.jsx.map +1 -0
  32. package/lib/components/card.d.ts +22 -0
  33. package/lib/components/card.d.ts.map +1 -0
  34. package/lib/components/card.jsx +36 -0
  35. package/lib/components/card.jsx.map +1 -0
  36. package/lib/components/checkbox.d.ts +12 -0
  37. package/lib/components/checkbox.d.ts.map +1 -0
  38. package/lib/components/checkbox.jsx +16 -0
  39. package/lib/components/checkbox.jsx.map +1 -0
  40. package/lib/components/connection-settings.d.ts +41 -0
  41. package/lib/components/connection-settings.d.ts.map +1 -0
  42. package/lib/components/connection-settings.jsx +354 -0
  43. package/lib/components/connection-settings.jsx.map +1 -0
  44. package/lib/components/context-menu.d.ts +52 -0
  45. package/lib/components/context-menu.d.ts.map +1 -0
  46. package/lib/components/context-menu.jsx +24 -0
  47. package/lib/components/context-menu.jsx.map +1 -0
  48. package/lib/components/data-table.d.ts +59 -0
  49. package/lib/components/data-table.d.ts.map +1 -0
  50. package/lib/components/data-table.jsx +101 -0
  51. package/lib/components/data-table.jsx.map +1 -0
  52. package/lib/components/dialog.d.ts +58 -0
  53. package/lib/components/dialog.d.ts.map +1 -0
  54. package/lib/components/dialog.jsx +197 -0
  55. package/lib/components/dialog.jsx.map +1 -0
  56. package/lib/components/dropdown-menu.d.ts +55 -0
  57. package/lib/components/dropdown-menu.d.ts.map +1 -0
  58. package/lib/components/dropdown-menu.jsx +38 -0
  59. package/lib/components/dropdown-menu.jsx.map +1 -0
  60. package/lib/components/entropy-boot-splash.d.ts +24 -0
  61. package/lib/components/entropy-boot-splash.d.ts.map +1 -0
  62. package/lib/components/entropy-boot-splash.jsx +83 -0
  63. package/lib/components/entropy-boot-splash.jsx.map +1 -0
  64. package/lib/components/entropy-mark-animated.d.ts +20 -0
  65. package/lib/components/entropy-mark-animated.d.ts.map +1 -0
  66. package/lib/components/entropy-mark-animated.jsx +148 -0
  67. package/lib/components/entropy-mark-animated.jsx.map +1 -0
  68. package/lib/components/entropy-mark-geometry.d.ts +8 -0
  69. package/lib/components/entropy-mark-geometry.d.ts.map +1 -0
  70. package/lib/components/entropy-mark-geometry.js +10 -0
  71. package/lib/components/entropy-mark-geometry.js.map +1 -0
  72. package/lib/components/entropy-mark-sequential.d.ts +12 -0
  73. package/lib/components/entropy-mark-sequential.d.ts.map +1 -0
  74. package/lib/components/entropy-mark-sequential.jsx +53 -0
  75. package/lib/components/entropy-mark-sequential.jsx.map +1 -0
  76. package/lib/components/entropy-mark.d.ts +29 -0
  77. package/lib/components/entropy-mark.d.ts.map +1 -0
  78. package/lib/components/entropy-mark.jsx +66 -0
  79. package/lib/components/entropy-mark.jsx.map +1 -0
  80. package/lib/components/error-boundary.d.ts +31 -0
  81. package/lib/components/error-boundary.d.ts.map +1 -0
  82. package/lib/components/error-boundary.jsx +40 -0
  83. package/lib/components/error-boundary.jsx.map +1 -0
  84. package/lib/components/index.d.ts +41 -0
  85. package/lib/components/index.d.ts.map +1 -0
  86. package/lib/components/index.js +43 -0
  87. package/lib/components/index.js.map +1 -0
  88. package/lib/components/input.d.ts +26 -0
  89. package/lib/components/input.d.ts.map +1 -0
  90. package/lib/components/input.jsx +95 -0
  91. package/lib/components/input.jsx.map +1 -0
  92. package/lib/components/item-icon.d.ts +32 -0
  93. package/lib/components/item-icon.d.ts.map +1 -0
  94. package/lib/components/item-icon.jsx +54 -0
  95. package/lib/components/item-icon.jsx.map +1 -0
  96. package/lib/components/label.d.ts +13 -0
  97. package/lib/components/label.d.ts.map +1 -0
  98. package/lib/components/label.jsx +9 -0
  99. package/lib/components/label.jsx.map +1 -0
  100. package/lib/components/legal-dialog.d.ts +18 -0
  101. package/lib/components/legal-dialog.d.ts.map +1 -0
  102. package/lib/components/legal-dialog.jsx +31 -0
  103. package/lib/components/legal-dialog.jsx.map +1 -0
  104. package/lib/components/license-gate.d.ts +17 -0
  105. package/lib/components/license-gate.d.ts.map +1 -0
  106. package/lib/components/license-gate.jsx +21 -0
  107. package/lib/components/license-gate.jsx.map +1 -0
  108. package/lib/components/logo.d.ts +15 -0
  109. package/lib/components/logo.d.ts.map +1 -0
  110. package/lib/components/logo.jsx +20 -0
  111. package/lib/components/logo.jsx.map +1 -0
  112. package/lib/components/onboarding-wizard.d.ts +89 -0
  113. package/lib/components/onboarding-wizard.d.ts.map +1 -0
  114. package/lib/components/onboarding-wizard.jsx +185 -0
  115. package/lib/components/onboarding-wizard.jsx.map +1 -0
  116. package/lib/components/pagination.d.ts +43 -0
  117. package/lib/components/pagination.d.ts.map +1 -0
  118. package/lib/components/pagination.jsx +72 -0
  119. package/lib/components/pagination.jsx.map +1 -0
  120. package/lib/components/password-generator.d.ts +15 -0
  121. package/lib/components/password-generator.d.ts.map +1 -0
  122. package/lib/components/password-generator.jsx +273 -0
  123. package/lib/components/password-generator.jsx.map +1 -0
  124. package/lib/components/pin-pad.d.ts +20 -0
  125. package/lib/components/pin-pad.d.ts.map +1 -0
  126. package/lib/components/pin-pad.jsx +93 -0
  127. package/lib/components/pin-pad.jsx.map +1 -0
  128. package/lib/components/popover.d.ts +27 -0
  129. package/lib/components/popover.d.ts.map +1 -0
  130. package/lib/components/popover.jsx +18 -0
  131. package/lib/components/popover.jsx.map +1 -0
  132. package/lib/components/profile/ProfileDialog.d.ts +25 -0
  133. package/lib/components/profile/ProfileDialog.d.ts.map +1 -0
  134. package/lib/components/profile/ProfileDialog.jsx +71 -0
  135. package/lib/components/profile/ProfileDialog.jsx.map +1 -0
  136. package/lib/components/profile/ProfileTab.d.ts +12 -0
  137. package/lib/components/profile/ProfileTab.d.ts.map +1 -0
  138. package/lib/components/profile/ProfileTab.jsx +112 -0
  139. package/lib/components/profile/ProfileTab.jsx.map +1 -0
  140. package/lib/components/profile/SecurityTab.d.ts +32 -0
  141. package/lib/components/profile/SecurityTab.d.ts.map +1 -0
  142. package/lib/components/profile/SecurityTab.jsx +145 -0
  143. package/lib/components/profile/SecurityTab.jsx.map +1 -0
  144. package/lib/components/profile/index.d.ts +4 -0
  145. package/lib/components/profile/index.d.ts.map +1 -0
  146. package/lib/components/profile/index.js +4 -0
  147. package/lib/components/profile/index.js.map +1 -0
  148. package/lib/components/segmented-toggle.d.ts +28 -0
  149. package/lib/components/segmented-toggle.d.ts.map +1 -0
  150. package/lib/components/segmented-toggle.jsx +64 -0
  151. package/lib/components/segmented-toggle.jsx.map +1 -0
  152. package/lib/components/separator.d.ts +13 -0
  153. package/lib/components/separator.d.ts.map +1 -0
  154. package/lib/components/separator.jsx +16 -0
  155. package/lib/components/separator.jsx.map +1 -0
  156. package/lib/components/server-settings.d.ts +27 -0
  157. package/lib/components/server-settings.d.ts.map +1 -0
  158. package/lib/components/server-settings.jsx +307 -0
  159. package/lib/components/server-settings.jsx.map +1 -0
  160. package/lib/components/settings/AccountSection.d.ts +26 -0
  161. package/lib/components/settings/AccountSection.d.ts.map +1 -0
  162. package/lib/components/settings/AccountSection.jsx +32 -0
  163. package/lib/components/settings/AccountSection.jsx.map +1 -0
  164. package/lib/components/settings/DangerZoneSection.d.ts +13 -0
  165. package/lib/components/settings/DangerZoneSection.d.ts.map +1 -0
  166. package/lib/components/settings/DangerZoneSection.jsx +16 -0
  167. package/lib/components/settings/DangerZoneSection.jsx.map +1 -0
  168. package/lib/components/settings/GeneralSection.d.ts +11 -0
  169. package/lib/components/settings/GeneralSection.d.ts.map +1 -0
  170. package/lib/components/settings/GeneralSection.jsx +12 -0
  171. package/lib/components/settings/GeneralSection.jsx.map +1 -0
  172. package/lib/components/settings/SupportSection.d.ts +11 -0
  173. package/lib/components/settings/SupportSection.d.ts.map +1 -0
  174. package/lib/components/settings/SupportSection.jsx +22 -0
  175. package/lib/components/settings/SupportSection.jsx.map +1 -0
  176. package/lib/components/settings/index.d.ts +5 -0
  177. package/lib/components/settings/index.d.ts.map +1 -0
  178. package/lib/components/settings/index.js +5 -0
  179. package/lib/components/settings/index.js.map +1 -0
  180. package/lib/components/settings-row.d.ts +28 -0
  181. package/lib/components/settings-row.d.ts.map +1 -0
  182. package/lib/components/settings-row.jsx +68 -0
  183. package/lib/components/settings-row.jsx.map +1 -0
  184. package/lib/components/skeleton.d.ts +8 -0
  185. package/lib/components/skeleton.d.ts.map +1 -0
  186. package/lib/components/skeleton.jsx +24 -0
  187. package/lib/components/skeleton.jsx.map +1 -0
  188. package/lib/components/social-connections.d.ts +15 -0
  189. package/lib/components/social-connections.d.ts.map +1 -0
  190. package/lib/components/social-connections.jsx +31 -0
  191. package/lib/components/social-connections.jsx.map +1 -0
  192. package/lib/components/stat-card.d.ts +29 -0
  193. package/lib/components/stat-card.d.ts.map +1 -0
  194. package/lib/components/stat-card.jsx +36 -0
  195. package/lib/components/stat-card.jsx.map +1 -0
  196. package/lib/components/tag-chip.d.ts +18 -0
  197. package/lib/components/tag-chip.d.ts.map +1 -0
  198. package/lib/components/tag-chip.jsx +54 -0
  199. package/lib/components/tag-chip.jsx.map +1 -0
  200. package/lib/components/tag-multi-select.d.ts +27 -0
  201. package/lib/components/tag-multi-select.d.ts.map +1 -0
  202. package/lib/components/tag-multi-select.jsx +65 -0
  203. package/lib/components/tag-multi-select.jsx.map +1 -0
  204. package/lib/components/text.d.ts +22 -0
  205. package/lib/components/text.d.ts.map +1 -0
  206. package/lib/components/text.jsx +43 -0
  207. package/lib/components/text.jsx.map +1 -0
  208. package/lib/components/toast/ToastPortal.d.ts +11 -0
  209. package/lib/components/toast/ToastPortal.d.ts.map +1 -0
  210. package/lib/components/toast/ToastPortal.jsx +15 -0
  211. package/lib/components/toast/ToastPortal.jsx.map +1 -0
  212. package/lib/components/toast/ToastPortal.web.d.ts +14 -0
  213. package/lib/components/toast/ToastPortal.web.d.ts.map +1 -0
  214. package/lib/components/toast/ToastPortal.web.jsx +39 -0
  215. package/lib/components/toast/ToastPortal.web.jsx.map +1 -0
  216. package/lib/components/toast/index.d.ts +3 -0
  217. package/lib/components/toast/index.d.ts.map +1 -0
  218. package/lib/components/toast/index.js +3 -0
  219. package/lib/components/toast/index.js.map +1 -0
  220. package/lib/components/toast/toast-config.d.ts +14 -0
  221. package/lib/components/toast/toast-config.d.ts.map +1 -0
  222. package/lib/components/toast/toast-config.jsx +24 -0
  223. package/lib/components/toast/toast-config.jsx.map +1 -0
  224. package/lib/components/tooltip.d.ts +30 -0
  225. package/lib/components/tooltip.d.ts.map +1 -0
  226. package/lib/components/tooltip.jsx +14 -0
  227. package/lib/components/tooltip.jsx.map +1 -0
  228. package/lib/components/totp-display.d.ts +23 -0
  229. package/lib/components/totp-display.d.ts.map +1 -0
  230. package/lib/components/totp-display.jsx +132 -0
  231. package/lib/components/totp-display.jsx.map +1 -0
  232. package/lib/components/user-avatar.d.ts +18 -0
  233. package/lib/components/user-avatar.d.ts.map +1 -0
  234. package/lib/components/user-avatar.jsx +25 -0
  235. package/lib/components/user-avatar.jsx.map +1 -0
  236. package/lib/context/AppConfigContext.d.ts +56 -0
  237. package/lib/context/AppConfigContext.d.ts.map +1 -0
  238. package/lib/context/AppConfigContext.jsx +14 -0
  239. package/lib/context/AppConfigContext.jsx.map +1 -0
  240. package/lib/context/NavigationContext.d.ts +42 -0
  241. package/lib/context/NavigationContext.d.ts.map +1 -0
  242. package/lib/context/NavigationContext.jsx +53 -0
  243. package/lib/context/NavigationContext.jsx.map +1 -0
  244. package/lib/context/NotificationContext.d.ts +32 -0
  245. package/lib/context/NotificationContext.d.ts.map +1 -0
  246. package/lib/context/NotificationContext.jsx +49 -0
  247. package/lib/context/NotificationContext.jsx.map +1 -0
  248. package/lib/context/ThemeContext.d.ts +12 -0
  249. package/lib/context/ThemeContext.d.ts.map +1 -0
  250. package/lib/context/ThemeContext.jsx +66 -0
  251. package/lib/context/ThemeContext.jsx.map +1 -0
  252. package/lib/context/index.d.ts +5 -0
  253. package/lib/context/index.d.ts.map +1 -0
  254. package/lib/context/index.js +5 -0
  255. package/lib/context/index.js.map +1 -0
  256. package/lib/flags.d.ts +9 -0
  257. package/lib/flags.d.ts.map +1 -0
  258. package/lib/flags.js +37 -0
  259. package/lib/flags.js.map +1 -0
  260. package/lib/forms/form-error.d.ts +12 -0
  261. package/lib/forms/form-error.d.ts.map +1 -0
  262. package/lib/forms/form-error.jsx +14 -0
  263. package/lib/forms/form-error.jsx.map +1 -0
  264. package/lib/forms/index.d.ts +3 -0
  265. package/lib/forms/index.d.ts.map +1 -0
  266. package/lib/forms/index.js +3 -0
  267. package/lib/forms/index.js.map +1 -0
  268. package/lib/forms/shake-field.d.ts +18 -0
  269. package/lib/forms/shake-field.d.ts.map +1 -0
  270. package/lib/forms/shake-field.jsx +30 -0
  271. package/lib/forms/shake-field.jsx.map +1 -0
  272. package/lib/hooks/index.d.ts +6 -0
  273. package/lib/hooks/index.d.ts.map +1 -0
  274. package/lib/hooks/index.js +6 -0
  275. package/lib/hooks/index.js.map +1 -0
  276. package/lib/hooks/useAuth.d.ts +109 -0
  277. package/lib/hooks/useAuth.d.ts.map +1 -0
  278. package/lib/hooks/useAuth.jsx +404 -0
  279. package/lib/hooks/useAuth.jsx.map +1 -0
  280. package/lib/hooks/useAutoLock.d.ts +22 -0
  281. package/lib/hooks/useAutoLock.d.ts.map +1 -0
  282. package/lib/hooks/useAutoLock.js +85 -0
  283. package/lib/hooks/useAutoLock.js.map +1 -0
  284. package/lib/hooks/useDebouncedValue.d.ts +19 -0
  285. package/lib/hooks/useDebouncedValue.d.ts.map +1 -0
  286. package/lib/hooks/useDebouncedValue.js +29 -0
  287. package/lib/hooks/useDebouncedValue.js.map +1 -0
  288. package/lib/hooks/useShakeAnimation.d.ts +17 -0
  289. package/lib/hooks/useShakeAnimation.d.ts.map +1 -0
  290. package/lib/hooks/useShakeAnimation.js +22 -0
  291. package/lib/hooks/useShakeAnimation.js.map +1 -0
  292. package/lib/hooks/useUploadBlobUrl.d.ts +13 -0
  293. package/lib/hooks/useUploadBlobUrl.d.ts.map +1 -0
  294. package/lib/hooks/useUploadBlobUrl.js +60 -0
  295. package/lib/hooks/useUploadBlobUrl.js.map +1 -0
  296. package/lib/index.d.ts +10 -0
  297. package/lib/index.d.ts.map +1 -0
  298. package/lib/index.js +47 -0
  299. package/lib/index.js.map +1 -0
  300. package/lib/screens/auth/AccountPickerScreen.d.ts +24 -0
  301. package/lib/screens/auth/AccountPickerScreen.d.ts.map +1 -0
  302. package/lib/screens/auth/AccountPickerScreen.jsx +47 -0
  303. package/lib/screens/auth/AccountPickerScreen.jsx.map +1 -0
  304. package/lib/screens/auth/AuthScreen.d.ts +59 -0
  305. package/lib/screens/auth/AuthScreen.d.ts.map +1 -0
  306. package/lib/screens/auth/AuthScreen.jsx +594 -0
  307. package/lib/screens/auth/AuthScreen.jsx.map +1 -0
  308. package/lib/screens/auth/ConsentScreen.d.ts +27 -0
  309. package/lib/screens/auth/ConsentScreen.d.ts.map +1 -0
  310. package/lib/screens/auth/ConsentScreen.jsx +55 -0
  311. package/lib/screens/auth/ConsentScreen.jsx.map +1 -0
  312. package/lib/screens/auth/ErrorScreen.d.ts +20 -0
  313. package/lib/screens/auth/ErrorScreen.d.ts.map +1 -0
  314. package/lib/screens/auth/ErrorScreen.jsx +43 -0
  315. package/lib/screens/auth/ErrorScreen.jsx.map +1 -0
  316. package/lib/screens/auth/ExpiredLinkScreen.d.ts +19 -0
  317. package/lib/screens/auth/ExpiredLinkScreen.d.ts.map +1 -0
  318. package/lib/screens/auth/ExpiredLinkScreen.jsx +38 -0
  319. package/lib/screens/auth/ExpiredLinkScreen.jsx.map +1 -0
  320. package/lib/screens/auth/ForgotPasswordScreen.d.ts +4 -0
  321. package/lib/screens/auth/ForgotPasswordScreen.d.ts.map +1 -0
  322. package/lib/screens/auth/ForgotPasswordScreen.jsx +123 -0
  323. package/lib/screens/auth/ForgotPasswordScreen.jsx.map +1 -0
  324. package/lib/screens/auth/ImportDataScreen.d.ts +17 -0
  325. package/lib/screens/auth/ImportDataScreen.d.ts.map +1 -0
  326. package/lib/screens/auth/ImportDataScreen.jsx +73 -0
  327. package/lib/screens/auth/ImportDataScreen.jsx.map +1 -0
  328. package/lib/screens/auth/LoginScreen.d.ts +38 -0
  329. package/lib/screens/auth/LoginScreen.d.ts.map +1 -0
  330. package/lib/screens/auth/LoginScreen.jsx +326 -0
  331. package/lib/screens/auth/LoginScreen.jsx.map +1 -0
  332. package/lib/screens/auth/MfaChallengeScreen.d.ts +4 -0
  333. package/lib/screens/auth/MfaChallengeScreen.d.ts.map +1 -0
  334. package/lib/screens/auth/MfaChallengeScreen.jsx +139 -0
  335. package/lib/screens/auth/MfaChallengeScreen.jsx.map +1 -0
  336. package/lib/screens/auth/MfaEnrollScreen.d.ts +12 -0
  337. package/lib/screens/auth/MfaEnrollScreen.d.ts.map +1 -0
  338. package/lib/screens/auth/MfaEnrollScreen.jsx +267 -0
  339. package/lib/screens/auth/MfaEnrollScreen.jsx.map +1 -0
  340. package/lib/screens/auth/PasskeyEnrollScreen.d.ts +18 -0
  341. package/lib/screens/auth/PasskeyEnrollScreen.d.ts.map +1 -0
  342. package/lib/screens/auth/PasskeyEnrollScreen.jsx +51 -0
  343. package/lib/screens/auth/PasskeyEnrollScreen.jsx.map +1 -0
  344. package/lib/screens/auth/PrivacyPolicyScreen.d.ts +19 -0
  345. package/lib/screens/auth/PrivacyPolicyScreen.d.ts.map +1 -0
  346. package/lib/screens/auth/PrivacyPolicyScreen.jsx +143 -0
  347. package/lib/screens/auth/PrivacyPolicyScreen.jsx.map +1 -0
  348. package/lib/screens/auth/RegisterScreen.d.ts +14 -0
  349. package/lib/screens/auth/RegisterScreen.d.ts.map +1 -0
  350. package/lib/screens/auth/RegisterScreen.jsx +296 -0
  351. package/lib/screens/auth/RegisterScreen.jsx.map +1 -0
  352. package/lib/screens/auth/ResetPasswordScreen.d.ts +12 -0
  353. package/lib/screens/auth/ResetPasswordScreen.d.ts.map +1 -0
  354. package/lib/screens/auth/ResetPasswordScreen.jsx +276 -0
  355. package/lib/screens/auth/ResetPasswordScreen.jsx.map +1 -0
  356. package/lib/screens/auth/ServerConfigScreen.d.ts +18 -0
  357. package/lib/screens/auth/ServerConfigScreen.d.ts.map +1 -0
  358. package/lib/screens/auth/ServerConfigScreen.jsx +259 -0
  359. package/lib/screens/auth/ServerConfigScreen.jsx.map +1 -0
  360. package/lib/screens/auth/TermsOfServiceScreen.d.ts +30 -0
  361. package/lib/screens/auth/TermsOfServiceScreen.d.ts.map +1 -0
  362. package/lib/screens/auth/TermsOfServiceScreen.jsx +130 -0
  363. package/lib/screens/auth/TermsOfServiceScreen.jsx.map +1 -0
  364. package/lib/screens/auth/VerifyEmailScreen.d.ts +4 -0
  365. package/lib/screens/auth/VerifyEmailScreen.d.ts.map +1 -0
  366. package/lib/screens/auth/VerifyEmailScreen.jsx +249 -0
  367. package/lib/screens/auth/VerifyEmailScreen.jsx.map +1 -0
  368. package/lib/screens/auth/WelcomeScreen.d.ts +17 -0
  369. package/lib/screens/auth/WelcomeScreen.d.ts.map +1 -0
  370. package/lib/screens/auth/WelcomeScreen.jsx +58 -0
  371. package/lib/screens/auth/WelcomeScreen.jsx.map +1 -0
  372. package/lib/screens/auth/index.d.ts +19 -0
  373. package/lib/screens/auth/index.d.ts.map +1 -0
  374. package/lib/screens/auth/index.js +19 -0
  375. package/lib/screens/auth/index.js.map +1 -0
  376. package/lib/screens/index.d.ts +2 -0
  377. package/lib/screens/index.d.ts.map +1 -0
  378. package/lib/screens/index.js +2 -0
  379. package/lib/screens/index.js.map +1 -0
  380. package/lib/services/api-config.d.ts +87 -0
  381. package/lib/services/api-config.d.ts.map +1 -0
  382. package/lib/services/api-config.js +202 -0
  383. package/lib/services/api-config.js.map +1 -0
  384. package/lib/services/auth.service.d.ts +140 -0
  385. package/lib/services/auth.service.d.ts.map +1 -0
  386. package/lib/services/auth.service.js +376 -0
  387. package/lib/services/auth.service.js.map +1 -0
  388. package/lib/services/favicon.d.ts +46 -0
  389. package/lib/services/favicon.d.ts.map +1 -0
  390. package/lib/services/favicon.js +84 -0
  391. package/lib/services/favicon.js.map +1 -0
  392. package/lib/services/hibp-cache.d.ts +23 -0
  393. package/lib/services/hibp-cache.d.ts.map +1 -0
  394. package/lib/services/hibp-cache.js +56 -0
  395. package/lib/services/hibp-cache.js.map +1 -0
  396. package/lib/services/hibp.d.ts +28 -0
  397. package/lib/services/hibp.d.ts.map +1 -0
  398. package/lib/services/hibp.js +92 -0
  399. package/lib/services/hibp.js.map +1 -0
  400. package/lib/services/index.d.ts +8 -0
  401. package/lib/services/index.d.ts.map +1 -0
  402. package/lib/services/index.js +7 -0
  403. package/lib/services/index.js.map +1 -0
  404. package/lib/services/passkey.d.ts +10 -0
  405. package/lib/services/passkey.d.ts.map +1 -0
  406. package/lib/services/passkey.js +192 -0
  407. package/lib/services/passkey.js.map +1 -0
  408. package/lib/utils/api-fetch.d.ts +11 -0
  409. package/lib/utils/api-fetch.d.ts.map +1 -0
  410. package/lib/utils/api-fetch.js +52 -0
  411. package/lib/utils/api-fetch.js.map +1 -0
  412. package/lib/utils/clipboard.d.ts +31 -0
  413. package/lib/utils/clipboard.d.ts.map +1 -0
  414. package/lib/utils/clipboard.js +66 -0
  415. package/lib/utils/clipboard.js.map +1 -0
  416. package/lib/utils/cn.d.ts +9 -0
  417. package/lib/utils/cn.d.ts.map +1 -0
  418. package/lib/utils/cn.js +12 -0
  419. package/lib/utils/cn.js.map +1 -0
  420. package/lib/utils/debounce.d.ts +13 -0
  421. package/lib/utils/debounce.d.ts.map +1 -0
  422. package/lib/utils/debounce.js +28 -0
  423. package/lib/utils/debounce.js.map +1 -0
  424. package/lib/utils/error.d.ts +9 -0
  425. package/lib/utils/error.d.ts.map +1 -0
  426. package/lib/utils/error.js +11 -0
  427. package/lib/utils/error.js.map +1 -0
  428. package/lib/utils/fetch.d.ts +17 -0
  429. package/lib/utils/fetch.d.ts.map +1 -0
  430. package/lib/utils/fetch.js +29 -0
  431. package/lib/utils/fetch.js.map +1 -0
  432. package/lib/utils/http-error.d.ts +41 -0
  433. package/lib/utils/http-error.d.ts.map +1 -0
  434. package/lib/utils/http-error.js +63 -0
  435. package/lib/utils/http-error.js.map +1 -0
  436. package/lib/utils/index.d.ts +11 -0
  437. package/lib/utils/index.d.ts.map +1 -0
  438. package/lib/utils/index.js +11 -0
  439. package/lib/utils/index.js.map +1 -0
  440. package/lib/utils/palette.d.ts +46 -0
  441. package/lib/utils/palette.d.ts.map +1 -0
  442. package/lib/utils/palette.js +75 -0
  443. package/lib/utils/palette.js.map +1 -0
  444. package/lib/utils/password.d.ts +20 -0
  445. package/lib/utils/password.d.ts.map +1 -0
  446. package/lib/utils/password.js +51 -0
  447. package/lib/utils/password.js.map +1 -0
  448. package/lib/utils/settings-storage.d.ts +3 -0
  449. package/lib/utils/settings-storage.d.ts.map +1 -0
  450. package/lib/utils/settings-storage.js +62 -0
  451. package/lib/utils/settings-storage.js.map +1 -0
  452. package/lib/utils/validation.d.ts +29 -0
  453. package/lib/utils/validation.d.ts.map +1 -0
  454. package/lib/utils/validation.js +58 -0
  455. package/lib/utils/validation.js.map +1 -0
  456. package/package.json +204 -0
  457. package/src/components/__tests__/data-table.test.ts +94 -0
  458. package/src/components/__tests__/pagination.test.ts +73 -0
  459. package/src/components/__tests__/stat-card.test.ts +21 -0
  460. package/src/components/auth/LockOverlay.tsx +122 -0
  461. package/src/components/auth/PasswordStrengthMeter.tsx +96 -0
  462. package/src/components/auth/ProtectedRoute.tsx +91 -0
  463. package/src/components/auth/PwnedPasswordWarning.tsx +54 -0
  464. package/src/components/auth/index.ts +10 -0
  465. package/src/components/bottom-nav.tsx +99 -0
  466. package/src/components/button.tsx +144 -0
  467. package/src/components/card.tsx +82 -0
  468. package/src/components/checkbox.tsx +48 -0
  469. package/src/components/connection-settings.tsx +583 -0
  470. package/src/components/context-menu.tsx +95 -0
  471. package/src/components/data-table.tsx +223 -0
  472. package/src/components/dialog.tsx +376 -0
  473. package/src/components/dropdown-menu.tsx +120 -0
  474. package/src/components/entropy-boot-splash.tsx +114 -0
  475. package/src/components/entropy-mark-animated.tsx +260 -0
  476. package/src/components/entropy-mark-geometry.ts +11 -0
  477. package/src/components/entropy-mark-sequential.tsx +132 -0
  478. package/src/components/entropy-mark.tsx +135 -0
  479. package/src/components/error-boundary.tsx +70 -0
  480. package/src/components/index.ts +156 -0
  481. package/src/components/input.tsx +246 -0
  482. package/src/components/item-icon.tsx +111 -0
  483. package/src/components/label.tsx +25 -0
  484. package/src/components/legal-dialog.tsx +47 -0
  485. package/src/components/license-gate.tsx +28 -0
  486. package/src/components/logo.tsx +34 -0
  487. package/src/components/onboarding-wizard.tsx +353 -0
  488. package/src/components/pagination.tsx +154 -0
  489. package/src/components/password-generator.tsx +393 -0
  490. package/src/components/pin-pad.tsx +156 -0
  491. package/src/components/popover.tsx +38 -0
  492. package/src/components/profile/ProfileDialog.tsx +129 -0
  493. package/src/components/profile/ProfileTab.tsx +151 -0
  494. package/src/components/profile/SecurityTab.tsx +229 -0
  495. package/src/components/profile/index.ts +3 -0
  496. package/src/components/segmented-toggle.tsx +119 -0
  497. package/src/components/separator.tsx +41 -0
  498. package/src/components/server-settings.tsx +442 -0
  499. package/src/components/settings/AccountSection.tsx +76 -0
  500. package/src/components/settings/DangerZoneSection.tsx +37 -0
  501. package/src/components/settings/GeneralSection.tsx +39 -0
  502. package/src/components/settings/SupportSection.tsx +53 -0
  503. package/src/components/settings/index.ts +4 -0
  504. package/src/components/settings-row.tsx +126 -0
  505. package/src/components/skeleton.tsx +48 -0
  506. package/src/components/social-connections.tsx +55 -0
  507. package/src/components/stat-card.tsx +64 -0
  508. package/src/components/tag-chip.tsx +78 -0
  509. package/src/components/tag-multi-select.tsx +136 -0
  510. package/src/components/text.tsx +77 -0
  511. package/src/components/toast/ToastPortal.tsx +16 -0
  512. package/src/components/toast/ToastPortal.web.tsx +47 -0
  513. package/src/components/toast/index.ts +2 -0
  514. package/src/components/toast/toast-config.tsx +31 -0
  515. package/src/components/tooltip.tsx +30 -0
  516. package/src/components/totp-display.tsx +207 -0
  517. package/src/components/user-avatar.tsx +46 -0
  518. package/src/context/AppConfigContext.tsx +76 -0
  519. package/src/context/NavigationContext.tsx +75 -0
  520. package/src/context/NotificationContext.tsx +69 -0
  521. package/src/context/ThemeContext.tsx +83 -0
  522. package/src/context/__tests__/NavigationContext.test.tsx +53 -0
  523. package/src/context/index.ts +24 -0
  524. package/src/flags.ts +44 -0
  525. package/src/forms/form-error.tsx +20 -0
  526. package/src/forms/index.ts +2 -0
  527. package/src/forms/shake-field.tsx +52 -0
  528. package/src/hooks/__tests__/useUploadBlobUrl.test.tsx +77 -0
  529. package/src/hooks/index.ts +18 -0
  530. package/src/hooks/useAuth.tsx +567 -0
  531. package/src/hooks/useAutoLock.ts +110 -0
  532. package/src/hooks/useDebouncedValue.ts +32 -0
  533. package/src/hooks/useShakeAnimation.ts +42 -0
  534. package/src/hooks/useUploadBlobUrl.ts +75 -0
  535. package/src/index.ts +48 -0
  536. package/src/screens/auth/AccountPickerScreen.tsx +103 -0
  537. package/src/screens/auth/AuthScreen.tsx +941 -0
  538. package/src/screens/auth/ConsentScreen.tsx +118 -0
  539. package/src/screens/auth/ErrorScreen.tsx +96 -0
  540. package/src/screens/auth/ExpiredLinkScreen.tsx +87 -0
  541. package/src/screens/auth/ForgotPasswordScreen.tsx +182 -0
  542. package/src/screens/auth/ImportDataScreen.tsx +112 -0
  543. package/src/screens/auth/LoginScreen.tsx +484 -0
  544. package/src/screens/auth/MfaChallengeScreen.tsx +216 -0
  545. package/src/screens/auth/MfaEnrollScreen.tsx +388 -0
  546. package/src/screens/auth/PasskeyEnrollScreen.tsx +96 -0
  547. package/src/screens/auth/PrivacyPolicyScreen.tsx +249 -0
  548. package/src/screens/auth/RegisterScreen.tsx +430 -0
  549. package/src/screens/auth/ResetPasswordScreen.tsx +377 -0
  550. package/src/screens/auth/ServerConfigScreen.tsx +388 -0
  551. package/src/screens/auth/TermsOfServiceScreen.tsx +236 -0
  552. package/src/screens/auth/VerifyEmailScreen.tsx +310 -0
  553. package/src/screens/auth/WelcomeScreen.tsx +78 -0
  554. package/src/screens/auth/index.ts +36 -0
  555. package/src/screens/index.ts +1 -0
  556. package/src/services/__tests__/api-config.test.ts +67 -0
  557. package/src/services/__tests__/favicon.test.ts +88 -0
  558. package/src/services/__tests__/hibp-cache.test.ts +37 -0
  559. package/src/services/__tests__/hibp.test.ts +39 -0
  560. package/src/services/api-config.ts +260 -0
  561. package/src/services/auth.service.ts +498 -0
  562. package/src/services/favicon.ts +102 -0
  563. package/src/services/hibp-cache.ts +71 -0
  564. package/src/services/hibp.ts +120 -0
  565. package/src/services/index.ts +52 -0
  566. package/src/services/passkey.ts +213 -0
  567. package/src/types/external.d.ts +24 -0
  568. package/src/utils/__tests__/clipboard.test.ts +59 -0
  569. package/src/utils/__tests__/cn.test.ts +24 -0
  570. package/src/utils/__tests__/debounce.test.ts +42 -0
  571. package/src/utils/__tests__/error.test.ts +18 -0
  572. package/src/utils/__tests__/http-error.test.ts +33 -0
  573. package/src/utils/__tests__/palette.test.ts +22 -0
  574. package/src/utils/__tests__/password.test.ts +55 -0
  575. package/src/utils/__tests__/settings-storage.test.ts +15 -0
  576. package/src/utils/__tests__/validation.test.ts +52 -0
  577. package/src/utils/api-fetch.ts +61 -0
  578. package/src/utils/clipboard.ts +69 -0
  579. package/src/utils/cn.ts +12 -0
  580. package/src/utils/debounce.ts +33 -0
  581. package/src/utils/error.ts +10 -0
  582. package/src/utils/fetch.ts +33 -0
  583. package/src/utils/http-error.ts +81 -0
  584. package/src/utils/index.ts +23 -0
  585. package/src/utils/palette.ts +105 -0
  586. package/src/utils/password.ts +64 -0
  587. package/src/utils/settings-storage.ts +68 -0
  588. package/src/utils/validation.ts +71 -0
  589. package/styles/globals.css +262 -0
  590. 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
@@ -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,3 @@
1
+ export { default as FormError } from "./form-error";
2
+ export { default as ShakeField } from "./shake-field";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { default as FormError } from "./form-error";
2
+ export { default as ShakeField } from "./shake-field";
3
+ //# sourceMappingURL=index.js.map
@@ -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":"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"}