* Optimize Windows packaged web output
* Fix packaged contracts runtime build
* Optimize Windows packaged size pruning
* Prune Windows root Next payload
* Remove Windows bundled Node runtime
* Prune Windows standalone duplicate Next
* Add tools-pack cache foundation
* Cache Windows packaged build layers
* Cache Windows workspace builds
* Cache Electron-ready Windows app
* Split Windows tools-pack module
* Cache Windows dir build outputs
* Split Windows pack build modules
* Document Windows NSIS smoke namespace limits
* Move Windows NSIS smoke note to agents guide
* Optimize Windows beta packaging
* Bump packaged beta base version
* Improve Windows installer namespace UX
* Improve Windows tools-pack cache keys
* Stabilize Windows beta cache version keys
* Cache Windows workspace build outputs
* Optimize windows release beta cache layers
* Cache windows release dependencies
* Trim windows release cache before save
* Refresh windows tools-pack cache key
* Improve windows installer preflight prompts
* Fallback NSIS installer strings to English
* Fix Windows installer cleanup and preflight
* Improve Windows NSIS state logging
* Fix system NSIS Persian language alias
* Use long-path removal for Windows uninstall
* Fix mac tools-pack tests on Windows
* Address Windows packaging review feedback
* Fix Windows installer cache namespace isolation
* Include web output mode in Windows tarball cache key
* Use unique Windows release cache save keys
* fix(web): keep Design Files view active after deleting a file (#115)
Deleting a file from the Design Files panel was navigating the user
into another file's tab (typically the previously-opened file such as
`index.html`). Two unrelated symptoms contributed:
- `FileWorkspace.handleDelete` always called
`setActiveTab(nextActive ?? DESIGN_FILES_TAB)`, which yanked the user
out of the Design Files panel whenever `tabsState.active` still
pointed at a real file (clicking the Design Files tab only updates
local `activeTab`; it does not touch persisted `tabsState.active`).
- The row popover had `onMouseDown` propagation guard but no
corresponding `onClick` guard on the destructive action path.
Fix in `FileWorkspace.handleDelete`:
- If the deleted file is the one being viewed (`activeTab === name`),
fall back to another open tab (or Design Files if none remain) — the
prior behavior, which is correct in this case.
- Otherwise (deletion came from the Design Files panel, the typical
path), leave `activeTab` alone so the user stays in the list view.
Only null out `tabsState.active` when it referenced the deleted file
to avoid leaving a dangling pointer for the hydration `useEffect` to
resync against.
Defensive cleanup in `DesignFilesPanel`:
- Add `onClick` propagation guard on the popover wrapper (mirrors the
existing `onMouseDown` guard).
- Stop propagation on each popover button (Open / Download / Delete)
and on the download `<a>` so destructive/menu actions can't bubble
into row click handlers under any DOM arrangement.
Closes#115
* fix(web): address review feedback + add multi-tab delete regression E2E
Review feedback (#329):
- Drop the redundant `onClick={(e) => e.stopPropagation()}` on the
download `<a>` wrapper; the inner `<button>` is the actual click
target and already stops propagation.
- Expand the comment in `handleDelete`'s else branch to explicitly
state that `activeTab` is preserved because the user is in a
different context (Design Files panel or another tab) and shouldn't
be navigated away.
Regression coverage:
- Extend `runDesignFilesDeleteFlow` to upload a sibling file
(`keep-me.png`) before `trash-me.png`, so deletion has a fallback
tab that the buggy code would have navigated to. After deletion,
assert the Design Files tab still has `aria-selected="true"` and
the sibling tab is still present (just not auto-activated).
* test: add e2e ui automation suite
* fix review feedback for ui e2e suite
Resolved the FileWorkspace.tsx merge-marker issue and kept the intended combination of multiple, accept="image/*", and data-testid.
Updated the e2e port handling so the test config no longer relies on a single hardcoded app port. It now resolves an available port first and passes the same port selection through the dev server and Playwright base URL. Since main has moved to the Next.js dev stack, this was also adapted from the old Vite-based flow to NEXT_PORT.
Kept test:ui serialized so cleanup completes before Playwright starts.
Updated reset-e2e-artifacts.mjs so cleanup failures are surfaced with a warning instead of being silently swallowed, except for the expected ENOENT case.