@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,135 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import Svg, { Path } from "react-native-svg";
4
+ import { useColorScheme } from "nativewind";
5
+ import { Text } from "./text";
6
+ import { DISABLE_BRANDING } from "../flags";
7
+ import { EntropyMarkAnimated } from "./entropy-mark-animated";
8
+ import {
9
+ ENTROPY_MARK_VIEWBOX,
10
+ ENTROPY_MARK_ASPECT,
11
+ ENTROPY_MARK_PATH,
12
+ ENTROPY_MARK_STEP,
13
+ } from "./entropy-mark-geometry";
14
+
15
+ // Entropy Softworks company mark: Geist Mono `>_` broken apart (diagonal shear
16
+ // on the `>` top arm, CRT scanline slip on the lower arm, clean break in the
17
+ // `_`), trailed by three grey time-echoes drifting up-left and an optional
18
+ // faint cyan/red chroma fringe. This is the COMPANY brand — distinct from each
19
+ // product's own logo (registered via AppConfig.Logo / BrandHeader). Use it
20
+ // sparingly on corporate surfaces (legal pages, boot splash).
21
+ //
22
+ // Single traced path, reused with per-echo offsets. Geometry lives in
23
+ // ./entropy-mark-geometry (shared with EntropyMarkAnimated to avoid a require
24
+ // cycle); re-exported here so existing import paths keep working.
25
+ export {
26
+ ENTROPY_MARK_VIEWBOX,
27
+ ENTROPY_MARK_ASPECT,
28
+ ENTROPY_MARK_PATH,
29
+ ENTROPY_MARK_STEP,
30
+ } from "./entropy-mark-geometry";
31
+
32
+ const PALETTE = {
33
+ light: {
34
+ src: "#000000",
35
+ echo: ["#f5f5f5", "#e2e2e2", "#cbcbcb"],
36
+ cyan: "#0096aa",
37
+ red: "#c82837",
38
+ },
39
+ dark: {
40
+ src: "#ffffff",
41
+ echo: ["#373737", "#5f5f5f", "#8c8c8c"],
42
+ cyan: "#268ca0",
43
+ red: "#a53440",
44
+ },
45
+ };
46
+
47
+ export interface EntropyMarkProps {
48
+ /** Rendered height in px. Width follows the ~1.63:1 aspect. */
49
+ size?: number;
50
+ /** "mono" = grey echoes only; "chroma" = adds the faint cyan/red fringe. */
51
+ variant?: "mono" | "chroma";
52
+ /** Override the theme; defaults to the active color scheme. */
53
+ scheme?: "light" | "dark";
54
+ /** Multiply the echo drift distance (boot animation drives this 0→1). */
55
+ driftScale?: number;
56
+ }
57
+
58
+ /** Bare company `>_` mark (no wordmark). */
59
+ export function EntropyMark({
60
+ size = 28,
61
+ variant = "mono",
62
+ scheme,
63
+ driftScale = 1,
64
+ }: EntropyMarkProps) {
65
+ const { colorScheme } = useColorScheme();
66
+ const p = PALETTE[scheme ?? (colorScheme === "dark" ? "dark" : "light")];
67
+ const width = Math.round(size * ENTROPY_MARK_ASPECT);
68
+ const echoes = [3, 2, 1] as const; // far (dim) -> near
69
+ return (
70
+ <Svg width={width} height={size} viewBox={ENTROPY_MARK_VIEWBOX}>
71
+ {echoes.map((i) => (
72
+ <Path
73
+ key={i}
74
+ d={ENTROPY_MARK_PATH}
75
+ fillRule="evenodd"
76
+ fill={p.echo[3 - i]}
77
+ transform={`translate(${ENTROPY_MARK_STEP.x * i * driftScale} ${ENTROPY_MARK_STEP.y * i * driftScale})`}
78
+ />
79
+ ))}
80
+ {variant === "chroma" ? (
81
+ <>
82
+ <Path
83
+ d={ENTROPY_MARK_PATH}
84
+ fillRule="evenodd"
85
+ fill={p.cyan}
86
+ opacity={0.5}
87
+ transform="translate(10 8)"
88
+ />
89
+ <Path
90
+ d={ENTROPY_MARK_PATH}
91
+ fillRule="evenodd"
92
+ fill={p.red}
93
+ opacity={0.45}
94
+ transform="translate(-10 -8)"
95
+ />
96
+ </>
97
+ ) : null}
98
+ <Path d={ENTROPY_MARK_PATH} fillRule="evenodd" fill={p.src} />
99
+ </Svg>
100
+ );
101
+ }
102
+
103
+ export interface EntropyBylineProps {
104
+ /** Mark height in px (wordmark scales relative). */
105
+ size?: number;
106
+ variant?: "mono" | "chroma";
107
+ scheme?: "light" | "dark";
108
+ /** Byline copy. Defaults to "Entropy Softworks, Inc.". */
109
+ label?: string;
110
+ }
111
+
112
+ /**
113
+ * Subtle corporate byline: the company `>_` mark beside small muted text.
114
+ * Drop at the bottom of legal / about pages so each product carries quiet
115
+ * company recognition without competing with its own brand.
116
+ */
117
+ export function EntropyByline({
118
+ size = 18,
119
+ variant = "mono",
120
+ scheme,
121
+ label = "Entropy Softworks, Inc.",
122
+ }: EntropyBylineProps) {
123
+ // Self-host branding opt-out: strip the Entropy byline entirely.
124
+ if (DISABLE_BRANDING) {
125
+ return null;
126
+ }
127
+ return (
128
+ <View className="flex-row items-center justify-center" style={{ gap: 8, opacity: 0.7 }}>
129
+ {/* Flat at rest; press reveals the echo-cascade (the website's hover
130
+ animation, touch-ported — see entropy-mark-animated.tsx). */}
131
+ <EntropyMarkAnimated size={size} variant={variant} scheme={scheme} />
132
+ <Text className="font-mono text-xs text-muted-foreground">{label}</Text>
133
+ </View>
134
+ );
135
+ }
@@ -0,0 +1,70 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import { Text } from "./text";
4
+ import { Button } from "./button";
5
+
6
+ interface Props {
7
+ children: React.ReactNode;
8
+ fallback?: React.ReactNode;
9
+ /**
10
+ * Optional callback fired when the user taps "Try Again". Use this
11
+ * to clear any module-level state that contributed to the crash
12
+ * (vault: `queryClient.clear()`, `KeyManager.lock()`, etc.).
13
+ * Without this, a re-render against still-broken module state
14
+ * would crash-loop the user with no escape.
15
+ */
16
+ onReset?: () => void;
17
+ }
18
+
19
+ interface State {
20
+ hasError: boolean;
21
+ /** Bumped on every reset so children remount fresh — clears React
22
+ * state inside the crashing subtree, not just the boundary's own
23
+ * flag. Without this, "Try Again" only resets `hasError` and a
24
+ * child whose component state is the root cause re-throws on the
25
+ * next render. */
26
+ resetKey: number;
27
+ }
28
+
29
+ export class ErrorBoundary extends React.Component<Props, State> {
30
+ override state: State = { hasError: false, resetKey: 0 };
31
+
32
+ static getDerivedStateFromError(): Partial<State> {
33
+ return { hasError: true };
34
+ }
35
+
36
+ override componentDidCatch(error: Error, info: React.ErrorInfo) {
37
+ if (__DEV__) {
38
+ console.error("[ErrorBoundary]", error, info.componentStack);
39
+ }
40
+ }
41
+
42
+ private handleReset = (): void => {
43
+ try {
44
+ this.props.onReset?.();
45
+ } catch {
46
+ // onReset failures must not crash the boundary itself.
47
+ }
48
+ this.setState((prev) => ({ hasError: false, resetKey: prev.resetKey + 1 }));
49
+ };
50
+
51
+ override render() {
52
+ if (this.state.hasError) {
53
+ return (
54
+ this.props.fallback ?? (
55
+ <View className="flex-1 items-center justify-center p-8">
56
+ <Text className="mb-4 text-lg font-semibold text-foreground">Something went wrong</Text>
57
+ <Button onPress={this.handleReset}>
58
+ <Text className="text-primary-foreground">Try Again</Text>
59
+ </Button>
60
+ </View>
61
+ )
62
+ );
63
+ }
64
+ // Keying the subtree on `resetKey` forces a remount on retry so
65
+ // component-level state that contributed to the crash is
66
+ // recreated from scratch rather than re-rendering against the
67
+ // same stale props/state and crash-looping.
68
+ return <React.Fragment key={this.state.resetKey}>{this.props.children}</React.Fragment>;
69
+ }
70
+ }
@@ -0,0 +1,156 @@
1
+ // UI primitives barrel — one entry point for every primitive entropy-ui
2
+ // exposes. Keep additions alphabetical by source file.
3
+
4
+ export { Button, IconButton, type ButtonProps } from "./button";
5
+
6
+ export {
7
+ Card,
8
+ CardHeader,
9
+ CardContent,
10
+ CardFooter,
11
+ CardTitle,
12
+ CardDescription,
13
+ type CardProps,
14
+ type CardTitleProps,
15
+ type CardDescriptionProps,
16
+ } from "./card";
17
+
18
+ export { Checkbox } from "./checkbox";
19
+
20
+ export {
21
+ ContextMenu,
22
+ ContextMenuTrigger,
23
+ ContextMenuContent,
24
+ ContextMenuItem,
25
+ ContextMenuSeparator,
26
+ ContextMenuLabel,
27
+ } from "./context-menu";
28
+
29
+ export {
30
+ DataTable,
31
+ resolveColumnStyle,
32
+ dataTableBodyMode,
33
+ type DataTableProps,
34
+ type DataTableColumn,
35
+ type DataTableBodyMode,
36
+ } from "./data-table";
37
+
38
+ export { Dialog, DialogContent, DialogFooter, DialogButton, ConfirmDialog } from "./dialog";
39
+
40
+ export {
41
+ DropdownMenu,
42
+ DropdownMenuTrigger,
43
+ DropdownMenuContent,
44
+ DropdownMenuItem,
45
+ DropdownMenuCheckboxItem,
46
+ DropdownMenuLabel,
47
+ DropdownMenuSeparator,
48
+ } from "./dropdown-menu";
49
+
50
+ export {
51
+ EntropyMark,
52
+ EntropyByline,
53
+ ENTROPY_MARK_VIEWBOX,
54
+ ENTROPY_MARK_ASPECT,
55
+ ENTROPY_MARK_PATH,
56
+ ENTROPY_MARK_STEP,
57
+ type EntropyMarkProps,
58
+ type EntropyBylineProps,
59
+ } from "./entropy-mark";
60
+
61
+ export { EntropyBootSplash, type EntropyBootSplashProps } from "./entropy-boot-splash";
62
+
63
+ export { EntropyMarkAnimated, type EntropyMarkAnimatedProps } from "./entropy-mark-animated";
64
+
65
+ export { EntropyMarkSequential, type EntropyMarkSequentialProps } from "./entropy-mark-sequential";
66
+
67
+ export { ErrorBoundary } from "./error-boundary";
68
+
69
+ export { Input, SearchInput, EmailInput, PasswordInput, TextArea, type InputProps } from "./input";
70
+
71
+ export { FormLabel, FormLabelText } from "./label";
72
+
73
+ export { LicenseGate, type LicenseGateProps } from "./license-gate";
74
+
75
+ export {
76
+ OnboardingWizard,
77
+ OnboardingOptionCard,
78
+ type OnboardingWizardProps,
79
+ type OnboardingStepDef,
80
+ type OnboardingStepApi,
81
+ type OnboardingOptionCardProps,
82
+ type OnboardingTheme,
83
+ } from "./onboarding-wizard";
84
+
85
+ export {
86
+ Pagination,
87
+ getPaginationState,
88
+ type PaginationProps,
89
+ type PaginationState,
90
+ } from "./pagination";
91
+
92
+ export { Popover, PopoverTrigger, PopoverContent } from "./popover";
93
+
94
+ export { Separator, SeparatorWithText } from "./separator";
95
+
96
+ export {
97
+ SegmentedToggle,
98
+ type SegmentedToggleProps,
99
+ type SegmentedOption,
100
+ } from "./segmented-toggle";
101
+
102
+ export {
103
+ SettingsRow,
104
+ SettingsSection,
105
+ type SettingsRowProps,
106
+ type SettingsSectionProps,
107
+ } from "./settings-row";
108
+
109
+ export { Skeleton } from "./skeleton";
110
+
111
+ export { StatCard, trendColorClass, type StatCardProps, type StatTrend } from "./stat-card";
112
+
113
+ export { Text, Heading, Label, MutedText, MonoText, ErrorText, type TextProps } from "./text";
114
+
115
+ export { ToastPortal, toastConfig } from "./toast";
116
+
117
+ export { Tooltip, TooltipTrigger, TooltipContent } from "./tooltip";
118
+
119
+ export { BrandHeader, type BrandHeaderProps } from "./logo";
120
+
121
+ export { TagChip, withAlpha, type TagChipProps } from "./tag-chip";
122
+
123
+ export { BottomNav, type BottomNavItem, type BottomNavProps } from "./bottom-nav";
124
+
125
+ export { ItemIcon, type ItemIconProps } from "./item-icon";
126
+
127
+ export { TotpDisplay, type TotpDisplayProps } from "./totp-display";
128
+
129
+ export { UserAvatar, type UserAvatarProps } from "./user-avatar";
130
+
131
+ export { SocialConnections, type SocialConnectionsProps } from "./social-connections";
132
+
133
+ export {
134
+ ProfileDialog,
135
+ ProfileTab,
136
+ SecurityTab,
137
+ type ProfileDialogProps,
138
+ type ProfileTabProps,
139
+ type SecurityTabProps,
140
+ } from "./profile";
141
+
142
+ export { ServerSettings, type ServerSettingsProps } from "./server-settings";
143
+
144
+ export {
145
+ ConnectionSettings,
146
+ type ConnectionSettingsProps,
147
+ type RunMode,
148
+ } from "./connection-settings";
149
+
150
+ export { PasswordGenerator, type PasswordGeneratorProps } from "./password-generator";
151
+
152
+ export { TagMultiSelect, type TagMultiSelectProps, type TagOption } from "./tag-multi-select";
153
+
154
+ export { PinPad, type PinPadProps } from "./pin-pad";
155
+
156
+ export { LegalDialog, type LegalDialogProps } from "./legal-dialog";
@@ -0,0 +1,246 @@
1
+ import React, { forwardRef, useState } from "react";
2
+ import {
3
+ type NativeSyntheticEvent,
4
+ Pressable,
5
+ type TargetedEvent,
6
+ TextInput,
7
+ type TextInputProps,
8
+ View,
9
+ type ViewStyle,
10
+ } from "react-native";
11
+ import { cn } from "../utils/cn";
12
+ import { ErrorText, Label } from "./text";
13
+ import { Ionicons } from "@expo/vector-icons";
14
+ import { useColorScheme } from "nativewind";
15
+
16
+ export interface InputProps extends TextInputProps {
17
+ className?: string;
18
+ containerClassName?: string;
19
+ label?: string;
20
+ labelClassName?: string;
21
+ error?: string;
22
+ errorClassName?: string;
23
+ /**
24
+ * Render the input in the invalid (red border) state without showing
25
+ * inline error text. Pair with a consolidated form-level error slot.
26
+ */
27
+ invalid?: boolean;
28
+ leftIcon?: React.ReactNode;
29
+ rightIcon?: React.ReactNode;
30
+ isPassword?: boolean;
31
+ showPasswordToggle?: boolean;
32
+ containerStyle?: ViewStyle;
33
+ }
34
+
35
+ export const Input = forwardRef<TextInput, InputProps>(
36
+ (
37
+ {
38
+ className,
39
+ containerClassName,
40
+ label,
41
+ labelClassName,
42
+ error,
43
+ errorClassName,
44
+ invalid,
45
+ leftIcon,
46
+ rightIcon,
47
+ isPassword = false,
48
+ showPasswordToggle = true,
49
+ containerStyle,
50
+ onFocus,
51
+ onBlur,
52
+ secureTextEntry,
53
+ ...props
54
+ },
55
+ ref
56
+ ) => {
57
+ const showInvalid = invalid || !!error;
58
+ const [showPassword, setShowPassword] = useState(false);
59
+ const [isFocused, setIsFocused] = useState(false);
60
+ const { colorScheme } = useColorScheme();
61
+ const isDark = colorScheme === "dark";
62
+
63
+ const handleFocus = (e: NativeSyntheticEvent<TargetedEvent>) => {
64
+ setIsFocused(true);
65
+ onFocus?.(e);
66
+ };
67
+
68
+ const handleBlur = (e: NativeSyntheticEvent<TargetedEvent>) => {
69
+ setIsFocused(false);
70
+ onBlur?.(e);
71
+ };
72
+
73
+ const shouldShowPassword = isPassword && !showPassword;
74
+ const showToggle = isPassword && showPasswordToggle;
75
+
76
+ let borderClass: string;
77
+ if (showInvalid) {
78
+ borderClass = "border-2 border-destructive";
79
+ } else if (isFocused) {
80
+ borderClass = "border-2 border-primary";
81
+ } else {
82
+ borderClass = "border border-border";
83
+ }
84
+
85
+ return (
86
+ <View className={cn("w-full", containerClassName)} style={containerStyle}>
87
+ {label ? <Label className={cn("mb-2", labelClassName)}>{label}</Label> : null}
88
+
89
+ <View
90
+ className={cn(
91
+ "h-12 flex-row items-center rounded-lg bg-card pl-3",
92
+ showToggle ? "pr-1" : "pr-3",
93
+ borderClass,
94
+ className
95
+ )}
96
+ >
97
+ {leftIcon ? <View className="mr-2">{leftIcon}</View> : null}
98
+
99
+ <TextInput
100
+ ref={ref}
101
+ className="flex-1 py-2 text-base text-foreground dark:text-white"
102
+ placeholderTextColor={isDark ? "#737373" : "#A3A3A3"}
103
+ onFocus={handleFocus}
104
+ onBlur={handleBlur}
105
+ secureTextEntry={secureTextEntry ?? shouldShowPassword}
106
+ {...props}
107
+ />
108
+
109
+ {showToggle ? (
110
+ <Pressable
111
+ onPress={() => setShowPassword(!showPassword)}
112
+ className="px-2 py-2"
113
+ hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
114
+ >
115
+ <Ionicons
116
+ name={showPassword ? "eye-off-outline" : "eye-outline"}
117
+ size={20}
118
+ color={isDark ? "#A3A3A3" : "#737373"}
119
+ />
120
+ </Pressable>
121
+ ) : null}
122
+
123
+ {rightIcon && !showToggle ? <View className="ml-2">{rightIcon}</View> : null}
124
+ </View>
125
+
126
+ {error ? <ErrorText className={cn("mt-2", errorClassName)}>{error}</ErrorText> : null}
127
+ </View>
128
+ );
129
+ }
130
+ );
131
+
132
+ Input.displayName = "Input";
133
+
134
+ export const SearchInput = forwardRef<TextInput, InputProps>(({ className, ...props }, ref) => {
135
+ const { colorScheme } = useColorScheme();
136
+ const isDark = colorScheme === "dark";
137
+
138
+ return (
139
+ <Input
140
+ ref={ref}
141
+ className={className}
142
+ leftIcon={<Ionicons name="search-outline" size={20} color={isDark ? "#A3A3A3" : "#737373"} />}
143
+ placeholder="Search..."
144
+ returnKeyType="search"
145
+ {...props}
146
+ />
147
+ );
148
+ });
149
+
150
+ SearchInput.displayName = "SearchInput";
151
+
152
+ export const EmailInput = forwardRef<TextInput, InputProps>(({ className, ...props }, ref) => {
153
+ const { colorScheme } = useColorScheme();
154
+ const isDark = colorScheme === "dark";
155
+
156
+ return (
157
+ <Input
158
+ ref={ref}
159
+ className={className}
160
+ leftIcon={<Ionicons name="mail-outline" size={20} color={isDark ? "#A3A3A3" : "#737373"} />}
161
+ placeholder="you@example.com"
162
+ keyboardType="email-address"
163
+ autoCapitalize="none"
164
+ autoCorrect={false}
165
+ textContentType="emailAddress"
166
+ autoComplete="email"
167
+ {...props}
168
+ />
169
+ );
170
+ });
171
+
172
+ EmailInput.displayName = "EmailInput";
173
+
174
+ export const PasswordInput = forwardRef<TextInput, InputProps>(({ className, ...props }, ref) => {
175
+ const { colorScheme } = useColorScheme();
176
+ const isDark = colorScheme === "dark";
177
+
178
+ return (
179
+ <Input
180
+ ref={ref}
181
+ className={className}
182
+ leftIcon={
183
+ <Ionicons name="lock-closed-outline" size={20} color={isDark ? "#A3A3A3" : "#737373"} />
184
+ }
185
+ placeholder="••••••••"
186
+ isPassword
187
+ autoCapitalize="none"
188
+ autoCorrect={false}
189
+ textContentType="password"
190
+ autoComplete="password"
191
+ {...props}
192
+ />
193
+ );
194
+ });
195
+
196
+ PasswordInput.displayName = "PasswordInput";
197
+
198
+ export const TextArea = forwardRef<TextInput, InputProps>(
199
+ ({ className, containerClassName, ...props }, ref) => {
200
+ const [isFocused, setIsFocused] = useState(false);
201
+ const { colorScheme } = useColorScheme();
202
+ const isDark = colorScheme === "dark";
203
+
204
+ const handleFocus = (e: NativeSyntheticEvent<TargetedEvent>) => {
205
+ setIsFocused(true);
206
+ props.onFocus?.(e);
207
+ };
208
+
209
+ const handleBlur = (e: NativeSyntheticEvent<TargetedEvent>) => {
210
+ setIsFocused(false);
211
+ props.onBlur?.(e);
212
+ };
213
+
214
+ return (
215
+ <View className={cn("w-full", containerClassName)}>
216
+ {props.label ? <Label className="mb-2">{props.label}</Label> : null}
217
+
218
+ <View
219
+ className={cn(
220
+ "min-h-[100px] rounded-lg bg-background px-3 py-3 dark:bg-black",
221
+ isFocused
222
+ ? "border-2 border-foreground"
223
+ : "border border-border dark:border-neutral-800",
224
+ className
225
+ )}
226
+ >
227
+ <TextInput
228
+ ref={ref}
229
+ className="text-base text-foreground dark:text-white"
230
+ placeholderTextColor={isDark ? "#737373" : "#A3A3A3"}
231
+ multiline
232
+ numberOfLines={4}
233
+ textAlignVertical="top"
234
+ onFocus={handleFocus}
235
+ onBlur={handleBlur}
236
+ {...props}
237
+ />
238
+ </View>
239
+
240
+ {props.error ? <ErrorText className="mt-2">{props.error}</ErrorText> : null}
241
+ </View>
242
+ );
243
+ }
244
+ );
245
+
246
+ TextArea.displayName = "TextArea";