@ugurdemirel/landcraft 0.1.16 → 0.1.18

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 (67) hide show
  1. package/README.md +2 -3
  2. package/dist/cjs/components/Badge.cjs +1 -1
  3. package/dist/cjs/components/Badge.cjs.map +1 -1
  4. package/dist/cjs/components/Button.cjs +1 -1
  5. package/dist/cjs/components/Button.cjs.map +1 -1
  6. package/dist/cjs/components/CTA/variants/Inverse.cjs +1 -2
  7. package/dist/cjs/components/CTA/variants/Inverse.cjs.map +1 -1
  8. package/dist/cjs/components/CTA/variants/Panel.cjs +1 -2
  9. package/dist/cjs/components/CTA/variants/Panel.cjs.map +1 -1
  10. package/dist/cjs/components/Features/FeatureCard.cjs +1 -1
  11. package/dist/cjs/components/Features/FeatureCard.cjs.map +1 -1
  12. package/dist/cjs/components/Hero/variants/Statement.cjs +1 -2
  13. package/dist/cjs/components/Hero/variants/Statement.cjs.map +1 -1
  14. package/dist/cjs/components/MegaMenu/MegaMenu.cjs +1 -1
  15. package/dist/cjs/components/MegaMenu/MegaMenu.cjs.map +1 -1
  16. package/dist/cjs/components/Navbar/Navbar.cjs +1 -1
  17. package/dist/cjs/components/Navbar/Navbar.cjs.map +1 -1
  18. package/dist/cjs/components/Pricing/parts.cjs +1 -2
  19. package/dist/cjs/components/Pricing/parts.cjs.map +1 -1
  20. package/dist/cjs/components/Pricing/variants/Bento.cjs +1 -1
  21. package/dist/cjs/components/Pricing/variants/Bento.cjs.map +1 -1
  22. package/dist/cjs/components/Pricing/variants/Cards.cjs +1 -1
  23. package/dist/cjs/components/Pricing/variants/Cards.cjs.map +1 -1
  24. package/dist/cjs/components/Testimonials/TestimonialCard.cjs +1 -1
  25. package/dist/cjs/components/Testimonials/TestimonialCard.cjs.map +1 -1
  26. package/dist/cjs/components/Testimonials/variants/Carousel.cjs +1 -1
  27. package/dist/cjs/components/Testimonials/variants/Carousel.cjs.map +1 -1
  28. package/dist/cjs/index.cjs +1 -1
  29. package/dist/es/components/Badge.js +21 -17
  30. package/dist/es/components/Badge.js.map +1 -1
  31. package/dist/es/components/Button.js +29 -29
  32. package/dist/es/components/Button.js.map +1 -1
  33. package/dist/es/components/CTA/variants/Inverse.js +37 -42
  34. package/dist/es/components/CTA/variants/Inverse.js.map +1 -1
  35. package/dist/es/components/CTA/variants/Panel.js +51 -56
  36. package/dist/es/components/CTA/variants/Panel.js.map +1 -1
  37. package/dist/es/components/Features/FeatureCard.js +13 -14
  38. package/dist/es/components/Features/FeatureCard.js.map +1 -1
  39. package/dist/es/components/Hero/variants/Statement.js +37 -42
  40. package/dist/es/components/Hero/variants/Statement.js.map +1 -1
  41. package/dist/es/components/MegaMenu/MegaMenu.js +93 -88
  42. package/dist/es/components/MegaMenu/MegaMenu.js.map +1 -1
  43. package/dist/es/components/Navbar/Navbar.js +30 -26
  44. package/dist/es/components/Navbar/Navbar.js.map +1 -1
  45. package/dist/es/components/Pricing/parts.js +33 -34
  46. package/dist/es/components/Pricing/parts.js.map +1 -1
  47. package/dist/es/components/Pricing/variants/Bento.js +16 -17
  48. package/dist/es/components/Pricing/variants/Bento.js.map +1 -1
  49. package/dist/es/components/Pricing/variants/Cards.js +10 -11
  50. package/dist/es/components/Pricing/variants/Cards.js.map +1 -1
  51. package/dist/es/components/Testimonials/TestimonialCard.js +10 -11
  52. package/dist/es/components/Testimonials/TestimonialCard.js.map +1 -1
  53. package/dist/es/components/Testimonials/variants/Carousel.js +10 -11
  54. package/dist/es/components/Testimonials/variants/Carousel.js.map +1 -1
  55. package/dist/es/index.js +89 -93
  56. package/dist/es/index.js.map +1 -1
  57. package/dist/index.d.ts +8 -33
  58. package/dist/styles.css +0 -3
  59. package/package.json +1 -1
  60. package/dist/cjs/utils/contrast.cjs +0 -2
  61. package/dist/cjs/utils/contrast.cjs.map +0 -1
  62. package/dist/cjs/utils/useTokenForeground.cjs +0 -3
  63. package/dist/cjs/utils/useTokenForeground.cjs.map +0 -1
  64. package/dist/es/utils/contrast.js +0 -48
  65. package/dist/es/utils/contrast.js.map +0 -1
  66. package/dist/es/utils/useTokenForeground.js +0 -28
  67. package/dist/es/utils/useTokenForeground.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as e, jsxs as t } from "react/jsx-runtime";
3
3
  import { useState as D } from "react";
4
- import { cn as o } from "../../utils/cn.js";
4
+ import { cn as n } from "../../utils/cn.js";
5
5
  import { X as P, Menu as T } from "../../icons.js";
