@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.
Files changed (55) hide show
  1. package/dist/chunk-6UIT6XQH.cjs +4 -0
  2. package/dist/chunk-6UIT6XQH.cjs.map +1 -0
  3. package/dist/{chunk-BDRP7ALG.cjs → chunk-7AKJCOPP.cjs} +2 -2
  4. package/dist/{chunk-BDRP7ALG.cjs.map → chunk-7AKJCOPP.cjs.map} +1 -1
  5. package/dist/{chunk-A4ODFRMS.js → chunk-7YBS3JIS.js} +2 -2
  6. package/dist/{chunk-A4ODFRMS.js.map → chunk-7YBS3JIS.js.map} +1 -1
  7. package/dist/{chunk-CT6LEOBW.js → chunk-BQPFZMGP.js} +2 -2
  8. package/dist/{chunk-CT6LEOBW.js.map → chunk-BQPFZMGP.js.map} +1 -1
  9. package/dist/chunk-INZNS2ZP.cjs +3 -0
  10. package/dist/chunk-INZNS2ZP.cjs.map +1 -0
  11. package/dist/chunk-JVFOPCT4.cjs +3 -0
  12. package/dist/chunk-JVFOPCT4.cjs.map +1 -0
  13. package/dist/chunk-LQB4PD53.js +3 -0
  14. package/dist/chunk-LQB4PD53.js.map +1 -0
  15. package/dist/chunk-O2VT23LK.js +4 -0
  16. package/dist/chunk-O2VT23LK.js.map +1 -0
  17. package/dist/{chunk-4UHGGKCS.cjs → chunk-RKAXTJFB.cjs} +2 -2
  18. package/dist/{chunk-4UHGGKCS.cjs.map → chunk-RKAXTJFB.cjs.map} +1 -1
  19. package/dist/{chunk-NM5NVIAK.js → chunk-RPY5NLM7.js} +2 -2
  20. package/dist/{chunk-NM5NVIAK.js.map → chunk-RPY5NLM7.js.map} +1 -1
  21. package/dist/{chunk-PZLBMQGI.cjs → chunk-RQIC6NLV.cjs} +2 -2
  22. package/dist/{chunk-PZLBMQGI.cjs.map → chunk-RQIC6NLV.cjs.map} +1 -1
  23. package/dist/chunk-ZLKYFVIL.js +3 -0
  24. package/dist/chunk-ZLKYFVIL.js.map +1 -0
  25. package/dist/components/core/alert-dialog.cjs +1 -1
  26. package/dist/components/core/alert-dialog.js +1 -1
  27. package/dist/components/core/button.cjs +1 -1
  28. package/dist/components/core/button.js +1 -1
  29. package/dist/components/core/calendar.cjs +1 -1
  30. package/dist/components/core/calendar.js +1 -1
  31. package/dist/components/core/carousel.cjs +1 -1
  32. package/dist/components/core/carousel.js +1 -1
  33. package/dist/components/marketing/gallery.cjs +1 -1
  34. package/dist/components/marketing/gallery.d.cts +4 -4
  35. package/dist/components/marketing/gallery.d.ts +4 -4
  36. package/dist/components/marketing/gallery.js +1 -1
  37. package/dist/components/marketing/pricing.cjs +1 -1
  38. package/dist/components/marketing/pricing.d.cts +17 -2
  39. package/dist/components/marketing/pricing.d.ts +17 -2
  40. package/dist/components/marketing/pricing.js +1 -1
  41. package/dist/index.cjs +1 -1
  42. package/dist/index.js +1 -1
  43. package/package.json +1 -1
  44. package/dist/chunk-2JQROMCM.js +0 -3
  45. package/dist/chunk-2JQROMCM.js.map +0 -1
  46. package/dist/chunk-44HISN45.js +0 -3
  47. package/dist/chunk-44HISN45.js.map +0 -1
  48. package/dist/chunk-5PVFLXPO.cjs +0 -4
  49. package/dist/chunk-5PVFLXPO.cjs.map +0 -1
  50. package/dist/chunk-7PPAI3MM.cjs +0 -3
  51. package/dist/chunk-7PPAI3MM.cjs.map +0 -1
  52. package/dist/chunk-AVTJE2O2.js +0 -4
  53. package/dist/chunk-AVTJE2O2.js.map +0 -1
  54. package/dist/chunk-OEN63W3G.cjs +0 -3
  55. package/dist/chunk-OEN63W3G.cjs.map +0 -1
