minecodex 2.0.4 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DESIGN.md +25 -1
- package/README.md +4 -2
- package/features/images/DESIGN.md +106 -41
- package/features/images/README.md +25 -16
- package/features/images/codex-feature.json +6 -3
- package/features/images/src/adapters/codex/image-prompt.mjs +24 -2
- package/features/images/src/adapters/codex/image-sources.mjs +19 -0
- package/features/images/src/adapters/codex/library-api.mjs +2 -0
- package/features/images/src/adapters/codex/library-viewer.mjs +26 -2
- package/features/images/src/adapters/codex/native-image-source.mjs +556 -0
- package/features/images/src/backend/local-image-source.mjs +138 -0
- package/features/images/src/frontend/cloud-image-actions.mjs +39 -0
- package/features/images/src/frontend/local-image-source.mjs +194 -0
- package/features/images/src/library-prompt-page.mjs +158 -53
- package/features/images/src/library-prompt-source.mjs +11 -3
- package/features/images/src/prompt-index.mjs +14 -2
- package/features/model-slider/DESIGN.md +2 -0
- package/features/model-slider/src/frontend/install.mjs +78 -11
- package/features/notes/DESIGN.md +7 -3
- package/features/notes/src/frontend/entry.mjs +26 -9
- package/features/session-status/DESIGN.md +4 -2
- package/features/session-status/src/adapters/codex/session-log.mjs +2 -1
- package/features/session-status/src/domain/session-stats.mjs +17 -9
- package/features/session-status/src/session-status.mjs +47 -11
- package/package.json +1 -1
- package/packages/codex-adapter/README.md +2 -1
- package/packages/codex-adapter/src/renderer/environment.mjs +24 -6
- package/packages/runtime-host/src/codex-injection.mjs +3 -6
- package/packages/runtime-host/src/codex-runtime.mjs +16 -5
- package/packages/runtime-host/src/feature-registry.mjs +1 -0
- package/packages/ui/DESIGN.md +5 -2
- package/packages/ui/src/components/button.mjs +2 -0
- package/packages/ui/src/components/navigation-rail.mjs +18 -10
- package/packages/ui/src/components/page.mjs +9 -2
- package/packages/ui/src/install.mjs +3 -1
- package/packages/ui/src/native/navigation-rail.mjs +6 -1
- package/packages/ui/src/native/page.mjs +23 -0
- package/packages/ui/src/native/tokens.mjs +3 -0
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
export function installPage(signal, ui) {
|
|
1
|
+
export function installPage(signal, ui, native) {
|
|
2
|
+
const pages = new Map();
|
|
3
|
+
signal.addEventListener("abort", () => { for (const lease of pages.values()) lease.release(); pages.clear(); }, { once:true });
|
|
2
4
|
return {
|
|
3
|
-
page(node, { transparent = false } = {}) {
|
|
5
|
+
page(node, { transparent = false, sidebar = "inherit" } = {}) {
|
|
6
|
+
if (sidebar === "none" && !pages.has(node)) pages.set(node, native.standalone());
|
|
4
7
|
ui.surface(node, "page", { variant:transparent ? "transparent" : "opaque" });
|
|
5
8
|
return ui.layer(node, "page");
|
|
6
9
|
},
|
|
10
|
+
releasePage(node, options) {
|
|
11
|
+
pages.get(node)?.release(options);
|
|
12
|
+
pages.delete(node);
|
|
13
|
+
},
|
|
7
14
|
};
|
|
8
15
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createNativeThemeAdapter } from "./native/theme.mjs";
|
|
2
|
+
import { createNativePageAdapter } from "./native/page.mjs";
|
|
2
3
|
import { createNativeRailAdapter } from "./native/navigation-rail.mjs";
|
|
3
4
|
import { installSurfaces } from "./foundation/surfaces.mjs";
|
|
4
5
|
import { installLayers } from "./foundation/layers.mjs";
|
|
@@ -11,10 +12,11 @@ import { installFeatureTooltips } from "./components/tooltip.mjs";
|
|
|
11
12
|
|
|
12
13
|
// 所有依赖在组装时显式写入源码,Renderer 不依赖 Node 模块闭包。
|
|
13
14
|
export function createUIInstallerSource() {
|
|
14
|
-
const installers = [installSurfaces, installLayers, installDialog, installButton,
|
|
15
|
+
const installers = [installSurfaces, installLayers, installDialog, installButton, installComposerMenu];
|
|
15
16
|
return `function installFeatureUI(signal, context) {
|
|
16
17
|
const ui = {theme:(${createNativeThemeAdapter.toString()})(context.themeTokens,context.themeTokenAliases,context.themeBindings)};
|
|
17
18
|
${installers.map(install => `Object.assign(ui, (${install.toString()})(signal, ui));`).join("\n")}
|
|
19
|
+
Object.assign(ui, (${installPage.toString()})(signal, ui, (${createNativePageAdapter.toString()})(context.codex)));
|
|
18
20
|
Object.assign(ui, (${installNavigationRail.toString()})(signal, ui, (${createNativeRailAdapter.toString()})(context.codex)));
|
|
19
21
|
Object.assign(ui, (${installFeatureTooltips.toString()})(signal));
|
|
20
22
|
return ui;
|
|
@@ -28,6 +28,11 @@ export function createNativeRailAdapter(codex) {
|
|
|
28
28
|
}
|
|
29
29
|
return defaultIcons.get(node)?.cloneNode(true) ?? null;
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
function attributes(node, names) {
|
|
32
|
+
const props = codex.currentFiber(node)?.memoizedProps;
|
|
33
|
+
if (!props || !names.some(name => Object.hasOwn(props, name))) return null;
|
|
34
|
+
return new Map(names.map(name => [name, props[name] == null ? null : String(props[name])]));
|
|
35
|
+
}
|
|
36
|
+
return { item:nativeItem, icon:defaultIcon, attributes,
|
|
32
37
|
remember:(node, icon) => defaultIcons.set(node, icon.cloneNode(true)) };
|
|
33
38
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// 原生页面壳由路由决定;借用 Projects 的无上下文侧栏壳,不改侧栏展开偏好。
|
|
2
|
+
export function createNativePageAdapter(codex) {
|
|
3
|
+
function standalone() {
|
|
4
|
+
const rail = codex.rail();
|
|
5
|
+
const scope = codex.props(rail, props => Boolean((props.router ?? props.value?.router)?.navigate));
|
|
6
|
+
const router = scope?.router ?? scope?.value?.router;
|
|
7
|
+
const origin = router?.state?.location;
|
|
8
|
+
if (!origin) throw new Error("The native page navigation was not found");
|
|
9
|
+
const target = "/projects";
|
|
10
|
+
const changed = origin.pathname !== target;
|
|
11
|
+
if (changed) void router.navigate(target, { replace:true, state:origin.state });
|
|
12
|
+
let released = false;
|
|
13
|
+
return {
|
|
14
|
+
release({ restoreNavigation=true } = {}) {
|
|
15
|
+
if (released) return;
|
|
16
|
+
released = true;
|
|
17
|
+
if (changed && restoreNavigation && router.state.location.pathname === target)
|
|
18
|
+
void router.navigate(origin, { replace:true, state:origin.state });
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { standalone };
|
|
23
|
+
}
|
|
@@ -135,6 +135,9 @@ export const CODEX_THEME_TOKENS = Object.freeze([
|
|
|
135
135
|
"--color-background-danger-soft-alpha",
|
|
136
136
|
"--color-background-danger-soft-alpha-hover",
|
|
137
137
|
"--color-text-danger",
|
|
138
|
+
"--color-background-danger-solid",
|
|
139
|
+
"--color-background-danger-solid-hover",
|
|
140
|
+
"--color-text-danger-solid",
|
|
138
141
|
]);
|
|
139
142
|
|
|
140
143
|
// images 图片编辑器可用性依赖的项目 token 子集。
|