@opensite/ui 2.0.6 → 2.0.8

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 (77) hide show
  1. package/dist/hero-adaptable-product-grid.cjs +1 -1
  2. package/dist/hero-adaptable-product-grid.js +1 -1
  3. package/dist/hero-agency-animated-images.cjs +795 -631
  4. package/dist/hero-agency-animated-images.d.cts +13 -9
  5. package/dist/hero-agency-animated-images.d.ts +13 -9
  6. package/dist/hero-agency-animated-images.js +794 -630
  7. package/dist/hero-business-carousel-dots.cjs +822 -911
  8. package/dist/hero-business-carousel-dots.d.cts +5 -1
  9. package/dist/hero-business-carousel-dots.d.ts +5 -1
  10. package/dist/hero-business-carousel-dots.js +824 -910
  11. package/dist/hero-coming-soon-countdown.cjs +267 -110
  12. package/dist/hero-coming-soon-countdown.d.cts +8 -11
  13. package/dist/hero-coming-soon-countdown.d.ts +8 -11
  14. package/dist/hero-coming-soon-countdown.js +268 -111
  15. package/dist/hero-conversation-intelligence.cjs +673 -639
  16. package/dist/hero-conversation-intelligence.js +663 -629
  17. package/dist/hero-creative-studio-stacked.cjs +899 -861
  18. package/dist/hero-creative-studio-stacked.d.cts +16 -15
  19. package/dist/hero-creative-studio-stacked.d.ts +16 -15
  20. package/dist/hero-creative-studio-stacked.js +897 -859
  21. package/dist/hero-customer-support-layered.cjs +89 -76
  22. package/dist/hero-customer-support-layered.js +89 -76
  23. package/dist/hero-developer-tools-code.cjs +721 -669
  24. package/dist/hero-developer-tools-code.d.cts +5 -1
  25. package/dist/hero-developer-tools-code.d.ts +5 -1
  26. package/dist/hero-developer-tools-code.js +719 -667
  27. package/dist/hero-digital-agency-fullscreen.cjs +722 -680
  28. package/dist/hero-digital-agency-fullscreen.d.cts +4 -20
  29. package/dist/hero-digital-agency-fullscreen.d.ts +4 -20
  30. package/dist/hero-digital-agency-fullscreen.js +722 -680
  31. package/dist/hero-ecommerce-product-showcase.cjs +892 -846
  32. package/dist/hero-ecommerce-product-showcase.js +889 -843
  33. package/dist/hero-enterprise-security.cjs +168 -132
  34. package/dist/hero-enterprise-security.d.cts +12 -19
  35. package/dist/hero-enterprise-security.d.ts +12 -19
  36. package/dist/hero-enterprise-security.js +168 -132
  37. package/dist/hero-event-registration.cjs +39 -39
  38. package/dist/hero-event-registration.js +39 -39
  39. package/dist/hero-fullscreen-background-image.cjs +3 -2
  40. package/dist/hero-fullscreen-background-image.js +3 -2
  41. package/dist/hero-fullscreen-logo-cta.cjs +4 -2
  42. package/dist/hero-fullscreen-logo-cta.js +4 -2
  43. package/dist/hero-innovation-image-grid.cjs +2 -2
  44. package/dist/hero-innovation-image-grid.js +2 -2
  45. package/dist/hero-mental-health-team.cjs +17 -17
  46. package/dist/hero-mental-health-team.d.cts +5 -5
  47. package/dist/hero-mental-health-team.d.ts +5 -5
  48. package/dist/hero-mental-health-team.js +17 -17
  49. package/dist/hero-mobile-app-download.cjs +2 -2
  50. package/dist/hero-mobile-app-download.js +2 -2
  51. package/dist/hero-newsletter-minimal.cjs +97 -57
  52. package/dist/hero-newsletter-minimal.d.cts +5 -1
  53. package/dist/hero-newsletter-minimal.d.ts +5 -1
  54. package/dist/hero-newsletter-minimal.js +97 -57
  55. package/dist/hero-shared-inbox-layered.cjs +522 -42
  56. package/dist/hero-shared-inbox-layered.d.cts +20 -4
  57. package/dist/hero-shared-inbox-layered.d.ts +20 -4
  58. package/dist/hero-shared-inbox-layered.js +505 -40
  59. package/dist/hero-startup-launch-cta.cjs +859 -816
  60. package/dist/hero-startup-launch-cta.d.cts +3 -2
  61. package/dist/hero-startup-launch-cta.d.ts +3 -2
  62. package/dist/hero-startup-launch-cta.js +858 -815
  63. package/dist/hero-therapy-testimonial-grid.cjs +1 -1
  64. package/dist/hero-therapy-testimonial-grid.js +1 -1
  65. package/dist/hero-video-dialog-gradient-BnCFFec0.d.ts +99 -0
  66. package/dist/hero-video-dialog-gradient-Dapebkzu.d.cts +99 -0
  67. package/dist/hero-video-dialog-gradient.cjs +24 -23
  68. package/dist/hero-video-dialog-gradient.d.cts +4 -94
  69. package/dist/hero-video-dialog-gradient.d.ts +4 -94
  70. package/dist/hero-video-dialog-gradient.js +24 -23
  71. package/dist/hero-welcome-asymmetric-images.cjs +652 -617
  72. package/dist/hero-welcome-asymmetric-images.d.cts +5 -1
  73. package/dist/hero-welcome-asymmetric-images.d.ts +5 -1
  74. package/dist/hero-welcome-asymmetric-images.js +651 -616
  75. package/dist/registry.cjs +1111 -848
  76. package/dist/registry.js +1111 -848
  77. package/package.json +1 -1
@@ -1,194 +1,391 @@
1
1
  "use client";
