fix: resolve QA report issues across routing, editor, i18n, and pipeline

- Add /tools/:toolId legacy redirect and catch-all 404 page (P1-12, P1-13)
- Add Shift+O dodge/burn/sponge cycle and Ctrl+Y redo shortcut (P1-3, P1-4)
- Fix Fit on Screen menu action to properly compute fit zoom (P1-8)
- Add filename input to editor export dialog (P1-2)
- Fix password validation mismatch: frontend now requires 8 chars (P1-11)
- Add license info to Settings About section (P1-9)
- Replace hardcoded strings in dropzone, files, pipeline with i18n keys (P1-17 to P1-25)
- Add 20+ missing i18n keys to all 21 locale files
- Translate Japanese editor.shapes and settings.aiFeatures sections (P1-19, P1-20)
- Fix RTL: use logical CSS properties in sidebar, files, app-layout (P2-24 to P2-26)
- Add single-file download button to pipeline results (P1-28)
- Fix compress step settings restoration on pipeline load (P1-27)
- Increase mobile nav touch targets to 44px minimum (P2-29)
This commit is contained in:
SnapOtter
2026-06-05 22:31:28 +08:00
parent 91e90b390e
commit 07e12754ba
35 changed files with 706 additions and 44 deletions
+31 -2
View File
@@ -41,6 +41,8 @@ const SHAPE_CYCLE: ToolType[] = [
"shape-polygon",
"shape-star",
];
// Dodge/burn/sponge cycle
const DODGE_CYCLE: ToolType[] = ["dodge", "burn", "sponge"];
// Fill/gradient cycle
const FILL_CYCLE: ToolType[] = ["fill", "gradient"];
@@ -199,12 +201,29 @@ export function useEditorShortcuts(callbacks?: {
{ preventDefault: true },
);
// O - Dodge tool
// O - Dodge/Burn/Sponge (cycles)
useHotkeys(
"o",
() => {
if (isInputFocused()) return;
useEditorStore.getState().setTool("dodge");
const current = useEditorStore.getState().activeTool;
if (DODGE_CYCLE.includes(current)) {
useEditorStore.getState().setTool(cycleSubtool(current, DODGE_CYCLE));
} else {
useEditorStore.getState().setTool("dodge");
}
},
{ preventDefault: true },
);
// Shift+O - Cycle dodge/burn/sponge subtypes
useHotkeys(
"shift+o",
() => {
if (isInputFocused()) return;
useEditorStore
.getState()
.setTool(cycleSubtool(useEditorStore.getState().activeTool, DODGE_CYCLE));
},
{ preventDefault: true },
);
@@ -361,6 +380,16 @@ export function useEditorShortcuts(callbacks?: {
{ preventDefault: true },
);
// Ctrl+Y / Cmd+Y - Redo (alternative)
useHotkeys(
"mod+y",
(e) => {
e.preventDefault();
useEditorStore.temporal.getState().redo();
},
{ preventDefault: true },
);
// Ctrl+S / Cmd+S - Save project
useHotkeys(
"mod+s",