@orangecheck/design 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/chrome.d.mts +1 -1
  2. package/dist/chrome.d.ts +1 -1
  3. package/dist/chrome.js +16 -0
  4. package/dist/chrome.js.map +1 -1
  5. package/dist/chrome.mjs +16 -0
  6. package/dist/chrome.mjs.map +1 -1
  7. package/dist/components.d.mts +1 -1
  8. package/dist/components.d.ts +1 -1
  9. package/dist/components.js +830 -178
  10. package/dist/components.js.map +1 -1
  11. package/dist/components.mjs +780 -143
  12. package/dist/components.mjs.map +1 -1
  13. package/dist/composites.d.mts +142 -1
  14. package/dist/composites.d.ts +142 -1
  15. package/dist/composites.js +641 -3
  16. package/dist/composites.js.map +1 -1
  17. package/dist/composites.mjs +627 -4
  18. package/dist/composites.mjs.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +538 -11
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +522 -13
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/primitives.d.mts +24 -4
  26. package/dist/primitives.d.ts +24 -4
  27. package/dist/primitives.js +123 -11
  28. package/dist/primitives.js.map +1 -1
  29. package/dist/primitives.mjs +121 -13
  30. package/dist/primitives.mjs.map +1 -1
  31. package/dist/styles/fonts/hanken-grotesk-latin-ext.woff2 +0 -0
  32. package/dist/styles/fonts/hanken-grotesk-latin.woff2 +0 -0
  33. package/dist/styles/fonts.css +29 -0
  34. package/dist/styles/theme.css +43 -5
  35. package/dist/styles/themes/ember.css +223 -0
  36. package/dist/styles/themes.css +1 -0
  37. package/dist/styles.css +1 -0
  38. package/dist/tokens.js +6 -0
  39. package/dist/tokens.js.map +1 -1
  40. package/dist/tokens.mjs +6 -0
  41. package/dist/tokens.mjs.map +1 -1
  42. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -88,6 +88,12 @@ var OC_THEMES = [
88
88
  label: "gold",
89
89
  description: "sound money \u2014 digital gold, hard 0.125rem milled edge, mono ledger \xB7 21M",
90
90
  accent: "#e3b831"
91
+ },
92
+ {
93
+ id: "ember",
94
+ label: "ember",
95
+ description: "the warmth \u2014 burnt-sienna terracotta, soft 1rem corners, pill buttons, Hanken Grotesk \xB7 approachable, human",
96
+ accent: "#da6736"
91
97
  }
92
98
  ];
93
99
  var OC_DEFAULT_ACCENT = "#f97316";
@@ -456,7 +462,14 @@ var buttonVariants = classVarianceAuthority.cva(
456
462
  outline: "bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs",
457
463
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
458
464
  ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
459
- link: "text-primary underline-offset-4 hover:underline"
465
+ link: "text-primary underline-offset-4 hover:underline",
466
+ // For CTAs placed ON a saturated brand band or a dark section
467
+ // (e.g. a terracotta hero / footer / a forced-dark block) where
468
+ // the surface is dark+light-text in either mode. A neutral white
469
+ // pill + a translucent-white ghost read on any such surface;
470
+ // hardcoded white is deliberate (cf. destructive's text-white).
471
+ onBrand: "bg-white text-neutral-900 shadow-sm hover:bg-white/90",
472
+ onBrandOutline: "border border-white/40 bg-transparent text-white hover:bg-white/10"
460
473
  },
461
474
  size: {
462
475
  default: "h-9 px-4 py-2 has-[>svg]:px-3",
@@ -499,7 +512,8 @@ var badgeVariants = classVarianceAuthority.cva(
499
512
  warning: "bg-warning text-warning-foreground [a&]:hover:bg-warning/90 border-transparent",
500
513
  success: "bg-success text-success-foreground [a&]:hover:bg-success/90 border-transparent",
501
514
  info: "bg-info text-info-foreground [a&]:hover:bg-info/90 border-transparent",
502
- brand: "bg-brand-soft text-brand border-brand-soft",
515
+ brand: "bg-brand-soft text-accent-foreground border-transparent",
516
+ neutral: "bg-foreground text-background [a&]:hover:bg-foreground/90 border-transparent",
503
517
  outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
504
518
  }
505
519
  },
