@tollwyn/baukasten 0.0.2 → 1.2.3

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 (213) hide show
  1. package/README.md +254 -1
  2. package/dist/bin/check.d.ts +2 -0
  3. package/dist/bin/check.js +38 -0
  4. package/dist/bin/migrate.d.ts +2 -0
  5. package/dist/bin/migrate.js +111 -0
  6. package/dist/bin/stubs.d.ts +2 -0
  7. package/dist/bin/stubs.js +38 -0
  8. package/dist/bin/test-accounts.d.ts +2 -0
  9. package/dist/bin/test-accounts.js +62 -0
  10. package/dist/check.d.ts +20 -0
  11. package/dist/check.js +285 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +9 -0
  14. package/dist/product.d.ts +161 -0
  15. package/dist/product.js +152 -0
  16. package/dist/server/accounts.d.ts +128 -0
  17. package/dist/server/accounts.js +282 -0
  18. package/dist/server/adapter/db.d.ts +5 -0
  19. package/dist/server/adapter/db.js +63 -0
  20. package/dist/server/adapter/log.d.ts +3 -0
  21. package/dist/server/adapter/log.js +12 -0
  22. package/dist/server/adapter/mailer.d.ts +4 -0
  23. package/dist/server/adapter/mailer.js +56 -0
  24. package/dist/server/adapter/migrate.d.ts +21 -0
  25. package/dist/server/adapter/migrate.js +113 -0
  26. package/dist/server/adapter/secrets.d.ts +2 -0
  27. package/dist/server/adapter/secrets.js +40 -0
  28. package/dist/server/adapter/stripe.d.ts +11 -0
  29. package/dist/server/adapter/stripe.js +333 -0
  30. package/dist/server/api.d.ts +25 -0
  31. package/dist/server/api.js +98 -0
  32. package/dist/server/baukasten-migrations.d.ts +4 -0
  33. package/dist/server/baukasten-migrations.js +126 -0
  34. package/dist/server/billing.d.ts +94 -0
  35. package/dist/server/billing.js +349 -0
  36. package/dist/server/catalog.d.ts +39 -0
  37. package/dist/server/catalog.js +193 -0
  38. package/dist/server/config.d.ts +108 -0
  39. package/dist/server/config.js +244 -0
  40. package/dist/server/endpoints.d.ts +44 -0
  41. package/dist/server/endpoints.js +159 -0
  42. package/dist/server/fields.d.ts +7 -0
  43. package/dist/server/fields.js +18 -0
  44. package/dist/server/headers.d.ts +1 -0
  45. package/dist/server/headers.js +9 -0
  46. package/dist/server/health.d.ts +34 -0
  47. package/dist/server/health.js +116 -0
  48. package/dist/server/hook.d.ts +92 -0
  49. package/dist/server/hook.js +293 -0
  50. package/dist/server/index.d.ts +18 -0
  51. package/dist/server/index.js +11 -0
  52. package/dist/server/legal/de.d.ts +2 -0
  53. package/dist/server/legal/de.js +251 -0
  54. package/dist/server/legal/document.d.ts +37 -0
  55. package/dist/server/legal/document.js +30 -0
  56. package/dist/server/legal/en.d.ts +2 -0
  57. package/dist/server/legal/en.js +251 -0
  58. package/dist/server/legal/fleet.d.ts +114 -0
  59. package/dist/server/legal/fleet.js +89 -0
  60. package/dist/server/legal/index.d.ts +3 -0
  61. package/dist/server/legal/index.js +11 -0
  62. package/dist/server/limits.d.ts +58 -0
  63. package/dist/server/limits.js +76 -0
  64. package/dist/server/log.d.ts +26 -0
  65. package/dist/server/log.js +61 -0
  66. package/dist/server/machine.d.ts +4 -0
  67. package/dist/server/machine.js +57 -0
  68. package/dist/server/mail.d.ts +20 -0
  69. package/dist/server/mail.js +29 -0
  70. package/dist/server/messages.d.ts +105 -0
  71. package/dist/server/messages.js +232 -0
  72. package/dist/server/migrations.d.ts +28 -0
  73. package/dist/server/migrations.js +59 -0
  74. package/dist/server/openapi.d.ts +24 -0
  75. package/dist/server/openapi.js +173 -0
  76. package/dist/server/pages.d.ts +158 -0
  77. package/dist/server/pages.js +491 -0
  78. package/dist/server/ports.d.ts +273 -0
  79. package/dist/server/ports.js +1 -0
  80. package/dist/server/runs.d.ts +30 -0
  81. package/dist/server/runs.js +55 -0
  82. package/dist/server/sales.d.ts +38 -0
  83. package/dist/server/sales.js +132 -0
  84. package/dist/server/services.d.ts +57 -0
  85. package/dist/server/services.js +44 -0
  86. package/dist/server/start.d.ts +14 -0
  87. package/dist/server/start.js +65 -0
  88. package/dist/server/stripe.d.ts +33 -0
  89. package/dist/server/stripe.js +29 -0
  90. package/dist/server/terms.d.ts +7 -0
  91. package/dist/server/terms.js +9 -0
  92. package/dist/server/test-accounts.d.ts +28 -0
  93. package/dist/server/test-accounts.js +62 -0
  94. package/dist/server/via.d.ts +9 -0
  95. package/dist/server/via.js +15 -0
  96. package/dist/server/web.d.ts +48 -0
  97. package/dist/server/web.js +105 -0
  98. package/dist/shopify/adapter/shopify.d.ts +8 -0
  99. package/dist/shopify/adapter/shopify.js +232 -0
  100. package/dist/shopify/admin.d.ts +33 -0
  101. package/dist/shopify/admin.js +47 -0
  102. package/dist/shopify/app.d.ts +60 -0
  103. package/dist/shopify/app.js +67 -0
  104. package/dist/shopify/config.d.ts +53 -0
  105. package/dist/shopify/config.js +133 -0
  106. package/dist/shopify/constants.d.ts +27 -0
  107. package/dist/shopify/constants.js +27 -0
  108. package/dist/shopify/headers.d.ts +1 -0
  109. package/dist/shopify/headers.js +8 -0
  110. package/dist/shopify/hmac.d.ts +1 -0
  111. package/dist/shopify/hmac.js +9 -0
  112. package/dist/shopify/hook.d.ts +60 -0
  113. package/dist/shopify/hook.js +508 -0
  114. package/dist/shopify/id-token.d.ts +12 -0
  115. package/dist/shopify/id-token.js +66 -0
  116. package/dist/shopify/index.d.ts +19 -0
  117. package/dist/shopify/index.js +15 -0
  118. package/dist/shopify/legal/de.d.ts +3 -0
  119. package/dist/shopify/legal/de.js +123 -0
  120. package/dist/shopify/legal/en.d.ts +3 -0
  121. package/dist/shopify/legal/en.js +121 -0
  122. package/dist/shopify/legal/index.d.ts +19 -0
  123. package/dist/shopify/legal/index.js +8 -0
  124. package/dist/shopify/legal/shopify.d.ts +16 -0
  125. package/dist/shopify/legal/shopify.js +21 -0
  126. package/dist/shopify/migrations.d.ts +4 -0
  127. package/dist/shopify/migrations.js +67 -0
  128. package/dist/shopify/pages.d.ts +45 -0
  129. package/dist/shopify/pages.js +146 -0
  130. package/dist/shopify/ports.d.ts +77 -0
  131. package/dist/shopify/ports.js +1 -0
  132. package/dist/shopify/sales.d.ts +4 -0
  133. package/dist/shopify/sales.js +27 -0
  134. package/dist/shopify/scopes.d.ts +2 -0
  135. package/dist/shopify/scopes.js +13 -0
  136. package/dist/shopify/seal.d.ts +12 -0
  137. package/dist/shopify/seal.js +60 -0
  138. package/dist/shopify/shop.d.ts +4 -0
  139. package/dist/shopify/shop.js +15 -0
  140. package/dist/shopify/shops.d.ts +76 -0
  141. package/dist/shopify/shops.js +256 -0
  142. package/dist/shopify/sveltekit.d.ts +19 -0
  143. package/dist/shopify/sveltekit.js +18 -0
  144. package/dist/shopify/texts.d.ts +28 -0
  145. package/dist/shopify/texts.js +49 -0
  146. package/dist/shopify/toml.d.ts +22 -0
  147. package/dist/shopify/toml.js +125 -0
  148. package/dist/shopify/webhooks.d.ts +65 -0
  149. package/dist/shopify/webhooks.js +220 -0
  150. package/dist/stubs.d.ts +15 -0
  151. package/dist/stubs.js +287 -0
  152. package/dist/sveltekit.d.ts +20 -0
  153. package/dist/sveltekit.js +18 -0
  154. package/dist/testing/app.d.ts +36 -0
  155. package/dist/testing/app.js +155 -0
  156. package/dist/testing/browser.d.ts +21 -0
  157. package/dist/testing/browser.js +21 -0
  158. package/dist/testing/connection.d.ts +7 -0
  159. package/dist/testing/connection.js +303 -0
  160. package/dist/testing/database.d.ts +21 -0
  161. package/dist/testing/database.js +54 -0
  162. package/dist/testing/env-example.d.ts +4 -0
  163. package/dist/testing/env-example.js +33 -0
  164. package/dist/testing/index.d.ts +9 -0
  165. package/dist/testing/index.js +9 -0
  166. package/dist/testing/shopify-connection.d.ts +8 -0
  167. package/dist/testing/shopify-connection.js +313 -0
  168. package/dist/testing/shopify.d.ts +71 -0
  169. package/dist/testing/shopify.js +278 -0
  170. package/dist/testing/smtp.d.ts +38 -0
  171. package/dist/testing/smtp.js +165 -0
  172. package/dist/testing/stripe.d.ts +128 -0
  173. package/dist/testing/stripe.js +511 -0
  174. package/dist/texts.d.ts +139 -0
  175. package/dist/texts.js +265 -0
  176. package/dist/ui/AccountPage.svelte +143 -0
  177. package/dist/ui/AccountPage.svelte.d.ts +10 -0
  178. package/dist/ui/ConfirmEmailPage.svelte +21 -0
  179. package/dist/ui/ConfirmEmailPage.svelte.d.ts +10 -0
  180. package/dist/ui/ErrorPage.svelte +14 -0
  181. package/dist/ui/ErrorPage.svelte.d.ts +3 -0
  182. package/dist/ui/Field.svelte +12 -0
  183. package/dist/ui/Field.svelte.d.ts +10 -0
  184. package/dist/ui/ForgotPasswordPage.svelte +32 -0
  185. package/dist/ui/ForgotPasswordPage.svelte.d.ts +7 -0
  186. package/dist/ui/Form.svelte +30 -0
  187. package/dist/ui/Form.svelte.d.ts +11 -0
  188. package/dist/ui/Frame.svelte +84 -0
  189. package/dist/ui/Frame.svelte.d.ts +12 -0
  190. package/dist/ui/LegalPage.svelte +38 -0
  191. package/dist/ui/LegalPage.svelte.d.ts +9 -0
  192. package/dist/ui/Linked.svelte +5 -0
  193. package/dist/ui/Linked.svelte.d.ts +8 -0
  194. package/dist/ui/LoginPage.svelte +41 -0
  195. package/dist/ui/LoginPage.svelte.d.ts +10 -0
  196. package/dist/ui/LogoutPage.svelte +19 -0
  197. package/dist/ui/LogoutPage.svelte.d.ts +9 -0
  198. package/dist/ui/ResetPasswordPage.svelte +30 -0
  199. package/dist/ui/ResetPasswordPage.svelte.d.ts +10 -0
  200. package/dist/ui/SignupPage.svelte +52 -0
  201. package/dist/ui/SignupPage.svelte.d.ts +10 -0
  202. package/dist/ui/VerifyEmailPage.svelte +50 -0
  203. package/dist/ui/VerifyEmailPage.svelte.d.ts +10 -0
  204. package/dist/ui/base.css +287 -0
  205. package/dist/ui/data.d.ts +167 -0
  206. package/dist/ui/data.js +1 -0
  207. package/dist/ui/frame.d.ts +17 -0
  208. package/dist/ui/frame.js +27 -0
  209. package/dist/ui/index.d.ts +15 -0
  210. package/dist/ui/index.js +15 -0
  211. package/dist/variables.d.ts +20 -0
  212. package/dist/variables.js +62 -0
  213. package/package.json +88 -4