2
- import * as React from 'react';
3
- import React__default, { useMemo } from 'react';
2
+ import * as React3 from 'react';
3
+ import React3__default, { useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
- import { cva } from 'class-variance-authority';
7
- import { jsx, jsxs } from 'react/jsx-runtime';
8
6
  import { Img } from '@page-speed/img';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
+ import { cva } from 'class-variance-authority';
9
9
 
10
10
  // components/blocks/hero/hero-welcome-asymmetric-images.tsx
11
11
  function cn(...inputs) {
12
12
  return twMerge(clsx(inputs));
13
13
  }
14
- function normalizePhoneNumber(input) {
15
- const trimmed = input.trim();
16
- if (trimmed.toLowerCase().startsWith("tel:")) {
17
- return trimmed;
18
- }
19
- const match = trimmed.match(/^[\s\+\-\(\)]*(\d[\d\s\-\(\)\.]*\d)[\s\-]*(x|ext\.?|extension)?[\s\-]*(\d+)?$/i);
20
- if (match) {
21
- const mainNumber = match[1].replace(/[\s\-\(\)\.]/g, "");
22
- const extension = match[3];
23
- const normalized = mainNumber.length >= 10 && !trimmed.startsWith("+") ? `+${mainNumber}` : mainNumber;
24
- const withExtension = extension ? `${normalized};ext=${extension}` : normalized;
25
- return `tel:${withExtension}`;
26
- }
27
- const cleaned = trimmed.replace(/[\s\-\(\)\.]/g, "");
28
- return `tel:${cleaned}`;
29
- }
30
- function normalizeEmail(input) {
31
- const trimmed = input.trim();
32
- if (trimmed.toLowerCase().startsWith("mailto:")) {
33
- return trimmed;
34
- }
35
- return `mailto:${trimmed}`;
36
- }
37
- function isEmail(input) {
38
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
39
- return emailRegex.test(input.trim());
40
- }
41
- function isPhoneNumber(input) {
42
- const trimmed = input.trim();
43
- if (trimmed.toLowerCase().startsWith("tel:")) {
44
- return true;
45
- }
46
- const phoneRegex = /^[\s\+\-\(\)]*\d[\d\s\-\(\)\.]*\d[\s\-]*(x|ext\.?|extension)?[\s\-]*\d*$/i;
47
- return phoneRegex.test(trimmed);
48
- }
49
- function isInternalUrl(href) {
50
- if (typeof window === "undefined") {
51
- return href.startsWith("/") && !href.startsWith("//");
52
- }
53
- const trimmed = href.trim();
54
- if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
55
- return true;
56
- }
57
- try {
58
- const url = new URL(trimmed, window.location.href);
59
- const currentOrigin = window.location.origin;
60
- const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
61
- return normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin);
62
- } catch {
63
- return false;
14
+ var maxWidthStyles = {
15
+ sm: "max-w-screen-sm",
16
+ md: "max-w-screen-md",
17
+ lg: "max-w-screen-lg",
18
+ xl: "max-w-7xl",
19
+ "2xl": "max-w-screen-2xl",
20
+ "4xl": "max-w-[1536px]",
21
+ full: "max-w-full"
22
+ };
23
+ var Container = React3__default.forwardRef(
24
+ ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
25
+ const Component = as;
26
+ return /* @__PURE__ */ jsx(
27
+ Component,
28
+ {
29
+ ref,
30
+ className: cn(
31
+ "mx-auto w-full px-2 sm:px-4 lg:px-8",
32
+ maxWidthStyles[maxWidth],
33
+ className
34
+ ),
35
+ ...props,
36
+ children
37
+ }
38
+ );
64
39
  }
65
- }
66
- function toRelativePath(href) {
67
- if (typeof window === "undefined") {
68
- return href;
40
+ );
41
+ Container.displayName = "Container";
42
+
43
+ // lib/patternSvgs.ts
44
+ var patternSvgs = {
45
+ squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
46
+ grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
47
+ noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
48
+ dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
49
+ dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
50
+ dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
51
+ circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
52
+ waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
53
+ crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
54
+ architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
55
+ tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
56
+ p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
57
+ };
58
+ var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
59
+ var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
60
+ var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
61
+ var maskTopLeft = "radial-gradient(ellipse 80% 80% at 0% 0%, #000 50%, transparent 90%)";
62
+ var maskTopRight = "radial-gradient(ellipse 80% 80% at 100% 0%, #000 50%, transparent 90%)";
63
+ var maskBottomLeft = "radial-gradient(ellipse 80% 80% at 0% 100%, #000 50%, transparent 90%)";
64
+ var maskBottomRight = "radial-gradient(ellipse 80% 80% at 100% 100%, #000 50%, transparent 90%)";
65
+ var circuitBoardPattern = (id, mask) => /* @__PURE__ */ jsxs(
66
+ "svg",
67
+ {
68
+ className: "h-full w-full",
69
+ xmlns: "http://www.w3.org/2000/svg",
70
+ style: mask ? {
71
+ maskImage: mask,
72
+ WebkitMaskImage: mask
73
+ } : void 0,
74
+ children: [
75
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
76
+ "pattern",
77
+ {
78
+ id,
79
+ x: "0",
80
+ y: "0",
81
+ width: "100",
82
+ height: "100",
83
+ patternUnits: "userSpaceOnUse",
84
+ children: [
85
+ /* @__PURE__ */ jsx(
86
+ "path",
87
+ {
88
+ d: "M0 50h40M60 50h40M50 0v40M50 60v40",
89
+ stroke: "hsl(var(--muted))",
90
+ strokeWidth: "1",
91
+ fill: "none"
92
+ }
93
+ ),
94
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "3", fill: "hsl(var(--muted))" }),
95
+ /* @__PURE__ */ jsx("circle", { cx: "0", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
96
+ /* @__PURE__ */ jsx("circle", { cx: "100", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
97
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "0", r: "2", fill: "hsl(var(--muted))" }),
98
+ /* @__PURE__ */ jsx("circle", { cx: "50", cy: "100", r: "2", fill: "hsl(var(--muted))" })
99
+ ]
100
+ }
101
+ ) }),
102
+ /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
103
+ ]
69
104
  }
70
- const trimmed = href.trim();
71
- if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
72
- return trimmed;
105
+ );
106
+ var gridDotsPattern = (id, mask) => /* @__PURE__ */ jsxs(
107
+ "svg",
108
+ {
109
+ className: "h-full w-full",
110
+ xmlns: "http://www.w3.org/2000/svg",
111
+ style: mask ? {
112
+ maskImage: mask,
113
+ WebkitMaskImage: mask
114
+ } : void 0,
115
+ children: [
116
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
117
+ "pattern",
118
+ {
119
+ id,
120
+ x: "0",
121
+ y: "0",
122
+ width: "40",
123
+ height: "40",
124
+ patternUnits: "userSpaceOnUse",
125
+ children: [
126
+ /* @__PURE__ */ jsx(
127
+ "path",
128
+ {
129
+ d: "M0 20h40M20 0v40",
130
+ stroke: "hsl(var(--muted))",
131
+ strokeWidth: "0.5",
132
+ fill: "none"
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsx("circle", { cx: "20", cy: "20", r: "2", fill: "hsl(var(--muted))" })
136
+ ]
137
+ }
138
+ ) }),
139
+ /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
140
+ ]
73
141
  }
