@booga/vblocks 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +83 -0
  4. package/dist/blog/index.cjs +148 -0
  5. package/dist/blog/index.cjs.map +1 -0
  6. package/dist/blog/index.d.cts +140 -0
  7. package/dist/blog/index.d.ts +140 -0
  8. package/dist/blog/index.js +141 -0
  9. package/dist/blog/index.js.map +1 -0
  10. package/dist/business/index.cjs +121 -0
  11. package/dist/business/index.cjs.map +1 -0
  12. package/dist/business/index.d.cts +102 -0
  13. package/dist/business/index.d.ts +102 -0
  14. package/dist/business/index.js +114 -0
  15. package/dist/business/index.js.map +1 -0
  16. package/dist/cta/index.cjs +99 -0
  17. package/dist/cta/index.cjs.map +1 -0
  18. package/dist/cta/index.d.cts +110 -0
  19. package/dist/cta/index.d.ts +110 -0
  20. package/dist/cta/index.js +92 -0
  21. package/dist/cta/index.js.map +1 -0
  22. package/dist/faq/index.cjs +93 -0
  23. package/dist/faq/index.cjs.map +1 -0
  24. package/dist/faq/index.d.cts +71 -0
  25. package/dist/faq/index.d.ts +71 -0
  26. package/dist/faq/index.js +86 -0
  27. package/dist/faq/index.js.map +1 -0
  28. package/dist/features/index.cjs +104 -0
  29. package/dist/features/index.cjs.map +1 -0
  30. package/dist/features/index.d.cts +81 -0
  31. package/dist/features/index.d.ts +81 -0
  32. package/dist/features/index.js +97 -0
  33. package/dist/features/index.js.map +1 -0
  34. package/dist/footer/index.cjs +117 -0
  35. package/dist/footer/index.cjs.map +1 -0
  36. package/dist/footer/index.d.cts +107 -0
  37. package/dist/footer/index.d.ts +107 -0
  38. package/dist/footer/index.js +110 -0
  39. package/dist/footer/index.js.map +1 -0
  40. package/dist/gallery/index.cjs +106 -0
  41. package/dist/gallery/index.cjs.map +1 -0
  42. package/dist/gallery/index.d.cts +78 -0
  43. package/dist/gallery/index.d.ts +78 -0
  44. package/dist/gallery/index.js +99 -0
  45. package/dist/gallery/index.js.map +1 -0
  46. package/dist/hero/index.cjs +108 -0
  47. package/dist/hero/index.cjs.map +1 -0
  48. package/dist/hero/index.d.cts +134 -0
  49. package/dist/hero/index.d.ts +134 -0
  50. package/dist/hero/index.js +101 -0
  51. package/dist/hero/index.js.map +1 -0
  52. package/dist/index.cjs +1079 -0
  53. package/dist/index.cjs.map +1 -0
  54. package/dist/index.d.cts +22 -0
  55. package/dist/index.d.ts +22 -0
  56. package/dist/index.js +1005 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/portfolio/index.cjs +122 -0
  59. package/dist/portfolio/index.cjs.map +1 -0
  60. package/dist/portfolio/index.d.cts +120 -0
  61. package/dist/portfolio/index.d.ts +120 -0
  62. package/dist/portfolio/index.js +115 -0
  63. package/dist/portfolio/index.js.map +1 -0
  64. package/dist/post/index.cjs +116 -0
  65. package/dist/post/index.cjs.map +1 -0
  66. package/dist/post/index.d.cts +74 -0
  67. package/dist/post/index.d.ts +74 -0
  68. package/dist/post/index.js +109 -0
  69. package/dist/post/index.js.map +1 -0
  70. package/dist/team/index.cjs +120 -0
  71. package/dist/team/index.cjs.map +1 -0
  72. package/dist/team/index.d.cts +128 -0
  73. package/dist/team/index.d.ts +128 -0
  74. package/dist/team/index.js +113 -0
  75. package/dist/team/index.js.map +1 -0
  76. package/dist/testimonial/index.cjs +130 -0
  77. package/dist/testimonial/index.cjs.map +1 -0
  78. package/dist/testimonial/index.d.cts +113 -0
  79. package/dist/testimonial/index.d.ts +113 -0
  80. package/dist/testimonial/index.js +123 -0
  81. package/dist/testimonial/index.js.map +1 -0
  82. package/dist/types-n6w6cZmP.d.cts +16 -0
  83. package/dist/types-n6w6cZmP.d.ts +16 -0
  84. package/package.json +126 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/business/BusinessSplit/schema.ts","../../src/business/BusinessSplit/index.tsx","../../src/business/BusinessSplit/default.ts","../../src/business/BusinessGrid/schema.ts","../../src/business/BusinessGrid/index.tsx","../../src/business/BusinessGrid/default.ts"],"names":["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\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n}).strict();\n\nexport const ImageSchema = z.object({\n src: z.string(),\n alt: z.string(),\n}).strict();\n\nexport const AvatarSchema = ImageSchema;\n\nexport type Cta = z.infer<typeof CtaSchema>;\nexport type Image = z.infer<typeof ImageSchema>;\nexport type AvatarSrc = Image;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { ImageSchema } from \"../../shared/schemas\";\n\nconst ContactSchema = z.object({\n phone: z.string().optional(),\n email: z.string().optional(),\n address: z.string().optional(),\n}).strict();\n\nexport const BusinessSplitContentSchema = z.object({\n name: z.string(),\n tagline: z.string(),\n description: z.string(),\n image: ImageSchema,\n contact: ContactSchema.optional(),\n}).strict();\n\nexport type BusinessSplitContent = z.infer<typeof BusinessSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { BusinessSplitContentSchema, type BusinessSplitContent } from \"./schema\";\n\nexport function BusinessSplit({ content, theme }: BlockProps<BusinessSplitContent>) {\n BusinessSplitContentSchema.parse(content);\n const { name, tagline, description, image, contact } = content;\n return (\n <DBox as=\"section\" aria-label={name} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"center\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={6}>\n <DStack gap={2}>\n <DBox as=\"h2\" className={cn(\"text-4xl font-bold tracking-tight\")}>{name}</DBox>\n <DBox as=\"p\" color=\"accent\" className={cn(\"text-xl\")}>{tagline}</DBox>\n </DStack>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg leading-relaxed\")}>{description}</DBox>\n {contact && (\n <DBox as=\"address\" color=\"muted\" gap={1} display=\"flex\" className={cn(\"not-italic text-sm flex-col\")}>\n {contact.phone && <DBox as=\"span\">{contact.phone}</DBox>}\n {contact.email && <DBox as=\"span\">{contact.email}</DBox>}\n {contact.address && <DBox as=\"span\">{contact.address}</DBox>}\n </DBox>\n )}\n </DStack>\n <DBox\n as=\"img\"\n src={image.src}\n alt={image.alt}\n className={cn(\"w-full rounded-lg object-cover aspect-square\")}\n />\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type BusinessSplitContent } from \"./schema\";\n\nexport const BusinessSplitDefaultContent: BusinessSplitContent = {\n name: \"Acme Studio\",\n tagline: \"Strategy, design, and engineering — end to end.\",\n description: \"We partner with ambitious teams to define, design, and ship products that matter. From early exploration through to production.\",\n image: { src: \"https://placehold.co/600x480\", alt: \"Studio workspace\" },\n contact: { email: \"hello@example.com\", address: \"12 Innovation Lane, Tech City\" },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst ServiceSchema = z.object({\n title: z.string(),\n description: z.string(),\n icon: z.string().optional(),\n}).strict();\n\nexport const BusinessGridContentSchema = z.object({\n heading: z.string(),\n services: z.array(ServiceSchema).min(1),\n}).strict();\n\nexport type BusinessGridContent = z.infer<typeof BusinessGridContentSchema>;\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 { BusinessGridContentSchema, type BusinessGridContent } from \"./schema\";\n\nexport function BusinessGrid({ content, theme }: BlockProps<BusinessGridContent>) {\n BusinessGridContentSchema.parse(content);\n const { heading, services } = 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={2} gap={6}>\n {services.map((service, i) => (\n <Card key={i}>\n <CardHeader>\n <DStack gap={2}>\n {service.icon && (\n <DBox as=\"span\" className={cn(\"text-2xl\")} aria-hidden=\"true\">{service.icon}</DBox>\n )}\n <CardTitle as=\"h3\">{service.title}</CardTitle>\n </DStack>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{service.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 BusinessGridContent } from \"./schema\";\n\nexport const BusinessGridDefaultContent: BusinessGridContent = {\n heading: \"What we do\",\n services: [\n { title: \"Product strategy\", description: \"From market positioning to roadmap — we help teams move with clarity.\", icon: \"🗺️\" },\n { title: \"UX design\", description: \"Research-grounded design that reduces cognitive load and increases confidence.\", icon: \"✏️\" },\n { title: \"Engineering\", description: \"Full-stack delivery with a bias toward composable, testable architecture.\", icon: \"⚙️\" },\n { title: \"Design systems\", description: \"A single source of truth for tokens, components, and documentation.\", icon: \"🎨\" },\n ],\n};\n"]}
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+
3
+ var vui = require('@booga/vui');
4
+ var vdsl = require('@booga/vdsl');
5
+ var zod = require('zod');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/cta/CtaSplit/index.tsx
9
+ var DBox = vdsl.dsl(vui.Box);
10
+ var DStack = vdsl.dsl(vui.Stack);
11
+ var DGrid = vdsl.dsl(vui.Grid);
12
+ var DInline = vdsl.dsl(vui.Inline);
13
+
14
+ // src/theme.ts
15
+ function themeStyle(theme) {
16
+ if (!theme) return void 0;
17
+ return Object.fromEntries(
18
+ Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])
19
+ );
20
+ }
21
+ var CtaSchema = zod.z.object({
22
+ label: zod.z.string(),
23
+ href: zod.z.string()
24
+ }).strict();
25
+ var ImageSchema = zod.z.object({
26
+ src: zod.z.string(),
27
+ alt: zod.z.string()
28
+ }).strict();
29
+
30
+ // src/cta/CtaSplit/schema.ts
31
+ var CtaSplitContentSchema = zod.z.object({
32
+ heading: zod.z.string(),
33
+ description: zod.z.string(),
34
+ primaryCta: CtaSchema,
35
+ image: ImageSchema
36
+ }).strict();
37
+ function CtaSplit({ content, theme }) {
38
+ CtaSplitContentSchema.parse(content);
39
+ const { heading, description, primaryCta, image } = content;
40
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 12, align: "center", className: vui.cn("max-w-6xl mx-auto"), children: [
41
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 6, children: [
42
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-4xl font-bold tracking-tight"), children: heading }),
43
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-lg"), children: description }),
44
+ /* @__PURE__ */ jsxRuntime.jsx(vui.Button, { as: "a", href: primaryCta.href, size: "lg", children: primaryCta.label })
45
+ ] }),
46
+ /* @__PURE__ */ jsxRuntime.jsx(
47
+ DBox,
48
+ {
49
+ as: "img",
50
+ src: image.src,
51
+ alt: image.alt,
52
+ className: vui.cn("w-full rounded-lg object-cover aspect-video")
53
+ }
54
+ )
55
+ ] }) });
56
+ }
57
+
58
+ // src/cta/CtaSplit/default.ts
59
+ var CtaSplitDefaultContent = {
60
+ heading: "Ready to get started?",
61
+ description: "Join thousands of teams shipping faster with composable tooling.",
62
+ primaryCta: { label: "Start free", href: "#" },
63
+ image: { src: "https://placehold.co/480x320", alt: "Illustration" }
64
+ };
65
+ var CtaCenteredContentSchema = zod.z.object({
66
+ heading: zod.z.string(),
67
+ description: zod.z.string(),
68
+ primaryCta: CtaSchema,
69
+ secondaryCta: CtaSchema.optional()
70
+ }).strict();
71
+ function CtaCentered({ content, theme }) {
72
+ CtaCenteredContentSchema.parse(content);
73
+ const { heading, description, primaryCta, secondaryCta } = content;
74
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, gap: 8, align: "center", className: vui.cn("max-w-2xl mx-auto text-center py-20"), children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-4xl font-bold tracking-tight"), children: heading }),
76
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-lg"), children: description }),
77
+ /* @__PURE__ */ jsxRuntime.jsxs(DInline, { wrap: true, gap: 3, justify: "center", children: [
78
+ /* @__PURE__ */ jsxRuntime.jsx(vui.Button, { as: "a", href: primaryCta.href, size: "lg", children: primaryCta.label }),
79
+ secondaryCta && /* @__PURE__ */ jsxRuntime.jsx(vui.Button, { as: "a", href: secondaryCta.href, size: "lg", variant: "outline", children: secondaryCta.label })
80
+ ] })
81
+ ] }) });
82
+ }
83
+
84
+ // src/cta/CtaCentered/default.ts
85
+ var CtaCenteredDefaultContent = {
86
+ heading: "Ready to get started?",
87
+ description: "Ship faster with composable, typed section blocks.",
88
+ primaryCta: { label: "Get started", href: "#" },
89
+ secondaryCta: { label: "Learn more", href: "#" }
90
+ };
91
+
92
+ exports.CtaCentered = CtaCentered;
93
+ exports.CtaCenteredContentSchema = CtaCenteredContentSchema;
94
+ exports.CtaCenteredDefaultContent = CtaCenteredDefaultContent;
95
+ exports.CtaSplit = CtaSplit;
96
+ exports.CtaSplitContentSchema = CtaSplitContentSchema;
97
+ exports.CtaSplitDefaultContent = CtaSplitDefaultContent;
98
+ //# sourceMappingURL=index.cjs.map
99
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/cta/CtaSplit/schema.ts","../../src/cta/CtaSplit/index.tsx","../../src/cta/CtaSplit/default.ts","../../src/cta/CtaCentered/schema.ts","../../src/cta/CtaCentered/index.tsx","../../src/cta/CtaCentered/default.ts"],"names":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","Button"],"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\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n}).strict();\n\nexport const ImageSchema = z.object({\n src: z.string(),\n alt: z.string(),\n}).strict();\n\nexport const AvatarSchema = ImageSchema;\n\nexport type Cta = z.infer<typeof CtaSchema>;\nexport type Image = z.infer<typeof ImageSchema>;\nexport type AvatarSrc = Image;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema, ImageSchema } from \"../../shared/schemas\";\n\nexport const CtaSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n image: ImageSchema,\n}).strict();\n\nexport type CtaSplitContent = z.infer<typeof CtaSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { CtaSplitContentSchema, type CtaSplitContent } from \"./schema\";\n\nexport function CtaSplit({ content, theme }: BlockProps<CtaSplitContent>) {\n CtaSplitContentSchema.parse(content);\n const { heading, description, primaryCta, image } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={12} align=\"center\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={6}>\n <DBox as=\"h2\" className={cn(\"text-4xl font-bold tracking-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>\n {description}\n </DBox>\n <Button as=\"a\" href={primaryCta.href} size=\"lg\">\n {primaryCta.label}\n </Button>\n </DStack>\n <DBox\n as=\"img\"\n src={image.src}\n alt={image.alt}\n className={cn(\"w-full rounded-lg object-cover aspect-video\")}\n />\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CtaSplitContent } from \"./schema\";\n\nexport const CtaSplitDefaultContent: CtaSplitContent = {\n heading: \"Ready to get started?\",\n description: \"Join thousands of teams shipping faster with composable tooling.\",\n primaryCta: { label: \"Start free\", href: \"#\" },\n image: { src: \"https://placehold.co/480x320\", alt: \"Illustration\" },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema } from \"../../shared/schemas\";\n\nexport const CtaCenteredContentSchema = z.object({\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n secondaryCta: CtaSchema.optional(),\n}).strict();\n\nexport type CtaCenteredContent = z.infer<typeof CtaCenteredContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { CtaCenteredContentSchema, type CtaCenteredContent } from \"./schema\";\n\nexport function CtaCentered({ content, theme }: BlockProps<CtaCenteredContent>) {\n CtaCenteredContentSchema.parse(content);\n const { heading, description, primaryCta, secondaryCta } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} gap={8} align=\"center\" className={cn(\"max-w-2xl mx-auto text-center py-20\")}>\n <DBox as=\"h2\" className={cn(\"text-4xl font-bold tracking-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>\n {description}\n </DBox>\n <DInline wrap gap={3} justify=\"center\">\n <Button as=\"a\" href={primaryCta.href} size=\"lg\">{primaryCta.label}</Button>\n {secondaryCta && (\n <Button as=\"a\" href={secondaryCta.href} size=\"lg\" variant=\"outline\">\n {secondaryCta.label}\n </Button>\n )}\n </DInline>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CtaCenteredContent } from \"./schema\";\n\nexport const CtaCenteredDefaultContent: CtaCenteredContent = {\n heading: \"Ready to get started?\",\n description: \"Ship faster with composable, typed section blocks.\",\n primaryCta: { label: \"Get started\", href: \"#\" },\n secondaryCta: { label: \"Learn more\", href: \"#\" },\n};\n"]}
@@ -0,0 +1,110 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as BlockProps } from '../types-n6w6cZmP.cjs';
3
+ import { z } from 'zod';
4
+ import 'react';
5
+
6
+ declare const CtaSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodString;
9
+ primaryCta: z.ZodObject<{
10
+ label: z.ZodString;
11
+ href: z.ZodString;
12
+ }, "strict", z.ZodTypeAny, {
13
+ label: string;
14
+ href: string;
15
+ }, {
16
+ label: string;
17
+ href: string;
18
+ }>;
19
+ image: z.ZodObject<{
20
+ src: z.ZodString;
21
+ alt: z.ZodString;
22
+ }, "strict", z.ZodTypeAny, {
23
+ src: string;
24
+ alt: string;
25
+ }, {
26
+ src: string;
27
+ alt: string;
28
+ }>;
29
+ }, "strict", z.ZodTypeAny, {
30
+ image: {
31
+ src: string;
32
+ alt: string;
33
+ };
34
+ heading: string;
35
+ description: string;
36
+ primaryCta: {
37
+ label: string;
38
+ href: string;
39
+ };
40
+ }, {
41
+ image: {
42
+ src: string;
43
+ alt: string;
44
+ };
45
+ heading: string;
46
+ description: string;
47
+ primaryCta: {
48
+ label: string;
49
+ href: string;
50
+ };
51
+ }>;
52
+ type CtaSplitContent = z.infer<typeof CtaSplitContentSchema>;
53
+
54
+ declare function CtaSplit({ content, theme }: BlockProps<CtaSplitContent>): react_jsx_runtime.JSX.Element;
55
+
56
+ declare const CtaSplitDefaultContent: CtaSplitContent;
57
+
58
+ declare const CtaCenteredContentSchema: z.ZodObject<{
59
+ heading: z.ZodString;
60
+ description: z.ZodString;
61
+ primaryCta: z.ZodObject<{
62
+ label: z.ZodString;
63
+ href: z.ZodString;
64
+ }, "strict", z.ZodTypeAny, {
65
+ label: string;
66
+ href: string;
67
+ }, {
68
+ label: string;
69
+ href: string;
70
+ }>;
71
+ secondaryCta: z.ZodOptional<z.ZodObject<{
72
+ label: z.ZodString;
73
+ href: z.ZodString;
74
+ }, "strict", z.ZodTypeAny, {
75
+ label: string;
76
+ href: string;
77
+ }, {
78
+ label: string;
79
+ href: string;
80
+ }>>;
81
+ }, "strict", z.ZodTypeAny, {
82
+ heading: string;
83
+ description: string;
84
+ primaryCta: {
85
+ label: string;
86
+ href: string;
87
+ };
88
+ secondaryCta?: {
89
+ label: string;
90
+ href: string;
91
+ } | undefined;
92
+ }, {
93
+ heading: string;
94
+ description: string;
95
+ primaryCta: {
96
+ label: string;
97
+ href: string;
98
+ };
99
+ secondaryCta?: {
100
+ label: string;
101
+ href: string;
102
+ } | undefined;
103
+ }>;
104
+ type CtaCenteredContent = z.infer<typeof CtaCenteredContentSchema>;
105
+
106
+ declare function CtaCentered({ content, theme }: BlockProps<CtaCenteredContent>): react_jsx_runtime.JSX.Element;
107
+
108
+ declare const CtaCenteredDefaultContent: CtaCenteredContent;
109
+
110
+ export { CtaCentered, type CtaCenteredContent, CtaCenteredContentSchema, CtaCenteredDefaultContent, CtaSplit, type CtaSplitContent, CtaSplitContentSchema, CtaSplitDefaultContent };
@@ -0,0 +1,110 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { a as BlockProps } from '../types-n6w6cZmP.js';
3
+ import { z } from 'zod';
4
+ import 'react';
5
+
6
+ declare const CtaSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodString;
9
+ primaryCta: z.ZodObject<{
10
+ label: z.ZodString;
11
+ href: z.ZodString;
12
+ }, "strict", z.ZodTypeAny, {
13
+ label: string;
14
+ href: string;
15
+ }, {
16
+ label: string;
17
+ href: string;
18
+ }>;
19
+ image: z.ZodObject<{
20
+ src: z.ZodString;
21
+ alt: z.ZodString;
22
+ }, "strict", z.ZodTypeAny, {
23
+ src: string;
24
+ alt: string;
25
+ }, {
26
+ src: string;
27
+ alt: string;
28
+ }>;
29
+ }, "strict", z.ZodTypeAny, {
30
+ image: {
31
+ src: string;
32
+ alt: string;
33
+ };
34
+ heading: string;
35
+ description: string;
36
+ primaryCta: {
37
+ label: string;
38
+ href: string;
39
+ };
40
+ }, {
41
+ image: {
42
+ src: string;
43
+ alt: string;
44
+ };
45
+ heading: string;
46
+ description: string;
47
+ primaryCta: {
48
+ label: string;
49
+ href: string;
50
+ };
51
+ }>;
52
+ type CtaSplitContent = z.infer<typeof CtaSplitContentSchema>;
53
+
54
+ declare function CtaSplit({ content, theme }: BlockProps<CtaSplitContent>): react_jsx_runtime.JSX.Element;
55
+
56
+ declare const CtaSplitDefaultContent: CtaSplitContent;
57
+
58
+ declare const CtaCenteredContentSchema: z.ZodObject<{
59
+ heading: z.ZodString;
60
+ description: z.ZodString;
61
+ primaryCta: z.ZodObject<{
62
+ label: z.ZodString;
63
+ href: z.ZodString;
64
+ }, "strict", z.ZodTypeAny, {
65
+ label: string;
66
+ href: string;
67
+ }, {
68
+ label: string;
69
+ href: string;
70
+ }>;
71
+ secondaryCta: z.ZodOptional<z.ZodObject<{
72
+ label: z.ZodString;
73
+ href: z.ZodString;
74
+ }, "strict", z.ZodTypeAny, {
75
+ label: string;
76
+ href: string;
77
+ }, {
78
+ label: string;
79
+ href: string;
80
+ }>>;
81
+ }, "strict", z.ZodTypeAny, {
82
+ heading: string;
83
+ description: string;
84
+ primaryCta: {
85
+ label: string;
86
+ href: string;
87
+ };
88
+ secondaryCta?: {
89
+ label: string;
90
+ href: string;
91
+ } | undefined;
92
+ }, {
93
+ heading: string;
94
+ description: string;
95
+ primaryCta: {
96
+ label: string;
97
+ href: string;
98
+ };
99
+ secondaryCta?: {
100
+ label: string;
101
+ href: string;
102
+ } | undefined;
103
+ }>;
104
+ type CtaCenteredContent = z.infer<typeof CtaCenteredContentSchema>;
105
+
106
+ declare function CtaCentered({ content, theme }: BlockProps<CtaCenteredContent>): react_jsx_runtime.JSX.Element;
107
+
108
+ declare const CtaCenteredDefaultContent: CtaCenteredContent;
109
+
110
+ export { CtaCentered, type CtaCenteredContent, CtaCenteredContentSchema, CtaCenteredDefaultContent, CtaSplit, type CtaSplitContent, CtaSplitContentSchema, CtaSplitDefaultContent };
@@ -0,0 +1,92 @@
1
+ import { Box, Stack, Grid, Inline, cn, Button } from '@booga/vui';
2
+ import { dsl } from '@booga/vdsl';
3
+ import { z } from 'zod';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/cta/CtaSplit/index.tsx
7
+ var DBox = dsl(Box);
8
+ var DStack = dsl(Stack);
9
+ var DGrid = dsl(Grid);
10
+ var DInline = dsl(Inline);
11
+
12
+ // src/theme.ts
13
+ function themeStyle(theme) {
14
+ if (!theme) return void 0;
15
+ return Object.fromEntries(
16
+ Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])
17
+ );
18
+ }
19
+ var CtaSchema = z.object({
20
+ label: z.string(),
21
+ href: z.string()
22
+ }).strict();
23
+ var ImageSchema = z.object({
24
+ src: z.string(),
25
+ alt: z.string()
26
+ }).strict();
27
+
28
+ // src/cta/CtaSplit/schema.ts
29
+ var CtaSplitContentSchema = z.object({
30
+ heading: z.string(),
31
+ description: z.string(),
32
+ primaryCta: CtaSchema,
33
+ image: ImageSchema
34
+ }).strict();
35
+ function CtaSplit({ content, theme }) {
36
+ CtaSplitContentSchema.parse(content);
37
+ const { heading, description, primaryCta, image } = content;
38
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 12, align: "center", className: cn("max-w-6xl mx-auto"), children: [
39
+ /* @__PURE__ */ jsxs(DStack, { gap: 6, children: [
40
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-4xl font-bold tracking-tight"), children: heading }),
41
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-lg"), children: description }),
42
+ /* @__PURE__ */ jsx(Button, { as: "a", href: primaryCta.href, size: "lg", children: primaryCta.label })
43
+ ] }),
44
+ /* @__PURE__ */ jsx(
45
+ DBox,
46
+ {
47
+ as: "img",
48
+ src: image.src,
49
+ alt: image.alt,
50
+ className: cn("w-full rounded-lg object-cover aspect-video")
51
+ }
52
+ )
53
+ ] }) });
54
+ }
55
+
56
+ // src/cta/CtaSplit/default.ts
57
+ var CtaSplitDefaultContent = {
58
+ heading: "Ready to get started?",
59
+ description: "Join thousands of teams shipping faster with composable tooling.",
60
+ primaryCta: { label: "Start free", href: "#" },
61
+ image: { src: "https://placehold.co/480x320", alt: "Illustration" }
62
+ };
63
+ var CtaCenteredContentSchema = z.object({
64
+ heading: z.string(),
65
+ description: z.string(),
66
+ primaryCta: CtaSchema,
67
+ secondaryCta: CtaSchema.optional()
68
+ }).strict();
69
+ function CtaCentered({ content, theme }) {
70
+ CtaCenteredContentSchema.parse(content);
71
+ const { heading, description, primaryCta, secondaryCta } = content;
72
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DStack, { px: 6, gap: 8, align: "center", className: cn("max-w-2xl mx-auto text-center py-20"), children: [
73
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-4xl font-bold tracking-tight"), children: heading }),
74
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-lg"), children: description }),
75
+ /* @__PURE__ */ jsxs(DInline, { wrap: true, gap: 3, justify: "center", children: [
76
+ /* @__PURE__ */ jsx(Button, { as: "a", href: primaryCta.href, size: "lg", children: primaryCta.label }),
77
+ secondaryCta && /* @__PURE__ */ jsx(Button, { as: "a", href: secondaryCta.href, size: "lg", variant: "outline", children: secondaryCta.label })
78
+ ] })
79
+ ] }) });
80
+ }
81
+
82
+ // src/cta/CtaCentered/default.ts
83
+ var CtaCenteredDefaultContent = {
84
+ heading: "Ready to get started?",
85
+ description: "Ship faster with composable, typed section blocks.",
86
+ primaryCta: { label: "Get started", href: "#" },
87
+ secondaryCta: { label: "Learn more", href: "#" }
88
+ };
89
+
90
+ export { CtaCentered, CtaCenteredContentSchema, CtaCenteredDefaultContent, CtaSplit, CtaSplitContentSchema, CtaSplitDefaultContent };
91
+ //# sourceMappingURL=index.js.map
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/cta/CtaSplit/schema.ts","../../src/cta/CtaSplit/index.tsx","../../src/cta/CtaSplit/default.ts","../../src/cta/CtaCentered/schema.ts","../../src/cta/CtaCentered/index.tsx","../../src/cta/CtaCentered/default.ts"],"names":["z","jsx","jsxs","cn","Button"],"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\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n}).strict();\n\nexport const ImageSchema = z.object({\n src: z.string(),\n alt: z.string(),\n}).strict();\n\nexport const AvatarSchema = ImageSchema;\n\nexport type Cta = z.infer<typeof CtaSchema>;\nexport type Image = z.infer<typeof ImageSchema>;\nexport type AvatarSrc = Image;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema, ImageSchema } from \"../../shared/schemas\";\n\nexport const CtaSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n image: ImageSchema,\n}).strict();\n\nexport type CtaSplitContent = z.infer<typeof CtaSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { CtaSplitContentSchema, type CtaSplitContent } from \"./schema\";\n\nexport function CtaSplit({ content, theme }: BlockProps<CtaSplitContent>) {\n CtaSplitContentSchema.parse(content);\n const { heading, description, primaryCta, image } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={12} align=\"center\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={6}>\n <DBox as=\"h2\" className={cn(\"text-4xl font-bold tracking-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>\n {description}\n </DBox>\n <Button as=\"a\" href={primaryCta.href} size=\"lg\">\n {primaryCta.label}\n </Button>\n </DStack>\n <DBox\n as=\"img\"\n src={image.src}\n alt={image.alt}\n className={cn(\"w-full rounded-lg object-cover aspect-video\")}\n />\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CtaSplitContent } from \"./schema\";\n\nexport const CtaSplitDefaultContent: CtaSplitContent = {\n heading: \"Ready to get started?\",\n description: \"Join thousands of teams shipping faster with composable tooling.\",\n primaryCta: { label: \"Start free\", href: \"#\" },\n image: { src: \"https://placehold.co/480x320\", alt: \"Illustration\" },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema } from \"../../shared/schemas\";\n\nexport const CtaCenteredContentSchema = z.object({\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n secondaryCta: CtaSchema.optional(),\n}).strict();\n\nexport type CtaCenteredContent = z.infer<typeof CtaCenteredContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { CtaCenteredContentSchema, type CtaCenteredContent } from \"./schema\";\n\nexport function CtaCentered({ content, theme }: BlockProps<CtaCenteredContent>) {\n CtaCenteredContentSchema.parse(content);\n const { heading, description, primaryCta, secondaryCta } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} gap={8} align=\"center\" className={cn(\"max-w-2xl mx-auto text-center py-20\")}>\n <DBox as=\"h2\" className={cn(\"text-4xl font-bold tracking-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>\n {description}\n </DBox>\n <DInline wrap gap={3} justify=\"center\">\n <Button as=\"a\" href={primaryCta.href} size=\"lg\">{primaryCta.label}</Button>\n {secondaryCta && (\n <Button as=\"a\" href={secondaryCta.href} size=\"lg\" variant=\"outline\">\n {secondaryCta.label}\n </Button>\n )}\n </DInline>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CtaCenteredContent } from \"./schema\";\n\nexport const CtaCenteredDefaultContent: CtaCenteredContent = {\n heading: \"Ready to get started?\",\n description: \"Ship faster with composable, typed section blocks.\",\n primaryCta: { label: \"Get started\", href: \"#\" },\n secondaryCta: { label: \"Learn more\", href: \"#\" },\n};\n"]}
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ var vui = require('@booga/vui');
4
+ var vdsl = require('@booga/vdsl');
5
+ var zod = require('zod');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/faq/FaqSplit/index.tsx
9
+ var DBox = vdsl.dsl(vui.Box);
10
+ var DStack = vdsl.dsl(vui.Stack);
11
+ var DGrid = vdsl.dsl(vui.Grid);
12
+ vdsl.dsl(vui.Inline);
13
+
14
+ // src/theme.ts
15
+ function themeStyle(theme) {
16
+ if (!theme) return void 0;
17
+ return Object.fromEntries(
18
+ Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])
19
+ );
20
+ }
21
+ var FaqItemSchema = zod.z.object({
22
+ question: zod.z.string(),
23
+ answer: zod.z.string()
24
+ }).strict();
25
+ var FaqSplitContentSchema = zod.z.object({
26
+ heading: zod.z.string(),
27
+ description: zod.z.string().optional(),
28
+ items: zod.z.array(FaqItemSchema).min(1)
29
+ }).strict();
30
+ function FaqSplit({ content, theme }) {
31
+ FaqSplitContentSchema.parse(content);
32
+ const { heading, description, items } = content;
33
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": heading, 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: [
34
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 4, className: vui.cn("sticky top-16"), children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight"), children: heading }),
36
+ description && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", children: description })
37
+ ] }),
38
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "ul", m: 0, p: 0, gap: 3, display: "flex", className: vui.cn("list-none flex-col"), children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsxs(DBox, { as: "details", p: 4, className: vui.cn("border rounded-lg"), children: [
39
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "summary", className: vui.cn("font-semibold cursor-pointer list-none"), children: item.question }),
40
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", mt: 3, children: item.answer })
41
+ ] }) }, i)) })
42
+ ] }) });
43
+ }
44
+
45
+ // src/faq/FaqSplit/default.ts
46
+ var FaqSplitDefaultContent = {
47
+ heading: "Frequently asked questions",
48
+ description: "Everything you need to know about the product.",
49
+ items: [
50
+ { question: "How does it work?", answer: "Drop a block onto your page, pass typed content, and render. No manual wiring." },
51
+ { question: "Can I customise the styles?", answer: "Yes. Pass a ThemeOverride to any block to remap CSS custom properties." },
52
+ { question: "Does it require a specific framework?", answer: "React 18+ and Tailwind CSS. No other runtime dependencies." }
53
+ ]
54
+ };
55
+ var FaqItemSchema2 = zod.z.object({
56
+ question: zod.z.string(),
57
+ answer: zod.z.string()
58
+ }).strict();
59
+ var FaqGridContentSchema = zod.z.object({
60
+ heading: zod.z.string(),
61
+ items: zod.z.array(FaqItemSchema2).min(1)
62
+ }).strict();
63
+ function FaqGrid({ content, theme }) {
64
+ FaqGridContentSchema.parse(content);
65
+ const { heading, items } = content;
66
+ 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: [
67
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
68
+ /* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 2, gap: 4, children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
69
+ /* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(vui.CardTitle, { as: "h3", children: item.question }) }),
70
+ /* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", children: item.answer }) })
71
+ ] }, i)) })
72
+ ] }) });
73
+ }
74
+
75
+ // src/faq/FaqGrid/default.ts
76
+ var FaqGridDefaultContent = {
77
+ heading: "Common questions",
78
+ items: [
79
+ { question: "How does it work?", answer: "Drop a block onto your page, pass typed content, and render." },
80
+ { question: "Can I customise styles?", answer: "Yes. ThemeOverride maps to CSS custom properties." },
81
+ { question: "Which frameworks are supported?", answer: "React 18+ with Tailwind CSS." },
82
+ { question: "Is TypeScript required?", answer: "Strongly recommended. All content schemas export their types." }
83
+ ]
84
+ };
85
+
86
+ exports.FaqGrid = FaqGrid;
87
+ exports.FaqGridContentSchema = FaqGridContentSchema;
88
+ exports.FaqGridDefaultContent = FaqGridDefaultContent;
89
+ exports.FaqSplit = FaqSplit;
90
+ exports.FaqSplitContentSchema = FaqSplitContentSchema;
91
+ exports.FaqSplitDefaultContent = FaqSplitDefaultContent;
92
+ //# sourceMappingURL=index.cjs.map
93
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/faq/FaqSplit/schema.ts","../../src/faq/FaqSplit/index.tsx","../../src/faq/FaqSplit/default.ts","../../src/faq/FaqGrid/schema.ts","../../src/faq/FaqGrid/index.tsx","../../src/faq/FaqGrid/default.ts"],"names":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","FaqItemSchema","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 FaqItemSchema = z.object({\n question: z.string(),\n answer: z.string(),\n}).strict();\n\nexport const FaqSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n items: z.array(FaqItemSchema).min(1),\n}).strict();\n\nexport type FaqSplitContent = z.infer<typeof FaqSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { FaqSplitContentSchema, type FaqSplitContent } from \"./schema\";\n\nexport function FaqSplit({ content, theme }: BlockProps<FaqSplitContent>) {\n FaqSplitContentSchema.parse(content);\n const { heading, description, items } = 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\")}>\n {heading}\n </DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\">\n {description}\n </DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={3} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {items.map((item, i) => (\n <DBox as=\"li\" key={i}>\n <DBox as=\"details\" p={4} className={cn(\"border rounded-lg\")}>\n <DBox as=\"summary\" className={cn(\"font-semibold cursor-pointer list-none\")}>\n {item.question}\n </DBox>\n <DBox as=\"p\" color=\"muted\" mt={3}>\n {item.answer}\n </DBox>\n </DBox>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type FaqSplitContent } from \"./schema\";\n\nexport const FaqSplitDefaultContent: FaqSplitContent = {\n heading: \"Frequently asked questions\",\n description: \"Everything you need to know about the product.\",\n items: [\n { question: \"How does it work?\", answer: \"Drop a block onto your page, pass typed content, and render. No manual wiring.\" },\n { question: \"Can I customise the styles?\", answer: \"Yes. Pass a ThemeOverride to any block to remap CSS custom properties.\" },\n { question: \"Does it require a specific framework?\", answer: \"React 18+ and Tailwind CSS. No other runtime dependencies.\" },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nconst FaqItemSchema = z.object({\n question: z.string(),\n answer: z.string(),\n}).strict();\n\nexport const FaqGridContentSchema = z.object({\n heading: z.string(),\n items: z.array(FaqItemSchema).min(1),\n}).strict();\n\nexport type FaqGridContent = z.infer<typeof FaqGridContentSchema>;\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 { FaqGridContentSchema, type FaqGridContent } from \"./schema\";\n\nexport function FaqGrid({ content, theme }: BlockProps<FaqGridContent>) {\n FaqGridContentSchema.parse(content);\n const { heading, items } = 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\")}>\n {heading}\n </DBox>\n <DGrid columns={2} gap={4}>\n {items.map((item, i) => (\n <Card key={i}>\n <CardHeader>\n <CardTitle as=\"h3\">{item.question}</CardTitle>\n </CardHeader>\n <CardContent>\n <DBox as=\"p\" color=\"muted\">\n {item.answer}\n </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 FaqGridContent } from \"./schema\";\n\nexport const FaqGridDefaultContent: FaqGridContent = {\n heading: \"Common questions\",\n items: [\n { question: \"How does it work?\", answer: \"Drop a block onto your page, pass typed content, and render.\" },\n { question: \"Can I customise styles?\", answer: \"Yes. ThemeOverride maps to CSS custom properties.\" },\n { question: \"Which frameworks are supported?\", answer: \"React 18+ with Tailwind CSS.\" },\n { question: \"Is TypeScript required?\", answer: \"Strongly recommended. All content schemas export their types.\" },\n ],\n};\n"]}