@toa.io/extensions.configuration 1.0.0-alpha.272 → 1.0.0-alpha.274

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 (522) hide show
  1. package/CHANGELOG.md +210 -0
  2. package/components/configuration.values/manifest.toa.yaml +158 -0
  3. package/components/configuration.values/source/create.ts +56 -0
  4. package/components/configuration.values/source/fetch.ts +24 -0
  5. package/components/configuration.values/source/get.ts +33 -0
  6. package/components/configuration.values/source/lib/map.test.ts +34 -0
  7. package/components/configuration.values/source/lib/map.ts +34 -0
  8. package/components/configuration.values/source/lib/resolve.ts +54 -0
  9. package/components/configuration.values/source/list.ts +19 -0
  10. package/components/configuration.values/tsconfig.json +9 -0
  11. package/cucumber.js +8 -0
  12. package/features/site/_app/immutable/asset.js +1 -0
  13. package/features/site/index.html +6 -0
  14. package/features/steps/UI.ts +88 -0
  15. package/features/steps/tsconfig.json +9 -0
  16. package/features/ui.feature +85 -0
  17. package/package.json +14 -7
  18. package/readme.md +160 -47
  19. package/schemas/annotation.cos.yaml +29 -1
  20. package/schemas/manifest.cos.yaml +9 -3
  21. package/source/Aspect.test.ts +84 -8
  22. package/source/Aspect.ts +59 -5
  23. package/source/Client.test.ts +104 -0
  24. package/source/Client.ts +258 -0
  25. package/source/Composition.ts +57 -0
  26. package/source/Factory.ts +28 -5
  27. package/source/Secret.test.ts +29 -0
  28. package/source/Secret.ts +29 -0
  29. package/source/UI.ts +197 -0
  30. package/source/configuration.test.ts +92 -39
  31. package/source/configuration.ts +30 -11
  32. package/source/const.ts +17 -0
  33. package/source/deployment.test.ts +80 -1
  34. package/source/deployment.ts +73 -24
  35. package/source/epoch.test.ts +26 -0
  36. package/source/epoch.ts +21 -0
  37. package/source/index.ts +2 -1
  38. package/transpiled/Aspect.d.ts +18 -4
  39. package/transpiled/Aspect.js +47 -3
  40. package/transpiled/Aspect.js.map +1 -1
  41. package/transpiled/Aspect.test.js +59 -9
  42. package/transpiled/Aspect.test.js.map +1 -1
  43. package/transpiled/Client.d.ts +61 -0
  44. package/transpiled/Client.js +173 -0
  45. package/transpiled/Client.js.map +1 -0
  46. package/transpiled/Client.test.d.ts +1 -0
  47. package/transpiled/Client.test.js +77 -0
  48. package/transpiled/Client.test.js.map +1 -0
  49. package/transpiled/Composition.d.ts +14 -0
  50. package/transpiled/Composition.js +43 -0
  51. package/transpiled/Composition.js.map +1 -0
  52. package/transpiled/Factory.d.ts +8 -2
  53. package/transpiled/Factory.js +17 -2
  54. package/transpiled/Factory.js.map +1 -1
  55. package/transpiled/Secret.d.ts +13 -0
  56. package/transpiled/Secret.js +26 -0
  57. package/transpiled/Secret.js.map +1 -0
  58. package/transpiled/Secret.test.d.ts +1 -0
  59. package/transpiled/Secret.test.js +26 -0
  60. package/transpiled/Secret.test.js.map +1 -0
  61. package/transpiled/UI.d.ts +25 -0
  62. package/transpiled/UI.js +186 -0
  63. package/transpiled/UI.js.map +1 -0
  64. package/transpiled/configuration.d.ts +7 -2
  65. package/transpiled/configuration.js +31 -13
  66. package/transpiled/configuration.js.map +1 -1
  67. package/transpiled/configuration.test.js +84 -37
  68. package/transpiled/configuration.test.js.map +1 -1
  69. package/transpiled/const.d.ts +11 -0
  70. package/transpiled/const.js +14 -0
  71. package/transpiled/const.js.map +1 -0
  72. package/transpiled/deployment.d.ts +10 -4
  73. package/transpiled/deployment.js +57 -21
  74. package/transpiled/deployment.js.map +1 -1
  75. package/transpiled/deployment.test.js +60 -0
  76. package/transpiled/deployment.test.js.map +1 -1
  77. package/transpiled/epoch.d.ts +2 -0
  78. package/transpiled/epoch.js +21 -0
  79. package/transpiled/epoch.js.map +1 -0
  80. package/transpiled/epoch.test.d.ts +1 -0
  81. package/transpiled/epoch.test.js +22 -0
  82. package/transpiled/epoch.test.js.map +1 -0
  83. package/transpiled/index.d.ts +2 -1
  84. package/transpiled/index.js +4 -1
  85. package/transpiled/index.js.map +1 -1
  86. package/transpiled/tsconfig.tsbuildinfo +1 -1
  87. package/ui/.agents/skills/antcn/SKILL.md +91 -0
  88. package/ui/.agents/skills/antcn/references/analytics.md +78 -0
  89. package/ui/.agents/skills/antcn/references/bridge.md +41 -0
  90. package/ui/.agents/skills/antcn/references/clipboard.md +23 -0
  91. package/ui/.agents/skills/antcn/references/dismissable.md +75 -0
  92. package/ui/.agents/skills/antcn/references/dropdown.md +153 -0
  93. package/ui/.agents/skills/antcn/references/fragments.md +29 -0
  94. package/ui/.agents/skills/antcn/references/fullscreen.md +157 -0
  95. package/ui/.agents/skills/antcn/references/geo.md +27 -0
  96. package/ui/.agents/skills/antcn/references/globals.md +31 -0
  97. package/ui/.agents/skills/antcn/references/grammatical-form.md +69 -0
  98. package/ui/.agents/skills/antcn/references/hints.md +44 -0
  99. package/ui/.agents/skills/antcn/references/hold.md +34 -0
  100. package/ui/.agents/skills/antcn/references/iam.md +117 -0
  101. package/ui/.agents/skills/antcn/references/input-form.md +34 -0
  102. package/ui/.agents/skills/antcn/references/locale.md +66 -0
  103. package/ui/.agents/skills/antcn/references/net.md +33 -0
  104. package/ui/.agents/skills/antcn/references/panel.md +44 -0
  105. package/ui/.agents/skills/antcn/references/passkeys.md +27 -0
  106. package/ui/.agents/skills/antcn/references/payments.md +99 -0
  107. package/ui/.agents/skills/antcn/references/realtime.md +69 -0
  108. package/ui/.agents/skills/antcn/references/scrollable.md +39 -0
  109. package/ui/.agents/skills/antcn/references/selector.md +71 -0
  110. package/ui/.agents/skills/antcn/references/shake.md +36 -0
  111. package/ui/.agents/skills/antcn/references/share.md +28 -0
  112. package/ui/.agents/skills/antcn/references/shell.md +139 -0
  113. package/ui/.agents/skills/antcn/references/stack.md +53 -0
  114. package/ui/.agents/skills/antcn/references/system.md +149 -0
  115. package/ui/.agents/skills/antcn/references/taptap.md +28 -0
  116. package/ui/.agents/skills/antcn/references/tools.md +68 -0
  117. package/ui/.agents/skills/antcn/references/transmission.md +96 -0
  118. package/ui/.agents/skills/shadcn-svelte/SKILL.md +227 -0
  119. package/ui/.agents/skills/shadcn-svelte/agents/openai.yml +5 -0
  120. package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte-small.png +0 -0
  121. package/ui/.agents/skills/shadcn-svelte/assets/shadcn-svelte.png +0 -0
  122. package/ui/.agents/skills/shadcn-svelte/cli.md +166 -0
  123. package/ui/.agents/skills/shadcn-svelte/customization.md +213 -0
  124. package/ui/.agents/skills/shadcn-svelte/evals/evals.json +47 -0
  125. package/ui/.agents/skills/shadcn-svelte/rules/composition.md +244 -0
  126. package/ui/.agents/skills/shadcn-svelte/rules/forms.md +234 -0
  127. package/ui/.agents/skills/shadcn-svelte/rules/icons.md +107 -0
  128. package/ui/.agents/skills/shadcn-svelte/rules/styling.md +195 -0
  129. package/ui/.agents/skills/svas/SKILL.md +169 -0
  130. package/ui/.agents/skills/svas/references/patterns.md +95 -0
  131. package/ui/.agents/skills/svintl/SKILL.md +176 -0
  132. package/ui/.claude/settings.json +15 -0
  133. package/ui/.codex/hooks.json +15 -0
  134. package/ui/.cursor/hooks.json +11 -0
  135. package/ui/.env.example +1 -0
  136. package/ui/.prettierrc +9 -0
  137. package/ui/.vscode/extensions.json +7 -0
  138. package/ui/.vscode/settings.json +27 -0
  139. package/ui/AGENTS.md +51 -0
  140. package/ui/architecture.md +390 -0
  141. package/ui/components.json +20 -0
  142. package/ui/eslint.config.js +152 -0
  143. package/ui/features/base.ts +2 -0
  144. package/ui/features/boot.feature +5 -0
  145. package/ui/features/steps/authentication.ts +34 -0
  146. package/ui/features/steps/navigaton.ts +37 -0
  147. package/ui/features/steps/typing.ts +24 -0
  148. package/ui/package-lock.json +8173 -0
  149. package/ui/package.json +76 -0
  150. package/ui/playwright.config.ts +13 -0
  151. package/ui/skills-lock.json +30 -0
  152. package/ui/src/@/configuration/index.ts +1 -0
  153. package/ui/src/@/configuration/svc/create.ts +29 -0
  154. package/ui/src/@/configuration/svc/index.ts +3 -0
  155. package/ui/src/@/configuration/svc/net/Configuration.ts +18 -0
  156. package/ui/src/@/configuration/svc/net/index.ts +2 -0
  157. package/ui/src/@/configuration/svc/net/interface.ts +35 -0
  158. package/ui/src/@/configuration/svc/store.ts +14 -0
  159. package/ui/src/@/configuration/ui/Configurations.svelte +85 -0
  160. package/ui/src/@/configuration/ui/Configurations.ts +5 -0
  161. package/ui/src/@/configuration/ui/Create.svelte +64 -0
  162. package/ui/src/@/configuration/ui/Create.ts +7 -0
  163. package/ui/src/@/configuration/ui/Form.svelte +75 -0
  164. package/ui/src/@/configuration/ui/Form.ts +79 -0
  165. package/ui/src/@/configuration/ui/Row.svelte +44 -0
  166. package/ui/src/@/configuration/ui/Row.ts +9 -0
  167. package/ui/src/@/configuration/ui/Value.svelte +33 -0
  168. package/ui/src/@/configuration/ui/Value.ts +6 -0
  169. package/ui/src/@/configuration/ui/index.ts +9 -0
  170. package/ui/src/@/configuration/ui/intl/built.js +38 -0
  171. package/ui/src/@/configuration/ui/intl/context.yaml +51 -0
  172. package/ui/src/@/configuration/ui/intl/en-US.yaml +21 -0
  173. package/ui/src/@/configuration/ui/intl/index.ts +9 -0
  174. package/ui/src/@/configuration/ui/intl/types.ts +31 -0
  175. package/ui/src/@/configuration/ui/read.test.ts +75 -0
  176. package/ui/src/@/configuration/ui/read.ts +102 -0
  177. package/ui/src/@/configuration/ui/ui.test.ts +69 -0
  178. package/ui/src/@/configuration/ui/ui.ts +115 -0
  179. package/ui/src/@/iam/index.ts +1 -0
  180. package/ui/src/@/iam/rc.ts +22 -0
  181. package/ui/src/@/iam/svc/authenticated.ts +17 -0
  182. package/ui/src/@/iam/svc/basic.ts +23 -0
  183. package/ui/src/@/iam/svc/index.ts +10 -0
  184. package/ui/src/@/iam/svc/logout.ts +5 -0
  185. package/ui/src/@/iam/svc/named.ts +16 -0
  186. package/ui/src/@/iam/svc/net/Echo.ts +9 -0
  187. package/ui/src/@/iam/svc/net/basic/index.ts +1 -0
  188. package/ui/src/@/iam/svc/net/basic/interface.ts +15 -0
  189. package/ui/src/@/iam/svc/net/federation/index.ts +1 -0
  190. package/ui/src/@/iam/svc/net/federation/interface.ts +12 -0
  191. package/ui/src/@/iam/svc/net/index.ts +6 -0
  192. package/ui/src/@/iam/svc/net/interface.ts +17 -0
  193. package/ui/src/@/iam/svc/net/otp/index.ts +1 -0
  194. package/ui/src/@/iam/svc/net/otp/interface.ts +14 -0
  195. package/ui/src/@/iam/svc/net/passkeys/index.ts +1 -0
  196. package/ui/src/@/iam/svc/net/passkeys/interface.ts +12 -0
  197. package/ui/src/@/iam/svc/oidc/apple.ts +47 -0
  198. package/ui/src/@/iam/svc/oidc/authenticate.ts +62 -0
  199. package/ui/src/@/iam/svc/oidc/google.ts +45 -0
  200. package/ui/src/@/iam/svc/oidc/hello.ts +82 -0
  201. package/ui/src/@/iam/svc/oidc/index.ts +3 -0
  202. package/ui/src/@/iam/svc/oidc/nonce.ts +5 -0
  203. package/ui/src/@/iam/svc/oidc/providers.ts +28 -0
  204. package/ui/src/@/iam/svc/oidc/standard.ts +28 -0
  205. package/ui/src/@/iam/svc/otp.ts +18 -0
  206. package/ui/src/@/iam/svc/passkeys/create.ts +20 -0
  207. package/ui/src/@/iam/svc/passkeys/index.ts +2 -0
  208. package/ui/src/@/iam/svc/passkeys/login.ts +21 -0
  209. package/ui/src/@/iam/svc/store.ts +36 -0
  210. package/ui/src/@/iam/svc/sync.ts +18 -0
  211. package/ui/src/@/iam/svc/transfer.ts +11 -0
  212. package/ui/src/@/iam/svc/update.ts +8 -0
  213. package/ui/src/@/iam/ui/AccountLike.ts +4 -0
  214. package/ui/src/@/iam/ui/Authenticated.svelte +37 -0
  215. package/ui/src/@/iam/ui/Authenticated.ts +10 -0
  216. package/ui/src/@/iam/ui/Authentication.svelte +50 -0
  217. package/ui/src/@/iam/ui/Authentication.ts +9 -0
  218. package/ui/src/@/iam/ui/Authorized.svelte +32 -0
  219. package/ui/src/@/iam/ui/Authorized.ts +65 -0
  220. package/ui/src/@/iam/ui/Card.svelte +14 -0
  221. package/ui/src/@/iam/ui/Card.ts +7 -0
  222. package/ui/src/@/iam/ui/Refresh.svelte +39 -0
  223. package/ui/src/@/iam/ui/credentials/Credentials.svelte +26 -0
  224. package/ui/src/@/iam/ui/credentials/Credentials.ts +5 -0
  225. package/ui/src/@/iam/ui/credentials/Provider.svelte +24 -0
  226. package/ui/src/@/iam/ui/credentials/Provider.ts +5 -0
  227. package/ui/src/@/iam/ui/credentials/index.ts +1 -0
  228. package/ui/src/@/iam/ui/credentials/passkeys/Key.svelte +42 -0
  229. package/ui/src/@/iam/ui/credentials/passkeys/Key.ts +29 -0
  230. package/ui/src/@/iam/ui/credentials/passkeys/Manager.svelte +83 -0
  231. package/ui/src/@/iam/ui/credentials/passkeys/Manager.ts +5 -0
  232. package/ui/src/@/iam/ui/credentials/passkeys/Passkeys.svelte +39 -0
  233. package/ui/src/@/iam/ui/credentials/passkeys/Summary.svelte +27 -0
  234. package/ui/src/@/iam/ui/credentials/passkeys/Summary.ts +5 -0
  235. package/ui/src/@/iam/ui/credentials/passkeys/index.ts +1 -0
  236. package/ui/src/@/iam/ui/credentials/providers.ts +15 -0
  237. package/ui/src/@/iam/ui/credentials/transfer/Qr.svelte +24 -0
  238. package/ui/src/@/iam/ui/credentials/transfer/Qr.ts +3 -0
  239. package/ui/src/@/iam/ui/credentials/transfer/Transfer.svelte +48 -0
  240. package/ui/src/@/iam/ui/credentials/transfer/Transfer.ts +5 -0
  241. package/ui/src/@/iam/ui/credentials/transfer/index.ts +1 -0
  242. package/ui/src/@/iam/ui/index.ts +3 -0
  243. package/ui/src/@/iam/ui/intl/built.js +79 -0
  244. package/ui/src/@/iam/ui/intl/context.yaml +91 -0
  245. package/ui/src/@/iam/ui/intl/en-US.yaml +64 -0
  246. package/ui/src/@/iam/ui/intl/index.ts +10 -0
  247. package/ui/src/@/iam/ui/intl/types.ts +70 -0
  248. package/ui/src/@/iam/ui/oidc/Authentication.svelte +16 -0
  249. package/ui/src/@/iam/ui/oidc/Authentication.ts +5 -0
  250. package/ui/src/@/iam/ui/oidc/Button.svelte +36 -0
  251. package/ui/src/@/iam/ui/oidc/Button.ts +11 -0
  252. package/ui/src/@/iam/ui/oidc/Refresh.svelte +16 -0
  253. package/ui/src/@/iam/ui/oidc/icons/Apple.svelte +19 -0
  254. package/ui/src/@/iam/ui/oidc/icons/Google.svelte +31 -0
  255. package/ui/src/@/iam/ui/oidc/icons/index.ts +11 -0
  256. package/ui/src/@/iam/ui/oidc/index.ts +2 -0
  257. package/ui/src/@/iam/ui/passkey/Authentication.svelte +64 -0
  258. package/ui/src/@/iam/ui/passkey/Authentication.ts +8 -0
  259. package/ui/src/@/iam/ui/passkey/Create.svelte +53 -0
  260. package/ui/src/@/iam/ui/passkey/Create.ts +7 -0
  261. package/ui/src/@/iam/ui/passkey/Login.svelte +29 -0
  262. package/ui/src/@/iam/ui/passkey/Refresh.svelte +29 -0
  263. package/ui/src/@/iam/ui/passkey/index.ts +2 -0
  264. package/ui/src/@/iam/ui/password/Authentication.svelte +19 -0
  265. package/ui/src/@/iam/ui/password/Authentication.ts +8 -0
  266. package/ui/src/@/iam/ui/password/Form.svelte +151 -0
  267. package/ui/src/@/iam/ui/password/Form.ts +6 -0
  268. package/ui/src/@/iam/ui/password/Password.svelte +39 -0
  269. package/ui/src/@/iam/ui/password/Password.ts +6 -0
  270. package/ui/src/@/iam/ui/password/Refresh.svelte +5 -0
  271. package/ui/src/@/iam/ui/password/index.ts +2 -0
  272. package/ui/src/@/net/index.ts +1 -0
  273. package/ui/src/@/net/svc/index.ts +3 -0
  274. package/ui/src/@/net/svc/origin.ts +8 -0
  275. package/ui/src/@/net/svc/query.test.ts +45 -0
  276. package/ui/src/@/net/svc/query.ts +25 -0
  277. package/ui/src/@/passkeys/index.ts +1 -0
  278. package/ui/src/@/passkeys/svc/add.ts +15 -0
  279. package/ui/src/@/passkeys/svc/create.ts +58 -0
  280. package/ui/src/@/passkeys/svc/credentials/convert.ts +32 -0
  281. package/ui/src/@/passkeys/svc/credentials/create.ts +34 -0
  282. package/ui/src/@/passkeys/svc/credentials/get.ts +14 -0
  283. package/ui/src/@/passkeys/svc/credentials/index.ts +3 -0
  284. package/ui/src/@/passkeys/svc/credentials/key.ts +10 -0
  285. package/ui/src/@/passkeys/svc/get.ts +10 -0
  286. package/ui/src/@/passkeys/svc/index.ts +6 -0
  287. package/ui/src/@/passkeys/svc/net/CreationResponse.ts +15 -0
  288. package/ui/src/@/passkeys/svc/net/Passkey.ts +8 -0
  289. package/ui/src/@/passkeys/svc/net/RequestResponse.ts +12 -0
  290. package/ui/src/@/passkeys/svc/net/challenges/Options.ts +21 -0
  291. package/ui/src/@/passkeys/svc/net/challenges/index.ts +2 -0
  292. package/ui/src/@/passkeys/svc/net/challenges/interface.ts +16 -0
  293. package/ui/src/@/passkeys/svc/net/index.ts +4 -0
  294. package/ui/src/@/passkeys/svc/net/interface.ts +29 -0
  295. package/ui/src/@/passkeys/svc/remove.ts +13 -0
  296. package/ui/src/@/passkeys/svc/request.ts +50 -0
  297. package/ui/src/@/passkeys/svc/store.ts +13 -0
  298. package/ui/src/@/passkeys/svc/supported.ts +1 -0
  299. package/ui/src/@/passkeys/ui/aaguid.json +150 -0
  300. package/ui/src/@/realtime/events.ts +1 -0
  301. package/ui/src/@/realtime/index.ts +1 -0
  302. package/ui/src/@/realtime/rc.ts +13 -0
  303. package/ui/src/@/realtime/svc/connect.ts +67 -0
  304. package/ui/src/@/realtime/svc/events.ts +17 -0
  305. package/ui/src/@/realtime/svc/index.ts +5 -0
  306. package/ui/src/@/realtime/svc/net/Message.ts +6 -0
  307. package/ui/src/@/realtime/svc/net/index.ts +2 -0
  308. package/ui/src/@/realtime/svc/net/interface.ts +13 -0
  309. package/ui/src/@/realtime/svc/reset.ts +5 -0
  310. package/ui/src/@/realtime/svc/status.ts +12 -0
  311. package/ui/src/@/realtime/svc/store.ts +30 -0
  312. package/ui/src/@/realtime/svc/time.ts +15 -0
  313. package/ui/src/app.d.ts +20 -0
  314. package/ui/src/app.html +13 -0
  315. package/ui/src/config/index.ts +70 -0
  316. package/ui/src/lib/assets/favicon.svg +1 -0
  317. package/ui/src/lib/components/clipboard/Clipboard.svelte +63 -0
  318. package/ui/src/lib/components/clipboard/Clipboard.ts +12 -0
  319. package/ui/src/lib/components/clipboard/index.ts +1 -0
  320. package/ui/src/lib/components/dismissable/Dismissable.svelte +81 -0
  321. package/ui/src/lib/components/dismissable/Dismissable.ts +7 -0
  322. package/ui/src/lib/components/dismissable/index.ts +1 -0
  323. package/ui/src/lib/components/dropdown/Back.svelte +14 -0
  324. package/ui/src/lib/components/dropdown/Back.ts +3 -0
  325. package/ui/src/lib/components/dropdown/Content.svelte +76 -0
  326. package/ui/src/lib/components/dropdown/Content.ts +13 -0
  327. package/ui/src/lib/components/dropdown/Context.ts +18 -0
  328. package/ui/src/lib/components/dropdown/Group.svelte +24 -0
  329. package/ui/src/lib/components/dropdown/Group.ts +8 -0
  330. package/ui/src/lib/components/dropdown/GroupContext.ts +15 -0
  331. package/ui/src/lib/components/dropdown/Item.svelte +31 -0
  332. package/ui/src/lib/components/dropdown/Item.ts +5 -0
  333. package/ui/src/lib/components/dropdown/Layer.svelte +11 -0
  334. package/ui/src/lib/components/dropdown/Layer.ts +7 -0
  335. package/ui/src/lib/components/dropdown/Root.svelte +88 -0
  336. package/ui/src/lib/components/dropdown/Root.ts +6 -0
  337. package/ui/src/lib/components/dropdown/Separator.svelte +13 -0
  338. package/ui/src/lib/components/dropdown/Separator.ts +5 -0
  339. package/ui/src/lib/components/dropdown/Trigger.svelte +33 -0
  340. package/ui/src/lib/components/dropdown/Trigger.ts +5 -0
  341. package/ui/src/lib/components/dropdown/index.ts +8 -0
  342. package/ui/src/lib/components/fullscreen/Fullscreen.svelte +97 -0
  343. package/ui/src/lib/components/fullscreen/Fullscreen.ts +18 -0
  344. package/ui/src/lib/components/fullscreen/Overlay.svelte +15 -0
  345. package/ui/src/lib/components/fullscreen/Overlay.ts +7 -0
  346. package/ui/src/lib/components/fullscreen/index.ts +2 -0
  347. package/ui/src/lib/components/hold/Hold.svelte +133 -0
  348. package/ui/src/lib/components/hold/Hold.ts +23 -0
  349. package/ui/src/lib/components/hold/index.ts +1 -0
  350. package/ui/src/lib/components/scrollable/Scrollable.svelte +49 -0
  351. package/ui/src/lib/components/scrollable/Scrollable.ts +117 -0
  352. package/ui/src/lib/components/scrollable/index.ts +2 -0
  353. package/ui/src/lib/components/shake/Shake.svelte +62 -0
  354. package/ui/src/lib/components/shake/Shake.ts +7 -0
  355. package/ui/src/lib/components/shake/index.ts +1 -0
  356. package/ui/src/lib/components/share/Share.svelte +58 -0
  357. package/ui/src/lib/components/share/Share.ts +9 -0
  358. package/ui/src/lib/components/share/index.ts +1 -0
  359. package/ui/src/lib/components/shell/Attention.svelte +11 -0
  360. package/ui/src/lib/components/shell/Attention.ts +6 -0
  361. package/ui/src/lib/components/shell/Header.svelte +18 -0
  362. package/ui/src/lib/components/shell/Header.ts +7 -0
  363. package/ui/src/lib/components/shell/Screen.svelte +28 -0
  364. package/ui/src/lib/components/shell/Screen.ts +11 -0
  365. package/ui/src/lib/components/shell/Sticky.svelte +23 -0
  366. package/ui/src/lib/components/shell/Sticky.ts +8 -0
  367. package/ui/src/lib/components/shell/Underlay.svelte +21 -0
  368. package/ui/src/lib/components/shell/Underlay.ts +6 -0
  369. package/ui/src/lib/components/shell/index.ts +6 -0
  370. package/ui/src/lib/components/shell/nav/Actions.svelte +31 -0
  371. package/ui/src/lib/components/shell/nav/Actions.ts +16 -0
  372. package/ui/src/lib/components/shell/nav/Back.svelte +20 -0
  373. package/ui/src/lib/components/shell/nav/Back.ts +9 -0
  374. package/ui/src/lib/components/shell/nav/Bar.svelte +24 -0
  375. package/ui/src/lib/components/shell/nav/Bar.ts +3 -0
  376. package/ui/src/lib/components/shell/nav/Button.svelte +64 -0
  377. package/ui/src/lib/components/shell/nav/Button.ts +7 -0
  378. package/ui/src/lib/components/shell/nav/Nav.svelte +62 -0
  379. package/ui/src/lib/components/shell/nav/Nav.ts +35 -0
  380. package/ui/src/lib/components/shell/nav/Return.svelte +29 -0
  381. package/ui/src/lib/components/shell/nav/Return.ts +15 -0
  382. package/ui/src/lib/components/shell/nav/Sections.svelte +58 -0
  383. package/ui/src/lib/components/shell/nav/Sections.ts +6 -0
  384. package/ui/src/lib/components/shell/nav/Toolbar.svelte +73 -0
  385. package/ui/src/lib/components/shell/nav/Toolbar.ts +3 -0
  386. package/ui/src/lib/components/shell/nav/history.ts +36 -0
  387. package/ui/src/lib/components/shell/nav/index.ts +5 -0
  388. package/ui/src/lib/components/shell/nav/store.ts +24 -0
  389. package/ui/src/lib/components/ui/alert/alert-action.svelte +20 -0
  390. package/ui/src/lib/components/ui/alert/alert-description.svelte +23 -0
  391. package/ui/src/lib/components/ui/alert/alert-title.svelte +23 -0
  392. package/ui/src/lib/components/ui/alert/alert.svelte +43 -0
  393. package/ui/src/lib/components/ui/alert/index.ts +17 -0
  394. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
  395. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
  396. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
  397. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  398. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
  399. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  400. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
  401. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
  402. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
  403. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  404. package/ui/src/lib/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  405. package/ui/src/lib/components/ui/alert-dialog/alert-dialog.svelte +7 -0
  406. package/ui/src/lib/components/ui/alert-dialog/index.ts +40 -0
  407. package/ui/src/lib/components/ui/badge/badge.svelte +49 -0
  408. package/ui/src/lib/components/ui/badge/index.ts +2 -0
  409. package/ui/src/lib/components/ui/button/button.svelte +82 -0
  410. package/ui/src/lib/components/ui/button/index.ts +17 -0
  411. package/ui/src/lib/components/ui/button-group/button-group-separator.svelte +23 -0
  412. package/ui/src/lib/components/ui/button-group/button-group-text.svelte +28 -0
  413. package/ui/src/lib/components/ui/button-group/button-group.svelte +46 -0
  414. package/ui/src/lib/components/ui/button-group/index.ts +15 -0
  415. package/ui/src/lib/components/ui/card/card-action.svelte +23 -0
  416. package/ui/src/lib/components/ui/card/card-content.svelte +20 -0
  417. package/ui/src/lib/components/ui/card/card-description.svelte +20 -0
  418. package/ui/src/lib/components/ui/card/card-footer.svelte +20 -0
  419. package/ui/src/lib/components/ui/card/card-header.svelte +23 -0
  420. package/ui/src/lib/components/ui/card/card-title.svelte +20 -0
  421. package/ui/src/lib/components/ui/card/card.svelte +22 -0
  422. package/ui/src/lib/components/ui/card/index.ts +25 -0
  423. package/ui/src/lib/components/ui/checkbox/checkbox.svelte +39 -0
  424. package/ui/src/lib/components/ui/checkbox/index.ts +6 -0
  425. package/ui/src/lib/components/ui/collapsible/collapsible-content.svelte +7 -0
  426. package/ui/src/lib/components/ui/collapsible/collapsible-trigger.svelte +7 -0
  427. package/ui/src/lib/components/ui/collapsible/collapsible.svelte +20 -0
  428. package/ui/src/lib/components/ui/collapsible/index.ts +13 -0
  429. package/ui/src/lib/components/ui/input/index.ts +7 -0
  430. package/ui/src/lib/components/ui/input/input.svelte +48 -0
  431. package/ui/src/lib/components/ui/input-otp/index.ts +15 -0
  432. package/ui/src/lib/components/ui/input-otp/input-otp-group.svelte +20 -0
  433. package/ui/src/lib/components/ui/input-otp/input-otp-separator.svelte +27 -0
  434. package/ui/src/lib/components/ui/input-otp/input-otp-slot.svelte +31 -0
  435. package/ui/src/lib/components/ui/input-otp/input-otp.svelte +23 -0
  436. package/ui/src/lib/components/ui/item/index.ts +34 -0
  437. package/ui/src/lib/components/ui/item/item-actions.svelte +20 -0
  438. package/ui/src/lib/components/ui/item/item-content.svelte +23 -0
  439. package/ui/src/lib/components/ui/item/item-description.svelte +23 -0
  440. package/ui/src/lib/components/ui/item/item-footer.svelte +20 -0
  441. package/ui/src/lib/components/ui/item/item-group.svelte +21 -0
  442. package/ui/src/lib/components/ui/item/item-header.svelte +20 -0
  443. package/ui/src/lib/components/ui/item/item-media.svelte +42 -0
  444. package/ui/src/lib/components/ui/item/item-separator.svelte +19 -0
  445. package/ui/src/lib/components/ui/item/item-title.svelte +20 -0
  446. package/ui/src/lib/components/ui/item/item.svelte +61 -0
  447. package/ui/src/lib/components/ui/kbd/index.ts +10 -0
  448. package/ui/src/lib/components/ui/kbd/kbd-group.svelte +20 -0
  449. package/ui/src/lib/components/ui/kbd/kbd.svelte +23 -0
  450. package/ui/src/lib/components/ui/label/index.ts +7 -0
  451. package/ui/src/lib/components/ui/label/label.svelte +20 -0
  452. package/ui/src/lib/components/ui/progress/index.ts +7 -0
  453. package/ui/src/lib/components/ui/progress/progress.svelte +27 -0
  454. package/ui/src/lib/components/ui/select/index.ts +37 -0
  455. package/ui/src/lib/components/ui/select/select-content.svelte +45 -0
  456. package/ui/src/lib/components/ui/select/select-group-heading.svelte +21 -0
  457. package/ui/src/lib/components/ui/select/select-group.svelte +17 -0
  458. package/ui/src/lib/components/ui/select/select-item.svelte +40 -0
  459. package/ui/src/lib/components/ui/select/select-label.svelte +20 -0
  460. package/ui/src/lib/components/ui/select/select-portal.svelte +7 -0
  461. package/ui/src/lib/components/ui/select/select-scroll-down-button.svelte +20 -0
  462. package/ui/src/lib/components/ui/select/select-scroll-up-button.svelte +20 -0
  463. package/ui/src/lib/components/ui/select/select-separator.svelte +18 -0
  464. package/ui/src/lib/components/ui/select/select-trigger.svelte +29 -0
  465. package/ui/src/lib/components/ui/select/select.svelte +11 -0
  466. package/ui/src/lib/components/ui/separator/index.ts +7 -0
  467. package/ui/src/lib/components/ui/separator/separator.svelte +23 -0
  468. package/ui/src/lib/components/ui/spinner/index.ts +1 -0
  469. package/ui/src/lib/components/ui/spinner/spinner.svelte +18 -0
  470. package/ui/src/lib/components/ui/tabs/index.ts +18 -0
  471. package/ui/src/lib/components/ui/tabs/tabs-content.svelte +17 -0
  472. package/ui/src/lib/components/ui/tabs/tabs-list.svelte +40 -0
  473. package/ui/src/lib/components/ui/tabs/tabs-trigger.svelte +23 -0
  474. package/ui/src/lib/components/ui/tabs/tabs.svelte +19 -0
  475. package/ui/src/lib/components/ui/textarea/index.ts +7 -0
  476. package/ui/src/lib/components/ui/textarea/textarea.svelte +22 -0
  477. package/ui/src/lib/intl/bcp.ts +25 -0
  478. package/ui/src/lib/intl/built.js +18 -0
  479. package/ui/src/lib/intl/context.yaml +18 -0
  480. package/ui/src/lib/intl/en-US.yaml +6 -0
  481. package/ui/src/lib/intl/index.ts +65 -0
  482. package/ui/src/lib/intl/types.ts +19 -0
  483. package/ui/src/lib/tools/ago.ts +10 -0
  484. package/ui/src/lib/tools/assert.ts +3 -0
  485. package/ui/src/lib/tools/cap.ts +5 -0
  486. package/ui/src/lib/tools/clicks.ts +25 -0
  487. package/ui/src/lib/tools/contextmenu.ts +19 -0
  488. package/ui/src/lib/tools/convert.ts +32 -0
  489. package/ui/src/lib/tools/currency.test.ts +10 -0
  490. package/ui/src/lib/tools/currency.ts +55 -0
  491. package/ui/src/lib/tools/date.test.ts +21 -0
  492. package/ui/src/lib/tools/date.ts +35 -0
  493. package/ui/src/lib/tools/delay.ts +7 -0
  494. package/ui/src/lib/tools/image.ts +39 -0
  495. package/ui/src/lib/tools/index.ts +20 -0
  496. package/ui/src/lib/tools/location.ts +41 -0
  497. package/ui/src/lib/tools/metronome.ts +11 -0
  498. package/ui/src/lib/tools/mq.ts +84 -0
  499. package/ui/src/lib/tools/onsubmit.ts +21 -0
  500. package/ui/src/lib/tools/random.ts +15 -0
  501. package/ui/src/lib/tools/search.ts +25 -0
  502. package/ui/src/lib/tools/timeout.ts +26 -0
  503. package/ui/src/lib/tools/transition.ts +207 -0
  504. package/ui/src/lib/tools/types.ts +3 -0
  505. package/ui/src/lib/tools/uuid.test.ts +28 -0
  506. package/ui/src/lib/tools/uuid.ts +9 -0
  507. package/ui/src/lib/typeset.css +502 -0
  508. package/ui/src/lib/utils.ts +12 -0
  509. package/ui/src/routes/(private)/+layout.svelte +112 -0
  510. package/ui/src/routes/(private)/+page.svelte +7 -0
  511. package/ui/src/routes/(private)/[component]/+page.svelte +77 -0
  512. package/ui/src/routes/+layout.svelte +25 -0
  513. package/ui/src/routes/+layout.ts +14 -0
  514. package/ui/src/routes/layout.css +232 -0
  515. package/ui/static/robots.txt +3 -0
  516. package/ui/svelte.config.js +36 -0
  517. package/ui/tools/feat.js +43 -0
  518. package/ui/tools/hooks/README.md +13 -0
  519. package/ui/tools/hooks/guard-intl.sh +40 -0
  520. package/ui/tools/shad.js +7 -0
  521. package/ui/tsconfig.json +20 -0
  522. package/ui/vite.config.ts +8 -0
