        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        html {
            -webkit-text-size-adjust: 100%;
            -webkit-tap-highlight-color: transparent;
            /* THE ROOT CANVAS IS PAINTED, NOT JUST <body>. With viewport-fit=cover the safe-area
               region and any overscroll expose the html canvas — unpainted, that is a white bar
               under the notch on exactly the devices the fullscreen meta set is for. */
            background: var(--bg-void);
            min-height: 100%;
            /* ★ THE VIEWPORT LOCK, AND IT HAS TO BE ON html — the body rule below is NOT enough.
               MEASURED at 390px: with `overscroll-behavior: none` declared only on <body>, the
               computed value on <html> read `auto` on this page and on shop, against `none` in
               app/system/css/reset.css. So the ROOT still chained — the pull-to-refresh / rubber
               band the body rule was written to stop was never actually stopped here, and the
               comment below claiming "the lock belongs here directly" was describing an intent
               the cascade did not carry out. Declared on both boxes, the value is not left to a
               propagation rule to decide. (operator 2026-08-12: index/ and shop/ need the same
               scroll lock system/ has.) */
            overscroll-behavior: none;
        }

        body {
            font-family: 'Rajdhani', sans-serif;
            background: var(--bg-void);
            color: var(--text-primary);
            overflow-x: hidden;
            line-height: 1.5;
            touch-action: manipulation;
            /* THE DOCUMENT RUBBER-BAND (same fix as app/system/css/shell.css): body IS the real
               scroller on this page — index/shop carry no separate .view-container the way the
               cockpit does, so the lock belongs here directly rather than on a nested box. */
            overscroll-behavior: none;
        }
