Make teacher prompt buttons compact and softly raised
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
|
||||
## Scope
|
||||
|
||||
- Move Yuxi-configured teacher shortcuts above the composer as small, flat pastel buttons; preserve exact configured label/prompt and existing send/voice/model behavior.
|
||||
- Move Yuxi-configured teacher shortcuts above the composer as small pastel buttons with soft shadows; preserve exact configured label/prompt and existing send/voice/model behavior.
|
||||
|
||||
## Intent And Constraints
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
## Outcome
|
||||
|
||||
- Configured teacher shortcuts now sit outside and directly above the composer. Buttons use 13px normal text (same as reply body), pale cream fill, light border and no shadow; wrapping/overflow/keyboard focus supported.
|
||||
- Configured teacher shortcuts now sit outside and directly above the composer. Buttons use 13px normal text (same as reply body), pale cream fill, no border and soft shadow; wrapping/overflow/keyboard focus supported.
|
||||
- Adapted product/tests dependency from main 53d5b6b (bb96941); original source task record remains in its source commit, excluded from this feature boundary. Explicit empty arrays hide prompts; absent historical field retains approved fallback. Published label and prompt are unchanged.
|
||||
- Trial Renderer updated in place in PID 32583; Main and empty-work preview overlay remain intact. Live Alice cloud v53 supplies “继续看看咯”.
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
## Promotion Candidates
|
||||
|
||||
- Target: integrated classroom UI documentation. Proposal: configured prompts live above the composer as flat body-size buttons; exact cloud labels/prompts, absent/empty compatibility and send guards retained. Evidence: user approval, 75 unit / 23 browser tests and live trial comparison. No product-policy conflict; canonical promotion belongs to integration.
|
||||
- Target: integrated classroom UI documentation. Proposal: configured prompts live above the composer as borderless body-size buttons with soft shadows; exact cloud labels/prompts, absent/empty compatibility and send guards retained. Evidence: user approval, 75 unit / 23 browser tests and live trial comparison. No product-policy conflict; canonical promotion belongs to integration.
|
||||
|
||||
## Project Context Loaded
|
||||
|
||||
@@ -54,3 +54,13 @@
|
||||
1. Reconcile committed Yuxi shortcuts support with trial composer, preserving empty-array versus absent compatibility.
|
||||
2. Move controls above composer and give them body-size, normal-weight, pale rounded styling with keyboard focus and wrapping.
|
||||
3. Verify UI behavior/layout, typecheck/lint/build; update current trial in background preserving source overlays and user state; document evidence.
|
||||
|
||||
## Compact Shadow Follow-up
|
||||
|
||||
- Same-task ownership resumed and verified at efd1894. Reused the unchanged planning context above and reread current peer scopes; no new conflict. Gate passed.
|
||||
- User now wants smaller buttons without a visible border, using background and soft shadow. Keep 13px text for readability, reduce minimum height from 36px to 30px and padding to 4px/10px, soften corners.
|
||||
- Plan: update only prompt CSS, existing layout assertions and product/task documentation; verify targeted layouts and build. Refresh the built stylesheet in the running trial without remounting conversations or activating the window.
|
||||
|
||||
- Completed: prompt button minimum height 30px (was 36px), padding 4px/10px, 8px corners, no border, soft 2px/6px shadow and pale cream background. Font remains 13px/400.
|
||||
- Verification: typecheck, lint (0 errors, 8 existing warnings), source/staged production builds and six 319/508px prompt/model/microphone layout scenarios passed. Existing checks now assert no border, a shadow and 30px height.
|
||||
- Updated the production stylesheet link in the live trial, with new built assets/index installed for subsequent reload. No Renderer remount or Main restart; live JS behavior is unchanged. Native capture confirms 30px, zero border and soft shadow. All localStorage, input text, operation messages, teacher turn text and route remained byte-identical; window stayed unfocused.
|
||||
|
||||
@@ -183,7 +183,7 @@ Pi 正式包必须继续运行 `pnpm run verify:artifact:pi`、`pnpm run smoke:p
|
||||
- 咨询正文支持 Markdown 标题、列表、表格、代码围栏、HTTP(S) 链接/图片和数学公式,长代码与表格在栏内横向滚动,不执行 HTML。云端正文维持 string 合同,未知对象不会猜测转成回答。工具活动只从云端主线程的类型化工具事件及 Main 本地读取过程获得,按本次问题/工具调用身份合并名称和状态,跨云端暂停、续接仍只计一次;暂停读取不算失败,状态以实际读取结果或问题终态为准,单独折叠显示;参数、结果原文和内部错误不混入回复,思考内容不作为正文。客户端仅保存自己实际收到的工具状态,不能补回旧历史或断线期间已经过期的事件。
|
||||
- 云端咨询在 local_context 声明 read_protocol=2;需先部署配套 Yuxi API 和 worker,再升级客户端。云端持久累计读取字节及批次,每轮告知模型剩余额度;预算耗尽后消费最后一批结果,并以 tool_choice=none 要求根据现有证据形成答案和说明缺口。Main 限制实际返回量并拒绝第十三批读取,区分读取达到上限、上下文失效及格式无效。服务端对未声明协议的已安装旧客户端保留原工具参数与六批边界。
|
||||
- 智能体人设、职责、提示词和 Skills 由发布配置决定。Main 不追加固定教学基线、不生成“小麦”、不清空所选智能体的 Skills,只添加真实工具能力、上下文边界和本轮界面协议。智能体名称叫“老师”“朋友”或“代码顾问”不改变调用路径或权限。
|
||||
- 输入框为空时,在输入框外上方显示当前老师已发布的快捷提示;采用与回复正文一致的 13px 常规字重、浅色圆角按钮,横向排列并自动换行。按 Yuxi 中配置的顺序展示文案,点击直接发送该项实际提示词。Yuxi“编辑 → 快捷提示”支持最多 8 项,每项文案最多 40 字、提示词最多 6000 字;保存并发布后,目录更新即可生效,历史和未发送草稿保留。明确发布空列表隐藏全部按钮;缺少字段的历史版本保留“帮我整体看🧠”。多个长文案在限定高度内滚动,运行中禁止重复发送。上线需先更新 WS 登记接口,再更新 Yuxi 和客户端。
|
||||
- 输入框为空时,在输入框外上方显示当前老师已发布的快捷提示;采用与回复正文一致的 13px 常规字重、无边框、浅色底与柔和阴影的小巧圆角按钮,横向排列并自动换行。按 Yuxi 中配置的顺序展示文案,点击直接发送该项实际提示词。Yuxi“编辑 → 快捷提示”支持最多 8 项,每项文案最多 40 字、提示词最多 6000 字;保存并发布后,目录更新即可生效,历史和未发送草稿保留。明确发布空列表隐藏全部按钮;缺少字段的历史版本保留“帮我整体看🧠”。多个长文案在限定高度内滚动,运行中禁止重复发送。上线需先更新 WS 登记接口,再更新 Yuxi 和客户端。
|
||||
- `reply.ts` 只声明正文与快捷回复的输出格式,语言、长度、前缀与表达风格由所选智能体的云端配置决定。客户端不再发送选择、生成、转换或维护展示组件的指令。旧话题内的组件状态、快照和解析诊断作为不透明历史数据原样保留,不校验删除、不恢复交互;旧组件修改路由已移除。
|
||||
- 当前输入是按预算截取的所选操作对话已完成分支文本、明确引用、咨询正文和快捷回复,并支持上述只读原文恢复;旧组件状态、快照和未解析原文不加入模型上下文或咨询历史读取结果。没有跨全部操作会话自动读取,也未向操作 Agent 注入咨询共识。提示词不声称看过未提供的画面或试玩过作品。Yuxi 话题经云端原生执行,旧版本地智能体由 Main 调用计费网关;均不创建本地 Pi 编程 worker。
|
||||
- 智能体输入裁剪区分两种计量:本地模型以约每 2 个 UTF-8 字节估算 1 Token,并计入工具与读取预留;这不是精确分词或扣费依据,模型上限与实际 usage 仍由服务端拥有。云端沿用 query 字节上限,以完整 JSON 转义后的大小裁剪来源节选。智能体指令、当前问题和明确引用不会被静默裁掉;固定配置或回复协议超限时明确提示调整配置,避免让学生反复缩短短问题或新建话题。完整来源仍可由只读工具按需读取。
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
.consultation-retry:hover:not(:disabled) { background: #ffe9a9; border-color: #d6b76f; }
|
||||
.consultation-retry:active:not(:disabled) { transform: translateY(2px); box-shadow: 0 1px 0 #e7d7a6, inset 0 1px 0 #fff9e8; }
|
||||
.consultation-shortcuts { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px; max-height: min(192px, 24vh); overflow-y: auto; margin-bottom: 10px; padding: 3px; }
|
||||
.consultation-hint { display: inline-flex; align-items: center; max-width: 100%; min-height: 36px; padding: 6px 12px; border: 1px solid #e5ddc7; border-radius: 12px; background: #faf5e8; color: #5b503b; font-size: 13px; font-weight: 400; line-height: 22px; text-align: left; white-space: normal; overflow-wrap: anywhere; cursor: pointer; transition: background-color 160ms ease, border-color 160ms ease; }
|
||||
.consultation-hint:hover:not(:disabled) { background: #f4ecd6; border-color: #d7c9a5; }
|
||||
.consultation-hint { display: inline-flex; align-items: center; max-width: 100%; min-height: 30px; padding: 4px 10px; border: 0; border-radius: 8px; background: #f8f1e2; box-shadow: 0 2px 6px #8b75491a; color: #5b503b; font-size: 13px; font-weight: 400; line-height: 22px; text-align: left; white-space: normal; overflow-wrap: anywhere; cursor: pointer; transition: background-color 160ms ease, border-color 160ms ease; }
|
||||
.consultation-hint:hover:not(:disabled) { background: #f2e8d2; box-shadow: 0 3px 8px #8b754924; }
|
||||
.consultation-hint:active:not(:disabled) { background: #eee3c7; }
|
||||
.consultation-hint:focus-visible { outline: 2px solid #7891af; outline-offset: 2px; }
|
||||
.consultation-hint:disabled, .consultation-retry:disabled { cursor: not-allowed; opacity: 0.5; }
|
||||
|
||||
@@ -61,7 +61,8 @@ for (const width of [319, 508]) {
|
||||
await expect(composer.locator('.consultation-hint')).toHaveCount(0);
|
||||
await expect(shortcuts.first()).toHaveCSS('font-size', await panel.getByTestId('teacher-reply').first().evaluate(el => getComputedStyle(el).fontSize));
|
||||
await expect(shortcuts.first()).toHaveCSS('font-weight', '400');
|
||||
await expect(shortcuts.first()).toHaveCSS('box-shadow', 'none');
|
||||
await expect(shortcuts.first()).toHaveCSS('border-top-width', '0px');
|
||||
await expect(shortcuts.first()).not.toHaveCSS('box-shadow', 'none');
|
||||
expect((await row.boundingBox())!.y + (await row.boundingBox())!.height).toBeLessThan((await composer.boundingBox())!.y);
|
||||
await shortcuts.first().focus();
|
||||
await expect(shortcuts.first()).toHaveCSS('outline-style', 'solid');
|
||||
@@ -129,11 +130,11 @@ for (const width of [319, 508]) {
|
||||
await expect(hint).toBeEnabled();
|
||||
await expect(hint).toHaveText('帮我整体看🧠');
|
||||
expect(await hint.evaluate(el => el.scrollWidth <= el.clientWidth && el.scrollHeight <= el.clientHeight)).toBe(true);
|
||||
await expect(hint).toHaveCSS('background-color', 'rgb(250, 245, 232)');
|
||||
await expect(hint).toHaveCSS('background-color', 'rgb(248, 241, 226)');
|
||||
const initialSend = (await send.boundingBox())!;
|
||||
const hintBounds = (await hint.boundingBox())!;
|
||||
expect(hintBounds.x).toBeLessThan(initialSend.x);
|
||||
expect(hintBounds.height).toBeGreaterThanOrEqual(36);
|
||||
expect(hintBounds.height).toBe(30);
|
||||
expect(hintBounds.y + hintBounds.height).toBeLessThan((await page.locator('.consultation-composer').boundingBox())!.y);
|
||||
await page.getByTestId('teacher-chat-panel').screenshot({ path: test.info().outputPath(`composer-hint-${width}.png`) });
|
||||
expect(await sent()).toEqual([]);
|
||||
|
||||
Reference in New Issue
Block a user