.cc-manage{appearance:none;-webkit-appearance:none;display:inline;margin:0;padding:0;border:0;background:none;box-shadow:none;font:inherit;color:var(--cc-accent,var(--bs-link-color,currentColor));text-decoration:none;cursor:pointer}.cc-manage:hover{color:var(--cc-accent-hover,var(--bs-link-hover-color,currentColor));text-decoration:underline}.cc-manage:focus-visible{outline:2px solid var(--cc-accent,var(--bs-link-color,currentColor));outline-offset:2px;text-decoration:underline}.cc-manage-sep{margin:0 .4em;opacity:.65}.cc-manage-slot--fallback{box-sizing:border-box;width:100%;margin-top:1.5rem;padding:.75rem 1rem;border-top:1px solid var(--cc-border,rgb(128 128 128 / .25));text-align:center}.cc-consent{--cc-bg:#ffffff;--cc-fg:#1f2933;--cc-muted:#52606d;--cc-border:#e4e7eb;--cc-shadow:0 -2px 24px rgba(15, 23, 42, 0.18);--cc-accent:#2563eb;--cc-accent-fg:#ffffff;--cc-accent-hover:#1d4ed8;--cc-neutral:#e4e7eb;--cc-neutral-fg:#1f2933;--cc-neutral-hover:#d2d6dc;--cc-badge-bg:#e6f0ff;--cc-badge-fg:#1d4ed8;--cc-radius:0.75rem;--cc-btn-radius:0.5rem;--cc-z:2147483000;color:var(--cc-fg);font-size:.95rem;line-height:1.5}.cc-banner{position:fixed;z-index:var(--cc-z);background:var(--cc-bg);color:var(--cc-fg);box-shadow:var(--cc-shadow);border:1px solid var(--cc-border)}.cc-banner--bottom,.cc-banner--top{left:0;right:0;border-left:0;border-right:0}.cc-banner--bottom{bottom:0;border-bottom:0}.cc-banner--top{top:0;border-top:0}.cc-banner--bottom_left,.cc-banner--bottom_right{bottom:1.25rem;width:min(440px, calc(100vw - 2.5rem));border-radius:var(--cc-radius)}.cc-banner--bottom_left{left:1.25rem}.cc-banner--bottom_right{right:1.25rem}.cc-banner__inner{max-width:1180px;margin:0 auto;padding:1.25rem 1.5rem;display:flex;flex-wrap:wrap;align-items:center;gap:1rem 1.75rem}.cc-banner--bottom_left .cc-banner__inner,.cc-banner--bottom_right .cc-banner__inner{flex-direction:column;align-items:stretch;padding:1.25rem}.cc-banner__text{flex:1 1 320px;min-width:0}.cc-banner__title{margin:0 0 .35rem;font-size:1.05rem;font-weight:700}.cc-banner__intro{margin:0;color:var(--cc-muted);font-size:.9rem}.cc-banner__chips{list-style:none;display:flex;flex-wrap:wrap;gap:.4rem;margin:.6rem 0 0;padding:0}.cc-banner__chip{font-size:.75rem;padding:.15rem .6rem;border-radius:999px;background:var(--cc-neutral);color:var(--cc-neutral-fg)}.cc-banner__chip--essential{background:var(--cc-badge-bg);color:var(--cc-badge-fg)}.cc-banner__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.6rem;flex:0 0 auto}.cc-banner--bottom_left .cc-banner__actions,.cc-banner--bottom_right .cc-banner__actions{justify-content:stretch}.cc-btn{appearance:none;border:1px solid #fff0;border-radius:var(--cc-btn-radius);padding:.55rem 1.1rem;font-size:.9rem;font-weight:600;line-height:1.2;cursor:pointer;transition:background-color 0.15s ease,border-color 0.15s ease,color 0.15s ease;background:var(--cc-neutral);color:var(--cc-neutral-fg)}.cc-btn:hover{background:var(--cc-neutral-hover)}.cc-btn:focus-visible{outline:2px solid var(--cc-accent);outline-offset:2px}.cc-btn--decision{min-width:9.5rem;text-align:center}.cc-btn--accept,.cc-btn--save{background:var(--cc-accent);color:var(--cc-accent-fg);border-color:var(--cc-accent)}.cc-btn--accept:hover,.cc-btn--save:hover{background:var(--cc-accent-hover);border-color:var(--cc-accent-hover)}.cc-btn--reject{background:var(--cc-neutral);color:var(--cc-neutral-fg);border-color:var(--cc-border)}.cc-btn--reject:hover{background:var(--cc-neutral-hover)}.cc-btn--settings{background:#fff0;color:var(--cc-accent);border-color:#fff0;text-decoration:underline;padding-left:.6rem;padding-right:.6rem}.cc-btn--settings:hover{background:#fff0;color:var(--cc-accent-hover)}.cc-banner__ccpa{flex:1 1 100%;margin-top:.25rem}.cc-settings__ccpa{padding:0 1.4rem .25rem}.cc-btn--do-not-sell{display:inline-block;width:100%;background:#fff0;color:var(--cc-accent);border-color:var(--cc-accent);text-decoration:underline;text-align:center}.cc-btn--do-not-sell:hover{background:var(--cc-badge-bg);color:var(--cc-accent-hover);border-color:var(--cc-accent-hover)}.cc-notice{position:fixed;left:0;right:0;bottom:0;z-index:calc(var(--cc-z) + 2);background:var(--cc-bg);color:var(--cc-fg);border-top:3px solid var(--cc-accent);box-shadow:var(--cc-shadow)}.cc-notice__inner{max-width:1180px;margin:0 auto;padding:.75rem 1.5rem;display:flex;align-items:center;justify-content:space-between;gap:1rem}.cc-notice__text{font-size:.88rem;line-height:1.45}.cc-notice__close{appearance:none;flex:0 0 auto;border:0;background:#fff0;color:var(--cc-muted);font-size:1.4rem;line-height:1;cursor:pointer;padding:0 .25rem}.cc-notice__close:hover{color:var(--cc-fg)}.cc-notice__close:focus-visible{outline:2px solid var(--cc-accent);outline-offset:2px}.cc-settings{position:fixed;inset:0;z-index:calc(var(--cc-z) + 1);display:flex;align-items:center;justify-content:center;padding:1rem}.cc-settings[hidden]{display:none}.cc-settings__overlay{position:absolute;inset:0;background:rgb(15 23 42 / .55)}.cc-settings__dialog{position:relative;background:var(--cc-bg);color:var(--cc-fg);border:1px solid var(--cc-border);border-radius:var(--cc-radius);box-shadow:0 12px 48px rgb(15 23 42 / .35);width:min(560px, 100%);max-height:min(85vh, 720px);display:flex;flex-direction:column;overflow:hidden}.cc-settings__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 1.4rem;border-bottom:1px solid var(--cc-border)}.cc-settings__title{margin:0;font-size:1.1rem;font-weight:700}.cc-settings__close{appearance:none;border:0;background:#fff0;color:var(--cc-muted);font-size:1.6rem;line-height:1;cursor:pointer;padding:0 .25rem}.cc-settings__close:hover{color:var(--cc-fg)}.cc-settings__body{padding:1.1rem 1.4rem;overflow-y:auto}.cc-settings__intro{margin:0 0 1rem;color:var(--cc-muted);font-size:.88rem}.cc-settings__list{list-style:none;margin:0;padding:0}.cc-settings__item{padding:.9rem 0;border-bottom:1px solid var(--cc-border)}.cc-settings__item:last-child{border-bottom:0;padding-bottom:0}.cc-settings__row{display:flex;align-items:center;justify-content:space-between;gap:1rem}.cc-settings__label{display:flex;align-items:center;gap:.5rem;font-weight:600;margin:0}.cc-settings__badge{font-size:.7rem;font-weight:600;padding:.1rem .5rem;border-radius:999px;background:var(--cc-badge-bg);color:var(--cc-badge-fg);text-transform:uppercase;letter-spacing:.02em}.cc-settings__switch{margin:0;min-height:auto;padding-left:2.5em}.cc-settings__switch .form-check-input{cursor:pointer;width:2.4em;height:1.3em}.cc-settings__switch .form-check-input:disabled{cursor:not-allowed;opacity:.7}.cc-settings__desc{margin:.45rem 0 0;color:var(--cc-muted);font-size:.84rem}.cc-settings__footer{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.6rem;padding:1rem 1.4rem;border-top:1px solid var(--cc-border)}@media (max-width:575.98px){.cc-banner__inner{flex-direction:column;align-items:stretch}.cc-banner__actions{flex-direction:column;align-items:stretch}.cc-btn--decision{min-width:0;width:100%}.cc-settings__footer .cc-btn{flex:1 1 auto;text-align:center}}@media (prefers-color-scheme:dark){.cc-consent{--cc-bg:#1b1f24;--cc-fg:#e7ebef;--cc-muted:#9aa5b1;--cc-border:#2d343c;--cc-shadow:0 -2px 24px rgba(0, 0, 0, 0.55);--cc-accent:#3b82f6;--cc-accent-fg:#ffffff;--cc-accent-hover:#60a5fa;--cc-neutral:#2d343c;--cc-neutral-fg:#e7ebef;--cc-neutral-hover:#3a424c;--cc-badge-bg:#1e3a5f;--cc-badge-fg:#93c5fd}}[data-bs-theme="light"] .cc-consent{--cc-bg:#ffffff;--cc-fg:#1f2933;--cc-muted:#52606d;--cc-border:#e4e7eb;--cc-shadow:0 -2px 24px rgba(15, 23, 42, 0.18);--cc-accent:#2563eb;--cc-accent-fg:#ffffff;--cc-accent-hover:#1d4ed8;--cc-neutral:#e4e7eb;--cc-neutral-fg:#1f2933;--cc-neutral-hover:#d2d6dc;--cc-badge-bg:#e6f0ff;--cc-badge-fg:#1d4ed8}[data-bs-theme="dark"] .cc-consent{--cc-bg:#1b1f24;--cc-fg:#e7ebef;--cc-muted:#9aa5b1;--cc-border:#2d343c;--cc-shadow:0 -2px 24px rgba(0, 0, 0, 0.55);--cc-accent:#3b82f6;--cc-accent-fg:#ffffff;--cc-accent-hover:#60a5fa;--cc-neutral:#2d343c;--cc-neutral-fg:#e7ebef;--cc-neutral-hover:#3a424c;--cc-badge-bg:#1e3a5f;--cc-badge-fg:#93c5fd}
/*!
 * Shop Storefront — product-detail image lightbox / zoom (#2383)
 * =============================================================
 *
 * Glob-bundled by the Core #2228 frontend asset pipeline alongside
 * shop-tokens.css:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 *
 * The overlay DOM is built in JS — src/assets/storefront/js/detail-gallery-lightbox.js,
 * shipped via the plugin's own shop.asset.storefront_js route (#2729) — and
 * mounted INSIDE the `.shop-storefront` wrapper, so it inherits the --shop-*
 * tokens and the wrapper's data-bs-theme (light/dark). All colours are driven by
 * tokens with sane fallbacks — no hard-coded theme colours. The only raw value
 * is the backdrop scrim (a near-neutral rgba), itself exposed as an overridable
 * token (--shop-lightbox-backdrop) per the token contract.
 */
 .shop-storefront{--shop-lightbox-backdrop:rgba(13, 17, 23, 0.92);--shop-lightbox-z:1080}.shop-storefront .shop-zoom-opener{cursor:zoom-in}.shop-storefront .shop-zoom-opener:focus-visible{outline:2px solid var(--shop-primary,#1a6fb5);outline-offset:2px}html.shop-lightbox-open,body.shop-lightbox-open{overflow:hidden}.shop-storefront .shop-lightbox{position:fixed;inset:0;z-index:var(--shop-lightbox-z,1080);display:flex;align-items:center;justify-content:center;padding:1rem;background-color:var(--shop-lightbox-backdrop,rgb(13 17 23 / .92))}.shop-storefront .shop-lightbox[hidden]{display:none}.shop-storefront .shop-lightbox__stage{display:flex;align-items:center;justify-content:center;max-width:100%;max-height:100%}.shop-storefront .shop-lightbox__image{display:block;max-width:min(92vw, 1600px);max-height:88vh;width:auto;height:auto;object-fit:contain;border-radius:var(--shop-radius,.375rem);background-color:var(--shop-surface,#ffffff)}.shop-storefront .shop-lightbox__btn{position:absolute;display:inline-flex;align-items:center;justify-content:center;min-width:2.75rem;min-height:2.75rem;padding:0;border:1px solid var(--shop-border,#dee2e6);border-radius:50%;background-color:var(--shop-surface,#ffffff);color:var(--shop-text,#212529);font-size:1.75rem;line-height:1;cursor:pointer;opacity:.92;transition:opacity 0.15s ease-in-out,transform 0.15s ease-in-out}.shop-storefront .shop-lightbox__btn:hover{opacity:1}.shop-storefront .shop-lightbox__btn:focus-visible{outline:2px solid var(--shop-primary,#1a6fb5);outline-offset:2px;opacity:1}.shop-storefront .shop-lightbox__btn[hidden]{display:none}.shop-storefront .shop-lightbox__close{top:1rem;right:1rem}.shop-storefront .shop-lightbox__nav{top:50%;transform:translateY(-50%);font-size:2.25rem}.shop-storefront .shop-lightbox__nav:hover{transform:translateY(-50%) scale(1.05)}.shop-storefront .shop-lightbox__prev{left:1rem}.shop-storefront .shop-lightbox__next{right:1rem}.shop-storefront .shop-lightbox__counter{position:absolute;bottom:1rem;left:50%;transform:translateX(-50%);padding:.25rem .75rem;border-radius:999px;background-color:var(--shop-surface,#ffffff);color:var(--shop-text,#212529);border:1px solid var(--shop-border,#dee2e6);font-size:.875rem;opacity:.92}@media (max-width:575.98px){.shop-storefront .shop-lightbox{padding:.5rem}.shop-storefront .shop-lightbox__image{max-width:96vw;max-height:80vh}.shop-storefront .shop-lightbox__close{top:.5rem;right:.5rem}.shop-storefront .shop-lightbox__prev{left:.5rem}.shop-storefront .shop-lightbox__next{right:.5rem}}@media (prefers-reduced-motion:reduce){.shop-storefront .shop-lightbox__btn{transition:none}.shop-storefront .shop-lightbox__nav:hover{transform:translateY(-50%)}}
/*!
 * Shop Storefront — design tokens, Bootstrap bridge, components (#2248)
 * =====================================================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * The bundle loads AFTER the theme/default CSS and the inline
 * `theme_css_variables` block loads AFTER the bundle (Templates/Frontend/
 * layout/styles.html.twig) — so a channel/theme can override any --shop-*
 * token without specificity tricks. Token contract:
 *   Plugins/Shop/docs/planning/storefront-tokens.md
 *
 * Everything is scoped to the `.shop-storefront` wrapper (set on the
 * storefront <body> content in base.html.twig). ContentBuilder frontend
 * pages use the same Bootstrap classes plus their own --cb-* tokens at
 * :root — scoping here keeps the Shop bridge from re-colouring them.
 *
 * Three layers:
 *   1. Token defaults (light)         — reproduce the current look, no regression
 *   2. Bootstrap bridge (scoped)      — map Bootstrap component vars onto tokens
 *   3. Shop component classes         — what Bootstrap does not cover
 * plus a dark block gated on [data-bs-theme=dark] (forward-compatible).
 */
 .shop-storefront{--shop-primary:#1a6fb5;--shop-primary-rgb:26, 111, 181;--shop-accent:#1b9e3e;--shop-success:#198754;--shop-warning:#ffc107;--shop-danger:#dc3545;--shop-info:#0dcaf0;--shop-surface:#ffffff;--shop-bg:#ffffff;--shop-text:#212529;--shop-text-muted:#5f676e;--shop-border:#dee2e6;--shop-price:#212529;--shop-price-sale:#dc3545;--shop-rating:#ffc107;--shop-radius:0.375rem;--shop-header-bg:#ffffff;--shop-header-fg:#212529;--shop-sticky-offset:1rem;--shop-brand-logo-height:2rem}.shop-storefront{--bs-primary:var(--shop-primary);--bs-primary-rgb:var(--shop-primary-rgb);--bs-link-color-rgb:var(--shop-primary-rgb);--bs-link-hover-color-rgb:var(--shop-primary-rgb);--bs-border-radius:var(--shop-radius)}.shop-storefront .btn-primary{--bs-btn-bg:var(--shop-primary);--bs-btn-border-color:var(--shop-primary);--bs-btn-hover-bg:color-mix(in srgb, var(--shop-primary) 85%, black);--bs-btn-hover-border-color:color-mix(in srgb, var(--shop-primary) 80%, black);--bs-btn-active-bg:color-mix(in srgb, var(--shop-primary) 80%, black);--bs-btn-active-border-color:color-mix(in srgb, var(--shop-primary) 75%, black);--bs-btn-disabled-bg:var(--shop-primary);--bs-btn-disabled-border-color:var(--shop-primary);--bs-btn-focus-shadow-rgb:var(--shop-primary-rgb)}.shop-storefront .btn-outline-primary{--bs-btn-color:var(--shop-primary);--bs-btn-border-color:var(--shop-primary);--bs-btn-hover-bg:var(--shop-primary);--bs-btn-hover-border-color:var(--shop-primary);--bs-btn-active-bg:var(--shop-primary);--bs-btn-active-border-color:var(--shop-primary);--bs-btn-disabled-color:var(--shop-primary);--bs-btn-disabled-border-color:var(--shop-primary);--bs-btn-focus-shadow-rgb:var(--shop-primary-rgb)}.shop-storefront .text-primary{color:var(--shop-primary)!important}.shop-storefront a:not(.btn):not(.nav-link):not(.dropdown-item):not(.page-link){--bs-link-color-rgb:var(--shop-primary-rgb);--bs-link-hover-color-rgb:var(--shop-primary-rgb)}.shop-storefront .text-bg-primary{background-color:RGBA(var(--shop-primary-rgb),var(--bs-bg-opacity,1))!important}.shop-storefront .text-bg-success,.shop-storefront .badge.text-bg-success{background-color:var(--shop-success)!important}.shop-storefront .text-bg-warning,.shop-storefront .badge.text-bg-warning{background-color:var(--shop-warning)!important}.shop-storefront .text-bg-danger,.shop-storefront .badge.text-bg-danger{background-color:var(--shop-danger)!important}.shop-storefront .text-bg-info,.shop-storefront .badge.text-bg-info{background-color:var(--shop-info)!important}.shop-storefront .text-success{color:var(--shop-success)!important}.shop-storefront .text-danger{color:var(--shop-danger)!important}.shop-storefront .text-warning{color:var(--shop-warning)!important}.shop-storefront .border-primary{--bs-border-color:var(--shop-primary);border-color:var(--shop-primary)!important}.shop-storefront .shop-price{color:var(--shop-price)}.shop-storefront .shop-price--sale{color:var(--shop-price-sale)}.shop-storefront .shop-price--old{color:var(--shop-text-muted);text-decoration:line-through}.shop-storefront .shop-rating{color:var(--shop-rating)}.shop-storefront .shop-product-card{--bs-card-bg:var(--shop-surface);--bs-card-border-color:var(--shop-border);--bs-card-border-radius:var(--shop-radius)}.shop-storefront .shop-sticky-offset{top:var(--shop-sticky-offset)}.shop-storefront .shop-brand-logo{height:var(--shop-brand-logo-height,2rem);width:auto;max-width:12rem;object-fit:contain}.shop-storefront .storefront-category-bar .navbar-nav{--bs-nav-link-padding-x:0.75rem;--bs-nav-link-padding-y:0.5rem;column-gap:.25rem}.shop-storefront .storefront-category-bar .nav-link{font-size:.95rem}.shop-storefront .shop-suggest-menu{top:100%;left:0;margin-top:.25rem;max-height:60vh;overflow-y:auto}.shop-storefront .shop-suggest-menu:not([hidden]){display:block}.shop-storefront .shop-suggest-menu .dropdown-header{text-transform:uppercase;letter-spacing:.03em;font-size:.7rem;color:var(--shop-text-muted)}.shop-storefront .shop-suggest-menu .dropdown-item.active,.shop-storefront .shop-suggest-menu .dropdown-item:hover,.shop-storefront .shop-suggest-menu .dropdown-item:focus{background-color:var(--shop-primary);color:#fff}.shop-storefront .shop-suggest-thumb{width:32px;height:32px;object-fit:cover;border-radius:var(--shop-radius)}[data-bs-theme=dark] .shop-storefront,.shop-storefront[data-bs-theme=dark]{--shop-surface:#161b22;--shop-bg:#0d1117;--shop-text:#e6edf3;--shop-text-muted:#9da7b3;--shop-border:#30363d;--shop-price:#e6edf3;--shop-header-bg:#161b22;--shop-header-fg:#e6edf3}
/*!
 * Shop Storefront — type scale & spacing rhythm (#2853, Etappe 1)
 * ===============================================================
 *
 * Merged by the Core #2228 frontend asset pipeline alongside shop-tokens.css:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * ── WHY A SECOND FILE AND NOT shop-tokens.css ────────────────────────────────
 * shop-tokens.css states its own contract in its header: its defaults
 * "reproduce the current look, no regression" — it is the #2248 BRIDGE that made
 * the storefront themeable WITHOUT changing a pixel. This file is the opposite
 * kind of change: it is a DESIGN DECISION that deliberately alters the look
 * (#2853 — "the storefront looks like unconfigured Bootstrap"). Folding an
 * intentional restyle into a file whose promise is "no regression" would destroy
 * the one property that makes the bridge safe to reason about: nobody could tell
 * any more which declaration is a faithful mirror of Bootstrap and which one is
 * our taste. Keeping them apart means a regression in the look can be bisected to
 * exactly one file, and shop-tokens.css stays byte-comparable against #2248.
 *
 * The plugin already established the pattern of one file per concern —
 * detail-gallery-lightbox.css declares its own local `--shop-*` tokens in the
 * same `.shop-storefront` scope — so this is the house convention, not a new one.
 *
 * ── LOAD ORDER (verified, not assumed) ───────────────────────────────────────
 * PluginManagerCSSMerger::loadPluginFilesOrdered() collects `*.css` per plugin
 * and `sort()`s them BY FILENAME before concatenating (Core/Kernel/Plugin/
 * Functions/PluginManagerCSSMerger.php:114-127). The shipped names therefore
 * concatenate as:
 *     detail-gallery-lightbox.css → shop-tokens.css → shop-typography.css
 *                                 → shop-ui-chrome.css → shop-ui-error-page.css
 *                                 → shop-ui-product-card.css
 *                                 → shop-ui-purchase-flow.css
 * i.e. this file loads AFTER the bridge and BEFORE every `shop-ui-*` component
 * sheet, so a declaration here wins over the bridge at equal specificity and a
 * component may refine it in turn. That ordering is pinned by
 * tests/Unit/Storefront/ShopFrontendCssBundleTest.php — renaming a file to sort
 * before shop-tokens.css would silently un-style the storefront.
 *
 * Everything is scoped to `.shop-storefront` (set on the storefront body wrapper
 * in Templates/Frontend/Storefront/base.html.twig), so ContentBuilder frontend
 * pages outside the storefront keep their own `--cb-*` look.
 *
 * ── THE SCALE ────────────────────────────────────────────────────────────────
 * Direction: "ruhig und handelsüblich" — a TIGHT scale (steps of roughly 1.14 to
 * 1.25, never a doubling), so a page with five text sizes still reads as one
 * voice and the layout does not shout. The default has to carry every assortment
 * from power tools to wine and age slowly, which is why the scale is expressed as
 * steps (2xs…3xl) instead of per-component one-off values: a channel that wants a
 * bigger storefront overrides ONE step and everything built on it follows.
 *
 * Dark mode reuses the storefront's existing mechanism — Bootstrap's
 * `data-bs-theme` attribute (see shop-tokens.css §dark) — and needs no type
 * overrides: sizes and rhythm are colour-independent.
 */
 .shop-storefront{--shop-font-size-2xs:0.6875rem;--shop-font-size-xs:0.75rem;--shop-font-size-sm:0.875rem;--shop-font-size-md:1rem;--shop-font-size-lg:1.125rem;--shop-font-size-xl:1.375rem;--shop-font-size-2xl:1.75rem;--shop-font-size-3xl:2.125rem;--shop-line-height-tight:1.2;--shop-line-height-snug:1.35;--shop-line-height-normal:1.55;--shop-line-height-relaxed:1.75;--shop-font-weight-normal:400;--shop-font-weight-medium:500;--shop-font-weight-semibold:600;--shop-font-weight-bold:700;--shop-letter-spacing-tight:-0.011em;--shop-letter-spacing-normal:0em;--shop-letter-spacing-wide:0.04em;--shop-space-3xs:0.125rem;--shop-space-2xs:0.25rem;--shop-space-xs:0.5rem;--shop-space-sm:0.75rem;--shop-space-md:1rem;--shop-space-lg:1.5rem;--shop-space-xl:2rem;--shop-space-2xl:3rem}.shop-storefront{line-height:var(--shop-line-height-normal);letter-spacing:var(--shop-letter-spacing-normal)}.shop-storefront h1,.shop-storefront .h1{font-size:var(--shop-font-size-3xl);line-height:var(--shop-line-height-tight);letter-spacing:var(--shop-letter-spacing-tight);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront h2,.shop-storefront .h2{font-size:var(--shop-font-size-2xl);line-height:var(--shop-line-height-tight);letter-spacing:var(--shop-letter-spacing-tight);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront h3,.shop-storefront .h3{font-size:var(--shop-font-size-xl);line-height:var(--shop-line-height-snug);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront h4,.shop-storefront .h4{font-size:var(--shop-font-size-lg);line-height:var(--shop-line-height-snug);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront h5,.shop-storefront .h5{font-size:var(--shop-font-size-md);line-height:var(--shop-line-height-snug);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront h6,.shop-storefront .h6{font-size:var(--shop-font-size-sm);line-height:var(--shop-line-height-snug);font-weight:var(--shop-font-weight-semibold);margin-bottom:var(--shop-space-xs)}.shop-storefront p{margin-bottom:var(--shop-space-md)}.shop-storefront .lead{font-size:var(--shop-font-size-lg);line-height:var(--shop-line-height-relaxed);font-weight:var(--shop-font-weight-normal)}.shop-storefront .small,.shop-storefront small{font-size:var(--shop-font-size-sm)}
/*!
 * Shop Storefront — page chrome: header, navigation, trust band, footer
 * (#2853, Etappe 2a)
 * =====================================================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * Consumers:
 *   Templates/Frontend/Storefront/base.html.twig             (header + footer)
 *   Templates/Frontend/Storefront/slots/search.html.twig     (search field)
 *   Templates/Frontend/Storefront/partials/nav_categories.html.twig (menu)
 * plus the ContentBuilder icon boxes a channel authors INSIDE the storefront
 * (see §6) — the storefront's trust band is CB content, not shop markup.
 *
 * ── THE MEASURED DEFECTS THIS FILE ANSWERS ───────────────────────────────────
 * Measured on the stage storefront (vertreter.shop.php-schmiede-dev.com) at
 * 1440px, one answer each:
 *
 *   1. the logo was the word "Shop" in the browser default, at Bootstrap's
 *      `.navbar-brand` size                     → §2, a real wordmark rung;
 *   2. the search field spanned almost the whole header and dominated the page
 *                                               → §3, a capped, centred field;
 *   3. cart and account were tiny unlabelled glyphs with no sense of a hit area
 *                                               → §4, a 44px target with the
 *                                                  label that already existed
 *                                                  in the markup revealed;
 *   4. the "Neuheiten" chip hung under the logo looking lost
 *                                               → §3, a quiet suggestion strip
 *                                                  on the scale;
 *   5. 13 categories wrapped onto two lines and read as an accident
 *                                               → §5, one calm band, both rows
 *                                                  on one rhythm;
 *   6. TWO OF FOUR USP ICONS WERE EMPTY BLUE CIRCLES — the real defect
 *                                               → §7, root cause and fix;
 *   7. the USP headings were nearly H1-sized    → §6, `clamp(1.5rem, 2.8vw,
 *                                                  1.9rem)` replaced by a rung;
 *   8. the footer was a single thin Bootstrap row
 *                                               → §8, same language as the head.
 *
 * ── AND ONE DEFECT NOBODY HAD REPORTED YET ───────────────────────────────────
 * `--shop-header-bg` / `--shop-header-fg` are declared by shop-tokens.css AND
 * exposed as channel form fields ("Kopfbereich-Hintergrund" /
 * "…-Vordergrund", ShopThemeConfigFieldSpecification.php:97-98) — but NO
 * stylesheet read them: the header was `class="bg-body"`, i.e. Bootstrap's
 * colour. An operator could set the header colour of a channel and absolutely
 * nothing happened. §2 consumes both tokens, which is what turns those two
 * fields from decoration into a setting.
 *
 * ── LOAD ORDER ───────────────────────────────────────────────────────────────
 * PluginManagerCSSMerger sorts a plugin's stylesheets by filename
 * (Core/Kernel/Plugin/Functions/PluginManagerCSSMerger.php:114-127), so the
 * family concatenates as
 *   shop-tokens.css → shop-typography.css → shop-ui-chrome.css
 *                                         → shop-ui-product-card.css
 * i.e. this file may refine both the #2248 bridge and the type scale at equal
 * specificity. Pinned by tests/Unit/Storefront/ShopFrontendCssBundleTest.php.
 *
 * ── SCOPE ────────────────────────────────────────────────────────────────────
 * Every rule is scoped to `.shop-storefront` (the wrapper base.html.twig sets),
 * INCLUDING the two sections that address foreign class names (§6 ContentBuilder
 * icon boxes, §7 Font Awesome). The shop has no business re-styling a
 * ContentBuilder page or patching an icon set globally; inside its own
 * storefront it does.
 *
 * ── TOKENS ───────────────────────────────────────────────────────────────────
 * Every size, colour and distance is a `--shop-*` custom property with a hard
 * `var()` fallback, per docs/planning/storefront-tokens.md §2/§4: #2371 will
 * ship a CSS-only theme, and TemplateFinder orders Plugin > Theme > Core — a
 * theme CANNOT override these templates, only their CSS. Nothing here may be
 * reachable through markup alone.
 */
 .shop-storefront{background-color:var(--shop-bg,transparent);color:var(--shop-text,inherit);--shop-header-padding-y:var(--shop-space-sm, 0.75rem);--shop-header-gap:var(--shop-space-sm, 0.75rem);--shop-header-border:color-mix(in srgb, var(--shop-border, #dee2e6) 70%, transparent);--shop-header-brand-size:var(--shop-font-size-xl, 1.375rem);--shop-header-search-max:28rem;--shop-header-action-size:2.75rem;--shop-header-action-color:var(--shop-header-fg, #212529);--shop-header-action-hover-bg:color-mix(in srgb, var(--shop-border, #dee2e6) 45%, transparent);--shop-header-action-icon-size:var(--shop-font-size-lg, 1.125rem);--shop-header-cart-menu-width:20rem;--shop-search-bg:var(--shop-surface, #ffffff);--shop-search-border:var(--shop-border, #dee2e6);--shop-search-radius:999px;--shop-search-height:var(--shop-header-action-size, 2.75rem);--shop-search-placeholder:var(--shop-text-muted, #5f676e);--shop-search-chip-size:var(--shop-font-size-xs, 0.75rem);--shop-nav-bg:var(--shop-header-bg, #ffffff);--shop-nav-border:color-mix(in srgb, var(--shop-border, #dee2e6) 70%, transparent);--shop-nav-padding-y:var(--shop-space-2xs, 0.25rem);--shop-nav-gap:var(--shop-space-3xs, 0.125rem);--shop-nav-link-padding-y:var(--shop-space-xs, 0.5rem);--shop-nav-link-padding-x:var(--shop-space-sm, 0.75rem);--shop-nav-link-size:var(--shop-font-size-sm, 0.875rem);--shop-nav-link-color:var(--shop-header-fg, #212529);--shop-nav-link-active-color:var(--shop-primary, #1a6fb5);--shop-nav-link-hover-bg:color-mix(in srgb, var(--shop-border, #dee2e6) 45%, transparent);--shop-nav-menu-width:14rem;--shop-nav-menu-shadow:0 0.5rem 1.5rem rgba(16, 24, 40, 0.12);--shop-usp-padding-y:var(--shop-space-md, 1rem);--shop-usp-padding-x:var(--shop-space-sm, 0.75rem);--shop-usp-title-size:var(--shop-font-size-md, 1rem);--shop-usp-text-size:var(--shop-font-size-sm, 0.875rem);--shop-footer-bg:color-mix(in srgb, var(--shop-border, #dee2e6) 25%, var(--shop-surface, #ffffff));--shop-footer-fg:var(--shop-text, #212529);--shop-footer-border:color-mix(in srgb, var(--shop-border, #dee2e6) 55%, transparent);--shop-footer-padding-y:var(--shop-space-xl, 2rem);--shop-footer-brand-size:var(--shop-font-size-lg, 1.125rem);--shop-footer-link-size:var(--shop-font-size-sm, 0.875rem);--shop-footer-link-color:var(--shop-text-muted, #5f676e);--shop-chrome-transition:150ms ease;--shop-chrome-focus-width:2px}.shop-storefront .shop-header{background-color:var(--shop-header-bg,#ffffff);color:var(--shop-header-fg,#212529);border-bottom:1px solid var(--shop-header-border)}.shop-storefront .shop-header-bar{padding-top:0;padding-bottom:0}.shop-storefront .shop-header-inner{padding-top:var(--shop-header-padding-y);padding-bottom:var(--shop-header-padding-y)}.shop-storefront .shop-header-inner{display:flex;flex-wrap:wrap;align-items:center;gap:var(--shop-header-gap);justify-content:flex-start}.shop-storefront .shop-header-brand{order:1;display:inline-flex;align-items:center;min-height:var(--shop-header-action-size);padding:0;margin:0;font-size:inherit;color:inherit;text-decoration:none}.shop-storefront .shop-header-brand-text{font-size:var(--shop-header-brand-size);line-height:var(--shop-line-height-tight,1.2);font-weight:var(--shop-font-weight-semibold,600);letter-spacing:var(--shop-letter-spacing-tight,-.011em)}.shop-storefront .shop-header-brand:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:var(--shop-chrome-focus-width);border-radius:var(--shop-radius,.375rem)}.shop-storefront .shop-header-actions{order:2;display:flex;align-items:center;gap:var(--shop-space-2xs,.25rem);margin-inline-start:auto}.shop-storefront .shop-header-toggle{order:3;display:inline-flex;align-items:center;justify-content:center;min-width:var(--shop-header-action-size);min-height:var(--shop-header-action-size);padding:0;border-color:var(--shop-header-border)}.shop-storefront .shop-header-search{order:4;flex:1 0 100%;min-width:0}@media (min-width:992px){.shop-storefront .shop-header-inner{flex-wrap:nowrap}.shop-storefront .shop-header-brand,.shop-storefront .shop-header-actions,.shop-storefront .shop-header-search{order:0}.shop-storefront .shop-header-search{flex:1 1 auto;max-width:var(--shop-header-search-max);margin-inline:auto}.shop-storefront .shop-header-actions{margin-inline-start:0}.shop-storefront .shop-header-toggle{display:none}}.shop-storefront .shop-search{display:flex;flex-direction:column;width:100%;min-width:0}.shop-storefront .shop-search-field{position:relative;width:100%;min-width:0}.shop-storefront .shop-search-form{display:flex;align-items:center;background-color:var(--shop-search-bg);border:1px solid var(--shop-search-border);border-radius:var(--shop-search-radius);transition:border-color var(--shop-chrome-transition),box-shadow var(--shop-chrome-transition)}.shop-storefront .shop-search-form:focus-within{border-color:var(--shop-primary,#1a6fb5);box-shadow:0 0 0 .2rem rgba(var(--shop-primary-rgb,26,111,181),.18)}.shop-storefront .shop-search-input{flex:1 1 auto;min-width:0;height:var(--shop-search-height);padding:0 var(--shop-space-sm,.75rem);border:0;border-radius:inherit;background-color:#fff0;color:inherit;font-size:var(--shop-font-size-sm,.875rem);line-height:var(--shop-line-height-snug,1.35)}.shop-storefront .shop-search-input:focus{border-color:#fff0;background-color:#fff0;box-shadow:none;outline:none}.shop-storefront .shop-search-input::placeholder{color:var(--shop-search-placeholder)}.shop-storefront .shop-search-submit{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;min-width:var(--shop-search-height);height:var(--shop-search-height);padding:0;border:0;border-radius:inherit;background-color:#fff0;color:var(--shop-text-muted,#5f676e);transition:color var(--shop-chrome-transition)}.shop-storefront .shop-search-submit:hover,.shop-storefront .shop-search-submit:focus-visible{color:var(--shop-primary,#1a6fb5)}.shop-storefront .shop-search-submit:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:calc(var(--shop-chrome-focus-width) * -1)}.shop-storefront .shop-search-quicklinks{display:flex;flex-wrap:wrap;align-items:center;gap:var(--shop-space-2xs,.25rem) var(--shop-space-xs,.5rem);margin-top:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-search-quicklink .badge{padding:.25rem .625rem;border-radius:var(--shop-search-radius);border-color:var(--shop-search-border);font-size:var(--shop-search-chip-size);font-weight:var(--shop-font-weight-medium,500);line-height:var(--shop-line-height-snug,1.35);transition:border-color var(--shop-chrome-transition)}.shop-storefront .shop-search-quicklink:hover .badge,.shop-storefront .shop-search-quicklink:focus-visible .badge{border-color:var(--shop-primary,#1a6fb5)}.shop-storefront .shop-search-quicklink:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:var(--shop-chrome-focus-width);border-radius:var(--shop-search-radius)}.shop-storefront .shop-header-action-item{position:relative;display:flex}.shop-storefront .shop-header-action{display:inline-flex;align-items:center;justify-content:center;gap:var(--shop-space-2xs,.25rem);min-width:var(--shop-header-action-size);min-height:var(--shop-header-action-size);padding:0 var(--shop-space-xs,.5rem);border-radius:var(--shop-radius,.375rem);color:var(--shop-header-action-color);text-decoration:none;font-size:var(--shop-font-size-sm,.875rem);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-medium,500);transition:background-color var(--shop-chrome-transition),color var(--shop-chrome-transition)}.shop-storefront .shop-header-action:hover{background-color:var(--shop-header-action-hover-bg);color:var(--shop-primary,#1a6fb5)}.shop-storefront .shop-header-action:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:var(--shop-chrome-focus-width)}.shop-storefront .shop-header-action-icon{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:var(--shop-header-action-icon-size);line-height:1}.shop-storefront .shop-header-action-badge{font-size:var(--shop-font-size-2xs,.6875rem);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-header-action-label{display:none;white-space:nowrap}@media (min-width:768px){.shop-storefront .shop-header-action-label{display:inline}}.shop-storefront .shop-header-cart-menu{min-width:var(--shop-header-cart-menu-width);padding:var(--shop-space-xs,.5rem);border-color:var(--shop-nav-border);border-radius:var(--shop-radius,.375rem);box-shadow:var(--shop-nav-menu-shadow)}.shop-storefront .shop-header-install{white-space:nowrap}.shop-storefront .shop-nav-bar{background-color:var(--shop-nav-bg);border-top:1px solid var(--shop-nav-border)}.shop-storefront .shop-nav-list{display:flex;flex-wrap:wrap;align-items:stretch;column-gap:var(--shop-nav-gap);row-gap:0;margin:0;padding:var(--shop-nav-padding-y) 0;list-style:none}.shop-storefront .shop-nav-bar .shop-nav-item{display:flex}.shop-storefront .shop-nav-bar .shop-nav-link{display:inline-flex;align-items:center;padding:var(--shop-nav-link-padding-y) var(--shop-nav-link-padding-x);border-radius:var(--shop-radius,.375rem);color:var(--shop-nav-link-color);text-decoration:none;font-size:var(--shop-nav-link-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-medium,500);transition:background-color var(--shop-chrome-transition),color var(--shop-chrome-transition)}.shop-storefront .shop-nav-bar .shop-nav-link:hover,.shop-storefront .shop-nav-bar .shop-nav-link[aria-expanded="true"]{background-color:var(--shop-nav-link-hover-bg);color:var(--shop-nav-link-active-color)}.shop-storefront .shop-nav-link:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:calc(var(--shop-chrome-focus-width) * -1)}.shop-storefront .shop-nav-link.dropdown-toggle::after{margin-left:var(--shop-space-2xs,.25rem);opacity:.55}.shop-storefront .shop-nav-menu{min-width:var(--shop-nav-menu-width);padding:var(--shop-space-2xs,.25rem) 0;border-color:var(--shop-nav-border);border-radius:var(--shop-radius,.375rem);box-shadow:var(--shop-nav-menu-shadow);--bs-dropdown-link-active-bg:var(--shop-primary, #1a6fb5)}.shop-storefront .shop-nav-menu-all{font-size:var(--shop-font-size-sm,.875rem);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-nav-menu-link{font-size:var(--shop-font-size-sm,.875rem)}.shop-storefront .shop-nav-menu-sublink{font-size:var(--shop-font-size-xs,.75rem);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-header-collapse{flex-basis:100%;background-color:var(--shop-nav-bg);border-top:1px solid var(--shop-nav-border)}.shop-storefront .shop-nav-list-mobile{padding:var(--shop-space-xs,.5rem) 0;margin:0}.shop-storefront .shop-nav-list-mobile .shop-nav-link{display:flex;align-items:center;min-height:var(--shop-header-action-size);padding:var(--shop-space-2xs,.25rem) 0;color:var(--shop-nav-link-color);text-decoration:none;font-size:var(--shop-font-size-md,1rem);font-weight:var(--shop-font-weight-medium,500)}.shop-storefront .shop-nav-list-mobile .shop-nav-link:hover{color:var(--shop-nav-link-active-color)}.shop-storefront .shop-nav-list-mobile .shop-nav-menu{width:auto;min-width:0;margin:0;padding:0 0 var(--shop-space-xs,.5rem);padding-inline-start:var(--shop-space-md,1rem);border:0;box-shadow:none;background-color:#fff0}.shop-storefront .shop-nav-list-mobile .dropdown-item{display:flex;align-items:center;min-height:var(--shop-header-action-size);white-space:normal}.shop-storefront .cb-icon-box{padding:var(--shop-usp-padding-y) var(--shop-usp-padding-x)}.shop-storefront .cb-icon-box-title{margin-bottom:var(--shop-space-2xs,.25rem);font-size:var(--shop-usp-title-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-semibold,600);letter-spacing:var(--shop-letter-spacing-normal,0em)}.shop-storefront .cb-icon-box-text{font-size:var(--shop-usp-text-size);line-height:var(--shop-line-height-normal,1.55);color:color-mix(in srgb,currentColor 65%,transparent)}.shop-storefront .cb-icon-box-text>:last-child{margin-bottom:0}.shop-storefront .fa-truck-fast::before{content:"\f48b"}.shop-storefront .fa-rotate-left::before{content:"\f0e2"}.shop-storefront .fa-shirt::before{content:"\f553"}.shop-storefront .shop-footer{background-color:var(--shop-footer-bg);color:var(--shop-footer-fg);border-top:1px solid var(--shop-footer-border)}.shop-storefront .shop-footer-inner{padding-top:var(--shop-footer-padding-y);padding-bottom:var(--shop-footer-padding-y)}.shop-storefront .shop-footer-brand-text{font-size:var(--shop-footer-brand-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-semibold,600);letter-spacing:var(--shop-letter-spacing-tight,-.011em)}.shop-storefront .shop-footer-nav{column-gap:var(--shop-space-2xs,.25rem);row-gap:0}.shop-storefront .shop-footer-link{display:inline-flex;align-items:center;padding:var(--shop-space-xs,.5rem);border-radius:var(--shop-radius,.375rem);color:var(--shop-footer-link-color);text-decoration:none;font-size:var(--shop-footer-link-size);line-height:var(--shop-line-height-snug,1.35);transition:color var(--shop-chrome-transition)}.shop-storefront .shop-footer-link:hover{color:var(--shop-primary,#1a6fb5);text-decoration:underline}.shop-storefront .shop-footer-link:focus-visible{outline:var(--shop-chrome-focus-width) solid var(--shop-primary,#1a6fb5);outline-offset:calc(var(--shop-chrome-focus-width) * -1);color:var(--shop-primary,#1a6fb5)}@media (prefers-reduced-motion:reduce){.shop-storefront .shop-header-action,.shop-storefront .shop-search-form,.shop-storefront .shop-search-submit,.shop-storefront .shop-search-quicklink .badge,.shop-storefront .shop-nav-bar .shop-nav-link,.shop-storefront .shop-footer-link{transition:none}}[data-bs-theme=dark] .shop-storefront,.shop-storefront[data-bs-theme=dark]{--shop-search-bg:color-mix(in srgb, var(--shop-border, #30363d) 45%, var(--shop-surface, #161b22));--shop-nav-menu-shadow:0 0.5rem 1.5rem rgba(0, 0, 0, 0.5);--shop-footer-bg:color-mix(in srgb, var(--shop-bg, #0d1117) 65%, var(--shop-surface, #161b22));--shop-header-action-hover-bg:color-mix(in srgb, var(--shop-border, #30363d) 60%, transparent);--shop-nav-link-hover-bg:color-mix(in srgb, var(--shop-border, #30363d) 60%, transparent)}.shop-storefront .shop-skip-link:focus,.shop-storefront .shop-skip-link:focus-within{position:absolute;top:var(--shop-space-sm,.75rem);left:var(--shop-space-sm,.75rem);z-index:1080;padding:var(--shop-space-sm,.75rem) var(--shop-space-md,1rem);border-radius:var(--shop-radius,.375rem);background-color:var(--shop-surface,#ffffff);color:var(--shop-primary,#1a6fb5);box-shadow:var(--shop-nav-menu-shadow,0 .5rem 1.5rem rgb(0 0 0 / .15));outline:var(--shop-chrome-focus-width,2px) solid var(--shop-primary,#1a6fb5);outline-offset:2px;text-decoration:none;white-space:nowrap}
/*!
 * Shop Storefront — error page (#2853, Etappe 2b)
 * ===============================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * Consumer: Templates/Frontend/Storefront/partials/error_page.html.twig, i.e.
 * both the 404 and the 500 page — they share one body and therefore one
 * stylesheet.
 *
 * ── WHAT THIS REPLACES ───────────────────────────────────────────────────────
 * The Core storefront error page is a full-viewport violet gradient with 8rem
 * white digits and a translucent button (Core/Modules/Error/Controller/
 * ErrorController.php:615-638). Nothing about it belongs to any shop, and it
 * arrives without header, navigation, search or footer — the customer is out of
 * the shop with one link back. The page is now a normal storefront page and this
 * file styles its body accordingly: quiet, on the type scale, no full-bleed
 * colour, no oversized number.
 *
 * ── LOAD ORDER (derived, not assumed) ────────────────────────────────────────
 * PluginManagerCSSMerger::loadPluginFilesOrdered() `sort()`s a plugin's `*.css`
 * BY FILENAME before concatenating (Core/Kernel/Plugin/Functions/
 * PluginManagerCSSMerger.php:114-127). The seven shipped names therefore
 * concatenate as
 *   detail-gallery-lightbox.css → shop-tokens.css → shop-typography.css
 *                               → shop-ui-chrome.css → shop-ui-error-page.css
 *                               → shop-ui-product-card.css
 *                               → shop-ui-purchase-flow.css
 * so this file lands AFTER both the #2248 Bootstrap bridge and the Etappe-1 type
 * scale and may rely on every `--shop-*` token they declare. The `shop-ui-`
 * prefix is what buys that position — a name sorting before `shop-tokens.css`
 * would silently lose every token default. Pinned by
 * tests/Unit/Storefront/ShopFrontendCssBundleTest.php.
 *
 * ── TOKENS ───────────────────────────────────────────────────────────────────
 * Every value is a `--shop-error-*` custom property with a hard `var()` fallback,
 * per the token contract (docs/planning/storefront-tokens.md §4). #2371 ships a
 * CSS-ONLY theme, and TemplateFinder orders Plugin > Theme > Core — a theme
 * cannot override these templates, only their CSS, so nothing here may be
 * reachable through markup alone.
 *
 * Dark mode needs no rules of its own: every colour resolves through the
 * `--shop-*` palette, which shop-tokens.css §dark already re-points under
 * `[data-bs-theme=dark]`.
 */
 .shop-storefront{--shop-error-measure:46ch;--shop-error-padding-block:var(--shop-space-2xl, 3rem);--shop-error-gap:var(--shop-space-md, 1rem);--shop-error-code-size:var(--shop-font-size-xs, 0.75rem);--shop-error-code-weight:var(--shop-font-weight-semibold, 600);--shop-error-code-tracking:var(--shop-letter-spacing-wide, 0.04em);--shop-error-code-color:var(--shop-text-muted, #5f676e);--shop-error-message-size:var(--shop-font-size-lg, 1.125rem);--shop-error-message-color:var(--shop-text-muted, #5f676e);--shop-error-search-gap:var(--shop-space-xs, 0.5rem);--shop-error-search-max:32rem;--shop-error-action-min-height:2.75rem;--shop-error-chip-gap:var(--shop-space-xs, 0.5rem);--shop-error-chip-padding-x:var(--shop-space-sm, 0.75rem);--shop-error-chip-padding-y:var(--shop-space-2xs, 0.25rem);--shop-error-chip-size:var(--shop-font-size-sm, 0.875rem);--shop-error-chip-radius:var(--shop-radius, 0.375rem);--shop-error-chip-bg:color-mix(
        in srgb,
        var(--shop-border, #dee2e6) 35%,
        var(--shop-surface, #ffffff)
    );--shop-error-chip-bg-hover:color-mix(
        in srgb,
        var(--shop-primary, #1a6fb5) 12%,
        var(--shop-surface, #ffffff)
    );--shop-error-chip-color:var(--shop-text, #212529);--shop-error-transition:150ms ease}.shop-storefront .shop-error{display:flex;flex-direction:column;align-items:center;gap:var(--shop-error-gap);max-width:var(--shop-error-measure);margin-inline:auto;padding-block:var(--shop-error-padding-block);text-align:center}.shop-storefront .shop-error-code{margin:0;font-size:var(--shop-error-code-size);font-weight:var(--shop-error-code-weight);letter-spacing:var(--shop-error-code-tracking);text-transform:uppercase;color:var(--shop-error-code-color)}.shop-storefront .shop-error-title{margin:0}.shop-storefront .shop-error-message{margin:0;font-size:var(--shop-error-message-size);line-height:var(--shop-line-height-normal,1.55);color:var(--shop-error-message-color)}.shop-storefront .shop-error-search{display:flex;flex-wrap:wrap;gap:var(--shop-error-search-gap);width:100%;max-width:var(--shop-error-search-max);margin:0}.shop-storefront .shop-error-search-input{flex:1 1 12rem;min-width:0}.shop-storefront .shop-error-search-submit{flex:0 0 auto;min-height:var(--shop-error-action-min-height)}.shop-storefront .shop-error-actions{margin:0}.shop-storefront .shop-error-home{min-height:var(--shop-error-action-min-height);display:inline-flex;align-items:center;justify-content:center}.shop-storefront .shop-error-categories{width:100%}.shop-storefront .shop-error-categories-heading{font-size:var(--shop-font-size-sm,.875rem);font-weight:var(--shop-font-weight-medium,500);color:var(--shop-text-muted,#5f676e);margin-bottom:var(--shop-space-xs,.5rem)}.shop-storefront .shop-error-category-list{display:flex;flex-wrap:wrap;justify-content:center;gap:var(--shop-error-chip-gap);margin:0;padding-inline-start:0;list-style:none}.shop-storefront .shop-error-category-link{display:inline-block;padding:var(--shop-error-chip-padding-y) var(--shop-error-chip-padding-x);font-size:var(--shop-error-chip-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-error-chip-color);background-color:var(--shop-error-chip-bg);border-radius:var(--shop-error-chip-radius);text-decoration:none;transition:background-color var(--shop-error-transition)}.shop-storefront .shop-error-category-link:hover,.shop-storefront .shop-error-category-link:focus-visible{background-color:var(--shop-error-chip-bg-hover);color:var(--shop-error-chip-color)}@media (prefers-reduced-motion:reduce){.shop-storefront .shop-error-category-link{transition:none}}
/*!
 * Shop Storefront — product listing toolbar (#4142)
 * =================================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * Consumer: Templates/Frontend/Storefront/listing.html.twig, block
 * `storefront_listing_toolbar` — i.e. /products, every category page (/c/…),
 * the group and the landing listings, which all inherit that block.
 *
 * ── THE MEASURED DEFECT ──────────────────────────────────────────────────────
 * Stage storefront, visitor, Chromium isMobile 320×700: every listing reported
 * scrollWidth 405. The toolbar's control row — filter button, "Sortierung"
 * label, sort select and the grid/list switch — was a NON-wrapping flex row, so
 * its right edge sat at 405px and dragged the whole page sideways. The view
 * switch was also a pair of `btn-sm` squares (~31px), too small for a thumb.
 *
 * ── WHAT THIS FILE DOES ──────────────────────────────────────────────────────
 * The markup now wraps on its own (`flex-wrap` on both rows); this file only
 * shapes HOW it wraps and how large the targets are, in two mobile-only bands:
 *
 *   < sm (576px)  the control row takes the full width under the heading:
 *                 filter button (growing) + view switch on the first line, the
 *                 LABELLED sort select full width on the second — the label
 *                 stays visible, the select shrinks with the screen instead of
 *                 pushing past it.
 *   < lg (992px)  every toolbar control is at least a 44px target and the sort
 *                 select renders at 16px, below which iOS Safari zooms the page
 *                 on focus (and leaves it zoomed, i.e. scrolled sideways).
 *
 * From lg up NOTHING here applies: the desktop toolbar keeps its compact
 * `btn-sm` / `form-select-sm` look exactly as before.
 *
 * Reading order note: below sm the sort form is moved visually AFTER the view
 * switch (`order`), while the DOM keeps filter → sort → view. Both orders are
 * meaningful (the three controls are independent), so WCAG 2.4.3 holds; the
 * DOM order stays the desktop order on purpose.
 *
 * ── LOAD ORDER ───────────────────────────────────────────────────────────────
 * PluginManagerCSSMerger sorts a plugin's stylesheets by filename, so the
 * `shop-ui-` prefix places this file after shop-tokens.css and
 * shop-typography.css. Pinned by tests/Unit/Storefront/ShopFrontendCssBundleTest.php.
 *
 * ── SCOPE / TOKENS ───────────────────────────────────────────────────────────
 * Every rule is scoped to `.shop-storefront`; every size is a `--shop-*` token
 * with a hard `var()` fallback (docs/planning/storefront-tokens.md §2/§4), so a
 * CSS-only theme (#2371) can retune it. No colours — Dark needs no rules here.
 */
 .shop-storefront{--shop-listing-control-size:2.75rem;--shop-listing-control-font-size:1rem}@media (max-width:991.98px){.shop-storefront .shop-listing-toolbar__controls .btn{display:inline-flex;align-items:center;justify-content:center;min-height:var(--shop-listing-control-size,2.75rem)}.shop-storefront .shop-listing-toolbar__view .btn{min-width:var(--shop-listing-control-size,2.75rem)}.shop-storefront .shop-listing-toolbar__sort .form-select{min-height:var(--shop-listing-control-size,2.75rem);font-size:var(--shop-listing-control-font-size,1rem)}}@media (max-width:575.98px){.shop-storefront .shop-listing-toolbar__controls{flex:1 1 100%;min-width:0}.shop-storefront .shop-listing-toolbar__filter{flex:1 1 auto}.shop-storefront .shop-listing-toolbar__sort{order:1;flex:1 1 100%;min-width:0}.shop-storefront .shop-listing-toolbar__sort .form-select{flex:1 1 auto;min-width:0}}
/*!
 * Shop Storefront — product tile (#2853, Etappe 1)
 * ================================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * Consumer: Templates/Frontend/Storefront/components/product_card.html.twig —
 * the ONE tile behind all four card producers (listing, frontpage grid,
 * cross-/up-sell rails, ContentBuilder blocks), so every surface changes with it.
 *
 * ── THE DEFECT THIS FILE FIXES ───────────────────────────────────────────────
 * Measured on the stage listing: neighbouring tiles had DIFFERENT HEIGHTS, so
 * prices and buttons of adjacent cards never lined up. Three causes, three
 * answers:
 *   1. the title wrapped over 2 OR 3 lines   → clamped to exactly 2 lines
 *      ("Organic Lemon Lemonade" was three)     with a reserved min-height, so a
 *                                               one-word title occupies the same
 *                                               box as a three-line one — and the
 *                                               teaser copy one line below it got
 *                                               the same pair, after the frontpage
 *                                               showed the identical defect there;
 *   2. the base-price line ("€ 2,86 je 1 l")  → its row is ALWAYS in the flow and
 *      existed on some products only,           reserves one meta line;
 *   3. everything below simply stacked        → the action row is bottom-pinned
 *                                               (margin-top: auto).
 * Together with the fixed 1:1 media box, everything from the top of the tile down
 * to the base price sits at an identical offset in every card, and the buttons
 * share one baseline whatever happens in between.
 *
 * ── AND ONE DEFECT IT CAUSED, THEN FIXED ─────────────────────────────────────
 * The first version also forced the call to action onto a single line and let it
 * ellipsise. On the stage that cut every button to "In den W…". Root cause: the
 * icon was hidden below `@media (min-width: 576px)` — a VIEWPORT query, while the
 * constraint is the TILE, which is ~150px wide on a 1440px desktop because the
 * listing spends two thirds of its width on the category and facet columns. The
 * tile is now a QUERY CONTAINER (layer 2), the label WRAPS instead of being cut,
 * and the button reserves its height (layer 6). Measured in a headless Chromium
 * against this bundle: 156px tile → icon off, label on two lines, nothing
 * truncated; 318px tile → icon on, label on one line, button one line tall;
 * tiles equal height and buttons flush in both.
 *
 * ── WHY A RESERVED ROW AND NOT A PLACEHOLDER STRING ──────────────────────────
 * The base-price slot keeps its height through an always-rendered wrapper with a
 * `min-height` of exactly one meta line — NOT through a `&nbsp;`/"—" placeholder.
 * A placeholder is real text: assistive technology announces it, it copies into
 * the clipboard, and it invites a translator to "fix" it. An empty box with a
 * min-height has no accessible content at all, and the height is derived from the
 * type scale (`--shop-product-card-meta-size` × `--shop-line-height-snug`), so it
 * follows automatically when a channel scales the typography instead of drifting
 * out of sync with a hard-coded pixel value. The PAngV §4 marker `data-card-base-price`
 * stays on the INNER span, so "no base price may be stated" remains detectable
 * (and testable) as the absence of that attribute.
 *
 * ── WHY THE TILE IS NO LONGER A BOOTSTRAP `.card` ────────────────────────────
 * The complaint was literally "the tile is the Bootstrap default card". Rather
 * than fight `.card`'s border/padding/radius with overrides, the tile drops the
 * class and owns its surface. Consequence worth knowing: the `--bs-card-*`
 * bridge in shop-tokens.css (`.shop-storefront .shop-product-card`) no longer
 * has an effect HERE — it is deliberately left in place as a compatibility hook
 * for third-party surfaces that still render `class="card shop-product-card"`.
 *
 * ── LOAD ORDER ───────────────────────────────────────────────────────────────
 * PluginManagerCSSMerger sorts a plugin's stylesheets by filename
 * (PluginManagerCSSMerger.php:114-127), so `shop-ui-product-card.css` lands after
 * `shop-tokens.css` and `shop-typography.css` and can rely on both. Pinned by
 * tests/Unit/Storefront/ShopFrontendCssBundleTest.php.
 *
 * ── TOKENS ───────────────────────────────────────────────────────────────────
 * Every geometry, colour and size below is a `--shop-product-card-*` custom
 * property with a hard `var()` fallback, per the token contract
 * (docs/planning/storefront-tokens.md §4). #2371 will ship a CSS-only theme, and
 * TemplateFinder orders Plugin > Theme > Core — a theme CANNOT override this
 * template, only its CSS. So nothing here may be reachable through markup alone.
 */
 .shop-storefront{--shop-product-card-bg:var(--shop-surface, #ffffff);--shop-product-card-border-color:transparent;--shop-product-card-border-width:1px;--shop-product-card-radius:var(--shop-radius, 0.375rem);--shop-product-card-padding:var(--shop-space-sm, 0.75rem);--shop-product-card-gap:var(--shop-space-2xs, 0.25rem);--shop-product-card-shadow:0 1px 3px rgba(16, 24, 40, 0.08);--shop-product-card-shadow-hover:0 0.5rem 1.25rem rgba(16, 24, 40, 0.12);--shop-product-card-lift:-2px;--shop-product-card-transition:150ms ease;--shop-product-card-media-ratio:1;--shop-product-card-media-bg:color-mix(
        in srgb,
        var(--shop-border, #dee2e6) 45%,
        var(--shop-surface, #ffffff)
    );--shop-product-card-media-zoom:1.03;--shop-product-card-title-lines:2;--shop-product-card-title-size:var(--shop-font-size-sm, 0.875rem);--shop-product-card-title-weight:var(--shop-font-weight-medium, 500);--shop-product-card-description-lines:2;--shop-product-card-description-size:var(--shop-font-size-sm, 0.875rem);--shop-product-card-price-size:var(--shop-font-size-lg, 1.125rem);--shop-product-card-price-weight:var(--shop-font-weight-bold, 700);--shop-product-card-meta-size:var(--shop-font-size-sm, 0.875rem);--shop-product-card-meta-line:calc(
        var(--shop-product-card-meta-size) * var(--shop-line-height-snug, 1.35)
    );--shop-product-card-meta-gap:var(--shop-space-2xs, 0.25rem);--shop-product-card-cta-size:var(--shop-font-size-sm, 0.875rem);--shop-product-card-cta-padding-y:var(--shop-space-xs, 0.5rem);--shop-product-card-cta-padding-x:var(--shop-space-xs, 0.5rem);--shop-product-card-cta-lines:2;--shop-product-card-focus-color:var(--shop-primary, #1a6fb5);--shop-product-card-focus-width:2px;--shop-product-card-focus-offset:2px}.shop-storefront .shop-product-card{position:relative;container-type:inline-size;container-name:shop-product-card;display:flex;flex-direction:column;height:100%;background-color:var(--shop-product-card-bg);border:var(--shop-product-card-border-width) solid var(--shop-product-card-border-color);border-radius:var(--shop-product-card-radius);box-shadow:var(--shop-product-card-shadow);transition:box-shadow var(--shop-product-card-transition),transform var(--shop-product-card-transition),border-color var(--shop-product-card-transition)}.shop-storefront .shop-product-card:hover{box-shadow:var(--shop-product-card-shadow-hover);transform:translateY(var(--shop-product-card-lift))}.shop-storefront .shop-product-card:has(.shop-product-card-link:focus-visible){outline:var(--shop-product-card-focus-width) solid var(--shop-product-card-focus-color);outline-offset:var(--shop-product-card-focus-offset)}.shop-storefront .shop-product-card-link:focus-visible{outline:var(--shop-product-card-focus-width) solid var(--shop-product-card-focus-color);outline-offset:var(--shop-product-card-focus-offset)}.shop-storefront .shop-product-card:has(.shop-product-card-link:focus-visible) .shop-product-card-link:focus-visible{outline:none}.shop-storefront .shop-product-card-media{display:block;position:relative;aspect-ratio:var(--shop-product-card-media-ratio);overflow:hidden;border-start-start-radius:var(--shop-product-card-radius);border-start-end-radius:var(--shop-product-card-radius);background-color:var(--shop-product-card-media-bg);text-decoration:none}.shop-storefront .shop-product-card-image{width:100%;height:100%;object-fit:cover;transition:transform var(--shop-product-card-transition)}.shop-storefront .shop-product-card:hover .shop-product-card-image{transform:scale(var(--shop-product-card-media-zoom))}.shop-storefront .shop-product-card-media-placeholder{display:flex;align-items:center;justify-content:center;width:100%;height:100%;font-size:var(--shop-font-size-2xl,1.75rem);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-product-card-body{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--shop-product-card-gap);padding:var(--shop-product-card-padding)}.shop-storefront .shop-product-card-flags{display:flex;flex-wrap:wrap;gap:var(--shop-product-card-meta-gap)}.shop-storefront .shop-product-card-title{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--shop-product-card-title-lines);line-clamp:var(--shop-product-card-title-lines);overflow:hidden;min-height:calc(var(--shop-product-card-title-size) * var(--shop-line-height-snug,1.35) * var(--shop-product-card-title-lines));margin:0;font-size:var(--shop-product-card-title-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-product-card-title-weight);color:var(--shop-text,#212529);overflow-wrap:anywhere}.shop-storefront .shop-product-card-link{color:inherit;text-decoration:none}.shop-storefront .shop-product-card-link:hover{text-decoration:underline}.shop-storefront .shop-product-card-description{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--shop-product-card-description-lines);line-clamp:var(--shop-product-card-description-lines);overflow:hidden;min-height:calc(var(--shop-product-card-description-size) * var(--shop-line-height-snug,1.35) * var(--shop-product-card-description-lines));margin:0;font-size:var(--shop-product-card-description-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-product-card-price{display:flex;flex-direction:column;gap:var(--shop-product-card-meta-gap);margin-top:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-product-card-price-value{font-size:var(--shop-product-card-price-size);line-height:var(--shop-line-height-tight,1.2);font-weight:var(--shop-product-card-price-weight);letter-spacing:var(--shop-letter-spacing-tight,-.011em)}.shop-storefront .shop-product-card-price-note{font-size:var(--shop-font-size-sm,.875rem);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-product-card-legal{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:var(--shop-space-xs,.5rem);font-size:var(--shop-product-card-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-product-card-legal>*{min-width:0;overflow-wrap:anywhere}.shop-storefront .shop-price-shipping-link{color:inherit;text-decoration:underline}.shop-storefront .shop-product-card-base-price{min-height:var(--shop-product-card-meta-line);font-size:var(--shop-product-card-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-product-card-ampel{display:flex;flex-direction:column;gap:var(--shop-space-3xs,.125rem);align-items:flex-start;margin-top:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-product-card-delivery{max-width:100%;overflow:hidden;font-size:var(--shop-product-card-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-text-muted,#5f676e);text-overflow:ellipsis;white-space:nowrap}.shop-storefront .shop-product-card-actions{position:relative;z-index:2;margin-top:auto;padding-top:var(--shop-space-xs,.5rem)}.shop-storefront .shop-product-card-cta{display:flex;align-items:center;justify-content:center;gap:var(--shop-space-2xs,.25rem);width:100%;min-width:0;padding:var(--shop-product-card-cta-padding-y) var(--shop-product-card-cta-padding-x);font-size:var(--shop-product-card-cta-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-medium,500)}.shop-storefront .shop-product-card-cta-label{display:flex;align-items:center;justify-content:center;min-width:0;min-height:calc(var(--shop-product-card-cta-lines) * var(--shop-product-card-cta-size) * var(--shop-line-height-snug,1.35));text-align:center;overflow-wrap:break-word}.shop-storefront .shop-product-card-cta-icon{display:none;flex:0 0 auto}@container shop-product-card (min-width:200px){.shop-storefront .shop-product-card-cta-icon{display:inline-block}.shop-storefront .shop-product-card-cta-label{min-height:calc(var(--shop-product-card-cta-size) * var(--shop-line-height-snug,1.35))}}@media (prefers-reduced-motion:reduce){.shop-storefront .shop-product-card,.shop-storefront .shop-product-card-image{transition:none}.shop-storefront .shop-product-card:hover{transform:none}.shop-storefront .shop-product-card:hover .shop-product-card-image{transform:none}}[data-bs-theme=dark] .shop-storefront,.shop-storefront[data-bs-theme=dark]{--shop-product-card-border-color:var(--shop-border, #30363d);--shop-product-card-shadow:none;--shop-product-card-shadow-hover:0 0.5rem 1.25rem rgba(0, 0, 0, 0.45);--shop-product-card-media-bg:color-mix(
        in srgb,
        var(--shop-border, #30363d) 60%,
        var(--shop-surface, #161b22)
    )}
/*!
 * Shop Storefront — the purchase path: detail, cart, checkout, confirmation
 * (#2853, Etappe 2c + Etappe 3)
 * =============================================================================
 *
 * Merged by the Core #2228 frontend asset pipeline:
 *   src/assets/frontend/css/*.css  →  public/assets/frontend/css/plugin.css
 * (built via `ps:plugin:assets:rebuild --frontend --css`, Stage only).
 *
 * Consumers — the four pages a buyer walks through, plus the partials they share:
 *   Templates/Frontend/Storefront/detail.html.twig
 *   Templates/Frontend/Storefront/cart.html.twig
 *   Templates/Frontend/Storefront/checkout.html.twig
 *   Templates/Frontend/Storefront/checkout_confirmation.html.twig
 *   …/partials/cart_quick_add.html.twig
 *   …/partials/checkout_address_fields.html.twig
 *   …/partials/checkout_shipping_options.html.twig
 *   …/partials/legal_consent.html.twig
 *
 * ── WHY ONE FILE FOR FOUR PAGES ──────────────────────────────────────────────
 * They are not four designs, they are four views of ONE transaction, and the
 * complaint that opened this stage was precisely that they did not look like it:
 * the cart summary was a Bootstrap card, the checkout summary was a second
 * Bootstrap card with a different rhythm, and the three call-to-action buttons
 * ("In den Warenkorb", "Zur Kasse", "Zahlungspflichtig bestellen") had three
 * different sizes. Splitting them into three stylesheets would have re-created
 * exactly that drift, one file per page. The shared language therefore lives in
 * ONE layer (`--shop-purchase-*`) that all three read, and only the geometry that
 * is genuinely page-specific gets a page prefix.
 *
 * ── THE DEFECTS THIS FILE FIXES (all measured on the stage, 1440px) ──────────
 *   1. DETAIL: the product image had no cap. `col-lg-6` is 636px wide, the
 *      `.ratio-1x1` box therefore rendered 636 × 636 px while the whole buy box
 *      next to it was 400px tall — a 240px hole under the buy box on every
 *      product. The media box is now capped by a token (§2.1), the same answer
 *      the tile got in Etappe 1, so the two columns end at roughly one height.
 *   2. CART: the line was `image | name | stepper | (amount over remove)` inside
 *      a Bootstrap card whose Bootstrap columns re-computed per line, so nothing
 *      lined up vertically between neighbouring lines. The line is now ONE grid
 *      with FIXED control tracks (§3.1) — the stepper of line 3 sits under the
 *      stepper of line 1 whatever the product names do.
 *   3. CART: the B2B quick-add panel (order number / SKU rows / CSV / upload) was
 *      a full card of equal weight below a two-line cart, i.e. the loudest thing
 *      on the page. It is now a closed disclosure (§3.4) — one click away, not
 *      hidden, and still the same form underneath.
 *   4. CHECKOUT: five stacked Bootstrap cards with hard 1px frames. They became
 *      hairline-separated sections (§4.1); the ONE panel that keeps a surface is
 *      the summary, because that is the thing the buyer keeps looking back at.
 *   5. CONFIRMATION (Etappe 3): the page after "Zahlungspflichtig bestellen" was
 *      the ONE station still built from cards — five of them — so the buyer met a
 *      different look at the exact moment the purchase completes. It now reads
 *      Layer 1 like the other three (§5), and its summary states the rows in the
 *      order the checkout states them (see `confirmation_summary_tax`).
 *
 * ── WHAT MAY NEVER BE STYLED AWAY ────────────────────────────────────────────
 * The tax statement (PAngV §1), the base price (PAngV §4), the shipping-cost note
 * (PAngV §6), the terms consent and the withdrawal link are LEGAL STATEMENTS, not
 * decoration. Nothing in this file may clip, truncate, collapse or hide them:
 * there is no `text-overflow`, no `white-space: nowrap` and no `max-height` on any
 * of their selectors, and a mandatory line that runs long WRAPS. That is asserted
 * from the other side in tests/Unit/Storefront/ShopPurchaseFlowStyleContractTest.
 * The one `:empty` rule (§2.3) collapses the tax node when the server deliberately
 * stated NOTHING (an unresolvable VAT rate, #2755) — it hides an empty box, never
 * a sentence.
 *
 * ── LOAD ORDER (verified, not assumed) ───────────────────────────────────────
 * `PluginManagerCSSMerger::loadPluginFilesOrdered()` collects a plugin's `*.css`
 * and `sort()`s them BY FILENAME before concatenating (Core/Kernel/Plugin/
 * Functions/PluginManagerCSSMerger.php:114-127), so the seven shipped names
 * concatenate as:
 *   detail-gallery-lightbox.css → shop-tokens.css → shop-typography.css
 *                               → shop-ui-chrome.css
 *                               → shop-ui-error-page.css
 *                               → shop-ui-product-card.css
 *                               → shop-ui-purchase-flow.css
 * ("pr" < "pu"), i.e. this file lands last of all and may rely on the bridge, the
 * type scale, the chrome and the tile. Pinned by
 * tests/Unit/Storefront/ShopFrontendCssBundleTest.
 *
 * ── TOKENS ───────────────────────────────────────────────────────────────────
 * Every geometry, colour and size is a `--shop-*` custom property with a hard
 * `var()` fallback, per docs/planning/storefront-tokens.md §2/§4. #2371 ships a
 * CSS-only theme and TemplateFinder orders Plugin > Theme > Core — a theme CANNOT
 * override these templates, only their CSS, so nothing here may be reachable
 * through markup alone.
 *
 * Everything is scoped to `.shop-storefront` (set on the storefront wrapper in
 * base.html.twig); dark mode reuses the storefront's single mechanism, Bootstrap's
 * `data-bs-theme` attribute — the shared block in §7, plus the confirmation
 * layer's own one line in §5.9.
 */
 .shop-storefront{--shop-purchase-panel-bg:color-mix(
        in srgb,
        var(--shop-border, #dee2e6) 25%,
        var(--shop-surface, #ffffff)
    );--shop-purchase-panel-radius:var(--shop-radius, 0.375rem);--shop-purchase-panel-padding:var(--shop-space-lg, 1.5rem);--shop-purchase-panel-gap:var(--shop-space-md, 1rem);--shop-purchase-rule-color:color-mix(
        in srgb,
        var(--shop-border, #dee2e6) 70%,
        transparent
    );--shop-purchase-rule-width:1px;--shop-purchase-meta-size:var(--shop-font-size-sm, 0.875rem);--shop-purchase-meta-color:var(--shop-text-muted, #5f676e);--shop-purchase-cta-min-height:3rem;--shop-purchase-cta-size:var(--shop-font-size-md, 1rem);--shop-purchase-cta-weight:var(--shop-font-weight-semibold, 600);--shop-purchase-cta-gap:var(--shop-space-xs, 0.5rem);--shop-purchase-cta-padding-x:var(--shop-space-md, 1rem);--shop-purchase-total-size:var(--shop-font-size-xl, 1.375rem);--shop-purchase-total-weight:var(--shop-font-weight-bold, 700);--shop-purchase-option-bg:var(--shop-purchase-panel-bg);--shop-purchase-option-radius:var(--shop-radius, 0.375rem);--shop-purchase-option-padding:var(--shop-space-sm, 0.75rem);--shop-purchase-option-border:transparent;--shop-purchase-option-active-border:var(--shop-primary, #1a6fb5);--shop-purchase-option-active-bg:color-mix(
        in srgb,
        var(--shop-primary, #1a6fb5) 6%,
        var(--shop-surface, #ffffff)
    );--shop-purchase-transition:150ms ease}.shop-storefront .shop-purchase-page-title{margin-bottom:var(--shop-space-lg,1.5rem);font-size:var(--shop-font-size-2xl,1.75rem);line-height:var(--shop-line-height-tight,1.2);letter-spacing:var(--shop-letter-spacing-tight,-.011em);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-purchase-panel{display:flex;flex-direction:column;gap:var(--shop-purchase-panel-gap);padding:var(--shop-purchase-panel-padding);border-radius:var(--shop-purchase-panel-radius);background-color:var(--shop-purchase-panel-bg)}.shop-storefront .shop-purchase-cta{display:inline-flex;flex:1 1 auto;align-items:center;justify-content:center;gap:var(--shop-purchase-cta-gap);min-width:0;min-height:var(--shop-purchase-cta-min-height);padding-inline:var(--shop-purchase-cta-padding-x);font-size:var(--shop-purchase-cta-size);font-weight:var(--shop-purchase-cta-weight);line-height:var(--shop-line-height-snug,1.35)}.shop-storefront .shop-purchase-cta-secondary{--bs-btn-color:var(--shop-text-muted, #5f676e);--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--shop-text, #212529);--bs-btn-hover-bg:var(--shop-purchase-panel-bg);--bs-btn-hover-border-color:transparent;--bs-btn-active-bg:var(--shop-purchase-panel-bg);--bs-btn-active-border-color:transparent;font-weight:var(--shop-font-weight-medium,500)}.shop-storefront .shop-purchase-option{display:flex;align-items:center;justify-content:space-between;gap:var(--shop-space-sm,.75rem);padding:var(--shop-purchase-option-padding);border:var(--shop-purchase-rule-width) solid var(--shop-purchase-option-border);border-radius:var(--shop-purchase-option-radius);background-color:var(--shop-purchase-option-bg);cursor:pointer;transition:background-color var(--shop-purchase-transition),border-color var(--shop-purchase-transition)}.shop-storefront .shop-purchase-option:has(input:checked){border-color:var(--shop-purchase-option-active-border);background-color:var(--shop-purchase-option-active-bg)}.shop-storefront .shop-purchase-option:hover{border-color:var(--shop-purchase-option-active-border)}.shop-storefront .shop-purchase-option:has(input:focus-visible){outline:2px solid var(--shop-primary,#1a6fb5);outline-offset:2px}.shop-storefront .shop-purchase-option-body{display:flex;min-width:0;align-items:flex-start}.shop-storefront .shop-purchase-option-name{font-weight:var(--shop-font-weight-medium,500)}.shop-storefront .shop-purchase-option-note{display:block;font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-purchase-option-price{flex:0 0 auto;text-align:right;font-weight:var(--shop-font-weight-medium,500)}.shop-storefront{--shop-detail-media-ratio:1;--shop-detail-media-max:28rem;--shop-detail-media-fit:contain;--shop-detail-media-bg:color-mix(
        in srgb,
        var(--shop-border, #dee2e6) 35%,
        var(--shop-surface, #ffffff)
    );--shop-detail-media-radius:var(--shop-radius, 0.375rem);--shop-detail-title-size:var(--shop-font-size-2xl, 1.75rem);--shop-detail-price-size:var(--shop-font-size-3xl, 2.125rem);--shop-detail-price-weight:var(--shop-font-weight-bold, 700);--shop-detail-gap:var(--shop-space-lg, 1.5rem);--shop-detail-qty-width:8rem;--shop-detail-matrix-qty-width:4.5rem}.shop-storefront .shop-detail-media{display:flex;position:relative;align-items:center;justify-content:center;aspect-ratio:var(--shop-detail-media-ratio);max-width:var(--shop-detail-media-max);margin-bottom:var(--shop-space-sm,.75rem);margin-inline:auto;overflow:hidden;border-radius:var(--shop-detail-media-radius);background-color:var(--shop-detail-media-bg)}.shop-storefront .shop-detail-media-image{width:100%;height:100%;object-fit:var(--shop-detail-media-fit)}.shop-storefront .shop-detail-media-placeholder{color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-detail-thumbs{max-width:var(--shop-detail-media-max);margin-inline:auto}.shop-storefront .shop-detail-thumb{background-color:var(--shop-detail-media-bg)}@media (min-width:992px){.shop-storefront .shop-detail-media,.shop-storefront .shop-detail-thumbs{margin-inline-start:0}}.shop-storefront .shop-detail-buybox{display:flex;flex-direction:column;gap:var(--shop-detail-gap)}.shop-storefront .shop-detail-brand{font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-semibold,600);letter-spacing:var(--shop-letter-spacing-wide,.04em);text-transform:uppercase;color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-title{margin:0;font-size:var(--shop-detail-title-size);line-height:var(--shop-line-height-tight,1.2);letter-spacing:var(--shop-letter-spacing-tight,-.011em);font-weight:var(--shop-font-weight-semibold,600);overflow-wrap:anywhere}.shop-storefront .shop-detail-header{display:flex;flex-direction:column;gap:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-detail-rating{display:inline-flex;align-items:center;gap:var(--shop-space-xs,.5rem);align-self:flex-start;text-decoration:none;color:inherit}.shop-storefront .shop-detail-rating-count{font-size:var(--shop-purchase-meta-size);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-short{margin:0;color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-picker{display:flex;flex-direction:column;gap:var(--shop-space-sm,.75rem)}.shop-storefront .shop-detail-picker-label{margin-bottom:var(--shop-space-2xs,.25rem);font-size:var(--shop-purchase-meta-size);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-detail-matrix-qty{max-width:var(--shop-detail-matrix-qty-width)}.shop-storefront .shop-detail-purchase{gap:var(--shop-space-md,1rem)}.shop-storefront .shop-detail-price{display:flex;flex-direction:column;gap:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-detail-price-value{font-size:var(--shop-detail-price-size);line-height:var(--shop-line-height-tight,1.2);letter-spacing:var(--shop-letter-spacing-tight,-.011em);font-weight:var(--shop-detail-price-weight)}.shop-storefront .shop-detail-price-note{font-size:var(--shop-font-size-lg,1.125rem);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-legal{display:flex;flex-direction:column;gap:var(--shop-space-3xs,.125rem);font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-tax-hint:empty{display:none}.shop-storefront .shop-warranty-note{font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-warranty-note-link{color:inherit;text-decoration:underline}.shop-storefront .shop-detail-availability{display:flex;flex-direction:column;gap:var(--shop-space-2xs,.25rem);align-items:flex-start}.shop-storefront .shop-detail-delivery{font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-actions{display:flex;flex-wrap:wrap;gap:var(--shop-space-sm,.75rem);align-items:stretch}.shop-storefront .shop-detail-qty{flex:0 0 auto;width:var(--shop-detail-qty-width)}.shop-storefront .shop-detail-sku{font-size:var(--shop-purchase-meta-size);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-detail-section{margin-top:var(--shop-space-2xl,3rem)}.shop-storefront .shop-detail-section-title{margin-bottom:var(--shop-space-md,1rem);padding-bottom:var(--shop-space-xs,.5rem);border-bottom:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color);font-size:var(--shop-font-size-xl,1.375rem)}.shop-storefront .shop-detail-description{line-height:var(--shop-line-height-relaxed,1.75);max-width:68ch}.shop-storefront{--shop-cart-media-size:4.5rem;--shop-cart-qty-width:9.5rem;--shop-cart-amount-width:8rem;--shop-cart-line-gap:var(--shop-space-md, 1rem);--shop-cart-line-padding:var(--shop-space-md, 1rem);--shop-cart-media-bg:var(--shop-detail-media-bg)}.shop-storefront .shop-cart-lines{display:flex;flex-direction:column}.shop-storefront .shop-cart-section-title{margin-bottom:var(--shop-space-sm,.75rem);font-size:var(--shop-font-size-lg,1.125rem)}.shop-storefront .shop-cart-line{display:grid;grid-template-columns:var(--shop-cart-media-size) minmax(0,1fr) auto;grid-template-areas:"media info controls";align-items:center;gap:var(--shop-cart-line-gap);padding-block:var(--shop-cart-line-padding);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-cart-line:first-child{border-top:0;padding-top:0}.shop-storefront .shop-cart-line-media{grid-area:media;display:flex;align-items:center;justify-content:center;aspect-ratio:1;overflow:hidden;border-radius:var(--shop-radius,.375rem);background-color:var(--shop-cart-media-bg)}.shop-storefront .shop-cart-line-image{width:100%;height:100%;object-fit:cover}.shop-storefront .shop-cart-line-placeholder{color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-cart-line-info{grid-area:info;display:flex;min-width:0;flex-direction:column;gap:var(--shop-space-3xs,.125rem)}.shop-storefront .shop-cart-line-title{margin:0;font-size:var(--shop-font-size-md,1rem);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-medium,500);overflow-wrap:anywhere}.shop-storefront .shop-cart-line-title a{color:inherit;text-decoration:none}.shop-storefront .shop-cart-line-title a:hover{text-decoration:underline}.shop-storefront .shop-cart-line-meta{font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-cart-line-unit-price{font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35)}.shop-storefront .shop-cart-line-controls{grid-area:controls;display:flex;align-items:center;gap:var(--shop-cart-line-gap)}.shop-storefront .shop-cart-line-qty{flex:0 0 auto;width:var(--shop-cart-qty-width)}.shop-storefront .shop-cart-line-amount{flex:0 0 auto;display:flex;width:var(--shop-cart-amount-width);flex-direction:column;align-items:flex-end;gap:var(--shop-space-3xs,.125rem);text-align:right}.shop-storefront .shop-cart-line-total{font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-cart-line-remove{padding:0;border:0;background:none;font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-cart-line-remove:hover,.shop-storefront .shop-cart-line-remove:focus-visible{color:var(--shop-danger,#dc3545);text-decoration:underline}.shop-storefront .shop-cart-section-subtotal{padding-top:var(--shop-space-sm,.75rem);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color);font-size:var(--shop-purchase-meta-size);color:var(--shop-purchase-meta-color);text-align:right}.shop-storefront .shop-cart-clear{margin-top:var(--shop-space-md,1rem)}.shop-storefront .shop-cart-note{margin-top:var(--shop-space-md,1rem);max-width:42rem}.shop-storefront .shop-cart-line-note{margin-top:var(--shop-space-sm,.75rem);font-size:var(--shop-purchase-meta-size)}.shop-storefront .shop-cart-line-note .form-label{color:var(--shop-purchase-meta-color);margin-bottom:.25rem}@media (max-width:767.98px){.shop-storefront .shop-cart-line{grid-template-columns:var(--shop-cart-media-size) minmax(0,1fr);grid-template-areas:"media info" "controls controls";align-items:start}.shop-storefront .shop-cart-line-controls{justify-content:space-between}.shop-storefront .shop-cart-line-amount{width:auto}}.shop-storefront .shop-cart-summary-title,.shop-storefront .shop-checkout-summary-title{margin:0;font-size:var(--shop-font-size-lg,1.125rem)}.shop-storefront .shop-purchase-summary-list{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,40%);align-items:baseline;row-gap:var(--shop-space-2xs,.25rem);column-gap:0;margin:0}.shop-storefront .shop-purchase-summary-list dt{font-size:var(--shop-purchase-meta-size);font-weight:var(--shop-font-weight-normal,400)}.shop-storefront .shop-purchase-summary-list dd{margin:0;padding-left:var(--shop-space-md,1rem);text-align:right;font-variant-numeric:tabular-nums}.shop-storefront .shop-purchase-summary-list .shop-purchase-summary-total-term,.shop-storefront .shop-purchase-summary-list .shop-purchase-summary-total-value{padding-top:var(--shop-space-sm,.75rem);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color);font-size:var(--shop-purchase-total-size);line-height:var(--shop-line-height-tight,1.2);font-weight:var(--shop-purchase-total-weight)}.shop-storefront .shop-purchase-summary-note{font-size:var(--shop-purchase-meta-size);color:var(--shop-purchase-meta-color);text-wrap:balance}.shop-storefront .shop-cart-actions,.shop-storefront .shop-checkout-actions{display:grid;gap:var(--shop-space-xs,.5rem)}.shop-storefront .shop-cart-empty{padding-block:var(--shop-space-2xl,3rem);text-align:center}.shop-storefront .shop-cart-empty-icon{display:block;margin-bottom:var(--shop-space-md,1rem);color:var(--shop-text-muted,#5f676e)}.shop-storefront .shop-cart-quickadd{margin-top:var(--shop-space-xl,2rem);border-radius:var(--shop-purchase-panel-radius);background-color:var(--shop-purchase-panel-bg)}.shop-storefront .shop-cart-quickadd-summary{display:flex;align-items:center;justify-content:space-between;gap:var(--shop-space-sm,.75rem);padding:var(--shop-space-md,1rem) var(--shop-purchase-panel-padding);cursor:pointer;list-style:none}.shop-storefront .shop-cart-quickadd-summary::-webkit-details-marker{display:none}.shop-storefront .shop-cart-quickadd-summary:focus-visible{outline:2px solid var(--shop-primary,#1a6fb5);outline-offset:-2px;border-radius:var(--shop-purchase-panel-radius)}.shop-storefront .shop-cart-quickadd-title{margin:0;font-size:var(--shop-font-size-md,1rem);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-cart-quickadd-chevron{flex:0 0 auto;width:.5rem;height:.5rem;border-right:2px solid currentcolor;border-bottom:2px solid currentcolor;transform:rotate(45deg);transform-origin:center;transition:transform var(--shop-purchase-transition);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-cart-quickadd[open] .shop-cart-quickadd-chevron{transform:rotate(-135deg)}.shop-storefront .shop-cart-quickadd-body{padding:0 var(--shop-purchase-panel-padding) var(--shop-purchase-panel-padding)}.shop-storefront{--shop-checkout-section-gap:var(--shop-space-xl, 2rem);--shop-checkout-field-gap:var(--shop-space-md, 1rem)}.shop-storefront .shop-checkout-form-column{display:flex;flex-direction:column;gap:var(--shop-checkout-section-gap)}.shop-storefront .shop-checkout-section{display:flex;flex-direction:column;gap:var(--shop-checkout-field-gap);padding-top:var(--shop-checkout-section-gap);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-checkout-section:first-child{padding-top:0;border-top:0}.shop-storefront .shop-checkout-section-title{margin:0;font-size:var(--shop-font-size-xl,1.375rem)}.shop-storefront .shop-checkout-subsection-title{margin:0;font-size:var(--shop-font-size-md,1rem);font-weight:var(--shop-font-weight-semibold,600)}.shop-storefront .shop-checkout-field-hint{font-size:var(--shop-purchase-meta-size);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-checkout-address .form-label,.shop-storefront .shop-checkout-field-label{margin-bottom:var(--shop-space-2xs,.25rem);font-size:var(--shop-purchase-meta-size);font-weight:var(--shop-font-weight-medium,500)}.shop-storefront .shop-checkout-review{display:flex;flex-direction:column;gap:var(--shop-space-2xs,.25rem);margin:0;padding:0;list-style:none;font-size:var(--shop-purchase-meta-size)}.shop-storefront .shop-checkout-review-line{display:flex;align-items:baseline;justify-content:space-between;gap:var(--shop-space-sm,.75rem)}.shop-storefront .shop-checkout-review-amount{flex:0 0 auto;font-variant-numeric:tabular-nums}.shop-storefront .shop-checkout-review-variant{color:var(--shop-purchase-meta-color)}.shop-storefront .shop-checkout-consent{padding-top:var(--shop-space-md,1rem);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-checkout-consent-terms .form-check-label,.shop-storefront .shop-checkout-consent-note{color:var(--shop-text,#212529)}.shop-storefront .shop-checkout-consent-note{margin-top:var(--shop-space-2xs,.25rem)}.shop-storefront{--shop-confirmation-icon-color:var(--shop-success, #198754)}.shop-storefront .shop-confirmation-header{display:flex;flex-direction:column;align-items:center;gap:var(--shop-space-2xs,.25rem);padding-block:var(--shop-space-xl,2rem);text-align:center}.shop-storefront .shop-confirmation-icon{margin-bottom:var(--shop-space-xs,.5rem);color:var(--shop-confirmation-icon-color)}.shop-storefront .shop-confirmation-header .shop-purchase-page-title{margin-bottom:0}.shop-storefront .shop-confirmation-lead{margin:0;font-size:var(--shop-font-size-lg,1.125rem);line-height:var(--shop-line-height-snug,1.35)}.shop-storefront .shop-confirmation-order-number{font-weight:var(--shop-font-weight-semibold,600);overflow-wrap:anywhere}.shop-storefront .shop-confirmation-order+.shop-confirmation-order{margin-top:var(--shop-checkout-section-gap,2rem);padding-top:var(--shop-checkout-section-gap,2rem);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-confirmation-order-header{display:flex;flex-wrap:wrap;align-items:center;gap:var(--shop-space-xs,.5rem);margin-bottom:var(--shop-space-md,1rem)}.shop-storefront .shop-confirmation-detail-column{display:flex;flex-direction:column;gap:var(--shop-checkout-section-gap,2rem)}.shop-storefront .shop-confirmation-section{display:flex;flex-direction:column;gap:var(--shop-checkout-field-gap,1rem);padding-top:var(--shop-checkout-section-gap,2rem);border-top:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-confirmation-section:first-child{padding-top:0;border-top:0}.shop-storefront .shop-confirmation-section-title{margin:0;font-size:var(--shop-font-size-xl,1.375rem)}.shop-storefront .shop-confirmation-table{--bs-table-border-color:var(--shop-purchase-rule-color);margin-bottom:0}.shop-storefront .shop-confirmation-table thead th{font-size:var(--shop-purchase-meta-size);font-weight:var(--shop-font-weight-medium,500);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-confirmation-table tr>:first-child{padding-left:0}.shop-storefront .shop-confirmation-table tr>:last-child{padding-right:0}.shop-storefront .shop-confirmation-line-name{font-weight:var(--shop-font-weight-medium,500);overflow-wrap:anywhere}.shop-storefront .shop-confirmation-line-meta{display:block;font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-confirmation-line-amount{font-variant-numeric:tabular-nums}.shop-storefront .shop-confirmation-addresses{display:grid;grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));gap:var(--shop-space-md,1rem) var(--shop-space-lg,1.5rem)}.shop-storefront .shop-confirmation-address{display:flex;flex-direction:column;gap:var(--shop-space-2xs,.25rem)}.shop-storefront .shop-confirmation-address-title{margin:0;font-size:var(--shop-purchase-meta-size);line-height:var(--shop-line-height-snug,1.35);font-weight:var(--shop-font-weight-semibold,600);color:var(--shop-purchase-meta-color)}.shop-storefront .shop-confirmation-address address{margin:0;line-height:var(--shop-line-height-snug,1.35);overflow-wrap:anywhere}.shop-storefront .shop-confirmation-summary-title{margin:0;font-size:var(--shop-font-size-lg,1.125rem)}.shop-storefront .shop-confirmation-methods{grid-template-columns:auto minmax(0,1fr);padding-bottom:var(--shop-space-sm,.75rem);border-bottom:var(--shop-purchase-rule-width) solid var(--shop-purchase-rule-color)}.shop-storefront .shop-confirmation-method-note{display:block}.shop-storefront .shop-confirmation-grand-total .shop-purchase-summary-total-term,.shop-storefront .shop-confirmation-grand-total .shop-purchase-summary-total-value{padding-top:0;border-top:0}.shop-storefront .shop-confirmation-grand-total-row{margin-top:0}.shop-storefront .shop-confirmation-register{flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-top:var(--shop-checkout-section-gap,2rem)}.shop-storefront .shop-confirmation-register-copy{flex:1 1 18rem;min-width:0}.shop-storefront .shop-confirmation-register-title{margin:0 0 var(--shop-space-3xs,.125rem);font-size:var(--shop-font-size-lg,1.125rem)}.shop-storefront .shop-confirmation-register-text{margin:0;color:var(--shop-purchase-meta-color)}.shop-storefront .shop-confirmation-register-email{font-weight:var(--shop-font-weight-semibold,600);overflow-wrap:anywhere}.shop-storefront .shop-confirmation-register .shop-purchase-cta{flex:0 0 auto}.shop-storefront .shop-confirmation-actions{display:flex;justify-content:center;margin-top:var(--shop-checkout-section-gap,2rem)}.shop-storefront .shop-confirmation-actions .shop-purchase-cta{flex:0 1 auto}[data-bs-theme=dark] .shop-storefront,.shop-storefront[data-bs-theme=dark]{--shop-confirmation-icon-color:#3fb950}@media (prefers-reduced-motion:reduce){.shop-storefront .shop-purchase-option,.shop-storefront .shop-cart-quickadd-chevron{transition:none}}[data-bs-theme=dark] .shop-storefront,.shop-storefront[data-bs-theme=dark]{--shop-purchase-panel-bg:color-mix(
        in srgb,
        var(--shop-border, #30363d) 45%,
        var(--shop-surface, #161b22)
    );--shop-purchase-rule-color:color-mix(
        in srgb,
        var(--shop-border, #30363d) 85%,
        transparent
    );--shop-purchase-option-active-bg:color-mix(
        in srgb,
        var(--shop-primary, #1a6fb5) 18%,
        var(--shop-surface, #161b22)
    );--shop-detail-media-bg:color-mix(
        in srgb,
        var(--shop-border, #30363d) 60%,
        var(--shop-surface, #161b22)
    )}