This commit is contained in:
大哥大哥的大哥哥
2026-09-09 14:47:29 +08:00
parent 4d9da40abd
commit 65755c9e96
832 changed files with 412085 additions and 0 deletions
@@ -0,0 +1,932 @@
<view
wx:if="{{chapter}}"
class="chapter-page font-{{fontScale}} {{compactHeight ? 'compact-height' : ''}}"
style="{{pageStyle}}"
>
<view class="comic-topbar {{storyFirstComicMode ? ((chapterOneBackOpen || (chapterOneEmotionOpen && emotionResult) || (decisionOpen && resultMode === 'correct')) ? 'c1-book-topbar is-back' : ('c1-book-topbar is-front ' + (frontControlsRevealed ? 'is-controls-revealed' : 'is-controls-hidden'))) : ''}}" style="{{topbarStyle}}">
<block wx:if="{{!storyFirstComicMode || chapterOneBackOpen || (chapterOneEmotionOpen && emotionResult) || (decisionOpen && resultMode === 'correct') || frontControlsRevealed}}">
<button class="comic-catalog-button" bindtap="goCatalog" aria-label="返回目录">‹ 目录</button>
<button
wx:if="{{storyFirstComicMode && !comicPreviousDisabled}}"
class="comic-top-previous-button"
bindtap="previousComicPage"
aria-label="上一张画"
>‹</button>
<view class="comic-bookmark">
<text class="comic-bookmark-label">
第{{chapterNumber < 10 ? '0' + chapterNumber : chapterNumber}}回{{compactHeight ? '' : ' · ' + chapter.year}}
</text>
<text class="comic-page-count">{{currentPageNumber}}/{{comicPageCount}}</text>
</view>
<button
wx:if="{{!storyFirstComicMode && !currentPage.audioAvailable && !currentPage.audioCompanionAvailable}}"
class="comic-page-audio-slot is-text-mode {{storyFirstComicMode ? 'c1-audio-slot' : ''}}"
bindtap="openTextReading"
aria-label="本页可以直接看文字"
>
<text class="comic-page-audio-icon" aria-hidden="true">阅</text>
<view class="comic-page-audio-copy">
<text class="comic-page-audio-label">直接看文字</text>
<text class="comic-page-audio-meta">按页慢慢看</text>
</view>
</button>
<button
wx:elif="{{currentPage.audioAvailable || currentPage.audioCompanionAvailable}}"
class="comic-page-audio-slot {{storyFirstComicMode ? 'c1-audio-slot' : ''}} {{audioLoading ? 'is-loading' : audioPlaying ? 'is-playing' : audioPercent > 0 ? 'is-replay' : 'is-ready'}}"
disabled="{{audioLoading}}"
bindtap="toggleComicPageAudio"
data-audio-cue-count="{{currentPage.audioCueCount}}"
aria-label="本页语音播放控制"
>
<text class="comic-page-audio-icon" aria-hidden="true">
{{audioPlaying ? 'Ⅱ' : '▶'}}
</text>
<view class="comic-page-audio-copy">
<text wx:if="{{audioLoading}}" class="comic-page-audio-label">准备中</text>
<text wx:elif="{{audioPlaying}}" class="comic-page-audio-label">暂停</text>
<text wx:elif="{{audioPercent > 0}}" class="comic-page-audio-label">重听</text>
<text wx:else class="comic-page-audio-label">听一听</text>
<text class="comic-page-audio-meta">
{{audioCurrent}} / {{audioDuration === '0:00' ? currentPage.audioDurationLabel : audioDuration}}
</text>
</view>
</button>
<button
wx:if="{{!storyFirstComicMode || chapterOneBackOpen || (chapterOneEmotionOpen && emotionResult) || (decisionOpen && resultMode === 'correct')}}"
class="comic-font-button"
bindtap="toggleFont"
aria-label="{{fontScale === 'large' ? '把整页文字再放大' : '恢复标准大字'}}"
>
{{fontScale === 'large' ? '大字' : '标准字'}}
</button>
<button
wx:if="{{storyFirstComicMode && !chapterOneBackOpen && !decisionOpen && !chapterOneEmotionOpen}}"
class="c1-front-action-button"
bindtap="openCurrentFrontAction"
aria-label="{{currentPage.type === 'event'
? (currentEventCompleted ? '点一下,再看背面' : '点点人物,翻到背面')
: currentPage.type === 'emotion'
? (chapterFinished ? '点一下,看看章末' : '点一下,听听心里话')
: '点一下,翻到背面'}}"
>
{{currentPage.type === 'event'
? (currentEventCompleted ? '再看背面' : '点点人物')
: currentPage.type === 'emotion'
? (chapterFinished ? '看看章末' : '听听心里话')
: '翻到背面'}}
</button>
</block>
</view>
<view class="comic-reader">
<block wx:if="{{storyFirstComicMode}}">
<view class="c1-comic-page {{chapterOneBackOpen ? 'is-back' : 'is-front'}}">
<block wx:if="{{chapterOneBackOpen}}">
<view class="c1-back-paper">
<view class="c1-back-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-back-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">
{{currentPage.type === 'memory' ? '桂香记忆' : currentPage.type === 'event' ? '这回事' : '画背后的事'}}
</text>
</view>
<scroll-view class="c1-back-copy" scroll-y enhanced show-scrollbar="{{true}}">
<view wx:if="{{currentPage.type === 'memory'}}" class="c1-back-copy-inner">
<text class="c1-back-kicker">第{{chapterNumber < 10 ? '0' + chapterNumber : chapterNumber}}回 · 章末记忆</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{currentPage.caption}}</text>
<view class="c1-back-callout">
<text class="c1-back-label">桌边回声</text>
<text>{{currentPage.memoryCard.tableEcho}}</text>
</view>
<view class="c1-back-action">
<text class="c1-back-label">带回生活里</text>
<text>{{currentPage.memoryCard.lifeAction}}</text>
</view>
<text class="c1-back-family">“{{currentPage.memoryCard.familyLine}}”</text>
<view class="c1-memory-secondary-actions">
<button
class="c1-memory-secondary-action"
bindtap="openLifeReport"
aria-label="查看本回桂香生活观察"
>看看生活观察</button>
<button
class="c1-memory-secondary-action"
open-type="share"
aria-label="发给家人,一起聊聊这一页"
>发给家人聊聊</button>
</view>
</view>
<view wx:elif="{{currentPage.type === 'event' && currentEventCompleted && chapterOneReviewEvent}}" class="c1-back-copy-inner">
<text class="c1-back-kicker">{{currentPage.actorName}} · 刚才看见的</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{chapterOneReviewEvent.actionDescription}}</text>
<view class="c1-back-callout">
<text class="c1-back-label">您刚才瞧见的</text>
<text>{{chapterOneReviewEvent.evidence}}</text>
</view>
<view class="c1-back-action">
<text class="c1-back-label">下回遇到这事</text>
<text>{{chapterOneReviewEvent.actionAdvice}}</text>
</view>
</view>
<view wx:elif="{{currentPage.type === 'event' && chapterOneReviewEvent}}" class="c1-back-copy-inner">
<text class="c1-back-kicker">{{currentPage.actorName}} · 这回事</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{currentPage.caption}}</text>
<view wx:if="{{currentPage.shortDialogue}}" class="c1-back-callout">
<text class="c1-back-label">桌边一句话</text>
<text>“{{currentPage.shortDialogue}}”</text>
</view>
</view>
<view wx:else class="c1-back-copy-inner">
<text class="c1-back-kicker">{{currentPage.eyebrow || chapter.year + ' · ' + chapter.location}}</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{currentPage.displayCaption}}</text>
<text wx:if="{{currentPage.secondaryCaption}}" class="c1-back-secondary">{{currentPage.secondaryCaption}}</text>
</view>
</scroll-view>
<text
wx:if="{{currentPage.type === 'memory' || (currentPage.type === 'event' && currentEventCompleted)}}"
class="c1-scroll-hint"
>上划接着看 ↑</text>
<view wx:if="{{currentPage.type === 'memory'}}" class="c1-back-footer c1-memory-footer">
<button class="c1-back-button secondary" aria-label="回头再看一遍画面" bindtap="closeChapterOneBack">回去看画</button>
<button wx:if="{{chapterNumber >= chapterCount}}" class="c1-back-button primary" bindtap="goCatalog">回到目录</button>
<button wx:else class="c1-back-button primary" bindtap="nextChapter">翻下一回</button>
</view>
<view wx:else class="c1-back-footer">
<button class="c1-back-button secondary" aria-label="回头再看一遍画面" bindtap="closeChapterOneBack">回去看画</button>
<button
wx:if="{{currentPage.type === 'event' && !currentEventCompleted}}"
class="c1-back-button primary"
bindtap="startChapterOneDecisionFromBack"
>聊聊这事</button>
<button
wx:else
class="c1-back-button primary"
bindtap="nextChapterOnePageFromBack"
>翻下一张</button>
</view>
</view>
</block>
<block wx:elif="{{currentPage.type === 'emotion' && chapterOneEmotionOpen && emotionResult}}">
<view class="c1-back-paper">
<view class="c1-back-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-back-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">桌边回声</text>
</view>
<scroll-view class="c1-back-copy" scroll-y enhanced show-scrollbar="{{true}}">
<view class="c1-back-copy-inner">
<text class="c1-back-kicker">没有标准答案</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{emotionResult.feedback}}</text>
<view class="c1-back-callout">
<text class="c1-back-label">这一桌记住了</text>
<text>{{emotionResult.echo}}</text>
</view>
</view>
</scroll-view>
<view class="c1-back-footer">
<button class="c1-back-button secondary" aria-label="回头再看一遍画面" bindtap="closeChapterOneEmotion">回去看画</button>
<button class="c1-back-button primary" bindtap="finishChapterOneEmotionAndTurn">收下这句话</button>
</view>
</view>
</block>
<block wx:elif="{{currentPage.type === 'emotion' && chapterOneEmotionOpen && !emotionResult}}">
<view class="c1-interaction-paper c1-emotion-interaction-paper">
<view class="c1-interaction-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-interaction-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">桌边一句话</text>
</view>
<view class="c1-interaction-panel">
<button class="c1-tray-close" bindtap="closeChapterOneEmotion" aria-label="收起选择,先回画面">先看画</button>
<view class="c1-tray-heading">
<text class="c1-tray-kicker">这一刻,您想怎么说?</text>
<text class="c1-tray-question">{{currentPage.prompt}}</text>
</view>
<view class="c1-choice-stack">
<button
wx:for="{{chapter.emotionMoment.playerChoices}}"
wx:key="choiceId"
class="c1-natural-choice"
data-choice="{{item.choiceId}}"
bindtap="chooseEmotion"
>{{item.text}}</button>
</view>
</view>
</view>
</block>
<block wx:else>
<view class="c1-front-stage">
<image
wx:if="{{comicImageSrc}}"
class="c1-front-image"
src="{{comicImageSrc}}"
mode="aspectFit"
bindload="onComicImageLoad"
binderror="onComicImageError"
></image>
<view wx:else class="c1-front-fallback">
<text>{{comicImageError}}</text>
<text>{{currentPage.sceneAlt}}</text>
</view>
<view class="c1-front-grain"></view>
<button
wx:if="{{!frontControlsRevealed}}"
class="c1-front-reveal-gate"
bindtap="revealCurrentFrontControls"
aria-label="轻点画面,显示阅读按钮"
></button>
<block wx:else>
<button
wx:if="{{frontControlsRevealed && currentInteractionEnabled && currentPage.type === 'event' && !comicImageUsingFallback}}"
class="c1-person-hotspot"
style="{{currentPage.actorHotspot.style}}"
bindtap="openComicActor"
aria-label="点点{{currentPage.actorName}},翻到这一幕背面"
><view class="c1-hotspot-ring"></view></button>
<button
wx:elif="{{frontControlsRevealed && currentPage.type === 'event' && currentEventCompleted}}"
class="c1-full-page-tap"
bindtap="openChapterOneBack"
aria-label="翻到这一幕的背面"
></button>
<button
wx:elif="{{frontControlsRevealed && currentPage.type === 'emotion'}}"
class="c1-full-page-tap"
bindtap="openChapterOneEmotion"
aria-label="{{chapterFinished ? '轻触画面,翻到章末' : '轻触画面,听听这一桌心里话'}}"
></button>
<button
wx:else
class="c1-full-page-tap"
bindtap="openChapterOneBack"
aria-label="轻触画面,翻到这一页背面"
></button>
</block>
<text wx:if="{{frontHintVisible}}" class="c1-front-first-hint">轻点画面,按钮就出来了</text>
</view>
</block>
</view>
</block>
<block wx:elif="{{currentPage.type === 'emotion'}}">
<view class="comic-special-page emotion-page template-{{currentPage.templateKey}} layout-{{currentPage.layoutVariant}}">
<view class="special-art">
<image
wx:if="{{comicImageSrc}}"
class="special-art-image"
src="{{comicImageSrc}}"
mode="aspectFit"
bindload="onComicImageLoad"
binderror="onComicImageError"
></image>
<view wx:else class="special-art-fallback">
<text>{{comicImageError}}</text>
<text>{{currentPage.sceneAlt}}</text>
</view>
<view class="comic-paper-grain"></view>
</view>
<view class="emotion-panel">
<scroll-view class="emotion-paper" scroll-y enhanced show-scrollbar="{{true}}">
<view class="emotion-context">
<text class="emotion-context-kicker">听听这一桌心里话</text>
<text class="emotion-context-title">{{currentPage.headline}}</text>
<text class="emotion-context-caption">{{currentPage.caption}}</text>
</view>
<text class="emotion-prompt">{{currentPage.prompt}}</text>
<text
wx:if="{{!emotionResult && !chapterFinished}}"
class="emotion-note"
>没有标准答案,选您更愿意说的话。</text>
<view wx:if="{{emotionResult || chapterFinished}}" class="comic-emotion-result">
<text wx:if="{{emotionResult}}" class="feedback">{{emotionResult.feedback}}</text>
<view class="table-echo">
<text class="echo-label">桌边回声</text>
<text>{{emotionResult ? emotionResult.echo : chapter.emotionMoment.tableEcho}}</text>
</view>
</view>
</scroll-view>
<view
wx:if="{{!emotionResult && !chapterFinished}}"
class="emotion-choice-dock"
>
<button
wx:for="{{chapter.emotionMoment.playerChoices}}"
wx:key="choiceId"
class="emotion-choice"
data-choice="{{item.choiceId}}"
bindtap="chooseEmotion"
>
<text class="choice-number">{{index + 1}}</text>
<text>{{item.text}}</text>
</button>
</view>
<view class="special-page-footer emotion-page-footer {{emotionResult || chapterFinished ? 'has-primary' : 'single-action'}}">
<button
class="special-page-button secondary {{comicPreviousDisabled ? 'is-disabled' : ''}}"
bindtap="previousComicPage"
aria-label="返回前一页"
aria-disabled="{{comicPreviousDisabled}}"
>
<text class="comic-control-visible">上页</text>
</button>
<button
wx:if="{{emotionResult || chapterFinished}}"
class="special-page-button primary"
bindtap="finishComicEmotion"
aria-label="{{chapterFinished ? '查看记忆卡' : '收下这一桌的回声'}}"
>
<text class="comic-control-visible">{{chapterFinished ? '查看记忆卡' : '收下这一桌的回声'}}</text>
</button>
</view>
</view>
</view>
</block>
<block wx:elif="{{currentPage.isSeasonClose}}">
<view class="season-close-page template-{{currentPage.templateKey}} layout-{{currentPage.layoutVariant}}">
<view class="season-close-body">
<view class="season-close-art">
<image
wx:if="{{comicImageSrc}}"
class="season-close-main-image"
src="{{comicImageSrc}}"
mode="aspectFit"
bindload="onComicImageLoad"
binderror="onComicImageError"
></image>
<view wx:else class="season-close-art-fallback">
<text>{{comicImageError}}</text>
<text>{{currentPage.sceneAlt}}</text>
</view>
<view
wx:if="{{comicImageSrc && !comicImageUsingFallback && currentPage.detailInset}}"
class="season-close-detail-inset {{currentPage.detailInset.anchorClass}}"
aria-label="{{currentPage.detailInset.label}}近景"
>
<image
class="season-close-detail-image"
src="{{comicImageSrc}}"
mode="{{currentPage.detailInset.imageMode}}"
style="{{currentPage.detailInset.imageStyle}}"
></image>
<text class="season-close-detail-label">{{currentPage.detailInset.label}}</text>
</view>
</view>
<scroll-view
class="season-close-copy"
scroll-y
enhanced
show-scrollbar="{{true}}"
>
<view class="season-close-copy-sheet">
<text class="season-close-kicker">第一季 · 季终</text>
<text class="season-close-caption">{{currentPage.seasonCloseCaption}}</text>
<view class="season-close-memory-card">
<text class="season-close-card-label">桂香记忆卡</text>
<text class="season-close-era">{{currentPage.memoryCard.eraLine}}</text>
<text class="season-close-quote">{{currentPage.memoryCard.tableEcho}}</text>
<view class="season-close-life-line">
<text class="season-close-line-label">今天可以这样做</text>
<text>{{currentPage.memoryCard.lifeAction}}</text>
</view>
<view class="season-close-family-line">
<text class="season-close-line-label">带回家聊一聊</text>
<text>“{{currentPage.memoryCard.familyLine}}”</text>
</view>
</view>
<text class="season-close-tail">{{currentPage.seasonCloseTail}}</text>
</view>
</scroll-view>
</view>
<view class="memory-actions season-close-actions">
<button
class="memory-action-cell secondary {{comicPreviousDisabled ? 'is-disabled' : ''}}"
bindtap="previousComicPage"
aria-label="返回前一页"
aria-disabled="{{comicPreviousDisabled}}"
>
<text class="memory-action-visible">上页</text>
</button>
<button
class="memory-action-cell report"
bindtap="openLifeReport"
aria-label="查看本回桂香生活观察"
>
<text class="memory-action-visible">生活观察</text>
</button>
<button
class="memory-action-cell share"
open-type="share"
aria-label="发给家人,一起聊聊这一页"
>
<text class="memory-action-visible">发给家人</text>
</button>
<button
class="memory-action-cell primary"
bindtap="goCatalog"
aria-label="第一季读完,回到目录"
>
<text class="memory-action-visible">回到目录</text>
</button>
</view>
</view>
</block>
<block wx:elif="{{currentPage.type === 'memory'}}">
<view class="comic-special-page memory-page template-{{currentPage.templateKey}} layout-{{currentPage.layoutVariant}} {{currentPage.pageId === 'S01-C09-P08' ? 'c09-p08' : ''}}">
<view class="memory-art">
<image
wx:if="{{comicImageSrc}}"
class="memory-art-image"
src="{{comicImageSrc}}"
mode="aspectFit"
bindload="onComicImageLoad"
binderror="onComicImageError"
></image>
<view wx:else class="special-art-fallback">
<text>{{comicImageError}}</text>
<text>{{currentPage.sceneAlt}}</text>
</view>
<view class="comic-paper-grain"></view>
</view>
<view class="memory-panel">
<scroll-view class="memory-paper {{currentPage.pageId === 'S01-C09-P08' ? 'is-complete' : ''}}" scroll-y="{{currentPage.pageId !== 'S01-C09-P08'}}" enhanced show-scrollbar="{{currentPage.pageId !== 'S01-C09-P08'}}">
<view class="memory-paper-content">
<view class="memory-cliffhanger-copy"><text class="memory-ending-label">下一回的门缝</text><text>{{currentPage.caption}}</text></view>
<view class="memory-card-sheet"><text class="memory-stamp">桂香记忆卡</text>
<text class="memory-era">{{currentPage.memoryCard.eraLine}}</text><text class="memory-person">{{currentPage.memoryCard.characterName}}</text>
<view wx:if="{{currentPage.pageId === 'S01-C09-P08'}}" class="memory-short-lines">
<text wx:for="{{currentPage.memoryCard.displayLines}}" wx:key="*this" class="memory-short-line">{{item}}</text>
</view>
<block wx:else>
<text class="memory-quote">{{currentPage.memoryCard.tableEcho}}</text>
<view class="memory-action"><text class="memory-label">今天可以这样做</text><text>{{currentPage.memoryCard.lifeAction}}</text></view>
<button class="memory-family-toggle" bindtap="toggleMemoryFamily" aria-label="打开带回家聊一聊">
{{memoryFamilyOpen ? '收起这一句' : '带回家聊一聊'}}
</button>
<view wx:if="{{memoryFamilyOpen}}" class="memory-family"><text class="memory-label">带回家聊一聊</text><text>“{{currentPage.memoryCard.familyLine}}”</text></view>
</block>
</view>
</view>
</scroll-view>
<view class="memory-actions">
<button
class="memory-action-cell secondary {{comicPreviousDisabled ? 'is-disabled' : ''}}"
bindtap="previousComicPage"
aria-label="返回前一页"
aria-disabled="{{comicPreviousDisabled}}"
>
<text class="memory-action-visible">上页</text>
</button>
<button
class="memory-action-cell report"
bindtap="openLifeReport"
aria-label="查看本回桂香生活观察"
>
<text class="memory-action-visible">生活观察</text>
</button>
<button
class="memory-action-cell share"
open-type="share"
aria-label="发给家人,一起聊聊这一页"
>
<text class="memory-action-visible">发给家人</text>
</button>
<button
wx:if="{{chapterNumber >= chapterCount}}"
class="memory-action-cell primary"
bindtap="goCatalog"
aria-label="全书读完,回到目录"
>
<text class="memory-action-visible">回到目录</text>
</button>
<button
wx:else
class="memory-action-cell primary"
bindtap="nextChapter"
aria-label="翻到下一回"
>
<text class="memory-action-visible">翻到下一回</text>
</button>
</view>
</view>
</view>
</block>
<block wx:else>
<view
class="comic-normal-page template-{{currentPage.templateKey}} layout-{{currentPage.layoutVariant}}"
bindtouchstart="onComicTouchStart"
bindtouchend="onComicTouchEnd"
>
<view class="comic-art-column">
<view class="comic-art-stage" style="{{comicArtStageStyle}}">
<image
wx:if="{{comicImageSrc}}"
class="comic-art-image"
src="{{comicImageSrc}}"
mode="{{comicPageImageMode}}"
style="{{comicPageImageStyle}}"
bindload="onComicImageLoad"
binderror="onComicImageError"
></image>
<view wx:else class="comic-art-fallback">
<text>{{comicImageError}}</text>
<text>{{currentPage.sceneAlt}}</text>
</view>
<view class="comic-paper-grain"></view>
<view
wx:if="{{currentPage.playableVisual.kind === 'evidence-composite'}}"
class="comic-evidence-composite"
aria-label="{{currentPage.playableVisual.subject}}的手边证据"
>
<text class="comic-evidence-kicker">手边证据</text>
<text class="comic-evidence-label">{{currentPage.playableVisual.evidenceLabel}}</text>
<text class="comic-evidence-detail">{{currentPage.playableVisual.evidenceDetail}}</text>
</view>
<button
wx:if="{{currentInteractionEnabled && !comicImageUsingFallback}}"
class="comic-actor-hotspot is-quiet"
style="{{currentPage.actorHotspot.style}}"
bindtap="openComicActor"
aria-label="看看{{currentPage.actorName}}的手边,了解这一页发生了什么"
></button>
</view>
</view>
<view class="comic-caption-strip {{currentInteractionEnabled && compactHeight ? 'has-outside-actor-guide' : ''}}">
<scroll-view class="comic-caption-copy" scroll-y enhanced show-scrollbar="{{false}}">
<view wx:if="{{currentPage.type === 'cover'}}" class="comic-cover-caption-layout">
<view class="comic-cover-caption-heading">
<text class="comic-caption-kicker">{{chapter.year}}</text>
<text class="comic-caption-heading">{{currentPage.headline}}</text>
</view>
<text class="comic-caption comic-cover-caption-text">{{currentPage.displayCaption}}</text>
</view>
<view wx:elif="{{currentPage.type === 'ensemble'}}" class="comic-ensemble-caption-layout">
<text class="comic-caption-heading">{{currentPage.headline}}</text>
<view class="comic-ensemble-caption-copy">
<text class="comic-caption">{{currentPage.displayCaption}}</text>
<text wx:if="{{currentPage.secondaryCaption}}" class="comic-secondary-caption">{{currentPage.secondaryCaption}}</text>
</view>
</view>
<view wx:elif="{{currentPage.type === 'event'}}" class="comic-event-caption-layout {{currentEventCompleted ? 'is-completed' : ''}}">
<view class="comic-event-caption-copy">
<text class="comic-caption">{{currentPage.displayCaption}}</text>
<text wx:if="{{currentPage.secondaryCaption}}" class="comic-secondary-caption">{{currentPage.secondaryCaption}}</text>
</view>
<view class="comic-event-cue">
<text
wx:if="{{currentInteractionEnabled && !compactHeight && currentPage.artTapHint}}"
class="comic-art-tap-note"
>再看看{{currentPage.actorName}}的手边</text>
<button
wx:if="{{currentInteractionEnabled && !compactHeight}}"
class="comic-outside-actor-button"
bindtap="openComicActor"
aria-label="{{currentPage.playableVisual.kind === 'evidence-composite' ? '看看桌上的东西' : (currentPage.playableVisual.kind === 'actor-portrait' ? '看看' + currentPage.actorName + '的手边' : '看看发生了什么')}}"
>
<text wx:if="{{currentPage.playableVisual.kind === 'evidence-composite'}}">看看桌上的东西</text>
<text wx:elif="{{currentPage.artTapHint}}">再看看{{currentPage.actorName}}的手边</text>
<text wx:elif="{{currentPage.playableVisual.kind === 'actor-portrait'}}">看看{{currentPage.actorName}}的手边</text>
<text wx:else>看看发生了什么</text>
</button>
<view wx:elif="{{currentEventCompleted}}" class="comic-seen-row">
<text class="seen-chip">看见了</text>
<text class="comic-tap-prompt is-seen">可以翻到下一页。</text>
</view>
</view>
</view>
</scroll-view>
<view
wx:if="{{currentInteractionEnabled && compactHeight}}"
class="comic-outside-action-dock {{currentPage.artTapHint ? 'has-art-tap-note' : ''}}"
>
<text
wx:if="{{currentPage.artTapHint}}"
class="comic-art-tap-note"
>再看看{{currentPage.actorName}}的手边</text>
<button
class="comic-outside-actor-button comic-outside-actor-dock"
bindtap="openComicActor"
aria-label="{{currentPage.playableVisual.kind === 'evidence-composite' ? '看看桌上的东西' : (currentPage.playableVisual.kind === 'actor-portrait' ? '看看' + currentPage.actorName + '的手边' : '看看发生了什么')}}"
>
<text wx:if="{{currentPage.playableVisual.kind === 'evidence-composite'}}">看看桌上的东西</text>
<text wx:elif="{{currentPage.artTapHint}}">再看看{{currentPage.actorName}}的手边</text>
<text wx:elif="{{currentPage.playableVisual.kind === 'actor-portrait'}}">看看{{currentPage.actorName}}的手边</text>
<text wx:else>看看发生了什么</text>
</button>
</view>
<view class="comic-page-nav">
<button
class="page-turn-button {{comicPreviousDisabled ? 'is-disabled' : ''}}"
bindtap="previousComicPage"
aria-label="上一页"
aria-disabled="{{comicPreviousDisabled}}"
>
<text class="comic-control-visible">上页</text>
</button>
<text wx:if="{{!compactHeight}}" class="folio">{{currentPageNumber}}/{{comicPageCount}}</text>
<button
class="page-turn-button next {{comicNextLocked ? 'is-locked' : ''}} {{comicNextDisabled ? 'is-disabled' : ''}}"
bindtap="nextComicPage"
aria-label="{{comicNextLocked ? '先看看这一页的画面' : '下一页'}}"
aria-disabled="{{comicNextLocked || comicNextDisabled}}"
>
<text class="comic-control-visible">
{{comicNextLocked ? (currentPage.playableVisual.kind === 'evidence-composite' ? '看看桌上' : '看看画面') : '下页'}}
</text>
</button>
</view>
</view>
</view>
</block>
</view>
<view wx:if="{{textReadingOpen}}" class="dialog-backdrop text-reading-backdrop">
<view
class="text-reading-dialog paper-panel"
aria-role="dialog"
aria-label="本页大字文字"
>
<button
class="dialog-close"
bindtap="closeTextReading"
aria-label="关闭文字阅读"
>×</button>
<text class="text-reading-kicker">
第{{chapterNumber < 10 ? '0' + chapterNumber : chapterNumber}}回 · 第{{currentPageNumber}}页
</text>
<scroll-view
class="text-reading-scroll"
scroll-y
enhanced
show-scrollbar="{{true}}"
>
<view class="text-reading-sheet">
<text wx:if="{{currentPage.headline}}" class="text-reading-title">{{currentPage.headline}}</text>
<text wx:if="{{currentPage.displayCaption}}" class="text-reading-body">{{currentPage.displayCaption}}</text>
<text wx:elif="{{currentPage.caption}}" class="text-reading-body">{{currentPage.caption}}</text>
<text wx:if="{{currentPage.secondaryCaption}}" class="text-reading-secondary">{{currentPage.secondaryCaption}}</text>
<view wx:if="{{currentPage.prompt}}" class="text-reading-prompt">
<text class="text-reading-label">这一页想和您聊</text>
<text>{{currentPage.prompt}}</text>
</view>
<view wx:if="{{currentPage.question}}" class="text-reading-prompt">
<text class="text-reading-label">看看画里发生了什么</text>
<text>{{currentPage.question}}</text>
</view>
</view>
</scroll-view>
<button
class="text-reading-return"
bindtap="closeTextReading"
aria-label="回到连环画"
>回到画里</button>
</view>
</view>
<view wx:if="{{decisionOpen && storyFirstComicMode}}" class="c1-decision-layer">
<view wx:if="{{resultMode === ''}}" class="c1-interaction-paper">
<view class="c1-interaction-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-interaction-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">画里的线索</text>
</view>
<view class="c1-interaction-panel">
<button class="c1-tray-close" bindtap="closeDecision" aria-label="收起选择,先回画面">先看画</button>
<view class="c1-tray-heading">
<text class="c1-tray-kicker">碰上这事,您怎么做?</text>
<text class="c1-tray-question">{{activeEvent.question}}</text>
</view>
<view class="c1-choice-stack">
<button
wx:for="{{activeEvent.choiceOptions}}"
wx:key="value"
class="c1-natural-choice"
data-value="{{item.value}}"
bindtap="answer"
>{{item.label}}</button>
</view>
</view>
</view>
<view wx:elif="{{resultMode === 'retry'}}" class="c1-interaction-paper">
<view class="c1-interaction-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-interaction-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">再看看画里</text>
</view>
<view class="c1-interaction-panel c1-retry-panel">
<button class="c1-tray-close" bindtap="closeDecision" aria-label="回到画里">先看画</button>
<text class="c1-retry-title">别着急,再瞧瞧画里。</text>
<text class="c1-retry-copy">{{activeEvent.retryHint}}</text>
<button class="c1-retry-button" bindtap="retryAnswer">再看一眼</button>
</view>
</view>
<view wx:else class="c1-back-paper c1-event-result-back">
<view class="c1-back-evidence">
<image
wx:if="{{comicImageSrc}}"
class="c1-back-image"
src="{{comicImageSrc}}"
mode="aspectFit"
></image>
<view wx:else class="c1-back-image-fallback">{{currentPage.sceneAlt}}</view>
<text class="c1-back-stamp">这下有眉目了</text>
</view>
<scroll-view class="c1-back-copy" scroll-y enhanced show-scrollbar="{{true}}">
<view class="c1-back-copy-inner">
<text class="c1-back-kicker">{{activeEvent.actorName}} · 这一页背面</text>
<text class="c1-back-title">{{currentPage.headline}}</text>
<text class="c1-back-body">{{activeEvent.actionDescription}}</text>
<view wx:if="{{activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="c1-back-action">
<text class="c1-back-label">先把眼前这一步做好</text>
<text>先停酒、移开危险物,并留下人陪伴。</text>
</view>
<text wx:if="{{activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="c1-back-reason">这些表现不能仅凭外观确定原因,先保证安全。</text>
<block wx:else>
<view class="c1-back-callout">
<text class="c1-back-label">您刚才瞧见的</text>
<text>{{activeEvent.evidence}}</text>
</view>
<text class="c1-back-reason">{{activeEvent.reason}}</text>
<view class="c1-back-action">
<text class="c1-back-label">下回遇到这事</text>
<text>{{activeEvent.actionAdvice}}</text>
</view>
</block>
</view>
</scroll-view>
<text class="c1-scroll-hint">上划接着看 ↑</text>
<view class="c1-back-footer">
<button
wx:if="{{!(activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen)}}"
class="c1-back-button secondary"
aria-label="回头再看一遍画面"
bindtap="returnFromChapterOneDecision"
>回去看画</button>
<button wx:if="{{activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="c1-back-button primary" bindtap="openResultDetail">再看不同情况怎么办</button>
<button wx:else class="c1-back-button primary" bindtap="nextFromChapterOneDecision">翻下一张</button>
</view>
</view>
</view>
<view wx:elif="{{decisionOpen}}" class="dialog-backdrop">
<view
class="decision-dialog paper-panel comic-decision"
aria-role="dialog"
aria-label="{{activeEvent.actorName}}这一幕的互动选择"
>
<button
wx:if="{{!(resultMode === 'correct' && activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen)}}"
class="dialog-close"
bindtap="closeDecision"
aria-label="回到画里"
>×</button>
<scroll-view class="character-story" scroll-y enhanced show-scrollbar="{{true}}">
<view class="character-story-inner">
<view class="comic-focus-visual">
<image
wx:if="{{comicImageSrc}}"
class="comic-focus-scene"
src="{{comicImageSrc}}"
mode="aspectFit"
style="{{comicFocusImageStyle}}"
></image>
<view class="comic-focus-shade"></view>
<view class="comic-focus-name">
<text>{{activePerson.eraLabel}} · 画中人物</text>
<text class="focus-name">{{activeEvent.actorName}}</text>
</view>
</view>
<text class="story-label">这一幕发生了什么</text>
<text class="action-description">{{activeEvent.actionDescription}}</text>
<view class="evidence-box">
<text class="story-label">手边证据</text>
<text>{{activeEvent.evidence}}</text>
</view>
<view class="speech-box">
<text class="story-label">桌边说话</text>
<text>{{activeEvent.speech}}</text>
</view>
</view>
</scroll-view>
<view class="judgement-side {{resultMode === '' ? 'is-choice' : 'has-result'}}">
<scroll-view
class="judgement-scroll"
scroll-y
enhanced
show-scrollbar="{{decisionResultNeedsScroll}}"
>
<view class="judgement-scroll-inner {{resultMode === '' ? 'is-choice' : 'is-result'}}">
<text class="judgement-lead">故事走到这里,您想怎么做?</text>
<text wx:if="{{resultMode === ''}}" class="judgement-question">{{activeEvent.question}}</text>
<view wx:if="{{resultMode === ''}}" class="judgement-options">
<button class="judgement-button observe" data-value="caution" bindtap="answer">
<text class="judgement-icon">A</text>
<view class="judgement-button-copy">
<text class="judgement-title">先看看现场细节</text>
</view>
</button>
<button class="judgement-button continue" data-value="safer" bindtap="answer">
<text class="judgement-icon">B</text>
<view class="judgement-button-copy">
<text class="judgement-title">继续按画里的做法</text>
</view>
</button>
</view>
<view wx:if="{{resultMode === 'retry'}}" class="result-box retry">
<text class="result-title">没关系,再看看画里的细节。</text>
<text>{{activeEvent.retryHint}}</text>
</view>
<view wx:if="{{resultMode === 'correct'}}" class="result-box correct" aria-live="polite">
<text class="result-title">这处线索对上了。</text>
<view wx:if="{{activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="action-advice">
<text class="advice-label">先把眼前这一步做好</text>
<text>先停酒、移开危险物,并留下人陪伴。</text>
</view>
<text wx:if="{{activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="reason">这些表现不能仅凭外观确定原因,先保证安全。</text>
<view wx:else class="action-advice">
<text class="advice-label">现在可以怎么做</text>
<text>{{activeEvent.actionAdvice}}</text>
</view>
<text wx:if="{{activeEvent.hotspotId !== 'S01-H36' || resultDetailOpen}}" class="reason">{{activeEvent.reason}}</text>
</view>
</view>
</scroll-view>
<view wx:if="{{resultMode === 'retry'}}" class="decision-footer">
<button class="decision-footer-button retry" bindtap="retryAnswer">再看一眼现场</button>
</view>
<view wx:if="{{resultMode === 'correct' && activeEvent.hotspotId === 'S01-H36' && !resultDetailOpen}}" class="decision-footer">
<button class="decision-footer-button primary" bindtap="openResultDetail">
再看不同情况怎么办
</button>
</view>
<view wx:elif="{{resultMode === 'correct'}}" class="decision-footer">
<button class="decision-footer-button primary" bindtap="continueAfterDecision">
回到画里
</button>
</view>
</view>
</view>
</view>
</view>