Show icon-only Code return above sidebar branding
This commit is contained in:
@@ -8,11 +8,11 @@
|
||||
- Worktree: /Users/chillishark/Makelore 麦洛/.codex-worktrees/makelore/20260929-empty-work-merge-39c633d0
|
||||
- Base commit: a77ddbd6813bb71d490544edfef6e1f35240070f
|
||||
- Owner: codex
|
||||
- Status: Ready for Integration
|
||||
- Status: Planning
|
||||
|
||||
## Scope
|
||||
|
||||
- Move the existing “编程 Code” module-home return entry from the project configuration sidebar into the Coding chat/workspace sidebar navigation row immediately below the topmost brand. Retain its `/module-select` target and the configuration page's own back action.
|
||||
- Move the existing “编程 Code” module-home return entry from the project configuration sidebar into the Coding chat/workspace sidebar as an icon-only arrow in the top navigation row above the brand. Retain its `/module-select` target and the configuration page's own back action.
|
||||
|
||||
## Intent And Constraints
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
## Outcome
|
||||
|
||||
- Reused the existing ModuleSwitcher at the left of the navigation row below the topmost brand in the `/chat` sidebar, aligned with the collapse control on the right, retaining its accessible return-home label and `/module-select` action. Project configuration and nested resource pages omit the entire sidebar header block, so no empty placeholder remains. Existing configuration back action, sidebar resizing/peek and other module controls are unchanged. README synchronized.
|
||||
- Reused the existing ModuleSwitcher as an icon-only arrow at the left of the top navigation row above the brand in the `/chat` sidebar, aligned with the collapse control on the right, retaining its accessible return-home label and `/module-select` action. Project configuration and nested resource pages omit the entire sidebar header block, so no empty placeholder remains. Existing configuration back action, sidebar resizing/peek and other module controls are unchanged. README synchronized.
|
||||
|
||||
## Verification
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
## Promotion Candidates
|
||||
|
||||
- Target: canonical classroom navigation when next integrated. Proposal: Code module-home return is visible below the topmost chat sidebar brand, aligned with the right-side collapse control and omitted from project configuration/resource sidebars; original configuration back remains. Evidence: explicit user confirmation, existing component reuse, actual Electron navigation and screenshots. No architecture or module-target change; no further product confirmation required.
|
||||
- Target: canonical classroom navigation when next integrated. Proposal: the icon-only module-home return is visible above the chat sidebar brand, aligned with the right-side collapse control and omitted from project configuration/resource sidebars; original configuration back remains. Evidence: explicit user confirmation, existing component reuse, actual Electron navigation and screenshots. No architecture or module-target change; no further product confirmation required.
|
||||
|
||||
## Follow-up: Update The Temporary Renderer
|
||||
|
||||
@@ -99,3 +99,13 @@
|
||||
|
||||
- Final composite publication completed after the peer finalized fd0b720. Current source is `sidebar-groups-33d87a81/source-with-text-shortcuts`, JS `index-Cyy0gXYn.js`, common CSS `index-CA1PKQZ_.css`, classroom route CSS `index-BwzfBikL.css`. Applied only the two-file sidebar patch to the published teacher-text-shortcuts source; composite typecheck/lint/build passed and full source comparison confirmed no unrelated delta.
|
||||
- Final live verification confirms both changes together: exact sidebar grouping/20px separation and teacher shortcut text has transparent background, no shadow/border and the new route stylesheet loaded. Account, current conversation/messages, 14 drafts, open teacher panel/content and Work tab match this final pre-refresh snapshot; all 34 data hashes unchanged and no alerts. This final user-visible panel/tab state supersedes the earlier snapshot because the user/peer changed it during concurrent work. Main remains PID 32583. Finalization updated launch/guidance/build provenance with fd0b720 + 774f1b7, released the lease, restored throttling and closed the inspector opened for this second refresh. No required work remains for the temporary-app request.
|
||||
|
||||
|
||||
## Follow-up: Icon-Only Return Above Branding
|
||||
|
||||
- User now explicitly supersedes the prior brand-first ordering: remove the visible Code return text, retain only its arrow, and place the control row above Makelore at the top. Keep the right-side collapse icon aligned and preserve the public-navigation/personal-project grouping.
|
||||
- Project Context Loaded / Planning Gate: Passed. Exact same-task feature ownership, worktree, branch and base verified. Shared context unchanged from a57d073; active record and all peer scopes reread. Teacher shortcut task is active and teacher composer height work is active but scoped away from navigation. Use current published Renderer, check for concurrent publication and retain existing overlays.
|
||||
- Plan: add an icon-only presentation to the existing ModuleSwitcher for this Code toolbar only, move the toolbar ahead of the brand, preserve accessible label/tooltip/return target, adapt existing layout/navigation verification, build and update the same trial/profile. No main merge, remote push or formal-app replacement.
|
||||
|
||||
- Implemented an icon-only 32px ModuleSwitcher in the top Code toolbar above branding. Existing return target, accessible name/tooltip, right collapse alignment, Works Square and personal-project grouping are retained. Updated README and the existing navigation scenario. Typecheck, scoped lint, production build and 26 unit tests passed; the existing Electron scenario passed (1/1) with icon text absence, 32px geometry, above-brand/top placement, 128px width, config/nested absence and collapsed hover return. Default-width screenshot inspected; independent review passed.
|
||||
- Trial preparation detected a newer teacher-text-depth publication while our candidate was being validated. Rebase the generated candidate onto the actually served source before updating; no live files changed by this task yet.
|
||||
|
||||
@@ -31,7 +31,7 @@ Makelore 是一个面向软件、视觉创作、智能机器人与个人云智
|
||||
- macOS 窗口按钮:红色关闭当前窗口,全屏时先退出全屏再关闭;黄色最小化,绿色保留原生缩放/全屏行为。关窗后应用和进行中的后台任务继续运行,点击 Dock、托盘或菜单可重新打开窗口;`Cmd+Q` 退出应用。
|
||||
- 桌面文本右键菜单:主 Renderer 窗口由 Electron Main 提供原生“剪切、复制、粘贴、全选”操作;菜单只在可编辑区域或已有文本选择时出现,普通空白区域不显示,也不向 Renderer 暴露剪贴板 IPC。
|
||||
- AI 编程核心对话运行时:Electron Main 按需启动一个长驻 Pi Agent Server,同一进程内为每条 Conversation 建立独立的 Runtime、Session、凭证视图、扩展上下文和 JSONL 通道,同时复用 Pi 模块与进程启动成本;Server 异常退出时所有旧通道统一失效,下一次恢复只重启一个 Server。正式包中的 Agent Server 从明确传入的 `resources/pi-runtime` 根定位依赖清单与包入口,不从脚本所在目录或应用 `node_modules` 猜测解析。Renderer 不直接启动或调用 Pi,也不读取其 wire 类型。项目与 Conversation 元数据先从本地读取,选中对话后才按需准备对应逻辑线程;输入框不等待运行时准备完成。同一助手工具批次中,会取得项目写租约的 `bash`、`edit`、`write` 与动态产品工具按顺序执行,避免批次在命令启动前自锁;纯只读工具仍可并行。子 Agent 仍使用独立的短生命周期进程,以保留并发配额、故障和写入边界;macOS 上两类后台进程都使用 Electron 自带的 Helper,不在 Dock 中创建额外应用图标。
|
||||
- AI 编程默认入口:进入 Code 后保持在 `/chat`。左侧栏压缩顶部留白,最顶部显示麦洛品牌区,其下提供同排导航:左侧“← 编程 Code”返回模块选择首页,右侧收起侧栏;窄侧栏仅省略溢出的文字,折叠后的展开入口保持在标题栏。导航行下方紧接“作品广场”;与其留出分组间距后,依次为“新建项目”“我的项目”和项目列表,将公共导航与个人项目操作分组;项目配置及其资源子页不再重复显示此侧栏入口,保留配置页自身的返回操作。尚未选择本地项目时,页面以麦洛 M 标识和居中引导语建立焦点,下方提供独立的“新增项目”主操作以及可横向浏览、直接进入的已有项目卡片;项目创建和进入仍复用侧栏现有流程。已有项目的新 Conversation 在可编辑 Composer 上方沿用同一品牌引导,第一条消息出现后切换为正常时间线。
|
||||
- AI 编程默认入口:进入 Code 后保持在 `/chat`。左侧栏顶部提供同排图标:左侧仅显示返回箭头,点击返回模块选择首页,右侧收起侧栏;返回按钮保留“返回首页”提示,折叠后的展开入口保持在标题栏。图标行下方依次显示麦洛品牌区与“作品广场”;与其留出分组间距后,依次为“新建项目”“我的项目”和项目列表,将公共导航与个人项目操作分组;项目配置及其资源子页不再重复显示此侧栏入口,保留配置页自身的返回操作。尚未选择本地项目时,页面以麦洛 M 标识和居中引导语建立焦点,下方提供独立的“新增项目”主操作以及可横向浏览、直接进入的已有项目卡片;项目创建和进入仍复用侧栏现有流程。已有项目的新 Conversation 在可编辑 Composer 上方沿用同一品牌引导,第一条消息出现后切换为正常时间线。
|
||||
- AI 编程历史与配额反馈:Pi 上下文压缩不删除用户可见的 active-branch 历史,压缩摘要保持 Main-private;Renderer 首次渲染最近 120 个节点,向上滚动时按 100 个节点追加更早内容并保持阅读位置。Main 精确识别 `token_point_balance_exhausted` / `词元点数余额不足`,只向 Renderer 投影不可重试的稳定配额错误和安全中文提示,重开会话后仍可见且不暴露上游原始错误或 request id。
|
||||
- 账号词元点数:左下角账户菜单显示本人永久余额和预占,提供充值、充值订单与分页收支记录。真正新注册赠送 100 点,1 元充值 50 点,永久有效;旧账户不补送,旧会员/订阅/周额度/重置卡入口已移除。家长充值始终进入自己的钱包,青少年可查看自己的精确余额;使用他人共享钱包时仅显示可用状态,不显示付款人的余额或记录。Main 持有凭据并转发充值请求;付款结果未知时沿用原请求并核查原订单,只有服务端确认才显示到账。扫码信息缺失时可到网页账户页继续原订单,付款来源也由网页账户页管理。需配套部署 Works Square 永久点数 API 与 0094 迁移;本地模拟验收不代表真实支付通过。
|
||||
- 桌面性能策略:应用窗口使用不透明浅色表面并默认保留硬件合成;仅在显式安全模式或短时间内重复 GPU 进程崩溃时启用软件渲染,并把故障原因保存在用户数据目录。启动关键路径只创建本地应用壳,认证、代理、同步、更新和遥测在首帧后延迟初始化;开发版可通过 `app:performance` 快照观察 GPU、进程、WebContents、事件循环与 Renderer Long Task 聚合指标。
|
||||
|
||||
@@ -3,7 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
|
||||
import { cn } from '@/lib/utils';
|
||||
import { AI_MODULE_SELECTION_PATH, aiModules, getAiModuleForPath } from '@/lib/ai-modules';
|
||||
|
||||
export function ModuleSwitcher({ sidebarCollapsed, compact = false, toolbar = false }: { sidebarCollapsed: boolean; compact?: boolean; toolbar?: boolean }) {
|
||||
export function ModuleSwitcher({ sidebarCollapsed, compact = false, toolbar = false, iconOnly = false }: { sidebarCollapsed: boolean; compact?: boolean; toolbar?: boolean; iconOnly?: boolean }) {
|
||||
const location = useLocation();
|
||||
const navigate = useNavigate();
|
||||
const activeModuleId = getAiModuleForPath(location.pathname);
|
||||
@@ -29,6 +29,7 @@ export function ModuleSwitcher({ sidebarCollapsed, compact = false, toolbar = fa
|
||||
? 'inline-flex min-h-9 w-fit translate-y-2 justify-start gap-1.5 rounded-xl p-2 text-xs'
|
||||
: 'flex min-h-11 w-full justify-between gap-2 rounded-2xl p-3 text-sm',
|
||||
sidebarCollapsed ? 'justify-center px-0' : '',
|
||||
toolbar && iconOnly && 'w-8 justify-center px-0',
|
||||
)}
|
||||
>
|
||||
<ArrowLeft
|
||||
@@ -36,7 +37,7 @@ export function ModuleSwitcher({ sidebarCollapsed, compact = false, toolbar = fa
|
||||
aria-hidden="true"
|
||||
className="h-4 w-4 shrink-0 -translate-y-px text-muted-foreground transition-[color,transform] duration-150 group-hover:-translate-x-0.5 group-hover:text-brand"
|
||||
/>
|
||||
{!sidebarCollapsed ? <span className={cn('min-w-0 whitespace-nowrap leading-4', toolbar && 'truncate')}>{activeModuleLabel}</span> : null}
|
||||
{!sidebarCollapsed && !iconOnly ? <span className={cn('min-w-0 whitespace-nowrap leading-4', toolbar && 'truncate')}>{activeModuleLabel}</span> : null}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -415,12 +415,8 @@ export function Sidebar({
|
||||
)}
|
||||
>
|
||||
<div className="min-w-0 w-full">
|
||||
{workspaceLayout && <button type="button" aria-label="返回首页" title="返回首页" onClick={() => navigate('/module-select')} className="classroom-brand flex w-full items-center gap-2 rounded-lg text-left">
|
||||
<span className="classroom-brand-mark"><img src={classroomMark} alt="" className="h-7 w-7" /></span>
|
||||
<span className="min-w-0"><span className="block text-base font-semibold tracking-tight">麦洛</span><span className="classroom-brand-caption">把脑洞变成作品</span></span>
|
||||
</button>}
|
||||
{workspaceLayout && <div className="no-drag flex h-10 min-w-0 items-center gap-1" data-testid="classroom-sidebar-navigation">
|
||||
<ModuleSwitcher sidebarCollapsed={sidebarCollapsed} toolbar />
|
||||
<ModuleSwitcher sidebarCollapsed={sidebarCollapsed} toolbar iconOnly />
|
||||
{!sidebarPinnedCollapsed && ['darwin', 'win32'].includes(window.electron?.platform ?? '') && <button
|
||||
type="button"
|
||||
data-testid="titlebar-sidebar-toggle"
|
||||
@@ -431,6 +427,10 @@ export function Sidebar({
|
||||
className="no-drag motion-press flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-surface-subtle hover:text-foreground"
|
||||
><PanelLeftClose className="h-4 w-4" /></button>}
|
||||
</div>}
|
||||
{workspaceLayout && <button type="button" aria-label="返回首页" title="返回首页" onClick={() => navigate('/module-select')} className="classroom-brand flex w-full items-center gap-2 rounded-lg text-left">
|
||||
<span className="classroom-brand-mark"><img src={classroomMark} alt="" className="h-7 w-7" /></span>
|
||||
<span className="min-w-0"><span className="block text-base font-semibold tracking-tight">麦洛</span><span className="classroom-brand-caption">把脑洞变成作品</span></span>
|
||||
</button>}
|
||||
{workspaceLayout && <CommunityLink variant="sidebar" collapsed={sidebarCollapsed} />}
|
||||
{!workspaceLayout && <ModuleSwitcher sidebarCollapsed={sidebarCollapsed} compact={!sidebarCollapsed} />}
|
||||
</div>
|
||||
|
||||
@@ -80,8 +80,9 @@ test.describe('Makelore module navigation without setup flow', () => {
|
||||
const sidebar = page.getByTestId('sidebar');
|
||||
const moduleReturn = sidebar.getByTestId('sidebar-module-switcher-trigger');
|
||||
await expect(moduleReturn).toBeVisible();
|
||||
await expect(moduleReturn).toContainText('编程 Code');
|
||||
await expect(moduleReturn).toHaveText('');
|
||||
await expect(moduleReturn).toHaveAttribute('aria-label', '返回首页');
|
||||
await expect(moduleReturn).toHaveAttribute('title', '返回首页');
|
||||
await expect(sidebar.getByTestId('sidebar-module-return-icon')).toBeVisible();
|
||||
const brandBox = await sidebar.locator('.classroom-brand').boundingBox();
|
||||
const returnBox = await moduleReturn.boundingBox();
|
||||
@@ -90,8 +91,9 @@ test.describe('Makelore module navigation without setup flow', () => {
|
||||
expect(brandBox).not.toBeNull();
|
||||
expect(returnBox).not.toBeNull();
|
||||
expect(collapseBox).not.toBeNull();
|
||||
expect(returnBox!.y).toBeGreaterThanOrEqual(brandBox!.y + brandBox!.height);
|
||||
expect(brandBox!.y - sidebarBox!.y).toBeLessThanOrEqual(1);
|
||||
expect(returnBox!.y + returnBox!.height).toBeLessThanOrEqual(brandBox!.y);
|
||||
expect(returnBox!.y - sidebarBox!.y).toBeLessThanOrEqual(4);
|
||||
expect(returnBox!.width).toBe(32);
|
||||
expect(Math.abs(returnBox!.y + returnBox!.height / 2 - collapseBox!.y - collapseBox!.height / 2)).toBeLessThan(1);
|
||||
expect(returnBox!.x + returnBox!.width).toBeLessThanOrEqual(collapseBox!.x);
|
||||
expect(sidebarBox!.x + sidebarBox!.width - collapseBox!.x - collapseBox!.width).toBeLessThanOrEqual(14);
|
||||
@@ -101,8 +103,8 @@ test.describe('Makelore module navigation without setup flow', () => {
|
||||
const communityBox = await community.boundingBox();
|
||||
const createBox = await sidebar.getByTestId('sidebar-create-project').boundingBox();
|
||||
const headingBox = await sidebar.locator('.classroom-projects-heading').boundingBox();
|
||||
expect(communityBox!.y).toBeGreaterThanOrEqual(returnBox!.y + returnBox!.height);
|
||||
expect(communityBox!.y - returnBox!.y - returnBox!.height).toBeLessThanOrEqual(8);
|
||||
expect(communityBox!.y).toBeGreaterThanOrEqual(brandBox!.y + brandBox!.height);
|
||||
expect(communityBox!.y - brandBox!.y - brandBox!.height).toBeLessThanOrEqual(8);
|
||||
expect(createBox!.y - communityBox!.y - communityBox!.height).toBeGreaterThanOrEqual(16);
|
||||
expect(headingBox!.y).toBeGreaterThanOrEqual(createBox!.y + createBox!.height);
|
||||
expect(headingBox!.y - createBox!.y - createBox!.height).toBeLessThanOrEqual(14);
|
||||
|
||||
Reference in New Issue
Block a user