6
6
  const f = "text-on-secondary", d = "text-foreground", C = {
7
7
  classic: {
@@ -49,7 +49,7 @@ const f = "text-on-secondary", d = "text-foreground", C = {
49
49
  logoAlt: N,
50
50
  logoClassName: k,
51
51
  brandHref: w = "#",
52
- links: h,
52
+ links: x,
53
53
  actions: l,
54
54
  cta: i,
55
55
  languageSwitcher: c,
@@ -57,28 +57,30 @@ const f = "text-on-secondary", d = "text-foreground", C = {
57
57
  LinkComponent: L,
58
58
  ...j
59
59
  }) => {
60
- const [a, x] = D(!1), m = L ?? "a", r = C[b], p = v ?? (u ? /* @__PURE__ */ e(
60
+ const [a, h] = D(!1), m = L ?? "a", o = C[b], p = v ?? (u ? /* @__PURE__ */ e(
61
61
  "img",
62
62
  {
63
63
  src: u,
64
64
  alt: N ?? (typeof s == "string" ? s : "Logo"),
65
- className: o("h-7 w-auto", k)
65
+ className: n("h-7 w-auto", k)
66
66
  }
67
- ) : null), B = p ? /* @__PURE__ */ e("span", { className: "flex items-center", children: p }) : /* @__PURE__ */ t("span", { className: o("flex items-center gap-2 font-display text-[17px] font-bold tracking-tight", r.brandText), children: [
68
- /* @__PURE__ */ e("span", { "aria-hidden": !0, className: o("inline-block h-2.5 w-2.5 rounded-sm", r.brandDot) }),
67
+ ) : null), B = p ? /* @__PURE__ */ e("span", { className: "flex items-center", children: p }) : /* @__PURE__ */ t("span", { className: n("flex items-center gap-2 font-display text-[17px] font-bold tracking-tight", o.brandText), children: [
68
+ /* @__PURE__ */ e("span", { "aria-hidden": !0, className: n("inline-block h-2.5 w-2.5 rounded-sm", o.brandDot) }),
69
69
  s
70
70
  ] });
71
- return /* @__PURE__ */ t("header", { className: o("w-full transition-colors duration-200", y && "sticky top-0 z-50", r.shell, r.header, g), ...j, children: [
72
- /* @__PURE__ */ t("nav", { className: o("flex h-16 w-full items-center justify-between gap-4 transition-colors duration-200", r.bar), "aria-label": "Main navigation", children: [
71
+ return /* @__PURE__ */ t("header", { className: n("w-full transition-colors duration-200", y && "sticky top-0 z-50", o.shell, o.header, g), ...j, children: [
72
+ /* @__PURE__ */ t("nav", { className: n("flex h-16 w-full items-center justify-between gap-4 transition-colors duration-200", o.bar), "aria-label": "Main navigation", children: [
73
73
  /* @__PURE__ */ e(m, { href: w, className: "shrink-0", children: B }),
74
- /* @__PURE__ */ e("ul", { className: r.desktopList, children: h.map((n) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
74
+ /* @__PURE__ */ e("ul", { className: o.desktopList, children: x.map((r) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
75
75
  m,
76
76
  {
77
- href: n.href,
78
- className: o("text-sm font-medium transition-colors duration-150", r.link),
79
- children: n.label
77
+ href: r.href,
78
+ target: r.external ? "_blank" : void 0,
79
+ rel: r.external ? "noopener noreferrer" : void 0,
80
+ className: n("text-sm font-medium transition-colors duration-150", o.link),
81
+ children: r.label
80
82
  }
81
- ) }, n.href)) }),
83
+ ) }, r.href)) }),
82
84
  /* @__PURE__ */ t("div", { className: "hidden items-center gap-3 md:flex", children: [
83
85
  c,
84
86
  l,
@@ -90,11 +92,11 @@ const f = "text-on-secondary", d = "text-foreground", C = {
90
92
  type: "button",
91
93
  "aria-label": a ? "Close menu" : "Open menu",
92
94
  "aria-expanded": a,
93
- onClick: () => x((n) => !n),
94
- className: o(
95
+ onClick: () => h((r) => !r),
96
+ className: n(
95
97
  "inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center rounded-md md:hidden",
96
98
  "transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
97
- r.menuButton
99
+ o.menuButton
98
100
  ),
99
101
  children: a ? /* @__PURE__ */ e(P, { className: "h-5 w-5" }) : /* @__PURE__ */ e(T, { className: "h-5 w-5" })
100
102
  }
@@ -103,25 +105,27 @@ const f = "text-on-secondary", d = "text-foreground", C = {
103
105
  /* @__PURE__ */ e(
104
106
  "div",
105
107
  {
106
- className: o(
108
+ className: n(
107
109
  "grid transition-[grid-template-rows,opacity] duration-200 md:hidden",
108
110
  a ? "grid-rows-[1fr] opacity-100" : "grid-rows-[0fr] opacity-0",
109
- r.mobilePanel
111
+ o.mobilePanel
110
112
  ),
111
- children: /* @__PURE__ */ e("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ t("ul", { className: o("flex flex-col py-4", b !== "floating" && "px-5"), children: [
113
+ children: /* @__PURE__ */ e("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ t("ul", { className: n("flex flex-col py-4", b !== "floating" && "px-5"), children: [
112
114
  c ? /* @__PURE__ */ e("li", { className: "px-2 pb-4", children: c }) : null,
113
- h.map((n) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
115
+ x.map((r) => /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e(
114
116
  m,
115
117
  {
116
- href: n.href,
117
- onClick: () => x(!1),
118
- className: o(
118
+ href: r.href,
119
+ target: r.external ? "_blank" : void 0,
120
+ rel: r.external ? "noopener noreferrer" : void 0,
121
+ onClick: () => h(!1),
122
+ className: n(
119
123
  "block rounded-md px-2 py-2.5 text-sm font-medium transition-colors duration-150",
120
- r.mobileLink
124
+ o.mobileLink
121
125
  ),
122
- children: n.label
126
+ children: r.label
123
127
  }
124
- ) }, n.href)),
128
+ ) }, r.href)),
125
129
  i ? /* @__PURE__ */ e("li", { className: "mt-3 px-2 pb-2", children: i }) : l ? /* @__PURE__ */ e("li", { className: "mt-3 flex flex-wrap gap-3 px-2 pb-2", children: l }) : null
126
130
  ] }) })
127
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Navbar.js","sources":["../../../../src/components/Navbar/Navbar.tsx"],"sourcesContent":["\"use client\";\nimport { useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Menu, X } from \"../../icons\";\nimport type { NavbarProps, NavbarVariant } from \"./types\";\n\ninterface NavbarStyle {\n shell: string;\n bar: string;\n header: string;\n link: string;\n mobilePanel: string;\n mobileLink: string;\n menuButton: string;\n brandText: string;\n brandDot: string;\n desktopList: string;\n}\n\nconst inverse = \"text-on-secondary\";\nconst light = \"text-foreground\";\n\nconst styles: Record<NavbarVariant, NavbarStyle> = {\n classic: {\n shell: \"border-b border-border bg-background/85 backdrop-blur-md supports-[backdrop-filter]:bg-background/75\",\n bar: \"mx-auto max-w-6xl px-5 sm:px-8\",\n header: \"px-0\",\n link: \"text-muted-foreground hover:text-foreground\",\n mobilePanel: \"border-t border-border bg-background\",\n mobileLink:\n \"text-muted-foreground hover:bg-surface hover:text-foreground\",\n menuButton: `${light} hover:bg-surface`,\n brandText: light,\n brandDot: \"bg-foreground\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n floating: {\n shell: \"px-0\",\n bar: \"mx-auto mt-3 max-w-5xl rounded-xl border border-border bg-surface/90 px-5 shadow-soft backdrop-blur-md supports-[backdrop-filter]:bg-surface/70\",\n header: \"px-3 sm:px-6\",\n link: \"text-muted-foreground hover:text-foreground\",\n mobilePanel:\n \"mx-3 mb-3 max-w-5xl overflow-hidden rounded-b-xl border border-border bg-surface\",\n mobileLink:\n \"text-muted-foreground hover:bg-surface hover:text-foreground\",\n menuButton: `${light} hover:bg-surface`,\n brandText: light,\n brandDot: \"bg-foreground\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n inverse: {\n shell: \"border-b border-white/10 bg-[#101010]/85 backdrop-blur-md\",\n bar: \"mx-auto max-w-6xl px-5 sm:px-8\",\n header: \"px-0\",\n link: \"text-on-secondary/60 hover:text-on-secondary\",\n mobilePanel: \"border-t border-white/10 bg-[#101010]\",\n mobileLink:\n \"text-on-secondary/70 hover:bg-white/10 hover:text-on-secondary\",\n menuButton: `${inverse} hover:bg-white/10`,\n brandText: inverse,\n brandDot: \"bg-on-secondary\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n};\n\nexport const Navbar = ({\n className,\n variant = \"classic\",\n brand,\n logo,\n logoSrc,\n logoAlt,\n logoClassName,\n brandHref = \"#\",\n links,\n actions,\n cta,\n languageSwitcher,\n sticky = true,\n LinkComponent,\n ...props\n}: NavbarProps) => {\n const [open, setOpen] = useState(false);\n const Link = LinkComponent ?? \"a\";\n const s = styles[variant];\n\n const logoNode =\n logo ??\n (logoSrc ? (\n <img\n src={logoSrc}\n alt={logoAlt ?? (typeof brand === \"string\" ? brand : \"Logo\")}\n className={cn(\"h-7 w-auto\", logoClassName)}\n />\n ) : null);\n\n const brandNode = logoNode ? (\n <span className=\"flex items-center\">{logoNode}</span>\n ) : (\n <span className={cn(\"flex items-center gap-2 font-display text-[17px] font-bold tracking-tight\", s.brandText)}>\n <span aria-hidden className={cn(\"inline-block h-2.5 w-2.5 rounded-sm\", s.brandDot)} />\n {brand}\n </span>\n );\n\n return (\n <header className={cn(\"w-full transition-colors duration-200\", sticky && \"sticky top-0 z-50\", s.shell, s.header, className)} {...props}>\n <nav className={cn(\"flex h-16 w-full items-center justify-between gap-4 transition-colors duration-200\", s.bar)} aria-label=\"Main navigation\">\n <Link href={brandHref} className=\"shrink-0\">\n {brandNode}\n </Link>\n\n <ul className={s.desktopList}>\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n className={cn(\"text-sm font-medium transition-colors duration-150\", s.link)}\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"hidden items-center gap-3 md:flex\">\n {languageSwitcher}\n {actions}\n {cta}\n </div>\n\n <button\n type=\"button\"\n aria-label={open ? \"Close menu\" : \"Open menu\"}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n className={cn(\n \"inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center rounded-md md:hidden\",\n \"transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n s.menuButton,\n )}\n >\n {open ? <X className=\"h-5 w-5\" /> : <Menu className=\"h-5 w-5\" />}\n </button>\n </nav>\n\n <div\n className={cn(\n \"grid transition-[grid-template-rows,opacity] duration-200 md:hidden\",\n open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\",\n s.mobilePanel,\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">\n <ul className={cn(\"flex flex-col py-4\", variant !== \"floating\" && \"px-5\")}>\n {languageSwitcher ? (\n <li className=\"px-2 pb-4\">{languageSwitcher}</li>\n ) : null}\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n onClick={() => setOpen(false)}\n className={cn(\n \"block rounded-md px-2 py-2.5 text-sm font-medium transition-colors duration-150\",\n s.mobileLink,\n )}\n >\n {link.label}\n </Link>\n </li>\n ))}\n {cta ? (\n <li className=\"mt-3 px-2 pb-2\">{cta}</li>\n ) : actions ? (\n <li className=\"mt-3 flex flex-wrap gap-3 px-2 pb-2\">{actions}</li>\n ) : null}\n </ul>\n </div>\n </div>\n </header>\n );\n};\nNavbar.displayName = \"Navbar\";"],"names":["inverse","light","styles","Navbar","className","variant","brand","logo","logoSrc","logoAlt","logoClassName","brandHref","links","actions","cta","languageSwitcher","sticky","LinkComponent","props","open","setOpen","useState","Link","s","logoNode","jsx","cn","brandNode","jsxs","link","o","X","Menu"],"mappings":"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"}
1
+ {"version":3,"file":"Navbar.js","sources":["../../../../src/components/Navbar/Navbar.tsx"],"sourcesContent":["\"use client\";\nimport { useState } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Menu, X } from \"../../icons\";\nimport type { NavbarProps, NavbarVariant } from \"./types\";\n\ninterface NavbarStyle {\n shell: string;\n bar: string;\n header: string;\n link: string;\n mobilePanel: string;\n mobileLink: string;\n menuButton: string;\n brandText: string;\n brandDot: string;\n desktopList: string;\n}\n\nconst inverse = \"text-on-secondary\";\nconst light = \"text-foreground\";\n\nconst styles: Record<NavbarVariant, NavbarStyle> = {\n classic: {\n shell: \"border-b border-border bg-background/85 backdrop-blur-md supports-[backdrop-filter]:bg-background/75\",\n bar: \"mx-auto max-w-6xl px-5 sm:px-8\",\n header: \"px-0\",\n link: \"text-muted-foreground hover:text-foreground\",\n mobilePanel: \"border-t border-border bg-background\",\n mobileLink:\n \"text-muted-foreground hover:bg-surface hover:text-foreground\",\n menuButton: `${light} hover:bg-surface`,\n brandText: light,\n brandDot: \"bg-foreground\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n floating: {\n shell: \"px-0\",\n bar: \"mx-auto mt-3 max-w-5xl rounded-xl border border-border bg-surface/90 px-5 shadow-soft backdrop-blur-md supports-[backdrop-filter]:bg-surface/70\",\n header: \"px-3 sm:px-6\",\n link: \"text-muted-foreground hover:text-foreground\",\n mobilePanel:\n \"mx-3 mb-3 max-w-5xl overflow-hidden rounded-b-xl border border-border bg-surface\",\n mobileLink:\n \"text-muted-foreground hover:bg-surface hover:text-foreground\",\n menuButton: `${light} hover:bg-surface`,\n brandText: light,\n brandDot: \"bg-foreground\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n inverse: {\n shell: \"border-b border-white/10 bg-[#101010]/85 backdrop-blur-md\",\n bar: \"mx-auto max-w-6xl px-5 sm:px-8\",\n header: \"px-0\",\n link: \"text-on-secondary/60 hover:text-on-secondary\",\n mobilePanel: \"border-t border-white/10 bg-[#101010]\",\n mobileLink:\n \"text-on-secondary/70 hover:bg-white/10 hover:text-on-secondary\",\n menuButton: `${inverse} hover:bg-white/10`,\n brandText: inverse,\n brandDot: \"bg-on-secondary\",\n desktopList: \"hidden items-center gap-7 md:flex\",\n },\n};\n\nexport const Navbar = ({\n className,\n variant = \"classic\",\n brand,\n logo,\n logoSrc,\n logoAlt,\n logoClassName,\n brandHref = \"#\",\n links,\n actions,\n cta,\n languageSwitcher,\n sticky = true,\n LinkComponent,\n ...props\n}: NavbarProps) => {\n const [open, setOpen] = useState(false);\n const Link = LinkComponent ?? \"a\";\n const s = styles[variant];\n\n const logoNode =\n logo ??\n (logoSrc ? (\n <img\n src={logoSrc}\n alt={logoAlt ?? (typeof brand === \"string\" ? brand : \"Logo\")}\n className={cn(\"h-7 w-auto\", logoClassName)}\n />\n ) : null);\n\n const brandNode = logoNode ? (\n <span className=\"flex items-center\">{logoNode}</span>\n ) : (\n <span className={cn(\"flex items-center gap-2 font-display text-[17px] font-bold tracking-tight\", s.brandText)}>\n <span aria-hidden className={cn(\"inline-block h-2.5 w-2.5 rounded-sm\", s.brandDot)} />\n {brand}\n </span>\n );\n\n return (\n <header className={cn(\"w-full transition-colors duration-200\", sticky && \"sticky top-0 z-50\", s.shell, s.header, className)} {...props}>\n <nav className={cn(\"flex h-16 w-full items-center justify-between gap-4 transition-colors duration-200\", s.bar)} aria-label=\"Main navigation\">\n <Link href={brandHref} className=\"shrink-0\">\n {brandNode}\n </Link>\n\n <ul className={s.desktopList}>\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n className={cn(\"text-sm font-medium transition-colors duration-150\", s.link)}\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n\n <div className=\"hidden items-center gap-3 md:flex\">\n {languageSwitcher}\n {actions}\n {cta}\n </div>\n\n <button\n type=\"button\"\n aria-label={open ? \"Close menu\" : \"Open menu\"}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n className={cn(\n \"inline-flex h-10 w-10 shrink-0 cursor-pointer items-center justify-center rounded-md md:hidden\",\n \"transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n s.menuButton,\n )}\n >\n {open ? <X className=\"h-5 w-5\" /> : <Menu className=\"h-5 w-5\" />}\n </button>\n </nav>\n\n <div\n className={cn(\n \"grid transition-[grid-template-rows,opacity] duration-200 md:hidden\",\n open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\",\n s.mobilePanel,\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">\n <ul className={cn(\"flex flex-col py-4\", variant !== \"floating\" && \"px-5\")}>\n {languageSwitcher ? (\n <li className=\"px-2 pb-4\">{languageSwitcher}</li>\n ) : null}\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n onClick={() => setOpen(false)}\n className={cn(\n \"block rounded-md px-2 py-2.5 text-sm font-medium transition-colors duration-150\",\n s.mobileLink,\n )}\n >\n {link.label}\n </Link>\n </li>\n ))}\n {cta ? (\n <li className=\"mt-3 px-2 pb-2\">{cta}</li>\n ) : actions ? (\n <li className=\"mt-3 flex flex-wrap gap-3 px-2 pb-2\">{actions}</li>\n ) : null}\n </ul>\n </div>\n </div>\n </header>\n );\n};\nNavbar.displayName = \"Navbar\";"],"names":["inverse","light","styles","Navbar","className","variant","brand","logo","logoSrc","logoAlt","logoClassName","brandHref","links","actions","cta","languageSwitcher","sticky","LinkComponent","props","open","setOpen","useState","Link","s","logoNode","jsx","cn","brandNode","jsxs","link","o","X","Menu"],"mappings":"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"}
@@ -1,39 +1,35 @@
1
- "use client";
2
- import { jsxs as n, jsx as t, Fragment as a } from "react/jsx-runtime";
1
+ import { jsxs as n, jsx as t, Fragment as c } from "react/jsx-runtime";
3
2
  import { cn as e } from "../../utils/cn.js";
4
- import { getContrastText as u } from "../../utils/contrast.js";
5
- import { useTokenForeground as m } from "../../utils/useTokenForeground.js";
6
- import { ArrowRight as f } from "../../icons.js";
7
- function y({
8
- value: o,
3
+ import { ArrowRight as a } from "../../icons.js";
4
+ function f({
5
+ value: r,
9
6
  billing: i,
10
- dim: r
7
+ dim: o
11
8
  }) {
12
- return o === null ? /* @__PURE__ */ t("span", { children: "Custom" }) : /* @__PURE__ */ n(a, { children: [
9
+ return r === null ? /* @__PURE__ */ t("span", { children: "Custom" }) : /* @__PURE__ */ n(c, { children: [
13
10
  /* @__PURE__ */ n("span", { className: "text-[2.6rem] font-semibold tracking-tight sm:text-[3rem]", children: [
14
11
  "$",
15
- o
12
+ r
16
13
  ] }),
17
- /* @__PURE__ */ n("span", { className: e("text-sm font-normal", r && "opacity-60"), children: [
14
+ /* @__PURE__ */ n("span", { className: e("text-sm font-normal", o && "opacity-60"), children: [
18
15
  "/",
19
16
  i === "monthly" ? "mo" : "yr"
20
17
  ] })
21
18
  ] });
22
19
  }
23
- function p({
24
- billing: o,
20
+ function h({
21
+ billing: r,
25
22
  onChange: i,
26
- dark: r,
23
+ dark: o,
27
24
  yearlyBadge: s
28
25
  }) {
29
- const l = m("--color-accent", "#0f172a");
30
26
  return /* @__PURE__ */ n("div", { className: "mb-10 flex items-center justify-center gap-4", children: [
31
27
  /* @__PURE__ */ t(
32
28
  "span",
33
29
  {
34
30
  className: e(
35
31
  "text-sm font-medium transition-colors",
36
- o === "monthly" ? r ? "text-white" : "text-foreground" : "text-muted-foreground"
32
+ r === "monthly" ? o ? "text-white" : "text-foreground" : "text-muted-foreground"
37
33
  ),
38
34
  children: "Monthly"
39
35
  }
@@ -43,20 +39,20 @@ function p({
43
39
  {
44
40
  type: "button",
45
41
  role: "switch",
46
- "aria-checked": o === "yearly",
42
+ "aria-checked": r === "yearly",
47
43
  "aria-label": "Billing period",
48
- onClick: () => i(o === "monthly" ? "yearly" : "monthly"),
44
+ onClick: () => i(r === "monthly" ? "yearly" : "monthly"),
49
45
  className: e(
50
46
  "relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full transition-colors duration-200",
51
47
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
52
- o === "yearly" ? "bg-primary" : "bg-border"
48
+ r === "yearly" ? "bg-primary" : "bg-border"
53
49
  ),
54
50
  children: /* @__PURE__ */ t(
55
51
  "span",
56
52
  {
57
53
  className: e(
58
54
  "inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform duration-200",
59
- o === "yearly" ? "translate-x-6" : "translate-x-1"
55
+ r === "yearly" ? "translate-x-6" : "translate-x-1"
60
56
  )
61
57
  }
62
58
  )
@@ -67,7 +63,7 @@ function p({
67
63
  {
68
64
  className: e(
69
65
  "flex items-center gap-2 text-sm font-medium transition-colors",
70
- o === "yearly" ? r ? "text-white" : "text-foreground" : "text-muted-foreground"
66
+ r === "yearly" ? o ? "text-white" : "text-foreground" : "text-muted-foreground"
71
67
  ),
72
68
  children: [
73
69
  "Yearly",
@@ -75,7 +71,7 @@ function p({
75
71
  "span",
76
72
  {
77
73
  className: "rounded-full bg-accent px-2 py-0.5 text-xs font-semibold",
78
- style: { color: l },
74
+ style: { color: "contrast-color(rgb(var(--color-accent)))" },
79
75
  children: s
80
76
  }
81
77
  ) : null
@@ -84,37 +80,40 @@ function p({
84
80
  )
85
81
  ] });
86
82
  }
87
- function v({
88
- plan: o,
83
+ function g({
84
+ plan: r,
89
85
  billing: i,
90
- onSelect: r,
86
+ onSelect: o,
91
87
  dark: s
92
88
  }) {
93
- const l = o.highlighted && !o.customColor, c = o.customColor ? u(o.customColor, "#111111", "#ffffff") : void 0;
89
+ const l = r.highlighted && !r.customColor;
94
90
  return /* @__PURE__ */ n(
95
91
  "button",
96
92
  {
97
93
  type: "button",
98
- onClick: () => r == null ? void 0 : r(o, i),
94
+ onClick: () => o == null ? void 0 : o(r, i),
99
95
  className: e(
100
96
  "inline-flex h-11 cursor-pointer items-center justify-center gap-2 rounded-lg px-5 text-sm font-semibold transition-colors duration-200",
101
97
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
102
- l || o.customColor ? "hover:brightness-95" : s ? "bg-white text-black hover:bg-white/90" : "border border-border text-foreground hover:bg-surface"
98
+ l || r.customColor ? "hover:brightness-95" : s ? "bg-white text-black hover:bg-white/90" : "border border-border text-foreground hover:bg-surface"
103
99
  ),
104
- style: o.customColor ? { backgroundColor: o.customColor, color: c } : l ? {
100
+ style: r.customColor ? {
101
+ backgroundColor: r.customColor,
102
+ color: `contrast-color(${r.customColor})`
103
+ } : l ? {
105
104
  backgroundColor: "rgb(var(--color-primary))",
106
105
  color: "rgb(var(--color-on-primary))"
107
106
  } : void 0,
108
107
  children: [
109
- o.cta || "Start",
110
- /* @__PURE__ */ t(f, { className: "h-4 w-4 opacity-60" })
108
+ r.cta || "Start",
109
+ /* @__PURE__ */ t(a, { className: "h-4 w-4 opacity-60" })
111
110
  ]
112
111
  }
113
112
  );
114
113
  }
115
114
  export {
116
- p as BillingToggle,
117
- v as PlanButton,
118
- y as PriceValue
115
+ h as BillingToggle,
116
+ g as PlanButton,
117
+ f as PriceValue
119
118
  };
120
119
  //# sourceMappingURL=parts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parts.js","sources":["../../../../src/components/Pricing/parts.tsx"],"sourcesContent":["\"use client\";\nimport { cn } from \"../../utils/cn\";\nimport { getContrastText } from \"../../utils/contrast\";\nimport { useTokenForeground } from \"../../utils/useTokenForeground\";\nimport { ArrowRight } from \"../../icons\";\nimport type { Plan } from \"./types\";\n\nexport function PriceValue({\n value,\n billing,\n dim,\n}: {\n value: number | null;\n billing: \"monthly\" | \"yearly\";\n /** False when rendered on a colored background where opacity would kill contrast. */\n dim?: boolean;\n}) {\n if (value === null) {\n return <span>Custom</span>;\n }\n return (\n <>\n <span className=\"text-[2.6rem] font-semibold tracking-tight sm:text-[3rem]\">${value}</span>\n <span className={cn(\"text-sm font-normal\", dim && \"opacity-60\")}>\n /{billing === \"monthly\" ? \"mo\" : \"yr\"}\n </span>\n </>\n );\n}\n\nexport function BillingToggle({\n billing,\n onChange,\n dark,\n yearlyBadge,\n}: {\n billing: \"monthly\" | \"yearly\";\n onChange: (b: \"monthly\" | \"yearly\") => void;\n dark?: boolean;\n yearlyBadge?: string;\n}) {\n // The accent token is a background color, but its shipped \"on-accent\"\n // pairing isn't guaranteed to be contrast-safe (e.g. white on amber).\n // Derive the badge text color from the actual accent value instead. When\n // the token can't be read yet (SSR/prerender/jsdom/first paint), fall back\n // to the contrast-correct color for the default emerald accent — white on\n // emerald-600 only reaches ~3.8:1 and fails WCAG AA for small text.\n const accentText = useTokenForeground(\"--color-accent\", \"#0f172a\");\n return (\n <div className=\"mb-10 flex items-center justify-center gap-4\">\n <span\n className={cn(\n \"text-sm font-medium transition-colors\",\n billing === \"monthly\" ? (dark ? \"text-white\" : \"text-foreground\") : \"text-muted-foreground\",\n )}\n >\n Monthly\n </span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={billing === \"yearly\"}\n aria-label=\"Billing period\"\n onClick={() => onChange(billing === \"monthly\" ? \"yearly\" : \"monthly\")}\n className={cn(\n \"relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n billing === \"yearly\" ? \"bg-primary\" : \"bg-border\",\n )}\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform duration-200\",\n billing === \"yearly\" ? \"translate-x-6\" : \"translate-x-1\",\n )}\n />\n </button>\n <span\n className={cn(\n \"flex items-center gap-2 text-sm font-medium transition-colors\",\n billing === \"yearly\" ? (dark ? \"text-white\" : \"text-foreground\") : \"text-muted-foreground\",\n )}\n >\n Yearly\n {yearlyBadge ? (\n <span\n className=\"rounded-full bg-accent px-2 py-0.5 text-xs font-semibold\"\n style={{ color: accentText }}\n >\n {yearlyBadge}\n </span>\n ) : null}\n </span>\n </div>\n );\n}\n\nexport function PlanButton({\n plan,\n billing,\n onSelect,\n dark,\n}: {\n plan: Plan;\n billing: \"monthly\" | \"yearly\";\n onSelect?: (plan: Plan, billing: \"monthly\" | \"yearly\") => void;\n dark?: boolean;\n}) {\n const isHighlighted = plan.highlighted && !plan.customColor;\n const fg = plan.customColor ? getContrastText(plan.customColor, \"#111111\", \"#ffffff\") : undefined;\n return (\n <button\n type=\"button\"\n onClick={() => onSelect?.(plan, billing)}\n className={cn(\n \"inline-flex h-11 cursor-pointer items-center justify-center gap-2 rounded-lg px-5 text-sm font-semibold transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isHighlighted || plan.customColor\n ? \"hover:brightness-95\"\n : dark\n ? \"bg-white text-black hover:bg-white/90\"\n : \"border border-border text-foreground hover:bg-surface\",\n )}\n style={\n plan.customColor\n ? { backgroundColor: plan.customColor, color: fg }\n : isHighlighted\n ? {\n backgroundColor: \"rgb(var(--color-primary))\",\n color: \"rgb(var(--color-on-primary))\",\n }\n : undefined\n }\n >\n {plan.cta || \"Start\"}\n <ArrowRight className=\"h-4 w-4 opacity-60\" />\n </button>\n );\n}"],"names":["PriceValue","value","billing","dim","jsx","jsxs","Fragment","cn","BillingToggle","onChange","dark","yearlyBadge","accentText","useTokenForeground","PlanButton","plan","onSelect","isHighlighted","fg","getContrastText","ArrowRight"],"mappings":"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"}
1
+ {"version":3,"file":"parts.js","sources":["../../../../src/components/Pricing/parts.tsx"],"sourcesContent":["import { cn } from \"../../utils/cn\";\nimport { ArrowRight } from \"../../icons\";\nimport type { Plan } from \"./types\";\n\nexport function PriceValue({\n value,\n billing,\n dim,\n}: {\n value: number | null;\n billing: \"monthly\" | \"yearly\";\n /** False when rendered on a colored background where opacity would kill contrast. */\n dim?: boolean;\n}) {\n if (value === null) {\n return <span>Custom</span>;\n }\n return (\n <>\n <span className=\"text-[2.6rem] font-semibold tracking-tight sm:text-[3rem]\">${value}</span>\n <span className={cn(\"text-sm font-normal\", dim && \"opacity-60\")}>\n /{billing === \"monthly\" ? \"mo\" : \"yr\"}\n </span>\n </>\n );\n}\n\nexport function BillingToggle({\n billing,\n onChange,\n dark,\n yearlyBadge,\n}: {\n billing: \"monthly\" | \"yearly\";\n onChange: (b: \"monthly\" | \"yearly\") => void;\n dark?: boolean;\n yearlyBadge?: string;\n}) {\n // The accent token is a background color, but its shipped \"on-accent\"\n // pairing isn't guaranteed to be contrast-safe (e.g. white on amber).\n // Let CSS pick the readable text color from the actual accent value via\n // contrast-color(); it re-evaluates automatically when the token changes.\n return (\n <div className=\"mb-10 flex items-center justify-center gap-4\">\n <span\n className={cn(\n \"text-sm font-medium transition-colors\",\n billing === \"monthly\" ? (dark ? \"text-white\" : \"text-foreground\") : \"text-muted-foreground\",\n )}\n >\n Monthly\n </span>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={billing === \"yearly\"}\n aria-label=\"Billing period\"\n onClick={() => onChange(billing === \"monthly\" ? \"yearly\" : \"monthly\")}\n className={cn(\n \"relative inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n billing === \"yearly\" ? \"bg-primary\" : \"bg-border\",\n )}\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full bg-white shadow transition-transform duration-200\",\n billing === \"yearly\" ? \"translate-x-6\" : \"translate-x-1\",\n )}\n />\n </button>\n <span\n className={cn(\n \"flex items-center gap-2 text-sm font-medium transition-colors\",\n billing === \"yearly\" ? (dark ? \"text-white\" : \"text-foreground\") : \"text-muted-foreground\",\n )}\n >\n Yearly\n {yearlyBadge ? (\n <span\n className=\"rounded-full bg-accent px-2 py-0.5 text-xs font-semibold\"\n style={{ color: \"contrast-color(rgb(var(--color-accent)))\" }}\n >\n {yearlyBadge}\n </span>\n ) : null}\n </span>\n </div>\n );\n}\n\nexport function PlanButton({\n plan,\n billing,\n onSelect,\n dark,\n}: {\n plan: Plan;\n billing: \"monthly\" | \"yearly\";\n onSelect?: (plan: Plan, billing: \"monthly\" | \"yearly\") => void;\n dark?: boolean;\n}) {\n const isHighlighted = plan.highlighted && !plan.customColor;\n return (\n <button\n type=\"button\"\n onClick={() => onSelect?.(plan, billing)}\n className={cn(\n \"inline-flex h-11 cursor-pointer items-center justify-center gap-2 rounded-lg px-5 text-sm font-semibold transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n isHighlighted || plan.customColor\n ? \"hover:brightness-95\"\n : dark\n ? \"bg-white text-black hover:bg-white/90\"\n : \"border border-border text-foreground hover:bg-surface\",\n )}\n style={\n plan.customColor\n ? {\n backgroundColor: plan.customColor,\n color: `contrast-color(${plan.customColor})`,\n }\n : isHighlighted\n ? {\n backgroundColor: \"rgb(var(--color-primary))\",\n color: \"rgb(var(--color-on-primary))\",\n }\n : undefined\n }\n >\n {plan.cta || \"Start\"}\n <ArrowRight className=\"h-4 w-4 opacity-60\" />\n </button>\n );\n}"],"names":["PriceValue","value","billing","dim","jsx","jsxs","Fragment","cn","BillingToggle","onChange","dark","yearlyBadge","PlanButton","plan","onSelect","isHighlighted","ArrowRight"],"mappings":";;;AAIO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,KAAAC;AACF,GAKG;AACD,SAAIF,MAAU,OACL,gBAAAG,EAAC,UAAK,UAAA,SAAA,CAAM,IAGnB,gBAAAC,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,6DAA4D,UAAA;AAAA,MAAA;AAAA,MAAEJ;AAAA,IAAA,GAAM;AAAA,sBACnF,QAAA,EAAK,WAAWM,EAAG,uBAAuBJ,KAAO,YAAY,GAAG,UAAA;AAAA,MAAA;AAAA,MAC7DD,MAAY,YAAY,OAAO;AAAA,IAAA,EAAA,CACnC;AAAA,EAAA,GACF;AAEJ;AAEO,SAASM,EAAc;AAAA,EAC5B,SAAAN;AAAA,EACA,UAAAO;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AACF,GAKG;AAKD,SACE,gBAAAN,EAAC,OAAA,EAAI,WAAU,gDACb,UAAA;AAAA,IAAA,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWG;AAAA,UACT;AAAA,UACAL,MAAY,YAAaQ,IAAO,eAAe,oBAAqB;AAAA,QAAA;AAAA,QAEvE,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAcF,MAAY;AAAA,QAC1B,cAAW;AAAA,QACX,SAAS,MAAMO,EAASP,MAAY,YAAY,WAAW,SAAS;AAAA,QACpE,WAAWK;AAAA,UACT;AAAA,UACA;AAAA,UACAL,MAAY,WAAW,eAAe;AAAA,QAAA;AAAA,QAGxC,UAAA,gBAAAE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWG;AAAA,cACT;AAAA,cACAL,MAAY,WAAW,kBAAkB;AAAA,YAAA;AAAA,UAC3C;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWE;AAAA,UACT;AAAA,UACAL,MAAY,WAAYQ,IAAO,eAAe,oBAAqB;AAAA,QAAA;AAAA,QAEtE,UAAA;AAAA,UAAA;AAAA,UAEEC,IACC,gBAAAP;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,2CAAA;AAAA,cAEf,UAAAO;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACN,GACF;AAEJ;AAEO,SAASC,EAAW;AAAA,EACzB,MAAAC;AAAA,EACA,SAAAX;AAAA,EACA,UAAAY;AAAA,EACA,MAAAJ;AACF,GAKG;AACD,QAAMK,IAAgBF,EAAK,eAAe,CAACA,EAAK;AAChD,SACE,gBAAAR;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAMS,KAAA,gBAAAA,EAAWD,GAAMX;AAAA,MAChC,WAAWK;AAAA,QACT;AAAA,QACA;AAAA,QACAQ,KAAiBF,EAAK,cAClB,wBACAH,IACE,0CACA;AAAA,MAAA;AAAA,MAER,OACEG,EAAK,cACD;AAAA,QACE,iBAAiBA,EAAK;AAAA,QACtB,OAAO,kBAAkBA,EAAK,WAAW;AAAA,MAAA,IAE3CE,IACE;AAAA,QACE,iBAAiB;AAAA,QACjB,OAAO;AAAA,MAAA,IAET;AAAA,MAGP,UAAA;AAAA,QAAAF,EAAK,OAAO;AAAA,QACb,gBAAAT,EAACY,GAAA,EAAW,WAAU,qBAAA,CAAqB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGjD;"}
@@ -1,27 +1,26 @@
1
- import { jsxs as i, jsx as t } from "react/jsx-runtime";
1
+ import { jsxs as s, jsx as t } from "react/jsx-runtime";
2
2
  import { cn as o } from "../../../utils/cn.js";
3
- import { getContrastText as h } from "../../../utils/contrast.js";
4
- import { BillingToggle as x, PriceValue as v, PlanButton as y } from "../parts.js";
5
- import { Check as N } from "../../../icons.js";
6
- const p = ({ className: d, plans: m, billing: s, onBillingChange: a, onSelect: n, yearlyBadge: g, ...f }) => /* @__PURE__ */ i("div", { className: o("w-full", d), ...f, children: [
7
- /* @__PURE__ */ t(x, { billing: s, onChange: a, yearlyBadge: g }),
3
+ import { BillingToggle as x, PriceValue as f, PlanButton as v } from "../parts.js";
4
+ import { Check as y } from "../../../icons.js";
5
+ const N = ({ className: d, plans: m, billing: i, onBillingChange: a, onSelect: n, yearlyBadge: g, ...u }) => /* @__PURE__ */ s("div", { className: o("w-full", d), ...u, children: [
6
+ /* @__PURE__ */ t(x, { billing: i, onChange: a, yearlyBadge: g }),
8
7
  /* @__PURE__ */ t("div", { className: "grid grid-cols-1 gap-4 lg:grid-cols-2", children: m.map((r) => {
9
- const c = r.highlighted && !r.customColor, e = r.customColor || (c ? "rgb(var(--color-primary))" : void 0), u = r.customColor ? h(r.customColor, "#111111", "#ffffff") : c ? "rgb(var(--color-on-primary))" : void 0;
10
- return /* @__PURE__ */ i(
8
+ const c = r.highlighted && !r.customColor, e = r.customColor || (c ? "rgb(var(--color-primary))" : void 0), h = r.customColor ? `contrast-color(${r.customColor})` : c ? "rgb(var(--color-on-primary))" : void 0;
9
+ return /* @__PURE__ */ s(
11
10
  "div",
12
11
  {
13
12
  className: o(
14
13
  "flex h-full flex-col rounded-xl p-8",
15
14
  e ? "lg:col-span-2" : "border border-border bg-surface"
16
15
  ),
17
- style: e ? { backgroundColor: e, color: u } : void 0,
16
+ style: e ? { backgroundColor: e, color: h } : void 0,
18
17
  children: [
19
- /* @__PURE__ */ i("div", { className: "flex items-start justify-between gap-4", children: [
20
- /* @__PURE__ */ i("div", { className: "min-w-0", children: [
18
+ /* @__PURE__ */ s("div", { className: "flex items-start justify-between gap-4", children: [
19
+ /* @__PURE__ */ s("div", { className: "min-w-0", children: [
21
20
  /* @__PURE__ */ t("h3", { className: o("font-display text-xl font-semibold tracking-tight", e ? "text-current" : "text-foreground"), children: r.name }),
22
21
  r.description ? /* @__PURE__ */ t("p", { className: o("mt-1.5 text-sm", e ? void 0 : "text-muted-foreground"), children: r.description }) : null
23
22
  ] }),
24
- /* @__PURE__ */ t("div", { className: o("shrink-0 font-display", e ? "text-current" : "text-foreground"), children: /* @__PURE__ */ t(v, { value: s === "monthly" ? r.monthly : r.yearly, billing: s, dim: !e }) })
23
+ /* @__PURE__ */ t("div", { className: o("shrink-0 font-display", e ? "text-current" : "text-foreground"), children: /* @__PURE__ */ t(f, { value: i === "monthly" ? r.monthly : r.yearly, billing: i, dim: !e }) })
25
24
  ] }),
26
25
  /* @__PURE__ */ t(
27
26
  "ul",
@@ -30,21 +29,21 @@ const p = ({ className: d, plans: m, billing: s, onBillingChange: a, onSelect: n
30
29
  "mt-7 grid grid-cols-1 gap-x-8 gap-y-2.5 text-sm sm:grid-cols-2",
31
30
  e ? "lg:max-w-2xl" : void 0
32
31
  ),
33
- children: r.features.map((l) => /* @__PURE__ */ i("li", { className: o("flex items-start gap-2.5", e ? "text-current" : "text-muted-foreground"), children: [
34
- /* @__PURE__ */ t(N, { className: o("mt-0.5 h-4 w-4 shrink-0", e ? "text-current" : "text-primary") }),
32
+ children: r.features.map((l) => /* @__PURE__ */ s("li", { className: o("flex items-start gap-2.5", e ? "text-current" : "text-muted-foreground"), children: [
33
+ /* @__PURE__ */ t(y, { className: o("mt-0.5 h-4 w-4 shrink-0", e ? "text-current" : "text-primary") }),
35
34
  l
36
35
  ] }, l))
37
36
  }
38
37
  ),
39
- /* @__PURE__ */ t("div", { className: "mt-8", children: /* @__PURE__ */ t(y, { plan: r, billing: s, onSelect: n, dark: !e }) })
38
+ /* @__PURE__ */ t("div", { className: "mt-8", children: /* @__PURE__ */ t(v, { plan: r, billing: i, onSelect: n, dark: !e }) })
40
39
  ]
41
40
  },
42
41
  r.name
43
42
  );
44
43
  }) })
45
44
  ] });
46
- p.displayName = "PricingBento";
45
+ N.displayName = "PricingBento";
47
46
  export {
48
- p as PricingBento
47
+ N as PricingBento
49
48
  };
50
49
  //# sourceMappingURL=Bento.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Bento.js","sources":["../../../../../src/components/Pricing/variants/Bento.tsx"],"sourcesContent":["import { cn } from \"../../../utils/cn\";\nimport { getContrastText } from \"../../../utils/contrast\";\nimport { PriceValue, BillingToggle, PlanButton } from \"../parts\";\nimport { Check } from \"../../../icons\";\nimport type { PricingVariantProps } from \"../types\";\n\ninterface BentoProps extends PricingVariantProps {\n className?: string;\n}\n\nexport const PricingBento = ({ className, plans, billing, onBillingChange, onSelect, yearlyBadge, ...props }: BentoProps) => {\n return (\n <div className={cn(\"w-full\", className)} {...props}>\n <BillingToggle billing={billing} onChange={onBillingChange} yearlyBadge={yearlyBadge} />\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n {plans.map((plan) => {\n const isHighlighted = plan.highlighted && !plan.customColor;\n const bg = plan.customColor || (isHighlighted ? \"rgb(var(--color-primary))\" : undefined);\n const fg = plan.customColor\n ? getContrastText(plan.customColor, \"#111111\", \"#ffffff\")\n : isHighlighted\n ? \"rgb(var(--color-on-primary))\"\n : undefined;\n return (\n <div\n key={plan.name}\n className={cn(\n \"flex h-full flex-col rounded-xl p-8\",\n bg\n ? \"lg:col-span-2\"\n : \"border border-border bg-surface\",\n )}\n style={bg ? { backgroundColor: bg, color: fg } : undefined}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className={cn(\"font-display text-xl font-semibold tracking-tight\", bg ? \"text-current\" : \"text-foreground\")}>\n {plan.name}\n </h3>\n {plan.description ? (\n <p className={cn(\"mt-1.5 text-sm\", bg ? undefined : \"text-muted-foreground\")}>\n {plan.description}\n </p>\n ) : null}\n </div>\n <div className={cn(\"shrink-0 font-display\", bg ? \"text-current\" : \"text-foreground\")}>\n <PriceValue value={billing === \"monthly\" ? plan.monthly : plan.yearly} billing={billing} dim={!bg} />\n </div>\n </div>\n <ul\n className={cn(\n \"mt-7 grid grid-cols-1 gap-x-8 gap-y-2.5 text-sm sm:grid-cols-2\",\n bg ? \"lg:max-w-2xl\" : undefined,\n )}\n >\n {plan.features.map((feature) => (\n <li key={feature} className={cn(\"flex items-start gap-2.5\", bg ? \"text-current\" : \"text-muted-foreground\")}>\n <Check className={cn(\"mt-0.5 h-4 w-4 shrink-0\", bg ? \"text-current\" : \"text-primary\")} />\n {feature}\n </li>\n ))}\n </ul>\n <div className=\"mt-8\">\n <PlanButton plan={plan} billing={billing} onSelect={onSelect} dark={!bg} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nPricingBento.displayName = \"PricingBento\";"],"names":["PricingBento","className","plans","billing","onBillingChange","onSelect","yearlyBadge","props","jsxs","cn","jsx","BillingToggle","plan","isHighlighted","bg","fg","getContrastText","PriceValue","feature","Check","PlanButton"],"mappings":";;;;;AAUO,MAAMA,IAAe,CAAC,EAAE,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,iBAAAC,GAAiB,UAAAC,GAAU,aAAAC,GAAa,GAAGC,QAEjG,gBAAAC,EAAC,SAAI,WAAWC,EAAG,UAAUR,CAAS,GAAI,GAAGM,GAC3C,UAAA;AAAA,EAAA,gBAAAG,EAACC,GAAA,EAAc,SAAAR,GAAkB,UAAUC,GAAiB,aAAAE,GAA0B;AAAA,oBACrF,OAAA,EAAI,WAAU,yCACZ,UAAAJ,EAAM,IAAI,CAACU,MAAS;AACnB,UAAMC,IAAgBD,EAAK,eAAe,CAACA,EAAK,aAC1CE,IAAKF,EAAK,gBAAgBC,IAAgB,8BAA8B,SACxEE,IAAKH,EAAK,cACZI,EAAgBJ,EAAK,aAAa,WAAW,SAAS,IACtDC,IACE,iCACA;AACN,WACE,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC;AAAA,UACT;AAAA,UACAK,IACI,kBACA;AAAA,QAAA;AAAA,QAEN,OAAOA,IAAK,EAAE,iBAAiBA,GAAI,OAAOC,MAAO;AAAA,QAEjD,UAAA;AAAA,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,cAAA,gBAAAE,EAAC,MAAA,EAAG,WAAWD,EAAG,qDAAqDK,IAAK,iBAAiB,iBAAiB,GAC3G,UAAAF,EAAK,KAAA,CACR;AAAA,cACCA,EAAK,cACJ,gBAAAF,EAAC,KAAA,EAAE,WAAWD,EAAG,kBAAkBK,IAAK,SAAY,uBAAuB,GACxE,UAAAF,EAAK,aACR,IACE;AAAA,YAAA,GACN;AAAA,YACA,gBAAAF,EAAC,SAAI,WAAWD,EAAG,yBAAyBK,IAAK,iBAAiB,iBAAiB,GACjF,UAAA,gBAAAJ,EAACO,GAAA,EAAW,OAAOd,MAAY,YAAYS,EAAK,UAAUA,EAAK,QAAQ,SAAAT,GAAkB,KAAK,CAACW,EAAA,CAAI,EAAA,CACrG;AAAA,UAAA,GACF;AAAA,UACA,gBAAAJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACAK,IAAK,iBAAiB;AAAA,cAAA;AAAA,cAGvB,UAAAF,EAAK,SAAS,IAAI,CAACM,MAClB,gBAAAV,EAAC,MAAA,EAAiB,WAAWC,EAAG,4BAA4BK,IAAK,iBAAiB,uBAAuB,GACvG,UAAA;AAAA,gBAAA,gBAAAJ,EAACS,KAAM,WAAWV,EAAG,2BAA2BK,IAAK,iBAAiB,cAAc,GAAG;AAAA,gBACtFI;AAAA,cAAA,EAAA,GAFMA,CAGT,CACD;AAAA,YAAA;AAAA,UAAA;AAAA,UAEH,gBAAAR,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACU,GAAA,EAAW,MAAAR,GAAY,SAAAT,GAAkB,UAAAE,GAAoB,MAAM,CAACS,EAAA,CAAI,EAAA,CAC3E;AAAA,QAAA;AAAA,MAAA;AAAA,MAvCKF,EAAK;AAAA,IAAA;AAAA,EA0ChB,CAAC,EAAA,CACH;AAAA,GACF;AAGJZ,EAAa,cAAc;"}
1
+ {"version":3,"file":"Bento.js","sources":["../../../../../src/components/Pricing/variants/Bento.tsx"],"sourcesContent":["import { cn } from \"../../../utils/cn\";\nimport { PriceValue, BillingToggle, PlanButton } from \"../parts\";\nimport { Check } from \"../../../icons\";\nimport type { PricingVariantProps } from \"../types\";\n\ninterface BentoProps extends PricingVariantProps {\n className?: string;\n}\n\nexport const PricingBento = ({ className, plans, billing, onBillingChange, onSelect, yearlyBadge, ...props }: BentoProps) => {\n return (\n <div className={cn(\"w-full\", className)} {...props}>\n <BillingToggle billing={billing} onChange={onBillingChange} yearlyBadge={yearlyBadge} />\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n {plans.map((plan) => {\n const isHighlighted = plan.highlighted && !plan.customColor;\n const bg = plan.customColor || (isHighlighted ? \"rgb(var(--color-primary))\" : undefined);\n const fg = plan.customColor\n ? `contrast-color(${plan.customColor})`\n : isHighlighted\n ? \"rgb(var(--color-on-primary))\"\n : undefined;\n return (\n <div\n key={plan.name}\n className={cn(\n \"flex h-full flex-col rounded-xl p-8\",\n bg\n ? \"lg:col-span-2\"\n : \"border border-border bg-surface\",\n )}\n style={bg ? { backgroundColor: bg, color: fg } : undefined}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <h3 className={cn(\"font-display text-xl font-semibold tracking-tight\", bg ? \"text-current\" : \"text-foreground\")}>\n {plan.name}\n </h3>\n {plan.description ? (\n <p className={cn(\"mt-1.5 text-sm\", bg ? undefined : \"text-muted-foreground\")}>\n {plan.description}\n </p>\n ) : null}\n </div>\n <div className={cn(\"shrink-0 font-display\", bg ? \"text-current\" : \"text-foreground\")}>\n <PriceValue value={billing === \"monthly\" ? plan.monthly : plan.yearly} billing={billing} dim={!bg} />\n </div>\n </div>\n <ul\n className={cn(\n \"mt-7 grid grid-cols-1 gap-x-8 gap-y-2.5 text-sm sm:grid-cols-2\",\n bg ? \"lg:max-w-2xl\" : undefined,\n )}\n >\n {plan.features.map((feature) => (\n <li key={feature} className={cn(\"flex items-start gap-2.5\", bg ? \"text-current\" : \"text-muted-foreground\")}>\n <Check className={cn(\"mt-0.5 h-4 w-4 shrink-0\", bg ? \"text-current\" : \"text-primary\")} />\n {feature}\n </li>\n ))}\n </ul>\n <div className=\"mt-8\">\n <PlanButton plan={plan} billing={billing} onSelect={onSelect} dark={!bg} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nPricingBento.displayName = \"PricingBento\";"],"names":["PricingBento","className","plans","billing","onBillingChange","onSelect","yearlyBadge","props","jsxs","cn","jsx","BillingToggle","plan","isHighlighted","bg","fg","PriceValue","feature","Check","PlanButton"],"mappings":";;;;AASO,MAAMA,IAAe,CAAC,EAAE,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,iBAAAC,GAAiB,UAAAC,GAAU,aAAAC,GAAa,GAAGC,QAEjG,gBAAAC,EAAC,SAAI,WAAWC,EAAG,UAAUR,CAAS,GAAI,GAAGM,GAC3C,UAAA;AAAA,EAAA,gBAAAG,EAACC,GAAA,EAAc,SAAAR,GAAkB,UAAUC,GAAiB,aAAAE,GAA0B;AAAA,oBACrF,OAAA,EAAI,WAAU,yCACZ,UAAAJ,EAAM,IAAI,CAACU,MAAS;AACnB,UAAMC,IAAgBD,EAAK,eAAe,CAACA,EAAK,aAC1CE,IAAKF,EAAK,gBAAgBC,IAAgB,8BAA8B,SACxEE,IAAKH,EAAK,cACZ,kBAAkBA,EAAK,WAAW,MAClCC,IACE,iCACA;AACN,WACE,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC;AAAA,UACT;AAAA,UACAK,IACI,kBACA;AAAA,QAAA;AAAA,QAEN,OAAOA,IAAK,EAAE,iBAAiBA,GAAI,OAAOC,MAAO;AAAA,QAEjD,UAAA;AAAA,UAAA,gBAAAP,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,cAAA,gBAAAE,EAAC,MAAA,EAAG,WAAWD,EAAG,qDAAqDK,IAAK,iBAAiB,iBAAiB,GAC3G,UAAAF,EAAK,KAAA,CACR;AAAA,cACCA,EAAK,cACJ,gBAAAF,EAAC,KAAA,EAAE,WAAWD,EAAG,kBAAkBK,IAAK,SAAY,uBAAuB,GACxE,UAAAF,EAAK,aACR,IACE;AAAA,YAAA,GACN;AAAA,YACA,gBAAAF,EAAC,SAAI,WAAWD,EAAG,yBAAyBK,IAAK,iBAAiB,iBAAiB,GACjF,UAAA,gBAAAJ,EAACM,GAAA,EAAW,OAAOb,MAAY,YAAYS,EAAK,UAAUA,EAAK,QAAQ,SAAAT,GAAkB,KAAK,CAACW,EAAA,CAAI,EAAA,CACrG;AAAA,UAAA,GACF;AAAA,UACA,gBAAAJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACAK,IAAK,iBAAiB;AAAA,cAAA;AAAA,cAGvB,UAAAF,EAAK,SAAS,IAAI,CAACK,MAClB,gBAAAT,EAAC,MAAA,EAAiB,WAAWC,EAAG,4BAA4BK,IAAK,iBAAiB,uBAAuB,GACvG,UAAA;AAAA,gBAAA,gBAAAJ,EAACQ,KAAM,WAAWT,EAAG,2BAA2BK,IAAK,iBAAiB,cAAc,GAAG;AAAA,gBACtFG;AAAA,cAAA,EAAA,GAFMA,CAGT,CACD;AAAA,YAAA;AAAA,UAAA;AAAA,UAEH,gBAAAP,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACS,GAAA,EAAW,MAAAP,GAAY,SAAAT,GAAkB,UAAAE,GAAoB,MAAM,CAACS,EAAA,CAAI,EAAA,CAC3E;AAAA,QAAA;AAAA,MAAA;AAAA,MAvCKF,EAAK;AAAA,IAAA;AAAA,EA0ChB,CAAC,EAAA,CACH;AAAA,GACF;AAGJZ,EAAa,cAAc;"}
@@ -1,12 +1,11 @@
1
1
  import { jsxs as l, jsx as o } from "react/jsx-runtime";
2
2
  import { cn as t } from "../../../utils/cn.js";
3
- import { getContrastText as x } from "../../../utils/contrast.js";
4
- import { BillingToggle as h, PriceValue as p, PlanButton as y } from "../parts.js";
5
- import { Check as v } from "../../../icons.js";
6
- const b = ({ className: d, plans: a, billing: s, onBillingChange: m, onSelect: n, yearlyBadge: g, ...u }) => /* @__PURE__ */ l("div", { className: t("w-full", d), ...u, children: [
3
+ import { BillingToggle as h, PriceValue as f, PlanButton as p } from "../parts.js";
4
+ import { Check as y } from "../../../icons.js";
5
+ const v = ({ className: d, plans: a, billing: s, onBillingChange: m, onSelect: n, yearlyBadge: g, ...u }) => /* @__PURE__ */ l("div", { className: t("w-full", d), ...u, children: [
7
6
  /* @__PURE__ */ o(h, { billing: s, onChange: m, yearlyBadge: g }),
8
7
  /* @__PURE__ */ o("div", { className: "grid grid-cols-1 gap-5 md:grid-cols-2 lg:grid-cols-3", children: a.map((r) => {
9
- const i = r.highlighted && !r.customColor, e = r.customColor || (i ? "rgb(var(--color-primary))" : void 0), f = r.customColor ? x(r.customColor, "#111111", "#ffffff") : i ? "rgb(var(--color-on-primary))" : void 0;
8
+ const i = r.highlighted && !r.customColor, e = r.customColor || (i ? "rgb(var(--color-primary))" : void 0), x = r.customColor ? `contrast-color(${r.customColor})` : i ? "rgb(var(--color-on-primary))" : void 0;
10
9
  return /* @__PURE__ */ l(
11
10
  "div",
12
11
  {
@@ -15,7 +14,7 @@ const b = ({ className: d, plans: a, billing: s, onBillingChange: m, onSelect: n
15
14
  e ? "shadow-raised" : "border border-border bg-surface",
16
15
  !e && i && "border-primary"
17
16
  ),
18
- style: e ? { backgroundColor: e, color: f } : void 0,
17
+ style: e ? { backgroundColor: e, color: x } : void 0,
19
18
  children: [
20
19
  i ? /* @__PURE__ */ o(
21
20
  "span",
@@ -30,20 +29,20 @@ const b = ({ className: d, plans: a, billing: s, onBillingChange: m, onSelect: n
30
29
  ) : null,
31
30
  /* @__PURE__ */ o("h3", { className: t("font-display text-lg font-semibold tracking-tight", e ? "text-current" : "text-foreground"), children: r.name }),
32
31
  r.description ? /* @__PURE__ */ o("p", { className: t("mt-1.5 text-sm", e ? void 0 : "text-muted-foreground"), children: r.description }) : null,
33
- /* @__PURE__ */ o("div", { className: t("mt-6 flex items-baseline font-display", e ? "text-current" : "text-foreground"), children: /* @__PURE__ */ o(p, { value: s === "monthly" ? r.monthly : r.yearly, billing: s, dim: !e }) }),
32
+ /* @__PURE__ */ o("div", { className: t("mt-6 flex items-baseline font-display", e ? "text-current" : "text-foreground"), children: /* @__PURE__ */ o(f, { value: s === "monthly" ? r.monthly : r.yearly, billing: s, dim: !e }) }),
34
33
  /* @__PURE__ */ o("ul", { className: t("mt-7 flex-1 space-y-2.5 text-sm", e ? "text-current" : "text-muted-foreground"), children: r.features.map((c) => /* @__PURE__ */ l("li", { className: "flex items-start gap-2.5", children: [
35
- /* @__PURE__ */ o(v, { className: t("mt-0.5 h-4 w-4 shrink-0", e ? "text-current" : "text-primary") }),
34
+ /* @__PURE__ */ o(y, { className: t("mt-0.5 h-4 w-4 shrink-0", e ? "text-current" : "text-primary") }),
36
35
  c
37
36
  ] }, c)) }),
38
- /* @__PURE__ */ o("div", { className: "mt-8", children: /* @__PURE__ */ o(y, { plan: r, billing: s, onSelect: n, dark: !e }) })
37
+ /* @__PURE__ */ o("div", { className: "mt-8", children: /* @__PURE__ */ o(p, { plan: r, billing: s, onSelect: n, dark: !e }) })
39
38
  ]
40
39
  },
41
40
  r.name
42
41
  );
43
42
  }) })
44
43
  ] });
45
- b.displayName = "PricingCards";
44
+ v.displayName = "PricingCards";
46
45
  export {
47
- b as PricingCards
46
+ v as PricingCards
48
47
  };
49
48
  //# sourceMappingURL=Cards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Cards.js","sources":["../../../../../src/components/Pricing/variants/Cards.tsx"],"sourcesContent":["import { cn } from \"../../../utils/cn\";\nimport { getContrastText } from \"../../../utils/contrast\";\nimport { PriceValue, BillingToggle, PlanButton } from \"../parts\";\nimport { Check } from \"../../../icons\";\nimport type { PricingVariantProps } from \"../types\";\n\ninterface CardsProps extends PricingVariantProps {\n className?: string;\n}\n\nexport const PricingCards = ({ className, plans, billing, onBillingChange, onSelect, yearlyBadge, ...props }: CardsProps) => {\n return (\n <div className={cn(\"w-full\", className)} {...props}>\n <BillingToggle billing={billing} onChange={onBillingChange} yearlyBadge={yearlyBadge} />\n <div className=\"grid grid-cols-1 gap-5 md:grid-cols-2 lg:grid-cols-3\">\n {plans.map((plan) => {\n const isHighlighted = plan.highlighted && !plan.customColor;\n const bg = plan.customColor || (isHighlighted ? \"rgb(var(--color-primary))\" : undefined);\n const fg = plan.customColor\n ? getContrastText(plan.customColor, \"#111111\", \"#ffffff\")\n : isHighlighted\n ? \"rgb(var(--color-on-primary))\"\n : undefined;\n return (\n <div\n key={plan.name}\n className={cn(\n \"relative flex flex-col rounded-xl p-7\",\n bg ? \"shadow-raised\" : \"border border-border bg-surface\",\n !bg && isHighlighted && \"border-primary\",\n )}\n style={bg ? { backgroundColor: bg, color: fg } : undefined}\n >\n {isHighlighted ? (\n <span\n className={cn(\n \"absolute -top-3 left-7 rounded-full px-2.5 py-1 text-[11px] font-semibold uppercase tracking-wider\",\n !bg && \"bg-primary text-on-primary\",\n )}\n style={\n bg\n ? { backgroundColor: \"rgb(var(--color-on-primary))\", color: \"rgb(var(--color-primary))\" }\n : undefined\n }\n >\n Most popular\n </span>\n ) : null}\n <h3 className={cn(\"font-display text-lg font-semibold tracking-tight\", bg ? \"text-current\" : \"text-foreground\")}>\n {plan.name}\n </h3>\n {plan.description ? (\n <p className={cn(\"mt-1.5 text-sm\", bg ? undefined : \"text-muted-foreground\")}>\n {plan.description}\n </p>\n ) : null}\n <div className={cn(\"mt-6 flex items-baseline font-display\", bg ? \"text-current\" : \"text-foreground\")}>\n <PriceValue value={billing === \"monthly\" ? plan.monthly : plan.yearly} billing={billing} dim={!bg} />\n </div>\n <ul className={cn(\"mt-7 flex-1 space-y-2.5 text-sm\", bg ? \"text-current\" : \"text-muted-foreground\")}>\n {plan.features.map((feature) => (\n <li key={feature} className=\"flex items-start gap-2.5\">\n <Check className={cn(\"mt-0.5 h-4 w-4 shrink-0\", bg ? \"text-current\" : \"text-primary\")} />\n {feature}\n </li>\n ))}\n </ul>\n <div className=\"mt-8\">\n <PlanButton plan={plan} billing={billing} onSelect={onSelect} dark={!bg} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nPricingCards.displayName = \"PricingCards\";"],"names":["PricingCards","className","plans","billing","onBillingChange","onSelect","yearlyBadge","props","jsxs","cn","jsx","BillingToggle","plan","isHighlighted","bg","fg","getContrastText","PriceValue","feature","Check","PlanButton"],"mappings":";;;;;AAUO,MAAMA,IAAe,CAAC,EAAE,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,iBAAAC,GAAiB,UAAAC,GAAU,aAAAC,GAAa,GAAGC,QAEjG,gBAAAC,EAAC,SAAI,WAAWC,EAAG,UAAUR,CAAS,GAAI,GAAGM,GAC3C,UAAA;AAAA,EAAA,gBAAAG,EAACC,GAAA,EAAc,SAAAR,GAAkB,UAAUC,GAAiB,aAAAE,GAA0B;AAAA,oBACrF,OAAA,EAAI,WAAU,wDACZ,UAAAJ,EAAM,IAAI,CAACU,MAAS;AACnB,UAAMC,IAAgBD,EAAK,eAAe,CAACA,EAAK,aAC1CE,IAAKF,EAAK,gBAAgBC,IAAgB,8BAA8B,SACxEE,IAAKH,EAAK,cACZI,EAAgBJ,EAAK,aAAa,WAAW,SAAS,IACtDC,IACE,iCACA;AACN,WACE,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC;AAAA,UACT;AAAA,UACAK,IAAK,kBAAkB;AAAA,UACvB,CAACA,KAAMD,KAAiB;AAAA,QAAA;AAAA,QAE1B,OAAOC,IAAK,EAAE,iBAAiBA,GAAI,OAAOC,MAAO;AAAA,QAEhD,UAAA;AAAA,UAAAF,IACC,gBAAAH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACA,CAACK,KAAM;AAAA,cAAA;AAAA,cAET,OACEA,IACI,EAAE,iBAAiB,gCAAgC,OAAO,gCAC1D;AAAA,cAEP,UAAA;AAAA,YAAA;AAAA,UAAA,IAGC;AAAA,UACJ,gBAAAJ,EAAC,MAAA,EAAG,WAAWD,EAAG,qDAAqDK,IAAK,iBAAiB,iBAAiB,GAC3G,UAAAF,EAAK,KAAA,CACR;AAAA,UACCA,EAAK,cACJ,gBAAAF,EAAC,KAAA,EAAE,WAAWD,EAAG,kBAAkBK,IAAK,SAAY,uBAAuB,GACxE,UAAAF,EAAK,aACR,IACE;AAAA,UACJ,gBAAAF,EAAC,SAAI,WAAWD,EAAG,yCAAyCK,IAAK,iBAAiB,iBAAiB,GACjG,UAAA,gBAAAJ,EAACO,GAAA,EAAW,OAAOd,MAAY,YAAYS,EAAK,UAAUA,EAAK,QAAQ,SAAAT,GAAkB,KAAK,CAACW,EAAA,CAAI,EAAA,CACrG;AAAA,4BACC,MAAA,EAAG,WAAWL,EAAG,mCAAmCK,IAAK,iBAAiB,uBAAuB,GAC/F,UAAAF,EAAK,SAAS,IAAI,CAACM,MAClB,gBAAAV,EAAC,MAAA,EAAiB,WAAU,4BAC1B,UAAA;AAAA,YAAA,gBAAAE,EAACS,KAAM,WAAWV,EAAG,2BAA2BK,IAAK,iBAAiB,cAAc,GAAG;AAAA,YACtFI;AAAA,UAAA,KAFMA,CAGT,CACD,GACH;AAAA,UACA,gBAAAR,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACU,GAAA,EAAW,MAAAR,GAAY,SAAAT,GAAkB,UAAAE,GAAoB,MAAM,CAACS,EAAA,CAAI,EAAA,CAC3E;AAAA,QAAA;AAAA,MAAA;AAAA,MA5CKF,EAAK;AAAA,IAAA;AAAA,EA+ChB,CAAC,EAAA,CACH;AAAA,GACF;AAGJZ,EAAa,cAAc;"}
1
+ {"version":3,"file":"Cards.js","sources":["../../../../../src/components/Pricing/variants/Cards.tsx"],"sourcesContent":["import { cn } from \"../../../utils/cn\";\nimport { PriceValue, BillingToggle, PlanButton } from \"../parts\";\nimport { Check } from \"../../../icons\";\nimport type { PricingVariantProps } from \"../types\";\n\ninterface CardsProps extends PricingVariantProps {\n className?: string;\n}\n\nexport const PricingCards = ({ className, plans, billing, onBillingChange, onSelect, yearlyBadge, ...props }: CardsProps) => {\n return (\n <div className={cn(\"w-full\", className)} {...props}>\n <BillingToggle billing={billing} onChange={onBillingChange} yearlyBadge={yearlyBadge} />\n <div className=\"grid grid-cols-1 gap-5 md:grid-cols-2 lg:grid-cols-3\">\n {plans.map((plan) => {\n const isHighlighted = plan.highlighted && !plan.customColor;\n const bg = plan.customColor || (isHighlighted ? \"rgb(var(--color-primary))\" : undefined);\n const fg = plan.customColor\n ? `contrast-color(${plan.customColor})`\n : isHighlighted\n ? \"rgb(var(--color-on-primary))\"\n : undefined;\n return (\n <div\n key={plan.name}\n className={cn(\n \"relative flex flex-col rounded-xl p-7\",\n bg ? \"shadow-raised\" : \"border border-border bg-surface\",\n !bg && isHighlighted && \"border-primary\",\n )}\n style={bg ? { backgroundColor: bg, color: fg } : undefined}\n >\n {isHighlighted ? (\n <span\n className={cn(\n \"absolute -top-3 left-7 rounded-full px-2.5 py-1 text-[11px] font-semibold uppercase tracking-wider\",\n !bg && \"bg-primary text-on-primary\",\n )}\n style={\n bg\n ? { backgroundColor: \"rgb(var(--color-on-primary))\", color: \"rgb(var(--color-primary))\" }\n : undefined\n }\n >\n Most popular\n </span>\n ) : null}\n <h3 className={cn(\"font-display text-lg font-semibold tracking-tight\", bg ? \"text-current\" : \"text-foreground\")}>\n {plan.name}\n </h3>\n {plan.description ? (\n <p className={cn(\"mt-1.5 text-sm\", bg ? undefined : \"text-muted-foreground\")}>\n {plan.description}\n </p>\n ) : null}\n <div className={cn(\"mt-6 flex items-baseline font-display\", bg ? \"text-current\" : \"text-foreground\")}>\n <PriceValue value={billing === \"monthly\" ? plan.monthly : plan.yearly} billing={billing} dim={!bg} />\n </div>\n <ul className={cn(\"mt-7 flex-1 space-y-2.5 text-sm\", bg ? \"text-current\" : \"text-muted-foreground\")}>\n {plan.features.map((feature) => (\n <li key={feature} className=\"flex items-start gap-2.5\">\n <Check className={cn(\"mt-0.5 h-4 w-4 shrink-0\", bg ? \"text-current\" : \"text-primary\")} />\n {feature}\n </li>\n ))}\n </ul>\n <div className=\"mt-8\">\n <PlanButton plan={plan} billing={billing} onSelect={onSelect} dark={!bg} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nPricingCards.displayName = \"PricingCards\";"],"names":["PricingCards","className","plans","billing","onBillingChange","onSelect","yearlyBadge","props","jsxs","cn","jsx","BillingToggle","plan","isHighlighted","bg","fg","PriceValue","feature","Check","PlanButton"],"mappings":";;;;AASO,MAAMA,IAAe,CAAC,EAAE,WAAAC,GAAW,OAAAC,GAAO,SAAAC,GAAS,iBAAAC,GAAiB,UAAAC,GAAU,aAAAC,GAAa,GAAGC,QAEjG,gBAAAC,EAAC,SAAI,WAAWC,EAAG,UAAUR,CAAS,GAAI,GAAGM,GAC3C,UAAA;AAAA,EAAA,gBAAAG,EAACC,GAAA,EAAc,SAAAR,GAAkB,UAAUC,GAAiB,aAAAE,GAA0B;AAAA,oBACrF,OAAA,EAAI,WAAU,wDACZ,UAAAJ,EAAM,IAAI,CAACU,MAAS;AACnB,UAAMC,IAAgBD,EAAK,eAAe,CAACA,EAAK,aAC1CE,IAAKF,EAAK,gBAAgBC,IAAgB,8BAA8B,SACxEE,IAAKH,EAAK,cACZ,kBAAkBA,EAAK,WAAW,MAClCC,IACE,iCACA;AACN,WACE,gBAAAL;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAWC;AAAA,UACT;AAAA,UACAK,IAAK,kBAAkB;AAAA,UACvB,CAACA,KAAMD,KAAiB;AAAA,QAAA;AAAA,QAE1B,OAAOC,IAAK,EAAE,iBAAiBA,GAAI,OAAOC,MAAO;AAAA,QAEhD,UAAA;AAAA,UAAAF,IACC,gBAAAH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACA,CAACK,KAAM;AAAA,cAAA;AAAA,cAET,OACEA,IACI,EAAE,iBAAiB,gCAAgC,OAAO,gCAC1D;AAAA,cAEP,UAAA;AAAA,YAAA;AAAA,UAAA,IAGC;AAAA,UACJ,gBAAAJ,EAAC,MAAA,EAAG,WAAWD,EAAG,qDAAqDK,IAAK,iBAAiB,iBAAiB,GAC3G,UAAAF,EAAK,KAAA,CACR;AAAA,UACCA,EAAK,cACJ,gBAAAF,EAAC,KAAA,EAAE,WAAWD,EAAG,kBAAkBK,IAAK,SAAY,uBAAuB,GACxE,UAAAF,EAAK,aACR,IACE;AAAA,UACJ,gBAAAF,EAAC,SAAI,WAAWD,EAAG,yCAAyCK,IAAK,iBAAiB,iBAAiB,GACjG,UAAA,gBAAAJ,EAACM,GAAA,EAAW,OAAOb,MAAY,YAAYS,EAAK,UAAUA,EAAK,QAAQ,SAAAT,GAAkB,KAAK,CAACW,EAAA,CAAI,EAAA,CACrG;AAAA,4BACC,MAAA,EAAG,WAAWL,EAAG,mCAAmCK,IAAK,iBAAiB,uBAAuB,GAC/F,UAAAF,EAAK,SAAS,IAAI,CAACK,MAClB,gBAAAT,EAAC,MAAA,EAAiB,WAAU,4BAC1B,UAAA;AAAA,YAAA,gBAAAE,EAACQ,KAAM,WAAWT,EAAG,2BAA2BK,IAAK,iBAAiB,cAAc,GAAG;AAAA,YACtFG;AAAA,UAAA,KAFMA,CAGT,CACD,GACH;AAAA,UACA,gBAAAP,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAA,EAACS,GAAA,EAAW,MAAAP,GAAY,SAAAT,GAAkB,UAAAE,GAAoB,MAAM,CAACS,EAAA,CAAI,EAAA,CAC3E;AAAA,QAAA;AAAA,MAAA;AAAA,MA5CKF,EAAK;AAAA,IAAA;AAAA,EA+ChB,CAAC,EAAA,CACH;AAAA,GACF;AAGJZ,EAAa,cAAc;"}
@@ -1,37 +1,36 @@
1
1
  import { jsxs as t, jsx as r } from "react/jsx-runtime";
2
2
  import { forwardRef as b } from "react";
3
3
  import { cn as o } from "../../utils/cn.js";
4
- import { getContrastText as g } from "../../utils/contrast.js";
5
- import { Quote as h, Star as y } from "../../icons.js";
6
- import { initials as N } from "./parts.js";
7
- const A = b(
8
- function({ className: m, testimonial: c, ...d }, f) {
9
- const { quote: x, author: a, role: i, company: l, avatar: n, accent: e, rating: s } = c, p = e ? { backgroundColor: e, color: g(e, "#111111", "#ffffff") } : void 0;
4
+ import { Quote as h, Star as g } from "../../icons.js";
5
+ import { initials as y } from "./parts.js";
6
+ const S = b(
7
+ function({ className: c, testimonial: m, ...d }, f) {
8
+ const { quote: x, author: a, role: i, company: l, avatar: n, accent: e, rating: s } = m, u = e ? { backgroundColor: e, color: `contrast-color(${e})` } : void 0;
10
9
  return /* @__PURE__ */ t(
11
10
  "figure",
12
11
  {
13
12
  ref: f,
14
13
  className: o(
15
14
  "mb-4 flex flex-col break-inside-avoid rounded-2xl border border-border bg-surface p-7",
16
- m
15
+ c
17
16
  ),
18
17
  ...d,
19
18
  children: [
20
19
  /* @__PURE__ */ t("div", { className: "mb-5 flex items-center justify-between", children: [
21
20
  /* @__PURE__ */ r(h, { className: o("h-6 w-6", e ? void 0 : "text-primary/30"), style: e ? { color: e } : void 0 }),
22
- s ? /* @__PURE__ */ r("span", { className: "flex items-center gap-0.5 text-amber-500", "aria-label": `${s} / 5`, children: Array.from({ length: 5 }).map((j, u) => /* @__PURE__ */ r(y, { className: "h-3.5 w-3.5" }, u)) }) : null
21
+ s ? /* @__PURE__ */ r("span", { className: "flex items-center gap-0.5 text-amber-500", "aria-label": `${s} / 5`, children: Array.from({ length: 5 }).map((v, p) => /* @__PURE__ */ r(g, { className: "h-3.5 w-3.5" }, p)) }) : null
23
22
  ] }),
24
23
  /* @__PURE__ */ r("blockquote", { className: "flex-1 text-[15px] leading-7 text-foreground/85", children: x }),
25
24
  /* @__PURE__ */ t("figcaption", { className: "mt-6 flex items-center gap-3", children: [
26
25
  n || /* @__PURE__ */ r(
27
26
  "span",
28
27
  {
29
- style: p,
28
+ style: u,
30
29
  className: o(
31
30
  "inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full text-xs font-bold",
32
31
  !e && "bg-primary-soft text-primary"
33
32
  ),
34
- children: N(a)
33
+ children: y(a)
35
34
  }
36
35
  ),
37
36
  /* @__PURE__ */ t("div", { children: [
@@ -45,6 +44,6 @@ const A = b(
45
44
  }
46
45
  );
47
46
  export {
48
- A as TestimonialCard
47
+ S as TestimonialCard
49
48
  };
50
49
  //# sourceMappingURL=TestimonialCard.js.map