@jarllyng/nostromo 3.15.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-6UIT6XQH.cjs +4 -0
- package/dist/chunk-6UIT6XQH.cjs.map +1 -0
- package/dist/{chunk-BDRP7ALG.cjs → chunk-7AKJCOPP.cjs} +2 -2
- package/dist/{chunk-BDRP7ALG.cjs.map → chunk-7AKJCOPP.cjs.map} +1 -1
- package/dist/{chunk-A4ODFRMS.js → chunk-7YBS3JIS.js} +2 -2
- package/dist/{chunk-A4ODFRMS.js.map → chunk-7YBS3JIS.js.map} +1 -1
- package/dist/{chunk-CT6LEOBW.js → chunk-BQPFZMGP.js} +2 -2
- package/dist/{chunk-CT6LEOBW.js.map → chunk-BQPFZMGP.js.map} +1 -1
- package/dist/chunk-INZNS2ZP.cjs +3 -0
- package/dist/chunk-INZNS2ZP.cjs.map +1 -0
- package/dist/chunk-JVFOPCT4.cjs +3 -0
- package/dist/chunk-JVFOPCT4.cjs.map +1 -0
- package/dist/chunk-LQB4PD53.js +3 -0
- package/dist/chunk-LQB4PD53.js.map +1 -0
- package/dist/chunk-O2VT23LK.js +4 -0
- package/dist/chunk-O2VT23LK.js.map +1 -0
- package/dist/{chunk-4UHGGKCS.cjs → chunk-RKAXTJFB.cjs} +2 -2
- package/dist/{chunk-4UHGGKCS.cjs.map → chunk-RKAXTJFB.cjs.map} +1 -1
- package/dist/{chunk-NM5NVIAK.js → chunk-RPY5NLM7.js} +2 -2
- package/dist/{chunk-NM5NVIAK.js.map → chunk-RPY5NLM7.js.map} +1 -1
- package/dist/{chunk-PZLBMQGI.cjs → chunk-RQIC6NLV.cjs} +2 -2
- package/dist/{chunk-PZLBMQGI.cjs.map → chunk-RQIC6NLV.cjs.map} +1 -1
- package/dist/chunk-ZLKYFVIL.js +3 -0
- package/dist/chunk-ZLKYFVIL.js.map +1 -0
- package/dist/components/core/alert-dialog.cjs +1 -1
- package/dist/components/core/alert-dialog.js +1 -1
- package/dist/components/core/button.cjs +1 -1
- package/dist/components/core/button.js +1 -1
- package/dist/components/core/calendar.cjs +1 -1
- package/dist/components/core/calendar.js +1 -1
- package/dist/components/core/carousel.cjs +1 -1
- package/dist/components/core/carousel.js +1 -1
- package/dist/components/marketing/gallery.cjs +1 -1
- package/dist/components/marketing/gallery.d.cts +4 -4
- package/dist/components/marketing/gallery.d.ts +4 -4
- package/dist/components/marketing/gallery.js +1 -1
- package/dist/components/marketing/pricing.cjs +1 -1
- package/dist/components/marketing/pricing.d.cts +17 -2
- package/dist/components/marketing/pricing.d.ts +17 -2
- package/dist/components/marketing/pricing.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2JQROMCM.js +0 -3
- package/dist/chunk-2JQROMCM.js.map +0 -1
- package/dist/chunk-44HISN45.js +0 -3
- package/dist/chunk-44HISN45.js.map +0 -1
- package/dist/chunk-5PVFLXPO.cjs +0 -4
- package/dist/chunk-5PVFLXPO.cjs.map +0 -1
- package/dist/chunk-7PPAI3MM.cjs +0 -3
- package/dist/chunk-7PPAI3MM.cjs.map +0 -1
- package/dist/chunk-AVTJE2O2.js +0 -4
- package/dist/chunk-AVTJE2O2.js.map +0 -1
- package/dist/chunk-OEN63W3G.cjs +0 -3
- package/dist/chunk-OEN63W3G.cjs.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),r=require('react'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var r__default=/*#__PURE__*/_interopDefault(r);var h=classVarianceAuthority.cva("py-16 md:py-24",{variants:{variant:{default:"bg-background",muted:"bg-muted/30",accent:"bg-accent/10"}},defaultVariants:{variant:"default"}}),P=classVarianceAuthority.cva("grid gap-8",{variants:{columns:{1:"grid-cols-1 max-w-md mx-auto",2:"grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto",3:"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 max-w-6xl mx-auto",4:"grid-cols-1 md:grid-cols-2 lg:grid-cols-4 max-w-7xl mx-auto"}},defaultVariants:{columns:3}}),V=classVarianceAuthority.cva("relative p-8 rounded-lg border bg-card text-card-foreground shadow-sm transition-all duration-200",{variants:{variant:{default:"border-border",accent:"border-accent/20 bg-accent/5",popular:"border-primary/20 bg-primary/5 ring-2 ring-primary/10",muted:"border-muted bg-muted/20"}},defaultVariants:{variant:"default"}}),k=classVarianceAuthority.cva("absolute -top-3 left-1/2 transform -translate-x-1/2 px-3 py-1 rounded-full text-xs font-medium",{variants:{variant:{default:"bg-primary text-primary-foreground",accent:"bg-accent text-accent-foreground",success:"bg-success-100 text-success-800",warning:"bg-warning-100 text-warning-800"}},defaultVariants:{variant:"default"}});function x(a,i){let o=a.price.yearly;return i&&o!==void 0?{amount:o,period:a.period??"year"}:{amount:a.price.monthly,period:a.period??"month"}}function w(a){let i=a.filter(n=>n.price.yearly!==void 0&&n.price.monthly>0).map(n=>{let l=n.price.monthly*12;return Math.round((l-n.price.yearly)/l*100)}).filter(n=>n>0);if(i.length===0)return null;let o=Math.max(...i);return {percent:o,exact:i.every(n=>n===o)}}var D=({plans:a,title:i,subtitle:o,columns:n,variant:l,className:f,showYearly:s=false,onToggleBilling:p,billingToggleLabel:b="Bill yearly",showYearlyDiscount:y=true,yearlyDiscountLabel:v=(c,u)=>u?`(Save ${c}%)`:`(Save up to ${c}%)`,...N})=>{let c=y?w(a):null,u=(e,g="USD")=>new Intl.NumberFormat("en-US",{style:"currency",currency:g,minimumFractionDigits:0}).format(e);return r__default.default.createElement("section",{className:chunkITRGJNWL_cjs.a(h({variant:l}),f),...N},r__default.default.createElement("div",{className:"container mx-auto px-4"},(i||o)&&r__default.default.createElement("div",{className:"text-center mb-12"},i&&r__default.default.createElement("h2",{className:"text-3xl md:text-4xl font-bold tracking-tight mb-4"},i),o&&r__default.default.createElement("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto"},o)),p&&r__default.default.createElement("div",{className:"flex items-center justify-center gap-4 mb-12"},r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",!s&&"text-foreground font-medium")},"Monthly"),r__default.default.createElement("button",{type:"button",role:"switch","aria-checked":s,"aria-label":b,onClick:()=>p(!s),className:"relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"},r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("inline-block h-4 w-4 transform rounded-full bg-background transition-transform",s?"translate-x-6":"translate-x-1")})),r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",s&&"text-foreground font-medium")},"Yearly",c&&r__default.default.createElement("span",{className:"ml-1 text-xs text-success-600"},v(c.percent,c.exact)))),r__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(P({columns:n}))},a.map((e,g)=>r__default.default.createElement("div",{key:e.id||g,className:chunkITRGJNWL_cjs.a(V({variant:e.popular?"popular":"default"}),e.popular&&"scale-105")},e.badge&&r__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(k({variant:e.badge.variant}))},e.badge.text),r__default.default.createElement("div",{className:"text-center mb-6"},r__default.default.createElement("h3",{className:"text-2xl font-bold mb-2"},e.name),e.description&&r__default.default.createElement("p",{className:"text-muted-foreground text-sm mb-4"},e.description),r__default.default.createElement("div",{className:"mb-4"},r__default.default.createElement("span",{className:"text-4xl font-bold"},u(x(e,s).amount,e.currency)),r__default.default.createElement("span",{className:"text-muted-foreground ml-1"},"/",x(e,s).period))),r__default.default.createElement("ul",{className:"space-y-3 mb-8"},e.features.map(d=>r__default.default.createElement("li",{key:d.id,className:"flex items-center gap-3"},r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("w-5 h-5 rounded-full flex items-center justify-center text-xs",d.included?"bg-success-100 text-success-600":"bg-muted text-muted-foreground")},d.included?"\u2713":"\u2717"),r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",!d.included&&"text-muted-foreground line-through")},d.name)))),e.cta.href?r__default.default.createElement("a",{href:e.cta.href,onClick:e.cta.onClick,className:chunkITRGJNWL_cjs.a("block w-full py-3 px-4 rounded-lg font-medium text-center transition-colors",e.popular?"bg-primary text-primary-foreground hover:bg-primary/90":"bg-muted text-muted-foreground hover:bg-muted/80")},e.cta.text):r__default.default.createElement("button",{type:"button",className:chunkITRGJNWL_cjs.a("w-full py-3 px-4 rounded-lg font-medium transition-colors",e.popular?"bg-primary text-primary-foreground hover:bg-primary/90":"bg-muted text-muted-foreground hover:bg-muted/80"),onClick:e.cta.onClick},e.cta.text))))))};exports.a=D;//# sourceMappingURL=chunk-INZNS2ZP.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-INZNS2ZP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/marketing/pricing.tsx"],"names":["pricingVariants","cva","pricingGridVariants","pricingCardVariants","pricingBadgeVariants","displayPrice","plan","showYearly","yearly","yearlySaving","plans","savings","fullYear","percent","best","s","Pricing","title","subtitle","columns","variant","className","onToggleBilling","billingToggleLabel","showYearlyDiscount","yearlyDiscountLabel","exact","props","saving","formatPrice","price","currency","React","cn","idx","feature"],"mappings":"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","file":"chunk-INZNS2ZP.cjs","sourcesContent":["import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst pricingVariants = cva(\"py-16 md:py-24\", {\n variants: {\n variant: {\n default: \"bg-background\",\n muted: \"bg-muted/30\",\n accent: \"bg-accent/10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\nconst pricingGridVariants = cva(\"grid gap-8\", {\n variants: {\n columns: {\n 1: \"grid-cols-1 max-w-md mx-auto\",\n 2: \"grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto\",\n 3: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 max-w-6xl mx-auto\",\n 4: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-4 max-w-7xl mx-auto\",\n },\n },\n defaultVariants: {\n columns: 3,\n },\n});\n\nconst pricingCardVariants = cva(\n \"relative p-8 rounded-lg border bg-card text-card-foreground shadow-sm transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"border-border\",\n accent: \"border-accent/20 bg-accent/5\",\n popular: \"border-primary/20 bg-primary/5 ring-2 ring-primary/10\",\n muted: \"border-muted bg-muted/20\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst pricingBadgeVariants = cva(\n \"absolute -top-3 left-1/2 transform -translate-x-1/2 px-3 py-1 rounded-full text-xs font-medium\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success-100 text-success-800\",\n warning: \"bg-warning-100 text-warning-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface PricingFeature {\n id: string;\n name: string;\n included: boolean;\n}\n\nexport interface PricingPlan {\n id: string;\n name: string;\n description?: string;\n price: {\n monthly: number;\n yearly?: number;\n };\n currency?: string;\n period?: string;\n features: PricingFeature[];\n cta: {\n text: string;\n href?: string;\n onClick?: () => void;\n };\n badge?: {\n text: string;\n variant?: VariantProps<typeof pricingBadgeVariants>[\"variant\"];\n };\n popular?: boolean;\n}\n\nexport interface PricingProps extends VariantProps<typeof pricingVariants> {\n plans: PricingPlan[];\n title?: string;\n subtitle?: string;\n columns?: VariantProps<typeof pricingGridVariants>[\"columns\"];\n className?: string;\n showYearly?: boolean;\n onToggleBilling?: (yearly: boolean) => void;\n /**\n * Accessible name for the monthly/yearly switch.\n *\n * The visible \"Monthly\" and \"Yearly\" text sits either side of it, so it has no\n * name of its own to take. It used to have none at all: an empty button, which\n * axe reports as `button-name`.\n */\n billingToggleLabel?: string;\n /**\n * Show what a yearly plan saves. Defaults to true, and shows nothing when the\n * prices do not actually save anything.\n */\n showYearlyDiscount?: boolean;\n /** The wording of that saving. */\n yearlyDiscountLabel?: (percent: number, exact: boolean) => string;\n}\n\n/**\n * What a plan costs in the period being shown, and what to call that period.\n *\n * `showYearly && plan.price.yearly` was a truthiness test, so a plan priced at\n * `yearly: 0` - free for the year, which is a real offer - fell through to the\n * monthly figure and labelled it `/year`. A plan with no yearly price did the\n * same, quietly presenting a monthly amount as an annual one.\n *\n * A missing yearly price now keeps its own period rather than borrowing the\n * wrong one. Multiplying the monthly price by twelve would be inventing a number\n * the caller did not give.\n */\nfunction displayPrice(plan: PricingPlan, showYearly: boolean) {\n const yearly = plan.price.yearly;\n if (showYearly && yearly !== undefined) {\n return { amount: yearly, period: plan.period ?? \"year\" };\n }\n return { amount: plan.price.monthly, period: plan.period ?? \"month\" };\n}\n\n/**\n * What yearly billing actually saves, from the prices given.\n *\n * The component used to say \"(Save 20%)\" next to the Yearly label always, whether\n * the yearly prices saved twenty percent, nothing, or cost more. That is a claim\n * about money made without looking at any.\n *\n * Plans can disagree, and the label sits next to one global switch, so the number\n * is the best saving on offer and says \"up to\" when the plans differ. Nothing is\n * claimed when nothing is saved.\n */\nfunction yearlySaving(plans: PricingPlan[]): {\n percent: number;\n exact: boolean;\n} | null {\n const savings = plans\n .filter((plan) => plan.price.yearly !== undefined && plan.price.monthly > 0)\n .map((plan) => {\n const fullYear = plan.price.monthly * 12;\n return Math.round(((fullYear - plan.price.yearly!) / fullYear) * 100);\n })\n .filter((percent) => percent > 0);\n\n if (savings.length === 0) return null;\n const best = Math.max(...savings);\n return { percent: best, exact: savings.every((s) => s === best) };\n}\n\nexport const Pricing: React.FC<PricingProps> = ({\n plans,\n title,\n subtitle,\n columns,\n variant,\n className,\n showYearly = false,\n onToggleBilling,\n billingToggleLabel = \"Bill yearly\",\n showYearlyDiscount = true,\n yearlyDiscountLabel = (percent, exact) =>\n exact ? `(Save ${percent}%)` : `(Save up to ${percent}%)`,\n ...props\n}) => {\n const saving = showYearlyDiscount ? yearlySaving(plans) : null;\n const formatPrice = (price: number, currency = \"USD\") => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 0,\n }).format(price);\n };\n\n return (\n <section className={cn(pricingVariants({ variant }), className)} {...props}>\n <div className=\"container mx-auto px-4\">\n {(title || subtitle) && (\n <div className=\"text-center mb-12\">\n {title && (\n <h2 className=\"text-3xl md:text-4xl font-bold tracking-tight mb-4\">\n {title}\n </h2>\n )}\n {subtitle && (\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n {/*\n Its own block, keyed on the billing callback.\n\n It used to live inside the heading, so a Pricing with no `title` and no\n `subtitle` - both optional props - rendered no way to switch between\n monthly and yearly at all, however the callback was configured.\n */}\n {onToggleBilling && (\n <div className=\"flex items-center justify-center gap-4 mb-12\">\n <span\n className={cn(\n \"text-sm\",\n !showYearly && \"text-foreground font-medium\",\n )}\n >\n Monthly\n </span>\n {/*\n A switch, with a name and a state. It was an empty <button>: axe\n reported `button-name`, nothing announced which way it was set, and\n without a type it submitted any form it happened to sit in.\n */}\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={showYearly}\n aria-label={billingToggleLabel}\n onClick={() => onToggleBilling(!showYearly)}\n className=\"relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\"\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full bg-background transition-transform\",\n showYearly ? \"translate-x-6\" : \"translate-x-1\",\n )}\n />\n </button>\n <span\n className={cn(\n \"text-sm\",\n showYearly && \"text-foreground font-medium\",\n )}\n >\n Yearly\n {saving && (\n <span className=\"ml-1 text-xs text-success-600\">\n {yearlyDiscountLabel(saving.percent, saving.exact)}\n </span>\n )}\n </span>\n </div>\n )}\n\n <div className={cn(pricingGridVariants({ columns }))}>\n {plans.map((plan, idx) => (\n <div\n key={plan.id || idx}\n className={cn(\n pricingCardVariants({\n variant: plan.popular ? \"popular\" : \"default\",\n }),\n plan.popular && \"scale-105\",\n )}\n >\n {plan.badge && (\n <div\n className={cn(\n pricingBadgeVariants({ variant: plan.badge.variant }),\n )}\n >\n {plan.badge.text}\n </div>\n )}\n\n <div className=\"text-center mb-6\">\n <h3 className=\"text-2xl font-bold mb-2\">{plan.name}</h3>\n {plan.description && (\n <p className=\"text-muted-foreground text-sm mb-4\">\n {plan.description}\n </p>\n )}\n <div className=\"mb-4\">\n <span className=\"text-4xl font-bold\">\n {formatPrice(\n displayPrice(plan, showYearly).amount,\n plan.currency,\n )}\n </span>\n <span className=\"text-muted-foreground ml-1\">\n /{displayPrice(plan, showYearly).period}\n </span>\n </div>\n </div>\n\n <ul className=\"space-y-3 mb-8\">\n {plan.features.map((feature) => (\n <li key={feature.id} className=\"flex items-center gap-3\">\n <span\n className={cn(\n \"w-5 h-5 rounded-full flex items-center justify-center text-xs\",\n feature.included\n ? \"bg-success-100 text-success-600\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {feature.included ? \"✓\" : \"✗\"}\n </span>\n <span\n className={cn(\n \"text-sm\",\n !feature.included &&\n \"text-muted-foreground line-through\",\n )}\n >\n {feature.name}\n </span>\n </li>\n ))}\n </ul>\n\n {/*\n A link when the plan gives a destination, a button when it gives\n a callback.\n\n `PricingPlan.cta` has had an optional `href` since it was written\n and nothing ever read it, so a plan configured with a destination\n and no `onClick` rendered a button that did nothing at all.\n\n With both, it is a link that also runs the callback: a plan that\n navigates to checkout and reports the click on the way is the\n normal shape of that, and a button could not do the navigating.\n\n `type=\"button\"` on the callback form, so a pricing table inside a\n form does not submit it.\n */}\n {plan.cta.href ? (\n <a\n href={plan.cta.href}\n onClick={plan.cta.onClick}\n className={cn(\n \"block w-full py-3 px-4 rounded-lg font-medium text-center transition-colors\",\n plan.popular\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n >\n {plan.cta.text}\n </a>\n ) : (\n <button\n type=\"button\"\n className={cn(\n \"w-full py-3 px-4 rounded-lg font-medium transition-colors\",\n plan.popular\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n onClick={plan.cta.onClick}\n >\n {plan.cta.text}\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var chunk6UIT6XQH_cjs=require('./chunk-6UIT6XQH.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),e=require('react'),l=require('@radix-ui/react-dialog'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var e__default=/*#__PURE__*/_interopDefault(e);var l__namespace=/*#__PURE__*/_interopNamespace(l);var A=classVarianceAuthority.cva("grid gap-4",{variants:{columns:{1:"grid-cols-1",2:"grid-cols-1 sm:grid-cols-2",3:"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",4:"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",5:"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5",6:"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6"},spacing:{sm:"gap-2",md:"gap-4",lg:"gap-6",xl:"gap-8"}},defaultVariants:{columns:3,spacing:"md"}}),j=classVarianceAuthority.cva("relative overflow-hidden rounded-lg bg-muted/50 transition-all duration-300 hover:scale-105 hover:shadow-lg",{variants:{aspectRatio:{square:"aspect-square",video:"aspect-video",portrait:"aspect-[3/4]",landscape:"aspect-[4/3]",wide:"aspect-[16/9]"},hover:{none:"",scale:"hover:scale-105",zoom:"hover:scale-110",lift:"hover:-translate-y-2"}},defaultVariants:{aspectRatio:"square",hover:"scale"}}),q=classVarianceAuthority.cva("fixed inset-0 z-50 flex items-center justify-center bg-black/90 backdrop-blur-sm",{variants:{animation:{fade:"animate-in fade-in duration-300",slide:"animate-in slide-in-from-bottom duration-300",zoom:"animate-in zoom-in duration-300"}},defaultVariants:{animation:"fade"}}),B=({images:a,className:P,itemClassName:N,columns:w=3,spacing:D="md",showLightbox:p=true,lightboxAnimation:C="fade",onImageClick:v,itemHover:I="scale",itemAspectRatio:V="square",showThumbnails:z=false,thumbnailSize:E="md",...G})=>{let[i,c]=e.useState(null),[o,m]=e.useState(-1),f=e.useRef(null),x=e.useCallback((t,r,s)=>{s&&(f.current=s),p&&(c(t),m(r)),v?.(t,r);},[p,v]),y=e.useCallback(()=>{c(null),m(-1);},[]),u=e.useCallback(()=>{if(o>0){let t=o-1;c(a[t]||null),m(t);}},[o,a]),h=e.useCallback(()=>{if(o<a.length-1){let t=o+1;c(a[t]||null),m(t);}},[o,a]),T=e.useCallback(t=>{t.key==="ArrowLeft"?u():t.key==="ArrowRight"&&h();},[u,h]);return e__default.default.createElement(e__default.default.Fragment,null,e__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(A({columns:w,spacing:D}),P),...G},a.map((t,r)=>e__default.default.createElement("div",{key:t.id||r,className:chunkITRGJNWL_cjs.a(j({aspectRatio:V,hover:I}),N),role:"button",tabIndex:0,onClick:s=>x(t,r,s.currentTarget),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),x(t,r,s.currentTarget));},"aria-label":`View image ${r+1}: ${t.alt}`},e__default.default.createElement("img",{src:z&&t.thumbnail?t.thumbnail:t.src,alt:t.alt,className:"w-full h-full object-cover",loading:"lazy"}),(t.title||t.description)&&e__default.default.createElement("div",{className:"absolute inset-0 bg-black/50 opacity-0 hover:opacity-100 transition-opacity duration-300 flex items-end"},e__default.default.createElement("div",{className:"p-4 text-white"},t.title&&e__default.default.createElement("h3",{className:"font-semibold text-sm sm:text-base"},t.title),t.description&&e__default.default.createElement("p",{className:"text-xs sm:text-sm text-white/80 mt-1"},t.description)))))),e__default.default.createElement(l__namespace.Root,{open:i!==null&&p,onOpenChange:t=>{t||y();}},e__default.default.createElement(l__namespace.Portal,null,e__default.default.createElement(l__namespace.Overlay,{className:chunkITRGJNWL_cjs.a(q({animation:C}))}),e__default.default.createElement(l__namespace.Content,{className:"fixed inset-0 z-50 flex items-center justify-center focus:outline-none",onCloseAutoFocus:t=>{t.preventDefault(),f.current?.focus();},onKeyDown:T,onClick:y},i&&e__default.default.createElement("div",{className:"relative max-w-4xl max-h-[90vh] mx-4",onClick:t=>t.stopPropagation()},e__default.default.createElement(l__namespace.Title,{className:"sr-only"},i.title||i.alt),i.description?e__default.default.createElement(l__namespace.Description,{className:"sr-only"},i.description):null,e__default.default.createElement("img",{src:i.src,alt:i.alt,className:"max-w-full max-h-full object-contain rounded-lg"}),(i.title||i.description)&&e__default.default.createElement("div",{className:"absolute bottom-0 left-0 right-0 bg-black/80 text-white p-4 rounded-b-lg"},i.title&&e__default.default.createElement("h3",{className:"font-semibold text-lg mb-2"},i.title),i.description&&e__default.default.createElement("p",{className:"text-sm text-white/80"},i.description)),a.length>1&&e__default.default.createElement(e__default.default.Fragment,null,o>0&&e__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",className:"absolute left-4 top-1/2 -translate-y-1/2 bg-black/50 hover:bg-black/70 text-white",onClick:u,"aria-label":"Previous image"},"\u2190"),o<a.length-1&&e__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",className:"absolute right-4 top-1/2 -translate-y-1/2 bg-black/50 hover:bg-black/70 text-white",onClick:h,"aria-label":"Next image"},"\u2192")),e__default.default.createElement(l__namespace.Close,{asChild:true},e__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",className:"absolute top-4 right-4 bg-black/50 hover:bg-black/70 text-white","aria-label":"Close lightbox"},"\u2715")),a.length>1&&e__default.default.createElement("div",{className:"absolute top-4 left-4 bg-black/50 text-white px-3 py-1 rounded-full text-sm"},o+1," / ",a.length))))))},M=B;exports.a=B;exports.b=M;//# sourceMappingURL=chunk-JVFOPCT4.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-JVFOPCT4.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/marketing/gallery.tsx"],"names":["galleryVariants","cva","galleryItemVariants","lightboxVariants","Gallery","images","className","itemClassName","columns","spacing","showLightbox","lightboxAnimation","onImageClick","itemHover","itemAspectRatio","showThumbnails","_thumbnailSize","props","selectedImage","setSelectedImage","useState","selectedIndex","setSelectedIndex","triggerRef","useRef","handleImageClick","useCallback","image","index","trigger","handleCloseLightbox","handlePrevious","newIndex","handleNext","handleKeyDown","e","React","cn","l","next","event","Button","gallery_default"],"mappings":"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","file":"chunk-JVFOPCT4.cjs","sourcesContent":["import React, { useState, useCallback, useRef } from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/core/button\";\n\nconst galleryVariants = cva(\"grid gap-4\", {\n variants: {\n columns: {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\n 5: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5\",\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6\",\n },\n spacing: {\n sm: \"gap-2\",\n md: \"gap-4\",\n lg: \"gap-6\",\n xl: \"gap-8\",\n },\n },\n defaultVariants: {\n columns: 3,\n spacing: \"md\",\n },\n});\n\nconst galleryItemVariants = cva(\n \"relative overflow-hidden rounded-lg bg-muted/50 transition-all duration-300 hover:scale-105 hover:shadow-lg\",\n {\n variants: {\n aspectRatio: {\n square: \"aspect-square\",\n video: \"aspect-video\",\n portrait: \"aspect-[3/4]\",\n landscape: \"aspect-[4/3]\",\n wide: \"aspect-[16/9]\",\n },\n hover: {\n none: \"\",\n scale: \"hover:scale-105\",\n zoom: \"hover:scale-110\",\n lift: \"hover:-translate-y-2\",\n },\n },\n defaultVariants: {\n aspectRatio: \"square\",\n hover: \"scale\",\n },\n },\n);\n\nconst lightboxVariants = cva(\n \"fixed inset-0 z-50 flex items-center justify-center bg-black/90 backdrop-blur-sm\",\n {\n variants: {\n animation: {\n fade: \"animate-in fade-in duration-300\",\n slide: \"animate-in slide-in-from-bottom duration-300\",\n zoom: \"animate-in zoom-in duration-300\",\n },\n },\n defaultVariants: {\n animation: \"fade\",\n },\n },\n);\n\nexport interface GalleryImage {\n id: string;\n src: string;\n alt: string;\n title?: string;\n description?: string;\n thumbnail?: string;\n}\n\nexport interface GalleryProps extends VariantProps<typeof galleryVariants> {\n images: GalleryImage[];\n className?: string;\n itemClassName?: string;\n showLightbox?: boolean;\n lightboxAnimation?: VariantProps<typeof lightboxVariants>[\"animation\"];\n onImageClick?: (image: GalleryImage, index: number) => void;\n itemHover?: VariantProps<typeof galleryItemVariants>[\"hover\"];\n itemAspectRatio?: VariantProps<typeof galleryItemVariants>[\"aspectRatio\"];\n showThumbnails?: boolean;\n thumbnailSize?: \"sm\" | \"md\" | \"lg\";\n}\n\nexport const Gallery: React.FC<GalleryProps> = ({\n images,\n className,\n itemClassName,\n columns = 3,\n spacing = \"md\",\n showLightbox = true,\n lightboxAnimation = \"fade\",\n onImageClick,\n itemHover = \"scale\",\n itemAspectRatio = \"square\",\n showThumbnails = false,\n thumbnailSize: _thumbnailSize = \"md\",\n ...props\n}) => {\n const [selectedImage, setSelectedImage] = useState<GalleryImage | null>(null);\n const [selectedIndex, setSelectedIndex] = useState<number>(-1);\n\n /**\n * The item that opened the lightbox, so focus can go back to it.\n *\n * Radix restores focus to whatever was focused when the dialog mounted, and in\n * this tree it did not: focus came back to `document.body`, measured rather\n * than assumed. Remembering the element and putting focus back explicitly is\n * both more certain and more precise - this is the exact item, not whatever\n * happened to be focused at the time.\n */\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const handleImageClick = useCallback(\n (image: GalleryImage, index: number, trigger?: HTMLElement | null) => {\n if (trigger) triggerRef.current = trigger;\n if (showLightbox) {\n setSelectedImage(image);\n setSelectedIndex(index);\n }\n onImageClick?.(image, index);\n },\n [showLightbox, onImageClick],\n );\n\n const handleCloseLightbox = useCallback(() => {\n setSelectedImage(null);\n setSelectedIndex(-1);\n }, []);\n\n const handlePrevious = useCallback(() => {\n if (selectedIndex > 0) {\n const newIndex = selectedIndex - 1;\n setSelectedImage(images[newIndex] || null);\n setSelectedIndex(newIndex);\n }\n }, [selectedIndex, images]);\n\n const handleNext = useCallback(() => {\n if (selectedIndex < images.length - 1) {\n const newIndex = selectedIndex + 1;\n setSelectedImage(images[newIndex] || null);\n setSelectedIndex(newIndex);\n }\n }, [selectedIndex, images]);\n\n // Escape is Radix's, and it handles it whether or not focus is on this\n // element - which is the half that was broken. The arrows are ours, and they\n // work now because focus is inside the dialog to begin with.\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n handlePrevious();\n } else if (e.key === \"ArrowRight\") {\n handleNext();\n }\n },\n [handlePrevious, handleNext],\n );\n\n return (\n <>\n <div\n className={cn(galleryVariants({ columns, spacing }), className)}\n {...props}\n >\n {images.map((image, index) => (\n <div\n key={image.id || index}\n className={cn(\n galleryItemVariants({\n aspectRatio: itemAspectRatio,\n hover: itemHover,\n }),\n itemClassName,\n )}\n role=\"button\"\n tabIndex={0}\n onClick={(e) => handleImageClick(image, index, e.currentTarget)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleImageClick(image, index, e.currentTarget);\n }\n }}\n aria-label={`View image ${index + 1}: ${image.alt}`}\n >\n <img\n src={\n showThumbnails && image.thumbnail ? image.thumbnail : image.src\n }\n alt={image.alt}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n {(image.title || image.description) && (\n <div className=\"absolute inset-0 bg-black/50 opacity-0 hover:opacity-100 transition-opacity duration-300 flex items-end\">\n <div className=\"p-4 text-white\">\n {image.title && (\n <h3 className=\"font-semibold text-sm sm:text-base\">\n {image.title}\n </h3>\n )}\n {image.description && (\n <p className=\"text-xs sm:text-sm text-white/80 mt-1\">\n {image.description}\n </p>\n )}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n\n {/*\n The lightbox is a Radix Dialog rather than a div with role=\"dialog\".\n\n It used to be the latter, and it said `aria-modal=\"true\"` without being\n modal in any respect that matters. Opening it left focus on the gallery\n item behind it, so `document.activeElement` was still \"View image 1\";\n Escape and the arrow keys were bound to the overlay, which never had\n focus, so neither worked; and every control behind the overlay was still\n reachable by Tab.\n\n Radix brings initial focus, focus containment, focus returned to whatever\n opened it, Escape, scroll locking and aria-hiding the rest of the page.\n Hand-rolling those is how the original ended up claiming all of them and\n implementing none. It also generates the ids, which replaces the fixed\n `lightbox-title` that collided as soon as a page had two galleries.\n */}\n <DialogPrimitive.Root\n open={selectedImage !== null && showLightbox}\n onOpenChange={(next) => {\n if (!next) handleCloseLightbox();\n }}\n >\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(lightboxVariants({ animation: lightboxAnimation }))}\n />\n <DialogPrimitive.Content\n className=\"fixed inset-0 z-50 flex items-center justify-center focus:outline-none\"\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n triggerRef.current?.focus();\n }}\n onKeyDown={handleKeyDown}\n // Clicking the backdrop closes it, the same as before. The panel\n // below stops the click from reaching here.\n onClick={handleCloseLightbox}\n >\n {selectedImage && (\n <div\n className=\"relative max-w-4xl max-h-[90vh] mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n {/*\n Radix names the dialog from its Title, and warns without one.\n The alt text is the only description of the image there is, so\n it is the name; it is visually hidden because the image itself\n is already on screen.\n */}\n <DialogPrimitive.Title className=\"sr-only\">\n {selectedImage.title || selectedImage.alt}\n </DialogPrimitive.Title>\n {selectedImage.description ? (\n <DialogPrimitive.Description className=\"sr-only\">\n {selectedImage.description}\n </DialogPrimitive.Description>\n ) : null}\n\n <img\n src={selectedImage.src}\n alt={selectedImage.alt}\n className=\"max-w-full max-h-full object-contain rounded-lg\"\n />\n\n {(selectedImage.title || selectedImage.description) && (\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/80 text-white p-4 rounded-b-lg\">\n {selectedImage.title && (\n <h3 className=\"font-semibold text-lg mb-2\">\n {selectedImage.title}\n </h3>\n )}\n {selectedImage.description && (\n <p className=\"text-sm text-white/80\">\n {selectedImage.description}\n </p>\n )}\n </div>\n )}\n\n {/* Navigation buttons */}\n {images.length > 1 && (\n <>\n {selectedIndex > 0 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute left-4 top-1/2 -translate-y-1/2 bg-black/50 hover:bg-black/70 text-white\"\n onClick={handlePrevious}\n aria-label=\"Previous image\"\n >\n ←\n </Button>\n )}\n {selectedIndex < images.length - 1 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute right-4 top-1/2 -translate-y-1/2 bg-black/50 hover:bg-black/70 text-white\"\n onClick={handleNext}\n aria-label=\"Next image\"\n >\n →\n </Button>\n )}\n </>\n )}\n\n {/* Close button */}\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-4 right-4 bg-black/50 hover:bg-black/70 text-white\"\n aria-label=\"Close lightbox\"\n >\n ✕\n </Button>\n </DialogPrimitive.Close>\n\n {/* Image counter */}\n {images.length > 1 && (\n <div className=\"absolute top-4 left-4 bg-black/50 text-white px-3 py-1 rounded-full text-sm\">\n {selectedIndex + 1} / {images.length}\n </div>\n )}\n </div>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n </>\n );\n};\n\nexport default Gallery;\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a}from'./chunk-AC2JBXHQ.js';import r from'react';import {cva}from'class-variance-authority';var h=cva("py-16 md:py-24",{variants:{variant:{default:"bg-background",muted:"bg-muted/30",accent:"bg-accent/10"}},defaultVariants:{variant:"default"}}),P=cva("grid gap-8",{variants:{columns:{1:"grid-cols-1 max-w-md mx-auto",2:"grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto",3:"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 max-w-6xl mx-auto",4:"grid-cols-1 md:grid-cols-2 lg:grid-cols-4 max-w-7xl mx-auto"}},defaultVariants:{columns:3}}),V=cva("relative p-8 rounded-lg border bg-card text-card-foreground shadow-sm transition-all duration-200",{variants:{variant:{default:"border-border",accent:"border-accent/20 bg-accent/5",popular:"border-primary/20 bg-primary/5 ring-2 ring-primary/10",muted:"border-muted bg-muted/20"}},defaultVariants:{variant:"default"}}),k=cva("absolute -top-3 left-1/2 transform -translate-x-1/2 px-3 py-1 rounded-full text-xs font-medium",{variants:{variant:{default:"bg-primary text-primary-foreground",accent:"bg-accent text-accent-foreground",success:"bg-success-100 text-success-800",warning:"bg-warning-100 text-warning-800"}},defaultVariants:{variant:"default"}});function x(a,i){let o=a.price.yearly;return i&&o!==void 0?{amount:o,period:a.period??"year"}:{amount:a.price.monthly,period:a.period??"month"}}function w(a){let i=a.filter(n=>n.price.yearly!==void 0&&n.price.monthly>0).map(n=>{let l=n.price.monthly*12;return Math.round((l-n.price.yearly)/l*100)}).filter(n=>n>0);if(i.length===0)return null;let o=Math.max(...i);return {percent:o,exact:i.every(n=>n===o)}}var D=({plans:a$1,title:i,subtitle:o,columns:n,variant:l,className:f,showYearly:s=false,onToggleBilling:p,billingToggleLabel:b="Bill yearly",showYearlyDiscount:y=true,yearlyDiscountLabel:v=(c,u)=>u?`(Save ${c}%)`:`(Save up to ${c}%)`,...N})=>{let c=y?w(a$1):null,u=(e,g="USD")=>new Intl.NumberFormat("en-US",{style:"currency",currency:g,minimumFractionDigits:0}).format(e);return r.createElement("section",{className:a(h({variant:l}),f),...N},r.createElement("div",{className:"container mx-auto px-4"},(i||o)&&r.createElement("div",{className:"text-center mb-12"},i&&r.createElement("h2",{className:"text-3xl md:text-4xl font-bold tracking-tight mb-4"},i),o&&r.createElement("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto"},o)),p&&r.createElement("div",{className:"flex items-center justify-center gap-4 mb-12"},r.createElement("span",{className:a("text-sm",!s&&"text-foreground font-medium")},"Monthly"),r.createElement("button",{type:"button",role:"switch","aria-checked":s,"aria-label":b,onClick:()=>p(!s),className:"relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"},r.createElement("span",{className:a("inline-block h-4 w-4 transform rounded-full bg-background transition-transform",s?"translate-x-6":"translate-x-1")})),r.createElement("span",{className:a("text-sm",s&&"text-foreground font-medium")},"Yearly",c&&r.createElement("span",{className:"ml-1 text-xs text-success-600"},v(c.percent,c.exact)))),r.createElement("div",{className:a(P({columns:n}))},a$1.map((e,g)=>r.createElement("div",{key:e.id||g,className:a(V({variant:e.popular?"popular":"default"}),e.popular&&"scale-105")},e.badge&&r.createElement("div",{className:a(k({variant:e.badge.variant}))},e.badge.text),r.createElement("div",{className:"text-center mb-6"},r.createElement("h3",{className:"text-2xl font-bold mb-2"},e.name),e.description&&r.createElement("p",{className:"text-muted-foreground text-sm mb-4"},e.description),r.createElement("div",{className:"mb-4"},r.createElement("span",{className:"text-4xl font-bold"},u(x(e,s).amount,e.currency)),r.createElement("span",{className:"text-muted-foreground ml-1"},"/",x(e,s).period))),r.createElement("ul",{className:"space-y-3 mb-8"},e.features.map(d=>r.createElement("li",{key:d.id,className:"flex items-center gap-3"},r.createElement("span",{className:a("w-5 h-5 rounded-full flex items-center justify-center text-xs",d.included?"bg-success-100 text-success-600":"bg-muted text-muted-foreground")},d.included?"\u2713":"\u2717"),r.createElement("span",{className:a("text-sm",!d.included&&"text-muted-foreground line-through")},d.name)))),e.cta.href?r.createElement("a",{href:e.cta.href,onClick:e.cta.onClick,className:a("block w-full py-3 px-4 rounded-lg font-medium text-center transition-colors",e.popular?"bg-primary text-primary-foreground hover:bg-primary/90":"bg-muted text-muted-foreground hover:bg-muted/80")},e.cta.text):r.createElement("button",{type:"button",className:a("w-full py-3 px-4 rounded-lg font-medium transition-colors",e.popular?"bg-primary text-primary-foreground hover:bg-primary/90":"bg-muted text-muted-foreground hover:bg-muted/80"),onClick:e.cta.onClick},e.cta.text))))))};export{D as a};//# sourceMappingURL=chunk-LQB4PD53.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-LQB4PD53.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/marketing/pricing.tsx"],"names":["pricingVariants","cva","pricingGridVariants","pricingCardVariants","pricingBadgeVariants","displayPrice","plan","showYearly","yearly","yearlySaving","plans","savings","fullYear","percent","best","s","Pricing","title","subtitle","columns","variant","className","onToggleBilling","billingToggleLabel","showYearlyDiscount","yearlyDiscountLabel","exact","props","saving","formatPrice","price","currency","React","cn","idx","feature"],"mappings":"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","file":"chunk-LQB4PD53.js","sourcesContent":["import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst pricingVariants = cva(\"py-16 md:py-24\", {\n variants: {\n variant: {\n default: \"bg-background\",\n muted: \"bg-muted/30\",\n accent: \"bg-accent/10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n});\n\nconst pricingGridVariants = cva(\"grid gap-8\", {\n variants: {\n columns: {\n 1: \"grid-cols-1 max-w-md mx-auto\",\n 2: \"grid-cols-1 md:grid-cols-2 max-w-4xl mx-auto\",\n 3: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 max-w-6xl mx-auto\",\n 4: \"grid-cols-1 md:grid-cols-2 lg:grid-cols-4 max-w-7xl mx-auto\",\n },\n },\n defaultVariants: {\n columns: 3,\n },\n});\n\nconst pricingCardVariants = cva(\n \"relative p-8 rounded-lg border bg-card text-card-foreground shadow-sm transition-all duration-200\",\n {\n variants: {\n variant: {\n default: \"border-border\",\n accent: \"border-accent/20 bg-accent/5\",\n popular: \"border-primary/20 bg-primary/5 ring-2 ring-primary/10\",\n muted: \"border-muted bg-muted/20\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nconst pricingBadgeVariants = cva(\n \"absolute -top-3 left-1/2 transform -translate-x-1/2 px-3 py-1 rounded-full text-xs font-medium\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground\",\n accent: \"bg-accent text-accent-foreground\",\n success: \"bg-success-100 text-success-800\",\n warning: \"bg-warning-100 text-warning-800\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface PricingFeature {\n id: string;\n name: string;\n included: boolean;\n}\n\nexport interface PricingPlan {\n id: string;\n name: string;\n description?: string;\n price: {\n monthly: number;\n yearly?: number;\n };\n currency?: string;\n period?: string;\n features: PricingFeature[];\n cta: {\n text: string;\n href?: string;\n onClick?: () => void;\n };\n badge?: {\n text: string;\n variant?: VariantProps<typeof pricingBadgeVariants>[\"variant\"];\n };\n popular?: boolean;\n}\n\nexport interface PricingProps extends VariantProps<typeof pricingVariants> {\n plans: PricingPlan[];\n title?: string;\n subtitle?: string;\n columns?: VariantProps<typeof pricingGridVariants>[\"columns\"];\n className?: string;\n showYearly?: boolean;\n onToggleBilling?: (yearly: boolean) => void;\n /**\n * Accessible name for the monthly/yearly switch.\n *\n * The visible \"Monthly\" and \"Yearly\" text sits either side of it, so it has no\n * name of its own to take. It used to have none at all: an empty button, which\n * axe reports as `button-name`.\n */\n billingToggleLabel?: string;\n /**\n * Show what a yearly plan saves. Defaults to true, and shows nothing when the\n * prices do not actually save anything.\n */\n showYearlyDiscount?: boolean;\n /** The wording of that saving. */\n yearlyDiscountLabel?: (percent: number, exact: boolean) => string;\n}\n\n/**\n * What a plan costs in the period being shown, and what to call that period.\n *\n * `showYearly && plan.price.yearly` was a truthiness test, so a plan priced at\n * `yearly: 0` - free for the year, which is a real offer - fell through to the\n * monthly figure and labelled it `/year`. A plan with no yearly price did the\n * same, quietly presenting a monthly amount as an annual one.\n *\n * A missing yearly price now keeps its own period rather than borrowing the\n * wrong one. Multiplying the monthly price by twelve would be inventing a number\n * the caller did not give.\n */\nfunction displayPrice(plan: PricingPlan, showYearly: boolean) {\n const yearly = plan.price.yearly;\n if (showYearly && yearly !== undefined) {\n return { amount: yearly, period: plan.period ?? \"year\" };\n }\n return { amount: plan.price.monthly, period: plan.period ?? \"month\" };\n}\n\n/**\n * What yearly billing actually saves, from the prices given.\n *\n * The component used to say \"(Save 20%)\" next to the Yearly label always, whether\n * the yearly prices saved twenty percent, nothing, or cost more. That is a claim\n * about money made without looking at any.\n *\n * Plans can disagree, and the label sits next to one global switch, so the number\n * is the best saving on offer and says \"up to\" when the plans differ. Nothing is\n * claimed when nothing is saved.\n */\nfunction yearlySaving(plans: PricingPlan[]): {\n percent: number;\n exact: boolean;\n} | null {\n const savings = plans\n .filter((plan) => plan.price.yearly !== undefined && plan.price.monthly > 0)\n .map((plan) => {\n const fullYear = plan.price.monthly * 12;\n return Math.round(((fullYear - plan.price.yearly!) / fullYear) * 100);\n })\n .filter((percent) => percent > 0);\n\n if (savings.length === 0) return null;\n const best = Math.max(...savings);\n return { percent: best, exact: savings.every((s) => s === best) };\n}\n\nexport const Pricing: React.FC<PricingProps> = ({\n plans,\n title,\n subtitle,\n columns,\n variant,\n className,\n showYearly = false,\n onToggleBilling,\n billingToggleLabel = \"Bill yearly\",\n showYearlyDiscount = true,\n yearlyDiscountLabel = (percent, exact) =>\n exact ? `(Save ${percent}%)` : `(Save up to ${percent}%)`,\n ...props\n}) => {\n const saving = showYearlyDiscount ? yearlySaving(plans) : null;\n const formatPrice = (price: number, currency = \"USD\") => {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n minimumFractionDigits: 0,\n }).format(price);\n };\n\n return (\n <section className={cn(pricingVariants({ variant }), className)} {...props}>\n <div className=\"container mx-auto px-4\">\n {(title || subtitle) && (\n <div className=\"text-center mb-12\">\n {title && (\n <h2 className=\"text-3xl md:text-4xl font-bold tracking-tight mb-4\">\n {title}\n </h2>\n )}\n {subtitle && (\n <p className=\"text-lg text-muted-foreground max-w-2xl mx-auto\">\n {subtitle}\n </p>\n )}\n </div>\n )}\n\n {/*\n Its own block, keyed on the billing callback.\n\n It used to live inside the heading, so a Pricing with no `title` and no\n `subtitle` - both optional props - rendered no way to switch between\n monthly and yearly at all, however the callback was configured.\n */}\n {onToggleBilling && (\n <div className=\"flex items-center justify-center gap-4 mb-12\">\n <span\n className={cn(\n \"text-sm\",\n !showYearly && \"text-foreground font-medium\",\n )}\n >\n Monthly\n </span>\n {/*\n A switch, with a name and a state. It was an empty <button>: axe\n reported `button-name`, nothing announced which way it was set, and\n without a type it submitted any form it happened to sit in.\n */}\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={showYearly}\n aria-label={billingToggleLabel}\n onClick={() => onToggleBilling(!showYearly)}\n className=\"relative inline-flex h-6 w-11 items-center rounded-full bg-primary transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2\"\n >\n <span\n className={cn(\n \"inline-block h-4 w-4 transform rounded-full bg-background transition-transform\",\n showYearly ? \"translate-x-6\" : \"translate-x-1\",\n )}\n />\n </button>\n <span\n className={cn(\n \"text-sm\",\n showYearly && \"text-foreground font-medium\",\n )}\n >\n Yearly\n {saving && (\n <span className=\"ml-1 text-xs text-success-600\">\n {yearlyDiscountLabel(saving.percent, saving.exact)}\n </span>\n )}\n </span>\n </div>\n )}\n\n <div className={cn(pricingGridVariants({ columns }))}>\n {plans.map((plan, idx) => (\n <div\n key={plan.id || idx}\n className={cn(\n pricingCardVariants({\n variant: plan.popular ? \"popular\" : \"default\",\n }),\n plan.popular && \"scale-105\",\n )}\n >\n {plan.badge && (\n <div\n className={cn(\n pricingBadgeVariants({ variant: plan.badge.variant }),\n )}\n >\n {plan.badge.text}\n </div>\n )}\n\n <div className=\"text-center mb-6\">\n <h3 className=\"text-2xl font-bold mb-2\">{plan.name}</h3>\n {plan.description && (\n <p className=\"text-muted-foreground text-sm mb-4\">\n {plan.description}\n </p>\n )}\n <div className=\"mb-4\">\n <span className=\"text-4xl font-bold\">\n {formatPrice(\n displayPrice(plan, showYearly).amount,\n plan.currency,\n )}\n </span>\n <span className=\"text-muted-foreground ml-1\">\n /{displayPrice(plan, showYearly).period}\n </span>\n </div>\n </div>\n\n <ul className=\"space-y-3 mb-8\">\n {plan.features.map((feature) => (\n <li key={feature.id} className=\"flex items-center gap-3\">\n <span\n className={cn(\n \"w-5 h-5 rounded-full flex items-center justify-center text-xs\",\n feature.included\n ? \"bg-success-100 text-success-600\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {feature.included ? \"✓\" : \"✗\"}\n </span>\n <span\n className={cn(\n \"text-sm\",\n !feature.included &&\n \"text-muted-foreground line-through\",\n )}\n >\n {feature.name}\n </span>\n </li>\n ))}\n </ul>\n\n {/*\n A link when the plan gives a destination, a button when it gives\n a callback.\n\n `PricingPlan.cta` has had an optional `href` since it was written\n and nothing ever read it, so a plan configured with a destination\n and no `onClick` rendered a button that did nothing at all.\n\n With both, it is a link that also runs the callback: a plan that\n navigates to checkout and reports the click on the way is the\n normal shape of that, and a button could not do the navigating.\n\n `type=\"button\"` on the callback form, so a pricing table inside a\n form does not submit it.\n */}\n {plan.cta.href ? (\n <a\n href={plan.cta.href}\n onClick={plan.cta.onClick}\n className={cn(\n \"block w-full py-3 px-4 rounded-lg font-medium text-center transition-colors\",\n plan.popular\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n >\n {plan.cta.text}\n </a>\n ) : (\n <button\n type=\"button\"\n className={cn(\n \"w-full py-3 px-4 rounded-lg font-medium transition-colors\",\n plan.popular\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"bg-muted text-muted-foreground hover:bg-muted/80\",\n )}\n onClick={plan.cta.onClick}\n >\n {plan.cta.text}\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {a as a$1}from'./chunk-COXN6XBA.js';import {a}from'./chunk-AC2JBXHQ.js';import*as e from'react';import {Slot,Slottable}from'@radix-ui/react-slot';import {cva}from'class-variance-authority';var A=cva("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:opacity-50 aria-disabled:cursor-not-allowed",{variants:{variant:{default:["bg-primary text-primary-foreground shadow-md hover:bg-primary/90 hover:shadow-lg","active:scale-[0.98] active:shadow-sm","border border-primary/20"],secondary:["bg-secondary text-secondary-foreground border border-border","hover:bg-secondary/80 hover:border-border hover:shadow-sm","active:scale-[0.98]"],outline:["border-2 border-border bg-transparent text-foreground","hover:bg-muted hover:border-primary hover:text-primary","focus-visible:ring-ring/20 focus-visible:border-primary","active:scale-[0.98]"],ghost:["text-foreground hover:bg-muted hover:text-foreground","active:bg-muted/80 active:scale-[0.98]"],destructive:["bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90 hover:shadow-lg","active:scale-[0.98] active:shadow-sm","border border-destructive/20"],subtle:["bg-muted text-muted-foreground border border-border","hover:bg-muted/80 hover:border-border","active:scale-[0.98]"],link:"text-primary underline-offset-4 hover:underline"},size:{sm:"h-8 px-3 text-xs rounded-sm",default:"h-10 px-4 text-sm rounded-md",lg:"h-11 px-6 text-base rounded-lg",xl:"h-12 px-8 text-lg rounded-lg",icon:"h-10 w-10 rounded-md"},state:{default:"",loading:"cursor-wait",success:"bg-success hover:bg-success-600 text-success-foreground",error:"bg-destructive hover:bg-destructive/90 text-destructive-foreground"}},defaultVariants:{variant:"default",size:"default",state:"default"}}),u=e.forwardRef(({className:b,variant:m,size:p,state:f="default",loading:r=false,loadingText:i,asChild:a$1=false,children:t,disabled:v,...g},h)=>{let x=a$1?Slot:"button",s=v||r,d=o=>{o.preventDefault(),o.stopPropagation();},y=a$1&&s?{onClickCapture:d,onKeyDownCapture:o=>{(o.key==="Enter"||o.key===" ")&&d(o);}}:{},w=["button","input","select","textarea","fieldset","optgroup","option"],B=e.isValidElement(t)&&typeof t.type=="string"&&w.includes(t.type),E=!a$1||B,C=r?"loading":f,n=r&&i?i:t,R=a$1&&n!==t&&e.isValidElement(t)?e.cloneElement(t,void 0,n):n;return e.createElement(x,{className:a(A({variant:m,size:p,state:C,className:b})),ref:h,...E?{disabled:s}:{},"aria-disabled":s,...g,...y},r&&e.createElement("svg",{className:"mr-2 h-4 w-4 animate-spin",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","aria-hidden":"true"},e.createElement("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),e.createElement("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})),e.createElement(Slottable,null,R))});u.displayName="Button";var z=a$1(u);
|
|
3
|
+
export{A as a,z as b};//# sourceMappingURL=chunk-O2VT23LK.js.map
|
|
4
|
+
//# sourceMappingURL=chunk-O2VT23LK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/core/button.tsx"],"names":["buttonVariants","cva","ButtonComponent","className","variant","size","state","loading","loadingText","asChild","children","disabled","props","ref","Component","Slot","isDisabled","blockActivation","event","disabledGuards","NATIVE_DISABLEABLE","slottedIsNativeControl","passNativeDisabled","finalState","label","slotted","cn","Slottable","Button","memo"],"mappings":"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","file":"chunk-O2VT23LK.js","sourcesContent":["import * as React from \"react\";\nimport { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { memo } from \"../../lib/memo\";\n\nconst buttonVariants = cva(\n // Base styles with improved spacing and transitions\n // `aria-disabled:` alongside `disabled:` because `asChild` renders whatever the\n // caller passed - an anchor, usually - and `:disabled` matches only real form\n // controls. Without it a disabled link looked entirely enabled.\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 aria-disabled:opacity-50 aria-disabled:cursor-not-allowed\",\n {\n variants: {\n variant: {\n // Enhanced default with better depth\n default: [\n \"bg-primary text-primary-foreground shadow-md hover:bg-primary/90 hover:shadow-lg\",\n \"active:scale-[0.98] active:shadow-sm\",\n \"border border-primary/20\",\n ],\n // Enhanced secondary with better contrast\n secondary: [\n \"bg-secondary text-secondary-foreground border border-border\",\n \"hover:bg-secondary/80 hover:border-border hover:shadow-sm\",\n \"active:scale-[0.98]\",\n ],\n // Enhanced outline with better focus\n outline: [\n \"border-2 border-border bg-transparent text-foreground\",\n \"hover:bg-muted hover:border-primary hover:text-primary\",\n \"focus-visible:ring-ring/20 focus-visible:border-primary\",\n \"active:scale-[0.98]\",\n ],\n // Enhanced ghost with better hover\n ghost: [\n \"text-foreground hover:bg-muted hover:text-foreground\",\n \"active:bg-muted/80 active:scale-[0.98]\",\n ],\n // Enhanced destructive with better feedback\n destructive: [\n \"bg-destructive text-destructive-foreground shadow-md hover:bg-destructive/90 hover:shadow-lg\",\n \"active:scale-[0.98] active:shadow-sm\",\n \"border border-destructive/20\",\n ],\n // Subtle variant for less prominent actions\n subtle: [\n \"bg-muted text-muted-foreground border border-border\",\n \"hover:bg-muted/80 hover:border-border\",\n \"active:scale-[0.98]\",\n ],\n // Link variant\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n // Improved spacing for consistency\n sm: \"h-8 px-3 text-xs rounded-sm\",\n default: \"h-10 px-4 text-sm rounded-md\",\n lg: \"h-11 px-6 text-base rounded-lg\",\n xl: \"h-12 px-8 text-lg rounded-lg\",\n icon: \"h-10 w-10 rounded-md\",\n },\n // State variants for better feedback\n state: {\n default: \"\",\n loading: \"cursor-wait\",\n success: \"bg-success hover:bg-success-600 text-success-foreground\",\n error:\n \"bg-destructive hover:bg-destructive/90 text-destructive-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n state: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /**\n * Whether to render the button as a separate component (e.g. for Link)\n * @default false\n */\n asChild?: boolean;\n /**\n * Whether the button is in a loading state.\n * When true, automatically sets state to \"loading\" and shows a spinner.\n * @default false\n */\n loading?: boolean;\n /**\n * The loading text to display when loading is true.\n * If not provided, the button's children will be shown.\n * @default undefined\n */\n loadingText?: string;\n /**\n * The visual state of the button.\n * Note: If `loading` is true, this prop is ignored and state becomes \"loading\".\n * Use `state=\"success\"` or `state=\"error\"` for post-action feedback.\n * @default \"default\"\n */\n state?: \"default\" | \"loading\" | \"success\" | \"error\";\n}\n\nconst ButtonComponent = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n variant,\n size,\n state = \"default\",\n loading = false,\n loadingText,\n asChild = false,\n children,\n disabled,\n ...props\n },\n ref,\n ) => {\n const Component = asChild ? Slot : \"button\";\n const isDisabled = disabled || loading;\n\n /**\n * Stops a disabled `asChild` button from doing anything.\n *\n * `disabled` is a form-control attribute. Put it on an anchor - which is what\n * `asChild` usually renders - and the browser ignores it, so\n * `<Button asChild disabled><a href=\"/checkout\">` navigated, ran the caller's\n * onClick, and ran the anchor's own onClick. `aria-disabled` announced a\n * disabled state that nothing implemented.\n *\n * The guards are *capture* handlers, and the phase is the whole point. Radix\n * Slot merges its props with the child's by calling the child's handler\n * first, with no check for `defaultPrevented` - measured, not assumed:\n *\n * child capture -> parent capture -> child onClick -> parent onClick\n *\n * So a bubble-phase handler here would run last, after both onClicks had\n * already fired. From the capture phase, `stopPropagation` reaches the bubble\n * phase before either of them does, and `preventDefault` cancels the\n * navigation.\n *\n * The one thing it cannot intercept is a capture handler on the child itself,\n * which runs before this one. That is rare enough to document rather than\n * design around.\n */\n const blockActivation = (event: React.SyntheticEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const disabledGuards =\n asChild && isDisabled\n ? {\n onClickCapture: blockActivation,\n onKeyDownCapture: (event: React.KeyboardEvent) => {\n // The two keys that activate a link or a button.\n if (event.key === \"Enter\" || event.key === \" \") {\n blockActivation(event);\n }\n },\n }\n : {};\n\n /**\n * `disabled` goes on elements that have it.\n *\n * On an anchor React renders a literal `disabled=\"\"` that means nothing and\n * does nothing. A slotted `<button>` is a different matter, and still gets\n * the real thing.\n */\n const NATIVE_DISABLEABLE = [\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"fieldset\",\n \"optgroup\",\n \"option\",\n ];\n const slottedIsNativeControl =\n React.isValidElement(children) &&\n typeof children.type === \"string\" &&\n NATIVE_DISABLEABLE.includes(children.type);\n const passNativeDisabled = !asChild || slottedIsNativeControl;\n\n // Determine final state: loading prop takes precedence over state prop\n const finalState = loading ? \"loading\" : state;\n\n const label = loading && loadingText ? loadingText : children;\n // With `asChild` the caller's element is what actually renders, so\n // loadingText has to replace the content *inside* it - swapping the element\n // itself for a string would leave Slot with nothing to clone.\n const slotted =\n asChild && label !== children && React.isValidElement(children)\n ? React.cloneElement(children, undefined, label)\n : label;\n\n return (\n <Component\n className={cn(\n buttonVariants({ variant, size, state: finalState, className }),\n )}\n ref={ref}\n {...(passNativeDisabled ? { disabled: isDisabled } : {})}\n aria-disabled={isDisabled}\n {...props}\n // After the spread: a caller's own capture handler does not get to\n // re-enable a disabled button.\n {...disabledGuards}\n >\n {loading && (\n <svg\n className=\"mr-2 h-4 w-4 animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n )}\n {/* Slottable marks the target element for `asChild`, so the spinner can\n sit alongside it. Without it, Slot sees more than one child (the\n falsy spinner expression counts too) and throws Children.only. */}\n <Slottable>{slotted}</Slottable>\n </Component>\n );\n },\n);\nButtonComponent.displayName = \"Button\";\n\n// Memoize Button for performance optimization\nconst Button = memo(ButtonComponent) as typeof ButtonComponent;\n\nexport { Button, buttonVariants };\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var chunk5PVFLXPO_cjs=require('./chunk-5PVFLXPO.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),a=require('react'),C=require('@radix-ui/react-popover'),classVarianceAuthority=require('class-variance-authority'),dateFns=require('date-fns');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var a__default=/*#__PURE__*/_interopDefault(a);var C__namespace=/*#__PURE__*/_interopNamespace(C);var Pe=classVarianceAuthority.cva("inline-block rounded-lg border bg-background shadow-lg",{variants:{variant:{default:"border-border bg-card",outline:"border-2 border-border",ghost:"border-transparent bg-transparent shadow-none"},size:{sm:"p-2",md:"p-3",lg:"p-4"}},defaultVariants:{variant:"default",size:"md"}}),R=classVarianceAuthority.cva("flex items-center justify-center rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"hover:bg-muted text-foreground",selected:"bg-primary text-primary-foreground hover:bg-primary/90 font-semibold",range:"bg-primary/10 text-primary hover:bg-primary/20 font-medium",today:"border-2 border-primary text-foreground font-semibold",outside:"text-muted-foreground",disabled:"text-muted-foreground/50 cursor-not-allowed"},size:{sm:"h-7 w-7 text-xs",md:"h-9 w-9 text-sm",lg:"h-11 w-11 text-base"}},defaultVariants:{variant:"default",size:"md"}}),ee=t=>dateFns.getDaysInMonth(t),Te=(t,r)=>{let o=dateFns.getDay(dateFns.startOfMonth(t));return r===1?o===0?6:o-1:o},x=(t,r)=>!t||!r?false:dateFns.isSameDay(t,r),Se=(t,r,o)=>!r&&!o?false:r&&o?dateFns.isWithinInterval(dateFns.startOfDay(t),{start:dateFns.startOfDay(r),end:dateFns.endOfDay(o)}):r?!dateFns.isBefore(dateFns.startOfDay(t),dateFns.startOfDay(r)):o?!dateFns.isAfter(dateFns.startOfDay(t),dateFns.endOfDay(o)):false,O=(t,r,o,g,m)=>!!(r&&dateFns.isBefore(dateFns.startOfDay(t),dateFns.startOfDay(r))||o&&dateFns.isAfter(dateFns.startOfDay(t),dateFns.endOfDay(o))||g?.some(p=>x(p,t))||m?.includes(dateFns.getDay(t))),P=(t,r="en-US")=>t?new Intl.DateTimeFormat(r,{year:"numeric",month:"short",day:"numeric"}).format(t):"",Le=(t,r,o="en-US")=>!t&&!r?"":t&&r?`${P(t,o)} - ${P(r,o)}`:t?P(t,o):r?P(r,o):"",Ee=(t,r="en-US",o=g=>`${g} dates selected`)=>t.length===0?"":t.length===1?P(t[0],r):o(t.length),Ie=(t,r)=>{let o=new Intl.DateTimeFormat(t,{weekday:"short"}),g=Array.from({length:7},(m,p)=>o.format(new Date(2024,0,7+p)));return r===1?[...g.slice(1),g[0]]:g},Ye={openCalendar:"Open calendar",placeholder:"Select date...",previousMonth:"Previous month",nextMonth:"Next month",today:"Today",selectEndDate:"Select end date",multipleSelected:t=>`${t} dates selected`},te=t=>{if(t)return t instanceof Date?t:Array.isArray(t)?t[0]:t.from??t.to},F=(t,r,o,g=366)=>{let m=new Date(t);for(let p=0;p<g;p++){if(!o(m))return new Date(m);m.setDate(m.getDate()+r);}},q=(t,r)=>{let o=new Date(t.getFullYear(),t.getMonth()+r,1),g=dateFns.getDaysInMonth(o);return o.setDate(Math.min(t.getDate(),g)),o},Ve=a__default.default.forwardRef(({mode:t="single",value:r,defaultValue:o,onChange:g,minDate:m,maxDate:p,disabledDates:I,disabledDays:Y,locale:v="en-US",placeholder:ie,label:U,error:H,helperText:W,className:le,inputClassName:de,calendarClassName:ue,variant:fe,size:K,showOutsideDays:T=true,firstDayOfWeek:V=1,labels:J,...ce},ge)=>{let y=a.useMemo(()=>({...Ye,...J}),[J]),[S,L]=a.useState(false),[c,$]=a.useState(()=>te(r??o)??new Date),[h,E]=a.useState(null),me=a.useRef(null),j=a.useRef(new Map),[De,pe]=a.useState(o),Q=r!==void 0,f=Q?r:De,M=a__default.default.useCallback(e=>O(e,m,p,I,Y),[m,p,I,Y]);a__default.default.useLayoutEffect(()=>{if(!S||h)return;let e=dateFns.startOfDay(new Date),s=[te(f),e].find(d=>!!d&&!M(d));if(s){E(dateFns.startOfDay(s));return}let i=dateFns.startOfMonth(c),l=F(i,1,M,dateFns.getDaysInMonth(c));l&&E(l);},[S,h,f,c,M]);let N=e=>{Q||pe(e),g?.(e);},_=e=>{if(!O(e,m,p,I,Y)){if(t==="single")N(e),L(false);else if(t==="range"){let n=f;if(!n?.from||n.from&&n.to)N({from:e});else {let s=n.from,i=e;i<s?N({from:i,to:s}):N({from:s,to:i}),L(false);}}else if(t==="multiple"){let n=f||[],s=n.findIndex(i=>x(i,e));s>=0?N(n.filter((i,l)=>l!==s)):N([...n,e]);}}},he=a.useMemo(()=>{if(!f)return "";if(t==="single")return P(f,v);if(t==="range"){let e=f;return Le(e.from,e.to,v)}else return Ee(f,v,y.multipleSelected)},[f,t,v,y.multipleSelected]),be=a.useMemo(()=>{let e=[],n=new Date;n.setHours(0,0,0,0);let s=Te(c,V),i=ee(c);if(s>0){let l=new Date(c.getFullYear(),c.getMonth()-1),d=ee(l);for(let D=d-s+1;D<=d;D++){let u=new Date(l.getFullYear(),l.getMonth(),D);e.push({date:u,isCurrentMonth:false,isToday:x(u,n),placeholder:!T});}}for(let l=1;l<=i;l++){let d=new Date(c.getFullYear(),c.getMonth(),l);e.push({date:d,isCurrentMonth:true,isToday:x(d,n)});}if(T){let l=42-e.length,d=new Date(c.getFullYear(),c.getMonth()+1);for(let D=1;D<=l;D++){let u=new Date(d.getFullYear(),d.getMonth(),D);e.push({date:u,isCurrentMonth:false,isToday:x(u,n)});}}return e},[c,T,V]),X=e=>{let n=new Date(c.getFullYear(),c.getMonth()+e,1);if($(n),!h)return;let s=q(h,e),i=F(s,1,M,dateFns.getDaysInMonth(n))??F(s,-1,M,dateFns.getDaysInMonth(n));i&&E(i);},ve=()=>X(-1),ye=()=>X(1),Me=()=>{let e=dateFns.startOfDay(new Date);$(e);let n=F(e,1,M,31)??F(e,-1,M,31);n&&E(n);},we=(e,n)=>{if(e.key==="Enter"||e.key===" "){e.preventDefault(),_(n);return}let s=(l,d,D)=>{let u=F(l,d,M,D);u&&(E(u),(u.getMonth()!==c.getMonth()||u.getFullYear()!==c.getFullYear())&&$(new Date(u.getFullYear(),u.getMonth(),1)));},i=l=>{let d=new Date(n);d.setDate(d.getDate()+l),s(d,l>0?1:-1);};if(e.key==="ArrowRight"){e.preventDefault(),i(1);return}if(e.key==="ArrowLeft"){e.preventDefault(),i(-1);return}if(e.key==="ArrowDown"){e.preventDefault(),i(7);return}if(e.key==="ArrowUp"){e.preventDefault(),i(-7);return}if(e.key==="Home"){e.preventDefault(),s(new Date(n.getFullYear(),n.getMonth(),1),1,dateFns.getDaysInMonth(n));return}if(e.key==="End"){e.preventDefault(),s(new Date(n.getFullYear(),n.getMonth()+1,0),-1,dateFns.getDaysInMonth(n));return}if(e.key==="PageUp"){e.preventDefault(),s(q(n,-1),-1);return}if(e.key==="PageDown"){e.preventDefault(),s(q(n,1),1);return}if(e.key==="Escape"){e.preventDefault(),L(false);return}};a.useEffect(()=>{if(h&&S){let e=`${h.getFullYear()}-${h.getMonth()}-${h.getDate()}`,n=j.current.get(e);n&&n.focus();}},[h,S]);let xe=a.useMemo(()=>Ie(v,V),[v,V]),Ce=c.toLocaleDateString(v,{month:"long",year:"numeric"});return a__default.default.createElement("div",{ref:ge,className:chunkITRGJNWL_cjs.a("w-full",le),...ce},a__default.default.createElement(C__namespace.Root,{open:S,onOpenChange:L},a__default.default.createElement("div",{className:"space-y-2"},U&&a__default.default.createElement("label",{className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},U),a__default.default.createElement(C__namespace.Trigger,{asChild:true},a__default.default.createElement("button",{type:"button",className:chunkITRGJNWL_cjs.a("flex w-full rounded-md border bg-background px-3 py-2 text-sm ring-offset-background","placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 text-left",H?"border-error-500 shadow-sm hover:border-error-600 focus-visible:ring-error-500/20 focus-visible:border-error-500":"border-border shadow-sm hover:border-primary focus-visible:ring-ring/20 focus-visible:border-primary","h-10",de),onClick:()=>L(true),"aria-label":U||y.openCalendar,"aria-invalid":H},he||a__default.default.createElement("span",{className:"text-muted-foreground"},ie??y.placeholder))),W&&a__default.default.createElement("p",{className:chunkITRGJNWL_cjs.a("text-sm text-muted-foreground",H&&"text-error-600")},W)),a__default.default.createElement(C__namespace.Portal,null,a__default.default.createElement(C__namespace.Content,{className:chunkITRGJNWL_cjs.a("z-50 w-auto rounded-lg border bg-popover p-4 shadow-lg","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"),sideOffset:5,align:"start"},a__default.default.createElement("div",{ref:me,className:chunkITRGJNWL_cjs.a(Pe({variant:fe,size:K}),ue),role:"application","aria-label":"Calendar"},a__default.default.createElement("div",{className:"flex items-center justify-between mb-4"},a__default.default.createElement("div",{className:"flex items-center gap-2"},a__default.default.createElement(chunk5PVFLXPO_cjs.b,{variant:"ghost",size:"sm",onClick:ve,"aria-label":y.previousMonth},a__default.default.createElement("svg",{className:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},a__default.default.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"}))),a__default.default.createElement("h3",{className:"text-sm font-semibold text-popover-foreground","data-testid":"calendar-month-year"},Ce),a__default.default.createElement(chunk5PVFLXPO_cjs.b,{variant:"ghost",size:"sm",onClick:ye,"aria-label":y.nextMonth},a__default.default.createElement("svg",{className:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},a__default.default.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})))),a__default.default.createElement(chunk5PVFLXPO_cjs.b,{variant:"ghost",size:"sm",onClick:Me,className:"text-xs"},y.today)),a__default.default.createElement("div",{className:"grid grid-cols-7 gap-1 mb-2"},xe.map(e=>a__default.default.createElement("div",{key:e,className:"text-center text-xs font-medium text-muted-foreground"},e))),a__default.default.createElement("div",{className:"grid grid-cols-7 gap-1"},be.map((e,n)=>{let s=t==="single"?x(e.date,f):t==="range"?Se(e.date,f?.from,f?.to):f?.some(u=>x(u,e.date)),i=O(e.date,m,p,I,Y),l=t==="range"&&f?.from&&!f?.to&&e.date>=f.from,d=`${e.date.getFullYear()}-${e.date.getMonth()}-${e.date.getDate()}`,D=h&&x(e.date,h);return e.placeholder?a__default.default.createElement("div",{key:`placeholder-${n}`,"aria-hidden":"true","data-calendar-placeholder":"",className:chunkITRGJNWL_cjs.a(R({variant:"default",size:K}),"invisible")}):a__default.default.createElement("button",{key:`${e.date.getTime()}-${n}`,ref:u=>{u?j.current.set(d,u):j.current.delete(d);},type:"button",onClick:()=>{T&&!e.isCurrentMonth&&$(new Date(e.date.getFullYear(),e.date.getMonth(),1)),_(e.date);},onKeyDown:u=>we(u,e.date),disabled:i||(T?false:!e.isCurrentMonth),className:chunkITRGJNWL_cjs.a(R({variant:s?"selected":l?"range":e.isToday?"today":e.isCurrentMonth?i?"disabled":"default":"outside",size:K}),!e.isCurrentMonth&&"opacity-50",D&&"ring-2 ring-brand-500 ring-offset-2 z-10"),"aria-label":e.date.toLocaleDateString(v,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),"aria-selected":s,"aria-disabled":i,tabIndex:D?0:-1},e.date.getDate())})),t==="range"&&f?.from&&!f?.to&&a__default.default.createElement("div",{className:"mt-4 pt-4 border-t border-border"},a__default.default.createElement("p",{className:"text-xs text-muted-foreground text-center"},y.selectEndDate)))))))});Ve.displayName="Calendar";exports.a=Pe;exports.b=R;exports.c=Ve;//# sourceMappingURL=chunk-4UHGGKCS.cjs.map
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
2
|
+
'use strict';var chunk6UIT6XQH_cjs=require('./chunk-6UIT6XQH.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),a=require('react'),C=require('@radix-ui/react-popover'),classVarianceAuthority=require('class-variance-authority'),dateFns=require('date-fns');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var a__default=/*#__PURE__*/_interopDefault(a);var C__namespace=/*#__PURE__*/_interopNamespace(C);var Pe=classVarianceAuthority.cva("inline-block rounded-lg border bg-background shadow-lg",{variants:{variant:{default:"border-border bg-card",outline:"border-2 border-border",ghost:"border-transparent bg-transparent shadow-none"},size:{sm:"p-2",md:"p-3",lg:"p-4"}},defaultVariants:{variant:"default",size:"md"}}),R=classVarianceAuthority.cva("flex items-center justify-center rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"hover:bg-muted text-foreground",selected:"bg-primary text-primary-foreground hover:bg-primary/90 font-semibold",range:"bg-primary/10 text-primary hover:bg-primary/20 font-medium",today:"border-2 border-primary text-foreground font-semibold",outside:"text-muted-foreground",disabled:"text-muted-foreground/50 cursor-not-allowed"},size:{sm:"h-7 w-7 text-xs",md:"h-9 w-9 text-sm",lg:"h-11 w-11 text-base"}},defaultVariants:{variant:"default",size:"md"}}),ee=t=>dateFns.getDaysInMonth(t),Te=(t,r)=>{let o=dateFns.getDay(dateFns.startOfMonth(t));return r===1?o===0?6:o-1:o},x=(t,r)=>!t||!r?false:dateFns.isSameDay(t,r),Se=(t,r,o)=>!r&&!o?false:r&&o?dateFns.isWithinInterval(dateFns.startOfDay(t),{start:dateFns.startOfDay(r),end:dateFns.endOfDay(o)}):r?!dateFns.isBefore(dateFns.startOfDay(t),dateFns.startOfDay(r)):o?!dateFns.isAfter(dateFns.startOfDay(t),dateFns.endOfDay(o)):false,O=(t,r,o,g,m)=>!!(r&&dateFns.isBefore(dateFns.startOfDay(t),dateFns.startOfDay(r))||o&&dateFns.isAfter(dateFns.startOfDay(t),dateFns.endOfDay(o))||g?.some(p=>x(p,t))||m?.includes(dateFns.getDay(t))),P=(t,r="en-US")=>t?new Intl.DateTimeFormat(r,{year:"numeric",month:"short",day:"numeric"}).format(t):"",Le=(t,r,o="en-US")=>!t&&!r?"":t&&r?`${P(t,o)} - ${P(r,o)}`:t?P(t,o):r?P(r,o):"",Ee=(t,r="en-US",o=g=>`${g} dates selected`)=>t.length===0?"":t.length===1?P(t[0],r):o(t.length),Ie=(t,r)=>{let o=new Intl.DateTimeFormat(t,{weekday:"short"}),g=Array.from({length:7},(m,p)=>o.format(new Date(2024,0,7+p)));return r===1?[...g.slice(1),g[0]]:g},Ye={openCalendar:"Open calendar",placeholder:"Select date...",previousMonth:"Previous month",nextMonth:"Next month",today:"Today",selectEndDate:"Select end date",multipleSelected:t=>`${t} dates selected`},te=t=>{if(t)return t instanceof Date?t:Array.isArray(t)?t[0]:t.from??t.to},F=(t,r,o,g=366)=>{let m=new Date(t);for(let p=0;p<g;p++){if(!o(m))return new Date(m);m.setDate(m.getDate()+r);}},q=(t,r)=>{let o=new Date(t.getFullYear(),t.getMonth()+r,1),g=dateFns.getDaysInMonth(o);return o.setDate(Math.min(t.getDate(),g)),o},Ve=a__default.default.forwardRef(({mode:t="single",value:r,defaultValue:o,onChange:g,minDate:m,maxDate:p,disabledDates:I,disabledDays:Y,locale:v="en-US",placeholder:ie,label:U,error:H,helperText:W,className:le,inputClassName:de,calendarClassName:ue,variant:fe,size:K,showOutsideDays:T=true,firstDayOfWeek:V=1,labels:J,...ce},ge)=>{let y=a.useMemo(()=>({...Ye,...J}),[J]),[S,L]=a.useState(false),[c,$]=a.useState(()=>te(r??o)??new Date),[h,E]=a.useState(null),me=a.useRef(null),j=a.useRef(new Map),[De,pe]=a.useState(o),Q=r!==void 0,f=Q?r:De,M=a__default.default.useCallback(e=>O(e,m,p,I,Y),[m,p,I,Y]);a__default.default.useLayoutEffect(()=>{if(!S||h)return;let e=dateFns.startOfDay(new Date),s=[te(f),e].find(d=>!!d&&!M(d));if(s){E(dateFns.startOfDay(s));return}let i=dateFns.startOfMonth(c),l=F(i,1,M,dateFns.getDaysInMonth(c));l&&E(l);},[S,h,f,c,M]);let N=e=>{Q||pe(e),g?.(e);},_=e=>{if(!O(e,m,p,I,Y)){if(t==="single")N(e),L(false);else if(t==="range"){let n=f;if(!n?.from||n.from&&n.to)N({from:e});else {let s=n.from,i=e;i<s?N({from:i,to:s}):N({from:s,to:i}),L(false);}}else if(t==="multiple"){let n=f||[],s=n.findIndex(i=>x(i,e));s>=0?N(n.filter((i,l)=>l!==s)):N([...n,e]);}}},he=a.useMemo(()=>{if(!f)return "";if(t==="single")return P(f,v);if(t==="range"){let e=f;return Le(e.from,e.to,v)}else return Ee(f,v,y.multipleSelected)},[f,t,v,y.multipleSelected]),be=a.useMemo(()=>{let e=[],n=new Date;n.setHours(0,0,0,0);let s=Te(c,V),i=ee(c);if(s>0){let l=new Date(c.getFullYear(),c.getMonth()-1),d=ee(l);for(let D=d-s+1;D<=d;D++){let u=new Date(l.getFullYear(),l.getMonth(),D);e.push({date:u,isCurrentMonth:false,isToday:x(u,n),placeholder:!T});}}for(let l=1;l<=i;l++){let d=new Date(c.getFullYear(),c.getMonth(),l);e.push({date:d,isCurrentMonth:true,isToday:x(d,n)});}if(T){let l=42-e.length,d=new Date(c.getFullYear(),c.getMonth()+1);for(let D=1;D<=l;D++){let u=new Date(d.getFullYear(),d.getMonth(),D);e.push({date:u,isCurrentMonth:false,isToday:x(u,n)});}}return e},[c,T,V]),X=e=>{let n=new Date(c.getFullYear(),c.getMonth()+e,1);if($(n),!h)return;let s=q(h,e),i=F(s,1,M,dateFns.getDaysInMonth(n))??F(s,-1,M,dateFns.getDaysInMonth(n));i&&E(i);},ve=()=>X(-1),ye=()=>X(1),Me=()=>{let e=dateFns.startOfDay(new Date);$(e);let n=F(e,1,M,31)??F(e,-1,M,31);n&&E(n);},we=(e,n)=>{if(e.key==="Enter"||e.key===" "){e.preventDefault(),_(n);return}let s=(l,d,D)=>{let u=F(l,d,M,D);u&&(E(u),(u.getMonth()!==c.getMonth()||u.getFullYear()!==c.getFullYear())&&$(new Date(u.getFullYear(),u.getMonth(),1)));},i=l=>{let d=new Date(n);d.setDate(d.getDate()+l),s(d,l>0?1:-1);};if(e.key==="ArrowRight"){e.preventDefault(),i(1);return}if(e.key==="ArrowLeft"){e.preventDefault(),i(-1);return}if(e.key==="ArrowDown"){e.preventDefault(),i(7);return}if(e.key==="ArrowUp"){e.preventDefault(),i(-7);return}if(e.key==="Home"){e.preventDefault(),s(new Date(n.getFullYear(),n.getMonth(),1),1,dateFns.getDaysInMonth(n));return}if(e.key==="End"){e.preventDefault(),s(new Date(n.getFullYear(),n.getMonth()+1,0),-1,dateFns.getDaysInMonth(n));return}if(e.key==="PageUp"){e.preventDefault(),s(q(n,-1),-1);return}if(e.key==="PageDown"){e.preventDefault(),s(q(n,1),1);return}if(e.key==="Escape"){e.preventDefault(),L(false);return}};a.useEffect(()=>{if(h&&S){let e=`${h.getFullYear()}-${h.getMonth()}-${h.getDate()}`,n=j.current.get(e);n&&n.focus();}},[h,S]);let xe=a.useMemo(()=>Ie(v,V),[v,V]),Ce=c.toLocaleDateString(v,{month:"long",year:"numeric"});return a__default.default.createElement("div",{ref:ge,className:chunkITRGJNWL_cjs.a("w-full",le),...ce},a__default.default.createElement(C__namespace.Root,{open:S,onOpenChange:L},a__default.default.createElement("div",{className:"space-y-2"},U&&a__default.default.createElement("label",{className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},U),a__default.default.createElement(C__namespace.Trigger,{asChild:true},a__default.default.createElement("button",{type:"button",className:chunkITRGJNWL_cjs.a("flex w-full rounded-md border bg-background px-3 py-2 text-sm ring-offset-background","placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2","disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200 text-left",H?"border-error-500 shadow-sm hover:border-error-600 focus-visible:ring-error-500/20 focus-visible:border-error-500":"border-border shadow-sm hover:border-primary focus-visible:ring-ring/20 focus-visible:border-primary","h-10",de),onClick:()=>L(true),"aria-label":U||y.openCalendar,"aria-invalid":H},he||a__default.default.createElement("span",{className:"text-muted-foreground"},ie??y.placeholder))),W&&a__default.default.createElement("p",{className:chunkITRGJNWL_cjs.a("text-sm text-muted-foreground",H&&"text-error-600")},W)),a__default.default.createElement(C__namespace.Portal,null,a__default.default.createElement(C__namespace.Content,{className:chunkITRGJNWL_cjs.a("z-50 w-auto rounded-lg border bg-popover p-4 shadow-lg","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2","data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2"),sideOffset:5,align:"start"},a__default.default.createElement("div",{ref:me,className:chunkITRGJNWL_cjs.a(Pe({variant:fe,size:K}),ue),role:"application","aria-label":"Calendar"},a__default.default.createElement("div",{className:"flex items-center justify-between mb-4"},a__default.default.createElement("div",{className:"flex items-center gap-2"},a__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",onClick:ve,"aria-label":y.previousMonth},a__default.default.createElement("svg",{className:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},a__default.default.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 19l-7-7 7-7"}))),a__default.default.createElement("h3",{className:"text-sm font-semibold text-popover-foreground","data-testid":"calendar-month-year"},Ce),a__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",onClick:ye,"aria-label":y.nextMonth},a__default.default.createElement("svg",{className:"h-4 w-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},a__default.default.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 5l7 7-7 7"})))),a__default.default.createElement(chunk6UIT6XQH_cjs.b,{variant:"ghost",size:"sm",onClick:Me,className:"text-xs"},y.today)),a__default.default.createElement("div",{className:"grid grid-cols-7 gap-1 mb-2"},xe.map(e=>a__default.default.createElement("div",{key:e,className:"text-center text-xs font-medium text-muted-foreground"},e))),a__default.default.createElement("div",{className:"grid grid-cols-7 gap-1"},be.map((e,n)=>{let s=t==="single"?x(e.date,f):t==="range"?Se(e.date,f?.from,f?.to):f?.some(u=>x(u,e.date)),i=O(e.date,m,p,I,Y),l=t==="range"&&f?.from&&!f?.to&&e.date>=f.from,d=`${e.date.getFullYear()}-${e.date.getMonth()}-${e.date.getDate()}`,D=h&&x(e.date,h);return e.placeholder?a__default.default.createElement("div",{key:`placeholder-${n}`,"aria-hidden":"true","data-calendar-placeholder":"",className:chunkITRGJNWL_cjs.a(R({variant:"default",size:K}),"invisible")}):a__default.default.createElement("button",{key:`${e.date.getTime()}-${n}`,ref:u=>{u?j.current.set(d,u):j.current.delete(d);},type:"button",onClick:()=>{T&&!e.isCurrentMonth&&$(new Date(e.date.getFullYear(),e.date.getMonth(),1)),_(e.date);},onKeyDown:u=>we(u,e.date),disabled:i||(T?false:!e.isCurrentMonth),className:chunkITRGJNWL_cjs.a(R({variant:s?"selected":l?"range":e.isToday?"today":e.isCurrentMonth?i?"disabled":"default":"outside",size:K}),!e.isCurrentMonth&&"opacity-50",D&&"ring-2 ring-brand-500 ring-offset-2 z-10"),"aria-label":e.date.toLocaleDateString(v,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),"aria-selected":s,"aria-disabled":i,tabIndex:D?0:-1},e.date.getDate())})),t==="range"&&f?.from&&!f?.to&&a__default.default.createElement("div",{className:"mt-4 pt-4 border-t border-border"},a__default.default.createElement("p",{className:"text-xs text-muted-foreground text-center"},y.selectEndDate)))))))});Ve.displayName="Calendar";exports.a=Pe;exports.b=R;exports.c=Ve;//# sourceMappingURL=chunk-RKAXTJFB.cjs.map
|
|
3
|
+
//# sourceMappingURL=chunk-RKAXTJFB.cjs.map
|