@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.
@@ -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-5xl mx-auto gap-10"), children: [
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"]}
@@ -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-5xl mx-auto gap-10"), children: [
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":"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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-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-5xl mx-auto gap-10"), children: [
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-5xl mx-auto gap-10"), children: [
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-5xl mx-auto py-20"), children: [
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-5xl mx-auto gap-10"), children: [
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-5xl mx-auto gap-10"), children: [
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-5xl mx-auto gap-10"), children: [
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: [