{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "dialog",
  "title": "Dialog",
  "description": "A question over a dimmed page. It traps focus and returns it when closed.",
  "dependencies": [
    "@radix-ui/react-dialog@^1.2.0"
  ],
  "registryDependencies": [
    "https://creance.pages.dev/r/creance-base.json"
  ],
  "files": [
    {
      "path": "dialog/Dialog.css",
      "content": ".cr-dialog-overlay {\n  position: fixed;\n  inset: 0;\n  z-index: 40;\n  background: var(--cr-color-bg-overlay);\n  -webkit-backdrop-filter: blur(4px);\n  backdrop-filter: blur(4px);\n  animation: cr-fade-in var(--cr-motion-duration-base) var(--cr-motion-easing-standard);\n}\n\n.cr-dialog {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  z-index: 41;\n  box-sizing: border-box;\n  display: grid;\n  gap: var(--cr-space-3);\n  width: min(520px, calc(100vw - 2 * var(--cr-space-4)));\n  max-height: calc(100vh - 2 * var(--cr-space-4));\n  overflow-y: auto;\n  padding: 28px;\n  border-radius: var(--cr-radius-xl);\n  color: var(--cr-color-text-default);\n  font-family: var(--cr-font-family-sans);\n  font-size: var(--cr-font-size-md);\n  transform: translate(-50%, -50%);\n  animation: cr-dialog-in var(--cr-motion-duration-slow) var(--cr-motion-easing-spring);\n}\n\n.cr-dialog:focus-visible {\n  outline: none;\n}\n\n.cr-dialog__title {\n  margin: 0;\n  font-family: var(--cr-font-family-display);\n  font-size: 22px;\n  font-weight: var(--cr-font-weight-bold);\n  letter-spacing: -0.015em;\n}\n\n.cr-dialog__description {\n  margin: 0;\n  color: var(--cr-color-text-secondary);\n  line-height: var(--cr-font-line-height-normal);\n}\n\n.cr-dialog__actions {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-end;\n  gap: var(--cr-space-2);\n  padding-top: var(--cr-space-2);\n}\n\n@keyframes cr-fade-in {\n  from { opacity: 0; }\n}\n\n@keyframes cr-dialog-in {\n  from { opacity: 0; transform: translate(-50%, -48%) scale(0.97); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .cr-dialog, .cr-dialog-overlay { animation: none; }\n}\n",
      "type": "registry:file",
      "target": "@components/creance/dialog/Dialog.css"
    },
    {
      "path": "dialog/Dialog.tsx",
      "content": "'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ComponentPropsWithoutRef, type ReactNode } from 'react';\nimport { cx } from '@/lib/creance/cx';\nimport './Dialog.css';\n\n/** Radix Dialog: traps focus, closes on Escape, returns focus to the trigger. */\nexport const Dialog = RadixDialog.Root;\nexport const DialogTrigger = RadixDialog.Trigger;\nexport const DialogClose = RadixDialog.Close;\n\nexport interface DialogContentProps extends Omit<ComponentPropsWithoutRef<typeof RadixDialog.Content>, 'title'> {\n  title: ReactNode;\n  /** One or two sentences: what happens, and what does not. */\n  description?: ReactNode;\n  /** Buttons, right-aligned. Put the safe choice first and the action that answers the title last. */\n  actions?: ReactNode;\n}\n\nexport const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(function DialogContent(\n  { title, description, actions, className, children, ...props },\n  ref,\n) {\n  return (\n    <RadixDialog.Portal>\n      <RadixDialog.Overlay className=\"cr-dialog-overlay\" />\n      <RadixDialog.Content\n        ref={ref}\n        className={cx('cr-dialog cr-glass', className)}\n        {...(description ? {} : { 'aria-describedby': undefined })}\n        {...props}\n      >\n        <RadixDialog.Title className=\"cr-dialog__title\">{title}</RadixDialog.Title>\n        {description && <RadixDialog.Description className=\"cr-dialog__description\">{description}</RadixDialog.Description>}\n        {children}\n        {actions && <div className=\"cr-dialog__actions\">{actions}</div>}\n      </RadixDialog.Content>\n    </RadixDialog.Portal>\n  );\n});\n",
      "type": "registry:ui",
      "target": "@components/creance/dialog/Dialog.tsx"
    }
  ],
  "categories": [
    "molecule",
    "overlays"
  ],
  "type": "registry:ui"
}