@@ -524,7 +538,7 @@ function Input({ className, type, ...props }) {
524
538
  className: cn(
525
539
  "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground border-input bg-input/30 hover:bg-input/50 dark:bg-input/30 dark:hover:bg-input/50 h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow,background-color] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
526
540
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
527
- "aria-invalid:ring-brand/25 dark:aria-invalid:ring-brand/35 aria-invalid:border-brand",
541
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
528
542
  className
529
543
  ),
530
544
  ...props
@@ -554,7 +568,7 @@ function Checkbox({ className, ...props }) {
554
568
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
555
569
  "disabled:cursor-not-allowed disabled:opacity-50",
556
570
  "data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground",
557
- "aria-invalid:ring-brand/25 dark:aria-invalid:ring-brand/35 aria-invalid:border-brand",
571
+ "aria-invalid:ring-2 aria-invalid:ring-destructive/50 aria-invalid:border-destructive",
558
572
  className
559
573
  ),
560
574
  ...props,
@@ -595,7 +609,7 @@ function RadioGroupItem({
595
609
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
596
610
  "disabled:cursor-not-allowed disabled:opacity-50",
597
611
  "data-[state=checked]:border-primary",
598
- "aria-invalid:ring-brand/25 dark:aria-invalid:ring-brand/35 aria-invalid:border-brand",
612
+ "aria-invalid:ring-2 aria-invalid:ring-destructive/50 aria-invalid:border-destructive",
599
613
  className
600
614
  ),
601
615
  ...props,
@@ -620,7 +634,7 @@ function Switch({ className, ...props }) {
620
634
  "data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
621
635
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
622
636
  "disabled:cursor-not-allowed disabled:opacity-50",
623
- "aria-invalid:ring-brand/25 dark:aria-invalid:ring-brand/35",
637
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
624
638
  className
625
639
  ),
626
640
  ...props,
@@ -778,7 +792,7 @@ function Textarea({ className, ...props }) {
778
792
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
779
793
  // aria-invalid parity with Input — error styling when a consumer
780
794
  // marks the field invalid.
781
- "aria-invalid:ring-brand/25 dark:aria-invalid:ring-brand/35 aria-invalid:border-brand",
795
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
782
796
  className
783
797
  ),
784
798
  ...props
@@ -1610,18 +1624,19 @@ function Tooltip({
1610
1624
  var Accordion = AccordionPrimitive__namespace.Root;
1611
1625
  var AccordionItem = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Item, { ref, className: cn("border-b", className), ...props }));
1612
1626
  AccordionItem.displayName = "AccordionItem";
1613
- var AccordionTrigger = React2__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
1627
+ var AccordionTrigger = React2__namespace.forwardRef(({ className, children, icon = "chevron", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
1614
1628
  AccordionPrimitive__namespace.Trigger,
1615
1629
  {
1616
1630
  ref,
1617
1631
  className: cn(
1618
- "flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
1632
+ "flex flex-1 items-center justify-between gap-4 py-4 text-left font-medium transition-all hover:underline",
1633
+ icon === "chevron" ? "[&[data-state=open]>svg]:rotate-180" : "[&[data-state=open]>svg]:rotate-45",
1619
1634
  className
1620
1635
  ),
1621
1636
  ...props,
1622
1637
  children: [
1623
1638
  children,
1624
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-200" })
1639
+ icon === "chevron" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-200" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "text-primary h-5 w-5 shrink-0 transition-transform duration-200" })
1625
1640
  ]
1626
1641
  }
1627
1642
  ) }));
@@ -1814,6 +1829,105 @@ var Toaster = ({ ...props }) => {
1814
1829
  }
1815
1830
  );
1816
1831
  };
