@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,55 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Browser-side copy of the theme catalog (the compiler owns the source of truth in @tekki-forge/compiler's theme.ts,
|
|
3
|
+
* whose package root is Node-only). tests/theme.test.ts keeps both in sync. Used by the dev ThemeSwitcher.
|
|
4
|
+
*/
|
|
5
|
+
export const STYLE_OPTIONS = [
|
|
6
|
+
{ id: "simple", label: "Simple", hint: "Flat, hairline borders" },
|
|
7
|
+
{ id: "shadow", label: "Shadow", hint: "Floating cards, soft shadows" },
|
|
8
|
+
{ id: "neumorphism", label: "Neumorphism", hint: "Soft extruded surfaces" },
|
|
9
|
+
{ id: "glassmorphism", label: "Glass", hint: "Frosted panels over colour" },
|
|
10
|
+
{ id: "skeuomorphism", label: "Skeuomorphism", hint: "Tactile, bevels, leather" },
|
|
11
|
+
{ id: "material", label: "Material", hint: "Material 3 tonal surfaces" },
|
|
12
|
+
{ id: "brutalist", label: "Brutalist", hint: "Thick borders, hard shadows" },
|
|
13
|
+
{ id: "editorial", label: "Editorial", hint: "Paper, serif, hairlines" },
|
|
14
|
+
{ id: "aurora", label: "Aurora", hint: "Living gradient, glassy cards" },
|
|
15
|
+
{ id: "terminal", label: "Terminal", hint: "Monospace, phosphor accents" },
|
|
16
|
+
{ id: "clay", label: "Clay", hint: "Puffy, soft and rounded" },
|
|
17
|
+
];
|
|
18
|
+
const SANS = `ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif`;
|
|
19
|
+
const SERIF = `ui-serif, Georgia, Cambria, "Times New Roman", serif`;
|
|
20
|
+
const MONO = `ui-monospace, SFMono-Regular, Menlo, Consolas, monospace`;
|
|
21
|
+
export const FONT_OPTIONS = {
|
|
22
|
+
inter: { label: "Inter", display: `"Inter", ${SANS}`, body: `"Inter", ${SANS}`, families: ["Inter:wght@400;500;600;700"] },
|
|
23
|
+
geist: { label: "Geist", display: `"Geist", ${SANS}`, body: `"Geist", ${SANS}`, families: ["Geist:wght@400;500;600;700"] },
|
|
24
|
+
plex: { label: "IBM Plex", display: `"IBM Plex Sans", ${SANS}`, body: `"IBM Plex Sans", ${SANS}`, families: ["IBM+Plex+Sans:wght@400;500;600;700"] },
|
|
25
|
+
grotesk: { label: "Space Grotesk + Inter", display: `"Space Grotesk", ${SANS}`, body: `"Inter", ${SANS}`, families: ["Space+Grotesk:wght@500;600;700", "Inter:wght@400;500;600;700"] },
|
|
26
|
+
serif: { label: "Fraunces + Inter", display: `"Fraunces", ${SERIF}`, body: `"Inter", ${SANS}`, families: ["Fraunces:opsz,wght@9..144,500..700", "Inter:wght@400;500;600;700"] },
|
|
27
|
+
rounded: { label: "Nunito", display: `"Nunito", ${SANS}`, body: `"Nunito", ${SANS}`, families: ["Nunito:wght@400;500;600;700;800"] },
|
|
28
|
+
mono: { label: "JetBrains Mono", display: `"JetBrains Mono", ${MONO}`, body: `"JetBrains Mono", ${MONO}`, families: ["JetBrains+Mono:wght@400;500;600;700"] },
|
|
29
|
+
system: { label: "System", display: SANS, body: SANS, families: [] },
|
|
30
|
+
};
|
|
31
|
+
export function fontHref(font) {
|
|
32
|
+
const families = FONT_OPTIONS[font]?.families ?? [];
|
|
33
|
+
return families.length ? `https://fonts.googleapis.com/css2?${families.map((f) => `family=${f}`).join("&")}&display=swap` : null;
|
|
34
|
+
}
|
|
35
|
+
export const PRESET_OPTIONS = {
|
|
36
|
+
midnight: { label: "Midnight", style: "aurora", primary: "#4f46e5", accent: "#22d3ee", mode: "dark", radius: "large", font: "geist", layout: "sidebar", density: "comfortable" },
|
|
37
|
+
sandstone: { label: "Sandstone", style: "neumorphism", primary: "#c2410c", accent: "#0d9488", mode: "light", radius: "large", font: "plex", layout: "sidebar", density: "comfortable" },
|
|
38
|
+
ocean: { label: "Ocean", style: "glassmorphism", primary: "#0369a1", accent: "#14b8a6", mode: "system", radius: "large", font: "inter", layout: "sidebar", density: "comfortable" },
|
|
39
|
+
forest: { label: "Forest", style: "shadow", primary: "#15803d", accent: "#ca8a04", mode: "light", radius: "medium", font: "serif", layout: "topbar", density: "comfortable" },
|
|
40
|
+
sunset: { label: "Sunset", style: "clay", primary: "#e11d48", accent: "#f97316", mode: "light", radius: "large", font: "rounded", layout: "sidebar", density: "comfortable" },
|
|
41
|
+
graphite: { label: "Graphite", style: "simple", primary: "#52525b", accent: "#84cc16", mode: "system", radius: "small", font: "grotesk", layout: "compact", density: "compact" },
|
|
42
|
+
candy: { label: "Candy", style: "brutalist", primary: "#db2777", accent: "#facc15", mode: "light", radius: "none", font: "grotesk", layout: "topbar", density: "comfortable" },
|
|
43
|
+
paper: { label: "Paper", style: "editorial", primary: "#1c1917", accent: "#b91c1c", mode: "light", radius: "none", font: "serif", layout: "topbar", density: "comfortable" },
|
|
44
|
+
phosphor: { label: "Phosphor", style: "terminal", primary: "#16a34a", accent: "#f59e0b", mode: "dark", radius: "small", font: "mono", layout: "compact", density: "compact" },
|
|
45
|
+
};
|
|
46
|
+
/** Companions a style brings when the theme doesn't set them (mirrors STYLE_DEFAULTS in the compiler). */
|
|
47
|
+
export const STYLE_COMPANIONS = {
|
|
48
|
+
brutalist: { font: "grotesk" },
|
|
49
|
+
editorial: { font: "serif" },
|
|
50
|
+
terminal: { font: "mono", mode: "dark" },
|
|
51
|
+
clay: { font: "rounded" },
|
|
52
|
+
};
|
|
53
|
+
export const LAYOUT_OPTIONS = ["sidebar", "topbar", "compact"];
|
|
54
|
+
export const DENSITY_OPTIONS = ["comfortable", "compact"];
|
|
55
|
+
//# sourceMappingURL=theme-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-catalog.js","sourceRoot":"","sources":["../src/theme-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
/**
|
|
3
|
+
* Font links for the theme, for the root layout's <head> (server component safe, no next/font, nothing
|
|
4
|
+
* fetched at build time): `<head><ThemeHead app={app} /></head>`. Renders nothing for the "system" font.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ThemeHead({ app }: {
|
|
7
|
+
app: Pick<AppIR, "theme">;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { themeHead } from "./theme.js";
|
|
3
|
+
/**
|
|
4
|
+
* Font links for the theme, for the root layout's <head> (server component safe, no next/font, nothing
|
|
5
|
+
* fetched at build time): `<head><ThemeHead app={app} /></head>`. Renders nothing for the "system" font.
|
|
6
|
+
*/
|
|
7
|
+
export function ThemeHead({ app }) {
|
|
8
|
+
const { preconnect, stylesheets } = themeHead(app);
|
|
9
|
+
return (_jsxs(_Fragment, { children: [preconnect.map((origin) => (_jsx("link", { rel: "preconnect", href: origin, ...(origin.includes("gstatic") ? { crossOrigin: "anonymous" } : {}) }, origin))), stylesheets.map((href) => (_jsx("link", { rel: "stylesheet", href: href }, href)))] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=theme-head.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-head.js","sourceRoot":"","sources":["../src/theme-head.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,GAAG,EAAiC;IAC9D,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,CACL,8BACG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC1B,eAAmB,GAAG,EAAC,YAAY,EAAC,IAAI,EAAE,MAAM,KAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAApH,MAAM,CAAkH,CACpI,CAAC,EACD,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACzB,eAAiB,GAAG,EAAC,YAAY,EAAC,IAAI,EAAE,IAAI,IAAjC,IAAI,CAAiC,CACjD,CAAC,IACD,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useSyncExternalStore } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Tiny store for values the dev ThemeSwitcher previews that are rendered by React rather than CSS
|
|
5
|
+
* (the navigation layout). Never set in production, so the config's value applies.
|
|
6
|
+
*/
|
|
7
|
+
let layout = null;
|
|
8
|
+
const listeners = new Set();
|
|
9
|
+
export function setPreviewLayout(next) {
|
|
10
|
+
if (next === layout)
|
|
11
|
+
return;
|
|
12
|
+
layout = next;
|
|
13
|
+
for (const l of listeners)
|
|
14
|
+
l();
|
|
15
|
+
}
|
|
16
|
+
function subscribe(listener) {
|
|
17
|
+
listeners.add(listener);
|
|
18
|
+
return () => listeners.delete(listener);
|
|
19
|
+
}
|
|
20
|
+
export function usePreviewLayout() {
|
|
21
|
+
return useSyncExternalStore(subscribe, () => layout, () => null);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=theme-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-preview.js","sourceRoot":"","sources":["../src/theme-preview.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C;;;GAGG;AACH,IAAI,MAAM,GAAkB,IAAI,CAAC;AACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO;IAC5B,MAAM,GAAG,IAAI,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,SAAS;QAAE,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,QAAoB;IACrC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const COLOR_PRESETS: string[];
|
|
2
|
+
interface Preview {
|
|
3
|
+
preset: string | null;
|
|
4
|
+
style: string;
|
|
5
|
+
mode: string;
|
|
6
|
+
radius: string;
|
|
7
|
+
primary: string;
|
|
8
|
+
accent: string;
|
|
9
|
+
font: string;
|
|
10
|
+
layout: string;
|
|
11
|
+
density: string;
|
|
12
|
+
}
|
|
13
|
+
/** The shortest `forge theme` command that reproduces the preview. */
|
|
14
|
+
export declare function themeCommand(p: Preview): string;
|
|
15
|
+
/**
|
|
16
|
+
* Development-only panel for trying Forge styles and colours on the real app.
|
|
17
|
+
* The preview lives in this browser only; the displayed `forge theme` command makes it permanent.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ThemeSwitcher(): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, Copy, Palette, RotateCcw, X } from "lucide-react";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
import { useForge } from "./context.js";
|
|
6
|
+
import { DENSITY_OPTIONS, FONT_OPTIONS, LAYOUT_OPTIONS, PRESET_OPTIONS, STYLE_COMPANIONS, STYLE_OPTIONS, fontHref } from "./theme-catalog.js";
|
|
7
|
+
import { setPreviewLayout } from "./theme-preview.js";
|
|
8
|
+
import { cn } from "./ui.js";
|
|
9
|
+
const MODES = ["light", "dark", "system"];
|
|
10
|
+
const RADII = ["none", "small", "medium", "large", "full"];
|
|
11
|
+
export const COLOR_PRESETS = ["#4f46e5", "#2563eb", "#0891b2", "#059669", "#65a30d", "#d97706", "#dc2626", "#db2777", "#7c3aed", "#0f172a"];
|
|
12
|
+
const DEFAULTS = { style: "simple", primary: "#4f46e5", accent: "#f59e0b", mode: "light", radius: "medium", font: "system", layout: "sidebar", density: "comfortable" };
|
|
13
|
+
/** Values a theme gets for keys it doesn't set (mirrors themeBase() in the compiler). */
|
|
14
|
+
function baseFor(preset, style) {
|
|
15
|
+
const p = preset ? PRESET_OPTIONS[preset] : undefined;
|
|
16
|
+
const base = { ...DEFAULTS, ...(p ? { ...p } : {}) };
|
|
17
|
+
delete base.label;
|
|
18
|
+
if (!p || style !== p.style)
|
|
19
|
+
Object.assign(base, STYLE_COMPANIONS[style] ?? {});
|
|
20
|
+
return { ...base, style };
|
|
21
|
+
}
|
|
22
|
+
/** The shortest `forge theme` command that reproduces the preview. */
|
|
23
|
+
export function themeCommand(p) {
|
|
24
|
+
const base = baseFor(p.preset, p.style);
|
|
25
|
+
const flags = p.preset ? [`--preset ${p.preset}`] : [];
|
|
26
|
+
const keys = ["style", "primary", "accent", "mode", "radius", "font", "layout", "density"];
|
|
27
|
+
for (const k of keys) {
|
|
28
|
+
const always = !p.preset && ["style", "primary", "accent", "mode", "radius"].includes(k);
|
|
29
|
+
const differs = k === "style" ? !!p.preset && p.style !== PRESET_OPTIONS[p.preset]?.style : p[k] !== base[k];
|
|
30
|
+
if (always || differs)
|
|
31
|
+
flags.push(k === "primary" || k === "accent" ? `--${k} "${p[k]}"` : `--${k} ${p[k]}`);
|
|
32
|
+
}
|
|
33
|
+
return `forge theme ${flags.join(" ")}`;
|
|
34
|
+
}
|
|
35
|
+
const FONT_LINK_ID = "forge-theme-preview-font";
|
|
36
|
+
function loadFont(font) {
|
|
37
|
+
const href = fontHref(font);
|
|
38
|
+
let link = document.getElementById(FONT_LINK_ID);
|
|
39
|
+
if (!href)
|
|
40
|
+
return link?.remove();
|
|
41
|
+
if (document.querySelector(`link[rel="stylesheet"][href="${CSS.escape(href)}"]:not(#${FONT_LINK_ID})`))
|
|
42
|
+
return link?.remove();
|
|
43
|
+
if (!link) {
|
|
44
|
+
link = document.createElement("link");
|
|
45
|
+
link.id = FONT_LINK_ID;
|
|
46
|
+
link.rel = "stylesheet";
|
|
47
|
+
document.head.appendChild(link);
|
|
48
|
+
}
|
|
49
|
+
if (link.href !== href)
|
|
50
|
+
link.href = href;
|
|
51
|
+
}
|
|
52
|
+
const KEY = "forge:theme-preview";
|
|
53
|
+
function readableOn(hex) {
|
|
54
|
+
const lum = (h) => {
|
|
55
|
+
const [r, g, b] = [1, 3, 5].map((i) => {
|
|
56
|
+
const c = parseInt(h.slice(i, i + 2), 16) / 255;
|
|
57
|
+
return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
|
|
58
|
+
});
|
|
59
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
60
|
+
};
|
|
61
|
+
const l = lum(hex);
|
|
62
|
+
return (1.05 / (l + 0.05) >= (l + 0.05) / (lum("#111827") + 0.05)) ? "#ffffff" : "#111827";
|
|
63
|
+
}
|
|
64
|
+
function apply(p, fallback) {
|
|
65
|
+
const root = document.documentElement;
|
|
66
|
+
const v = p ?? fallback;
|
|
67
|
+
root.dataset.forgeStyle = v.style;
|
|
68
|
+
root.dataset.forgeMode = v.mode;
|
|
69
|
+
root.dataset.forgeRadius = v.radius;
|
|
70
|
+
root.dataset.forgeDensity = v.density;
|
|
71
|
+
root.dataset.forgeLayout = v.layout;
|
|
72
|
+
root.dataset.forgeFont = v.font;
|
|
73
|
+
const vars = ["--forge-primary", "--forge-primary-fg", "--forge-accent", "--forge-accent-fg", "--forge-font-body", "--forge-font-display"];
|
|
74
|
+
if (p) {
|
|
75
|
+
root.style.setProperty("--forge-primary", p.primary);
|
|
76
|
+
root.style.setProperty("--forge-primary-fg", readableOn(p.primary));
|
|
77
|
+
root.style.setProperty("--forge-accent", p.accent);
|
|
78
|
+
root.style.setProperty("--forge-accent-fg", readableOn(p.accent));
|
|
79
|
+
const font = FONT_OPTIONS[p.font];
|
|
80
|
+
if (font && p.font !== "system") {
|
|
81
|
+
root.style.setProperty("--forge-font-body", font.body);
|
|
82
|
+
root.style.setProperty("--forge-font-display", font.display);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
root.style.removeProperty("--forge-font-body");
|
|
86
|
+
root.style.removeProperty("--forge-font-display");
|
|
87
|
+
}
|
|
88
|
+
loadFont(p.font);
|
|
89
|
+
setPreviewLayout(p.layout);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
for (const k of vars)
|
|
93
|
+
root.style.removeProperty(k);
|
|
94
|
+
loadFont("system");
|
|
95
|
+
setPreviewLayout(null);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Development-only panel for trying Forge styles and colours on the real app.
|
|
100
|
+
* The preview lives in this browser only; the displayed `forge theme` command makes it permanent.
|
|
101
|
+
*/
|
|
102
|
+
export function ThemeSwitcher() {
|
|
103
|
+
const { app } = useForge();
|
|
104
|
+
const th = app.theme;
|
|
105
|
+
const configured = {
|
|
106
|
+
preset: th.preset ?? null,
|
|
107
|
+
style: th.style,
|
|
108
|
+
mode: th.mode,
|
|
109
|
+
radius: th.radius,
|
|
110
|
+
primary: th.colors.primary,
|
|
111
|
+
accent: th.colors.accent,
|
|
112
|
+
font: th.font ?? "system",
|
|
113
|
+
layout: th.layout ?? "sidebar",
|
|
114
|
+
density: th.density ?? "comfortable",
|
|
115
|
+
};
|
|
116
|
+
const [open, setOpen] = useState(false);
|
|
117
|
+
const [preview, setPreview] = useState(null);
|
|
118
|
+
const [copied, setCopied] = useState(false);
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
try {
|
|
121
|
+
const saved = localStorage.getItem(KEY);
|
|
122
|
+
if (saved)
|
|
123
|
+
setPreview({ ...configured, ...JSON.parse(saved) });
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
/* storage unavailable: preview just won't persist */
|
|
127
|
+
}
|
|
128
|
+
}, []);
|
|
129
|
+
useEffect(() => {
|
|
130
|
+
apply(preview, configured);
|
|
131
|
+
try {
|
|
132
|
+
if (preview)
|
|
133
|
+
localStorage.setItem(KEY, JSON.stringify(preview));
|
|
134
|
+
else
|
|
135
|
+
localStorage.removeItem(KEY);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
/* ignore */
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
141
|
+
}, [preview]);
|
|
142
|
+
const current = preview ?? configured;
|
|
143
|
+
const set = (patch) => setPreview({ ...current, ...patch });
|
|
144
|
+
const choosePreset = (id) => {
|
|
145
|
+
const { label: _label, ...values } = PRESET_OPTIONS[id];
|
|
146
|
+
setPreview({ preset: id, ...values });
|
|
147
|
+
};
|
|
148
|
+
const changed = preview !== null && JSON.stringify(preview) !== JSON.stringify(configured);
|
|
149
|
+
const command = themeCommand(current);
|
|
150
|
+
if (!open) {
|
|
151
|
+
return (_jsxs("button", { type: "button", onClick: () => setOpen(true), className: "forge-btn forge-btn-primary fixed right-4 bottom-4 z-40 inline-flex h-10 items-center gap-2 px-4 text-sm font-medium shadow-lg", "aria-label": "Open theme switcher", children: [_jsx(Palette, { className: "size-4" }), " Theme", changed && _jsx("span", { className: "size-2 rounded-full bg-accent" })] }));
|
|
152
|
+
}
|
|
153
|
+
return (_jsxs("div", { className: "forge-popover fixed right-4 bottom-4 z-40 max-h-[calc(100dvh-2rem)] w-[22rem] max-w-[calc(100vw-2rem)] overflow-y-auto p-4 text-sm text-ink", role: "dialog", "aria-label": "Theme switcher", children: [_jsxs("div", { className: "mb-3 flex items-center justify-between", children: [_jsx("p", { className: "font-semibold", children: "Theme preview" }), _jsxs("div", { className: "flex gap-1", children: [_jsx("button", { type: "button", className: "forge-btn forge-btn-ghost p-1", "aria-label": "Reset to forge.config.ts", title: "Reset to forge.config.ts", onClick: () => setPreview(null), children: _jsx(RotateCcw, { className: "size-4" }) }), _jsx("button", { type: "button", className: "forge-btn forge-btn-ghost p-1", "aria-label": "Close", onClick: () => setOpen(false), children: _jsx(X, { className: "size-4" }) })] })] }), _jsx("p", { className: "mb-1.5 text-xs font-medium text-ink-muted", children: "Preset" }), _jsx("div", { className: "mb-3 grid grid-cols-3 gap-1.5", children: Object.entries(PRESET_OPTIONS).map(([id, p]) => (_jsxs("button", { type: "button", "aria-pressed": current.preset === id, onClick: () => choosePreset(id), className: cn("forge-btn forge-btn-ghost flex items-center gap-1.5 px-1.5 py-1 text-left text-xs", current.preset === id && "font-semibold"), "aria-current": current.preset === id ? "page" : undefined, title: `${p.style} · ${p.font} · ${p.mode}`, children: [_jsxs("span", { className: "flex shrink-0 -space-x-1", "aria-hidden": true, children: [_jsx("span", { className: "size-3 rounded-full ring-1 ring-line", style: { background: p.primary } }), _jsx("span", { className: "size-3 rounded-full ring-1 ring-line", style: { background: p.accent } })] }), _jsx("span", { className: "truncate", children: p.label })] }, id))) }), _jsx("p", { className: "mb-1.5 text-xs font-medium text-ink-muted", children: "Style" }), _jsx("div", { className: "grid grid-cols-2 gap-1.5", children: STYLE_OPTIONS.map((s) => (_jsx("button", { type: "button", "aria-pressed": current.style === s.id, "aria-current": current.style === s.id ? "page" : undefined, onClick: () => set({ style: s.id }), className: cn("forge-btn forge-btn-ghost px-2 py-1.5 text-left", current.style === s.id && "font-semibold"), title: s.hint, children: s.label }, s.id))) }), _jsxs("div", { className: "mt-3 grid grid-cols-2 gap-3", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted", children: "Font" }), _jsx("select", { "aria-label": "Font", className: "forge-input w-full px-2 py-1 text-sm", value: current.font, onChange: (e) => set({ font: e.target.value }), children: Object.entries(FONT_OPTIONS).map(([id, f]) => (_jsx("option", { value: id, children: f.label }, id))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted", children: "Layout" }), _jsx("select", { "aria-label": "Layout", className: "forge-input w-full px-2 py-1 text-sm", value: current.layout, onChange: (e) => set({ layout: e.target.value }), children: LAYOUT_OPTIONS.map((l) => (_jsx("option", { children: l }, l))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted", children: "Density" }), _jsx("select", { "aria-label": "Density", className: "forge-input w-full px-2 py-1 text-sm", value: current.density, onChange: (e) => set({ density: e.target.value }), children: DENSITY_OPTIONS.map((d) => (_jsx("option", { children: d }, d))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted", children: "Mode" }), _jsx("select", { "aria-label": "Mode", className: "forge-input w-full px-2 py-1 text-sm", value: current.mode, onChange: (e) => set({ mode: e.target.value }), children: MODES.map((m) => (_jsx("option", { children: m }, m))) })] }), _jsxs("label", { className: "block", children: [_jsx("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted", children: "Corners" }), _jsx("select", { "aria-label": "Corners", className: "forge-input w-full px-2 py-1 text-sm", value: current.radius, onChange: (e) => set({ radius: e.target.value }), children: RADII.map((r) => (_jsx("option", { children: r }, r))) })] })] }), ["primary", "accent"].map((key) => (_jsxs("div", { className: "mt-3", children: [_jsxs("span", { className: "mb-1.5 block text-xs font-medium text-ink-muted capitalize", children: [key, " colour"] }), _jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [COLOR_PRESETS.map((c) => (_jsx("button", { type: "button", "aria-label": `${key} ${c}`, onClick: () => set({ [key]: c }), className: "flex size-6 items-center justify-center rounded-full ring-1 ring-line", style: { background: c }, children: current[key] === c && _jsx(Check, { className: "size-3.5", style: { color: readableOn(c) } }) }, c))), _jsx("input", { type: "color", "aria-label": `Custom ${key} colour`, value: current[key], onChange: (e) => set({ [key]: e.target.value }), className: "size-6 cursor-pointer rounded-full border-0 bg-transparent p-0" })] })] }, key))), _jsxs("div", { className: "mt-4", children: [_jsx("p", { className: "mb-1 text-xs text-ink-muted", children: changed ? "Previewing in this browser only. To keep it, run:" : "This is the theme from forge.config.ts." }), changed && (_jsxs("div", { className: "forge-card-flat flex items-start gap-2 p-2", children: [_jsx("code", { className: "flex-1 font-mono text-[11px] break-all", children: command }), _jsx("button", { type: "button", className: "forge-btn forge-btn-ghost p-1", "aria-label": "Copy command", onClick: async () => {
|
|
154
|
+
await navigator.clipboard?.writeText(command).catch(() => undefined);
|
|
155
|
+
setCopied(true);
|
|
156
|
+
setTimeout(() => setCopied(false), 1500);
|
|
157
|
+
}, children: copied ? _jsx(Check, { className: "size-3.5" }) : _jsx(Copy, { className: "size-3.5" }) })] }))] })] }));
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=theme-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-switcher.js","sourceRoot":"","sources":["../src/theme-switcher.tsx"],"names":[],"mappings":"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"}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
type ThemeApp = Pick<AppIR, "theme">;
|
|
3
|
+
/**
|
|
4
|
+
* Attributes for <html> that select the Forge style, colour mode, corner radius, layout, density and font.
|
|
5
|
+
* Safe to call from a server component (no client code): `<html {...themeAttributes(app)}>`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function themeAttributes(app: ThemeApp): Record<string, string>;
|
|
8
|
+
export declare const FONT_ORIGINS: readonly ["https://fonts.googleapis.com", "https://fonts.gstatic.com"];
|
|
9
|
+
/**
|
|
10
|
+
* What the document <head> needs for the theme's fonts: origins to preconnect to and the Google Fonts
|
|
11
|
+
* stylesheet (font-display: swap). Empty for the "system" font. Server-safe.
|
|
12
|
+
*/
|
|
13
|
+
export declare function themeHead(app: ThemeApp): {
|
|
14
|
+
preconnect: string[];
|
|
15
|
+
stylesheets: string[];
|
|
16
|
+
};
|
|
17
|
+
/** Next.js metadata derived from the theme (the logo doubles as favicon). Spread into `metadata`. */
|
|
18
|
+
export declare function themeMetadata(app: ThemeApp): {
|
|
19
|
+
icons?: {
|
|
20
|
+
icon: string;
|
|
21
|
+
apple?: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export {};
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attributes for <html> that select the Forge style, colour mode, corner radius, layout, density and font.
|
|
3
|
+
* Safe to call from a server component (no client code): `<html {...themeAttributes(app)}>`.
|
|
4
|
+
*/
|
|
5
|
+
export function themeAttributes(app) {
|
|
6
|
+
const t = app.theme;
|
|
7
|
+
return {
|
|
8
|
+
"data-forge-style": t.style,
|
|
9
|
+
"data-forge-mode": t.mode,
|
|
10
|
+
"data-forge-radius": t.radius,
|
|
11
|
+
"data-forge-layout": t.layout ?? "sidebar",
|
|
12
|
+
"data-forge-density": t.density ?? "comfortable",
|
|
13
|
+
"data-forge-font": t.font ?? "system",
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export const FONT_ORIGINS = ["https://fonts.googleapis.com", "https://fonts.gstatic.com"];
|
|
17
|
+
/**
|
|
18
|
+
* What the document <head> needs for the theme's fonts: origins to preconnect to and the Google Fonts
|
|
19
|
+
* stylesheet (font-display: swap). Empty for the "system" font. Server-safe.
|
|
20
|
+
*/
|
|
21
|
+
export function themeHead(app) {
|
|
22
|
+
const href = app.theme.fonts?.stylesheet;
|
|
23
|
+
return href ? { preconnect: [...FONT_ORIGINS], stylesheets: [href] } : { preconnect: [], stylesheets: [] };
|
|
24
|
+
}
|
|
25
|
+
/** Next.js metadata derived from the theme (the logo doubles as favicon). Spread into `metadata`. */
|
|
26
|
+
export function themeMetadata(app) {
|
|
27
|
+
const logo = app.theme.logo;
|
|
28
|
+
return logo ? { icons: { icon: logo, apple: logo } } : {};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IACpB,OAAO;QACL,kBAAkB,EAAE,CAAC,CAAC,KAAK;QAC3B,iBAAiB,EAAE,CAAC,CAAC,IAAI;QACzB,mBAAmB,EAAE,CAAC,CAAC,MAAM;QAC7B,mBAAmB,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;QAC1C,oBAAoB,EAAE,CAAC,CAAC,OAAO,IAAI,aAAa;QAChD,iBAAiB,EAAE,CAAC,CAAC,IAAI,IAAI,QAAQ;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,8BAA8B,EAAE,2BAA2B,CAAU,CAAC;AAEnG;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAa;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC;IACzC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7G,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,GAAa;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/toast.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
export type ToastTone = "success" | "error" | "info";
|
|
3
|
+
export interface ToastOptions {
|
|
4
|
+
tone?: ToastTone;
|
|
5
|
+
title: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
/** Milliseconds before it hides itself (paused while hovered or focused). Default 4s, errors 8s. */
|
|
8
|
+
duration?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ToastApi {
|
|
11
|
+
show: (toast: ToastOptions) => number;
|
|
12
|
+
success: (title: string, description?: string) => number;
|
|
13
|
+
error: (title: string, description?: string) => number;
|
|
14
|
+
info: (title: string, description?: string) => number;
|
|
15
|
+
dismiss: (id: number) => void;
|
|
16
|
+
}
|
|
17
|
+
/** Transient status messages ("Saved", "3 records deleted"). A no-op outside <ForgeProvider>. */
|
|
18
|
+
export declare function useToast(): ToastApi;
|
|
19
|
+
export declare function ToastProvider({ children }: {
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
}): import("react").JSX.Element;
|
package/dist/toast.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { CircleAlert, CircleCheck, Info, X } from "lucide-react";
|
|
4
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
import { useT } from "./context.js";
|
|
6
|
+
const MAX_VISIBLE = 4;
|
|
7
|
+
const noop = { show: () => -1, success: () => -1, error: () => -1, info: () => -1, dismiss: () => undefined };
|
|
8
|
+
const ToastContext = createContext(null);
|
|
9
|
+
/** Transient status messages ("Saved", "3 records deleted"). A no-op outside <ForgeProvider>. */
|
|
10
|
+
export function useToast() {
|
|
11
|
+
return useContext(ToastContext) ?? noop;
|
|
12
|
+
}
|
|
13
|
+
export function ToastProvider({ children }) {
|
|
14
|
+
const [items, setItems] = useState([]);
|
|
15
|
+
const nextId = useRef(1);
|
|
16
|
+
const dismiss = useCallback((id) => setItems((all) => all.filter((t) => t.id !== id)), []);
|
|
17
|
+
const show = useCallback((o) => {
|
|
18
|
+
const id = nextId.current++;
|
|
19
|
+
const tone = o.tone ?? "info";
|
|
20
|
+
const item = { id, tone, title: o.title, duration: o.duration ?? (tone === "error" ? 8000 : 4000), ...(o.description ? { description: o.description } : {}) };
|
|
21
|
+
setItems((all) => [...all, item].slice(-MAX_VISIBLE));
|
|
22
|
+
return id;
|
|
23
|
+
}, []);
|
|
24
|
+
const api = useMemo(() => ({
|
|
25
|
+
show,
|
|
26
|
+
dismiss,
|
|
27
|
+
success: (title, description) => show({ tone: "success", title, ...(description ? { description } : {}) }),
|
|
28
|
+
error: (title, description) => show({ tone: "error", title, ...(description ? { description } : {}) }),
|
|
29
|
+
info: (title, description) => show({ tone: "info", title, ...(description ? { description } : {}) }),
|
|
30
|
+
}), [show, dismiss]);
|
|
31
|
+
return (_jsxs(ToastContext.Provider, { value: api, children: [children, _jsx(ToastViewport, { items: items, onDismiss: dismiss })] }));
|
|
32
|
+
}
|
|
33
|
+
const ICON = { success: CircleCheck, error: CircleAlert, info: Info };
|
|
34
|
+
function ToastViewport({ items, onDismiss }) {
|
|
35
|
+
const t = useT();
|
|
36
|
+
// Two live regions that always exist, so screen readers announce toasts added later.
|
|
37
|
+
return (_jsxs("section", { "aria-label": t("toast.region"), className: "forge-toaster pointer-events-none fixed inset-x-0 top-3 z-[60] flex flex-col items-center gap-2 px-4 sm:inset-x-auto sm:top-4 sm:right-4 sm:w-96 sm:items-end", children: [_jsx("div", { role: "status", "aria-live": "polite", className: "flex w-full flex-col items-center gap-2 sm:items-end", children: items.filter((i) => i.tone !== "error").map((i) => (_jsx(Toast, { item: i, onDismiss: onDismiss }, i.id))) }), _jsx("div", { role: "alert", "aria-live": "assertive", className: "flex w-full flex-col items-center gap-2 sm:items-end", children: items.filter((i) => i.tone === "error").map((i) => (_jsx(Toast, { item: i, onDismiss: onDismiss }, i.id))) })] }));
|
|
38
|
+
}
|
|
39
|
+
function Toast({ item, onDismiss }) {
|
|
40
|
+
const t = useT();
|
|
41
|
+
const [paused, setPaused] = useState(false);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
if (paused)
|
|
44
|
+
return;
|
|
45
|
+
const timer = setTimeout(() => onDismiss(item.id), item.duration);
|
|
46
|
+
return () => clearTimeout(timer);
|
|
47
|
+
}, [paused, item.id, item.duration, onDismiss]);
|
|
48
|
+
const Icon = ICON[item.tone];
|
|
49
|
+
return (_jsxs("div", { "data-forge-toast": item.tone, className: "forge-toast pointer-events-auto flex w-full max-w-sm items-start gap-3 px-4 py-3 text-sm", onMouseEnter: () => setPaused(true), onMouseLeave: () => setPaused(false), onFocus: () => setPaused(true), onBlur: () => setPaused(false), children: [_jsx(Icon, { className: "forge-toast-icon mt-0.5 size-4 shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "font-medium text-ink", children: item.title }), item.description && _jsx("p", { className: "mt-0.5 text-ink-muted", children: item.description })] }), _jsx("button", { type: "button", onClick: () => onDismiss(item.id), className: "forge-btn forge-btn-ghost -mr-1 p-0.5", "aria-label": t("common.close"), children: _jsx(X, { className: "size-3.5", "aria-hidden": true }) })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.js","sourceRoot":"","sources":["../src/toast.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type InputHTMLAttributes, type ReactNode, type SelectHTMLAttributes, type TextareaHTMLAttributes } from "react";
|
|
2
|
+
import { type IllustrationName } from "./illustrations.js";
|
|
3
|
+
export declare function cn(...classes: (string | false | null | undefined)[]): string;
|
|
4
|
+
export declare function ResourceIcon({ name, className }: {
|
|
5
|
+
name: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
8
|
+
type Variant = "primary" | "secondary" | "ghost" | "danger" | "danger-ghost";
|
|
9
|
+
export declare function Button({ variant, size, loading, className, children, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
10
|
+
variant?: Variant;
|
|
11
|
+
size?: "sm" | "md";
|
|
12
|
+
loading?: boolean;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
export declare const inputClass = "forge-input block w-full px-3 py-[var(--forge-control-y)] text-sm";
|
|
15
|
+
export declare function Input({ className, ...props }: InputHTMLAttributes<HTMLInputElement>): import("react").JSX.Element;
|
|
16
|
+
export declare function Textarea({ className, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement>): import("react").JSX.Element;
|
|
17
|
+
export declare function Select({ className, children, ...props }: SelectHTMLAttributes<HTMLSelectElement>): import("react").JSX.Element;
|
|
18
|
+
export declare function Label({ children, htmlFor, required }: {
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
htmlFor?: string;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
export declare function FieldShell({ label, htmlFor, required, error, hint, children }: {
|
|
24
|
+
label: string;
|
|
25
|
+
htmlFor?: string;
|
|
26
|
+
required?: boolean;
|
|
27
|
+
error?: string;
|
|
28
|
+
hint?: string;
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
}): import("react").JSX.Element;
|
|
31
|
+
export declare function Badge({ children, tone }: {
|
|
32
|
+
children: ReactNode;
|
|
33
|
+
tone?: number;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
export declare function Card({ children, className }: {
|
|
36
|
+
children: ReactNode;
|
|
37
|
+
className?: string;
|
|
38
|
+
}): import("react").JSX.Element;
|
|
39
|
+
export declare function PageHeader({ title, description, actions }: {
|
|
40
|
+
title: ReactNode;
|
|
41
|
+
description?: ReactNode;
|
|
42
|
+
actions?: ReactNode;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
export declare function Spinner({ label }: {
|
|
45
|
+
label?: string;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
47
|
+
export declare function EmptyState({ title, description, action, illustration }: {
|
|
48
|
+
title: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
action?: ReactNode;
|
|
51
|
+
illustration?: IllustrationName;
|
|
52
|
+
}): import("react").JSX.Element;
|
|
53
|
+
export declare function Alert({ tone, children }: {
|
|
54
|
+
tone?: "error" | "success" | "info";
|
|
55
|
+
children: ReactNode;
|
|
56
|
+
}): import("react").JSX.Element;
|
|
57
|
+
declare const DIALOG_WIDTH: {
|
|
58
|
+
readonly md: "max-w-md";
|
|
59
|
+
readonly lg: "max-w-2xl";
|
|
60
|
+
readonly xl: "max-w-4xl";
|
|
61
|
+
};
|
|
62
|
+
export declare function Dialog({ open, onClose, title, children, footer, size, }: {
|
|
63
|
+
open: boolean;
|
|
64
|
+
onClose: () => void;
|
|
65
|
+
title: string;
|
|
66
|
+
children: ReactNode;
|
|
67
|
+
footer?: ReactNode;
|
|
68
|
+
size?: keyof typeof DIALOG_WIDTH;
|
|
69
|
+
}): import("react").JSX.Element | null;
|
|
70
|
+
export declare function ConfirmDialog({ open, title, message, confirmLabel, danger, loading, onConfirm, onClose, }: {
|
|
71
|
+
open: boolean;
|
|
72
|
+
title: string;
|
|
73
|
+
message: ReactNode;
|
|
74
|
+
confirmLabel?: string;
|
|
75
|
+
danger?: boolean;
|
|
76
|
+
loading?: boolean;
|
|
77
|
+
onConfirm: () => void;
|
|
78
|
+
onClose: () => void;
|
|
79
|
+
}): import("react").JSX.Element;
|
|
80
|
+
export declare function Pagination({ page, pages, total, onPage }: {
|
|
81
|
+
page: number;
|
|
82
|
+
pages: number;
|
|
83
|
+
total: number;
|
|
84
|
+
onPage: (p: number) => void;
|
|
85
|
+
}): import("react").JSX.Element;
|
|
86
|
+
export {};
|