@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,74 @@
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 PostSplitContentSchema: z.ZodObject<{
7
+ title: z.ZodString;
8
+ author: z.ZodString;
9
+ date: z.ZodString;
10
+ category: z.ZodOptional<z.ZodString>;
11
+ body: z.ZodString;
12
+ image: z.ZodObject<{
13
+ src: z.ZodString;
14
+ alt: z.ZodString;
15
+ }, "strict", z.ZodTypeAny, {
16
+ src: string;
17
+ alt: string;
18
+ }, {
19
+ src: string;
20
+ alt: string;
21
+ }>;
22
+ }, "strict", z.ZodTypeAny, {
23
+ body: string;
24
+ title: string;
25
+ image: {
26
+ src: string;
27
+ alt: string;
28
+ };
29
+ author: string;
30
+ date: string;
31
+ category?: string | undefined;
32
+ }, {
33
+ body: string;
34
+ title: string;
35
+ image: {
36
+ src: string;
37
+ alt: string;
38
+ };
39
+ author: string;
40
+ date: string;
41
+ category?: string | undefined;
42
+ }>;
43
+ type PostSplitContent = z.infer<typeof PostSplitContentSchema>;
44
+
45
+ declare function PostSplit({ content, theme }: BlockProps<PostSplitContent>): react_jsx_runtime.JSX.Element;
46
+
47
+ declare const PostSplitDefaultContent: PostSplitContent;
48
+
49
+ declare const PostCenteredContentSchema: z.ZodObject<{
50
+ title: z.ZodString;
51
+ author: z.ZodString;
52
+ date: z.ZodString;
53
+ category: z.ZodOptional<z.ZodString>;
54
+ body: z.ZodString;
55
+ }, "strict", z.ZodTypeAny, {
56
+ body: string;
57
+ title: string;
58
+ author: string;
59
+ date: string;
60
+ category?: string | undefined;
61
+ }, {
62
+ body: string;
63
+ title: string;
64
+ author: string;
65
+ date: string;
66
+ category?: string | undefined;
67
+ }>;
68
+ type PostCenteredContent = z.infer<typeof PostCenteredContentSchema>;
69
+
70
+ declare function PostCentered({ content, theme }: BlockProps<PostCenteredContent>): react_jsx_runtime.JSX.Element;
71
+
72
+ declare const PostCenteredDefaultContent: PostCenteredContent;
73
+
74
+ export { PostCentered, type PostCenteredContent, PostCenteredContentSchema, PostCenteredDefaultContent, PostSplit, type PostSplitContent, PostSplitContentSchema, PostSplitDefaultContent };
@@ -0,0 +1,109 @@
1
+ import { Box, Stack, Grid, Inline, Badge, cn, Separator } 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/post/PostSplit/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
+ 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/post/PostSplit/schema.ts
29
+ var PostSplitContentSchema = z.object({
30
+ title: z.string(),
31
+ author: z.string(),
32
+ date: z.string(),
33
+ category: z.string().optional(),
34
+ body: z.string(),
35
+ image: ImageSchema
36
+ }).strict();
37
+ function PostSplit({ content, theme }) {
38
+ PostSplitContentSchema.parse(content);
39
+ const { title, author, date, category, body, image } = content;
40
+ return /* @__PURE__ */ jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 16, align: "start", className: cn("max-w-6xl mx-auto"), children: [
41
+ /* @__PURE__ */ jsxs(DStack, { gap: 6, className: cn("sticky top-16"), children: [
42
+ category && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: category }),
43
+ /* @__PURE__ */ jsx(DBox, { as: "h1", className: cn("text-3xl font-bold tracking-tight leading-snug"), children: title }),
44
+ /* @__PURE__ */ jsx(Separator, {}),
45
+ /* @__PURE__ */ jsxs(DInline, { gap: 2, color: "muted", className: cn("text-sm"), children: [
46
+ /* @__PURE__ */ jsx(DBox, { as: "span", children: author }),
47
+ /* @__PURE__ */ jsx(DBox, { as: "span", "aria-hidden": "true", children: "\xB7" }),
48
+ /* @__PURE__ */ jsx(DBox, { as: "time", dateTime: date, children: date })
49
+ ] })
50
+ ] }),
51
+ /* @__PURE__ */ jsxs(DStack, { gap: 6, children: [
52
+ /* @__PURE__ */ jsx(
53
+ DBox,
54
+ {
55
+ as: "img",
56
+ src: image.src,
57
+ alt: image.alt,
58
+ className: cn("w-full rounded-lg object-cover aspect-video")
59
+ }
60
+ ),
61
+ /* @__PURE__ */ jsx(DBox, { as: "p", className: cn("text-base leading-relaxed"), children: body })
62
+ ] })
63
+ ] }) });
64
+ }
65
+
66
+ // src/post/PostSplit/default.ts
67
+ var PostSplitDefaultContent = {
68
+ title: "Designing for composability",
69
+ author: "Alex Meridian",
70
+ date: "2026-05-01",
71
+ category: "Design systems",
72
+ body: "Composable systems decouple structure from style, enabling teams to build faster without sacrificing consistency. This post explores the core principles behind maintainable design systems.",
73
+ image: { src: "https://placehold.co/600x400", alt: "Post cover image" }
74
+ };
75
+ var PostCenteredContentSchema = z.object({
76
+ title: z.string(),
77
+ author: z.string(),
78
+ date: z.string(),
79
+ category: z.string().optional(),
80
+ body: z.string()
81
+ }).strict();
82
+ function PostCentered({ content, theme }) {
83
+ PostCenteredContentSchema.parse(content);
84
+ const { title, author, date, category, body } = content;
85
+ return /* @__PURE__ */ jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DStack, { px: 6, py: 16, gap: 6, className: cn("max-w-2xl mx-auto"), children: [
86
+ category && /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: category }),
87
+ /* @__PURE__ */ jsx(DBox, { as: "h1", className: cn("text-4xl font-bold tracking-tight leading-snug"), children: title }),
88
+ /* @__PURE__ */ jsxs(DInline, { gap: 2, color: "muted", className: cn("text-sm"), children: [
89
+ /* @__PURE__ */ jsx(DBox, { as: "span", children: author }),
90
+ /* @__PURE__ */ jsx(DBox, { as: "span", "aria-hidden": "true", children: "\xB7" }),
91
+ /* @__PURE__ */ jsx(DBox, { as: "time", dateTime: date, children: date })
92
+ ] }),
93
+ /* @__PURE__ */ jsx(Separator, {}),
94
+ /* @__PURE__ */ jsx(DBox, { as: "p", className: cn("text-base leading-relaxed"), children: body })
95
+ ] }) });
96
+ }
97
+
98
+ // src/post/PostCentered/default.ts
99
+ var PostCenteredDefaultContent = {
100
+ title: "Designing for composability",
101
+ author: "Alex Meridian",
102
+ date: "2026-05-01",
103
+ category: "Design systems",
104
+ body: "Composable systems decouple structure from style, enabling teams to build faster without sacrificing consistency."
105
+ };
106
+
107
+ export { PostCentered, PostCenteredContentSchema, PostCenteredDefaultContent, PostSplit, PostSplitContentSchema, PostSplitDefaultContent };
108
+ //# sourceMappingURL=index.js.map
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/post/PostSplit/schema.ts","../../src/post/PostSplit/index.tsx","../../src/post/PostSplit/default.ts","../../src/post/PostCentered/schema.ts","../../src/post/PostCentered/index.tsx","../../src/post/PostCentered/default.ts"],"names":["z","jsx","jsxs","cn","Badge","Separator"],"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\nexport const PostSplitContentSchema = z.object({\n title: z.string(),\n author: z.string(),\n date: z.string(),\n category: z.string().optional(),\n body: z.string(),\n image: ImageSchema,\n}).strict();\n\nexport type PostSplitContent = z.infer<typeof PostSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Badge, Separator, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { PostSplitContentSchema, type PostSplitContent } from \"./schema\";\n\nexport function PostSplit({ content, theme }: BlockProps<PostSplitContent>) {\n PostSplitContentSchema.parse(content);\n const { title, author, date, category, body, image } = content;\n return (\n <DBox as=\"article\" 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={6} className={cn(\"sticky top-16\")}>\n {category && <Badge variant=\"secondary\">{category}</Badge>}\n <DBox as=\"h1\" className={cn(\"text-3xl font-bold tracking-tight leading-snug\")}>{title}</DBox>\n <Separator />\n <DInline gap={2} color=\"muted\" className={cn(\"text-sm\")}>\n <DBox as=\"span\">{author}</DBox>\n <DBox as=\"span\" aria-hidden=\"true\">·</DBox>\n <DBox as=\"time\" dateTime={date}>{date}</DBox>\n </DInline>\n </DStack>\n <DStack gap={6}>\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 <DBox as=\"p\" className={cn(\"text-base leading-relaxed\")}>{body}</DBox>\n </DStack>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type PostSplitContent } from \"./schema\";\n\nexport const PostSplitDefaultContent: PostSplitContent = {\n title: \"Designing for composability\",\n author: \"Alex Meridian\",\n date: \"2026-05-01\",\n category: \"Design systems\",\n body: \"Composable systems decouple structure from style, enabling teams to build faster without sacrificing consistency. This post explores the core principles behind maintainable design systems.\",\n image: { src: \"https://placehold.co/600x400\", alt: \"Post cover image\" },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nexport const PostCenteredContentSchema = z.object({\n title: z.string(),\n author: z.string(),\n date: z.string(),\n category: z.string().optional(),\n body: z.string(),\n}).strict();\n\nexport type PostCenteredContent = z.infer<typeof PostCenteredContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Badge, Separator, cn } from \"@booga/vui\";\nimport { DBox, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { PostCenteredContentSchema, type PostCenteredContent } from \"./schema\";\n\nexport function PostCentered({ content, theme }: BlockProps<PostCenteredContent>) {\n PostCenteredContentSchema.parse(content);\n const { title, author, date, category, body } = content;\n return (\n <DBox as=\"article\" style={themeStyle(theme)}>\n <DStack px={6} py={16} gap={6} className={cn(\"max-w-2xl mx-auto\")}>\n {category && <Badge variant=\"secondary\">{category}</Badge>}\n <DBox as=\"h1\" className={cn(\"text-4xl font-bold tracking-tight leading-snug\")}>{title}</DBox>\n <DInline gap={2} color=\"muted\" className={cn(\"text-sm\")}>\n <DBox as=\"span\">{author}</DBox>\n <DBox as=\"span\" aria-hidden=\"true\">·</DBox>\n <DBox as=\"time\" dateTime={date}>{date}</DBox>\n </DInline>\n <Separator />\n <DBox as=\"p\" className={cn(\"text-base leading-relaxed\")}>{body}</DBox>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type PostCenteredContent } from \"./schema\";\n\nexport const PostCenteredDefaultContent: PostCenteredContent = {\n title: \"Designing for composability\",\n author: \"Alex Meridian\",\n date: \"2026-05-01\",\n category: \"Design systems\",\n body: \"Composable systems decouple structure from style, enabling teams to build faster without sacrificing consistency.\",\n};\n"]}
@@ -0,0 +1,120 @@
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/team/TeamSplit/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
+ 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
+ var AvatarSchema = ImageSchema;
30
+
31
+ // src/team/TeamSplit/schema.ts
32
+ var TeamMemberSchema = zod.z.object({
33
+ name: zod.z.string(),
34
+ role: zod.z.string(),
35
+ avatar: AvatarSchema,
36
+ bio: zod.z.string().optional()
37
+ }).strict();
38
+ var TeamSplitContentSchema = zod.z.object({
39
+ heading: zod.z.string(),
40
+ description: zod.z.string().optional(),
41
+ members: zod.z.array(TeamMemberSchema).min(1)
42
+ }).strict();
43
+ function TeamSplit({ content, theme }) {
44
+ TeamSplitContentSchema.parse(content);
45
+ const { heading, description, members } = content;
46
+ 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: [
47
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 4, className: vui.cn("sticky top-16"), children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight"), children: heading }),
49
+ description && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", children: description })
50
+ ] }),
51
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "ul", m: 0, p: 0, gap: 6, display: "flex", className: vui.cn("list-none flex-col"), children: members.map((member, i) => /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsxs(DInline, { gap: 4, align: "start", children: [
52
+ /* @__PURE__ */ jsxRuntime.jsxs(vui.Avatar, { children: [
53
+ /* @__PURE__ */ jsxRuntime.jsx(vui.AvatarImage, { src: member.avatar.src, alt: member.avatar.alt }),
54
+ /* @__PURE__ */ jsxRuntime.jsx(vui.AvatarFallback, { children: member.name.slice(0, 2).toUpperCase() })
55
+ ] }),
56
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 1, children: [
57
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", className: vui.cn("font-semibold"), children: member.name }),
58
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-sm"), children: member.role }),
59
+ member.bio && /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", className: vui.cn("text-sm mt-1"), children: member.bio })
60
+ ] })
61
+ ] }) }, i)) })
62
+ ] }) });
63
+ }
64
+
65
+ // src/team/TeamSplit/default.ts
66
+ var TeamSplitDefaultContent = {
67
+ heading: "Meet the team",
68
+ description: "The people behind the product.",
69
+ members: [
70
+ { name: "Jordan Ellis", role: "Product Lead", avatar: { src: "https://placehold.co/80x80", alt: "Jordan Ellis" }, bio: "Focused on user experience and product strategy." },
71
+ { name: "Sam Rivera", role: "Engineering Lead", avatar: { src: "https://placehold.co/80x80", alt: "Sam Rivera" }, bio: "Architecting scalable systems since 2015." },
72
+ { name: "Taylor Kim", role: "Design Lead", avatar: { src: "https://placehold.co/80x80", alt: "Taylor Kim" } }
73
+ ]
74
+ };
75
+ var TeamMemberSchema2 = zod.z.object({
76
+ name: zod.z.string(),
77
+ role: zod.z.string(),
78
+ avatar: AvatarSchema
79
+ }).strict();
80
+ var TeamGridContentSchema = zod.z.object({
81
+ heading: zod.z.string(),
82
+ members: zod.z.array(TeamMemberSchema2).min(1)
83
+ }).strict();
84
+ function TeamGrid({ content, theme }) {
85
+ TeamGridContentSchema.parse(content);
86
+ const { heading, members } = content;
87
+ 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: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h2", className: vui.cn("text-3xl font-bold tracking-tight text-center"), children: heading }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(DGrid, { columns: 3, gap: 6, children: members.map((member, i) => /* @__PURE__ */ jsxRuntime.jsx(vui.Card, { children: /* @__PURE__ */ jsxRuntime.jsx(vui.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 3, align: "center", pt: 4, className: vui.cn("text-center"), children: [
90
+ /* @__PURE__ */ jsxRuntime.jsxs(vui.Avatar, { className: vui.cn("w-16 h-16"), children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx(vui.AvatarImage, { src: member.avatar.src, alt: member.avatar.alt }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(vui.AvatarFallback, { children: member.name.slice(0, 2).toUpperCase() })
93
+ ] }),
94
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 1, children: [
95
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", className: vui.cn("font-semibold"), children: member.name }),
96
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", color: "muted", className: vui.cn("text-sm"), children: member.role })
97
+ ] })
98
+ ] }) }) }, i)) })
99
+ ] }) });
100
+ }
101
+
102
+ // src/team/TeamGrid/default.ts
103
+ var TeamGridDefaultContent = {
104
+ heading: "Our team",
105
+ members: [
106
+ { name: "Jordan Ellis", role: "Product Lead", avatar: { src: "https://placehold.co/80x80", alt: "Jordan Ellis" } },
107
+ { name: "Sam Rivera", role: "Engineering Lead", avatar: { src: "https://placehold.co/80x80", alt: "Sam Rivera" } },
108
+ { name: "Taylor Kim", role: "Design Lead", avatar: { src: "https://placehold.co/80x80", alt: "Taylor Kim" } },
109
+ { name: "Morgan Blake", role: "Research Lead", avatar: { src: "https://placehold.co/80x80", alt: "Morgan Blake" } }
110
+ ]
111
+ };
112
+
113
+ exports.TeamGrid = TeamGrid;
114
+ exports.TeamGridContentSchema = TeamGridContentSchema;
115
+ exports.TeamGridDefaultContent = TeamGridDefaultContent;
116
+ exports.TeamSplit = TeamSplit;
117
+ exports.TeamSplitContentSchema = TeamSplitContentSchema;
118
+ exports.TeamSplitDefaultContent = TeamSplitDefaultContent;
119
+ //# sourceMappingURL=index.cjs.map
120
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/team/TeamSplit/schema.ts","../../src/team/TeamSplit/index.tsx","../../src/team/TeamSplit/default.ts","../../src/team/TeamGrid/schema.ts","../../src/team/TeamGrid/index.tsx","../../src/team/TeamGrid/default.ts"],"names":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","Avatar","AvatarImage","AvatarFallback","TeamMemberSchema","Card","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 { AvatarSchema } from \"../../shared/schemas\";\n\nconst TeamMemberSchema = z.object({\n name: z.string(),\n role: z.string(),\n avatar: AvatarSchema,\n bio: z.string().optional(),\n}).strict();\n\nexport const TeamSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n members: z.array(TeamMemberSchema).min(1),\n}).strict();\n\nexport type TeamSplitContent = z.infer<typeof TeamSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Avatar, AvatarFallback, AvatarImage, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { TeamSplitContentSchema, type TeamSplitContent } from \"./schema\";\n\nexport function TeamSplit({ content, theme }: BlockProps<TeamSplitContent>) {\n TeamSplitContentSchema.parse(content);\n const { heading, description, members } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={16} align=\"start\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={4} className={cn(\"sticky top-16\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\">{description}</DBox>\n )}\n </DStack>\n <DBox as=\"ul\" m={0} p={0} gap={6} display=\"flex\" className={cn(\"list-none flex-col\")}>\n {members.map((member, i) => (\n <DBox as=\"li\" key={i}>\n <DInline gap={4} align=\"start\">\n <Avatar>\n <AvatarImage src={member.avatar.src} alt={member.avatar.alt} />\n <AvatarFallback>{member.name.slice(0, 2).toUpperCase()}</AvatarFallback>\n </Avatar>\n <DStack gap={1}>\n <DBox as=\"p\" className={cn(\"font-semibold\")}>{member.name}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{member.role}</DBox>\n {member.bio && (\n <DBox as=\"p\" className={cn(\"text-sm mt-1\")}>{member.bio}</DBox>\n )}\n </DStack>\n </DInline>\n </DBox>\n ))}\n </DBox>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type TeamSplitContent } from \"./schema\";\n\nexport const TeamSplitDefaultContent: TeamSplitContent = {\n heading: \"Meet the team\",\n description: \"The people behind the product.\",\n members: [\n { name: \"Jordan Ellis\", role: \"Product Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Jordan Ellis\" }, bio: \"Focused on user experience and product strategy.\" },\n { name: \"Sam Rivera\", role: \"Engineering Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Sam Rivera\" }, bio: \"Architecting scalable systems since 2015.\" },\n { name: \"Taylor Kim\", role: \"Design Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Taylor Kim\" } },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { AvatarSchema } from \"../../shared/schemas\";\n\nconst TeamMemberSchema = z.object({\n name: z.string(),\n role: z.string(),\n avatar: AvatarSchema,\n}).strict();\n\nexport const TeamGridContentSchema = z.object({\n heading: z.string(),\n members: z.array(TeamMemberSchema).min(1),\n}).strict();\n\nexport type TeamGridContent = z.infer<typeof TeamGridContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Avatar, AvatarFallback, AvatarImage, Card, CardContent, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { TeamGridContentSchema, type TeamGridContent } from \"./schema\";\n\nexport function TeamGrid({ content, theme }: BlockProps<TeamGridContent>) {\n TeamGridContentSchema.parse(content);\n const { heading, members } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={16} className={cn(\"max-w-5xl mx-auto gap-10\")}>\n <DBox as=\"h2\" className={cn(\"text-3xl font-bold tracking-tight text-center\")}>{heading}</DBox>\n <DGrid columns={3} gap={6}>\n {members.map((member, i) => (\n <Card key={i}>\n <CardContent>\n <DStack gap={3} align=\"center\" pt={4} className={cn(\"text-center\")}>\n <Avatar className={cn(\"w-16 h-16\")}>\n <AvatarImage src={member.avatar.src} alt={member.avatar.alt} />\n <AvatarFallback>{member.name.slice(0, 2).toUpperCase()}</AvatarFallback>\n </Avatar>\n <DStack gap={1}>\n <DBox as=\"p\" className={cn(\"font-semibold\")}>{member.name}</DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-sm\")}>{member.role}</DBox>\n </DStack>\n </DStack>\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 TeamGridContent } from \"./schema\";\n\nexport const TeamGridDefaultContent: TeamGridContent = {\n heading: \"Our team\",\n members: [\n { name: \"Jordan Ellis\", role: \"Product Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Jordan Ellis\" } },\n { name: \"Sam Rivera\", role: \"Engineering Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Sam Rivera\" } },\n { name: \"Taylor Kim\", role: \"Design Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Taylor Kim\" } },\n { name: \"Morgan Blake\", role: \"Research Lead\", avatar: { src: \"https://placehold.co/80x80\", alt: \"Morgan Blake\" } },\n ],\n};\n"]}
@@ -0,0 +1,128 @@
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 TeamSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ members: z.ZodArray<z.ZodObject<{
10
+ name: z.ZodString;
11
+ role: z.ZodString;
12
+ avatar: z.ZodObject<{
13
+ src: z.ZodString;
14
+ alt: z.ZodString;
15
+ }, "strict", z.ZodTypeAny, {
16
+ src: string;
17
+ alt: string;
18
+ }, {
19
+ src: string;
20
+ alt: string;
21
+ }>;
22
+ bio: z.ZodOptional<z.ZodString>;
23
+ }, "strict", z.ZodTypeAny, {
24
+ name: string;
25
+ role: string;
26
+ avatar: {
27
+ src: string;
28
+ alt: string;
29
+ };
30
+ bio?: string | undefined;
31
+ }, {
32
+ name: string;
33
+ role: string;
34
+ avatar: {
35
+ src: string;
36
+ alt: string;
37
+ };
38
+ bio?: string | undefined;
39
+ }>, "many">;
40
+ }, "strict", z.ZodTypeAny, {
41
+ heading: string;
42
+ members: {
43
+ name: string;
44
+ role: string;
45
+ avatar: {
46
+ src: string;
47
+ alt: string;
48
+ };
49
+ bio?: string | undefined;
50
+ }[];
51
+ description?: string | undefined;
52
+ }, {
53
+ heading: string;
54
+ members: {
55
+ name: string;
56
+ role: string;
57
+ avatar: {
58
+ src: string;
59
+ alt: string;
60
+ };
61
+ bio?: string | undefined;
62
+ }[];
63
+ description?: string | undefined;
64
+ }>;
65
+ type TeamSplitContent = z.infer<typeof TeamSplitContentSchema>;
66
+
67
+ declare function TeamSplit({ content, theme }: BlockProps<TeamSplitContent>): react_jsx_runtime.JSX.Element;
68
+
69
+ declare const TeamSplitDefaultContent: TeamSplitContent;
70
+
71
+ declare const TeamGridContentSchema: z.ZodObject<{
72
+ heading: z.ZodString;
73
+ members: z.ZodArray<z.ZodObject<{
74
+ name: z.ZodString;
75
+ role: z.ZodString;
76
+ avatar: z.ZodObject<{
77
+ src: z.ZodString;
78
+ alt: z.ZodString;
79
+ }, "strict", z.ZodTypeAny, {
80
+ src: string;
81
+ alt: string;
82
+ }, {
83
+ src: string;
84
+ alt: string;
85
+ }>;
86
+ }, "strict", z.ZodTypeAny, {
87
+ name: string;
88
+ role: string;
89
+ avatar: {
90
+ src: string;
91
+ alt: string;
92
+ };
93
+ }, {
94
+ name: string;
95
+ role: string;
96
+ avatar: {
97
+ src: string;
98
+ alt: string;
99
+ };
100
+ }>, "many">;
101
+ }, "strict", z.ZodTypeAny, {
102
+ heading: string;
103
+ members: {
104
+ name: string;
105
+ role: string;
106
+ avatar: {
107
+ src: string;
108
+ alt: string;
109
+ };
110
+ }[];
111
+ }, {
112
+ heading: string;
113
+ members: {
114
+ name: string;
115
+ role: string;
116
+ avatar: {
117
+ src: string;
118
+ alt: string;
119
+ };
120
+ }[];
121
+ }>;
122
+ type TeamGridContent = z.infer<typeof TeamGridContentSchema>;
123
+
124
+ declare function TeamGrid({ content, theme }: BlockProps<TeamGridContent>): react_jsx_runtime.JSX.Element;
125
+
126
+ declare const TeamGridDefaultContent: TeamGridContent;
127
+
128
+ export { TeamGrid, type TeamGridContent, TeamGridContentSchema, TeamGridDefaultContent, TeamSplit, type TeamSplitContent, TeamSplitContentSchema, TeamSplitDefaultContent };
@@ -0,0 +1,128 @@
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 TeamSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ members: z.ZodArray<z.ZodObject<{
10
+ name: z.ZodString;
11
+ role: z.ZodString;
12
+ avatar: z.ZodObject<{
13
+ src: z.ZodString;
14
+ alt: z.ZodString;
15
+ }, "strict", z.ZodTypeAny, {
16
+ src: string;
17
+ alt: string;
18
+ }, {
19
+ src: string;
20
+ alt: string;
21
+ }>;
22
+ bio: z.ZodOptional<z.ZodString>;
23
+ }, "strict", z.ZodTypeAny, {
24
+ name: string;
25
+ role: string;
26
+ avatar: {
27
+ src: string;
28
+ alt: string;
29
+ };
30
+ bio?: string | undefined;
31
+ }, {
32
+ name: string;
33
+ role: string;
34
+ avatar: {
35
+ src: string;
36
+ alt: string;
37
+ };
38
+ bio?: string | undefined;
39
+ }>, "many">;
40
+ }, "strict", z.ZodTypeAny, {
41
+ heading: string;
42
+ members: {
43
+ name: string;
44
+ role: string;
45
+ avatar: {
46
+ src: string;
47
+ alt: string;
48
+ };
49
+ bio?: string | undefined;
50
+ }[];
51
+ description?: string | undefined;
52
+ }, {
53
+ heading: string;
54
+ members: {
55
+ name: string;
56
+ role: string;
57
+ avatar: {
58
+ src: string;
59
+ alt: string;
60
+ };
61
+ bio?: string | undefined;
62
+ }[];
63
+ description?: string | undefined;
64
+ }>;
65
+ type TeamSplitContent = z.infer<typeof TeamSplitContentSchema>;
66
+
67
+ declare function TeamSplit({ content, theme }: BlockProps<TeamSplitContent>): react_jsx_runtime.JSX.Element;
68
+
69
+ declare const TeamSplitDefaultContent: TeamSplitContent;
70
+
71
+ declare const TeamGridContentSchema: z.ZodObject<{
72
+ heading: z.ZodString;
73
+ members: z.ZodArray<z.ZodObject<{
74
+ name: z.ZodString;
75
+ role: z.ZodString;
76
+ avatar: z.ZodObject<{
77
+ src: z.ZodString;
78
+ alt: z.ZodString;
79
+ }, "strict", z.ZodTypeAny, {
80
+ src: string;
81
+ alt: string;
82
+ }, {
83
+ src: string;
84
+ alt: string;
85
+ }>;
86
+ }, "strict", z.ZodTypeAny, {
87
+ name: string;
88
+ role: string;
89
+ avatar: {
90
+ src: string;
91
+ alt: string;
92
+ };
93
+ }, {
94
+ name: string;
95
+ role: string;
96
+ avatar: {
97
+ src: string;
98
+ alt: string;
99
+ };
100
+ }>, "many">;
101
+ }, "strict", z.ZodTypeAny, {
102
+ heading: string;
103
+ members: {
104
+ name: string;
105
+ role: string;
106
+ avatar: {
107
+ src: string;
108
+ alt: string;
109
+ };
110
+ }[];
111
+ }, {
112
+ heading: string;
113
+ members: {
114
+ name: string;
115
+ role: string;
116
+ avatar: {
117
+ src: string;
118
+ alt: string;
119
+ };
120
+ }[];
121
+ }>;
122
+ type TeamGridContent = z.infer<typeof TeamGridContentSchema>;
123
+
124
+ declare function TeamGrid({ content, theme }: BlockProps<TeamGridContent>): react_jsx_runtime.JSX.Element;
125
+
126
+ declare const TeamGridDefaultContent: TeamGridContent;
127
+
128
+ export { TeamGrid, type TeamGridContent, TeamGridContentSchema, TeamGridDefaultContent, TeamSplit, type TeamSplitContent, TeamSplitContentSchema, TeamSplitDefaultContent };