{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "loading-overlay",
  "title": "Loading Overlay",
  "description": "Loading Overlay from the Get IT Done design system.",
  "dependencies": [
    "@radix-ui/react-dialog@^1.3.1"
  ],
  "registryDependencies": [
    "https://zero-design.itdone.de/r/labels-context.json",
    "https://zero-design.itdone.de/r/loading-spinner.json",
    "https://zero-design.itdone.de/r/modal-inert.json",
    "https://zero-design.itdone.de/r/utils.json",
    "https://zero-design.itdone.de/r/theme.json"
  ],
  "files": [
    {
      "path": "registry/ui/loading-overlay.tsx",
      "content": "'use client';\n\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport * as React from 'react';\n\nimport { MODAL_OVERLAY_ATTRIBUTE, useModalInertRef } from '@/lib/modal-inert';\nimport { cn } from '@/lib/utils';\nimport { useLabels } from '@/components/ui/labels-context';\nimport { LoadingSpinner } from '@/components/ui/loading-spinner';\n\nexport interface LoadingOverlayProps {\n  open: boolean;\n  // Visible and announced text. Defaults to the provider \"Loading\" text.\n  label?: string;\n  description?: string;\n  // Scope the overlay to an element (must be relative) instead of the window.\n  container?: HTMLElement | null;\n  className?: string;\n}\n\n// Full-screen blocking overlay for long operations. Focus is trapped on the status text and Escape or an outside click does not dismiss it.\nconst LoadingOverlay = ({ open, label: labelProp, description, container, className }: LoadingOverlayProps) => {\n  const l = useLabels();\n  const label = labelProp ?? l.loading;\n  const scoped = Boolean(container);\n  const inertRef = useModalInertRef<HTMLDivElement>(true);\n  return (\n    <DialogPrimitive.Root open={open} modal>\n      <DialogPrimitive.Portal container={container ?? undefined}>\n        <DialogPrimitive.Overlay\n          {...{ [MODAL_OVERLAY_ATTRIBUTE]: '' }}\n          className={cn('inset-0 z-dialog bg-overlay data-[state=open]:animate-in data-[state=open]:fade-in-0 motion-reduce:animate-none', scoped ? 'absolute' : 'fixed')}\n        />\n        <DialogPrimitive.Content\n          ref={inertRef}\n          aria-busy=\"true\"\n          onEscapeKeyDown={(event) => event.preventDefault()}\n          onPointerDownOutside={(event) => event.preventDefault()}\n          onInteractOutside={(event) => event.preventDefault()}\n          className={cn(\n            'left-1/2 top-1/2 z-dialog flex -translate-x-1/2 -translate-y-1/2 flex-col items-center gap-4 rounded-surface bg-popover px-8 py-6 text-center text-popover-foreground shadow-elevation-raised outline-none',\n            scoped ? 'absolute' : 'fixed',\n            className,\n          )}\n        >\n          <LoadingSpinner aria-hidden=\"true\" role=\"presentation\" aria-live=\"off\" />\n          <DialogPrimitive.Title className=\"typography-ui-semibold m-0\">{label}</DialogPrimitive.Title>\n          <DialogPrimitive.Description className={cn('typography-ui m-0 text-text-subtle', !description && 'sr-only')}>\n            {description ?? label}\n          </DialogPrimitive.Description>\n        </DialogPrimitive.Content>\n      </DialogPrimitive.Portal>\n    </DialogPrimitive.Root>\n  );\n};\nLoadingOverlay.displayName = 'LoadingOverlay';\n\nexport { LoadingOverlay };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}