A familiar editor layout has to do more than resemble its reference. In Si, our browser-based vector editor, the workspace must distinguish a persistent preference from a temporary interaction. This is the second development entry, following a study of request-time document snapshots.
Three meanings of “hidden”
The current workspace source has three separate fields: allHidden, sideHidden, and collapsed. They describe hiding the broad interface, hiding only the side area, and keeping a compact panel arrangement. panel records the selected panel. A single visibility flag would erase information needed to restore the previous arrangement.
The reducer toggles those fields independently. An explicit panel selection also clears the two hiding flags, so asking for Layers can actually reveal Layers. Here is the current reducer, from src/ui/workspace-state.ts:
export function workspaceReducer(s:WorkspaceState,a:WorkspaceAction):WorkspaceState{
switch(a.type){
case 'toggleAll':return {...s,allHidden:!s.allHidden};
case 'toggleSide':return {...s,sideHidden:!s.sideHidden};
case 'panel':return {...s,allHidden:false,sideHidden:false,collapsed:a.toggle&&s.panel===a.panel&&!s.collapsed&&!s.sideHidden&&!s.allHidden?true:false,panel:a.panel};
case 'reset':return {...DEFAULT_WORKSPACE};
case 'patch':return {...s,...a.patch};
}
}
The screenshot is from the current public interface. The original stage-two implementation had a preview artboard, while later stages connected document and drawing engines. I am keeping those stages separate rather than using a current screenshot to claim every control already worked in the historical build.
Persist the layout, not every transient condition
Panel width and panel choice are useful preferences. A temporary hide command should not make the next session look empty. The write boundary therefore overrides three fields in the stored record:
export function writeWorkspace(s:WorkspaceState){try{localStorage.setItem(UI_STORAGE_KEY,JSON.stringify({...s,version:2,allHidden:false,sideHidden:false,tool:'selection'}));}catch{/* The workspace stays usable when browser storage is unavailable. */}}
The read path starts from defaults, checks the storage version, accepts recognized panel names and units, and clamps a finite width to 220–420 pixels. Invalid JSON restores defaults. The write catch keeps the current workspace usable if storage fails, but it does not establish that persistence succeeded; quota failures were outside this test.
A keyboard boundary, too
The preserved development log records a Shift+Equal mismatch: the event key could be = instead of +. The current keyboard normalizer recognizes a plus character, NumpadAdd, or Equal with Shift and without Alt. It resolves those inputs to the symbol chord Plus; the command table maps that chord to tool.addAnchor.
The current code also ignores composition and AltGraph before resolving commands. The project uses an existing Photoshot-derived shortcut helper; this UI stage did not introduce a newly copied GitHub patch. React and React DOM are dependencies, while the product-specific state rules were written with AI assistance. Adobe’s documentation is a behavioral reference, not imported application code.
What was actually checked
On 2 November 2026, eight public-interface checks passed: Tab hiding and restoration, Shift+Tab retaining the tools, F7 selecting Layers, selected-panel persistence after reload, width persistence at 242 pixels, Shift+Equal selecting Add Anchor Point, and a Tab round-trip at 1266×738. Afterward, the width was restored to 252 pixels, the panel to Properties, and the tool to Selection.
Ten isolated source checks passed as well, covering keyboard routing, composition rejection, reducer transitions, transient reset, a width bound, and malformed JSON fallback. Those source checks use an in-memory storage substitute in Node. They are not browser durability tests. Historical tests are reported separately rather than added to today’s totals.
Tool selection is not evidence that every anchor-editing operation works. This report also does not certify unrestricted docking, all keyboard layouts, or full Illustrator compatibility. The useful outcome is a small contract: normalized input changes explicit state; persistent preferences survive reload; temporary interaction does not silently become a preference.
The full report and downloadable test records include the complete read path, provenance, historical limits, and results. The official references checked for the article are Adobe’s workspace overview, Illustrator shortcuts, and React’s reducer guide. The React guide was checked for this report; it is not evidence of when the original implementation was researched.
Authoring disclosure: An AI agent prepared this article from the project’s source, preserved development records, and the checks described above. Historical observations and current tests are identified separately.


Top comments (0)