@tollwyn/baukasten 0.0.2 → 1.2.2
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.
- package/README.md +254 -1
- package/dist/bin/check.d.ts +2 -0
- package/dist/bin/check.js +38 -0
- package/dist/bin/migrate.d.ts +2 -0
- package/dist/bin/migrate.js +111 -0
- package/dist/bin/stubs.d.ts +2 -0
- package/dist/bin/stubs.js +38 -0
- package/dist/bin/test-accounts.d.ts +2 -0
- package/dist/bin/test-accounts.js +62 -0
- package/dist/check.d.ts +20 -0
- package/dist/check.js +285 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +9 -0
- package/dist/product.d.ts +161 -0
- package/dist/product.js +152 -0
- package/dist/server/accounts.d.ts +128 -0
- package/dist/server/accounts.js +282 -0
- package/dist/server/adapter/db.d.ts +5 -0
- package/dist/server/adapter/db.js +63 -0
- package/dist/server/adapter/log.d.ts +3 -0
- package/dist/server/adapter/log.js +12 -0
- package/dist/server/adapter/mailer.d.ts +4 -0
- package/dist/server/adapter/mailer.js +56 -0
- package/dist/server/adapter/migrate.d.ts +21 -0
- package/dist/server/adapter/migrate.js +113 -0
- package/dist/server/adapter/secrets.d.ts +2 -0
- package/dist/server/adapter/secrets.js +40 -0
- package/dist/server/adapter/stripe.d.ts +11 -0
- package/dist/server/adapter/stripe.js +333 -0
- package/dist/server/api.d.ts +25 -0
- package/dist/server/api.js +98 -0
- package/dist/server/baukasten-migrations.d.ts +4 -0
- package/dist/server/baukasten-migrations.js +126 -0
- package/dist/server/billing.d.ts +94 -0
- package/dist/server/billing.js +349 -0
- package/dist/server/catalog.d.ts +39 -0
- package/dist/server/catalog.js +193 -0
- package/dist/server/config.d.ts +108 -0
- package/dist/server/config.js +244 -0
- package/dist/server/endpoints.d.ts +44 -0
- package/dist/server/endpoints.js +159 -0
- package/dist/server/fields.d.ts +7 -0
- package/dist/server/fields.js +18 -0
- package/dist/server/headers.d.ts +1 -0
- package/dist/server/headers.js +9 -0
- package/dist/server/health.d.ts +34 -0
- package/dist/server/health.js +116 -0
- package/dist/server/hook.d.ts +92 -0
- package/dist/server/hook.js +293 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.js +11 -0
- package/dist/server/legal/de.d.ts +2 -0
- package/dist/server/legal/de.js +251 -0
- package/dist/server/legal/document.d.ts +37 -0
- package/dist/server/legal/document.js +30 -0
- package/dist/server/legal/en.d.ts +2 -0
- package/dist/server/legal/en.js +251 -0
- package/dist/server/legal/fleet.d.ts +114 -0
- package/dist/server/legal/fleet.js +89 -0
- package/dist/server/legal/index.d.ts +3 -0
- package/dist/server/legal/index.js +11 -0
- package/dist/server/limits.d.ts +58 -0
- package/dist/server/limits.js +76 -0
- package/dist/server/log.d.ts +26 -0
- package/dist/server/log.js +61 -0
- package/dist/server/machine.d.ts +4 -0
- package/dist/server/machine.js +57 -0
- package/dist/server/mail.d.ts +20 -0
- package/dist/server/mail.js +29 -0
- package/dist/server/messages.d.ts +105 -0
- package/dist/server/messages.js +232 -0
- package/dist/server/migrations.d.ts +28 -0
- package/dist/server/migrations.js +59 -0
- package/dist/server/openapi.d.ts +24 -0
- package/dist/server/openapi.js +173 -0
- package/dist/server/pages.d.ts +158 -0
- package/dist/server/pages.js +491 -0
- package/dist/server/ports.d.ts +273 -0
- package/dist/server/ports.js +1 -0
- package/dist/server/runs.d.ts +30 -0
- package/dist/server/runs.js +55 -0
- package/dist/server/sales.d.ts +38 -0
- package/dist/server/sales.js +132 -0
- package/dist/server/services.d.ts +57 -0
- package/dist/server/services.js +44 -0
- package/dist/server/start.d.ts +14 -0
- package/dist/server/start.js +65 -0
- package/dist/server/stripe.d.ts +33 -0
- package/dist/server/stripe.js +29 -0
- package/dist/server/terms.d.ts +7 -0
- package/dist/server/terms.js +9 -0
- package/dist/server/test-accounts.d.ts +28 -0
- package/dist/server/test-accounts.js +62 -0
- package/dist/server/via.d.ts +9 -0
- package/dist/server/via.js +15 -0
- package/dist/server/web.d.ts +48 -0
- package/dist/server/web.js +105 -0
- package/dist/shopify/adapter/shopify.d.ts +8 -0
- package/dist/shopify/adapter/shopify.js +232 -0
- package/dist/shopify/admin.d.ts +33 -0
- package/dist/shopify/admin.js +47 -0
- package/dist/shopify/app.d.ts +60 -0
- package/dist/shopify/app.js +67 -0
- package/dist/shopify/config.d.ts +53 -0
- package/dist/shopify/config.js +133 -0
- package/dist/shopify/constants.d.ts +27 -0
- package/dist/shopify/constants.js +27 -0
- package/dist/shopify/headers.d.ts +1 -0
- package/dist/shopify/headers.js +8 -0
- package/dist/shopify/hmac.d.ts +1 -0
- package/dist/shopify/hmac.js +9 -0
- package/dist/shopify/hook.d.ts +60 -0
- package/dist/shopify/hook.js +508 -0
- package/dist/shopify/id-token.d.ts +12 -0
- package/dist/shopify/id-token.js +66 -0
- package/dist/shopify/index.d.ts +19 -0
- package/dist/shopify/index.js +15 -0
- package/dist/shopify/legal/de.d.ts +3 -0
- package/dist/shopify/legal/de.js +123 -0
- package/dist/shopify/legal/en.d.ts +3 -0
- package/dist/shopify/legal/en.js +121 -0
- package/dist/shopify/legal/index.d.ts +19 -0
- package/dist/shopify/legal/index.js +8 -0
- package/dist/shopify/legal/shopify.d.ts +16 -0
- package/dist/shopify/legal/shopify.js +21 -0
- package/dist/shopify/migrations.d.ts +4 -0
- package/dist/shopify/migrations.js +67 -0
- package/dist/shopify/pages.d.ts +45 -0
- package/dist/shopify/pages.js +146 -0
- package/dist/shopify/ports.d.ts +77 -0
- package/dist/shopify/ports.js +1 -0
- package/dist/shopify/sales.d.ts +4 -0
- package/dist/shopify/sales.js +27 -0
- package/dist/shopify/scopes.d.ts +2 -0
- package/dist/shopify/scopes.js +13 -0
- package/dist/shopify/seal.d.ts +12 -0
- package/dist/shopify/seal.js +60 -0
- package/dist/shopify/shop.d.ts +4 -0
- package/dist/shopify/shop.js +15 -0
- package/dist/shopify/shops.d.ts +76 -0
- package/dist/shopify/shops.js +256 -0
- package/dist/shopify/sveltekit.d.ts +19 -0
- package/dist/shopify/sveltekit.js +18 -0
- package/dist/shopify/texts.d.ts +28 -0
- package/dist/shopify/texts.js +49 -0
- package/dist/shopify/toml.d.ts +22 -0
- package/dist/shopify/toml.js +125 -0
- package/dist/shopify/webhooks.d.ts +65 -0
- package/dist/shopify/webhooks.js +220 -0
- package/dist/stubs.d.ts +15 -0
- package/dist/stubs.js +287 -0
- package/dist/sveltekit.d.ts +20 -0
- package/dist/sveltekit.js +18 -0
- package/dist/testing/app.d.ts +36 -0
- package/dist/testing/app.js +155 -0
- package/dist/testing/browser.d.ts +21 -0
- package/dist/testing/browser.js +21 -0
- package/dist/testing/connection.d.ts +7 -0
- package/dist/testing/connection.js +303 -0
- package/dist/testing/database.d.ts +21 -0
- package/dist/testing/database.js +54 -0
- package/dist/testing/env-example.d.ts +4 -0
- package/dist/testing/env-example.js +33 -0
- package/dist/testing/index.d.ts +9 -0
- package/dist/testing/index.js +9 -0
- package/dist/testing/shopify-connection.d.ts +8 -0
- package/dist/testing/shopify-connection.js +313 -0
- package/dist/testing/shopify.d.ts +71 -0
- package/dist/testing/shopify.js +278 -0
- package/dist/testing/smtp.d.ts +38 -0
- package/dist/testing/smtp.js +165 -0
- package/dist/testing/stripe.d.ts +128 -0
- package/dist/testing/stripe.js +511 -0
- package/dist/texts.d.ts +139 -0
- package/dist/texts.js +265 -0
- package/dist/ui/AccountPage.svelte +143 -0
- package/dist/ui/AccountPage.svelte.d.ts +10 -0
- package/dist/ui/ConfirmEmailPage.svelte +21 -0
- package/dist/ui/ConfirmEmailPage.svelte.d.ts +10 -0
- package/dist/ui/ErrorPage.svelte +14 -0
- package/dist/ui/ErrorPage.svelte.d.ts +3 -0
- package/dist/ui/Field.svelte +12 -0
- package/dist/ui/Field.svelte.d.ts +10 -0
- package/dist/ui/ForgotPasswordPage.svelte +32 -0
- package/dist/ui/ForgotPasswordPage.svelte.d.ts +7 -0
- package/dist/ui/Form.svelte +30 -0
- package/dist/ui/Form.svelte.d.ts +11 -0
- package/dist/ui/Frame.svelte +84 -0
- package/dist/ui/Frame.svelte.d.ts +12 -0
- package/dist/ui/LegalPage.svelte +38 -0
- package/dist/ui/LegalPage.svelte.d.ts +9 -0
- package/dist/ui/Linked.svelte +5 -0
- package/dist/ui/Linked.svelte.d.ts +8 -0
- package/dist/ui/LoginPage.svelte +41 -0
- package/dist/ui/LoginPage.svelte.d.ts +10 -0
- package/dist/ui/LogoutPage.svelte +19 -0
- package/dist/ui/LogoutPage.svelte.d.ts +9 -0
- package/dist/ui/ResetPasswordPage.svelte +30 -0
- package/dist/ui/ResetPasswordPage.svelte.d.ts +10 -0
- package/dist/ui/SignupPage.svelte +52 -0
- package/dist/ui/SignupPage.svelte.d.ts +10 -0
- package/dist/ui/VerifyEmailPage.svelte +50 -0
- package/dist/ui/VerifyEmailPage.svelte.d.ts +10 -0
- package/dist/ui/base.css +287 -0
- package/dist/ui/data.d.ts +167 -0
- package/dist/ui/data.js +1 -0
- package/dist/ui/frame.d.ts +17 -0
- package/dist/ui/frame.js +27 -0
- package/dist/ui/index.d.ts +15 -0
- package/dist/ui/index.js +15 -0
- package/dist/variables.d.ts +20 -0
- package/dist/variables.js +62 -0
- package/package.json +88 -4
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import './base.css';
|
|
2
|
+
import { type Snippet } from 'svelte';
|
|
3
|
+
import type { FrameData } from './data.js';
|
|
4
|
+
type $$ComponentProps = {
|
|
5
|
+
data: {
|
|
6
|
+
frame: FrameData;
|
|
7
|
+
};
|
|
8
|
+
children: Snippet;
|
|
9
|
+
};
|
|
10
|
+
declare const Frame: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
11
|
+
type Frame = ReturnType<typeof Frame>;
|
|
12
|
+
export default Frame;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script lang="ts">import { useFrame } from "./frame.js";
|
|
2
|
+
let { data } = $props();
|
|
3
|
+
const { name } = useFrame();
|
|
4
|
+
const legal = $derived(data.legal);
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<!-- One line: whitespace between the pieces would show as a blank in the sentence. -->
|
|
8
|
+
<!-- prettier-ignore -->
|
|
9
|
+
{#snippet inline(parts: LegalInline[])}{#each parts as part, index (index)}{#if typeof part === 'string'}{part}{:else if part.kind === 'strong'}<strong>{part.text}</strong>{:else if part.kind === 'code'}<code>{part.text}</code>{:else}<a href={part.href}>{part.text}</a>{/if}{/each}{/snippet}
|
|
10
|
+
|
|
11
|
+
<svelte:head>
|
|
12
|
+
<title>{legal.title} – {name}</title>
|
|
13
|
+
</svelte:head>
|
|
14
|
+
|
|
15
|
+
<article class="bk-ui bk-legal">
|
|
16
|
+
<h1>{legal.title}</h1>
|
|
17
|
+
{#each legal.blocks as block, index (index)}
|
|
18
|
+
{#if block.kind === 'heading'}
|
|
19
|
+
<h2>{block.text}</h2>
|
|
20
|
+
{:else if block.kind === 'paragraph'}
|
|
21
|
+
<p>{@render inline(block.parts)}</p>
|
|
22
|
+
{:else if block.kind === 'note'}
|
|
23
|
+
<p class="bk-muted">{@render inline(block.parts)}</p>
|
|
24
|
+
{:else if block.kind === 'list'}
|
|
25
|
+
<ul>
|
|
26
|
+
{#each block.items as item, at (at)}
|
|
27
|
+
<li>{@render inline(item)}</li>
|
|
28
|
+
{/each}
|
|
29
|
+
</ul>
|
|
30
|
+
{:else}
|
|
31
|
+
<ol type="a">
|
|
32
|
+
{#each block.items as item, at (at)}
|
|
33
|
+
<li>{@render inline(item)}</li>
|
|
34
|
+
{/each}
|
|
35
|
+
</ol>
|
|
36
|
+
{/if}
|
|
37
|
+
{/each}
|
|
38
|
+
</article>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LegalData } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
legal: LegalData;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
declare const LegalPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type LegalPage = ReturnType<typeof LegalPage>;
|
|
9
|
+
export default LegalPage;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">import Field from "./Field.svelte";
|
|
2
|
+
import Form from "./Form.svelte";
|
|
3
|
+
import { useFrame } from "./frame.js";
|
|
4
|
+
import Linked from "./Linked.svelte";
|
|
5
|
+
let { data, form } = $props();
|
|
6
|
+
const { t, name, link } = useFrame();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<svelte:head>
|
|
10
|
+
<title>{t.login.title} – {name}</title>
|
|
11
|
+
</svelte:head>
|
|
12
|
+
|
|
13
|
+
<div class="bk-ui bk-narrow">
|
|
14
|
+
<h1>{t.login.title}</h1>
|
|
15
|
+
{#if data.login.notice === 'verified'}
|
|
16
|
+
<p class="bk-success" role="status">{t.login.verified}</p>
|
|
17
|
+
{:else if data.login.notice === 'emailChanged'}
|
|
18
|
+
<p class="bk-success" role="status">{t.login.emailChanged}</p>
|
|
19
|
+
{/if}
|
|
20
|
+
<Form button={t.login.button} error={form?.error}>
|
|
21
|
+
<Field
|
|
22
|
+
label={t.login.email}
|
|
23
|
+
name="email"
|
|
24
|
+
type="email"
|
|
25
|
+
autocomplete="email"
|
|
26
|
+
required
|
|
27
|
+
value={form?.email ?? ''}
|
|
28
|
+
/>
|
|
29
|
+
<Field
|
|
30
|
+
label={t.login.password}
|
|
31
|
+
name="password"
|
|
32
|
+
type="password"
|
|
33
|
+
autocomplete="current-password"
|
|
34
|
+
required
|
|
35
|
+
/>
|
|
36
|
+
</Form>
|
|
37
|
+
<p class="bk-muted">
|
|
38
|
+
<a href={link('/forgot-password')}>{t.login.forgot}</a> ·
|
|
39
|
+
<Linked text={t.login.noAccount} href={link('/signup')} />
|
|
40
|
+
</p>
|
|
41
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LoginData, LoginForm } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
login: LoginData;
|
|
5
|
+
};
|
|
6
|
+
form?: LoginForm | null;
|
|
7
|
+
};
|
|
8
|
+
declare const LoginPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type LoginPage = ReturnType<typeof LoginPage>;
|
|
10
|
+
export default LoginPage;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<script lang="ts">import Form from "./Form.svelte";
|
|
2
|
+
import { useFrame } from "./frame.js";
|
|
3
|
+
let { data } = $props();
|
|
4
|
+
const { t, name } = useFrame();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<svelte:head>
|
|
8
|
+
<title>{t.logout.title} – {name}</title>
|
|
9
|
+
</svelte:head>
|
|
10
|
+
|
|
11
|
+
<div class="bk-ui bk-narrow">
|
|
12
|
+
{#if data.logout.loggedIn}
|
|
13
|
+
<h1>{t.logout.title}</h1>
|
|
14
|
+
<Form button={t.logout.button} />
|
|
15
|
+
{:else}
|
|
16
|
+
<h1>{data.logout.deleted ? t.logout.deleted : t.logout.done}</h1>
|
|
17
|
+
<p><a href="/login">{t.logout.again}</a></p>
|
|
18
|
+
{/if}
|
|
19
|
+
</div>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LogoutData } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
logout: LogoutData;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
declare const LogoutPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type LogoutPage = ReturnType<typeof LogoutPage>;
|
|
9
|
+
export default LogoutPage;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script lang="ts">import Field from "./Field.svelte";
|
|
2
|
+
import Form from "./Form.svelte";
|
|
3
|
+
import { useFrame } from "./frame.js";
|
|
4
|
+
import Linked from "./Linked.svelte";
|
|
5
|
+
let { data, form } = $props();
|
|
6
|
+
const { t, name } = useFrame();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<svelte:head>
|
|
10
|
+
<title>{t.reset.title} – {name}</title>
|
|
11
|
+
</svelte:head>
|
|
12
|
+
|
|
13
|
+
<div class="bk-ui bk-narrow">
|
|
14
|
+
<h1>{t.reset.title}</h1>
|
|
15
|
+
{#if data.reset.valid}
|
|
16
|
+
<Form button={t.reset.button} error={form?.error}>
|
|
17
|
+
<input type="hidden" name="token" value={data.reset.token} />
|
|
18
|
+
<Field
|
|
19
|
+
label={t.reset.password}
|
|
20
|
+
name="password"
|
|
21
|
+
type="password"
|
|
22
|
+
autocomplete="new-password"
|
|
23
|
+
minlength={10}
|
|
24
|
+
required
|
|
25
|
+
/>
|
|
26
|
+
</Form>
|
|
27
|
+
{:else}
|
|
28
|
+
<p class="bk-error" role="alert"><Linked text={t.reset.invalid} href="/forgot-password" /></p>
|
|
29
|
+
{/if}
|
|
30
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ResetData, ResetForm } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
reset: ResetData;
|
|
5
|
+
};
|
|
6
|
+
form?: ResetForm | null;
|
|
7
|
+
};
|
|
8
|
+
declare const ResetPasswordPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type ResetPasswordPage = ReturnType<typeof ResetPasswordPage>;
|
|
10
|
+
export default ResetPasswordPage;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts">import Field from "./Field.svelte";
|
|
2
|
+
import Form from "./Form.svelte";
|
|
3
|
+
import { useFrame } from "./frame.js";
|
|
4
|
+
import Linked from "./Linked.svelte";
|
|
5
|
+
let { data, form } = $props();
|
|
6
|
+
const { t, name, link } = useFrame();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<svelte:head>
|
|
10
|
+
<title>{data.signup.heading} – {name}</title>
|
|
11
|
+
</svelte:head>
|
|
12
|
+
|
|
13
|
+
<div class="bk-ui bk-narrow">
|
|
14
|
+
<h1>{data.signup.heading}</h1>
|
|
15
|
+
<p class="bk-lead">{data.signup.lead}</p>
|
|
16
|
+
<Form button={t.signup.button} error={form?.error}>
|
|
17
|
+
{#if data.signup.via !== null}
|
|
18
|
+
<input type="hidden" name="via" value={data.signup.via} />
|
|
19
|
+
{/if}
|
|
20
|
+
<Field
|
|
21
|
+
label={t.signup.email}
|
|
22
|
+
name="email"
|
|
23
|
+
type="email"
|
|
24
|
+
autocomplete="email"
|
|
25
|
+
required
|
|
26
|
+
value={form?.email ?? ''}
|
|
27
|
+
/>
|
|
28
|
+
<Field
|
|
29
|
+
label={t.signup.password}
|
|
30
|
+
name="password"
|
|
31
|
+
type="password"
|
|
32
|
+
autocomplete="new-password"
|
|
33
|
+
minlength={10}
|
|
34
|
+
required
|
|
35
|
+
/>
|
|
36
|
+
<label class="bk-check">
|
|
37
|
+
<input type="checkbox" name="terms" value="accepted" required />
|
|
38
|
+
<span><Linked text={t.signup.terms} href={link('/terms')} /></span>
|
|
39
|
+
</label>
|
|
40
|
+
<label class="bk-check">
|
|
41
|
+
<input type="checkbox" name="business" value="confirmed" required />
|
|
42
|
+
<span>{t.signup.business}</span>
|
|
43
|
+
</label>
|
|
44
|
+
</Form>
|
|
45
|
+
{#if form?.taken}
|
|
46
|
+
<p>
|
|
47
|
+
<a href={link('/login')}>{t.signup.takenLogIn}</a> ·
|
|
48
|
+
<a href={link('/forgot-password')}>{t.signup.takenReset}</a>
|
|
49
|
+
</p>
|
|
50
|
+
{/if}
|
|
51
|
+
<p class="bk-muted"><Linked text={t.signup.haveAccount} href={link('/login')} /></p>
|
|
52
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SignupData, SignupForm } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
signup: SignupData;
|
|
5
|
+
};
|
|
6
|
+
form?: SignupForm | null;
|
|
7
|
+
};
|
|
8
|
+
declare const SignupPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type SignupPage = ReturnType<typeof SignupPage>;
|
|
10
|
+
export default SignupPage;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<script lang="ts">import Field from "./Field.svelte";
|
|
2
|
+
import Form from "./Form.svelte";
|
|
3
|
+
import { useFrame } from "./frame.js";
|
|
4
|
+
import Linked from "./Linked.svelte";
|
|
5
|
+
let { data, form } = $props();
|
|
6
|
+
const { t, name } = useFrame();
|
|
7
|
+
const verify = $derived(data.verify);
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<svelte:head>
|
|
11
|
+
<title>{t.verify.title} – {name}</title>
|
|
12
|
+
</svelte:head>
|
|
13
|
+
|
|
14
|
+
<div class="bk-ui bk-narrow">
|
|
15
|
+
<h1>{t.verify.title}</h1>
|
|
16
|
+
{#if verify.kind === 'link'}
|
|
17
|
+
{#if verify.valid}
|
|
18
|
+
<Form action="?/confirm" button={t.verify.button} error={form?.error}>
|
|
19
|
+
<input type="hidden" name="token" value={verify.token} />
|
|
20
|
+
{#if verify.needsPassword}
|
|
21
|
+
<p class="bk-muted">{t.verify.apiAccount}</p>
|
|
22
|
+
<Field
|
|
23
|
+
label={t.verify.password}
|
|
24
|
+
name="password"
|
|
25
|
+
type="password"
|
|
26
|
+
autocomplete="new-password"
|
|
27
|
+
minlength={10}
|
|
28
|
+
/>
|
|
29
|
+
{/if}
|
|
30
|
+
</Form>
|
|
31
|
+
{:else}
|
|
32
|
+
<p class="bk-error" role="alert">{t.verify.invalid}</p>
|
|
33
|
+
<p><Linked text={t.verify.newLink} href="/verify-email" /></p>
|
|
34
|
+
{/if}
|
|
35
|
+
{:else if verify.kind === 'pending'}
|
|
36
|
+
{#if form?.resent}
|
|
37
|
+
<p class="bk-success" role="status">{t.verify.resent(form.resent)}</p>
|
|
38
|
+
{:else if verify.unsent}
|
|
39
|
+
<p class="bk-error" role="status">{t.verify.unsent}</p>
|
|
40
|
+
{:else}
|
|
41
|
+
<p role="status">{t.verify.pending(verify.email)}</p>
|
|
42
|
+
{/if}
|
|
43
|
+
<Form action="?/resend" button={t.verify.resend} error={form?.error} />
|
|
44
|
+
{:else if verify.kind === 'confirmed'}
|
|
45
|
+
<p class="bk-success" role="status">{t.verify.confirmed}</p>
|
|
46
|
+
<p><a href="/account">{t.verify.continue}</a></p>
|
|
47
|
+
{:else}
|
|
48
|
+
<p><Linked text={t.verify.logIn} href="/login?next=%2Fverify-email" /></p>
|
|
49
|
+
{/if}
|
|
50
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { VerifyData, VerifyForm } from './data.js';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
data: {
|
|
4
|
+
verify: VerifyData;
|
|
5
|
+
};
|
|
6
|
+
form?: VerifyForm | null;
|
|
7
|
+
};
|
|
8
|
+
declare const VerifyEmailPage: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
9
|
+
type VerifyEmailPage = ReturnType<typeof VerifyEmailPage>;
|
|
10
|
+
export default VerifyEmailPage;
|
package/dist/ui/base.css
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This statement comes first, so it fixes the order of the layers, those of Tailwind 4 and Skeleton
|
|
3
|
+
* too (`properties` holds Tailwind's fallbacks for old browsers and must stay below its utilities).
|
|
4
|
+
* `bk-root` lies below everything, so that whatever the product brings wins over it. `bk` lies above
|
|
5
|
+
* Tailwind's base and below its components and utilities, and its element styles apply only inside
|
|
6
|
+
* the frame and the pages of the baukasten: the preflight does not strip their headings, lists and
|
|
7
|
+
* buttons, and a product's own pages get none of them.
|
|
8
|
+
*/
|
|
9
|
+
@layer bk-root, properties, theme, base, bk, components, utilities;
|
|
10
|
+
|
|
11
|
+
@layer bk-root {
|
|
12
|
+
:root {
|
|
13
|
+
--bk-text: #1f2328;
|
|
14
|
+
--bk-muted: #5c6670;
|
|
15
|
+
--bk-background: #ffffff;
|
|
16
|
+
--bk-surface: #f5f7f9;
|
|
17
|
+
--bk-border: #d5dbe1;
|
|
18
|
+
--bk-accent: #1f5fbf;
|
|
19
|
+
--bk-accent-text: #ffffff;
|
|
20
|
+
--bk-error: #b42318;
|
|
21
|
+
--bk-success: #1a7f37;
|
|
22
|
+
--bk-radius: 6px;
|
|
23
|
+
--bk-width: 64rem;
|
|
24
|
+
--bk-narrow: 28rem;
|
|
25
|
+
--bk-font: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
26
|
+
color-scheme: light;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
*,
|
|
30
|
+
*::before,
|
|
31
|
+
*::after {
|
|
32
|
+
box-sizing: border-box;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
body {
|
|
36
|
+
margin: 0;
|
|
37
|
+
font-family: var(--bk-font);
|
|
38
|
+
line-height: 1.5;
|
|
39
|
+
color: var(--bk-text);
|
|
40
|
+
background: var(--bk-background);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
a {
|
|
44
|
+
color: var(--bk-accent);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@layer bk {
|
|
49
|
+
.bk-page {
|
|
50
|
+
min-height: 100vh;
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.bk-head,
|
|
56
|
+
.bk-foot {
|
|
57
|
+
display: flex;
|
|
58
|
+
flex-wrap: wrap;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 0.5rem 1.5rem;
|
|
61
|
+
padding: 0.75rem 1.25rem;
|
|
62
|
+
border-bottom: 1px solid var(--bk-border);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.bk-foot {
|
|
66
|
+
margin-top: auto;
|
|
67
|
+
border-top: 1px solid var(--bk-border);
|
|
68
|
+
border-bottom: none;
|
|
69
|
+
font-size: 0.875rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.bk-name {
|
|
73
|
+
display: inline-flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
font-weight: 700;
|
|
76
|
+
color: var(--bk-text);
|
|
77
|
+
text-decoration: none;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.bk-logo {
|
|
81
|
+
display: block;
|
|
82
|
+
max-height: 2.5rem;
|
|
83
|
+
width: auto;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.bk-nav {
|
|
87
|
+
display: flex;
|
|
88
|
+
flex-wrap: wrap;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: 1rem;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.bk-account {
|
|
94
|
+
margin-left: auto;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.bk-account form {
|
|
98
|
+
margin: 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.bk-main {
|
|
102
|
+
width: 100%;
|
|
103
|
+
max-width: var(--bk-width);
|
|
104
|
+
margin: 0 auto;
|
|
105
|
+
padding: 1.5rem 1.25rem 3rem;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.bk-narrow {
|
|
109
|
+
max-width: var(--bk-narrow);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.bk-lead,
|
|
113
|
+
.bk-muted {
|
|
114
|
+
color: var(--bk-muted);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.bk-notice {
|
|
118
|
+
margin: 0;
|
|
119
|
+
padding: 0.6rem 1.25rem;
|
|
120
|
+
background: var(--bk-surface);
|
|
121
|
+
border-bottom: 1px solid var(--bk-border);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.bk-form {
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: column;
|
|
127
|
+
gap: 0.85rem;
|
|
128
|
+
margin: 1rem 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.bk-field {
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
gap: 0.3rem;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.bk-check {
|
|
138
|
+
display: flex;
|
|
139
|
+
gap: 0.5rem;
|
|
140
|
+
align-items: flex-start;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* What the browser gives these elements and Tailwind's preflight takes away, on the pages of the
|
|
144
|
+
baukasten only. */
|
|
145
|
+
.bk-ui h1 {
|
|
146
|
+
margin: 0.67em 0;
|
|
147
|
+
font-size: 2em;
|
|
148
|
+
font-weight: 700;
|
|
149
|
+
line-height: 1.2;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.bk-ui h2 {
|
|
153
|
+
margin: 0.83em 0;
|
|
154
|
+
font-size: 1.5em;
|
|
155
|
+
font-weight: 700;
|
|
156
|
+
line-height: 1.25;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.bk-ui p {
|
|
160
|
+
margin: 1em 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.bk-ui ul,
|
|
164
|
+
.bk-ui ol {
|
|
165
|
+
margin: 1em 0;
|
|
166
|
+
padding-left: 2.5em;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.bk-ui ul {
|
|
170
|
+
list-style: disc;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.bk-ui ol {
|
|
174
|
+
list-style: decimal;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.bk-ui ol[type='a'] {
|
|
178
|
+
list-style-type: lower-alpha;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.bk-ui code {
|
|
182
|
+
font-family: ui-monospace, 'SFMono-Regular', Menlo, Consolas, monospace;
|
|
183
|
+
font-size: 0.95em;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.bk-ui section {
|
|
187
|
+
margin-top: 2.25rem;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.bk-ui a,
|
|
191
|
+
.bk-head a,
|
|
192
|
+
.bk-foot a,
|
|
193
|
+
.bk-notice a {
|
|
194
|
+
color: var(--bk-accent);
|
|
195
|
+
text-decoration: underline;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.bk-head .bk-name {
|
|
199
|
+
color: var(--bk-text);
|
|
200
|
+
text-decoration: none;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
:is(.bk-ui, .bk-form) input:not([type='checkbox']) {
|
|
204
|
+
font: inherit;
|
|
205
|
+
padding: 0.5rem 0.6rem;
|
|
206
|
+
border: 1px solid var(--bk-border);
|
|
207
|
+
border-radius: var(--bk-radius);
|
|
208
|
+
background: var(--bk-background);
|
|
209
|
+
color: var(--bk-text);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
:is(.bk-ui, .bk-head, .bk-form) button,
|
|
213
|
+
.bk-button {
|
|
214
|
+
font: inherit;
|
|
215
|
+
align-self: flex-start;
|
|
216
|
+
padding: 0.5rem 1rem;
|
|
217
|
+
border: none;
|
|
218
|
+
border-radius: var(--bk-radius);
|
|
219
|
+
background: var(--bk-accent);
|
|
220
|
+
color: var(--bk-accent-text);
|
|
221
|
+
text-decoration: none;
|
|
222
|
+
cursor: pointer;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
:is(.bk-ui, .bk-head, .bk-form) button:disabled {
|
|
226
|
+
opacity: 0.6;
|
|
227
|
+
cursor: progress;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.bk-head .bk-button {
|
|
231
|
+
color: var(--bk-accent-text);
|
|
232
|
+
text-decoration: none;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
:is(.bk-ui, .bk-head, .bk-form) .bk-link {
|
|
236
|
+
padding: 0;
|
|
237
|
+
background: none;
|
|
238
|
+
color: var(--bk-accent);
|
|
239
|
+
text-decoration: underline;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.bk-error {
|
|
243
|
+
color: var(--bk-error);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.bk-success {
|
|
247
|
+
color: var(--bk-success);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.bk-secret {
|
|
251
|
+
display: block;
|
|
252
|
+
margin-top: 0.4rem;
|
|
253
|
+
padding: 0.5rem;
|
|
254
|
+
background: var(--bk-surface);
|
|
255
|
+
border-radius: var(--bk-radius);
|
|
256
|
+
overflow-wrap: anywhere;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.bk-table {
|
|
260
|
+
border-collapse: collapse;
|
|
261
|
+
margin: 0.5rem 0;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.bk-table th,
|
|
265
|
+
.bk-table td {
|
|
266
|
+
padding: 0.35rem 0.75rem 0.35rem 0;
|
|
267
|
+
text-align: left;
|
|
268
|
+
border-bottom: 1px solid var(--bk-border);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.bk-table .bk-form {
|
|
272
|
+
margin: 0;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.bk-legal {
|
|
276
|
+
max-width: 46rem;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.bk-legal h2 {
|
|
280
|
+
margin-top: 2rem;
|
|
281
|
+
font-size: 1.15rem;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.bk-legal li {
|
|
285
|
+
margin: 0.4rem 0;
|
|
286
|
+
}
|
|
287
|
+
}
|