zotero-kb/docs/superpowers/specs/2026-04-16-import-window-responsive-design.md
Saberlve cf7e2feb19 feat: Implement project management features including rename and delete functionality
- Added project renaming capability in the workspace with appropriate API endpoints.
- Implemented project deletion functionality, ensuring project directories are removed.
- Updated UI to support project renaming and deletion, including inline editing and confirmation dialogs.
- Enhanced batch generation feature for project items with selection and progress tracking.
- Added tests for project renaming and deletion to ensure functionality and integrity.
2026-04-21 16:55:42 +08:00

130 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-04-16 Import Window Responsive Design
## Goal
Make the floating import window adapt to the current browser viewport automatically so the user does not need to manually resize it after changing browser zoom or window size.
The floating window shell remains:
- draggable
- minimizable
- maximizable
- closable
The import content remains the restored collection importer:
- left pane: Zotero collection tree
- right pane: collection items
## User-Approved Behavior
### Window sizing policy
- Each time the import window opens, it recalculates its size and position from the current viewport.
- Previously saved manual width, height, and position are not reused on reopen.
- The window opens centered in the viewport.
- The default size is viewport-relative, using a large but bounded footprint.
Recommended sizing rule:
- width: about `88vw`
- height: about `82vh`
- clamp width and height to safe min/max values so content remains usable on smaller screens
### Resize and zoom behavior
- Browser zoom changes are treated the same as viewport changes.
- On `resize`, if the window is in normal mode, its dimensions and position are adjusted to remain visible within the viewport.
- If the window is maximized, existing maximize behavior remains authoritative.
- If the window is minimized, existing minimize behavior remains authoritative.
### Layout adaptation
- Wide viewport: keep the current two-pane horizontal layout.
- Narrow viewport: switch the import window body to a vertical stack.
- In stacked mode:
- top pane: collections
- bottom pane: collection items
This avoids crushed side-by-side panes and avoids requiring horizontal scrolling.
## Implementation Design
### State model
Keep the current floating-window state structure, but change how normal-mode geometry is derived:
- persisted maximize/minimize flags can remain
- persisted normal-mode width/height/left/top are no longer the source of truth on reopen
- on open, recompute width, height, left, and top from the current viewport
### New geometry helpers
Add small helpers in the template script:
- `computeResponsiveWindowRect()`
- derives width/height/left/top from `window.innerWidth` and `window.innerHeight`
- clamps to minimum and maximum bounds
- returns a centered rect
- `applyResponsiveWindowRect()`
- applies the computed rect to the floating window when in normal mode
- `syncWindowToViewport()`
- runs on resize
- keeps the window inside the visible viewport
- does nothing destructive when minimized or maximized
### Layout switching
Use CSS plus a narrow-width breakpoint for `.window-body`:
- default: `grid-template-columns: 22rem minmax(0, 1fr)`
- narrow mode: `grid-template-columns: 1fr`
The existing `.window-pane.collections` separator changes from right border to bottom border in stacked mode.
### Interaction rules
- Opening the window always recomputes the normal-mode rect.
- Manual dragging still works during the current open session.
- If the viewport changes while the window is open, normal mode is re-constrained to the viewport.
- Closing and reopening discards the sessions manual geometry and recomputes from the viewport again.
## Testing
Add or update UI tests to verify:
- the responsive helper logic is present in the inline script
- opening the window uses viewport-based sizing instead of reopening from stale manual geometry
- the template contains the narrow-layout CSS for stacked panes
- the inline script remains valid JavaScript
Manual verification target:
- open import window at normal zoom
- change browser zoom or viewport size
- close and reopen
- confirm the window opens centered and proportionate to the new viewport
- confirm narrow viewport stacks collections above items
## Risks and Mitigations
### Risk: resize fights user drag
Mitigation:
- only recompute automatically on open
- on live resize, constrain only enough to keep the window visible
### Risk: minimized/maximized modes get overwritten
Mitigation:
- gate responsive normal-mode logic behind checks for non-minimized and non-maximized state
### Risk: small screens become unusable
Mitigation:
- stack panes vertically below the chosen breakpoint
- clamp dimensions and leave a small viewport margin