@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,141 @@
1
+ import { Box, Stack, Grid, Inline, cn, Badge, Card, CardContent } 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/blog/BlogSplit/index.tsx
7
+ var DBox = dsl(Box);
8
+ var DStack = dsl(Stack);
9
+ var DGrid = dsl(Grid);
10
+ 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
+ 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/blog/BlogSplit/schema.ts
29
+ var BlogPostSchema = z.object({
30
+ title: z.string(),
31
+ excerpt: z.string(),
32
+ date: z.string(),
33
+ category: z.string().optional(),
34
+ image: ImageSchema
35
+ }).strict();
36
+ var BlogSplitContentSchema = z.object({
37
+ heading: z.string(),
38
+ posts: z.array(BlogPostSchema).min(1)
39
+ }).strict();
40
+ function BlogSplit({ content, theme }) {
41
+ BlogSplitContentSchema.parse(content);
42
+ const { heading, posts } = content;
43
+ const [featured, ...rest] = posts;
44
+ 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: [
45
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-3xl font-bold tracking-tight"), children: heading }),
46
+ /* @__PURE__ */ jsxs(DGrid, { columns: 2, gap: 8, align: "start", children: [
47
+ featured && /* @__PURE__ */ jsx(DBox, { as: "article", children: /* @__PURE__ */ jsxs(DStack, { gap: 4, children: [
48
+ /* @__PURE__ */ jsx(
49
+ DBox,
50
+ {
51
+ as: "img",
52
+ src: featured.image.src,
53
+ alt: featured.image.alt,
54
+ className: cn("w-full rounded-lg object-cover aspect-video")
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsxs(DStack, { gap: 2, children: [
58
+ featured.category && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: featured.category }),
59
+ /* @__PURE__ */ jsx(DBox, { as: "h3", className: cn("text-xl font-semibold"), children: featured.title }),
60
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", children: featured.excerpt }),
61
+ /* @__PURE__ */ jsx(DBox, { as: "time", dateTime: featured.date, color: "muted", className: cn("text-xs"), children: featured.date })
62
+ ] })
63
+ ] }) }),
64
+ /* @__PURE__ */ jsx(DBox, { as: "ul", m: 0, p: 0, gap: 6, display: "flex", className: cn("list-none flex-col"), children: rest.map((post, i) => /* @__PURE__ */ jsx(DBox, { as: "li", children: /* @__PURE__ */ jsx(DBox, { as: "article", children: /* @__PURE__ */ jsxs(DGrid, { columns: 2, gap: 4, align: "start", children: [
65
+ /* @__PURE__ */ jsx(
66
+ DBox,
67
+ {
68
+ as: "img",
69
+ src: post.image.src,
70
+ alt: post.image.alt,
71
+ className: cn("w-full rounded-md object-cover aspect-video")
72
+ }
73
+ ),
74
+ /* @__PURE__ */ jsxs(DStack, { gap: 1, children: [
75
+ post.category && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: post.category }),
76
+ /* @__PURE__ */ jsx(DBox, { as: "h3", className: cn("font-semibold leading-snug"), children: post.title }),
77
+ /* @__PURE__ */ jsx(DBox, { as: "time", dateTime: post.date, color: "muted", className: cn("text-xs"), children: post.date })
78
+ ] })
79
+ ] }) }) }, i)) })
80
+ ] })
81
+ ] }) });
82
+ }
83
+
84
+ // src/blog/BlogSplit/default.ts
85
+ var BlogSplitDefaultContent = {
86
+ heading: "Latest posts",
87
+ posts: [
88
+ { title: "Designing for composability", excerpt: "How modular thinking unlocks maintainable systems at scale.", date: "2026-05-01", category: "Design", image: { src: "https://placehold.co/600x400", alt: "Design systems post" } },
89
+ { title: "Type-safe content at runtime", excerpt: "Zod schemas as the single source of truth for block content.", date: "2026-04-18", image: { src: "https://placehold.co/400x280", alt: "Type safety post" } },
90
+ { title: "Tree-shaking section blocks", excerpt: "Per-category entry points and how they keep bundles lean.", date: "2026-04-05", category: "Engineering", image: { src: "https://placehold.co/400x280", alt: "Tree-shaking post" } }
91
+ ]
92
+ };
93
+ var BlogPostSchema2 = z.object({
94
+ title: z.string(),
95
+ excerpt: z.string(),
96
+ date: z.string(),
97
+ category: z.string().optional(),
98
+ image: ImageSchema
99
+ }).strict();
100
+ var BlogGridContentSchema = z.object({
101
+ heading: z.string(),
102
+ posts: z.array(BlogPostSchema2).min(1)
103
+ }).strict();
104
+ function BlogGrid({ content, theme }) {
105
+ BlogGridContentSchema.parse(content);
106
+ const { heading, posts } = content;
107
+ 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: [
108
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-3xl font-bold tracking-tight"), children: heading }),
109
+ /* @__PURE__ */ jsx(DGrid, { columns: 3, gap: 6, children: posts.map((post, i) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(DBox, { as: "article", children: [
110
+ /* @__PURE__ */ jsx(
111
+ DBox,
112
+ {
113
+ as: "img",
114
+ src: post.image.src,
115
+ alt: post.image.alt,
116
+ className: cn("w-full rounded-t-lg object-cover aspect-video")
117
+ }
118
+ ),
119
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(DStack, { gap: 2, pt: 2, children: [
120
+ post.category && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: post.category }),
121
+ /* @__PURE__ */ jsx(DBox, { as: "h3", className: cn("font-semibold leading-snug"), children: post.title }),
122
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-sm"), children: post.excerpt }),
123
+ /* @__PURE__ */ jsx(DBox, { as: "time", dateTime: post.date, color: "muted", className: cn("text-xs"), children: post.date })
124
+ ] }) })
125
+ ] }) }, i)) })
126
+ ] }) });
127
+ }
128
+
129
+ // src/blog/BlogGrid/default.ts
130
+ var BlogGridDefaultContent = {
131
+ heading: "From the blog",
132
+ posts: [
133
+ { title: "Designing for composability", excerpt: "Modular thinking at scale.", date: "2026-05-01", category: "Design", image: { src: "https://placehold.co/480x320", alt: "Design post" } },
134
+ { 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" } },
135
+ { 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" } }
136
+ ]
137
+ };
138
+
139
+ export { BlogGrid, BlogGridContentSchema, BlogGridDefaultContent, BlogSplit, BlogSplitContentSchema, BlogSplitDefaultContent };
140
+ //# sourceMappingURL=index.js.map
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/blog/BlogSplit/schema.ts","../../src/blog/BlogSplit/index.tsx","../../src/blog/BlogSplit/default.ts","../../src/blog/BlogGrid/schema.ts","../../src/blog/BlogGrid/index.tsx","../../src/blog/BlogGrid/default.ts"],"names":["z","BlogPostSchema","jsx","jsxs","cn","Badge"],"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 BlogPostSchema = z.object({\n title: z.string(),\n excerpt: z.string(),\n date: z.string(),\n category: z.string().optional(),\n image: ImageSchema,\n}).strict();\n\nexport const BlogSplitContentSchema = z.object({\n heading: z.string(),\n posts: z.array(BlogPostSchema).min(1),\n}).strict();\n\nexport type BlogSplitContent = z.infer<typeof BlogSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Badge, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { BlogSplitContentSchema, type BlogSplitContent } from \"./schema\";\n\nexport function BlogSplit({ content, theme }: BlockProps<BlogSplitContent>) {\n BlogSplitContentSchema.parse(content);\n const { heading, posts } = content;\n const [featured, ...rest] = posts;\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\")}>{heading}</DBox>\n <DGrid columns={2} gap={8} align=\"start\">\n {featured && (\n <DBox as=\"article\">\n <DStack gap={4}>\n <DBox\n as=\"img\"\n src={featured.image.src}\n alt={featured.image.alt}\n className={cn(\"w-full rounded-lg object-cover aspect-video\")}\n />\n <DStack gap={2}>\n {featured.category && <Badge variant=\"secondary\">{featured.category}</Badge>}\n <DBox as=\"h3\" className={cn(\"text-xl font-semibold\")}>{featured.title}</DBox>\n <DBox as=\"p\" color=\"muted\">{featured.excerpt}</DBox>\n <DBox as=\"time\" dateTime={featured.date} color=\"muted\" className={cn(\"text-xs\")}>{featured.date}</DBox>\n </DStack>\n </DStack>\n </DBox>\n )}\n <DBox as=\"ul\" m={0} p={0} gap={6} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {rest.map((post, i) => (\n <DBox as=\"li\" key={i}>\n <DBox as=\"article\">\n <DGrid columns={2} gap={4} align=\"start\">\n <DBox\n as=\"img\"\n src={post.image.src}\n alt={post.image.alt}\n className={cn(\"w-full rounded-md object-cover aspect-video\")}\n />\n <DStack gap={1}>\n {post.category && <Badge variant=\"secondary\">{post.category}</Badge>}\n <DBox as=\"h3\" className={cn(\"font-semibold leading-snug\")}>{post.title}</DBox>\n <DBox as=\"time\" dateTime={post.date} color=\"muted\" className={cn(\"text-xs\")}>{post.date}</DBox>\n </DStack>\n </DGrid>\n </DBox>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type BlogSplitContent } from \"./schema\";\n\nexport const BlogSplitDefaultContent: BlogSplitContent = {\n heading: \"Latest posts\",\n posts: [\n { title: \"Designing for composability\", excerpt: \"How modular thinking unlocks maintainable systems at scale.\", date: \"2026-05-01\", category: \"Design\", image: { src: \"https://placehold.co/600x400\", alt: \"Design systems post\" } },\n { title: \"Type-safe content at runtime\", excerpt: \"Zod schemas as the single source of truth for block content.\", date: \"2026-04-18\", image: { src: \"https://placehold.co/400x280\", alt: \"Type safety post\" } },\n { title: \"Tree-shaking section blocks\", excerpt: \"Per-category entry points and how they keep bundles lean.\", date: \"2026-04-05\", category: \"Engineering\", image: { src: \"https://placehold.co/400x280\", alt: \"Tree-shaking post\" } },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { ImageSchema } from \"../../shared/schemas\";\n\nconst BlogPostSchema = z.object({\n title: z.string(),\n excerpt: z.string(),\n date: z.string(),\n category: z.string().optional(),\n image: ImageSchema,\n}).strict();\n\nexport const BlogGridContentSchema = z.object({\n heading: z.string(),\n posts: z.array(BlogPostSchema).min(1),\n}).strict();\n\nexport type BlogGridContent = z.infer<typeof BlogGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Badge, Card, CardContent, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { BlogGridContentSchema, type BlogGridContent } from \"./schema\";\n\nexport function BlogGrid({ content, theme }: BlockProps<BlogGridContent>) {\n BlogGridContentSchema.parse(content);\n const { heading, posts } = 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\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {posts.map((post, i) => (\n <Card key={i}>\n <DBox as=\"article\">\n <DBox\n as=\"img\"\n src={post.image.src}\n alt={post.image.alt}\n className={cn(\"w-full rounded-t-lg object-cover aspect-video\")}\n />\n <CardContent>\n <DStack gap={2} pt={2}>\n {post.category && <Badge variant=\"secondary\">{post.category}</Badge>}\n <DBox as=\"h3\" className={cn(\"font-semibold leading-snug\")}>{post.title}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{post.excerpt}</DBox>\n <DBox as=\"time\" dateTime={post.date} color=\"muted\" className={cn(\"text-xs\")}>{post.date}</DBox>\n </DStack>\n </CardContent>\n </DBox>\n </Card>\n ))}\n </DGrid>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type BlogGridContent } from \"./schema\";\n\nexport const BlogGridDefaultContent: BlogGridContent = {\n heading: \"From the blog\",\n posts: [\n { title: \"Designing for composability\", excerpt: \"Modular thinking at scale.\", date: \"2026-05-01\", category: \"Design\", image: { src: \"https://placehold.co/480x320\", alt: \"Design post\" } },\n { 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\" } },\n { 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\" } },\n ],\n};\n"]}
@@ -0,0 +1,121 @@
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/business/BusinessSplit/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
+ 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/business/BusinessSplit/schema.ts
31
+ var ContactSchema = zod.z.object({
32
+ phone: zod.z.string().optional(),
33
+ email: zod.z.string().optional(),
34
+ address: zod.z.string().optional()
35
+ }).strict();
36
+ var BusinessSplitContentSchema = zod.z.object({
37
+ name: zod.z.string(),
38
+ tagline: zod.z.string(),
39
+ description: zod.z.string(),
40
+ image: ImageSchema,
41
+ contact: ContactSchema.optional()
42
+ }).strict();
43
+ function BusinessSplit({ content, theme }) {
44
+ BusinessSplitContentSchema.parse(content);
45
+ const { name, tagline, description, image, contact } = content;
46
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "section", "aria-label": name, style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 16, align: "center", className: vui.cn("max-w-6xl mx-auto"), children: [
47
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 6, children: [
48
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
49
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-4xl font-bold tracking-tight"), children: name }),
50
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "accent", className: vui.cn("text-xl"), children: tagline })
51
+ ] }),
52
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-lg leading-relaxed"), children: description }),
53
+ contact && /* @__PURE__ */ jsxRuntime.jsxs(DBox, { as: "address", color: "muted", gap: 1, display: "flex", className: vui.cn("not-italic text-sm flex-col"), children: [
54
+ contact.phone && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: contact.phone }),
55
+ contact.email && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: contact.email }),
56
+ contact.address && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: contact.address })
57
+ ] })
58
+ ] }),
59
+ /* @__PURE__ */ jsxRuntime.jsx(
60
+ DBox,
61
+ {
62
+ as: "img",
63
+ src: image.src,
64
+ alt: image.alt,
65
+ className: vui.cn("w-full rounded-lg object-cover aspect-square")
66
+ }
67
+ )
68
+ ] }) });
69
+ }
70
+
71
+ // src/business/BusinessSplit/default.ts
72
+ var BusinessSplitDefaultContent = {
73
+ name: "Acme Studio",
74
+ tagline: "Strategy, design, and engineering \u2014 end to end.",
75
+ description: "We partner with ambitious teams to define, design, and ship products that matter. From early exploration through to production.",
76
+ image: { src: "https://placehold.co/600x480", alt: "Studio workspace" },
77
+ contact: { email: "hello@example.com", address: "12 Innovation Lane, Tech City" }
78
+ };
79
+ var ServiceSchema = zod.z.object({
80
+ title: zod.z.string(),
81
+ description: zod.z.string(),
82
+ icon: zod.z.string().optional()
83
+ }).strict();
84
+ var BusinessGridContentSchema = zod.z.object({
85
+ heading: zod.z.string(),
86
+ services: zod.z.array(ServiceSchema).min(1)
87
+ }).strict();
88
+ function BusinessGrid({ content, theme }) {
89
+ BusinessGridContentSchema.parse(content);
90
+ const { heading, services } = content;
91
+ 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: [
92
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
93
+ /* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 2, gap: 6, children: services.map((service, i) => /* @__PURE__ */ jsxRuntime.jsxs(vui.Card, { children: [
94
+ /* @__PURE__ */ jsxRuntime.jsx(vui.CardHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 2, children: [
95
+ service.icon && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", className: vui.cn("text-2xl"), "aria-hidden": "true", children: service.icon }),
96
+ /* @__PURE__ */ jsxRuntime.jsx(vui.CardTitle, { as: "h3", children: service.title })
97
+ ] }) }),
98
+ /* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-sm"), children: service.description }) })
99
+ ] }, i)) })
100
+ ] }) });
101
+ }
102
+
103
+ // src/business/BusinessGrid/default.ts
104
+ var BusinessGridDefaultContent = {
105
+ heading: "What we do",
106
+ services: [
107
+ { title: "Product strategy", description: "From market positioning to roadmap \u2014 we help teams move with clarity.", icon: "\u{1F5FA}\uFE0F" },
108
+ { title: "UX design", description: "Research-grounded design that reduces cognitive load and increases confidence.", icon: "\u270F\uFE0F" },
109
+ { title: "Engineering", description: "Full-stack delivery with a bias toward composable, testable architecture.", icon: "\u2699\uFE0F" },
110
+ { title: "Design systems", description: "A single source of truth for tokens, components, and documentation.", icon: "\u{1F3A8}" }
111
+ ]
112
+ };
113
+
114
+ exports.BusinessGrid = BusinessGrid;
115
+ exports.BusinessGridContentSchema = BusinessGridContentSchema;
116
+ exports.BusinessGridDefaultContent = BusinessGridDefaultContent;
117
+ exports.BusinessSplit = BusinessSplit;
118
+ exports.BusinessSplitContentSchema = BusinessSplitContentSchema;
119
+ exports.BusinessSplitDefaultContent = BusinessSplitDefaultContent;
120
+ //# sourceMappingURL=index.cjs.map
121
+ //# sourceMappingURL=index.cjs.map
@@ -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":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","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\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,102 @@
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 BusinessSplitContentSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ tagline: z.ZodString;
9
+ description: z.ZodString;
10
+ image: z.ZodObject<{
11
+ src: z.ZodString;
12
+ alt: z.ZodString;
13
+ }, "strict", z.ZodTypeAny, {
14
+ src: string;
15
+ alt: string;
16
+ }, {
17
+ src: string;
18
+ alt: string;
19
+ }>;
20
+ contact: z.ZodOptional<z.ZodObject<{
21
+ phone: z.ZodOptional<z.ZodString>;
22
+ email: z.ZodOptional<z.ZodString>;
23
+ address: z.ZodOptional<z.ZodString>;
24
+ }, "strict", z.ZodTypeAny, {
25
+ address?: string | undefined;
26
+ phone?: string | undefined;
27
+ email?: string | undefined;
28
+ }, {
29
+ address?: string | undefined;
30
+ phone?: string | undefined;
31
+ email?: string | undefined;
32
+ }>>;
33
+ }, "strict", z.ZodTypeAny, {
34
+ image: {
35
+ src: string;
36
+ alt: string;
37
+ };
38
+ description: string;
39
+ name: string;
40
+ tagline: string;
41
+ contact?: {
42
+ address?: string | undefined;
43
+ phone?: string | undefined;
44
+ email?: string | undefined;
45
+ } | undefined;
46
+ }, {
47
+ image: {
48
+ src: string;
49
+ alt: string;
50
+ };
51
+ description: string;
52
+ name: string;
53
+ tagline: string;
54
+ contact?: {
55
+ address?: string | undefined;
56
+ phone?: string | undefined;
57
+ email?: string | undefined;
58
+ } | undefined;
59
+ }>;
60
+ type BusinessSplitContent = z.infer<typeof BusinessSplitContentSchema>;
61
+
62
+ declare function BusinessSplit({ content, theme }: BlockProps<BusinessSplitContent>): react_jsx_runtime.JSX.Element;
63
+
64
+ declare const BusinessSplitDefaultContent: BusinessSplitContent;
65
+
66
+ declare const BusinessGridContentSchema: z.ZodObject<{
67
+ heading: z.ZodString;
68
+ services: z.ZodArray<z.ZodObject<{
69
+ title: z.ZodString;
70
+ description: z.ZodString;
71
+ icon: z.ZodOptional<z.ZodString>;
72
+ }, "strict", z.ZodTypeAny, {
73
+ title: string;
74
+ description: string;
75
+ icon?: string | undefined;
76
+ }, {
77
+ title: string;
78
+ description: string;
79
+ icon?: string | undefined;
80
+ }>, "many">;
81
+ }, "strict", z.ZodTypeAny, {
82
+ heading: string;
83
+ services: {
84
+ title: string;
85
+ description: string;
86
+ icon?: string | undefined;
87
+ }[];
88
+ }, {
89
+ heading: string;
90
+ services: {
91
+ title: string;
92
+ description: string;
93
+ icon?: string | undefined;
94
+ }[];
95
+ }>;
96
+ type BusinessGridContent = z.infer<typeof BusinessGridContentSchema>;
97
+
98
+ declare function BusinessGrid({ content, theme }: BlockProps<BusinessGridContent>): react_jsx_runtime.JSX.Element;
99
+
100
+ declare const BusinessGridDefaultContent: BusinessGridContent;
101
+
102
+ export { BusinessGrid, type BusinessGridContent, BusinessGridContentSchema, BusinessGridDefaultContent, BusinessSplit, type BusinessSplitContent, BusinessSplitContentSchema, BusinessSplitDefaultContent };
@@ -0,0 +1,102 @@
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 BusinessSplitContentSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ tagline: z.ZodString;
9
+ description: z.ZodString;
10
+ image: z.ZodObject<{
11
+ src: z.ZodString;
12
+ alt: z.ZodString;
13
+ }, "strict", z.ZodTypeAny, {
14
+ src: string;
15
+ alt: string;
16
+ }, {
17
+ src: string;
18
+ alt: string;
19
+ }>;
20
+ contact: z.ZodOptional<z.ZodObject<{
21
+ phone: z.ZodOptional<z.ZodString>;
22
+ email: z.ZodOptional<z.ZodString>;
23
+ address: z.ZodOptional<z.ZodString>;
24
+ }, "strict", z.ZodTypeAny, {
25
+ address?: string | undefined;
26
+ phone?: string | undefined;
27
+ email?: string | undefined;
28
+ }, {
29
+ address?: string | undefined;
30
+ phone?: string | undefined;
31
+ email?: string | undefined;
32
+ }>>;
33
+ }, "strict", z.ZodTypeAny, {
34
+ image: {
35
+ src: string;
36
+ alt: string;
37
+ };
38
+ description: string;
39
+ name: string;
40
+ tagline: string;
41
+ contact?: {
42
+ address?: string | undefined;
43
+ phone?: string | undefined;
44
+ email?: string | undefined;
45
+ } | undefined;
46
+ }, {
47
+ image: {
48
+ src: string;
49
+ alt: string;
50
+ };
51
+ description: string;
52
+ name: string;
53
+ tagline: string;
54
+ contact?: {
55
+ address?: string | undefined;
56
+ phone?: string | undefined;
57
+ email?: string | undefined;
58
+ } | undefined;
59
+ }>;
60
+ type BusinessSplitContent = z.infer<typeof BusinessSplitContentSchema>;
61
+
62
+ declare function BusinessSplit({ content, theme }: BlockProps<BusinessSplitContent>): react_jsx_runtime.JSX.Element;
63
+
64
+ declare const BusinessSplitDefaultContent: BusinessSplitContent;
65
+
66
+ declare const BusinessGridContentSchema: z.ZodObject<{
67
+ heading: z.ZodString;
68
+ services: z.ZodArray<z.ZodObject<{
69
+ title: z.ZodString;
70
+ description: z.ZodString;
71
+ icon: z.ZodOptional<z.ZodString>;
72
+ }, "strict", z.ZodTypeAny, {
73
+ title: string;
74
+ description: string;
75
+ icon?: string | undefined;
76
+ }, {
77
+ title: string;
78
+ description: string;
79
+ icon?: string | undefined;
80
+ }>, "many">;
81
+ }, "strict", z.ZodTypeAny, {
82
+ heading: string;
83
+ services: {
84
+ title: string;
85
+ description: string;
86
+ icon?: string | undefined;
87
+ }[];
88
+ }, {
89
+ heading: string;
90
+ services: {
91
+ title: string;
92
+ description: string;
93
+ icon?: string | undefined;
94
+ }[];
95
+ }>;
96
+ type BusinessGridContent = z.infer<typeof BusinessGridContentSchema>;
97
+
98
+ declare function BusinessGrid({ content, theme }: BlockProps<BusinessGridContent>): react_jsx_runtime.JSX.Element;
99
+
100
+ declare const BusinessGridDefaultContent: BusinessGridContent;
101
+
102
+ export { BusinessGrid, type BusinessGridContent, BusinessGridContentSchema, BusinessGridDefaultContent, BusinessSplit, type BusinessSplitContent, BusinessSplitContentSchema, BusinessSplitDefaultContent };
@@ -0,0 +1,114 @@
1
+ import { Box, Stack, Grid, Inline, cn, Card, CardHeader, CardTitle, CardContent } 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/business/BusinessSplit/index.tsx
7
+ var DBox = dsl(Box);
8
+ var DStack = dsl(Stack);
9
+ var DGrid = dsl(Grid);
10
+ 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
+ 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/business/BusinessSplit/schema.ts
29
+ var ContactSchema = z.object({
30
+ phone: z.string().optional(),
31
+ email: z.string().optional(),
32
+ address: z.string().optional()
33
+ }).strict();
34
+ var BusinessSplitContentSchema = z.object({
35
+ name: z.string(),
36
+ tagline: z.string(),
37
+ description: z.string(),
38
+ image: ImageSchema,
39
+ contact: ContactSchema.optional()
40
+ }).strict();
41
+ function BusinessSplit({ content, theme }) {
42
+ BusinessSplitContentSchema.parse(content);
43
+ const { name, tagline, description, image, contact } = content;
44
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": name, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 16, align: "center", className: cn("max-w-6xl mx-auto"), children: [
45
+ /* @__PURE__ */ jsxs(DStack, { gap: 6, children: [
46
+ /* @__PURE__ */ jsxs(DStack, { gap: 2, children: [
47
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-4xl font-bold tracking-tight"), children: name }),
48
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "accent", className: cn("text-xl"), children: tagline })
49
+ ] }),
50
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-lg leading-relaxed"), children: description }),
51
+ contact && /* @__PURE__ */ jsxs(DBox, { as: "address", color: "muted", gap: 1, display: "flex", className: cn("not-italic text-sm flex-col"), children: [
52
+ contact.phone && /* @__PURE__ */ jsx(DBox, { as: "span", children: contact.phone }),
53
+ contact.email && /* @__PURE__ */ jsx(DBox, { as: "span", children: contact.email }),
54
+ contact.address && /* @__PURE__ */ jsx(DBox, { as: "span", children: contact.address })
55
+ ] })
56
+ ] }),
57
+ /* @__PURE__ */ jsx(
58
+ DBox,
59
+ {
60
+ as: "img",
61
+ src: image.src,
62
+ alt: image.alt,
63
+ className: cn("w-full rounded-lg object-cover aspect-square")
64
+ }
65
+ )
66
+ ] }) });
67
+ }
68
+
69
+ // src/business/BusinessSplit/default.ts
70
+ var BusinessSplitDefaultContent = {
71
+ name: "Acme Studio",
72
+ tagline: "Strategy, design, and engineering \u2014 end to end.",
73
+ description: "We partner with ambitious teams to define, design, and ship products that matter. From early exploration through to production.",
74
+ image: { src: "https://placehold.co/600x480", alt: "Studio workspace" },
75
+ contact: { email: "hello@example.com", address: "12 Innovation Lane, Tech City" }
76
+ };
77
+ var ServiceSchema = z.object({
78
+ title: z.string(),
79
+ description: z.string(),
80
+ icon: z.string().optional()
81
+ }).strict();
82
+ var BusinessGridContentSchema = z.object({
83
+ heading: z.string(),
84
+ services: z.array(ServiceSchema).min(1)
85
+ }).strict();
86
+ function BusinessGrid({ content, theme }) {
87
+ BusinessGridContentSchema.parse(content);
88
+ const { heading, services } = content;
89
+ 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: [
90
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
91
+ /* @__PURE__ */ jsx(DGrid, { columns: 2, gap: 6, children: services.map((service, i) => /* @__PURE__ */ jsxs(Card, { children: [
92
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(DStack, { gap: 2, children: [
93
+ service.icon && /* @__PURE__ */ jsx(DBox, { as: "span", className: cn("text-2xl"), "aria-hidden": "true", children: service.icon }),
94
+ /* @__PURE__ */ jsx(CardTitle, { as: "h3", children: service.title })
95
+ ] }) }),
96
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-sm"), children: service.description }) })
97
+ ] }, i)) })
98
+ ] }) });
99
+ }
100
+
101
+ // src/business/BusinessGrid/default.ts
102
+ var BusinessGridDefaultContent = {
103
+ heading: "What we do",
104
+ services: [
105
+ { title: "Product strategy", description: "From market positioning to roadmap \u2014 we help teams move with clarity.", icon: "\u{1F5FA}\uFE0F" },
106
+ { title: "UX design", description: "Research-grounded design that reduces cognitive load and increases confidence.", icon: "\u270F\uFE0F" },
107
+ { title: "Engineering", description: "Full-stack delivery with a bias toward composable, testable architecture.", icon: "\u2699\uFE0F" },
108
+ { title: "Design systems", description: "A single source of truth for tokens, components, and documentation.", icon: "\u{1F3A8}" }
109
+ ]
110
+ };
111
+
112
+ export { BusinessGrid, BusinessGridContentSchema, BusinessGridDefaultContent, BusinessSplit, BusinessSplitContentSchema, BusinessSplitDefaultContent };
113
+ //# sourceMappingURL=index.js.map
114
+ //# sourceMappingURL=index.js.map