'16:9', 'w' => 1600, 'h' => 900, 'label' => '题图', 'hint' => '']; $hasCover = $isEdit && !empty($t['cover_key']); /* 弹框形态的开关(与观影 form.php 同一套命名习惯): $tpModal —— 是否渲染成弹框壳(含遮罩/标题栏) $tpModalOnly —— 被列表页内嵌(初始关闭,等用户点"新建旅程"才开) $tpOpen —— 初始是否打开(整页直达 / AJAX 校验失败重画时为 true) */ $tpModal = !isset($tpModal) ? true : (bool)$tpModal; // v41:默认就是弹框形态 $tpModalOnly = !empty($tpModalOnly); $tpOpen = !empty($tpOpen); $tpReload = (string)($tpReload ?? ''); /* 🔴🔴 `$tpEmbed`(v41):**只吐表单片段**(详情页弹框 fetch 用)。 ⇒ 不输出页头、也不输出任何外层容器 —— 壳由详情页的 `#nodeFormHost` 提供。 片段再自带一层弹框壳会变成"弹框里套弹框"(遮罩叠遮罩、标题栏双份)。 `$tpShell`:本模板**是否输出外层容器**(片段形态 = false;整页/列表内嵌 = true)。 ⚠️ 外壳**类型**仍由 `$tpModal` 决定(true→`.cal-modal`,false→`.card`)。 收尾必须用同一对判据,否则"开头开 .card、结尾收 .cal-modal"→ 深度不配平 (2026-10-10 实测被 _fb_divdepth.py 当场抓到)。 */ $tpEmbed = !empty($tpEmbed); $tpShell = !isset($tpShell) ? !$tpEmbed : (bool)$tpShell; ?>