1832
+ var surfaceVariants = classVarianceAuthority.cva("rounded-xl transition-colors", {
1833
+ variants: {
1834
+ tone: {
1835
+ /* Crisp panel floating on the page — the default soft card. */
1836
+ default: "bg-card text-card-foreground",
1837
+ /* Warm-gray recessed panel. */
1838
+ muted: "bg-muted text-foreground",
1839
+ /* Solid brand fill — small terracotta panel; inverts child text. */
1840
+ brand: "bg-brand text-brand-foreground",
1841
+ /* High-contrast neutral panel (near-black in light, near-white in dark). */
1842
+ contrast: "bg-foreground text-background",
1843
+ /* Translucent lightened tile for cards sitting ON a brand band. */
1844
+ onBrand: "text-brand-foreground [background:color-mix(in_oklch,white_16%,var(--brand))] [border-color:color-mix(in_oklch,white_24%,transparent)]",
1845
+ /* Frame only, transparent fill. */
1846
+ outline: "bg-transparent text-foreground"
1847
+ },
1848
+ elevation: {
1849
+ none: "shadow-none",
1850
+ sm: "shadow-sm",
1851
+ md: "shadow-md",
1852
+ lg: "shadow-lg",
1853
+ xl: "shadow-xl"
1854
+ },
1855
+ bordered: {
1856
+ true: "border",
1857
+ false: ""
1858
+ },
1859
+ pad: {
1860
+ none: "p-0",
1861
+ sm: "p-4",
1862
+ md: "p-5 sm:p-6",
1863
+ lg: "p-6 sm:p-8"
1864
+ }
1865
+ },
1866
+ defaultVariants: {
1867
+ tone: "default",
1868
+ elevation: "sm",
1869
+ bordered: true,
1870
+ pad: "md"
1871
+ }
1872
+ });
1873
+ function Surface({
1874
+ className,
1875
+ tone,
1876
+ elevation,
1877
+ bordered,
1878
+ pad,
1879
+ ...props
1880
+ }) {
1881
+ return /* @__PURE__ */ jsxRuntime.jsx(
1882
+ "div",
1883
+ {
1884
+ "data-slot": "surface",
1885
+ className: cn(surfaceVariants({ tone, elevation, bordered, pad }), className),
1886
+ ...props
1887
+ }
1888
+ );
1889
+ }
1890
+ var iconBadgeVariants = classVarianceAuthority.cva(
1891
+ "inline-flex shrink-0 items-center justify-center rounded-md font-semibold [&_svg]:pointer-events-none",
1892
+ {
1893
+ variants: {
1894
+ tone: {
1895
+ /* The signature peach tile — soft accent fill, terracotta glyph.
1896
+ Auto-swaps to warm-dark + light-peach in dark mode via tokens. */
1897
+ peach: "bg-accent text-accent-foreground",
1898
+ /* Inverted near-black tile, light glyph ("never do" promises). */
1899
+ dark: "bg-foreground text-background",
1900
+ /* Solid brand tile. */
1901
+ brand: "bg-primary text-primary-foreground",
1902
+ /* White tile on a brand band, terracotta glyph (numbered steps). */
1903
+ onBrand: "bg-brand-foreground text-primary",
1904
+ /* Quiet neutral tile. */
1905
+ muted: "bg-muted text-foreground",
1906
+ /* Crisp white (card-colored) tile with a terracotta glyph and a
1907
+ soft lift — the elevated icon chip on muted/colored cards. */
1908
+ surface: "bg-card text-primary shadow-sm"
1909
+ },
1910
+ size: {
1911
+ sm: "size-9 text-xs [&_svg]:size-4",
1912
+ md: "size-11 text-sm [&_svg]:size-5",
1913
+ lg: "size-12 text-base [&_svg]:size-6",
1914
+ xl: "size-14 text-lg [&_svg]:size-7"
1915
+ }
1916
+ },
1917
+ defaultVariants: { tone: "peach", size: "md" }
1918
+ }
1919
+ );
1920
+ function IconBadge({ className, tone, size, children, ...props }) {
1921
+ return /* @__PURE__ */ jsxRuntime.jsx(
1922
+ "span",
1923
+ {
1924
+ "data-slot": "icon-badge",
1925
+ className: cn(iconBadgeVariants({ tone, size }), className),
1926
+ ...props,
1927
+ children
1928
+ }
1929
+ );
1930
+ }
1817
1931
  function Card({
1818
1932
  id,
1819
1933
  title,
@@ -1926,7 +2040,7 @@ function Sparkline({ data, width = 96, height = 24, area = false, className }) {
1926
2040
  function StatBlock({ label, value, sub, delta, tone = "default", className }) {
1927
2041
  const toneClass = tone === "success" ? "text-success" : tone === "warning" ? "text-warning" : tone === "destructive" ? "text-destructive" : "text-foreground";
1928
2042
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-1", className), children: [
1929
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "label-mono text-[10px]", children: label }),
2043
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "label-mono text-muted-foreground text-[10px]", children: label }),
1930
2044
  /* @__PURE__ */ jsxRuntime.jsx(
1931
2045
  "span",
1932
2046
  {
@@ -2519,6 +2633,385 @@ function DataRow({ children, meta, action, as, className }) {
2519
2633
  }
2520
2634
  );
2521
2635
  }
