{
  "name": "navbar",
  "title": {
    "es": "Barra de navegación",
    "en": "Navigation bar"
  },
  "summary": {
    "es": "Cabecera con logo, enlaces y acciones. En móvil, los enlaces van a un menú.",
    "en": "Header with logo, links and actions. On mobile, links move into a menu."
  },
  "category": "navigation",
  "status": "stable",
  "nivel": "globales",
  "updated": "2026-09-29",
  "license": "MIT",
  "page": "https://componentes-lovat.vercel.app/c/navbar/",
  "requires": [
    "button"
  ],
  "files": [
    {
      "type": "html",
      "url": "https://componentes-lovat.vercel.app/raw/navbar/navbar.html",
      "content": "<header class=\"c-navbar\">\n  <div class=\"c-navbar__inner\">\n    <div class=\"c-navbar__start\">\n      <button class=\"c-btn c-btn--ghost c-btn--icon c-navbar__toggle\" type=\"button\" aria-label=\"Menú\" aria-expanded=\"false\" aria-controls=\"navbar-mobile\" data-c-navbar>\n        <svg class=\"c-navbar__burger\" viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M4 12L20 12\"/><path d=\"M4 12H20\"/><path d=\"M4 12H20\"/></svg>\n      </button>\n      <div class=\"c-navbar__main\">\n        <a class=\"c-navbar__logo\" href=\"#\" aria-label=\"Inicio\"><svg viewBox=\"0 0 33 33\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M20.46 1.766 17.303.923l-2.66 9.896-2.403-8.934-3.157.843 2.595 9.652-6.464-6.442-2.311 2.304 7.09 7.066-8.83-2.358-.846 3.146 9.648 2.577a6.516 6.516 0 0 1-.169-1.478c0-3.598 2.927-6.515 6.537-6.515s6.537 2.917 6.537 6.515c0 .505-.057.997-.167 1.468l8.768 2.342.846-3.147-9.686-2.586 8.83-2.358-.845-3.147-9.686 2.587 6.464-6.442-2.311-2.304-6.992 6.969 2.369-8.81Z\"/><path d=\"M22.695 18.7a6.495 6.495 0 0 1-1.626 2.986l6.352 6.33 2.31-2.303-7.036-7.013ZM21.005 21.752a6.538 6.538 0 0 1-2.922 1.722l2.312 8.596 3.157-.843-2.547-9.475ZM17.965 23.505a6.569 6.569 0 0 1-1.632.205 6.566 6.566 0 0 1-1.743-.235l-2.314 8.605 3.157.843 2.532-9.418ZM14.478 23.444a6.54 6.54 0 0 1-2.87-1.747l-6.367 6.346 2.31 2.303 6.927-6.902ZM11.555 21.64a6.492 6.492 0 0 1-1.585-2.948L1.173 21.04l.846 3.146 9.536-2.546Z\"/></svg></a>\n        <nav aria-label=\"Principal\">\n          <ul class=\"c-navbar__list\">\n            <li><a class=\"c-navbar__link\" href=\"#\" aria-current=\"page\">Inicio</a></li>\n            <li><a class=\"c-navbar__link\" href=\"#features\">Funciones</a></li>\n            <li><a class=\"c-navbar__link\" href=\"#pricing\">Precios</a></li>\n            <li><a class=\"c-navbar__link\" href=\"#about\">Nosotros</a></li>\n          </ul>\n        </nav>\n      </div>\n    </div>\n    <div class=\"c-navbar__end\">\n      <a class=\"c-btn c-btn--ghost c-btn--sm\" href=\"#login\">Entrar</a>\n      <a class=\"c-btn c-btn--primary c-btn--sm\" href=\"#signup\">Empezar</a>\n    </div>\n  </div>\n  <nav class=\"c-navbar__mobile\" id=\"navbar-mobile\" popover aria-label=\"Principal (móvil)\">\n    <ul>\n      <li><a class=\"c-navbar__mobile-link\" href=\"#\" aria-current=\"page\">Inicio</a></li>\n      <li><a class=\"c-navbar__mobile-link\" href=\"#features\">Funciones</a></li>\n      <li><a class=\"c-navbar__mobile-link\" href=\"#pricing\">Precios</a></li>\n      <li><a class=\"c-navbar__mobile-link\" href=\"#about\">Nosotros</a></li>\n    </ul>\n  </nav>\n</header>\n"
    },
    {
      "type": "css",
      "url": "https://componentes-lovat.vercel.app/raw/navbar/navbar.css",
      "content": "/* navbar · Componentes (MIRÓ Labs). Diseño de coss ui (MIT, © coss.com, antes Origin UI).\n   Generado por tools/build_css.py desde navbar.tw.json. No editar a mano. Necesita tokens.css. */\n.c-navbar__inner{display:flex}\n.c-navbar__start{display:flex}\n.c-navbar__main{display:flex}\n.c-navbar__list{display:flex}\n.c-navbar__link{display:flex}\n.c-navbar__end{display:flex}\n.c-navbar__mobile-link{display:flex;width:100%}\n.c-navbar__list{flex:1}\n.c-navbar__link{flex-direction:column}\n.c-navbar__mobile-link{flex-direction:column}\n.c-navbar__inner{align-items:center}\n.c-navbar__start{align-items:center}\n.c-navbar__main{align-items:center}\n.c-navbar__list{align-items:center}\n.c-navbar__end{align-items:center}\n.c-navbar__inner{justify-content:space-between}\n.c-navbar__list{justify-content:center}\n.c-navbar__link{gap:calc(var(--spacing)*1)}\n.c-navbar__mobile-link{gap:calc(var(--spacing)*1)}\n.c-navbar__start{gap:calc(var(--spacing)*2)}\n.c-navbar__list{gap:calc(var(--spacing)*2)}\n.c-navbar__end{gap:calc(var(--spacing)*2)}\n.c-navbar__inner{gap:calc(var(--spacing)*4)}\n.c-navbar__main{gap:calc(var(--spacing)*6)}\n.c-navbar__mobile{border-radius:calc(var(--radius) - 2px)}\n.c-navbar__link{border-radius:calc(var(--radius) - 4px)}\n.c-navbar__mobile-link{border-radius:calc(var(--radius) - 4px)}\n.c-navbar__mobile{border-style:var(--tw-border-style);border-width:1px}\n.c-navbar{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}\n.c-navbar__mobile{background-color:var(--popover);padding:calc(var(--spacing)*1)}\n.c-navbar__link{padding:calc(var(--spacing)*2)}\n.c-navbar__mobile-link{padding:calc(var(--spacing)*2)}\n.c-navbar{padding-inline:calc(var(--spacing)*4)}\n.c-navbar__link{padding-block:calc(var(--spacing)*1.5)}\n.c-navbar__mobile-link{padding-block:calc(var(--spacing)*1.5)}\n.c-navbar__link{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}\n.c-navbar__mobile-link{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}\n.c-navbar__link{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted-foreground)}\n.c-navbar__mobile{color:var(--popover-foreground)}\n.c-navbar__logo{color:var(--primary)}\n.c-navbar__link{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}\n.c-navbar__mobile-link{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}\n.c-navbar__link{--tw-outline-style:none;outline-style:none}\n.c-navbar__mobile-link{--tw-outline-style:none;outline-style:none}\n@media (hover:hover){\n.c-navbar__link:hover{background-color:var(--accent)}\n.c-navbar__mobile-link:hover{background-color:var(--accent)}\n}\n.c-navbar__link:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}\n.c-navbar__mobile-link:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}\n@media not all and (min-width:48rem){\n.c-navbar__list{display:none}\n}\n/* propio */\n.c-navbar{background:var(--background);width:100%}\n.c-navbar__logo{display:inline-flex}\n.c-navbar__logo svg{width:32px;height:32px}\n.c-navbar__link:focus-visible,.c-navbar__mobile-link:focus-visible{--tw-ring-color:color-mix(in oklab,var(--ring)50%,transparent);box-shadow:0 0 0 3px var(--tw-ring-color)}\n.c-navbar__mobile{position:fixed;margin:0;inset:auto;opacity:0;scale:.95;transform-origin:top left;transition:opacity .15s,scale .15s,overlay .15s allow-discrete,display .15s allow-discrete}\n.c-navbar__mobile:popover-open{opacity:1;scale:1}\n@starting-style{.c-navbar__mobile:popover-open{opacity:0;scale:.95}}\n.c-navbar__mobile ul{display:grid;list-style:none;margin:0;padding:0}\n.c-navbar__burger path{transform-origin:center;transition:transform .3s cubic-bezier(.5,.85,.25,1.1)}\n.c-navbar__burger path:nth-child(1){transform:translateY(-7px)}\n.c-navbar__burger path:nth-child(3){transform:translateY(7px)}\n.c-navbar__toggle[aria-expanded=true] .c-navbar__burger path:nth-child(1){transform:rotate(315deg)}\n.c-navbar__toggle[aria-expanded=true] .c-navbar__burger path:nth-child(2){transform:rotate(45deg)}\n.c-navbar__toggle[aria-expanded=true] .c-navbar__burger path:nth-child(3){transform:rotate(135deg)}\n.c-navbar .c-btn{font-size:var(--text-sm)}\n@media (width >= 48rem){.c-navbar__mobile{display:none!important}}\n.c-navbar__inner{height:calc(var(--spacing)*16)}\n.c-navbar__list{list-style:none}\n.c-navbar__logo:hover{color:color-mix(in oklab,var(--primary)90%,transparent)}\n.c-navbar__link:hover{color:var(--primary)}\n.c-navbar__link[aria-current=page],.c-navbar__mobile-link[aria-current=page]{background-color:var(--accent);color:var(--accent-foreground)}\n.c-navbar__mobile{width:calc(var(--spacing)*36);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}\n@media (width >= 48rem){.c-navbar{padding-inline:calc(var(--spacing)*6)}.c-navbar__toggle{display:none}}\n"
    },
    {
      "type": "js",
      "url": "https://componentes-lovat.vercel.app/raw/navbar/navbar.js",
      "content": "/* Barra de navegación: en móvil, el botón abre el menú (popover nativo) debajo de él. */\n(function () {\n  const C = (window.Componentes = window.Componentes || {});\n  function setup(btn) {\n    const pop = document.getElementById(btn.getAttribute('aria-controls'));\n    if (!pop || !pop.showPopover) return;\n    const place = () => { const r = btn.getBoundingClientRect(); pop.style.top = r.bottom + 6 + 'px'; pop.style.left = Math.max(8, r.left) + 'px'; };\n    btn.addEventListener('click', () => { if (pop.matches(':popover-open')) pop.hidePopover(); else { pop.showPopover(); place(); pop.querySelector('a')?.focus(); } });\n    pop.addEventListener('toggle', (e) => { btn.setAttribute('aria-expanded', String(e.newState === 'open')); if (e.newState === 'closed' && pop.contains(document.activeElement)) btn.focus(); });\n    pop.addEventListener('click', (e) => { if (e.target.closest('a')) pop.hidePopover(); });\n  }\n  function init(root) {\n    (root || document).querySelectorAll('[data-c-navbar]:not([data-c-ready])').forEach((b) => { b.dataset.cReady = ''; try { setup(b); } catch (e) { console.warn('[navbar]', e); } });\n  }\n  C.navbar = { init };\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', () => init()); else init();\n})();\n"
    },
    {
      "type": "standalone",
      "url": "https://componentes-lovat.vercel.app/r/navbar.html"
    }
  ],
  "tokensFile": "https://componentes-lovat.vercel.app/tokens.css",
  "darkTheme": "add class 'dark' to <html>",
  "contexto": "ambos",
  "densidad": "media",
  "tono": "sobria",
  "states": [
    "rest",
    "hover",
    "focus",
    "current",
    "open"
  ],
  "use": {
    "es": [
      "Como cabecera de cualquier sitio."
    ],
    "en": [
      "As the header of any site."
    ]
  },
  "avoid": {
    "es": [
      "Con más de 6 enlaces: agrupa o usa una barra lateral."
    ],
    "en": [
      "With more than 6 links: group them or use a sidebar."
    ]
  },
  "a11y": {
    "roles": [
      "navigation",
      "link",
      "button"
    ],
    "keyboard": [
      {
        "keys": "Tab",
        "es": "Recorre enlaces y botones",
        "en": "Moves through links and buttons"
      },
      {
        "keys": "Esc",
        "es": "Cierra el menú móvil",
        "en": "Closes the mobile menu"
      }
    ],
    "notes": {
      "es": [
        "<nav> con aria-label y aria-current=page en la página actual.",
        "El menú móvil es un popover nativo: cierra con Esc o clic fuera y devuelve el foco al botón.",
        "Nada de role=menu: son enlaces de navegación."
      ],
      "en": [
        "<nav> with aria-label and aria-current=page on the current page.",
        "The mobile menu is a native popover: closes with Esc or outside click and returns focus.",
        "No role=menu: these are navigation links."
      ]
    },
    "test": {
      "es": [
        "En móvil, abre el menú y pulsa Esc: el foco vuelve al botón."
      ],
      "en": [
        "On mobile, open the menu and press Esc: focus returns to the button."
      ]
    }
  },
  "issues": {
    "es": [],
    "en": []
  },
  "credits": [
    {
      "source": "Origin UI (MIT) · comp-577.tsx, navigation-menu.tsx",
      "url": "https://21st.dev/@originui"
    },
    {
      "source": "Adrian Roselli, Don't use ARIA menu roles for site nav",
      "url": "https://adrianroselli.com/2017/10/dont-use-aria-menu-roles-for-site-nav.html"
    }
  ],
  "changes": [
    {
      "date": "2026-09-29",
      "es": "Diseño de coss ui en HTML, CSS y JS sin dependencias",
      "en": "coss ui design in dependency-free HTML, CSS and JS"
    }
  ],
  "partes": [],
  "pieza": "https://componentes-lovat.vercel.app/r/navbar.html"
}
