@olwiba/ui 0.1.8 → 0.1.10
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.d.ts +9 -4
- package/dist/index.js +234 -133
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/FlowBracket.tsx +56 -23
- package/src/marketing/ComparisonSection.tsx +8 -19
- package/src/marketing/ContactSection.tsx +181 -102
- package/src/marketing/FeatureMarqueeSection.tsx +6 -5
- package/src/marketing/Footer.tsx +18 -0
package/dist/index.d.ts
CHANGED
|
@@ -715,9 +715,13 @@ interface FooterProps {
|
|
|
715
715
|
icon: ReactNode;
|
|
716
716
|
}>;
|
|
717
717
|
legal?: string;
|
|
718
|
+
status?: {
|
|
719
|
+
label: string;
|
|
720
|
+
operational?: boolean;
|
|
721
|
+
};
|
|
718
722
|
renderLink?: AppShellRenderLink;
|
|
719
723
|
}
|
|
720
|
-
declare function Footer({ brand, navLinks, socialLinks, legal, renderLink, }: FooterProps): react_jsx_runtime.JSX.Element;
|
|
724
|
+
declare function Footer({ brand, navLinks, socialLinks, legal, status, renderLink, }: FooterProps): react_jsx_runtime.JSX.Element;
|
|
721
725
|
|
|
722
726
|
interface LogoStripProps {
|
|
723
727
|
logos: Array<{
|
|
@@ -1062,7 +1066,7 @@ interface FlowBracketProps {
|
|
|
1062
1066
|
* Defaults to 22.
|
|
1063
1067
|
*/
|
|
1064
1068
|
extent?: number;
|
|
1065
|
-
/** Show open-chevron arrowhead at the
|
|
1069
|
+
/** Show open-chevron arrowhead at the destination end. Default: true. */
|
|
1066
1070
|
arrow?: boolean;
|
|
1067
1071
|
/** CSS color for both bracket lines and animated dots. Defaults to muted slate. */
|
|
1068
1072
|
color?: string;
|
|
@@ -1094,8 +1098,9 @@ interface FlowBracketProps {
|
|
|
1094
1098
|
* left and/or right outside edges — connecting the top of the first child down
|
|
1095
1099
|
* to the bottom of the last child (e.g. docs → SYNC direction).
|
|
1096
1100
|
*
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1101
|
+
* Arrowheads are rendered as absolutely-positioned SVGs (not SVG markers) so
|
|
1102
|
+
* they render at a consistent pixel size regardless of the bracket SVG's aspect
|
|
1103
|
+
* ratio (which spans the full section height with preserveAspectRatio="none").
|
|
1099
1104
|
*/
|
|
1100
1105
|
declare function FlowBracket({ anchorTop, anchorBottom, extent, arrow, color, colorLeft, colorRight, left, right, animate, animateDur, reverseRight, style, className, children, }: FlowBracketProps): react_jsx_runtime.JSX.Element;
|
|
1101
1106
|
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,10 @@ import { cn } from './chunk-AMWLSHD6.js';
|
|
|
2
2
|
export { MdxContent, cn } from './chunk-AMWLSHD6.js';
|
|
3
3
|
import * as React29 from 'react';
|
|
4
4
|
import { useRef, useEffect, useState } from 'react';
|
|
5
|
-
import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, Spinner, Popover, PopoverTrigger, PopoverContent, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarFooter, SidebarTrigger, useSidebar, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '@olwiba/cn';
|
|
5
|
+
import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, Spinner, Popover, PopoverTrigger, PopoverContent, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarFooter, SidebarTrigger, useSidebar, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '@olwiba/cn';
|
|
6
6
|
export { CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@olwiba/cn';
|
|
7
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
|
-
import { Compass, ArrowLeft, X, ArrowRight, ChevronLeft, ChevronRight, Sparkles, Rocket, Check, Minus, Quote, Star, Twitter, Github, Linkedin, Mail,
|
|
8
|
+
import { Compass, ArrowLeft, X, ArrowRight, ChevronLeft, ChevronRight, Sparkles, Rocket, Check, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, Search, TrendingUp, TrendingDown, Sun, Moon, Palette, AlertTriangle, Loader2, Layers, LayoutGrid, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
|
|
9
9
|
|
|
10
10
|
var OlwibaUIContext = React29.createContext({
|
|
11
11
|
isMobile: false,
|
|
@@ -1289,8 +1289,7 @@ function FeatureMarqueeSection({
|
|
|
1289
1289
|
/* @__PURE__ */ jsx("div", { className: "space-y-3", children: rows.map((row, i) => {
|
|
1290
1290
|
const direction = row.direction ?? (i % 2 === 0 ? "left" : "right");
|
|
1291
1291
|
const reversed = direction === "right";
|
|
1292
|
-
const
|
|
1293
|
-
const set = Array.from({ length: 4 }, () => source).flat();
|
|
1292
|
+
const set = Array.from({ length: 4 }, () => row.items).flat();
|
|
1294
1293
|
const items = [...set, ...set];
|
|
1295
1294
|
return /* @__PURE__ */ jsx(
|
|
1296
1295
|
"div",
|
|
@@ -1308,7 +1307,7 @@ function FeatureMarqueeSection({
|
|
|
1308
1307
|
pauseOnHover && "group-hover:[animation-play-state:paused]"
|
|
1309
1308
|
),
|
|
1310
1309
|
style: {
|
|
1311
|
-
animation:
|
|
1310
|
+
animation: `${reversed ? "feature-marquee-right" : "feature-marquee-left"} ${duration} linear infinite`
|
|
1312
1311
|
},
|
|
1313
1312
|
children: items.map((item, j) => {
|
|
1314
1313
|
const Icon = item.icon;
|
|
@@ -1336,6 +1335,10 @@ function FeatureMarqueeSection({
|
|
|
1336
1335
|
from { transform: translateX(0); }
|
|
1337
1336
|
to { transform: translateX(-50%); }
|
|
1338
1337
|
}
|
|
1338
|
+
@keyframes feature-marquee-right {
|
|
1339
|
+
from { transform: translateX(-50%); }
|
|
1340
|
+
to { transform: translateX(0); }
|
|
1341
|
+
}
|
|
1339
1342
|
` })
|
|
1340
1343
|
] });
|
|
1341
1344
|
}
|
|
@@ -1996,9 +1999,13 @@ function NewsletterSection({
|
|
|
1996
1999
|
] })
|
|
1997
2000
|
] }) });
|
|
1998
2001
|
}
|
|
1999
|
-
var
|
|
2000
|
-
{
|
|
2001
|
-
{
|
|
2002
|
+
var PHONE_PREFIXES = [
|
|
2003
|
+
{ label: "US +1", value: "+1-US" },
|
|
2004
|
+
{ label: "NZ +64", value: "+64-NZ" },
|
|
2005
|
+
{ label: "AU +61", value: "+61-AU" },
|
|
2006
|
+
{ label: "UK +44", value: "+44-UK" },
|
|
2007
|
+
{ label: "CA +1", value: "+1-CA" },
|
|
2008
|
+
{ label: "EU", value: "+0-EU" }
|
|
2002
2009
|
];
|
|
2003
2010
|
var defaults2 = {
|
|
2004
2011
|
badge: "Contact",
|
|
@@ -2012,7 +2019,7 @@ function ContactSection({
|
|
|
2012
2019
|
badge = defaults2.badge,
|
|
2013
2020
|
title = defaults2.title,
|
|
2014
2021
|
description = defaults2.description,
|
|
2015
|
-
contactInfo
|
|
2022
|
+
contactInfo,
|
|
2016
2023
|
privacyHref,
|
|
2017
2024
|
successTitle = defaults2.successTitle,
|
|
2018
2025
|
successDescription = defaults2.successDescription,
|
|
@@ -2025,104 +2032,178 @@ function ContactSection({
|
|
|
2025
2032
|
await onSubmit?.(e);
|
|
2026
2033
|
setSubmitted(true);
|
|
2027
2034
|
}
|
|
2028
|
-
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden rounded-2xl border bg-card", children: /* @__PURE__ */ jsxs("div", { className: "
|
|
2029
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
2030
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
2031
|
-
/* @__PURE__ */ jsx("
|
|
2032
|
-
/* @__PURE__ */
|
|
2035
|
+
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden rounded-2xl border bg-card", children: /* @__PURE__ */ jsxs("div", { className: "px-6 py-14 sm:px-10 sm:py-20", children: [
|
|
2036
|
+
/* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
|
|
2037
|
+
badge && /* @__PURE__ */ jsx("div", { className: "mb-4 flex justify-center", children: /* @__PURE__ */ jsx(Badge$1, { variant: "secondary", children: badge }) }),
|
|
2038
|
+
/* @__PURE__ */ jsx("h2", { className: "text-balance text-4xl font-semibold tracking-tight sm:text-5xl", children: title }),
|
|
2039
|
+
/* @__PURE__ */ jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: description }),
|
|
2040
|
+
contactInfo && contactInfo.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-8 flex flex-wrap justify-center gap-6", children: contactInfo.map(({ icon: Icon = Mail, label, value }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
2041
|
+
/* @__PURE__ */ jsx(Icon, { className: "size-4 shrink-0" }),
|
|
2042
|
+
/* @__PURE__ */ jsx("span", { children: value })
|
|
2043
|
+
] }, label)) })
|
|
2044
|
+
] }),
|
|
2045
|
+
submitted ? /* @__PURE__ */ jsxs("div", { className: "mx-auto mt-16 max-w-xl text-center", children: [
|
|
2046
|
+
/* @__PURE__ */ jsx("div", { className: "mx-auto flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(MessageSquare, { className: "size-6" }) }),
|
|
2047
|
+
/* @__PURE__ */ jsx("h3", { className: "mt-5 text-lg font-semibold", children: successTitle }),
|
|
2048
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: successDescription }),
|
|
2049
|
+
/* @__PURE__ */ jsx(Button$1, { variant: "outline", size: "sm", className: "mt-6", onClick: () => setSubmitted(false), children: sendAnotherLabel })
|
|
2050
|
+
] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "mx-auto mt-16 max-w-xl sm:mt-20", children: [
|
|
2051
|
+
/* @__PURE__ */ jsx(
|
|
2052
|
+
"input",
|
|
2053
|
+
{
|
|
2054
|
+
type: "text",
|
|
2055
|
+
name: "_hp",
|
|
2056
|
+
tabIndex: -1,
|
|
2057
|
+
autoComplete: "off",
|
|
2058
|
+
"aria-hidden": "true",
|
|
2059
|
+
className: "hidden"
|
|
2060
|
+
}
|
|
2061
|
+
),
|
|
2062
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-x-8 gap-y-6 sm:grid-cols-2", children: [
|
|
2033
2063
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
2034
|
-
/* @__PURE__ */ jsx(
|
|
2035
|
-
|
|
2064
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "contact-first", className: "block text-sm/6 font-semibold", children: "First name" }),
|
|
2065
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2.5", children: /* @__PURE__ */ jsx(
|
|
2066
|
+
Input$1,
|
|
2036
2067
|
{
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2068
|
+
id: "contact-first",
|
|
2069
|
+
name: "firstName",
|
|
2070
|
+
autoComplete: "given-name",
|
|
2071
|
+
placeholder: "First",
|
|
2072
|
+
required: true
|
|
2040
2073
|
}
|
|
2041
|
-
)
|
|
2042
|
-
/* @__PURE__ */ jsx("h2", { className: "text-3xl font-semibold leading-tight", children: title }),
|
|
2043
|
-
/* @__PURE__ */ jsx("p", { className: "mt-3 text-sm leading-relaxed text-primary-foreground/70", children: description })
|
|
2074
|
+
) })
|
|
2044
2075
|
] }),
|
|
2045
|
-
/* @__PURE__ */
|
|
2046
|
-
|
|
2047
|
-
/* @__PURE__ */ jsx("div", { className: "mt-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
/* @__PURE__ */ jsx("div", { className: "flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(MessageSquare, { className: "size-6" }) }),
|
|
2058
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
2059
|
-
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold", children: successTitle }),
|
|
2060
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm text-muted-foreground", children: successDescription })
|
|
2061
|
-
] }),
|
|
2062
|
-
/* @__PURE__ */ jsx(Button$1, { variant: "outline", size: "sm", onClick: () => setSubmitted(false), children: sendAnotherLabel })
|
|
2063
|
-
] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
2064
|
-
/* @__PURE__ */ jsx("input", { type: "text", name: "_hp", tabIndex: -1, autoComplete: "off", "aria-hidden": "true", className: "hidden" }),
|
|
2065
|
-
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
|
|
2066
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
2067
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: "contact-first", children: "First name" }),
|
|
2068
|
-
/* @__PURE__ */ jsx(Input$1, { id: "contact-first", name: "firstName", placeholder: "Olivia", required: true })
|
|
2076
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
2077
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "contact-last", className: "block text-sm/6 font-semibold", children: "Last name" }),
|
|
2078
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2.5", children: /* @__PURE__ */ jsx(
|
|
2079
|
+
Input$1,
|
|
2080
|
+
{
|
|
2081
|
+
id: "contact-last",
|
|
2082
|
+
name: "lastName",
|
|
2083
|
+
autoComplete: "family-name",
|
|
2084
|
+
placeholder: "Last",
|
|
2085
|
+
required: true
|
|
2086
|
+
}
|
|
2087
|
+
) })
|
|
2069
2088
|
] }),
|
|
2070
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
2071
|
-
/* @__PURE__ */
|
|
2072
|
-
/* @__PURE__ */ jsx(Input$1, { id: "contact-last", name: "lastName", placeholder: "Reed", required: true })
|
|
2073
|
-
] })
|
|
2074
|
-
] }),
|
|
2075
|
-
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
|
|
2076
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
2077
|
-
/* @__PURE__ */ jsxs(Label, { htmlFor: "contact-company", className: "flex gap-1", children: [
|
|
2089
|
+
/* @__PURE__ */ jsxs("div", { className: "sm:col-span-2", children: [
|
|
2090
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor: "contact-company", className: "block text-sm/6 font-semibold", children: [
|
|
2078
2091
|
"Company",
|
|
2079
|
-
|
|
2092
|
+
" ",
|
|
2093
|
+
/* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: "(optional)" })
|
|
2080
2094
|
] }),
|
|
2081
|
-
/* @__PURE__ */ jsx(
|
|
2095
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2.5", children: /* @__PURE__ */ jsx(
|
|
2096
|
+
Input$1,
|
|
2097
|
+
{
|
|
2098
|
+
id: "contact-company",
|
|
2099
|
+
name: "company",
|
|
2100
|
+
autoComplete: "organization",
|
|
2101
|
+
placeholder: "Acme Inc."
|
|
2102
|
+
}
|
|
2103
|
+
) })
|
|
2082
2104
|
] }),
|
|
2083
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
2084
|
-
/* @__PURE__ */
|
|
2085
|
-
|
|
2086
|
-
|
|
2105
|
+
/* @__PURE__ */ jsxs("div", { className: "sm:col-span-2", children: [
|
|
2106
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "contact-email", className: "block text-sm/6 font-semibold", children: "Email" }),
|
|
2107
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2.5", children: /* @__PURE__ */ jsx(
|
|
2108
|
+
Input$1,
|
|
2109
|
+
{
|
|
2110
|
+
id: "contact-email",
|
|
2111
|
+
name: "email",
|
|
2112
|
+
type: "email",
|
|
2113
|
+
autoComplete: "email",
|
|
2114
|
+
placeholder: "you@company.com",
|
|
2115
|
+
required: true
|
|
2116
|
+
}
|
|
2117
|
+
) })
|
|
2118
|
+
] }),
|
|
2119
|
+
/* @__PURE__ */ jsxs("div", { className: "sm:col-span-2", children: [
|
|
2120
|
+
/* @__PURE__ */ jsxs(Label, { htmlFor: "contact-phone", className: "block text-sm/6 font-semibold", children: [
|
|
2121
|
+
"Phone number",
|
|
2122
|
+
" ",
|
|
2123
|
+
/* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: "(optional)" })
|
|
2087
2124
|
] }),
|
|
2088
|
-
/* @__PURE__ */
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
/* @__PURE__ */ jsxs(
|
|
2115
|
-
|
|
2116
|
-
" ",
|
|
2117
|
-
|
|
2118
|
-
|
|
2125
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2.5 flex overflow-hidden rounded-md border border-input bg-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2", children: [
|
|
2126
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex shrink-0 items-center border-r border-input", children: [
|
|
2127
|
+
/* @__PURE__ */ jsx(
|
|
2128
|
+
"select",
|
|
2129
|
+
{
|
|
2130
|
+
name: "countryCode",
|
|
2131
|
+
"aria-label": "Country code",
|
|
2132
|
+
defaultValue: "+1-US",
|
|
2133
|
+
className: "h-full appearance-none bg-transparent py-2 pl-3 pr-7 text-sm text-foreground focus:outline-none",
|
|
2134
|
+
children: PHONE_PREFIXES.map(({ label, value }) => /* @__PURE__ */ jsx("option", { value, children: label }, value))
|
|
2135
|
+
}
|
|
2136
|
+
),
|
|
2137
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "pointer-events-none absolute right-1.5 size-3.5 shrink-0 text-muted-foreground" })
|
|
2138
|
+
] }),
|
|
2139
|
+
/* @__PURE__ */ jsx(
|
|
2140
|
+
"input",
|
|
2141
|
+
{
|
|
2142
|
+
id: "contact-phone",
|
|
2143
|
+
name: "phone",
|
|
2144
|
+
type: "tel",
|
|
2145
|
+
placeholder: "123-456-7890",
|
|
2146
|
+
className: "min-w-0 grow bg-transparent px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none"
|
|
2147
|
+
}
|
|
2148
|
+
)
|
|
2149
|
+
] })
|
|
2150
|
+
] }),
|
|
2151
|
+
/* @__PURE__ */ jsxs("div", { className: "sm:col-span-2", children: [
|
|
2152
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "contact-message", className: "block text-sm/6 font-semibold", children: "Message" }),
|
|
2153
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2.5", children: /* @__PURE__ */ jsx(
|
|
2154
|
+
Textarea$1,
|
|
2155
|
+
{
|
|
2156
|
+
id: "contact-message",
|
|
2157
|
+
name: "message",
|
|
2158
|
+
rows: 4,
|
|
2159
|
+
placeholder: "Tell us what you're working on...",
|
|
2160
|
+
className: "resize-none",
|
|
2161
|
+
required: true
|
|
2162
|
+
}
|
|
2163
|
+
) })
|
|
2164
|
+
] }),
|
|
2165
|
+
privacyHref && /* @__PURE__ */ jsxs("div", { className: "flex gap-x-4 sm:col-span-2", children: [
|
|
2166
|
+
/* @__PURE__ */ jsx("div", { className: "flex h-6 items-center", children: /* @__PURE__ */ jsxs("div", { className: "group relative inline-flex h-5 w-8 shrink-0 cursor-pointer rounded-full border border-input bg-muted p-px transition-colors duration-200 ease-in-out focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 has-[:checked]:border-primary has-[:checked]:bg-primary", children: [
|
|
2167
|
+
/* @__PURE__ */ jsx("span", { className: "size-4 rounded-full bg-background shadow-sm transition-transform duration-200 ease-in-out group-has-[:checked]:translate-x-3" }),
|
|
2168
|
+
/* @__PURE__ */ jsx(
|
|
2169
|
+
"input",
|
|
2170
|
+
{
|
|
2171
|
+
id: "contact-privacy",
|
|
2172
|
+
name: "privacy",
|
|
2173
|
+
type: "checkbox",
|
|
2174
|
+
required: true,
|
|
2175
|
+
"aria-label": "Agree to privacy policy",
|
|
2176
|
+
className: "absolute inset-0 size-full cursor-pointer appearance-none focus:outline-none"
|
|
2177
|
+
}
|
|
2178
|
+
)
|
|
2179
|
+
] }) }),
|
|
2180
|
+
/* @__PURE__ */ jsxs(
|
|
2181
|
+
Label,
|
|
2182
|
+
{
|
|
2183
|
+
htmlFor: "contact-privacy",
|
|
2184
|
+
className: "cursor-pointer text-sm font-normal leading-snug text-muted-foreground",
|
|
2185
|
+
children: [
|
|
2186
|
+
"By selecting this, you agree to our",
|
|
2187
|
+
" ",
|
|
2188
|
+
/* @__PURE__ */ jsx(
|
|
2189
|
+
"a",
|
|
2190
|
+
{
|
|
2191
|
+
href: privacyHref,
|
|
2192
|
+
className: "font-medium text-foreground underline-offset-2 hover:underline",
|
|
2193
|
+
children: "privacy policy"
|
|
2194
|
+
}
|
|
2195
|
+
),
|
|
2196
|
+
"."
|
|
2197
|
+
]
|
|
2198
|
+
}
|
|
2199
|
+
)
|
|
2119
2200
|
] })
|
|
2120
2201
|
] }),
|
|
2121
|
-
/* @__PURE__ */ jsxs(Button$1, { type: "submit", className: "w-full", children: [
|
|
2122
|
-
"
|
|
2202
|
+
/* @__PURE__ */ jsx("div", { className: "mt-10", children: /* @__PURE__ */ jsxs(Button$1, { type: "submit", className: "w-full", children: [
|
|
2203
|
+
"Let's talk",
|
|
2123
2204
|
/* @__PURE__ */ jsx(Send, { className: "ml-2 size-4" })
|
|
2124
|
-
] })
|
|
2125
|
-
] })
|
|
2205
|
+
] }) })
|
|
2206
|
+
] })
|
|
2126
2207
|
] }) });
|
|
2127
2208
|
}
|
|
2128
2209
|
function ComparisonSection({
|
|
@@ -2144,8 +2225,8 @@ function ComparisonSection({
|
|
|
2144
2225
|
"div",
|
|
2145
2226
|
{
|
|
2146
2227
|
className: cn$1(
|
|
2147
|
-
"flex flex-col rounded-2xl border p-6",
|
|
2148
|
-
col.highlighted ? "border-
|
|
2228
|
+
"flex h-full flex-col rounded-2xl border p-6",
|
|
2229
|
+
col.highlighted ? "border-primary bg-primary/10 ring-1 ring-primary/20" : "border-border bg-muted/40"
|
|
2149
2230
|
),
|
|
2150
2231
|
children: [
|
|
2151
2232
|
/* @__PURE__ */ jsxs("div", { className: "mb-6", children: [
|
|
@@ -2154,40 +2235,22 @@ function ComparisonSection({
|
|
|
2154
2235
|
{
|
|
2155
2236
|
className: cn$1(
|
|
2156
2237
|
"text-xs font-semibold uppercase tracking-widest",
|
|
2157
|
-
col.highlighted ? "text-
|
|
2238
|
+
col.highlighted ? "text-primary/80" : "text-muted-foreground"
|
|
2158
2239
|
),
|
|
2159
2240
|
children: col.label
|
|
2160
2241
|
}
|
|
2161
2242
|
),
|
|
2162
|
-
/* @__PURE__ */ jsx(
|
|
2163
|
-
|
|
2164
|
-
{
|
|
2165
|
-
className: cn$1(
|
|
2166
|
-
"mt-2 text-2xl font-bold tracking-tight",
|
|
2167
|
-
col.highlighted ? "text-background" : "text-foreground"
|
|
2168
|
-
),
|
|
2169
|
-
children: col.cost
|
|
2170
|
-
}
|
|
2171
|
-
),
|
|
2172
|
-
col.costDetail && /* @__PURE__ */ jsx(
|
|
2173
|
-
"p",
|
|
2174
|
-
{
|
|
2175
|
-
className: cn$1(
|
|
2176
|
-
"mt-1 text-sm",
|
|
2177
|
-
col.highlighted ? "text-background/60" : "text-muted-foreground"
|
|
2178
|
-
),
|
|
2179
|
-
children: col.costDetail
|
|
2180
|
-
}
|
|
2181
|
-
)
|
|
2243
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-2xl font-bold tracking-tight text-foreground", children: col.cost }),
|
|
2244
|
+
col.costDetail && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: col.costDetail })
|
|
2182
2245
|
] }),
|
|
2183
2246
|
/* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-3", children: col.items.map((item) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2.5", children: [
|
|
2184
|
-
col.highlighted ? /* @__PURE__ */ jsx(
|
|
2247
|
+
col.highlighted ? /* @__PURE__ */ jsx("span", { className: "mt-0.5 shrink-0 text-sm leading-none", children: "\u26A1" }) : /* @__PURE__ */ jsx("span", { className: "mt-0.5 shrink-0 text-sm leading-none", children: "\u274C" }),
|
|
2185
2248
|
/* @__PURE__ */ jsx(
|
|
2186
2249
|
"span",
|
|
2187
2250
|
{
|
|
2188
2251
|
className: cn$1(
|
|
2189
2252
|
"text-sm leading-snug",
|
|
2190
|
-
col.highlighted ? "text-
|
|
2253
|
+
col.highlighted ? "text-foreground" : "text-muted-foreground"
|
|
2191
2254
|
),
|
|
2192
2255
|
children: item
|
|
2193
2256
|
}
|
|
@@ -2330,6 +2393,7 @@ function Footer({
|
|
|
2330
2393
|
navLinks,
|
|
2331
2394
|
socialLinks,
|
|
2332
2395
|
legal,
|
|
2396
|
+
status,
|
|
2333
2397
|
renderLink = defaultRenderLink9
|
|
2334
2398
|
}) {
|
|
2335
2399
|
const brandHref = brand.href ?? "/";
|
|
@@ -2358,7 +2422,16 @@ function Footer({
|
|
|
2358
2422
|
},
|
|
2359
2423
|
label
|
|
2360
2424
|
)) }),
|
|
2361
|
-
/* @__PURE__ */ jsx("p", { className: "mt-10 text-center text-sm/6 text-muted-foreground/70", children: copyrightText })
|
|
2425
|
+
/* @__PURE__ */ jsx("p", { className: "mt-10 text-center text-sm/6 text-muted-foreground/70", children: copyrightText }),
|
|
2426
|
+
status && /* @__PURE__ */ jsx("div", { className: "mt-4 flex justify-center", children: /* @__PURE__ */ jsx("div", { className: "inline-flex items-center rounded-full border bg-muted/40 px-3 py-1 text-xs text-muted-foreground", children: /* @__PURE__ */ jsx(
|
|
2427
|
+
StatusIndicator,
|
|
2428
|
+
{
|
|
2429
|
+
pulse: status.operational !== false,
|
|
2430
|
+
dotClassName: status.operational !== false ? "text-emerald-500" : "text-destructive",
|
|
2431
|
+
size: "sm",
|
|
2432
|
+
children: status.label
|
|
2433
|
+
}
|
|
2434
|
+
) }) })
|
|
2362
2435
|
] }) });
|
|
2363
2436
|
}
|
|
2364
2437
|
var speedDuration2 = {
|
|
@@ -3019,8 +3092,6 @@ function FlowConnector({
|
|
|
3019
3092
|
}
|
|
3020
3093
|
);
|
|
3021
3094
|
}
|
|
3022
|
-
var MARKER_L = "fb-ml";
|
|
3023
|
-
var MARKER_R = "fb-mr";
|
|
3024
3095
|
function FlowBracket({
|
|
3025
3096
|
anchorTop = 8,
|
|
3026
3097
|
anchorBottom = 92,
|
|
@@ -3079,6 +3150,20 @@ function FlowBracket({
|
|
|
3079
3150
|
pointerEvents: "none",
|
|
3080
3151
|
opacity: 0
|
|
3081
3152
|
};
|
|
3153
|
+
const chevronProps = {
|
|
3154
|
+
fill: "none",
|
|
3155
|
+
strokeWidth: "1.5",
|
|
3156
|
+
strokeLinecap: "round",
|
|
3157
|
+
strokeLinejoin: "round"
|
|
3158
|
+
};
|
|
3159
|
+
const arrowBase = {
|
|
3160
|
+
position: "absolute",
|
|
3161
|
+
width: 10,
|
|
3162
|
+
height: 8,
|
|
3163
|
+
overflow: "visible",
|
|
3164
|
+
pointerEvents: "none",
|
|
3165
|
+
transform: "translate(-50%, -50%)"
|
|
3166
|
+
};
|
|
3082
3167
|
return /* @__PURE__ */ jsxs("div", { className, style: { position: "relative", ...style }, children: [
|
|
3083
3168
|
animate && /* @__PURE__ */ jsx("style", { children: dotKeyframes }),
|
|
3084
3169
|
/* @__PURE__ */ jsxs(
|
|
@@ -3090,20 +3175,15 @@ function FlowBracket({
|
|
|
3090
3175
|
className: "pointer-events-none absolute inset-0",
|
|
3091
3176
|
style: { width: "100%", height: "100%", overflow: "visible" },
|
|
3092
3177
|
children: [
|
|
3093
|
-
/* @__PURE__ */ jsxs("defs", { children: [
|
|
3094
|
-
/* @__PURE__ */ jsx("marker", { id: MARKER_L, markerWidth: "10", markerHeight: "8", refX: "8", refY: "4", orient: "auto", children: /* @__PURE__ */ jsx("polyline", { points: "1,1 8,4 1,7", fill: "none", stroke: cl, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }),
|
|
3095
|
-
/* @__PURE__ */ jsx("marker", { id: MARKER_R, markerWidth: "10", markerHeight: "8", refX: "8", refY: "4", orient: "auto", children: /* @__PURE__ */ jsx("polyline", { points: "1,1 8,4 1,7", fill: "none", stroke: cr, strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })
|
|
3096
|
-
] }),
|
|
3097
3178
|
left && /* @__PURE__ */ jsx(
|
|
3098
3179
|
"path",
|
|
3099
3180
|
{
|
|
3100
3181
|
d: leftD,
|
|
3101
3182
|
fill: "none",
|
|
3102
|
-
stroke: cl,
|
|
3183
|
+
style: { stroke: cl },
|
|
3103
3184
|
strokeWidth: 1.5,
|
|
3104
3185
|
strokeDasharray: "5,4",
|
|
3105
|
-
vectorEffect: "non-scaling-stroke"
|
|
3106
|
-
...arrow ? { markerEnd: `url(#${MARKER_L})` } : {}
|
|
3186
|
+
vectorEffect: "non-scaling-stroke"
|
|
3107
3187
|
}
|
|
3108
3188
|
),
|
|
3109
3189
|
right && /* @__PURE__ */ jsx(
|
|
@@ -3111,16 +3191,37 @@ function FlowBracket({
|
|
|
3111
3191
|
{
|
|
3112
3192
|
d: rightD,
|
|
3113
3193
|
fill: "none",
|
|
3114
|
-
stroke: cr,
|
|
3194
|
+
style: { stroke: cr },
|
|
3115
3195
|
strokeWidth: 1.5,
|
|
3116
3196
|
strokeDasharray: "5,4",
|
|
3117
|
-
vectorEffect: "non-scaling-stroke"
|
|
3118
|
-
...arrow ? { markerEnd: `url(#${MARKER_R})` } : {}
|
|
3197
|
+
vectorEffect: "non-scaling-stroke"
|
|
3119
3198
|
}
|
|
3120
3199
|
)
|
|
3121
3200
|
]
|
|
3122
3201
|
}
|
|
3123
3202
|
),
|
|
3203
|
+
arrow && left && /* @__PURE__ */ jsx(
|
|
3204
|
+
"svg",
|
|
3205
|
+
{
|
|
3206
|
+
"aria-hidden": true,
|
|
3207
|
+
viewBox: "0 0 10 8",
|
|
3208
|
+
style: { ...arrowBase, top: `${anchorTop}%`, left: 0 },
|
|
3209
|
+
children: /* @__PURE__ */ jsx("polyline", { points: "1,1 8,4 1,7", style: { stroke: cl }, ...chevronProps })
|
|
3210
|
+
}
|
|
3211
|
+
),
|
|
3212
|
+
arrow && right && /* @__PURE__ */ jsx(
|
|
3213
|
+
"svg",
|
|
3214
|
+
{
|
|
3215
|
+
"aria-hidden": true,
|
|
3216
|
+
viewBox: "0 0 10 8",
|
|
3217
|
+
style: {
|
|
3218
|
+
...arrowBase,
|
|
3219
|
+
top: reverseRight ? `${anchorBottom}%` : `${anchorTop}%`,
|
|
3220
|
+
left: "100%"
|
|
3221
|
+
},
|
|
3222
|
+
children: /* @__PURE__ */ jsx("polyline", { points: "9,1 2,4 9,7", style: { stroke: cr }, ...chevronProps })
|
|
3223
|
+
}
|
|
3224
|
+
),
|
|
3124
3225
|
children,
|
|
3125
3226
|
animate && left && /* @__PURE__ */ jsx(
|
|
3126
3227
|
"div",
|