页面反馈
主要原则
– 编写简洁的技术回应,附带准确的TypeScript示例。
– 使用函数式声明式编程,避免使用类。
– 倾向于使用迭代和模块化,避免代码重复。
– 使用带有辅助动词的描述性变量名(例如:isLoading)。
– 目录使用小写字母和短横线(例如:components/auth-wizard)。
– 优先使用命名导出组件。
– 使用接收对象并返回对象(RORO)模式。
JavaScript/TypeScript
– 对于纯函数使用“function”关键字,省略分号。
– 所有代码使用TypeScript,优先使用接口而不是类型,避免使用枚举,使用映射。
– 文件结构:导出组件、子组件、帮助器、静态内容、类型。
– 在条件语句中避免不必要的大括号。
– 对于条件的单行语句,省略大括号。
– 简单条件语句使用简洁的一行语法(例如:if (condition) doSomething())。
错误处理和验证
– 优先考虑错误处理和边界情况:
– 在函数的开头处理错误和边界情况。
– 对于错误条件使用早期返回,避免深层嵌套的if语句。
– 将正常流程放置在函数的最后,以提高可读性。
– 避免不必要的else语句;使用if-return模式。
– 使用保护性子句提前处理前置条件和无效状态。
– 实现适当的错误日志记录和用户友好的错误消息。
– 考虑使用自定义错误类型或错误工厂来实现一致的错误处理。
React/Next.js
– 使用函数组件和TypeScript接口。
– 使用声明式JSX。
– 使用function而不是const来定义组件。
– 使用Shadcn UI、Radix和Tailwind Aria进行组件和样式设计。
– 使用Tailwind CSS实现响应式设计。
– 采用自下而上的移动优先响应式设计。
– 将静态内容和接口放置在文件末尾。
– 对于静态内容,使用内容变量以在渲染函数之外声明。
– 尽量减少使用'use client'、'useEffect'和'setState',更倾向于使用RSC。
– 使用Zod进行表单验证。
– 用Suspense包裹客户端组件,并提供后备内容。
– 对非关键组件使用动态加载。
– 优化图片:采用WebP格式,大小数据,懒加载。
– 将预期错误建模为返回值:避免在服务器行为中使用try/catch处理预期错误,使用useActionState来管理这些错误并返回给客户端。
– 对于意外错误使用错误边界:使用error.tsx和global-error.tsx文件实现错误边界,以处理意外错误并提供后备UI。
– 使用useActionState与react-hook-form结合进行表单验证。
– services/目录中的代码始终抛出用户友好的错误,以便tanStackQuery能够捕获并展示给用户。
– 对所有服务器行为使用next-safe-action:
– 实现类型安全的服务器行为,并进行适当验证。
– 使用next-safe-action中的'action'函数创建行为。
– 使用Zod定义输入模式,以实现强大的类型检查和验证。
– 优雅地处理错误并返回适当的响应。
– 使用import type { ActionResponse } from '@/types/actions'
– 确保所有服务器行为返回ActionResponse类型。
– 实现一致的错误处理和成功响应,使用ActionResponse。
关键约定
1. 依赖Next.js App Router进行状态变更。
2. 优先考虑Web Vitals指标(LCP、CLS、FID)。
3. 最小化使用'use client':
– 优先使用服务器组件和Next.js的SSR特性。
– 仅在小组件中对Web API访问使用'use client'。
– 避免使用'use client'进行数据获取或状态管理。
参阅Next.js文档以获取数据获取、渲染和路由的最佳实践。
Key Principles
– Write concise, technical responses with accurate TypeScript examples.
– Use functional, declarative programming. Avoid classes.
– Prefer iteration and modularization over duplication.
– Use descriptive variable names with auxiliary verbs (e.g., isLoading).
– Use lowercase with dashes for directories (e.g., components/auth-wizard).
– Favor named exports for components.
– Use the Receive an Object, Return an Object (RORO) pattern.
JavaScript/TypeScript
– Use "function" keyword for pure functions. Omit semicolons.
– Use TypeScript for all code. Prefer interfaces over types. Avoid enums, use maps.
– File structure: Exported component, subcomponents, helpers, static content, types.
– Avoid unnecessary curly braces in conditional statements.
– For single-line statements in conditionals, omit curly braces.
– Use concise, one-line syntax for simple conditional statements (e.g., if (condition) doSomething()).
Error Handling and Validation
– Prioritize error handling and edge cases:
– Handle errors and edge cases at the beginning of functions.
– Use early returns for error conditions to avoid deeply nested if statements.
– Place the happy path last in the function for improved readability.
– Avoid unnecessary else statements; use if-return pattern instead.
– Use guard clauses to handle preconditions and invalid states early.
– Implement proper error logging and user-friendly error messages.
– Consider using custom error types or error factories for consistent error handling.
React/Next.js
– Use functional components and TypeScript interfaces.
– Use declarative JSX.
– Use function, not const, for components.
– Use Shadcn UI, Radix, and Tailwind Aria for components and styling.
– Implement responsive design with Tailwind CSS.
– Use mobile-first approach for responsive design.
– Place static content and interfaces at file end.
– Use content variables for static content outside render functions.
– Minimize 'use client', 'useEffect', and 'setState'. Favor RSC.
– Use Zod for form validation.
– Wrap client components in Suspense with fallback.
– Use dynamic loading for non-critical components.
– Optimize images: WebP format, size data, lazy loading.
– Model expected errors as return values: Avoid using try/catch for expected errors in Server Actions. Use useActionState to manage these errors and return them to the client.
– Use error boundaries for unexpected errors: Implement error boundaries using error.tsx and global-error.tsx files to handle unexpected errors and provide a fallback UI.
– Use useActionState with react-hook-form for form validation.
– Code in services/ dir always throw user-friendly errors that tanStackQuery can catch and show to the user.
– Use next-safe-action for all server actions:
– Implement type-safe server actions with proper validation.
– Utilize the `action` function from next-safe-action for creating actions.
– Define input schemas using Zod for robust type checking and validation.
– Handle errors gracefully and return appropriate responses.
– Use import type { ActionResponse } from '@/types/actions'
– Ensure all server actions return the ActionResponse type
– Implement consistent error handling and success responses using ActionResponse
Key Conventions
1. Rely on Next.js App Router for state changes.
2. Prioritize Web Vitals (LCP, CLS, FID).
3. Minimize 'use client' usage:
– Prefer server components and Next.js SSR features.
– Use 'use client' only for Web API access in small components.
– Avoid using 'use client' for data fetching or state management.
Refer to Next.js documentation for Data Fetching, Rendering, and Routing best practices.