@@ -1,3 +0,0 @@
1
- "use client";
2
- 'use strict';var chunk5PVFLXPO_cjs=require('./chunk-5PVFLXPO.cjs'),chunkITRGJNWL_cjs=require('./chunk-ITRGJNWL.cjs'),e=require('react'),classVarianceAuthority=require('class-variance-authority');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var e__default=/*#__PURE__*/_interopDefault(e);var S=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"}}),q=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"}}),A=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:y,itemClassName:k,columns:w=3,spacing:N="md",showLightbox:g=true,lightboxAnimation:I="fade",onImageClick:v,itemHover:V="scale",itemAspectRatio:C="square",showThumbnails:z=false,thumbnailSize:D="md",...P})=>{let[l,r]=e.useState(null),[i,n]=e.useState(-1),f=e.useCallback((t,s)=>{g&&(r(t),n(s)),v?.(t,s);},[g,v]),d=e.useCallback(()=>{r(null),n(-1);},[]),b=e.useCallback(()=>{if(i>0){let t=i-1;r(a[t]||null),n(t);}},[i,a]),p=e.useCallback(()=>{if(i<a.length-1){let t=i+1;r(a[t]||null),n(t);}},[i,a]),G=e.useCallback(t=>{t.key==="Escape"?d():t.key==="ArrowLeft"?b():t.key==="ArrowRight"&&p();},[d,b,p]);return e__default.default.createElement(e__default.default.Fragment,null,e__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(S({columns:w,spacing:N}),y),...P},a.map((t,s)=>e__default.default.createElement("div",{key:t.id||s,className:chunkITRGJNWL_cjs.a(q({aspectRatio:C,hover:V}),k),role:"button",tabIndex:0,onClick:()=>f(t,s),onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),f(t,s));},"aria-label":`View image ${s+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)))))),l&&g&&e__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(A({animation:I})),onClick:d,onKeyDown:G,tabIndex:-1,role:"dialog","aria-modal":"true","aria-labelledby":"lightbox-title"},e__default.default.createElement("div",{className:"relative max-w-4xl max-h-[90vh] mx-4",onClick:t=>t.stopPropagation()},e__default.default.createElement("img",{src:l.src,alt:l.alt,className:"max-w-full max-h-full object-contain rounded-lg",id:"lightbox-title"}),(l.title||l.description)&&e__default.default.createElement("div",{className:"absolute bottom-0 left-0 right-0 bg-black/80 text-white p-4 rounded-b-lg"},l.title&&e__default.default.createElement("h3",{className:"font-semibold text-lg mb-2"},l.title),l.description&&e__default.default.createElement("p",{className:"text-sm text-white/80"},l.description)),a.length>1&&e__default.default.createElement(e__default.default.Fragment,null,i>0&&e__default.default.createElement(chunk5PVFLXPO_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:b,"aria-label":"Previous image"},"\u2190"),i<a.length-1&&e__default.default.createElement(chunk5PVFLXPO_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:p,"aria-label":"Next image"},"\u2192")),e__default.default.createElement(chunk5PVFLXPO_cjs.b,{variant:"ghost",size:"sm",className:"absolute top-4 right-4 bg-black/50 hover:bg-black/70 text-white",onClick:d,"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"},i+1," / ",a.length))))},F=B;exports.a=B;exports.b=F;//# sourceMappingURL=chunk-7PPAI3MM.cjs.map
3
- //# sourceMappingURL=chunk-7PPAI3MM.cjs.map
@@ -1 +0,0 @@
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","handleImageClick","useCallback","image","index","handleCloseLightbox","handlePrevious","newIndex","handleNext","handleKeyDown","e","React","cn","Button","gallery_default"],"mappings":"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","file":"chunk-7PPAI3MM.cjs","sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../../components/core/button';\n\nconst galleryVariants = cva(\n 'grid gap-4',\n {\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);\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 const handleImageClick = useCallback((image: GalleryImage, index: number) => {\n if (showLightbox) {\n setSelectedImage(image);\n setSelectedIndex(index);\n }\n onImageClick?.(image, index);\n }, [showLightbox, onImageClick]);\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 const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleCloseLightbox();\n } else if (e.key === 'ArrowLeft') {\n handlePrevious();\n } else if (e.key === 'ArrowRight') {\n handleNext();\n }\n }, [handleCloseLightbox, handlePrevious, handleNext]);\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={() => handleImageClick(image, index)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleImageClick(image, index);\n }\n }}\n aria-label={`View image ${index + 1}: ${image.alt}`}\n >\n <img\n src={showThumbnails && image.thumbnail ? image.thumbnail : image.src}\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 {selectedImage && showLightbox && (\n <div\n className={cn(lightboxVariants({ animation: lightboxAnimation }))}\n onClick={handleCloseLightbox}\n onKeyDown={handleKeyDown}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"lightbox-title\"\n >\n <div \n className=\"relative max-w-4xl max-h-[90vh] mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <img\n src={selectedImage.src}\n alt={selectedImage.alt}\n className=\"max-w-full max-h-full object-contain rounded-lg\"\n id=\"lightbox-title\"\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 <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"absolute top-4 right-4 bg-black/50 hover:bg-black/70 text-white\"\n onClick={handleCloseLightbox}\n aria-label=\"Close lightbox\"\n >\n ✕\n </Button>\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 </div>\n )}\n </>\n );\n};\n\nexport default Gallery;\n"]}
@@ -1,4 +0,0 @@
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 C=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",{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"}}),c=e.forwardRef(({className:u,variant:l,size:m,state:b="default",loading:t=false,loadingText:s,asChild:a$1=false,children:r,disabled:v,...f},g)=>{let p=a$1?Slot:"button",n=v||t,h=t?"loading":b,o=t&&s?s:r,x=a$1&&o!==r&&e.isValidElement(r)?e.cloneElement(r,void 0,o):o;return e.createElement(p,{className:a(C({variant:l,size:m,state:h,className:u})),ref:g,disabled:n,"aria-disabled":n,...f},t&&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,x))});c.displayName="Button";var E=a$1(c);
3
- export{C as a,E as b};//# sourceMappingURL=chunk-AVTJE2O2.js.map
4
- //# sourceMappingURL=chunk-AVTJE2O2.js.map
@@ -1 +0,0 @@
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","finalState","label","slotted","cn","Slottable","Button","memo"],"mappings":"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","file":"chunk-AVTJE2O2.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 \"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\",\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 // 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 disabled={isDisabled}\n aria-disabled={isDisabled}\n {...props}\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 +0,0 @@
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 f=classVarianceAuthority.cva("py-16 md:py-24",{variants:{variant:{default:"bg-background",muted:"bg-muted/30",accent:"bg-accent/10"}},defaultVariants:{variant:"default"}}),b=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"}}),y=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"}}),h=({plans:c,title:s,subtitle:o,columns:l,variant:u,className:g,showYearly:a=false,onToggleBilling:m,...p})=>{let x=(t,d="USD")=>new Intl.NumberFormat("en-US",{style:"currency",currency:d,minimumFractionDigits:0}).format(t);return r__default.default.createElement("section",{className:chunkITRGJNWL_cjs.a(f({variant:u}),g),...p},r__default.default.createElement("div",{className:"container mx-auto px-4"},(s||o)&&r__default.default.createElement("div",{className:"text-center mb-12"},s&&r__default.default.createElement("h2",{className:"text-3xl md:text-4xl font-bold tracking-tight mb-4"},s),o&&r__default.default.createElement("p",{className:"text-lg text-muted-foreground max-w-2xl mx-auto mb-8"},o),m&&r__default.default.createElement("div",{className:"flex items-center justify-center gap-4 mb-8"},r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",!a&&"text-foreground font-medium")},"Monthly"),r__default.default.createElement("button",{onClick:()=>m(!a),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",a?"translate-x-6":"translate-x-1")})),r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",a&&"text-foreground font-medium")},"Yearly",r__default.default.createElement("span",{className:"ml-1 text-xs text-success-600"},"(Save 20%)")))),r__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(b({columns:l}))},c.map((t,d)=>r__default.default.createElement("div",{key:t.id||d,className:chunkITRGJNWL_cjs.a(v({variant:t.popular?"popular":"default"}),t.popular&&"scale-105")},t.badge&&r__default.default.createElement("div",{className:chunkITRGJNWL_cjs.a(y({variant:t.badge.variant}))},t.badge.text),r__default.default.createElement("div",{className:"text-center mb-6"},r__default.default.createElement("h3",{className:"text-2xl font-bold mb-2"},t.name),t.description&&r__default.default.createElement("p",{className:"text-muted-foreground text-sm mb-4"},t.description),r__default.default.createElement("div",{className:"mb-4"},r__default.default.createElement("span",{className:"text-4xl font-bold"},x(a&&t.price.yearly?t.price.yearly:t.price.monthly,t.currency)),r__default.default.createElement("span",{className:"text-muted-foreground ml-1"},"/",t.period||(a?"year":"month")))),r__default.default.createElement("ul",{className:"space-y-3 mb-8"},t.features.map(n=>r__default.default.createElement("li",{key:n.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",n.included?"bg-success-100 text-success-600":"bg-muted text-muted-foreground")},n.included?"\u2713":"\u2717"),r__default.default.createElement("span",{className:chunkITRGJNWL_cjs.a("text-sm",!n.included&&"text-muted-foreground line-through")},n.name)))),r__default.default.createElement("button",{className:chunkITRGJNWL_cjs.a("w-full py-3 px-4 rounded-lg font-medium transition-colors",t.popular?"bg-primary text-primary-foreground hover:bg-primary/90":"bg-muted text-muted-foreground hover:bg-muted/80"),onClick:t.cta.onClick},t.cta.text))))))};exports.a=h;//# sourceMappingURL=chunk-OEN63W3G.cjs.map
3
- //# sourceMappingURL=chunk-OEN63W3G.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/marketing/pricing.tsx"],"names":["pricingVariants","cva","pricingGridVariants","pricingCardVariants","pricingBadgeVariants","Pricing","plans","title","subtitle","columns","variant","className","showYearly","onToggleBilling","props","formatPrice","price","currency","React","cn","plan","idx","feature"],"mappings":"iQAIA,IAAMA,CAAAA,CAAkBC,0BAAAA,CACtB,gBAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,eAAA,CACT,KAAA,CAAO,aAAA,CACP,OAAQ,cACV,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAEMC,CAAAA,CAAsBD,0BAAAA,CAC1B,YAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,CAAA,CAAG,8BAAA,CACH,EAAG,8CAAA,CACH,CAAA,CAAG,6DAAA,CACH,CAAA,CAAG,6DACL,CACF,EACA,eAAA,CAAiB,CACf,OAAA,CAAS,CACX,CACF,CACF,EAEME,CAAAA,CAAsBF,0BAAAA,CAC1B,mGAAA,CACA,CACE,QAAA,CAAU,CACR,QAAS,CACP,OAAA,CAAS,eAAA,CACT,MAAA,CAAQ,8BAAA,CACR,OAAA,CAAS,wDACT,KAAA,CAAO,0BACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,QAAS,SACX,CACF,CACF,CAAA,CAEMG,CAAAA,CAAuBH,0BAAAA,CAC3B,iGACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,qCACT,MAAA,CAAQ,kCAAA,CACR,OAAA,CAAS,iCAAA,CACT,OAAA,CAAS,iCACX,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAyCaI,CAAAA,CAAkC,CAAC,CAC9C,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CAAa,KAAA,CACb,eAAA,CAAAC,CAAAA,CACA,GAAGC,CACL,CAAA,GAAM,CACJ,IAAMC,CAAAA,CAAc,CAACC,EAAeC,CAAAA,CAAW,KAAA,GACtC,IAAI,IAAA,CAAK,YAAA,CAAa,OAAA,CAAS,CACpC,KAAA,CAAO,UAAA,CACP,QAAA,CAAAA,CAAAA,CACA,qBAAA,CAAuB,CACzB,CAAC,CAAA,CAAE,MAAA,CAAOD,CAAK,CAAA,CAGjB,OACEE,kBAAAA,CAAA,cAAC,SAAA,CAAA,CAAQ,SAAA,CAAWC,mBAAAA,CAAGnB,CAAAA,CAAgB,CAAE,OAAA,CAAAU,CAAQ,CAAC,CAAA,CAAGC,CAAS,CAAA,CAAI,GAAGG,CAAAA,CAAAA,CACnEI,kBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAU,wBAAA,CAAA,CAAA,CACXX,CAAAA,EAASC,CAAAA,GACTU,kBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CAAA,CACZX,CAAAA,EACCW,kBAAAA,CAAA,aAAA,CAAC,MAAG,SAAA,CAAU,oDAAA,CAAA,CACXX,CACH,CAAA,CAEDC,CAAAA,EACCU,kBAAAA,CAAA,cAAC,GAAA,CAAA,CAAE,SAAA,CAAU,sDAAA,CAAA,CACVV,CACH,CAAA,CAGDK,CAAAA,EACCK,mBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,6CAAA,CAAA,CACbA,kBAAAA,CAAA,aAAA,CAAC,QAAK,SAAA,CAAWC,mBAAAA,CAAG,SAAA,CAAW,CAACP,CAAAA,EAAc,6BAA6B,GAAG,SAE9E,CAAA,CACAM,kBAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,OAAA,CAAS,IAAML,CAAAA,CAAgB,CAACD,CAAU,CAAA,CAC1C,SAAA,CAAU,6JAAA,CAAA,CAEVM,kBAAAA,CAAA,cAAC,MAAA,CAAA,CACC,SAAA,CAAWC,mBAAAA,CACT,gFAAA,CACAP,CAAAA,CAAa,eAAA,CAAkB,eACjC,CAAA,CACF,CACF,CAAA,CACAM,kBAAAA,CAAA,aAAA,CAAC,MAAA,CAAA,CAAK,UAAWC,mBAAAA,CAAG,SAAA,CAAWP,CAAAA,EAAc,6BAA6B,CAAA,CAAA,CAAG,QAAA,CAE3EM,mBAAA,aAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+BAAA,CAAA,CAAgC,YAEhD,CACF,CACF,CAEJ,CAAA,CAGFA,kBAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,oBAAGjB,CAAAA,CAAoB,CAAE,OAAA,CAAAO,CAAQ,CAAC,CAAC,GAChDH,CAAAA,CAAM,GAAA,CAAI,CAACc,CAAAA,CAAMC,CAAAA,GAChBH,kBAAAA,CAAA,cAAC,KAAA,CAAA,CACC,GAAA,CAAKE,CAAAA,CAAK,EAAA,EAAMC,CAAAA,CAChB,SAAA,CAAWF,oBACThB,CAAAA,CAAoB,CAClB,OAAA,CAASiB,CAAAA,CAAK,OAAA,CAAU,SAAA,CAAY,SACtC,CAAC,CAAA,CACDA,CAAAA,CAAK,OAAA,EAAW,WAClB,CAAA,CAAA,CAECA,EAAK,KAAA,EACJF,kBAAAA,CAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAWC,mBAAAA,CAAGf,EAAqB,CAAE,OAAA,CAASgB,CAAAA,CAAK,KAAA,CAAM,OAAQ,CAAC,CAAC,CAAA,CAAA,CACrEA,CAAAA,CAAK,KAAA,CAAM,IACd,CAAA,CAGFF,kBAAAA,CAAA,cAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CAAA,CACbA,kBAAAA,CAAA,aAAA,CAAC,IAAA,CAAA,CAAG,UAAU,yBAAA,CAAA,CAA2BE,CAAAA,CAAK,IAAK,CAAA,CAClDA,CAAAA,CAAK,WAAA,EACJF,kBAAAA,CAAA,aAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,oCAAA,CAAA,CACVE,CAAAA,CAAK,WACR,CAAA,CAEFF,mBAAA,aAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,MAAA,CAAA,CACbA,kBAAAA,CAAA,aAAA,CAAC,QAAK,SAAA,CAAU,oBAAA,CAAA,CACbH,CAAAA,CACCH,CAAAA,EAAcQ,CAAAA,CAAK,KAAA,CAAM,OACrBA,CAAAA,CAAK,KAAA,CAAM,MAAA,CACXA,CAAAA,CAAK,KAAA,CAAM,OAAA,CACfA,EAAK,QACP,CACF,CAAA,CACAF,kBAAAA,CAAA,aAAA,CAAC,MAAA,CAAA,CAAK,UAAU,4BAAA,CAAA,CAA6B,GAAA,CACzCE,CAAAA,CAAK,MAAA,GAAWR,CAAAA,CAAa,MAAA,CAAS,QAC1C,CACF,CACF,CAAA,CAEAM,kBAAAA,CAAA,aAAA,CAAC,IAAA,CAAA,CAAG,UAAU,gBAAA,CAAA,CACXE,CAAAA,CAAK,QAAA,CAAS,GAAA,CAAKE,CAAAA,EAClBJ,kBAAAA,CAAA,aAAA,CAAC,IAAA,CAAA,CAAG,GAAA,CAAKI,CAAAA,CAAQ,EAAA,CAAI,SAAA,CAAU,yBAAA,CAAA,CAC7BJ,kBAAAA,CAAA,cAAC,MAAA,CAAA,CACC,SAAA,CAAWC,mBAAAA,CACT,+DAAA,CACAG,CAAAA,CAAQ,QAAA,CACJ,kCACA,gCACN,CAAA,CAAA,CAECA,CAAAA,CAAQ,QAAA,CAAW,QAAA,CAAM,QAC5B,EACAJ,kBAAAA,CAAA,aAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAWC,mBAAAA,CACf,SAAA,CACA,CAACG,CAAAA,CAAQ,QAAA,EAAY,oCACvB,CAAA,CAAA,CACGA,CAAAA,CAAQ,IACX,CACF,CACD,CACH,CAAA,CAEAJ,kBAAAA,CAAA,aAAA,CAAC,QAAA,CAAA,CACC,UAAWC,mBAAAA,CACT,2DAAA,CACAC,CAAAA,CAAK,OAAA,CACD,wDAAA,CACA,kDACN,EACA,OAAA,CAASA,CAAAA,CAAK,GAAA,CAAI,OAAA,CAAA,CAEjBA,CAAAA,CAAK,GAAA,CAAI,IACZ,CACF,CACD,CACH,CACF,CACF,CAEJ","file":"chunk-OEN63W3G.cjs","sourcesContent":["import React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../lib/utils';\n\nconst pricingVariants = cva(\n 'py-16 md:py-24',\n {\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);\n\nconst pricingGridVariants = cva(\n 'grid gap-8',\n {\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);\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\nexport const Pricing: React.FC<PricingProps> = ({\n plans,\n title,\n subtitle,\n columns,\n variant,\n className,\n showYearly = false,\n onToggleBilling,\n ...props\n}) => {\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 mb-8\">\n {subtitle}\n </p>\n )}\n \n {onToggleBilling && (\n <div className=\"flex items-center justify-center gap-4 mb-8\">\n <span className={cn('text-sm', !showYearly && 'text-foreground font-medium')}>\n Monthly\n </span>\n <button\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 className={cn('text-sm', showYearly && 'text-foreground font-medium')}>\n Yearly\n <span className=\"ml-1 text-xs text-success-600\">\n (Save 20%)\n </span>\n </span>\n </div>\n )}\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 className={cn(pricingBadgeVariants({ variant: plan.badge.variant }))}>\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 showYearly && plan.price.yearly \n ? plan.price.yearly \n : plan.price.monthly,\n plan.currency\n )}\n </span>\n <span className=\"text-muted-foreground ml-1\">\n /{plan.period || (showYearly ? 'year' : 'month')}\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 className={cn(\n 'text-sm',\n !feature.included && 'text-muted-foreground line-through'\n )}>\n {feature.name}\n </span>\n </li>\n ))}\n </ul>\n \n <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 </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n"]}