# Mini Program Script Home Redesign Design

Date: 2026-05-18

Source requirement: `docs/0517-UI设计 更新.md`

## Goal

Implement the 0517 UI requirement iteration for the mini program: make `爽文生成` the primary home experience, keep `人生轨迹` behavior unchanged, and rebuild the script generation flow around the new `如愿星球` design.

The new core flow is:

1. User lands on the script-generation home page.
2. User speaks or types a wish.
3. The app shows a wish-realization/generation state.
4. The generated story appears as a readable script card.
5. User can adjust direction, mark the result as unlike them, play voice narration, view saved scripts, or continue to path mapping.

## Scope

### In Scope

- Change the mini program default main tab from `人生轨迹` to `爽文生成`.
- Reorder or restyle the main navigation so `爽文生成` is the first/home experience.
- Redesign `mini-program/src/pages/main/ScriptView.vue` according to the 0517 document.
- Preserve existing `人生轨迹` behavior and data.
- Preserve existing script generation APIs and store methods unless a frontend field mapping adjustment is needed.
- Connect the new result actions to existing capabilities where available:
  - `语音播放` should reuse the existing TTS/script reading capability.
  - `我的剧本` should navigate to the existing script library/list experience.
  - Existing script detail and path mapping should remain reachable.
- Add or update analytics events for the new funnel.

### Out Of Scope

- Redesigning the backend script generation algorithm.
- Rebuilding the whole `我的剧本` library unless required by navigation consistency.
- Changing the `人生轨迹` page behavior.
- Building a new full speech recognition backend service unless the mini program platform API cannot satisfy the first version.

## Product Requirements

### Design Review Decisions

This section captures the decisions from the first review pass so implementation does not drift.

- `爽文生成` becomes the default entry, but the old script list/detail/path capabilities are not removed.
- `ScriptView.vue` should become a single state-driven flow: `home -> generating -> result`. The old `mode = inspiration/custom/list` model should not remain as a parallel primary state machine.
- `我的剧本` should route users to the existing library experience instead of embedding a second full list inside the redesigned home page.
- Voice input is a primary visual interaction, but speech recognition is allowed to ship with a typed-input fallback if the WeChat runtime/plugin permission is not configured.
- `语音播放` should not duplicate two separate players. Prefer one visible `ScriptAudioPlayer` area; the button/action can scroll to it, expand it, or trigger its existing flow if the component exposes a method.
- Closing a generated result is a dismiss action, not deletion. Real delete remains in the script library/detail management surface.
- The implementation should fix visible mojibake in touched UI strings. Any changed user-facing Chinese string must be saved and verified as UTF-8.

### Navigation

Current main page order gives `人生轨迹` priority. This iteration changes the product entry priority:

- Default active tab: `script`.
- First visual/main tab: `爽文生成`.
- `人生轨迹` remains available and unchanged.
- `我的` / `我的剧本` entry remains available.

If bottom navigation labels or source files currently show mojibake text, fix the visible Chinese labels while touching this area.

### Script Home Page

The script page should become a wish-input home screen, not a form-heavy generator.

Required elements:

- Deep purple cosmic background.
- History entry near the top left or header area.
- Main title: `今天有什么心愿想实现`
- Highlight word: `心愿`
- Central glowing microphone planet/sphere.
- Primary prompt: `按住说话，即刻如愿`
- Bottom text input for typing a wish.
- `灵感一下` section.
- `换一换` action for refreshing inspiration cards.
- Recommendation cards that can fill the input when tapped.

The current custom-mode/form-first UI should be de-emphasized or moved behind a secondary entry. The first screen should match the 0517 visual and interaction direction.

### Voice Input

The design makes voice the primary action.

Minimum first version:

- Implement press-and-hold visual states:
  - idle
  - pressing/listening
  - recognizing/submitting
  - error or cancelled
- On release, trigger voice recognition if supported by the mini program runtime.
- If runtime speech recognition is not available in the current environment, keep a graceful fallback:
  - show a clear toast/modal,
  - keep typed input fully usable,
  - do not block script generation.

The recognized text should populate the wish input and allow the user to submit/generate.

Runtime decision:

