@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.
Files changed (138) hide show
  1. package/README.md +5 -0
  2. package/dist/account.d.ts +1 -0
  3. package/dist/account.js +105 -0
  4. package/dist/account.js.map +1 -0
  5. package/dist/activity.d.ts +65 -0
  6. package/dist/activity.js +299 -0
  7. package/dist/activity.js.map +1 -0
  8. package/dist/admin-access.d.ts +4 -0
  9. package/dist/admin-access.js +177 -0
  10. package/dist/admin-access.js.map +1 -0
  11. package/dist/admin.d.ts +5 -0
  12. package/dist/admin.js +129 -0
  13. package/dist/admin.js.map +1 -0
  14. package/dist/auth-pages.d.ts +13 -0
  15. package/dist/auth-pages.js +207 -0
  16. package/dist/auth-pages.js.map +1 -0
  17. package/dist/brand-art.d.ts +24 -0
  18. package/dist/brand-art.js +33 -0
  19. package/dist/brand-art.js.map +1 -0
  20. package/dist/brand.d.ts +11 -0
  21. package/dist/brand.js +16 -0
  22. package/dist/brand.js.map +1 -0
  23. package/dist/charts.d.ts +23 -0
  24. package/dist/charts.js +259 -0
  25. package/dist/charts.js.map +1 -0
  26. package/dist/command-palette.d.ts +9 -0
  27. package/dist/command-palette.js +115 -0
  28. package/dist/command-palette.js.map +1 -0
  29. package/dist/context.d.ts +242 -0
  30. package/dist/context.js +107 -0
  31. package/dist/context.js.map +1 -0
  32. package/dist/dashboard.d.ts +66 -0
  33. package/dist/dashboard.js +144 -0
  34. package/dist/dashboard.js.map +1 -0
  35. package/dist/fields.d.ts +71 -0
  36. package/dist/fields.js +326 -0
  37. package/dist/fields.js.map +1 -0
  38. package/dist/i18n/catalog.d.ts +7 -0
  39. package/dist/i18n/catalog.js +23 -0
  40. package/dist/i18n/catalog.js.map +1 -0
  41. package/dist/i18n/locale.d.ts +15 -0
  42. package/dist/i18n/locale.js +69 -0
  43. package/dist/i18n/locale.js.map +1 -0
  44. package/dist/i18n/messages/de.d.ts +3 -0
  45. package/dist/i18n/messages/de.js +627 -0
  46. package/dist/i18n/messages/de.js.map +1 -0
  47. package/dist/i18n/messages/en.d.ts +3 -0
  48. package/dist/i18n/messages/en.js +627 -0
  49. package/dist/i18n/messages/en.js.map +1 -0
  50. package/dist/i18n/messages/es.d.ts +3 -0
  51. package/dist/i18n/messages/es.js +627 -0
  52. package/dist/i18n/messages/es.js.map +1 -0
  53. package/dist/i18n/messages/fr.d.ts +3 -0
  54. package/dist/i18n/messages/fr.js +627 -0
  55. package/dist/i18n/messages/fr.js.map +1 -0
  56. package/dist/i18n/messages/pt.d.ts +3 -0
  57. package/dist/i18n/messages/pt.js +627 -0
  58. package/dist/i18n/messages/pt.js.map +1 -0
  59. package/dist/i18n/validation.d.ts +3 -0
  60. package/dist/i18n/validation.js +36 -0
  61. package/dist/i18n/validation.js.map +1 -0
  62. package/dist/illustrations.d.ts +6 -0
  63. package/dist/illustrations.js +16 -0
  64. package/dist/illustrations.js.map +1 -0
  65. package/dist/import-dialog.d.ts +11 -0
  66. package/dist/import-dialog.js +152 -0
  67. package/dist/import-dialog.js.map +1 -0
  68. package/dist/index.d.ts +38 -0
  69. package/dist/index.js +39 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/inline-edit.d.ts +18 -0
  72. package/dist/inline-edit.js +115 -0
  73. package/dist/inline-edit.js.map +1 -0
  74. package/dist/landing.d.ts +79 -0
  75. package/dist/landing.js +122 -0
  76. package/dist/landing.js.map +1 -0
  77. package/dist/locale-switcher.d.ts +4 -0
  78. package/dist/locale-switcher.js +15 -0
  79. package/dist/locale-switcher.js.map +1 -0
  80. package/dist/map.d.ts +26 -0
  81. package/dist/map.js +232 -0
  82. package/dist/map.js.map +1 -0
  83. package/dist/notifications.d.ts +12 -0
  84. package/dist/notifications.js +75 -0
  85. package/dist/notifications.js.map +1 -0
  86. package/dist/record-mutation.d.ts +19 -0
  87. package/dist/record-mutation.js +39 -0
  88. package/dist/record-mutation.js.map +1 -0
  89. package/dist/resource-detail.d.ts +4 -0
  90. package/dist/resource-detail.js +96 -0
  91. package/dist/resource-detail.js.map +1 -0
  92. package/dist/resource-form.d.ts +11 -0
  93. package/dist/resource-form.js +92 -0
  94. package/dist/resource-form.js.map +1 -0
  95. package/dist/resource-list.d.ts +10 -0
  96. package/dist/resource-list.js +154 -0
  97. package/dist/resource-list.js.map +1 -0
  98. package/dist/saved-views.d.ts +16 -0
  99. package/dist/saved-views.js +64 -0
  100. package/dist/saved-views.js.map +1 -0
  101. package/dist/schema-editor-diagram.d.ts +14 -0
  102. package/dist/schema-editor-diagram.js +54 -0
  103. package/dist/schema-editor-diagram.js.map +1 -0
  104. package/dist/schema-editor.d.ts +98 -0
  105. package/dist/schema-editor.js +571 -0
  106. package/dist/schema-editor.js.map +1 -0
  107. package/dist/shell.d.ts +10 -0
  108. package/dist/shell.js +228 -0
  109. package/dist/shell.js.map +1 -0
  110. package/dist/skeleton.d.ts +25 -0
  111. package/dist/skeleton.js +34 -0
  112. package/dist/skeleton.js.map +1 -0
  113. package/dist/theme-catalog.d.ts +71 -0
  114. package/dist/theme-catalog.js +55 -0
  115. package/dist/theme-catalog.js.map +1 -0
  116. package/dist/theme-head.d.ts +8 -0
  117. package/dist/theme-head.js +11 -0
  118. package/dist/theme-head.js.map +1 -0
  119. package/dist/theme-preview.d.ts +2 -0
  120. package/dist/theme-preview.js +23 -0
  121. package/dist/theme-preview.js.map +1 -0
  122. package/dist/theme-switcher.d.ts +20 -0
  123. package/dist/theme-switcher.js +159 -0
  124. package/dist/theme-switcher.js.map +1 -0
  125. package/dist/theme.d.ts +24 -0
  126. package/dist/theme.js +30 -0
  127. package/dist/theme.js.map +1 -0
  128. package/dist/toast.d.ts +21 -0
  129. package/dist/toast.js +51 -0
  130. package/dist/toast.js.map +1 -0
  131. package/dist/ui.d.ts +86 -0
  132. package/dist/ui.js +106 -0
  133. package/dist/ui.js.map +1 -0
  134. package/dist/views.d.ts +23 -0
  135. package/dist/views.js +238 -0
  136. package/dist/views.js.map +1 -0
  137. package/package.json +58 -0
  138. 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 {};
@@ -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,4 @@
1
+ /** Language picker; renders nothing when the app has a single locale. */
2
+ export declare function LocaleSwitcher({ className }: {
3
+ className?: string;
4
+ }): import("react").JSX.Element | null;
@@ -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
@@ -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;