
        /* ══════════════════════════════════════════════════════════════
           MOVED OUT OF css/18-overlays.css · 2026-09-21  (prepended)
           4 rules. DESIGN.md: a surface's rules go in that surface's part, and the
           legacy parts only shrink.
           ⚠️ 18-overlays.css loaded BEFORE this file. Placing them
           at the head keeps their order against THIS PART’S OWN rules — and nothing else.
           Against the parts BETWEEN #51 and #46 the order is reversed by this move, and
           whether that matters was a separate question somebody had to answer. See DESIGN.md.
           ══════════════════════════════════════════════════════════════ */

        /* ===== Figures =====
           Oldstyle everywhere the display face is used. Declared once here rather than on
           each of the 43 rules, and inherited, so a new heading picks it up for free. */
        .modal-title,
        .stay-ticket-name,
        .trip-section-sheet-title,
        .country-name,
        .confirm-title {
            font-variant-numeric: oldstyle-nums;
            font-feature-settings: "onum" 1;
        }

        /* Money is the exception. Oldstyle figures ripple, which is lovely in a heading and
           actively unhelpful in a column of amounts you want to compare down the page.
           tabular-nums also gives every digit the same width, so decimal points line up. */
        .amount-input {
            font-variant-numeric: lining-nums tabular-nums;
            font-feature-settings: "lnum" 1, "tnum" 1;
        }

        /* 去掉 #expenseModal 限定：货币下拉会被 openModal() portal 到 <body> 外面，
           带 id 的选择器在那之后就匹配不到了，图标回落到 .category-icon-display svg 的 20px。
           原来靠 !important 压住，删掉 !important 才暴露出来 —— 真正的问题是选择器
           依赖了一个运行时会改变的 DOM 位置。 */
        .currency-dropdown .currency-option svg,
        .currency-option svg {
            width: 15px;
            height: 15px;
            margin-right: 12px;
            flex: none;
        }

        /* ══════════════════════════════════════════════════════════════
           以下放在样式表末尾，是为了赢过前面八处旧的尺寸声明
           （.sights-expand-close 30 / .ntrip-hero-close 28 / .itin2-cover-close 32 /
            .diary-detail-close 30 / .modal-close 32 /
            .jw-close 32 / .jw-drawer-close 28）。
           逐个去中和要改八处；靠层叠顺序只改一处。
           ══════════════════════════════════════════════════════════════ */
        /* ══════════════════════════════════════════════════════════════
           关闭按钮 · 全库一条
           收敛前有十四种：可见尺寸 28 / 30 / 32 / 34px 四种，X 字形
           15 / 16 / 20 / 22 / 24 / 32px 六种，底色 transparent / white /
           --bg-secondary / --surface-field / #E7E2D8 五种。

           收成：44×44 可见、X 20px、无填充无描边、颜色继承上下文。
           44 是可见尺寸而不是靠 ::after 撑的命中区 —— 关闭按钮是全库最常按的
           控件，让它真的有 44 见方，那条命中区伪元素在这里就不必要了。
           ══════════════════════════════════════════════════════════════ */
        /* ⚠️ `#expenseModal .modal-close` LEFT THIS LIST 2026-09-21 — the name, not the
           block, as the 44px floor's own list was once emptied by mistake. The receipt of
           2026-09-13 has no .modal-close; the other four names are live. */
        .modal-close,
        .trip-section-sheet-btn,
        .jw-close,
        .jw-drawer-close {
            width: 44px;
            height: 44px;
            min-width: 44px;
            padding: 0;
            border: none;
            border-radius: 0;
            background: transparent;
            color: var(--log-ink);
            font-size: 20px;
            line-height: 1;
            display: flex;
            align-items: center;
            justify-content: center;
            flex-shrink: 0;
            cursor: pointer;
        }
        .modal-close svg,
        .trip-section-sheet-btn svg,
        .jw-close svg,
        .jw-drawer-close svg {
            width: 20px;
            height: 20px;
            stroke: currentColor;
            stroke-width: 1.5;
            fill: none;
        }
        /* `#sightsNotesExpandModal .modal-close` stood here and was REMOVED 2026-09-21.
           That sheet's markup (34-markup-activity.js) is a band with .af-expand-title and a
           .af-word-act reading Done — it has never had a .modal-close. The rule set the
           outgoing world's on-dark ink on nothing. */

        /* The rule that used to sit here forced the two square actions to
           --text-primary (#242424) so as to beat the Cereal block at 9640. Being last in
           the file it also beat the deck log's own block at 11237 — so the photo-wall and
           friends squares drew near-black while The Register beside them drew in the
           violet ink: three controls in one row wearing two worlds. The #B block is
           itself later than 9640, so it wins that argument without help. Deleted rather
           than overridden — an override here would be a fourth rule on one selector. */

        /* ══════════════════════════════════════════════════════════════
           底部导航占位 · 放在末尾，靠层叠赢过前面的同名规则
           ══════════════════════════════════════════════════════════════ */

        /* ① 有导航的页面要给它让出 52px，否则最后一行（Me 页那对按钮、
           列表最后一条）被压在导航底下点不到。
           只给这几页加 —— 其余页面没有导航，加了就是白白多一截空白。 */
        /* Notifications left this list on 2026-09-07, when it stopped carrying the bar:
           with no bar there is nothing to reserve room for, and the ground patch below
           was painting it the outgoing world's cream. Its own part sets its stock. */
        #mainPage,
        #savedPage,
        #profilePage {
            /* 「内容离导航多远」只在这里裁定一次：导航高 + 一档间距（24px）。
               上一版让页面只让开导航、把呼吸留白交给内层 —— 那正是不统一的根源：
               profile-content 给 32、卡片给 20、AI 输入区给 20，三屏三种。
               所以内层那几处下留白在下面一并清零，由这条统管。 */
            padding-bottom: calc(var(--nav-h) + var(--sp-lg));
        }
        /* The ground is Home's alone. 首页的封面是 sticky 的夜色图版，铺在页面底下；
           面板比图版短的时候，滚到底会从面板下沿露出一条夜色 —— 给页面自己一层纸
           色把它堵上。No other page has a plate under it, so no other page needs this.

           It was in the rule above, in the outgoing world's cream, and then corrected to
           the stock here — which meant the shared declaration painted nothing anyone ever
           saw: Home overrode it two lines later, and Saved and the Profile set their own
           stock on `#id.active`, which outranks a bare id whenever they are the page being
           shown. What it did do was read as though those two pages were cream, and on
           2026-09-07 it fooled a reader into measuring them while hidden and reporting a
           defect that was not there. Removed rather than corrected: a declaration that can
           only be observed by inspecting a page nobody can see is a trap, not a rule.

           It stays a bare id and stays here, after that rule: Home's own block is eight
           thousand lines earlier in the file, and this has to win. */
        #mainPage {
            background: var(--log-stock);
        }
        /* 面板至少铺到视口底：内容再少也不该让底下那层露脸。 */
        #mainPage .home-sheet {
            min-height: 100vh;
        }

        /* 窄屏（375）：五个词按 11px 内边距排下来只剩 1.8px 间隙，挤成一坨。
           收内边距而不是缩字号 —— 字号是这一档标签的身份，间距是可让的那个。
           命中宽仍靠 min-width: 44px 保底。 */
        @media (max-width: 400px) {
            .bottom-nav { padding: 0 4px; }
            .bottom-nav-item { padding: 0 6px; }
        }

        /* 内层的下留白清零 —— 它们各给各的，正是三屏间距不一致的来源。
           清零之后所有屏都由页面那条统一给出 24px。 */
        #mainPage #tripsList > *:last-child { margin-bottom: 0; }

        /* ══════════════════════════════════════════════════════════════
           行程日历 · 把格线补齐
           格线是网格的**背景**从 1px 缝里透出来的，格子自己不画边。
           但只要有任何一格给自己填了不透明底色又恰好压到缝上，那一段线就断。
           这里统一把三种格子的底色钉死成纸色，并给整块补一圈外框 ——
           日历是一张表，表要有闭合的边。 */
        /* 这两条(`.pcal-grid` 的外框、三种 mk 格子钉死纸色底)搬进了
           css/17n-journal-list.css —— 连同上面那段论证:日历是一张表,表要有闭合的
           边,而任何一格给自己填了不透明底色又压到缝上,那一段线就断。2026-09-11。 */

        /* `.tcal-day .tcal-row { margin-left: -1px }` 存在的理由是日历网格有一圈外框，
           行的色条紧贴在它内侧、读起来像"色条外面还有一道边"。那圈外框已经没有了
           ——17n 的网格用 1px padding 露出底色做边——所以这条补偿也一起删掉。
           2026-09-11。 */

        /* 「Open day · Journal 段」那一整批(标题字号、正文行数、地点色、More、标签)
           和空态那颗按钮,随日页搬到了 css/17p-day.css,2026-09-11。

           ⚠️ 它们当时是在跟**列表卡片的旧样式**打架 —— 日页要的字号、行数、颜色都和
           列表不一样,于是这里逐条改写。现在卡片只有一套装束(css/17n-journal-list.css,
           挂在两个房间共用的 .jrnl-list 上),日页只写它和列表**确实不同**的那两件事。 */

        /* ══════════════════════════════════════════════════════════════
           Plan 页改版 · 方案 2b「地图 + 账簿」
           规格见 SPEC-PLAN-2B.md。放在末尾是为了赢过前面的同名规则。
           ══════════════════════════════════════════════════════════════ */

        /* 滚动区给浮动 FAB 让位。
           ⚠ 留白要按「FAB 顶端到滚动区底端」算，不是按 FAB 的高度算：
           FAB 是 bottom:1.1rem + 52 高，标签栏约 47 —— 需要约 23px，
           给 --sp-2xl(48) 有富余。按 52+24 去给反而会算出一个看着够、
           其实差几像素的值。 */
        .trip-plan-body { padding-bottom: var(--sp-2xl); }

        /* 48×48 —— 和开销页那颗 .exp2-fab 同尺寸。这里原来写 52,全库两个 FAB
           差 4px:同一个动作(加一条)在两屏两个大小,而 52 也不在任何一档上。
           上面 5067 那条本来就是 48,这一条是后来单独加的覆盖。 */

        /* ── Plan 页外框：新的账簿行掉进了旧外框里，这里统一 ── */

        /* ① 当前标签按 §29：2px 墨色顶线 + 字重，不是深色填充块。
           填充块本来就重，而 FAB 又是深色、正好停在它旁边 ——
           两个深块并排读成一条四格的怪东西。 */

        /* ② 那条把 FAB 抬离标签栏的规则已随 `.plan-fab` 一起删除(2026-09-11)——
           它唯一还在用的按钮 #tripSheetFab 没了。 */

        /* ⑥ 卡片铺满全屏：行的横向留白由行自己给（已有 padding: 12px var(--sp-lg)），
           内容区不再额外内缩 —— 原来 .trip-plan-body 有 1.5rem 左右内边距，
           行就被缩成 382 宽、两侧各留 24，读成"浮在纸上的卡片"而不是账簿行。 */
        .trip-plan-body {
            padding-left: 0;
            padding-right: 0;
            padding-top: 0;
        }

        /* ⑦ 原来这里是 Checklist 弹窗外壳的两条补丁（让出标签栏、撑满被封面
           截短的一层）。2026-09-02 Checklist 与 Weather 都迁到页栈，外壳不存在了。 */

        /* ── 三个标签页到底部菜单的距离统一为 48 ──
           实测原来是 Stops 48 / Itinerary 54 / Check list 32。
           差别来自两处叠加：容器给一份、最后一行自己再带一份。
           规则同前：这段留白只由**容器**给，最后一行的下外边距清零。 */
        .trip-plan-body > *:last-child { margin-bottom: 0; }

        /* 原来这里还有两条 #checklistModal 外壳的留白清零。2026-09-02 清单迁到
           页栈，外壳不存在了；色块自己的 20px 就是全部留白。 */

        /* ── 地图上那两颗按钮 ──
           原来是 rgba(255,255,255,.2) + backdrop-filter: blur(10px) 的磨砂片，
           外加 hover 时 scale(1.05) —— 三样都是这套系统里没有的东西：
           半透明、模糊、缩放。而且压在地图上时，底下的路网和地名会透上来。

           按阶段三 ④：压在图像上的界面层用**完全不透明的底块 + 1px 描边**。
           所以这两颗做成钉在地图上的两张小纸片 —— 纸色底、墨色描边、墨色图标。
           不透明是关键：地图内容千变万化，只有不透明才保证任何位置都读得清。 */
        /* 无底、无框 —— 同封面右上角那个 ×。原来是「纸色底块 + 1px 墨色描边」
           的两张小纸片,理由是「地图内容千变万化,只有不透明才保证读得清」。
           那个理由对深色/卫星底图成立,而这一屏的地图是应用自己那套浅羊皮纸
           样式,底色范围窄,墨色图标在上面本来就够。两张纸片反而在一片浅底上
           圈出两个方块。
           ⚠️ 前提是底图保持浅色。哪天换成深色或卫星底图,这两颗要连同 ×
           一起补回描边(SVG 线性图标做不了 -webkit-text-stroke,得另想 —— 那时
           再议,别默默加回底块)。 */

        /* ══════════════════════════════════════════════════════════
           The stop detail sheet is dressed in css/17t-stop.css and NOWHERE ELSE · 2026-09-12
           ══════════════════════════════════════════════════════════

           Three hundred and seventy-seven lines stood here and they were a SECOND STYLESHEET
           for that room — the stay ticket, the activity row, the day band, the head, the two
           header words, both Add links, the section heads and the form's inset — written at
           one id and one class, which is the depth css/17t-stop.css writes at, in a file that
           loads after it. Equal specificity, later file: this one won every one of them.

           So the room had been migrated into the deck log on 2026-09-11 and photographed, and
           EIGHTEEN of its elements were still painted in the OUTGOING world's tokens on the
           day it was called finished: --text-primary, --text-secondary, --accent, --border,
           --rule-soft, --surface-field, --bg-primary, --font-sans, --font-serif, and a
           hand-typed #9B4D4D. The owner read the result as 「很多不符合 design system」,
           which is exactly what it was.

           ⚠️ WRITING A MORE SPECIFIC RULE IN 17t WOULD HAVE BEEN THE WRONG REPAIR. It would
           have left two accounts of one room in the tree, and the next person to open this
           file would have found rules that look authoritative and do nothing. Files 18–24
           load after every room's own file; when one of them dresses a migrated room, the
           rules come OUT. That is the fourth time removal has been the answer — the trip
           form, the stay tickets' double line, the journal list, and now the rest of this
           room.

           What moved rather than died, because the reason for it survives the redressing:
           the sheet's bounded height and the scrolling body's min-height: 0. Both are
           geometry rather than dressing, and both are now in css/17t-stop.css with the note
           that earned them. */

        /* ══════════════════════════════════════════════════════════════
           动作行 · 全库一条 · 2026-08-31，改写为甲板日志 2026-09-21
           此前每个弹窗各写一份：#expenseModal 一份 12px padding、
           #planTripModal 一份、.card4b 一份 8px。统一到 .modal-actions .btn 一处。

           ⚠️ 这一块原来画的是「三个实心小方块」：primary 实心 accent、secondary 纸面
           灰边、danger 纸面 brick 边，高 36px。2026-09-11 #planTripModal 搬进甲板日志
           时离开了这张名单，理由写在它自己的文件里 —— 这个世界没有实心按钮，动作是
           印刷体大写的带下划线的词。2026-09-13 #expenseModal 重建为收据，连
           .modal-actions 都不再有（它那几条已在本轮删除）。
           于是名单上只剩 #addActivityModal 一间房，而它算出来的确实还是那一版：
           实心 sage 的 Save、灰边 Cancel、brick 边 Delete。

           ⚠️ 但**它一颗都没画出来**，而这一点是写完上面那句之后才查出来的。
           17w-activity-form.css:71 写着
             #addActivityModal .af-tk #activityFormActions { display: none }
           理由就在它旁边：这一行被 moveSharedFormSections 搬进票据，而票据的头上
           已经有 CANCEL 和 SAVE、脚上有 REMOVE。五张卡片（flight / transit / stay /
           sights / generic）全是 .af-tk，所以只有「还没选种类」那一瞬看得见它。
           当时只量了那一瞬，就断言「最后一间还穿着旧衣服的房间」—— 错的，而同一轮
           拍的 43 张照片里没有一张有这三颗。记在 DESIGN.md 里，不抹掉。

           所以这一块**两间房都没有可见的消费者**：trip 那间被 17s 全量改写，
           activity 这间被隐藏。它是改值而不是删除 —— 上面那 274 行是「够不到」，
           证得死；这一块只是「今天没画」，证据弱一档，留着并让基底和房间说同一句话。
           取值逐条抄自 css/17s-plan-trip.css（2026-09-11 已定），不是重新发明：
             SAVE   品红 —— 按下去就把记录写进去了
             CANCEL 墨色 —— 出口是墨色，全库的 BACK / PREVIOUS / CLOSE 都是
             DELETE 品红 —— 主人 2026-09-17：打开表单算写记录，删除统一用品红

           ⚠️ 36px → 44px。原注释写着「height 而不是 min-height，所以这里必须显式把
           min-height 压回 0」—— 它压掉的正是 05-interaction.css 里点名 .btn 的 44px
           点击区下限。改回 min-height: 44px。但按上面那条：这一行没画出来，所以这
           只是把基底改对，不是修好了一颗按得到的按钮。真正该做的是把全库按得到的
           控件量一遍 —— 记在 DEBTS §5，这一轮没做。
           ══════════════════════════════════════════════════════════════ */
        .modal-actions { gap: var(--sp-xl); align-items: center; }
        .modal-actions .btn {
            flex: none;
            width: auto;
            min-height: 44px;
            padding: 0;
            border: none;
            border-radius: 0;
            background: none;
            box-shadow: none;
            cursor: pointer;
            font-family: var(--log-print);
            font-size: var(--fs-micro);
            font-weight: 600;
            letter-spacing: 0.16em;
            text-transform: uppercase;
            text-decoration: underline;
            text-underline-offset: 0.25em;
            text-decoration-thickness: 1px;
        }
        .modal-actions .btn-primary { color: var(--log-magenta); }
        .modal-actions .btn-primary:active {
            box-shadow: inset 0 -2px 0 0 var(--log-magenta);
        }
        .modal-actions .btn-secondary { color: var(--log-ink); }
        .modal-actions .btn-danger { color: var(--log-magenta); }

        /* ⚠️ SAVE 在右，出口在左（主人 2026-09-11：cancel 左边 save 右边），与
           #planTripModal 同。两个并排的表单在 SAVE 的位置上各说各话，比两个都旧更糟。
           ⚠️ 用 order，不搬标记：表单的隐式提交（文本框里按回车）触发的是**树序**里
           第一个 submit 按钮，不是屏幕上第一个。搬标记会让回车按到 Cancel。 */
        .modal-actions .btn-secondary,
        .modal-actions .btn-danger { order: 1; }
        .modal-actions .btn-primary { order: 2; margin-left: auto; }

        /* ══════════════════════════════════════════════════════════════
           Trip Settings · 显示态 · 2026-08-31
           点进来先给一屏可读的,不是直接给表单。词汇沿用 Stop details:
           眉题小号大写、发丝线分节、说明用 accent 竖线。
           §4:衬线只给内容标题与金额 —— 所以标题与 Notes 正文是 Vollkorn,
           字段值一律无衬线(与 §11 下划线式输入的「无衬线 15px」对齐,
           点铅笔进编辑态时字体不跳)。
           ══════════════════════════════════════════════════════════════ */
        #tripSettingsView { display: none; }
        #tripSettingsView.is-on { display: block; }

        /* 封面全出血,不压任何控件（关闭 × 除外)。
           2026-08-31:改 sticky —— 封面钉在滚动区顶端不动，正文从它下面滑过去。
           照片因此始终在场（它是这趟旅行的身份），而不是滚两下就没了；
           上滑时被遮住的是设置内容，那些内容本来就是读完就往下走的。
           z-index 是必须的:没有它，后面的兄弟节点会画在封面之上。 */
        .tsv-cover {
            position: sticky;
            top: 0;
            z-index: 2;
            height: 168px;
            background-size: cover;
            background-position: center;
            background-color: var(--log-stock-band);
        }
        /* `.tsv-close` was removed 2026-09-11 with the element it dressed: a × floating on
           the cover, in --on-dark, over a photograph nobody chooses the colour of. The way
           out is a word on the head band now (.ptrip-close). */

        .tsv-head {
            display: flex;
            align-items: flex-start;
            justify-content: space-between;
            gap: var(--sp-sm);
            padding: var(--sp-lg) var(--sp-lg) 0;
        }
        .tsv-title {
            font-family: var(--log-write);
            font-size: 21px;
            font-weight: 700;
            line-height: 1.15;
            color: var(--log-ink);
        }
        /* 12px —— 与固定规则那几行同一档。原来是 13,而屏上另有 12 和 11.5,
           三个「小字」互相之间差半个像素到一个像素,谁也看不出是三档。 */
        .tsv-dates {
            margin-top: 4px;
            font-family: var(--log-write);
            font-size: 12px;
            color: var(--log-ink-soft);
        }
        /* The pencil became the word CHANGE on 2026-09-11 — it was the only way from the
           reading mode into the form, and a way somewhere is a word in this world. The
           44×44 hit area and its negative margin went with the icon; the replacement is
           dressed in css/17s-plan-trip.css beside the head band's CLOSE, which is the same
           gesture and now looks like it. */

        /* The reading mode's three colour bands went with the edit mode's on 2026-09-11 —
           same argument, same place it is written down: the deck log has one stock and
           separates with a rule. The three greens that existed only to survive the green
           ground went with it. See css/17s-plan-trip.css. */
        .tsv-section { padding: var(--sp-lg); }

        .tsv-head-row {
            display: flex;
            align-items: baseline;
            justify-content: space-between;
            gap: var(--sp-sm);
            margin-bottom: 12px;
        }
        /* 眉题、归属注、字段标签是同一档:9.5px 大写、字距 0.14em。
           原来是 0.16 / 0.1 / 0.14 三个值 —— 同一个字号上三种字距,肉眼分不出,
           代码里却要维护三处。三者的分别只靠字重:眉题与标签 600,归属注 400。 */
        .tsv-eyebrow,
        .tsv-who,
        .tsv-label {
            font-family: var(--log-write);
            font-size: 11px;
            letter-spacing: 0.14em;
            text-transform: uppercase;
            color: var(--log-ink-soft);
        }
        .tsv-eyebrow,
        .tsv-label { font-weight: 600; }
        .tsv-who { font-weight: 400; }

        .tsv-fields { display: flex; flex-direction: column; gap: var(--sp-md); }
        /* 眉题、归属注、币种后缀一律 --text-secondary。
           --text-light 压在 --surface-sheet 上只有 2.98:1 —— 这三样都不是装饰:
           眉题是字段名,归属注说明谁能改,币种后缀是唯一说明这个数是什么货币的东西。
           （§3 只给 disabled 留了合法留存面;P4-2 那 119 条要搬走的就是这类。) */
        /* 15px,不是 16 —— 全库的只读值就是 15px（.bp-view-value、.exp-row-value、
           .stop-item-name、.transport-picker-itin-name…）。16 是这一屏自己起的一档,
           在真机上和相邻页面并看就显得胖一号。 */
        .tsv-value {
            margin-top: 2px;
            font-family: var(--log-write);
            font-size: 15px;
            color: var(--log-ink);
        }
        /* 金额不再单独用衬线。同一列里四个值是 Hanken、一个是 Vollkorn,
           读作「这一行是别的东西」—— 而它只是另一个值。衬线在这一屏的职能是
           标记「读物」(Notes),不是标记数字。
           币种后缀原来是 10px Vollkorn 大写,全屏只此一处用这个组合;
           并进 12px 无衬线那一档。 */
        .tsv-value .tsv-cur {
            font-size: 12px;
            letter-spacing: 0.06em;
            text-transform: uppercase;
            color: var(--log-ink-soft);
        }
        .tsv-value .tsv-role { color: var(--log-ink-soft); }
        /* Notes 是内容散文 —— 衬线 + accent 竖线,同 Stop details。 */
        .tsv-notes {
            margin-top: 5px;
            padding-left: 11px;
            border-left: 2px solid var(--log-rule-firm);
            /* 衬线只留这一处 —— 它是这一屏唯一的「读物」。字号跟其余值同档 15,
               原来的 14 是第八个字号,而它和 15 并排时只显得没对齐。 */
            font-family: var(--log-write);
            font-size: 15px;
            line-height: 1.6;
            color: var(--log-ink);
        }

        /* 「一条设置 + 四条规则」。上下那两条发丝线删了 —— 这一段已经有自己的
           底色,再框一条出来是在一块色块里又划一块。 */
        .tsv-set-row {
            padding: 0;
            border: none;
        }
        .tsv-fixed { display: flex; flex-direction: column; gap: 7px; margin-top: var(--sp-xs); }
        /* 词条与说明同为 12px,只差字重。原来是 12 与 11.5 两档 ——
           差 0.5px 等于没差,却在字号阶上多占一格。 */
        .tsv-fixed-row { display: flex; gap: 10px; font-family: var(--log-write); font-size: 12px; line-height: 1.5; }
        .tsv-fixed-row b {
            width: 76px;
            flex: none;
            font-weight: 600;
            color: var(--log-ink);
        }
        .tsv-fixed-row span { flex: 1; color: var(--log-ink-soft); text-wrap: pretty; }

        /* .tsv-foot 已删(2026-09-01)。那 48px 是「纸底页面 + 底部导航要让位」
           时代的页面下留白;现在最后一段自己有底色并且通到下沿,「页面下留白」
           这件事不存在了 —— 剩下的只是色块内最后一行到色块下沿的距离,
           那个值就是色块自己的下内边距 24px,和编辑页动作行一致。 */

