@geomak/ui 6.30.0 → 6.32.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.
- package/dist/index.cjs +552 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +409 -1
- package/dist/index.d.ts +409 -1
- package/dist/index.js +543 -4
- package/dist/index.js.map +1 -1
- package/dist/styles.css +232 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -507,8 +507,8 @@ function Avatar({
|
|
|
507
507
|
if (fallback) return fallback;
|
|
508
508
|
if (alt) {
|
|
509
509
|
const parts = alt.trim().split(/\s+/).slice(0, 2);
|
|
510
|
-
const
|
|
511
|
-
if (
|
|
510
|
+
const initials3 = parts.map((p) => p[0]?.toUpperCase() ?? "").join("");
|
|
511
|
+
if (initials3) return initials3;
|
|
512
512
|
}
|
|
513
513
|
return /* @__PURE__ */ jsxRuntime.jsx(PersonSilhouette, {});
|
|
514
514
|
})();
|
|
@@ -9326,6 +9326,545 @@ function useJwt(token) {
|
|
|
9326
9326
|
const isValid = decoded.payload != null && !isExpired;
|
|
9327
9327
|
return { payload: decoded.payload, header: decoded.header, expiresAt, isExpired, isValid, raw: token ?? null };
|
|
9328
9328
|
}
|
|
9329
|
+
var GRADIENT = "radial-gradient(ellipse 80% 60% at 50% 0%, color-mix(in oklab, var(--color-accent) 12%, transparent), transparent 70%)";
|
|
9330
|
+
function Jumbotron({
|
|
9331
|
+
eyebrow,
|
|
9332
|
+
title,
|
|
9333
|
+
description,
|
|
9334
|
+
actions,
|
|
9335
|
+
media,
|
|
9336
|
+
layout = "centered",
|
|
9337
|
+
background = "none",
|
|
9338
|
+
className = "",
|
|
9339
|
+
style
|
|
9340
|
+
}) {
|
|
9341
|
+
const split = layout === "split" && media != null;
|
|
9342
|
+
const bgClass = background === "surface" ? "bg-surface" : "";
|
|
9343
|
+
const copy = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["flex flex-col gap-5", split ? "items-start text-left" : "items-center text-center"].join(" "), children: [
|
|
9344
|
+
eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { children: eyebrow }),
|
|
9345
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: ["text-4xl font-bold leading-tight tracking-tight text-foreground sm:text-5xl", split ? "" : "max-w-3xl"].join(" "), children: title }),
|
|
9346
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: ["text-lg leading-relaxed text-foreground-secondary", split ? "max-w-xl" : "max-w-2xl"].join(" "), children: description }),
|
|
9347
|
+
actions != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ["mt-2 flex flex-wrap gap-3", split ? "justify-start" : "justify-center"].join(" "), children: actions })
|
|
9348
|
+
] });
|
|
9349
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9350
|
+
"section",
|
|
9351
|
+
{
|
|
9352
|
+
className: ["relative overflow-hidden rounded-2xl px-6 py-16 sm:px-10 sm:py-24", bgClass, className].filter(Boolean).join(" "),
|
|
9353
|
+
style: { ...background === "gradient" ? { backgroundImage: GRADIENT } : null, ...style },
|
|
9354
|
+
children: split ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto grid max-w-6xl items-center gap-10 lg:grid-cols-2", children: [
|
|
9355
|
+
copy,
|
|
9356
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-xl", children: media })
|
|
9357
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex max-w-4xl flex-col items-center", children: [
|
|
9358
|
+
copy,
|
|
9359
|
+
media != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-12 w-full overflow-hidden rounded-xl", children: media })
|
|
9360
|
+
] })
|
|
9361
|
+
}
|
|
9362
|
+
);
|
|
9363
|
+
}
|
|
9364
|
+
var COLS = {
|
|
9365
|
+
2: "sm:grid-cols-2",
|
|
9366
|
+
3: "sm:grid-cols-2 lg:grid-cols-3",
|
|
9367
|
+
4: "sm:grid-cols-2 lg:grid-cols-4"
|
|
9368
|
+
};
|
|
9369
|
+
function FeatureGrid({
|
|
9370
|
+
features,
|
|
9371
|
+
eyebrow,
|
|
9372
|
+
title,
|
|
9373
|
+
description,
|
|
9374
|
+
columns = 3,
|
|
9375
|
+
centeredHeader = true,
|
|
9376
|
+
className = "",
|
|
9377
|
+
style
|
|
9378
|
+
}) {
|
|
9379
|
+
const hasHeader = eyebrow != null || title != null || description != null;
|
|
9380
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: ["px-2", className].filter(Boolean).join(" "), style, children: [
|
|
9381
|
+
hasHeader && /* @__PURE__ */ jsxRuntime.jsxs("header", { className: ["mb-10 flex flex-col gap-3", centeredHeader ? "items-center text-center" : "items-start text-left"].join(" "), children: [
|
|
9382
|
+
eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-accent", children: eyebrow }),
|
|
9383
|
+
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight text-foreground", children: title }),
|
|
9384
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9385
|
+
] }),
|
|
9386
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS[columns]].join(" "), children: features.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border bg-surface p-5", children: [
|
|
9387
|
+
f.icon != null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9388
|
+
"span",
|
|
9389
|
+
{
|
|
9390
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg text-accent",
|
|
9391
|
+
style: { backgroundColor: "color-mix(in oklab, var(--color-accent) 12%, var(--color-surface))" },
|
|
9392
|
+
children: f.icon
|
|
9393
|
+
}
|
|
9394
|
+
),
|
|
9395
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold text-foreground", children: f.title }),
|
|
9396
|
+
f.description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm leading-relaxed text-foreground-secondary", children: f.description })
|
|
9397
|
+
] }, f.key ?? i)) })
|
|
9398
|
+
] });
|
|
9399
|
+
}
|
|
9400
|
+
var Check3 = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.5, "aria-hidden": "true", className: "mt-0.5 h-4 w-4 flex-shrink-0 text-accent", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M20 6 9 17l-5-5" }) });
|
|
9401
|
+
function PricingPlans({ plans, eyebrow, title, description, className = "", style }) {
|
|
9402
|
+
const hasHeader = eyebrow != null || title != null || description != null;
|
|
9403
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: ["px-2", className].filter(Boolean).join(" "), style, children: [
|
|
9404
|
+
hasHeader && /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "mb-10 flex flex-col items-center gap-3 text-center", children: [
|
|
9405
|
+
eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-accent", children: eyebrow }),
|
|
9406
|
+
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight text-foreground", children: title }),
|
|
9407
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9408
|
+
] }),
|
|
9409
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 items-stretch gap-6 md:grid-cols-2 lg:grid-cols-3", children: plans.map((p, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9410
|
+
"div",
|
|
9411
|
+
{
|
|
9412
|
+
className: [
|
|
9413
|
+
"relative flex flex-col rounded-2xl border bg-surface p-6",
|
|
9414
|
+
p.highlighted ? "border-accent shadow-lg lg:-my-2 lg:py-8" : "border-border"
|
|
9415
|
+
].join(" "),
|
|
9416
|
+
children: [
|
|
9417
|
+
p.highlighted && p.badge != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-accent px-3 py-0.5 text-xs font-semibold text-accent-fg shadow-sm", children: p.badge }),
|
|
9418
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-semibold uppercase tracking-wide text-foreground-muted", children: p.name }),
|
|
9419
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-baseline gap-1", children: [
|
|
9420
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-4xl font-bold tracking-tight text-foreground", children: p.price }),
|
|
9421
|
+
p.period != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground-muted", children: p.period })
|
|
9422
|
+
] }),
|
|
9423
|
+
p.description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm leading-relaxed text-foreground-secondary", children: p.description }),
|
|
9424
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-6 flex flex-1 flex-col gap-2.5", children: p.features.map((f, fi) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex gap-2 text-sm text-foreground-secondary", children: [
|
|
9425
|
+
/* @__PURE__ */ jsxRuntime.jsx(Check3, {}),
|
|
9426
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: f })
|
|
9427
|
+
] }, fi)) }),
|
|
9428
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9429
|
+
Button_default,
|
|
9430
|
+
{
|
|
9431
|
+
content: p.cta.label,
|
|
9432
|
+
variant: p.highlighted ? "primary" : "outline",
|
|
9433
|
+
onClick: p.cta.onClick,
|
|
9434
|
+
style: { width: "100%" }
|
|
9435
|
+
}
|
|
9436
|
+
) })
|
|
9437
|
+
]
|
|
9438
|
+
},
|
|
9439
|
+
p.key ?? i
|
|
9440
|
+
)) })
|
|
9441
|
+
] });
|
|
9442
|
+
}
|
|
9443
|
+
var COLS2 = {
|
|
9444
|
+
1: "mx-auto max-w-2xl",
|
|
9445
|
+
2: "sm:grid-cols-2",
|
|
9446
|
+
3: "sm:grid-cols-2 lg:grid-cols-3"
|
|
9447
|
+
};
|
|
9448
|
+
var initials2 = (name) => typeof name === "string" ? name.trim().split(/\s+/).slice(0, 2).map((w) => w[0]?.toUpperCase() ?? "").join("") || void 0 : void 0;
|
|
9449
|
+
function Stars({ value }) {
|
|
9450
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-0.5", "aria-label": `${value} out of 5`, children: Array.from({ length: 5 }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", className: `h-4 w-4 ${i < value ? "text-status-warning" : "text-border-strong"}`, fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2l2.9 6.3 6.9.7-5.1 4.6 1.4 6.8L12 17.8 5.9 20.4l1.4-6.8L2.2 9l6.9-.7L12 2z" }) }, i)) });
|
|
9451
|
+
}
|
|
9452
|
+
function Testimonials({ testimonials, eyebrow, title, description, columns = 3, className = "", style }) {
|
|
9453
|
+
const hasHeader = eyebrow != null || title != null || description != null;
|
|
9454
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: ["px-2", className].filter(Boolean).join(" "), style, children: [
|
|
9455
|
+
hasHeader && /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "mb-10 flex flex-col items-center gap-3 text-center", children: [
|
|
9456
|
+
eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-accent", children: eyebrow }),
|
|
9457
|
+
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight text-foreground", children: title }),
|
|
9458
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9459
|
+
] }),
|
|
9460
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS2[columns]].join(" "), children: testimonials.map((tm, i) => /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: "flex flex-col gap-4 rounded-xl border border-border bg-surface p-6", children: [
|
|
9461
|
+
tm.rating != null && /* @__PURE__ */ jsxRuntime.jsx(Stars, { value: tm.rating }),
|
|
9462
|
+
/* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "flex-1 text-sm leading-relaxed text-foreground", children: [
|
|
9463
|
+
"\u201C",
|
|
9464
|
+
tm.quote,
|
|
9465
|
+
"\u201D"
|
|
9466
|
+
] }),
|
|
9467
|
+
/* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "flex items-center gap-3", children: [
|
|
9468
|
+
/* @__PURE__ */ jsxRuntime.jsx(Avatar, { src: tm.avatar, alt: typeof tm.author === "string" ? tm.author : "Reviewer", fallback: initials2(tm.author), size: "sm" }),
|
|
9469
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
9470
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate text-sm font-semibold text-foreground", children: tm.author }),
|
|
9471
|
+
tm.role != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate text-xs text-foreground-muted", children: tm.role })
|
|
9472
|
+
] })
|
|
9473
|
+
] })
|
|
9474
|
+
] }, tm.key ?? i)) })
|
|
9475
|
+
] });
|
|
9476
|
+
}
|
|
9477
|
+
var Arrow4 = ({ dir }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true", className: "h-5 w-5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: dir === "left" ? "M15 18l-6-6 6-6" : "M9 18l6-6-6-6" }) });
|
|
9478
|
+
var SCRIM = "linear-gradient(to top, color-mix(in oklab, var(--color-foreground) 70%, transparent), color-mix(in oklab, var(--color-foreground) 25%, transparent))";
|
|
9479
|
+
function SlideShow({
|
|
9480
|
+
slides,
|
|
9481
|
+
autoPlay = true,
|
|
9482
|
+
interval = 6e3,
|
|
9483
|
+
showArrows = true,
|
|
9484
|
+
showDots = true,
|
|
9485
|
+
height = 460,
|
|
9486
|
+
"aria-label": ariaLabel = "Slideshow",
|
|
9487
|
+
className = "",
|
|
9488
|
+
style
|
|
9489
|
+
}) {
|
|
9490
|
+
const reduced = framerMotion.useReducedMotion();
|
|
9491
|
+
const [index, setIndex] = React28.useState(0);
|
|
9492
|
+
const [paused, setPaused] = React28.useState(false);
|
|
9493
|
+
const count = slides.length;
|
|
9494
|
+
const idx = count ? (index % count + count) % count : 0;
|
|
9495
|
+
const go = React28.useCallback((d) => setIndex((i) => i + d), []);
|
|
9496
|
+
const timer = React28.useRef(null);
|
|
9497
|
+
React28.useEffect(() => {
|
|
9498
|
+
if (!autoPlay || paused || count <= 1) return;
|
|
9499
|
+
timer.current = setInterval(() => setIndex((i) => i + 1), interval);
|
|
9500
|
+
return () => {
|
|
9501
|
+
if (timer.current) clearInterval(timer.current);
|
|
9502
|
+
};
|
|
9503
|
+
}, [autoPlay, paused, interval, count]);
|
|
9504
|
+
if (count === 0) return null;
|
|
9505
|
+
const slide = slides[idx];
|
|
9506
|
+
const onImage = Boolean(slide.image);
|
|
9507
|
+
const align = slide.align ?? "center";
|
|
9508
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9509
|
+
"section",
|
|
9510
|
+
{
|
|
9511
|
+
"aria-label": ariaLabel,
|
|
9512
|
+
"aria-roledescription": "carousel",
|
|
9513
|
+
className: ["relative overflow-hidden rounded-2xl", className].filter(Boolean).join(" "),
|
|
9514
|
+
style: { height, ...style },
|
|
9515
|
+
onMouseEnter: () => setPaused(true),
|
|
9516
|
+
onMouseLeave: () => setPaused(false),
|
|
9517
|
+
children: [
|
|
9518
|
+
/* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9519
|
+
framerMotion.motion.div,
|
|
9520
|
+
{
|
|
9521
|
+
className: "absolute inset-0",
|
|
9522
|
+
initial: { opacity: 0 },
|
|
9523
|
+
animate: { opacity: 1 },
|
|
9524
|
+
exit: { opacity: 0 },
|
|
9525
|
+
transition: { duration: reduced ? 0 : 0.6, ease: "easeInOut" },
|
|
9526
|
+
style: onImage ? { backgroundImage: `url(${slide.image})`, backgroundSize: "cover", backgroundPosition: "center" } : void 0,
|
|
9527
|
+
children: [
|
|
9528
|
+
onImage && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0", style: { backgroundImage: SCRIM }, "aria-hidden": "true" }),
|
|
9529
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["relative flex h-full flex-col justify-center gap-5 px-8 sm:px-14", align === "center" ? "items-center text-center" : "items-start text-left", onImage ? "text-white" : "bg-surface text-foreground"].join(" "), children: [
|
|
9530
|
+
slide.eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ["text-xs font-semibold uppercase tracking-wide", onImage ? "text-white/80" : "text-accent"].join(" "), children: slide.eyebrow }),
|
|
9531
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "max-w-3xl text-3xl font-bold leading-tight tracking-tight sm:text-5xl", children: slide.title }),
|
|
9532
|
+
slide.description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: ["max-w-xl text-base leading-relaxed sm:text-lg", onImage ? "text-white/85" : "text-foreground-secondary"].join(" "), children: slide.description }),
|
|
9533
|
+
slide.actions != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ["mt-2 flex flex-wrap gap-3", align === "center" ? "justify-center" : ""].join(" "), children: slide.actions })
|
|
9534
|
+
] })
|
|
9535
|
+
]
|
|
9536
|
+
},
|
|
9537
|
+
slide.key ?? idx
|
|
9538
|
+
) }),
|
|
9539
|
+
showArrows && count > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9540
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", "aria-label": "Previous slide", onClick: () => go(-1), className: "absolute left-3 top-1/2 z-10 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full border border-white/30 bg-white/15 text-white backdrop-blur transition-colors hover:bg-white/25 focus:outline-none focus-visible:ring-2 focus-visible:ring-white", children: /* @__PURE__ */ jsxRuntime.jsx(Arrow4, { dir: "left" }) }),
|
|
9541
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", "aria-label": "Next slide", onClick: () => go(1), className: "absolute right-3 top-1/2 z-10 flex h-9 w-9 -translate-y-1/2 items-center justify-center rounded-full border border-white/30 bg-white/15 text-white backdrop-blur transition-colors hover:bg-white/25 focus:outline-none focus-visible:ring-2 focus-visible:ring-white", children: /* @__PURE__ */ jsxRuntime.jsx(Arrow4, { dir: "right" }) })
|
|
9542
|
+
] }),
|
|
9543
|
+
showDots && count > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-4 left-1/2 z-10 flex -translate-x-1/2 items-center gap-1.5", children: slides.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
9544
|
+
"button",
|
|
9545
|
+
{
|
|
9546
|
+
type: "button",
|
|
9547
|
+
"aria-label": `Go to slide ${i + 1}`,
|
|
9548
|
+
"aria-current": i === idx,
|
|
9549
|
+
onClick: () => setIndex(i),
|
|
9550
|
+
className: ["h-1.5 rounded-full transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-white", i === idx ? "w-6 bg-white" : "w-1.5 bg-white/50 hover:bg-white/80"].join(" ")
|
|
9551
|
+
},
|
|
9552
|
+
i
|
|
9553
|
+
)) })
|
|
9554
|
+
]
|
|
9555
|
+
}
|
|
9556
|
+
);
|
|
9557
|
+
}
|
|
9558
|
+
var PlayGlyph = () => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: "h-7 w-7 translate-x-0.5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 5v14l11-7z" }) });
|
|
9559
|
+
function Video({
|
|
9560
|
+
src,
|
|
9561
|
+
embedUrl,
|
|
9562
|
+
poster,
|
|
9563
|
+
aspect = "16/9",
|
|
9564
|
+
title,
|
|
9565
|
+
controls = true,
|
|
9566
|
+
autoPlay = false,
|
|
9567
|
+
loop = false,
|
|
9568
|
+
muted = false,
|
|
9569
|
+
framed = true,
|
|
9570
|
+
className = "",
|
|
9571
|
+
style
|
|
9572
|
+
}) {
|
|
9573
|
+
const [playing, setPlaying] = React28.useState(autoPlay);
|
|
9574
|
+
const frame = ["relative w-full overflow-hidden bg-backdrop", framed ? "rounded-2xl border border-border shadow-sm" : "", className].filter(Boolean).join(" ");
|
|
9575
|
+
const ratio = aspect.replace("/", " / ");
|
|
9576
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: frame, style: { aspectRatio: ratio, ...style }, children: embedUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
9577
|
+
"iframe",
|
|
9578
|
+
{
|
|
9579
|
+
src: embedUrl,
|
|
9580
|
+
title: title ?? "Embedded video",
|
|
9581
|
+
className: "absolute inset-0 h-full w-full",
|
|
9582
|
+
frameBorder: 0,
|
|
9583
|
+
allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
|
|
9584
|
+
allowFullScreen: true
|
|
9585
|
+
}
|
|
9586
|
+
) : src ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9587
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9588
|
+
"video",
|
|
9589
|
+
{
|
|
9590
|
+
src,
|
|
9591
|
+
poster,
|
|
9592
|
+
title,
|
|
9593
|
+
controls: controls && playing,
|
|
9594
|
+
autoPlay: playing,
|
|
9595
|
+
loop,
|
|
9596
|
+
muted: muted || autoPlay,
|
|
9597
|
+
playsInline: true,
|
|
9598
|
+
className: "absolute inset-0 h-full w-full object-cover"
|
|
9599
|
+
}
|
|
9600
|
+
),
|
|
9601
|
+
!playing && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9602
|
+
"button",
|
|
9603
|
+
{
|
|
9604
|
+
type: "button",
|
|
9605
|
+
"aria-label": title ? `Play ${title}` : "Play video",
|
|
9606
|
+
onClick: () => setPlaying(true),
|
|
9607
|
+
className: "group absolute inset-0 flex items-center justify-center focus:outline-none",
|
|
9608
|
+
style: poster ? { backgroundImage: `url(${poster})`, backgroundSize: "cover", backgroundPosition: "center" } : void 0,
|
|
9609
|
+
children: [
|
|
9610
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0", style: { backgroundColor: "color-mix(in oklab, var(--color-foreground) 30%, transparent)" }, "aria-hidden": "true" }),
|
|
9611
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative flex h-16 w-16 items-center justify-center rounded-full bg-white/90 text-accent shadow-lg transition-transform duration-200 ease-out group-hover:scale-105 group-focus-visible:ring-4 group-focus-visible:ring-white", children: /* @__PURE__ */ jsxRuntime.jsx(PlayGlyph, {}) })
|
|
9612
|
+
]
|
|
9613
|
+
}
|
|
9614
|
+
)
|
|
9615
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center text-sm text-foreground-muted", children: "No video source" }) });
|
|
9616
|
+
}
|
|
9617
|
+
var isUrl = (v) => typeof v === "string";
|
|
9618
|
+
function Parallax({
|
|
9619
|
+
background,
|
|
9620
|
+
children,
|
|
9621
|
+
height = 440,
|
|
9622
|
+
speed = 0.3,
|
|
9623
|
+
overlay = true,
|
|
9624
|
+
className = "",
|
|
9625
|
+
style
|
|
9626
|
+
}) {
|
|
9627
|
+
const reduced = framerMotion.useReducedMotion();
|
|
9628
|
+
const ref = React28.useRef(null);
|
|
9629
|
+
const { scrollYProgress } = framerMotion.useScroll({ target: ref, offset: ["start end", "end start"] });
|
|
9630
|
+
const shift = Math.max(0, Math.min(1, speed)) * 100;
|
|
9631
|
+
const y = framerMotion.useTransform(scrollYProgress, [0, 1], reduced ? ["0%", "0%"] : [`-${shift / 2}%`, `${shift / 2}%`]);
|
|
9632
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9633
|
+
"div",
|
|
9634
|
+
{
|
|
9635
|
+
ref,
|
|
9636
|
+
className: ["relative overflow-hidden rounded-2xl", className].filter(Boolean).join(" "),
|
|
9637
|
+
style: { height, ...style },
|
|
9638
|
+
children: [
|
|
9639
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9640
|
+
framerMotion.motion.div,
|
|
9641
|
+
{
|
|
9642
|
+
"aria-hidden": isUrl(background) ? true : void 0,
|
|
9643
|
+
className: "absolute inset-x-0 -top-[15%] -bottom-[15%] will-change-transform",
|
|
9644
|
+
style: {
|
|
9645
|
+
y,
|
|
9646
|
+
...isUrl(background) ? { backgroundImage: `url(${background})`, backgroundSize: "cover", backgroundPosition: "center" } : {}
|
|
9647
|
+
},
|
|
9648
|
+
children: !isUrl(background) && background
|
|
9649
|
+
}
|
|
9650
|
+
),
|
|
9651
|
+
overlay && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9652
|
+
"div",
|
|
9653
|
+
{
|
|
9654
|
+
className: "absolute inset-0",
|
|
9655
|
+
style: { backgroundColor: "color-mix(in oklab, var(--color-foreground) 45%, transparent)" },
|
|
9656
|
+
"aria-hidden": "true"
|
|
9657
|
+
}
|
|
9658
|
+
),
|
|
9659
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex h-full flex-col items-center justify-center gap-4 px-6 text-center", children })
|
|
9660
|
+
]
|
|
9661
|
+
}
|
|
9662
|
+
);
|
|
9663
|
+
}
|
|
9664
|
+
var COLS3 = {
|
|
9665
|
+
2: "sm:grid-cols-2",
|
|
9666
|
+
3: "sm:grid-cols-2 lg:grid-cols-3"
|
|
9667
|
+
};
|
|
9668
|
+
function Blog({
|
|
9669
|
+
posts,
|
|
9670
|
+
eyebrow,
|
|
9671
|
+
title,
|
|
9672
|
+
description,
|
|
9673
|
+
columns = 3,
|
|
9674
|
+
centeredHeader = true,
|
|
9675
|
+
className = "",
|
|
9676
|
+
style
|
|
9677
|
+
}) {
|
|
9678
|
+
const hasHeader = eyebrow != null || title != null || description != null;
|
|
9679
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: ["w-full", className].filter(Boolean).join(" "), style, children: [
|
|
9680
|
+
hasHeader && /* @__PURE__ */ jsxRuntime.jsxs("header", { className: ["mb-10 flex flex-col gap-3", centeredHeader ? "items-center text-center" : "items-start text-left"].join(" "), children: [
|
|
9681
|
+
eyebrow != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-accent", children: eyebrow }),
|
|
9682
|
+
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold tracking-tight text-foreground sm:text-3xl", children: title }),
|
|
9683
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9684
|
+
] }),
|
|
9685
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS3[columns]].join(" "), children: posts.map((post, i) => {
|
|
9686
|
+
const meta = [post.author, post.date, post.readTime].filter((m) => m != null);
|
|
9687
|
+
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9688
|
+
post.image && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative aspect-video overflow-hidden bg-backdrop", children: [
|
|
9689
|
+
/* @__PURE__ */ jsxRuntime.jsx("img", { src: post.image, alt: "", className: "h-full w-full object-cover transition-transform duration-300 ease-out group-hover:scale-105", loading: "lazy" }),
|
|
9690
|
+
post.tag != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute left-3 top-3", children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: "accent", variant: "solid", size: "sm", children: post.tag }) })
|
|
9691
|
+
] }),
|
|
9692
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-2 p-5", children: [
|
|
9693
|
+
post.tag != null && !post.image && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: "accent", variant: "soft", size: "sm", children: post.tag }) }),
|
|
9694
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold leading-snug text-foreground transition-colors group-hover:text-accent", children: post.title }),
|
|
9695
|
+
post.excerpt != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "line-clamp-3 text-sm leading-relaxed text-foreground-secondary", children: post.excerpt }),
|
|
9696
|
+
meta.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-wrap items-center gap-x-2 gap-y-1 pt-3 text-xs text-foreground-muted", children: meta.map((m, j) => /* @__PURE__ */ jsxRuntime.jsxs(React28__default.default.Fragment, { children: [
|
|
9697
|
+
j > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
9698
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: m })
|
|
9699
|
+
] }, j)) })
|
|
9700
|
+
] })
|
|
9701
|
+
] });
|
|
9702
|
+
const cardCx = "group flex flex-col overflow-hidden rounded-xl border border-border bg-surface text-left shadow-sm transition-all duration-200 ease-out hover:-translate-y-0.5 hover:border-border-strong hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent";
|
|
9703
|
+
if (post.href) {
|
|
9704
|
+
return /* @__PURE__ */ jsxRuntime.jsx("a", { href: post.href, className: cardCx, children: inner }, post.key ?? i);
|
|
9705
|
+
}
|
|
9706
|
+
if (post.onClick) {
|
|
9707
|
+
return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: post.onClick, className: cardCx, children: inner }, post.key ?? i);
|
|
9708
|
+
}
|
|
9709
|
+
return /* @__PURE__ */ jsxRuntime.jsx("article", { className: cardCx.replace("focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent", ""), children: inner }, post.key ?? i);
|
|
9710
|
+
}) })
|
|
9711
|
+
] });
|
|
9712
|
+
}
|
|
9713
|
+
var P = ({ d }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: "h-[55%] w-[55%]", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d }) });
|
|
9714
|
+
var ICONS = {
|
|
9715
|
+
x: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" }),
|
|
9716
|
+
twitter: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482A13.978 13.978 0 011.64 3.162a4.822 4.822 0 001.523 6.574 4.9 4.9 0 01-2.229-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" }),
|
|
9717
|
+
github: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23a11.5 11.5 0 013.003-.404c1.02.005 2.045.138 3.003.404 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" }),
|
|
9718
|
+
linkedin: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z" }),
|
|
9719
|
+
youtube: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z" }),
|
|
9720
|
+
instagram: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z" }),
|
|
9721
|
+
facebook: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z" }),
|
|
9722
|
+
mastodon: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 00.023-.043v-1.809a.052.052 0 00-.02-.041.053.053 0 00-.046-.01 20.282 20.282 0 01-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 01-.319-1.433.053.053 0 01.066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.301-.547-1.963-1.66-1.963-1.226 0-1.84.79-1.84 2.352v3.408h-2.546V8.68c0-1.563-.615-2.353-1.84-2.353-1.107 0-1.66.662-1.66 1.963v6.218H4.844V8.105c0-1.3.332-2.333.996-3.097.685-.764 1.583-1.156 2.7-1.156 1.29 0 2.265.498 2.916 1.49l.638 1.071.638-1.071c.65-.992 1.626-1.49 2.916-1.49 1.116 0 2.014.392 2.7 1.156.663.764.995 1.797.995 3.097z" }),
|
|
9723
|
+
email: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M1.5 4.5h21A1.5 1.5 0 0124 6v12a1.5 1.5 0 01-1.5 1.5h-21A1.5 1.5 0 010 18V6a1.5 1.5 0 011.5-1.5zM12 13.06L2.41 6.5h19.18zm-3.43-1.36L1.5 16.94V7.06zM9.9 12.9l1.55 1.06a.99.99 0 001.1 0l1.55-1.06 6.74 4.6H3.16zm5.53-1.2l7.07-4.64v9.88z" }),
|
|
9724
|
+
website: /* @__PURE__ */ jsxRuntime.jsx(P, { d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm7.931 7h-3.07a15.4 15.4 0 00-1.32-3.853A8.03 8.03 0 0119.931 7zM12 2.042c.86 1.243 1.535 2.6 1.99 4.958h-3.98C10.465 4.642 11.14 3.285 12 2.042zM2.069 14A8.05 8.05 0 012 12c0-.69.07-1.36.069-2h3.518c-.05.66-.087 1.32-.087 2 0 .68.037 1.34.087 2zm.943 2h3.07a15.4 15.4 0 001.32 3.853A8.03 8.03 0 014.069 17zm3.07-9h-3.07a8.03 8.03 0 014.39-3.853A15.4 15.4 0 006.139 7zM12 21.958c-.86-1.243-1.535-2.6-1.99-4.958h3.98c-.455 2.358-1.13 3.715-1.99 4.958zM14.34 14H9.66c-.055-.66-.095-1.32-.095-2 0-.68.04-1.34.095-2h4.68c.055.66.095 1.32.095 2 0 .68-.04 1.34-.095 2zm.527 5.853A15.4 15.4 0 0016.187 16h3.07a8.03 8.03 0 01-4.39 3.853zM16.413 14c.05-.66.087-1.32.087-2 0-.68-.037-1.34-.087-2h3.518c.05.64.069 1.31.069 2 0 .69-.019 1.36-.069 2z" })
|
|
9725
|
+
};
|
|
9726
|
+
var SIZE6 = { sm: "h-8 w-8", md: "h-10 w-10" };
|
|
9727
|
+
var VARIANT = {
|
|
9728
|
+
ghost: "text-foreground-secondary hover:bg-surface-raised hover:text-foreground",
|
|
9729
|
+
solid: "bg-surface-raised text-foreground-secondary hover:bg-accent hover:text-accent-fg",
|
|
9730
|
+
outline: "border border-border text-foreground-secondary hover:border-border-strong hover:text-foreground"
|
|
9731
|
+
};
|
|
9732
|
+
function Socials({
|
|
9733
|
+
links,
|
|
9734
|
+
variant = "ghost",
|
|
9735
|
+
size = "md",
|
|
9736
|
+
newTab = true,
|
|
9737
|
+
"aria-label": ariaLabel = "Social links",
|
|
9738
|
+
className = "",
|
|
9739
|
+
style
|
|
9740
|
+
}) {
|
|
9741
|
+
return /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": ariaLabel, className: ["flex flex-wrap items-center gap-2", className].filter(Boolean).join(" "), style, children: links.map((link, i) => {
|
|
9742
|
+
const label = link.label ?? (link.platform ? link.platform[0].toUpperCase() + link.platform.slice(1) : "Link");
|
|
9743
|
+
const icon = link.icon ?? (link.platform ? ICONS[link.platform] : null);
|
|
9744
|
+
const ext = newTab && !link.href.startsWith("mailto:");
|
|
9745
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9746
|
+
"a",
|
|
9747
|
+
{
|
|
9748
|
+
href: link.href,
|
|
9749
|
+
"aria-label": label,
|
|
9750
|
+
title: label,
|
|
9751
|
+
...ext ? { target: "_blank", rel: "noopener noreferrer" } : {},
|
|
9752
|
+
className: ["flex items-center justify-center rounded-full transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent", SIZE6[size], VARIANT[variant]].join(" "),
|
|
9753
|
+
children: icon
|
|
9754
|
+
},
|
|
9755
|
+
i
|
|
9756
|
+
);
|
|
9757
|
+
}) });
|
|
9758
|
+
}
|
|
9759
|
+
var POS2 = {
|
|
9760
|
+
"bottom": "inset-x-0 bottom-0 sm:inset-x-4 sm:bottom-4",
|
|
9761
|
+
"bottom-left": "inset-x-0 bottom-0 sm:inset-x-auto sm:left-4 sm:bottom-4 sm:max-w-md",
|
|
9762
|
+
"bottom-right": "inset-x-0 bottom-0 sm:inset-x-auto sm:right-4 sm:bottom-4 sm:max-w-md"
|
|
9763
|
+
};
|
|
9764
|
+
function CookieConsent({
|
|
9765
|
+
message = "We use cookies to enhance your experience, analyse traffic, and personalise content.",
|
|
9766
|
+
title,
|
|
9767
|
+
acceptLabel = "Accept all",
|
|
9768
|
+
declineLabel,
|
|
9769
|
+
onAccept,
|
|
9770
|
+
onDecline,
|
|
9771
|
+
learnMoreHref,
|
|
9772
|
+
learnMoreLabel = "Learn more",
|
|
9773
|
+
storageKey = "oxygen-cookie-consent",
|
|
9774
|
+
open,
|
|
9775
|
+
position = "bottom",
|
|
9776
|
+
className = ""
|
|
9777
|
+
}) {
|
|
9778
|
+
const persist = typeof storageKey === "string";
|
|
9779
|
+
const [stored, setStored] = useLocalStorage(persist ? storageKey : "__oxygen_cc_off__", null);
|
|
9780
|
+
const visible = open ?? (persist ? stored == null : true);
|
|
9781
|
+
const choose = (choice, cb) => {
|
|
9782
|
+
if (persist) setStored(choice);
|
|
9783
|
+
cb?.();
|
|
9784
|
+
};
|
|
9785
|
+
if (!visible) return null;
|
|
9786
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9787
|
+
"div",
|
|
9788
|
+
{
|
|
9789
|
+
role: "dialog",
|
|
9790
|
+
"aria-label": "Cookie consent",
|
|
9791
|
+
"aria-live": "polite",
|
|
9792
|
+
className: ["fixed z-[60]", POS2[position], className].filter(Boolean).join(" "),
|
|
9793
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 border-t border-border bg-surface p-5 shadow-lg sm:flex-row sm:items-center sm:rounded-xl sm:border", children: [
|
|
9794
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 text-sm leading-relaxed text-foreground-secondary", children: [
|
|
9795
|
+
title != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 font-semibold text-foreground", children: title }),
|
|
9796
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: message }),
|
|
9797
|
+
learnMoreHref && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9798
|
+
" ",
|
|
9799
|
+
/* @__PURE__ */ jsxRuntime.jsx("a", { href: learnMoreHref, className: "font-medium text-accent underline-offset-2 hover:underline", children: learnMoreLabel })
|
|
9800
|
+
] })
|
|
9801
|
+
] }),
|
|
9802
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 gap-2", children: [
|
|
9803
|
+
declineLabel && /* @__PURE__ */ jsxRuntime.jsx(Button_default, { variant: "outline", content: declineLabel, onClick: () => choose("declined", onDecline) }),
|
|
9804
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button_default, { content: acceptLabel, onClick: () => choose("accepted", onAccept) })
|
|
9805
|
+
] })
|
|
9806
|
+
] })
|
|
9807
|
+
}
|
|
9808
|
+
) });
|
|
9809
|
+
}
|
|
9810
|
+
var GRADIENT2 = "radial-gradient(120% 140% at 50% 0%, color-mix(in oklab, var(--color-accent) 14%, transparent), transparent 70%)";
|
|
9811
|
+
function LeadCapture({
|
|
9812
|
+
title,
|
|
9813
|
+
description,
|
|
9814
|
+
placeholder = "you@company.com",
|
|
9815
|
+
inputLabel = "Email address",
|
|
9816
|
+
buttonLabel = "Subscribe",
|
|
9817
|
+
onSubmit,
|
|
9818
|
+
note,
|
|
9819
|
+
successMessage = "Thanks \u2014 you\u2019re on the list.",
|
|
9820
|
+
background = "gradient",
|
|
9821
|
+
centered = true,
|
|
9822
|
+
className = "",
|
|
9823
|
+
style
|
|
9824
|
+
}) {
|
|
9825
|
+
const [email, setEmail] = React28.useState("");
|
|
9826
|
+
const [done, setDone] = React28.useState(false);
|
|
9827
|
+
const submit = (e) => {
|
|
9828
|
+
e.preventDefault();
|
|
9829
|
+
const value = email.trim();
|
|
9830
|
+
if (!value) return;
|
|
9831
|
+
onSubmit?.(value);
|
|
9832
|
+
setDone(true);
|
|
9833
|
+
};
|
|
9834
|
+
const isGradient = background === "gradient";
|
|
9835
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9836
|
+
"section",
|
|
9837
|
+
{
|
|
9838
|
+
className: ["w-full overflow-hidden rounded-2xl border border-border bg-surface px-6 py-12 sm:px-12 sm:py-16", className].filter(Boolean).join(" "),
|
|
9839
|
+
style: { ...isGradient ? { backgroundImage: GRADIENT2 } : {}, ...style },
|
|
9840
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ["mx-auto flex max-w-2xl flex-col gap-4", centered ? "items-center text-center" : "items-start text-left"].join(" "), children: [
|
|
9841
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold tracking-tight text-foreground sm:text-3xl", children: title }),
|
|
9842
|
+
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-xl text-base leading-relaxed text-foreground-secondary", children: description }),
|
|
9843
|
+
done ? /* @__PURE__ */ jsxRuntime.jsxs("p", { role: "status", className: "mt-2 inline-flex items-center gap-2 text-sm font-medium text-status-success", children: [
|
|
9844
|
+
/* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2.5, "aria-hidden": "true", className: "h-5 w-5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }) }),
|
|
9845
|
+
successMessage
|
|
9846
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, className: ["mt-2 flex w-full max-w-md flex-col gap-2 sm:flex-row", centered ? "sm:justify-center" : ""].join(" "), children: [
|
|
9847
|
+
/* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "oxygen-lead-email", className: "sr-only", children: inputLabel }),
|
|
9848
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9849
|
+
"input",
|
|
9850
|
+
{
|
|
9851
|
+
id: "oxygen-lead-email",
|
|
9852
|
+
type: "email",
|
|
9853
|
+
required: true,
|
|
9854
|
+
value: email,
|
|
9855
|
+
onChange: (e) => setEmail(e.target.value),
|
|
9856
|
+
placeholder,
|
|
9857
|
+
autoComplete: "email",
|
|
9858
|
+
className: [fieldShell({ size: "md" }), "flex-1"].join(" ")
|
|
9859
|
+
}
|
|
9860
|
+
),
|
|
9861
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button_default, { content: buttonLabel, className: "shrink-0" })
|
|
9862
|
+
] }),
|
|
9863
|
+
note != null && !done && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-foreground-muted", children: note })
|
|
9864
|
+
] })
|
|
9865
|
+
}
|
|
9866
|
+
);
|
|
9867
|
+
}
|
|
9329
9868
|
|
|
9330
9869
|
Object.defineProperty(exports, "COLORS", {
|
|
9331
9870
|
enumerable: true,
|
|
@@ -9348,6 +9887,7 @@ exports.AppShell = AppShell;
|
|
|
9348
9887
|
exports.AutoComplete = AutoComplete;
|
|
9349
9888
|
exports.Avatar = Avatar;
|
|
9350
9889
|
exports.Badge = Badge;
|
|
9890
|
+
exports.Blog = Blog;
|
|
9351
9891
|
exports.Box = Box;
|
|
9352
9892
|
exports.Breadcrumbs = Breadcrumbs;
|
|
9353
9893
|
exports.Button = Button_default;
|
|
@@ -9365,6 +9905,7 @@ exports.Checkbox = Checkbox;
|
|
|
9365
9905
|
exports.Checkout = Checkout;
|
|
9366
9906
|
exports.ColorPicker = ColorPicker;
|
|
9367
9907
|
exports.ContextMenu = ContextMenu;
|
|
9908
|
+
exports.CookieConsent = CookieConsent;
|
|
9368
9909
|
exports.CreditCardForm = CreditCardForm;
|
|
9369
9910
|
exports.DateRangePicker = DateRangePicker;
|
|
9370
9911
|
exports.Drawer = Drawer;
|
|
@@ -9372,6 +9913,7 @@ exports.Dropdown = Dropdown;
|
|
|
9372
9913
|
exports.EmptyCart = EmptyCart;
|
|
9373
9914
|
exports.FAB = FAB;
|
|
9374
9915
|
exports.FadingBase = FadingBase;
|
|
9916
|
+
exports.FeatureGrid = FeatureGrid;
|
|
9375
9917
|
exports.Field = Field;
|
|
9376
9918
|
exports.FieldHelpIcon = FieldHelpIcon;
|
|
9377
9919
|
exports.FieldLabel = FieldLabel;
|
|
@@ -9385,7 +9927,9 @@ exports.Grid = Grid2;
|
|
|
9385
9927
|
exports.GridCard = GridCard;
|
|
9386
9928
|
exports.Icon = icons_default;
|
|
9387
9929
|
exports.IconButton = IconButton;
|
|
9930
|
+
exports.Jumbotron = Jumbotron;
|
|
9388
9931
|
exports.Kbd = Kbd;
|
|
9932
|
+
exports.LeadCapture = LeadCapture;
|
|
9389
9933
|
exports.List = List2;
|
|
9390
9934
|
exports.LoadingSpinner = LoadingSpinner;
|
|
9391
9935
|
exports.LogoutTimer = LogoutTimer;
|
|
@@ -9396,9 +9940,11 @@ exports.NotificationProvider = NotificationProvider;
|
|
|
9396
9940
|
exports.NumberInput = NumberInput;
|
|
9397
9941
|
exports.OpaqueGridCard = OpaqueGridCard;
|
|
9398
9942
|
exports.OtpInput = OtpInput;
|
|
9943
|
+
exports.Parallax = Parallax;
|
|
9399
9944
|
exports.Password = Password;
|
|
9400
9945
|
exports.PopConfirm = PopConfirm;
|
|
9401
9946
|
exports.Portal = Portal;
|
|
9947
|
+
exports.PricingPlans = PricingPlans;
|
|
9402
9948
|
exports.RadioGroup = RadioGroup;
|
|
9403
9949
|
exports.Rating = Rating;
|
|
9404
9950
|
exports.ScalableContainer = ScalableContainer;
|
|
@@ -9411,7 +9957,9 @@ exports.SkeletonBox = SkeletonBox;
|
|
|
9411
9957
|
exports.SkeletonCard = SkeletonCard;
|
|
9412
9958
|
exports.SkeletonCircle = SkeletonCircle;
|
|
9413
9959
|
exports.SkeletonText = SkeletonText;
|
|
9960
|
+
exports.SlideShow = SlideShow;
|
|
9414
9961
|
exports.Slider = Slider;
|
|
9962
|
+
exports.Socials = Socials;
|
|
9415
9963
|
exports.Statistic = Statistic;
|
|
9416
9964
|
exports.Stepper = Stepper;
|
|
9417
9965
|
exports.Switch = Switch;
|
|
@@ -9419,6 +9967,7 @@ exports.Table = Table;
|
|
|
9419
9967
|
exports.Tabs = Tabs_default;
|
|
9420
9968
|
exports.TagsInput = TagsInput;
|
|
9421
9969
|
exports.Temporal = DatePicker;
|
|
9970
|
+
exports.Testimonials = Testimonials;
|
|
9422
9971
|
exports.TextArea = TextArea;
|
|
9423
9972
|
exports.TextInput = TextInput;
|
|
9424
9973
|
exports.ThemeProvider = ThemeProvider;
|
|
@@ -9431,6 +9980,7 @@ exports.TopBar = TopBar;
|
|
|
9431
9980
|
exports.Tree = Tree;
|
|
9432
9981
|
exports.TreeSelect = TreeSelect;
|
|
9433
9982
|
exports.Typography = Typography;
|
|
9983
|
+
exports.Video = Video;
|
|
9434
9984
|
exports.Wizard = Wizard;
|
|
9435
9985
|
exports.cardNumberError = cardNumberError;
|
|
9436
9986
|
exports.cvvError = cvvError;
|