        /* ══════════════════════════════════════════════════════════════
           THE DIAGNOSTICS PANEL — the overlay initUIDiagnostics() builds
           (public/18-diagnostics.js:172), opened on a hash rather than from any door in the app.
           A tool for whoever is measuring the thing, not a room a traveller can reach.

           Renamed from 22-diagnostics.css on 2026-09-22. By then it dressed no gallery: the
           album went to 17x-gallery.css in September, and on this day the favourite toggle went
           to 05-interaction.css (it is shared — the album wears it as .mg2-fav and the viewer as
           .fs-fav, and its base was loading at #49, after both), the invalid-field underline went
           to 17q-editor.css with the rest of .jw-*, and the photo pin was deleted outright.

           Nothing else in the app names .admin-*, so where this loads does not matter and the
           number is kept only so nothing shifts under it. Zero outgoing-world tokens.
           ══════════════════════════════════════════════════════════════ */
        /* THE CALENDAR SECTION moved to css/17o-calendar.css on 2026-09-11 — the room, the
           key and the three marks. The GRID is not there either: `.pcal-*` is one component
           drawn in two rooms and lives in css/17n-journal-list.css, which is where a second
           copy of it would have started. */

        /* THE THREE MARKS went with the room. They were three colours out of the outgoing
           world's category set with a comment in each telling the next person to keep them
           in step with CALENDAR_MARK_COLOURS in JS — four copies of one value. They are the
           one ink at three pressures now, each with a shape of its own, declared once. */

        /* `.trip-cal-section .itin2-cover` and `.trip-cal-section .itin2-notes` stood here,
           re-basing two margins for a cover and a notes block this section had stopped
           rendering — renderTripCalendar's own comment says so ("No cover here any more").
           Neither class is emitted anywhere in public/. Removed 2026-09-11. */

        /* The entry card's opening line, its linked strip and its photograph count moved
           to css/17n-journal-list.css on 2026-09-11 — the strip is gone rather than moved.
           This file's own note had already worked out half of it: the day page hid the
           strip because the activity it named was listed a few lines above. On the list the
           same objection holds for a different reason — the card is itself a link. */

        /* `.tday-lightbox` — the plain overlay a photograph with no media row opens in —
           moved to css/17p-day.css with the rest of the day page, 2026-09-11. */

        /* ===== Maintenance panel (#admin) =====
           Deliberately plain and un-branded: this is a tool, not part of the product, and
           it should never be mistaken for a screen a user is meant to find. */
        .admin-panel {
            position: fixed;
            inset: 0;
            z-index: 99998;
            display: flex;
            flex-direction: column;
            background: #1B1B1B;
            color: #E8E8E3;
            font: 12px/1.5 ui-monospace, Menlo, monospace;
            padding-top: env(safe-area-inset-top, 0px);
            padding-bottom: env(safe-area-inset-bottom, 0px);
        }

        .admin-head {
            flex: none;
            display: flex;
            align-items: center;
            justify-content: space-between;
            padding: 8px 12px;
            border-bottom: 1px solid #3A3A3A;
            letter-spacing: 2px;
            text-transform: uppercase;
        }

        .admin-close {
            border: none;
            background: transparent;
            color: #E8E8E3;
            font-size: 21px;
            line-height: 1;
            cursor: pointer;
        }

        .admin-body {
            flex: 1;
            min-height: 0;
            overflow-y: auto;
            padding: 12px;
        }

        .admin-job {
            border: 1px solid #3A3A3A;
            padding: 8px;
            margin-bottom: 12px;
        }

        .admin-job-name { color: #E0B45C; margin-bottom: 4px; }
        .admin-job-desc { color: #9A9A94; margin-bottom: 12px; }

        .admin-actions { display: flex; gap: 8px; }

        .admin-actions button {
            flex: 1;
            padding: 8px;
            border: 1px solid #6A6A64;
            background: transparent;
            color: #E8E8E3;
            font: inherit;
            letter-spacing: 1px;
            text-transform: uppercase;
            cursor: pointer;
        }

        /* The write button is disabled until a dry run has found something. A destructive
           action should not be reachable before the report that justifies it. */
        .admin-actions button:disabled {
            border-color: #3A3A3A;
            color: #5A5A55;
            cursor: default;
        }

        .admin-out {
            margin: 0;
            padding: 8px;
            border: 1px solid #3A3A3A;
            background: #111;
            color: #C8C8C2;
            white-space: pre-wrap;
            word-break: break-word;
            font: inherit;
        }

        .admin-input {
            width: 100%;
            margin-top: 8px;
            padding: 8px;
            border: 1px solid #3A3A3A;
            background: #111;
            color: #E8E8E3;
            font: inherit;
        }

        .admin-input::placeholder { color: #6A6A64; }

        /* The photo place card moved to css/17zd-leftovers.css, in the deck log, 2026-09-14. */

        /* .photo-pin, .photo-pin img and .photo-pin::after REMOVED 2026-09-22 — nothing wears
           that class. The map’s photograph pins are built by definePhotoPinOverlay()
           (03-map-plan.js:1947) and the element it creates is `<div class="tm-pin">`. The only
           occurrence of the words "photo-pin" anywhere in public/ is the comment at
           03-map-plan.js:8 that names the holder variable — which is why a grep makes this look
           live and reading the code does not. */