/* ══════════════════════════════════════════════════════════════
           Trip settings 编辑页 · 3a「色块分段」+ 3a′「同行者」
           ──────────────────────────────────────────────────────────────
           段与段之间不再画横线,各占一块底色。底色梯度自带含义:
           纸白(共有的)→ 深一档(只有你看得见,所以更内)→ 转绿(权限段,
           靠向 accent)。只有第三段换色相 —— 三种色相会像三个不同的应用。
           点线底边留着:它不是装饰,是「这一格能写」的记号,和 Add / Edit
           Stop 两屏一致,删了那两屏也得跟着改。
           ══════════════════════════════════════════════════════════════ */

        /* ⚠️ THE THREE BANDS OF COLOUR ARE GONE (2026-09-11). Paper for the trip's own
           fields, a deeper paper for yours, green for the permissions — a gradient that
           carried meaning, and the argument for it is still sound. It is not this world's
           argument: the deck log has ONE stock and separates sections with a rule, and
           three tinted grounds in a room whose neighbours are all #D9DFDD reads as three
           different applications rather than three parts of one form. The separation it was
           doing is done by the block heads and their rules in css/17s-plan-trip.css.

           The PADDING went with them for a different reason: it was 20px, which is neither
           --sp-lg (24, this world's margin column) nor anything else in the scale. */
        #mySettingsSection {
            /* 从「一块 sage 面板」降级成一个无样式的壳 —— 分段现在由里面
               两个色块各自承担,壳再加一层底色就是纸上又铺一张纸。 */
            margin: 0;
            padding: 0;
            background: none;
            border: 0;
        }
        /* The action row's dressing moved to css/17s-plan-trip.css with the rest of the
           room. The DECISION recorded here is kept because it is still in force and still
           the reason nothing here is pinned: the row does not float. It was pinned once,
           because "you cannot see Save on a new trip" — and the real cause of that was the
           bottom navigation covering the last 48px (see the --nav-h rule below), not
           scrolling. Once the real cause was fixed, pinning was only a cost. */
        /* ⚠️ AND ONLY THERE, FROM 2026-09-11. Below 768 this was 48px of bare stock under
           the action row and nothing in it — reported from a phone: 最下面边距去掉.

           The let-down was written when the bar covered the form's last 48px. It only can
           above 768: that is where .app-frame takes `transform: translateZ(0)`
           (css/01-tokens.css) and becomes a stacking context, which puts the bar — fixed to
           <body>, outside the frame — above a modal inside it. On a phone the frame has no
           transform, the modal's z-index 1000 beats the bar's 50, and the bar is simply
           covered. Measured both ways before the rule moved; the phone's screenshot shows no
           bar under the modal, which is the same fact from the other side. */

        /* ---- 字段记号:点线底边 ----
           「这一格能写」的记号,和 Add / Edit Stop 两屏已上线的写法一致
           (那两屏用的就是 1px dotted 的旧世界描边色)。段间横线删了之后,
           这是屏上唯一还剩的线 —— 所以它必须只出现在能写的地方。
           值一律无衬线 15px(§4「表单用无衬线」);衬线只留给金额,
           那是一列要对齐着读的数。 */
        /* 字距 normal —— 显示页的值就是 normal,这边继承下来 0.05em(15px 上是
           0.75px)。同一个值在两态里字距不同,切换时整行会轻微错位。 */
        /* Budget 不用衬线。显示页那边已经判过:一列里四个 Hanken 配一个 Vollkorn,
           读作那一行是别的东西 —— 衬线的职能是标记「读物」(Notes),不是标记数字。
           两态要一致,这里跟着撤。撤了之后它的占位符也不再是 Vollkorn 13px。 */

        /* Budget:币种 + 数额一行两格,和其它字段同一种记号 —— 点线底边。
           原来这两格是带边框带底色的方框,于是同一屏上「能写」有两种说法:
           五个字段是一条线,这两个是一个盒子。 */

        /* Destinations 与 Travelling with 是同一个部件:一串可删的 chip +
           一个 accent 色的添加入口,排在点线底边之上。原来一个是带底色的
           方框、一个是常驻搜索框 —— 两个一样的问题给了两种界面。 */

        /* 面板挂在这个字段下面(定义在 .country-modal 那一处,不在这里重写一遍)。 */
        #destinationsField { position: relative; }

        /* Dates:区间、夜数、日历图标是一行三件事,底边要通到行尾。
           原来线只画在输入框下面,夜数悬在线外,读作两个东西。 */

        /* Travelling with 与 Destinations 是同一个部件,连选择器面板都共用
           .country-modal —— 点 + Add 弹出的东西两处必须长得一样。
           这个字段是面板的定位参照。 */
        #travellingWithField { position: relative; }

        /* The permissions block's greens went with the band they were painted for
           (2026-09-11) — six selectors of #546052, #4E5A4C and #B4BCB1 whose only job was
           to survive a green ground that no longer exists. The ladder keeps its shape and
           takes the log's ink; see css/17s-plan-trip.css. */

        /* 「Always the same」是段内小节题。原来这四条靠一条 border-top 分出来,
           那条线现在删了,改由一个降一档的小节题领起。 */
        .mys-fixed-head { margin: var(--sp-md) 0 var(--sp-xs); }

        /* ⚠️ THE TWO CHIPS THAT FLOATED ON THE COVER WERE REMOVED 2026-09-11. Their own
           note argued that they had to be opaque fills because a cover may be a backlit
           photograph — which is the right observation and the wrong conclusion: a control
           placed on content whose colour nobody chooses is a control you have to armour.
           There are three of them now (UPLOAD, SEARCH, LINK) and they are on their own
           band under the plate, where the stock is known. See css/17s-plan-trip.css.

           `.active` went too. It was the class for "this tab is chosen" AND the class for
           "this view is on screen" — one word, two meanings, in one room. The tab's state
           is `is-on`; the view's stays `.active`, because .image-view's display rule is not
           this round's to move. switchImageTab writes both. */

