{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "ink/big-text",
  "title": "Big Text",
  "description": "Figlet-style large ASCII art text",
  "dependencies": [
    "ink"
  ],
  "registryDependencies": [
    "https://termcn.dev/r/ink/accessibility.json",
    "https://termcn.dev/r/ink/use-theme.json",
    "https://termcn.dev/r/ink/use-unicode.json"
  ],
  "files": [
    {
      "path": "registry/ui/big-text.tsx",
      "content": "import { Box, Text } from \"ink\";\n\nimport { useTheme } from \"@/hooks/use-theme\";\nimport { useUnicode } from \"@/hooks/use-unicode\";\nimport { toAsciiComponentText } from \"@/lib/accessibility\";\n\nexport type BigTextFont = \"block\" | \"simple\" | \"shade\" | \"slim\";\n\nexport interface BigTextProps {\n  children: string;\n  color?: string;\n  font?: BigTextFont;\n  \"aria-label\"?: string;\n  \"aria-hidden\"?: boolean;\n}\n\nconst FONT: Record<string, number[][]> = {\n  \" \": [\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 0, 0],\n  ],\n  \"!\": [\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 0, 0],\n    [0, 1, 0],\n  ],\n  \"-\": [\n    [0, 0, 0],\n    [0, 0, 0],\n    [1, 1, 1],\n    [0, 0, 0],\n    [0, 0, 0],\n  ],\n  \".\": [\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 0, 0],\n    [0, 1, 0],\n  ],\n  \"0\": [\n    [0, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  \"1\": [\n    [0, 1, 0],\n    [1, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n    [1, 1, 1],\n  ],\n  \"2\": [\n    [1, 1, 0],\n    [0, 0, 1],\n    [0, 1, 0],\n    [1, 0, 0],\n    [1, 1, 1],\n  ],\n  \"3\": [\n    [1, 1, 0],\n    [0, 0, 1],\n    [0, 1, 0],\n    [0, 0, 1],\n    [1, 1, 0],\n  ],\n  \"4\": [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 1],\n    [0, 0, 1],\n    [0, 0, 1],\n  ],\n  \"5\": [\n    [1, 1, 1],\n    [1, 0, 0],\n    [1, 1, 0],\n    [0, 0, 1],\n    [1, 1, 0],\n  ],\n  \"6\": [\n    [0, 1, 1],\n    [1, 0, 0],\n    [1, 1, 0],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  \"7\": [\n    [1, 1, 1],\n    [0, 0, 1],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n  ],\n  \"8\": [\n    [0, 1, 0],\n    [1, 0, 1],\n    [0, 1, 0],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  \"9\": [\n    [0, 1, 0],\n    [1, 0, 1],\n    [0, 1, 1],\n    [0, 0, 1],\n    [1, 1, 0],\n  ],\n  \":\": [\n    [0, 0, 0],\n    [0, 1, 0],\n    [0, 0, 0],\n    [0, 1, 0],\n    [0, 0, 0],\n  ],\n  \"?\": [\n    [0, 1, 0],\n    [1, 0, 1],\n    [0, 0, 1],\n    [0, 1, 0],\n    [0, 1, 0],\n  ],\n  A: [\n    [0, 1, 0],\n    [1, 0, 1],\n    [1, 1, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  B: [\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 1, 0],\n  ],\n  C: [\n    [0, 1, 1],\n    [1, 0, 0],\n    [1, 0, 0],\n    [1, 0, 0],\n    [0, 1, 1],\n  ],\n  D: [\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 0],\n  ],\n  E: [\n    [1, 1, 1],\n    [1, 0, 0],\n    [1, 1, 0],\n    [1, 0, 0],\n    [1, 1, 1],\n  ],\n  F: [\n    [1, 1, 1],\n    [1, 0, 0],\n    [1, 1, 0],\n    [1, 0, 0],\n    [1, 0, 0],\n  ],\n  G: [\n    [0, 1, 1],\n    [1, 0, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 1],\n  ],\n  H: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  I: [\n    [1, 1, 1],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n    [1, 1, 1],\n  ],\n  J: [\n    [0, 0, 1],\n    [0, 0, 1],\n    [0, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  K: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  L: [\n    [1, 0, 0],\n    [1, 0, 0],\n    [1, 0, 0],\n    [1, 0, 0],\n    [1, 1, 1],\n  ],\n  M: [\n    [1, 0, 1],\n    [1, 1, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  N: [\n    [1, 0, 1],\n    [1, 1, 1],\n    [1, 1, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  O: [\n    [0, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  P: [\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 1, 0],\n    [1, 0, 0],\n    [1, 0, 0],\n  ],\n  Q: [\n    [0, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 1],\n    [0, 1, 1],\n  ],\n  R: [\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  S: [\n    [0, 1, 1],\n    [1, 0, 0],\n    [0, 1, 0],\n    [0, 0, 1],\n    [1, 1, 0],\n  ],\n  T: [\n    [1, 1, 1],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n  ],\n  U: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  V: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n  ],\n  W: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 0, 1],\n    [1, 1, 1],\n    [1, 0, 1],\n  ],\n  X: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n    [1, 0, 1],\n    [1, 0, 1],\n  ],\n  Y: [\n    [1, 0, 1],\n    [1, 0, 1],\n    [0, 1, 0],\n    [0, 1, 0],\n    [0, 1, 0],\n  ],\n  Z: [\n    [1, 1, 1],\n    [0, 0, 1],\n    [0, 1, 0],\n    [1, 0, 0],\n    [1, 1, 1],\n  ],\n};\n\nconst SLIM_FONT: Record<string, string[]> = {\n  \" \": [\"   \", \"   \", \"   \"],\n  \"!\": [\"║\", \"║\", \"╩\"],\n  \"-\": [\"   \", \"═══\", \"   \"],\n  \".\": [\"  \", \"  \", \"╩ \"],\n  \"0\": [\"╔═╗\", \"║ ║\", \"╚═╝\"],\n  \"1\": [\"╗  \", \"║  \", \"╩  \"],\n  \"2\": [\"══╗\", \"╔═╝\", \"╚══\"],\n  \"3\": [\"══╗\", \" ═╣\", \"══╝\"],\n  \"4\": [\"╦ ╦\", \"╚═╣\", \"  ╩\"],\n  \"5\": [\"╔══\", \"╚═╗\", \"══╝\"],\n  \"6\": [\"╔══\", \"╠═╗\", \"╚═╝\"],\n  \"7\": [\"══╗\", \"  ║\", \"  ╩\"],\n  \"8\": [\"╔═╗\", \"╠═╣\", \"╚═╝\"],\n  \"9\": [\"╔═╗\", \"╚═╣\", \"══╝\"],\n  \":\": [\" \", \"╥\", \"╨\"],\n  \"?\": [\"╔═╗\", \" ╔╝\", \" ╩ \"],\n  A: [\"╔═╗\", \"╠═╣\", \"╩ ╩\"],\n  B: [\"╔╗ \", \"╠╩╗\", \"╚═╝\"],\n  C: [\"╔═╗\", \"║  \", \"╚═╝\"],\n  D: [\"╔╗ \", \"║ ║\", \"╚═╝\"],\n  E: [\"╔══\", \"╠═ \", \"╚══\"],\n  F: [\"╔══\", \"╠═ \", \"╩  \"],\n  G: [\"╔═╗\", \"║ ╦\", \"╚═╝\"],\n  H: [\"╦ ╦\", \"╠═╣\", \"╩ ╩\"],\n  I: [\"╦\", \"║\", \"╩\"],\n  J: [\"  ╦\", \"  ║\", \"╚═╝\"],\n  K: [\"╦╔╝\", \"╠╩╗\", \"╩ ╩\"],\n  L: [\"╦  \", \"║  \", \"╚══\"],\n  M: [\"╔╦╗\", \"║║║\", \"╩ ╩\"],\n  N: [\"╔╗╗\", \"║║║\", \"╩╚╝\"],\n  O: [\"╔═╗\", \"║ ║\", \"╚═╝\"],\n  P: [\"╔═╗\", \"╠═╝\", \"╩  \"],\n  Q: [\"╔═╗\", \"║ ║\", \"╚╦╝\"],\n  R: [\"╔═╗\", \"╠╦╝\", \"╩╚╗\"],\n  S: [\"╔═╗\", \"╚═╗\", \"╚═╝\"],\n  T: [\"═╦═\", \" ║ \", \" ╩ \"],\n  U: [\"╦ ╦\", \"║ ║\", \"╚═╝\"],\n  V: [\"╦ ╦\", \"╚╦╝\", \" ╩ \"],\n  W: [\"╦ ╦\", \"║║║\", \"╚╩╝\"],\n  X: [\"╦ ╦\", \" ╬ \", \"╩ ╩\"],\n  Y: [\"╦ ╦\", \" ╦ \", \" ╩ \"],\n  Z: [\"══╦\", \"╔═╝\", \"╚══\"],\n};\n\nconst FALLBACK: number[][] = [\n  [1, 1, 1],\n  [1, 0, 1],\n  [1, 0, 1],\n  [1, 0, 1],\n  [1, 1, 1],\n];\n\nconst getCharRows = (ch: string): number[][] => {\n  const upper = ch.toUpperCase();\n  return FONT[upper] ?? FONT[ch] ?? FALLBACK;\n};\n\nconst SHADE_CHARS: Record<number, string> = {\n  0: \" \",\n  1: \"░\",\n  2: \"▒\",\n  3: \"▓\",\n  4: \"█\",\n};\n\nconst renderShadeRow = (row: number[]): string =>\n  row.map((p) => (p ? (SHADE_CHARS[3] ?? \"▓\") : \" \")).join(\"\");\n\nexport const BigText = ({\n  children,\n  color,\n  font = \"block\",\n  \"aria-label\": ariaLabel,\n  \"aria-hidden\": ariaHidden,\n}: BigTextProps) => {\n  const theme = useTheme();\n  const unicode = useUnicode();\n  const resolvedColor = color ?? theme.colors.primary;\n\n  const chars = [...children];\n\n  if (font === \"slim\") {\n    const rowCount = 3;\n    return (\n      <Box\n        flexDirection=\"column\"\n        aria-label={ariaHidden ? undefined : (ariaLabel ?? children)}\n        aria-hidden={ariaHidden}\n      >\n        {Array.from({ length: rowCount }, (_, rowIdx) => (\n          <Box key={rowIdx} flexDirection=\"row\">\n            {chars.map((ch, charIdx) => {\n              const upper = ch.toUpperCase();\n              const slimChar = SLIM_FONT[upper] ?? SLIM_FONT[ch];\n              const line = slimChar ? (slimChar[rowIdx] ?? \"   \") : \"   \";\n              return (\n                <Text key={charIdx} color={resolvedColor}>\n                  {`${unicode ? line : toAsciiComponentText(line)} `}\n                </Text>\n              );\n            })}\n          </Box>\n        ))}\n      </Box>\n    );\n  }\n\n  let onChar = \"▓\";\n  if (font === \"block\") {\n    onChar = \"█\";\n  }\n  const offChar = \" \";\n  const rows = 5;\n\n  return (\n    <Box\n      flexDirection=\"column\"\n      aria-label={ariaHidden ? undefined : (ariaLabel ?? children)}\n      aria-hidden={ariaHidden}\n    >\n      {Array.from({ length: rows }, (_, rowIdx) => (\n        <Box key={rowIdx} flexDirection=\"row\">\n          {chars.map((ch, charIdx) => {\n            const charRows = getCharRows(ch);\n            const row = charRows[rowIdx] ?? [0, 0, 0];\n            const rowStr =\n              font === \"shade\"\n                ? renderShadeRow(row)\n                : row.map((pixel) => (pixel ? onChar : offChar)).join(\"\");\n            return (\n              <Text key={charIdx} color={resolvedColor}>\n                {`${unicode ? rowStr : toAsciiComponentText(rowStr)} `}\n              </Text>\n            );\n          })}\n        </Box>\n      ))}\n    </Box>\n  );\n};\n",
      "type": "registry:ui"
    }
  ],
  "categories": [
    "typography"
  ],
  "type": "registry:ui"
}