@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,134 @@
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 HeroSplitContentSchema: z.ZodObject<{
7
+ eyebrow: z.ZodOptional<z.ZodString>;
8
+ heading: z.ZodString;
9
+ description: z.ZodString;
10
+ primaryCta: z.ZodObject<{
11
+ label: z.ZodString;
12
+ href: z.ZodString;
13
+ }, "strict", z.ZodTypeAny, {
14
+ label: string;
15
+ href: string;
16
+ }, {
17
+ label: string;
18
+ href: string;
19
+ }>;
20
+ secondaryCta: z.ZodOptional<z.ZodObject<{
21
+ label: z.ZodString;
22
+ href: z.ZodString;
23
+ }, "strict", z.ZodTypeAny, {
24
+ label: string;
25
+ href: string;
26
+ }, {
27
+ label: string;
28
+ href: string;
29
+ }>>;
30
+ image: z.ZodObject<{
31
+ src: z.ZodString;
32
+ alt: z.ZodString;
33
+ }, "strict", z.ZodTypeAny, {
34
+ src: string;
35
+ alt: string;
36
+ }, {
37
+ src: string;
38
+ alt: string;
39
+ }>;
40
+ }, "strict", z.ZodTypeAny, {
41
+ image: {
42
+ src: string;
43
+ alt: string;
44
+ };
45
+ heading: string;
46
+ description: string;
47
+ primaryCta: {
48
+ label: string;
49
+ href: string;
50
+ };
51
+ eyebrow?: string | undefined;
52
+ secondaryCta?: {
53
+ label: string;
54
+ href: string;
55
+ } | undefined;
56
+ }, {
57
+ image: {
58
+ src: string;
59
+ alt: string;
60
+ };
61
+ heading: string;
62
+ description: string;
63
+ primaryCta: {
64
+ label: string;
65
+ href: string;
66
+ };
67
+ eyebrow?: string | undefined;
68
+ secondaryCta?: {
69
+ label: string;
70
+ href: string;
71
+ } | undefined;
72
+ }>;
73
+ type HeroSplitContent = z.infer<typeof HeroSplitContentSchema>;
74
+
75
+ declare function HeroSplit({ content, theme }: BlockProps<HeroSplitContent>): react_jsx_runtime.JSX.Element;
76
+
77
+ declare const HeroSplitDefaultContent: HeroSplitContent;
78
+
79
+ declare const HeroCenteredContentSchema: z.ZodObject<{
80
+ eyebrow: z.ZodOptional<z.ZodString>;
81
+ heading: z.ZodString;
82
+ description: z.ZodString;
83
+ primaryCta: z.ZodObject<{
84
+ label: z.ZodString;
85
+ href: z.ZodString;
86
+ }, "strict", z.ZodTypeAny, {
87
+ label: string;
88
+ href: string;
89
+ }, {
90
+ label: string;
91
+ href: string;
92
+ }>;
93
+ secondaryCta: z.ZodOptional<z.ZodObject<{
94
+ label: z.ZodString;
95
+ href: z.ZodString;
96
+ }, "strict", z.ZodTypeAny, {
97
+ label: string;
98
+ href: string;
99
+ }, {
100
+ label: string;
101
+ href: string;
102
+ }>>;
103
+ }, "strict", z.ZodTypeAny, {
104
+ heading: string;
105
+ description: string;
106
+ primaryCta: {
107
+ label: string;
108
+ href: string;
109
+ };
110
+ eyebrow?: string | undefined;
111
+ secondaryCta?: {
112
+ label: string;
113
+ href: string;
114
+ } | undefined;
115
+ }, {
116
+ heading: string;
117
+ description: string;
118
+ primaryCta: {
119
+ label: string;
120
+ href: string;
121
+ };
122
+ eyebrow?: string | undefined;
123
+ secondaryCta?: {
124
+ label: string;
125
+ href: string;
126
+ } | undefined;
127
+ }>;
128
+ type HeroCenteredContent = z.infer<typeof HeroCenteredContentSchema>;
129
+
130
+ declare function HeroCentered({ content, theme }: BlockProps<HeroCenteredContent>): react_jsx_runtime.JSX.Element;
131
+
132
+ declare const HeroCenteredDefaultContent: HeroCenteredContent;
133
+
134
+ export { HeroCentered, type HeroCenteredContent, HeroCenteredContentSchema, HeroCenteredDefaultContent, HeroSplit, type HeroSplitContent, HeroSplitContentSchema, HeroSplitDefaultContent };
@@ -0,0 +1,101 @@
1
+ import { Box, Stack, Grid, Inline, cn, Button } from '@booga/vui';
2
+ import { dsl } from '@booga/vdsl';
3
+ import { z } from 'zod';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/hero/HeroSplit/index.tsx
7
+ var DBox = dsl(Box);
8
+ var DStack = dsl(Stack);
9
+ var DGrid = dsl(Grid);
10
+ var DInline = dsl(Inline);
11
+
12
+ // src/theme.ts
13
+ function themeStyle(theme) {
14
+ if (!theme) return void 0;
15
+ return Object.fromEntries(
16
+ Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])
17
+ );
18
+ }
19
+ var CtaSchema = z.object({
20
+ label: z.string(),
21
+ href: z.string()
22
+ }).strict();
23
+ var ImageSchema = z.object({
24
+ src: z.string(),
25
+ alt: z.string()
26
+ }).strict();
27
+
28
+ // src/hero/HeroSplit/schema.ts
29
+ var HeroSplitContentSchema = z.object({
30
+ eyebrow: z.string().optional(),
31
+ heading: z.string(),
32
+ description: z.string(),
33
+ primaryCta: CtaSchema,
34
+ secondaryCta: CtaSchema.optional(),
35
+ image: ImageSchema
36
+ }).strict();
37
+ function HeroSplit({ content, theme }) {
38
+ HeroSplitContentSchema.parse(content);
39
+ const { eyebrow, heading, description, primaryCta, secondaryCta, image } = content;
40
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DGrid, { columns: 2, px: 6, py: 16, gap: 12, align: "center", className: cn("max-w-6xl mx-auto"), children: [
41
+ /* @__PURE__ */ jsxs(DStack, { gap: 6, children: [
42
+ eyebrow && /* @__PURE__ */ jsx(DBox, { as: "p", color: "accent", className: cn("text-sm font-semibold uppercase tracking-widest"), children: eyebrow }),
43
+ /* @__PURE__ */ jsx(DBox, { as: "h1", className: cn("text-5xl font-bold tracking-tight leading-tight"), children: heading }),
44
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-lg"), children: description }),
45
+ /* @__PURE__ */ jsxs(DInline, { wrap: true, gap: 3, children: [
46
+ /* @__PURE__ */ jsx(Button, { as: "a", href: primaryCta.href, children: primaryCta.label }),
47
+ secondaryCta && /* @__PURE__ */ jsx(Button, { as: "a", href: secondaryCta.href, variant: "outline", children: secondaryCta.label })
48
+ ] })
49
+ ] }),
50
+ /* @__PURE__ */ jsx(
51
+ DBox,
52
+ {
53
+ as: "img",
54
+ src: image.src,
55
+ alt: image.alt,
56
+ className: cn("w-full rounded-lg object-cover aspect-video")
57
+ }
58
+ )
59
+ ] }) });
60
+ }
61
+
62
+ // src/hero/HeroSplit/default.ts
63
+ var HeroSplitDefaultContent = {
64
+ heading: "Build something remarkable",
65
+ description: "A composable foundation for ambitious teams. Typed, accessible, and ready to ship.",
66
+ primaryCta: { label: "Get started", href: "#" },
67
+ secondaryCta: { label: "Learn more", href: "#" },
68
+ image: { src: "https://placehold.co/600x400", alt: "Product preview" }
69
+ };
70
+ var HeroCenteredContentSchema = z.object({
71
+ eyebrow: z.string().optional(),
72
+ heading: z.string(),
73
+ description: z.string(),
74
+ primaryCta: CtaSchema,
75
+ secondaryCta: CtaSchema.optional()
76
+ }).strict();
77
+ function HeroCentered({ content, theme }) {
78
+ HeroCenteredContentSchema.parse(content);
79
+ const { eyebrow, heading, description, primaryCta, secondaryCta } = content;
80
+ return /* @__PURE__ */ jsx(DBox, { as: "section", "aria-label": heading, style: themeStyle(theme), children: /* @__PURE__ */ jsxs(DStack, { px: 6, py: 24, gap: 8, align: "center", className: cn("max-w-3xl mx-auto text-center"), children: [
81
+ eyebrow && /* @__PURE__ */ jsx(DBox, { as: "p", color: "accent", className: cn("text-sm font-semibold uppercase tracking-widest"), children: eyebrow }),
82
+ /* @__PURE__ */ jsx(DBox, { as: "h1", className: cn("text-5xl font-bold tracking-tight leading-tight"), children: heading }),
83
+ /* @__PURE__ */ jsx(DBox, { as: "p", color: "muted", className: cn("text-xl"), children: description }),
84
+ /* @__PURE__ */ jsxs(DInline, { wrap: true, gap: 3, justify: "center", children: [
85
+ /* @__PURE__ */ jsx(Button, { as: "a", href: primaryCta.href, children: primaryCta.label }),
86
+ secondaryCta && /* @__PURE__ */ jsx(Button, { as: "a", href: secondaryCta.href, variant: "outline", children: secondaryCta.label })
87
+ ] })
88
+ ] }) });
89
+ }
90
+
91
+ // src/hero/HeroCentered/default.ts
92
+ var HeroCenteredDefaultContent = {
93
+ heading: "The foundation for what comes next",
94
+ description: "Composable blocks, typed content, and zero boilerplate. Focus on the product.",
95
+ primaryCta: { label: "Start building", href: "#" },
96
+ secondaryCta: { label: "View docs", href: "#" }
97
+ };
98
+
99
+ export { HeroCentered, HeroCenteredContentSchema, HeroCenteredDefaultContent, HeroSplit, HeroSplitContentSchema, HeroSplitDefaultContent };
100
+ //# sourceMappingURL=index.js.map
101
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/primitives.ts","../../src/theme.ts","../../src/shared/schemas.ts","../../src/hero/HeroSplit/schema.ts","../../src/hero/HeroSplit/index.tsx","../../src/hero/HeroSplit/default.ts","../../src/hero/HeroCentered/schema.ts","../../src/hero/HeroCentered/index.tsx","../../src/hero/HeroCentered/default.ts"],"names":["z","jsx","jsxs","cn","Button"],"mappings":"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","file":"index.js","sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type ElementType } from \"react\";\nimport { dsl } from \"@booga/vdsl\";\nimport { Box, Stack, Grid, Inline } from \"@booga/vui\";\n\n// PolymorphicComponent is not structurally assignable to ElementType; dsl() uses\n// createElement() at runtime which accepts any callable, so the bridge is safe.\nexport const DBox = dsl(Box as unknown as ElementType);\nexport const DStack = dsl(Stack as unknown as ElementType);\nexport const DGrid = dsl(Grid as unknown as ElementType);\nexport const DInline = dsl(Inline as unknown as ElementType);\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type CSSProperties } from \"react\";\nimport { type ThemeOverride } from \"./types\";\n\nexport function themeStyle(theme: ThemeOverride | undefined): CSSProperties | undefined {\n if (!theme) return undefined;\n return Object.fromEntries(\n Object.entries(theme).map(([k, v]) => [`--v-${k}`, v])\n ) as CSSProperties;\n}\n\nexport function clampedGridCols(n: number): 1 | 2 | 3 | 4 | 5 | 6 {\n return Math.max(1, Math.min(6, Math.round(n))) as 1 | 2 | 3 | 4 | 5 | 6;\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\n\nexport const CtaSchema = z.object({\n label: z.string(),\n href: z.string(),\n}).strict();\n\nexport const ImageSchema = z.object({\n src: z.string(),\n alt: z.string(),\n}).strict();\n\nexport const AvatarSchema = ImageSchema;\n\nexport type Cta = z.infer<typeof CtaSchema>;\nexport type Image = z.infer<typeof ImageSchema>;\nexport type AvatarSrc = Image;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema, ImageSchema } from \"../../shared/schemas\";\n\nexport const HeroSplitContentSchema = z.object({\n eyebrow: z.string().optional(),\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n secondaryCta: CtaSchema.optional(),\n image: ImageSchema,\n}).strict();\n\nexport type HeroSplitContent = z.infer<typeof HeroSplitContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DGrid, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { HeroSplitContentSchema, type HeroSplitContent } from \"./schema\";\n\nexport function HeroSplit({ content, theme }: BlockProps<HeroSplitContent>) {\n HeroSplitContentSchema.parse(content);\n const { eyebrow, heading, description, primaryCta, secondaryCta, image } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DGrid columns={2} px={6} py={16} gap={12} align=\"center\" className={cn(\"max-w-6xl mx-auto\")}>\n <DStack gap={6}>\n {eyebrow && (\n <DBox as=\"p\" color=\"accent\" className={cn(\"text-sm font-semibold uppercase tracking-widest\")}>\n {eyebrow}\n </DBox>\n )}\n <DBox as=\"h1\" className={cn(\"text-5xl font-bold tracking-tight leading-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-lg\")}>\n {description}\n </DBox>\n <DInline wrap gap={3}>\n <Button as=\"a\" href={primaryCta.href}>{primaryCta.label}</Button>\n {secondaryCta && (\n <Button as=\"a\" href={secondaryCta.href} variant=\"outline\">\n {secondaryCta.label}\n </Button>\n )}\n </DInline>\n </DStack>\n <DBox\n as=\"img\"\n src={image.src}\n alt={image.alt}\n className={cn(\"w-full rounded-lg object-cover aspect-video\")}\n />\n </DGrid>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type HeroSplitContent } from \"./schema\";\n\nexport const HeroSplitDefaultContent: HeroSplitContent = {\n heading: \"Build something remarkable\",\n description: \"A composable foundation for ambitious teams. Typed, accessible, and ready to ship.\",\n primaryCta: { label: \"Get started\", href: \"#\" },\n secondaryCta: { label: \"Learn more\", href: \"#\" },\n image: { src: \"https://placehold.co/600x400\", alt: \"Product preview\" },\n};\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { z } from \"zod\";\nimport { CtaSchema } from \"../../shared/schemas\";\n\nexport const HeroCenteredContentSchema = z.object({\n eyebrow: z.string().optional(),\n heading: z.string(),\n description: z.string(),\n primaryCta: CtaSchema,\n secondaryCta: CtaSchema.optional(),\n}).strict();\n\nexport type HeroCenteredContent = z.infer<typeof HeroCenteredContentSchema>;\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { Button, cn } from \"@booga/vui\";\nimport { DBox, DInline, DStack } from \"../../primitives\";\nimport { type BlockProps } from \"../../types\";\nimport { themeStyle } from \"../../theme\";\nimport { HeroCenteredContentSchema, type HeroCenteredContent } from \"./schema\";\n\nexport function HeroCentered({ content, theme }: BlockProps<HeroCenteredContent>) {\n HeroCenteredContentSchema.parse(content);\n const { eyebrow, heading, description, primaryCta, secondaryCta } = content;\n return (\n <DBox as=\"section\" aria-label={heading} style={themeStyle(theme)}>\n <DStack px={6} py={24} gap={8} align=\"center\" className={cn(\"max-w-3xl mx-auto text-center\")}>\n {eyebrow && (\n <DBox as=\"p\" color=\"accent\" className={cn(\"text-sm font-semibold uppercase tracking-widest\")}>\n {eyebrow}\n </DBox>\n )}\n <DBox as=\"h1\" className={cn(\"text-5xl font-bold tracking-tight leading-tight\")}>\n {heading}\n </DBox>\n <DBox as=\"p\" color=\"muted\" className={cn(\"text-xl\")}>\n {description}\n </DBox>\n <DInline wrap gap={3} justify=\"center\">\n <Button as=\"a\" href={primaryCta.href}>{primaryCta.label}</Button>\n {secondaryCta && (\n <Button as=\"a\" href={secondaryCta.href} variant=\"outline\">\n {secondaryCta.label}\n </Button>\n )}\n </DInline>\n </DStack>\n </DBox>\n );\n}\n","// SPDX-License-Identifier: MIT\n// Copyright (c) 2026 bvasilenko\nimport { type HeroCenteredContent } from \"./schema\";\n\nexport const HeroCenteredDefaultContent: HeroCenteredContent = {\n heading: \"The foundation for what comes next\",\n description: \"Composable blocks, typed content, and zero boilerplate. Focus on the product.\",\n primaryCta: { label: \"Start building\", href: \"#\" },\n secondaryCta: { label: \"View docs\", href: \"#\" },\n};\n"]}