- If a WeChat speech recognition plugin or API is already configured, wire press release to recognition and fill the returned text.
- If no speech runtime exists, press/release should show a polished unavailable state and keep text input/generation fully usable.
- Do not add a backend speech-to-text service in this iteration unless product explicitly expands scope.

### Generation State

After submission, the page should show a generation conversation/state view.

Required displayed states:

- User wish bubble, for example: `如果老板今天突然夸我`
- Time, for example: `15:11`
- System progress: `心愿实现中……`
- Completion message: `心愿已实现，故事已为你展开`

The existing API loading state can drive these UI states. The UI should avoid leaving users on a static loading button.

### Generated Result

Generated content should appear as a story/result card.

Required elements:

- Script title, for example: `《那个终于被看见的人》`
- Tags, for example: `职场逆袭`、`成长`、`被认可`
- Readable story body with comfortable line height.
- Top action that uses a close icon instead of visible `删除` text.
- Function actions:
  - `换个方向`
  - `不像我`
  - `语音播放`

Behavior expectations:

- `语音播放` uses the existing script TTS flow where possible.
- `换个方向` should trigger a regenerate/edit-direction flow. First version can reuse existing generation with the current wish plus an adjustment marker.
- `不像我` should collect feedback and optionally guide the user to revise the wish.
- Close icon should return to the input/home state or dismiss the result panel. It should not accidentally delete saved content.

Result data expectations:

- If the backend returns a script id, store it and use it for detail navigation, TTS, and path mapping.
- If the response shape only returns content, show the result card immediately and refresh the script list afterward.
- Tags can be derived from returned style/metadata first, then fall back to `爽文` / `成长` / `被看见`.
- Long content should be scrollable without pushing action buttons into unusable positions.

### My Scripts

The page header includes `我的剧本`.

Expected behavior:

- Navigate to the existing script library/list experience.
- Existing list operations such as detail view, favorite, delete, and path mapping should remain available.
- Avoid duplicating separate script-list implementations unless the current page structure forces it.

## Design System

The 0517 document defines a `如愿星球 Design Token v1`. Use it as the visual source of truth for this change.

### Core Colors

- Background: `#080219`, `#05010E`
- Primary purple: `#8B36DB`
- Accent purple: `#C084FC`
- Button purple: `#934DFF`
- Deep button purple: `#4D1CCB`
- Pink highlight: `#F1A0FF`
- Gold stars: `#FFD86B`
- Primary text: `#FFFFFF`
- Highlight text: `#D18AFF`
- Body text: `rgba(255,255,255,0.92)`
- Secondary text: `rgba(255,255,255,0.75)`
- Placeholder: `rgba(216,180,254,0.48)`

### Typography

- iOS: `PingFang SC`
- Android: `Noto Sans SC`
- Home title: around `38px` equivalent in rpx, bold, stable on mobile.
- Result title: around `30px` equivalent in rpx.
- Story body: readable, around `16px`, line height around `1.78`.

### Shape And Effects

- Input pill: large rounded shape, around `26px`.
- Inspiration card: around `18px`.
- Story card: around `26px`.
- Microphone button: circular, strong purple/pink glow.
- Use cosmic gradients, stars, and glow, but keep content legible and avoid overlap on small screens.

## Analytics Requirements

Update mini program analytics to reflect the new funnel:

- `script_home_view`
- `script_voice_press_start`
- `script_voice_press_end`
- `script_voice_recognize_success`
- `script_voice_recognize_fail`
- `script_wish_submit`
- `script_generation_progress_view`
- `script_generate_success`
- `script_generate_fail`
- `script_result_view`
- `script_result_change_direction_click`
- `script_result_not_like_me_click`
- `script_result_tts_click`
- `script_my_scripts_click`
- `script_inspiration_refresh`
- `script_inspiration_select`

Properties should include source (`voice`, `text`, `inspiration`), script style/length where available, prompt length, generation duration, and error reason when failed.

Required event timing:

- Fire `script_home_view` when `ScriptView` first becomes visible as the default tab.
- Fire `script_wish_submit` exactly once per user submission.
- Fire either `script_generate_success` or `script_generate_fail` for every accepted submission.
- Fire `script_result_view` only after a result card is actually rendered.
- Preserve existing `page_view` / `page_leave` events at the main tab level.

