@dani-builder/blocks 0.2.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/LICENSE +21 -0
- package/README.md +53 -0
- package/dist/blocks/bento-grid.d.ts +7 -0
- package/dist/blocks/bento-grid.d.ts.map +1 -0
- package/dist/blocks/bento-grid.js +20 -0
- package/dist/blocks/bento-grid.js.map +1 -0
- package/dist/blocks/block-renderer.d.ts +19 -0
- package/dist/blocks/block-renderer.d.ts.map +1 -0
- package/dist/blocks/block-renderer.js +71 -0
- package/dist/blocks/block-renderer.js.map +1 -0
- package/dist/blocks/content.d.ts +7 -0
- package/dist/blocks/content.d.ts.map +1 -0
- package/dist/blocks/content.js +18 -0
- package/dist/blocks/content.js.map +1 -0
- package/dist/blocks/cta.d.ts +7 -0
- package/dist/blocks/cta.d.ts.map +1 -0
- package/dist/blocks/cta.js +48 -0
- package/dist/blocks/cta.js.map +1 -0
- package/dist/blocks/faq.d.ts +7 -0
- package/dist/blocks/faq.d.ts.map +1 -0
- package/dist/blocks/faq.js +7 -0
- package/dist/blocks/faq.js.map +1 -0
- package/dist/blocks/features.d.ts +11 -0
- package/dist/blocks/features.d.ts.map +1 -0
- package/dist/blocks/features.js +41 -0
- package/dist/blocks/features.js.map +1 -0
- package/dist/blocks/hero.d.ts +7 -0
- package/dist/blocks/hero.d.ts.map +1 -0
- package/dist/blocks/hero.js +57 -0
- package/dist/blocks/hero.js.map +1 -0
- package/dist/blocks/highlights.d.ts +7 -0
- package/dist/blocks/highlights.d.ts.map +1 -0
- package/dist/blocks/highlights.js +29 -0
- package/dist/blocks/highlights.js.map +1 -0
- package/dist/blocks/inquiry-form.d.ts +7 -0
- package/dist/blocks/inquiry-form.d.ts.map +1 -0
- package/dist/blocks/inquiry-form.js +62 -0
- package/dist/blocks/inquiry-form.js.map +1 -0
- package/dist/blocks/logo-cloud.d.ts +7 -0
- package/dist/blocks/logo-cloud.d.ts.map +1 -0
- package/dist/blocks/logo-cloud.js +46 -0
- package/dist/blocks/logo-cloud.js.map +1 -0
- package/dist/blocks/pricing.d.ts +7 -0
- package/dist/blocks/pricing.d.ts.map +1 -0
- package/dist/blocks/pricing.js +40 -0
- package/dist/blocks/pricing.js.map +1 -0
- package/dist/blocks/slider.d.ts +7 -0
- package/dist/blocks/slider.d.ts.map +1 -0
- package/dist/blocks/slider.js +27 -0
- package/dist/blocks/slider.js.map +1 -0
- package/dist/blocks/stats.d.ts +7 -0
- package/dist/blocks/stats.d.ts.map +1 -0
- package/dist/blocks/stats.js +35 -0
- package/dist/blocks/stats.js.map +1 -0
- package/dist/blocks/team.d.ts +7 -0
- package/dist/blocks/team.d.ts.map +1 -0
- package/dist/blocks/team.js +36 -0
- package/dist/blocks/team.js.map +1 -0
- package/dist/blocks/testimonials.d.ts +7 -0
- package/dist/blocks/testimonials.d.ts.map +1 -0
- package/dist/blocks/testimonials.js +47 -0
- package/dist/blocks/testimonials.js.map +1 -0
- package/dist/context.d.ts +37 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +15 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/block-image.d.ts +14 -0
- package/dist/shared/block-image.d.ts.map +1 -0
- package/dist/shared/block-image.js +38 -0
- package/dist/shared/block-image.js.map +1 -0
- package/dist/shared/blocks-renderer.d.ts +8 -0
- package/dist/shared/blocks-renderer.d.ts.map +1 -0
- package/dist/shared/blocks-renderer.js +76 -0
- package/dist/shared/blocks-renderer.js.map +1 -0
- package/dist/shared/count-up.d.ts +12 -0
- package/dist/shared/count-up.d.ts.map +1 -0
- package/dist/shared/count-up.js +74 -0
- package/dist/shared/count-up.js.map +1 -0
- package/dist/shared/icon-renderer.d.ts +10 -0
- package/dist/shared/icon-renderer.d.ts.map +1 -0
- package/dist/shared/icon-renderer.js +76 -0
- package/dist/shared/icon-renderer.js.map +1 -0
- package/dist/shared/reveal.d.ts +12 -0
- package/dist/shared/reveal.d.ts.map +1 -0
- package/dist/shared/reveal.js +34 -0
- package/dist/shared/reveal.js.map +1 -0
- package/dist/shared/section-wrapper.d.ts +21 -0
- package/dist/shared/section-wrapper.d.ts.map +1 -0
- package/dist/shared/section-wrapper.js +44 -0
- package/dist/shared/section-wrapper.js.map +1 -0
- package/dist/shared/strapi-image.d.ts +26 -0
- package/dist/shared/strapi-image.d.ts.map +1 -0
- package/dist/shared/strapi-image.js +22 -0
- package/dist/shared/strapi-image.js.map +1 -0
- package/dist/shared/strapi-link.d.ts +10 -0
- package/dist/shared/strapi-link.d.ts.map +1 -0
- package/dist/shared/strapi-link.js +21 -0
- package/dist/shared/strapi-link.js.map +1 -0
- package/package.json +66 -0
- package/src/styles/blocks.css +291 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Image as ImageComponent } from "@dani-builder/strapi-client/types";
|
|
2
|
+
export declare function resolveFit(image: ImageComponent, layoutAspect: number): "cover" | "contain";
|
|
3
|
+
interface BlockImageProps {
|
|
4
|
+
image: ImageComponent | null | undefined;
|
|
5
|
+
/** The slot's layout aspect, e.g. "4/3" — used for the cover box and auto-fit. */
|
|
6
|
+
aspect: `${number}/${number}`;
|
|
7
|
+
/** Frame classes (radius, ring, shadow, order…) applied to the wrapper. */
|
|
8
|
+
className?: string;
|
|
9
|
+
sizes: string;
|
|
10
|
+
priority?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function BlockImage({ image, aspect, className, sizes, priority, }: BlockImageProps): import("react").JSX.Element | null;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=block-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-image.d.ts","sourceRoot":"","sources":["../../src/shared/block-image.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAmBjF,wBAAgB,UAAU,CACxB,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,GAAG,SAAS,CAOrB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,kFAAkF;IAClF,MAAM,EAAE,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;IAC9B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,GACT,EAAE,eAAe,sCAoCjB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { StrapiImage } from "./strapi-image";
|
|
3
|
+
/**
|
|
4
|
+
* Renderer for the `shared.image` component (ADR 0003): resolves fit and the
|
|
5
|
+
* localized alt override in one place so block components only declare their
|
|
6
|
+
* layout aspect and frame styling.
|
|
7
|
+
*
|
|
8
|
+
* - `cover`: fill a fixed-aspect box (the block's layout aspect), cropping.
|
|
9
|
+
* - `contain`: render at the asset's intrinsic ratio — no letterboxing
|
|
10
|
+
* inside the frame, the frame simply follows the asset.
|
|
11
|
+
* - `auto` (default): cover when the asset's intrinsic aspect is within 20%
|
|
12
|
+
* of the layout aspect (crop is negligible), contain otherwise (crop would
|
|
13
|
+
* destroy an information-bearing image such as a screenshot).
|
|
14
|
+
*/
|
|
15
|
+
/** Relative aspect difference below which auto-fit crops (cover). */
|
|
16
|
+
const AUTO_COVER_TOLERANCE = 0.2;
|
|
17
|
+
export function resolveFit(image, layoutAspect) {
|
|
18
|
+
if (image.fit === "cover" || image.fit === "contain")
|
|
19
|
+
return image.fit;
|
|
20
|
+
const { width, height } = image.media ?? {};
|
|
21
|
+
if (!width || !height)
|
|
22
|
+
return "cover";
|
|
23
|
+
const assetAspect = width / height;
|
|
24
|
+
const diff = Math.abs(assetAspect - layoutAspect) / layoutAspect;
|
|
25
|
+
return diff <= AUTO_COVER_TOLERANCE ? "cover" : "contain";
|
|
26
|
+
}
|
|
27
|
+
export function BlockImage({ image, aspect, className, sizes, priority, }) {
|
|
28
|
+
if (!image?.media)
|
|
29
|
+
return null;
|
|
30
|
+
const [w, h] = aspect.split("/").map(Number);
|
|
31
|
+
const fit = resolveFit(image, w / h);
|
|
32
|
+
const alt = image.alt ?? undefined; // StrapiImage falls back to upload alt/name
|
|
33
|
+
if (fit === "contain") {
|
|
34
|
+
return (_jsx("div", { className: `overflow-hidden ${className ?? ""}`, children: _jsx(StrapiImage, { asset: image.media, alt: alt, sizes: sizes, className: "h-auto w-full", priority: priority }) }));
|
|
35
|
+
}
|
|
36
|
+
return (_jsx("div", { className: `relative overflow-hidden ${className ?? ""}`, style: { aspectRatio: `${w} / ${h}` }, children: _jsx(StrapiImage, { asset: image.media, alt: alt, fill: true, sizes: sizes, className: "object-cover", priority: priority }) }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=block-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-image.js","sourceRoot":"","sources":["../../src/shared/block-image.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;;;GAWG;AAEH,qEAAqE;AACrE,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC,MAAM,UAAU,UAAU,CACxB,KAAqB,EACrB,YAAoB;IAEpB,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IACvE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC;IACjE,OAAO,IAAI,IAAI,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAYD,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,GACQ;IAChB,IAAI,CAAC,KAAK,EAAE,KAAK;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAqB,CAAC;IACjE,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,4CAA4C;IAEhF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CACL,cAAK,SAAS,EAAE,mBAAmB,SAAS,IAAI,EAAE,EAAE,YAClD,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,KAAK,EACZ,SAAS,EAAC,eAAe,EACzB,QAAQ,EAAE,QAAQ,GAClB,GACE,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAE,4BAA4B,SAAS,IAAI,EAAE,EAAE,EACxD,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,YAErC,KAAC,WAAW,IACV,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,GAAG,EAAE,GAAG,EACR,IAAI,QACJ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAC,cAAc,EACxB,QAAQ,EAAE,QAAQ,GAClB,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { BlocksContent } from "@dani-builder/strapi-client/types";
|
|
2
|
+
interface BlocksRendererProps {
|
|
3
|
+
content: BlocksContent | null | undefined;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function BlocksRenderer({ content, className }: BlocksRendererProps): import("react").JSX.Element | null;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=blocks-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks-renderer.d.ts","sourceRoot":"","sources":["../../src/shared/blocks-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAYd,MAAM,mCAAmC,CAAC;AAG3C,UAAU,mBAAmB;IAC3B,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,mBAAmB,sCAUzE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { StrapiImage } from "./strapi-image";
|
|
3
|
+
export function BlocksRenderer({ content, className }) {
|
|
4
|
+
if (!content || content.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
return (_jsx("div", { className: className, children: content.map((block, idx) => (_jsx(RenderBlock, { block: block }, idx))) }));
|
|
7
|
+
}
|
|
8
|
+
function RenderBlock({ block }) {
|
|
9
|
+
switch (block.type) {
|
|
10
|
+
case "paragraph":
|
|
11
|
+
return _jsx(ParagraphBlock, { node: block });
|
|
12
|
+
case "heading":
|
|
13
|
+
return _jsx(HeadingBlock, { node: block });
|
|
14
|
+
case "list":
|
|
15
|
+
return _jsx(ListBlock, { node: block });
|
|
16
|
+
case "quote":
|
|
17
|
+
return _jsx(QuoteBlock, { node: block });
|
|
18
|
+
case "code":
|
|
19
|
+
return _jsx(CodeBlock, { node: block });
|
|
20
|
+
case "image":
|
|
21
|
+
return _jsx(ImageBlock, { node: block });
|
|
22
|
+
default:
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function ParagraphBlock({ node }) {
|
|
27
|
+
return (_jsx("p", { children: _jsx(InlineNodes, { nodes: node.children }) }));
|
|
28
|
+
}
|
|
29
|
+
function HeadingBlock({ node }) {
|
|
30
|
+
const Tag = `h${node.level}`;
|
|
31
|
+
return (_jsx(Tag, { children: _jsx(InlineNodes, { nodes: node.children }) }));
|
|
32
|
+
}
|
|
33
|
+
function ListBlock({ node }) {
|
|
34
|
+
const Tag = node.format === "ordered" ? "ol" : "ul";
|
|
35
|
+
return (_jsx(Tag, { children: node.children.map((item, idx) => (_jsx(ListItemBlock, { node: item }, idx))) }));
|
|
36
|
+
}
|
|
37
|
+
function ListItemBlock({ node }) {
|
|
38
|
+
return (_jsx("li", { children: _jsx(InlineNodes, { nodes: node.children }) }));
|
|
39
|
+
}
|
|
40
|
+
function QuoteBlock({ node }) {
|
|
41
|
+
return (_jsx("blockquote", { children: _jsx("p", { children: _jsx(InlineNodes, { nodes: node.children }) }) }));
|
|
42
|
+
}
|
|
43
|
+
function CodeBlock({ node }) {
|
|
44
|
+
const text = node.children.map((c) => c.text).join("");
|
|
45
|
+
return (_jsx("pre", { children: _jsx("code", { children: text }) }));
|
|
46
|
+
}
|
|
47
|
+
function ImageBlock({ node }) {
|
|
48
|
+
return (_jsx("figure", { children: _jsx(StrapiImage, { asset: node.image, className: "rounded-lg" }) }));
|
|
49
|
+
}
|
|
50
|
+
function InlineNodes({ nodes }) {
|
|
51
|
+
return (_jsx(_Fragment, { children: nodes.map((node, idx) => (_jsx(InlineNode, { node: node }, idx))) }));
|
|
52
|
+
}
|
|
53
|
+
function InlineNode({ node }) {
|
|
54
|
+
if (node.type === "link") {
|
|
55
|
+
return _jsx(LinkNode, { node: node });
|
|
56
|
+
}
|
|
57
|
+
return _jsx(TextNode, { node: node });
|
|
58
|
+
}
|
|
59
|
+
function TextNode({ node }) {
|
|
60
|
+
let el = node.text;
|
|
61
|
+
if (node.bold)
|
|
62
|
+
el = _jsx("strong", { children: el });
|
|
63
|
+
if (node.italic)
|
|
64
|
+
el = _jsx("em", { children: el });
|
|
65
|
+
if (node.underline)
|
|
66
|
+
el = _jsx("u", { children: el });
|
|
67
|
+
if (node.strikethrough)
|
|
68
|
+
el = _jsx("s", { children: el });
|
|
69
|
+
if (node.code)
|
|
70
|
+
el = _jsx("code", { children: el });
|
|
71
|
+
return _jsx(_Fragment, { children: el });
|
|
72
|
+
}
|
|
73
|
+
function LinkNode({ node }) {
|
|
74
|
+
return (_jsx("a", { href: node.url, children: node.children.map((child, idx) => (_jsx(TextNode, { node: child }, idx))) }));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=blocks-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks-renderer.js","sourceRoot":"","sources":["../../src/shared/blocks-renderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animates a numeric stat from 0 to its value once scrolled into view. Prefix/
|
|
3
|
+
* suffix ($, %, K, +) and thousands grouping are preserved. SSR (and JS-disabled
|
|
4
|
+
* or reduced-motion) render the FINAL value — the animation is a progressive
|
|
5
|
+
* enhancement, never a prerequisite for seeing the number. `tabular-nums` avoids
|
|
6
|
+
* width jitter.
|
|
7
|
+
*/
|
|
8
|
+
export declare function CountUp({ value, className }: {
|
|
9
|
+
value: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=count-up.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-up.d.ts","sourceRoot":"","sources":["../../src/shared/count-up.tsx"],"names":[],"mappings":"AAoCA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BA2ClF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
/** Split "1,500+" → { prefix:"", num:1500, suffix:"+", decimals:0, grouped:true }. */
|
|
5
|
+
function parse(value) {
|
|
6
|
+
const m = /^(\D*)(\d[\d,]*(?:\.\d+)?)(.*)$/.exec(value);
|
|
7
|
+
if (!m)
|
|
8
|
+
return null;
|
|
9
|
+
const prefix = m[1] ?? "";
|
|
10
|
+
const rawDigits = m[2] ?? "";
|
|
11
|
+
const suffix = m[3] ?? "";
|
|
12
|
+
const cleaned = rawDigits.replace(/,/g, "");
|
|
13
|
+
const num = parseFloat(cleaned);
|
|
14
|
+
if (!Number.isFinite(num))
|
|
15
|
+
return null;
|
|
16
|
+
const decimals = cleaned.includes(".") ? (cleaned.split(".")[1]?.length ?? 0) : 0;
|
|
17
|
+
return { prefix, num, suffix, decimals, grouped: rawDigits.includes(",") };
|
|
18
|
+
}
|
|
19
|
+
function format(n, p) {
|
|
20
|
+
const rounded = Number(n.toFixed(p.decimals));
|
|
21
|
+
return p.grouped
|
|
22
|
+
? rounded.toLocaleString("en-US", {
|
|
23
|
+
minimumFractionDigits: p.decimals,
|
|
24
|
+
maximumFractionDigits: p.decimals,
|
|
25
|
+
})
|
|
26
|
+
: rounded.toFixed(p.decimals);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Animates a numeric stat from 0 to its value once scrolled into view. Prefix/
|
|
30
|
+
* suffix ($, %, K, +) and thousands grouping are preserved. SSR (and JS-disabled
|
|
31
|
+
* or reduced-motion) render the FINAL value — the animation is a progressive
|
|
32
|
+
* enhancement, never a prerequisite for seeing the number. `tabular-nums` avoids
|
|
33
|
+
* width jitter.
|
|
34
|
+
*/
|
|
35
|
+
export function CountUp({ value, className }) {
|
|
36
|
+
const parsed = parse(value);
|
|
37
|
+
const ref = useRef(null);
|
|
38
|
+
// Initial = final value so SSR/no-JS is correct and hydration matches.
|
|
39
|
+
const [display, setDisplay] = useState(parsed ? format(parsed.num, parsed) : value);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!parsed)
|
|
42
|
+
return;
|
|
43
|
+
const el = ref.current;
|
|
44
|
+
if (!el)
|
|
45
|
+
return;
|
|
46
|
+
const reduced = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
47
|
+
if (reduced || typeof IntersectionObserver === "undefined")
|
|
48
|
+
return; // keep final
|
|
49
|
+
const observer = new IntersectionObserver((entries) => {
|
|
50
|
+
if (!entries.some((e) => e.isIntersecting))
|
|
51
|
+
return;
|
|
52
|
+
observer.disconnect();
|
|
53
|
+
const duration = 1200;
|
|
54
|
+
const start = performance.now();
|
|
55
|
+
const tick = (now) => {
|
|
56
|
+
const t = Math.min(1, (now - start) / duration);
|
|
57
|
+
const eased = 1 - Math.pow(1 - t, 3);
|
|
58
|
+
setDisplay(format(parsed.num * eased, parsed));
|
|
59
|
+
if (t < 1)
|
|
60
|
+
requestAnimationFrame(tick);
|
|
61
|
+
else
|
|
62
|
+
setDisplay(format(parsed.num, parsed));
|
|
63
|
+
};
|
|
64
|
+
requestAnimationFrame(tick);
|
|
65
|
+
}, { threshold: 0.4 });
|
|
66
|
+
observer.observe(el);
|
|
67
|
+
return () => observer.disconnect();
|
|
68
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
69
|
+
}, [value]);
|
|
70
|
+
if (!parsed)
|
|
71
|
+
return _jsx("span", { className: className, children: value });
|
|
72
|
+
return (_jsxs("span", { ref: ref, className: className, style: { fontVariantNumeric: "tabular-nums" }, children: [parsed.prefix, display, parsed.suffix] }));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=count-up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-up.js","sourceRoot":"","sources":["../../src/shared/count-up.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SVGProps } from "react";
|
|
2
|
+
/** True when the identifier resolves to a bundled icon. Lets callers fall back
|
|
3
|
+
* to a text label when an author picked an icon we don't ship. */
|
|
4
|
+
export declare function iconExists(name: string | null | undefined): boolean;
|
|
5
|
+
export interface IconRendererProps extends Omit<SVGProps<SVGSVGElement>, "name"> {
|
|
6
|
+
/** Raw icon-picker identifier from the CMS. */
|
|
7
|
+
name: string | null | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare function IconRenderer({ name, ...props }: IconRendererProps): import("react").JSX.Element | null;
|
|
10
|
+
//# sourceMappingURL=icon-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-renderer.d.ts","sourceRoot":"","sources":["../../src/shared/icon-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,QAAQ,EAAE,MAAM,OAAO,CAAC;AAoL/D;mEACmE;AACnE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAInE;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAC9E,+CAA+C;IAC/C,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,sCAMjE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const base = (children, opts) => function Icon(props) {
|
|
3
|
+
return (_jsx("svg", { viewBox: "0 0 24 24", fill: opts?.fill ? "currentColor" : "none", stroke: opts?.fill ? "none" : "currentColor", strokeWidth: opts?.fill ? undefined : 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", ...props, children: children }));
|
|
4
|
+
};
|
|
5
|
+
const ICONS = {
|
|
6
|
+
twitter: base(_jsx("path", { d: "M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z" })),
|
|
7
|
+
x: base(_jsx("path", { d: "M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z" }), { fill: true }),
|
|
8
|
+
facebook: base(_jsx("path", { d: "M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" })),
|
|
9
|
+
instagram: base(_jsxs(_Fragment, { children: [_jsx("rect", { x: "2", y: "2", width: "20", height: "20", rx: "5", ry: "5" }), _jsx("path", { d: "M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" }), _jsx("line", { x1: "17.5", y1: "6.5", x2: "17.51", y2: "6.5" })] })),
|
|
10
|
+
linkedin: base(_jsx("path", { d: "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.225 0z" }), { fill: true }),
|
|
11
|
+
youtube: base(_jsxs(_Fragment, { children: [_jsx("path", { d: "M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z" }), _jsx("polygon", { points: "9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02" })] })),
|
|
12
|
+
github: base(_jsx("path", { d: "M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22" })),
|
|
13
|
+
mail: base(_jsxs(_Fragment, { children: [_jsx("path", { d: "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" }), _jsx("polyline", { points: "22,6 12,13 2,6" })] })),
|
|
14
|
+
phone: base(_jsx("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" })),
|
|
15
|
+
globe: base(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "2", y1: "12", x2: "22", y2: "12" }), _jsx("path", { d: "M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" })] })),
|
|
16
|
+
// Product/feature icons (feature cards, bento cells, highlight items).
|
|
17
|
+
zap: base(_jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" })),
|
|
18
|
+
shield: base(_jsx("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" })),
|
|
19
|
+
layers: base(_jsxs(_Fragment, { children: [_jsx("polygon", { points: "12 2 2 7 12 12 22 7 12 2" }), _jsx("polyline", { points: "2 17 12 22 22 17" }), _jsx("polyline", { points: "2 12 12 17 22 12" })] })),
|
|
20
|
+
sparkles: base(_jsxs(_Fragment, { children: [_jsx("path", { d: "M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9L12 3z" }), _jsx("path", { d: "M19 15l.9 2.1L22 18l-2.1.9L19 21l-.9-2.1L16 18l2.1-.9L19 15z" })] })),
|
|
21
|
+
chart: base(_jsxs(_Fragment, { children: [_jsx("line", { x1: "18", y1: "20", x2: "18", y2: "10" }), _jsx("line", { x1: "12", y1: "20", x2: "12", y2: "4" }), _jsx("line", { x1: "6", y1: "20", x2: "6", y2: "14" })] })),
|
|
22
|
+
rocket: base(_jsxs(_Fragment, { children: [_jsx("path", { d: "M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" }), _jsx("path", { d: "M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" }), _jsx("path", { d: "M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" }), _jsx("path", { d: "M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" })] })),
|
|
23
|
+
clock: base(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("polyline", { points: "12 6 12 12 16 14" })] })),
|
|
24
|
+
target: base(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("circle", { cx: "12", cy: "12", r: "6" }), _jsx("circle", { cx: "12", cy: "12", r: "2" })] })),
|
|
25
|
+
check: base(_jsx("polyline", { points: "20 6 9 17 4 12" })),
|
|
26
|
+
box: base(_jsxs(_Fragment, { children: [_jsx("path", { d: "M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" }), _jsx("polyline", { points: "3.27 6.96 12 12.01 20.73 6.96" }), _jsx("line", { x1: "12", y1: "22.08", x2: "12", y2: "12" })] })),
|
|
27
|
+
palette: base(_jsxs(_Fragment, { children: [_jsx("circle", { cx: "13.5", cy: "6.5", r: ".5" }), _jsx("circle", { cx: "17.5", cy: "10.5", r: ".5" }), _jsx("circle", { cx: "8.5", cy: "7.5", r: ".5" }), _jsx("circle", { cx: "6.5", cy: "12.5", r: ".5" }), _jsx("path", { d: "M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.93 0 1.67-.74 1.67-1.67 0-.43-.17-.83-.44-1.12-.27-.29-.43-.68-.43-1.11 0-.93.74-1.67 1.67-1.67H16c3.31 0 6-2.69 6-6 0-4.96-4.5-8.43-10-8.43z" })] })),
|
|
28
|
+
code: base(_jsxs(_Fragment, { children: [_jsx("polyline", { points: "16 18 22 12 16 6" }), _jsx("polyline", { points: "8 6 2 12 8 18" })] })),
|
|
29
|
+
};
|
|
30
|
+
// Aliases → canonical key.
|
|
31
|
+
const ALIASES = {
|
|
32
|
+
xtwitter: "x",
|
|
33
|
+
twitterx: "x",
|
|
34
|
+
fb: "facebook",
|
|
35
|
+
ig: "instagram",
|
|
36
|
+
linkedin: "linkedin",
|
|
37
|
+
yt: "youtube",
|
|
38
|
+
email: "mail",
|
|
39
|
+
envelope: "mail",
|
|
40
|
+
website: "globe",
|
|
41
|
+
link: "globe",
|
|
42
|
+
tel: "phone",
|
|
43
|
+
bolt: "zap",
|
|
44
|
+
lightning: "zap",
|
|
45
|
+
stack: "layers",
|
|
46
|
+
analytics: "chart",
|
|
47
|
+
graph: "chart",
|
|
48
|
+
barchart: "chart",
|
|
49
|
+
launch: "rocket",
|
|
50
|
+
security: "shield",
|
|
51
|
+
cube: "box",
|
|
52
|
+
package: "box",
|
|
53
|
+
design: "palette",
|
|
54
|
+
dev: "code",
|
|
55
|
+
};
|
|
56
|
+
function normalize(id) {
|
|
57
|
+
return id.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
58
|
+
}
|
|
59
|
+
/** True when the identifier resolves to a bundled icon. Lets callers fall back
|
|
60
|
+
* to a text label when an author picked an icon we don't ship. */
|
|
61
|
+
export function iconExists(name) {
|
|
62
|
+
if (!name)
|
|
63
|
+
return false;
|
|
64
|
+
const key = normalize(name);
|
|
65
|
+
return Boolean(ICONS[key] ?? ICONS[ALIASES[key] ?? ""]);
|
|
66
|
+
}
|
|
67
|
+
export function IconRenderer({ name, ...props }) {
|
|
68
|
+
if (!name)
|
|
69
|
+
return null;
|
|
70
|
+
const key = normalize(name);
|
|
71
|
+
const Icon = ICONS[key] ?? ICONS[ALIASES[key] ?? ""];
|
|
72
|
+
if (!Icon)
|
|
73
|
+
return null;
|
|
74
|
+
return _jsx(Icon, { ...props });
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=icon-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-renderer.js","sourceRoot":"","sources":["../../src/shared/icon-renderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Toggles `data-reveal="in"` when the element scrolls into view, so the CSS in
|
|
4
|
+
* globals.css can stagger-fade-up the direct children. Reduced-motion users get
|
|
5
|
+
* no animation (the CSS is gated on prefers-reduced-motion). Renders children
|
|
6
|
+
* immediately (SSR-visible) — the effect only adds the entrance animation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function Reveal({ children, className, }: {
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal.d.ts","sourceRoot":"","sources":["../../src/shared/reveal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA+BA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
/**
|
|
5
|
+
* Toggles `data-reveal="in"` when the element scrolls into view, so the CSS in
|
|
6
|
+
* globals.css can stagger-fade-up the direct children. Reduced-motion users get
|
|
7
|
+
* no animation (the CSS is gated on prefers-reduced-motion). Renders children
|
|
8
|
+
* immediately (SSR-visible) — the effect only adds the entrance animation.
|
|
9
|
+
*/
|
|
10
|
+
export function Reveal({ children, className, }) {
|
|
11
|
+
const ref = useRef(null);
|
|
12
|
+
const [inView, setInView] = useState(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const el = ref.current;
|
|
15
|
+
if (!el)
|
|
16
|
+
return;
|
|
17
|
+
if (typeof IntersectionObserver === "undefined") {
|
|
18
|
+
setInView(true);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const observer = new IntersectionObserver((entries) => {
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (entry.isIntersecting) {
|
|
24
|
+
setInView(true);
|
|
25
|
+
observer.disconnect();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}, { threshold: 0.15, rootMargin: "0px 0px -10% 0px" });
|
|
29
|
+
observer.observe(el);
|
|
30
|
+
return () => observer.disconnect();
|
|
31
|
+
}, []);
|
|
32
|
+
return (_jsx("div", { ref: ref, "data-reveal": inView ? "in" : "out", className: className, children: children }));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=reveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reveal.js","sourceRoot":"","sources":["../../src/shared/reveal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAEpE;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,EACrB,QAAQ,EACR,SAAS,GAIV;IACC,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,OAAO,oBAAoB,KAAK,WAAW,EAAE,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;YACV,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBACzB,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChB,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC,EACD,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,kBAAkB,EAAE,CACpD,CAAC;QACF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,cAAK,GAAG,EAAE,GAAG,iBAAe,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,YACpE,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Section } from "@dani-builder/strapi-client/types";
|
|
3
|
+
interface SectionWrapperProps {
|
|
4
|
+
section: Section | null | undefined;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
hideHeader?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function SectionWrapper({ section, children, className, hideHeader, }: SectionWrapperProps): import("react").JSX.Element;
|
|
10
|
+
export declare function SectionHeader({ section, align: alignOverride, className, }: {
|
|
11
|
+
section: Section | null | undefined;
|
|
12
|
+
/** Overrides the CMS headerAlign (e.g. a block that places the header in a column). */
|
|
13
|
+
align?: "left" | "center" | "right";
|
|
14
|
+
/** Margin/width wrapper classes; default suits a header above the content. */
|
|
15
|
+
className?: string;
|
|
16
|
+
}): import("react").JSX.Element | null;
|
|
17
|
+
export declare function SectionDivider({ section }: {
|
|
18
|
+
section: Section;
|
|
19
|
+
}): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=section-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-wrapper.d.ts","sourceRoot":"","sources":["../../src/shared/section-wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAIjE,UAAU,mBAAmB;IAC3B,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAiBD,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,UAAU,GACX,EAAE,mBAAmB,+BAkCrB;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EAAE,aAAa,EACpB,SAAmB,GACpB,EAAE;IACD,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sCA+BA;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,+BAM/D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Reveal } from "./reveal";
|
|
3
|
+
import { StrapiImage } from "./strapi-image";
|
|
4
|
+
const themeClasses = {
|
|
5
|
+
default: "section-default",
|
|
6
|
+
light: "section-light",
|
|
7
|
+
dark: "section-dark",
|
|
8
|
+
accent: "section-accent",
|
|
9
|
+
muted: "section-muted",
|
|
10
|
+
contrast: "section-contrast",
|
|
11
|
+
};
|
|
12
|
+
const alignClasses = {
|
|
13
|
+
left: "text-left",
|
|
14
|
+
center: "text-center",
|
|
15
|
+
right: "text-right",
|
|
16
|
+
};
|
|
17
|
+
export function SectionWrapper({ section, children, className, hideHeader, }) {
|
|
18
|
+
const theme = section?.theme ?? "default";
|
|
19
|
+
const bgImage = section?.backgroundImage ?? null;
|
|
20
|
+
// Schema stores 0–1. Default 0.5. Legacy rows may hold 0–100, so scale
|
|
21
|
+
// anything > 1 back down by /100 (the field was previously dead because the
|
|
22
|
+
// renderer divided a 0–1 value by 100 → ~0 opacity, hiding the image), then
|
|
23
|
+
// clamp to the valid [0, 1] range.
|
|
24
|
+
const rawOpacity = section?.backgroundImageOpacity ?? 0.5;
|
|
25
|
+
const opacity = Math.min(1, Math.max(0, rawOpacity > 1 ? rawOpacity / 100 : rawOpacity));
|
|
26
|
+
return (_jsxs("section", { id: section?.anchorId ?? undefined, className: `relative py-16 md:py-24 ${themeClasses[theme] ?? ""} ${className ?? ""}`, children: [bgImage && (_jsx("div", { className: "absolute inset-0 overflow-hidden", style: { opacity }, "aria-hidden": "true", children: _jsx(StrapiImage, { asset: bgImage, alt: "", fill: true, sizes: "100vw", className: "object-cover" }) })), _jsxs(Reveal, { className: "relative mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: [!hideHeader && _jsx(SectionHeader, { section: section }), children] })] }));
|
|
27
|
+
}
|
|
28
|
+
export function SectionHeader({ section, align: alignOverride, className = "mb-14", }) {
|
|
29
|
+
if (!section)
|
|
30
|
+
return null;
|
|
31
|
+
const { heading, subheading, kickerText, headerAlign } = section;
|
|
32
|
+
if (!heading && !subheading && !kickerText)
|
|
33
|
+
return null;
|
|
34
|
+
const align = alignOverride
|
|
35
|
+
? alignClasses[alignOverride]
|
|
36
|
+
: headerAlign && headerAlign !== "auto"
|
|
37
|
+
? alignClasses[headerAlign]
|
|
38
|
+
: "text-center";
|
|
39
|
+
return (_jsxs("div", { className: `max-w-2xl ${align === "text-center" ? "mx-auto" : ""} ${align} ${className}`, children: [kickerText && (_jsx("p", { className: "section-kicker mb-4", children: kickerText })), heading && (_jsx("h2", { className: "text-3xl font-semibold tracking-tight text-balance md:text-4xl", children: heading })), subheading && (_jsx("p", { className: "mt-4 text-lg leading-relaxed text-[var(--color-text-muted)]", children: subheading }))] }));
|
|
40
|
+
}
|
|
41
|
+
export function SectionDivider({ section }) {
|
|
42
|
+
return (_jsx(SectionWrapper, { section: section, children: _jsx("div", {}) }));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=section-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-wrapper.js","sourceRoot":"","sources":["../../src/shared/section-wrapper.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,YAAY,GAA2B;IAC3C,OAAO,EAAE,iBAAiB;IAC1B,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;CACpB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,EAC7B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,UAAU,GACU;IACpB,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC;IACjD,uEAAuE;IACvE,4EAA4E;IAC5E,4EAA4E;IAC5E,mCAAmC;IACnC,MAAM,UAAU,GAAG,OAAO,EAAE,sBAAsB,IAAI,GAAG,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAC5D,CAAC;IAEF,OAAO,CACL,mBACE,EAAE,EAAE,OAAO,EAAE,QAAQ,IAAI,SAAS,EAClC,SAAS,EAAE,2BAA2B,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,IAAI,EAAE,EAAE,aAEnF,OAAO,IAAI,CACV,cACE,SAAS,EAAC,kCAAkC,EAC5C,KAAK,EAAE,EAAE,OAAO,EAAE,iBACN,MAAM,YAElB,KAAC,WAAW,IAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,EAAC,IAAI,QAAC,KAAK,EAAC,OAAO,EAAC,SAAS,EAAC,cAAc,GAAG,GAC9E,CACP,EAED,MAAC,MAAM,IAAC,SAAS,EAAC,iDAAiD,aAChE,CAAC,UAAU,IAAI,KAAC,aAAa,IAAC,OAAO,EAAE,OAAO,GAAI,EAClD,QAAQ,IACF,IACD,CACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,KAAK,EAAE,aAAa,EACpB,SAAS,GAAG,OAAO,GAOpB;IACC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACjE,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,KAAK,GAAG,aAAa;QACzB,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC;QAC7B,CAAC,CAAC,WAAW,IAAI,WAAW,KAAK,MAAM;YACrC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC;YAC3B,CAAC,CAAC,aAAa,CAAC;IAEpB,OAAO,CACL,eACE,SAAS,EAAE,aAAa,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,SAAS,EAAE,aAEvF,UAAU,IAAI,CACb,YAAG,SAAS,EAAC,qBAAqB,YAAE,UAAU,GAAK,CACpD,EACA,OAAO,IAAI,CACV,aAAI,SAAS,EAAC,gEAAgE,YAC3E,OAAO,GACL,CACN,EACA,UAAU,IAAI,CACb,YAAG,SAAS,EAAC,6DAA6D,YACvE,UAAU,GACT,CACL,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAwB;IAC9D,OAAO,CACL,KAAC,cAAc,IAAC,OAAO,EAAE,OAAO,YAC9B,eAAO,GACQ,CAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { StrapiMedia } from "@dani-builder/strapi-client/types";
|
|
2
|
+
interface BaseStrapiImageProps {
|
|
3
|
+
asset: StrapiMedia | null | undefined;
|
|
4
|
+
format?: "thumbnail" | "small" | "medium" | "large";
|
|
5
|
+
alt?: string;
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
className?: string;
|
|
9
|
+
priority?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* `sizes` is REQUIRED whenever `fill` is used: a fill image with no sizes
|
|
13
|
+
* silently falls back to next/image's 100vw default, re-introducing the
|
|
14
|
+
* over-fetching this component's callers are meant to avoid (S0-11). The
|
|
15
|
+
* discriminated union makes that a compile error instead of a silent perf bug.
|
|
16
|
+
*/
|
|
17
|
+
type StrapiImageProps = BaseStrapiImageProps & ({
|
|
18
|
+
fill: true;
|
|
19
|
+
sizes: string;
|
|
20
|
+
} | {
|
|
21
|
+
fill?: false;
|
|
22
|
+
sizes?: string;
|
|
23
|
+
});
|
|
24
|
+
export declare function StrapiImage({ asset, format, alt, fill, width, height, className, priority, sizes, }: StrapiImageProps): import("react").JSX.Element | null;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=strapi-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-image.d.ts","sourceRoot":"","sources":["../../src/shared/strapi-image.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGrE,UAAU,oBAAoB;IAC5B,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,KAAK,gBAAgB,GAAG,oBAAoB,GAC1C,CACI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CACnC,CAAC;AAEJ,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,EACR,KAAK,GACN,EAAE,gBAAgB,sCAiDlB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useBlocks } from "../context";
|
|
4
|
+
export function StrapiImage({ asset, format, alt, fill, width, height, className, priority, sizes, }) {
|
|
5
|
+
const { Image, resolveAssetUrl } = useBlocks();
|
|
6
|
+
if (!asset)
|
|
7
|
+
return null;
|
|
8
|
+
const url = resolveAssetUrl(asset, format);
|
|
9
|
+
if (!url)
|
|
10
|
+
return null;
|
|
11
|
+
const altText = alt ?? asset.alternativeText ?? asset.name ?? "";
|
|
12
|
+
if (asset.mime?.startsWith("video/")) {
|
|
13
|
+
return (_jsx("video", { src: url, autoPlay: true, muted: true, loop: true, playsInline: true, className: className }));
|
|
14
|
+
}
|
|
15
|
+
if (fill) {
|
|
16
|
+
return (_jsx(Image, { src: url, alt: altText, fill: true, sizes: sizes, className: className, priority: priority }));
|
|
17
|
+
}
|
|
18
|
+
const imgWidth = width ?? asset.width ?? 800;
|
|
19
|
+
const imgHeight = height ?? asset.height ?? 600;
|
|
20
|
+
return (_jsx(Image, { src: url, alt: altText, width: imgWidth, height: imgHeight, sizes: sizes, className: className, priority: priority }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=strapi-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-image.js","sourceRoot":"","sources":["../../src/shared/strapi-image.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAwBvC,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,QAAQ,EACR,KAAK,GACY;IACjB,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,MAAM,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAEjE,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,OAAO,CACL,gBACE,GAAG,EAAE,GAAG,EACR,QAAQ,QACR,KAAK,QACL,IAAI,QACJ,WAAW,QACX,SAAS,EAAE,SAAS,GACpB,CACH,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CACL,KAAC,KAAK,IACJ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,IAAI,QACJ,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;IAEhD,OAAO,CACL,KAAC,KAAK,IACJ,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Link as LinkType } from "@dani-builder/strapi-client/types";
|
|
3
|
+
interface StrapiLinkProps {
|
|
4
|
+
link: LinkType | null | undefined;
|
|
5
|
+
className?: string;
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare function StrapiLink({ link, className, children }: StrapiLinkProps): import("react").JSX.Element | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=strapi-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-link.d.ts","sourceRoot":"","sources":["../../src/shared/strapi-link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAI1E,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,eAAe,sCAuCxE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { IconRenderer } from "./icon-renderer";
|
|
4
|
+
import { useBlocks } from "../context";
|
|
5
|
+
export function StrapiLink({ link, className, children }) {
|
|
6
|
+
const { Link } = useBlocks();
|
|
7
|
+
if (!link)
|
|
8
|
+
return null;
|
|
9
|
+
const label = children ?? link.label;
|
|
10
|
+
// Render the CMS-selected icon (if any) before the label. Unknown/empty
|
|
11
|
+
// icon values are a no-op inside IconRenderer.
|
|
12
|
+
const content = link.icon ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(IconRenderer, { name: link.icon, className: "h-[1.1em] w-[1.1em] shrink-0" }), label] })) : (label);
|
|
13
|
+
const isExternal = link.newWindow ||
|
|
14
|
+
link.href.startsWith("http://") ||
|
|
15
|
+
link.href.startsWith("https://");
|
|
16
|
+
if (isExternal) {
|
|
17
|
+
return (_jsx("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: className, children: content }));
|
|
18
|
+
}
|
|
19
|
+
return (_jsx(Link, { href: link.href, className: className, children: content }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=strapi-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-link.js","sourceRoot":"","sources":["../../src/shared/strapi-link.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAIb,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAmB;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,KAAK,GAAc,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;IAChD,wEAAwE;IACxE,+CAA+C;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1B,gBAAM,SAAS,EAAC,kCAAkC,aAChD,KAAC,YAAY,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAC,8BAA8B,GAAG,EACzE,KAAK,IACD,CACR,CAAC,CAAC,CAAC,CACF,KAAK,CACN,CAAC;IAEF,MAAM,UAAU,GACd,IAAI,CAAC,SAAS;QACd,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CACL,YACE,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAE,SAAS,YAEnB,OAAO,GACN,CACL,CAAC;IACJ,CAAC;IAED,OAAO,CACL,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,YACxC,OAAO,GACH,CACR,CAAC;AACJ,CAAC"}
|