package/dist/texts.js ADDED
@@ -0,0 +1,265 @@
1
+ const en = {
2
+ frame: {
3
+ navigation: 'Main',
4
+ accountMenu: 'Account',
5
+ logIn: 'Log in',
6
+ signUp: 'Sign up',
7
+ account: 'Account',
8
+ logOut: 'Log out',
9
+ unverified: 'Please confirm your email address with the link we sent you.',
10
+ unverifiedLink: 'No email?',
11
+ legal: 'Legal',
12
+ imprint: 'Imprint',
13
+ privacy: 'Privacy',
14
+ terms: 'Terms'
15
+ },
16
+ error: {
17
+ notFound: 'Page not found',
18
+ failed: 'Something went wrong',
19
+ back: 'Back to the start page'
20
+ },
21
+ wait: 'Please wait …',
22
+ signup: {
23
+ email: 'Work email',
24
+ password: 'Password (at least 10 characters)',
25
+ terms: { before: 'I accept the ', link: 'terms', after: '.' },
26
+ business: 'I sign up for my business, not as a consumer.',
27
+ button: 'Create account',
28
+ haveAccount: { before: 'Already have an account? ', link: 'Log in', after: '.' },
29
+ takenLogIn: 'Log in',
30
+ takenReset: 'Set a new password'
31
+ },
32
+ login: {
33
+ title: 'Log in',
34
+ email: 'Email',
35
+ password: 'Password',
36
+ button: 'Log in',
37
+ forgot: 'Forgot your password?',
38
+ noAccount: { before: 'No account yet? ', link: 'Sign up', after: '.' },
39
+ verified: 'Your email address is confirmed. Log in to continue.',
40
+ emailChanged: 'Your email address was changed. Log in with the new one.'
41
+ },
42
+ logout: {
43
+ title: 'Log out',
44
+ button: 'Log out',
45
+ done: 'You are logged out.',
46
+ deleted: 'Your account and its data were deleted.',
47
+ again: 'Log in again'
48
+ },
49
+ forgot: {
50
+ title: 'Forgot your password?',
51
+ lead: 'We send you a link to set a new one.',
52
+ email: 'Email',
53
+ button: 'Send link',
54
+ sent: 'If an account exists for this address, we sent it a link to set a new password. The link is valid for one hour.',
55
+ again: 'Send again'
56
+ },
57
+ reset: {
58
+ title: 'Set a new password',
59
+ password: 'New password (at least 10 characters)',
60
+ button: 'Save password and log in',
61
+ invalid: {
62
+ before: 'This link is invalid, used or expired. ',
63
+ link: 'Ask for a new one',
64
+ after: '.'
65
+ }
66
+ },
67
+ verify: {
68
+ title: 'Confirm your email address',
69
+ button: 'Confirm email address',
70
+ apiAccount: 'Your account was created over the API. Set a password to log in here too, or leave it empty.',
71
+ password: 'Password (optional, at least 10 characters)',
72
+ invalid: 'This link is invalid, used or expired.',
73
+ newLink: { before: '', link: 'Ask for a new link', after: '.' },
74
+ logIn: { before: '', link: 'Log in', after: ' to get a new link.' },
75
+ pending: (email) => `We sent a link to ${email}. Open it to confirm your address.`,
76
+ unsent: 'We could not send the email. Please send it again.',
77
+ resend: 'Send the link again',
78
+ resent: (email) => `We sent a new link to ${email}.`,
79
+ confirmed: 'Your email address is confirmed.',
80
+ continue: 'Continue'
81
+ },
82
+ confirm: {
83
+ title: 'Confirm your new email address',
84
+ becomes: (email) => `Your login address becomes ${email}.`,
85
+ button: 'Confirm',
86
+ invalid: 'This link is invalid, used or expired.'
87
+ },
88
+ account: {
89
+ title: 'Account',
90
+ loggedIn: (email) => `You are logged in as ${email}.`,
91
+ verified: 'Your email address is confirmed.',
92
+ emailChanged: 'Your email address was changed.',
93
+ email: {
94
+ title: 'Email address',
95
+ current: (email) => `Your login address is ${email}.`,
96
+ new: 'New email address',
97
+ password: 'Your password',
98
+ button: 'Change email address',
99
+ sent: (email) => `We sent a link to ${email}. Your address changes once you open it; until then the old one stays.`
100
+ },
101
+ password: {
102
+ title: 'Password',
103
+ current: 'Current password',
104
+ new: 'New password (at least 10 characters)',
105
+ change: 'Change password',
106
+ set: 'Set password',
107
+ done: 'Your password was changed. Your other sessions were logged out.'
108
+ },
109
+ keys: {
110
+ title: 'API keys',
111
+ lead: (example) => `Send a key in the header "Authorization: Bearer ${example}". A key is shown only once, when you create it.`,
112
+ name: 'Name of the key',
113
+ button: 'Create key',
114
+ created: 'Your new key; it is shown only now:',
115
+ confirmFirst: 'Confirm your email address to create keys.',
116
+ none: 'You have no keys.',
117
+ columns: { name: 'Name', key: 'Key', created: 'Created' },
118
+ revoke: 'Revoke'
119
+ },
120
+ billing: {
121
+ title: 'Billing',
122
+ lead: 'Your payment method, invoices and subscription are with Stripe.',
123
+ button: 'Open billing'
124
+ },
125
+ delete: {
126
+ title: 'Delete account',
127
+ lead: 'This deletes your account and its data and ends your subscriptions at once, and cannot be undone. What the books need stays, without your email address.',
128
+ confirm: 'Type your email address to confirm',
129
+ button: 'Delete my account'
130
+ }
131
+ }
132
+ };
133
+ const de = {
134
+ frame: {
135
+ navigation: 'Hauptnavigation',
136
+ accountMenu: 'Konto',
137
+ logIn: 'Anmelden',
138
+ signUp: 'Registrieren',
139
+ account: 'Konto',
140
+ logOut: 'Abmelden',
141
+ unverified: 'Bitte bestätigen Sie Ihre E-Mail-Adresse mit dem Link, den wir Ihnen geschickt haben.',
142
+ unverifiedLink: 'Keine E-Mail erhalten?',
143
+ legal: 'Rechtliches',
144
+ imprint: 'Impressum',
145
+ privacy: 'Datenschutz',
146
+ terms: 'Bedingungen'
147
+ },
148
+ error: {
149
+ notFound: 'Seite nicht gefunden',
150
+ failed: 'Etwas ist schiefgegangen',
151
+ back: 'Zurück zur Startseite'
152
+ },
153
+ wait: 'Bitte warten …',
154
+ signup: {
155
+ email: 'Geschäftliche E-Mail-Adresse',
156
+ password: 'Passwort (mindestens 10 Zeichen)',
157
+ terms: { before: 'Ich akzeptiere die ', link: 'Bedingungen', after: '.' },
158
+ business: 'Ich registriere mich für mein Unternehmen, nicht als Konsument.',
159
+ button: 'Konto eröffnen',
160
+ haveAccount: { before: 'Sie haben schon ein Konto? ', link: 'Anmelden', after: '.' },
161
+ takenLogIn: 'Anmelden',
162
+ takenReset: 'Neues Passwort setzen'
163
+ },
164
+ login: {
165
+ title: 'Anmelden',
166
+ email: 'E-Mail-Adresse',
167
+ password: 'Passwort',
168
+ button: 'Anmelden',
169
+ forgot: 'Passwort vergessen?',
170
+ noAccount: { before: 'Noch kein Konto? ', link: 'Registrieren', after: '.' },
171
+ verified: 'Ihre E-Mail-Adresse ist bestätigt. Melden Sie sich an, um weiterzufahren.',
172
+ emailChanged: 'Ihre E-Mail-Adresse wurde geändert. Melden Sie sich mit der neuen an.'
173
+ },
174
+ logout: {
175
+ title: 'Abmelden',
176
+ button: 'Abmelden',
177
+ done: 'Sie sind abgemeldet.',
178
+ deleted: 'Ihr Konto und seine Daten wurden gelöscht.',
179
+ again: 'Wieder anmelden'
180
+ },
181
+ forgot: {
182
+ title: 'Passwort vergessen?',
183
+ lead: 'Wir schicken Ihnen einen Link, mit dem Sie ein neues setzen.',
184
+ email: 'E-Mail-Adresse',
185
+ button: 'Link senden',
186
+ sent: 'Falls zu dieser Adresse ein Konto besteht, haben wir ihr einen Link für ein neues Passwort geschickt. Der Link gilt eine Stunde.',
187
+ again: 'Nochmals senden'
188
+ },
189
+ reset: {
190
+ title: 'Neues Passwort setzen',
191
+ password: 'Neues Passwort (mindestens 10 Zeichen)',
192
+ button: 'Passwort speichern und anmelden',
193
+ invalid: {
194
+ before: 'Dieser Link ist ungültig, schon benutzt oder abgelaufen. ',
195
+ link: 'Fordern Sie einen neuen an',
196
+ after: '.'
197
+ }
198
+ },
199
+ verify: {
200
+ title: 'E-Mail-Adresse bestätigen',
201
+ button: 'E-Mail-Adresse bestätigen',
202
+ apiAccount: 'Ihr Konto wurde über die API eröffnet. Setzen Sie ein Passwort, um sich auch hier anzumelden, oder lassen Sie das Feld leer.',
203
+ password: 'Passwort (freiwillig, mindestens 10 Zeichen)',
204
+ invalid: 'Dieser Link ist ungültig, schon benutzt oder abgelaufen.',
205
+ newLink: { before: '', link: 'Fordern Sie einen neuen Link an', after: '.' },
206
+ logIn: { before: '', link: 'Melden Sie sich an', after: ', um einen neuen Link zu erhalten.' },
207
+ pending: (email) => `Wir haben einen Link an ${email} geschickt. Öffnen Sie ihn, um Ihre Adresse zu bestätigen.`,
208
+ unsent: 'Wir konnten die E-Mail nicht senden. Bitte senden Sie sie nochmals.',
209
+ resend: 'Link nochmals senden',
210
+ resent: (email) => `Wir haben einen neuen Link an ${email} geschickt.`,
211
+ confirmed: 'Ihre E-Mail-Adresse ist bestätigt.',
212
+ continue: 'Weiter'
213
+ },
214
+ confirm: {
215
+ title: 'Neue E-Mail-Adresse bestätigen',
216
+ becomes: (email) => `Ihre Anmeldeadresse wird ${email}.`,
217
+ button: 'Bestätigen',
218
+ invalid: 'Dieser Link ist ungültig, schon benutzt oder abgelaufen.'
219
+ },
220
+ account: {
221
+ title: 'Konto',
222
+ loggedIn: (email) => `Sie sind angemeldet als ${email}.`,
223
+ verified: 'Ihre E-Mail-Adresse ist bestätigt.',
224
+ emailChanged: 'Ihre E-Mail-Adresse wurde geändert.',
225
+ email: {
226
+ title: 'E-Mail-Adresse',
227
+ current: (email) => `Ihre Anmeldeadresse ist ${email}.`,
228
+ new: 'Neue E-Mail-Adresse',
229
+ password: 'Ihr Passwort',
230
+ button: 'E-Mail-Adresse ändern',
231
+ sent: (email) => `Wir haben einen Link an ${email} geschickt. Ihre Adresse ändert sich, sobald Sie ihn öffnen; bis dahin bleibt die alte.`
232
+ },
233
+ password: {
234
+ title: 'Passwort',
235
+ current: 'Aktuelles Passwort',
236
+ new: 'Neues Passwort (mindestens 10 Zeichen)',
237
+ change: 'Passwort ändern',
238
+ set: 'Passwort setzen',
239
+ done: 'Ihr Passwort wurde geändert. Ihre anderen Sitzungen wurden abgemeldet.'
240
+ },
241
+ keys: {
242
+ title: 'API-Schlüssel',
243
+ lead: (example) => `Senden Sie einen Schlüssel in der Kopfzeile «Authorization: Bearer ${example}». Ein Schlüssel wird nur einmal angezeigt, beim Anlegen.`,
244
+ name: 'Name des Schlüssels',
245
+ button: 'Schlüssel anlegen',
246
+ created: 'Ihr neuer Schlüssel; er wird nur jetzt angezeigt:',
247
+ confirmFirst: 'Bestätigen Sie Ihre E-Mail-Adresse, um Schlüssel anzulegen.',
248
+ none: 'Sie haben keine Schlüssel.',
249
+ columns: { name: 'Name', key: 'Schlüssel', created: 'Angelegt' },
250
+ revoke: 'Widerrufen'
251
+ },
252
+ billing: {
253
+ title: 'Abrechnung',
254
+ lead: 'Zahlungsmittel, Rechnungen und Abo verwalten Sie bei Stripe.',
255
+ button: 'Abrechnung öffnen'
256
+ },
257
+ delete: {
258
+ title: 'Konto löschen',
259
+ lead: 'Damit löschen Sie Ihr Konto und seine Daten und beenden Ihre Abos sofort, unwiderruflich. Was die Buchhaltung braucht, bleibt, ohne Ihre E-Mail-Adresse.',
260
+ confirm: 'Geben Sie zur Bestätigung Ihre E-Mail-Adresse ein',
261
+ button: 'Mein Konto löschen'
262
+ }
263
+ }
264
+ };
265
+ export const TEXTS = { en, de };
@@ -0,0 +1,143 @@
1
+ <script lang="ts">import Field from "./Field.svelte";
2
+ import Form from "./Form.svelte";
3
+ import { useFrame } from "./frame.js";
4
+ let { data, form } = $props();
5
+ const { t, name } = useFrame();
6
+ const a = t.account;
7
+ const account = $derived(data.account);
8
+ const created = $derived(form?.action === "createKey" ? form : null);
9
+ const emailForm = $derived(form?.action === "changeEmail" ? form : null);
10
+ const passwordForm = $derived(form?.action === "changePassword" ? form : null);
11
+ const deleteForm = $derived(form?.action === "delete" ? form : null);
12
+ </script>
13
+
14
+ <svelte:head>
15
+ <title>{a.title} – {name}</title>
16
+ </svelte:head>
17
+
18
+ <div class="bk-ui bk-narrow">
19
+ <h1>{a.title}</h1>
20
+ {#if account.notice === 'verified'}
21
+ <p class="bk-success" role="status">{a.verified}</p>
22
+ {:else if account.notice === 'emailChanged'}
23
+ <p class="bk-success" role="status">{a.emailChanged}</p>
24
+ {/if}
25
+
26
+ <section aria-labelledby="bk-email">
27
+ <h2 id="bk-email">{a.email.title}</h2>
28
+ <p>{a.email.current(account.email)}</p>
29
+ {#if emailForm?.sentTo}
30
+ <p class="bk-success" role="status">{a.email.sent(emailForm.sentTo)}</p>
31
+ {/if}
32
+ <Form action="?/changeEmail" button={a.email.button} error={emailForm?.error}>
33
+ <Field
34
+ label={a.email.new}
35
+ name="email"
36
+ type="email"
37
+ autocomplete="email"
38
+ required
39
+ value={emailForm?.email ?? ''}
40
+ />
41
+ {#if account.hasPassword}
42
+ <Field
43
+ label={a.email.password}
44
+ name="password"
45
+ type="password"
46
+ autocomplete="current-password"
47
+ required
48
+ />
49
+ {/if}
50
+ </Form>
51
+ </section>
52
+
53
+ <section aria-labelledby="bk-password">
54
+ <h2 id="bk-password">{a.password.title}</h2>
55
+ {#if passwordForm?.done}
56
+ <p class="bk-success" role="status">{a.password.done}</p>
57
+ {/if}
58
+ <Form
59
+ action="?/changePassword"
60
+ button={account.hasPassword ? a.password.change : a.password.set}
61
+ error={passwordForm?.error}
62
+ >
63
+ {#if account.hasPassword}
64
+ <Field
65
+ label={a.password.current}
66
+ name="current"
67
+ type="password"
68
+ autocomplete="current-password"
69
+ required
70
+ />
71
+ {/if}
72
+ <Field
73
+ label={a.password.new}
74
+ name="next"
75
+ type="password"
76
+ autocomplete="new-password"
77
+ minlength={10}
78
+ required
79
+ />
80
+ </Form>
81
+ </section>
82
+
83
+ <section aria-labelledby="bk-keys">
84
+ <h2 id="bk-keys">{a.keys.title}</h2>
85
+ <p class="bk-muted">{a.keys.lead(account.keyExample)}</p>
86
+ {#if created?.key}
87
+ <p class="bk-success" role="status">
88
+ {a.keys.created} <code class="bk-secret">{created.key}</code>
89
+ </p>
90
+ {/if}
91
+ {#if account.keys.length === 0}
92
+ <p>{a.keys.none}</p>
93
+ {:else}
94
+ <table class="bk-table">
95
+ <thead>
96
+ <tr>
97
+ <th>{a.keys.columns.name}</th>
98
+ <th>{a.keys.columns.key}</th>
99
+ <th>{a.keys.columns.created}</th>
100
+ <th></th>
101
+ </tr>
102
+ </thead>
103
+ <tbody>
104
+ {#each account.keys as key (key.id)}
105
+ <tr>
106
+ <td>{key.name}</td>
107
+ <td><code>{key.prefix}…</code></td>
108
+ <td>{key.created}</td>
109
+ <td>
110
+ <Form action="?/revokeKey" button={a.keys.revoke}>
111
+ <input type="hidden" name="id" value={key.id} />
112
+ </Form>
113
+ </td>
114
+ </tr>
115
+ {/each}
116
+ </tbody>
117
+ </table>
118
+ {/if}
119
+ {#if account.emailVerified}
120
+ <Form action="?/createKey" button={a.keys.button} error={created?.error}>
121
+ <Field label={a.keys.name} name="name" maxlength={80} />
122
+ </Form>
123
+ {:else}
124
+ <p class="bk-muted">{a.keys.confirmFirst}</p>
125
+ {/if}
126
+ </section>
127
+
128
+ {#if account.customer}
129
+ <section aria-labelledby="bk-billing">
130
+ <h2 id="bk-billing">{a.billing.title}</h2>
131
+ <p class="bk-muted">{a.billing.lead}</p>
132
+ <Form action="?/portal" button={a.billing.button} />
133
+ </section>
134
+ {/if}
135
+
136
+ <section aria-labelledby="bk-delete">
137
+ <h2 id="bk-delete">{a.delete.title}</h2>
138
+ <p class="bk-muted">{a.delete.lead}</p>
139
+ <Form action="?/delete" button={a.delete.button} error={deleteForm?.error}>
140
+ <Field label={a.delete.confirm} name="confirm" type="email" autocomplete="off" required />
141
+ </Form>
142
+ </section>
143
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { AccountData, AccountForm } from './data.js';
2
+ type $$ComponentProps = {
3
+ data: {
4
+ account: AccountData;
5
+ };
6
+ form?: AccountForm | null;
7
+ };
8
+ declare const AccountPage: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type AccountPage = ReturnType<typeof AccountPage>;
10
+ export default AccountPage;
@@ -0,0 +1,21 @@
1
+ <script lang="ts">import Form from "./Form.svelte";
2
+ import { useFrame } from "./frame.js";
3
+ let { data, form } = $props();
4
+ const { t, name } = useFrame();
5
+ </script>
6
+
7
+ <svelte:head>
8
+ <title>{t.confirm.title} – {name}</title>
9
+ </svelte:head>
10
+
11
+ <div class="bk-ui bk-narrow">
12
+ <h1>{t.confirm.title}</h1>
13
+ {#if data.confirm.newEmail === null}
14
+ <p class="bk-error" role="alert">{t.confirm.invalid}</p>
15
+ {:else}
16
+ <p>{t.confirm.becomes(data.confirm.newEmail)}</p>
17
+ <Form button={t.confirm.button} error={form?.error}>
18
+ <input type="hidden" name="token" value={data.confirm.token} />
19
+ </Form>
20
+ {/if}
21
+ </div>
@@ -0,0 +1,10 @@
1
+ import type { ConfirmData, ConfirmForm } from './data.js';
2
+ type $$ComponentProps = {
3
+ data: {
4
+ confirm: ConfirmData;
5
+ };
6
+ form?: ConfirmForm | null;
7
+ };
8
+ declare const ConfirmEmailPage: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type ConfirmEmailPage = ReturnType<typeof ConfirmEmailPage>;
10
+ export default ConfirmEmailPage;
@@ -0,0 +1,14 @@
1
+ <script lang="ts">import { page } from "$app/state";
2
+ import { useFrame } from "./frame.js";
3
+ const { t, name, link } = useFrame();
4
+ const heading = $derived(page.status === 404 ? t.error.notFound : t.error.failed);
5
+ </script>
6
+
7
+ <svelte:head>
8
+ <title>{heading} – {name}</title>
9
+ </svelte:head>
10
+
11
+ <div class="bk-ui bk-narrow">
12
+ <h1>{heading}</h1>
13
+ <p><a href={link('/')}>{t.error.back}</a></p>
14
+ </div>
@@ -0,0 +1,3 @@
1
+ declare const ErrorPage: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ErrorPage = ReturnType<typeof ErrorPage>;
3
+ export default ErrorPage;
@@ -0,0 +1,12 @@
1
+ <!--
2
+ A labelled input. Its value is a string from the start, so that it never shows "undefined", neither
3
+ in the HTML of the server nor after the hydration.
4
+ -->
5
+ <script lang="ts">let { label, name, type = "text", value = "", ...rest } = $props();
6
+ export {};
7
+ </script>
8
+
9
+ <label class="bk-field">
10
+ <span>{label}</span>
11
+ <input {name} {type} {value} {...rest} />
12
+ </label>
@@ -0,0 +1,10 @@
1
+ import type { HTMLInputAttributes } from 'svelte/elements';
2
+ type $$ComponentProps = {
3
+ label: string;
4
+ name: string;
5
+ type?: 'text' | 'email' | 'password';
6
+ value?: string;
7
+ } & Pick<HTMLInputAttributes, 'autocomplete' | 'required' | 'minlength' | 'maxlength'>;
8
+ declare const Field: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type Field = ReturnType<typeof Field>;
10
+ export default Field;
@@ -0,0 +1,32 @@
1
+ <script lang="ts">import Field from "./Field.svelte";
2
+ import Form from "./Form.svelte";
3
+ import { useFrame } from "./frame.js";
4
+ let { form } = $props();
5
+ const { t, name } = useFrame();
6
+ </script>
7
+
8
+ <svelte:head>
9
+ <title>{t.forgot.title} – {name}</title>
10
+ </svelte:head>
11
+
12
+ <div class="bk-ui bk-narrow">
13
+ <h1>{t.forgot.title}</h1>
14
+ {#if form?.sent}
15
+ <p class="bk-success" role="status">{t.forgot.sent}</p>
16
+ <Form button={t.forgot.again}>
17
+ <input type="hidden" name="email" value={form.email} />
18
+ </Form>
19
+ {:else}
20
+ <p class="bk-lead">{t.forgot.lead}</p>
21
+ <Form button={t.forgot.button} error={form?.error}>
22
+ <Field
23
+ label={t.forgot.email}
24
+ name="email"
25
+ type="email"
26
+ autocomplete="email"
27
+ required
28
+ value={form?.email ?? ''}
29
+ />
30
+ </Form>
31
+ {/if}
32
+ </div>
@@ -0,0 +1,7 @@
1
+ import type { ForgotForm } from './data.js';
2
+ type $$ComponentProps = {
3
+ form?: ForgotForm | null;
4
+ };
5
+ declare const ForgotPasswordPage: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type ForgotPasswordPage = ReturnType<typeof ForgotPasswordPage>;
7
+ export default ForgotPasswordPage;
@@ -0,0 +1,30 @@
1
+ <!--
2
+ A form of the baukasten or the product: posted to its action, enhanced once the page is interactive,
3
+ with its error and a waiting state that keeps it from being sent twice.
4
+ -->
5
+ <script lang="ts">import { enhance } from "$app/forms";
6
+ import { useFrame } from "./frame.js";
7
+ let { action, button, error, children } = $props();
8
+ const { t } = useFrame();
9
+ let pending = $state(false);
10
+ </script>
11
+
12
+ <form
13
+ class="bk-form"
14
+ method="POST"
15
+ {action}
16
+ aria-busy={pending}
17
+ use:enhance={() => {
18
+ pending = true;
19
+ return async ({ update }) => {
20
+ await update();
21
+ pending = false;
22
+ };
23
+ }}
24
+ >
25
+ {#if error}
26
+ <p class="bk-error" role="alert">{error}</p>
27
+ {/if}
28
+ {@render children?.()}
29
+ <button type="submit" disabled={pending}>{pending ? t.wait : button}</button>
30
+ </form>
@@ -0,0 +1,11 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ /** `?/name` for a named action; without it the default action of the page. */
4
+ action?: string;
5
+ button: string;
6
+ error?: string | null;
7
+ children?: Snippet;
8
+ };
9
+ declare const Form: import("svelte").Component<$$ComponentProps, {}, "">;
10
+ type Form = ReturnType<typeof Form>;
11
+ export default Form;
@@ -0,0 +1,84 @@
1
+ <!--
2
+ Once the page is interactive the frame marks <html data-hydrated>, on which the test helpers wait.
3
+ -->
4
+ <script lang="ts">import "./base.css";
5
+ import { onMount } from "svelte";
6
+ import { TEXTS } from "../texts.js";
7
+ import { provideFrame, withVia } from "./frame.js";
8
+ let { data, children } = $props();
9
+ const frame = $derived(data.frame);
10
+ const t = $derived(TEXTS[frame.language]);
11
+ const link = (path) => withVia(path, frame.via);
12
+ provideFrame({
13
+ get t() {
14
+ return t;
15
+ },
16
+ get name() {
17
+ return frame.name;
18
+ },
19
+ link
20
+ });
21
+ onMount(() => {
22
+ document.documentElement.dataset.hydrated = "";
23
+ });
24
+ </script>
25
+
26
+ <svelte:head>
27
+ {#if frame.brand}
28
+ <link rel="icon" href={frame.brand.icon.href} type={frame.brand.icon.type} />
29
+ <meta property="og:site_name" content={frame.name} />
30
+ <meta property="og:image" content={frame.brand.image} />
31
+ <meta property="og:image:width" content="1200" />
32
+ <meta property="og:image:height" content="630" />
33
+ {/if}
34
+ </svelte:head>
35
+
36
+ <div class="bk-page">
37
+ <header class="bk-head">
38
+ <a class="bk-name" href={link('/')}>
39
+ {#if frame.brand}
40
+ <img
41
+ class="bk-logo"
42
+ src={frame.brand.logo.src}
43
+ width={frame.brand.logo.width}
44
+ height={frame.brand.logo.height}
45
+ alt={frame.name}
46
+ />
47
+ {:else}
48
+ {frame.name}
49
+ {/if}
50
+ </a>
51
+ <nav class="bk-nav" aria-label={t.frame.navigation}>
52
+ {#each frame.navigation as item (item.href)}
53
+ <a href={link(item.href)}>{item.label}</a>
54
+ {/each}
55
+ </nav>
56
+ <nav class="bk-nav bk-account" aria-label={t.frame.accountMenu}>
57
+ {#if frame.account}
58
+ <a href="/account">{t.frame.account}</a>
59
+ <form method="POST" action="/logout">
60
+ <button class="bk-link" type="submit">{t.frame.logOut}</button>
61
+ </form>
62
+ {:else}
63
+ <a href={link('/login')}>{t.frame.logIn}</a>
64
+ <a class="bk-button" href={link('/signup')}>{t.frame.signUp}</a>
65
+ {/if}
66
+ </nav>
67
+ </header>
68
+ {#if frame.account && !frame.account.emailVerified}
69
+ <p class="bk-notice" role="status">
70
+ {t.frame.unverified}
71
+ <a href="/verify-email">{t.frame.unverifiedLink}</a>
72
+ </p>
73
+ {/if}
74
+ <main class="bk-main">
75
+ {@render children()}
76
+ </main>
77
+ <footer class="bk-foot">
78
+ <nav class="bk-nav" aria-label={t.frame.legal}>
79
+ <a href={link('/imprint')}>{t.frame.imprint}</a>
80
+ <a href={link('/privacy')}>{t.frame.privacy}</a>
81
+ <a href={link('/terms')}>{t.frame.terms}</a>
82
+ </nav>
83
+ </footer>
84
+ </div>