Skip to content

feat: full-width nav bar, side-by-side panels, all panels synced to URL (#28)#31

Merged
cnotv merged 6 commits intomainfrom
feat/28-nav-panels
Feb 25, 2026
Merged

feat: full-width nav bar, side-by-side panels, all panels synced to URL (#28)#31
cnotv merged 6 commits intomainfrom
feat/28-nav-panels

Conversation

@cnotv
Copy link
Owner

@cnotv cnotv commented Feb 24, 2026

Closes #28

Summary

  • Nav bar: Converted from floating centered pill to full-width fixed bar that auto-hides (visible on hover, focus, or when any panel is open); added close-all X button pinned to the right
  • Panel layout: Replaced per-panel position: fixed + CSS math with two flex containers (#left-panels, #right-panels); panels portal into them as flex items — no more overlapping
  • URL sync: All panel states (config, scene, camera, debug, sidebar, textures) are now synced to query params, not just config
  • Canvas push: Canvas shifts down only when panels are open via --canvas-top CSS custom property set from JS
  • Debug panel deduplication: Added useDebugScene composable (same pattern as useViewConfig) so SceneEditor registers scene elements instead of rendering its own local DebugPanel
  • Compact UI: Reduced accordion, slider, panel, and spacing sizes across the board; removed panel title headers and slide animations

Test plan

  • All 465 unit tests pass
  • Nav bar is full-width at top, invisible by default, visible on hover/focus/panel-open
  • Opening Config + Scene panels shows them side by side (no overlap)
  • Opening Debug + Camera + Scene → three panels stacked from right edge inward
  • URL shows ?config=true when open, ?config=false when closed; all panels restore on reload
  • Canvas starts below nav bar only when panels are open
  • X button closes all panels
  • SceneEditor debug panel shows scene elements (single panel, not duplicated)

🤖 Generated with Claude Code

…RL (#28)

- Convert GlobalNavigation from floating pill to full-width fixed bar with auto-hide (visible on hover/focus/panel-open)
- Add close-all-panels X button to nav bar
- Replace per-panel absolute positioning with flex containers (#left-panels, #right-panels); panels portal into them as flex items
- Canvas pushed down only when panels are open via --canvas-top CSS var
- Sync all panel states to URL query params (not just config)
- Add getPanelOffset() and closeAllPanels() to usePanels
- Add useDebugScene composable so DebugPanel reads scene elements from any view (removes duplicate DebugPanel in SceneEditor)
- Remove panel title headers, slide animations; compact UI spacing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@netlify
Copy link

netlify bot commented Feb 24, 2026

Deploy Preview for cnotv-generative-art ready!

Name Link
🔨 Latest commit 30ad5db
🔍 Latest deploy log https://app.netlify.com/projects/cnotv-generative-art/deploys/699e3c4df34a2b0008a5b5ed
😎 Deploy Preview https://deploy-preview-31--cnotv-generative-art.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Giuseppe Leo and others added 5 commits February 24, 2026 15:20
- Column-stacked panel containers with flex-wrap for multi-panel expansion
- Remove intermediate wrapper divs between sheet-content and controls
- Fix Vue Set reactivity by replacing in-place mutations with new Set
- Prevent nested accordions via ConfigControls nested prop
- Accordion trigger uses div (not h3), bold weight
- Sidebar scrolls vertically with left padding
- Slider track height doubled
- ForestGame illustrations config flattened to remove duplicate labels
- Add no-nested-accordions and PR closing issue rules to guidelines

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…t panel visibility

Multiple components calling usePanels() each set up 6 route.query watchers,
creating 36+ competing reactive updates on every route change. This caused
Vue's scheduler to process intermediate states, leaving panels invisible
until a repaint was triggered externally (e.g. opening DevTools).

Guard initialization and watcher setup with a module-level syncInitialized
flag so they run only once, bound to the first caller's lifecycle (App.vue).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the raw panel container divs in App.vue with a PanelContainer
component that owns all panel-related styles (previously in panels.scss).
Non-scoped styles are required so they apply to content teleported into
the container via DialogPortal.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@cnotv cnotv merged commit 07607a0 into main Feb 25, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Review navigation bar and panels

1 participant