@puzzle-ui/seo 0.0.0-stage → 0.5.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 +755 -2
- package/dist/LICENSE +21 -0
- package/dist/context/config.cjs +82 -0
- package/dist/context/config.cjs.map +1 -0
- package/dist/context/config.d.cts +6 -0
- package/dist/context/config.d.ts +6 -0
- package/dist/context/config.js +80 -0
- package/dist/context/config.js.map +1 -0
- package/dist/context/index.cjs +6 -0
- package/dist/context/index.d.cts +4 -0
- package/dist/context/index.d.ts +4 -0
- package/dist/context/index.js +3 -0
- package/dist/context/types.d.cts +46 -0
- package/dist/context/types.d.ts +46 -0
- package/dist/core/graph.cjs +464 -0
- package/dist/core/graph.cjs.map +1 -0
- package/dist/core/graph.d.cts +62 -0
- package/dist/core/graph.d.ts +62 -0
- package/dist/core/graph.js +456 -0
- package/dist/core/graph.js.map +1 -0
- package/dist/core/index.cjs +11 -0
- package/dist/core/index.d.cts +3 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.js +1 -0
- package/dist/core/types.d.cts +92 -0
- package/dist/core/types.d.ts +92 -0
- package/dist/index.cjs +96 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +48 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/index.cjs +4 -0
- package/dist/metadata/index.d.cts +3 -0
- package/dist/metadata/index.d.ts +3 -0
- package/dist/metadata/index.js +1 -0
- package/dist/metadata/resolve.cjs +122 -0
- package/dist/metadata/resolve.cjs.map +1 -0
- package/dist/metadata/resolve.d.cts +4 -0
- package/dist/metadata/resolve.d.ts +4 -0
- package/dist/metadata/resolve.js +121 -0
- package/dist/metadata/resolve.js.map +1 -0
- package/dist/metadata/types.d.cts +82 -0
- package/dist/metadata/types.d.ts +82 -0
- package/dist/next/index.cjs +13 -0
- package/dist/next/index.cjs.map +1 -0
- package/dist/next/index.d.cts +15 -0
- package/dist/next/index.d.ts +14 -0
- package/dist/next/index.js +12 -0
- package/dist/next/index.js.map +1 -0
- package/dist/react/context.cjs +30 -0
- package/dist/react/context.cjs.map +1 -0
- package/dist/react/context.d.cts +14 -0
- package/dist/react/context.d.ts +14 -0
- package/dist/react/context.js +27 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/index.cjs +48 -0
- package/dist/react/index.d.cts +6 -0
- package/dist/react/index.d.ts +6 -0
- package/dist/react/index.js +5 -0
- package/dist/react/metadata.cjs +100 -0
- package/dist/react/metadata.cjs.map +1 -0
- package/dist/react/metadata.d.cts +18 -0
- package/dist/react/metadata.d.ts +18 -0
- package/dist/react/metadata.js +99 -0
- package/dist/react/metadata.js.map +1 -0
- package/dist/react/provider.cjs +42 -0
- package/dist/react/provider.cjs.map +1 -0
- package/dist/react/provider.d.cts +3 -0
- package/dist/react/provider.d.ts +3 -0
- package/dist/react/provider.js +42 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/schema-components.cjs +294 -0
- package/dist/react/schema-components.cjs.map +1 -0
- package/dist/react/schema-components.d.cts +84 -0
- package/dist/react/schema-components.d.ts +80 -0
- package/dist/react/schema-components.js +254 -0
- package/dist/react/schema-components.js.map +1 -0
- package/dist/react/types.d.cts +81 -0
- package/dist/react/types.d.ts +80 -0
- package/dist/react-router/index.cjs +13 -0
- package/dist/react-router/index.cjs.map +1 -0
- package/dist/react-router/index.d.cts +21 -0
- package/dist/react-router/index.d.ts +20 -0
- package/dist/react-router/index.js +12 -0
- package/dist/react-router/index.js.map +1 -0
- package/dist/robots/generate.cjs +88 -0
- package/dist/robots/generate.cjs.map +1 -0
- package/dist/robots/generate.d.cts +4 -0
- package/dist/robots/generate.d.ts +4 -0
- package/dist/robots/generate.js +86 -0
- package/dist/robots/generate.js.map +1 -0
- package/dist/robots/index.cjs +5 -0
- package/dist/robots/index.d.cts +3 -0
- package/dist/robots/index.d.ts +3 -0
- package/dist/robots/index.js +1 -0
- package/dist/robots/types.d.cts +27 -0
- package/dist/robots/types.d.ts +27 -0
- package/dist/schema/create-registry.cjs +12 -0
- package/dist/schema/create-registry.cjs.map +1 -0
- package/dist/schema/create-registry.d.cts +2 -0
- package/dist/schema/create-registry.d.ts +2 -0
- package/dist/schema/create-registry.js +12 -0
- package/dist/schema/create-registry.js.map +1 -0
- package/dist/schema/generated/index.d.cts +2 -0
- package/dist/schema/generated/schemaorg.cjs +36386 -0
- package/dist/schema/generated/schemaorg.cjs.map +1 -0
- package/dist/schema/generated/schemaorg.d.cts +945 -0
- package/dist/schema/generated/schemaorg.d.ts +945 -0
- package/dist/schema/generated/schemaorg.js +36384 -0
- package/dist/schema/generated/schemaorg.js.map +1 -0
- package/dist/schema/index.cjs +11 -0
- package/dist/schema/index.d.cts +7 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/registry.cjs +194 -0
- package/dist/schema/registry.cjs.map +1 -0
- package/dist/schema/registry.d.cts +2 -0
- package/dist/schema/registry.d.ts +2 -0
- package/dist/schema/registry.js +194 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/schema/types.d.cts +79 -0
- package/dist/schema/types.d.ts +79 -0
- package/dist/schema/validate.cjs +131 -0
- package/dist/schema/validate.cjs.map +1 -0
- package/dist/schema/validate.d.cts +16 -0
- package/dist/schema/validate.d.ts +16 -0
- package/dist/schema/validate.js +131 -0
- package/dist/schema/validate.js.map +1 -0
- package/dist/server/handlers.cjs +96 -0
- package/dist/server/handlers.cjs.map +1 -0
- package/dist/server/handlers.d.cts +3 -0
- package/dist/server/handlers.d.ts +3 -0
- package/dist/server/handlers.js +95 -0
- package/dist/server/handlers.js.map +1 -0
- package/dist/server/index.cjs +6 -0
- package/dist/server/index.d.cts +4 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.js +3 -0
- package/dist/server/routes.cjs +17 -0
- package/dist/server/routes.cjs.map +1 -0
- package/dist/server/routes.d.cts +2 -0
- package/dist/server/routes.d.ts +2 -0
- package/dist/server/routes.js +17 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/types.d.cts +61 -0
- package/dist/server/types.d.ts +61 -0
- package/dist/sitemap/generate.cjs +147 -0
- package/dist/sitemap/generate.cjs.map +1 -0
- package/dist/sitemap/generate.d.cts +3 -0
- package/dist/sitemap/generate.d.ts +3 -0
- package/dist/sitemap/generate.js +146 -0
- package/dist/sitemap/generate.js.map +1 -0
- package/dist/sitemap/index.cjs +11 -0
- package/dist/sitemap/index.d.cts +4 -0
- package/dist/sitemap/index.d.ts +4 -0
- package/dist/sitemap/index.js +3 -0
- package/dist/sitemap/types.d.cts +82 -0
- package/dist/sitemap/types.d.ts +82 -0
- package/dist/sitemap/xml.cjs +215 -0
- package/dist/sitemap/xml.cjs.map +1 -0
- package/dist/sitemap/xml.d.cts +16 -0
- package/dist/sitemap/xml.d.ts +16 -0
- package/dist/sitemap/xml.js +210 -0
- package/dist/sitemap/xml.js.map +1 -0
- package/dist/tanstack/index.cjs +13 -0
- package/dist/tanstack/index.cjs.map +1 -0
- package/dist/tanstack/index.d.cts +19 -0
- package/dist/tanstack/index.d.ts +18 -0
- package/dist/tanstack/index.js +12 -0
- package/dist/tanstack/index.js.map +1 -0
- package/dist/testing/diagnostics.cjs +27 -0
- package/dist/testing/diagnostics.cjs.map +1 -0
- package/dist/testing/diagnostics.d.cts +3 -0
- package/dist/testing/diagnostics.d.ts +3 -0
- package/dist/testing/diagnostics.js +27 -0
- package/dist/testing/diagnostics.js.map +1 -0
- package/dist/testing/fixture.cjs +80 -0
- package/dist/testing/fixture.cjs.map +1 -0
- package/dist/testing/fixture.d.cts +4 -0
- package/dist/testing/fixture.d.ts +4 -0
- package/dist/testing/fixture.js +78 -0
- package/dist/testing/fixture.js.map +1 -0
- package/dist/testing/index.cjs +9 -0
- package/dist/testing/index.d.cts +5 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/inspect.cjs +63 -0
- package/dist/testing/inspect.cjs.map +1 -0
- package/dist/testing/inspect.d.cts +5 -0
- package/dist/testing/inspect.d.ts +5 -0
- package/dist/testing/inspect.js +63 -0
- package/dist/testing/inspect.js.map +1 -0
- package/dist/testing/types.d.cts +40 -0
- package/dist/testing/types.d.ts +40 -0
- package/dist/urls/index.cjs +8 -0
- package/dist/urls/index.d.cts +3 -0
- package/dist/urls/index.d.ts +3 -0
- package/dist/urls/index.js +1 -0
- package/dist/urls/normalize.cjs +65 -0
- package/dist/urls/normalize.cjs.map +1 -0
- package/dist/urls/normalize.d.cts +14 -0
- package/dist/urls/normalize.d.ts +14 -0
- package/dist/urls/normalize.js +60 -0
- package/dist/urls/normalize.js.map +1 -0
- package/dist/urls/types.d.cts +22 -0
- package/dist/urls/types.d.ts +22 -0
- package/dist/validation/index.cjs +5 -0
- package/dist/validation/index.d.cts +3 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.js +1 -0
- package/dist/validation/types.d.cts +75 -0
- package/dist/validation/types.d.ts +75 -0
- package/dist/validation/validate.cjs +452 -0
- package/dist/validation/validate.cjs.map +1 -0
- package/dist/validation/validate.d.cts +7 -0
- package/dist/validation/validate.d.ts +6 -0
- package/dist/validation/validate.js +450 -0
- package/dist/validation/validate.js.map +1 -0
- package/package.json +203 -4
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_resolve = require("../metadata/resolve.cjs");
|
|
3
|
+
const require_context = require("./context.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
// src/react/metadata.tsx
|
|
6
|
+
const meta = (name, content) => {
|
|
7
|
+
if (content === void 0 || content === "") return null;
|
|
8
|
+
return (0, react.createElement)("meta", {
|
|
9
|
+
key: `name:${name}`,
|
|
10
|
+
name,
|
|
11
|
+
content
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const property = (propertyName, content) => {
|
|
15
|
+
if (content === void 0 || content === "") return null;
|
|
16
|
+
return (0, react.createElement)("meta", {
|
|
17
|
+
key: `property:${propertyName}`,
|
|
18
|
+
property: propertyName,
|
|
19
|
+
content
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const imageMeta = (image, index) => {
|
|
23
|
+
return [
|
|
24
|
+
property("og:image", image.url),
|
|
25
|
+
property("og:image:alt", image.alt),
|
|
26
|
+
property("og:image:width", image.width !== void 0 ? String(image.width) : void 0),
|
|
27
|
+
property("og:image:height", image.height !== void 0 ? String(image.height) : void 0),
|
|
28
|
+
property("og:image:type", image.type)
|
|
29
|
+
].map((element, itemIndex) => element ? (0, react.createElement)(react.Fragment, {
|
|
30
|
+
key: `og-image:${index}:${itemIndex}`,
|
|
31
|
+
children: element
|
|
32
|
+
}) : null);
|
|
33
|
+
};
|
|
34
|
+
const renderMetadata = (resolved, config) => {
|
|
35
|
+
const robots = require_resolve.resolveSeoRobots(resolved, config);
|
|
36
|
+
return [
|
|
37
|
+
resolved.title ? (0, react.createElement)("title", {
|
|
38
|
+
key: "title",
|
|
39
|
+
children: resolved.title
|
|
40
|
+
}) : null,
|
|
41
|
+
meta("description", resolved.description),
|
|
42
|
+
meta("robots", robots),
|
|
43
|
+
meta("author", resolved.author),
|
|
44
|
+
meta("keywords", resolved.keywords?.join(", ")),
|
|
45
|
+
resolved.canonical ? (0, react.createElement)("link", {
|
|
46
|
+
key: "canonical",
|
|
47
|
+
rel: "canonical",
|
|
48
|
+
href: resolved.canonical
|
|
49
|
+
}) : null,
|
|
50
|
+
property("og:title", resolved.openGraph.title),
|
|
51
|
+
property("og:description", resolved.openGraph.description),
|
|
52
|
+
property("og:type", resolved.openGraph.type),
|
|
53
|
+
property("og:url", resolved.openGraph.url),
|
|
54
|
+
property("og:site_name", resolved.openGraph.siteName),
|
|
55
|
+
property("og:locale", resolved.openGraph.locale),
|
|
56
|
+
meta("twitter:card", resolved.twitter.card),
|
|
57
|
+
meta("twitter:title", resolved.twitter.title),
|
|
58
|
+
meta("twitter:description", resolved.twitter.description),
|
|
59
|
+
meta("twitter:site", resolved.twitter.site),
|
|
60
|
+
meta("twitter:creator", resolved.twitter.creator),
|
|
61
|
+
meta("twitter:image:alt", resolved.twitter.imageAlt),
|
|
62
|
+
...(resolved.twitter.images ?? []).map((url, index) => meta(index === 0 ? "twitter:image" : `twitter:image${index + 1}`, url)),
|
|
63
|
+
...(resolved.openGraph.images ?? []).flatMap(imageMeta),
|
|
64
|
+
...(resolved.alternates?.alternates ?? []).map((alternate) => (0, react.createElement)("link", {
|
|
65
|
+
key: `alternate:${alternate.locale}`,
|
|
66
|
+
rel: "alternate",
|
|
67
|
+
hrefLang: alternate.locale,
|
|
68
|
+
href: alternate.url
|
|
69
|
+
})),
|
|
70
|
+
resolved.publishedTime ? property("article:published_time", resolved.publishedTime) : null,
|
|
71
|
+
resolved.modifiedTime ? property("article:modified_time", resolved.modifiedTime) : null
|
|
72
|
+
].filter(Boolean);
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Creates a nested metadata scope.
|
|
76
|
+
*
|
|
77
|
+
* Metadata is resolved once and shared with descendants.
|
|
78
|
+
*/
|
|
79
|
+
const SeoMetadata = ({ metadata, children }) => {
|
|
80
|
+
const parent = require_context.useSeoReactContext();
|
|
81
|
+
const resolvedMetadata = require_resolve.resolveSeoMetadata(metadata, parent.config);
|
|
82
|
+
return (0, react.createElement)(require_context.SeoReactContext.Provider, { value: {
|
|
83
|
+
config: parent.config,
|
|
84
|
+
metadata: resolvedMetadata
|
|
85
|
+
} }, (0, react.createElement)(react.Fragment, null, ...renderMetadata(resolvedMetadata, parent.config), children));
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Renders the active metadata scope.
|
|
89
|
+
*
|
|
90
|
+
* Prefer one metadata output component per document.
|
|
91
|
+
*/
|
|
92
|
+
const SeoHead = () => {
|
|
93
|
+
const { config, metadata } = require_context.useSeoReactContext();
|
|
94
|
+
if (!metadata) return null;
|
|
95
|
+
return (0, react.createElement)(react.Fragment, null, ...renderMetadata(metadata, config));
|
|
96
|
+
};
|
|
97
|
+
exports.SeoHead = SeoHead;
|
|
98
|
+
exports.SeoMetadata = SeoMetadata;
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=metadata.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.cjs","names":["createElement","Fragment","resolveSeoRobots","useSeoReactContext","resolveSeoMetadata","SeoReactContext"],"sources":["../../src/react/metadata.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, Fragment } from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nimport type { ResolvedSeoMetadata, SeoSocialImage } from \"../metadata/types\";\n\nimport { resolveSeoMetadata, resolveSeoRobots } from \"../metadata\";\n\nimport type { SeoMetadataProps } from \"./types\";\n\nimport { SeoReactContext, useSeoReactContext } from \"./context\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\nconst meta = (name: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `name:${name}`,\n name,\n content,\n });\n};\n\nconst property = (propertyName: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `property:${propertyName}`,\n property: propertyName,\n content,\n });\n};\n\nconst imageMeta = (image: SeoSocialImage, index: number) => {\n const entries = [\n property(\"og:image\", image.url),\n\n property(\"og:image:alt\", image.alt),\n\n property(\n \"og:image:width\",\n image.width !== undefined ? String(image.width) : undefined,\n ),\n\n property(\n \"og:image:height\",\n image.height !== undefined ? String(image.height) : undefined,\n ),\n\n property(\"og:image:type\", image.type),\n ];\n\n return entries.map((element, itemIndex) =>\n element\n ? createElement(Fragment, {\n key: `og-image:${index}:${itemIndex}`,\n children: element,\n })\n : null,\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared metadata renderer\n// ---------------------------------------------------------------------------\n\nconst renderMetadata = (\n resolved: ResolvedSeoMetadata,\n config: ReturnType<typeof useSeoReactContext>[\"config\"],\n) => {\n const robots = resolveSeoRobots(resolved, config);\n\n const elements = [\n resolved.title\n ? createElement(\"title\", {\n key: \"title\",\n children: resolved.title,\n })\n : null,\n\n meta(\"description\", resolved.description),\n\n meta(\"robots\", robots),\n\n meta(\"author\", resolved.author),\n\n meta(\"keywords\", resolved.keywords?.join(\", \")),\n\n resolved.canonical\n ? createElement(\"link\", {\n key: \"canonical\",\n rel: \"canonical\",\n href: resolved.canonical,\n })\n : null,\n\n // Open Graph\n property(\"og:title\", resolved.openGraph.title),\n\n property(\"og:description\", resolved.openGraph.description),\n\n property(\"og:type\", resolved.openGraph.type),\n\n property(\"og:url\", resolved.openGraph.url),\n\n property(\"og:site_name\", resolved.openGraph.siteName),\n\n property(\"og:locale\", resolved.openGraph.locale),\n\n // Twitter / X\n meta(\"twitter:card\", resolved.twitter.card),\n\n meta(\"twitter:title\", resolved.twitter.title),\n\n meta(\"twitter:description\", resolved.twitter.description),\n\n meta(\"twitter:site\", resolved.twitter.site),\n\n meta(\"twitter:creator\", resolved.twitter.creator),\n\n meta(\"twitter:image:alt\", resolved.twitter.imageAlt),\n\n ...(resolved.twitter.images ?? []).map((url, index) =>\n meta(index === 0 ? \"twitter:image\" : `twitter:image${index + 1}`, url),\n ),\n\n // Open Graph images\n ...(resolved.openGraph.images ?? []).flatMap(imageMeta),\n\n // Hreflang\n ...(resolved.alternates?.alternates ?? []).map((alternate) =>\n createElement(\"link\", {\n key: `alternate:${alternate.locale}`,\n rel: \"alternate\",\n hrefLang: alternate.locale,\n href: alternate.url,\n }),\n ),\n\n // Article metadata\n resolved.publishedTime\n ? property(\"article:published_time\", resolved.publishedTime)\n : null,\n\n resolved.modifiedTime\n ? property(\"article:modified_time\", resolved.modifiedTime)\n : null,\n ];\n\n return elements.filter(Boolean);\n};\n\n// ---------------------------------------------------------------------------\n// SeoMetadata\n// ---------------------------------------------------------------------------\n\nexport interface SeoMetadataComponentProps extends SeoMetadataProps {\n children?: ReactNode;\n}\n\n/**\n * Creates a nested metadata scope.\n *\n * Metadata is resolved once and shared with descendants.\n */\nexport const SeoMetadata = ({\n metadata,\n children,\n}: SeoMetadataComponentProps) => {\n const parent = useSeoReactContext();\n\n const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: {\n config: parent.config,\n metadata: resolvedMetadata,\n },\n },\n createElement(\n Fragment,\n null,\n ...renderMetadata(resolvedMetadata, parent.config),\n children,\n ),\n );\n};\n\n// ---------------------------------------------------------------------------\n// SeoHead\n// ---------------------------------------------------------------------------\n\n/**\n * Renders the active metadata scope.\n *\n * Prefer one metadata output component per document.\n */\nexport const SeoHead = () => {\n const { config, metadata } = useSeoReactContext();\n\n if (!metadata) {\n return null;\n }\n\n return createElement(Fragment, null, ...renderMetadata(metadata, config));\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SeoReactContextValue } from "./context.cjs";
|
|
2
|
+
import { SeoMetadataProps } from "./types.cjs";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
export interface SeoMetadataComponentProps extends SeoMetadataProps {
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a nested metadata scope.
|
|
9
|
+
*
|
|
10
|
+
* Metadata is resolved once and shared with descendants.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SeoMetadata: ({ metadata, children }: SeoMetadataComponentProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
|
|
13
|
+
/**
|
|
14
|
+
* Renders the active metadata scope.
|
|
15
|
+
*
|
|
16
|
+
* Prefer one metadata output component per document.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SeoHead: () => import("react").FunctionComponentElement<import("react").FragmentProps> | null;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SeoReactContextValue } from "./context.js";
|
|
2
|
+
import { SeoMetadataProps } from "./types.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
export interface SeoMetadataComponentProps extends SeoMetadataProps {
|
|
5
|
+
children?: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Creates a nested metadata scope.
|
|
9
|
+
*
|
|
10
|
+
* Metadata is resolved once and shared with descendants.
|
|
11
|
+
*/
|
|
12
|
+
export declare const SeoMetadata: ({ metadata, children }: SeoMetadataComponentProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
|
|
13
|
+
/**
|
|
14
|
+
* Renders the active metadata scope.
|
|
15
|
+
*
|
|
16
|
+
* Prefer one metadata output component per document.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SeoHead: () => import("react").FunctionComponentElement<import("react").FragmentProps> | null;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { resolveSeoMetadata, resolveSeoRobots } from "../metadata/resolve.js";
|
|
3
|
+
import { SeoReactContext, useSeoReactContext } from "./context.js";
|
|
4
|
+
import { Fragment, createElement } from "react";
|
|
5
|
+
// src/react/metadata.tsx
|
|
6
|
+
const meta = (name, content) => {
|
|
7
|
+
if (content === void 0 || content === "") return null;
|
|
8
|
+
return createElement("meta", {
|
|
9
|
+
key: `name:${name}`,
|
|
10
|
+
name,
|
|
11
|
+
content
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const property = (propertyName, content) => {
|
|
15
|
+
if (content === void 0 || content === "") return null;
|
|
16
|
+
return createElement("meta", {
|
|
17
|
+
key: `property:${propertyName}`,
|
|
18
|
+
property: propertyName,
|
|
19
|
+
content
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const imageMeta = (image, index) => {
|
|
23
|
+
return [
|
|
24
|
+
property("og:image", image.url),
|
|
25
|
+
property("og:image:alt", image.alt),
|
|
26
|
+
property("og:image:width", image.width !== void 0 ? String(image.width) : void 0),
|
|
27
|
+
property("og:image:height", image.height !== void 0 ? String(image.height) : void 0),
|
|
28
|
+
property("og:image:type", image.type)
|
|
29
|
+
].map((element, itemIndex) => element ? createElement(Fragment, {
|
|
30
|
+
key: `og-image:${index}:${itemIndex}`,
|
|
31
|
+
children: element
|
|
32
|
+
}) : null);
|
|
33
|
+
};
|
|
34
|
+
const renderMetadata = (resolved, config) => {
|
|
35
|
+
const robots = resolveSeoRobots(resolved, config);
|
|
36
|
+
return [
|
|
37
|
+
resolved.title ? createElement("title", {
|
|
38
|
+
key: "title",
|
|
39
|
+
children: resolved.title
|
|
40
|
+
}) : null,
|
|
41
|
+
meta("description", resolved.description),
|
|
42
|
+
meta("robots", robots),
|
|
43
|
+
meta("author", resolved.author),
|
|
44
|
+
meta("keywords", resolved.keywords?.join(", ")),
|
|
45
|
+
resolved.canonical ? createElement("link", {
|
|
46
|
+
key: "canonical",
|
|
47
|
+
rel: "canonical",
|
|
48
|
+
href: resolved.canonical
|
|
49
|
+
}) : null,
|
|
50
|
+
property("og:title", resolved.openGraph.title),
|
|
51
|
+
property("og:description", resolved.openGraph.description),
|
|
52
|
+
property("og:type", resolved.openGraph.type),
|
|
53
|
+
property("og:url", resolved.openGraph.url),
|
|
54
|
+
property("og:site_name", resolved.openGraph.siteName),
|
|
55
|
+
property("og:locale", resolved.openGraph.locale),
|
|
56
|
+
meta("twitter:card", resolved.twitter.card),
|
|
57
|
+
meta("twitter:title", resolved.twitter.title),
|
|
58
|
+
meta("twitter:description", resolved.twitter.description),
|
|
59
|
+
meta("twitter:site", resolved.twitter.site),
|
|
60
|
+
meta("twitter:creator", resolved.twitter.creator),
|
|
61
|
+
meta("twitter:image:alt", resolved.twitter.imageAlt),
|
|
62
|
+
...(resolved.twitter.images ?? []).map((url, index) => meta(index === 0 ? "twitter:image" : `twitter:image${index + 1}`, url)),
|
|
63
|
+
...(resolved.openGraph.images ?? []).flatMap(imageMeta),
|
|
64
|
+
...(resolved.alternates?.alternates ?? []).map((alternate) => createElement("link", {
|
|
65
|
+
key: `alternate:${alternate.locale}`,
|
|
66
|
+
rel: "alternate",
|
|
67
|
+
hrefLang: alternate.locale,
|
|
68
|
+
href: alternate.url
|
|
69
|
+
})),
|
|
70
|
+
resolved.publishedTime ? property("article:published_time", resolved.publishedTime) : null,
|
|
71
|
+
resolved.modifiedTime ? property("article:modified_time", resolved.modifiedTime) : null
|
|
72
|
+
].filter(Boolean);
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Creates a nested metadata scope.
|
|
76
|
+
*
|
|
77
|
+
* Metadata is resolved once and shared with descendants.
|
|
78
|
+
*/
|
|
79
|
+
const SeoMetadata = ({ metadata, children }) => {
|
|
80
|
+
const parent = useSeoReactContext();
|
|
81
|
+
const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);
|
|
82
|
+
return createElement(SeoReactContext.Provider, { value: {
|
|
83
|
+
config: parent.config,
|
|
84
|
+
metadata: resolvedMetadata
|
|
85
|
+
} }, createElement(Fragment, null, ...renderMetadata(resolvedMetadata, parent.config), children));
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Renders the active metadata scope.
|
|
89
|
+
*
|
|
90
|
+
* Prefer one metadata output component per document.
|
|
91
|
+
*/
|
|
92
|
+
const SeoHead = () => {
|
|
93
|
+
const { config, metadata } = useSeoReactContext();
|
|
94
|
+
if (!metadata) return null;
|
|
95
|
+
return createElement(Fragment, null, ...renderMetadata(metadata, config));
|
|
96
|
+
};
|
|
97
|
+
export { SeoHead, SeoMetadata };
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","names":[],"sources":["../../src/react/metadata.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, Fragment } from \"react\";\n\nimport type { ReactNode } from \"react\";\n\nimport type { ResolvedSeoMetadata, SeoSocialImage } from \"../metadata/types\";\n\nimport { resolveSeoMetadata, resolveSeoRobots } from \"../metadata\";\n\nimport type { SeoMetadataProps } from \"./types\";\n\nimport { SeoReactContext, useSeoReactContext } from \"./context\";\n\n// ---------------------------------------------------------------------------\n// Meta helpers\n// ---------------------------------------------------------------------------\n\nconst meta = (name: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `name:${name}`,\n name,\n content,\n });\n};\n\nconst property = (propertyName: string, content: string | undefined) => {\n if (content === undefined || content === \"\") {\n return null;\n }\n\n return createElement(\"meta\", {\n key: `property:${propertyName}`,\n property: propertyName,\n content,\n });\n};\n\nconst imageMeta = (image: SeoSocialImage, index: number) => {\n const entries = [\n property(\"og:image\", image.url),\n\n property(\"og:image:alt\", image.alt),\n\n property(\n \"og:image:width\",\n image.width !== undefined ? String(image.width) : undefined,\n ),\n\n property(\n \"og:image:height\",\n image.height !== undefined ? String(image.height) : undefined,\n ),\n\n property(\"og:image:type\", image.type),\n ];\n\n return entries.map((element, itemIndex) =>\n element\n ? createElement(Fragment, {\n key: `og-image:${index}:${itemIndex}`,\n children: element,\n })\n : null,\n );\n};\n\n// ---------------------------------------------------------------------------\n// Shared metadata renderer\n// ---------------------------------------------------------------------------\n\nconst renderMetadata = (\n resolved: ResolvedSeoMetadata,\n config: ReturnType<typeof useSeoReactContext>[\"config\"],\n) => {\n const robots = resolveSeoRobots(resolved, config);\n\n const elements = [\n resolved.title\n ? createElement(\"title\", {\n key: \"title\",\n children: resolved.title,\n })\n : null,\n\n meta(\"description\", resolved.description),\n\n meta(\"robots\", robots),\n\n meta(\"author\", resolved.author),\n\n meta(\"keywords\", resolved.keywords?.join(\", \")),\n\n resolved.canonical\n ? createElement(\"link\", {\n key: \"canonical\",\n rel: \"canonical\",\n href: resolved.canonical,\n })\n : null,\n\n // Open Graph\n property(\"og:title\", resolved.openGraph.title),\n\n property(\"og:description\", resolved.openGraph.description),\n\n property(\"og:type\", resolved.openGraph.type),\n\n property(\"og:url\", resolved.openGraph.url),\n\n property(\"og:site_name\", resolved.openGraph.siteName),\n\n property(\"og:locale\", resolved.openGraph.locale),\n\n // Twitter / X\n meta(\"twitter:card\", resolved.twitter.card),\n\n meta(\"twitter:title\", resolved.twitter.title),\n\n meta(\"twitter:description\", resolved.twitter.description),\n\n meta(\"twitter:site\", resolved.twitter.site),\n\n meta(\"twitter:creator\", resolved.twitter.creator),\n\n meta(\"twitter:image:alt\", resolved.twitter.imageAlt),\n\n ...(resolved.twitter.images ?? []).map((url, index) =>\n meta(index === 0 ? \"twitter:image\" : `twitter:image${index + 1}`, url),\n ),\n\n // Open Graph images\n ...(resolved.openGraph.images ?? []).flatMap(imageMeta),\n\n // Hreflang\n ...(resolved.alternates?.alternates ?? []).map((alternate) =>\n createElement(\"link\", {\n key: `alternate:${alternate.locale}`,\n rel: \"alternate\",\n hrefLang: alternate.locale,\n href: alternate.url,\n }),\n ),\n\n // Article metadata\n resolved.publishedTime\n ? property(\"article:published_time\", resolved.publishedTime)\n : null,\n\n resolved.modifiedTime\n ? property(\"article:modified_time\", resolved.modifiedTime)\n : null,\n ];\n\n return elements.filter(Boolean);\n};\n\n// ---------------------------------------------------------------------------\n// SeoMetadata\n// ---------------------------------------------------------------------------\n\nexport interface SeoMetadataComponentProps extends SeoMetadataProps {\n children?: ReactNode;\n}\n\n/**\n * Creates a nested metadata scope.\n *\n * Metadata is resolved once and shared with descendants.\n */\nexport const SeoMetadata = ({\n metadata,\n children,\n}: SeoMetadataComponentProps) => {\n const parent = useSeoReactContext();\n\n const resolvedMetadata = resolveSeoMetadata(metadata, parent.config);\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: {\n config: parent.config,\n metadata: resolvedMetadata,\n },\n },\n createElement(\n Fragment,\n null,\n ...renderMetadata(resolvedMetadata, parent.config),\n children,\n ),\n );\n};\n\n// ---------------------------------------------------------------------------\n// SeoHead\n// ---------------------------------------------------------------------------\n\n/**\n * Renders the active metadata scope.\n *\n * Prefer one metadata output component per document.\n */\nexport const SeoHead = () => {\n const { config, metadata } = useSeoReactContext();\n\n if (!metadata) {\n return null;\n }\n\n return createElement(Fragment, null, ...renderMetadata(metadata, config));\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
const require_config = require("../context/config.cjs");
|
|
3
|
+
const require_resolve = require("../metadata/resolve.cjs");
|
|
4
|
+
const require_context = require("./context.cjs");
|
|
5
|
+
const require_schema_components = require("./schema-components.cjs");
|
|
6
|
+
const require_validate = require("../validation/validate.cjs");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
// src/react/provider.tsx
|
|
9
|
+
const SeoProvider = ({ config, metadata, children, validation, onValidation, ...schemaOptions }) => {
|
|
10
|
+
const resolvedConfig = (0, react.useMemo)(() => require_config.normalizeSeoConfig(config), [config]);
|
|
11
|
+
const resolvedMetadata = (0, react.useMemo)(() => {
|
|
12
|
+
try {
|
|
13
|
+
return require_resolve.resolveSeoMetadata(metadata ?? {}, resolvedConfig);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
const options = require_schema_components.normalizeValidation(validation ?? {});
|
|
16
|
+
if (options !== false && metadata) require_schema_components.assertSeoValidationReport(require_validate.validateSeo({ metadata }, {
|
|
17
|
+
...options,
|
|
18
|
+
baseUrl: options.baseUrl ?? resolvedConfig.siteUrl
|
|
19
|
+
}));
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}, [
|
|
23
|
+
metadata,
|
|
24
|
+
resolvedConfig,
|
|
25
|
+
validation
|
|
26
|
+
]);
|
|
27
|
+
const contextValue = (0, react.useMemo)(() => ({
|
|
28
|
+
config: resolvedConfig,
|
|
29
|
+
metadata: resolvedMetadata
|
|
30
|
+
}), [resolvedConfig, resolvedMetadata]);
|
|
31
|
+
return (0, react.createElement)(require_context.SeoReactContext.Provider, { value: contextValue }, (0, react.createElement)(require_schema_components.SeoProvider, {
|
|
32
|
+
config: resolvedConfig,
|
|
33
|
+
metadata: resolvedMetadata,
|
|
34
|
+
validation,
|
|
35
|
+
onValidation,
|
|
36
|
+
...schemaOptions,
|
|
37
|
+
children
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
40
|
+
exports.SeoProvider = SeoProvider;
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=provider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.cjs","names":["useMemo","normalizeSeoConfig","resolveSeoMetadata","normalizeValidation","validateSeo","createElement","SeoReactContext","SeoSchemaProvider"],"sources":["../../src/react/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, useMemo } from \"react\";\n\nimport { normalizeSeoConfig } from \"../context\";\n\nimport { resolveSeoMetadata } from \"../metadata\";\n\nimport type { SeoProviderProps } from \"./types\";\n\nimport { SeoReactContext } from \"./context\";\n\nimport {\n assertSeoValidationReport,\n normalizeValidation,\n SeoProvider as SeoSchemaProvider,\n} from \"./schema-components\";\n\nimport { validateSeo } from \"../validation/validate\";\n\nexport const SeoProvider = ({\n config,\n metadata,\n children,\n validation,\n onValidation,\n ...schemaOptions\n}: SeoProviderProps) => {\n const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);\n\n const resolvedMetadata = useMemo(() => {\n try {\n return resolveSeoMetadata(metadata ?? {}, resolvedConfig);\n } catch (error) {\n // Report unresolvable metadata (e.g. unsafe URLs) as validation\n // errors in strict mode instead of the raw resolution error.\n const options = normalizeValidation(validation ?? {});\n\n if (options !== false && metadata) {\n assertSeoValidationReport(\n validateSeo(\n { metadata },\n {\n ...options,\n baseUrl: options.baseUrl ?? resolvedConfig.siteUrl,\n },\n ),\n );\n }\n\n throw error;\n }\n }, [metadata, resolvedConfig, validation]);\n\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n metadata: resolvedMetadata,\n }),\n [resolvedConfig, resolvedMetadata],\n );\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: contextValue,\n },\n createElement(SeoSchemaProvider, {\n config: resolvedConfig,\n metadata: resolvedMetadata,\n validation,\n onValidation,\n ...schemaOptions,\n children,\n }),\n );\n};\n"],"mappings":";;;;;;;;AAoBA,MAAa,eAAe,EAC1B,QACA,UACA,UACA,YACA,cACA,GAAG,oBACmB;CACtB,MAAM,kBAAA,GAAiBA,MAAAA,QAAAA,OAAcC,eAAAA,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,oBAAA,GAAmBD,MAAAA,QAAAA,OAAc;EACrC,IAAI;GACF,OAAOE,gBAAAA,mBAAmB,YAAY,CAAC,GAAG,cAAc;EAC1D,SAAS,OAAO;GAGd,MAAM,UAAUC,0BAAAA,oBAAoB,cAAc,CAAC,CAAC;GAEpD,IAAI,YAAY,SAAS,UACvB,0BAAA,0BACEC,iBAAAA,YACE,EAAE,SAAS,GACX;IACE,GAAG;IACH,SAAS,QAAQ,WAAW,eAAe;GAC7C,CACF,CACF;GAGF,MAAM;EACR;CACF,GAAG;EAAC;EAAU;EAAgB;CAAU,CAAC;CAEzC,MAAM,gBAAA,GAAeJ,MAAAA,QAAAA,QACZ;EACL,QAAQ;EACR,UAAU;CACZ,IACA,CAAC,gBAAgB,gBAAgB,CACnC;CAEA,QAAA,GAAOK,MAAAA,cAAAA,CACLC,gBAAAA,gBAAgB,UAChB,EACE,OAAO,aACT,IAAA,GACAD,MAAAA,cAAAA,CAAcE,0BAAAA,aAAmB;EAC/B,QAAQ;EACR,UAAU;EACV;EACA;EACA,GAAG;EACH;CACF,CAAC,CACH;AACF"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { SeoReactContextValue } from "./context.cjs";
|
|
2
|
+
import { SeoProviderProps } from "./types.cjs";
|
|
3
|
+
export declare const SeoProvider: ({ config, metadata, children, validation, onValidation, ...schemaOptions }: SeoProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { SeoReactContextValue } from "./context.js";
|
|
2
|
+
import { SeoProviderProps } from "./types.js";
|
|
3
|
+
export declare const SeoProvider: ({ config, metadata, children, validation, onValidation, ...schemaOptions }: SeoProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<SeoReactContextValue | null>>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { normalizeSeoConfig } from "../context/config.js";
|
|
3
|
+
import { resolveSeoMetadata } from "../metadata/resolve.js";
|
|
4
|
+
import { SeoReactContext } from "./context.js";
|
|
5
|
+
import { SeoProvider as SeoProvider$1, assertSeoValidationReport, normalizeValidation } from "./schema-components.js";
|
|
6
|
+
import { validateSeo } from "../validation/validate.js";
|
|
7
|
+
import { createElement, useMemo } from "react";
|
|
8
|
+
// src/react/provider.tsx
|
|
9
|
+
const SeoProvider = ({ config, metadata, children, validation, onValidation, ...schemaOptions }) => {
|
|
10
|
+
const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);
|
|
11
|
+
const resolvedMetadata = useMemo(() => {
|
|
12
|
+
try {
|
|
13
|
+
return resolveSeoMetadata(metadata ?? {}, resolvedConfig);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
const options = normalizeValidation(validation ?? {});
|
|
16
|
+
if (options !== false && metadata) assertSeoValidationReport(validateSeo({ metadata }, {
|
|
17
|
+
...options,
|
|
18
|
+
baseUrl: options.baseUrl ?? resolvedConfig.siteUrl
|
|
19
|
+
}));
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}, [
|
|
23
|
+
metadata,
|
|
24
|
+
resolvedConfig,
|
|
25
|
+
validation
|
|
26
|
+
]);
|
|
27
|
+
const contextValue = useMemo(() => ({
|
|
28
|
+
config: resolvedConfig,
|
|
29
|
+
metadata: resolvedMetadata
|
|
30
|
+
}), [resolvedConfig, resolvedMetadata]);
|
|
31
|
+
return createElement(SeoReactContext.Provider, { value: contextValue }, createElement(SeoProvider$1, {
|
|
32
|
+
config: resolvedConfig,
|
|
33
|
+
metadata: resolvedMetadata,
|
|
34
|
+
validation,
|
|
35
|
+
onValidation,
|
|
36
|
+
...schemaOptions,
|
|
37
|
+
children
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
40
|
+
export { SeoProvider };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","names":["SeoSchemaProvider"],"sources":["../../src/react/provider.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, useMemo } from \"react\";\n\nimport { normalizeSeoConfig } from \"../context\";\n\nimport { resolveSeoMetadata } from \"../metadata\";\n\nimport type { SeoProviderProps } from \"./types\";\n\nimport { SeoReactContext } from \"./context\";\n\nimport {\n assertSeoValidationReport,\n normalizeValidation,\n SeoProvider as SeoSchemaProvider,\n} from \"./schema-components\";\n\nimport { validateSeo } from \"../validation/validate\";\n\nexport const SeoProvider = ({\n config,\n metadata,\n children,\n validation,\n onValidation,\n ...schemaOptions\n}: SeoProviderProps) => {\n const resolvedConfig = useMemo(() => normalizeSeoConfig(config), [config]);\n\n const resolvedMetadata = useMemo(() => {\n try {\n return resolveSeoMetadata(metadata ?? {}, resolvedConfig);\n } catch (error) {\n // Report unresolvable metadata (e.g. unsafe URLs) as validation\n // errors in strict mode instead of the raw resolution error.\n const options = normalizeValidation(validation ?? {});\n\n if (options !== false && metadata) {\n assertSeoValidationReport(\n validateSeo(\n { metadata },\n {\n ...options,\n baseUrl: options.baseUrl ?? resolvedConfig.siteUrl,\n },\n ),\n );\n }\n\n throw error;\n }\n }, [metadata, resolvedConfig, validation]);\n\n const contextValue = useMemo(\n () => ({\n config: resolvedConfig,\n metadata: resolvedMetadata,\n }),\n [resolvedConfig, resolvedMetadata],\n );\n\n return createElement(\n SeoReactContext.Provider,\n {\n value: contextValue,\n },\n createElement(SeoSchemaProvider, {\n config: resolvedConfig,\n metadata: resolvedMetadata,\n validation,\n onValidation,\n ...schemaOptions,\n children,\n }),\n );\n};\n"],"mappings":";;;;;;;;AAoBA,MAAa,eAAe,EAC1B,QACA,UACA,UACA,YACA,cACA,GAAG,oBACmB;CACtB,MAAM,iBAAiB,cAAc,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;CAEzE,MAAM,mBAAmB,cAAc;EACrC,IAAI;GACF,OAAO,mBAAmB,YAAY,CAAC,GAAG,cAAc;EAC1D,SAAS,OAAO;GAGd,MAAM,UAAU,oBAAoB,cAAc,CAAC,CAAC;GAEpD,IAAI,YAAY,SAAS,UACvB,0BACE,YACE,EAAE,SAAS,GACX;IACE,GAAG;IACH,SAAS,QAAQ,WAAW,eAAe;GAC7C,CACF,CACF;GAGF,MAAM;EACR;CACF,GAAG;EAAC;EAAU;EAAgB;CAAU,CAAC;CAEzC,MAAM,eAAe,eACZ;EACL,QAAQ;EACR,UAAU;CACZ,IACA,CAAC,gBAAgB,gBAAgB,CACnC;CAEA,OAAO,cACL,gBAAgB,UAChB,EACE,OAAO,aACT,GACA,cAAcA,eAAmB;EAC/B,QAAQ;EACR,UAAU;EACV;EACA;EACA,GAAG;EACH;CACF,CAAC,CACH;AACF"}
|