@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 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 top (destination) end. Default: true. */
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
- * Bracket lines use `overflow: visible` on the SVG to draw into the parent's padding.
1098
- * Ensure the parent section/container has enough horizontal padding for `extent`.
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, MapPin, MessageSquare, Send, Menu, Search, TrendingUp, TrendingDown, Sun, Moon, Palette, AlertTriangle, Loader2, Layers, LayoutGrid, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
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 source = reversed ? [...row.items].reverse() : row.items;
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: `feature-marquee-left ${duration} linear infinite`
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 defaultContactInfoResolved = [
2000
- { icon: Mail, label: "Email", value: "hello@olwiba.com" },
2001
- { icon: MapPin, label: "Base", value: "Aotearoa New Zealand" }
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 = defaultContactInfoResolved,
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: "grid lg:grid-cols-[1fr_1.4fr]", children: [
2029
- /* @__PURE__ */ jsxs("div", { className: "relative overflow-hidden bg-primary px-8 py-12 text-primary-foreground", children: [
2030
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_right,hsl(var(--primary-foreground)/0.12),transparent_55%)]" }),
2031
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_bottom_left,hsl(var(--primary-foreground)/0.06),transparent_60%)]" }),
2032
- /* @__PURE__ */ jsxs("div", { className: "relative flex h-full flex-col gap-8", children: [
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
- Badge$1,
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
- variant: "secondary",
2038
- className: "mb-4 bg-primary-foreground/15 text-primary-foreground hover:bg-primary-foreground/20",
2039
- children: badge
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__ */ jsx(Separator, { className: "bg-primary-foreground/20" }),
2046
- /* @__PURE__ */ jsx("div", { className: "space-y-5", children: contactInfo.map(({ icon: Icon = Mail, label, value }) => /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
2047
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary-foreground/10", children: /* @__PURE__ */ jsx(Icon, { className: "size-4" }) }),
2048
- /* @__PURE__ */ jsxs("div", { children: [
2049
- /* @__PURE__ */ jsx("div", { className: "text-xs font-medium uppercase tracking-wider text-primary-foreground/50", children: label }),
2050
- /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-sm font-medium", children: value })
2051
- ] })
2052
- ] }, label)) }),
2053
- /* @__PURE__ */ jsx("div", { className: "mt-auto", children: /* @__PURE__ */ jsx("p", { className: "text-xs text-primary-foreground/40", children: "Response within one business day." }) })
2054
- ] })
2055
- ] }),
2056
- /* @__PURE__ */ jsx("div", { className: "p-8 sm:p-10", children: submitted ? /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-[360px] flex-col items-center justify-center gap-5 text-center", children: [
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: "space-y-1.5", children: [
2071
- /* @__PURE__ */ jsx(Label, { htmlFor: "contact-last", children: "Last name" }),
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
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "(optional)" })
2092
+ " ",
2093
+ /* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: "(optional)" })
2080
2094
  ] }),
2081
- /* @__PURE__ */ jsx(Input$1, { id: "contact-company", name: "company", placeholder: "Acme Inc." })
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: "space-y-1.5", children: [
2084
- /* @__PURE__ */ jsxs(Label, { htmlFor: "contact-phone", className: "flex gap-1", children: [
2085
- "Phone",
2086
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "(optional)" })
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__ */ jsx(Input$1, { id: "contact-phone", name: "phone", type: "tel", placeholder: "+1 (555) 000-0000" })
2089
- ] })
2090
- ] }),
2091
- /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
2092
- /* @__PURE__ */ jsx(Label, { htmlFor: "contact-email", children: "Work email" }),
2093
- /* @__PURE__ */ jsx(Input$1, { id: "contact-email", name: "email", type: "email", placeholder: "olivia@company.com", required: true })
2094
- ] }),
2095
- /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
2096
- /* @__PURE__ */ jsx(Label, { htmlFor: "contact-subject", children: "Subject" }),
2097
- /* @__PURE__ */ jsx(Input$1, { id: "contact-subject", name: "subject", placeholder: "How can we help?", required: true })
2098
- ] }),
2099
- /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
2100
- /* @__PURE__ */ jsx(Label, { htmlFor: "contact-message", children: "Message" }),
2101
- /* @__PURE__ */ jsx(
2102
- Textarea$1,
2103
- {
2104
- id: "contact-message",
2105
- name: "message",
2106
- placeholder: "Tell us what you're working on...",
2107
- className: "min-h-32 resize-none",
2108
- required: true
2109
- }
2110
- )
2111
- ] }),
2112
- privacyHref && /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
2113
- /* @__PURE__ */ jsx(Checkbox$1, { id: "contact-privacy", name: "privacy", required: true, className: "mt-0.5" }),
2114
- /* @__PURE__ */ jsxs(Label, { htmlFor: "contact-privacy", className: "text-sm font-normal leading-snug text-muted-foreground", children: [
2115
- "By submitting this form you agree to our",
2116
- " ",
2117
- /* @__PURE__ */ jsx("a", { href: privacyHref, className: "font-medium text-foreground underline-offset-2 hover:underline", children: "privacy policy" }),
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
- "Send message",
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-foreground bg-foreground text-background" : "border-border bg-muted/40"
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-background/60" : "text-muted-foreground"
2238
+ col.highlighted ? "text-primary/80" : "text-muted-foreground"
2158
2239
  ),
2159
2240
  children: col.label
2160
2241
  }
2161
2242
  ),
2162
- /* @__PURE__ */ jsx(
2163
- "p",
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(Check, { className: "mt-0.5 size-4 shrink-0 text-background/70" }) : /* @__PURE__ */ jsx(Minus, { className: "mt-0.5 size-4 shrink-0 text-muted-foreground/50" }),
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-background/90" : "text-muted-foreground"
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",