{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "footer-links",
  "type": "registry:block",
  "title": "Footer Links",
  "description": "Multi-column site footer with a brand block, titled link groups, copyright line and social icons — all consumer-supplied.",
  "dependencies": [
    "@mantine/core@^9"
  ],
  "docs": "Adapted from Mantine UI FooterLinks at ffbf61c559f374a7ea28fcf00355e84dcbe9a908; the three hardcoded link groups became the groups prop, the upstream MantineLogo import became an optional logo slot, the tagline/copyright strings became optional props with no fake placeholder default, and the fixed social icons became a consumer-supplied socialLinks array.",
  "registryDependencies": [
    "@house/mantine-ui-license"
  ],
  "files": [
    {
      "path": "registry/mantine-ui/footer-links/footer-links.tsx",
      "type": "registry:ui",
      "content": "/**\n * Adapted from Mantine UI's FooterLinks at\n * ffbf61c559f374a7ea28fcf00355e84dcbe9a908. MIT licensed; see\n * LICENSES/MANTINE-UI.txt after installation.\n */\n\nimport { ActionIcon, Container, Group, Text } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\n\nimport classes from \"./footer-links.module.css\";\n\nexport interface FooterLinksLink {\n  label: string;\n  href: string;\n}\n\nexport interface FooterLinksGroup {\n  title: string;\n  links: readonly FooterLinksLink[];\n}\n\nexport interface FooterLinksSocialLink {\n  href: string;\n  icon: ReactNode;\n  /** Accessible name for the icon-only link, e.g. \"Twitter\". */\n  label: string;\n}\n\nexport interface FooterLinksProps {\n  /** Rendered at the start of the brand block; nothing renders when omitted. */\n  logo?: ReactNode;\n  /** Short description under the logo; omitted when unset. */\n  tagline?: string;\n  /** Titled link columns. This is the component's whole point. */\n  groups: readonly FooterLinksGroup[];\n  /** Copyright / legal line; omitted when unset. */\n  copyright?: string;\n  /** Social icon links; the row is omitted when unset or empty. */\n  socialLinks?: readonly FooterLinksSocialLink[];\n}\n\nexport function FooterLinks({ logo, tagline, groups, copyright, socialLinks }: FooterLinksProps) {\n  const hasBrand = Boolean(logo || tagline);\n  const hasSocial = Boolean(socialLinks && socialLinks.length > 0);\n\n  const groupItems = groups.map((group) => {\n    const links = group.links.map((link) => (\n      <Text key={link.label} className={classes.link} component=\"a\" href={link.href}>\n        {link.label}\n      </Text>\n    ));\n\n    return (\n      <div className={classes.wrapper} key={group.title}>\n        <Text className={classes.title}>{group.title}</Text>\n        {links}\n      </div>\n    );\n  });\n\n  return (\n    <footer className={classes.footer}>\n      <Container className={classes.inner}>\n        {hasBrand && (\n          <div className={classes.logo}>\n            {logo}\n            {tagline && (\n              <Text size=\"xs\" c=\"dimmed\" className={classes.description}>\n                {tagline}\n              </Text>\n            )}\n          </div>\n        )}\n        <div className={classes.groups}>{groupItems}</div>\n      </Container>\n\n      {(copyright || hasSocial) && (\n        <Container className={classes.afterFooter}>\n          {copyright && (\n            <Text c=\"dimmed\" size=\"sm\">\n              {copyright}\n            </Text>\n          )}\n\n          {hasSocial && (\n            <Group gap={0} className={classes.social} justify=\"flex-end\" wrap=\"nowrap\">\n              {socialLinks?.map((social) => (\n                <ActionIcon\n                  key={social.href}\n                  size=\"lg\"\n                  color=\"gray\"\n                  variant=\"subtle\"\n                  aria-label={social.label}\n                  component=\"a\"\n                  href={social.href}\n                >\n                  {social.icon}\n                </ActionIcon>\n              ))}\n            </Group>\n          )}\n        </Container>\n      )}\n    </footer>\n  );\n}\n"
    },
    {
      "path": "registry/mantine-ui/footer-links/footer-links.module.css",
      "type": "registry:file",
      "target": "@ui/footer-links.module.css",
      "content": "/*\n * Adapted from Mantine UI's FooterLinks at\n * ffbf61c559f374a7ea28fcf00355e84dcbe9a908. MIT licensed; see\n * LICENSES/MANTINE-UI.txt after installation.\n */\n\n/* Upstream used postcss-preset-mantine's `$mantine-breakpoint-sm`; this\n * registry ships plain CSS modules with no PostCSS preset, so the literal\n * 48em default `sm` breakpoint value is inlined here (`var()` is invalid\n * inside a media condition). See header-mega-menu.module.css for the same\n * convention. Upstream's `margin-top: 120px` on `.footer` was outer layout\n * margin imposed on the host page and is dropped here — a registry item\n * must not push the page around. */\n.footer {\n  padding-top: calc(var(--mantine-spacing-xl) * 2);\n  padding-bottom: calc(var(--mantine-spacing-xl) * 2);\n  background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n  border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5));\n}\n\n.logo {\n  max-width: 200px;\n}\n\n@media (max-width: 48em) {\n  .logo {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n  }\n}\n\n.description {\n  margin-top: 5px;\n}\n\n@media (max-width: 48em) {\n  .description {\n    margin-top: var(--mantine-spacing-xs);\n    text-align: center;\n  }\n}\n\n.inner {\n  display: flex;\n  justify-content: space-between;\n}\n\n@media (max-width: 48em) {\n  .inner {\n    flex-direction: column;\n    align-items: center;\n  }\n}\n\n.groups {\n  display: flex;\n  flex-wrap: wrap;\n}\n\n@media (max-width: 48em) {\n  .groups {\n    display: none;\n  }\n}\n\n.wrapper {\n  width: 160px;\n}\n\n.link {\n  display: block;\n  color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-1));\n  font-size: var(--mantine-font-size-sm);\n  padding-top: 3px;\n  padding-bottom: 3px;\n}\n\n.link:hover {\n  text-decoration: underline;\n}\n\n.title {\n  font-size: var(--mantine-font-size-lg);\n  font-weight: 500;\n  font-family: var(--mantine-font-family-headings);\n  margin-bottom: calc(var(--mantine-spacing-xs) / 2);\n  color: light-dark(var(--mantine-color-black), var(--mantine-color-white));\n}\n\n.afterFooter {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-top: var(--mantine-spacing-xl);\n  padding-top: var(--mantine-spacing-xl);\n  padding-bottom: var(--mantine-spacing-xl);\n  border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-4));\n}\n\n@media (max-width: 48em) {\n  .afterFooter {\n    flex-direction: column;\n  }\n}\n\n@media (max-width: 48em) {\n  .social {\n    margin-top: var(--mantine-spacing-xs);\n  }\n}\n"
    }
  ],
  "meta": {
    "mantine": {
      "requires": ">=9",
      "provider": "MantineProvider",
      "props": {
        "FooterLinks": [
          {
            "name": "logo",
            "type": "ReactNode",
            "required": false,
            "description": "Rendered at the start of the brand block; nothing renders when omitted."
          },
          {
            "name": "tagline",
            "type": "string",
            "required": false,
            "description": "Short description under the logo; omitted when unset."
          },
          {
            "name": "groups",
            "type": "readonly FooterLinksGroup[]",
            "required": true,
            "description": "Titled link columns, each { title: string; links: readonly FooterLinksLink[] }; this is the component's whole point."
          },
          {
            "name": "copyright",
            "type": "string",
            "required": false,
            "description": "Copyright/legal line in the bottom bar; omitted when unset."
          },
          {
            "name": "socialLinks",
            "type": "readonly FooterLinksSocialLink[]",
            "required": false,
            "description": "{ href, icon, label } per entry; label becomes the icon link's aria-label. The entire bottom-bar social row is omitted when unset or empty."
          }
        ]
      },
      "usage": {
        "path": "registry/mantine-ui/footer-links/footer-links.usage.tsx",
        "content": "import { Text } from \"@mantine/core\";\nimport { IconBrandInstagram, IconBrandTwitter, IconBrandYoutube } from \"@tabler/icons-react\";\nimport {\n  FooterLinks,\n  type FooterLinksGroup,\n  type FooterLinksSocialLink,\n} from \"@/components/ui/footer-links\";\n\nconst groups: FooterLinksGroup[] = [\n  {\n    title: \"About\",\n    links: [\n      { label: \"Features\", href: \"/features\" },\n      { label: \"Pricing\", href: \"/pricing\" },\n      { label: \"Support\", href: \"/support\" },\n      { label: \"Forums\", href: \"/forums\" },\n    ],\n  },\n  {\n    title: \"Project\",\n    links: [\n      { label: \"Contribute\", href: \"/contribute\" },\n      { label: \"Media assets\", href: \"/media\" },\n      { label: \"Changelog\", href: \"/changelog\" },\n      { label: \"Releases\", href: \"/releases\" },\n    ],\n  },\n  {\n    title: \"Community\",\n    links: [\n      { label: \"Join Discord\", href: \"https://discord.gg/acme\" },\n      { label: \"Follow on Twitter\", href: \"https://twitter.com/acme\" },\n      { label: \"Email newsletter\", href: \"/newsletter\" },\n      { label: \"GitHub discussions\", href: \"https://github.com/acme/acme/discussions\" },\n    ],\n  },\n];\n\nconst socialLinks: FooterLinksSocialLink[] = [\n  {\n    href: \"https://twitter.com/acme\",\n    label: \"Twitter\",\n    icon: <IconBrandTwitter size={18} stroke={1.5} />,\n  },\n  {\n    href: \"https://youtube.com/@acme\",\n    label: \"Youtube\",\n    icon: <IconBrandYoutube size={18} stroke={1.5} />,\n  },\n  {\n    href: \"https://instagram.com/acme\",\n    label: \"Instagram\",\n    icon: <IconBrandInstagram size={18} stroke={1.5} />,\n  },\n];\n\nexport function SiteFooter() {\n  return (\n    <FooterLinks\n      logo={\n        <Text fw={700} size=\"lg\">\n          Acme\n        </Text>\n      }\n      tagline=\"Build fully functional accessible web applications faster than ever\"\n      groups={groups}\n      copyright=\"© 2026 Acme. All rights reserved.\"\n      socialLinks={socialLinks}\n    />\n  );\n}\n"
      }
    }
  }
}
