Files
xiaobaifupan/app/frontend/pages.config.js
T
MS-01-Codexandmultica-agent 8ac3adbb5d feat: restore mentor page to final day/night spec
Rebuild the mentor workspace per the approved final design (day.png/night.png):
- mentorView gets a dedicated full-width immersive shell (independent 56px
  top bar with page title slot + theme mode text, hidden module-nav/market
  tape/overview/status bar) scoped to body[data-active-view=mentorView].
- Assistant messages become borderless body text with name/time above; only
  user messages use a blue bubble; keep loading/error/streaming caret states.
- 4 quick topics stay visible with history; composer restored to a framed
  ~94px card with bottom-left shortcut hint and bottom-right send button.
- Directory tools merged into one row (search + filter menu + sort); the
  filter menu still offers all/A/B/C; list selected state is an inset rounded
  fill; contact rows are borderless 75px items.
- Chat header always shows pin/note/profile/clear; pin reuses /api/mentors/
  preferences; theme toggle stays the single #themeToggle.
- Night tokens match the spec including the two distinct blues (#316FEF link,
  #5B8DEF quote/selected icon). Mobile (<768) stacks panels with no horizontal
  overflow; 1024+ follows the desktop spec.
- Update stale test baselines (300px sidebar, 94px composer, hint presence,
  night bubble color, centered disclaimer) and regenerate the architecture
  inventory.

Co-authored-by: multica-agent <github@multica.ai>
2026-08-18 11:54:57 +08:00

131 lines
5.3 KiB
JavaScript

(function exposePageRegistry(global) {
"use strict";
const pages = [
["sentimentCycleView", "情绪周期", "sentiment", "market", "authenticated", true],
["limitPool", "涨停池", "pools", "market", "authenticated", false],
["brokenView", "炸板池", "pools", "market", "authenticated", false],
["downView", "跌停板", "pools", "market", "authenticated", false],
["yesterdayView", "昨日涨停", "pools", "market", "authenticated", false],
["performanceView", "涨停表现", "pools", "market", "authenticated", false],
["ladderView", "市场天梯", "ladder", "market", "authenticated", false],
["rotationView", "板块轮动", "rotation", "market", "authenticated", false],
["auctionView", "集合竞价", "auction", "market", "authenticated", false],
["themeLibraryView", "题材库", "themes", "market", "authenticated", false],
["popularityView", "人气热榜", "popularity", "market", "authenticated", false],
["dragonView", "龙虎榜", "dragon_tiger", "market", "authenticated", false],
["screenerView", "智能选股", "screener", "intelligence", "member", false],
["mentorView", "问师", "mentor", "intelligence", "member", false],
["heavenView", "问天", "heaven", "intelligence", "member", false],
["reviewWorkspaceView", "我的复盘", "review", "personal", "authenticated", false],
].map(([id, title, feature, group, access, isDefault]) => Object.freeze({
id,
title,
feature,
group,
access,
default: isDefault,
desktop_scroll: "page",
mobile_layout: "dedicated",
}));
const internalPages = [
Object.freeze({
id: "screenerTrackingView",
title: "策略持续跟踪",
feature: "screener",
group: "intelligence",
access: "member",
internal: true,
navigation_alias: "screenerView",
}),
];
const fragments = [
["pools", "/pages/pools/page.html?v=20260803-1", ["limitPool", "brokenView", "downView", "yesterdayView", "performanceView"]],
["sentiment", "/pages/sentiment/page.html?v=20260803-1", ["sentimentCycleView"]],
["heaven", "/pages/heaven/page.html?v=20260803-1", ["heavenView"]],
["ladder", "/pages/ladder/page.html?v=20260803-1", ["ladderView"]],
["screener", "/pages/screener/page.html?v=20260804-1", ["screenerView", "screenerTrackingView"]],
["mentor", "/pages/mentor/page.html?v=20260818-1", ["mentorView"]],
["rotation", "/pages/rotation/page.html?v=20260803-1", ["rotationView"]],
["auction", "/pages/auction/page.html?v=20260803-1", ["auctionView"]],
["themes", "/pages/themes/page.html?v=20260803-1", ["themeLibraryView"]],
["popularity", "/pages/popularity/page.html?v=20260803-1", ["popularityView"]],
["dragon_tiger", "/pages/dragon-tiger/page.html?v=20260803-1", ["dragonView"]],
["review", "/pages/review/page.html?v=20260803-1", ["reviewWorkspaceView"]],
].map(([feature, url, viewIds]) => Object.freeze({
feature,
url,
viewIds: Object.freeze(viewIds),
}));
const runtimeScripts = [
"/vendor/lucide.min.js",
"/shared/ui-core.js",
"/shared/components.js?v=20260729-1",
"/pages/runtime.js?v=20260729-1",
"/pages/sentiment/page.js?v=20260729-1",
"/pages/pools/page.js?v=20260729-1",
"/pages/market/breadth.js?v=20260803-1",
"/pages/market/charts.js?v=20260803-1",
"/pages/market/entity-detail.js?v=20260803-1",
"/pages/market/stock-detail.js?v=20260803-1",
"/pages/market/preview.js?v=20260806-1",
"/pages/market/search.js?v=20260803-1",
"/pages/market/bindings.js?v=20260803-1",
"/pages/ladder/page.js?v=20260729-1",
"/pages/rotation/page.js?v=20260729-1",
"/pages/auction/page.js?v=20260729-1",
"/pages/themes/page.js?v=20260729-1",
"/pages/popularity/page.js?v=20260729-1",
"/pages/dragon-tiger/page.js?v=20260806-1",
"/pages/screener/page.js?v=20260806-1",
"/pages/mentor/page.js?v=20260818-1",
"/pages/heaven/page.js?v=20260729-1",
"/pages/review/page.js?v=20260729-1",
"/shared/state.js?v=20260729-1",
"/shared/api.js?v=20260729-1",
"/shared/shell.js?v=20260806-1",
"/shared/export.js?v=20260731-1",
"/pages/heaven/loading-v2.js?v=20260728-2",
"/shared/context.js?v=20260804-1",
"/shared/feedback.js?v=20260803-1",
"/shared/application.js?v=20260803-1",
"/shared/table.js?v=20260803-1",
"/shared/theme.js?v=20260803-1",
"/shared/dashboard.js?v=20260803-1",
"/shared/session.js?v=20260803-1",
"/shared/admin.js?v=20260803-1",
"/app.js?v=20260803-2",
];
const all = [...pages, ...internalPages];
const byId = new Map(all.map((page) => [page.id, page]));
const defaultPage = pages.find((page) => page.default);
const aliases = Object.freeze({ sectorView: "rotationView", breadthView: "limitPool" });
global.XiaobaiPages = Object.freeze({
schemaVersion: 1,
pages: Object.freeze(pages),
internalPages: Object.freeze(internalPages),
all: Object.freeze(all),
fragments: Object.freeze(fragments),
runtimeScripts: Object.freeze(runtimeScripts),
defaultPage,
aliases,
resolve(id) {
return aliases[id] || id;
},
get(id) {
return byId.get(id) || null;
},
has(id) {
return byId.has(id);
},
inGroup(id, group) {
return byId.get(id)?.group === group;
},
});
})(window);