        /* ── carried from css/20-legacy-calendar.css on 2026-09-22, as that part was deleted. Its
           last paragraph describes the line-height guards that came here with it. ── */
        /* THE PHOTO CALENDAR, the journal's drafts bar, the entry cards' linked strip and
           the journal sheet's own geometry all moved to css/17n-journal-list.css on
           2026-09-11, when the room was migrated into the deck log.

           ⚠️ THE CALENDAR WAS DRESSED TWICE IN THIS FILE — once at the top and again under
           "Calendar: final proportions" two hundred lines below, the second set overriding
           the first's cell size, number size, head padding and every margin. The drafts bar
           was declared twice here as well, and a third time in 19-legacy-media.css. That is
           what a room looks like after it has been adjusted from wherever was convenient.
           All of it went; there is one set now, in one file.

           What stays below is structural and belongs to all five of this sheet's rooms:
           the line-height guards that stop a stray whitespace text node from forming a
           visible strip of background. */

        /* ===== Plan / Record / Edit Trip modal — 13a paper look (scoped, keeps all
           existing field wiring; covers new-trip, past-trip and edit-trip modes) ===== */

/* `.plan-fab` WENT WITH THE BUTTON IT DRESSED (2026-09-11). #tripSheetFab was its
           only remaining markup — a 48px block floating over the journal's bottom-right
           corner with a + drawn in it — and the owner asked for this world's add row
           instead. Three files carried rules for it (here, 24-tail.css twice, and a
           position override below); all four are gone. */

        /* The trip menu's rules were here: a cream drawer, a serif title over old-style figures with short vertical
           ticks between them, nine glyph tiles, and a boxed SHARE with its glyph. REMOVED on 2026-09-14, not overridden:
           the drawer is in the deck log (css/17zc-trip-menu.css). */

        /* Bottom sheet for trip sections (Expenses / Media / Diary / Ask AI) */
        .trip-section-sheet-backdrop {
            position: fixed;
            inset: 0;
            background: rgba(22, 25, 26, 0.42);   /* the oilskin, not the outgoing #242424 (2026-09-17) */
            opacity: 0;
            pointer-events: none;
            transition: opacity 0.3s;
            z-index: 44;
        }

        .trip-section-sheet-backdrop.open {
            opacity: 1;
            pointer-events: auto;
        }

        .trip-section-sheet.view-only input:disabled,
        .trip-section-sheet.view-only textarea:disabled { opacity: 0.7; background: var(--log-stock-band); }
        .trip-section-sheet.view-only button:disabled { opacity: 0.4; cursor: default; }

        .trip-section-sheet {
            position: fixed;
            left: 0;
            right: 0;
            bottom: 0;
            height: 80vh;
            height: 80dvh;
            /* The paper, for the same reason .page is: this is 80vh of sheet, not a heading. */
            background: var(--log-stock);
            border-radius: 0;
            z-index: 45;
            transform: translateY(100%);
            /* visibility guard: even if positioning ever degrades (e.g. transformed ancestor),
               a closed sheet can never be scrolled into view */
            visibility: hidden;
            transition: transform 0.3s ease, visibility 0s linear 0.3s;
            display: flex;
            flex-direction: column;
            /* 批次 07：悬浮（底部抽屉）阴影删除，补 1px 实线边框接替。底色已是不透明 --bg-secondary。
               The edge in the deck log's firm rule, as the trip menu's is; it was --border, #C8C4BC, the outgoing
               warm grey, on every section sheet and the stop sheet (2026-09-17, what the outgoing world still painted (capture --legacy)). */
            border: 1px solid var(--log-rule-firm);
        }

        .trip-section-sheet.open {
            visibility: visible;
            transition: transform 0.3s ease;
            transform: translateY(0);
        }

        .trip-section-sheet-header {
            display: flex;
            align-items: center;
            justify-content: space-between;
            padding: 16px 1.25rem 12px;
            border-bottom: 1px solid var(--log-rule);
            flex-shrink: 0;
        }

        .trip-section-sheet-title {
            font-family: var(--log-write);
            font-size: 19px;
            color: var(--log-ink);
        }

        .trip-section-sheet-actions {
            display: flex;
            align-items: center;
            gap: var(--sp-xs);
        }

        .trip-section-sheet-btn {
            /* 尺寸/底色/描边由「关闭按钮 · 全库一条」统一（原 34px + 白底 + 1px 框）。
               白底是全库 61 处裸 white 之一，这里顺手消掉。
               这个类同时也是页眉的「+」按钮，所以颜色保留 --primary。 */
            color: var(--log-ink);
            line-height: 1;
            display: flex;
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }

        .trip-section-sheet-body {
            flex: 1;
            overflow-y: auto;
            padding: 0.5rem 0 1.5rem;
            overscroll-behavior: contain;
        }

        /* The expense detail's dressing was here — a page the colour of the old sheet with a
           382px column. REMOVED on 2026-09-13, not overridden: one expense is printed as a
           receipt on the activity ticket's own chassis now (act-page + bp-fullbleed) and the
           .exp-page class is no longer applied. This file loads before the ticket's and would
           win anything the ticket does not name. */

        /* Itinerary sheet: no header, cover bleeds to the top, close button on the
           cover's top-right, and a timeline-style + FAB bottom-right of the sheet. */
        /* The .itin-sheet rules were here: they hid the sheet header so the Itinerary
           section's full-bleed cover could supply its own close button. The Calendar
           redesign removed that cover, and these rules then hid the only way out of the
           screen. The class is no longer applied; the rules go with it. */

        /* Media gallery (17a): paper masonry, date groups, rounded tiles, video badge */
        /* Column layout, so the toolbar and the bottom bar stay put while the grid
           scrolls between them. The sheet body's own scrolling is handed over to
           .mg2-scroll for this view. */

        /* The sheet body must not scroll as well, or there are two scrollbars and the
           bottom bar drifts with the wrong one. */
        /* Full height, same as the journal. A grid with a toolbar above it and an action
           bar below it needs the room; at 80dvh the bars eat most of what is left. */
        .trip-section-sheet.is-gallery {
            height: 100dvh;
            border-radius: 0;
            box-shadow: none;
        }

        #tripSectionSheet.is-gallery .trip-section-sheet-body {
            /* The positioning context the wrap pins itself to. */
            position: relative;
            overflow: hidden;
            padding: 0;
        }

        /* #sectionContent is a plain div moved in here by JS. It only has to not get in
           the way — the wrap inside it positions against the body above. */
        #tripSectionSheet.is-gallery #sectionContent { position: static; }

        /* Grid, not multi-column. CSS columns fill the first column top to bottom before
           starting the second — so photos that sort next to each other all stacked down the
           left side, and a whole activity's pictures ended up in one column while the other
           held the next activity's.
           
           Grid places items in reading order: left, right, left, right. */
        /* .mg2-vbare, a video with no still yet, moved to css/17zd-leftovers.css, 2026-09-14. */

        @media (prefers-reduced-motion: reduce) {
        }

        @media (prefers-reduced-motion: reduce) {
        }

        /* Lock the page behind while a bottom sheet is open.
           On mobile the document (body) scrolls; on desktop the scroller is .app-frame,
           so both need locking. */
        body.sheet-open {
            overflow: hidden;
            height: 100vh;
        }

        body.sheet-open .app-frame {
            overflow-y: hidden;
        }

        /* The Files room's rules were here: an underlined search with a magnifier, a band of two
           columns with the category's name pinned in a rail, a glyph per category, and the open list
           drawn as a box on a second ground. REMOVED on 2026-09-14, not overridden: the room is in
           the deck log (css/17z-files.css) and draws none of these classes. */

        /* Typing indicator */

        /* @keyframes typing REMOVED 2026-09-22 — nothing animates it. The only other occurrences
           of the word anywhere are three comments about fields that take typing. Same shape as
           @keyframes pulse, deleted out of 10-legacy-home-sheet.css on 2026-09-21: a keyframe is
           global, so an unused one is invisible to every check that asks whether a SELECTOR is
           worn. Grep the at-rules; the rule-walkers do not count them. */

        /* .add-day-btn rules were here. The button is gone: days are created by saving
           an activity with a date past the end of the trip, so an explicit "add a day"
           only ever produced empty days that had to be deleted again. */

        /* ══════════════════════════════════════════════════════════════
           MOVED OUT OF css/20-legacy-calendar.css · 2026-09-21  (appended)
           4 rules. DESIGN.md: a surface's rules go in that surface's part, and the
           legacy parts only shrink.
           ⚠️ 20-legacy-calendar.css loaded AFTER this file. Placing them
           at the foot keeps their order against THIS PART’S OWN rules — and nothing else.
           Against the parts BETWEEN #5 and #46 the order is reversed by this move, and
           whether that matters was a separate question somebody had to answer. See DESIGN.md.
           ══════════════════════════════════════════════════════════════ */
        /* The 16px above the calendar was a whitespace text node — the newline and indent
           between <div id="tripSectionSheetBody"> and its first child. A stray text node in
           a block container still forms a line box, and a line box is one line tall.
           
           The whitespace is now gone from the markup as well; this is the guard for when a
           future edit reformats that line and puts it back. line-height rather than
           font-size, because font-size: 0 would break any child sized in em. */
        .trip-section-sheet-body { line-height: 0; }

        .trip-section-sheet-body > * { line-height: normal; }

        /* Same guard one level down. #sectionContent is written by four different
           functions, each with its own template — chasing the indentation out of every one
           of them is a losing game, because the next edit puts it back.
           
           Collapsing the line box on the container is structural: whatever whitespace ends
           up there, it takes no height. Children restore normal leading immediately. */
        #sectionContent,
        #journalContent { line-height: 0; }


        #sectionContent > *,
        #journalContent > * { line-height: normal; }
