{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "ink/confirm",
  "title": "Confirm",
  "description": "Yes/No confirmation prompt",
  "dependencies": [
    "ink"
  ],
  "registryDependencies": [
    "https://termcn.dev/r/ink/interaction.json",
    "https://termcn.dev/r/ink/terminal-symbols.json",
    "https://termcn.dev/r/ink/use-theme.json",
    "https://termcn.dev/r/ink/use-unicode.json"
  ],
  "files": [
    {
      "path": "registry/ui/confirm.tsx",
      "content": "import { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\n\nimport {\n  isActivationKey,\n  useInteraction,\n} from \"@/hooks/use-interaction\";\nimport type { InteractionProps } from \"@/hooks/use-interaction\";\nimport { useTheme } from \"@/hooks/use-theme\";\nimport { useUnicode } from \"@/hooks/use-unicode\";\nimport { resolveTerminalSymbol } from \"@/lib/terminal-symbols\";\n\nexport interface ConfirmProps extends InteractionProps {\n  message: string;\n  onConfirm?: () => void;\n  onCancel?: () => void;\n  confirmLabel?: string;\n  cancelLabel?: string;\n  defaultValue?: boolean;\n  variant?: \"default\" | \"danger\";\n  \"aria-label\"?: string;\n}\n\nexport const Confirm = ({\n  message,\n  onConfirm,\n  onCancel,\n  confirmLabel = \"Yes\",\n  cancelLabel = \"No\",\n  defaultValue = false,\n  variant = \"default\",\n  id,\n  autoFocus,\n  isActive,\n  disabled,\n  \"aria-label\": ariaLabel,\n}: ConfirmProps) => {\n  const theme = useTheme();\n  const unicode = useUnicode();\n  const cursor = resolveTerminalSymbol(unicode, \"›\", \">\");\n  const [selected, setSelected] = useState<boolean>(defaultValue);\n\n  const { isFocused } = useInteraction(\n    (input, key) => {\n      if (key.leftArrow || key.rightArrow) {\n        setSelected((s) => !s);\n      } else if (isActivationKey(input, key)) {\n        if (selected) {\n          onConfirm?.();\n        } else {\n          onCancel?.();\n        }\n      } else if (input === \"y\" || input === \"Y\") {\n        onConfirm?.();\n      } else if (input === \"n\" || input === \"N\") {\n        onCancel?.();\n      }\n    },\n    { autoFocus, disabled, id, isActive }\n  );\n\n  const yesColor =\n    variant === \"danger\" ? theme.colors.error : theme.colors.primary;\n\n  return (\n    <Box flexDirection=\"column\" gap={0} aria-role=\"toolbar\">\n      <Text aria-label={ariaLabel ?? `Confirmation: ${message}`}>{\"\"}</Text>\n      <Text>\n        <Text color={theme.colors.primary}>{\"? \"}</Text>\n        {message}\n      </Text>\n      <Box gap={2} paddingLeft={2}>\n        <Box\n          gap={1}\n          aria-role=\"button\"\n          aria-label={confirmLabel}\n          aria-state={{ disabled: disabled || undefined }}\n        >\n          {selected ? (\n            <Text color={yesColor} bold>\n              {`[${cursor}] `}\n              {confirmLabel}\n            </Text>\n          ) : (\n            <Text color={theme.colors.mutedForeground}>\n              {\"  \"}\n              {confirmLabel}\n            </Text>\n          )}\n        </Box>\n        <Box\n          gap={1}\n          aria-role=\"button\"\n          aria-label={cancelLabel}\n          aria-state={{ disabled: disabled || undefined }}\n        >\n          {selected ? (\n            <Text color={theme.colors.mutedForeground}>\n              {\"  \"}\n              {cancelLabel}\n            </Text>\n          ) : (\n            <Text bold>\n              {selected ? `[${cursor}] ` : `${cursor} `}\n              {cancelLabel}\n            </Text>\n          )}\n        </Box>\n      </Box>\n    </Box>\n  );\n};\n",
      "type": "registry:ui"
    }
  ],
  "categories": [
    "forms"
  ],
  "type": "registry:ui"
}