主要原则
– 编写简洁的技术回应,附带准确的TypeScript示例。
– 使用函数式声明式编程,避免使用类。
– 倾向于使用迭代和模块化,避免代码重复。
– 使用带有辅助动词的描述性变量名(例如:isLoading)。
– 目录使用小写字母和短横线(例如:components/auth-wizard)。
– 优先使用命名导出组件。
– 使用接收对象并返回对象(RORO)模式。
JavaScript/TypeScript
– 对于纯函数使用“function”关键字,省略分号。
– 所有代码使用TypeScript,优先使用接口而不是类型,避免使用枚举,使用映射。
– 文件结构:导出组件、子组件、帮助器、静态内容、类型。
– 在条件语句中避免不必要的大括号。
– 对于条件的单行语句,省略大括号。
– 简单条件语句使用简洁的一行语法(例如:if (condition) doSomething())。
错误处理和验证
– 优先考虑错误处理和边界情况:
– 在函数的开头处理错误和边界情况。
– 对于错误条件使用早期返回,避免深层嵌套的if语句。
– 将正常流程放置在函数的最后,以提高可读性。
– 避免不必要的else语句;使用if-return模式。
– 使用保护性子句提前处理前置条件和无效状态。
– 实现适当的错误日志记录和用户友好的错误消息。
– 考虑使用自定义错误类型或错误工厂来实现一致的错误处理。
React/Next.js
– 使用函数组件和TypeScript接口。
– 使用声明式JSX。
– 使用function而不是const来定义组件。
– 使用Shadcn UI、Radix和Tailwind Aria进行组件和样式设计。
– 使用Tailwind CSS实现响应式设计。
– 采用自下而上的移动优先响应式设计。
– 将静态内容和接口放置在文件末尾。
– 对于静态内容,使用内容变量以在渲染函数之外声明。
– 尽量减少使用'use client'、'useEffect'和'setState',更倾向于使用RSC。
– 使用Zod进行表单验证。
– 用Suspense包裹客户端组件,并提供后备内容。
– 对非关键组件使用动态加载。
– 优化图片:采用WebP格式,大小数据,懒加载。
– 将预期错误建模为返回值:避免在服务器行为中使用try/catch处理预期错误,使用useActionState来管理这些错误并返回给客户端。
– 对于意外错误使用错误边界:使用error.tsx和global-error.tsx文件实现错误边界,以处理意外错误并提供后备UI。
– 使用useActionState与react-hook-form结合进行表单验证。
– services/目录中的代码始终抛出用户友好的错误,以便tanStackQuery能够捕获并展示给用户。
– 对所有服务器行为使用next-safe-action:
– 实现类型安全的服务器行为,并进行适当验证。
– 使用next-safe-action中的'action'函数创建行为。
– 使用Zod定义输入模式,以实现强大的类型检查和验证。
– 优雅地处理错误并返回适当的响应。
– 使用import type { ActionResponse } from '@/types/actions'
– 确保所有服务器行为返回ActionResponse类型。
– 实现一致的错误处理和成功响应,使用ActionResponse。
关键约定
1. 依赖Next.js App Router进行状态变更。
2. 优先考虑Web Vitals指标(LCP、CLS、FID)。
3. 最小化使用'use client':
– 优先使用服务器组件和Next.js的SSR特性。
– 仅在小组件中对Web API访问使用'use client'。
– 避免使用'use client'进行数据获取或状态管理。
参阅Next.js文档以获取数据获取、渲染和路由的最佳实践。
Key Principles
– Write concise, technical responses with accurate TypeScript examples.
– Use functional, declarative programming. Avoid classes.
– Prefer iteration and modularization over duplication.
– Use descriptive variable names with auxiliary verbs (e.g., isLoading).
– Use lowercase with dashes for directories (e.g., components/auth-wizard).
– Favor named exports for components.
– Use the Receive an Object, Return an Object (RORO) pattern.
JavaScript/TypeScript
– Use "function" keyword for pure functions. Omit semicolons.
– Use TypeScript for all code. Prefer interfaces over types. Avoid enums, use maps.
– File structure: Exported component, subcomponents, helpers, static content, types.
– Avoid unnecessary curly braces in conditional statements.
– For single-line statements in conditionals, omit curly braces.
– Use concise, one-line syntax for simple conditional statements (e.g., if (condition) doSomething()).
Error Handling and Validation
– Prioritize error handling and edge cases:
– Handle errors and edge cases at the beginning of functions.
– Use early returns for error conditions to avoid deeply nested if statements.
– Place the happy path last in the function for improved readability.
– Avoid unnecessary else statements; use if-return pattern instead.
– Use guard clauses to handle preconditions and invalid states early.
– Implement proper error logging and user-friendly error messages.
– Consider using custom error types or error factories for consistent error handling.
React/Next.js
– Use functional components and TypeScript interfaces.
– Use declarative JSX.
– Use function, not const, for components.
– Use Shadcn UI, Radix, and Tailwind Aria for components and styling.
– Implement responsive design with Tailwind CSS.
– Use mobile-first approach for responsive design.
– Place static content and interfaces at file end.
– Use content variables for static content outside render functions.
– Minimize 'use client', 'useEffect', and 'setState'. Favor RSC.
– Use Zod for form validation.
– Wrap client components in Suspense with fallback.
– Use dynamic loading for non-critical components.
– Optimize images: WebP format, size data, lazy loading.
– Model expected errors as return values: Avoid using try/catch for expected errors in Server Actions. Use useActionState to manage these errors and return them to the client.
– Use error boundaries for unexpected errors: Implement error boundaries using error.tsx and global-error.tsx files to handle unexpected errors and provide a fallback UI.
– Use useActionState with react-hook-form for form validation.
– Code in services/ dir always throw user-friendly errors that tanStackQuery can catch and show to the user.
– Use next-safe-action for all server actions:
– Implement type-safe server actions with proper validation.
– Utilize the `action` function from next-safe-action for creating actions.
– Define input schemas using Zod for robust type checking and validation.
– Handle errors gracefully and return appropriate responses.
– Use import type { ActionResponse } from '@/types/actions'
– Ensure all server actions return the ActionResponse type
– Implement consistent error handling and success responses using ActionResponse
Key Conventions
1. Rely on Next.js App Router for state changes.
2. Prioritize Web Vitals (LCP, CLS, FID).
3. Minimize 'use client' usage:
– Prefer server components and Next.js SSR features.
– Use 'use client' only for Web API access in small components.
– Avoid using 'use client' for data fetching or state management.
Refer to Next.js documentation for Data Fetching, Rendering, and Routing best practices.
页面反馈

