{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "affectui",
  "homepage": "https://www.affectui.com",
  "items": [
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "Primary, secondary, ghost and destructive buttons with icons, sizes and a shimmering loading state",
      "dependencies": [],
      "files": [
        {
          "path": "registry/button/button.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "button-clean",
      "type": "registry:ui",
      "title": "Button (Clean)",
      "description": "Primary, secondary, ghost and destructive buttons with icons, sizes and a shimmering loading state",
      "dependencies": [],
      "files": [
        {
          "path": "registry/button-clean/button-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "change-summary",
      "type": "registry:ui",
      "title": "Change Summary",
      "description": "What moved since last time – one metric per row with a colored trend",
      "dependencies": [],
      "files": [
        {
          "path": "registry/change-summary/change-summary.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "change-summary-clean",
      "type": "registry:ui",
      "title": "Change Summary (Clean)",
      "description": "What moved since last time – one metric per row with a colored trend",
      "dependencies": [],
      "files": [
        {
          "path": "registry/change-summary-clean/change-summary-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "comment-thread",
      "type": "registry:ui",
      "title": "Comment Thread",
      "description": "One comment with replies – an assistant reports what it did, folds open details and answers @mentions",
      "dependencies": [],
      "files": [
        {
          "path": "registry/comment-thread/comment-thread.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "comment-thread-clean",
      "type": "registry:ui",
      "title": "Comment Thread (Clean)",
      "description": "One comment with replies – an assistant reports what it did, folds open details and answers @mentions",
      "dependencies": [],
      "files": [
        {
          "path": "registry/comment-thread-clean/comment-thread-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "decision-inbox",
      "type": "registry:ui",
      "title": "Decision Inbox",
      "description": "Open decisions with two quick answers each – answered ones confirm and fold away",
      "dependencies": [],
      "files": [
        {
          "path": "registry/decision-inbox/decision-inbox.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "decision-inbox-clean",
      "type": "registry:ui",
      "title": "Decision Inbox (Clean)",
      "description": "Open decisions with two quick answers each – answered ones confirm and fold away",
      "dependencies": [],
      "files": [
        {
          "path": "registry/decision-inbox-clean/decision-inbox-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "email-draft",
      "type": "registry:ui",
      "title": "Email Draft",
      "description": "Agent-written email for review – switch recipient and tone, edit inline, remove the attachment, send or discard with undo",
      "dependencies": [],
      "files": [
        {
          "path": "registry/email-draft/email-draft.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "email-draft-clean",
      "type": "registry:ui",
      "title": "Email Draft (Clean)",
      "description": "Agent-written email for review – switch recipient and tone, edit inline, remove the attachment, send or discard with undo",
      "dependencies": [],
      "files": [
        {
          "path": "registry/email-draft-clean/email-draft-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "filter-menu",
      "type": "registry:ui",
      "title": "Filter Menu",
      "description": "Grouped filters with removable chips, collapsible checkbox groups, Clear all and full keyboard control",
      "dependencies": [],
      "files": [
        {
          "path": "registry/filter-menu/filter-menu.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "filter-menu-clean",
      "type": "registry:ui",
      "title": "Filter Menu (Clean)",
      "description": "Grouped filters with removable chips, collapsible checkbox groups, Clear all and full keyboard control",
      "dependencies": [],
      "files": [
        {
          "path": "registry/filter-menu-clean/filter-menu-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "message-actions",
      "type": "registry:ui",
      "title": "Message Actions",
      "description": "The quiet bar under an AI message – copy turns into a check, regenerate spins and unfolds a version switcher, thumbs pop and ask why, read aloud becomes a tiny equalizer",
      "dependencies": [],
      "files": [
        {
          "path": "registry/message-actions/message-actions.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "message-actions-clean",
      "type": "registry:ui",
      "title": "Message Actions (Clean)",
      "description": "The quiet bar under an AI message – copy turns into a check, regenerate spins and unfolds a version switcher, thumbs pop and ask why, read aloud becomes a tiny equalizer",
      "dependencies": [],
      "files": [
        {
          "path": "registry/message-actions-clean/message-actions-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "notification-stack",
      "type": "registry:ui",
      "title": "Notification Stack",
      "description": "Notice cards stacked behind each other – dismiss the front one to reveal the next",
      "dependencies": [],
      "files": [
        {
          "path": "registry/notification-stack/notification-stack.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "notification-stack-clean",
      "type": "registry:ui",
      "title": "Notification Stack (Clean)",
      "description": "Notice cards stacked behind each other – dismiss the front one to reveal the next",
      "dependencies": [],
      "files": [
        {
          "path": "registry/notification-stack-clean/notification-stack-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "otp-input",
      "type": "registry:ui",
      "title": "OTP Input",
      "description": "The verification code field done right – a gliding focus ring, paste and SMS autofill, a calm shake on errors and a morph into Verified",
      "dependencies": [],
      "files": [
        {
          "path": "registry/otp-input/otp-input.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "otp-input-clean",
      "type": "registry:ui",
      "title": "OTP Input (Clean)",
      "description": "The verification code field done right – a gliding focus ring, paste and SMS autofill, a calm shake on errors and a morph into Verified",
      "dependencies": [],
      "files": [
        {
          "path": "registry/otp-input-clean/otp-input-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "profile-menu",
      "type": "registry:ui",
      "title": "Profile Menu",
      "description": "Account card with the signed-in user, menu actions and profile setup progress",
      "dependencies": [],
      "files": [
        {
          "path": "registry/profile-menu/profile-menu.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "profile-menu-clean",
      "type": "registry:ui",
      "title": "Profile Menu (Clean)",
      "description": "Account card with the signed-in user, menu actions and profile setup progress",
      "dependencies": [],
      "files": [
        {
          "path": "registry/profile-menu-clean/profile-menu-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "progress-tracker",
      "type": "registry:ui",
      "title": "Progress Tracker",
      "description": "Onboarding checklist with an animated progress bar, ticks that draw themselves and auto play",
      "dependencies": [],
      "files": [
        {
          "path": "registry/progress-tracker/progress-tracker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "progress-tracker-clean",
      "type": "registry:ui",
      "title": "Progress Tracker (Clean)",
      "description": "Onboarding checklist with an animated progress bar, ticks that draw themselves and auto play",
      "dependencies": [],
      "files": [
        {
          "path": "registry/progress-tracker-clean/progress-tracker-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "reaction-bar",
      "type": "registry:ui",
      "title": "Reaction Bar",
      "description": "Like, comment, repost and share in one pill – icons pop and fill, counts roll in digit by digit",
      "dependencies": [],
      "files": [
        {
          "path": "registry/reaction-bar/reaction-bar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "reaction-bar-clean",
      "type": "registry:ui",
      "title": "Reaction Bar (Clean)",
      "description": "Like, comment, repost and share in one pill – icons pop and fill, counts roll in digit by digit",
      "dependencies": [],
      "files": [
        {
          "path": "registry/reaction-bar-clean/reaction-bar-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "segmented-control",
      "type": "registry:ui",
      "title": "Segmented Control",
      "description": "Switch between two to six options – a raised pill or underline that glides, stretches a little and can be dragged across, with icons, counts and badges",
      "dependencies": [],
      "files": [
        {
          "path": "registry/segmented-control/segmented-control.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "segmented-control-clean",
      "type": "registry:ui",
      "title": "Segmented Control (Clean)",
      "description": "Switch between two to six options – a raised pill or underline that glides, stretches a little and can be dragged across, with icons, counts and badges",
      "dependencies": [],
      "files": [
        {
          "path": "registry/segmented-control-clean/segmented-control-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "smart-recommendation",
      "type": "registry:ui",
      "title": "Smart Recommendation",
      "description": "Suggestion card with a confidence signal, alternatives to switch to and accept with undo",
      "dependencies": [],
      "files": [
        {
          "path": "registry/smart-recommendation/smart-recommendation.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "smart-recommendation-clean",
      "type": "registry:ui",
      "title": "Smart Recommendation (Clean)",
      "description": "Suggestion card with a confidence signal, alternatives to switch to and accept with undo",
      "dependencies": [],
      "files": [
        {
          "path": "registry/smart-recommendation-clean/smart-recommendation-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "thinking-loader",
      "type": "registry:ui",
      "title": "Thinking Loader",
      "description": "A small working pill for AI replies – an eight-ray spinner and a shimmering label that rolls through phases and settles on a check",
      "dependencies": [],
      "files": [
        {
          "path": "registry/thinking-loader/thinking-loader.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "thinking-loader-clean",
      "type": "registry:ui",
      "title": "Thinking Loader (Clean)",
      "description": "A small working pill for AI replies – an eight-ray spinner and a shimmering label that rolls through phases and settles on a check",
      "dependencies": [],
      "files": [
        {
          "path": "registry/thinking-loader-clean/thinking-loader-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tips-panel",
      "type": "registry:ui",
      "title": "Tips Panel",
      "description": "Grid of short tips with one action each – taken tips turn into a done state",
      "dependencies": [],
      "files": [
        {
          "path": "registry/tips-panel/tips-panel.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tips-panel-clean",
      "type": "registry:ui",
      "title": "Tips Panel (Clean)",
      "description": "Grid of short tips with one action each – taken tips turn into a done state",
      "dependencies": [],
      "files": [
        {
          "path": "registry/tips-panel-clean/tips-panel-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tool-call-card",
      "type": "registry:ui",
      "title": "Tool Call Card",
      "description": "An agent's tool call in one line – live timer, status and summary, folds open to highlighted arguments and result with copy, retry on errors and a group that sums them up",
      "dependencies": [],
      "files": [
        {
          "path": "registry/tool-call-card/tool-call-card.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tool-call-card-clean",
      "type": "registry:ui",
      "title": "Tool Call Card (Clean)",
      "description": "An agent's tool call in one line – live timer, status and summary, folds open to highlighted arguments and result with copy, retry on errors and a group that sums them up",
      "dependencies": [],
      "files": [
        {
          "path": "registry/tool-call-card-clean/tool-call-card-clean.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "logo-marquee",
      "type": "registry:block",
      "title": "Logo Marquee",
      "description": "The endless “Trusted by” strip – a seamless loop that eases to a stop on hover, scrubs with inertia and lifts the hovered logo to colour",
      "dependencies": [],
      "files": [
        {
          "path": "blocks/logo-marquee/logo-marquee.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "testimonial-wall",
      "type": "registry:block",
      "title": "Testimonial Wall",
      "description": "The landing-page wall of quotes – columns that scroll endlessly in opposite directions, ease to a stop on hover and scrub with inertia",
      "dependencies": [],
      "files": [
        {
          "path": "blocks/testimonial-wall/testimonial-wall.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "agent-team",
      "type": "registry:block",
      "title": "Agent Team",
      "description": "A prompt types itself and branches out into three agents, each with a role and overlapping tool logos",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/agent-team/agent-team.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "cover-flow",
      "type": "registry:block",
      "title": "Cover Flow",
      "description": "Browse covers in 3D – drag, flick or scrub the row, it springs to the nearest cover; images drift in their frames over a soft reflection",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/cover-flow/cover-flow.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "empty-calendar",
      "type": "registry:block",
      "title": "Empty Calendar",
      "description": "Stack of calendar cards marked empty, fanning out on hover",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/empty-calendar/empty-calendar.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "enrichment-orbit",
      "type": "registry:block",
      "title": "Enrichment Orbit",
      "description": "Grok tile inside two rings with comets and data nodes orbiting around it",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/enrichment-orbit/enrichment-orbit.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "frost-cloud",
      "type": "registry:block",
      "title": "Frost Cloud",
      "description": "A frosted white cloud with eyes cut out of it, on a red-orange or blue sky – it floats, turns to look around, blinks, follows the pointer and bounces with a wink when clicked",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/frost-cloud/frost-cloud.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "ghosted-chat",
      "type": "registry:block",
      "title": "Ghosted Chat",
      "description": "Unanswered chat messages marked as read, with a thumbs-down reply on hover",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/ghosted-chat/ghosted-chat.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "glow-cloud",
      "type": "registry:block",
      "title": "Glow Cloud",
      "description": "A glowing cloud with eyes in blue or red-orange – it floats, turns to look around, blinks, follows the pointer and bounces with a wink when clicked",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/glow-cloud/glow-cloud.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "integration-beam",
      "type": "registry:block",
      "title": "Integration Beam",
      "description": "Your product between the tools it connects – light pulses flow along curved beams, hover to focus a tool, click to pause it",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/integration-beam/integration-beam.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "integration-grid",
      "type": "registry:block",
      "title": "Integration Grid",
      "description": "Honeycomb-like wall of integration logos around a bright centre tile with your product mark, fading out toward the edges",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/integration-grid/integration-grid.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "layer-stack",
      "type": "registry:block",
      "title": "Layer Stack",
      "description": "Isometric stack of five layers with a list beside it – the chosen entry lifts its layer out in color",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/layer-stack/layer-stack.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "lead-sourcing",
      "type": "registry:block",
      "title": "Lead Sourcing",
      "description": "ChatGPT tile linked to Gmail and Grok, with a shine running along the connection",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/lead-sourcing/lead-sourcing.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "logo-cluster",
      "type": "registry:block",
      "title": "Logo Cluster",
      "description": "Your mark on a white disc in the middle – company logos bounce out of it and settle around it",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/logo-cluster/logo-cluster.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "model-wheel",
      "type": "registry:block",
      "title": "Model Wheel",
      "description": "AI model names on a turning drum – the rows bend away at the edges and each model lands on a soft gray fill",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/model-wheel/model-wheel.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "region-dach",
      "type": "registry:block",
      "title": "DACH Region",
      "description": "DACH map with fading neighbours and a pastel band along the border, switchable to the US, China, India, Brazil or Japan",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/region-dach/region-dach.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "side-folder",
      "type": "registry:block",
      "title": "Side Folder",
      "description": "Glassy blue folder on its side, documents sliding out to the right as the pocket swings open on hover",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/side-folder/side-folder.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "tab-overload",
      "type": "registry:block",
      "title": "Tab Overload",
      "description": "Overlapping browser windows where the highlight follows the hovered tab",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/tab-overload/tab-overload.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "team-invite",
      "type": "registry:block",
      "title": "Team Invite",
      "description": "Connected teammates – a cursor drags a new one into the empty slot, the line turns solid and they go online",
      "dependencies": [],
      "files": [
        {
          "path": "illustrations/team-invite/team-invite.tsx",
          "type": "registry:block"
        }
      ]
    },
    {
      "name": "grid-background",
      "type": "registry:ui",
      "title": "Grid Background",
      "description": "A fine line grid that drifts slowly behind your content and fades out towards the edges",
      "dependencies": [],
      "files": [
        {
          "path": "motion/grid-background/grid-background.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "number-ticker",
      "type": "registry:ui",
      "title": "Number Ticker",
      "description": "Odometer-style numbers – every digit rolls to its new value and counts in from zero when it scrolls into view",
      "dependencies": [],
      "files": [
        {
          "path": "motion/number-ticker/number-ticker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "shimmer-loader",
      "type": "registry:ui",
      "title": "Shimmer Loader",
      "description": "Skeleton blocks that share one soft light sweep, plus shimmering text for “Thinking…” states",
      "dependencies": [],
      "files": [
        {
          "path": "motion/shimmer-loader/shimmer-loader.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "text-reveal",
      "type": "registry:ui",
      "title": "Text Reveal",
      "description": "Text that arrives word by word or letter by letter – each piece rises out of a soft blur as it scrolls into view",
      "dependencies": [],
      "files": [
        {
          "path": "motion/text-reveal/text-reveal.tsx",
          "type": "registry:ui"
        }
      ]
    }
  ]
}