@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,120 @@
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 PortfolioSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ items: z.ZodArray<z.ZodObject<{
10
+ title: z.ZodString;
11
+ category: 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
+ title: string;
24
+ image: {
25
+ src: string;
26
+ alt: string;
27
+ };
28
+ category: string;
29
+ }, {
30
+ title: string;
31
+ image: {
32
+ src: string;
33
+ alt: string;
34
+ };
35
+ category: string;
36
+ }>, "many">;
37
+ }, "strict", z.ZodTypeAny, {
38
+ heading: string;
39
+ items: {
40
+ title: string;
41
+ image: {
42
+ src: string;
43
+ alt: string;
44
+ };
45
+ category: string;
46
+ }[];
47
+ description?: string | undefined;
48
+ }, {
49
+ heading: string;
50
+ items: {
51
+ title: string;
52
+ image: {
53
+ src: string;
54
+ alt: string;
55
+ };
56
+ category: string;
57
+ }[];
58
+ description?: string | undefined;
59
+ }>;
60
+ type PortfolioSplitContent = z.infer<typeof PortfolioSplitContentSchema>;
61
+
62
+ declare function PortfolioSplit({ content, theme }: BlockProps<PortfolioSplitContent>): react_jsx_runtime.JSX.Element;
63
+
64
+ declare const PortfolioSplitDefaultContent: PortfolioSplitContent;
65
+
66
+ declare const PortfolioGridContentSchema: z.ZodObject<{
67
+ items: z.ZodArray<z.ZodObject<{
68
+ title: z.ZodString;
69
+ category: z.ZodString;
70
+ image: z.ZodObject<{
71
+ src: z.ZodString;
72
+ alt: z.ZodString;
73
+ }, "strict", z.ZodTypeAny, {
74
+ src: string;
75
+ alt: string;
76
+ }, {
77
+ src: string;
78
+ alt: string;
79
+ }>;
80
+ }, "strict", z.ZodTypeAny, {
81
+ title: string;
82
+ image: {
83
+ src: string;
84
+ alt: string;
85
+ };
86
+ category: string;
87
+ }, {
88
+ title: string;
89
+ image: {
90
+ src: string;
91
+ alt: string;
92
+ };
93
+ category: string;
94
+ }>, "many">;
95
+ }, "strict", z.ZodTypeAny, {
96
+ items: {
97
+ title: string;
98
+ image: {
99
+ src: string;
100
+ alt: string;
101
+ };
102
+ category: string;
103
+ }[];
104
+ }, {
105
+ items: {
106
+ title: string;
107
+ image: {
108
+ src: string;
109
+ alt: string;
110
+ };
111
+ category: string;
112
+ }[];
113
+ }>;
114
+ type PortfolioGridContent = z.infer<typeof PortfolioGridContentSchema>;
115
+
116
+ declare function PortfolioGrid({ content, theme }: BlockProps<PortfolioGridContent>): react_jsx_runtime.JSX.Element;
117
+
118
+ declare const PortfolioGridDefaultContent: PortfolioGridContent;
119
+
120
+ export { PortfolioGrid, type PortfolioGridContent, PortfolioGridContentSchema, PortfolioGridDefaultContent, PortfolioSplit, type PortfolioSplitContent, PortfolioSplitContentSchema, PortfolioSplitDefaultContent };
@@ -0,0 +1,120 @@
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 PortfolioSplitContentSchema: z.ZodObject<{
7
+ heading: z.ZodString;
8
+ description: z.ZodOptional<z.ZodString>;
9
+ items: z.ZodArray<z.ZodObject<{
10
+ title: z.ZodString;
11
+ category: 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
+ title: string;
24
+ image: {
25
+ src: string;
26
+ alt: string;
27
+ };
28
+ category: string;
29
+ }, {
30
+ title: string;
31
+ image: {
32
+ src: string;
33
+ alt: string;
34
+ };
35
+ category: string;
36
+ }>, "many">;
37
+ }, "strict", z.ZodTypeAny, {
38
+ heading: string;
39
+ items: {
40
+ title: string;
41
+ image: {
42
+ src: string;
43
+ alt: string;
44
+ };
45
+ category: string;
46
+ }[];
47
+ description?: string | undefined;
48
+ }, {
49
+ heading: string;
50
+ items: {
51
+ title: string;
52
+ image: {
53
+ src: string;
54
+ alt: string;
55
+ };
56
+ category: string;
57
+ }[];
58
+ description?: string | undefined;
59
+ }>;
60
+ type PortfolioSplitContent = z.infer<typeof PortfolioSplitContentSchema>;
61
+
62
+ declare function PortfolioSplit({ content, theme }: BlockProps<PortfolioSplitContent>): react_jsx_runtime.JSX.Element;
63
+
64
+ declare const PortfolioSplitDefaultContent: PortfolioSplitContent;
65
+
66
+ declare const PortfolioGridContentSchema: z.ZodObject<{
67
+ items: z.ZodArray<z.ZodObject<{
68
+ title: z.ZodString;
69
+ category: z.ZodString;
70
+ image: z.ZodObject<{
71
+ src: z.ZodString;
72
+ alt: z.ZodString;
73
+ }, "strict", z.ZodTypeAny, {
74
+ src: string;
75
+ alt: string;
76
+ }, {
77
+ src: string;
78
+ alt: string;
79
+ }>;
80
+ }, "strict", z.ZodTypeAny, {
81
+ title: string;
82
+ image: {
83
+ src: string;
84
+ alt: string;
85
+ };
86
+ category: string;
87
+ }, {
88
+ title: string;
89
+ image: {
90
+ src: string;
91
+ alt: string;
92
+ };
93
+ category: string;
94
+ }>, "many">;
95
+ }, "strict", z.ZodTypeAny, {
96
+ items: {
97
+ title: string;
98
+ image: {
99
+ src: string;
100
+ alt: string;
101
+ };
102
+ category: string;
103
+ }[];
104
+ }, {
105
+ items: {
106
+ title: string;
107
+ image: {
108
+ src: string;
109
+ alt: string;
110
+ };
111
+ category: string;
112
+ }[];
113
+ }>;
114
+ type PortfolioGridContent = z.infer<typeof PortfolioGridContentSchema>;
115
+
116
+ declare function PortfolioGrid({ content, theme }: BlockProps<PortfolioGridContent>): react_jsx_runtime.JSX.Element;
117
+
118
+ declare const PortfolioGridDefaultContent: PortfolioGridContent;
119
+
120
+ export { PortfolioGrid, type PortfolioGridContent, PortfolioGridContentSchema, PortfolioGridDefaultContent, PortfolioSplit, type PortfolioSplitContent, PortfolioSplitContentSchema, PortfolioSplitDefaultContent };
@@ -0,0 +1,115 @@
1
+ import { Box, Stack, Grid, Inline, cn, Card, CardContent, Badge } 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/portfolio/PortfolioSplit/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/portfolio/PortfolioSplit/schema.ts
29
+ var PortfolioItemSchema = z.object({
30
+ title: z.string(),
31
+ category: z.string(),
32
+ image: ImageSchema
33
+ }).strict();
34
+ var PortfolioSplitContentSchema = z.object({
35
+ heading: z.string(),
36
+ description: z.string().optional(),
37
+ items: z.array(PortfolioItemSchema).min(1)
38
+ }).strict();
39
+ function PortfolioSplit({ content, theme }) {
40
+ PortfolioSplitContentSchema.parse(content);
41
+ const { heading, description, items } = content;
42
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, 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: [
43
+ /* @__PURE__ */ jsxs(DStack, { gap: 4, className: cn("sticky top-16"), children: [
44
+ /* @__PURE__ */ jsx(DBox, { as: "h2", className: cn("text-3xl font-bold tracking-tight"), children: heading }),
45
+ description && /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", children: description })
46
+ ] }),
47
+ /* @__PURE__ */ jsx(DStack, { gap: 6, children: items.map((item, i) => /* @__PURE__ */ jsxs(Card, { children: [
48
+ /* @__PURE__ */ jsx(
49
+ DBox,
50
+ {
51
+ as: "img",
52
+ src: item.image.src,
53
+ alt: item.image.alt,
54
+ className: cn("w-full rounded-t-lg object-cover aspect-video")
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(DStack, { gap: 2, pt: 2, children: [
58
+ /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: item.category }),
59
+ /* @__PURE__ */ jsx(DBox, { as: "h3", className: cn("font-semibold text-lg"), children: item.title })
60
+ ] }) })
61
+ ] }, i)) })
62
+ ] }) });
63
+ }
64
+
65
+ // src/portfolio/PortfolioSplit/default.ts
66
+ var PortfolioSplitDefaultContent = {
67
+ heading: "Selected work",
68
+ description: "Projects spanning product design, engineering, and research.",
69
+ items: [
70
+ { title: "Commerce platform redesign", category: "Product", image: { src: "https://placehold.co/480x360", alt: "Commerce project" } },
71
+ { title: "Data visualisation system", category: "Engineering", image: { src: "https://placehold.co/480x360", alt: "Data project" } },
72
+ { title: "Design language rollout", category: "Design", image: { src: "https://placehold.co/480x360", alt: "Design project" } }
73
+ ]
74
+ };
75
+ var PortfolioItemSchema2 = z.object({
76
+ title: z.string(),
77
+ category: z.string(),
78
+ image: ImageSchema
79
+ }).strict();
80
+ var PortfolioGridContentSchema = z.object({
81
+ items: z.array(PortfolioItemSchema2).min(1)
82
+ }).strict();
83
+ function PortfolioGrid({ content, theme }) {
84
+ PortfolioGridContentSchema.parse(content);
85
+ const { items } = content;
86
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": "Portfolio", style: themeStyle(theme), children: /* @__PURE__ */ jsx(DGrid, { columns: 2, px: 6, py: 12, gap: 6, className: cn("max-w-6xl mx-auto"), children: items.map((item, i) => /* @__PURE__ */ jsxs(Card, { children: [
87
+ /* @__PURE__ */ jsx(
88
+ DBox,
89
+ {
90
+ as: "img",
91
+ src: item.image.src,
92
+ alt: item.image.alt,
93
+ className: cn("w-full rounded-t-lg object-cover aspect-video")
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(DStack, { gap: 2, pt: 2, children: [
97
+ /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: item.category }),
98
+ /* @__PURE__ */ jsx(DBox, { as: "h3", className: cn("font-semibold text-lg"), children: item.title })
99
+ ] }) })
100
+ ] }, i)) }) });
101
+ }
102
+
103
+ // src/portfolio/PortfolioGrid/default.ts
104
+ var PortfolioGridDefaultContent = {
105
+ items: [
106
+ { title: "Commerce platform redesign", category: "Product", image: { src: "https://placehold.co/480x360", alt: "Commerce project" } },
107
+ { title: "Data visualisation system", category: "Engineering", image: { src: "https://placehold.co/480x360", alt: "Data project" } },
108
+ { title: "Design language rollout", category: "Design", image: { src: "https://placehold.co/480x360", alt: "Design project" } },
109
+ { title: "Mobile app architecture", category: "Engineering", image: { src: "https://placehold.co/480x360", alt: "Mobile project" } }
110
+ ]
111
+ };
112
+
113
+ export { PortfolioGrid, PortfolioGridContentSchema, PortfolioGridDefaultContent, PortfolioSplit, PortfolioSplitContentSchema, PortfolioSplitDefaultContent };
114
+ //# sourceMappingURL=index.js.map
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/portfolio/PortfolioSplit/schema.ts","../../src/portfolio/PortfolioSplit/index.tsx","../../src/portfolio/PortfolioSplit/default.ts","../../src/portfolio/PortfolioGrid/schema.ts","../../src/portfolio/PortfolioGrid/index.tsx","../../src/portfolio/PortfolioGrid/default.ts"],"names":["z","PortfolioItemSchema","jsx","cn","jsxs","Card","CardContent","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 PortfolioItemSchema = z.object({\n title: z.string(),\n category: z.string(),\n image: ImageSchema,\n}).strict();\n\nexport const PortfolioSplitContentSchema = z.object({\n heading: z.string(),\n description: z.string().optional(),\n items: z.array(PortfolioItemSchema).min(1),\n}).strict();\n\nexport type PortfolioSplitContent = z.infer<typeof PortfolioSplitContentSchema>;\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 { PortfolioSplitContentSchema, type PortfolioSplitContent } from \"./schema\";\n\nexport function PortfolioSplit({ content, theme }: BlockProps<PortfolioSplitContent>) {\n PortfolioSplitContentSchema.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\")}>{heading}</DBox>\n {description && (\n <DBox as=\"p\" color=\"muted\">{description}</DBox>\n )}\n </DStack>\n <DStack gap={6}>\n {items.map((item, i) => (\n <Card key={i}>\n <DBox\n as=\"img\"\n src={item.image.src}\n alt={item.image.alt}\n className={cn(\"w-full rounded-t-lg object-cover aspect-video\")}\n />\n <CardContent>\n <DStack gap={2} pt={2}>\n <Badge variant=\"secondary\">{item.category}</Badge>\n <DBox as=\"h3\" className={cn(\"font-semibold text-lg\")}>{item.title}</DBox>\n </DStack>\n </CardContent>\n </Card>\n ))}\n </DStack>\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type PortfolioSplitContent } from \"./schema\";\n\nexport const PortfolioSplitDefaultContent: PortfolioSplitContent = {\n heading: \"Selected work\",\n description: \"Projects spanning product design, engineering, and research.\",\n items: [\n { title: \"Commerce platform redesign\", category: \"Product\", image: { src: \"https://placehold.co/480x360\", alt: \"Commerce project\" } },\n { title: \"Data visualisation system\", category: \"Engineering\", image: { src: \"https://placehold.co/480x360\", alt: \"Data project\" } },\n { title: \"Design language rollout\", category: \"Design\", image: { src: \"https://placehold.co/480x360\", alt: \"Design project\" } },\n ],\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { ImageSchema } from \"../../shared/schemas\";\n\nconst PortfolioItemSchema = z.object({\n title: z.string(),\n category: z.string(),\n image: ImageSchema,\n}).strict();\n\nexport const PortfolioGridContentSchema = z.object({\n items: z.array(PortfolioItemSchema).min(1),\n}).strict();\n\nexport type PortfolioGridContent = z.infer<typeof PortfolioGridContentSchema>;\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 { PortfolioGridContentSchema, type PortfolioGridContent } from \"./schema\";\n\nexport function PortfolioGrid({ content, theme }: BlockProps<PortfolioGridContent>) {\n PortfolioGridContentSchema.parse(content);\n const { items } = content;\n return (\n <DBox as=\"section\" aria-label=\"Portfolio\" style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={12} gap={6} className={cn(\"max-w-6xl mx-auto\")}>\n {items.map((item, i) => (\n <Card key={i}>\n <DBox\n as=\"img\"\n src={item.image.src}\n alt={item.image.alt}\n className={cn(\"w-full rounded-t-lg object-cover aspect-video\")}\n />\n <CardContent>\n <DStack gap={2} pt={2}>\n <Badge variant=\"secondary\">{item.category}</Badge>\n <DBox as=\"h3\" className={cn(\"font-semibold text-lg\")}>{item.title}</DBox>\n </DStack>\n </CardContent>\n </Card>\n ))}\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type PortfolioGridContent } from \"./schema\";\n\nexport const PortfolioGridDefaultContent: PortfolioGridContent = {\n items: [\n { title: \"Commerce platform redesign\", category: \"Product\", image: { src: \"https://placehold.co/480x360\", alt: \"Commerce project\" } },\n { title: \"Data visualisation system\", category: \"Engineering\", image: { src: \"https://placehold.co/480x360\", alt: \"Data project\" } },\n { title: \"Design language rollout\", category: \"Design\", image: { src: \"https://placehold.co/480x360\", alt: \"Design project\" } },\n { title: \"Mobile app architecture\", category: \"Engineering\", image: { src: \"https://placehold.co/480x360\", alt: \"Mobile project\" } },\n ],\n};\n"]}
@@ -0,0 +1,116 @@
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/post/PostSplit/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
+
30
+ // src/post/PostSplit/schema.ts
31
+ var PostSplitContentSchema = zod.z.object({
32
+ title: zod.z.string(),
33
+ author: zod.z.string(),
34
+ date: zod.z.string(),
35
+ category: zod.z.string().optional(),
36
+ body: zod.z.string(),
37
+ image: ImageSchema
38
+ }).strict();
39
+ function PostSplit({ content, theme }) {
40
+ PostSplitContentSchema.parse(content);
41
+ const { title, author, date, category, body, image } = content;
42
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 16, align: "start", className: vui.cn("max-w-6xl mx-auto"), children: [
43
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 6, className: vui.cn("sticky top-16"), children: [
44
+ category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: category }),
45
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h1", className: vui.cn("text-3xl font-bold tracking-tight leading-snug"), children: title }),
46
+ /* @__PURE__ */ jsxRuntime.jsx(vui.Separator, {}),
47
+ /* @__PURE__ */ jsxRuntime.jsxs(DInline, { gap: 2, color: "muted", className: vui.cn("text-sm"), children: [
48
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: author }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", "aria-hidden": "true", children: "\xB7" }),
50
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "time", dateTime: date, children: date })
51
+ ] })
52
+ ] }),
53
+ /* @__PURE__ */ jsxRuntime.jsxs(DStack, { gap: 6, children: [
54
+ /* @__PURE__ */ jsxRuntime.jsx(
55
+ DBox,
56
+ {
57
+ as: "img",
58
+ src: image.src,
59
+ alt: image.alt,
60
+ className: vui.cn("w-full rounded-lg object-cover aspect-video")
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", className: vui.cn("text-base leading-relaxed"), children: body })
64
+ ] })
65
+ ] }) });
66
+ }
67
+
68
+ // src/post/PostSplit/default.ts
69
+ var PostSplitDefaultContent = {
70
+ title: "Designing for composability",
71
+ author: "Alex Meridian",
72
+ date: "2026-05-01",
73
+ category: "Design systems",
74
+ 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.",
75
+ image: { src: "https://placehold.co/600x400", alt: "Post cover image" }
76
+ };
77
+ var PostCenteredContentSchema = zod.z.object({
78
+ title: zod.z.string(),
79
+ author: zod.z.string(),
80
+ date: zod.z.string(),
81
+ category: zod.z.string().optional(),
82
+ body: zod.z.string()
83
+ }).strict();
84
+ function PostCentered({ content, theme }) {
85
+ PostCenteredContentSchema.parse(content);
86
+ const { title, author, date, category, body } = content;
87
+ return /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "article", style: themeStyle(theme), children: /* @__PURE__ */ jsxRuntime.jsxs(DStack, { px: 6, py: 16, gap: 6, className: vui.cn("max-w-2xl mx-auto"), children: [
88
+ category && /* @__PURE__ */ jsxRuntime.jsx(vui.Badge, { variant: "secondary", children: category }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "h1", className: vui.cn("text-4xl font-bold tracking-tight leading-snug"), children: title }),
90
+ /* @__PURE__ */ jsxRuntime.jsxs(DInline, { gap: 2, color: "muted", className: vui.cn("text-sm"), children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", children: author }),
92
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "span", "aria-hidden": "true", children: "\xB7" }),
93
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "time", dateTime: date, children: date })
94
+ ] }),
95
+ /* @__PURE__ */ jsxRuntime.jsx(vui.Separator, {}),
96
+ /* @__PURE__ */ jsxRuntime.jsx(DBox, { as: "p", className: vui.cn("text-base leading-relaxed"), children: body })
97
+ ] }) });
98
+ }
99
+
100
+ // src/post/PostCentered/default.ts
101
+ var PostCenteredDefaultContent = {
102
+ title: "Designing for composability",
103
+ author: "Alex Meridian",
104
+ date: "2026-05-01",
105
+ category: "Design systems",
106
+ body: "Composable systems decouple structure from style, enabling teams to build faster without sacrificing consistency."
107
+ };
108
+
109
+ exports.PostCentered = PostCentered;
110
+ exports.PostCenteredContentSchema = PostCenteredContentSchema;
111
+ exports.PostCenteredDefaultContent = PostCenteredDefaultContent;
112
+ exports.PostSplit = PostSplit;
113
+ exports.PostSplitContentSchema = PostSplitContentSchema;
114
+ exports.PostSplitDefaultContent = PostSplitDefaultContent;
115
+ //# sourceMappingURL=index.cjs.map
116
+ //# sourceMappingURL=index.cjs.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":["dsl","Box","Stack","Grid","Inline","z","jsx","jsxs","cn","Badge","Separator"],"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\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,74 @@
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 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 };