## Technical Impact

Likely touched areas:

- `mini-program/src/pages/main/index.vue`
  - default tab and navigation order
  - analytics page view properties
- `mini-program/src/pages/main/ScriptView.vue`
  - major UI/state rewrite
  - voice press interaction
  - generation state view
  - result card actions
- `mini-program/src/pages/main/ScriptDetailView.vue`
  - only if TTS entry or result display needs shared components
- `mini-program/src/pages/main/MineView.vue`
  - only if navigation into `我的剧本` needs alignment
- `mini-program/src/stores/app.js`
  - only if result actions need additional state helpers
- `mini-program/src/services/epicScript.js`
  - only if API mapping needs adjustment
- `mini-program/src/services/analytics.js`
  - event names/properties if helper methods are useful

## Implementation Plan

### Phase 1: Navigation And Home Shell

- Make `script` the default tab.
- Reorder bottom nav visually.
- Fix visible Chinese labels in touched template sections if mojibake is present.
- Add a first-pass `如愿星球` home layout in `ScriptView.vue`.

### Phase 2: Wish Input And Inspiration

- Implement typed wish input.
- Reuse existing inspiration recommendation fetching.
- Add `灵感一下` and `换一换` interactions.
- Track inspiration select and refresh events.

### Phase 3: Voice Interaction

- Add press-and-hold microphone states.
- Integrate mini program voice recognition if available.
- Keep fallback typed-input behavior.
- Track voice interaction events.

### Phase 4: Generation State And Result

- Convert current generate flow into:
  - submitting
  - generating
  - completed
  - failed
- Show user bubble and system progress messages.
- Render generated story result card.
- Wire result actions:
  - close
  - change direction
  - not like me
  - voice playback

### Phase 5: Regression And Polish

- Verify `人生轨迹` still works.
- Verify `我的剧本`, script detail, and path mapping remain reachable.
- Verify analytics events fire.
- Verify mobile layout on common viewport sizes.
- Run mini program build/type checks available in the repo.

## Acceptance Criteria

- Opening the main mini program page lands on `爽文生成`.
- `人生轨迹` remains available and functionally unchanged.
- The first screen visually matches the 0517 requirement direction:
  - cosmic purple background
  - wish title
  - glowing microphone
  - press-to-speak copy
  - text input
  - inspiration cards
- A user can generate a script from typed input.
- Voice entry has real press states and either recognition integration or a clear fallback.
- During generation, the user sees `心愿实现中……`.
- On success, the user sees a readable story result with title, tags, body, and actions.
- The result action previously shown as `删除` is represented by a close icon, not delete text.
- `语音播放` is connected to existing TTS/script reading flow where available.
- `我的剧本` opens the existing script list/library.
- All new funnel events are tracked.
- No broken image/text overlap in the new UI on mobile.
- No visible mojibake appears in any touched mini program UI label.
- Result content remains readable for both short and long generated scripts.
- The app remains usable when voice recognition is unavailable.

## Risks And Decisions

- Voice recognition support depends on the target mini program runtime and plugin permissions. The implementation should keep a typed-input fallback.
- Current source files contain visible mojibake in some touched templates. Fixing touched labels is required for user-facing quality, but avoid broad unrelated text rewrites unless needed.
- `换个方向` and `不像我` can be implemented as lightweight first-version feedback/regeneration flows; deeper preference learning can be a later analytics-driven enhancement.
- The design doc contains full Vue examples, but the implementation should adapt to the existing uni-app codebase rather than copying prototype code wholesale.

## Review Findings Addressed

Review pass 1 tightened these areas:

- Added explicit state-machine guidance to avoid keeping two competing `ScriptView` flow models.
- Clarified voice recognition as runtime-dependent, with typed input as the guaranteed path.
- Clarified TTS should use one visible player/control surface rather than duplicate controls.
- Added UTF-8/mojibake verification as an acceptance criterion because existing touched files already show garbled labels.
- Added event timing rules so analytics data remains funnel-safe.
