@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,79 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
import { type LucideIcon } from "lucide-react";
|
|
3
|
+
import { type Messages, type TranslateVars } from "./i18n/locale.js";
|
|
4
|
+
export declare const LANDING_ICON_COMPONENTS: Record<string, LucideIcon>;
|
|
5
|
+
type LandingApp = Pick<AppIR, "name" | "description" | "theme" | "auth" | "entities" | "i18n" | "landing" | "dashboard" | "plugins">;
|
|
6
|
+
export interface LandingOptions {
|
|
7
|
+
/** UI language (resolveLocale), default: the app's default locale. */
|
|
8
|
+
locale?: string;
|
|
9
|
+
/** Schema translations by locale (apps/web/forge.locales.ts). */
|
|
10
|
+
messages?: Record<string, Messages>;
|
|
11
|
+
}
|
|
12
|
+
export interface LandingContent {
|
|
13
|
+
app: LandingApp;
|
|
14
|
+
t: (key: string, vars?: TranslateVars) => string;
|
|
15
|
+
headline: string;
|
|
16
|
+
subheadline: string;
|
|
17
|
+
features: {
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
icon: string;
|
|
21
|
+
}[];
|
|
22
|
+
cta: {
|
|
23
|
+
label: string;
|
|
24
|
+
href: string;
|
|
25
|
+
};
|
|
26
|
+
/** "Sign in" next to the main button (absent when the main button already signs in). */
|
|
27
|
+
secondary: {
|
|
28
|
+
label: string;
|
|
29
|
+
href: string;
|
|
30
|
+
} | null;
|
|
31
|
+
}
|
|
32
|
+
/** Every text of the landing page in `locale`: the config's (translated via locales/*.json) or generated defaults. */
|
|
33
|
+
export declare function landingContent(baseApp: LandingApp, { locale, messages }?: LandingOptions): LandingContent;
|
|
34
|
+
/**
|
|
35
|
+
* Next.js metadata for the landing page: title, description, canonical URL, Open Graph and Twitter card.
|
|
36
|
+
* `baseUrl` (PUBLIC_URL, else the request's origin) makes the image and canonical URLs absolute.
|
|
37
|
+
*/
|
|
38
|
+
export declare function landingMetadata(baseApp: LandingApp, options?: LandingOptions & {
|
|
39
|
+
baseUrl?: string;
|
|
40
|
+
}): {
|
|
41
|
+
title: {
|
|
42
|
+
absolute: string;
|
|
43
|
+
};
|
|
44
|
+
description: string;
|
|
45
|
+
alternates: {
|
|
46
|
+
canonical: string;
|
|
47
|
+
};
|
|
48
|
+
openGraph: {
|
|
49
|
+
images?: {
|
|
50
|
+
url: string;
|
|
51
|
+
alt: string;
|
|
52
|
+
}[] | undefined;
|
|
53
|
+
type: "website";
|
|
54
|
+
url: string;
|
|
55
|
+
siteName: string;
|
|
56
|
+
title: string;
|
|
57
|
+
description: string;
|
|
58
|
+
locale: string;
|
|
59
|
+
};
|
|
60
|
+
twitter: {
|
|
61
|
+
images?: string[] | undefined;
|
|
62
|
+
card: "summary";
|
|
63
|
+
title: string;
|
|
64
|
+
description: string;
|
|
65
|
+
};
|
|
66
|
+
robots: {
|
|
67
|
+
index: boolean;
|
|
68
|
+
follow: boolean;
|
|
69
|
+
};
|
|
70
|
+
metadataBase?: URL | undefined;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The landing page: header, a hero on the brand art of the sign-in pages, a feature grid, a call to action and a
|
|
74
|
+
* footer — styled by the theme (preset colours, style, fonts, corners, logo, tagline).
|
|
75
|
+
*/
|
|
76
|
+
export declare function LandingPage({ app: baseApp, locale, messages }: {
|
|
77
|
+
app: LandingApp;
|
|
78
|
+
} & LandingOptions): import("react").JSX.Element;
|
|
79
|
+
export {};
|
package/dist/landing.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { localizeSchema } from "@tekki-forge/compiler/i18n";
|
|
3
|
+
import { ArrowRight, BarChart3, Bell, Box, Briefcase, Building2, Calendar, CheckSquare, Clock, CreditCard, Database, FileText, Folder, Globe, Heart, Layers, Lock, Mail, MapPin, MessageSquare, Package, Rocket, Search, Shield, ShoppingCart, Sparkles, Star, Tag, Ticket, Users, Workflow, Zap, } from "lucide-react";
|
|
4
|
+
import { BrandLogo, BrandPattern, brandMeshStyle } from "./brand-art.js";
|
|
5
|
+
import { translate } from "./i18n/locale.js";
|
|
6
|
+
import { uiCatalogs } from "./i18n/catalog.js";
|
|
7
|
+
/*
|
|
8
|
+
* The public landing page (`landing` in forge.config.ts). A server component: no hooks, no "use client", so the
|
|
9
|
+
* content is in the HTML and needs no JavaScript. Rendered at `/` for signed-out visitors by the starter's proxy.ts.
|
|
10
|
+
*/
|
|
11
|
+
// Same names as LANDING_ICONS in @tekki-forge/compiler (tests/landing.test.ts keeps them in sync).
|
|
12
|
+
export const LANDING_ICON_COMPONENTS = {
|
|
13
|
+
folder: Folder,
|
|
14
|
+
users: Users,
|
|
15
|
+
user: Users,
|
|
16
|
+
briefcase: Briefcase,
|
|
17
|
+
building: Building2,
|
|
18
|
+
"file-text": FileText,
|
|
19
|
+
box: Box,
|
|
20
|
+
tag: Tag,
|
|
21
|
+
layers: Layers,
|
|
22
|
+
star: Star,
|
|
23
|
+
calendar: Calendar,
|
|
24
|
+
"credit-card": CreditCard,
|
|
25
|
+
mail: Mail,
|
|
26
|
+
"map-pin": MapPin,
|
|
27
|
+
package: Package,
|
|
28
|
+
"shopping-cart": ShoppingCart,
|
|
29
|
+
ticket: Ticket,
|
|
30
|
+
"check-square": CheckSquare,
|
|
31
|
+
zap: Zap,
|
|
32
|
+
shield: Shield,
|
|
33
|
+
chart: BarChart3,
|
|
34
|
+
sparkles: Sparkles,
|
|
35
|
+
lock: Lock,
|
|
36
|
+
globe: Globe,
|
|
37
|
+
clock: Clock,
|
|
38
|
+
bell: Bell,
|
|
39
|
+
search: Search,
|
|
40
|
+
heart: Heart,
|
|
41
|
+
rocket: Rocket,
|
|
42
|
+
"message-square": MessageSquare,
|
|
43
|
+
workflow: Workflow,
|
|
44
|
+
database: Database,
|
|
45
|
+
};
|
|
46
|
+
/** Locale words are lower-cased inside sentences, except in German where nouns keep their capital. */
|
|
47
|
+
const inSentence = (label, locale) => (locale.startsWith("de") ? label : label.toLocaleLowerCase(locale));
|
|
48
|
+
/** One card per entity in the navigation (up to 6), topped up with what every Forge app has so the grid never looks empty. */
|
|
49
|
+
function defaultFeatures(app, locale, t) {
|
|
50
|
+
const entities = app.entities
|
|
51
|
+
.filter((e) => e.nav)
|
|
52
|
+
.slice(0, 6)
|
|
53
|
+
.map((e) => ({ title: e.pluralLabel, description: e.description ?? t("landingPage.entityFeature", { items: inSentence(e.pluralLabel, locale) }), icon: e.icon }));
|
|
54
|
+
const builtin = [
|
|
55
|
+
{ key: "dashboard", icon: "chart" },
|
|
56
|
+
{ key: "access", icon: "shield" },
|
|
57
|
+
{ key: "security", icon: "lock" },
|
|
58
|
+
].map((b) => ({ title: t(`landingPage.builtin.${b.key}.title`), description: t(`landingPage.builtin.${b.key}.description`), icon: b.icon }));
|
|
59
|
+
return entities.length >= 3 ? entities : [...entities, ...builtin.slice(0, 3 - entities.length)];
|
|
60
|
+
}
|
|
61
|
+
/** Every text of the landing page in `locale`: the config's (translated via locales/*.json) or generated defaults. */
|
|
62
|
+
export function landingContent(baseApp, { locale, messages = {} } = {}) {
|
|
63
|
+
const lang = locale ?? baseApp.i18n?.defaultLocale ?? "en";
|
|
64
|
+
const app = lang === (baseApp.i18n?.defaultLocale ?? "en") ? baseApp : localizeSchema(baseApp, {}, messages[lang]).app;
|
|
65
|
+
const t = (key, vars) => translate([...uiCatalogs(lang), messages[lang] ?? {}], lang, key, vars);
|
|
66
|
+
const config = app.landing ?? {};
|
|
67
|
+
const headline = config.headline ?? app.theme.tagline ?? app.name;
|
|
68
|
+
const subheadline = config.subheadline ?? app.description ?? t("landingPage.subheadline", { app: app.name });
|
|
69
|
+
const features = config.features ?? defaultFeatures(app, lang, t);
|
|
70
|
+
const signIn = { label: t("landingPage.signIn"), href: "/sign-in" };
|
|
71
|
+
const cta = config.cta ?? (app.auth.registration ? { label: t("landingPage.getStarted"), href: "/sign-up" } : signIn);
|
|
72
|
+
return { app, t, headline, subheadline, features, cta, secondary: cta.href === "/sign-in" ? null : signIn };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Next.js metadata for the landing page: title, description, canonical URL, Open Graph and Twitter card.
|
|
76
|
+
* `baseUrl` (PUBLIC_URL, else the request's origin) makes the image and canonical URLs absolute.
|
|
77
|
+
*/
|
|
78
|
+
export function landingMetadata(baseApp, options = {}) {
|
|
79
|
+
const { app, headline, subheadline } = landingContent(baseApp, options);
|
|
80
|
+
const title = headline === app.name ? app.name : `${app.name} · ${headline}`;
|
|
81
|
+
const images = app.theme.logo ? [{ url: app.theme.logo, alt: app.name }] : undefined;
|
|
82
|
+
let metadataBase;
|
|
83
|
+
try {
|
|
84
|
+
metadataBase = options.baseUrl ? new URL(options.baseUrl) : undefined;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
metadataBase = undefined;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
...(metadataBase ? { metadataBase } : {}),
|
|
91
|
+
title: { absolute: title },
|
|
92
|
+
description: subheadline,
|
|
93
|
+
alternates: { canonical: "/" },
|
|
94
|
+
openGraph: { type: "website", url: "/", siteName: app.name, title, description: subheadline, locale: options.locale ?? app.i18n?.defaultLocale ?? "en", ...(images ? { images } : {}) },
|
|
95
|
+
twitter: { card: "summary", title, description: subheadline, ...(images ? { images: images.map((i) => i.url) } : {}) },
|
|
96
|
+
robots: { index: true, follow: true },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const BTN = "forge-btn inline-flex items-center justify-center gap-1.5 font-medium";
|
|
100
|
+
function FeatureIcon({ name }) {
|
|
101
|
+
const Icon = LANDING_ICON_COMPONENTS[name] ?? Sparkles;
|
|
102
|
+
return _jsx(Icon, { className: "size-5", "aria-hidden": true });
|
|
103
|
+
}
|
|
104
|
+
/** Decorative glimpse of the app inside the hero: a glass window listing what it manages. */
|
|
105
|
+
function HeroWindow({ content }) {
|
|
106
|
+
const rows = content.features.slice(0, 4);
|
|
107
|
+
if (!rows.length)
|
|
108
|
+
return null;
|
|
109
|
+
return (_jsxs("div", { className: "forge-landing-window relative hidden w-full max-w-sm justify-self-end p-4 lg:block", "aria-hidden": true, children: [_jsxs("div", { className: "mb-4 flex gap-1.5", children: [_jsx("span", { className: "size-2.5 rounded-full bg-white/40" }), _jsx("span", { className: "size-2.5 rounded-full bg-white/40" }), _jsx("span", { className: "size-2.5 rounded-full bg-white/40" })] }), _jsx("ul", { className: "space-y-2.5", children: rows.map((f, i) => (_jsxs("li", { className: "forge-landing-window-row flex items-center gap-3 px-3 py-2.5", children: [_jsx("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-white/15", children: _jsx(FeatureIcon, { name: f.icon }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium", children: f.title }), _jsx("span", { className: "mt-1.5 block h-1.5 rounded-full bg-white/25", style: { width: `${88 - i * 17}%` } })] })] }, f.title))) })] }));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* The landing page: header, a hero on the brand art of the sign-in pages, a feature grid, a call to action and a
|
|
113
|
+
* footer — styled by the theme (preset colours, style, fonts, corners, logo, tagline).
|
|
114
|
+
*/
|
|
115
|
+
export function LandingPage({ app: baseApp, locale, messages }) {
|
|
116
|
+
const content = landingContent(baseApp, { locale, messages });
|
|
117
|
+
const { app, t, headline, subheadline, features, cta, secondary } = content;
|
|
118
|
+
const year = new Date().getFullYear();
|
|
119
|
+
const external = (href) => /^https?:\/\//.test(href);
|
|
120
|
+
return (_jsxs("div", { className: "forge-app-bg forge-landing flex min-h-dvh flex-col", children: [_jsx("a", { href: "#main", className: "forge-skip-link", children: t("landingPage.skipToContent") }), _jsx("header", { className: "relative z-10", children: _jsxs("div", { className: "mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-4 sm:px-6", children: [_jsxs("a", { href: "/", className: "forge-focusable flex min-w-0 items-center gap-2.5 rounded-[var(--forge-radius-control)] text-ink", children: [_jsx(BrandLogo, { app: app }), _jsx("span", { className: "truncate font-semibold", children: app.name })] }), _jsxs("nav", { "aria-label": t("landingPage.navigation"), className: "flex shrink-0 items-center gap-2", children: [secondary && (_jsx("a", { href: secondary.href, className: `${BTN} forge-btn-ghost h-[var(--forge-control-h)] px-3.5 text-sm`, children: secondary.label })), _jsx("a", { href: cta.href, className: `${BTN} forge-btn-primary h-[var(--forge-control-h)] px-3.5 text-sm`, ...(external(cta.href) ? { rel: "noopener" } : {}), children: cta.label })] })] }) }), _jsxs("main", { id: "main", className: "flex-1", children: [_jsx("section", { "aria-labelledby": "forge-landing-title", className: "px-4 sm:px-6", children: _jsxs("div", { className: "forge-auth-brand forge-landing-hero relative mx-auto max-w-6xl overflow-hidden", style: brandMeshStyle(app.name), children: [_jsx(BrandPattern, { name: app.name, id: "forge-landing-dots" }), _jsxs("div", { className: "relative grid items-center gap-10 px-6 py-16 sm:px-12 sm:py-24 lg:grid-cols-[minmax(0,1.25fr)_minmax(0,1fr)]", children: [_jsxs("div", { className: "forge-auth-copy max-w-2xl", children: [headline !== app.name && (_jsxs("p", { className: "mb-5 inline-flex items-center gap-2 text-sm font-medium opacity-90", children: [_jsx(BrandLogo, { app: app, className: "forge-auth-mark" }), app.name] })), _jsx("h1", { id: "forge-landing-title", className: "forge-heading text-4xl leading-[1.08] font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl", children: headline }), subheadline && subheadline !== headline && _jsx("p", { className: "mt-5 max-w-xl text-lg leading-relaxed text-pretty opacity-90", children: subheadline }), _jsxs("div", { className: "mt-9 flex flex-wrap gap-3", children: [_jsxs("a", { href: cta.href, className: `${BTN} forge-landing-cta h-11 px-5 text-base`, ...(external(cta.href) ? { rel: "noopener" } : {}), children: [cta.label, _jsx(ArrowRight, { className: "size-4", "aria-hidden": true })] }), secondary && (_jsx("a", { href: secondary.href, className: `${BTN} forge-landing-cta-secondary h-11 px-5 text-base`, children: secondary.label }))] })] }), _jsx(HeroWindow, { content: content })] })] }) }), features.length > 0 && (_jsxs("section", { "aria-labelledby": "forge-landing-features", className: "mx-auto max-w-6xl px-4 py-20 sm:px-6 sm:py-24", children: [_jsxs("div", { className: "max-w-2xl", children: [_jsx("h2", { id: "forge-landing-features", className: "forge-heading text-3xl font-semibold tracking-tight text-ink text-balance sm:text-4xl", children: t("landingPage.featuresTitle", { app: app.name }) }), _jsx("p", { className: "mt-3 text-base text-ink-muted", children: t("landingPage.featuresSubtitle") })] }), _jsx("ul", { className: "mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3", children: features.map((f) => (_jsxs("li", { className: "forge-card forge-landing-feature flex flex-col p-[var(--forge-pad-card-lg)]", children: [_jsx("span", { className: "forge-chip flex size-10 items-center justify-center", children: _jsx(FeatureIcon, { name: f.icon }) }), _jsx("h3", { className: "forge-heading mt-5 text-lg font-semibold text-ink", children: f.title }), _jsx("p", { className: "mt-2 text-sm leading-relaxed text-ink-muted", children: f.description })] }, f.title))) })] })), _jsx("section", { "aria-labelledby": "forge-landing-cta", className: "mx-auto max-w-6xl px-4 pb-20 sm:px-6 sm:pb-24", children: _jsxs("div", { className: "forge-card flex flex-col items-start justify-between gap-6 p-8 sm:flex-row sm:items-center sm:p-10", children: [_jsxs("div", { children: [_jsx("h2", { id: "forge-landing-cta", className: "forge-heading text-2xl font-semibold tracking-tight text-ink", children: t("landingPage.ctaTitle") }), _jsx("p", { className: "mt-2 text-ink-muted", children: t(cta.href === "/sign-in" ? "landingPage.ctaSignIn" : "landingPage.ctaText", { app: app.name }) })] }), _jsxs("a", { href: cta.href, className: `${BTN} forge-btn-primary h-11 shrink-0 px-5 text-base`, ...(external(cta.href) ? { rel: "noopener" } : {}), children: [cta.label, _jsx(ArrowRight, { className: "size-4", "aria-hidden": true })] })] }) })] }), _jsx("footer", { className: "border-t border-line", children: _jsxs("div", { className: "mx-auto flex max-w-6xl flex-col gap-4 px-4 py-8 text-sm text-ink-muted sm:flex-row sm:items-center sm:justify-between sm:px-6", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx(BrandLogo, { app: app }), _jsxs("span", { children: ["\u00A9 ", year, " ", app.name, app.theme.tagline ? ` · ${app.theme.tagline}` : ""] })] }), _jsxs("nav", { "aria-label": t("landingPage.footerNavigation"), className: "flex gap-4", children: [_jsx("a", { href: "/sign-in", className: "forge-focusable rounded-sm hover:text-ink", children: t("landingPage.signIn") }), app.auth.registration && (_jsx("a", { href: "/sign-up", className: "forge-focusable rounded-sm hover:text-ink", children: t("landingPage.createAccount") }))] })] }) })] }));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=landing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"landing.js","sourceRoot":"","sources":["../src/landing.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Languages } from "lucide-react";
|
|
4
|
+
import { useForge } from "./context.js";
|
|
5
|
+
import { localeName } from "./i18n/catalog.js";
|
|
6
|
+
import { cn } from "./ui.js";
|
|
7
|
+
/** Language picker; renders nothing when the app has a single locale. */
|
|
8
|
+
export function LocaleSwitcher({ className }) {
|
|
9
|
+
const { app, locale, setLocale, t } = useForge();
|
|
10
|
+
const locales = app.i18n?.locales ?? [];
|
|
11
|
+
if (locales.length < 2)
|
|
12
|
+
return null;
|
|
13
|
+
return (_jsxs("label", { className: cn("forge-nav-item flex items-center gap-2.5 px-2.5 py-1.5 text-sm", className), children: [_jsx(Languages, { className: "size-4 shrink-0", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: t("locale.label") }), _jsx("select", { value: locale, onChange: (e) => setLocale(e.target.value), className: "min-w-0 flex-1 cursor-pointer bg-transparent outline-none", children: locales.map((l) => (_jsx("option", { value: l, children: localeName(l) }, l))) })] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=locale-switcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale-switcher.js","sourceRoot":"","sources":["../src/locale-switcher.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAA0B;IAClE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,iBAAO,SAAS,EAAE,EAAE,CAAC,gEAAgE,EAAE,SAAS,CAAC,aAC/F,KAAC,SAAS,IAAC,SAAS,EAAC,iBAAiB,wBAAe,EACrD,eAAM,SAAS,EAAC,SAAS,YAAE,CAAC,CAAC,cAAc,CAAC,GAAQ,EACpD,iBAAQ,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,2DAA2D,YACrI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAClB,iBAAgB,KAAK,EAAE,CAAC,YACrB,UAAU,CAAC,CAAC,CAAC,IADH,CAAC,CAEL,CACV,CAAC,GACK,IACH,CACT,CAAC;AACJ,CAAC"}
|
package/dist/map.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { EntityIR, ResourceMeta } from "@tekki-forge/compiler";
|
|
2
|
+
type Params = Record<string, string>;
|
|
3
|
+
interface LatLng {
|
|
4
|
+
lat: number;
|
|
5
|
+
lng: number;
|
|
6
|
+
}
|
|
7
|
+
/** Tile URL template; OpenStreetMap's by default (fair-use policy: light traffic, attribution shown). */
|
|
8
|
+
export declare const tileUrl: () => string;
|
|
9
|
+
/** Web Mercator: geographic → world pixel at `zoom`. */
|
|
10
|
+
export declare function project({ lat, lng }: LatLng, zoom: number): {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function unproject(x: number, y: number, zoom: number): LatLng;
|
|
15
|
+
/** Largest zoom at which every point fits in `width`×`height` (with padding). */
|
|
16
|
+
export declare function fitBounds(points: LatLng[], width: number, height: number): {
|
|
17
|
+
center: LatLng;
|
|
18
|
+
zoom: number;
|
|
19
|
+
};
|
|
20
|
+
export declare function MapView({ entity, resource, params, fixed }: {
|
|
21
|
+
entity: EntityIR;
|
|
22
|
+
resource: ResourceMeta;
|
|
23
|
+
params: Params;
|
|
24
|
+
fixed?: Params;
|
|
25
|
+
}): import("react").JSX.Element;
|
|
26
|
+
export {};
|
package/dist/map.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { keepPreviousData, useQuery } from "@tanstack/react-query";
|
|
4
|
+
import { Locate, MapPin, Minus, Plus, X } from "lucide-react";
|
|
5
|
+
import Link from "next/link";
|
|
6
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
7
|
+
import { useForge } from "./context.js";
|
|
8
|
+
import { Alert, Spinner, cn } from "./ui.js";
|
|
9
|
+
import { TruncationNotice, viewQuery } from "./views.js";
|
|
10
|
+
const TILE = 256;
|
|
11
|
+
const MIN_ZOOM = 1;
|
|
12
|
+
const MAX_ZOOM = 18;
|
|
13
|
+
const MAX_LAT = 85.05112878;
|
|
14
|
+
const CLUSTER_PX = 44;
|
|
15
|
+
const HEIGHT = 520;
|
|
16
|
+
/** Tile URL template; OpenStreetMap's by default (fair-use policy: light traffic, attribution shown). */
|
|
17
|
+
export const tileUrl = () => process.env.NEXT_PUBLIC_FORGE_MAP_TILES || "https://tile.openstreetmap.org/{z}/{x}/{y}.png";
|
|
18
|
+
/** Web Mercator: geographic → world pixel at `zoom`. */
|
|
19
|
+
export function project({ lat, lng }, zoom) {
|
|
20
|
+
const size = TILE * 2 ** zoom;
|
|
21
|
+
const sin = Math.sin((Math.max(-MAX_LAT, Math.min(MAX_LAT, lat)) * Math.PI) / 180);
|
|
22
|
+
return { x: ((lng + 180) / 360) * size, y: (0.5 - Math.log((1 + sin) / (1 - sin)) / (4 * Math.PI)) * size };
|
|
23
|
+
}
|
|
24
|
+
export function unproject(x, y, zoom) {
|
|
25
|
+
const size = TILE * 2 ** zoom;
|
|
26
|
+
const n = Math.PI - (2 * Math.PI * y) / size;
|
|
27
|
+
return { lat: (180 / Math.PI) * Math.atan(Math.sinh(n)), lng: (x / size) * 360 - 180 };
|
|
28
|
+
}
|
|
29
|
+
const wrapLng = (lng) => ((((lng + 180) % 360) + 360) % 360) - 180;
|
|
30
|
+
const clampZoom = (z) => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, z));
|
|
31
|
+
/** Largest zoom at which every point fits in `width`×`height` (with padding). */
|
|
32
|
+
export function fitBounds(points, width, height) {
|
|
33
|
+
if (!points.length)
|
|
34
|
+
return { center: { lat: 20, lng: 0 }, zoom: 2 };
|
|
35
|
+
if (points.length === 1)
|
|
36
|
+
return { center: points[0], zoom: 13 };
|
|
37
|
+
const lats = points.map((p) => p.lat);
|
|
38
|
+
const lngs = points.map((p) => p.lng);
|
|
39
|
+
const sw = { lat: Math.min(...lats), lng: Math.min(...lngs) };
|
|
40
|
+
const ne = { lat: Math.max(...lats), lng: Math.max(...lngs) };
|
|
41
|
+
let zoom = 15;
|
|
42
|
+
for (; zoom > MIN_ZOOM; zoom--) {
|
|
43
|
+
const a = project(sw, zoom);
|
|
44
|
+
const b = project(ne, zoom);
|
|
45
|
+
if (Math.abs(b.x - a.x) <= width - 80 && Math.abs(a.y - b.y) <= height - 80)
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
const a = project(sw, zoom);
|
|
49
|
+
const b = project(ne, zoom);
|
|
50
|
+
return { center: unproject((a.x + b.x) / 2, (a.y + b.y) / 2, zoom), zoom };
|
|
51
|
+
}
|
|
52
|
+
export function MapView({ entity, resource, params, fixed }) {
|
|
53
|
+
const view = entity.views.map;
|
|
54
|
+
const { api, t } = useForge();
|
|
55
|
+
const containerRef = useRef(null);
|
|
56
|
+
const [width, setWidth] = useState(0);
|
|
57
|
+
const [camera, setCamera] = useState(null);
|
|
58
|
+
const [bbox, setBbox] = useState(null);
|
|
59
|
+
const [selected, setSelected] = useState(null);
|
|
60
|
+
const drag = useRef(null);
|
|
61
|
+
// The first load fits every located record; after the user moves the map, only the viewport is loaded.
|
|
62
|
+
const query = { ...viewQuery(params, fixed), [`${view.location}.set`]: "true", ...(bbox ? { [`${view.location}.within`]: bbox } : {}) };
|
|
63
|
+
const list = useQuery({
|
|
64
|
+
queryKey: ["resource", resource.path, "list", query],
|
|
65
|
+
queryFn: () => api(`/${resource.path}`, { query }),
|
|
66
|
+
placeholderData: keepPreviousData,
|
|
67
|
+
});
|
|
68
|
+
const rows = useMemo(() => (list.data?.data ?? []).filter((r) => r[view.location] && Number.isFinite(r[view.location].lat)), [list.data, view.location]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
const el = containerRef.current;
|
|
71
|
+
if (!el)
|
|
72
|
+
return;
|
|
73
|
+
const ro = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));
|
|
74
|
+
ro.observe(el);
|
|
75
|
+
return () => ro.disconnect();
|
|
76
|
+
}, []);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (!camera && width && list.data && !list.isPlaceholderData && !bbox)
|
|
79
|
+
setCamera(fitBounds(rows.map((r) => r[view.location]), width, HEIGHT));
|
|
80
|
+
}, [camera, width, list.data, list.isPlaceholderData, rows, bbox, view.location]);
|
|
81
|
+
// Reload the viewport's records shortly after the camera settles.
|
|
82
|
+
const userMoved = useRef(false);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (!camera || !width || !userMoved.current)
|
|
85
|
+
return;
|
|
86
|
+
const t = setTimeout(() => {
|
|
87
|
+
const c = project(camera.center, camera.zoom);
|
|
88
|
+
const tl = unproject(c.x - width / 2, c.y - HEIGHT / 2, camera.zoom);
|
|
89
|
+
const br = unproject(c.x + width / 2, c.y + HEIGHT / 2, camera.zoom);
|
|
90
|
+
const spansWorld = br.lng - tl.lng >= 360;
|
|
91
|
+
const f = (n) => n.toFixed(5);
|
|
92
|
+
setBbox([f(br.lat), spansWorld ? "-180" : f(wrapLng(tl.lng)), f(tl.lat), spansWorld ? "180" : f(wrapLng(br.lng))].join(","));
|
|
93
|
+
}, 350);
|
|
94
|
+
return () => clearTimeout(t);
|
|
95
|
+
}, [camera, width]);
|
|
96
|
+
const moveCamera = useCallback((next) => {
|
|
97
|
+
userMoved.current = true;
|
|
98
|
+
setCamera({ center: { lat: Math.max(-MAX_LAT, Math.min(MAX_LAT, next.center.lat)), lng: wrapLng(next.center.lng) }, zoom: clampZoom(next.zoom) });
|
|
99
|
+
}, []);
|
|
100
|
+
const panBy = useCallback((dx, dy) => {
|
|
101
|
+
if (!camera)
|
|
102
|
+
return;
|
|
103
|
+
const c = project(camera.center, camera.zoom);
|
|
104
|
+
moveCamera({ center: unproject(c.x + dx, c.y + dy, camera.zoom), zoom: camera.zoom });
|
|
105
|
+
}, [camera, moveCamera]);
|
|
106
|
+
/** Zoom by `delta` levels keeping the point under (px, py) — relative to the map's centre — fixed. */
|
|
107
|
+
const zoomAt = useCallback((delta, px = 0, py = 0) => {
|
|
108
|
+
if (!camera)
|
|
109
|
+
return;
|
|
110
|
+
const zoom = clampZoom(camera.zoom + delta);
|
|
111
|
+
if (zoom === camera.zoom)
|
|
112
|
+
return;
|
|
113
|
+
const c = project(camera.center, camera.zoom);
|
|
114
|
+
const anchor = unproject(c.x + px, c.y + py, camera.zoom);
|
|
115
|
+
const a = project(anchor, zoom);
|
|
116
|
+
moveCamera({ center: unproject(a.x - px, a.y - py, zoom), zoom });
|
|
117
|
+
}, [camera, moveCamera]);
|
|
118
|
+
// Wheel zoom needs a non-passive listener to stop the page from scrolling.
|
|
119
|
+
const wheel = useRef({ acc: 0, last: 0 });
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
const el = containerRef.current;
|
|
122
|
+
if (!el)
|
|
123
|
+
return;
|
|
124
|
+
const onWheel = (e) => {
|
|
125
|
+
e.preventDefault();
|
|
126
|
+
const w = wheel.current;
|
|
127
|
+
w.acc += e.deltaY;
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
if (Math.abs(w.acc) < 60 || now - w.last < 180)
|
|
130
|
+
return;
|
|
131
|
+
const rect = el.getBoundingClientRect();
|
|
132
|
+
zoomAt(w.acc < 0 ? 1 : -1, e.clientX - rect.left - rect.width / 2, e.clientY - rect.top - rect.height / 2);
|
|
133
|
+
w.acc = 0;
|
|
134
|
+
w.last = now;
|
|
135
|
+
};
|
|
136
|
+
el.addEventListener("wheel", onWheel, { passive: false });
|
|
137
|
+
return () => el.removeEventListener("wheel", onWheel);
|
|
138
|
+
}, [zoomAt]);
|
|
139
|
+
const onPointerDown = (e) => {
|
|
140
|
+
if (e.target.closest("[data-map-ui]"))
|
|
141
|
+
return;
|
|
142
|
+
drag.current = { x: e.clientX, y: e.clientY, moved: false };
|
|
143
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
144
|
+
};
|
|
145
|
+
const onPointerMove = (e) => {
|
|
146
|
+
const d = drag.current;
|
|
147
|
+
if (!d)
|
|
148
|
+
return;
|
|
149
|
+
const dx = e.clientX - d.x;
|
|
150
|
+
const dy = e.clientY - d.y;
|
|
151
|
+
if (!d.moved && Math.hypot(dx, dy) < 3)
|
|
152
|
+
return;
|
|
153
|
+
d.moved = true;
|
|
154
|
+
d.x = e.clientX;
|
|
155
|
+
d.y = e.clientY;
|
|
156
|
+
panBy(-dx, -dy);
|
|
157
|
+
};
|
|
158
|
+
const onPointerUp = () => {
|
|
159
|
+
if (drag.current && !drag.current.moved)
|
|
160
|
+
setSelected(null);
|
|
161
|
+
drag.current = null;
|
|
162
|
+
};
|
|
163
|
+
const layout = useMemo(() => {
|
|
164
|
+
if (!camera || !width)
|
|
165
|
+
return null;
|
|
166
|
+
const z = Math.round(camera.zoom);
|
|
167
|
+
const c = project(camera.center, z);
|
|
168
|
+
const left = c.x - width / 2;
|
|
169
|
+
const top = c.y - HEIGHT / 2;
|
|
170
|
+
const n = 2 ** z;
|
|
171
|
+
const tiles = [];
|
|
172
|
+
for (let tx = Math.floor(left / TILE); tx <= Math.floor((left + width) / TILE); tx++) {
|
|
173
|
+
for (let ty = Math.max(0, Math.floor(top / TILE)); ty <= Math.min(n - 1, Math.floor((top + HEIGHT) / TILE)); ty++) {
|
|
174
|
+
const wx = ((tx % n) + n) % n;
|
|
175
|
+
tiles.push({ key: `${z}/${tx}/${ty}`, src: tileUrl().replace("{z}", String(z)).replace("{x}", String(wx)).replace("{y}", String(ty)), x: tx * TILE - left, y: ty * TILE - top });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Markers, wrapped to the copy of the world nearest the viewport, then grouped on a pixel grid.
|
|
179
|
+
const world = TILE * n;
|
|
180
|
+
const clusters = new Map();
|
|
181
|
+
for (const row of rows) {
|
|
182
|
+
const p = project(row[view.location], z);
|
|
183
|
+
let x = p.x - left;
|
|
184
|
+
x -= Math.round((x - width / 2) / world) * world;
|
|
185
|
+
const y = p.y - top;
|
|
186
|
+
if (x < -40 || x > width + 40 || y < -40 || y > HEIGHT + 40)
|
|
187
|
+
continue;
|
|
188
|
+
const key = z >= MAX_ZOOM ? row.id : `${Math.floor(x / CLUSTER_PX)}:${Math.floor(y / CLUSTER_PX)}`;
|
|
189
|
+
const cl = clusters.get(key) ?? { x: 0, y: 0, rows: [] };
|
|
190
|
+
cl.rows.push(row);
|
|
191
|
+
cl.x += (x - cl.x) / cl.rows.length;
|
|
192
|
+
cl.y += (y - cl.y) / cl.rows.length;
|
|
193
|
+
clusters.set(key, cl);
|
|
194
|
+
}
|
|
195
|
+
return { tiles, clusters: [...clusters.values()] };
|
|
196
|
+
}, [camera, width, rows, view.location]);
|
|
197
|
+
const selectedRow = rows.find((r) => r.id === selected);
|
|
198
|
+
const selectedPos = selectedRow && layout ? layout.clusters.find((c) => c.rows.some((r) => r.id === selected)) : undefined;
|
|
199
|
+
return (_jsxs("div", { children: [list.data && _jsx(TruncationNotice, { shown: list.data.data.length, total: list.data.meta.total }), list.error && (_jsx("div", { className: "p-3", children: _jsx(Alert, { children: list.error.message }) })), _jsxs("div", { ref: containerRef, tabIndex: 0, role: "application", "aria-label": t("views.map.label", { items: resource.pluralLabel.toLowerCase() }), onPointerDown: onPointerDown, onPointerMove: onPointerMove, onPointerUp: onPointerUp, onPointerCancel: onPointerUp, onDoubleClick: (e) => {
|
|
200
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
201
|
+
zoomAt(1, e.clientX - rect.left - rect.width / 2, e.clientY - rect.top - rect.height / 2);
|
|
202
|
+
}, onKeyDown: (e) => {
|
|
203
|
+
const step = 120;
|
|
204
|
+
const keys = {
|
|
205
|
+
ArrowLeft: () => panBy(-step, 0),
|
|
206
|
+
ArrowRight: () => panBy(step, 0),
|
|
207
|
+
ArrowUp: () => panBy(0, -step),
|
|
208
|
+
ArrowDown: () => panBy(0, step),
|
|
209
|
+
"+": () => zoomAt(1),
|
|
210
|
+
"=": () => zoomAt(1),
|
|
211
|
+
"-": () => zoomAt(-1),
|
|
212
|
+
Escape: () => setSelected(null),
|
|
213
|
+
};
|
|
214
|
+
if (keys[e.key]) {
|
|
215
|
+
e.preventDefault();
|
|
216
|
+
keys[e.key]();
|
|
217
|
+
}
|
|
218
|
+
}, className: "forge-map relative touch-none overflow-hidden outline-none select-none focus-visible:ring-2 focus-visible:ring-primary", style: { height: HEIGHT }, children: [!layout && _jsx(Spinner, {}), layout && (_jsxs(_Fragment, { children: [_jsx("div", { className: "forge-map-tiles absolute inset-0", "aria-hidden": true, children: layout.tiles.map((t) => (_jsx("img", { src: t.src, alt: "", draggable: false, className: "pointer-events-none absolute max-w-none", style: { left: t.x, top: t.y, width: TILE, height: TILE } }, t.key))) }), layout.clusters.map((c) => c.rows.length === 1 ? (_jsx("button", { type: "button", "data-map-ui": true, "aria-label": String(c.rows[0][view.title] ?? t("common.untitled")), onClick: () => setSelected(c.rows[0].id), className: "forge-map-pin absolute -translate-x-1/2 -translate-y-full", style: { left: c.x, top: c.y }, children: _jsx(MapPin, { className: "size-7 fill-current stroke-white", strokeWidth: 1.5 }) }, c.rows[0].id)) : (_jsx("button", { type: "button", "data-map-ui": true, "aria-label": t("views.map.cluster", { count: c.rows.length, items: resource.pluralLabel.toLowerCase() }), onClick: () => camera && moveCamera({ center: unproject(project(camera.center, camera.zoom).x + c.x - width / 2, project(camera.center, camera.zoom).y + c.y - HEIGHT / 2, camera.zoom), zoom: camera.zoom + 2 }), className: "forge-map-cluster absolute flex size-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full text-xs font-semibold tabular-nums", style: { left: c.x, top: c.y }, children: c.rows.length }, `${c.x}:${c.y}`))), selectedRow && selectedPos && (_jsxs("div", { "data-map-ui": true, className: "forge-card absolute z-10 w-56 -translate-x-1/2 p-3 text-sm shadow-lg", style: { left: selectedPos.x, top: selectedPos.y + 8 }, children: [_jsx("button", { type: "button", "aria-label": t("common.close"), onClick: () => setSelected(null), className: "absolute top-1.5 right-1.5 text-ink-subtle hover:text-ink", children: _jsx(X, { className: "size-3.5" }) }), _jsx(Link, { href: `/${resource.path}/${selectedRow.id}`, className: "block pr-4 font-medium text-ink hover:text-link", children: String(selectedRow[view.title] ?? t("common.untitled")) }), _jsxs("p", { className: "mt-1 text-xs text-ink-subtle tabular-nums", children: [selectedRow[view.location].lat.toFixed(5), ", ", selectedRow[view.location].lng.toFixed(5)] })] })), _jsx("div", { "data-map-ui": true, className: "absolute top-3 right-3 flex flex-col gap-1", children: [
|
|
219
|
+
{ label: t("views.map.zoomIn"), icon: _jsx(Plus, { className: "size-4" }), on: () => zoomAt(1) },
|
|
220
|
+
{ label: t("views.map.zoomOut"), icon: _jsx(Minus, { className: "size-4" }), on: () => zoomAt(-1) },
|
|
221
|
+
{
|
|
222
|
+
label: t("views.map.showAll"),
|
|
223
|
+
icon: _jsx(Locate, { className: "size-4" }),
|
|
224
|
+
on: () => {
|
|
225
|
+
userMoved.current = false;
|
|
226
|
+
setBbox(null);
|
|
227
|
+
setCamera(null);
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
].map((b) => (_jsx("button", { type: "button", "aria-label": b.label, title: b.label, onClick: b.on, className: "forge-map-control flex size-8 items-center justify-center rounded-md shadow-sm", children: b.icon }, b.label))) }), rows.length === 0 && !list.isFetching && (_jsx("p", { "data-map-ui": true, className: "forge-card absolute top-3 left-3 px-3 py-2 text-xs text-ink-muted", children: t(bbox ? "views.map.emptyHere" : "views.map.emptyYet", { items: resource.pluralLabel.toLowerCase() }) })), _jsxs("p", { className: cn("absolute right-0 bottom-0 bg-white/80 px-1.5 py-0.5 text-[10px] text-neutral-700"), "data-map-ui": true, children: ["\u00A9", " ", _jsx("a", { href: "https://www.openstreetmap.org/copyright", target: "_blank", rel: "noreferrer noopener", className: "underline", children: "OpenStreetMap" }), " ", "contributors"] })] }))] })] }));
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=map.js.map
|
package/dist/map.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../src/map.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAA0C,MAAM,OAAO,CAAC;AAClH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAYzD,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,OAAO,GAAG,WAAW,CAAC;AAC5B,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,MAAM,GAAG,GAAG,CAAC;AAEnB,yGAAyG;AACzG,MAAM,CAAC,MAAM,OAAO,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,gDAAgD,CAAC;AAEjI,wDAAwD;AACxD,MAAM,UAAU,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,EAAU,EAAE,IAAY;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACnF,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,IAAY;IAC1D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7C,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC3E,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAE3E,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,MAAgB,EAAE,KAAa,EAAE,MAAc;IACvE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9D,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9D,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,EAAE;YAAE,MAAM;IACrF,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAgF;IACvI,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAI,CAAC;IAC/B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA0C,IAAI,CAAC,CAAC;IACpF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,CAAkD,IAAI,CAAC,CAAC;IAE3E,uGAAuG;IACvG,MAAM,KAAK,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACxI,MAAM,IAAI,GAAG,QAAQ,CAAC;QACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;QACpD,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAA2C,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC5F,eAAe,EAAE,gBAAgB;KAClC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzJ,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI;YAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAChJ,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElF,kEAAkE;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QACpD,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/H,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAAsC,EAAE,EAAE;QACxE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,EAAU,EAAE,EAAU,EAAE,EAAE;QACzB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,CAAC,EACD,CAAC,MAAM,EAAE,UAAU,CAAC,CACrB,CAAC;IAEF,sGAAsG;IACtG,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,KAAa,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;QAChC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI;YAAE,OAAO;QACjC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,EACD,CAAC,MAAM,EAAE,UAAU,CAAC,CACrB,CAAC;IAEF,2EAA2E;IAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YAChC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YACxB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG;gBAAE,OAAO;YACvD,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3G,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACf,CAAC,CAAC;QACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,aAAa,GAAG,CAAC,CAAoB,EAAE,EAAE;QAC7C,IAAK,CAAC,CAAC,MAAsB,CAAC,OAAO,CAAC,eAAe,CAAC;YAAE,OAAO;QAC/D,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC3D,CAAC,CAAC,aAA6B,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,CAAoB,EAAE,EAAE;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;YAAE,OAAO;QAC/C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;QACf,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QAChB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QAChB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,KAAK,GAAyD,EAAE,CAAC;QACvE,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YACrF,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;gBAClH,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;YACnL,CAAC;QACH,CAAC;QACD,gGAAgG;QAChG,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiD,CAAC;QAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACnB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;YACjD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE;gBAAE,SAAS;YACtE,MAAM,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC;YACnG,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACzD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACpC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IACrD,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3H,OAAO,CACL,0BACG,IAAI,CAAC,IAAI,IAAI,KAAC,gBAAgB,IAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAI,EAC5F,IAAI,CAAC,KAAK,IAAI,CACb,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,KAAK,cAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAS,GAC/B,CACP,EACD,eACE,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,CAAC,EACX,IAAI,EAAC,aAAa,gBACN,CAAC,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,EAC/E,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,eAAe,EAAE,WAAW,EAC5B,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE;oBACnB,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;oBACrD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC5F,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,MAAM,IAAI,GAAG,GAAG,CAAC;oBACjB,MAAM,IAAI,GAA+B;wBACvC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBAChC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;wBAChC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;wBAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;wBAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;wBACpB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;wBACpB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACrB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;qBAChC,CAAC;oBACF,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChB,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAE,EAAE,CAAC;oBACjB,CAAC;gBACH,CAAC,EACD,SAAS,EAAC,wHAAwH,EAClI,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAExB,CAAC,MAAM,IAAI,KAAC,OAAO,KAAG,EACtB,MAAM,IAAI,CACT,8BACE,cAAK,SAAS,EAAC,kCAAkC,iCAC9C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACvB,cAAiB,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC,yCAAyC,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAzJ,CAAC,CAAC,GAAG,CAAwJ,CACxK,CAAC,GACE,EACL,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACzB,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,iBAEE,IAAI,EAAC,QAAQ,qCAED,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAClE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,EACzC,SAAS,EAAC,2DAA2D,EACrE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,YAE9B,KAAC,MAAM,IAAC,SAAS,EAAC,kCAAkC,EAAC,WAAW,EAAE,GAAG,GAAI,IARpE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,EAAE,CASX,CACV,CAAC,CAAC,CAAC,CACF,iBAEE,IAAI,EAAC,QAAQ,qCAED,CAAC,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,EACvG,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,EACjN,SAAS,EAAC,sJAAsJ,EAChK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,YAE7B,CAAC,CAAC,IAAI,CAAC,MAAM,IART,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CASb,CACV,CACF,EACA,WAAW,IAAI,WAAW,IAAI,CAC7B,oCAAiB,SAAS,EAAC,sEAAsE,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,EAAE,aACtJ,iBAAQ,IAAI,EAAC,QAAQ,gBAAa,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAC,2DAA2D,YAC1J,KAAC,CAAC,IAAC,SAAS,EAAC,UAAU,GAAG,GACnB,EACT,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,SAAS,EAAC,iDAAiD,YAC3G,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,GACnD,EACP,aAAG,SAAS,EAAC,2CAA2C,aACrD,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IACrF,IACA,CACP,EACD,mCAAiB,SAAS,EAAC,4CAA4C,YACpE;oCACC,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;oCACxF,EAAE,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oCAC3F;wCACE,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC;wCAC7B,IAAI,EAAE,KAAC,MAAM,IAAC,SAAS,EAAC,QAAQ,GAAG;wCACnC,EAAE,EAAE,GAAG,EAAE;4CACP,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;4CAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;4CACd,SAAS,CAAC,IAAI,CAAC,CAAC;wCAClB,CAAC;qCACF;iCACF,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACX,iBAAsB,IAAI,EAAC,QAAQ,gBAAa,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAC,gFAAgF,YAC/K,CAAC,CAAC,IAAI,IADI,CAAC,CAAC,KAAK,CAEX,CACV,CAAC,GACE,EACL,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CACxC,iCAAe,SAAS,EAAC,mEAAmE,YACzF,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC,GACpG,CACL,EACD,aAAG,SAAS,EAAE,EAAE,CAAC,kFAAkF,CAAC,4CAChG,GAAG,EACL,YAAG,IAAI,EAAC,yCAAyC,EAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,EAAC,SAAS,EAAC,WAAW,8BAE7G,EAAC,GAAG,oBAEN,IACH,CACJ,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface NotificationItem {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
body: string | null;
|
|
5
|
+
link: string | null;
|
|
6
|
+
readAt: string | null;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function NotificationBell({ align }?: {
|
|
10
|
+
align?: "start" | "end";
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
export declare function NotificationsPage(): import("react").JSX.Element;
|