{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "persianlabsui",
  "homepage": "https://ui.persian-labs.ir",
  "items": [
    {
      "name": "button",
      "type": "registry:ui",
      "title": "Button",
      "description": "A button built on Base UI with variant and size support.",
      "registryDependencies": ["utils", "@persianlabsui/spinner"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/button.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "tabs",
      "type": "registry:ui",
      "title": "Tabs",
      "description": "An accessible, animated tabs component built on Base UI with a spring-animated sliding active-tab indicator.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "motion"],
      "files": [
        {
          "path": "registry/base/ui/tabs.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "input",
      "type": "registry:ui",
      "title": "Input",
      "description": "A styled text input built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/input.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "label",
      "type": "registry:ui",
      "title": "Label",
      "description": "An accessible, styled label element.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/label.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "scroll-area",
      "type": "registry:ui",
      "title": "Scroll Area",
      "description": "Cross-browser custom scrollbars, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/scroll-area.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "combobox",
      "type": "registry:ui",
      "title": "Combobox",
      "description": "A searchable, accessible combobox built on Base UI.",
      "registryDependencies": ["utils", "@persianlabsui/scroll-area"],
      "dependencies": ["@base-ui/react", "react-virtuoso"],
      "files": [
        {
          "path": "registry/base/ui/combobox.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "command",
      "type": "registry:ui",
      "title": "Command",
      "description": "A command palette component built with Dialog and Autocomplete for searching and executing commands.",
      "registryDependencies": ["utils", "@persianlabsui/scroll-area"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/command.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "city-selector",
      "type": "registry:ui",
      "title": "City Selector",
      "description": "A province and city picker for Iran, built on Combobox and bundled with a full dataset of all 31 provinces and 1,119 cities.",
      "registryDependencies": ["utils", "@persianlabsui/combobox"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/city-selector.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/lib/persian-provinces.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "spinner",
      "type": "registry:ui",
      "title": "Spinner",
      "description": "A spinning loading indicator icon.",
      "registryDependencies": ["utils"],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/spinner.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "button-group",
      "type": "registry:ui",
      "title": "Button Group",
      "description": "A container that groups related buttons together with consistent styling.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/button-group.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "popover",
      "type": "registry:ui",
      "title": "Popover",
      "description": "Displays rich content in a portal, anchored to a trigger.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/popover.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "select",
      "type": "registry:ui",
      "title": "Select",
      "description": "A searchable-free listbox for choosing a single value, built on Base UI.",
      "registryDependencies": ["utils", "scroll-area"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/select.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "dropdown-menu",
      "type": "registry:ui",
      "title": "Dropdown Menu",
      "description": "Displays a menu of actions or options, triggered by a button.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/dropdown-menu.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "input-group",
      "type": "registry:ui",
      "title": "Input Group",
      "description": "Groups an input with addons, buttons, or text for complex input layouts.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/input",
        "@persianlabsui/textarea"
      ],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/input-group.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "field",
      "type": "registry:ui",
      "title": "Field",
      "description": "Groups a label, control, and description into an accessible form field, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/field.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "textarea",
      "type": "registry:ui",
      "title": "Textarea",
      "description": "A styled multi-line text input.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/textarea.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "kbd",
      "type": "registry:ui",
      "title": "Kbd",
      "description": "Displays a keyboard key or shortcut.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/kbd.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "badge",
      "type": "registry:ui",
      "title": "Badge",
      "description": "Displays a small badge to highlight status or metadata.",
      "registryDependencies": ["utils"],
      "dependencies": ["class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/badge.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "input-otp",
      "type": "registry:ui",
      "title": "Input OTP",
      "description": "An accessible one-time password input, built on input-otp.",
      "registryDependencies": ["utils"],
      "dependencies": ["input-otp", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/input-otp.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "separator",
      "type": "registry:ui",
      "title": "Separator",
      "description": "Visually or semantically separates content, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/separator.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "card",
      "type": "registry:ui",
      "title": "Card",
      "description": "Displays a card with header, content, and footer.",
      "registryDependencies": ["utils"],
      "dependencies": [],
      "files": [
        {
          "path": "registry/base/ui/card.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "breadcrumb",
      "type": "registry:ui",
      "title": "Breadcrumb",
      "description": "Displays the path to the current resource using a hierarchy of links.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/breadcrumb.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "empty",
      "type": "registry:ui",
      "title": "Empty",
      "description": "Displays an empty state with a title, description, and optional actions.",
      "registryDependencies": ["utils"],
      "dependencies": ["class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/empty.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "switch",
      "type": "registry:ui",
      "title": "Switch",
      "description": "A control that toggles between checked and unchecked, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/switch.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "checkbox",
      "type": "registry:ui",
      "title": "Checkbox",
      "description": "A control for selecting one or more options, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/checkbox.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "radio-group",
      "type": "registry:ui",
      "title": "Radio Group",
      "description": "A set of mutually exclusive radio buttons, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/radio-group.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "progress",
      "type": "registry:ui",
      "title": "Progress",
      "description": "Displays an indicator showing the completion progress of a task, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/progress.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "collapsible",
      "type": "registry:ui",
      "title": "Collapsible",
      "description": "An interactive component which expands/collapses a panel, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/collapsible.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "toggle",
      "type": "registry:ui",
      "title": "Toggle",
      "description": "A two-state button that can be either on or off, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/toggle.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "toggle-group",
      "type": "registry:ui",
      "title": "Toggle Group",
      "description": "A set of two-state buttons that can be toggled on or off, built on Base UI.",
      "registryDependencies": ["utils", "@persianlabsui/toggle"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/toggle-group.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "native-select",
      "type": "registry:ui",
      "title": "Native Select",
      "description": "A styled native <select> element for choosing a single value.",
      "registryDependencies": ["utils"],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/native-select.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "navigation-menu",
      "type": "registry:ui",
      "title": "Navigation Menu",
      "description": "A collection of links for navigating websites, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/navigation-menu.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "elastic-slider",
      "type": "registry:ui",
      "title": "Elastic Slider",
      "description": "Slider with elastic rubber-band drag and magnetic snap feedback.",
      "registryDependencies": ["utils"],
      "dependencies": ["motion"],
      "files": [
        {
          "path": "registry/base/ui/elastic-slider.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "elastic-range-slider",
      "type": "registry:ui",
      "title": "Elastic Range Slider",
      "description": "A single-track, dual-thumb range slider in the same visual language as Elastic Slider.",
      "registryDependencies": ["utils"],
      "dependencies": ["motion"],
      "files": [
        {
          "path": "registry/base/ui/elastic-range-slider.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "tooltip",
      "type": "registry:ui",
      "title": "Tooltip",
      "description": "Displays contextual information when hovering or focusing an element, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/tooltip.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "accordion",
      "type": "registry:ui",
      "title": "Accordion",
      "description": "A vertically stacked set of interactive headings that each reveal a section of content, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/accordion.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "sheet",
      "type": "registry:ui",
      "title": "Sheet",
      "description": "A panel that slides in from an edge of the screen to complement the main content, built on Base UI.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/sheet.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "sidebar",
      "type": "registry:ui",
      "title": "Sidebar",
      "description": "A composable, collapsible application sidebar with mobile drawer, tooltips, and RTL support, built on Base UI.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/input",
        "@persianlabsui/separator",
        "@persianlabsui/sheet",
        "@persianlabsui/skeleton",
        "@persianlabsui/tooltip"
      ],
      "dependencies": [
        "@base-ui/react",
        "class-variance-authority",
        "lucide-react"
      ],
      "files": [
        {
          "path": "registry/base/ui/sidebar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "carousel",
      "type": "registry:ui",
      "title": "Carousel",
      "description": "A carousel with motion and swipe built using Embla.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["embla-carousel-react"],
      "files": [
        {
          "path": "registry/base/ui/carousel.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "context-menu",
      "type": "registry:ui",
      "title": "Context Menu",
      "description": "A menu of actions triggered by a right click, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/context-menu.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "menubar",
      "type": "registry:ui",
      "title": "Menubar",
      "description": "A persistent horizontal menu bar for application-style commands, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/menubar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "dialog",
      "type": "registry:ui",
      "title": "Dialog",
      "description": "A modal window layered over the page for focused tasks or confirmations, built on Base UI.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/scroll-area"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/dialog.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "alert-dialog",
      "type": "registry:ui",
      "title": "Alert Dialog",
      "description": "A modal dialog that interrupts the user with important content and expects a response, built on Base UI.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/alert-dialog.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "drawer",
      "type": "registry:ui",
      "title": "Drawer",
      "description": "A swipeable panel that slides in from an edge of the screen, built on Base UI.",
      "registryDependencies": ["utils", "@persianlabsui/scroll-area"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/drawer.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "responsive-dialog",
      "type": "registry:ui",
      "title": "Responsive Dialog",
      "description": "Renders a Dialog on desktop and a bottom Drawer on mobile from one shared set of components.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/dialog",
        "@persianlabsui/drawer"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/responsive-dialog.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "responsive-menu",
      "type": "registry:ui",
      "title": "Responsive Menu",
      "description": "Renders a Dropdown Menu on desktop and a bottom Drawer menu on mobile from one shared set of components.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/dropdown-menu",
        "@persianlabsui/drawer"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/responsive-menu.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "responsive-alert-dialog",
      "type": "registry:ui",
      "title": "Responsive Alert Dialog",
      "description": "Renders an Alert Dialog on desktop and a bottom Drawer on mobile from one shared set of components.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/alert-dialog",
        "@persianlabsui/drawer"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/responsive-alert-dialog.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "alert",
      "type": "registry:ui",
      "title": "Alert",
      "description": "Displays a callout for important, contextual messages.",
      "registryDependencies": ["utils"],
      "dependencies": ["class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/alert.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "aspect-ratio",
      "type": "registry:ui",
      "title": "Aspect Ratio",
      "description": "Displays content within a desired ratio.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/aspect-ratio.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "attachment",
      "type": "registry:ui",
      "title": "Attachment",
      "description": "Displays a file or image attachment with media, metadata, upload state, and actions.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "files": [
        {
          "path": "registry/base/ui/attachment.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "avatar",
      "type": "registry:ui",
      "title": "Avatar",
      "description": "An image element with a fallback, for representing a user or entity, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/avatar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "skeleton",
      "type": "registry:ui",
      "title": "Skeleton",
      "description": "Used to show a placeholder while content is loading.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/skeleton.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "direction",
      "type": "registry:ui",
      "title": "Direction",
      "description": "A provider for setting the reading direction (LTR or RTL) of your app, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/direction.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "hover-card",
      "type": "registry:ui",
      "title": "Hover Card",
      "description": "For sighted users to preview content available behind a link, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/hover-card.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "iran-map-picker",
      "type": "registry:ui",
      "title": "Iran Map Picker",
      "description": "An interactive SVG map of Iran's provinces for picking a province, with hover previews, keyboard selection, and shadcn-style controlled state.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/ui/iran-map-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/lib/iran-map-data.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "item",
      "type": "registry:ui",
      "title": "Item",
      "description": "A flexible layout for a piece of content, media, or action, often used in lists.",
      "registryDependencies": ["utils", "@persianlabsui/separator"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/item.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "marker",
      "type": "registry:ui",
      "title": "Marker",
      "description": "A small label for annotating content, such as a section divider or inline note.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/marker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "bubble",
      "type": "registry:ui",
      "title": "Bubble",
      "description": "A chat message bubble with variants, reactions, and start/end alignment.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react", "class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/bubble.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "message",
      "type": "registry:ui",
      "title": "Message",
      "description": "Composable layout for a chat message with an avatar, header, content, and footer.",
      "registryDependencies": ["utils"],
      "files": [
        {
          "path": "registry/base/ui/message.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "message-scroller",
      "type": "registry:ui",
      "title": "Message Scroller",
      "description": "An auto-scrolling viewport for chat messages, with scroll-to-start/end buttons, built on @shadcn/react.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["@shadcn/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/message-scroller.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "pagination",
      "type": "registry:ui",
      "title": "Pagination",
      "description": "Navigation for paginated content, built on Button.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/pagination.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "resizable",
      "type": "registry:ui",
      "title": "Resizable",
      "description": "Accessible resizable panel groups and layouts, built on react-resizable-panels.",
      "registryDependencies": ["utils"],
      "dependencies": ["react-resizable-panels"],
      "files": [
        {
          "path": "registry/base/ui/resizable.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "table",
      "type": "registry:ui",
      "title": "Table",
      "description": "A responsive table component, with an optional card-row variant.",
      "registryDependencies": ["utils", "empty"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/table.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "toman-icon",
      "type": "registry:ui",
      "title": "Toman Icon",
      "description": "The Toman currency symbol, as a standalone icon component.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/ui/toman-icon.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "utils",
      "type": "registry:lib",
      "title": "Utils",
      "description": "The cn() class-merging helper, powered by the cn package (a drop-in clsx + tailwind-merge engine).",
      "registryDependencies": [],
      "dependencies": ["cn"],
      "files": [
        {
          "path": "registry/base/lib/utils.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "iranian-bank",
      "type": "registry:lib",
      "title": "Iranian Bank",
      "description": "Iranian card and Shaba normalization, checksum validation, and bank detection.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/iranian-bank.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "bank-input",
      "type": "registry:ui",
      "title": "Bank Input",
      "description": "Iranian card-number and Shaba inputs with paste normalization, checksum validation, and bank detection.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/input-group",
        "@persianlabsui/iranian-bank"
      ],
      "dependencies": ["@persianlabs/icons"],
      "files": [
        {
          "path": "registry/base/ui/bank-input.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "price-input",
      "type": "registry:ui",
      "title": "Price Input",
      "description": "A text input that live-formats digits as a grouped price as you type, with support for Persian/Arabic-Indic numerals.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/input",
        "@persianlabsui/normalize-persian-digits"
      ],
      "files": [
        {
          "path": "registry/base/ui/price-input.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "password-input",
      "type": "registry:ui",
      "title": "Password Input",
      "description": "A password input with a show/hide toggle that always renders LTR, regardless of the surrounding document direction.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/input-group"
      ],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/password-input.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "qr-code",
      "type": "registry:ui",
      "title": "QR Code",
      "description": "A rounded QR code generator with dot modules, custom foreground/background colors, configurable error correction, and a matching loading skeleton.",
      "registryDependencies": ["utils"],
      "dependencies": ["qrcode"],
      "files": [
        {
          "path": "registry/base/ui/qr-code.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "questionnaire",
      "type": "registry:ui",
      "title": "Questionnaire",
      "description": "A multi-step questionnaire with single-choice, multiple-choice, freeform, and skippable questions, built on @shadcn/react.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["@shadcn/react"],
      "files": [
        {
          "path": "registry/base/ui/questionnaire.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "toast",
      "type": "registry:ui",
      "title": "Toast",
      "description": "A temporary notification that stacks in a corner of the screen or anchors to an element, built on Base UI, with success/error/warning/info/loading and X-style variants.",
      "registryDependencies": ["utils", "@persianlabsui/button"],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/toast.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "copy-button",
      "type": "registry:ui",
      "title": "Copy Button",
      "description": "An icon button that copies text to the clipboard, morphs its icon to reflect the result, and anchors a confirmation toast to itself.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/tooltip",
        "@persianlabsui/toast"
      ],
      "dependencies": ["lucide", "morphicons"],
      "files": [
        {
          "path": "registry/base/ui/copy-button.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-copy-to-clipboard.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "normalize-persian-digits",
      "type": "registry:lib",
      "title": "Normalize Persian Digits",
      "description": "Converts Persian (۰-۹) and Arabic-Indic (٠-٩) numerals to plain 0-9 digits.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/lib/normalize-persian-digits.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "normalize-persian-text",
      "type": "registry:lib",
      "title": "Normalize Persian Text",
      "description": "Unifies Arabic-codepage letters onto Persian ones (ي→ی, ك→ک, …) with opt-in digit folding, diacritic stripping, half-space repair, and space tidying.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/normalize-persian-text.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "number-to-persian-words",
      "type": "registry:lib",
      "title": "Number to Persian Words",
      "description": "Spells numbers out in Persian words, accepting Latin or Persian digits with signs, decimals, and thousands separators.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/number-to-persian-words.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "use-controllable-state",
      "type": "registry:hook",
      "title": "useControllableState",
      "description": "A hook for a value that can be either controlled or uncontrolled, with a single consistent API either way.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-copy-to-clipboard",
      "type": "registry:hook",
      "title": "useCopyToClipboard",
      "description": "Wraps the Clipboard API with a built-in timeout to reset the copied state, for copy buttons that show brief confirmation feedback.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/hooks/use-copy-to-clipboard.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-countdown",
      "type": "registry:hook",
      "title": "useCountdown",
      "description": "A timer-aligned countdown hook for ISO-8601 target dates, with overdue state and formatted output.",
      "files": [
        {
          "path": "registry/base/hooks/use-countdown.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-media-query",
      "type": "registry:hook",
      "title": "useMediaQuery",
      "description": "Reactive media query hook with Tailwind-like breakpoint syntax, built on useSyncExternalStore for SSR safety.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "persian-date",
      "type": "registry:lib",
      "title": "Persian Date",
      "description": "Jalali/Gregorian date utilities built on date-fns and date-fns-jalali: formatting, parsing, conversion, ranges, and digit conversion, switchable with a calendarType prop.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "dependencies": ["date-fns", "date-fns-jalali"],
      "files": [
        {
          "path": "registry/base/lib/persian-date.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "persian-date-zod",
      "type": "registry:lib",
      "title": "Persian Date (Zod)",
      "description": "zod schemas for persian-date: zPersianDate coerces an ISO string, a shamsi yyyy/MM/dd string, an epoch number, or a Date into a Date with optional min/max bounds; zPersianDateRange validates a from/to reservation-style range.",
      "registryDependencies": ["@persianlabsui/persian-date"],
      "dependencies": ["date-fns", "date-fns-jalali", "zod"],
      "files": [
        {
          "path": "registry/base/lib/persian-date-zod.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "persian-holidays",
      "type": "registry:lib",
      "title": "Persian Holidays",
      "description": "Official/religious/cultural Iranian holiday lookup for a date, range, or year, resolving Jalali, Gregorian, and tabular-Hijri entries.",
      "registryDependencies": ["@persianlabsui/persian-date"],
      "dependencies": ["date-fns", "date-fns-jalali"],
      "files": [
        {
          "path": "registry/base/lib/persian-holidays.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/base/lib/persian-holidays-data.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "persian-slug",
      "type": "registry:lib",
      "title": "Persian Slug",
      "description": "Converts Persian/mixed Persian+English text into a URL-safe slug, keeping Persian script by default or transliterating to Latin/ASCII.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/persian-slug.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "persian-reshape",
      "type": "registry:lib",
      "title": "Persian Reshape",
      "description": "Pre-shapes Persian/Arabic text into joined Unicode presentation-form codepoints so it renders correctly in Satori/next-og images, which don't shape connected scripts on their own.",
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/base/lib/persian-reshape.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "use-date",
      "type": "registry:hook",
      "title": "useDate",
      "description": "A reactive current date/time hook with Jalali/Gregorian support, formatted output, and optional holiday flagging.",
      "registryDependencies": [
        "@persianlabsui/persian-date",
        "@persianlabsui/persian-holidays"
      ],
      "files": [
        {
          "path": "registry/base/hooks/use-date.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "use-time-ago",
      "type": "registry:hook",
      "title": "useTimeAgo",
      "description": "A reactive relative-time formatter (\"۲ روز پیش\" / \"2 days ago\") with built-in Persian and English message tables.",
      "registryDependencies": ["@persianlabsui/persian-date"],
      "files": [
        {
          "path": "registry/base/hooks/use-time-ago.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "hitbox",
      "type": "registry:ui",
      "title": "Hitbox",
      "description": "Extends the clickable area of a child element for improved accessibility.",
      "registryDependencies": ["utils"],
      "dependencies": ["class-variance-authority"],
      "files": [
        {
          "path": "registry/base/ui/hitbox.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "calendar",
      "type": "registry:ui",
      "title": "Calendar",
      "description": "A date-grid calendar built on react-day-picker, switchable between the Jalali (Shamsi) and Gregorian (Miladi) calendars via a calendarType prop, with an optional showHolidays prop for Iranian holiday highlighting.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/select",
        "@persianlabsui/badge",
        "@persianlabsui/tooltip",
        "@persianlabsui/persian-date",
        "@persianlabsui/persian-holidays"
      ],
      "dependencies": ["react-day-picker", "@daypicker/persian", "date-fns"],
      "files": [
        {
          "path": "registry/base/ui/calendar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "wheel-picker",
      "type": "registry:ui",
      "title": "Wheel Picker",
      "description": "An iOS-like wheel picker with smooth inertia, infinite scrolling, and keyboard navigation.",
      "registryDependencies": ["utils"],
      "dependencies": ["@ncdai/react-wheel-picker"],
      "files": [
        {
          "path": "registry/base/ui/wheel-picker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "date-picker",
      "type": "registry:ui",
      "title": "Date Picker",
      "description": "An opinionated, responsive Shamsi/Gregorian date and date-time picker with SSR-safe today defaults, draft state, and Popover-to-Drawer presentation.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/calendar",
        "@persianlabsui/popover",
        "@persianlabsui/drawer",
        "@persianlabsui/time-picker",
        "@persianlabsui/persian-date"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/date-picker.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "time-picker",
      "type": "registry:ui",
      "title": "Time Picker",
      "description": "An hour/minute/second wheel-based time picker, with a responsive Popover-on-desktop, Drawer-on-mobile composition.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/wheel-picker",
        "@persianlabsui/popover",
        "@persianlabsui/drawer",
        "@persianlabsui/persian-date"
      ],
      "dependencies": ["@ncdai/react-wheel-picker", "@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/time-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "receipt-printer",
      "type": "registry:ui",
      "title": "Receipt Printer",
      "description": "A tactile checkout printer with processing stages and a composable thermal-paper receipt.",
      "registryDependencies": ["utils"],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/receipt-printer.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "date-wheel-picker",
      "type": "registry:ui",
      "title": "Date Wheel Picker",
      "description": "An iOS-style year/month/day wheel-based date picker, switchable between the Shamsi and Gregorian calendars, with a responsive Popover-on-desktop, Drawer-on-mobile composition.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/wheel-picker",
        "@persianlabsui/popover",
        "@persianlabsui/drawer",
        "@persianlabsui/persian-date"
      ],
      "dependencies": ["@ncdai/react-wheel-picker", "@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/date-wheel-picker.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-media-query.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "slider",
      "type": "registry:ui",
      "title": "Slider",
      "description": "An input where the user selects a value from within a given range, built on Base UI.",
      "registryDependencies": ["utils"],
      "dependencies": ["@base-ui/react"],
      "files": [
        {
          "path": "registry/base/ui/slider.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "iranian-mobile",
      "type": "registry:lib",
      "title": "Iranian Mobile",
      "description": "Iranian mobile phone number normalization, validation, and masking.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/iranian-mobile.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "mobile-number-input",
      "type": "registry:ui",
      "title": "Mobile Number Input",
      "description": "An Iranian mobile number input that normalizes mixed paste formats and Persian digits, with a redundant validity indicator.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/input-group",
        "@persianlabsui/iranian-mobile"
      ],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/mobile-number-input.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "national-id",
      "type": "registry:lib",
      "title": "National ID",
      "description": "Validates Iranian national ID (کد ملی) numbers using the standard 10-digit checksum.",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/national-id.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "postal-code",
      "type": "registry:lib",
      "title": "Postal Code",
      "description": "Validates the structural format of Iranian postal codes (کد پستی).",
      "registryDependencies": ["@persianlabsui/normalize-persian-digits"],
      "files": [
        {
          "path": "registry/base/lib/postal-code.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "status-button",
      "type": "registry:ui",
      "title": "Status Button",
      "description": "A button that swaps between idle, loading, and success feedback for async actions.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/button",
        "@persianlabsui/spinner"
      ],
      "dependencies": ["lucide-react", "motion"],
      "files": [
        {
          "path": "registry/base/ui/status-button.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "plate-input",
      "type": "registry:ui",
      "title": "Plate Input",
      "description": "An Iranian vehicle license plate input with digit segments, a letter picker including wheelchair plates, and the Iran serial tab.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/input-group",
        "@persianlabsui/select",
        "@persianlabsui/normalize-persian-digits"
      ],
      "dependencies": ["@base-ui/react", "lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/plate-input.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "national-id-input",
      "type": "registry:ui",
      "title": "National ID Input",
      "description": "An Iranian national ID (کد ملی) input that normalizes Persian digits as you type or paste and validates the checksum live, with a redundant validity indicator.",
      "registryDependencies": [
        "utils",
        "@persianlabsui/input-group",
        "@persianlabsui/national-id",
        "@persianlabsui/normalize-persian-digits"
      ],
      "dependencies": ["lucide-react"],
      "files": [
        {
          "path": "registry/base/ui/national-id-input.tsx",
          "type": "registry:ui"
        },
        {
          "path": "registry/base/hooks/use-controllable-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "bounce-sidebar",
      "type": "registry:ui",
      "title": "Bounce Sidebar",
      "description": "A vertical navigation list with a bouncy, arc-animated active marker that springs between items.",
      "registryDependencies": ["utils"],
      "dependencies": ["motion"],
      "files": [
        {
          "path": "registry/base/ui/bounce-sidebar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "proximity-sidebar",
      "type": "registry:ui",
      "title": "Proximity Sidebar",
      "description": "A document minimap of proximity-reactive dashes that tracks scroll position, expands near the pointer, and smooth-scrolls to sections on click.",
      "registryDependencies": ["utils"],
      "dependencies": ["motion"],
      "files": [
        {
          "path": "registry/base/ui/proximity-sidebar.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "duration-picker",
      "type": "registry:ui",
      "title": "Duration Picker",
      "description": "A gooey, spring-animated picker for entering a duration in hours and minutes.",
      "registryDependencies": ["utils"],
      "dependencies": [
        "@base-ui/react",
        "motion",
        "figma-squircle",
        "flubber",
        "react-use-measure"
      ],
      "files": [
        {
          "path": "registry/base/ui/duration-picker.tsx",
          "type": "registry:ui"
        }
      ]
    }
  ]
}