74
- try {
75
- const url = new URL(trimmed, window.location.href);
76
- const currentOrigin = window.location.origin;
77
- const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
78
- if (normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin)) {
79
- return url.pathname + url.search + url.hash;
142
+ );
143
+ var gridPattern = (size, mask) => /* @__PURE__ */ jsx(
144
+ "div",
145
+ {
146
+ className: "h-full w-full bg-[linear-gradient(to_right,_hsl(var(--muted))_1px,_transparent_1px),linear-gradient(to_bottom,_hsl(var(--muted))_1px,_transparent_1px)]",
147
+ style: {
148
+ backgroundSize: `${size}px ${size}px`,
149
+ ...mask ? {
150
+ maskImage: mask,
151
+ WebkitMaskImage: mask
152
+ } : {}
80
153
  }
81
- } catch {
82
154
  }
83
- return trimmed;
84
- }
85
- function useNavigation({
86
- href,
87
- onClick
88
- } = {}) {
89
- const linkType = React.useMemo(() => {
90
- if (!href || href.trim() === "") {
91
- return onClick ? "none" : "none";
92
- }
93
- const trimmed = href.trim();
94
- if (trimmed.toLowerCase().startsWith("mailto:") || isEmail(trimmed)) {
95
- return "mailto";
96
- }
97
- if (trimmed.toLowerCase().startsWith("tel:") || isPhoneNumber(trimmed)) {
98
- return "tel";
99
- }
100
- if (isInternalUrl(trimmed)) {
101
- return "internal";
102
- }
103
- try {
104
- new URL(trimmed, typeof window !== "undefined" ? window.location.href : "http://localhost");
105
- return "external";
106
- } catch {
107
- return "internal";
108
- }
109
- }, [href, onClick]);
110
- const normalizedHref = React.useMemo(() => {
111
- if (!href || href.trim() === "") {
112
- return void 0;
155
+ );
156
+ var diagonalCrossPattern = (mask) => /* @__PURE__ */ jsx(
157
+ "div",
158
+ {
159
+ className: "h-full w-full",
160
+ style: {
161
+ backgroundImage: "repeating-linear-gradient(45deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px), repeating-linear-gradient(135deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px)",
162
+ ...mask ? {
163
+ maskImage: mask,
164
+ WebkitMaskImage: mask
165
+ } : {}
113
166
  }
114
- const trimmed = href.trim();
115
- switch (linkType) {
116
- case "tel":
117
- return normalizePhoneNumber(trimmed);
118
- case "mailto":
119
- return normalizeEmail(trimmed);
120
- case "internal":
121
- return toRelativePath(trimmed);
122
- case "external":
123
- return trimmed;
124
- default:
125
- return trimmed;
167
+ }
168
+ );
169
+ var dashedGridMaskBase = "repeating-linear-gradient(to right, black 0px, black 3px, transparent 3px, transparent 8px), repeating-linear-gradient(to bottom, black 0px, black 3px, transparent 3px, transparent 8px)";
170
+ var dashedGridPattern = (fadeMask) => {
171
+ const mask = fadeMask ? `${dashedGridMaskBase}, ${fadeMask}` : dashedGridMaskBase;
172
+ return /* @__PURE__ */ jsx(
173
+ "div",
174
+ {
175
+ className: "h-full w-full",
176
+ style: {
177
+ backgroundImage: "linear-gradient(to right, hsl(var(--muted)) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--muted)) 1px, transparent 1px)",
178
+ backgroundSize: "20px 20px",
179
+ backgroundPosition: "0 0, 0 0",
180
+ maskImage: mask,
181
+ WebkitMaskImage: mask,
182
+ maskComposite: "intersect",
183
+ WebkitMaskComposite: "source-in"
184
+ }
126
185
  }
127
- }, [href, linkType]);
128
- const target = React.useMemo(() => {
129
- switch (linkType) {
130
- case "external":
131
- return "_blank";
132
- case "internal":
133
- return "_self";
134
- case "mailto":
135
- case "tel":
136
- return void 0;
137
- default:
138
- return void 0;
186
+ );
187
+ };
188
+ var gradientGlow = (position) => /* @__PURE__ */ jsx(
189
+ "div",
190
+ {
191
+ className: cn(
192
+ "pointer-events-none absolute left-1/2 z-0 aspect-square w-3/4 -translate-x-1/2 rounded-full opacity-50 blur-3xl",
193
+ position === "top" ? "-top-1/4" : "-bottom-1/4"
194
+ ),
195
+ style: {
196
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
139
197
  }
140
- }, [linkType]);
141
- const rel = React.useMemo(() => {
142
- if (linkType === "external") {
143
- return "noopener noreferrer";
198
+ }
199
+ );
200
+ var spotlight = (position) => /* @__PURE__ */ jsx(
201
+ "div",
202
+ {
203
+ className: cn(
204
+ "pointer-events-none absolute top-1/2 z-0 aspect-square w-3/4 -translate-y-1/2 rounded-full opacity-40 blur-3xl",
205
+ position === "left" ? "-left-1/4" : "-right-1/4"
206
+ ),
207
+ style: {
208
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
144
209
  }
145
- return void 0;
146
- }, [linkType]);
147
- const isExternal = linkType === "external";
148
- const isInternal = linkType === "internal";
149
- const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
150
- const handleClick = React.useCallback(
151
- (event) => {
152
- if (onClick) {
153
- try {
154
- onClick(event);
155
- } catch (error) {
156
- console.error("Error in user onClick handler:", error);
157
- }
158
- }
159
- if (event.defaultPrevented) {
160
- return;
210
+ }
211
+ );
212
+ var patternOverlays = {
213
+ circuitBoardBasic: () => circuitBoardPattern("circuit-board-basic"),
214
+ circuitBoardFadeTop: () => circuitBoardPattern("circuit-board-fade-top", maskTop),
215
+ circuitBoardFadeBottom: () => circuitBoardPattern("circuit-board-fade-bottom", maskBottom),
216
+ circuitBoardFadeCenter: () => circuitBoardPattern("circuit-board-fade-center", maskCenter),
217
+ circuitBoardFadeTopLeft: () => circuitBoardPattern("circuit-board-fade-top-left", maskTopLeft),
218
+ circuitBoardFadeTopRight: () => circuitBoardPattern("circuit-board-fade-top-right", maskTopRight),
219
+ circuitBoardFadeBottomLeft: () => circuitBoardPattern("circuit-board-fade-bottom-left", maskBottomLeft),
220
+ circuitBoardFadeBottomRight: () => circuitBoardPattern("circuit-board-fade-bottom-right", maskBottomRight),
221
+ dashedGridBasic: () => dashedGridPattern(),
222
+ dashedGridFadeTop: () => dashedGridPattern(maskTop),
223
+ dashedGridFadeBottom: () => dashedGridPattern(maskBottom),
224
+ dashedGridFadeCenter: () => dashedGridPattern(maskCenter),
225
+ dashedGridFadeTopLeft: () => dashedGridPattern(maskTopLeft),
226
+ dashedGridFadeTopRight: () => dashedGridPattern(maskTopRight),
227
+ dashedGridFadeBottomLeft: () => dashedGridPattern(maskBottomLeft),
228
+ dashedGridFadeBottomRight: () => dashedGridPattern(maskBottomRight),
229
+ diagonalCrossBasic: () => diagonalCrossPattern(),
230
+ diagonalCrossFadeTop: () => diagonalCrossPattern(maskTop),
231
+ diagonalCrossFadeBottom: () => diagonalCrossPattern(maskBottom),
232
+ diagonalCrossFadeCenter: () => diagonalCrossPattern(maskCenter),
233
+ diagonalCrossFadeTopLeft: () => diagonalCrossPattern(maskTopLeft),
234
+ diagonalCrossFadeTopRight: () => diagonalCrossPattern(maskTopRight),
235
+ diagonalCrossFadeBottomLeft: () => diagonalCrossPattern(maskBottomLeft),
236
+ diagonalCrossFadeBottomRight: () => diagonalCrossPattern(maskBottomRight),
237
+ gridBasic: () => gridPattern(40),
238
+ gridFadeTop: () => gridPattern(32, maskTop),
239
+ gridFadeBottom: () => gridPattern(32, maskBottom),
240
+ gridFadeCenter: () => gridPattern(40, maskCenter),
241
+ gridFadeTopLeft: () => gridPattern(32, maskTopLeft),
242
+ gridFadeTopRight: () => gridPattern(32, maskTopRight),
243
+ gridFadeBottomLeft: () => gridPattern(32, maskBottomLeft),
244
+ gridFadeBottomRight: () => gridPattern(32, maskBottomRight),
245
+ gridDotsBasic: () => gridDotsPattern("grid-dots-basic"),
246
+ gridDotsFadeCenter: () => gridDotsPattern("grid-dots-fade-center", maskCenter),
247
+ gradientGlowTop: () => gradientGlow("top"),
248
+ gradientGlowBottom: () => gradientGlow("bottom"),
249
+ spotlightLeft: () => spotlight("left"),
250
+ spotlightRight: () => spotlight("right")
251
+ };
252
+ var inlinePatternStyles = {
253
+ radialGradientTop: {
254
+ background: "radial-gradient(125% 125% at 50% 10%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
255
+ },
256
+ radialGradientBottom: {
257
+ background: "radial-gradient(125% 125% at 50% 90%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
258
+ }
259
+ };
260
+ function PatternBackground({
261
+ pattern,
262
+ opacity = 0.08,
263
+ className,
264
+ style
265
+ }) {
266
+ if (!pattern) {
267
+ return null;
268
+ }
269
+ if (pattern in inlinePatternStyles) {
270
+ const inlineStyle = inlinePatternStyles[pattern];
271
+ return /* @__PURE__ */ jsx(
272
+ "div",
273
+ {
274
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
275
+ style: { ...inlineStyle, opacity, ...style },
276
+ "aria-hidden": "true"
161
277
  }
162
- if (shouldUseRouter && normalizedHref && event.button === 0 && // left-click only
163
- !event.metaKey && !event.altKey && !event.ctrlKey && !event.shiftKey) {
164
- if (typeof window !== "undefined") {
165
- const handler = window.__opensiteNavigationHandler;
166
- if (typeof handler === "function") {
167
- try {
168
- const handled = handler(normalizedHref, event.nativeEvent || event);
169
- if (handled !== false) {
170
- event.preventDefault();
171
- }
172
- } catch (error) {
173
- console.error("Error in navigation handler:", error);
174
- }
175
- }
176
- }
278
+ );
279
+ }
280
+ if (pattern in patternOverlays) {
281
+ const Overlay = patternOverlays[pattern];
282
+ return /* @__PURE__ */ jsx(
283
+ "div",
284
+ {
285
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
286
+ style: { opacity, ...style },
287
+ "aria-hidden": "true",
288
+ children: Overlay()
177
289
  }
178
- },
179
- [onClick, shouldUseRouter, normalizedHref]
290
+ );
291
+ }
292
+ const patternUrl = pattern in patternSvgs ? patternSvgs[pattern] : pattern;
293
+ return /* @__PURE__ */ jsx(
294
+ "div",
295
+ {
296
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
297
+ style: {
298
+ backgroundImage: `url(${patternUrl})`,
299
+ backgroundRepeat: "repeat",
300
+ backgroundSize: "auto",
301
+ opacity,
302
+ ...style
303
+ },
304
+ "aria-hidden": "true"
305
+ }
180
306
  );
181
- return {
182
- linkType,
183
- normalizedHref,
184
- target,
185
- rel,
186
- isExternal,
187
- isInternal,
188
- shouldUseRouter,
189
- handleClick
190
- };
191
307
  }
308
+ var backgroundStyles = {
309
+ default: "bg-background text-foreground",
310
+ white: "bg-white text-dark",
311
+ gray: "bg-muted/30 text-foreground",
312
+ dark: "bg-foreground text-background",
313
+ transparent: "bg-transparent text-foreground",
314
+ gradient: "bg-linear-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
315
+ primary: "bg-primary text-primary-foreground",
316
+ secondary: "bg-secondary text-secondary-foreground",
317
+ muted: "bg-muted text-muted-foreground"
318
+ };
319
+ var spacingStyles = {
320
+ none: "py-0 md:py-0",
321
+ sm: "py-12 md:py-16",
322
+ md: "py-16 md:py-24",
323
+ lg: "py-20 md:py-32",
324
+ xl: "py-24 md:py-40"
325
+ };
326
+ var predefinedSpacings = ["none", "sm", "md", "lg", "xl"];
327
+ var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
328
+ var Section = React3__default.forwardRef(
329
+ ({
330
+ id,
331
+ title,
332
+ subtitle,
333
+ children,
334
+ className,
335
+ style,
336
+ background = "default",
337
+ spacing = "lg",
338
+ pattern,
339
+ patternOpacity,
340
+ patternClassName,
341
+ containerClassName,
342
+ containerMaxWidth = "xl",
343
+ ...props
344
+ }, ref) => {
345
+ const effectivePatternOpacity = patternOpacity !== void 0 ? patternOpacity : pattern ? 1 : 0;
346
+ return /* @__PURE__ */ jsxs(
347
+ "section",
348
+ {
349
+ ref,
350
+ id,
351
+ className: cn(
352
+ "relative",
353
+ pattern ? "overflow-hidden" : null,
354
+ backgroundStyles[background],
355
+ isPredefinedSpacing(spacing) ? spacingStyles[spacing] : spacing,
356
+ className
357
+ ),
358
+ style,
359
+ ...props,
360
+ children: [
361
+ /* @__PURE__ */ jsx(
362
+ PatternBackground,
363
+ {
364
+ pattern,
365
+ opacity: effectivePatternOpacity,
366
+ className: patternClassName
367
+ }
368
+ ),
369
+ /* @__PURE__ */ jsxs(
370
+ Container,
371
+ {
372
+ maxWidth: containerMaxWidth,
373
+ className: cn("relative z-10", containerClassName),
374
+ children: [
375
+ (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "mb-6 text-center md:mb-16", children: [
376
+ subtitle && /* @__PURE__ */ jsx("p", { className: "mb-2 text-sm font-semibold uppercase tracking-wider", children: subtitle }),
377
+ title && /* @__PURE__ */ jsx("h2", { className: "text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title })
378
+ ] }),
379
+ children
380
+ ]
381
+ }
382
+ )
383
+ ]
384
+ }
385
+ );
386
+ }
387
+ );
388
+ Section.displayName = "Section";
192
389
  var baseStyles = [
193
390
  // Layout
194
391
  "inline-flex items-center justify-center gap-2 whitespace-nowrap shrink-0",
@@ -331,7 +528,185 @@ var buttonVariants = cva(baseStyles, {
331
528
  size: "default"
332
529
  }
333
530
  });
334
- var Pressable = React.forwardRef(
531
+ function normalizePhoneNumber(input) {
532
+ const trimmed = input.trim();
533
+ if (trimmed.toLowerCase().startsWith("tel:")) {
534
+ return trimmed;
535
+ }
536
+ const match = trimmed.match(/^[\s\+\-\(\)]*(\d[\d\s\-\(\)\.]*\d)[\s\-]*(x|ext\.?|extension)?[\s\-]*(\d+)?$/i);
537
+ if (match) {
538
+ const mainNumber = match[1].replace(/[\s\-\(\)\.]/g, "");
539
+ const extension = match[3];
540
+ const normalized = mainNumber.length >= 10 && !trimmed.startsWith("+") ? `+${mainNumber}` : mainNumber;
541
+ const withExtension = extension ? `${normalized};ext=${extension}` : normalized;
542
+ return `tel:${withExtension}`;
543
+ }
544
+ const cleaned = trimmed.replace(/[\s\-\(\)\.]/g, "");
545
+ return `tel:${cleaned}`;
546
+ }
547
+ function normalizeEmail(input) {
548
+ const trimmed = input.trim();
549
+ if (trimmed.toLowerCase().startsWith("mailto:")) {
550
+ return trimmed;
551
+ }
552
+ return `mailto:${trimmed}`;
553
+ }
554
+ function isEmail(input) {
555
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
556
+ return emailRegex.test(input.trim());
557
+ }
558
+ function isPhoneNumber(input) {
559
+ const trimmed = input.trim();
560
+ if (trimmed.toLowerCase().startsWith("tel:")) {
561
+ return true;
562
+ }
563
+ const phoneRegex = /^[\s\+\-\(\)]*\d[\d\s\-\(\)\.]*\d[\s\-]*(x|ext\.?|extension)?[\s\-]*\d*$/i;
564
+ return phoneRegex.test(trimmed);
565
+ }
566
+ function isInternalUrl(href) {
567
+ if (typeof window === "undefined") {
568
+ return href.startsWith("/") && !href.startsWith("//");
569
+ }
570
+ const trimmed = href.trim();
571
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
572
+ return true;
573
+ }
574
+ try {
575
+ const url = new URL(trimmed, window.location.href);
576
+ const currentOrigin = window.location.origin;
577
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
578
+ return normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin);
579
+ } catch {
580
+ return false;
581
+ }
582
+ }
583
+ function toRelativePath(href) {
584
+ if (typeof window === "undefined") {
585
+ return href;
586
+ }
587
+ const trimmed = href.trim();
588
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
589
+ return trimmed;
590
+ }
591
+ try {
592
+ const url = new URL(trimmed, window.location.href);
593
+ const currentOrigin = window.location.origin;
594
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
595
+ if (normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin)) {
596
+ return url.pathname + url.search + url.hash;
597
+ }
598
+ } catch {
599
+ }
600
+ return trimmed;
601
+ }
602
+ function useNavigation({
603
+ href,
604
+ onClick
605
+ } = {}) {
606
+ const linkType = React3.useMemo(() => {
607
+ if (!href || href.trim() === "") {
608
+ return onClick ? "none" : "none";
609
+ }
610
+ const trimmed = href.trim();
611
+ if (trimmed.toLowerCase().startsWith("mailto:") || isEmail(trimmed)) {
612
+ return "mailto";
613
+ }
614
+ if (trimmed.toLowerCase().startsWith("tel:") || isPhoneNumber(trimmed)) {
615
+ return "tel";
616
+ }
617
+ if (isInternalUrl(trimmed)) {
618
+ return "internal";
619
+ }
620
+ try {
621
+ new URL(trimmed, typeof window !== "undefined" ? window.location.href : "http://localhost");
622
+ return "external";
623
+ } catch {
624
+ return "internal";
625
+ }
626
+ }, [href, onClick]);
627
+ const normalizedHref = React3.useMemo(() => {
628
+ if (!href || href.trim() === "") {
629
+ return void 0;
630
+ }
631
+ const trimmed = href.trim();
632
+ switch (linkType) {
633
+ case "tel":
634
+ return normalizePhoneNumber(trimmed);
635
+ case "mailto":
636
+ return normalizeEmail(trimmed);
637
+ case "internal":
638
+ return toRelativePath(trimmed);
639
+ case "external":
640
+ return trimmed;
641
+ default:
642
+ return trimmed;
643
+ }
644
+ }, [href, linkType]);
645
+ const target = React3.useMemo(() => {
646
+ switch (linkType) {
647
+ case "external":
648
+ return "_blank";
649
+ case "internal":
650
+ return "_self";
651
+ case "mailto":
652
+ case "tel":
653
+ return void 0;
654
+ default:
655
+ return void 0;
656
+ }
657
+ }, [linkType]);
658
+ const rel = React3.useMemo(() => {
659
+ if (linkType === "external") {
660
+ return "noopener noreferrer";
661
+ }
662
+ return void 0;
663
+ }, [linkType]);
664
+ const isExternal = linkType === "external";
665
+ const isInternal = linkType === "internal";
666
+ const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
667
+ const handleClick = React3.useCallback(
668
+ (event) => {
669
+ if (onClick) {
670
+ try {
671
+ onClick(event);
672
+ } catch (error) {
673
+ console.error("Error in user onClick handler:", error);
674
+ }
675
+ }
676
+ if (event.defaultPrevented) {
677
+ return;
678
+ }
679
+ if (shouldUseRouter && normalizedHref && event.button === 0 && // left-click only
680
+ !event.metaKey && !event.altKey && !event.ctrlKey && !event.shiftKey) {
681
+ if (typeof window !== "undefined") {
682
+ const handler = window.__opensiteNavigationHandler;
683
+ if (typeof handler === "function") {
684
+ try {
685
+ const handled = handler(normalizedHref, event.nativeEvent || event);
686
+ if (handled !== false) {
687
+ event.preventDefault();
688
+ }
689
+ } catch (error) {
690
+ console.error("Error in navigation handler:", error);
691
+ }
692
+ }
693
+ }
694
+ }
695
+ },
696
+ [onClick, shouldUseRouter, normalizedHref]
697
+ );
698
+ return {
699
+ linkType,
700
+ normalizedHref,
701
+ target,
702
+ rel,
703
+ isExternal,
704
+ isInternal,
705
+ shouldUseRouter,
706
+ handleClick
707
+ };
708
+ }
709
+ var Pressable = React3.forwardRef(
335
710
  ({
336
711
  children,
337
712
  className,
@@ -378,437 +753,127 @@ var Pressable = React.forwardRef(
378
753
  onClick: handleClick,
379
754
  "aria-label": ariaLabel,
380
755
  "aria-describedby": ariaDescribedby,
381
- id,
382
- ...dataProps,
383
- ...buttonDataAttributes
384
- };
385
- if (finalComponentType === "a" && shouldRenderLink) {
386
- return /* @__PURE__ */ jsx(
387
- "a",
388
- {
389
- ref,
390
- href: normalizedHref,
391
- target,
392
- rel,
393
- ...commonProps,
394
- ...props,
395
- children
396
- }
397
- );
398
- }
399
- if (finalComponentType === "button") {
400
- return /* @__PURE__ */ jsx(
401
- "button",
402
- {
403
- ref,
404
- type: props.type || "button",
405
- ...commonProps,
406
- ...props,
407
- children
408
- }
409
- );
410
- }
411
- if (finalComponentType === "div") {
412
- return /* @__PURE__ */ jsx(
413
- "div",
414
- {
415
- ref,
416
- ...commonProps,
417
- children
418
- }
419
- );
420
- }
421
- return /* @__PURE__ */ jsx(
422
- "span",
423
- {
424
- ref,
425
- ...commonProps,
426
- children
427
- }
428
- );
429
- }
430
- );
431
- Pressable.displayName = "Pressable";
432
- var maxWidthStyles = {
433
- sm: "max-w-screen-sm",
434
- md: "max-w-screen-md",
435
- lg: "max-w-screen-lg",
436
- xl: "max-w-7xl",
437
- "2xl": "max-w-screen-2xl",
438
- "4xl": "max-w-[1536px]",
439
- full: "max-w-full"
440
- };
441
- var Container = React__default.forwardRef(
442
- ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
443
- const Component = as;
444
- return /* @__PURE__ */ jsx(
445
- Component,
446
- {
447
- ref,
448
- className: cn(
449
- "mx-auto w-full px-2 sm:px-4 lg:px-8",
450
- maxWidthStyles[maxWidth],
451
- className
452
- ),
453
- ...props,
454
- children
455
- }
456
- );
457
- }
458
- );
459
- Container.displayName = "Container";
460
-
461
- // lib/patternSvgs.ts
462
- var patternSvgs = {
463
- squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
464
- grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
465
- noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
466
- dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
467
- dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
468
- dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
469
- circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
470
- waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
471
- crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
472
- architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
473
- tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
474
- p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
475
- };
476
- var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
477
- var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
478
- var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
479
- var maskTopLeft = "radial-gradient(ellipse 80% 80% at 0% 0%, #000 50%, transparent 90%)";
480
- var maskTopRight = "radial-gradient(ellipse 80% 80% at 100% 0%, #000 50%, transparent 90%)";
481
- var maskBottomLeft = "radial-gradient(ellipse 80% 80% at 0% 100%, #000 50%, transparent 90%)";
482
- var maskBottomRight = "radial-gradient(ellipse 80% 80% at 100% 100%, #000 50%, transparent 90%)";
483
- var circuitBoardPattern = (id, mask) => /* @__PURE__ */ jsxs(
484
- "svg",
485
- {
486
- className: "h-full w-full",
487
- xmlns: "http://www.w3.org/2000/svg",
488
- style: mask ? {
489
- maskImage: mask,
490
- WebkitMaskImage: mask
491
- } : void 0,
492
- children: [
493
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
494
- "pattern",
495
- {
496
- id,
497
- x: "0",
498
- y: "0",
499
- width: "100",
500
- height: "100",
501
- patternUnits: "userSpaceOnUse",
502
- children: [
503
- /* @__PURE__ */ jsx(
504
- "path",
505
- {
506
- d: "M0 50h40M60 50h40M50 0v40M50 60v40",
507
- stroke: "hsl(var(--muted))",
508
- strokeWidth: "1",
509
- fill: "none"
510
- }
511
- ),
512
- /* @__PURE__ */ jsx("circle", { cx: "50", cy: "50", r: "3", fill: "hsl(var(--muted))" }),
513
- /* @__PURE__ */ jsx("circle", { cx: "0", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
514
- /* @__PURE__ */ jsx("circle", { cx: "100", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
515
- /* @__PURE__ */ jsx("circle", { cx: "50", cy: "0", r: "2", fill: "hsl(var(--muted))" }),
516
- /* @__PURE__ */ jsx("circle", { cx: "50", cy: "100", r: "2", fill: "hsl(var(--muted))" })
517
- ]
518
- }
519
- ) }),
520
- /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
521
- ]
522
- }
523
- );
524
- var gridDotsPattern = (id, mask) => /* @__PURE__ */ jsxs(
525
- "svg",
526
- {
527
- className: "h-full w-full",
528
- xmlns: "http://www.w3.org/2000/svg",
529
- style: mask ? {
530
- maskImage: mask,
531
- WebkitMaskImage: mask
532
- } : void 0,
533
- children: [
534
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
535
- "pattern",
536
- {
537
- id,
538
- x: "0",
539
- y: "0",
540
- width: "40",
541
- height: "40",
542
- patternUnits: "userSpaceOnUse",
543
- children: [
544
- /* @__PURE__ */ jsx(
545
- "path",
546
- {
547
- d: "M0 20h40M20 0v40",
548
- stroke: "hsl(var(--muted))",
549
- strokeWidth: "0.5",
550
- fill: "none"
551
- }
552
- ),
553
- /* @__PURE__ */ jsx("circle", { cx: "20", cy: "20", r: "2", fill: "hsl(var(--muted))" })
554
- ]
555
- }
556
- ) }),
557
- /* @__PURE__ */ jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
558
- ]
559
- }
560
- );
561
- var gridPattern = (size, mask) => /* @__PURE__ */ jsx(
562
- "div",
563
- {
564
- className: "h-full w-full bg-[linear-gradient(to_right,_hsl(var(--muted))_1px,_transparent_1px),linear-gradient(to_bottom,_hsl(var(--muted))_1px,_transparent_1px)]",
565
- style: {
566
- backgroundSize: `${size}px ${size}px`,
567
- ...mask ? {
568
- maskImage: mask,
569
- WebkitMaskImage: mask
570
- } : {}
571
- }
572
- }
573
- );
574
- var diagonalCrossPattern = (mask) => /* @__PURE__ */ jsx(
575
- "div",
576
- {
577
- className: "h-full w-full",
578
- style: {
579
- backgroundImage: "repeating-linear-gradient(45deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px), repeating-linear-gradient(135deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px)",
580
- ...mask ? {
581
- maskImage: mask,
582
- WebkitMaskImage: mask
583
- } : {}
584
- }
585
- }
586
- );
587
- var dashedGridMaskBase = "repeating-linear-gradient(to right, black 0px, black 3px, transparent 3px, transparent 8px), repeating-linear-gradient(to bottom, black 0px, black 3px, transparent 3px, transparent 8px)";
588
- var dashedGridPattern = (fadeMask) => {
589
- const mask = fadeMask ? `${dashedGridMaskBase}, ${fadeMask}` : dashedGridMaskBase;
590
- return /* @__PURE__ */ jsx(
591
- "div",
592
- {
593
- className: "h-full w-full",
594
- style: {
595
- backgroundImage: "linear-gradient(to right, hsl(var(--muted)) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--muted)) 1px, transparent 1px)",
596
- backgroundSize: "20px 20px",
597
- backgroundPosition: "0 0, 0 0",
598
- maskImage: mask,
599
- WebkitMaskImage: mask,
600
- maskComposite: "intersect",
601
- WebkitMaskComposite: "source-in"
602
- }
756
+ id,
757
+ ...dataProps,
758
+ ...buttonDataAttributes
759
+ };
760
+ if (finalComponentType === "a" && shouldRenderLink) {
761
+ return /* @__PURE__ */ jsx(
762
+ "a",
763
+ {
764
+ ref,
765
+ href: normalizedHref,
766
+ target,
767
+ rel,
768
+ ...commonProps,
769
+ ...props,
770
+ children
771
+ }
772
+ );
603
773
  }
604
- );
605
- };
606
- var gradientGlow = (position) => /* @__PURE__ */ jsx(
607
- "div",
608
- {
609
- className: cn(
610
- "pointer-events-none absolute left-1/2 z-0 aspect-square w-3/4 -translate-x-1/2 rounded-full opacity-50 blur-3xl",
611
- position === "top" ? "-top-1/4" : "-bottom-1/4"
612
- ),
613
- style: {
614
- background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
774
+ if (finalComponentType === "button") {
775
+ return /* @__PURE__ */ jsx(
776
+ "button",
777
+ {
778
+ ref,
779
+ type: props.type || "button",
780
+ ...commonProps,
781
+ ...props,
782
+ children
783
+ }
784
+ );
615
785
  }
616
- }
617
- );
618
- var spotlight = (position) => /* @__PURE__ */ jsx(
619
- "div",
620
- {
621
- className: cn(
622
- "pointer-events-none absolute top-1/2 z-0 aspect-square w-3/4 -translate-y-1/2 rounded-full opacity-40 blur-3xl",
623
- position === "left" ? "-left-1/4" : "-right-1/4"
624
- ),
625
- style: {
626
- background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
786
+ if (finalComponentType === "div") {
787
+ return /* @__PURE__ */ jsx(
788
+ "div",
789
+ {
790
+ ref,
791
+ ...commonProps,
792
+ children
793
+ }
794
+ );
627
795
  }
628
- }
629
- );
630
- var patternOverlays = {
631
- circuitBoardBasic: () => circuitBoardPattern("circuit-board-basic"),
632
- circuitBoardFadeTop: () => circuitBoardPattern("circuit-board-fade-top", maskTop),
633
- circuitBoardFadeBottom: () => circuitBoardPattern("circuit-board-fade-bottom", maskBottom),
634
- circuitBoardFadeCenter: () => circuitBoardPattern("circuit-board-fade-center", maskCenter),
635
- circuitBoardFadeTopLeft: () => circuitBoardPattern("circuit-board-fade-top-left", maskTopLeft),
636
- circuitBoardFadeTopRight: () => circuitBoardPattern("circuit-board-fade-top-right", maskTopRight),
637
- circuitBoardFadeBottomLeft: () => circuitBoardPattern("circuit-board-fade-bottom-left", maskBottomLeft),
638
- circuitBoardFadeBottomRight: () => circuitBoardPattern("circuit-board-fade-bottom-right", maskBottomRight),
639
- dashedGridBasic: () => dashedGridPattern(),
640
- dashedGridFadeTop: () => dashedGridPattern(maskTop),
641
- dashedGridFadeBottom: () => dashedGridPattern(maskBottom),
642
- dashedGridFadeCenter: () => dashedGridPattern(maskCenter),
643
- dashedGridFadeTopLeft: () => dashedGridPattern(maskTopLeft),
644
- dashedGridFadeTopRight: () => dashedGridPattern(maskTopRight),
645
- dashedGridFadeBottomLeft: () => dashedGridPattern(maskBottomLeft),
646
- dashedGridFadeBottomRight: () => dashedGridPattern(maskBottomRight),
647
- diagonalCrossBasic: () => diagonalCrossPattern(),
648
- diagonalCrossFadeTop: () => diagonalCrossPattern(maskTop),
649
- diagonalCrossFadeBottom: () => diagonalCrossPattern(maskBottom),
650
- diagonalCrossFadeCenter: () => diagonalCrossPattern(maskCenter),
651
- diagonalCrossFadeTopLeft: () => diagonalCrossPattern(maskTopLeft),
652
- diagonalCrossFadeTopRight: () => diagonalCrossPattern(maskTopRight),
653
- diagonalCrossFadeBottomLeft: () => diagonalCrossPattern(maskBottomLeft),
654
- diagonalCrossFadeBottomRight: () => diagonalCrossPattern(maskBottomRight),
655
- gridBasic: () => gridPattern(40),
656
- gridFadeTop: () => gridPattern(32, maskTop),
657
- gridFadeBottom: () => gridPattern(32, maskBottom),
658
- gridFadeCenter: () => gridPattern(40, maskCenter),
659
- gridFadeTopLeft: () => gridPattern(32, maskTopLeft),
660
- gridFadeTopRight: () => gridPattern(32, maskTopRight),
661
- gridFadeBottomLeft: () => gridPattern(32, maskBottomLeft),
662
- gridFadeBottomRight: () => gridPattern(32, maskBottomRight),
663
- gridDotsBasic: () => gridDotsPattern("grid-dots-basic"),
664
- gridDotsFadeCenter: () => gridDotsPattern("grid-dots-fade-center", maskCenter),
665
- gradientGlowTop: () => gradientGlow("top"),
666
- gradientGlowBottom: () => gradientGlow("bottom"),
667
- spotlightLeft: () => spotlight("left"),
668
- spotlightRight: () => spotlight("right")
669
- };
670
- var inlinePatternStyles = {
671
- radialGradientTop: {
672
- background: "radial-gradient(125% 125% at 50% 10%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
673
- },
674
- radialGradientBottom: {
675
- background: "radial-gradient(125% 125% at 50% 90%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
676
- }
677
- };
678
- function PatternBackground({
679
- pattern,
680
- opacity = 0.08,
681
- className,
682
- style
683
- }) {
684
- if (!pattern) {
685
- return null;
686
- }
687
- if (pattern in inlinePatternStyles) {
688
- const inlineStyle = inlinePatternStyles[pattern];
689
796
  return /* @__PURE__ */ jsx(
690
- "div",
797
+ "span",
691
798
  {
692
- className: cn("pointer-events-none absolute inset-0 z-0", className),
693
- style: { ...inlineStyle, opacity, ...style },
694
- "aria-hidden": "true"
799
+ ref,
800
+ ...commonProps,
801
+ children
695
802
  }
696
803
  );
697
804
  }
698
- if (pattern in patternOverlays) {
699
- const Overlay = patternOverlays[pattern];
805
+ );
806
+ Pressable.displayName = "Pressable";
807
+ var MOBILE_CLASSES = {
808
+ "fit-left": "items-start md:items-center",
809
+ "fit-center": "items-center",
810
+ "fit-right": "items-end md:items-center",
811
+ "full-left": "items-stretch md:items-center",
812
+ "full-center": "items-stretch md:items-center",
813
+ "full-right": "items-stretch md:items-center"
814
+ };
815
+ function BlockActions({
816
+ mobileConfig,
817
+ actionsClassName,
818
+ verticalSpacing = "mt-4 md:mt-8",
819
+ actions,
820
+ actionsSlot
821
+ }) {
822
+ const width = mobileConfig?.width ?? "full";
823
+ const position = mobileConfig?.position ?? "center";
824
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
825
+ if (actionsSlot) {
826
+ return /* @__PURE__ */ jsx("div", { children: actionsSlot });
827
+ } else if (actions && actions?.length > 0) {
700
828
  return /* @__PURE__ */ jsx(
701
829
  "div",
702
830
  {
703
- className: cn("pointer-events-none absolute inset-0 z-0", className),
704
- style: { opacity, ...style },
705
- "aria-hidden": "true",
706
- children: Overlay()
831
+ className: cn(
832
+ "flex flex-col md:flex-row flex-wrap gap-4",
833
+ mobileLayoutClass,
834
+ actionsClassName,
835
+ verticalSpacing
836
+ ),
837
+ children: actions.map((action, index) => /* @__PURE__ */ jsx(ActionComponent, { action }, index))
707
838
  }
708
839
  );
840
+ } else {
841
+ return null;
709
842
  }
710
- const patternUrl = pattern in patternSvgs ? patternSvgs[pattern] : pattern;
843
+ }
844
+ function ActionComponent({ action }) {
845
+ const {
846
+ label,
847
+ icon,
848
+ iconAfter,
849
+ children,
850
+ href,
851
+ onClick,
852
+ className: actionClassName,
853
+ ...pressableProps
854
+ } = action;
711
855
  return /* @__PURE__ */ jsx(
712
- "div",
856
+ Pressable,
713
857
  {
714
- className: cn("pointer-events-none absolute inset-0 z-0", className),
715
- style: {
716
- backgroundImage: `url(${patternUrl})`,
717
- backgroundRepeat: "repeat",
718
- backgroundSize: "auto",
719
- opacity,
720
- ...style
721
- },
722
- "aria-hidden": "true"
858
+ href,
859
+ onClick,
860
+ asButton: action.asButton ?? true,
861
+ className: actionClassName,
862
+ ...pressableProps,
863
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
864
+ icon,
865
+ label,
866
+ iconAfter
867
+ ] })
723
868
  }
724
869
  );
725
870
  }
726
- var backgroundStyles = {
727
- default: "bg-background text-foreground",
728
- white: "bg-white text-dark",
729
- gray: "bg-muted/30 text-foreground",
730
- dark: "bg-foreground text-background",
731
- transparent: "bg-transparent text-foreground",
732
- gradient: "bg-linear-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
733
- primary: "bg-primary text-primary-foreground",
734
- secondary: "bg-secondary text-secondary-foreground",
735
- muted: "bg-muted text-muted-foreground"
736
- };
737
- var spacingStyles = {
738
- none: "py-0 md:py-0",
739
- sm: "py-12 md:py-16",
740
- md: "py-16 md:py-24",
741
- lg: "py-20 md:py-32",
742
- xl: "py-24 md:py-40"
743
- };
744
- var predefinedSpacings = ["none", "sm", "md", "lg", "xl"];
745
- var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
746
- var Section = React__default.forwardRef(
747
- ({
748
- id,
749
- title,
750
- subtitle,
751
- children,
752
- className,
753
- style,
754
- background = "default",
755
- spacing = "lg",
756
- pattern,
757
- patternOpacity,
758
- patternClassName,
759
- containerClassName,
760
- containerMaxWidth = "xl",
761
- ...props
762
- }, ref) => {
763
- const effectivePatternOpacity = patternOpacity !== void 0 ? patternOpacity : pattern ? 1 : 0;
764
- return /* @__PURE__ */ jsxs(
765
- "section",
766
- {
767
- ref,
768
- id,
769
- className: cn(
770
- "relative",
771
- pattern ? "overflow-hidden" : null,
772
- backgroundStyles[background],
773
- isPredefinedSpacing(spacing) ? spacingStyles[spacing] : spacing,
774
- className
775
- ),
776
- style,
777
- ...props,
778
- children: [
779
- /* @__PURE__ */ jsx(
780
- PatternBackground,
781
- {
782
- pattern,
783
- opacity: effectivePatternOpacity,
784
- className: patternClassName
785
- }
786
- ),
787
- /* @__PURE__ */ jsxs(
788
- Container,
789
- {
790
- maxWidth: containerMaxWidth,
791
- className: cn("relative z-10", containerClassName),
792
- children: [
793
- (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "mb-6 text-center md:mb-16", children: [
794
- subtitle && /* @__PURE__ */ jsx("p", { className: "mb-2 text-sm font-semibold uppercase tracking-wider", children: subtitle }),
795
- title && /* @__PURE__ */ jsx("h2", { className: "text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title })
796
- ] }),
797
- children
798
- ]
799
- }
800
- )
801
- ]
802
- }
803
- );
804
- }
805
- );
806
- Section.displayName = "Section";
807
871
  function HeroWelcomeAsymmetricImages({
808
872
  heading,
809
873
  description,
810
874
  actions,
811
875
  actionsSlot,
876
+ actionsClassName,
812
877
  images,
813
878
  imagesSlot,
814
879
  background,
@@ -822,25 +887,6 @@ function HeroWelcomeAsymmetricImages({
822
887
  descriptionClassName,
823
888
  optixFlowConfig
824
889
  }) {
825
- const renderActions = useMemo(() => {
826
- if (actionsSlot) return actionsSlot;
827
- if (!actions || actions.length === 0) return null;
828
- return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 sm:flex-row", children: actions.map((action, idx) => /* @__PURE__ */ jsxs(
829
- Pressable,
830
- {
831
- href: action.href,
832
- onClick: action.onClick,
833
- asButton: true,
834
- variant: action.variant || "default",
835
- size: action.size || "lg",
836
- children: [
837
- action.label,
838
- action.icon
839
- ]
840
- },
841
- idx
842
- )) });
843
- }, [actionsSlot, actions]);
844
890
  const renderImages = useMemo(() => {
845
891
  if (imagesSlot) return imagesSlot;
846
892
  if (!images || images.length < 4) return null;
@@ -909,36 +955,25 @@ function HeroWelcomeAsymmetricImages({
909
955
  ),
910
956
  children: heading
911
957
  }
912
- ) : /* @__PURE__ */ jsx(
913
- "h1",
914
- {
915
- className: cn(
916
- "mb-8 text-4xl font-normal text-balance md:text-7xl",
917
- headingClassName
918
- ),
919
- children: heading
920
- }
921
- )),
958
+ ) : heading),
922
959
  description && (typeof description === "string" ? /* @__PURE__ */ jsx(
923
960
  "p",
924
961
  {
925
962
  className: cn(
926
- "mb-12 max-w-[70%] text-xl font-normal text-balance",
963
+ "mb-12 max-w-full md:max-w-[70%] text-lg md:text-xl font-normal text-balance",
927
964
  descriptionClassName
928
965
  ),
929
966
  children: description
930
967
  }
931
- ) : /* @__PURE__ */ jsx(
932
- "div",
968
+ ) : description),
969
+ /* @__PURE__ */ jsx(
970
+ BlockActions,
933
971
  {
934
- className: cn(
935
- "mb-12 max-w-[70%] text-xl font-normal text-balance",
936
- descriptionClassName
937
- ),
938
- children: description
972
+ actions,
973
+ actionsSlot,
974
+ actionsClassName
939
975
  }
940
- )),
941
- renderActions
976
+ )
942
977
  ] }),
943
978
  renderImages
944
979
  ] }) })