@tekki-forge/runtime-admin 0.1.0
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 +5 -0
- package/dist/account.d.ts +1 -0
- package/dist/account.js +105 -0
- package/dist/account.js.map +1 -0
- package/dist/activity.d.ts +65 -0
- package/dist/activity.js +299 -0
- package/dist/activity.js.map +1 -0
- package/dist/admin-access.d.ts +4 -0
- package/dist/admin-access.js +177 -0
- package/dist/admin-access.js.map +1 -0
- package/dist/admin.d.ts +5 -0
- package/dist/admin.js +129 -0
- package/dist/admin.js.map +1 -0
- package/dist/auth-pages.d.ts +13 -0
- package/dist/auth-pages.js +207 -0
- package/dist/auth-pages.js.map +1 -0
- package/dist/brand-art.d.ts +24 -0
- package/dist/brand-art.js +33 -0
- package/dist/brand-art.js.map +1 -0
- package/dist/brand.d.ts +11 -0
- package/dist/brand.js +16 -0
- package/dist/brand.js.map +1 -0
- package/dist/charts.d.ts +23 -0
- package/dist/charts.js +259 -0
- package/dist/charts.js.map +1 -0
- package/dist/command-palette.d.ts +9 -0
- package/dist/command-palette.js +115 -0
- package/dist/command-palette.js.map +1 -0
- package/dist/context.d.ts +242 -0
- package/dist/context.js +107 -0
- package/dist/context.js.map +1 -0
- package/dist/dashboard.d.ts +66 -0
- package/dist/dashboard.js +144 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/fields.d.ts +71 -0
- package/dist/fields.js +326 -0
- package/dist/fields.js.map +1 -0
- package/dist/i18n/catalog.d.ts +7 -0
- package/dist/i18n/catalog.js +23 -0
- package/dist/i18n/catalog.js.map +1 -0
- package/dist/i18n/locale.d.ts +15 -0
- package/dist/i18n/locale.js +69 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages/de.d.ts +3 -0
- package/dist/i18n/messages/de.js +627 -0
- package/dist/i18n/messages/de.js.map +1 -0
- package/dist/i18n/messages/en.d.ts +3 -0
- package/dist/i18n/messages/en.js +627 -0
- package/dist/i18n/messages/en.js.map +1 -0
- package/dist/i18n/messages/es.d.ts +3 -0
- package/dist/i18n/messages/es.js +627 -0
- package/dist/i18n/messages/es.js.map +1 -0
- package/dist/i18n/messages/fr.d.ts +3 -0
- package/dist/i18n/messages/fr.js +627 -0
- package/dist/i18n/messages/fr.js.map +1 -0
- package/dist/i18n/messages/pt.d.ts +3 -0
- package/dist/i18n/messages/pt.js +627 -0
- package/dist/i18n/messages/pt.js.map +1 -0
- package/dist/i18n/validation.d.ts +3 -0
- package/dist/i18n/validation.js +36 -0
- package/dist/i18n/validation.js.map +1 -0
- package/dist/illustrations.d.ts +6 -0
- package/dist/illustrations.js +16 -0
- package/dist/illustrations.js.map +1 -0
- package/dist/import-dialog.d.ts +11 -0
- package/dist/import-dialog.js +152 -0
- package/dist/import-dialog.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-edit.d.ts +18 -0
- package/dist/inline-edit.js +115 -0
- package/dist/inline-edit.js.map +1 -0
- package/dist/landing.d.ts +79 -0
- package/dist/landing.js +122 -0
- package/dist/landing.js.map +1 -0
- package/dist/locale-switcher.d.ts +4 -0
- package/dist/locale-switcher.js +15 -0
- package/dist/locale-switcher.js.map +1 -0
- package/dist/map.d.ts +26 -0
- package/dist/map.js +232 -0
- package/dist/map.js.map +1 -0
- package/dist/notifications.d.ts +12 -0
- package/dist/notifications.js +75 -0
- package/dist/notifications.js.map +1 -0
- package/dist/record-mutation.d.ts +19 -0
- package/dist/record-mutation.js +39 -0
- package/dist/record-mutation.js.map +1 -0
- package/dist/resource-detail.d.ts +4 -0
- package/dist/resource-detail.js +96 -0
- package/dist/resource-detail.js.map +1 -0
- package/dist/resource-form.d.ts +11 -0
- package/dist/resource-form.js +92 -0
- package/dist/resource-form.js.map +1 -0
- package/dist/resource-list.d.ts +10 -0
- package/dist/resource-list.js +154 -0
- package/dist/resource-list.js.map +1 -0
- package/dist/saved-views.d.ts +16 -0
- package/dist/saved-views.js +64 -0
- package/dist/saved-views.js.map +1 -0
- package/dist/schema-editor-diagram.d.ts +14 -0
- package/dist/schema-editor-diagram.js +54 -0
- package/dist/schema-editor-diagram.js.map +1 -0
- package/dist/schema-editor.d.ts +98 -0
- package/dist/schema-editor.js +571 -0
- package/dist/schema-editor.js.map +1 -0
- package/dist/shell.d.ts +10 -0
- package/dist/shell.js +228 -0
- package/dist/shell.js.map +1 -0
- package/dist/skeleton.d.ts +25 -0
- package/dist/skeleton.js +34 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/theme-catalog.d.ts +71 -0
- package/dist/theme-catalog.js +55 -0
- package/dist/theme-catalog.js.map +1 -0
- package/dist/theme-head.d.ts +8 -0
- package/dist/theme-head.js +11 -0
- package/dist/theme-head.js.map +1 -0
- package/dist/theme-preview.d.ts +2 -0
- package/dist/theme-preview.js +23 -0
- package/dist/theme-preview.js.map +1 -0
- package/dist/theme-switcher.d.ts +20 -0
- package/dist/theme-switcher.js +159 -0
- package/dist/theme-switcher.js.map +1 -0
- package/dist/theme.d.ts +24 -0
- package/dist/theme.js +30 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.d.ts +21 -0
- package/dist/toast.js +51 -0
- package/dist/toast.js.map +1 -0
- package/dist/ui.d.ts +86 -0
- package/dist/ui.js +106 -0
- package/dist/ui.js.map +1 -0
- package/dist/views.d.ts +23 -0
- package/dist/views.js +238 -0
- package/dist/views.js.map +1 -0
- package/package.json +58 -0
- package/styles.css +778 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { KeyRound } from "lucide-react";
|
|
5
|
+
import Link from "next/link";
|
|
6
|
+
import { useRouter, useSearchParams } from "next/navigation";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { BrandPattern, brandMeshStyle } from "./brand-art.js";
|
|
9
|
+
import { BrandMark } from "./brand.js";
|
|
10
|
+
import { useForge, useT } from "./context.js";
|
|
11
|
+
import { Alert, Button, Card, FieldShell, Input, cn } from "./ui.js";
|
|
12
|
+
const PROVIDER_LABELS = { google: "Google", microsoft: "Microsoft", github: "GitHub", apple: "Apple", gitlab: "GitLab", discord: "Discord" };
|
|
13
|
+
/** Decorative brand panel: a gradient mesh from the theme's primary/accent plus a geometric line pattern (pure CSS/SVG). */
|
|
14
|
+
function BrandPanel() {
|
|
15
|
+
const { app } = useForge();
|
|
16
|
+
return (_jsxs("div", { className: "forge-auth-brand relative hidden overflow-hidden lg:flex lg:flex-col lg:justify-between", style: brandMeshStyle(app.name), children: [_jsx(BrandPattern, { name: app.name }), _jsxs("div", { className: "relative flex items-center gap-3 p-10", children: [_jsx(BrandMark, { size: "md", className: "forge-auth-mark" }), _jsx("span", { className: "text-lg font-semibold", children: app.name })] }), _jsxs("div", { className: "forge-auth-copy relative p-10 pt-24", children: [app.theme.tagline && _jsx("p", { className: "forge-heading max-w-md text-4xl leading-tight font-semibold tracking-tight text-balance", children: app.theme.tagline }), app.description && _jsx("p", { className: cn("max-w-md text-base opacity-90", app.theme.tagline ? "mt-4" : "forge-heading text-3xl leading-tight font-semibold tracking-tight"), children: app.description })] })] }));
|
|
17
|
+
}
|
|
18
|
+
function AuthLayout({ title, subtitle, children, footer }) {
|
|
19
|
+
const { app } = useForge();
|
|
20
|
+
return (_jsxs("div", { className: "forge-app-bg min-h-dvh lg:grid lg:grid-cols-[minmax(0,1.05fr)_minmax(0,1fr)]", children: [_jsx(BrandPanel, {}), _jsx("div", { className: "flex min-h-dvh items-center justify-center px-4 py-12 sm:px-8", children: _jsxs("div", { className: "forge-enter w-full max-w-sm", children: [_jsxs("div", { className: "mb-8 text-center lg:text-left", children: [_jsx("div", { className: "mb-4 flex justify-center lg:hidden", children: _jsx(BrandMark, { size: "md" }) }), _jsx("p", { className: "sr-only lg:hidden", children: app.name }), _jsx("h1", { className: "forge-heading text-2xl font-semibold tracking-tight text-ink", children: title }), subtitle && _jsx("p", { className: "mt-1.5 text-sm text-ink-muted", children: subtitle })] }), _jsx(Card, { className: "p-6", children: children }), footer && _jsx("p", { className: "mt-6 text-center text-sm text-ink-muted lg:text-left", children: footer })] }) })] }));
|
|
21
|
+
}
|
|
22
|
+
function safeNext(next) {
|
|
23
|
+
return next && next.startsWith("/") && !next.startsWith("//") ? next : "/";
|
|
24
|
+
}
|
|
25
|
+
function useSubmit() {
|
|
26
|
+
const [error, setError] = useState(null);
|
|
27
|
+
const [loading, setLoading] = useState(false);
|
|
28
|
+
const t = useT();
|
|
29
|
+
const run = async (fn) => {
|
|
30
|
+
setError(null);
|
|
31
|
+
setLoading(true);
|
|
32
|
+
try {
|
|
33
|
+
const res = await fn();
|
|
34
|
+
if (res && res.error)
|
|
35
|
+
setError(res.error.message ?? t("common.somethingWentWrong"));
|
|
36
|
+
return res;
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
setError(e.message);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
setLoading(false);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return { error, setError, loading, run };
|
|
46
|
+
}
|
|
47
|
+
export function SocialButtons({ next }) {
|
|
48
|
+
const { auth, api, app, t } = useForge();
|
|
49
|
+
const config = useQuery({ queryKey: ["forge", "config"], queryFn: () => api("/config"), enabled: app.auth.social.length > 0 });
|
|
50
|
+
const providers = config.data?.socialProviders ?? [];
|
|
51
|
+
if (providers.length === 0)
|
|
52
|
+
return null;
|
|
53
|
+
return (_jsxs("div", { className: "space-y-2", children: [providers.map((p) => (_jsx(Button, { className: "w-full", onClick: () => auth.signIn.social({ provider: p, callbackURL: next }), children: t("auth.continueWith", { provider: PROVIDER_LABELS[p] ?? p }) }, p))), _jsxs("div", { className: "flex items-center gap-3 py-2 text-xs text-ink-subtle", children: [_jsx("div", { className: "h-px flex-1 bg-line" }), " ", t("auth.or"), " ", _jsx("div", { className: "h-px flex-1 bg-line" })] })] }));
|
|
54
|
+
}
|
|
55
|
+
export function SignInPage() {
|
|
56
|
+
const { app, auth, t } = useForge();
|
|
57
|
+
const params = useSearchParams();
|
|
58
|
+
const next = safeNext(params.get("next"));
|
|
59
|
+
const queryClient = useQueryClient();
|
|
60
|
+
const [email, setEmail] = useState("");
|
|
61
|
+
const [password, setPassword] = useState("");
|
|
62
|
+
const { error, loading, run } = useSubmit();
|
|
63
|
+
const done = async () => {
|
|
64
|
+
await queryClient.invalidateQueries();
|
|
65
|
+
window.location.href = next;
|
|
66
|
+
};
|
|
67
|
+
const submit = (e) => {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
run(async () => {
|
|
70
|
+
const res = await auth.signIn.email({ email, password });
|
|
71
|
+
if (res.error)
|
|
72
|
+
return res;
|
|
73
|
+
// A second factor is required: no session exists yet, so never continue to the app.
|
|
74
|
+
if (res.data?.twoFactorRedirect || !res.data?.user) {
|
|
75
|
+
window.location.href = `/two-factor${next !== "/" ? `?next=${encodeURIComponent(next)}` : ""}`;
|
|
76
|
+
return res;
|
|
77
|
+
}
|
|
78
|
+
await done();
|
|
79
|
+
return res;
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
return (_jsxs(AuthLayout, { title: t("auth.signInTo", { app: app.name }), footer: app.auth.registration && (_jsxs(_Fragment, { children: [t("auth.noAccount"), " ", _jsx(Link, { href: `/sign-up${next !== "/" ? `?next=${encodeURIComponent(next)}` : ""}`, className: "font-medium text-ink hover:underline", children: t("auth.createOne") })] })), children: [_jsx(SocialButtons, { next: next }), app.auth.emailPassword && (_jsxs("form", { onSubmit: submit, className: "space-y-4", children: [error && _jsx(Alert, { children: error }), _jsx(FieldShell, { label: t("auth.email"), htmlFor: "email", children: _jsx(Input, { id: "email", type: "email", autoComplete: "email webauthn", required: true, value: email, onChange: (e) => setEmail(e.target.value) }) }), _jsxs("div", { children: [_jsxs("div", { className: "mb-1.5 flex items-center justify-between", children: [_jsx("label", { htmlFor: "password", className: "text-sm font-medium text-ink", children: t("auth.password") }), app.auth.passwordReset && (_jsx(Link, { href: "/forgot-password", className: "text-xs text-ink-muted hover:text-ink", children: t("auth.forgotPassword") }))] }), _jsx(Input, { id: "password", type: "password", autoComplete: "current-password", required: true, value: password, onChange: (e) => setPassword(e.target.value) })] }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("auth.signIn") })] })), app.auth.passkeys && (_jsxs(Button, { className: "mt-3 w-full", onClick: () => run(async () => {
|
|
83
|
+
const res = await auth.signIn.passkey();
|
|
84
|
+
if (!res?.error)
|
|
85
|
+
await done();
|
|
86
|
+
return res;
|
|
87
|
+
}), children: [_jsx(KeyRound, { className: "size-4" }), " ", t("auth.signInWithPasskey")] }))] }));
|
|
88
|
+
}
|
|
89
|
+
export function SignUpPage() {
|
|
90
|
+
const { app, auth, t } = useForge();
|
|
91
|
+
const params = useSearchParams();
|
|
92
|
+
const next = safeNext(params.get("next"));
|
|
93
|
+
const [form, setForm] = useState({ name: "", email: "", password: "" });
|
|
94
|
+
const [verifySent, setVerifySent] = useState(false);
|
|
95
|
+
const { error, loading, run } = useSubmit();
|
|
96
|
+
if (!app.auth.registration) {
|
|
97
|
+
return (_jsx(AuthLayout, { title: t("auth.registrationClosed"), footer: _jsx(Link, { href: "/sign-in", className: "font-medium text-ink hover:underline", children: t("auth.backToSignIn") }), children: _jsx("p", { className: "text-sm text-ink-muted", children: t("auth.askForInvite") }) }));
|
|
98
|
+
}
|
|
99
|
+
if (verifySent) {
|
|
100
|
+
return (_jsx(AuthLayout, { title: t("auth.checkEmail"), children: _jsx("p", { className: "text-sm text-ink-muted", children: t("auth.verificationSent", { email: form.email }) }) }));
|
|
101
|
+
}
|
|
102
|
+
return (_jsxs(AuthLayout, { title: t("auth.createYourAccount"), footer: _jsxs(_Fragment, { children: [t("auth.alreadyRegistered"), " ", _jsx(Link, { href: "/sign-in", className: "font-medium text-ink hover:underline", children: t("auth.signIn") })] }), children: [_jsx(SocialButtons, { next: next }), _jsxs("form", { onSubmit: (e) => {
|
|
103
|
+
e.preventDefault();
|
|
104
|
+
run(async () => {
|
|
105
|
+
const res = await auth.signUp.email(form);
|
|
106
|
+
if (!res.error) {
|
|
107
|
+
if (app.auth.emailVerification)
|
|
108
|
+
setVerifySent(true);
|
|
109
|
+
// Honour an explicit destination (e.g. an invitation); otherwise new tenants create an organization.
|
|
110
|
+
else
|
|
111
|
+
window.location.href = next !== "/" ? next : app.tenancy.enabled ? "/onboarding" : "/";
|
|
112
|
+
}
|
|
113
|
+
return res;
|
|
114
|
+
});
|
|
115
|
+
}, className: "space-y-4", children: [error && _jsx(Alert, { children: error }), _jsx(FieldShell, { label: t("account.name"), htmlFor: "name", children: _jsx(Input, { id: "name", autoComplete: "name", required: true, value: form.name, onChange: (e) => setForm({ ...form, name: e.target.value }) }) }), _jsx(FieldShell, { label: t("auth.email"), htmlFor: "email", children: _jsx(Input, { id: "email", type: "email", autoComplete: "email", required: true, value: form.email, onChange: (e) => setForm({ ...form, email: e.target.value }) }) }), _jsx(FieldShell, { label: t("auth.password"), htmlFor: "password", hint: t("auth.passwordHint"), children: _jsx(Input, { id: "password", type: "password", autoComplete: "new-password", minLength: 8, required: true, value: form.password, onChange: (e) => setForm({ ...form, password: e.target.value }) }) }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("auth.createAccount") })] })] }));
|
|
116
|
+
}
|
|
117
|
+
export function ForgotPasswordPage() {
|
|
118
|
+
const { auth, t } = useForge();
|
|
119
|
+
const [email, setEmail] = useState("");
|
|
120
|
+
const [sent, setSent] = useState(false);
|
|
121
|
+
const { error, loading, run } = useSubmit();
|
|
122
|
+
return (_jsx(AuthLayout, { title: t("auth.resetTitle"), subtitle: t("auth.resetSubtitle"), footer: _jsx(Link, { href: "/sign-in", className: "font-medium text-ink hover:underline", children: t("auth.backToSignIn") }), children: sent ? (_jsx(Alert, { tone: "success", children: t("auth.resetSent", { email }) })) : (_jsxs("form", { className: "space-y-4", onSubmit: (e) => {
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
run(async () => {
|
|
125
|
+
const res = await auth.requestPasswordReset({ email, redirectTo: `${window.location.origin}/reset-password` });
|
|
126
|
+
if (!res.error)
|
|
127
|
+
setSent(true);
|
|
128
|
+
return res;
|
|
129
|
+
});
|
|
130
|
+
}, children: [error && _jsx(Alert, { children: error }), _jsx(FieldShell, { label: t("auth.email"), htmlFor: "email", children: _jsx(Input, { id: "email", type: "email", required: true, value: email, onChange: (e) => setEmail(e.target.value) }) }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("auth.sendResetLink") })] })) }));
|
|
131
|
+
}
|
|
132
|
+
export function ResetPasswordPage() {
|
|
133
|
+
const { auth, t } = useForge();
|
|
134
|
+
const router = useRouter();
|
|
135
|
+
const token = useSearchParams().get("token");
|
|
136
|
+
const [password, setPassword] = useState("");
|
|
137
|
+
const { error, loading, run } = useSubmit();
|
|
138
|
+
return (_jsx(AuthLayout, { title: t("auth.chooseNewPassword"), children: !token ? (_jsx(Alert, { children: t("auth.resetLinkInvalid") })) : (_jsxs("form", { className: "space-y-4", onSubmit: (e) => {
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
run(async () => {
|
|
141
|
+
const res = await auth.resetPassword({ newPassword: password, token });
|
|
142
|
+
if (!res.error)
|
|
143
|
+
router.push("/sign-in");
|
|
144
|
+
return res;
|
|
145
|
+
});
|
|
146
|
+
}, children: [error && _jsx(Alert, { children: error }), _jsx(FieldShell, { label: t("account.newPassword"), htmlFor: "password", hint: t("auth.passwordHint"), children: _jsx(Input, { id: "password", type: "password", autoComplete: "new-password", minLength: 8, required: true, value: password, onChange: (e) => setPassword(e.target.value) }) }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("auth.updatePassword") })] })) }));
|
|
147
|
+
}
|
|
148
|
+
export function TwoFactorPage() {
|
|
149
|
+
const { auth, t } = useForge();
|
|
150
|
+
const next = safeNext(useSearchParams().get("next"));
|
|
151
|
+
const [code, setCode] = useState("");
|
|
152
|
+
const [backup, setBackup] = useState(false);
|
|
153
|
+
// Opt-in: a trusted device skips the second factor for 30 days.
|
|
154
|
+
const [trust, setTrust] = useState(false);
|
|
155
|
+
const { error, loading, run } = useSubmit();
|
|
156
|
+
return (_jsx(AuthLayout, { title: t("account.twoFactor"), subtitle: backup ? t("auth.enterBackupCode") : t("auth.enterTotpCode"), children: _jsxs("form", { className: "space-y-4", onSubmit: (e) => {
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
run(async () => {
|
|
159
|
+
const res = backup ? await auth.twoFactor.verifyBackupCode({ code, trustDevice: trust }) : await auth.twoFactor.verifyTotp({ code, trustDevice: trust });
|
|
160
|
+
if (!res.error)
|
|
161
|
+
window.location.href = next;
|
|
162
|
+
return res;
|
|
163
|
+
});
|
|
164
|
+
}, children: [error && _jsx(Alert, { children: error }), _jsx(Input, { "aria-label": t("auth.code"), inputMode: backup ? "text" : "numeric", autoComplete: "one-time-code", autoFocus: true, required: true, value: code, onChange: (e) => setCode(e.target.value.trim()), className: "text-center font-mono text-lg tracking-widest" }), _jsxs("label", { className: "flex items-center gap-2 text-sm text-ink-muted", children: [_jsx("input", { type: "checkbox", checked: trust, onChange: (e) => setTrust(e.target.checked), className: "forge-check" }), " ", t("auth.trustDevice")] }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("account.verify") }), _jsx("button", { type: "button", onClick: () => setBackup(!backup), className: "w-full text-center text-xs text-ink-muted hover:text-ink", children: backup ? t("auth.useAuthenticatorCode") : t("auth.useBackupCode") })] }) }));
|
|
165
|
+
}
|
|
166
|
+
function slugify(s) {
|
|
167
|
+
return s
|
|
168
|
+
.toLowerCase()
|
|
169
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
170
|
+
.replace(/^-|-$/g, "")
|
|
171
|
+
.slice(0, 48);
|
|
172
|
+
}
|
|
173
|
+
/** First-run page for multi-tenant apps: create an organization and make it active. */
|
|
174
|
+
export function OnboardingPage() {
|
|
175
|
+
const { auth, t } = useForge();
|
|
176
|
+
const [name, setName] = useState("");
|
|
177
|
+
const { error, loading, run } = useSubmit();
|
|
178
|
+
return (_jsx(AuthLayout, { title: t("auth.createOrganization"), subtitle: t("auth.createOrganizationSubtitle"), children: _jsxs("form", { className: "space-y-4", onSubmit: (e) => {
|
|
179
|
+
e.preventDefault();
|
|
180
|
+
run(async () => {
|
|
181
|
+
const slug = `${slugify(name) || "org"}-${Math.random().toString(36).slice(2, 6)}`;
|
|
182
|
+
const res = await auth.organization.create({ name, slug });
|
|
183
|
+
if (!res.error) {
|
|
184
|
+
await auth.organization.setActive({ organizationId: res.data.id });
|
|
185
|
+
window.location.href = "/";
|
|
186
|
+
}
|
|
187
|
+
return res;
|
|
188
|
+
});
|
|
189
|
+
}, children: [error && _jsx(Alert, { children: error }), _jsx(FieldShell, { label: t("auth.organizationName"), htmlFor: "org", children: _jsx(Input, { id: "org", required: true, autoFocus: true, value: name, onChange: (e) => setName(e.target.value), placeholder: t("auth.organizationNamePlaceholder") }) }), _jsx(Button, { type: "submit", variant: "primary", className: "w-full", loading: loading, children: t("common.continue") })] }) }));
|
|
190
|
+
}
|
|
191
|
+
export function AcceptInvitationPage({ invitationId }) {
|
|
192
|
+
const { auth, t } = useForge();
|
|
193
|
+
const session = auth.useSession();
|
|
194
|
+
const { error, loading, run } = useSubmit();
|
|
195
|
+
if (!session.isPending && !session.data) {
|
|
196
|
+
return (_jsx(AuthLayout, { title: t("auth.invitedTitle"), subtitle: t("auth.invitedSubtitle"), children: _jsxs("div", { className: "flex gap-2", children: [_jsx(Link, { href: `/sign-in?next=/accept-invitation/${invitationId}`, className: "flex-1", children: _jsx(Button, { className: "w-full", variant: "primary", children: t("auth.signIn") }) }), _jsx(Link, { href: `/sign-up?next=/accept-invitation/${invitationId}`, className: "flex-1", children: _jsx(Button, { className: "w-full", children: t("auth.createAccount") }) })] }) }));
|
|
197
|
+
}
|
|
198
|
+
return (_jsxs(AuthLayout, { title: t("auth.joinOrganization"), children: [error && _jsx("div", { className: "mb-4", children: _jsx(Alert, { children: error }) }), _jsx(Button, { variant: "primary", className: "w-full", loading: loading, onClick: () => run(async () => {
|
|
199
|
+
const res = await auth.organization.acceptInvitation({ invitationId });
|
|
200
|
+
if (!res.error) {
|
|
201
|
+
await auth.organization.setActive({ organizationId: res.data.invitation?.organizationId ?? res.data.member?.organizationId });
|
|
202
|
+
window.location.href = "/";
|
|
203
|
+
}
|
|
204
|
+
return res;
|
|
205
|
+
}), children: t("auth.acceptInvitation") })] }));
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=auth-pages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-pages.js","sourceRoot":"","sources":["../src/auth-pages.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
import type { CSSProperties } from "react";
|
|
3
|
+
/** Small deterministic hash so each app gets its own arrangement of the brand art. */
|
|
4
|
+
export declare function brandSeed(text: string): number;
|
|
5
|
+
/** Positions of the gradient mesh blobs (CSS variables read by `.forge-auth-brand` / `.forge-landing-hero`). */
|
|
6
|
+
export declare function brandMeshStyle(name: string): CSSProperties;
|
|
7
|
+
/** Decorative geometric pattern (dots, concentric rings, a sweeping line) drawn in currentColor over the mesh. */
|
|
8
|
+
export declare function BrandPattern({ name, id, className }: {
|
|
9
|
+
name: string;
|
|
10
|
+
id?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
}): import("react").JSX.Element;
|
|
13
|
+
declare const LOGO_SIZES: {
|
|
14
|
+
readonly sm: "size-7 text-xs";
|
|
15
|
+
readonly md: "size-10 text-base";
|
|
16
|
+
readonly lg: "size-12 text-lg";
|
|
17
|
+
};
|
|
18
|
+
/** Server-safe BrandMark: the theme logo, else the app's initial on a brand-coloured tile. Decorative (pair it with the name). */
|
|
19
|
+
export declare function BrandLogo({ app, size, className }: {
|
|
20
|
+
app: Pick<AppIR, "name" | "theme">;
|
|
21
|
+
size?: keyof typeof LOGO_SIZES;
|
|
22
|
+
className?: string;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Generated brand art shared by the sign-in brand panel and the landing page hero. No hooks and no
|
|
4
|
+
* "use client": safe in server components, so the landing page needs no JavaScript.
|
|
5
|
+
*/
|
|
6
|
+
/** Small deterministic hash so each app gets its own arrangement of the brand art. */
|
|
7
|
+
export function brandSeed(text) {
|
|
8
|
+
let h = 2166136261;
|
|
9
|
+
for (let i = 0; i < text.length; i++)
|
|
10
|
+
h = Math.imul(h ^ text.charCodeAt(i), 16777619);
|
|
11
|
+
return h >>> 0;
|
|
12
|
+
}
|
|
13
|
+
/** Positions of the gradient mesh blobs (CSS variables read by `.forge-auth-brand` / `.forge-landing-hero`). */
|
|
14
|
+
export function brandMeshStyle(name) {
|
|
15
|
+
const h = brandSeed(name);
|
|
16
|
+
const pick = (shift, min, span) => `${min + ((h >>> shift) % span)}%`;
|
|
17
|
+
return { "--mesh-a-x": pick(0, 5, 35), "--mesh-a-y": pick(5, 5, 30), "--mesh-b-x": pick(10, 55, 40), "--mesh-b-y": pick(15, 10, 40), "--mesh-c-x": pick(20, 20, 50) };
|
|
18
|
+
}
|
|
19
|
+
/** Decorative geometric pattern (dots, concentric rings, a sweeping line) drawn in currentColor over the mesh. */
|
|
20
|
+
export function BrandPattern({ name, id = "forge-auth-dots", className = "forge-auth-pattern absolute inset-0 size-full" }) {
|
|
21
|
+
const rings = 5 + (brandSeed(name) % 3);
|
|
22
|
+
return (_jsxs("svg", { className: className, "aria-hidden": true, focusable: "false", children: [_jsx("defs", { children: _jsx("pattern", { id: id, width: "28", height: "28", patternUnits: "userSpaceOnUse", children: _jsx("circle", { cx: "2", cy: "2", r: "1.25", fill: "currentColor" }) }) }), _jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})`, opacity: "0.18" }), _jsx("g", { fill: "none", stroke: "currentColor", strokeWidth: "1", opacity: "0.22", children: Array.from({ length: rings }, (_, i) => (_jsx("circle", { cx: "88%", cy: "18%", r: 60 + i * 46 }, i))) }), _jsx("path", { d: "M-20 520 C 160 420, 300 640, 520 500 S 820 380, 1000 470", fill: "none", stroke: "currentColor", strokeWidth: "1.5", opacity: "0.28" })] }));
|
|
23
|
+
}
|
|
24
|
+
const LOGO_SIZES = { sm: "size-7 text-xs", md: "size-10 text-base", lg: "size-12 text-lg" };
|
|
25
|
+
/** Server-safe BrandMark: the theme logo, else the app's initial on a brand-coloured tile. Decorative (pair it with the name). */
|
|
26
|
+
export function BrandLogo({ app, size = "sm", className = "" }) {
|
|
27
|
+
if (app.theme.logo) {
|
|
28
|
+
// eslint-disable-next-line @next/next/no-img-element -- any URL or public file, no next/image config needed
|
|
29
|
+
return _jsx("img", { src: app.theme.logo, alt: "", className: `forge-logo-image shrink-0 object-contain ${LOGO_SIZES[size]} ${className}`.trim() });
|
|
30
|
+
}
|
|
31
|
+
return (_jsx("span", { "aria-hidden": true, className: `forge-logo flex shrink-0 items-center justify-center font-bold ${LOGO_SIZES[size]} ${className}`.trim(), children: app.name.slice(0, 1).toUpperCase() }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=brand-art.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-art.js","sourceRoot":"","sources":["../src/brand-art.tsx"],"names":[],"mappings":"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"}
|
package/dist/brand.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const SIZES: {
|
|
2
|
+
readonly sm: "size-7 text-xs";
|
|
3
|
+
readonly md: "size-10 text-base";
|
|
4
|
+
readonly lg: "size-12 text-lg";
|
|
5
|
+
};
|
|
6
|
+
/** The app's logo (theme.logo) or, without one, its initial on a brand-coloured tile. */
|
|
7
|
+
export declare function BrandMark({ size, className }: {
|
|
8
|
+
size?: keyof typeof SIZES;
|
|
9
|
+
className?: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
export {};
|
package/dist/brand.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useForge } from "./context.js";
|
|
4
|
+
import { cn } from "./ui.js";
|
|
5
|
+
const SIZES = { sm: "size-7 text-xs", md: "size-10 text-base", lg: "size-12 text-lg" };
|
|
6
|
+
/** The app's logo (theme.logo) or, without one, its initial on a brand-coloured tile. */
|
|
7
|
+
export function BrandMark({ size = "sm", className }) {
|
|
8
|
+
const { app } = useForge();
|
|
9
|
+
const logo = app.theme.logo;
|
|
10
|
+
if (logo) {
|
|
11
|
+
// eslint-disable-next-line @next/next/no-img-element -- any URL or public file, no next/image config needed
|
|
12
|
+
return _jsx("img", { src: logo, alt: "", className: cn("forge-logo-image shrink-0 object-contain", SIZES[size], className) });
|
|
13
|
+
}
|
|
14
|
+
return (_jsx("div", { "aria-hidden": true, className: cn("forge-logo flex shrink-0 items-center justify-center font-bold", SIZES[size], className), children: app.name.slice(0, 1).toUpperCase() }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,iBAAiB,EAAW,CAAC;AAEhG,yFAAyF;AACzF,MAAM,UAAU,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAqD;IACrG,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC;QACT,4GAA4G;QAC5G,OAAO,cAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAI,CAAC;IACtH,CAAC;IACD,OAAO,CACL,mCAAiB,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,YACrH,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAC/B,CACP,CAAC;AACJ,CAAC"}
|
package/dist/charts.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type JSX } from "react";
|
|
2
|
+
export interface Datum {
|
|
3
|
+
label: string;
|
|
4
|
+
value: number;
|
|
5
|
+
href?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ChartProps {
|
|
8
|
+
data: Datum[];
|
|
9
|
+
title: string;
|
|
10
|
+
/** Plot height in px (default 220). */
|
|
11
|
+
height?: number;
|
|
12
|
+
format?: (v: number) => string;
|
|
13
|
+
emptyLabel?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Series colours: theme primary, theme accent, then six mid-tone hues legible on light and dark surfaces. */
|
|
16
|
+
export declare const CHART_PALETTE: string[];
|
|
17
|
+
export declare function BarChart(props: ChartProps & {
|
|
18
|
+
orientation?: "vertical" | "horizontal";
|
|
19
|
+
}): JSX.Element;
|
|
20
|
+
export declare function LineChart(props: ChartProps & {
|
|
21
|
+
area?: boolean;
|
|
22
|
+
}): JSX.Element;
|
|
23
|
+
export declare function DonutChart(props: ChartProps): JSX.Element;
|