diff --git a/frontend/src/lib/components/blockshell/BlockShell.svelte b/frontend/src/lib/components/blockshell/BlockShell.svelte new file mode 100644 index 0000000..934f53f --- /dev/null +++ b/frontend/src/lib/components/blockshell/BlockShell.svelte @@ -0,0 +1,636 @@ + + + +
+ + +
+
+ {#if icon} + + {/if} + {title} +
+ +
+ + {#if closable} + + {/if} +
+
+ + +
+ {#if children} + {@render children()} + {:else} +

Ingen innhold ennå.

+ {/if} +
+ + + {#if dropZoneState !== 'idle'} +
+ {#if dropZoneState === 'compatible'} + Slipp her + {:else if dropZoneState === 'incompatible'} + + {dropFeedback || 'Kan ikke motta dette innholdet'} + + {/if} +
+ {/if} + + + {#if !isFullscreen && !isMobile} + {#each resizeDirections as dir} + +
handleResizeStart(dir, e)} + >
+ {/each} + {/if} +
+ + diff --git a/frontend/src/lib/components/blockshell/index.ts b/frontend/src/lib/components/blockshell/index.ts new file mode 100644 index 0000000..d91b969 --- /dev/null +++ b/frontend/src/lib/components/blockshell/index.ts @@ -0,0 +1,2 @@ +export { default as BlockShell } from './BlockShell.svelte'; +export * from './types.js'; diff --git a/frontend/src/lib/components/blockshell/types.ts b/frontend/src/lib/components/blockshell/types.ts new file mode 100644 index 0000000..413d257 --- /dev/null +++ b/frontend/src/lib/components/blockshell/types.ts @@ -0,0 +1,61 @@ +/** + * BlockShell — types for the panel wrapper component. + * + * BlockShell wraps each tool panel (trait) on the spatial workspace, + * providing header, resize, drag, fullscreen and drop-zone capabilities. + * + * Ref: docs/retninger/arbeidsflaten.md + * Ref: docs/features/universell_overfoering.md § 8.1 + */ + +import type { DragPayload, CompatResult } from '$lib/transfer.js'; + +/** Size constraints for a panel */ +export interface SizeConstraints { + minWidth: number; + minHeight: number; + maxWidth: number; + maxHeight: number; +} + +/** Default size constraints */ +export const DEFAULT_CONSTRAINTS: SizeConstraints = { + minWidth: 280, + minHeight: 200, + maxWidth: 1600, + maxHeight: 1200, +}; + +/** Mobile breakpoint — below this, panels stack vertically */ +export const MOBILE_BREAKPOINT = 768; + +/** Resize direction */ +export type ResizeDirection = + | 'n' | 's' | 'e' | 'w' + | 'ne' | 'nw' | 'se' | 'sw'; + +/** Drop-zone state for visual feedback */ +export type DropZoneState = 'idle' | 'compatible' | 'incompatible'; + +/** + * BlockReceiver interface — implemented by tool panels that accept drops. + * Ref: docs/features/universell_overfoering.md § 4.3 + */ +export interface BlockReceiver { + /** Can this panel receive this payload? */ + canReceive(payload: DragPayload): CompatResult; +} + +/** Events emitted by BlockShell */ +export interface BlockShellEvents { + /** Panel close requested */ + onClose?: () => void; + /** Panel drag-moved (delta in world coords) */ + onDragMove?: (dx: number, dy: number) => void; + /** Panel resized */ + onResize?: (width: number, height: number) => void; + /** Panel fullscreen state changed */ + onFullscreenChange?: (isFullscreen: boolean) => void; + /** Drop received on this panel */ + onDrop?: (payload: DragPayload) => void; +} diff --git a/tasks.md b/tasks.md index 5cf5687..ab1bba4 100644 --- a/tasks.md +++ b/tasks.md @@ -213,8 +213,7 @@ Ref: `docs/features/ai_verktoy.md`, `docs/retninger/arbeidsflaten.md` Ref: `docs/retninger/arbeidsflaten.md`, `docs/features/canvas_primitiv.md` - [x] 19.1 Canvas-primitiv Svelte-komponent: pan/zoom kamera med CSS transforms, viewport culling, pointer events (mus + touch), snap-to-grid (valgfritt), fullskjermsmodus. Ref: `docs/features/canvas_primitiv.md`. -- [~] 19.2 BlockShell wrapper-komponent: header med tittel + fullskjerm/resize/lukk-knapper, drag-handles for repositionering, resize-handles, drop-sone rendering (highlight ved drag-over). Responsivt (min-size, max-size). - > Påbegynt: 2026-03-18T07:19 +- [x] 19.2 BlockShell wrapper-komponent: header med tittel + fullskjerm/resize/lukk-knapper, drag-handles for repositionering, resize-handles, drop-sone rendering (highlight ved drag-over). Responsivt (min-size, max-size). - [ ] 19.3 Arbeidsflaten layout: skriv om `/collection/[id]` fra vertikal stack til Canvas + BlockShell. Last brukerens lagrede arrangement eller bruk defaults fra samlingens traits. Persist arrangement i bruker-edge metadata. Desktop: spatial canvas, mobil: stacked/tabs. Ref: `docs/retninger/arbeidsflaten.md` § "Tre lag". - [ ] 19.4 Kontekst-header: header tilhører flaten, viser gjeldende node som nedtrekksmeny/kontekst-velger. Mest brukte noder øverst (frekvens/recency), søkbart. Verktøymeny for å instansiere nye paneler. Ref: `docs/retninger/arbeidsflaten.md` § "Kontekst-header". - [ ] 19.5 Snarveier: paneler kan minimeres til kompakt ikon/fane. Dobbeltklikk → minimer/gjenopprett. Bevarer posisjon og størrelse. Ref: `docs/retninger/arbeidsflaten.md` § "Snarveier".