@opensite/ui 2.0.8 → 2.1.0

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