@@ -0,0 +1,91 @@
1
+ context: Mount 'iam' context
2
+ inputs:
3
+ auth:
4
+ refresh:
5
+ description:
6
+ input: |-
7
+ !js
8
+ (name) => `${name ? name + ", for" : "For"} security reasons, your credentials have expired. Please log in again to continue.`
9
+ context: Preserve html tags where appropriate
10
+ title:
11
+ input: Welcome back
12
+ continue:
13
+ input: Continue
14
+ signout:
15
+ input: Sign out
16
+ login:
17
+ input: Login
18
+ signin:
19
+ input: Sign In
20
+ copyId:
21
+ input: Copy the account id
22
+ context: accessible name of the button that copies the id; the button itself shows only its first characters
23
+ credentials:
24
+ connect:
25
+ input: Connect
26
+ context: Inert CTA button on a provider row
27
+ email:
28
+ title:
29
+ input: Email
30
+ context: Provider name
31
+ description:
32
+ input: Connect your email address
33
+ google:
34
+ title:
35
+ input: Google
36
+ description:
37
+ input: Connect your Google account
38
+ context: Google provider row description
39
+ apple:
40
+ title:
41
+ input: Apple
42
+ description:
43
+ input: Connect your Apple ID
44
+ context: Apple provider row description
45
+ passkeys:
46
+ title:
47
+ input: Passkeys
48
+ context: card title for the passkey manager
49
+ tagline:
50
+ input: Sign in faster with a passkey
51
+ context: shown when the user has no passkeys yet
52
+ create:
53
+ input: Create
54
+ manage:
55
+ input: Manage
56
+ context: CTA to expand the passkey list
57
+ collapse:
58
+ input: Collapse
59
+ context: CTA to close the expanded passkey card
60
+ add:
61
+ input: Enter passkey name
62
+ context: input placeholder for naming a new passkey
63
+ delete:
64
+ input: Hold to delete
65
+ context: press-and-hold label to remove a passkey
66
+ unknown:
67
+ input: Unknown
68
+ context: fallback name for an unrecognized authenticator
69
+ count:
70
+ input: "{n} passkey"
71
+ meta:
72
+ input: "!js (added, used) => `Added ${added} · Used ${used}`"
73
+ duplicate:
74
+ input: This device already has a passkey for your account
75
+ context: error shown under the passkey name field when registration is refused as a duplicate
76
+ failed:
77
+ input: Could not create the passkey. Please try again.
78
+ context: generic error shown under the passkey name field when registration fails
79
+ transfer:
80
+ action:
81
+ input: Sign in on another device
82
+ context: ghost button label that opens a QR dialog to transfer the session to a second device
83
+ title:
84
+ input: Scan to sign in
85
+ context: title of the QR login dialog
86
+ description:
87
+ input: Use your other device to scan this code and sign in.
88
+ context: description under the QR code in the login dialog
89
+ done:
90
+ input: Done
91
+ context: button that closes the QR login dialog
@@ -0,0 +1,64 @@
1
+ auth:
2
+ signupTitle: One-tap sign-up
3
+ passwordTitle: Hop in with password
4
+ passwordDescription: Create an account or sign in
5
+ passkey: Passkeys
6
+ email: Email
7
+ alreadyHaveAccount: Already have an account?
8
+ betterSecurity: Better security
9
+ passkeysNotSupported: Passkeys not supported
10
+ passkeysWarning: Your browser does not respect your privacy and security.
11
+ learnMore: Learn more
12
+ passwordBlank: Leave password blank <nobr>to receive</nobr> <nobr>a one-time</nobr> passcode.
13
+ otpInstructions: Enter the code sent to your email. It expires in 5 minutes.
14
+ continueWith: |
15
+ !js
16
+ (provider) => {
17
+ return `Continue with ${provider}`
18
+ }
19
+ passkeysDescription: Passkeys are safer than passwords, easier to use, and can’t be stolen.
20
+ yourName: Your name
21
+ password: Password
22
+ refresh:
23
+ description: |-
24
+ !js
25
+ (name) => `${name ? name + ", for" : "For"} security reasons, your credentials have expired. Please log in again to continue.`
26
+ title: Welcome back
27
+ continue: Continue
28
+ signout: Sign out
29
+ login: Log In
30
+ signin: Sign In
31
+ copyId: Copy account ID
32
+ credentials:
33
+ connect: Connect
34
+ email:
35
+ title: Email
36
+ description: Connect your email address
37
+ google:
38
+ title: Google
39
+ description: Connect your Google account
40
+ apple:
41
+ title: Apple
42
+ description: Connect your Apple ID
43
+ passkeys:
44
+ title: Passkeys
45
+ tagline: Sign in faster with a passkey
46
+ create: Create
47
+ manage: Manage
48
+ collapse: Collapse
49
+ add: Enter passkey name
50
+ delete: Hold to delete
51
+ unknown: Unknown
52
+ count:
53
+ - one: "{n} passkey"
54
+ other: "{n} passkeys"
55
+ meta: |-
56
+ !js
57
+ (added, used) => `Added ${added} · Used ${used}`
58
+ duplicate: This device already has a passkey for your account
59
+ failed: Could not create the passkey. Please try again.
60
+ transfer:
61
+ action: Sign in on another device
62
+ title: Scan to sign in
63
+ description: Use your other device to scan this code and sign in.
64
+ done: Done
@@ -0,0 +1,10 @@
1
+ import { derived } from 'svelte/store'
2
+ import { locale } from '$lib/intl'
3
+ import { dictionaries } from './built.js'
4
+ import type { Dictionary } from './types'
5
+ import type { Locale } from '$lib/intl'
6
+
7
+ const dict = derived(locale, ($locale) => dictionaries[$locale])
8
+
9
+ export { dict, dictionaries, locale }
10
+ export type { Locale, Dictionary }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Auto-generated TypeScript definitions for i18n dictionaries
3
+ *
4
+ * @author copilot
5
+ */
6
+
7
+ export type Dictionary = {
8
+ auth: {
9
+ signupTitle: string
10
+ passwordTitle: string
11
+ passwordDescription: string
12
+ passkey: string
13
+ email: string
14
+ alreadyHaveAccount: string
15
+ betterSecurity: string
16
+ passkeysNotSupported: string
17
+ passkeysWarning: string
18
+ learnMore: string
19
+ passwordBlank: string
20
+ otpInstructions: string
21
+ continueWith: (value: any) => string
22
+ passkeysDescription: string
23
+ yourName: string
24
+ password: string
25
+ refresh: {
26
+ description: (value: any) => string
27
+ title: string
28
+ continue: string
29
+ }
30
+ signout: string
31
+ login: string
32
+ signin: string
33
+ copyId: string
34
+ }
35
+ credentials: {
36
+ connect: string
37
+ email: {
38
+ title: string
39
+ description: string
40
+ }
41
+ google: {
42
+ title: string
43
+ description: string
44
+ }
45
+ apple: {
46
+ title: string
47
+ description: string
48
+ }
49
+ passkeys: {
50
+ title: string
51
+ tagline: string
52
+ create: string
53
+ manage: string
54
+ collapse: string
55
+ add: string
56
+ delete: string
57
+ unknown: string
58
+ count: (value: number) => string
59
+ meta: (...args: [any, any]) => string
60
+ duplicate: string
61
+ failed: string
62
+ }
63
+ transfer: {
64
+ action: string
65
+ title: string
66
+ description: string
67
+ done: string
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import { oidc } from '@/iam'
3
+ import Button from './Button.svelte'
4
+ import type { Props } from './Authentication'
5
+
6
+ const { account }: Props = $props()
7
+ </script>
8
+
9
+ <div class="flex gap-2">
10
+ {#if oidc.providers.google.client}
11
+ <Button idp="google" {account} />
12
+ {/if}
13
+ {#if oidc.providers.apple.client}
14
+ <Button idp="apple" {account} />
15
+ {/if}
16
+ </div>
@@ -0,0 +1,5 @@
1
+ import type { AccountLike } from '../AccountLike'
2
+
3
+ export interface Props {
4
+ account?: AccountLike
5
+ }
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { oidc } from '@/iam'
3
+ import { Spinner } from '$ui/spinner'
4
+ import { Button } from '$ui/button'
5
+ import { cn } from '$lib/utils'
6
+ import { icons } from './icons'
7
+ import type { Props } from './Button'
8
+
9
+ const { idp, children, account, class: classes }: Props = $props()
10
+
11
+ const Icon = $derived(icons[idp])
12
+
13
+ async function onclick(event: MouseEvent) {
14
+ const button = event.currentTarget as HTMLButtonElement
15
+
16
+ button.disabled = true
17
+
18
+ await oidc.authenticate(idp, account?.id)
19
+
20
+ button.disabled = false
21
+ }
22
+ </script>
23
+
24
+ <Button
25
+ variant="outline"
26
+ size={children ? 'default' : 'icon'}
27
+ {onclick}
28
+ class={cn(
29
+ 'disabled:[&_.x-icon]:hidden [&_.x-spinner]:hidden disabled:[&_.x-spinner]:block',
30
+ classes,
31
+ )}
32
+ >
33
+ <Icon class="x-icon" />
34
+ <Spinner class="x-spinner" />
35
+ {@render children?.()}
36
+ </Button>
@@ -0,0 +1,11 @@
1
+ import type { ClassValue } from 'svelte/elements'
2
+ import type { Snippet } from 'svelte'
3
+ import type { oidc } from '@/iam'
4
+ import type { AccountLike } from '../AccountLike'
5
+
6
+ export interface Props {
7
+ idp: oidc.IDP
8
+ children?: Snippet
9
+ account?: AccountLike
10
+ class?: ClassValue
11
+ }
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import { dict } from '@/iam/ui/intl'
3
+ import Button from './Button.svelte'
4
+ import type { oidc } from '@/iam'
5
+
6
+ const { idp }: { idp: oidc.IDP } = $props()
7
+
8
+ const names: Record<oidc.IDP, string> = {
9
+ google: 'Google',
10
+ apple: 'Apple',
11
+ }
12
+ </script>
13
+
14
+ <Button {idp} class="w-full">
15
+ {$dict.auth.continueWith(names[idp])}
16
+ </Button>
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { cn } from '$lib/utils'
3
+ import type { ClassValue } from 'svelte/elements'
4
+
5
+ const { fill, class: classes }: { fill?: string; class?: ClassValue } = $props()
6
+ </script>
7
+
8
+ <svg
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xml:space="preserve"
11
+ fill="currentColor"
12
+ viewBox="0 0 814 1000"
13
+ class={cn('size-5 -mt-[3px]', classes)}
14
+ >
15
+ <path
16
+ {fill}
17
+ d="M788.1 340.9c-5.8 4.5-108.2 62.2-108.2 190.5 0 148.4 130.3 200.9 134.2 202.2-.6 3.2-20.7 71.9-68.7 141.9-42.8 61.6-87.5 123.1-155.5 123.1s-85.5-39.5-164-39.5c-76.5 0-103.7 40.8-165.9 40.8s-105.6-57-155.5-127C46.7 790.7 0 663 0 541.8c0-194.4 126.4-297.5 250.8-297.5 66.1 0 121.2 43.4 162.7 43.4 39.5 0 101.1-46 176.3-46 28.5 0 130.9 2.6 198.3 99.2zm-234-181.5c31.1-36.9 53.1-88.1 53.1-139.3 0-7.1-.6-14.3-1.9-20.1-50.6 1.9-110.8 33.7-147.1 75.8-28.5 32.4-55.1 83.6-55.1 135.5 0 7.8 1.3 15.6 1.9 18.1 3.2.6 8.4 1.3 13.6 1.3 45.4 0 102.5-30.4 135.5-71.3z"
18
+ />
19
+ </svg>
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import type { ClassValue } from 'svelte/elements'
3
+
4
+ const { class: classes }: { class?: ClassValue } = $props()
5
+ </script>
6
+
7
+ <svg
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ width="20"
10
+ height="20"
11
+ viewBox="0 0 20 20"
12
+ fill="none"
13
+ class={classes}
14
+ >
15
+ <path
16
+ d="M19.84 10.2273C19.84 9.5182 19.7764 8.8364 19.6582 8.1818H10.24V12.05H15.6218C15.39 13.3 14.6855 14.3591 13.6264 15.0682V17.5773H16.8582C18.7491 15.8364 19.84 13.2727 19.84 10.2273Z"
17
+ fill="#4285F4"
18
+ />
19
+ <path
20
+ d="M10.24 20C12.94 20 15.2036 19.1045 16.8581 17.5773L13.6263 15.0682C12.7309 15.6682 11.5854 16.0227 10.24 16.0227C7.6354 16.0227 5.4309 14.2636 4.6445 11.9H1.3036V14.4909C2.9491 17.7591 6.3309 20 10.24 20Z"
21
+ fill="#34A853"
22
+ />
23
+ <path
24
+ d="M4.6445 11.9C4.4445 11.3 4.3309 10.6591 4.3309 10C4.3309 9.3409 4.4445 8.7 4.6445 8.1V5.5091H1.3036C0.6264 6.8591 0.24 8.3864 0.24 10C0.24 11.6136 0.6264 13.1409 1.3036 14.4909L4.6445 11.9Z"
25
+ fill="#FBBC04"
26
+ />
27
+ <path
28
+ d="M10.24 3.9773C11.7081 3.9773 13.0263 4.4818 14.0627 5.4727L16.9309 2.6045C15.1991 0.9909 12.9354 0 10.24 0C6.3309 0 2.9491 2.2409 1.3036 5.5091L4.6445 8.1C5.4309 5.7364 7.6354 3.9773 10.24 3.9773Z"
29
+ fill="#E94235"
30
+ />
31
+ </svg>
@@ -0,0 +1,11 @@
1
+ import Google from './Google.svelte'
2
+ import Apple from './Apple.svelte'
3
+ import type { Component } from 'svelte'
4
+ import type { oidc } from '@/iam'
5
+
6
+ const icons: Record<oidc.IDP, Component> = {
7
+ google: Google,
8
+ apple: Apple,
9
+ } as const
10
+
11
+ export { icons }
@@ -0,0 +1,2 @@
1
+ export { default as Authentication } from './Authentication.svelte'
2
+ export { default as Refresh } from './Refresh.svelte'
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ import { ShieldCheck, ShieldOff } from '@lucide/svelte'
3
+ import { supported } from '@/passkeys'
4
+ import { dict } from '@/iam/ui/intl'
5
+ import * as Card from '$ui/card'
6
+ import * as Alert from '$ui/alert'
7
+ import { cn } from '$lib/utils'
8
+ import { apple } from '$lib/tools'
9
+ import Login from './Login.svelte'
10
+ import Create from './Create.svelte'
11
+ import type { Props } from './Authentication'
12
+
13
+ const { class: classes, account, oncreate }: Props = $props()
14
+
15
+ const href = apple
16
+ ? 'https://support.apple.com/en-us/102195'
17
+ : 'https://support.google.com/accounts/answer/13548313'
18
+ </script>
19
+
20
+ {#snippet description()}
21
+ <p>
22
+ {$dict.auth.passkeysDescription}
23
+ <a {href} target="_blank" class="text-nowrap">
24
+ {$dict.auth.learnMore}
25
+ </a>
26
+ </p>
27
+ {/snippet}
28
+
29
+ <div class="space-y-4">
30
+ <Card.Root class={cn('gap-4 bg-background/75', supported && 'pt-4', classes)}>
31
+ {#if supported}
32
+ <Card.Header class="gap-0">
33
+ <Card.Title><h2>{$dict.auth.signupTitle}</h2></Card.Title>
34
+ </Card.Header>
35
+ <Card.Content>
36
+ <Create {account} {oncreate} />
37
+ </Card.Content>
38
+ {/if}
39
+ <Card.Footer>
40
+ {#if supported}
41
+ <Alert.Root>
42
+ <ShieldCheck color="green" />
43
+ <Alert.Title>{$dict.auth.betterSecurity}</Alert.Title>
44
+ <Alert.Description>
45
+ {@render description()}
46
+ </Alert.Description>
47
+ </Alert.Root>
48
+ {:else}
49
+ <Alert.Root>
50
+ <ShieldOff color="red" class="animate-pulse" />
51
+ <Alert.Title>{$dict.auth.passkeysNotSupported}</Alert.Title>
52
+ <Alert.Description>
53
+ <p>{$dict.auth.passkeysWarning}</p>
54
+ {@render description()}
55
+ </Alert.Description>
56
+ </Alert.Root>
57
+ {/if}
58
+ </Card.Footer>
59
+ </Card.Root>
60
+
61
+ {#if supported && !account}
62
+ <Login />
63
+ {/if}
64
+ </div>
@@ -0,0 +1,8 @@
1
+ import type { ClassValue } from 'svelte/elements'
2
+ import type { AccountLike } from '../AccountLike'
3
+
4
+ export interface Props {
5
+ account?: AccountLike
6
+ class?: ClassValue
7
+ oncreate?: (account: AccountLike) => void
8
+ }
@@ -0,0 +1,53 @@
1
+ <script lang="ts">
2
+ import { ArrowRight } from '@lucide/svelte'
3
+ import { dict } from '@/iam/ui/intl'
4
+ import { passkeys } from '@/iam'
5
+ import { Spinner } from '$ui/spinner'
6
+ import { Input } from '$ui/input'
7
+ import { Button } from '$ui/button'
8
+ import { autofocus, onsubmit } from '$lib/tools'
9
+ import type { Props } from './Create'
10
+
11
+ const { account, disabled, oncreate }: Props = $props()
12
+
13
+ let value = $derived(account?.name ?? '')
14
+ let busy = $state(false)
15
+
16
+ async function submit() {
17
+ const name = value.trim()
18
+
19
+ if (name.length === 0) return
20
+
21
+ busy = true
22
+
23
+ const echo = await passkeys.create(name, account?.id)
24
+
25
+ busy = false
26
+
27
+ if (echo instanceof Error) return
28
+
29
+ oncreate?.(echo)
30
+ }
31
+ </script>
32
+
33
+ <form onsubmit={onsubmit(submit)}>
34
+ <fieldset class="space-y-1" {disabled}>
35
+ <div class="flex items-center gap-2">
36
+ <Input
37
+ bind:value
38
+ id="name"
39
+ type="text"
40
+ placeholder={$dict.auth.yourName}
41
+ autocomplete="given-name"
42
+ required
43
+ {autofocus} />
44
+ <Button id="iam-passkey-create-button" size="icon-lg" type="submit">
45
+ {#if busy}
46
+ <Spinner />
47
+ {:else}
48
+ <ArrowRight />
49
+ {/if}
50
+ </Button>
51
+ </div>
52
+ </fieldset>
53
+ </form>
@@ -0,0 +1,7 @@
1
+ import type { AccountLike } from '../AccountLike'
2
+
3
+ export interface Props {
4
+ account?: AccountLike
5
+ disabled?: boolean
6
+ oncreate?: (account: AccountLike) => void
7
+ }
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { Fingerprint } from '@lucide/svelte'
3
+ import { dict } from '@/iam/ui/intl'
4
+ import { passkeys } from '@/iam'
5
+ import { Spinner } from '$ui/spinner'
6
+ import { Button } from '$ui/button'
7
+
8
+ let busy = $state(false)
9
+
10
+ async function login() {
11
+ busy = true
12
+
13
+ await passkeys.login()
14
+
15
+ busy = false
16
+ }
17
+ </script>
18
+
19
+ <div class="flex flex-col items-center justify-center gap-2">
20
+ <p>{$dict.auth.alreadyHaveAccount}</p>
21
+ <Button id="iam-passkey-login-button" variant="secondary" onclick={login}>
22
+ {#if busy}
23
+ <Spinner />
24
+ {:else}
25
+ <Fingerprint />
26
+ {/if}
27
+ {$dict.auth.signin}
28
+ </Button>
29
+ </div>
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { Fingerprint } from '@lucide/svelte'
3
+ import { dict } from '@/iam/ui/intl'
4
+ import { passkeys } from '@/iam'
5
+ import { Spinner } from '$ui/spinner'
6
+ import { Button } from '$ui/button'
7
+ import type { AccountLike } from '../AccountLike'
8
+
9
+ const { account }: { account: AccountLike } = $props()
10
+
11
+ async function onclick(e: MouseEvent) {
12
+ const button = e.currentTarget as HTMLButtonElement
13
+
14
+ button.disabled = true
15
+
16
+ await passkeys.login(account.id)
17
+
18
+ button.disabled = false
19
+ }
20
+ </script>
21
+
22
+ <Button
23
+ class="w-full disabled:[&>.x-icon]:hidden [&>.x-spinner]:hidden disabled:[&>.x-spinner]:block"
24
+ {onclick}
25
+ >
26
+ <Fingerprint class="size-5 x-icon" />
27
+ <Spinner class="x-spinner" />
28
+ {$dict.auth.refresh.continue}
29
+ </Button>
@@ -0,0 +1,2 @@
1
+ export { default as Authentication } from './Authentication.svelte'
2
+ export { default as Refresh } from './Refresh.svelte'
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { dict } from '@/iam/ui/intl'
3
+ import * as Card from '$ui/card'
4
+ import { cn } from '$lib/utils'
5
+ import Form from './Form.svelte'
6
+ import type { Props } from './Authentication'
7
+
8
+ const { class: classes, account, oncreate }: Props = $props()
9
+ </script>
10
+
11
+ <Card.Root class={cn('pt-4 gap-4 bg-background/75', classes)}>
12
+ <Card.Header class="gap-0">
13
+ <Card.Title><h2>{$dict.auth.passwordTitle}</h2></Card.Title>
14
+ <Card.Description>{$dict.auth.passwordDescription}</Card.Description>
15
+ </Card.Header>
16
+ <Card.Content>
17
+ <Form {account} {oncreate} />
18
+ </Card.Content>
19
+ </Card.Root>
@@ -0,0 +1,8 @@
1
+ import type { ClassValue } from 'svelte/elements'
2
+ import type { AccountLike } from '../AccountLike'
3
+
4
+ export interface Props {
5
+ account?: AccountLike
6
+ class?: ClassValue
7
+ oncreate?: (account: AccountLike) => void
8
+ }