/* ══════════════════════════════════════════════════════════════
           危险按钮 · 交互态收口（承 9208 的静止态）
           ──────────────────────────────────────────────────────────────
           静止:纸面 + 1px --danger 描边 + --danger 字。
           悬停 / 按下 / 键盘聚焦:--danger 实心 + --on-dark 字。

           必须写在样式表末尾。此前是三条各自为政、而且互相把对方的
           :hover 挡掉:
             2774  .btn-danger:hover           → 棕色 #4A3728(遗留,颜色本身就错)
             9219  .btn-danger:hover           → --danger 实心(对的)
            16724  .modal-actions .btn-danger  → 描边式,静止态
           最后那条特异性 (0,2,0) 与 :hover 那两条相同,而它写在后面 ——
           于是「Save + Delete 并排」那颗 Delete 连悬停都没有反应:
           静止态的声明在 hover 时依然赢。逐条去中和要改三处,靠层叠顺序
           只改一处(同收关闭按钮尺寸时的做法)。

           :active 与 :focus-visible 一起给 —— 触屏没有 hover,键盘没有指针,
           只写 hover 等于只照顾了鼠标。

           ⚠️ 2026-09-21 改写：静止态已不是「纸面 + brick 描边」，而是品红的印刷体词
           （见本文件动作行那一块）。所以按下去也不该是「brick 实心 + 浅字」——
           这个世界按下去是加粗一条基线，不是给底色上色（Ink, not glow）。
           #expenseModal 那三条随它的 .modal-actions 一起删了。 */
        .btn-danger:hover,
        .btn-danger:active,
        .btn-danger:focus-visible,
        .modal-actions .btn-danger:hover,
        .modal-actions .btn-danger:active,
        .modal-actions .btn-danger:focus-visible {
            background: none;
            color: var(--log-magenta);
            box-shadow: inset 0 -2px 0 0 var(--log-magenta);
        }

        /* ── 「一趟行程有多长」收敛后新增的四个位置 · 2026-09-03 ──────────────
           三处数字口径统一到 01-core.js 的 tripNights/tripDays 之后，界面上多出
           三条说明和一个占位符。都按既有的记法走：说明用 sans、正文色、
           lining tabular 数字（和晚数比例尺那行同一套），不新起字体或颜色。 */

        /* .exp2-share-note dressed the line under the ring — "Your share of 1,999.90 AUD
           spent on this trip". REMOVED on 2026-09-12 with the line itself: the owner's word
           was that a screen which is one person's budget has no business printing what
           everybody spent (费用属于个人隐私 … 圆环里的数字 应该是个人花费总计). */

        /* ── 待同步状态行 · 2026-09-03 ───────────────────────────────────
           只在真的有东西没发出去时才存在，没有就整条移除（不是隐藏）——
           一条常驻的「一切正常」等于噪音。位置压在底部导航之上，因为它讲的是
           「你的东西还没到服务器」，那属于全局状态，不属于任何一页。
           语气刻意压住：不是错误，是一件正在办的事。 */
        /* The ambient bar, in this world's clothes at last.

           It was still wearing the outgoing one — --surface-sheet, --border, --font-sans,
           --text-secondary, --primary — pressed against a bottom bar that migrated on
           2026-09-07, and it was not in the token selector list at the head of 02-auth.css
           at all, so it could not have taken the world's tokens even where it named them.
           Its "Open" was print caps with no underline, which is not this world's form for an
           act. Found by the 2026-09-08 finish review, along with the two things it was
           saying wrong; those are in 25-sync.js. */
        .sync-status-bar {
            position: fixed;
            left: 0;
            right: 0;
            bottom: var(--nav-h);
            z-index: 60;
            display: flex;
            align-items: center;
            gap: var(--sp-sm);
            padding: var(--sp-2xs) var(--sp-lg);
            background: var(--log-stock-band);
            border-top: 1px solid var(--log-rule-firm);
            font-family: var(--log-write);
            font-size: var(--fs-small);
            color: var(--log-ink);
        }

        /* Wraps rather than clips. The bar can now carry two clauses — what is waiting AND
           what was refused — and an ellipsis would eat the second one, which is the half
           that will never resolve on its own. */
        .sync-status-text { flex: 1; min-width: 0; line-height: 1.35; }

        /* An act is an underlined word in print caps, in the one ink. No magenta: opening a
           page changes no record. */
        .sync-status-retry {
            flex: none;
            min-height: 44px;
            padding: 0 var(--sp-2xs);
            background: none;
            border: none;
            color: var(--log-ink);
            font-family: var(--log-print);
            font-size: var(--fs-micro);
            letter-spacing: 0.16em;
            text-transform: uppercase;
            font-weight: 600;
            text-decoration: underline;
            text-underline-offset: 0.25em;
            text-decoration-thickness: 1px;
            cursor: pointer;
        }

        /* The Ink-Not-Glow Rule: pressing thickens a baseline rather than fading the word. */
        .sync-status-retry:active { box-shadow: inset 0 -2px 0 0 var(--log-ink); }
        .sync-status-retry:focus-visible { outline: 2px solid var(--log-ink); outline-offset: 2px; }

        /* Not over the sign-in sheets. Signed out, the bar's act is Sign in, and on the sheet
           the reader has already pressed it (2026-09-16, the 401 notice). */
        body:has(#loginPage.active, #registerPage.active) > .sync-status-bar { display: none; }

        /* 手机框之内才对齐到框宽 —— 桌面上应用被锁在 430px 一栏里，
           一条通栏的状态条会飘在框外的灰底上。 */
        @media (min-width: 480px) {
            .sync-status-bar {
                left: 50%;
                transform: translateX(-50%);
                width: min(430px, 100%);
            }
        }