2636
+ function TwoToneHeading({
2637
+ lead,
2638
+ muted,
2639
+ as,
2640
+ tone = "default",
2641
+ className
2642
+ }) {
2643
+ const Tag = as ?? "h2";
2644
+ const leadColor = tone === "onBrand" ? "text-primary-foreground" : "text-foreground";
2645
+ const mutedColor = tone === "onBrand" ? "text-primary-foreground/60" : "text-foreground/40";
2646
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2647
+ Tag,
2648
+ {
2649
+ className: cn(
2650
+ "font-extrabold tracking-[-0.02em] leading-[1.0] text-balance",
2651
+ "text-3xl sm:text-4xl md:text-5xl",
2652
+ leadColor,
2653
+ className
2654
+ ),
2655
+ children: [
2656
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: lead }),
2657
+ muted ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: mutedColor, children: [
2658
+ " ",
2659
+ muted
2660
+ ] }) : null
2661
+ ]
2662
+ }
2663
+ );
2664
+ }
2665
+ function MarketingHeading({
2666
+ eyebrow,
2667
+ lead,
2668
+ muted,
2669
+ body,
2670
+ align = "start",
2671
+ tone = "default",
2672
+ as,
2673
+ className
2674
+ }) {
2675
+ const centered = align === "center";
2676
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", centered && "items-center text-center", className), children: [
2677
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
2678
+ "p",
2679
+ {
2680
+ className: cn(
2681
+ "label-mono mb-3",
2682
+ tone === "onBrand" ? "text-primary-foreground/80" : "text-primary"
2683
+ ),
2684
+ children: eyebrow
2685
+ }
2686
+ ),
2687
+ /* @__PURE__ */ jsxRuntime.jsx(
2688
+ TwoToneHeading,
2689
+ {
2690
+ lead,
2691
+ muted,
2692
+ as,
2693
+ tone,
2694
+ className: cn("max-w-4xl", centered && "mx-auto")
2695
+ }
2696
+ ),
2697
+ body && /* @__PURE__ */ jsxRuntime.jsx(
2698
+ "p",
2699
+ {
2700
+ className: cn(
2701
+ "mt-4 max-w-2xl text-base sm:text-lg",
2702
+ tone === "onBrand" ? "text-primary-foreground/80" : "text-muted-foreground",
2703
+ centered && "mx-auto"
2704
+ ),
2705
+ children: body
2706
+ }
2707
+ )
2708
+ ] });
2709
+ }
2710
+ function FeatureCard({
2711
+ icon,
2712
+ iconTone = "peach",
2713
+ title,
2714
+ children,
2715
+ orientation = "vertical",
2716
+ align = "start",
2717
+ tone = "default",
2718
+ elevation = "sm",
2719
+ className
2720
+ }) {
2721
+ const horizontal = orientation === "horizontal";
2722
+ const centered = !horizontal && align === "center";
2723
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2724
+ Surface,
2725
+ {
2726
+ tone,
2727
+ elevation,
2728
+ pad: horizontal ? "md" : "lg",
2729
+ className: cn(
2730
+ "flex h-full",
2731
+ horizontal ? "flex-row gap-4" : "flex-col",
2732
+ centered && "items-center text-center",
2733
+ className
2734
+ ),
2735
+ children: [
2736
+ icon && /* @__PURE__ */ jsxRuntime.jsx(
2737
+ IconBadge,
2738
+ {
2739
+ tone: iconTone,
2740
+ size: "lg",
2741
+ className: cn(horizontal ? "shrink-0" : "mb-4"),
2742
+ children: icon
2743
+ }
2744
+ ),
2745
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(horizontal && "min-w-0"), children: [
2746
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold", children: title }),
2747
+ children && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-1.5 text-sm leading-relaxed", children })
2748
+ ] })
2749
+ ]
2750
+ }
2751
+ );
2752
+ }
2753
+ var TONE2 = {
2754
+ default: "bg-background text-foreground",
2755
+ muted: "bg-muted text-foreground",
2756
+ brand: "bg-brand text-brand-foreground",
2757
+ // `dark` activates the .dark variant locally so descendant package
2758
+ // components render their dark arm even on an otherwise light page.
2759
+ dark: "dark bg-background text-foreground"
2760
+ };
2761
+ var WIDTH = {
2762
+ default: "container",
2763
+ wide: "mx-auto w-full max-w-screen-2xl px-4 sm:px-6 lg:px-8",
2764
+ full: ""
2765
+ };
2766
+ function Section({
2767
+ tone = "default",
2768
+ width = "default",
2769
+ diagonal,
2770
+ id,
2771
+ className,
2772
+ innerClassName,
2773
+ children
2774
+ }) {
2775
+ const showDiagonal = diagonal ?? tone === "brand";
2776
+ return /* @__PURE__ */ jsxRuntime.jsx(
2777
+ "div",
2778
+ {
2779
+ id,
2780
+ className: cn("w-full", TONE2[tone], showDiagonal && "oc-diagonal", className),
2781
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("py-16 sm:py-20 md:py-24", WIDTH[width], innerClassName), children })
2782
+ }
2783
+ );
2784
+ }
2785
+ function BrandBand(props) {
2786
+ return /* @__PURE__ */ jsxRuntime.jsx(Section, { tone: "brand", ...props });
2787
+ }
2788
+ function ComparisonTable({ rows, columns, className }) {
2789
+ const cols = { feature: "", theirs: "A normal login", ours: "OrangeCheck", ...columns };
2790
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-xl border", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-[32rem]", children: [
2791
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1.4fr_1fr_1fr]", children: [
2792
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "label-mono text-muted-foreground px-4 py-3.5 sm:px-6", children: cols.feature }),
2793
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3.5 font-semibold text-foreground sm:px-6", children: cols.theirs }),
2794
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-accent/60 border-border/60 border-l px-4 py-3.5 font-semibold text-primary sm:px-6", children: cols.ours })
2795
+ ] }),
2796
+ rows.map((row, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1.4fr_1fr_1fr] border-t", children: [
2797
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3.5 font-medium text-foreground sm:px-6", children: row.label }),
2798
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-muted-foreground flex items-center gap-2 px-4 py-3.5 sm:px-6", children: [
2799
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "text-muted-foreground/70 size-4" }),
2800
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: row.theirs })
2801
+ ] }),
2802
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-accent/40 border-border/60 flex items-center gap-2 border-l px-4 py-3.5 text-foreground sm:px-6", children: [
2803
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-4 text-primary" }),
2804
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: row.ours })
2805
+ ] })
2806
+ ] }, i))
2807
+ ] }) }) });
2808
+ }
2809
+ function NumberedStep({
2810
+ n,
2811
+ title,
2812
+ children,
2813
+ tone = "default",
2814
+ card = false,
2815
+ className
2816
+ }) {
2817
+ const onBrand = tone === "onBrand";
2818
+ const body = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(!card && className), children: [
2819
+ /* @__PURE__ */ jsxRuntime.jsx(IconBadge, { tone: onBrand ? "onBrand" : "peach", size: "sm", children: n }),
2820
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-lg font-semibold", children: title }),
2821
+ children && /* @__PURE__ */ jsxRuntime.jsx(
2822
+ "div",
2823
+ {
2824
+ className: cn(
2825
+ "mt-1.5 text-sm leading-relaxed",
2826
+ onBrand ? "text-brand-foreground/80" : "text-muted-foreground"
2827
+ ),
2828
+ children
2829
+ }
2830
+ )
2831
+ ] });
2832
+ if (!card) return body;
2833
+ return /* @__PURE__ */ jsxRuntime.jsx(
2834
+ Surface,
2835
+ {
2836
+ tone: onBrand ? "onBrand" : "default",
2837
+ elevation: onBrand ? "none" : "sm",
2838
+ pad: "md",
2839
+ className,
2840
+ children: body
2841
+ }
2842
+ );
2843
+ }
2844
+ var COLUMNS = {
2845
+ 2: "md:grid-cols-2",
2846
+ 3: "md:grid-cols-3",
2847
+ 4: "md:grid-cols-4"
2848
+ };
2849
+ function StepList({
2850
+ steps,
2851
+ variant = "bare",
2852
+ tone = "default",
2853
+ columns = 3,
2854
+ className
2855
+ }) {
2856
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid gap-6 sm:grid-cols-2 sm:gap-8", COLUMNS[columns], className), children: steps.map((step, index) => /* @__PURE__ */ jsxRuntime.jsx(
2857
+ NumberedStep,
2858
+ {
2859
+ n: index + 1,
2860
+ title: step.title,
2861
+ tone,
2862
+ card: variant === "card",
2863
+ children: step.children
2864
+ },
2865
+ index
2866
+ )) });
2867
+ }
2868
+ function Faq({ items, defaultOpen, className }) {
2869
+ return /* @__PURE__ */ jsxRuntime.jsx(
2870
+ Accordion,
2871
+ {
2872
+ type: "single",
2873
+ collapsible: true,
2874
+ defaultValue: defaultOpen != null ? String(defaultOpen) : void 0,
2875
+ className: cn("w-full", className),
2876
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: String(i), children: [
2877
+ /* @__PURE__ */ jsxRuntime.jsx(
2878
+ AccordionTrigger,
2879
+ {
2880
+ icon: "plusMinus",
2881
+ className: "text-foreground text-base font-semibold",
2882
+ children: item.q
2883
+ }
2884
+ ),
2885
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "text-muted-foreground leading-relaxed", children: item.a })
2886
+ ] }, i))
2887
+ }
2888
+ );
2889
+ }
2890
+ function EmailCapture({
2891
+ action,
2892
+ method,
2893
+ onSubmit,
2894
+ name = "email",
2895
+ placeholder = "you@email.com",
2896
+ cta = "Join the waitlist",
2897
+ note,
2898
+ tone = "default",
2899
+ className
2900
+ }) {
2901
+ const onBrand = tone === "onBrand";
2902
+ return /* @__PURE__ */ jsxRuntime.jsxs("form", { action, method, onSubmit, className: cn(className), children: [
2903
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center", children: [
2904
+ /* @__PURE__ */ jsxRuntime.jsx(
2905
+ Input,
2906
+ {
2907
+ type: "email",
2908
+ name,
2909
+ required: true,
2910
+ placeholder,
2911
+ className: cn(
2912
+ "rounded-full text-base md:text-sm",
2913
+ onBrand && "[background:color-mix(in_oklch,white_18%,transparent)] placeholder:text-primary-foreground/60 border-transparent text-primary-foreground"
2914
+ )
2915
+ }
2916
+ ),
2917
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: onBrand ? "onBrand" : "default", className: "rounded-full", children: cta })
2918
+ ] }),
2919
+ note && /* @__PURE__ */ jsxRuntime.jsx(
2920
+ "p",
2921
+ {
2922
+ className: cn(
2923
+ "mt-3 text-sm",
2924
+ onBrand ? "text-primary-foreground/70" : "text-muted-foreground"
2925
+ ),
2926
+ children: note
2927
+ }
2928
+ )
2929
+ ] });
2930
+ }
2931
+ function CheckList({
2932
+ items,
2933
+ orientation = "horizontal",
2934
+ tone = "default",
2935
+ className
2936
+ }) {
2937
+ const glyph = tone === "onBrand" ? "text-brand-foreground" : "text-primary";
2938
+ const label = tone === "onBrand" ? "text-brand-foreground/90" : "text-foreground";
2939
+ return /* @__PURE__ */ jsxRuntime.jsx(
2940
+ "ul",
2941
+ {
2942
+ className: cn(
2943
+ orientation === "horizontal" ? "flex flex-wrap gap-x-6 gap-y-2 text-sm" : "flex flex-col gap-2 text-sm",
2944
+ className
2945
+ ),
2946
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("inline-flex items-center gap-2", label), children: [
2947
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: cn("size-4 shrink-0", glyph) }),
2948
+ item
2949
+ ] }, i))
2950
+ }
2951
+ );
2952
+ }
2953
+ function AccentNote({ lead, children, tone = "default", className }) {
2954
+ const onBrand = tone === "onBrand";
2955
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2956
+ "div",
2957
+ {
2958
+ className: cn(
2959
+ "border-l-2 pl-4 text-sm leading-relaxed",
2960
+ onBrand ? "border-primary-foreground/60 text-primary-foreground/80" : "border-primary text-muted-foreground",
2961
+ className
2962
+ ),
2963
+ children: [
2964
+ lead && /* @__PURE__ */ jsxRuntime.jsx(
2965
+ "strong",
2966
+ {
2967
+ className: cn(
2968
+ "mr-1.5 font-semibold",
2969
+ onBrand ? "text-primary-foreground" : "text-foreground"
2970
+ ),
2971
+ children: lead
2972
+ }
2973
+ ),
2974
+ children
2975
+ ]
2976
+ }
2977
+ );
2978
+ }
2979
+ function AccentList({ items, className }) {
2980
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col", className), children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
2981
+ "div",
2982
+ {
2983
+ className: cn("border-l-2 py-2 pl-5", item.active ? "border-primary" : "border-border"),
2984
+ children: [
2985
+ /* @__PURE__ */ jsxRuntime.jsx(
2986
+ "div",
2987
+ {
2988
+ className: cn(
2989
+ "font-semibold",
2990
+ item.active ? "text-foreground" : "text-muted-foreground"
2991
+ ),
2992
+ children: item.title
2993
+ }
2994
+ ),
2995
+ item.active && item.children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground mt-1 text-sm leading-relaxed", children: item.children })
2996
+ ]
2997
+ },
2998
+ i
2999
+ )) });
3000
+ }
3001
+ function VerifiedChip({ icon, iconTone = "peach", label, className }) {
3002
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3003
+ Surface,
3004
+ {
3005
+ elevation: "lg",
3006
+ pad: "none",
3007
+ className: cn("inline-flex items-center gap-3 rounded-full px-3 py-2", className),
3008
+ children: [
3009
+ /* @__PURE__ */ jsxRuntime.jsx(IconBadge, { tone: iconTone, size: "sm", children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, {}) }),
3010
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pr-2 text-sm font-semibold text-foreground", children: label })
3011
+ ]
3012
+ }
3013
+ );
3014
+ }
2522
3015
  var ENTRIES = [
2523
3016
  {
2524
3017
  slug: "home",
@@ -2555,6 +3048,13 @@ var ENTRIES = [
2555
3048
  sub: "message \u2014 encrypted chat",
2556
3049
  docsHref: "https://docs.ochk.io/chat"
2557
3050
  },
3051
+ {
3052
+ slug: "cosign",
3053
+ href: "https://cosign.ochk.io",
3054
+ label: "oc\xB7cosign",
3055
+ sub: "cofound \u2014 get behind builders",
3056
+ docsHref: "https://docs.ochk.io/cosign"
3057
+ },
2558
3058
  {
2559
3059
  slug: "attest",
2560
3060
  href: "https://attest.ochk.io",
@@ -2766,6 +3266,15 @@ var FAMILY_PROPERTIES = [
2766
3266
  docsHref: "https://docs.ochk.io/chat",
2767
3267
  category: "product"
2768
3268
  },
3269
+ {
3270
+ slug: "cosign",
3271
+ origin: "https://cosign.ochk.io",
3272
+ hostname: "cosign.ochk.io",
3273
+ label: "oc\xB7cosign",
3274
+ sub: "cofound \u2014 get behind builders",
3275
+ docsHref: "https://docs.ochk.io/cosign",
3276
+ category: "product"
3277
+ },
2769
3278
  {
2770
3279
  slug: "attest",
2771
3280
  origin: "https://attest.ochk.io",
@@ -4348,6 +4857,8 @@ function OcAppBar({
4348
4857
  );
4349
4858
  }
4350
4859
 
4860
+ exports.AccentList = AccentList;
4861
+ exports.AccentNote = AccentNote;
4351
4862
  exports.Accordion = Accordion;
4352
4863
  exports.AccordionContent = AccordionContent;
4353
4864
  exports.AccordionItem = AccordionItem;
@@ -4362,10 +4873,13 @@ exports.AppearanceControls = AppearanceControls;
4362
4873
  exports.Badge = Badge;
4363
4874
  exports.Bar = Bar;
4364
4875
  exports.BitcoinAddress = BitcoinAddress;
4876
+ exports.BrandBand = BrandBand;
4365
4877
  exports.Button = Button;
4366
4878
  exports.Callout = Callout;
4367
4879
  exports.Card = Card;
4880
+ exports.CheckList = CheckList;
4368
4881
  exports.Checkbox = Checkbox;
4882
+ exports.ComparisonTable = ComparisonTable;
4369
4883
  exports.ConfirmHost = ConfirmHost;
4370
4884
  exports.CopyButton = CopyButton;
4371
4885
  exports.DEFAULT_OC_THEME = DEFAULT_OC_THEME;
@@ -4382,14 +4896,20 @@ exports.DialogPortal = DialogPortal;
4382
4896
  exports.DialogTitle = DialogTitle;
4383
4897
  exports.DialogTrigger = DialogTrigger;
4384
4898
  exports.EcosystemSwitcher = EcosystemSwitcher;
4899
+ exports.EmailCapture = EmailCapture;
4385
4900
  exports.EmptyState = EmptyState;
4386
4901
  exports.ErrorBoundary = ErrorBoundary;
4387
4902
  exports.FAMILY_PROPERTIES = FAMILY_PROPERTIES;
4903
+ exports.Faq = Faq;
4904
+ exports.FeatureCard = FeatureCard;
4388
4905
  exports.HelpHint = HelpHint;
4906
+ exports.IconBadge = IconBadge;
4389
4907
  exports.Input = Input;
4390
4908
  exports.Label = Label;
4391
4909
  exports.LayoutSubHeader = LayoutSubHeader;
4910
+ exports.MarketingHeading = MarketingHeading;
4392
4911
  exports.Modal = Modal;
4912
+ exports.NumberedStep = NumberedStep;
4393
4913
  exports.OC_DEFAULT_ACCENT = OC_DEFAULT_ACCENT;
4394
4914
  exports.OC_SKIN_COOKIE = OC_SKIN_COOKIE;
4395
4915
  exports.OC_THEMES = OC_THEMES;
@@ -4417,6 +4937,7 @@ exports.RadioGroup = RadioGroup;
4417
4937
  exports.RadioGroupItem = RadioGroupItem;
4418
4938
  exports.SITE_STATE_LABEL = SITE_STATE_LABEL;
4419
4939
  exports.SatsAmount = SatsAmount;
4940
+ exports.Section = Section;
4420
4941
  exports.SectionHeader = SectionHeader;
4421
4942
  exports.Select = Select;
4422
4943
  exports.SelectContent = SelectContent;
@@ -4446,6 +4967,8 @@ exports.StatCard = StatCard;
4446
4967
  exports.StatGrid = StatGrid;
4447
4968
  exports.StatTile = StatTile;
4448
4969
  exports.StatusPill = StatusPill;
4970
+ exports.StepList = StepList;
4971
+ exports.Surface = Surface;
4449
4972
  exports.Switch = Switch;
4450
4973
  exports.Tabs = Tabs;
4451
4974
  exports.TabsContent = TabsContent;
@@ -4456,6 +4979,8 @@ exports.ThemeToggle = ThemeToggle;
4456
4979
  exports.ThemeToggleLink = ThemeToggleLink;
4457
4980
  exports.Toaster = Toaster;
4458
4981
  exports.Tooltip = Tooltip;
4982
+ exports.TwoToneHeading = TwoToneHeading;
4983
+ exports.VerifiedChip = VerifiedChip;
4459
4984
  exports.Working = Working;
4460
4985
  exports.WorkingPanel = WorkingPanel;
4461
4986
  exports.accentFor = accentFor;
@@ -4469,6 +4994,7 @@ exports.findFamilyProperty = findFamilyProperty;
4469
4994
  exports.formatSats = formatSats;
4470
4995
  exports.formatSatsCompact = formatSatsCompact;
4471
4996
  exports.getOcThemeInitScript = getOcThemeInitScript;
4997
+ exports.iconBadgeVariants = iconBadgeVariants;
4472
4998
  exports.isKnownTheme = isKnownTheme;
4473
4999
  exports.makeStatusPill = makeStatusPill;
4474
5000
  exports.priceBoth = priceBoth;
@@ -4477,6 +5003,7 @@ exports.relativeTime = relativeTime;
4477
5003
  exports.resolveTheme = resolveTheme;
4478
5004
  exports.satsToUsd = satsToUsd;
4479
5005
  exports.shortenAddress = shortenAddress;
5006
+ exports.surfaceVariants = surfaceVariants;
4480
5007
  exports.usdToSats = usdToSats;
4481
5008
  exports.useOcSkin = useOcSkin;
4482
5009
  exports.useSpotPrice = useSpotPrice;