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