.relatedpost ol{padding: 0 20px;}
.relatedpost li{padding: 5px 0;}
#wp-block-categories-1{height:30px;}
.top-product-tags {display: flex;flex-wrap: wrap;gap: 5px;}
.top-product-tag {font-size: 0.875rem;text-decoration: none;transition: background-color 0.3s ease, color 0.3s ease;}
.top-product-tag:hover,.top-product-tag:focus {background-color: #f8f8f8;padding: 0 5px;border-radius: 12px;color: #222;}
.custom-contact-form {width: 100%;margin: 0 auto;padding: 1em;box-sizing: border-box;background: #f9f9f9;border-radius: 8px;box-shadow: 0 2px 8px rgba(0,0,0,0.1);font-family: Arial, sans-serif;}
:root {--wp-spacing-small: 8px;--wp-spacing-medium: 16px;--wp-spacing-large: 24px;}
.custom-contact-form .row {display: flex;flex-wrap: wrap;gap: var(--wp-spacing-medium);margin-bottom: var(--wp-spacing-medium);}
.custom-contact-form .column {flex: 1;min-width: 200px;}
.custom-contact-form label {display: block;margin-bottom: var(--wp-spacing-small);font-weight: bold;font-size: 14px;color: #333;}
.custom-contact-form input[type="text"],.custom-contact-form input[type="email"],.custom-contact-form input[type="tel"],.custom-contact-form input[type="url"],.custom-contact-form textarea {width: 100%;padding: 8px 12px;border: 1px solid #ccc;border-radius: 4px;font-size: 14px;box-sizing: border-box;transition: border-color 0.3s;}
.custom-contact-form input[type="text"]:focus,.custom-contact-form input[type="email"]:focus,.custom-contact-form input[type="tel"]:focus,.custom-contact-form input[type="url"]:focus,.custom-contact-form textarea:focus {border-color: #66afe9;outline: none;}
.custom-contact-form .message-row {flex-direction: column;}
.custom-contact-form .submit-row {text-align: center;margin-top: var(--wp-spacing-large);}
.custom-contact-form input[type="submit"] {background-color: #007bff;border: none;padding: 10px 20px;color: #fff;font-size: 16px;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;}
.custom-contact-form input[type="submit"]:hover,.custom-contact-form input[type="submit"]:focus {background-color: #0056b3;outline: 2px solid rgba(0, 123, 255, 0.5);}
.acf-attribute-table {max-width: 100%;border-collapse: collapse;font-size: 16px;}
.acf-attribute-table td {text-align: left;padding: 8px;border: 1px solid #ccc;}
.custom-pc-categories {display: flex;align-items: center;justify-content: center;flex-wrap: wrap;width: 100%;text-align: center;}
.custom-pc-categories .custom-pc-link {margin: 0 15px;text-decoration: none;color: #333;position: relative;padding: 5px 0;}
.custom-pc-categories .custom-pc-link:focus {outline: 2px solid #333;outline-offset: 2px;}
.custom-pc-categories .custom-pc-link.custom-pc-active {font-weight: bold;}
.custom-pc-categories .custom-pc-link.custom-pc-active::after {content: '';position: absolute;left: 0;width: 100%;bottom: 0;height: 2px;background-color: #333;}
.custom-pc-more {position: relative;margin: 0 15px;}
.custom-pc-more .custom-pc-more-toggle {text-decoration: none;color: #333;cursor: pointer;}
.custom-pc-more .custom-pc-more-toggle:focus {outline: 2px solid #333;outline-offset: 2px;}
.custom-pc-more .custom-pc-dropdown {display: none;position: absolute;top: 100%;left: 50%;transform: translateX(-50%);background: #fff;box-shadow: 0 2px 5px rgba(0,0,0,0.2);padding: 10px;z-index: 10;min-width: 150px;text-align: center;}
.custom-pc-more:hover .custom-pc-dropdown {display: block;}
.custom-pc-more .custom-pc-dropdown a {display: block;padding: 5px 0;text-decoration: none;color: #333;}
.custom-pc-more .custom-pc-dropdown a:hover,.custom-pc-more .custom-pc-dropdown a:focus {color: #000;background-color: #f5f5f5;outline: none;}
.custom-pc-more p{margin: 0 !important;}
a:focus {outline:none;}
.wp-block-post-excerpt__excerpt{display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
.postexp p {display: -webkit-box;-webkit-line-clamp: 1 !important;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
#wp-block-categories-2{padding: 8px;margin-right: 10px;border: 1px solid #ddd;border-radius: 4px;width: 200px;}
#custom-search-container {position: relative;}
@media (max-width: 600px) {#custom-search-form {width: 90vw !important;left: 50% !important;transform: translateX(-50%);top: 50px !important;} #custom-search-input {width: 70vw !important;}}
.two-line-ellipsis {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;line-height: 1.5;height: calc(1.5em * 2);}
.makeiteasy-popup-wrapper{border-radius: 10px;}
.product-image-wrapper {position: relative;display: inline-block;}
.productcat{top: 8px;left: 8px;transform: translateX(-20px);position: absolute;background: #ffee5882;padding: 4px 8px;border-radius: 4px;font-size: 14px;user-select: none;white-space: nowrap;opacity: 0;pointer-events: none;transition: opacity 0.3s ease, transform 0.3s ease;}
.producttag {bottom: 8px;right: 8px;transform: translateX(20px);border-radius: 20px 4px 20px 4px;position: absolute;background: rgba(0,0,0,0.6);color: #fff;padding: 4px 8px;font-size: 8px;user-select: none;white-space: nowrap;opacity: 0;pointer-events: none;transition: opacity 0.3s ease, transform 0.3s ease;}
.product-image-wrapper:hover .productcat,.product-image-wrapper:hover .producttag {opacity: 1;pointer-events: auto;transform: translateX(0);}
:not(.productpagetag) .wp-block-post-terms__separator {display: none;}
.productpagetag::before {content: "Tags: ";color: #686868;}
.productpagetag {margin-left: 0;margin-right: 0;align-items: center;font-size: 14px;}
.productpagetag a {text-decoration: none;transition: background-color 0.3s ease;}
.productpagetag a:hover,.productpagetag a:focus {background-color: #eef6fb;padding: 4px 8px;border-radius: 4px;outline: none;}
.productpagetag .wp-block-post-terms__separator {display: inline-block;color: #555;margin: 0 4px;user-select: none;}
.breadcump {font-size: 14px;display: flex;flex-wrap: nowrap;align-items: center;max-width: 100%;overflow: hidden;color: #333;user-select: none;}
.breadcump a {text-decoration: none;color: #0073aa;white-space: nowrap;user-select: text;}
.breadcump a:hover,.breadcump a:focus {text-decoration: underline;outline: none;}
.breadcrumb-sep {margin: 0 8px;color: #999;flex-shrink: 0;user-select: none;}
.breadcrumb-last {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width: 200px;flex-shrink: 1;cursor: default;user-select: text;}
.catfilter label{width: auto !important;}
.singleposttitle {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
### 故事概要:
米娅是一个充满好奇心和想象力的小女孩。
在她的后院,有一棵被邻里传说能够实现愿望的古老树。
故事围绕米娅如何用一颗真诚的心去理解愿望的真意展开。
### 分镜脚本:
#### 开场画面:
- **画面一(开场白页面)**
- **内容描述**:夜晚的卧室,米娅戴着睡帽,坐在床上,对着窗外闪烁的星星许愿。
- **角色动作**:米娅双手合十,眼睛闭着,表情充满期待。
- **文本**:旁白“亲爱的小朋友,今天我要讲一个关于米娅和一棵神奇许愿树的故事。”
- **画面二(启动兴趣页面)**
- **内容描述**:夜晚辽阔的星空下,一棵根深蒂固的宏伟树木凸现在米娅的卧室窗外。
- **角色动作**:米娅的眼睛睁开了,充满好奇地凝视着窗外。
- **文本**:旁白“在米娅的花园里,有一棵不一样的树。它能听见孩子们的愿望。”
#### 故事发展:
- **画面三(故事起始)**
- **内容描述**:早晨,米娅在花园中接近许愿树。
- **角色动作**:米娅怀着敬仰,轻轻触摸树皮,树上的叶子发出轻微的银铃般响声。
- **文本**:“米娅,你的愿望是什么?”旁白问道,引出米娅的内心想法。
- **画面四(冲突/愿望页面)**
- **内容描述**:米娅思索,面前浮现出她的愿望——最想要的玩具、旅行的经历、和朋友们的欢乐时光。
- **角色动作**:米娅的眼神透露出困惑,她面临着选择。
- **文本**:旁白继续道,“要选择哪一个呢?”
#### 高潮:
- **画面五(决策页面)**
- **内容描述**:米娅闭上眼睛,深呼吸,她的周围环绕着幻想的光芒。
- **角色动作**:米娅显得更坚定,开口许下了她的愿望。
- **文本**:旁白“勇敢且真诚的心,让许愿树听见了。”
#### 结局:
- **画面六(愿望实现页面)**
- **内容描述**:米娅惊喜地发现,她的愿望以一个预料之外的方式实现了—让全家人度过一个美好的家庭时光。
- **角色动作**:米娅和家人在树下聚餐,她的脸上洋溢着幸福的微笑。
- **文本**:旁白“真正的愿望不总是你想的那样,有时,它们是你真正需要的。”
### 检查点:
- 确保画面和文本都充满童趣与魔法感。
- 制作草稿插画,检查是否适合目标儿童年龄段。
- 对分镜脚本和故事进行审查,确保易于理解、教育意义丰富、传递正能量。
完成以上工作后,我们将与插画师合作,继续完善《米娅的许愿树》的分镜头,并最终将故事带给孩子们。









.relatedpost ol{padding: 0 20px;}
.relatedpost li{padding: 5px 0;}
#wp-block-categories-1{height:30px;}
.top-product-tags {display: flex;flex-wrap: wrap;gap: 5px;}
.top-product-tag {font-size: 0.875rem;text-decoration: none;transition: background-color 0.3s ease, color 0.3s ease;}
.top-product-tag:hover,.top-product-tag:focus {background-color: #f8f8f8;padding: 0 5px;border-radius: 12px;color: #222;}
.custom-contact-form {width: 100%;margin: 0 auto;padding: 1em;box-sizing: border-box;background: #f9f9f9;border-radius: 8px;box-shadow: 0 2px 8px rgba(0,0,0,0.1);font-family: Arial, sans-serif;}
:root {--wp-spacing-small: 8px;--wp-spacing-medium: 16px;--wp-spacing-large: 24px;}
.custom-contact-form .row {display: flex;flex-wrap: wrap;gap: var(--wp-spacing-medium);margin-bottom: var(--wp-spacing-medium);}
.custom-contact-form .column {flex: 1;min-width: 200px;}
.custom-contact-form label {display: block;margin-bottom: var(--wp-spacing-small);font-weight: bold;font-size: 14px;color: #333;}
.custom-contact-form input[type="text"],.custom-contact-form input[type="email"],.custom-contact-form input[type="tel"],.custom-contact-form input[type="url"],.custom-contact-form textarea {width: 100%;padding: 8px 12px;border: 1px solid #ccc;border-radius: 4px;font-size: 14px;box-sizing: border-box;transition: border-color 0.3s;}
.custom-contact-form input[type="text"]:focus,.custom-contact-form input[type="email"]:focus,.custom-contact-form input[type="tel"]:focus,.custom-contact-form input[type="url"]:focus,.custom-contact-form textarea:focus {border-color: #66afe9;outline: none;}
.custom-contact-form .message-row {flex-direction: column;}
.custom-contact-form .submit-row {text-align: center;margin-top: var(--wp-spacing-large);}
.custom-contact-form input[type="submit"] {background-color: #007bff;border: none;padding: 10px 20px;color: #fff;font-size: 16px;border-radius: 4px;cursor: pointer;transition: background-color 0.3s;}
.custom-contact-form input[type="submit"]:hover,.custom-contact-form input[type="submit"]:focus {background-color: #0056b3;outline: 2px solid rgba(0, 123, 255, 0.5);}
.acf-attribute-table {max-width: 100%;border-collapse: collapse;font-size: 16px;}
.acf-attribute-table td {text-align: left;padding: 8px;border: 1px solid #ccc;}
.custom-pc-categories {display: flex;align-items: center;justify-content: center;flex-wrap: wrap;width: 100%;text-align: center;}
.custom-pc-categories .custom-pc-link {margin: 0 15px;text-decoration: none;color: #333;position: relative;padding: 5px 0;}
.custom-pc-categories .custom-pc-link:focus {outline: 2px solid #333;outline-offset: 2px;}
.custom-pc-categories .custom-pc-link.custom-pc-active {font-weight: bold;}
.custom-pc-categories .custom-pc-link.custom-pc-active::after {content: '';position: absolute;left: 0;width: 100%;bottom: 0;height: 2px;background-color: #333;}
.custom-pc-more {position: relative;margin: 0 15px;}
.custom-pc-more .custom-pc-more-toggle {text-decoration: none;color: #333;cursor: pointer;}
.custom-pc-more .custom-pc-more-toggle:focus {outline: 2px solid #333;outline-offset: 2px;}
.custom-pc-more .custom-pc-dropdown {display: none;position: absolute;top: 100%;left: 50%;transform: translateX(-50%);background: #fff;box-shadow: 0 2px 5px rgba(0,0,0,0.2);padding: 10px;z-index: 10;min-width: 150px;text-align: center;}
.custom-pc-more:hover .custom-pc-dropdown {display: block;}
.custom-pc-more .custom-pc-dropdown a {display: block;padding: 5px 0;text-decoration: none;color: #333;}
.custom-pc-more .custom-pc-dropdown a:hover,.custom-pc-more .custom-pc-dropdown a:focus {color: #000;background-color: #f5f5f5;outline: none;}
.custom-pc-more p{margin: 0 !important;}
a:focus {outline:none;}
.wp-block-post-excerpt__excerpt{display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
.postexp p {display: -webkit-box;-webkit-line-clamp: 1 !important;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
#wp-block-categories-2{padding: 8px;margin-right: 10px;border: 1px solid #ddd;border-radius: 4px;width: 200px;}
#custom-search-container {position: relative;}
@media (max-width: 600px) {#custom-search-form {width: 90vw !important;left: 50% !important;transform: translateX(-50%);top: 50px !important;} #custom-search-input {width: 70vw !important;}}
.two-line-ellipsis {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;line-height: 1.5;height: calc(1.5em * 2);}
.makeiteasy-popup-wrapper{border-radius: 10px;}
.product-image-wrapper {position: relative;display: inline-block;}
.productcat{top: 8px;left: 8px;transform: translateX(-20px);position: absolute;background: #ffee5882;padding: 4px 8px;border-radius: 4px;font-size: 14px;user-select: none;white-space: nowrap;opacity: 0;pointer-events: none;transition: opacity 0.3s ease, transform 0.3s ease;}
.producttag {bottom: 8px;right: 8px;transform: translateX(20px);border-radius: 20px 4px 20px 4px;position: absolute;background: rgba(0,0,0,0.6);color: #fff;padding: 4px 8px;font-size: 8px;user-select: none;white-space: nowrap;opacity: 0;pointer-events: none;transition: opacity 0.3s ease, transform 0.3s ease;}
.product-image-wrapper:hover .productcat,.product-image-wrapper:hover .producttag {opacity: 1;pointer-events: auto;transform: translateX(0);}
:not(.productpagetag) .wp-block-post-terms__separator {display: none;}
.productpagetag::before {content: "Tags: ";color: #686868;}
.productpagetag {margin-left: 0;margin-right: 0;align-items: center;font-size: 14px;}
.productpagetag a {text-decoration: none;transition: background-color 0.3s ease;}
.productpagetag a:hover,.productpagetag a:focus {background-color: #eef6fb;padding: 4px 8px;border-radius: 4px;outline: none;}
.productpagetag .wp-block-post-terms__separator {display: inline-block;color: #555;margin: 0 4px;user-select: none;}
.breadcump {font-size: 14px;display: flex;flex-wrap: nowrap;align-items: center;max-width: 100%;overflow: hidden;color: #333;user-select: none;}
.breadcump a {text-decoration: none;color: #0073aa;white-space: nowrap;user-select: text;}
.breadcump a:hover,.breadcump a:focus {text-decoration: underline;outline: none;}
.breadcrumb-sep {margin: 0 8px;color: #999;flex-shrink: 0;user-select: none;}
.breadcrumb-last {white-space: nowrap;overflow: hidden;text-overflow: ellipsis;max-width: 200px;flex-shrink: 1;cursor: default;user-select: text;}
.catfilter label{width: auto !important;}
.singleposttitle {display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;overflow: hidden;text-overflow: ellipsis;}
### 故事概要:
米娅是一个充满好奇心和想象力的小女孩。
在她的后院,有一棵被邻里传说能够实现愿望的古老树。
故事围绕米娅如何用一颗真诚的心去理解愿望的真意展开。
### 分镜脚本:
#### 开场画面:
- **画面一(开场白页面)**
- **内容描述**:夜晚的卧室,米娅戴着睡帽,坐在床上,对着窗外闪烁的星星许愿。
- **角色动作**:米娅双手合十,眼睛闭着,表情充满期待。
- **文本**:旁白“亲爱的小朋友,今天我要讲一个关于米娅和一棵神奇许愿树的故事。”
- **画面二(启动兴趣页面)**
- **内容描述**:夜晚辽阔的星空下,一棵根深蒂固的宏伟树木凸现在米娅的卧室窗外。
- **角色动作**:米娅的眼睛睁开了,充满好奇地凝视着窗外。
- **文本**:旁白“在米娅的花园里,有一棵不一样的树。它能听见孩子们的愿望。”
#### 故事发展:
- **画面三(故事起始)**
- **内容描述**:早晨,米娅在花园中接近许愿树。
- **角色动作**:米娅怀着敬仰,轻轻触摸树皮,树上的叶子发出轻微的银铃般响声。
- **文本**:“米娅,你的愿望是什么?”旁白问道,引出米娅的内心想法。
- **画面四(冲突/愿望页面)**
- **内容描述**:米娅思索,面前浮现出她的愿望——最想要的玩具、旅行的经历、和朋友们的欢乐时光。
- **角色动作**:米娅的眼神透露出困惑,她面临着选择。
- **文本**:旁白继续道,“要选择哪一个呢?”
#### 高潮:
- **画面五(决策页面)**
- **内容描述**:米娅闭上眼睛,深呼吸,她的周围环绕着幻想的光芒。
- **角色动作**:米娅显得更坚定,开口许下了她的愿望。
- **文本**:旁白“勇敢且真诚的心,让许愿树听见了。”
#### 结局:
- **画面六(愿望实现页面)**
- **内容描述**:米娅惊喜地发现,她的愿望以一个预料之外的方式实现了—让全家人度过一个美好的家庭时光。
- **角色动作**:米娅和家人在树下聚餐,她的脸上洋溢着幸福的微笑。
- **文本**:旁白“真正的愿望不总是你想的那样,有时,它们是你真正需要的。”
### 检查点:
- 确保画面和文本都充满童趣与魔法感。
- 制作草稿插画,检查是否适合目标儿童年龄段。
- 对分镜脚本和故事进行审查,确保易于理解、教育意义丰富、传递正能量。
完成以上工作后,我们将与插画师合作,继续完善《米娅的许愿树》的分镜头,并最终将故事带给孩子们。


