{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "Sonner",
  "dependencies": [
    "lucide-react",
    "next-themes",
    "sonner"
  ],
  "registryDependencies": [
    "@rescript-shadcn/Icons"
  ],
  "files": [
    {
      "path": "registry/base/ui/Sonner.res",
      "content": "@@directive(\"'use client'\")\n\nmodule NextThemes = {\n  type theme =\n    | @as(\"system\") System\n    | @as(\"light\") Light\n    | @as(\"dark\") Dark\n  type themeState = {theme: option<theme>}\n\n  @module(\"next-themes\")\n  external useTheme: unit => themeState = \"useTheme\"\n}\n\nmodule Position = {\n  type t =\n    | @as(\"top-left\") TopLeft\n    | @as(\"top-right\") TopRight\n    | @as(\"bottom-left\") BottomLeft\n    | @as(\"bottom-right\") BottomRight\n    | @as(\"top-center\") TopCenter\n    | @as(\"bottom-center\") BottomCenter\n}\n\nmodule ToasterIcons = {\n  type t = {\n    success: React.element,\n    info: React.element,\n    warning: React.element,\n    error: React.element,\n    loading: React.element,\n  }\n}\n\nmodule ToastClassNames = {\n  type t = {toast: string}\n}\nmodule ToastOptions = {\n  type t = {classNames: ToastClassNames.t}\n}\n\nmodule Offset = {\n  type t = {\n    top: string,\n    right: string,\n    bottom: string,\n    left: string,\n  }\n}\n\nmodule Dir = {\n  type t =\n    | @as(\"rtl\") Rtl\n    | @as(\"ltr\") Ltr\n    | @as(\"auto\") Auto\n}\n\nmodule SwipeDirection = {\n  type t =\n    | @as(\"top\") Top\n    | @as(\"right\") Right\n    | @as(\"bottom\") Bottom\n    | @as(\"left\") Left\n}\n\nmodule Action = {\n  type t = {\n    label: React.element,\n    onClick: unit => unit,\n  }\n}\n\nmodule Options = {\n  type t = {\n    description?: React.element,\n    action?: Action.t,\n    position?: Position.t,\n    cancel?: React.element,\n  }\n}\nmodule Promise = {\n  module Options = {\n    type t<'success, 'error> = {\n      loading?: React.element,\n      success?: 'success => React.element,\n      error?: 'error => React.element,\n      description?: 'success => 'error => React.element,\n      finally?: unit => promise<unit>,\n    }\n  }\n}\n@module(\"sonner\") external toast: (React.element, ~options: Options.t=?) => unit = \"toast\"\n@module(\"sonner\") @scope(\"toast\")\nexternal success: (React.element, ~options: Options.t=?) => unit = \"success\"\n@module(\"sonner\") @scope(\"toast\")\nexternal info: (React.element, ~options: Options.t=?) => unit = \"info\"\n@module(\"sonner\") @scope(\"toast\")\nexternal warning: (React.element, ~options: Options.t=?) => unit = \"warning\"\n@module(\"sonner\") @scope(\"toast\")\nexternal error: (React.element, ~options: Options.t=?) => unit = \"error\"\n@module(\"sonner\") @scope(\"toast\")\nexternal promise: (unit => promise<'success>, Promise.Options.t<'success, 'error>) => unit =\n  \"promise\"\n\nmodule SonnerPrimitive = {\n  type props = {\n    id?: string,\n    invert?: bool,\n    theme?: NextThemes.theme,\n    position?: Position.t,\n    hotkey?: array<string>,\n    richColors?: bool,\n    expand?: bool,\n    duration?: int,\n    gap?: int,\n    visibleToasts?: int,\n    closeButton?: bool,\n    toastOptions?: ToastOptions.t,\n    className?: string,\n    style?: ReactDOM.Style.t,\n    offset?: Offset.t,\n    mobileOffset?: Offset.t,\n    dir?: Dir.t,\n    swipeDirections?: array<SwipeDirection.t>,\n    icons?: ToasterIcons.t,\n    containerAriaLabel?: string,\n  }\n  @module(\"sonner\")\n  external make: React.component<props> = \"Toaster\"\n}\n\n@react.componentWithProps(SonnerPrimitive.props)\nlet make = (props: SonnerPrimitive.props) => {\n  let theme = props.theme\n  let toastOptions =\n    props.toastOptions->Option.getOr({ToastOptions.classNames: {toast: \"rounded-2xl\"}})\n  let className = props.className->Option.getOr(\"toaster group\")\n  let style = props.style->Option.getOr(\n    ReactDOM.Style._dictToStyle(\n      dict{\n        \"--normal-bg\": \"var(--popover)\",\n        \"--normal-text\": \"var(--popover-foreground)\",\n        \"--normal-border\": \"var(--border)\",\n        \"--border-radius\": \"var(--radius)\",\n      },\n    ),\n  )\n  let icons = props.icons->Option.getOr({\n    ToasterIcons.success: <Icons.CircleCheck className=\"size-4\" />,\n    info: <Icons.Info className=\"size-4\" />,\n    warning: <Icons.TriangleAlert className=\"size-4\" />,\n    error: <Icons.OctagonX className=\"size-4\" />,\n    loading: <Icons.Loader2 className=\"size-4 animate-spin\" />,\n  })\n  let {theme: defaultTheme} = NextThemes.useTheme()\n  let theme = theme->Option.orElse(defaultTheme)->Option.getOr(System)\n  <SonnerPrimitive {...props} theme toastOptions className style icons />\n}\n",
      "type": "registry:file",
      "target": "@ui/Sonner.res"
    }
  ],
  "type": "registry:ui"
}