{ "componentRegistry": { "layout": [ { "import": "import CardStack from '@/components/cardStack/CardStack';", "name": "CardStack", "path": "@/components/cardStack/CardStack", "description": "Adaptive layout component that displays children in a grid, timeline, or carousel based on item count and variant.", "details": "Use for displaying collections of cards. Automatically switches between grid (1-4 items) and carousel (5+ items). Special timeline variant creates a zigzag layout for 3-6 items; automatically switches to carousel for 7+ items. Carousel offers auto-scroll or button controls (recommended: keep default buttons). Optional header supports centered or split textbox layout (split: tag + title + description left, buttons right; split-actions: tag + title left, buttons only right; split-description: tag + title left, description only right).", "constraints": { "textRules": { "title": { "required": true, "example": "Features", "minChars": 2, "maxChars": 50 }, "description": { "required": true, "example": "Discover our products", "minChars": 5, "maxChars": 300 }, "tag": { "required": false, "example": "New", "minChars": 2, "maxChars": 30 } } }, "propsSchema": { "children": "React.ReactNode", "mode?": "'auto' | 'buttons' (default: 'buttons')", "gridVariant?": "'uniform-all-items-equal' | 'uniform-staggered-items' | 'uniform-alternating-heights' | 'uniform-alternating-heights-inverted' | 'uniform-alternating-sizes' | 'uniform-alternating-sizes-inverted' | 'two-items-tall-short' | 'two-items-short-tall' | 'bento-grid' | 'bento-grid-inverted' | 'two-columns-alternating-heights' | 'asymmetric-60-wide-40-narrow' | 'three-columns-all-equal-width' | 'four-items-2x2-equal-grid' | 'four-items-2x2-alternating-heights' | 'four-items-2x2-alternating-heights-inverted' | 'four-items-2x2-staggered-grid' | 'four-items-2x2-staggered-grid-inverted' | 'one-large-right-three-stacked-left' | 'items-top-row-full-width-bottom' | 'full-width-top-items-bottom-row' | 'one-large-left-three-stacked-right' | 'timeline' | 'timeline-three-columns' (default: 'uniform-all-items-equal')", "uniformGridCustomHeightClasses?": "string (default: varies by usage)", "animationType": "'none' | 'opacity' | 'slide-up' | 'scale-rotate' | 'blur-reveal' (required - controls GSAP scroll animations with stagger effect)", "containerStyle": "'default' | 'card' (required - 'default': individual items have card styling with gaps, 'card': entire grid wrapped in primary-button container)", "title?": "string", "titleSegments?": "TitleSegment[] - Array of { type: 'text', content: string } | { type: 'image', src: string, alt?: string } for inline images in title", "description?": "string", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image' (required - 'inline-image' uses titleSegments for rich text with images)", "useInvertedBackground?": "'noInvert' | 'invertDefault' | 'invertCard'", "ariaLabel?": "string (default: 'Card stack')", "className?": "string", "containerClassName?": "string", "gridClassName?": "string", "carouselClassName?": "string", "controlsClassName?": "string", "textBoxClassName?": "string", "titleClassName?": "string", "titleImageWrapperClassName?": "string - For styling image wrapper in inline-image layout", "titleImageClassName?": "string - For styling images in inline-image layout", "descriptionClassName?": "string", "tagClassName?": "string", "buttonContainerClassName?": "string", "buttonClassName?": "string", "buttonTextClassName?": "string" }, "usage": "{/* Card components */}" }, { "import": "import TimelineHorizontalCardStack from '@/components/cardStack/layouts/timelines/TimelineHorizontalCardStack';", "name": "TimelineHorizontalCardStack", "path": "@/components/cardStack/layouts/timelines/TimelineHorizontalCardStack", "description": "Horizontal auto-playing timeline component that displays 2-4 cards in a grid with animated progress bars and optional media display.", "details": "Use for showcasing features, steps, or processes with automatic progression. Displays cards in a horizontal grid (2-4 columns on desktop, stacked on mobile) with auto-advancing progress bars. Each card has an animated progress bar that fills over 5 seconds before advancing to the next. Users can click any card to jump to that step. Active and previous cards are fully visible (opacity-100), future cards are dimmed (opacity-50). Grid adapts: 2 items = 2 columns, 3 items = 3 columns, 4+ items = 4 columns. Automatically loops back to first card after completing the sequence. Progress bars use theme foreground color. Optional mediaItems prop displays a shared media area above cards that smoothly transitions (opacity fade) between images/videos as cards advance. Media uses aspect-square on mobile and aspect-video on desktop. Children are card content that gets wrapped in card styling.", "constraints": { "textRules": { "title": { "required": true, "example": "Our Process", "minChars": 2, "maxChars": 50 }, "description": { "required": true, "example": "Follow our step-by-step approach to success", "minChars": 5, "maxChars": 300 }, "tag": { "required": false, "example": "How It Works", "minChars": 2, "maxChars": 30 } }, "itemRules": { "minItems": 2, "maxItems": 4, "recommendedItems": "2-4", "note": "Works best with 2-4 card content children. Grid layout adapts based on item count. Each child is wrapped in card styling with progress bar." }, "mediaRules": { "imageSrc": { "required": false, "example": "/step1.jpg", "note": "Either imageSrc or videoSrc per media item" }, "videoSrc": { "required": false, "example": "/step1.mp4", "note": "Either imageSrc or videoSrc per media item" }, "imageAlt": { "required": false, "example": "Step 1 illustration" }, "videoAriaLabel": { "required": false, "example": "Step 1 video" } } }, "propsSchema": { "children": "React.ReactNode", "title": "string", "titleSegments?": "TitleSegment[] - Array of { type: 'text', content: string } | { type: 'image', src: string, alt?: string } for inline images in title", "description": "string", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image' (required - 'inline-image' uses titleSegments for rich text with images)", "mediaItems?": "Array<{ imageSrc?: string, videoSrc?: string, imageAlt?: string, videoAriaLabel?: string }>", "ariaLabel?": "string (default: 'Timeline section')", "className?": "string", "containerClassName?": "string", "textBoxClassName?": "string", "titleClassName?": "string", "titleImageWrapperClassName?": "string - For styling image wrapper in inline-image layout", "titleImageClassName?": "string - For styling images in inline-image layout", "descriptionClassName?": "string", "tagClassName?": "string", "buttonContainerClassName?": "string", "buttonClassName?": "string", "buttonTextClassName?": "string", "cardClassName?": "string", "progressBarClassName?": "string", "mediaContainerClassName?": "string", "mediaClassName?": "string" }, "usage": "

Step 1

Description

Step 2

Description

" }, { "import": "import TimelineCardStack from '@/components/cardStack/layouts/timelines/TimelineCardStack';", "name": "TimelineCardStack", "path": "@/components/cardStack/layouts/timelines/TimelineCardStack", "description": "Vertical sticky scroll timeline component where cards stack on top of each other and fade out as you scroll.", "details": "Use for storytelling, process flows, or sequential content that benefits from sticky scroll animation. Cards use sticky positioning and stack vertically. As you scroll, each card fades out (opacity 0) when scrolled past, except the last card which remains visible. Uses GSAP ScrollTrigger for smooth scroll-linked opacity animations. Cards have fixed heights: 140vw on mobile, 75vh on desktop. Sticky positioning: top-[25vw] on mobile, top-[12.5vh] on desktop. Works best with 3-6 cards for optimal scroll experience. Children are card content that gets wrapped in sticky card styling.", "constraints": { "textRules": { "title": { "required": true, "example": "Our Journey", "minChars": 2, "maxChars": 50 }, "description": { "required": true, "example": "Discover how we've evolved over the years", "minChars": 5, "maxChars": 300 }, "tag": { "required": false, "example": "Story", "minChars": 2, "maxChars": 30 } }, "itemRules": { "minItems": 3, "maxItems": 6, "recommendedItems": "3-6", "note": "Works best with 3-6 card content children for optimal scroll experience. Each child is wrapped in sticky card styling with GSAP fade animation." } }, "propsSchema": { "children": "React.ReactNode", "title": "string", "titleSegments?": "TitleSegment[] - Array of { type: 'text', content: string } | { type: 'image', src: string, alt?: string } for inline images in title", "description": "string", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image' (required - 'inline-image' uses titleSegments for rich text with images)", "ariaLabel?": "string (default: 'Timeline section')", "className?": "string", "containerClassName?": "string", "textBoxClassName?": "string", "titleClassName?": "string", "titleImageWrapperClassName?": "string - For styling image wrapper in inline-image layout", "titleImageClassName?": "string - For styling images in inline-image layout", "descriptionClassName?": "string", "tagClassName?": "string", "buttonContainerClassName?": "string", "buttonClassName?": "string", "buttonTextClassName?": "string" }, "usage": "

2020

Founded

2022

Expanded

" }, { "import": "import TimelinePhoneView from '@/components/cardStack/layouts/timelines/TimelinePhoneView';", "name": "TimelinePhoneView", "path": "@/components/cardStack/layouts/timelines/TimelinePhoneView", "description": "Scroll-animated timeline displaying content with dual phone mockups using GSAP animations.", "details": "Use for mobile app features, product walkthroughs, or step-by-step processes with phone/video mockups. Desktop: Dynamic height section (100vh per item) with sticky phone frames animating from offscreen (-200%/200%, rotation -45\u00b0/45\u00b0) to positioned state (rotation -10\u00b0/10\u00b0). Two frames per item side-by-side. Content scrolls while frames stay sticky. Mobile: Stacked sections with scroll-triggered entrance animations (frames slide from -150%/150%, rotation -25\u00b0/25\u00b0 to center). Uses GSAP ScrollTrigger with matchMedia for responsive behavior. Each item requires trigger class for scroll animations, content (ReactNode), and media for two frames (image or video). Frames use card styling with rounded-theme-capped. Integrates CardStackTextBox for section header.", "constraints": { "textRules": { "title": { "required": true, "example": "App Features", "minChars": 2, "maxChars": 50 }, "description": { "required": true, "example": "Explore our powerful mobile experience", "minChars": 5, "maxChars": 300 }, "tag": { "required": false, "example": "Mobile", "minChars": 2, "maxChars": 30 } }, "itemRules": { "minItems": 2, "maxItems": 4, "recommendedItems": "2-4", "note": "Each item needs: trigger (string class e.g., 'trigger-1'), content (ReactNode), imageOne/videoOne (string path), imageTwo/videoTwo (string path), plus optional imageAltOne, imageAltTwo, videoAriaLabelOne, videoAriaLabelTwo. Desktop height = items.length * 100vh. Frames have card styling with p-1 padding." } }, "propsSchema": { "items": "TimelinePhoneViewItem[] (required) - Array of { trigger: string, content: React.ReactNode, imageOne?: string, videoOne?: string, imageAltOne?: string, videoAriaLabelOne?: string, imageTwo?: string, videoTwo?: string, imageAltTwo?: string, videoAriaLabelTwo?: string }", "showTextBox?": "boolean (default: true - controls whether CardStackTextBox renders)", "title": "string", "titleSegments?": "TitleSegment[] - Array of { type: 'text', content: string } | { type: 'image', src: string, alt?: string } for inline images in title", "description": "string", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image' (required - 'inline-image' uses titleSegments for rich text with images)", "ariaLabel?": "string (default: 'Timeline phone view section')", "className?": "string", "containerClassName?": "string", "textBoxClassName?": "string", "titleClassName?": "string", "titleImageWrapperClassName?": "string - For styling image wrapper in inline-image layout", "titleImageClassName?": "string - For styling images in inline-image layout", "descriptionClassName?": "string", "tagClassName?": "string", "buttonContainerClassName?": "string", "buttonClassName?": "string", "buttonTextClassName?": "string", "desktopContainerClassName?": "string", "mobileContainerClassName?": "string", "desktopContentClassName?": "string", "desktopWrapperClassName?": "string", "mobileWrapperClassName?": "string", "phoneFrameClassName?": "string", "mobilePhoneFrameClassName?": "string" }, "usage": "

Feature One

Description

, imageOne: '/phone1.jpg', imageTwo: '/phone2.jpg' }]} />" }, { "import": "import TimelineProcessFlow from '@/components/cardStack/layouts/timelines/TimelineProcessFlow';", "name": "TimelineProcessFlow", "path": "@/components/cardStack/layouts/timelines/TimelineProcessFlow", "description": "Vertical timeline with alternating media/content layout and scroll-triggered progress line animation.", "details": "Use for process flows, company history, product development timelines, or step-by-step guides. Features vertical center line with GSAP scroll-animated fill effect, numbered badges at center, alternating left/right layout controlled by reverse prop. Each item accepts custom ReactNode for both media and content, allowing full flexibility (images, videos, text, lists, etc.). Desktop: Split layout with media and content on opposite sides. Mobile: Stacked vertical layout. Integrates CardStackTextBox for section header with all textboxLayout options. Perfect for storytelling, journey maps, or sequential content.", "constraints": { "textRules": { "title": { "required": true, "example": "Our Journey", "minChars": 2, "maxChars": 50 }, "description": { "required": true, "example": "Discover the milestones that shaped our story", "minChars": 5, "maxChars": 300 }, "tag": { "required": false, "example": "Timeline", "minChars": 2, "maxChars": 30 } }, "buttonRules": { "maxButtons": 2, "structure": { "text": "string - Button label (required)", "href": "string - Link destination (optional)", "onClick": "() => void - Click handler (optional)", "props": "Partial - Additional button props (optional)" }, "note": "Button variant controlled by ThemeProvider's defaultButtonVariant. All sections should be wrapped in a single ThemeProvider at the app/page level." }, "itemRules": { "structure": { "id": "string - Unique identifier displayed in number badge (required)", "content": "React.ReactNode - Custom content for the item (required)", "media": "React.ReactNode - Custom media element (image, video, etc.) (required)", "reverse": "boolean - When true, swaps media/content positions on desktop (required)" }, "note": "Fully flexible - pass any ReactNode for content and media. Common patterns: media (Image/video), content (h3 title + p description + ul list with icons)." } }, "propsSchema": { "items": "TimelineProcessFlowItem[] - Array of timeline items", "title": "string", "titleSegments?": "TitleSegment[] - Array of { type: 'text', content: string } | { type: 'image', src: string, alt?: string } for inline images in title", "description": "string", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' | 'inline-image' (required - 'inline-image' uses titleSegments for rich text with images)", "animationType": "'none' | 'opacity' | 'slide-up' | 'scale-rotate' | 'blur-reveal' (required - controls GSAP scroll animations with stagger effect)", "ariaLabel?": "string (default: 'Timeline process flow section')", "className?": "string", "containerClassName?": "string", "textBoxClassName?": "string", "textBoxTitleClassName?": "string", "textBoxTitleImageWrapperClassName?": "string - For styling image wrapper in inline-image layout", "textBoxTitleImageClassName?": "string - For styling images in inline-image layout", "textBoxDescriptionClassName?": "string", "textBoxTagClassName?": "string", "textBoxButtonContainerClassName?": "string", "textBoxButtonClassName?": "string", "textBoxButtonTextClassName?": "string", "itemClassName?": "string", "mediaWrapperClassName?": "string", "numberClassName?": "string", "contentWrapperClassName?": "string", "gapClassName?": "string" }, "usage": "// Wrap in ThemeProvider with smooth scrolling (ReactLenis)\n\n \n , content: <>

Foundation

Started our journey

  • Launched MVP
  • First customer
},\n { id: '2', reverse: true, media:
\n
" }, { "import": "import TextBox from '@/components/Textbox';", "name": "TextBox", "path": "@/components/Textbox", "description": "Flexible text composition component with animated title and description.", "details": "Use for text content blocks with optional tag and up to 2 CTAs. Supports default (centered), split (tag + title + description left, buttons right), split-actions (tag + title left, buttons only right), or split-description (tag + title left, description only right). Text animations use ThemeProvider defaults.", "constraints": { "textRules": { "title": { "required": true, "example": "Welcome to Our Platform", "minChars": 2, "maxChars": 100 }, "description": { "required": true, "example": "Discover amazing features and capabilities", "minChars": 5, "maxChars": 500 }, "tag": { "required": false, "example": "New", "minChars": 2, "maxChars": 30 } } }, "propsSchema": { "title": "string", "description": "string", "type?": "'entrance-slide' | 'reveal-blur' | 'background-highlight'", "textboxLayout": "'default' | 'split' | 'split-actions' | 'split-description' (required)", "center?": "boolean (default: false)", "tag?": "string", "tagIcon?": "LucideIcon", "buttons?": "Array<{text: string, onClick?: () => void, href?: string}>", "duration?": "number (default: 1)", "start?": "string (default: 'top 80%')", "end?": "string (default: 'top 20%')", "gradientColors?": "{ from: string, to: string }", "children?": "React.ReactNode", "className?": "string", "titleClassName?": "string", "descriptionClassName?": "string", "tagClassName?": "string", "buttonContainerClassName?": "string", "buttonClassName?": "string", "buttonTextClassName?": "string", "avatars?": "Avatar[]", "avatarText?": "string", "avatarGroupClassName?": "string" }, "usage": "" }, { "import": "import AvatarGroup from '@/components/shared/AvatarGroup';", "name": "AvatarGroup", "path": "@/components/shared/AvatarGroup", "description": "Displays a group of user avatars with overlapping layout and optional text label.", "details": "Use for showing user participation, testimonials, or social proof. Displays up to 5 avatars by default with remaining count badge. Avatars overlap with card styling. Includes optional text label (e.g., 'Join 1,000+ members').", "constraints": { "textRules": { "text": { "required": false, "example": "Join 1,000+ members", "minChars": 2, "maxChars": 50 } } }, "propsSchema": { "avatars": "Avatar[]", "text?": "string", "maxVisible?": "number (default: 5)", "className?": "string", "avatarClassName?": "string", "textClassName?": "string", "ariaLabel?": "string (default: 'User avatars')" }, "usage": "" }, { "import": "import { Globe } from '@/components/shared/Globe';", "name": "Globe", "path": "@/components/shared/Globe", "description": "Interactive 3D rotating globe component using COBE library with theme-aware colors and customizable markers.", "details": "Use for showcasing global presence, international reach, or geographic data. Features auto-rotating 3D globe with location markers. Colors automatically sync with theme CSS variables (--card for base/glow, --primary-cta for markers). Fully customizable via COBEOptions config. Includes default world markers. Responsive with smooth opacity fade-in. Requires 'cobe' package. Best used within a card container with fixed dimensions.", "constraints": { "globeRules": { "config": { "required": false, "note": "Optional COBEOptions object to customize globe appearance. Default config uses theme colors: baseColor and glowColor use --card, markerColor uses --primary-cta. Can override: phi (rotation), theta (tilt), dark (darkness 0-1), diffuse (lighting), mapSamples, mapBrightness, markers (array of {location: [lat, lng], size: number}), and more. See COBE documentation for full options." } } }, "propsSchema": { "className?": "string", "config?": "COBEOptions - Custom globe configuration (see COBE docs)" }, "usage": "" } ], "title": [ { "import": "import TextAnimation from '@/components/text/TextAnimation';", "name": "TextAnimation", "path": "@/components/text/TextAnimation", "description": "Unified scroll-triggered text animation component with three distinct animation types and two trigger variants.", "details": "A versatile text animation component that offers three animation types, each with two trigger variants (trigger, words-trigger).", "animationTypes": { "entrance-slide": { "description": "Scroll-synced text entrance effect where characters slide upward into view as the user scrolls.", "details": "Use when you want text to feel like it's entering the viewport in sync with scroll. Each word or character fades and slides upward from below. Best for storytelling sections, hero copy, or progressive reveals tied to reading flow." }, "reveal-blur": { "description": "Scroll\u2011synced reveal where text sharpens from a blurred state as you scroll.", "details": "Use for narrative sections where copy should emerge smoothly with the reader's progress. The effect scrubs with scroll: characters start blurred and gradually come into focus (optionally fading in)." }, "background-highlight": { "description": "Text that reveals or highlights progressively as the user scrolls.", "details": "Use when you want text to animate with scroll position, revealing characters smoothly in sync with scroll movement. Great for storytelling sections, intros, or explanatory copy tied to scroll progress." } }, "triggerVariants": { "trigger": "Character-by-character animation plays once on viewport entry - ideal for short impactful text like headlines and subheadlines", "words-trigger": "Word-by-word animation on viewport entry - great for longer body text, paragraphs, and explanatory copy" }, "constraints": { "textRules": { "title": { "required": true, "example": "This animation responds to scroll. Watch as the text comes to life." } } }, "propsSchema": { "type?": "'entrance-slide' | 'reveal-blur' | 'background-highlight'", "title": "string", "children?": "React.ReactNode", "variant?": "'trigger' | 'words-trigger'", "className?": "string", "duration?": "number", "stagger?": "number", "start?": "string", "end?": "string", "ariaLabel?": "string", "gradientColors?": "{ from: string, to: string }" } }, { "import": "import TextNumberCount from '@/components/text/TextNumberCount';", "name": "TextNumberCount", "path": "@/components/text/TextNumberCount", "description": "Animated number counter that increments smoothly from a start to an end value.", "details": "Use for statistics, or metrics where a counting animation adds emphasis. Numbers animate on mount or when scrolled into view. Supports decimals, currency, and optional suffix/prefix.", "constraints": { "numberRules": { "value": { "required": true, "example": 99.99 }, "startFrom": { "required": false, "example": 0 } } }, "propsSchema": { "value": "number", "startFrom?": "number", "duration?": "number", "format?": "Intl.NumberFormatOptions", "locales?": "string", "prefix?": "string", "suffix?": "string", "animateOnScroll?": "boolean", "threshold?": "number", "className?": "string" } } ], "button": [ { "import": "import ButtonTextUnderline from '@/components/button/ButtonTextUnderline';", "name": "ButtonTextUnderline", "path": "@/components/button/ButtonTextUnderline", "description": "Text-only button where an underline animates in on hover.", "details": "Use for inline or minimal CTAs or links where you want the hover state to reveal affordance without altering color or layout. The underline appears smoothly under the label when hovered.", "constraints": { "textRules": { "text": { "required": true, "example": "Learn more", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonIconArrow from '@/components/button/ButtonIconArrow';", "name": "ButtonIconArrow", "path": "@/components/button/ButtonIconArrow", "description": "Button with a trailing arrow icon that transforms on hover.", "details": "Use for CTAs where a subtle icon transformation helps indicate forward navigation. The arrow icon transitions into a square on hover/focus. Keep label short and simple.", "constraints": { "textRules": { "text": { "required": true, "example": "Button", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "textClassName?": "string", "iconClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonTextStagger from '@/components/button/ButtonTextStagger/ButtonTextStagger';", "name": "ButtonTextStagger", "path": "@/components/button/ButtonTextStagger/ButtonTextStagger", "description": "CTA button with character stagger animation on hover.", "details": "Use for primary or secondary CTAs where subtle text motion adds emphasis. On hover, the label's characters animate in sequence (stagger). Includes background styling.", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string", "textClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonShiftHover from '@/components/button/ButtonShiftHover/ButtonShiftHover';", "name": "ButtonShiftHover", "path": "@/components/button/ButtonShiftHover/ButtonShiftHover", "description": "CTA button where the label nudges upward on hover and a trailing dot fills from outline to solid.", "details": "Use for primary or secondary CTAs that benefit from a gentle motion cue. Keep the label short and single\u2011line. The trailing dot is purely decorative and fills on hover.", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string", "textClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonHoverMagnetic from '@/components/button/ButtonHoverMagnetic/ButtonHoverMagnetic';", "name": "ButtonHoverMagnetic", "path": "@/components/button/ButtonHoverMagnetic/ButtonHoverMagnetic", "description": "CTA button that subtly follows the cursor with a magnetic hover effect.", "details": "Use when you want a playful, high-affordance interaction. On hover, the button shifts toward the cursor and recenters on leave. Keep labels short; no multiline.", "constraints": { "textRules": { "text": { "required": true, "example": "Button", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "textClassName?": "string", "strengthFactor?": "number (default: 20)", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonHoverBubble from '@/components/button/ButtonHoverBubble';", "name": "ButtonHoverBubble", "path": "@/components/button/ButtonHoverBubble", "description": "CTA button with expanding bubble animation where an arrow icon slides out and the text expands on hover.", "details": "Use for CTAs where a playful expansion effect adds emphasis. On hover (desktop only), a circular arrow icon expands from the left while the text container slides into view. The initial state shows just the arrow on the right which transforms into the full button. Mobile shows static full button. Uses bgClassName for text container (primary-button for primary, secondary-button for secondary) and iconClassName for arrow icons (automatically set via buttonUtils.ts).", "constraints": { "textRules": { "text": { "required": true, "example": "Contact Us", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string - Applied to the text container (automatically set in sections)", "textClassName?": "string - Applied to the text span", "iconClassName?": "string - Applied to both arrow icon containers (automatically set in sections)", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonExpandHover from '@/components/button/ButtonExpandHover';", "name": "ButtonExpandHover", "path": "@/components/button/ButtonExpandHover", "description": "CTA button with expanding background animation from right to left on hover, with a fixed arrow icon.", "details": "Use for CTAs where a smooth expanding effect adds visual interest. On hover (desktop only), the background expands from right to left across the button while the text transitions color. The arrow icon remains fixed on the right side throughout the animation. Mobile shows static button. Uses className for base button styling (primary-button or secondary-button), with iconClassName for arrow icon color and iconBgClassName for expanding background (automatically set via buttonUtils.ts).", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "textClassName?": "string - Applied to the text span (automatically includes base and hover colors in sections)", "iconClassName?": "string - Applied to the arrow icon container (automatically set in sections)", "iconBgClassName?": "string - Applied to the expanding background (automatically set in sections)", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonBounceEffect from '@/components/button/ButtonBounceEffect/ButtonBounceEffect';", "name": "ButtonBounceEffect", "path": "@/components/button/ButtonBounceEffect/ButtonBounceEffect", "description": "CTA button with bouncing character animation on hover.", "details": "Use for primary or secondary CTAs where playful motion adds personality. On hover, each character bounces with a slight delay creating a wave effect. Includes background styling with bgClassName.", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string", "textClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonDirectionalHover from '@/components/button/ButtonDirectionalHover/ButtonDirectionalHover';", "name": "ButtonDirectionalHover", "path": "@/components/button/ButtonDirectionalHover/ButtonDirectionalHover", "description": "CTA button with a circle that expands from the mouse entry point on hover.", "details": "Use for CTAs where directional awareness adds visual interest. On hover, a circle expands from where the cursor entered the button, creating a fluid reveal effect. The circleClassName controls the expanding circle color (bg-accent for primary, bg-accent/10 for secondary).", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string", "textClassName?": "string", "circleClassName?": "string - Controls the expanding circle color", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonElasticEffect from '@/components/button/ButtonElasticEffect/ButtonElasticEffect';", "name": "ButtonElasticEffect", "path": "@/components/button/ButtonElasticEffect/ButtonElasticEffect", "description": "CTA button with elastic scale animation on hover.", "details": "Use for CTAs where a springy, elastic feel adds playfulness. On hover, the button scales with an elastic easing that overshoots and settles, creating a bouncy tactile response.", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "textClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" }, { "import": "import ButtonTextShift from '@/components/button/ButtonTextShift/ButtonTextShift';", "name": "ButtonTextShift", "path": "@/components/button/ButtonTextShift/ButtonTextShift", "description": "CTA button with synchronized character shift animation on hover.", "details": "Use for primary or secondary CTAs where uniform text motion adds emphasis. Similar to ButtonTextStagger but all characters shift together simultaneously instead of in sequence. Includes background styling with bgClassName.", "constraints": { "textRules": { "text": { "required": true, "example": "Get Started", "minChars": 2, "maxChars": 25 } } }, "propsSchema": { "text": "string", "onClick?": "() => void", "href?": "string - External URLs open in new tab, internal values scroll to section", "className?": "string", "bgClassName?": "string", "textClassName?": "string", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "type?": "'button' | 'submit' | 'reset' (default: 'button')" }, "usage": "" } ], "form": [ { "import": "import Input from '@/components/form/Input';", "name": "Input", "path": "@/components/form/Input", "description": "Styled text input field with secondary-button styling and rounded-theme borders.", "details": "Use for text, email, password, and other input types in forms. Features secondary-button background styling, placeholder text with 75% opacity, and focus states. Includes disabled state with reduced opacity and cursor styling. Supports all standard HTML input types.", "constraints": { "textRules": { "placeholder": { "required": false, "example": "Enter your name", "minChars": 2, "maxChars": 50 } } }, "propsSchema": { "value": "string (required)", "onChange": "(value: string) => void (required)", "type?": "string (default: 'text')", "placeholder?": "string", "required?": "boolean (default: false)", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "className?": "string" }, "usage": " setName(value)} type=\"text\" placeholder=\"Name\" required />" }, { "import": "import Textarea from '@/components/form/Textarea';", "name": "Textarea", "path": "@/components/form/Textarea", "description": "Styled textarea field with secondary-button styling and rounded-theme-capped borders.", "details": "Use for multi-line text input in forms. Features secondary-button background styling, customizable row height, resize disabled, and focus states. Includes disabled state with reduced opacity. Ideal for messages, comments, or longer text content.", "constraints": { "textRules": { "placeholder": { "required": false, "example": "Type your message...", "minChars": 2, "maxChars": 100 } } }, "propsSchema": { "value": "string (required)", "onChange": "(value: string) => void (required)", "placeholder?": "string", "rows?": "number (default: 5)", "required?": "boolean (default: false)", "disabled?": "boolean (default: false)", "ariaLabel?": "string", "className?": "string" }, "usage": "