@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,11 @@
1
+ import React from "react";
2
+ export interface GeneralSectionProps {
3
+ notifications: boolean;
4
+ onNotificationsToggle: (v: boolean) => void;
5
+ /** Fired when the user taps the Appearance row. Apps wire this to a
6
+ * theme-picker dialog. When omitted the row renders without chevron. */
7
+ onOpenAppearance?: () => void;
8
+ }
9
+ /** Generic GENERAL section — notifications toggle + appearance picker. */
10
+ export declare function GeneralSection({ notifications, onNotificationsToggle, onOpenAppearance, }: GeneralSectionProps): React.JSX.Element;
11
+ //# sourceMappingURL=GeneralSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneralSection.d.ts","sourceRoot":"","sources":["../../../src/components/settings/GeneralSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C;6EACyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,qBAAqB,EACrB,gBAAgB,GACjB,EAAE,mBAAmB,qBAqBrB"}
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { useColorScheme } from "nativewind";
3
+ import { SettingsRow, SettingsSection } from "../settings-row";
4
+ /** Generic GENERAL section — notifications toggle + appearance picker. */
5
+ export function GeneralSection({ notifications, onNotificationsToggle, onOpenAppearance, }) {
6
+ const { colorScheme } = useColorScheme();
7
+ return (<SettingsSection title="GENERAL">
8
+ <SettingsRow icon="notifications-outline" label="Notifications" subtitle="Security alerts and reminders" toggle value={notifications} onValueChange={onNotificationsToggle}/>
9
+ <SettingsRow icon="color-palette-outline" label="Appearance" subtitle={colorScheme === "dark" ? "Dark" : "Light"} onPress={onOpenAppearance} showChevron={Boolean(onOpenAppearance)}/>
10
+ </SettingsSection>);
11
+ }
12
+ //# sourceMappingURL=GeneralSection.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeneralSection.jsx","sourceRoot":"","sources":["../../../src/components/settings/GeneralSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAU/D,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,qBAAqB,EACrB,gBAAgB,GACI;IACpB,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;IACzC,OAAO,CACL,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAC9B;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,uBAAuB,CAC5B,KAAK,CAAC,eAAe,CACrB,QAAQ,CAAC,+BAA+B,CACxC,MAAM,CACN,KAAK,CAAC,CAAC,aAAa,CAAC,CACrB,aAAa,CAAC,CAAC,qBAAqB,CAAC,EAEvC;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,uBAAuB,CAC5B,KAAK,CAAC,YAAY,CAClB,QAAQ,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CACpD,OAAO,CAAC,CAAC,gBAAgB,CAAC,CAC1B,WAAW,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAE3C;IAAA,EAAE,eAAe,CAAC,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ export interface SupportSectionProps {
3
+ onClose: () => void;
4
+ /** Wire to the app's help screen / web URL. Optional. */
5
+ onOpenHelp?: () => void;
6
+ /** Wire to the app's about modal / screen. Optional. */
7
+ onOpenAbout?: () => void;
8
+ }
9
+ /** Generic SUPPORT section — Help, About, Privacy Policy, Terms of Service. */
10
+ export declare function SupportSection({ onClose, onOpenHelp, onOpenAbout }: SupportSectionProps): React.JSX.Element;
11
+ //# sourceMappingURL=SupportSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupportSection.d.ts","sourceRoot":"","sources":["../../../src/components/settings/SupportSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,mBAAmB,qBAsCvF"}
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { useNavigation } from "../../context/NavigationContext";
3
+ import { SettingsRow, SettingsSection } from "../settings-row";
4
+ import { useAppConfig } from "../../context/AppConfigContext";
5
+ /** Generic SUPPORT section — Help, About, Privacy Policy, Terms of Service. */
6
+ export function SupportSection({ onClose, onOpenHelp, onOpenAbout }) {
7
+ const router = useNavigation();
8
+ const { routes } = useAppConfig();
9
+ return (<SettingsSection title="SUPPORT">
10
+ <SettingsRow icon="help-circle-outline" label="Help & Support" onPress={onOpenHelp} showChevron={Boolean(onOpenHelp)}/>
11
+ <SettingsRow icon="information-circle-outline" label="About" onPress={onOpenAbout} showChevron={Boolean(onOpenAbout)}/>
12
+ <SettingsRow icon="document-text-outline" label="Privacy Policy" onPress={() => {
13
+ onClose();
14
+ router.push(routes.privacyPolicy);
15
+ }} showChevron/>
16
+ <SettingsRow icon="document-outline" label="Terms of Service" onPress={() => {
17
+ onClose();
18
+ router.push(routes.termsOfService);
19
+ }} showChevron/>
20
+ </SettingsSection>);
21
+ }
22
+ //# sourceMappingURL=SupportSection.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupportSection.jsx","sourceRoot":"","sources":["../../../src/components/settings/SupportSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAU9D,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAuB;IACtF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAElC,OAAO,CACL,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,CAC9B;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,qBAAqB,CAC1B,KAAK,CAAC,gBAAgB,CACtB,OAAO,CAAC,CAAC,UAAU,CAAC,CACpB,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAEnC;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,4BAA4B,CACjC,KAAK,CAAC,OAAO,CACb,OAAO,CAAC,CAAC,WAAW,CAAC,CACrB,WAAW,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAEpC;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,uBAAuB,CAC5B,KAAK,CAAC,gBAAgB,CACtB,OAAO,CAAC,CAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC,CAAC,CACF,WAAW,EAEb;MAAA,CAAC,WAAW,CACV,IAAI,CAAC,kBAAkB,CACvB,KAAK,CAAC,kBAAkB,CACxB,OAAO,CAAC,CAAC,GAAG,EAAE;YACZ,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC,CAAC,CACF,WAAW,EAEf;IAAA,EAAE,eAAe,CAAC,CACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { AccountSection, type AccountSectionProps } from "./AccountSection";
2
+ export { GeneralSection, type GeneralSectionProps } from "./GeneralSection";
3
+ export { SupportSection, type SupportSectionProps } from "./SupportSection";
4
+ export { DangerZoneSection, type DangerZoneSectionProps } from "./DangerZoneSection";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { AccountSection } from "./AccountSection";
2
+ export { GeneralSection } from "./GeneralSection";
3
+ export { SupportSection } from "./SupportSection";
4
+ export { DangerZoneSection } from "./DangerZoneSection";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/settings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAA4B,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAA4B,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAA+B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { Ionicons } from "@expo/vector-icons";
3
+ export interface SettingsRowProps {
4
+ icon: keyof typeof Ionicons.glyphMap;
5
+ label: string;
6
+ subtitle?: string;
7
+ onPress?: () => void;
8
+ showChevron?: boolean;
9
+ toggle?: boolean;
10
+ value?: boolean;
11
+ onValueChange?: (value: boolean) => void;
12
+ destructive?: boolean;
13
+ }
14
+ /**
15
+ * Horizontal row used inside settings dialogs / panels. Combines an icon
16
+ * tile, label + optional subtitle, and a trailing switch *or* chevron.
17
+ * `destructive` recolors the label + icon to the destructive token.
18
+ */
19
+ export declare function SettingsRow({ icon, label, subtitle, onPress, showChevron, toggle, value, onValueChange, destructive, }: SettingsRowProps): React.JSX.Element;
20
+ export interface SettingsSectionProps {
21
+ title: string;
22
+ destructive?: boolean;
23
+ children: React.ReactNode;
24
+ }
25
+ /** Group container for `SettingsRow`s. Renders the section title + a
26
+ * bordered card around its children. */
27
+ export declare function SettingsSection({ title, destructive, children }: SettingsSectionProps): React.JSX.Element;
28
+ //# sourceMappingURL=settings-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-row.d.ts","sourceRoot":"","sources":["../../src/components/settings-row.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,OAAO,QAAQ,CAAC,QAAQ,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,MAAM,EACN,KAAK,EACL,aAAa,EACb,WAAW,GACZ,EAAE,gBAAgB,qBAiElB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;yCACyC;AACzC,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,oBAAoB,qBAgBrF"}
@@ -0,0 +1,68 @@
1
+ import React from "react";
2
+ import { Pressable, Switch, View } from "react-native";
3
+ import { Ionicons } from "@expo/vector-icons";
4
+ import { useColorScheme } from "nativewind";
5
+ import { cn } from "../utils/cn";
6
+ import { MutedText, Text } from "./text";
7
+ /**
8
+ * Horizontal row used inside settings dialogs / panels. Combines an icon
9
+ * tile, label + optional subtitle, and a trailing switch *or* chevron.
10
+ * `destructive` recolors the label + icon to the destructive token.
11
+ */
12
+ export function SettingsRow({ icon, label, subtitle, onPress, showChevron, toggle, value, onValueChange, destructive, }) {
13
+ const { colorScheme } = useColorScheme();
14
+ const isDark = colorScheme === "dark";
15
+ const Wrapper = onPress ? Pressable : View;
16
+ // Toggle-mode rows tap-to-switch and also surface the switch
17
+ // itself — both surfaces need the label as their accessible name
18
+ // so a screen reader doesn't announce "Switch, on" with no
19
+ // context. The Switch carries `accessibilityState` so AT can
20
+ // announce the on/off state.
21
+ const wrapperProps = onPress
22
+ ? {
23
+ onPress,
24
+ accessibilityRole: "button",
25
+ accessibilityLabel: label,
26
+ ...(subtitle ? { accessibilityHint: subtitle } : {}),
27
+ }
28
+ : {};
29
+ let iconColor;
30
+ if (destructive) {
31
+ iconColor = "#EF4444";
32
+ }
33
+ else if (isDark) {
34
+ iconColor = "#FFFFFF";
35
+ }
36
+ else {
37
+ iconColor = "#000000";
38
+ }
39
+ return (<Wrapper className="flex-row items-center border-b border-border px-3 py-3 last:border-b-0 dark:border-neutral-800" {...wrapperProps}>
40
+ <View className="mr-3 h-8 w-8 items-center justify-center rounded-md bg-secondary dark:bg-neutral-800">
41
+ <Ionicons name={icon} size={16} color={iconColor}/>
42
+ </View>
43
+ <View className="flex-1">
44
+ <Text className={cn("text-sm font-medium", destructive ? "text-destructive" : "text-foreground")}>
45
+ {label}
46
+ </Text>
47
+ {subtitle ? <MutedText className="text-xs">{subtitle}</MutedText> : null}
48
+ </View>
49
+ {toggle ? (<Switch value={value} onValueChange={onValueChange} accessibilityLabel={label} accessibilityState={{ checked: value === true }} trackColor={{
50
+ false: isDark ? "#404040" : "#D4D4D4",
51
+ true: isDark ? "#FFFFFF" : "#000000",
52
+ }} thumbColor={isDark ? "#000000" : "#FFFFFF"}/>) : null}
53
+ {showChevron ? (<Ionicons name="chevron-forward" size={16} color={isDark ? "#525252" : "#A3A3A3"}/>) : null}
54
+ </Wrapper>);
55
+ }
56
+ /** Group container for `SettingsRow`s. Renders the section title + a
57
+ * bordered card around its children. */
58
+ export function SettingsSection({ title, destructive, children }) {
59
+ return (<View>
60
+ <Text className={cn("mb-2 text-xs font-semibold tracking-wider", destructive ? "text-destructive" : "text-muted-foreground")}>
61
+ {title}
62
+ </Text>
63
+ <View className="rounded-lg border border-border bg-card dark:border-neutral-800 dark:bg-neutral-900/50">
64
+ {children}
65
+ </View>
66
+ </View>);
67
+ }
68
+ //# sourceMappingURL=settings-row.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-row.jsx","sourceRoot":"","sources":["../../src/components/settings-row.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { type ViewProps } from "react-native";
3
+ interface SkeletonProps extends ViewProps {
4
+ className?: string;
5
+ }
6
+ export declare const Skeleton: React.NamedExoticComponent<SkeletonProps>;
7
+ export {};
8
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAY9C,UAAU,aAAc,SAAQ,SAAS;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,QAAQ,2CA8BnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import React, { useEffect } from "react";
2
+ import Animated, { cancelAnimation, useAnimatedStyle, useSharedValue, withRepeat, withSequence, withTiming, } from "react-native-reanimated";
3
+ import { useColorScheme } from "nativewind";
4
+ import { cn } from "../utils/cn";
5
+ export const Skeleton = React.memo(function Skeleton({ className, ...props }) {
6
+ const { colorScheme } = useColorScheme();
7
+ const isDark = colorScheme === "dark";
8
+ const opacity = useSharedValue(0.4);
9
+ useEffect(() => {
10
+ opacity.value = withRepeat(withSequence(withTiming(1, { duration: 750 }), withTiming(0.4, { duration: 750 })), -1);
11
+ // Cancel the infinite repeat on unmount. Without this the worklet
12
+ // keeps running until the shared value is GC'd, which in long
13
+ // FlashList re-cycles (skeleton → loaded item → skeleton) leaves
14
+ // orphan animations alive.
15
+ return () => {
16
+ cancelAnimation(opacity);
17
+ };
18
+ }, [opacity]);
19
+ const animatedStyle = useAnimatedStyle(() => ({
20
+ opacity: opacity.value,
21
+ }));
22
+ return (<Animated.View className={cn("rounded-md", isDark ? "bg-neutral-800" : "bg-neutral-200", className)} style={animatedStyle} {...props}/>);
23
+ });
24
+ //# sourceMappingURL=skeleton.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.jsx","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,QAAQ,EAAE,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,YAAY,EACZ,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAMjC,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAiB;IACzF,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,WAAW,KAAK,MAAM,CAAC;IACtC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEpC,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,KAAK,GAAG,UAAU,CACxB,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAClF,CAAC,CAAC,CACH,CAAC;QACF,kEAAkE;QAClE,8DAA8D;QAC9D,iEAAiE;QACjE,2BAA2B;QAC3B,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,OAAO,CAAC,KAAK;KACvB,CAAC,CAAC,CAAC;IAEJ,OAAO,CACL,CAAC,QAAQ,CAAC,IAAI,CACZ,SAAS,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CACrF,KAAK,CAAC,CAAC,aAAa,CAAC,CACrB,IAAI,KAAK,CAAC,EACV,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ export interface SocialConnectionsProps {
3
+ onApple?: () => void;
4
+ onGoogle?: () => void;
5
+ onMicrosoft?: () => void;
6
+ }
7
+ /**
8
+ * Three-up button row for federated sign-in (Apple / Google / Microsoft).
9
+ * Each handler is optional — providers with no handler still render but
10
+ * fire no action; this matches the "coming soon" UX the consumer apps
11
+ * use during the staged rollout.
12
+ */
13
+ export declare function SocialConnections({ onApple, onGoogle, onMicrosoft, }: SocialConnectionsProps): React.JSX.Element;
14
+ export default SocialConnections;
15
+ //# sourceMappingURL=social-connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-connections.d.ts","sourceRoot":"","sources":["../../src/components/social-connections.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAQD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,WAAW,GACZ,EAAE,sBAAsB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyB5C;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import { Pressable, View } from "react-native";
3
+ import { Ionicons } from "@expo/vector-icons";
4
+ import { useColorScheme } from "nativewind";
5
+ const PROVIDERS = [
6
+ { key: "apple", icon: "logo-apple" },
7
+ { key: "google", icon: "logo-google" },
8
+ { key: "microsoft", icon: "logo-microsoft" },
9
+ ];
10
+ /**
11
+ * Three-up button row for federated sign-in (Apple / Google / Microsoft).
12
+ * Each handler is optional — providers with no handler still render but
13
+ * fire no action; this matches the "coming soon" UX the consumer apps
14
+ * use during the staged rollout.
15
+ */
16
+ export function SocialConnections({ onApple, onGoogle, onMicrosoft, }) {
17
+ const { colorScheme } = useColorScheme();
18
+ const isDark = colorScheme === "dark";
19
+ const handlers = {
20
+ apple: onApple,
21
+ google: onGoogle,
22
+ microsoft: onMicrosoft,
23
+ };
24
+ return (<View className="w-full flex-row items-center justify-center gap-3">
25
+ {PROVIDERS.map(({ key, icon }) => (<Pressable key={key} onPress={handlers[key]} className="h-12 w-12 items-center justify-center rounded-lg border border-border dark:border-neutral-600 active:opacity-70" accessibilityRole="button" accessibilityLabel={`Sign in with ${key}`}>
26
+ <Ionicons name={icon} size={22} color={isDark ? "#FFFFFF" : "#000000"}/>
27
+ </Pressable>))}
28
+ </View>);
29
+ }
30
+ export default SocialConnections;
31
+ //# sourceMappingURL=social-connections.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-connections.jsx","sourceRoot":"","sources":["../../src/components/social-connections.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQ5C,MAAM,SAAS,GAAG;IAChB,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,YAAqB,EAAE;IAC7C,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAsB,EAAE;IAC/C,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAyB,EAAE;CAC7C,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,WAAW,GACY;IACvB,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,WAAW,KAAK,MAAM,CAAC;IAEtC,MAAM,QAAQ,GAA6C;QACzD,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;KACvB,CAAC;IAEF,OAAO,CACL,CAAC,IAAI,CAAC,SAAS,CAAC,mDAAmD,CACjE;MAAA,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAChC,CAAC,SAAS,CACR,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACvB,SAAS,CAAC,iHAAiH,CAC3H,iBAAiB,CAAC,QAAQ,CAC1B,kBAAkB,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAE1C;UAAA,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EACxE;QAAA,EAAE,SAAS,CAAC,CACb,CAAC,CACJ;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import React from "react";
2
+ /** Direction of a stat's delta — drives the trend colour. */
3
+ export type StatTrend = "up" | "down" | "neutral";
4
+ export interface StatCardProps {
5
+ /** Short label describing the metric (e.g. "Active users"). */
6
+ label: string;
7
+ /** The headline value. Numbers are rendered as-is; format upstream. */
8
+ value: string | number;
9
+ /** Optional leading icon slot (e.g. a lucide / Ionicons element). */
10
+ icon?: React.ReactNode;
11
+ /** Optional change indicator text (e.g. "+12% this week"). */
12
+ delta?: string;
13
+ /** Trend direction — colours the delta. Defaults to "neutral". */
14
+ trend?: StatTrend;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Map a trend direction to its delta text colour class. Pure so the
19
+ * trend→colour contract is unit-testable without a render host.
20
+ */
21
+ export declare function trendColorClass(trend: StatTrend): string;
22
+ /**
23
+ * Dashboard stat tile: a label, a prominent value, an optional leading icon,
24
+ * and an optional trend/delta line. Composes `Card` + `Text` so the surface,
25
+ * border, and typography stay in lockstep with the rest of the system rather
26
+ * than duplicating styles.
27
+ */
28
+ export declare function StatCard({ label, value, icon, delta, trend, className, }: StatCardProps): React.JSX.Element;
29
+ //# sourceMappingURL=stat-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-card.d.ts","sourceRoot":"","sources":["../../src/components/stat-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,qEAAqE;IACrE,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAiB,EACjB,SAAS,GACV,EAAE,aAAa,qBAWf"}
@@ -0,0 +1,36 @@
1
+ import React from "react";
2
+ import { View } from "react-native";
3
+ import { cn } from "../utils/cn";
4
+ import { Card } from "./card";
5
+ import { MutedText, Text } from "./text";
6
+ // Trend → delta text colour. Tokens only (success/destructive/muted) so each
7
+ // consuming app's palette flows through; no hardcoded hex.
8
+ const trendClass = {
9
+ up: "text-success",
10
+ down: "text-destructive",
11
+ neutral: "text-muted-foreground dark:text-neutral-400",
12
+ };
13
+ /**
14
+ * Map a trend direction to its delta text colour class. Pure so the
15
+ * trend→colour contract is unit-testable without a render host.
16
+ */
17
+ export function trendColorClass(trend) {
18
+ return trendClass[trend];
19
+ }
20
+ /**
21
+ * Dashboard stat tile: a label, a prominent value, an optional leading icon,
22
+ * and an optional trend/delta line. Composes `Card` + `Text` so the surface,
23
+ * border, and typography stay in lockstep with the rest of the system rather
24
+ * than duplicating styles.
25
+ */
26
+ export function StatCard({ label, value, icon, delta, trend = "neutral", className, }) {
27
+ return (<Card className={cn("p-5", className)} accessibilityRole="summary">
28
+ <View className="flex-row items-start justify-between">
29
+ <MutedText className="text-sm">{label}</MutedText>
30
+ {icon ? <View className="ml-2">{icon}</View> : null}
31
+ </View>
32
+ <Text className="mt-2 text-3xl font-bold text-foreground dark:text-white">{value}</Text>
33
+ {delta ? <Text className={cn("mt-1 text-xs", trendColorClass(trend))}>{delta}</Text> : null}
34
+ </Card>);
35
+ }
36
+ //# sourceMappingURL=stat-card.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stat-card.jsx","sourceRoot":"","sources":["../../src/components/stat-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAmBzC,6EAA6E;AAC7E,2DAA2D;AAC3D,MAAM,UAAU,GAA8B;IAC5C,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,6CAA6C;CACvD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAgB;IAC9C,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,GAAG,SAAS,EACjB,SAAS,GACK;IACd,OAAO,CACL,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAChE;MAAA,CAAC,IAAI,CAAC,SAAS,CAAC,sCAAsC,CACpD;QAAA,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,CACjD;QAAA,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CACrD;MAAA,EAAE,IAAI,CACN;MAAA,CAAC,IAAI,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CACvF;MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAC7F;IAAA,EAAE,IAAI,CAAC,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ export interface TagChipProps {
3
+ name: string;
4
+ /** Accent color for the tag. Accepts `rgb(r, g, b)` or `#rrggbb`. */
5
+ color?: string | null;
6
+ selected?: boolean;
7
+ onPress?: () => void;
8
+ size?: "sm" | "md";
9
+ }
10
+ /**
11
+ * Compact chip used to display a tag — icon + name with a soft accent
12
+ * border. When `selected` is true the border + background pick up the
13
+ * accent at full opacity / 18% fill respectively.
14
+ */
15
+ export declare function TagChip({ name, color, selected, onPress, size }: TagChipProps): React.JSX.Element;
16
+ /** Tints an `rgb(...)` or `#rrggbb` color with the given alpha 0..1. */
17
+ export declare function withAlpha(color: string, alpha: number): string;
18
+ //# sourceMappingURL=tag-chip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-chip.d.ts","sourceRoot":"","sources":["../../src/components/tag-chip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAW,EAAE,EAAE,YAAY,qBA2CpF;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW9D"}
@@ -0,0 +1,54 @@
1
+ import React from "react";
2
+ import { Pressable, View } from "react-native";
3
+ import { Ionicons } from "@expo/vector-icons";
4
+ import { useColorScheme } from "nativewind";
5
+ import { Text } from "./text";
6
+ /**
7
+ * Compact chip used to display a tag — icon + name with a soft accent
8
+ * border. When `selected` is true the border + background pick up the
9
+ * accent at full opacity / 18% fill respectively.
10
+ */
11
+ export function TagChip({ name, color, selected, onPress, size = "sm" }) {
12
+ const { colorScheme } = useColorScheme();
13
+ const isDark = colorScheme === "dark";
14
+ const accent = color ?? (isDark ? "rgb(163, 163, 163)" : "rgb(115, 115, 115)");
15
+ const dims = size === "sm"
16
+ ? { paddingH: 8, paddingV: 3, fontSize: 11, iconSize: 10 }
17
+ : { paddingH: 10, paddingV: 5, fontSize: 12, iconSize: 12 };
18
+ const inner = (<View style={{
19
+ flexDirection: "row",
20
+ alignItems: "center",
21
+ gap: 4,
22
+ paddingHorizontal: dims.paddingH,
23
+ paddingVertical: dims.paddingV,
24
+ borderRadius: 6,
25
+ borderWidth: 1,
26
+ borderColor: selected ? accent : withAlpha(accent, 0.33),
27
+ backgroundColor: selected ? withAlpha(accent, 0.18) : "transparent",
28
+ }}>
29
+ <Ionicons name="pricetag-outline" size={dims.iconSize} color={accent}/>
30
+ <Text className="text-foreground" style={{ fontSize: dims.fontSize }}>
31
+ {name}
32
+ </Text>
33
+ </View>);
34
+ if (!onPress) {
35
+ return inner;
36
+ }
37
+ return (<Pressable onPress={onPress} hitSlop={4} style={({ pressed }) => ({ opacity: pressed ? 0.7 : 1 })}>
38
+ {inner}
39
+ </Pressable>);
40
+ }
41
+ /** Tints an `rgb(...)` or `#rrggbb` color with the given alpha 0..1. */
42
+ export function withAlpha(color, alpha) {
43
+ const rgb = color.match(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i);
44
+ if (rgb) {
45
+ return `rgba(${rgb[1]}, ${rgb[2]}, ${rgb[3]}, ${alpha})`;
46
+ }
47
+ const hex = color.match(/^#([0-9a-f]{6})$/i);
48
+ if (hex) {
49
+ const h = hex[1] ?? "";
50
+ return `rgba(${parseInt(h.slice(0, 2), 16)}, ${parseInt(h.slice(2, 4), 16)}, ${parseInt(h.slice(4, 6), 16)}, ${alpha})`;
51
+ }
52
+ return color;
53
+ }
54
+ //# sourceMappingURL=tag-chip.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-chip.jsx","sourceRoot":"","sources":["../../src/components/tag-chip.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import React from "react";
2
+ import { Ionicons } from "@expo/vector-icons";
3
+ export interface TagOption {
4
+ id: string;
5
+ name: string;
6
+ /** Accent color used for the chip border + icon (defaults to muted). */
7
+ color?: string | null;
8
+ }
9
+ export interface TagMultiSelectProps<T extends TagOption> {
10
+ tags: T[];
11
+ selectedIds: string[];
12
+ onToggle: (tagId: string) => void;
13
+ /** Resolves the Ionicons glyph for a tag. Defaults to `pricetag`. */
14
+ iconFor?: (tag: T) => keyof typeof Ionicons.glyphMap;
15
+ /** Pixel cap on the scrollable list height. Defaults to 240. */
16
+ listMaxHeight?: number;
17
+ }
18
+ /**
19
+ * Searchable multi-select picker for tags / labels. Designed for lists
20
+ * that can be in the thousands — the list scrolls, fuzzy filters by
21
+ * name, and selected items appear as removable chips above the search.
22
+ *
23
+ * Generic over the tag shape; pass `iconFor` to map your tag's icon
24
+ * value onto an Ionicons glyph.
25
+ */
26
+ export declare function TagMultiSelect<T extends TagOption>({ tags, selectedIds, onToggle, iconFor, listMaxHeight, }: TagMultiSelectProps<T>): React.JSX.Element;
27
+ //# sourceMappingURL=tag-multi-select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-multi-select.d.ts","sourceRoot":"","sources":["../../src/components/tag-multi-select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,SAAS;IACtD,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,OAAO,QAAQ,CAAC,QAAQ,CAAC;IACrD,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,EAClD,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,aAAmB,GACpB,EAAE,mBAAmB,CAAC,CAAC,CAAC,qBAiGxB"}
@@ -0,0 +1,65 @@
1
+ import React, { useMemo, useState } from "react";
2
+ import { Pressable, ScrollView, View } from "react-native";
3
+ import { Ionicons } from "@expo/vector-icons";
4
+ import { useColorScheme } from "nativewind";
5
+ import { MutedText, Text } from "./text";
6
+ import { SearchInput } from "./input";
7
+ /**
8
+ * Searchable multi-select picker for tags / labels. Designed for lists
9
+ * that can be in the thousands — the list scrolls, fuzzy filters by
10
+ * name, and selected items appear as removable chips above the search.
11
+ *
12
+ * Generic over the tag shape; pass `iconFor` to map your tag's icon
13
+ * value onto an Ionicons glyph.
14
+ */
15
+ export function TagMultiSelect({ tags, selectedIds, onToggle, iconFor, listMaxHeight = 240, }) {
16
+ const { colorScheme } = useColorScheme();
17
+ const isDark = colorScheme === "dark";
18
+ const mutedColor = isDark ? "#A3A3A3" : "#737373";
19
+ const [query, setQuery] = useState("");
20
+ const selectedSet = useMemo(() => new Set(selectedIds), [selectedIds]);
21
+ const selectedTags = useMemo(() => selectedIds.map((id) => tags.find((t) => t.id === id)).filter((t) => !!t), [selectedIds, tags]);
22
+ const filteredTags = useMemo(() => {
23
+ const q = query.trim().toLowerCase();
24
+ if (!q) {
25
+ return tags;
26
+ }
27
+ return tags.filter((t) => t.name.toLowerCase().includes(q));
28
+ }, [query, tags]);
29
+ const resolveIcon = (tag) => iconFor ? iconFor(tag) : "pricetag";
30
+ return (<View className="gap-2">
31
+ {selectedTags.length > 0 && (<View className="flex-row flex-wrap gap-1.5">
32
+ {selectedTags.map((tag) => {
33
+ const accent = tag.color ?? mutedColor;
34
+ return (<Pressable key={tag.id} onPress={() => onToggle(tag.id)} className="flex-row items-center gap-1 rounded-md border px-2 py-1 active:opacity-70" style={{ borderColor: `${accent}55` }} accessibilityLabel={`Remove tag ${tag.name}`} accessibilityRole="button">
35
+ <Ionicons name={resolveIcon(tag)} size={12} color={accent}/>
36
+ <Text className="text-xs text-foreground">{tag.name}</Text>
37
+ <Ionicons name="close-circle" size={14} color={mutedColor}/>
38
+ </Pressable>);
39
+ })}
40
+ </View>)}
41
+
42
+ <SearchInput value={query} onChangeText={setQuery} placeholder={`Search ${tags.length} tag${tags.length === 1 ? "" : "s"}...`} accessibilityLabel="Search tags"/>
43
+
44
+ <View className="rounded-lg border border-border dark:border-neutral-800" style={{ maxHeight: listMaxHeight }}>
45
+ {filteredTags.length === 0 ? (<View className="p-4">
46
+ <MutedText className="text-center text-sm italic">
47
+ {query ? `No tags match "${query}"` : "No tags yet"}
48
+ </MutedText>
49
+ </View>) : (<ScrollView keyboardShouldPersistTaps="handled">
50
+ {filteredTags.map((tag) => {
51
+ const selected = selectedSet.has(tag.id);
52
+ const accent = tag.color ?? mutedColor;
53
+ const selectedColor = isDark ? "#FFFFFF" : "#000000";
54
+ const checkboxColor = selected ? selectedColor : mutedColor;
55
+ return (<Pressable key={tag.id} onPress={() => onToggle(tag.id)} accessibilityLabel={`${selected ? "Deselect" : "Select"} tag ${tag.name}`} accessibilityRole="checkbox" accessibilityState={{ checked: selected }} className="flex-row items-center gap-2 px-3 py-2 active:bg-neutral-100 dark:active:bg-neutral-800">
56
+ <Ionicons name={selected ? "checkbox" : "square-outline"} size={18} color={checkboxColor}/>
57
+ <Ionicons name={resolveIcon(tag)} size={14} color={accent}/>
58
+ <Text className="flex-1 text-sm text-foreground">{tag.name}</Text>
59
+ </Pressable>);
60
+ })}
61
+ </ScrollView>)}
62
+ </View>
63
+ </View>);
64
+ }
65
+ //# sourceMappingURL=tag-multi-select.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-multi-select.jsx","sourceRoot":"","sources":["../../src/components/tag-multi-select.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import { type TextProps as RNTextProps } from "react-native";
3
+ export interface TextProps extends RNTextProps {
4
+ className?: string;
5
+ children?: React.ReactNode;
6
+ }
7
+ /**
8
+ * Text component with NativeWind styling. Provides consistent typography
9
+ * across consumer apps with dark-mode support.
10
+ */
11
+ export declare function Text({ className, children, ...props }: TextProps): React.JSX.Element;
12
+ /** Heading variant with larger size and bold weight. */
13
+ export declare function Heading({ className, children, ...props }: TextProps): React.JSX.Element;
14
+ /** Label variant for form labels and small text. */
15
+ export declare function Label({ className, children, ...props }: TextProps): React.JSX.Element;
16
+ /** Muted text variant for less prominent content. */
17
+ export declare function MutedText({ className, children, ...props }: TextProps): React.JSX.Element;
18
+ /** Monospace text variant for codes, passwords, and technical content. */
19
+ export declare function MonoText({ className, children, ...props }: TextProps): React.JSX.Element;
20
+ /** Error text variant for validation messages. */
21
+ export declare function ErrorText({ className, children, ...props }: TextProps): React.JSX.Element;
22
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/components/text.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAkB,KAAK,SAAS,IAAI,WAAW,EAAE,MAAM,cAAc,CAAC;AAG7E,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBAMhE;AAED,wDAAwD;AACxD,wBAAgB,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBASnE;AAED,oDAAoD;AACpD,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBASjE;AAED,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBASrE;AAED,0EAA0E;AAC1E,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBASpE;AAED,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,qBAMrE"}