@atproto/oauth-provider 0.4.0 → 0.5.1

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 (402) hide show
  1. package/.linguirc +57 -0
  2. package/CHANGELOG.md +29 -0
  3. package/dist/account/account-manager.d.ts +17 -3
  4. package/dist/account/account-manager.d.ts.map +1 -1
  5. package/dist/account/account-manager.js +102 -8
  6. package/dist/account/account-manager.js.map +1 -1
  7. package/dist/account/account-store.d.ts +81 -15
  8. package/dist/account/account-store.d.ts.map +1 -1
  9. package/dist/account/account-store.js +70 -19
  10. package/dist/account/account-store.js.map +1 -1
  11. package/dist/account/sign-in-data.d.ts +28 -0
  12. package/dist/account/sign-in-data.d.ts.map +1 -0
  13. package/dist/account/sign-in-data.js +16 -0
  14. package/dist/account/sign-in-data.js.map +1 -0
  15. package/dist/account/sign-up-data.d.ts +26 -0
  16. package/dist/account/sign-up-data.d.ts.map +1 -0
  17. package/dist/account/sign-up-data.js +11 -0
  18. package/dist/account/sign-up-data.js.map +1 -0
  19. package/dist/assets/app/bundle-manifest.json +598 -6
  20. package/dist/assets/app/index-ItwwtJ8r.js +36 -0
  21. package/dist/assets/app/index-ItwwtJ8r.js.map +1 -0
  22. package/dist/assets/app/main-B_dNxQo_.js +4 -0
  23. package/dist/assets/app/main-B_dNxQo_.js.map +1 -0
  24. package/dist/assets/app/main-CSatvmRR.css +3 -0
  25. package/dist/assets/app/main-CSatvmRR.js +306 -0
  26. package/dist/assets/app/main-CSatvmRR.js.map +1 -0
  27. package/dist/assets/app/messages-BQeltXSF.js +4 -0
  28. package/dist/assets/app/messages-BQeltXSF.js.map +1 -0
  29. package/dist/assets/app/messages-BQkEhfjg.js +4 -0
  30. package/dist/assets/app/messages-BQkEhfjg.js.map +1 -0
  31. package/dist/assets/app/messages-BUjKj_UJ.js +4 -0
  32. package/dist/assets/app/messages-BUjKj_UJ.js.map +1 -0
  33. package/dist/assets/app/messages-BWIQa8fO.js +4 -0
  34. package/dist/assets/app/messages-BWIQa8fO.js.map +1 -0
  35. package/dist/assets/app/messages-BaNVb0bp.js +4 -0
  36. package/dist/assets/app/messages-BaNVb0bp.js.map +1 -0
  37. package/dist/assets/app/messages-BaizVXcF.js +4 -0
  38. package/dist/assets/app/messages-BaizVXcF.js.map +1 -0
  39. package/dist/assets/app/messages-BfoClA1Y.js +4 -0
  40. package/dist/assets/app/messages-BfoClA1Y.js.map +1 -0
  41. package/dist/assets/app/messages-BsKGDZnC.js +4 -0
  42. package/dist/assets/app/messages-BsKGDZnC.js.map +1 -0
  43. package/dist/assets/app/messages-Bu-TJhml.js +4 -0
  44. package/dist/assets/app/messages-Bu-TJhml.js.map +1 -0
  45. package/dist/assets/app/messages-BvOKnBQk.js +4 -0
  46. package/dist/assets/app/messages-BvOKnBQk.js.map +1 -0
  47. package/dist/assets/app/messages-BxDzCiWz.js +4 -0
  48. package/dist/assets/app/messages-BxDzCiWz.js.map +1 -0
  49. package/dist/assets/app/messages-CDgFOy4S.js +4 -0
  50. package/dist/assets/app/messages-CDgFOy4S.js.map +1 -0
  51. package/dist/assets/app/messages-CLbTz0o9.js +4 -0
  52. package/dist/assets/app/messages-CLbTz0o9.js.map +1 -0
  53. package/dist/assets/app/messages-CNwSh0t7.js +4 -0
  54. package/dist/assets/app/messages-CNwSh0t7.js.map +1 -0
  55. package/dist/assets/app/messages-CSMNJ6P8.js +4 -0
  56. package/dist/assets/app/messages-CSMNJ6P8.js.map +1 -0
  57. package/dist/assets/app/messages-CZQUw3mp.js +4 -0
  58. package/dist/assets/app/messages-CZQUw3mp.js.map +1 -0
  59. package/dist/assets/app/messages-CZT41oVp.js +4 -0
  60. package/dist/assets/app/messages-CZT41oVp.js.map +1 -0
  61. package/dist/assets/app/messages-C_b-d3t8.js +4 -0
  62. package/dist/assets/app/messages-C_b-d3t8.js.map +1 -0
  63. package/dist/assets/app/messages-C_u3MTc2.js +4 -0
  64. package/dist/assets/app/messages-C_u3MTc2.js.map +1 -0
  65. package/dist/assets/app/messages-Cn8nHZic.js +4 -0
  66. package/dist/assets/app/messages-Cn8nHZic.js.map +1 -0
  67. package/dist/assets/app/messages-CtDywJUm.js +4 -0
  68. package/dist/assets/app/messages-CtDywJUm.js.map +1 -0
  69. package/dist/assets/app/messages-CurtIjBF.js +4 -0
  70. package/dist/assets/app/messages-CurtIjBF.js.map +1 -0
  71. package/dist/assets/app/messages-Cv6zIbaP.js +4 -0
  72. package/dist/assets/app/messages-Cv6zIbaP.js.map +1 -0
  73. package/dist/assets/app/messages-D1eLQuPE.js +4 -0
  74. package/dist/assets/app/messages-D1eLQuPE.js.map +1 -0
  75. package/dist/assets/app/messages-D8vHEaYW.js +4 -0
  76. package/dist/assets/app/messages-D8vHEaYW.js.map +1 -0
  77. package/dist/assets/app/messages-DJ1Q4GeC.js +4 -0
  78. package/dist/assets/app/messages-DJ1Q4GeC.js.map +1 -0
  79. package/dist/assets/app/messages-DRL3exqd.js +4 -0
  80. package/dist/assets/app/messages-DRL3exqd.js.map +1 -0
  81. package/dist/assets/app/messages-DWLPQRTp.js +4 -0
  82. package/dist/assets/app/messages-DWLPQRTp.js.map +1 -0
  83. package/dist/assets/app/messages-DjVaE9YE.js +4 -0
  84. package/dist/assets/app/messages-DjVaE9YE.js.map +1 -0
  85. package/dist/assets/app/messages-DqpMfFJR.js +4 -0
  86. package/dist/assets/app/messages-DqpMfFJR.js.map +1 -0
  87. package/dist/assets/app/messages-ETjhJBEN.js +4 -0
  88. package/dist/assets/app/messages-ETjhJBEN.js.map +1 -0
  89. package/dist/assets/app/messages-EUKrgrGn.js +4 -0
  90. package/dist/assets/app/messages-EUKrgrGn.js.map +1 -0
  91. package/dist/assets/app/messages-QQrOUcPW.js +4 -0
  92. package/dist/assets/app/messages-QQrOUcPW.js.map +1 -0
  93. package/dist/assets/app/messages-e2QGqFL6.js +4 -0
  94. package/dist/assets/app/messages-e2QGqFL6.js.map +1 -0
  95. package/dist/assets/app/messages-p61py7gD.js +4 -0
  96. package/dist/assets/app/messages-p61py7gD.js.map +1 -0
  97. package/dist/assets/asset.d.ts +1 -0
  98. package/dist/assets/asset.d.ts.map +1 -1
  99. package/dist/assets/assets-middleware.d.ts.map +1 -1
  100. package/dist/assets/assets-middleware.js +12 -7
  101. package/dist/assets/assets-middleware.js.map +1 -1
  102. package/dist/assets/index.d.ts +3 -2
  103. package/dist/assets/index.d.ts.map +1 -1
  104. package/dist/assets/index.js +13 -1
  105. package/dist/assets/index.js.map +1 -1
  106. package/dist/client/client-store.d.ts +3 -3
  107. package/dist/client/client-store.d.ts.map +1 -1
  108. package/dist/client/client-store.js +6 -5
  109. package/dist/client/client-store.js.map +1 -1
  110. package/dist/device/device-manager.d.ts +9 -8
  111. package/dist/device/device-manager.d.ts.map +1 -1
  112. package/dist/device/device-manager.js.map +1 -1
  113. package/dist/device/device-store.d.ts +3 -3
  114. package/dist/device/device-store.d.ts.map +1 -1
  115. package/dist/device/device-store.js +10 -9
  116. package/dist/device/device-store.js.map +1 -1
  117. package/dist/dpop/dpop-manager.d.ts +15 -7
  118. package/dist/dpop/dpop-manager.d.ts.map +1 -1
  119. package/dist/dpop/dpop-manager.js +17 -3
  120. package/dist/dpop/dpop-manager.js.map +1 -1
  121. package/dist/dpop/dpop-nonce.d.ts +11 -5
  122. package/dist/dpop/dpop-nonce.d.ts.map +1 -1
  123. package/dist/dpop/dpop-nonce.js +47 -38
  124. package/dist/dpop/dpop-nonce.js.map +1 -1
  125. package/dist/errors/handle-unavailable-error.d.ts +11 -0
  126. package/dist/errors/handle-unavailable-error.d.ts.map +1 -0
  127. package/dist/errors/handle-unavailable-error.js +19 -0
  128. package/dist/errors/handle-unavailable-error.js.map +1 -0
  129. package/dist/errors/invalid-request-error.d.ts +6 -8
  130. package/dist/errors/invalid-request-error.d.ts.map +1 -1
  131. package/dist/errors/invalid-request-error.js +10 -8
  132. package/dist/errors/invalid-request-error.js.map +1 -1
  133. package/dist/lib/csp/index.d.ts +18 -0
  134. package/dist/lib/csp/index.d.ts.map +1 -0
  135. package/dist/lib/csp/index.js +72 -0
  136. package/dist/lib/csp/index.js.map +1 -0
  137. package/dist/lib/hcaptcha.d.ts +177 -0
  138. package/dist/lib/hcaptcha.d.ts.map +1 -0
  139. package/dist/lib/hcaptcha.js +155 -0
  140. package/dist/lib/hcaptcha.js.map +1 -0
  141. package/dist/lib/html/build-document.d.ts +11 -3
  142. package/dist/lib/html/build-document.d.ts.map +1 -1
  143. package/dist/lib/html/build-document.js +51 -15
  144. package/dist/lib/html/build-document.js.map +1 -1
  145. package/dist/lib/http/middleware.d.ts.map +1 -1
  146. package/dist/lib/http/middleware.js +4 -1
  147. package/dist/lib/http/middleware.js.map +1 -1
  148. package/dist/lib/http/request.d.ts +5 -2
  149. package/dist/lib/http/request.d.ts.map +1 -1
  150. package/dist/lib/http/request.js +16 -1
  151. package/dist/lib/http/request.js.map +1 -1
  152. package/dist/lib/http/response.d.ts +4 -2
  153. package/dist/lib/http/response.d.ts.map +1 -1
  154. package/dist/lib/http/response.js +23 -5
  155. package/dist/lib/http/response.js.map +1 -1
  156. package/dist/lib/locale.d.ts +15 -0
  157. package/dist/lib/locale.d.ts.map +1 -0
  158. package/dist/lib/locale.js +17 -0
  159. package/dist/lib/locale.js.map +1 -0
  160. package/dist/lib/util/function.d.ts +2 -2
  161. package/dist/lib/util/function.d.ts.map +1 -1
  162. package/dist/lib/util/function.js.map +1 -1
  163. package/dist/lib/util/type.d.ts +88 -1
  164. package/dist/lib/util/type.d.ts.map +1 -1
  165. package/dist/lib/util/type.js +41 -0
  166. package/dist/lib/util/type.js.map +1 -1
  167. package/dist/metadata/build-metadata.d.ts +2 -2
  168. package/dist/metadata/build-metadata.d.ts.map +1 -1
  169. package/dist/metadata/build-metadata.js.map +1 -1
  170. package/dist/oauth-errors.d.ts +1 -0
  171. package/dist/oauth-errors.d.ts.map +1 -1
  172. package/dist/oauth-errors.js +3 -1
  173. package/dist/oauth-errors.js.map +1 -1
  174. package/dist/oauth-hooks.d.ts +60 -3
  175. package/dist/oauth-hooks.d.ts.map +1 -1
  176. package/dist/oauth-hooks.js +3 -3
  177. package/dist/oauth-hooks.js.map +1 -1
  178. package/dist/oauth-provider.d.ts +23 -18
  179. package/dist/oauth-provider.d.ts.map +1 -1
  180. package/dist/oauth-provider.js +207 -204
  181. package/dist/oauth-provider.js.map +1 -1
  182. package/dist/oauth-verifier.d.ts +1 -1
  183. package/dist/oauth-verifier.d.ts.map +1 -1
  184. package/dist/oauth-verifier.js +2 -1
  185. package/dist/oauth-verifier.js.map +1 -1
  186. package/dist/output/build-authorize-data.d.ts +0 -1
  187. package/dist/output/build-authorize-data.d.ts.map +1 -1
  188. package/dist/output/build-authorize-data.js +0 -1
  189. package/dist/output/build-authorize-data.js.map +1 -1
  190. package/dist/output/build-customization-data.d.ts +241 -0
  191. package/dist/output/build-customization-data.d.ts.map +1 -0
  192. package/dist/output/build-customization-data.js +174 -0
  193. package/dist/output/build-customization-data.js.map +1 -0
  194. package/dist/output/output-manager.d.ts +16 -9
  195. package/dist/output/output-manager.d.ts.map +1 -1
  196. package/dist/output/output-manager.js +78 -42
  197. package/dist/output/output-manager.js.map +1 -1
  198. package/dist/output/send-authorize-redirect.d.ts +9 -6
  199. package/dist/output/send-authorize-redirect.d.ts.map +1 -1
  200. package/dist/output/send-authorize-redirect.js +20 -14
  201. package/dist/output/send-authorize-redirect.js.map +1 -1
  202. package/dist/output/send-web-page.d.ts +7 -2
  203. package/dist/output/send-web-page.d.ts.map +1 -1
  204. package/dist/output/send-web-page.js +37 -21
  205. package/dist/output/send-web-page.js.map +1 -1
  206. package/dist/request/request-manager.d.ts +1 -1
  207. package/dist/request/request-manager.d.ts.map +1 -1
  208. package/dist/request/request-manager.js +4 -4
  209. package/dist/request/request-manager.js.map +1 -1
  210. package/dist/request/request-store.d.ts +3 -3
  211. package/dist/request/request-store.d.ts.map +1 -1
  212. package/dist/request/request-store.js +11 -10
  213. package/dist/request/request-store.js.map +1 -1
  214. package/dist/token/token-store.d.ts +4 -4
  215. package/dist/token/token-store.d.ts.map +1 -1
  216. package/dist/token/token-store.js +13 -12
  217. package/dist/token/token-store.js.map +1 -1
  218. package/package.json +43 -20
  219. package/rollup.config.js +61 -17
  220. package/src/account/account-manager.ts +159 -8
  221. package/src/account/account-store.ts +127 -32
  222. package/src/account/sign-in-data.ts +15 -0
  223. package/src/account/sign-up-data.ts +11 -0
  224. package/src/assets/app/app.tsx +31 -16
  225. package/src/assets/app/backend-data.ts +15 -60
  226. package/src/assets/app/backend-types.ts +66 -0
  227. package/src/assets/app/components/forms/button-toggle-visibility.tsx +43 -0
  228. package/src/assets/app/components/forms/button.tsx +60 -0
  229. package/src/assets/app/components/forms/fieldset.tsx +55 -0
  230. package/src/assets/app/components/forms/form-card-async.tsx +103 -0
  231. package/src/assets/app/components/forms/form-card.tsx +49 -0
  232. package/src/assets/app/components/forms/input-checkbox.tsx +73 -0
  233. package/src/assets/app/components/forms/input-container.tsx +107 -0
  234. package/src/assets/app/components/forms/input-email-address.tsx +66 -0
  235. package/src/assets/app/components/forms/input-new-password.tsx +62 -0
  236. package/src/assets/app/components/forms/input-password.tsx +88 -0
  237. package/src/assets/app/components/forms/input-text.tsx +76 -0
  238. package/src/assets/app/components/forms/input-token.tsx +94 -0
  239. package/src/assets/app/components/forms/wizard-card.tsx +116 -0
  240. package/src/assets/app/components/layouts/layout-title-page.tsx +77 -0
  241. package/src/assets/app/components/layouts/layout-welcome.tsx +73 -0
  242. package/src/assets/app/components/utils/account-identifier.tsx +23 -0
  243. package/src/assets/app/components/utils/account-image.tsx +33 -0
  244. package/src/assets/app/components/utils/admonition.tsx +52 -0
  245. package/src/assets/app/components/utils/client-name.tsx +45 -0
  246. package/src/assets/app/components/utils/error-card.tsx +93 -0
  247. package/src/assets/app/components/utils/error-message.tsx +62 -0
  248. package/src/assets/app/components/utils/help-card.tsx +46 -0
  249. package/src/assets/app/components/utils/icons.tsx +88 -0
  250. package/src/assets/app/components/utils/link-anchor.tsx +28 -0
  251. package/src/assets/app/components/utils/link-title.tsx +26 -0
  252. package/src/assets/app/components/utils/multi-lang-string.tsx +56 -0
  253. package/src/assets/app/components/utils/password-strength-label.tsx +37 -0
  254. package/src/assets/app/components/utils/password-strength-meter.tsx +58 -0
  255. package/src/assets/app/components/{url-viewer.tsx → utils/url-viewer.tsx} +9 -6
  256. package/src/assets/app/hooks/use-api.ts +128 -55
  257. package/src/assets/app/hooks/use-async-action.ts +120 -0
  258. package/src/assets/app/hooks/use-browser-color-scheme.ts +31 -0
  259. package/src/assets/app/hooks/use-csrf-token.ts +1 -1
  260. package/src/assets/app/hooks/use-random-string.ts +37 -0
  261. package/src/assets/app/hooks/use-stepper.ts +87 -0
  262. package/src/assets/app/index.html +182 -0
  263. package/src/assets/app/lib/api.ts +248 -79
  264. package/src/assets/app/lib/clsx.ts +5 -8
  265. package/src/assets/app/lib/json-client.ts +94 -0
  266. package/src/assets/app/lib/password.ts +98 -0
  267. package/src/assets/app/lib/ref.ts +17 -0
  268. package/src/assets/app/locales/an/messages.po +492 -0
  269. package/src/assets/app/locales/ast/messages.po +492 -0
  270. package/src/assets/app/locales/ca/messages.po +492 -0
  271. package/src/assets/app/locales/da/messages.po +492 -0
  272. package/src/assets/app/locales/de/messages.po +492 -0
  273. package/src/assets/app/locales/el/messages.po +492 -0
  274. package/src/assets/app/locales/en/messages.po +492 -0
  275. package/src/assets/app/locales/en-GB/messages.po +492 -0
  276. package/src/assets/app/locales/es/messages.po +492 -0
  277. package/src/assets/app/locales/eu/messages.po +492 -0
  278. package/src/assets/app/locales/fi/messages.po +492 -0
  279. package/src/assets/app/locales/fr/messages.po +492 -0
  280. package/src/assets/app/locales/ga/messages.po +492 -0
  281. package/src/assets/app/locales/gl/messages.po +492 -0
  282. package/src/assets/app/locales/hi/messages.po +492 -0
  283. package/src/assets/app/locales/hu/messages.po +492 -0
  284. package/src/assets/app/locales/ia/messages.po +492 -0
  285. package/src/assets/app/locales/id/messages.po +492 -0
  286. package/src/assets/app/locales/it/messages.po +492 -0
  287. package/src/assets/app/locales/ja/messages.po +492 -0
  288. package/src/assets/app/locales/km/messages.po +492 -0
  289. package/src/assets/app/locales/ko/messages.po +492 -0
  290. package/src/assets/app/locales/load.ts +8 -0
  291. package/src/assets/app/locales/locale-context.ts +19 -0
  292. package/src/assets/app/locales/locale-provider.tsx +112 -0
  293. package/src/assets/app/locales/locale-selector.tsx +58 -0
  294. package/src/assets/app/locales/locales.ts +168 -0
  295. package/src/assets/app/locales/ne/messages.po +492 -0
  296. package/src/assets/app/locales/nl/messages.po +492 -0
  297. package/src/assets/app/locales/pl/messages.po +492 -0
  298. package/src/assets/app/locales/pt-BR/messages.po +492 -0
  299. package/src/assets/app/locales/ro/messages.po +492 -0
  300. package/src/assets/app/locales/ru/messages.po +492 -0
  301. package/src/assets/app/locales/sv/messages.po +492 -0
  302. package/src/assets/app/locales/th/messages.po +492 -0
  303. package/src/assets/app/locales/tr/messages.po +492 -0
  304. package/src/assets/app/locales/uk/messages.po +492 -0
  305. package/src/assets/app/locales/vi/messages.po +492 -0
  306. package/src/assets/app/locales/zh-CN/messages.po +492 -0
  307. package/src/assets/app/locales/zh-HK/messages.po +492 -0
  308. package/src/assets/app/locales/zh-TW/messages.po +492 -0
  309. package/src/assets/app/main.css +23 -2
  310. package/src/assets/app/main.tsx +24 -8
  311. package/src/assets/app/views/authorize/accept/accept-form.tsx +150 -0
  312. package/src/assets/app/views/authorize/accept/accept-view.tsx +70 -0
  313. package/src/assets/app/views/authorize/authorize-view.tsx +180 -0
  314. package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +88 -0
  315. package/src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx +80 -0
  316. package/src/assets/app/views/authorize/reset-password/reset-password-view.tsx +127 -0
  317. package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +244 -0
  318. package/src/assets/app/views/authorize/sign-in/sign-in-picker.tsx +116 -0
  319. package/src/assets/app/views/authorize/sign-in/sign-in-view.tsx +145 -0
  320. package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +140 -0
  321. package/src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx +51 -0
  322. package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +289 -0
  323. package/src/assets/app/views/authorize/sign-up/sign-up-hcaptcha-form.tsx +108 -0
  324. package/src/assets/app/views/authorize/sign-up/sign-up-view.tsx +158 -0
  325. package/src/assets/app/views/authorize/welcome/welcome-view.tsx +56 -0
  326. package/src/assets/app/views/error/error-view.tsx +31 -0
  327. package/src/assets/asset.ts +1 -0
  328. package/src/assets/assets-middleware.ts +13 -8
  329. package/src/assets/index.ts +15 -2
  330. package/src/client/client-store.ts +10 -12
  331. package/src/device/device-manager.ts +8 -12
  332. package/src/device/device-store.ts +9 -15
  333. package/src/dpop/dpop-manager.ts +20 -8
  334. package/src/dpop/dpop-nonce.ts +58 -40
  335. package/src/errors/handle-unavailable-error.ts +18 -0
  336. package/src/errors/invalid-request-error.ts +10 -8
  337. package/src/lib/csp/index.ts +98 -0
  338. package/src/lib/hcaptcha.ts +182 -0
  339. package/src/lib/html/build-document.ts +60 -16
  340. package/src/lib/http/middleware.ts +4 -3
  341. package/src/lib/http/request.ts +31 -1
  342. package/src/lib/http/response.ts +22 -9
  343. package/src/lib/locale.ts +21 -0
  344. package/src/lib/util/function.ts +0 -3
  345. package/src/lib/util/type.ts +130 -1
  346. package/src/metadata/build-metadata.ts +2 -1
  347. package/src/oauth-errors.ts +1 -0
  348. package/src/oauth-hooks.ts +69 -3
  349. package/src/oauth-provider.ts +403 -307
  350. package/src/oauth-verifier.ts +3 -1
  351. package/src/output/build-authorize-data.ts +1 -3
  352. package/src/output/build-customization-data.ts +228 -0
  353. package/src/output/output-manager.ts +111 -48
  354. package/src/output/send-authorize-redirect.ts +43 -36
  355. package/src/output/send-web-page.ts +40 -26
  356. package/src/request/request-manager.ts +4 -4
  357. package/src/request/request-store.ts +12 -16
  358. package/src/token/token-store.ts +14 -18
  359. package/tailwind.config.js +5 -0
  360. package/tsconfig.backend.tsbuildinfo +1 -1
  361. package/tsconfig.frontend.tsbuildinfo +1 -1
  362. package/tsconfig.tools.tsbuildinfo +1 -1
  363. package/vite.config.mjs +16 -0
  364. package/.postcssrc.yml +0 -3
  365. package/dist/assets/app/main.css +0 -3
  366. package/dist/assets/app/main.js +0 -20
  367. package/dist/assets/app/main.js.map +0 -1
  368. package/dist/output/customization.d.ts +0 -27
  369. package/dist/output/customization.d.ts.map +0 -1
  370. package/dist/output/customization.js +0 -88
  371. package/dist/output/customization.js.map +0 -1
  372. package/src/assets/app/components/accept-form.tsx +0 -137
  373. package/src/assets/app/components/account-identifier.tsx +0 -18
  374. package/src/assets/app/components/account-picker.tsx +0 -127
  375. package/src/assets/app/components/button.tsx +0 -34
  376. package/src/assets/app/components/client-name.tsx +0 -37
  377. package/src/assets/app/components/fieldset.tsx +0 -26
  378. package/src/assets/app/components/form-card.tsx +0 -47
  379. package/src/assets/app/components/help-card.tsx +0 -42
  380. package/src/assets/app/components/icons/alert-icon.tsx +0 -5
  381. package/src/assets/app/components/icons/at-symbol-icon.tsx +0 -5
  382. package/src/assets/app/components/icons/caret-right-icon.tsx +0 -5
  383. package/src/assets/app/components/icons/lock-icon.tsx +0 -5
  384. package/src/assets/app/components/icons/token-icon.tsx +0 -5
  385. package/src/assets/app/components/icons/util.tsx +0 -17
  386. package/src/assets/app/components/info-card.tsx +0 -45
  387. package/src/assets/app/components/input-checkbox.tsx +0 -47
  388. package/src/assets/app/components/input-container.tsx +0 -37
  389. package/src/assets/app/components/input-layout.tsx +0 -47
  390. package/src/assets/app/components/input-text.tsx +0 -69
  391. package/src/assets/app/components/layout-title-page.tsx +0 -60
  392. package/src/assets/app/components/layout-welcome.tsx +0 -74
  393. package/src/assets/app/components/sign-in-form.tsx +0 -337
  394. package/src/assets/app/components/sign-up-account-form.tsx +0 -194
  395. package/src/assets/app/components/sign-up-disclaimer.tsx +0 -44
  396. package/src/assets/app/views/accept-view.tsx +0 -55
  397. package/src/assets/app/views/authorize-view.tsx +0 -106
  398. package/src/assets/app/views/error-view.tsx +0 -36
  399. package/src/assets/app/views/sign-in-view.tsx +0 -111
  400. package/src/assets/app/views/sign-up-view.tsx +0 -86
  401. package/src/assets/app/views/welcome-view.tsx +0 -54
  402. package/src/output/customization.ts +0 -118
