{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "alexandrejoly",
  "homepage": "https://alexandrejoly.me",
  "items": [
    {
      "name": "notification-badge",
      "type": "registry:ui",
      "title": "Notification Badge",
      "description": "A counter or dot on an icon or avatar, cut out with CSS shape() so it reads on any background",
      "dependencies": ["class-variance-authority"],
      "registryDependencies": [],
      "files": [
        {
          "path": "registry/notification-badge.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "onboarding",
      "type": "registry:ui",
      "title": "Onboarding",
      "description": "A step-by-step flow with a segmented progress bar and CSS-only step transitions",
      "dependencies": ["@base-ui/react"],
      "registryDependencies": ["button", "progress"],
      "files": [
        {
          "path": "registry/onboarding.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "hint",
      "type": "registry:ui",
      "title": "Hint",
      "description": "A labeled trigger that opens a help bubble, its hit area stretched by a pseudo-element",
      "dependencies": [],
      "registryDependencies": ["popover"],
      "files": [
        {
          "path": "registry/hint.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "infinite-scroll",
      "type": "registry:ui",
      "title": "Infinite Scroll",
      "description": "A list that loads more as you scroll, down or up, with a reverse mode held in place by CSS alone",
      "dependencies": ["@base-ui/react"],
      "registryDependencies": ["spinner"],
      "files": [
        {
          "path": "registry/infinite-scroll.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "marquee",
      "type": "registry:ui",
      "title": "Marquee",
      "description": "A strip that loops its items only once CSS scroll-driven animations detect they overflow",
      "dependencies": ["@base-ui/react"],
      "registryDependencies": ["button"],
      "files": [
        {
          "path": "registry/marquee.tsx",
          "type": "registry:ui"
        }
      ],
      "cssVars": {
        "theme": {
          "animate-marquee": "marquee var(--marquee-duration, 40s) linear infinite",
          "animate-marquee-reverse": "marquee var(--marquee-duration, 40s) linear infinite reverse",
          "animate-marquee-vertical": "marquee-vertical var(--marquee-duration, 40s) linear infinite",
          "animate-marquee-overflow": "marquee-overflow linear both"
        }
      },
      "css": {
        "@keyframes marquee": {
          "to": {
            "transform": "translateX(-50%)"
          }
        },
        "@keyframes marquee-vertical": {
          "to": {
            "transform": "translateY(-50%)"
          }
        },
        "@keyframes marquee-overflow": {
          "from, to": {
            "--marquee-overflowing": "1"
          }
        }
      }
    },
    {
      "name": "item-inset-separator",
      "type": "registry:ui",
      "title": "Item Inset Separator",
      "description": "A divider under an Item that starts at its content, past the media, placed with CSS anchor positioning",
      "registryDependencies": ["item"],
      "files": [
        {
          "path": "registry/item-inset-separator.tsx",
          "type": "registry:ui"
        }
      ]
    },
    {
      "name": "dialog-drawer",
      "type": "registry:ui",
      "title": "Dialog Drawer",
      "description": "A responsive Dialog: a centered Dialog at desktop that becomes a swipeable Drawer below 768px. Drop-in replacement for the shadcn Dialog on Base UI or Radix: desktop props 1:1 on the root and every part, open state kept across the breakpoint, footer close button on both sides, plus a drawer={{...}} override typed on your Drawer.",
      "dependencies": [],
      "registryDependencies": ["dialog", "drawer", "button", "use-mobile"],
      "files": [
        {
          "path": "registry/dialog-drawer.tsx",
          "type": "registry:ui"
        }
      ],
      "meta": {
        "docs": "https://responsivecn.alexandrejoly.me/docs/dialog-drawer"
      }
    },
    {
      "name": "sheet-drawer",
      "type": "registry:ui",
      "title": "Sheet Drawer",
      "description": "A responsive Sheet: a side Sheet at desktop that becomes a swipeable Drawer below 768px, opening from the edge set with side. Drop-in replacement for the shadcn Sheet on Base UI or Radix: desktop props 1:1 on the root and every part, open state kept across the breakpoint, plus a drawer={{...}} override typed on your Drawer.",
      "dependencies": [],
      "registryDependencies": ["sheet", "drawer", "use-mobile"],
      "files": [
        {
          "path": "registry/sheet-drawer.tsx",
          "type": "registry:ui"
        }
      ],
      "meta": {
        "docs": "https://responsivecn.alexandrejoly.me/docs/sheet-drawer"
      }
    },
    {
      "name": "popover-drawer",
      "type": "registry:ui",
      "title": "Popover Drawer",
      "description": "A responsive Popover: an anchored Popover at desktop that becomes a swipeable Drawer below 768px. Drop-in replacement for the shadcn Popover on Base UI or Radix: desktop props 1:1 on the root and every part, Anchor included on Radix, open state kept across the breakpoint, plus a drawer={{...}} override typed on your Drawer.",
      "dependencies": [],
      "registryDependencies": ["popover", "drawer", "use-mobile"],
      "files": [
        {
          "path": "registry/popover-drawer.tsx",
          "type": "registry:ui"
        }
      ],
      "meta": {
        "docs": "https://responsivecn.alexandrejoly.me/docs/popover-drawer"
      }
    },
    {
      "name": "tooltip-popover",
      "type": "registry:ui",
      "title": "Tooltip Popover",
      "description": "A responsive Tooltip for infotips: a hover Tooltip at desktop that becomes a tap-to-open Popover below 768px, because hover does not exist on touch. Drop-in replacement for the shadcn Tooltip on Base UI or Radix (Tooltip, TooltipTrigger, TooltipContent): desktop props 1:1, open state kept across the breakpoint, plus a popover={{...}} override typed on your Popover.",
      "dependencies": [],
      "registryDependencies": ["tooltip", "popover", "use-mobile"],
      "files": [
        {
          "path": "registry/tooltip-popover.tsx",
          "type": "registry:ui"
        }
      ],
      "meta": {
        "docs": "https://responsivecn.alexandrejoly.me/docs/tooltip-popover"
      }
    },
    {
      "name": "easy-modal",
      "type": "registry:ui",
      "title": "Easy Modal",
      "description": "Modal component for react-easy-modals with Base UI Dialog. Supports nested modals.",
      "dependencies": ["react-easy-modals"],
      "registryDependencies": ["dialog"],
      "files": [
        {
          "path": "registry/modal.tsx",
          "type": "registry:ui"
        }
      ],
      "meta": {
        "docs": "https://react-easy-modals.alexandrejoly.me/docs/registry"
      }
    }
  ]
}
