/* Public pages — CORE-owned baseline (propagates with the template; apps must
 * NOT edit it — redesign in assets/public/css/site.css, which can override).
 * Loaded before site.css on every public page. Keep it tiny: only rules the
 * core's public chrome depends on regardless of the app's redesign. */

/* Skip to content (a11y, WCAG 2.4.1): first focusable of every public page,
   visible only while keyboard-focused. Logical properties = RTL-safe. */
.skip-link {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);   /* off-screen WITHOUT extending the page */
    white-space: nowrap;
    z-index: 100000;
    background: #2c3338;
    color: #f0f0f1;
    padding: 8px 14px;
    border-radius: 4px;
}
.skip-link:focus {
    width: auto;
    height: auto;
    overflow: visible;
    clip-path: none;
    inset-inline-start: 8px;
    top: 8px;
}

/* Inline add-to-cart error (shop-cart.js — no native dialogs). */
.buy-msg { color: #d66a6a; font-size: .9rem; margin: 8px 0 0; }
.buy-msg:empty { display: none; }


/* ── styleguide chrome (/styleguide — page-model §8) ──
   Presentation of the module gallery only, never part of the library;
   lives here because the public CSP (style-src 'self') forbids inline
   <style> blocks in views. */
.sg-item { margin-block: 2rem; }
.sg-item > .sg-name { font: 600 .8rem/1 ui-monospace, monospace; letter-spacing: .06em;
    color: var(--mod-muted, #5a6172); text-transform: uppercase; margin-block-end: .75rem;
    padding-block-end: .4rem; border-block-end: 1px solid var(--mod-line, #e5e7ee); }
