# 自动弹出邀请卡片设计规范 **日期:** 2026-04-23 **状态:** 已批准 **相关:** 2026-04-22-chat-widget-redesign.md --- ## 概述 为 Widget 模式添加自动弹出邀请卡片,页面加载 1.8 秒后显示。邀请卡片提供快速访问常见话题的入口,提升用户参与度。 ### 目标 - 通过主动邀请提升用户参与度 - 提供热门话题的快速访问 - 保持每页独立的状态管理 - 与现有聊天组件无缝集成 --- ## 组件设计 ### 邀请卡片 **位置**: 右下角,悬浮按钮上方 **尺寸**: - 宽度: 360px - 移动端最大宽度: calc(100vw - 24px) **样式**: - 圆角: 26px - 头部: 橙色渐变 `linear-gradient(135deg, #F08A34 0%, #EC8C2F 100%)` - 阴影: `0 28px 80px rgba(196,91,25,0.22)` - 动画: 淡入 + 从底部滑入 (300ms) **结构**: ``` ┌──────────────────────────────────────┐ │ 头部 (橙色渐变) │ │ 🤖 Get stock list or quotation now │ │ Chat with us for available vehicles, │ │ delivery timing and distributor... │ ├──────────────────────────────────────┤ │ 话题按钮 (2x1 网格) │ │ ┌─────────────┐ ┌─────────────────┐ │ │ │Get Quotation│ │Distributor Coopt│ │ │ └─────────────┘ └─────────────────┘ │ ├──────────────────────────────────────┤ │ 操作按钮 │ │ [Start Chat →] [ No Thanks ] │ └──────────────────────────────────────┘ ``` **话题列表**: 1. Get Quotation 2. Distributor Cooperation --- ## 状态管理 ### 存储方案 **键名格式**: `widget_invite_dismissed_${pathname}` **示例**: - 页面 `/home` → `widget_invite_dismissed_/home` - 页面 `/products` → `widget_invite_dismissed_/products` **存储类型**: `sessionStorage` ### 状态流程 ``` 页面加载 ↓ 启动 1.8 秒定时器 ↓ 检查 sessionStorage ↓ ┌─────────────┬─────────────┐ │ 未关闭 │ 已关闭 │ │ ↓ │ ↓ │ │ 显示邀请 │ 跳过 │ └─────────────┴─────────────┘ ``` ### 关闭类型 | 类型 | 触发条件 | 存储行为 | 刷新后行为 | |------|---------|---------|-----------| | 暂时关闭 | 点击话题、Start Chat、悬浮按钮 | 设置 dismissed = true | 重置(再次显示) | | 永久关闭 | 点击 No Thanks | 设置 dismissed = true | 持续(保持隐藏) | --- ## 交互矩阵 | 用户操作 | 邀请卡片 | 聊天面板 | 自动发送消息 | |---------|---------|---------|-------------| | 点击 "Get Quotation" | 关闭(暂时) | 打开 | 是 | | 点击 "Distributor Cooperation" | 关闭(暂时) | 打开 | 是 | | 点击 "Start Chat" | 关闭(暂时) | 打开 | 否 | | 点击 "No Thanks" | 关闭(永久) | - | 否 | | 点击悬浮按钮(邀请可见时) | 关闭(暂时) | 打开 | 否 | | 点击悬浮按钮(邀请隐藏时) | - | 打开 | 否 | ### 显示逻辑 **互斥关系**: - 邀请卡片可见 → 聊天面板隐藏 - 聊天面板打开 → 邀请卡片隐藏 **层级 (Z-Index)**: - 邀请卡片: 99998 - 聊天面板: 99999 - 悬浮按钮: 99997 --- ## 聊天面板中的热门话题 ### 位置 消息区域,初始消息上方。仅在对话初始阶段显示。 ### 样式 ``` ┌──────────────────────────────────────┐ │ POPULAR TOPICS │ │ ┌─────────────┐ ┌─────────────────┐ │ │ │Get Quotation│ │Distributor Coopt│ │ │ └─────────────┘ └─────────────────┘ │ └──────────────────────────────────────┘ ``` ### 行为 - 点击话题 → 自动发送消息到聊天 - 用户发送第一条消息后隐藏 --- ## 每页独立运行 ### 规则 1. **独立定时器**: 每个页面加载时启动自己的 1.8 秒定时器 2. **独立存储**: 每个页面单独存储关闭状态 3. **无跨页面通信**: 状态不在页面间同步 4. **会话重置**: 关闭网站清空所有状态 ### 示例流程 ``` 1. 用户打开 /home → 1.8 秒 → 显示邀请 → 用户点击 "Get Quotation" → /home 标记为已关闭 2. 用户导航到 /products → 1.8 秒 → 显示邀请(独立) → 用户点击 "No Thanks" → /products 标记为已关闭 3. 用户导航到 /about → 1.8 秒 → 显示邀请(独立) → 用户没有操作 → /about 未标记为已关闭 4. 用户回到 /home → 检查存储 → 已关闭 → 不显示邀请 5. 用户回到 /about → 检查存储 → 未关闭 → 邀请保持显示 6. 用户刷新 /about → 存储持续 → 邀请保持显示 7. 用户关闭并重新打开网站 → 所有存储清空 → 所有页面重新开始 ``` --- ## 实现文件 ### 修改 - `static/widget.js` - 添加邀请卡片组件和逻辑(约 250-300 行) ### 新增代码段 1. **邀请 HTML 生成** - 创建邀请卡片 DOM 结构 2. **邀请 CSS 样式** - 添加到 Shadow DOM 的样式 3. **定时器逻辑** - 1.8 秒延迟机制 4. **存储管理** - 每页状态管理 5. **事件处理** - 话题按钮、操作按钮 6. **自动发送消息** - 注入消息到聊天的函数 --- ## 技术考虑 ### Shadow DOM 所有邀请卡片样式都在 Shadow DOM 内部作用域,防止与宿主页面样式冲突。 ### 性能 - 定时器是简单的 `setTimeout()` - 开销极小 - 存储检查是同步且快速的 - 初始渲染后 DOM 操作最少 ### 可访问性 - 邀请卡片可用 Escape 键关闭(未来增强) - 所有按钮都有正确的 `aria-label` 属性 - 支持键盘导航 ### 浏览器兼容性 - `sessionStorage` 在所有现代浏览器中支持 - Shadow DOM 在 Chrome 53+、Firefox 63+、Safari 10+ 中支持 --- ## 未来增强 1. **可配置延迟**: 通过 data 属性自定义 1.8 秒延迟 2. **A/B 测试**: 支持不同的邀请变体 3. **分析**: 跟踪邀请关闭和转化率 4. **Escape 键**: 用键盘关闭邀请 5. **智能时机**: 用户主动滚动时延迟邀请 --- ## 参考资料 - 父规范: `2026-04-22-chat-widget-redesign.md` - 参考设计: `livechat_ui_widget (5).jsx` (StrongInvite 组件)