@@ -0,0 +1,492 @@
1
+ msgid ""
2
+ msgstr ""
3
+ "POT-Creation-Date: 2025-02-27 14:42+0100\n"
4
+ "MIME-Version: 1.0\n"
5
+ "Content-Type: text/plain; charset=utf-8\n"
6
+ "Content-Transfer-Encoding: 8bit\n"
7
+ "X-Generator: @lingui/cli\n"
8
+ "Language: ko\n"
9
+ "Project-Id-Version: \n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "PO-Revision-Date: \n"
12
+ "Last-Translator: \n"
13
+ "Language-Team: \n"
14
+ "Plural-Forms: \n"
15
+
16
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:76
17
+ msgid "<0/> is asking for permission to access your account (<1/>)."
18
+ msgstr ""
19
+
20
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:221
21
+ msgid "2FA Confirmation"
22
+ msgstr ""
23
+
24
+ #: src/assets/app/components/utils/error-message.tsx:47
25
+ msgid "A second authentication factor is required"
26
+ msgstr ""
27
+
28
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:144
29
+ msgid "Access your account data (except chat messages)"
30
+ msgstr ""
31
+
32
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:146
33
+ msgid "Access your chat messages"
34
+ msgstr ""
35
+
36
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:138
37
+ msgid "Account"
38
+ msgstr ""
39
+
40
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:71
41
+ msgid "Already have a code?"
42
+ msgstr ""
43
+
44
+ #: src/assets/app/components/utils/client-name.tsx:35
45
+ msgid "An application on your device"
46
+ msgstr ""
47
+
48
+ #: src/assets/app/components/utils/error-message.tsx:61
49
+ msgid "An unknown error occurred"
50
+ msgstr ""
51
+
52
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:110
53
+ msgid "Another account"
54
+ msgstr ""
55
+
56
+ #: src/assets/app/views/authorize/welcome/welcome-view.tsx:28
57
+ msgid "Authenticate"
58
+ msgstr ""
59
+
60
+ #: src/assets/app/views/authorize/accept/accept-view.tsx:55
61
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:56
62
+ msgid "Authorize"
63
+ msgstr ""
64
+
65
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:47
66
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:130
67
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:65
68
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:95
69
+ #: src/assets/app/components/forms/wizard-card.tsx:93
70
+ msgid "Back"
71
+ msgstr ""
72
+
73
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:152
74
+ msgid "Between {minLength} and {maxLength} characters"
75
+ msgstr ""
76
+
77
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:89
78
+ msgid "By clicking <0>Authorize</0>, you allow this application to perform the following actions in accordance with their <1>terms of service</1> and <2>privacy policy</2>:"
79
+ msgstr ""
80
+
81
+ #. placeholder {0}: tosLink ? ( <LinkAnchor className="text-brand underline" link={tosLink}> <Trans>Terms of Service</Trans> </LinkAnchor> ) : ( <Trans>Terms of Service</Trans> )
82
+ #. placeholder {1}: ppLink ? ( <LinkAnchor className="text-brand underline" link={ppLink}> <Trans>Privacy Policy</Trans> </LinkAnchor> ) : ( <Trans>Privacy Policy</Trans> )
83
+ #: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:30
84
+ msgid "By creating an account you agree to the {0} and the {1} of this service."
85
+ msgstr ""
86
+
87
+ #: src/assets/app/views/authorize/welcome/welcome-view.tsx:51
88
+ #: src/assets/app/components/forms/form-card-async.tsx:85
89
+ msgid "Cancel"
90
+ msgstr ""
91
+
92
+ #. placeholder {0}: secondFactor.hint
93
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:234
94
+ msgid "Check your {0} email for a login code and enter it here."
95
+ msgstr ""
96
+
97
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:94
98
+ msgid "Choose a username"
99
+ msgstr ""
100
+
101
+ #: src/assets/app/components/utils/error-card.tsx:78
102
+ msgid "Code"
103
+ msgstr ""
104
+
105
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:135
106
+ msgid "Confirm"
107
+ msgstr ""
108
+
109
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:65
110
+ msgid "Confirm your password to continue"
111
+ msgstr ""
112
+
113
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:225
114
+ msgid "Confirmation code"
115
+ msgstr ""
116
+
117
+ #: src/assets/app/views/authorize/welcome/welcome-view.tsx:35
118
+ msgid "Create a new account"
119
+ msgstr ""
120
+
121
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:78
122
+ msgid "Create Account"
123
+ msgstr ""
124
+
125
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:60
126
+ msgid "Deny access"
127
+ msgstr ""
128
+
129
+ #: src/assets/app/components/utils/error-card.tsx:85
130
+ msgid "Description"
131
+ msgstr ""
132
+
133
+ #: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:112
134
+ #: src/assets/app/components/forms/input-email-address.tsx:49
135
+ #: src/assets/app/components/forms/input-email-address.tsx:50
136
+ #: src/assets/app/components/forms/input-email-address.tsx:51
137
+ msgid "Email"
138
+ msgstr ""
139
+
140
+ #: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:55
141
+ #: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:60
142
+ msgid "Email address"
143
+ msgstr ""
144
+
145
+ #: src/assets/app/components/forms/input-new-password.tsx:44
146
+ msgid "Enter a password"
147
+ msgstr ""
148
+
149
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:85
150
+ msgid "Enter the code you received to reset your password."
151
+ msgstr ""
152
+
153
+ #: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:71
154
+ msgid "Enter the email you used to create your account. We'll send you a \"reset code\" so you can set a new password."
155
+ msgstr ""
156
+
157
+ #: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:58
158
+ msgid "Enter your email address"
159
+ msgstr ""
160
+
161
+ #: src/assets/app/components/forms/input-new-password.tsx:45
162
+ msgid "Enter your new password"
163
+ msgstr ""
164
+
165
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:86
166
+ msgid "Enter your password"
167
+ msgstr ""
168
+
169
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:104
170
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:120
171
+ msgid "Enter your username and password"
172
+ msgstr ""
173
+
174
+ #: src/assets/app/views/error/error-view.tsx:28
175
+ msgid "Error"
176
+ msgstr ""
177
+
178
+ #: src/assets/app/components/utils/password-strength-label.tsx:25
179
+ msgid "Extra"
180
+ msgstr ""
181
+
182
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:53
183
+ msgid "Forgot Password"
184
+ msgstr ""
185
+
186
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:180
187
+ msgid "Forgot?"
188
+ msgstr ""
189
+
190
+ #. placeholder {0}: account.preferred_username || account.email || account.sub
191
+ #: src/assets/app/views/authorize/accept/accept-view.tsx:40
192
+ msgid "Grant access to your <0>{0}</0> account"
193
+ msgstr ""
194
+
195
+ #: src/assets/app/components/utils/help-card.tsx:32
196
+ msgid "Having trouble? <0>Contact support</0>"
197
+ msgstr ""
198
+
199
+ #: src/assets/app/components/forms/button-toggle-visibility.tsx:34
200
+ msgid "Hide"
201
+ msgstr ""
202
+
203
+ #: src/assets/app/components/utils/link-title.tsx:15
204
+ msgid "Home"
205
+ msgstr ""
206
+
207
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:86
208
+ msgid "Identifier"
209
+ msgstr ""
210
+
211
+ #: src/assets/app/locales/locale-selector.tsx:48
212
+ msgid "Interface language selector"
213
+ msgstr ""
214
+
215
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:277
216
+ msgid "Invalid"
217
+ msgstr ""
218
+
219
+ #: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:95
220
+ #: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:99
221
+ #: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:100
222
+ msgid "Invite code"
223
+ msgstr ""
224
+
225
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:55
226
+ msgid "Let's get your password reset!"
227
+ msgstr ""
228
+
229
+ #: src/assets/app/views/authorize/authorize-view.tsx:172
230
+ msgid "Login complete"
231
+ msgstr ""
232
+
233
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:104
234
+ msgid "Login to account that is not listed"
235
+ msgstr ""
236
+
237
+ #: src/assets/app/components/forms/input-token.tsx:59
238
+ msgid "Looks like {example}"
239
+ msgstr ""
240
+
241
+ #: src/assets/app/components/forms/button-toggle-visibility.tsx:34
242
+ msgid "Make visible"
243
+ msgstr ""
244
+
245
+ #: src/assets/app/components/utils/password-strength-label.tsx:33
246
+ msgid "Missing"
247
+ msgstr ""
248
+
249
+ #: src/assets/app/components/utils/password-strength-label.tsx:29
250
+ msgid "Moderate"
251
+ msgstr ""
252
+
253
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:80
254
+ msgid "Name"
255
+ msgstr ""
256
+
257
+ #: src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx:76
258
+ msgid "New password"
259
+ msgstr ""
260
+
261
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:60
262
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:90
263
+ #: src/assets/app/components/forms/wizard-card.tsx:96
264
+ msgid "Next"
265
+ msgstr ""
266
+
267
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:119
268
+ msgid "Okay"
269
+ msgstr ""
270
+
271
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:157
272
+ msgid "Only letters, numbers, and hyphens"
273
+ msgstr ""
274
+
275
+ #: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:126
276
+ #: src/assets/app/components/forms/input-password.tsx:51
277
+ #: src/assets/app/components/forms/input-password.tsx:52
278
+ #: src/assets/app/components/forms/input-password.tsx:53
279
+ msgid "Password"
280
+ msgstr ""
281
+
282
+ #: src/assets/app/components/utils/password-strength-label.tsx:23
283
+ msgid "Password strength"
284
+ msgstr ""
285
+
286
+ #: src/assets/app/components/utils/password-strength-meter.tsx:45
287
+ msgid "Password strength indicator"
288
+ msgstr ""
289
+
290
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:106
291
+ msgid "Password Updated"
292
+ msgstr ""
293
+
294
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:113
295
+ msgid "Password updated!"
296
+ msgstr ""
297
+
298
+ #: src/assets/app/components/forms/input-new-password.tsx:46
299
+ msgid "Password with at least {MIN_PASSWORD_LENGTH} characters"
300
+ msgstr ""
301
+
302
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:194
303
+ msgid "Please verify the domain name of the website before entering your password. Never enter your password on a domain you do not trust."
304
+ msgstr ""
305
+
306
+ #: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:42
307
+ #: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:45
308
+ #: src/assets/app/components/utils/link-title.tsx:17
309
+ msgid "Privacy Policy"
310
+ msgstr ""
311
+
312
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:208
313
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:213
314
+ msgid "Remember this account on this device"
315
+ msgstr ""
316
+
317
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:123
318
+ msgid "Requested permissions"
319
+ msgstr ""
320
+
321
+ #: src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx:61
322
+ msgid "Reset code"
323
+ msgstr ""
324
+
325
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:82
326
+ msgid "Reset Password"
327
+ msgstr ""
328
+
329
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:178
330
+ msgid "Reset your password"
331
+ msgstr ""
332
+
333
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:198
334
+ msgid "Select domain"
335
+ msgstr ""
336
+
337
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:135
338
+ msgid "Select from an existing account"
339
+ msgstr ""
340
+
341
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:204
342
+ msgid "Session"
343
+ msgstr ""
344
+
345
+ #: src/assets/app/views/authorize/welcome/welcome-view.tsx:45
346
+ #: src/assets/app/views/authorize/sign-in/sign-in-view.tsx:48
347
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:135
348
+ msgid "Sign in"
349
+ msgstr ""
350
+
351
+ #. placeholder {0}: account.name
352
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:75
353
+ msgid "Sign in as {0}"
354
+ msgstr ""
355
+
356
+ #: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:53
357
+ msgid "Sign in as..."
358
+ msgstr ""
359
+
360
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:84
361
+ msgid "Sign up"
362
+ msgstr ""
363
+
364
+ #: src/assets/app/components/forms/wizard-card.tsx:106
365
+ msgid "Step {currentPosition} of {count}"
366
+ msgstr ""
367
+
368
+ #: src/assets/app/components/utils/password-strength-label.tsx:27
369
+ msgid "Strong"
370
+ msgstr ""
371
+
372
+ #: src/assets/app/components/forms/form-card-async.tsx:96
373
+ msgid "Submit"
374
+ msgstr ""
375
+
376
+ #: src/assets/app/components/utils/link-title.tsx:21
377
+ msgid "Support"
378
+ msgstr ""
379
+
380
+ #: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:34
381
+ #: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:37
382
+ #: src/assets/app/components/utils/link-title.tsx:19
383
+ msgid "Terms of Service"
384
+ msgstr ""
385
+
386
+ #: src/assets/app/components/utils/error-message.tsx:42
387
+ msgid "That handle cannot be used"
388
+ msgstr ""
389
+
390
+ #: src/assets/app/components/utils/error-message.tsx:33
391
+ msgid "The domain name is not allowed"
392
+ msgstr ""
393
+
394
+ #: src/assets/app/components/utils/error-message.tsx:35
395
+ msgid "The handle contains inappropriate language"
396
+ msgstr ""
397
+
398
+ #: src/assets/app/components/utils/error-message.tsx:40
399
+ msgid "The handle is already in use"
400
+ msgstr ""
401
+
402
+ #: src/assets/app/components/utils/error-message.tsx:31
403
+ msgid "The handle is invalid"
404
+ msgstr ""
405
+
406
+ #: src/assets/app/components/utils/error-message.tsx:25
407
+ msgid "This email is already used"
408
+ msgstr ""
409
+
410
+ #: src/assets/app/components/utils/error-message.tsx:38
411
+ msgid "This handle is reserved"
412
+ msgstr ""
413
+
414
+ #: src/assets/app/components/utils/error-message.tsx:54
415
+ msgid "This sign-in session has expired"
416
+ msgstr ""
417
+
418
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:166
419
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:167
420
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:168
421
+ msgid "Type your desired username"
422
+ msgstr ""
423
+
424
+ #: src/assets/app/components/utils/error-message.tsx:58
425
+ msgid "Unexpected server response"
426
+ msgstr ""
427
+
428
+ #: src/assets/app/views/authorize/accept/accept-form.tsx:142
429
+ msgid "Uniquely identify you"
430
+ msgstr ""
431
+
432
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:143
433
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:144
434
+ msgid "Username or email address"
435
+ msgstr ""
436
+
437
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:272
438
+ msgid "Valid"
439
+ msgstr ""
440
+
441
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:154
442
+ msgid "Valid email address or username"
443
+ msgstr ""
444
+
445
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:135
446
+ msgid "Verify you are human"
447
+ msgstr ""
448
+
449
+ #: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:191
450
+ msgid "Warning"
451
+ msgstr ""
452
+
453
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:80
454
+ msgid "We're so excited to have you join us!"
455
+ msgstr ""
456
+
457
+ #: src/assets/app/components/utils/password-strength-label.tsx:31
458
+ msgid "Weak"
459
+ msgstr ""
460
+
461
+ #: src/assets/app/components/utils/error-message.tsx:21
462
+ msgid "Wrong identifier or password"
463
+ msgstr ""
464
+
465
+ #: src/assets/app/views/authorize/authorize-view.tsx:173
466
+ msgid "You are being redirected..."
467
+ msgstr ""
468
+
469
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:237
470
+ msgid "You can change this username to any domain name you control after your account is set up."
471
+ msgstr ""
472
+
473
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:116
474
+ msgid "You can now sign in with your new password."
475
+ msgstr ""
476
+
477
+ #: src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx:54
478
+ msgid "You will receive an email with a \"reset code\". Enter that code here then enter your new password."
479
+ msgstr ""
480
+
481
+ #: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:116
482
+ msgid "Your account"
483
+ msgstr ""
484
+
485
+ #. placeholder {0}: segment.length ? ( <strong className="text-gray-800 dark:text-gray-200"> {preview} </strong> ) : ( <span aria-hidden className="bg-gray-300 dark:bg-slate-600 rounded-md p-2 w-24" /> )
486
+ #: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:219
487
+ msgid "Your full username will be: {0}"
488
+ msgstr ""
489
+
490
+ #: src/assets/app/views/authorize/reset-password/reset-password-view.tsx:108
491
+ msgid "Your password has been updated!"
492
+ msgstr ""
@@ -0,0 +1,8 @@
1
+ import { Messages } from '@lingui/core'
2
+
3
+ // @NOTE run "pnpm run po:compile" to compile the messages from the PO files
4
+
5
+ export async function loadMessages(locale: string): Promise<Messages> {
6
+ const { messages } = await import(`./${locale}/messages.ts`)
7
+ return messages
8
+ }
@@ -0,0 +1,19 @@
1
+ import { createContext, useContext } from 'react'
2
+ // @NOTE run "pnpm run po:compile" to compile the messages from the PO files
3
+ import { KnownLocale } from './locales.ts'
4
+
5
+ export type LocaleContextValue = {
6
+ locale: string
7
+ locales: Partial<Record<KnownLocale, { name: string; flag?: string }>>
8
+ setLocale: (locale: KnownLocale) => void
9
+ }
10
+
11
+ export const LocaleContext = createContext<LocaleContextValue | null>(null)
12
+
13
+ export function useLocaleContext(): LocaleContextValue {
14
+ const context = useContext(LocaleContext)
15
+ if (!context) {
16
+ throw new Error('useLocaleContext must be used within a LocaleProvider')
17
+ }
18
+ return context
19
+ }
@@ -0,0 +1,112 @@
1
+ import { I18n } from '@lingui/core'
2
+ import { I18nProvider } from '@lingui/react'
3
+ import { ReactNode, useEffect, useMemo, useState } from 'react'
4
+ // @NOTE run "pnpm run po:compile" to compile the messages from the PO files
5
+ import { messages as en } from './en/messages.ts'
6
+ import { loadMessages } from './load.ts'
7
+ import { LocaleContext, LocaleContextValue } from './locale-context.ts'
8
+ import { KnownLocale, knownLocales, locales, resolveLocale } from './locales.ts'
9
+
10
+ export type LocaleProviderProps = {
11
+ availableLocales?: readonly string[]
12
+ children?: ReactNode
13
+ }
14
+
15
+ export function LocaleProvider({
16
+ availableLocales,
17
+ children,
18
+ }: LocaleProviderProps) {
19
+ // Bundle "en" messages with the app
20
+ const [i18n] = useState(() => new I18n({ locale: 'en', messages: { en } }))
21
+
22
+ const [desiredLocale, setDesiredLocale] = useState<KnownLocale>(() =>
23
+ detectLocale(
24
+ knownLocales.filter(
25
+ (l) => !availableLocales || availableLocales.includes(l),
26
+ ),
27
+ ),
28
+ )
29
+ const [currentLocale, setCurrentLocale] = useState<string>(() => i18n.locale)
30
+
31
+ const [loaded, setLoaded] = useState(desiredLocale === currentLocale)
32
+
33
+ // Keep currentLocale in sync with i18n
34
+ useEffect(() => {
35
+ const onChange = () => {
36
+ setCurrentLocale(i18n.locale)
37
+ document.documentElement.setAttribute('lang', i18n.locale)
38
+ }
39
+ i18n.on('change', onChange)
40
+ return () => i18n.removeListener('change', onChange)
41
+ }, [i18n])
42
+
43
+ useEffect(() => {
44
+ if (currentLocale === desiredLocale) {
45
+ setLoaded(true)
46
+ return
47
+ }
48
+
49
+ let canceled = false
50
+ loadMessages(desiredLocale)
51
+ .then((messages) => {
52
+ i18n.load(desiredLocale, messages)
53
+ if (!canceled) i18n.activate(desiredLocale)
54
+ })
55
+ .catch((err) => {
56
+ console.error(`Failed to load locale "${desiredLocale}":`, err)
57
+ })
58
+ .finally(() => {
59
+ if (!canceled) setLoaded(true)
60
+ })
61
+ return () => {
62
+ canceled = true
63
+ }
64
+ }, [currentLocale, desiredLocale])
65
+
66
+ const value = useMemo<LocaleContextValue>(
67
+ () => ({
68
+ locale: currentLocale,
69
+ locales: Object.fromEntries(
70
+ knownLocales
71
+ .filter((l) => !availableLocales || availableLocales.includes(l))
72
+ .map((l) => [l, locales[l]]),
73
+ ),
74
+ setLocale: setDesiredLocale,
75
+ }),
76
+ [currentLocale, availableLocales, locales, setDesiredLocale],
77
+ )
78
+
79
+ return (
80
+ <LocaleContext value={value}>
81
+ <I18nProvider i18n={i18n}>{loaded && children}</I18nProvider>
82
+ </LocaleContext>
83
+ )
84
+ }
85
+
86
+ function detectLocale<L extends string>(
87
+ availableLocales: readonly L[],
88
+ fallbackLocale: L | 'en' = 'en',
89
+ ): L {
90
+ // Use, in priority, the locale that was set by the backend
91
+ if (typeof document === 'object') {
92
+ const htmlLang = document.documentElement.getAttribute('lang')
93
+ const resolved = htmlLang && resolveLocale(htmlLang, availableLocales)
94
+ if (resolved) return resolved
95
+ }
96
+
97
+ // Should that fail (though it should probably never), negotiate with the browser
98
+ if (typeof navigator === 'object' && navigator.languages) {
99
+ for (const locale of navigator.languages) {
100
+ const resolved = resolveLocale(locale, availableLocales)
101
+ if (resolved) return resolved
102
+ }
103
+ }
104
+
105
+ const fallback = resolveLocale(fallbackLocale, availableLocales)
106
+ if (fallback) return fallback
107
+
108
+ // Type-safety
109
+ throw new TypeError(
110
+ `Available locales should always contain "${fallbackLocale}"`,
111
+ )
112
+ }
@@ -0,0 +1,58 @@
1
+ import { useLingui } from '@lingui/react/macro'
2
+ import { JSX } from 'react'
3
+ import { clsx } from '../lib/clsx.ts'
4
+ import { useLocaleContext } from './locale-context.ts'
5
+
6
+ export type LocaleSelectorProps = Omit<
7
+ JSX.IntrinsicElements['select'],
8
+ 'value' | 'defaultValue'
9
+ >
10
+
11
+ export function LocaleSelector({
12
+ className,
13
+ onChange,
14
+ ...props
15
+ }: LocaleSelectorProps) {
16
+ const { locale, locales, setLocale } = useLocaleContext()
17
+ const { t } = useLingui()
18
+
19
+ return (
20
+ <select
21
+ {...props}
22
+ className={clsx(
23
+ 'accent-brand',
24
+ // Background
25
+ 'bg-gray-100 focus:bg-slate-200 has-[:focus]:bg-slate-200',
26
+ 'dark:bg-slate-800 dark:focus:bg-slate-700 dark:has-[:focus]:bg-slate-700',
27
+ // Border
28
+ 'outline-none',
29
+ 'border-solid border-2 border-transparent',
30
+ 'focus:border-brand has-[:focus]:border-brand',
31
+ 'hover:border-gray-400 hover:focus:border-gray-400',
32
+ 'dark:hover:border-gray-500 dark:hover:focus:border-gray-500',
33
+ // Border
34
+ 'rounded-lg',
35
+ // Font
36
+ 'text-slate-600 dark:text-slate-300',
37
+ // Layout
38
+ 'py-1 px-2',
39
+ className,
40
+ )}
41
+ value={locale}
42
+ onChange={(e) => {
43
+ onChange?.(e)
44
+ if (!e.defaultPrevented) {
45
+ setLocale(e.target.value as keyof typeof locales)
46
+ }
47
+ }}
48
+ aria-label={t`Interface language selector`}
49
+ >
50
+ {Object.entries(locales).map(([key, { name, flag }]) => (
51
+ <option key={key} value={key}>
52
+ {name}
53
+ {flag ? ` ${flag}` : ''}
54
+ </option>
55
+ ))}
56
+ </select>
57
+ )
58
+ }