{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "gummy-typography",
  "type": "registry:ui",
  "title": "Gummy Typography",
  "description": "Semantic heading, body, eyebrow, inline-code, and blockquote foundations for product and documentation reading.",
  "registryDependencies": [
    "https://gummyui.dev/r/gummy-primitives-styles.json"
  ],
  "files": [
    {
      "path": "components/ui/GummyTypography.tsx",
      "type": "registry:ui",
      "content": "import * as React from \"react\";\n\nfunction joinClassNames(...values: Array<string | false | null | undefined>) {\n  return values.filter(Boolean).join(\" \");\n}\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type GummyHeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n  level?: HeadingLevel;\n  size?: \"display\" | \"title\" | \"section\" | \"subsection\";\n  balance?: boolean;\n};\n\nexport const GummyHeading = React.forwardRef<\n  HTMLHeadingElement,\n  GummyHeadingProps\n>(function GummyHeading(\n  { level = 2, size = \"section\", balance = true, className, ...headingProps },\n  ref,\n) {\n  const Heading = `h${level}` as React.ElementType;\n  return (\n    <Heading\n      {...headingProps}\n      ref={ref}\n      className={joinClassNames(\"gummy-heading\", className)}\n      data-size={size}\n      data-balance={balance || undefined}\n    />\n  );\n});\n\nGummyHeading.displayName = \"GummyHeading\";\n\nexport type GummyTextProps = React.HTMLAttributes<HTMLParagraphElement> & {\n  size?: \"small\" | \"body\" | \"large\";\n  tone?: \"default\" | \"soft\" | \"muted\";\n  measure?: \"compact\" | \"reading\" | \"wide\" | \"none\";\n};\n\nexport const GummyText = React.forwardRef<HTMLParagraphElement, GummyTextProps>(\n  function GummyText(\n    {\n      size = \"body\",\n      tone = \"default\",\n      measure = \"reading\",\n      className,\n      ...textProps\n    },\n    ref,\n  ) {\n    return (\n      <p\n        {...textProps}\n        ref={ref}\n        className={joinClassNames(\"gummy-text\", className)}\n        data-size={size}\n        data-tone={tone}\n        data-measure={measure}\n      />\n    );\n  },\n);\n\nGummyText.displayName = \"GummyText\";\n\nexport type GummyEyebrowProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nexport const GummyEyebrow = React.forwardRef<\n  HTMLParagraphElement,\n  GummyEyebrowProps\n>(function GummyEyebrow({ className, ...props }, ref) {\n  return (\n    <p\n      {...props}\n      ref={ref}\n      className={joinClassNames(\"gummy-eyebrow\", className)}\n    />\n  );\n});\n\nGummyEyebrow.displayName = \"GummyEyebrow\";\n\nexport type GummyInlineCodeProps = React.HTMLAttributes<HTMLElement>;\n\nexport const GummyInlineCode = React.forwardRef<\n  HTMLElement,\n  GummyInlineCodeProps\n>(function GummyInlineCode({ className, ...props }, ref) {\n  return (\n    <code\n      {...props}\n      ref={ref}\n      className={joinClassNames(\"gummy-inline-code\", className)}\n    />\n  );\n});\n\nGummyInlineCode.displayName = \"GummyInlineCode\";\n\nexport type GummyBlockquoteProps = React.BlockquoteHTMLAttributes<HTMLQuoteElement> & {\n  citeLabel?: React.ReactNode;\n};\n\nexport const GummyBlockquote = React.forwardRef<\n  HTMLQuoteElement,\n  GummyBlockquoteProps\n>(function GummyBlockquote(\n  { citeLabel, className, children, ...quoteProps },\n  ref,\n) {\n  return (\n    <blockquote\n      {...quoteProps}\n      ref={ref}\n      className={joinClassNames(\"gummy-blockquote\", className)}\n    >\n      <span className=\"gummy-blockquote__pool\" aria-hidden=\"true\" />\n      <div>{children}</div>\n      {citeLabel ? <footer>{citeLabel}</footer> : null}\n    </blockquote>\n  );\n});\n\nGummyBlockquote.displayName = \"GummyBlockquote\";\n"
    }
  ]
}
