# 展播模式优化设计文档

> **文档版本：** v1.0
> **创建日期：** 2026-03-11
> **目标：** 将授课内容以儿童友好的方式展示，方便儿童直接观看

---

## 📋 目录

1. [设计目标](#1-设计目标)
2. [视觉风格设计](#2-视觉风格设计)
3. [资源陈列优化](#3-资源陈列优化)
4. [播放体验设计](#4-播放体验设计)
5. [互动元素设计](#5-互动元素设计)
6. [导航控制设计](#6-导航控制设计)
7. [响应式设计](#7-响应式设计)
8. [技术实现](#8-技术实现)
9. [设计规范](#9-设计规范)

---

## 1. 设计目标

### 1.1 核心目标

| 目标 | 说明 |
|------|------|
| **儿童友好** | 界面色彩活泼、操作简单、视觉清晰 |
| **资源陈列** | 三类课程的数字资源美观展示、易于选择 |
| **播放体验** | 资源播放流畅、控制方便、观赏舒适 |
| **互动趣味** | 加入动画、音效、奖励机制，增强参与感 |

### 1.2 使用场景

| 场景 | 设备 | 观看距离 | 特点 |
|------|------|----------|------|
| 课堂投屏 | 智能屏/投影仪 | 2-5米 | 大屏显示、多人观看 |
| 一对一教学 | 平板 | 0.5-1米 | 触摸操作、近距离观看 |
| 家庭学习 | TV/平板 | 1-3米 | 家庭环境、家长陪同 |

### 1.3 用户特点

- **年龄范围**：3-6岁幼儿
- **认知特点**：视觉主导、注意力易分散、喜爱动画和鲜艳色彩
- **操作能力**：大动作协调，精细动作发展中

---

## 2. 视觉风格设计

### 2.1 配色方案

```
┌─────────────────────────────────────────────────────────────┐
│ 主色系统                                                    │
├─────────────────────────────────────────────────────────────┤
│ 主色：温暖橙   #FF8C42 (RGB: 255, 140, 66)                    │
│ 辅助色：                                                      │
│   - 天空蓝   #74B9FF (RGB: 116, 185, 255)                   │
│   - 薄荷绿   #00D9A5 (RGB: 0, 217, 165)                     │
│   - 珊瑚粉   #FF7675 (RGB: 255, 118, 117)                   │
│   - 柠檬黄   #FFD93D (RGB: 255, 217, 61)                    │
│                                                             │
│ 中性色：                                                      │
│   - 背景浅   #FFF9F0 (RGB: 255, 249, 240)                   │
│   - 背景深   #FFF4E6 (RGB: 255, 244, 230)                   │
│   - 文字主   #2D3436 (RGB: 45, 52, 54)                      │
│   - 文字辅   #636E72 (RGB: 99, 110, 114)                     │
│                                                             │
│ 功能色：                                                      │
│   - 成功     #52C41A (RGB: 82, 196, 26)                    │
│   - 警告     #FFA940 (RGB: 255, 169, 64)                   │
│   - 错误     #FF4D4F (RGB: 255, 77, 79)                     │
└─────────────────────────────────────────────────────────────┘
```

### 2.2 背景设计

#### 2.2.1 渐变背景

```
主背景：从顶部到底部的柔和渐变
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  顶部：#FFE8D6 (温暖桃色)
    ↓
  中部：#FFF9F0 (奶油色)
    ↓
  底部：#F0F9FF (淡蓝色)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

#### 2.2.2 装饰元素

**选项A：云朵装饰**
```
位置：顶部和底部随机分布
大小：80-120px
透明度：60%
动画：缓慢飘动（20秒循环）
```

**选项B：星星装饰**
```
位置：背景随机分布
大小：20-40px
颜色：柠檬黄 #FFD93D
动画：闪烁效果（3秒循环）
```

**选项C：几何图形**
```
元素：圆形、三角形、正方形
颜色：辅助色（半透明）
分布：背景点缀
动画：缓慢旋转
```

### 2.3 字体设计

| 用途 | 字号 | 字重 | 行高 | 说明 |
|------|------|------|------|------|
| 主标题 | 32-40px | 600 | 1.2 | 课程/环节名称 |
| 正文 | 18-22px | 400 | 1.5 | 内容说明 |
| 按钮 | 16-18px | 500 | - | 操作按钮 |

### 2.4 圆角设计

```scss
// 统一圆角规范
$radius-sm: 12px;   // 小卡片、按钮
$radius-md: 16px;   // 中等卡片
$radius-lg: 24px;   // 大卡片
$radius-xl: 32px;   // 容器
```

---

## 3. 资源陈列优化

### 3.1 整体布局结构

```
┌──────────────────────────────────────────────────────────────────┐
│  展播模式主界面                                                 │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                        主内容区                           │ │
│  │  ┌─────────────────────────────────────────────────────┐  │ │
│  │  │                                                 │  │ │
│  │  │           资源播放区（大屏显示）                   │  │ │
│  │  │                                                 │  │ │
│  │  │                                                 │  │ │
│  │  └─────────────────────────────────────────────────────┘  │ │
│  └────────────────────────────────────────────────────────────┘  │
│                                                                  │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │                     底部导航栏                            │  │
│  │  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐           │  │
│  │  │ 环节   │ │ 资源   │ │ 进度   │ │ 延伸   │           │  │
│  │  │ 导航   │ │ 快速   │ │ 显示   │ │ 活动   │           │  │
│  │  └────────┘ └────────┘ └────────┘ └────────┘           │  │
│  └────────────────────────────────────────────────────────────┘  │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘
```

### 3.2 课程级资源展示区

**位置：** 主内容区顶部（自动收起）

```vue
<!-- 课程资源横幅 -->
<div class="course-resources-banner" v-if="showCourseResources">
  <div class="resource-cards">
    <!-- 视频资源 -->
    <div v-if="courseVideos.length" class="resource-card video-card">
      <div class="card-icon">🎬</div>
      <div class="card-info">
        <span class="card-title">课程视频</span>
        <span class="card-count">{{ courseVideos.length }}个</span>
      </div>
      <button class="play-btn" @click="playCourseVideo">
        <PlayIcon /> 播放
      </button>
    </div>

    <!-- PPT资源 -->
    <div v-if="coursePpts.length" class="resource-card ppt-card">
      <div class="card-icon">📊</div>
      <div class="card-info">
        <span class="card-title">教学课件</span>
        <span class="card-count">{{ coursePpts.length }}个</span>
      </div>
      <button class="play-btn" @click="showCoursePpts">
        <ViewIcon /> 预览
      </button>
    </div>

    <!-- 文档资源 -->
    <div v-if="courseDocs.length" class="resource-card doc-card">
      <div class="card-icon">📄</div>
      <div class="card-info">
        <span class="card-title">教学文档</span>
        <span class="card-count">{{ courseDocs.length }}个</span>
      </div>
      <button class="play-btn" @click="showCourseDocs">
        <ReadIcon /> 查看
      </button>
    </div>
  </div>
</div>
```

**样式规范：**
```scss
.course-resources-banner {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  padding: 16px 24px;
  background: linear-gradient(180deg, #FFF9F0 0%, rgba(255, 249, 240, 0) 100%);
  display: flex;
  justify-content: center;
  animation: slideDown 0.3s ease;

  .resource-cards {
    display: flex;
    gap: 16px;
  }

  .resource-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 24px;
    background: white;
    border-radius: 24px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);

    .card-icon {
      width: 48px;
      height: 48px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 28px;
      background: #FFF4E6;
      border-radius: 12px;
    }

    .play-btn {
      padding: 10px 20px;
      border-radius: 20px;
      background: linear-gradient(135deg, #FF8C42, #E67635);
      color: white;
      font-size: 16px;
      font-weight: 500;
      border: none;
      cursor: pointer;
      transition: transform 0.2s;

      &:hover {
        transform: scale(1.05);
      }
    }
  }
}
```

### 3.3 环节资源卡片

**设计：** 横向滚动的卡片式布局

```
┌────────────────────────────────────────────────────────────┐
│ 教学环节                                                   │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐           │
│ │ 1️⃣ 导入 │ │ 2️⃣ 共读 │ │ 3️⃣ 讨论 │ │ 4️⃣ 活动 │           │
│ │         │ │         │ │         │ │         │           │
│ │ [资源]  │ │ [资源]  │ │ [资源]  │ │ [资源]  │           │
│ │ [资源]  │ │ [资源]  │ │         │ │ [资源]  │           │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘           │
│     ⭐         ⭐         ⭐         ⬜                    │
└────────────────────────────────────────────────────────────┘
```

**实现规范：**

```vue
<!-- 环节资源卡片 -->
<div class="step-resources-section">
  <div class="section-title">
    <span class="title-text">教学环节</span>
    <span class="title-badge">{{ currentStepIndex + 1 }}/{{ steps.length }}</span>
  </div>

  <div class="step-cards-container">
    <div
      v-for="(step, index) in steps"
      :key="step.id"
      class="step-card"
      :class="{
        active: currentStepIndex === index,
        completed: index < currentStepIndex
      }"
      @click="selectStep(index)"
    >
      <!-- 环节头部 -->
      <div class="step-header">
        <div class="step-number">{{ index + 1 }}</div>
        <div class="step-info">
          <div class="step-name">{{ step.name }}</div>
          <div class="step-duration">{{ step.duration }}分钟</div>
        </div>
        <div class="step-status">
          <StarIcon v-if="index < currentStepIndex" class="completed-star" />
        </div>
      </div>

      <!-- 环节资源 -->
      <div class="step-resources">
        <!-- 图片资源 -->
        <div
          v-for="(img, idx) in step.images.slice(0, 2)"
          :key="`img-${idx}`"
          class="resource-thumb image-thumb"
          @click.stop="showResource('image', img)"
        >
          <img :src="getResourceUrl(img.path)" :alt="img.name" />
        </div>

        <!-- 视频资源 -->
        <div
          v-if="step.videos.length > 0"
          class="resource-thumb video-thumb"
          @click.stop="showResource('video', step.videos[0])"
        >
          <div class="thumb-icon">🎬</div>
          <span class="thumb-label">视频</span>
        </div>

        <!-- 音频资源 -->
        <div
          v-if="step.audioList.length > 0"
          class="resource-thumb audio-thumb"
          @click.stop="showResource('audio', step.audioList[0])"
        >
          <div class="thumb-icon">🎵</div>
          <span class="thumb-label">音频</span>
        </div>

        <!-- 更多资源提示 -->
        <div
          v-if="getStepResourceCount(step) > 3"
          class="resource-thumb more-thumb"
          @click.stop="showResourceList(step)"
        >
          <div class="thumb-icon">➕</div>
          <span class="thumb-label">{{ getStepResourceCount(step) - 2 }}+</span>
        </div>
      </div>
    </div>
  </div>
</div>
```

**样式规范：**
```scss
.step-cards-container {
  display: flex;
  gap: 20px;
  overflow-x: auto;
  padding: 8px 4px;
  scroll-snap-type: x mandatory;

  &::-webkit-scrollbar {
    height: 8px;
  }

  &::-webkit-scrollbar-track {
    background: rgba(0, 0, 0, 0.05);
    border-radius: 4px;
  }

  &::-webkit-scrollbar-thumb {
    background: rgba(255, 140, 66, 0.3);
    border-radius: 4px;

    &:hover {
      background: rgba(255, 140, 66, 0.5);
    }
  }
}

.step-card {
  flex: 0 0 280px;
  scroll-snap-align: start;
  background: white;
  border-radius: 20px;
  padding: 16px;
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08);
  cursor: pointer;
  transition: all 0.3s ease;
  border: 3px solid transparent;

  &:hover {
    transform: translateY(-4px);
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
  }

  &.active {
    border-color: #FF8C42;
    background: linear-gradient(135deg, #FFF9F0 0%, #FFF4E6 100%);
  }

  &.completed {
    opacity: 0.7;

    .completed-star {
      color: #FFD93D;
      font-size: 24px;
      animation: starPop 0.5s ease;
    }
  }

  .step-header {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 12px;

    .step-number {
      width: 40px;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      background: linear-gradient(135deg, #FF8C42, #E67635);
      color: white;
      border-radius: 12px;
      font-size: 18px;
      font-weight: 600;
    }

    .step-info {
      flex: 1;

      .step-name {
        font-size: 18px;
        font-weight: 600;
        color: #2D3436;
        margin-bottom: 2px;
      }

      .step-duration {
        font-size: 13px;
        color: #636E72;
      }
    }
  }

  .step-resources {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
  }

  .resource-thumb {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    padding: 8px 12px;
    border-radius: 12px;
    background: #F8F8F8;
    cursor: pointer;
    transition: all 0.2s;

    &:hover {
      background: #FFE8D6;
      transform: scale(1.05);
    }

    .thumb-icon {
      font-size: 24px;
    }

    .thumb-label {
      font-size: 11px;
      color: #636E72;
    }

    &.image-thumb {
      img {
        width: 60px;
        height: 60px;
        object-fit: cover;
        border-radius: 8px;
      }
    }
  }
}
```

---

## 4. 播放体验设计

### 4.1 主内容区布局

```
┌──────────────────────────────────────────────────────────────┐
│                                                                  │
│                    ┌─────────────────┐                        │
│                    │                 │                        │
│                    │   资源播放区     │                        │
│                    │                 │                        │
│                    │   (视频/绘本)    │                        │
│                    │                 │                        │
│                    │                 │                        │
│                    └─────────────────┘                        │
│                                                                  │
│                          ←  [ 1/5  ]  →                        │
│                                                                  │
└──────────────────────────────────────────────────────────────┘
```

### 4.2 视频播放器设计

**自定义播放器控件：**

```
┌──────────────────────────────────────────────────────────────┐
│                                                                  │
│  ┌───────────────────────────────────────────────────────┐   │
│  │                                                       │   │
│  │                   视频内容                            │   │
│  │                                                       │   │
│  └───────────────────────────────────────────────────────┘   │
│                                                                  │
│  ┌──────┐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┌──────┐   │
│  │ ⏮   │ ◐━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │ ⏸  │   │
│  └──────┘ 00:00 / 05:32                             └──────┘   │
│                                                                  │
│  [ 🔊 ] [ 🔍 ] [ ⛶ ]  [ 📺 ]  [ ⚙️ ]                      │
│                                                                  │
└──────────────────────────────────────────────────────────────┘
```

**按钮尺寸规范：**
- 播放/暂停：64x64px
- 音量：48x48px
- 全屏：48x48px
- 其他：40x40px

### 4.3 绘本阅读器设计

**翻页效果：**

```vue
<EbookViewer>
  <!-- 当前页面 -->
  <div class="ebook-page" :style="{ transform: pageTransform }">
    <img :src="currentPage.url" :alt="currentPage.name" />
  </div>

  <!-- 翻页控件 -->
  <div class="ebook-controls">
    <button class="nav-btn prev" @click="prevPage">
      <ChevronLeft :size="48" />
    </button>

    <!-- 页面指示器 -->
    <div class="page-indicator">
      <div
        v-for="(page, index) in pages"
        :key="index"
        class="page-dot"
        :class="{ active: currentPageIndex === index }"
      ></div>
    </div>

    <button class="nav-btn next" @click="nextPage">
      <ChevronRight :size="48" />
    </button>
  </div>

  <!-- 缩略图条带 -->
  <div class="thumbnail-strip">
    <div
      v-for="(page, index) in pages"
      :key="index"
      class="thumbnail"
      :class="{ active: currentPageIndex === index }"
      @click="jumpToPage(index)"
    >
      <img :src="page.thumbnail" />
      <span class="page-num">{{ index + 1 }}</span>
    </div>
  </div>
</EbookViewer>
```

**翻页动画：**
```scss
@keyframes pageTurn {
  0% {
    transform: rotateY(0deg);
    opacity: 1;
  }
  50% {
    transform: rotateY(-90deg);
    opacity: 0.5;
  }
  100% {
    transform: rotateY(0deg);
    opacity: 1;
  }
}

.ebook-page {
  animation: pageTurn 0.6s ease-in-out;
  transform-style: preserve-3d;
}
```

### 4.4 PPT/挂图查看器设计

**布局：**

```
┌──────────────────────────────────────────────────────────────┐
│  [X] 教学课件 - PPT1                                            │
│                                                                  │
│  ┌───────────────────────────────────────────────────────┐   │
│  │                                                           │   │
│  │                    PPT 页面                            │   │
│  │                                                           │   │
│  │                                                           │   │
│  │                                                           │   │
│  └───────────────────────────────────────────────────────┘   │
│                                                                  │
│  ┌─────┐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┌─────┐         │
│  │ ◀│  ●────────●────────────────────●  │ ▶ │         │
│  └─────┘  1 / 15                             └─────┘         │
│                                                                  │
│  [ 🔍 ] [ ⛶ ]  [ 📤 ]                                          │
└──────────────────────────────────────────────────────────────┘
```

**缩略图条带：**
```vue
<div class="slides-viewer">
  <!-- 缩略图条带 -->
  <div class="thumbnail-strip">
    <div
      v-for="(slide, index) in slides"
      :key="index"
      class="slide-thumbnail"
      :class="{ active: currentSlide === index }"
      @click="goToSlide(index)"
    >
      <img :src="slide.thumbnail" />
    </div>
  </div>
</div>
```

---

## 5. 互动元素设计

### 5.1 音效系统

**音效清单：**

| 交互 | 音效 | 音量 | 说明 |
|------|------|------|------|
| 环节切换 | 轻柔"嗖"声 | 50% | 过渡提示 |
| 资源点击 | "波"音 | 40% | 点击反馈 |
| 完成环节 | 鼓掌声 | 60% | 正向强化 |
| 全部完成 | 欢呼声 + 钟声 | 70% | 庆祝 |
| 错误操作 | 轻柔"唔"声 | 30% | 提示纠正 |

**实现方式：**
```typescript
// 音效管理类
class SoundEffectManager {
  private audioContext: AudioContext;

  playSound(soundName: string) {
    const sounds = {
      'stepChange': '/assets/sounds/whoosh.mp3',
      'click': '/assets/sounds/bloop.mp3',
      'complete': '/assets/sounds/applause.mp3',
      'celebrate': '/assets/sounds/celebrate.mp3',
      'error': '/assets/sounds/hmm.mp3',
    };

    const audio = new Audio(sounds[soundName]);
    audio.volume = this.getVolume(soundName);
    audio.play().catch(err => console.log('Sound play error:', err));
  }

  private getVolume(soundName: string): number {
    const volumes = {
      'stepChange': 0.5,
      'click': 0.4,
      'complete': 0.6,
      'celebrate': 0.7,
      'error': 0.3,
    };
    return volumes[soundName] || 0.5;
  }
}
```

### 5.2 动画效果

**环节切换动画：**
```scss
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.fade-enter-active {
  animation: fadeInUp 0.4s ease-out;
}
```

**资源卡片动画：**
```scss
@keyframes popIn {
  0% {
    transform: scale(0.8);
    opacity: 0;
  }
  50% {
    transform: scale(1.05);
  }
  100% {
    transform: scale(1);
    opacity: 1;
  }
}

.resource-card {
  animation: popIn 0.3s ease-out;
}
```

**星星收集动画：**
```scss
@keyframes starCollect {
  0% {
    transform: scale(0) rotate(0deg);
    opacity: 0;
  }
  50% {
    transform: scale(1.3) rotate(180deg);
  }
  100% {
    transform: scale(1) rotate(360deg);
    opacity: 1;
  }
}

.star-animation {
  animation: starCollect 0.6s ease-out;
}
```

**庆祝动画：**
```scss
@keyframes confetti {
  0% {
    transform: translateY(-100%) rotate(0deg);
    opacity: 1;
  }
  100% {
    transform: translateY(100vh) rotate(720deg);
    opacity: 0;
  }
}

.confetti-piece {
  position: fixed;
  width: 10px;
  height: 10px;
  animation: confetti 3s ease-out forwards;
}
```

### 5.3 奖励机制

**星星收集系统：**

```
完成环节 → 收集星星 → 全部完成 → 庆祝动画

┌──────────────────────────────────────────────────────────────┐
│  ★  ★  ★  ★  ★                                             │
│  已完成 4 个环节，继续加油！                                    │
└──────────────────────────────────────────────────────────────┘
```

**等级徽章：**
- 3颗星：铜牌学员 🥉
- 5颗星：银牌学员 🥈
- 7颗星：金牌学员 🥇
- 全部完成：超级小英雄 🦸‍♂️

**庆祝画面：**
```
┌──────────────────────────────────────────────────────────────┐
│                                                                  │
│                     🎉 太棒了！🎉                            │
│                                                                  │
│                  你完成了所有教学环节！                       │
│                                                                  │
│                     🏆 超级小英雄 🏆                            │
│                                                                  │
│              [ 再来一次 ] [ 返回首页 ]                         │
│                                                                  │
└──────────────────────────────────────────────────────────────┘
```

---

## 6. 导航控制设计

### 6.1 底部导航栏设计

**完整布局：**

```
┌──────────────────────────────────────────────────────────────┐
│  🎯 教学环节                                                 │
│  ┌────┐ ┌────┐ ┌────┐ ┌────┐                                      │
│  │ 1️⃣ │ │ 2️⃣ │ │ 3️⃣ │ │ 4️⃣ │ ...                                 │
│  │导入│ │共读│ │讨论│ │活动│                                      │
│  └────┘ └────┘ └────┘ └────┘                                      │
│    ⭐    ⭐    ⭐    ⬜                                         │
│                                                                  │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │  │
│                                                  1/4 环节     │  │
│                                              05:32          │  │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │  │
│                                                                  │
│  🎨 延伸活动 (可选)                                         │
│  ┌──────┐ ┌──────┐ ┌──────┐                                   │
│  │ 🎨  │ │ 🎮  │ │ 🎵  │                                   │
│  │美工│  │游戏│  │音乐│                                   │
│  └──────┘ └──────┘ └──────┘                                   │
│                                                                  │
│  [ ◀️ 上一环节 ]  [ ▶️ 下一环节 ]  [ ❌ 退出展播 ]              │
│                                                                  │
└──────────────────────────────────────────────────────────────┘
```

### 6.2 控制按钮规范

```scss
.ctrl-btn {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 28px;
  border-radius: 28px;
  background: rgba(255, 255, 255, 0.9);
  border: 2px solid rgba(0, 0, 0, 0.1);
  color: #2D3436;
  font-size: 16px;
  font-weight: 500;
  cursor: pointer;
  transition: all 0.2s;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);

  &:hover:not(:disabled) {
    background: white;
    transform: translateY(-2px);
    box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12);
  }

  &:active:not(:disabled) {
    transform: translateY(0);
  }

  &:disabled {
    opacity: 0.4;
    cursor: not-allowed;
  }

  // 主要按钮（下一环节）
  &.primary {
    background: linear-gradient(135deg, #FF8C42, #E67635);
    border: none;
    color: white;
    font-size: 18px;
    padding: 14px 32px;
    box-shadow: 0 6px 20px rgba(255, 140, 66, 0.3);

    &:hover:not(:disabled) {
      background: linear-gradient(135deg, #FF7A2A, #E67635);
      transform: translateY(-2px);
      box-shadow: 0 8px 24px rgba(255, 140, 66, 0.4);
    }
  }

  // 退出按钮
  &.exit {
    background: rgba(255, 77, 79, 0.1);
    border-color: rgba(255, 77, 79, 0.3);
    color: #ff4d4f;

    &:hover {
      background: rgba(255, 77, 79, 0.2);
    }
  }
}
```

### 6.3 快捷键设计

| 快捷键 | 功能 | 说明 |
|--------|------|------|
| ← / A | 上一环节 | 方便左右手操作 |
| → / D | 下一环节 | 方便左右手操作 |
| 空格 | 暂停/播放 | 大按钮，易操作 |
| ESC | 退出展播 | 紧急退出 |
| F11 | 全屏切换 | 沉浸式体验 |
| ↑ / ↓ | 音量调节 | 便于控制 |

---

## 7. 响应式设计

### 7.1 屏幕适配

```
┌─────────────────────────────────────────────────────────────┐
│ 屏幕类型        | 比例   | 设计重点                     │
├─────────────────────────────────────────────────────────────┤
│ 智能屏/投影仪   | 16:9   | 大屏显示、多人观看            │
│ 传统投影仪      | 4:3    | 居中显示、边缘裁剪            │
│ 平板横屏       | 16:9   | 触摸优化、手势支持            │
│ 平板竖屏       | 9:16   | 调整布局、上下滚动            │
└─────────────────────────────────────────────────────────────┘
```

### 7.2 断点规范

```scss
// 响应式断点
$breakpoint-sm: 768px;   // 平板
$breakpoint-md: 1024px;   // 小桌面
$breakpoint-lg: 1280px;   // 桌面
$breakpoint-xl: 1536px;   // 大屏

// 响应式 mixins
@mixin respond-to($breakpoint) {
  @media (min-width: $breakpoint) {
    @content;
  }
}

// 针对不同屏幕尺寸调整
.broadcast-view {
  @include respond-to($breakpoint-lg) {
    // 大屏：显示完整资源
    .resource-card {
      flex: 0 0 280px;
    }
  }

  @include respond-to($breakpoint-md) {
    // 中屏：缩小资源卡片
    .resource-card {
      flex: 0 0 240px;
    }
  }

  @include respond-to($breakpoint-sm) {
    // 小屏：横向滚动
    .resource-card {
      flex: 0 0 200px;
    }
  }
}
```

### 7.3 字体缩放

```scss
// 根据屏幕尺寸调整字体
html {
  font-size: 16px;

  @media (max-width: 768px) {
    font-size: 14px;
  }

  @media (min-width: 1536px) {
    font-size: 18px;
  }
}
```

---

## 8. 技术实现

### 8.1 组件结构

```
BroadcastView.vue (展播入口)
  ├─ KidsMode.vue (儿童友好界面)
  │   ├─ EbookViewer.vue (绘本阅读器)
  │   ├─ VideoPlayer.vue (视频播放器)
  │   ├─ AudioPlayer.vue (音频播放器)
  │   └─ SlidesViewer.vue (PPT/挂图查看器)
```

### 8.2 状态管理

```typescript
interface BroadcastState {
  // 课程数据
  course: Course | null;
  lessons: Lesson[];
  activities: Activity[];

  // 当前位置
  currentLessonIndex: number;
  currentStepIndex: number;

  // 资源状态
  currentResourceType: 'ebook' | 'video' | 'audio' | 'ppt' | 'poster' | '';
  currentResourceUrl: string;
  showingResource: Resource | null;

  // UI状态
  controlsVisible: boolean;
  activityModalVisible: boolean;

  // 进度
  progressPercent: number;
  timerSeconds: number;
}
```

### 8.3 资源处理

**资源URL处理：**
```typescript
const getFileUrl = (filePath: string): string => {
  if (!filePath) return '';
  if (filePath.startsWith('http://') || filePath.startsWith('https://')) {
    return filePath;
  }
  const SERVER_BASE = import.meta.env.VITE_SERVER_BASE_URL || 'http://localhost:3000';
  return `${SERVER_BASE}${filePath}`;
};
```

**资源类型图标映射：**
```typescript
const resourceIconMap: Record<string, Component> = {
  'image': PictureOutlined,
  'video': VideoCameraOutlined,
  'audio': AudioOutlined,
  'ppt': FilePptOutlined,
  'poster: FileImageOutlined,
  'ebook': BookOutlined,
};
```

### 8.4 动画库选择

推荐使用：
- **Vue Transition** - 内置过渡动画
- **Animate.css** - CSS动画库（可选）
- **Lottie** - JSON动画（高级）

---

## 9. 设计规范

### 9.1 间距规范

```scss
$spacing-xs: 4px;
$spacing-sm: 8px;
$spacing-md: 12px;
$spacing-lg: 16px;
$spacing-xl: 20px;
$spacing-xxl: 24px;
$spacing-xxxl: 32px;
```

### 9.2 阴影规范

```scss
// 卡片阴影
$shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06);
$shadow-md: 0 4px 16px rgba(0, 0, 0, 0.08);
$shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);

// 按钮阴影
$shadow-button: 0 4px 12px rgba(255, 140, 66, 0.3);
$shadow-button-hover: 0 6px 16px rgba(255, 140, 66, 0.4);
```

### 9.3 动画时长

```scss
$duration-fast: 0.2s;
$duration-normal: 0.3s;
$duration-slow: 0.5s;
$duration-slower: 0.8s;
```

### 9.4 Z-index 层级

```scss
$z-modal: 1000;
$z-dropdown: 1050;
$z-sticky: 1020;
$z-fixed: 1030;
$z-tooltip: 1060;
```

---

## 附录：三类课程特色展示

### A. 导入课

**主题图标：** 🔍 (放大镜)

**配色：** 温暖橙 #FF8C42

**特色元素：**
- 强调"认识"和"发现"
- 大图标、清晰指引
- 温馨鼓励语

### B. 集体课

**主题图标：** 📖 (打开的书)

**配色：** 天空蓝 #74B9FF

**特色元素：**
- 突出"共读"主题
- 绘本封面展示
- 互动问题提示

### C. 领域课

**配色方案：**
- 语言：📝 天空蓝 #74B9FF
- 健康：❤️ 珊瑚粉 #FF7675
- 科学：🔬 紫罗兰 #9B59B6
- 社会：👥 青色 #00D9A5
- 艺术：🎨 粉色 #FF7675

**特色元素：**
- 按领域区分的图标和配色
- 领域特定的教学目标
- 专业活动指导

---

## 总结

本设计文档提供了展播模式优化的完整方案，包括：

1. **儿童友好的视觉风格** - 温暖配色、圆润设计、活泼装饰
2. **美观的资源陈列** - 卡片式布局、清晰分类、易于选择
3. **流畅的播放体验** - 大按钮、自定义控件、动画过渡
4. **丰富的互动元素** - 音效反馈、动画效果、奖励机制
5. **简化的导航控制** - 大按钮、快捷键、儿童易操作

按照此设计实现，将为幼儿提供更加友好、有趣的展播体验！🎉

---

**下一步：**
1. 审阅设计文档，确认优化方向
2. 开始技术实现，按优先级逐步推进
3. 边实现边测试，收集用户反馈

*文档创建于 2026-03-11*
