@booga/vblocks 0.3.0 → 0.3.2
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/CHANGELOG.md +13 -0
- package/dist/blog/index.cjs +4 -4
- package/dist/blog/index.cjs.map +1 -1
- package/dist/blog/index.js +4 -4
- package/dist/blog/index.js.map +1 -1
- package/dist/business/index.cjs +1 -1
- package/dist/business/index.cjs.map +1 -1
- package/dist/business/index.js +1 -1
- package/dist/business/index.js.map +1 -1
- package/dist/faq/index.cjs +1 -1
- package/dist/faq/index.cjs.map +1 -1
- package/dist/faq/index.js +1 -1
- package/dist/faq/index.js.map +1 -1
- package/dist/features/index.cjs +1 -1
- package/dist/features/index.cjs.map +1 -1
- package/dist/features/index.js +1 -1
- package/dist/features/index.js.map +1 -1
- package/dist/index.cjs +14 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -14
- package/dist/index.js.map +1 -1
- package/dist/portfolio/index.cjs +2 -2
- package/dist/portfolio/index.cjs.map +1 -1
- package/dist/portfolio/index.js +2 -2
- package/dist/portfolio/index.js.map +1 -1
- package/dist/post/index.cjs +2 -2
- package/dist/post/index.cjs.map +1 -1
- package/dist/post/index.js +2 -2
- package/dist/post/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/team/index.cjs +1 -1
- package/dist/team/index.cjs.map +1 -1
- package/dist/team/index.js +1 -1
- package/dist/team/index.js.map +1 -1
- package/dist/testimonial/index.cjs +2 -2
- package/dist/testimonial/index.cjs.map +1 -1
- package/dist/testimonial/index.js +2 -2
- package/dist/testimonial/index.js.map +1 -1
- package/package.json +1 -1
package/dist/features/index.cjs
CHANGED
|
@@ -69,7 +69,7 @@ var FeaturesGridContentSchema = zod.z.object({
|
|
|
69
69
|
function FeaturesGrid({ content, theme }) {
|
|
70
70
|
FeaturesGridContentSchema.parse(content);
|
|
71
71
|
const { heading, features } = content;
|
|
72
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
72
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
73
73
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
74
74
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 3, gap: 6, children: features.map((feature, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
|
|
75
75
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/features/FeaturesSplit/schema.ts","../../src/features/FeaturesSplit/index.tsx","../../src/features/FeaturesSplit/default.ts","../../src/features/FeaturesGrid/schema.ts","../../src/features/FeaturesGrid/index.tsx","../../src/features/FeaturesGrid/default.ts"],"names":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","FeatureItemSchema","Card","CardHeader","CardTitle","CardContent"],"mappings":"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","file":"index.cjs","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type ElementType } from \"react\";\nimport { dsl } from \"@booga/vdsl\";\nimport { Box, Stack, Grid, Inline } from \"@booga/vui\";\n\n// PolymorphicComponent is not structurally assignable to ElementType; dsl() uses\n// createElement() at runtime which accepts any callable, so the bridge is safe.\nexport const DBox = dsl(Box as unknown as ElementType);\nexport const DStack = dsl(Stack as unknown as ElementType);\nexport const DGrid = dsl(Grid as unknown as ElementType);\nexport const DInline = dsl(Inline as unknown as ElementType);\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CSSProperties } from \"react\";\nimport { type ThemeOverride } from \"./types\";\n\nexport function themeStyle(theme: ThemeOverride | undefined): CSSProperties | undefined {\n if (!theme) return undefined;\n return Object.fromEntries(\n Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])\n ) as CSSProperties;\n}\n\nexport function clampedGridCols(n: number): 1 | 2 | 3 | 4 | 5 | 6 {\n return Math.max(1, Math.min(6, Math.round(n))) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesSplitContent = z.infer<typeof FeaturesSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesSplitContentSchema, type FeaturesSplitContent } from \"./schema\";\n\nexport function FeaturesSplit({ content, theme }: BlockProps<FeaturesSplitContent>) {\n FeaturesSplitContentSchema.parse(content);\n const { heading, description, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"start\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={4} className={cn(\"sticky top-16\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>{description}</DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={8} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {features.map((feature, i) => (\n <DBox as=\"li\" key={i}>\n <DInline gap={4} align=\"start\">\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl flex-shrink-0 mt-0.5\")} aria-hidden=\"true\">\n {feature.icon}\n </DBox>\n )}\n <DStack gap={1}>\n <DBox as=\"h3\" className={cn(\"font-semibold\")}>{feature.title}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </DStack>\n </DInline>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesSplitContent } from \"./schema\";\n\nexport const FeaturesSplitDefaultContent: FeaturesSplitContent = {\n heading: \"Everything you need\",\n description: \"A complete toolkit for building composable, schema-validated interfaces.\",\n features: [\n { title: \"Schema validation\", description: \"Every block validates content at runtime. Bad data fails fast, before it reaches the DOM.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points keep bundles lean. Import only what the page uses.\", icon: \"⚡\" },\n { title: \"Accessibility first\", description: \"Semantic HTML, ARIA landmarks, and proper heading hierarchy — no patching required.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"Remap CSS custom properties per block without touching global styles.\", icon: \"🎨\" },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesGridContentSchema = z.object({\n heading: z.string(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesGridContent = z.infer<typeof FeaturesGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Card, CardContent, CardHeader, CardTitle, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesGridContentSchema, type FeaturesGridContent } from \"./schema\";\n\nexport function FeaturesGrid({ content, theme }: BlockProps<FeaturesGridContent>) {\n FeaturesGridContentSchema.parse(content);\n const { heading, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={16} className={cn(\"max-w-5xl mx-auto gap-10\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight text-center\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {features.map((feature, i) => (\n <Card key={i}>\n <CardHeader>\n <DStack gap={2}>\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl\")} aria-hidden=\"true\">{feature.icon}</DBox>\n )}\n <CardTitle as=\"h3\">{feature.title}</CardTitle>\n </DStack>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </CardContent>\n </Card>\n ))}\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesGridContent } from \"./schema\";\n\nexport const FeaturesGridDefaultContent: FeaturesGridContent = {\n heading: \"Built-in capabilities\",\n features: [\n { title: \"Schema validation\", description: \"Content validated at runtime via Zod.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points, lean bundles.\", icon: \"⚡\" },\n { title: \"Accessibility\", description: \"Semantic HTML and ARIA by default.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"CSS custom properties per block.\", icon: \"🎨\" },\n { title: \"TypeScript\", description: \"All schemas export their inferred types.\", icon: \"🔷\" },\n { title: \"Zero config\", description: \"Drop in. Pass content. Done.\", icon: \"▶️\" },\n ],\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/features/FeaturesSplit/schema.ts","../../src/features/FeaturesSplit/index.tsx","../../src/features/FeaturesSplit/default.ts","../../src/features/FeaturesGrid/schema.ts","../../src/features/FeaturesGrid/index.tsx","../../src/features/FeaturesGrid/default.ts"],"names":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","FeatureItemSchema","Card","CardHeader","CardTitle","CardContent"],"mappings":"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","file":"index.cjs","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type ElementType } from \"react\";\nimport { dsl } from \"@booga/vdsl\";\nimport { Box, Stack, Grid, Inline } from \"@booga/vui\";\n\n// PolymorphicComponent is not structurally assignable to ElementType; dsl() uses\n// createElement() at runtime which accepts any callable, so the bridge is safe.\nexport const DBox = dsl(Box as unknown as ElementType);\nexport const DStack = dsl(Stack as unknown as ElementType);\nexport const DGrid = dsl(Grid as unknown as ElementType);\nexport const DInline = dsl(Inline as unknown as ElementType);\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CSSProperties } from \"react\";\nimport { type ThemeOverride } from \"./types\";\n\nexport function themeStyle(theme: ThemeOverride | undefined): CSSProperties | undefined {\n if (!theme) return undefined;\n return Object.fromEntries(\n Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])\n ) as CSSProperties;\n}\n\nexport function clampedGridCols(n: number): 1 | 2 | 3 | 4 | 5 | 6 {\n return Math.max(1, Math.min(6, Math.round(n))) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesSplitContent = z.infer<typeof FeaturesSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesSplitContentSchema, type FeaturesSplitContent } from \"./schema\";\n\nexport function FeaturesSplit({ content, theme }: BlockProps<FeaturesSplitContent>) {\n FeaturesSplitContentSchema.parse(content);\n const { heading, description, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"start\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={4} className={cn(\"sticky top-16\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>{description}</DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={8} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {features.map((feature, i) => (\n <DBox as=\"li\" key={i}>\n <DInline gap={4} align=\"start\">\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl flex-shrink-0 mt-0.5\")} aria-hidden=\"true\">\n {feature.icon}\n </DBox>\n )}\n <DStack gap={1}>\n <DBox as=\"h3\" className={cn(\"font-semibold\")}>{feature.title}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </DStack>\n </DInline>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesSplitContent } from \"./schema\";\n\nexport const FeaturesSplitDefaultContent: FeaturesSplitContent = {\n heading: \"Everything you need\",\n description: \"A complete toolkit for building composable, schema-validated interfaces.\",\n features: [\n { title: \"Schema validation\", description: \"Every block validates content at runtime. Bad data fails fast, before it reaches the DOM.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points keep bundles lean. Import only what the page uses.\", icon: \"⚡\" },\n { title: \"Accessibility first\", description: \"Semantic HTML, ARIA landmarks, and proper heading hierarchy — no patching required.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"Remap CSS custom properties per block without touching global styles.\", icon: \"🎨\" },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesGridContentSchema = z.object({\n heading: z.string(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesGridContent = z.infer<typeof FeaturesGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Card, CardContent, CardHeader, CardTitle, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesGridContentSchema, type FeaturesGridContent } from \"./schema\";\n\nexport function FeaturesGrid({ content, theme }: BlockProps<FeaturesGridContent>) {\n FeaturesGridContentSchema.parse(content);\n const { heading, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={16} className={cn(\"max-w-6xl mx-auto gap-10\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight text-center\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {features.map((feature, i) => (\n <Card key={i}>\n <CardHeader>\n <DStack gap={2}>\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl\")} aria-hidden=\"true\">{feature.icon}</DBox>\n )}\n <CardTitle as=\"h3\">{feature.title}</CardTitle>\n </DStack>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </CardContent>\n </Card>\n ))}\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesGridContent } from \"./schema\";\n\nexport const FeaturesGridDefaultContent: FeaturesGridContent = {\n heading: \"Built-in capabilities\",\n features: [\n { title: \"Schema validation\", description: \"Content validated at runtime via Zod.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points, lean bundles.\", icon: \"⚡\" },\n { title: \"Accessibility\", description: \"Semantic HTML and ARIA by default.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"CSS custom properties per block.\", icon: \"🎨\" },\n { title: \"TypeScript\", description: \"All schemas export their inferred types.\", icon: \"🔷\" },\n { title: \"Zero config\", description: \"Drop in. Pass content. Done.\", icon: \"▶️\" },\n ],\n};\n"]}
|
package/dist/features/index.js
CHANGED
|
@@ -67,7 +67,7 @@ var FeaturesGridContentSchema = z.object({
|
|
|
67
67
|
function FeaturesGrid({ content, theme }) {
|
|
68
68
|
FeaturesGridContentSchema.parse(content);
|
|
69
69
|
const { heading, features } = content;
|
|
70
|
-
return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DStack, { px: 6, py: 16, className: cn("max-w-
|
|
70
|
+
return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DStack, { px: 6, py: 16, className: cn("max-w-6xl mx-auto gap-10"), children: [
|
|
71
71
|
/* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
72
72
|
/* @__PURE__ */ jsx(DGrid, { columns: 3, gap: 6, children: features.map((feature, i) => /* @__PURE__ */ jsxs(Card, { children: [
|
|
73
73
|
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(DStack, { gap: 2, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/features/FeaturesSplit/schema.ts","../../src/features/FeaturesSplit/index.tsx","../../src/features/FeaturesSplit/default.ts","../../src/features/FeaturesGrid/schema.ts","../../src/features/FeaturesGrid/index.tsx","../../src/features/FeaturesGrid/default.ts"],"names":["FeatureItemSchema","z","jsx","jsxs","cn"],"mappings":";;;;;;AAQO,IAAM,IAAA,GAAU,IAAI,GAAgC,CAAA;AACpD,IAAM,MAAA,GAAU,IAAI,KAAgC,CAAA;AACpD,IAAM,KAAA,GAAU,IAAI,IAAgC,CAAA;AACpD,IAAM,OAAA,GAAU,IAAI,MAAgC,CAAA;;;ACNpD,SAAS,WAAW,KAAA,EAA6D;AACtF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC;AAAA,GACvD;AACF;ACNA,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,EAChB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC,EAAE,MAAA,EAAO;AAEH,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EACjD,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,UAAU,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,CAAE,IAAI,CAAC;AAC5C,CAAC,EAAE,MAAA;ACNI,SAAS,aAAA,CAAc,EAAE,OAAA,EAAS,KAAA,EAAM,EAAqC;AAClF,EAAA,0BAAA,CAA2B,MAAM,OAAO,CAAA;AACxC,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,QAAA,EAAS,GAAI,OAAA;AAC3C,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,SAAA,EAAU,YAAA,EAAY,SAAS,KAAA,EAAO,UAAA,CAAW,KAAK,CAAA,EAC7D,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,SAAS,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,mBAAmB,CAAA,EACxF,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,UAAO,GAAA,EAAK,CAAA,EAAG,SAAA,EAAW,EAAA,CAAG,eAAe,CAAA,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,EAAA,EAAG,IAAA,EAAK,WAAW,EAAA,CAAG,mCAAmC,GAAI,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MAC1E,WAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAI,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAEtE,CAAA;AAAA,oBACA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAA,EAAQ,MAAA,EAAO,WAAW,EAAA,CAAG,oBAAoB,CAAA,EAChF,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBACtB,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EACP,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,OAAM,OAAA,EACpB,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,IAAA,oBACP,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,SAAA,EAAW,EAAA,CAAG,8BAA8B,CAAA,EAAG,aAAA,EAAY,MAAA,EACxE,QAAA,EAAA,OAAA,CAAQ,IAAA,EACX,CAAA;AAAA,sBAEF,IAAA,CAAC,MAAA,EAAA,EAAO,GAAA,EAAK,CAAA,EACX,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAG,IAAA,EAAK,SAAA,EAAW,GAAG,eAAe,CAAA,EAAI,kBAAQ,KAAA,EAAM,CAAA;AAAA,wBAC7D,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,OAAA,EAC5E;AAAA,KAAA,EACF,CAAA,EAAA,EAXiB,CAYnB,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;ACpCO,IAAM,2BAAA,GAAoD;AAAA,EAC/D,OAAA,EAAS,qBAAA;AAAA,EACT,WAAA,EAAa,0EAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR,EAAE,KAAA,EAAO,mBAAA,EAAqB,WAAA,EAAa,2FAAA,EAA6F,MAAM,QAAA,EAAI;AAAA,IAClJ,EAAE,KAAA,EAAO,cAAA,EAAgB,WAAA,EAAa,8EAAA,EAAgF,MAAM,QAAA,EAAI;AAAA,IAChI,EAAE,KAAA,EAAO,qBAAA,EAAuB,WAAA,EAAa,0FAAA,EAAuF,MAAM,QAAA,EAAI;AAAA,IAC9I,EAAE,KAAA,EAAO,iBAAA,EAAmB,WAAA,EAAa,uEAAA,EAAyE,MAAM,WAAA;AAAK;AAEjI;ACTA,IAAMA,kBAAAA,GAAoBC,EAAE,MAAA,CAAO;AAAA,EACjC,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,EAChB,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,EACtB,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC,EAAE,MAAA,EAAO;AAEH,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,UAAUA,CAAAA,CAAE,KAAA,CAAMD,kBAAiB,CAAA,CAAE,IAAI,CAAC;AAC5C,CAAC,EAAE,MAAA;ACLI,SAAS,YAAA,CAAa,EAAE,OAAA,EAAS,KAAA,EAAM,EAAoC;AAChF,EAAA,yBAAA,CAA0B,MAAM,OAAO,CAAA;AACvC,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,OAAA;AAC9B,EAAA,uBACEE,IAAC,IAAA,EAAA,EAAK,EAAA,EAAG,WAAU,YAAA,EAAY,OAAA,EAAS,OAAO,UAAA,CAAW,KAAK,GAC7D,QAAA,kBAAAC,IAAAA,CAAC,UAAO,EAAA,EAAI,CAAA,EAAG,IAAI,EAAA,EAAI,SAAA,EAAWC,EAAAA,CAAG,0BAA0B,CAAA,EAC7D,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,QAAK,EAAA,EAAG,IAAA,EAAK,WAAWE,EAAAA,CAAG,+CAA+C,GAAI,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBACvFF,GAAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,GAAG,GAAA,EAAK,CAAA,EACrB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBACtBC,KAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,IAAC,UAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAAC,MAAA,EAAA,EAAO,KAAK,CAAA,EACV,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,IAAA,oBACPD,GAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,MAAA,EAAO,SAAA,EAAWE,EAAAA,CAAG,SAAS,CAAA,EAAG,aAAA,EAAY,MAAA,EAAQ,kBAAQ,IAAA,EAAK,CAAA;AAAA,wBAE7EF,GAAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAG,IAAA,EAAM,kBAAQ,KAAA,EAAM;AAAA,OAAA,EACpC,CAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,QAAK,EAAA,EAAG,GAAA,EAAI,KAAA,EAAM,OAAA,EAAQ,WAAWE,EAAAA,CAAG,SAAS,CAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,aAAY,CAAA,EAC5E;AAAA,KAAA,EAAA,EAXS,CAYX,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;;;AC/BO,IAAM,0BAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS,uBAAA;AAAA,EACT,QAAA,EAAU;AAAA,IACR,EAAE,KAAA,EAAO,mBAAA,EAAqB,WAAA,EAAa,uCAAA,EAAyC,MAAM,QAAA,EAAI;AAAA,IAC9F,EAAE,KAAA,EAAO,cAAA,EAAgB,WAAA,EAAa,0CAAA,EAA4C,MAAM,QAAA,EAAI;AAAA,IAC5F,EAAE,KAAA,EAAO,eAAA,EAAiB,WAAA,EAAa,oCAAA,EAAsC,MAAM,QAAA,EAAI;AAAA,IACvF,EAAE,KAAA,EAAO,iBAAA,EAAmB,WAAA,EAAa,kCAAA,EAAoC,MAAM,WAAA,EAAK;AAAA,IACxF,EAAE,KAAA,EAAO,YAAA,EAAc,WAAA,EAAa,0CAAA,EAA4C,MAAM,WAAA,EAAK;AAAA,IAC3F,EAAE,KAAA,EAAO,aAAA,EAAe,WAAA,EAAa,8BAAA,EAAgC,MAAM,cAAA;AAAK;AAEpF","file":"index.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type ElementType } from \"react\";\nimport { dsl } from \"@booga/vdsl\";\nimport { Box, Stack, Grid, Inline } from \"@booga/vui\";\n\n// PolymorphicComponent is not structurally assignable to ElementType; dsl() uses\n// createElement() at runtime which accepts any callable, so the bridge is safe.\nexport const DBox = dsl(Box as unknown as ElementType);\nexport const DStack = dsl(Stack as unknown as ElementType);\nexport const DGrid = dsl(Grid as unknown as ElementType);\nexport const DInline = dsl(Inline as unknown as ElementType);\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CSSProperties } from \"react\";\nimport { type ThemeOverride } from \"./types\";\n\nexport function themeStyle(theme: ThemeOverride | undefined): CSSProperties | undefined {\n if (!theme) return undefined;\n return Object.fromEntries(\n Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])\n ) as CSSProperties;\n}\n\nexport function clampedGridCols(n: number): 1 | 2 | 3 | 4 | 5 | 6 {\n return Math.max(1, Math.min(6, Math.round(n))) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesSplitContent = z.infer<typeof FeaturesSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesSplitContentSchema, type FeaturesSplitContent } from \"./schema\";\n\nexport function FeaturesSplit({ content, theme }: BlockProps<FeaturesSplitContent>) {\n FeaturesSplitContentSchema.parse(content);\n const { heading, description, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"start\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={4} className={cn(\"sticky top-16\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>{description}</DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={8} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {features.map((feature, i) => (\n <DBox as=\"li\" key={i}>\n <DInline gap={4} align=\"start\">\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl flex-shrink-0 mt-0.5\")} aria-hidden=\"true\">\n {feature.icon}\n </DBox>\n )}\n <DStack gap={1}>\n <DBox as=\"h3\" className={cn(\"font-semibold\")}>{feature.title}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </DStack>\n </DInline>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesSplitContent } from \"./schema\";\n\nexport const FeaturesSplitDefaultContent: FeaturesSplitContent = {\n heading: \"Everything you need\",\n description: \"A complete toolkit for building composable, schema-validated interfaces.\",\n features: [\n { title: \"Schema validation\", description: \"Every block validates content at runtime. Bad data fails fast, before it reaches the DOM.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points keep bundles lean. Import only what the page uses.\", icon: \"⚡\" },\n { title: \"Accessibility first\", description: \"Semantic HTML, ARIA landmarks, and proper heading hierarchy — no patching required.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"Remap CSS custom properties per block without touching global styles.\", icon: \"🎨\" },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesGridContentSchema = z.object({\n heading: z.string(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesGridContent = z.infer<typeof FeaturesGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Card, CardContent, CardHeader, CardTitle, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesGridContentSchema, type FeaturesGridContent } from \"./schema\";\n\nexport function FeaturesGrid({ content, theme }: BlockProps<FeaturesGridContent>) {\n FeaturesGridContentSchema.parse(content);\n const { heading, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={16} className={cn(\"max-w-5xl mx-auto gap-10\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight text-center\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {features.map((feature, i) => (\n <Card key={i}>\n <CardHeader>\n <DStack gap={2}>\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl\")} aria-hidden=\"true\">{feature.icon}</DBox>\n )}\n <CardTitle as=\"h3\">{feature.title}</CardTitle>\n </DStack>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </CardContent>\n </Card>\n ))}\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesGridContent } from \"./schema\";\n\nexport const FeaturesGridDefaultContent: FeaturesGridContent = {\n heading: \"Built-in capabilities\",\n features: [\n { title: \"Schema validation\", description: \"Content validated at runtime via Zod.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points, lean bundles.\", icon: \"⚡\" },\n { title: \"Accessibility\", description: \"Semantic HTML and ARIA by default.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"CSS custom properties per block.\", icon: \"🎨\" },\n { title: \"TypeScript\", description: \"All schemas export their inferred types.\", icon: \"🔷\" },\n { title: \"Zero config\", description: \"Drop in. Pass content. Done.\", icon: \"▶️\" },\n ],\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/features/FeaturesSplit/schema.ts","../../src/features/FeaturesSplit/index.tsx","../../src/features/FeaturesSplit/default.ts","../../src/features/FeaturesGrid/schema.ts","../../src/features/FeaturesGrid/index.tsx","../../src/features/FeaturesGrid/default.ts"],"names":["FeatureItemSchema","z","jsx","jsxs","cn"],"mappings":"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","file":"index.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type ElementType } from \"react\";\nimport { dsl } from \"@booga/vdsl\";\nimport { Box, Stack, Grid, Inline } from \"@booga/vui\";\n\n// PolymorphicComponent is not structurally assignable to ElementType; dsl() uses\n// createElement() at runtime which accepts any callable, so the bridge is safe.\nexport const DBox = dsl(Box as unknown as ElementType);\nexport const DStack = dsl(Stack as unknown as ElementType);\nexport const DGrid = dsl(Grid as unknown as ElementType);\nexport const DInline = dsl(Inline as unknown as ElementType);\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CSSProperties } from \"react\";\nimport { type ThemeOverride } from \"./types\";\n\nexport function themeStyle(theme: ThemeOverride | undefined): CSSProperties | undefined {\n if (!theme) return undefined;\n return Object.fromEntries(\n Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])\n ) as CSSProperties;\n}\n\nexport function clampedGridCols(n: number): 1 | 2 | 3 | 4 | 5 | 6 {\n return Math.max(1, Math.min(6, Math.round(n))) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesSplitContent = z.infer<typeof FeaturesSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesSplitContentSchema, type FeaturesSplitContent } from \"./schema\";\n\nexport function FeaturesSplit({ content, theme }: BlockProps<FeaturesSplitContent>) {\n FeaturesSplitContentSchema.parse(content);\n const { heading, description, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"start\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={4} className={cn(\"sticky top-16\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>{description}</DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={8} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {features.map((feature, i) => (\n <DBox as=\"li\" key={i}>\n <DInline gap={4} align=\"start\">\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl flex-shrink-0 mt-0.5\")} aria-hidden=\"true\">\n {feature.icon}\n </DBox>\n )}\n <DStack gap={1}>\n <DBox as=\"h3\" className={cn(\"font-semibold\")}>{feature.title}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </DStack>\n </DInline>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesSplitContent } from \"./schema\";\n\nexport const FeaturesSplitDefaultContent: FeaturesSplitContent = {\n heading: \"Everything you need\",\n description: \"A complete toolkit for building composable, schema-validated interfaces.\",\n features: [\n { title: \"Schema validation\", description: \"Every block validates content at runtime. Bad data fails fast, before it reaches the DOM.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points keep bundles lean. Import only what the page uses.\", icon: \"⚡\" },\n { title: \"Accessibility first\", description: \"Semantic HTML, ARIA landmarks, and proper heading hierarchy — no patching required.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"Remap CSS custom properties per block without touching global styles.\", icon: \"🎨\" },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FeatureItemSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const FeaturesGridContentSchema = z.object({\n heading: z.string(),\n features: z.array(FeatureItemSchema).min(1),\n}).strict();\n\nexport type FeaturesGridContent = z.infer<typeof FeaturesGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Card, CardContent, CardHeader, CardTitle, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FeaturesGridContentSchema, type FeaturesGridContent } from \"./schema\";\n\nexport function FeaturesGrid({ content, theme }: BlockProps<FeaturesGridContent>) {\n FeaturesGridContentSchema.parse(content);\n const { heading, features } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={16} className={cn(\"max-w-6xl mx-auto gap-10\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight text-center\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {features.map((feature, i) => (\n <Card key={i}>\n <CardHeader>\n <DStack gap={2}>\n {feature.icon && (\n <DBox as=\"span\" className={cn(\"text-xl\")} aria-hidden=\"true\">{feature.icon}</DBox>\n )}\n <CardTitle as=\"h3\">{feature.title}</CardTitle>\n </DStack>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{feature.description}</DBox>\n </CardContent>\n </Card>\n ))}\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FeaturesGridContent } from \"./schema\";\n\nexport const FeaturesGridDefaultContent: FeaturesGridContent = {\n heading: \"Built-in capabilities\",\n features: [\n { title: \"Schema validation\", description: \"Content validated at runtime via Zod.\", icon: \"✓\" },\n { title: \"Tree-shaking\", description: \"Per-category entry points, lean bundles.\", icon: \"⚡\" },\n { title: \"Accessibility\", description: \"Semantic HTML and ARIA by default.\", icon: \"♿\" },\n { title: \"Theme overrides\", description: \"CSS custom properties per block.\", icon: \"🎨\" },\n { title: \"TypeScript\", description: \"All schemas export their inferred types.\", icon: \"🔷\" },\n { title: \"Zero config\", description: \"Drop in. Pass content. Done.\", icon: \"▶️\" },\n ],\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -206,7 +206,7 @@ var FaqGridContentSchema = zod.z.object({
|
|
|
206
206
|
function FaqGrid({ content, theme }) {
|
|
207
207
|
FaqGridContentSchema.parse(content);
|
|
208
208
|
const { heading, items } = content;
|
|
209
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
209
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
210
210
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
211
211
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 2, gap: 4, children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
|
|
212
212
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(vui.CardTitle, { as: "h3", children: item.question }) }),
|
|
@@ -406,7 +406,7 @@ function PortfolioSplit({ content, theme }) {
|
|
|
406
406
|
}
|
|
407
407
|
),
|
|
408
408
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, pt: 2, children: [
|
|
409
|
-
/* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: item.category }),
|
|
409
|
+
/* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: item.category }),
|
|
410
410
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h3", className: vui.cn("font-semibold text-lg"), children: item.title })
|
|
411
411
|
] }) })
|
|
412
412
|
] }, i)) })
|
|
@@ -445,7 +445,7 @@ function PortfolioGrid({ content, theme }) {
|
|
|
445
445
|
}
|
|
446
446
|
),
|
|
447
447
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, pt: 2, children: [
|
|
448
|
-
/* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: item.category }),
|
|
448
|
+
/* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: item.category }),
|
|
449
449
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h3", className: vui.cn("font-semibold text-lg"), children: item.title })
|
|
450
450
|
] }) })
|
|
451
451
|
] }, i)) }) });
|
|
@@ -473,7 +473,7 @@ function PostSplit({ content, theme }) {
|
|
|
473
473
|
const { title, author, date, category, body, image } = content;
|
|
474
474
|
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 16, align: "start", className: vui.cn("max-w-6xl mx-auto"), children: [
|
|
475
475
|
/* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 6, className: vui.cn("sticky top-16"), children: [
|
|
476
|
-
category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: category }),
|
|
476
|
+
category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: category }),
|
|
477
477
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h1", className: vui.cn("text-3xl font-bold tracking-tight leading-snug"), children: title }),
|
|
478
478
|
/* @__PURE__ */ jsxRuntime.jsx(vui.Separator, {}),
|
|
479
479
|
/* @__PURE__ */ jsxRuntime.jsxs(DInline, { gap: 2, color: "muted", className: vui.cn("text-sm"), children: [
|
|
@@ -517,7 +517,7 @@ function PostCentered({ content, theme }) {
|
|
|
517
517
|
PostCenteredContentSchema.parse(content);
|
|
518
518
|
const { title, author, date, category, body } = content;
|
|
519
519
|
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, gap: 6, className: vui.cn("max-w-2xl mx-auto"), children: [
|
|
520
|
-
category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: category }),
|
|
520
|
+
category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: category }),
|
|
521
521
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h1", className: vui.cn("text-4xl font-bold tracking-tight leading-snug"), children: title }),
|
|
522
522
|
/* @__PURE__ */ jsxRuntime.jsxs(DInline, { gap: 2, color: "muted", className: vui.cn("text-sm"), children: [
|
|
523
523
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: author }),
|
|
@@ -592,7 +592,7 @@ var TeamGridContentSchema = zod.z.object({
|
|
|
592
592
|
function TeamGrid({ content, theme }) {
|
|
593
593
|
TeamGridContentSchema.parse(content);
|
|
594
594
|
const { heading, members } = content;
|
|
595
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
595
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
596
596
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
597
597
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 3, gap: 6, children: members.map((member, i) => /* @__PURE__ */ jsxRuntime.jsx(vui.Card, { children: /* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 3, align: "center", pt: 4, className: vui.cn("text-center"), children: [
|
|
598
598
|
/* @__PURE__ */ jsxRuntime.jsxs(vui.Avatar, { className: vui.cn("w-16 h-16"), children: [
|
|
@@ -627,7 +627,7 @@ var TestimonialSplitContentSchema = zod.z.object({
|
|
|
627
627
|
function TestimonialSplit({ content, theme }) {
|
|
628
628
|
TestimonialSplitContentSchema.parse(content);
|
|
629
629
|
const { quote, author, role, company, avatar } = content;
|
|
630
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": "Testimonial", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, gap: 16, align: "center", className: vui.cn("max-w-
|
|
630
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": "Testimonial", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, gap: 16, align: "center", className: vui.cn("max-w-6xl mx-auto py-20"), children: [
|
|
631
631
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
632
632
|
DBox,
|
|
633
633
|
{
|
|
@@ -677,7 +677,7 @@ var TestimonialGridContentSchema = zod.z.object({
|
|
|
677
677
|
function TestimonialGrid({ content, theme }) {
|
|
678
678
|
TestimonialGridContentSchema.parse(content);
|
|
679
679
|
const { heading, items } = content;
|
|
680
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
680
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
681
681
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
682
682
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 3, gap: 6, children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(vui.Card, { children: /* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 4, pt: 4, children: [
|
|
683
683
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "blockquote", className: vui.cn("text-sm leading-relaxed"), children: /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", children: item.quote }) }),
|
|
@@ -736,7 +736,7 @@ function BlogSplit({ content, theme }) {
|
|
|
736
736
|
}
|
|
737
737
|
),
|
|
738
738
|
/* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
|
|
739
|
-
featured.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: featured.category }),
|
|
739
|
+
featured.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: featured.category }),
|
|
740
740
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h3", className: vui.cn("text-xl font-semibold"), children: featured.title }),
|
|
741
741
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", children: featured.excerpt }),
|
|
742
742
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "time", dateTime: featured.date, color: "muted", className: vui.cn("text-xs"), children: featured.date })
|
|
@@ -753,7 +753,7 @@ function BlogSplit({ content, theme }) {
|
|
|
753
753
|
}
|
|
754
754
|
),
|
|
755
755
|
/* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 1, children: [
|
|
756
|
-
post.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: post.category }),
|
|
756
|
+
post.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: post.category }),
|
|
757
757
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h3", className: vui.cn("font-semibold leading-snug"), children: post.title }),
|
|
758
758
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "time", dateTime: post.date, color: "muted", className: vui.cn("text-xs"), children: post.date })
|
|
759
759
|
] })
|
|
@@ -798,7 +798,7 @@ function BlogGrid({ content, theme }) {
|
|
|
798
798
|
}
|
|
799
799
|
),
|
|
800
800
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, pt: 2, children: [
|
|
801
|
-
post.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: post.category }),
|
|
801
|
+
post.category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", className: vui.cn("self-start"), children: post.category }),
|
|
802
802
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h3", className: vui.cn("font-semibold leading-snug"), children: post.title }),
|
|
803
803
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-sm"), children: post.excerpt }),
|
|
804
804
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "time", dateTime: post.date, color: "muted", className: vui.cn("text-xs"), children: post.date })
|
|
@@ -812,7 +812,7 @@ var BlogGridDefaultContent = {
|
|
|
812
812
|
heading: "From the blog",
|
|
813
813
|
posts: [
|
|
814
814
|
{ title: "Designing for composability", excerpt: "Modular thinking at scale.", date: "2026-05-01", category: "Design", image: { src: "https://placehold.co/480x320", alt: "Design post" } },
|
|
815
|
-
{ title: "Type-safe content at runtime", excerpt: "Zod as single source of truth.", date: "2026-04-18", image: { src: "https://placehold.co/480x320", alt: "Types post" } },
|
|
815
|
+
{ title: "Type-safe content at runtime", excerpt: "Zod as single source of truth.", date: "2026-04-18", category: "Engineering", image: { src: "https://placehold.co/480x320", alt: "Types post" } },
|
|
816
816
|
{ title: "Tree-shaking section blocks", excerpt: "Lean bundles, per-category entry points.", date: "2026-04-05", category: "Engineering", image: { src: "https://placehold.co/480x320", alt: "Bundling post" } }
|
|
817
817
|
]
|
|
818
818
|
};
|
|
@@ -876,7 +876,7 @@ var BusinessGridContentSchema = zod.z.object({
|
|
|
876
876
|
function BusinessGrid({ content, theme }) {
|
|
877
877
|
BusinessGridContentSchema.parse(content);
|
|
878
878
|
const { heading, services } = content;
|
|
879
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
879
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
880
880
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
881
881
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 2, gap: 6, children: services.map((service, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
|
|
882
882
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
|
|
@@ -949,7 +949,7 @@ var FeaturesGridContentSchema = zod.z.object({
|
|
|
949
949
|
function FeaturesGrid({ content, theme }) {
|
|
950
950
|
FeaturesGridContentSchema.parse(content);
|
|
951
951
|
const { heading, features } = content;
|
|
952
|
-
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-
|
|
952
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, className: vui.cn("max-w-6xl mx-auto gap-10"), children: [
|
|
953
953
|
/* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
|
|
954
954
|
/* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 3, gap: 6, children: features.map((feature, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
|
|
955
955
|
/* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
|