Skip to content

Panel Architecture

Overview

Panel is the root layout component for the di application. It provides a fixed, full-viewport container with three distinct regions: controls (top), graph (main content), and details (right sidebar).

Layout Diagram

┌─────────────────────────────────────────────────────────────────┐
│                         .controls                               │
│                        (48px height)                            │
├═══════════════════════════════════════════════════════════════╮─┤
│                    Separator (horizontal, 8px)                ╯ │
├─────────────────╦═══════════════════════════════════════════════┤
│                 ║                                               │
│                 ║                                               │
│    .details     ║                    .graph                     │
│   (280px width) ║               (flex: 1, fills)                │
│                 ║                                               │
│                 ║  Separator                                    │
│                 ║  (vertical, 8px)                              │
│                 ║                                               │
│                 ║                                               │
└─────────────────╩═══════════════════════════════════════════════┘
                              .panel
                    (fixed, full viewport)

DOM Structure

Main.svelte (.panel)
├── .region.controls      ← top bar
│   └── Controls.svelte
├── Separator             ← horizontal, below controls
├── .main                 ← flexbox container
│   ├── .region.details   ← left sidebar (if showDetails)
│   │   └── Details.svelte
│   ├── Separator         ← vertical, between details/graph (if showDetails)
│   └── .region.graph     ← main content area
│       └── Graph.svelte

Components

ComponentLocationPurpose
Main.sveltelayout/Root layout, manages regions, renders children
Controls.sveltelayout/Top bar with title
Graph.sveltelayout/Canvas with ResizeObserver, 3D rendering
Details.sveltelayout/Left sidebar, properties panel
Separator.sveltelayout/Visual divider with optional fillets
Fillets.sveltelayout/SVG curved corner decorations
Box.sveltelayout/Bordered container using separators

Managers

ComponentLocationPurpose
Preferences.tsmanagers/localStorage read/write for persistent settings

CSS Classes

ClassElementPurpose
.panelRoot <div>Fixed position, full viewport, flex column, theming vars
.mainContent wrapperFlex row container for graph + details
.regionAll content areasShared: relative position, overflow hidden
.controlsTop barFull width, bottom border, fixed height
.graphMain contentFlex grow, fills available space
.detailsLeft sidebarFixed width, right border

CSS Custom Properties

PropertyDefaultPurpose
--panel-bg#1a1a2ePanel background color
--panel-fg#eeePanel text color
--border-color#333Border color for regions

State

VariableTypeReactivePurpose
widthnumber$stateViewport width, updates on resize
heightnumber$stateViewport height, updates on resize
showDetailsboolean$stateToggle details panel visibility
controlsHeightnumber$derivedFixed at 48px (configurable later)
detailsWidthnumber$derivedFixed at 280px (configurable later)
graphRectobject$derivedComputed {x, y, width, height} for graph region
detailsRectobject$derivedComputed {x, y, width, height} for details region

Props (Snippets)

PropTypeRequiredPurpose
controlsSnippetNoContent for top control bar
graphSnippetNoContent for main graph area
detailsSnippetNoContent for right sidebar
childrenSnippetNoFallback content

Usage

svelte
<Panel>
	{#snippet controls()}
		<h1>Title</h1>
	{/snippet}

	{#snippet graph()}
		<canvas></canvas>
	{/snippet}

	{#snippet details()}
		<aside>Properties</aside>
	{/snippet}
</Panel>

Sticky Edges

EdgeBehavior
Top.controls sticks to top (position: fixed on parent)
Left.details sticks to left edge
Right.graph fills to right edge
Bottom.main fills to bottom

Future Considerations

  • Resizable details panel (drag border)
  • Collapsible details (toggle showDetails)
  • Multiple control bars (primary/secondary)
  • Breakpoints for mobile (hide details on narrow screens)