@hilum/designer-canvas 3.8.5 → 3.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/package.json +8 -11
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { createContext, useContext, useMemo, useReducer, useRef, useEffect, useState, useCallback } from 'react';
|
|
2
3
|
import { ShellProvider, useShellContext, useHistory, DesignerToolbarButton, DesignerToolbarGroup, DesignerToolbarSeparator } from '@hilum/designer';
|
|
3
4
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
@@ -336,20 +337,28 @@ function CanvasProvider({
|
|
|
336
337
|
// initial state captured once at mount
|
|
337
338
|
);
|
|
338
339
|
const reducer = canvasReducer;
|
|
339
|
-
const [state, dispatch] = useReducer(
|
|
340
|
-
|
|
341
|
-
|
|
340
|
+
const [{ state, revision }, dispatch] = useReducer(
|
|
341
|
+
(current, action) => {
|
|
342
|
+
const next = reducer(current.state, action);
|
|
343
|
+
return next === current.state ? current : { state: next, revision: current.revision + 1 };
|
|
344
|
+
},
|
|
345
|
+
{ state: initialState, revision: 0 }
|
|
346
|
+
);
|
|
342
347
|
const resolveKind = useMemo(() => {
|
|
343
348
|
const map = /* @__PURE__ */ new Map();
|
|
344
349
|
for (const l of state.layers) map.set(l.id, l.type);
|
|
345
350
|
return (id) => map.get(id);
|
|
346
351
|
}, [state.layers]);
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
352
|
+
const onChangeRef = useRef(onChange);
|
|
353
|
+
useEffect(() => {
|
|
354
|
+
onChangeRef.current = onChange;
|
|
355
|
+
});
|
|
356
|
+
useEffect(() => {
|
|
357
|
+
onChangeRef.current?.(state);
|
|
358
|
+
}, [state]);
|
|
350
359
|
const value = useMemo(
|
|
351
|
-
() => ({ state, dispatch, services, revision
|
|
352
|
-
[state, dispatch, services]
|
|
360
|
+
() => ({ state, dispatch, services, revision }),
|
|
361
|
+
[state, dispatch, services, revision]
|
|
353
362
|
);
|
|
354
363
|
return /* @__PURE__ */ jsx(ShellProvider, { readOnly, resolveKind, children: /* @__PURE__ */ jsx(CanvasContextProvider, { value, children }) });
|
|
355
364
|
}
|
|
@@ -410,7 +419,7 @@ function DesignerCanvas({ className, children }) {
|
|
|
410
419
|
"div",
|
|
411
420
|
{
|
|
412
421
|
ref,
|
|
413
|
-
className: cn("relative flex-1 overflow-hidden bg-
|
|
422
|
+
className: cn("relative flex-1 overflow-hidden bg-canvas select-none", className),
|
|
414
423
|
"data-canvas-root": true,
|
|
415
424
|
children: /* @__PURE__ */ jsx(
|
|
416
425
|
"div",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/state.ts","../src/context/reducer.ts","../src/context/CanvasContext.tsx","../src/context/CanvasProvider.tsx","../src/renderer/RendererProvider.tsx","../src/components/Designer.tsx","../src/components/DesignerCanvas.tsx","../src/hooks/useDragInteraction.ts","../src/components/LayerView.tsx","../src/overlays/LayerSelectionOverlay.tsx","../src/overlays/MarqueeOverlay.tsx","../src/overlays/GridOverlay.tsx","../src/components/DesignerFrame.tsx","../src/components/DesignerStaticFrame.tsx","../src/hooks/useLayers.ts","../src/hooks/useZoom.ts","../src/hooks/useHistoryActions.ts","../src/actions/ActionAddLayer.tsx","../src/actions/ActionAlign.tsx","../src/actions/ActionArrange.tsx","../src/actions/ActionDelete.tsx","../src/actions/ActionDuplicate.tsx","../src/actions/ActionGroup.tsx","../src/actions/ActionLock.tsx","../src/actions/ActionTool.tsx","../src/actions/ActionTransform.tsx","../src/actions/ActionUndoRedo.tsx","../src/actions/ActionZoom.tsx"],"names":["createContext","useMemo","jsx","useContext","useRef","useEffect","useShellContext","cn","useState","useCallback","generateId","jsxs","Fragment","DesignerToolbarGroup","DesignerToolbarButton","Plus"],"mappings":"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","file":"index.js","sourcesContent":["// Slim CanvasState — generic free-positioned canvas only.\n// All Pappery domain (productType, dpi, binding*, bleed, etc.) is excluded\n// per PHASE_0_AUDIT.md §P0.4.\n\nimport type {\n FrameSize,\n GridContainer,\n Layer,\n LayerTypeDescriptor,\n PanState,\n SurfaceTheme,\n} from \"../types\";\n\nexport interface CanvasState<TData = Record<string, unknown>> {\n /** All layers in z-order. Index 0 = bottom. */\n layers: Layer<TData>[];\n\n /** View state. */\n zoom: number;\n pan: PanState;\n\n /** Artboard / frame. */\n frameSize: FrameSize;\n artboardName: string;\n artboardColor: string;\n artboardOpacity: number;\n /** Whether content is clipped to the frame bounds. */\n artboardClipContent: boolean;\n\n /** Optional grid layout mode. When set, layers can use `gridItem`. */\n gridContainer?: GridContainer | undefined;\n\n /** Clipboard: layers that have been copied / cut. */\n copiedLayers: Layer<TData>[] | null;\n\n /** Theme — chrome reads from here, components reference Hilum semantic vars. */\n uiColor: SurfaceTheme;\n canvasColor: SurfaceTheme;\n /** Editor accent (selection handles, snap guides). Defaults to Hilum brand-primary via CSS var. */\n accentColor: string;\n\n /** Renderer registry: descriptors for the layer kinds the app supports. */\n layerTypes: LayerTypeDescriptor[];\n\n /** When true, mutating actions no-op. */\n readOnly: boolean;\n}\n\nexport function createInitialState<TData>(\n partial: Partial<CanvasState<TData>> = {},\n): CanvasState<TData> {\n return {\n layers: [],\n zoom: 1,\n pan: { x: 0, y: 0 },\n frameSize: { width: 800, height: 600 },\n artboardName: \"Artboard\",\n artboardColor: \"#ffffff\",\n artboardOpacity: 1,\n artboardClipContent: true,\n copiedLayers: null,\n uiColor: \"light\",\n canvasColor: \"light\",\n accentColor: \"var(--brand-primary)\",\n layerTypes: [],\n readOnly: false,\n ...partial,\n };\n}\n","// Generic CanvasState reducer.\n//\n// Per PHASE_0_AUDIT.md §P0.4, layer-mutating actions that depend on\n// selection accept an explicit `targetLayerIds: string[]` payload. This\n// decouples the reducer from ShellContext's selection store.\n\nimport type { GridContainer, GridItem, Layer } from \"../types\";\nimport type { CanvasState } from \"./state\";\n\n/* ============================================================== *\n * Action types *\n * ============================================================== */\n\nexport type CanvasAction<TData = Record<string, unknown>> =\n // Layer CRUD\n | { type: \"SET_LAYERS\"; payload: Layer<TData>[] }\n | { type: \"ADD_LAYER\"; payload: Layer<TData> }\n | { type: \"UPDATE_LAYER\"; payload: { id: string; updates: Partial<Layer<TData>> } }\n | { type: \"UPDATE_LAYERS\"; payload: Array<{ id: string; updates: Partial<Layer<TData>> }> }\n | { type: \"DELETE_LAYER\"; payload: string }\n | { type: \"DELETE_LAYERS\"; payload: string[] }\n | { type: \"REORDER_LAYERS\"; payload: { fromIndex: number; toIndex: number } }\n // Selection-driven (caller passes targetLayerIds — see P0.4)\n | { type: \"NUDGE_LAYERS\"; payload: { targetLayerIds: string[]; dx: number; dy: number } }\n | {\n type: \"ALIGN_LAYERS\";\n payload: {\n targetLayerIds: string[];\n align: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\";\n };\n }\n | {\n type: \"DISTRIBUTE_LAYERS\";\n payload: { targetLayerIds: string[]; axis: \"horizontal\" | \"vertical\" };\n }\n | { type: \"GROUP_LAYERS\"; payload: { targetLayerIds: string[]; groupId: string } }\n | { type: \"UNGROUP_LAYERS\"; payload: { targetLayerIds: string[] } }\n | {\n type: \"ARRANGE_LAYERS\";\n payload: { targetLayerIds: string[]; mode: \"front\" | \"back\" | \"forward\" | \"backward\" };\n }\n | { type: \"TRANSFORM_LAYERS\"; payload: { targetLayerIds: string[]; mode: \"flip-h\" | \"flip-v\" } }\n | {\n type: \"SET_LAYER_PROPERTY\";\n payload: { targetLayerIds: string[]; key: keyof Layer<TData>; value: unknown };\n }\n // Viewport\n | { type: \"SET_ZOOM\"; payload: number }\n | { type: \"SET_PAN\"; payload: { x: number; y: number } }\n | { type: \"SET_FRAME_SIZE\"; payload: { width: number; height: number } }\n // Artboard chrome\n | { type: \"SET_ARTBOARD_NAME\"; payload: string }\n | { type: \"SET_ARTBOARD_COLOR\"; payload: string }\n | { type: \"SET_ARTBOARD_OPACITY\"; payload: number }\n | { type: \"SET_ARTBOARD_CLIP_CONTENT\"; payload: boolean }\n // Grid\n | { type: \"SET_GRID_CONTAINER\"; payload: GridContainer }\n | { type: \"CLEAR_GRID_CONTAINER\" }\n | { type: \"UPDATE_GRID_CONTAINER\"; payload: Partial<GridContainer> }\n // Theme\n | { type: \"SET_UI_COLOR\"; payload: \"light\" | \"mid\" | \"dark\" }\n | { type: \"SET_CANVAS_COLOR\"; payload: \"light\" | \"mid\" | \"dark\" }\n | { type: \"SET_ACCENT_COLOR\"; payload: string }\n // Clipboard\n | { type: \"COPY_LAYERS\"; payload: { targetLayerIds: string[] } }\n | { type: \"PASTE_LAYERS\"; payload?: { offset?: { dx: number; dy: number } } }\n | { type: \"CLEAR_CLIPBOARD\" }\n // Read-only\n | { type: \"SET_READ_ONLY\"; payload: boolean };\n\n/* ============================================================== *\n * Reducer *\n * ============================================================== */\n\nexport function canvasReducer<TData>(\n state: CanvasState<TData>,\n action: CanvasAction<TData>,\n): CanvasState<TData> {\n if (state.readOnly && action.type !== \"SET_READ_ONLY\" && !isReadActionAllowed(action.type)) {\n return state;\n }\n\n switch (action.type) {\n /* ---------------- Layer CRUD ---------------- */\n\n case \"SET_LAYERS\":\n return { ...state, layers: action.payload };\n\n case \"ADD_LAYER\":\n return { ...state, layers: [...state.layers, action.payload] };\n\n case \"UPDATE_LAYER\": {\n const { id, updates } = action.payload;\n return {\n ...state,\n layers: state.layers.map((l) => (l.id === id ? { ...l, ...updates } : l)),\n };\n }\n\n case \"UPDATE_LAYERS\": {\n const map = new Map(action.payload.map((u) => [u.id, u.updates]));\n return {\n ...state,\n layers: state.layers.map((l) => (map.has(l.id) ? { ...l, ...map.get(l.id)! } : l)),\n };\n }\n\n case \"DELETE_LAYER\":\n return { ...state, layers: state.layers.filter((l) => l.id !== action.payload) };\n\n case \"DELETE_LAYERS\": {\n const ids = new Set(action.payload);\n return { ...state, layers: state.layers.filter((l) => !ids.has(l.id)) };\n }\n\n case \"REORDER_LAYERS\": {\n const { fromIndex, toIndex } = action.payload;\n const next = [...state.layers];\n const [moved] = next.splice(fromIndex, 1);\n if (moved) next.splice(toIndex, 0, moved);\n return { ...state, layers: next };\n }\n\n /* ---------------- Selection-driven mutations ---------------- */\n\n case \"NUDGE_LAYERS\": {\n const { targetLayerIds, dx, dy } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) =>\n ids.has(l.id) && !l.isLocked ? { ...l, x: l.x + dx, y: l.y + dy } : l,\n ),\n };\n }\n\n case \"ALIGN_LAYERS\":\n return {\n ...state,\n layers: alignLayers(state.layers, action.payload.targetLayerIds, action.payload.align),\n };\n\n case \"DISTRIBUTE_LAYERS\":\n return {\n ...state,\n layers: distributeLayers(state.layers, action.payload.targetLayerIds, action.payload.axis),\n };\n\n case \"GROUP_LAYERS\": {\n const { targetLayerIds, groupId } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => (ids.has(l.id) ? { ...l, groupId } : l)),\n };\n }\n\n case \"UNGROUP_LAYERS\": {\n const ids = new Set(action.payload.targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => {\n if (!ids.has(l.id)) return l;\n const { groupId: _gid, ...rest } = l;\n return rest as Layer<TData>;\n }),\n };\n }\n\n case \"ARRANGE_LAYERS\":\n return {\n ...state,\n layers: arrangeLayers(state.layers, action.payload.targetLayerIds, action.payload.mode),\n };\n\n case \"TRANSFORM_LAYERS\": {\n const { targetLayerIds, mode } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => {\n if (!ids.has(l.id) || l.isLocked) return l;\n const data = l.data as Record<string, unknown>;\n const flipKey = mode === \"flip-h\" ? \"_flipX\" : \"_flipY\";\n const current = (data[flipKey] as number) ?? 1;\n return { ...l, data: { ...data, [flipKey]: -current } as TData };\n }),\n };\n }\n\n case \"SET_LAYER_PROPERTY\": {\n const { targetLayerIds, key, value } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) =>\n ids.has(l.id) ? ({ ...l, [key]: value } as Layer<TData>) : l,\n ),\n };\n }\n\n /* ---------------- Viewport ---------------- */\n\n case \"SET_ZOOM\":\n return { ...state, zoom: clamp(action.payload, 0.05, 32) };\n\n case \"SET_PAN\":\n return { ...state, pan: action.payload };\n\n case \"SET_FRAME_SIZE\":\n return { ...state, frameSize: action.payload };\n\n /* ---------------- Artboard ---------------- */\n\n case \"SET_ARTBOARD_NAME\":\n return { ...state, artboardName: action.payload };\n case \"SET_ARTBOARD_COLOR\":\n return { ...state, artboardColor: action.payload };\n case \"SET_ARTBOARD_OPACITY\":\n return { ...state, artboardOpacity: clamp(action.payload, 0, 1) };\n case \"SET_ARTBOARD_CLIP_CONTENT\":\n return { ...state, artboardClipContent: action.payload };\n\n /* ---------------- Grid ---------------- */\n\n case \"SET_GRID_CONTAINER\":\n return { ...state, gridContainer: action.payload };\n case \"CLEAR_GRID_CONTAINER\":\n return { ...state, gridContainer: undefined };\n case \"UPDATE_GRID_CONTAINER\":\n return state.gridContainer\n ? { ...state, gridContainer: { ...state.gridContainer, ...action.payload } }\n : state;\n\n /* ---------------- Theme ---------------- */\n\n case \"SET_UI_COLOR\":\n return { ...state, uiColor: action.payload };\n case \"SET_CANVAS_COLOR\":\n return { ...state, canvasColor: action.payload };\n case \"SET_ACCENT_COLOR\":\n return { ...state, accentColor: action.payload };\n\n /* ---------------- Clipboard ---------------- */\n\n case \"COPY_LAYERS\": {\n const ids = new Set(action.payload.targetLayerIds);\n const copied = state.layers.filter((l) => ids.has(l.id)).map(deepClone);\n return { ...state, copiedLayers: copied };\n }\n\n case \"PASTE_LAYERS\": {\n if (!state.copiedLayers || state.copiedLayers.length === 0) return state;\n const offset = action.payload?.offset ?? { dx: 16, dy: 16 };\n const fresh = state.copiedLayers.map((l) => ({\n ...deepClone(l),\n id: generateId(),\n x: l.x + offset.dx,\n y: l.y + offset.dy,\n }));\n return { ...state, layers: [...state.layers, ...fresh] };\n }\n\n case \"CLEAR_CLIPBOARD\":\n return { ...state, copiedLayers: null };\n\n /* ---------------- Read-only ---------------- */\n\n case \"SET_READ_ONLY\":\n return { ...state, readOnly: action.payload };\n\n default:\n return state;\n }\n}\n\n/* ============================================================== *\n * Helpers *\n * ============================================================== */\n\nfunction isReadActionAllowed(type: string): boolean {\n return (\n type === \"SET_ZOOM\" ||\n type === \"SET_PAN\" ||\n type === \"SET_UI_COLOR\" ||\n type === \"SET_CANVAS_COLOR\"\n );\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.min(max, Math.max(min, n));\n}\n\nfunction deepClone<T>(v: T): T {\n if (typeof structuredClone === \"function\") return structuredClone(v);\n return JSON.parse(JSON.stringify(v));\n}\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto)\n return (crypto as Crypto).randomUUID();\n return `layer-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction alignLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n align: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const targets = layers.filter((l) => idSet.has(l.id));\n if (targets.length < 2) return layers;\n\n let value = 0;\n switch (align) {\n case \"left\":\n value = Math.min(...targets.map((l) => l.x));\n break;\n case \"right\": {\n const maxRight = Math.max(...targets.map((l) => l.x + l.width));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: maxRight - l.width } : l));\n }\n case \"center\": {\n const minX = Math.min(...targets.map((l) => l.x));\n const maxX = Math.max(...targets.map((l) => l.x + l.width));\n const center = (minX + maxX) / 2;\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: center - l.width / 2 } : l));\n }\n case \"top\":\n value = Math.min(...targets.map((l) => l.y));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: value } : l));\n case \"bottom\": {\n const maxBottom = Math.max(...targets.map((l) => l.y + l.height));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: maxBottom - l.height } : l));\n }\n case \"middle\": {\n const minY = Math.min(...targets.map((l) => l.y));\n const maxY = Math.max(...targets.map((l) => l.y + l.height));\n const middle = (minY + maxY) / 2;\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: middle - l.height / 2 } : l));\n }\n }\n\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: value } : l));\n}\n\nfunction distributeLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n axis: \"horizontal\" | \"vertical\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const targets = layers.filter((l) => idSet.has(l.id));\n if (targets.length < 3) return layers;\n\n if (axis === \"horizontal\") {\n const sorted = [...targets].sort((a, b) => a.x - b.x);\n const first = sorted[0]!;\n const last = sorted[sorted.length - 1]!;\n const totalSpan = last.x + last.width - first.x;\n const totalWidth = sorted.reduce((s, l) => s + l.width, 0);\n const gap = (totalSpan - totalWidth) / (sorted.length - 1);\n let cursor = first.x;\n const updates = new Map<string, number>();\n for (const l of sorted) {\n updates.set(l.id, cursor);\n cursor += l.width + gap;\n }\n return layers.map((l) => (updates.has(l.id) ? { ...l, x: updates.get(l.id)! } : l));\n } else {\n const sorted = [...targets].sort((a, b) => a.y - b.y);\n const first = sorted[0]!;\n const last = sorted[sorted.length - 1]!;\n const totalSpan = last.y + last.height - first.y;\n const totalHeight = sorted.reduce((s, l) => s + l.height, 0);\n const gap = (totalSpan - totalHeight) / (sorted.length - 1);\n let cursor = first.y;\n const updates = new Map<string, number>();\n for (const l of sorted) {\n updates.set(l.id, cursor);\n cursor += l.height + gap;\n }\n return layers.map((l) => (updates.has(l.id) ? { ...l, y: updates.get(l.id)! } : l));\n }\n}\n\nfunction arrangeLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n mode: \"front\" | \"back\" | \"forward\" | \"backward\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const indices = layers.map((l, i) => (idSet.has(l.id) ? i : -1)).filter((i) => i >= 0);\n if (indices.length === 0) return layers;\n\n switch (mode) {\n case \"front\": {\n const targets = indices.map((i) => layers[i]!);\n const others = layers.filter((l) => !idSet.has(l.id));\n return [...others, ...targets];\n }\n case \"back\": {\n const targets = indices.map((i) => layers[i]!);\n const others = layers.filter((l) => !idSet.has(l.id));\n return [...targets, ...others];\n }\n case \"forward\": {\n const next = [...layers];\n // Move each selected layer forward by 1, last selected first to avoid collisions.\n for (let i = indices.length - 1; i >= 0; i--) {\n const idx = indices[i]!;\n if (idx < next.length - 1) {\n [next[idx], next[idx + 1]] = [next[idx + 1]!, next[idx]!];\n }\n }\n return next;\n }\n case \"backward\": {\n const next = [...layers];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i]!;\n if (idx > 0) {\n [next[idx], next[idx - 1]] = [next[idx - 1]!, next[idx]!];\n }\n }\n return next;\n }\n }\n}\n\nexport const __test = { alignLayers, distributeLayers, arrangeLayers };\n","import { createContext, useContext, type Dispatch } from \"react\";\nimport type { CanvasAction } from \"./reducer\";\nimport type { CanvasState } from \"./state\";\nimport type { CanvasServices } from \"../services/types\";\n\nexport interface CanvasContextValue<TData = Record<string, unknown>> {\n state: CanvasState<TData>;\n dispatch: Dispatch<CanvasAction<TData>>;\n services: CanvasServices;\n /** Bumped on each commit. Apps can use it as a memoization key. */\n revision: number;\n}\n\n// `unknown` here is fine — consumers narrow via the typed hooks below.\nconst CanvasContext = createContext<CanvasContextValue<unknown> | null>(null);\n\nexport function useCanvasContext<TData = Record<string, unknown>>(): CanvasContextValue<TData> {\n const ctx = useContext(\n CanvasContext as unknown as React.Context<CanvasContextValue<TData> | null>,\n );\n if (!ctx) {\n throw new Error(\n \"@hilum/designer-canvas: useCanvasContext must be used inside <Designer> / <CanvasProvider>.\",\n );\n }\n return ctx;\n}\n\nexport const CanvasContextProvider = CanvasContext.Provider as unknown as React.Provider<\n CanvasContextValue<unknown>\n>;\n\nimport type * as React from \"react\";\n","import { useMemo, useReducer, useRef, type ReactNode } from \"react\";\nimport { ShellProvider } from \"@hilum/designer\";\nimport { CanvasContextProvider } from \"./CanvasContext\";\nimport { canvasReducer } from \"./reducer\";\nimport { createInitialState } from \"./state\";\nimport type { CanvasState } from \"./state\";\nimport type { CanvasAction } from \"./reducer\";\nimport type { CanvasServices } from \"../services/types\";\nimport type { Layer } from \"../types\";\n\ninterface CanvasProviderProps<TData = Record<string, unknown>> {\n initial?: Partial<CanvasState<TData>>;\n /** Optional injected services — see PHASE_0_AUDIT.md §P0.6. */\n services?: CanvasServices;\n /** Read-only mode (e.g. for thumbnails). */\n readOnly?: boolean;\n /** Receive every state transition. Useful for syncing to external storage. */\n onChange?: (state: CanvasState<TData>) => void;\n children: ReactNode;\n}\n\n/**\n * Mounts both ShellContext (from @hilum/designer) and CanvasContext.\n * Selection lives in ShellContext; layers / viewport / artboard live here.\n *\n * The reducer is generic on TData; apps narrow it by passing a typed\n * `initial.layerTypes` array.\n */\nexport function CanvasProvider<TData = Record<string, unknown>>({\n initial,\n services = {},\n readOnly = false,\n onChange,\n children,\n}: CanvasProviderProps<TData>) {\n const initialState = useMemo(\n () => createInitialState<TData>({ ...initial, readOnly }),\n [], // initial state captured once at mount\n );\n\n const reducer = canvasReducer as (\n s: CanvasState<TData>,\n a: CanvasAction<TData>,\n ) => CanvasState<TData>;\n const [state, dispatch] = useReducer(reducer, initialState);\n\n const revisionRef = useRef(0);\n if (state !== initialState) revisionRef.current += 0; // touched on every render\n\n // Map `Layer.id → Layer.type` so DesignerPane.showFor works without the\n // shell knowing about the canvas. See @hilum/designer/ShellContext.\n const resolveKind = useMemo(() => {\n const map = new Map<string, string>();\n for (const l of state.layers as Layer<TData>[]) map.set(l.id, l.type);\n return (id: string) => map.get(id);\n }, [state.layers]);\n\n // Notify on changes (effect-style; useReducer commits before).\n if (onChange) {\n // Avoid scheduling effects for every dispatch — call inline. Idempotent.\n onChange(state);\n }\n\n const value = useMemo(\n () => ({ state, dispatch, services, revision: revisionRef.current }),\n [state, dispatch, services],\n );\n\n return (\n <ShellProvider readOnly={readOnly} resolveKind={resolveKind}>\n <CanvasContextProvider value={value as never}>{children}</CanvasContextProvider>\n </ShellProvider>\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { LayerRenderer, RendererRegistry } from \"./types\";\n\nconst RendererContext = createContext<RendererRegistry>({});\n\ninterface RendererProviderProps {\n /** Map of layer.type → renderer. Apps register their kinds here. */\n renderers: RendererRegistry;\n children: ReactNode;\n}\n\n/**\n * Pluggable renderer registry. Apps mount this near the canvas root and\n * pass `{ [layerType]: Component }`. The package never ships concrete\n * renderers — Pappery's text/image/shape renderers stay in Pappery, and\n * each app supplies its own per layer kind.\n */\nexport function RendererProvider({ renderers, children }: RendererProviderProps) {\n const value = useMemo(() => renderers, [renderers]);\n return <RendererContext.Provider value={value}>{children}</RendererContext.Provider>;\n}\n\nexport function useLayerRenderer(type: string): LayerRenderer<unknown> | undefined {\n return useContext(RendererContext)[type];\n}\n\nexport function useAllRenderers(): RendererRegistry {\n return useContext(RendererContext);\n}\n","import type { ReactNode } from \"react\";\nimport { CanvasProvider } from \"../context/CanvasProvider\";\nimport { RendererProvider } from \"../renderer/RendererProvider\";\nimport type { CanvasState } from \"../context/state\";\nimport type { CanvasServices } from \"../services/types\";\nimport type { RendererRegistry } from \"../renderer/types\";\n\ninterface DesignerProps<TData = Record<string, unknown>> {\n /** Initial canvas state. Layers, frame size, theme. */\n initial?: Partial<CanvasState<TData>>;\n /** Renderers per layer type. */\n renderers?: RendererRegistry;\n /** Optional injected services (paths, fonts, units, image upload). */\n services?: CanvasServices;\n /** Read-only mode (e.g. for previews). */\n readOnly?: boolean;\n /** Receive every state transition. */\n onChange?: (state: CanvasState<TData>) => void;\n children: ReactNode;\n}\n\n/**\n * Root provider for a canvas-editor app. Mounts ShellProvider (selection,\n * tool, read-only) + CanvasProvider (layers, viewport, artboard) +\n * RendererProvider (per-type renderers).\n *\n * Place <DesignerCanvas><DesignerFrame /></DesignerCanvas> inside, or\n * compose with @hilum/designer's chrome (DesignerShell, Toolbar, etc.).\n */\nfunction Designer<TData = Record<string, unknown>>({\n initial,\n renderers = {},\n services = {},\n readOnly,\n onChange,\n children,\n}: DesignerProps<TData>) {\n return (\n <CanvasProvider<TData>\n {...(initial !== undefined && { initial })}\n services={services}\n {...(readOnly !== undefined && { readOnly })}\n {...(onChange !== undefined && { onChange })}\n >\n <RendererProvider renderers={renderers}>{children}</RendererProvider>\n </CanvasProvider>\n );\n}\n\nexport { Designer };\nexport type { DesignerProps };\n","import { useRef, useEffect, type ReactNode } from \"react\";\nimport { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface DesignerCanvasProps {\n className?: string;\n children?: ReactNode;\n}\n\n/**\n * Pan / zoom viewport. Wraps an inner transform layer that applies the\n * canvas state's pan + zoom. Children (typically `<DesignerFrame>` and\n * overlays) are rendered inside the transform.\n */\nfunction DesignerCanvas({ className, children }: DesignerCanvasProps) {\n const { state, dispatch } = useCanvasContext();\n const ref = useRef<HTMLDivElement>(null);\n\n // Wheel zoom + ctrl/cmd-pan, Trackpad two-finger pan.\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n const onWheel = (e: WheelEvent) => {\n // Pinch-zoom (ctrlKey on macOS trackpad).\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const factor = Math.exp(-e.deltaY * 0.01);\n const next = Math.min(32, Math.max(0.05, state.zoom * factor));\n dispatch({ type: \"SET_ZOOM\", payload: next });\n } else {\n // Two-finger pan.\n e.preventDefault();\n dispatch({\n type: \"SET_PAN\",\n payload: { x: state.pan.x - e.deltaX, y: state.pan.y - e.deltaY },\n });\n }\n };\n node.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => node.removeEventListener(\"wheel\", onWheel);\n }, [state.zoom, state.pan, dispatch]);\n\n return (\n <div\n ref={ref}\n className={cn(\"relative flex-1 overflow-hidden bg-ground-100 select-none\", className)}\n data-canvas-root\n >\n <div\n className=\"absolute inset-0 origin-center\"\n style={{\n transform: `translate(${state.pan.x}px, ${state.pan.y}px) scale(${state.zoom})`,\n transformOrigin: \"50% 50%\",\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport { DesignerCanvas };\nexport type { DesignerCanvasProps };\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface UseDragInteractionParams {\n layerId: string;\n /** Pixel scale — typically `1 / zoom`. */\n scale?: number;\n}\n\n/**\n * Pointer-driven drag for a single layer. Returns props to spread on the\n * draggable element. Holds Shift for axis-locked movement.\n *\n * Multi-select drag (move all selected layers) is handled by spreading\n * onPointerDown on each selected frame and dispatching UPDATE_LAYERS in the\n * same frame — this hook handles the single-layer case.\n */\nexport function useDragInteraction({ layerId, scale = 1 }: UseDragInteractionParams) {\n const { state, dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const [dragging, setDragging] = useState(false);\n const startRef = useRef<{\n pointerX: number;\n pointerY: number;\n initial: Map<string, { x: number; y: number }>;\n } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (state.readOnly) return;\n const layer = state.layers.find((l) => l.id === layerId);\n if (!layer || layer.isLocked) return;\n\n // If layer is part of selection, drag all selected. Otherwise drag just this one.\n const ids = selectedIds.includes(layerId) ? selectedIds : [layerId];\n const initial = new Map<string, { x: number; y: number }>();\n for (const id of ids) {\n const l = state.layers.find((x) => x.id === id);\n if (l) initial.set(id, { x: l.x, y: l.y });\n }\n\n startRef.current = { pointerX: e.clientX, pointerY: e.clientY, initial };\n setDragging(true);\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n },\n [state, selectedIds, layerId],\n );\n\n useEffect(() => {\n if (!dragging) return;\n\n const onMove = (e: PointerEvent) => {\n const start = startRef.current;\n if (!start) return;\n let dx = (e.clientX - start.pointerX) * scale;\n let dy = (e.clientY - start.pointerY) * scale;\n if (e.shiftKey) {\n // Axis-lock to the larger delta.\n if (Math.abs(dx) > Math.abs(dy)) dy = 0;\n else dx = 0;\n }\n const updates: Array<{ id: string; updates: { x: number; y: number } }> = [];\n start.initial.forEach((origin, id) => {\n updates.push({ id, updates: { x: origin.x + dx, y: origin.y + dy } });\n });\n dispatch({ type: \"UPDATE_LAYERS\", payload: updates });\n };\n\n const onUp = () => {\n startRef.current = null;\n setDragging(false);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onUp);\n };\n }, [dragging, dispatch, scale]);\n\n return { dragging, onPointerDown };\n}\n\nimport type * as React from \"react\";\n","import { useShellContext } from \"@hilum/designer\";\nimport { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { useDragInteraction } from \"../hooks/useDragInteraction\";\nimport { useLayerRenderer } from \"../renderer/RendererProvider\";\nimport type { Layer } from \"../types\";\n\ninterface LayerViewProps {\n layer: Layer<unknown>;\n /** Disable interactions (used by DesignerStaticFrame). */\n staticMode?: boolean;\n}\n\n/**\n * Internal: renders a single layer at its computed position. Wraps the\n * app-supplied renderer with position / size / rotation / opacity, and\n * wires drag + click-to-select.\n */\nfunction LayerView({ layer, staticMode = false }: LayerViewProps) {\n const { state } = useCanvasContext();\n const { selectedIds, setSelectedIds, readOnly } = useShellContext();\n const Renderer = useLayerRenderer(layer.type);\n const { onPointerDown } = useDragInteraction({\n layerId: layer.id,\n scale: 1 / state.zoom,\n });\n\n const selected = selectedIds.includes(layer.id);\n const isVisible = layer.isVisible !== false;\n\n if (!isVisible) return null;\n\n const transform = `rotate(${layer.rotation ?? 0}deg)`;\n const cursor = layer.isLocked ? \"default\" : \"move\";\n\n return (\n <div\n data-layer-id={layer.id}\n onPointerDown={\n staticMode\n ? undefined\n : (e) => {\n if (readOnly) return;\n if (e.button !== 0) return;\n if (!selected) {\n setSelectedIds(e.shiftKey ? [...selectedIds, layer.id] : [layer.id]);\n }\n onPointerDown(e);\n }\n }\n className={cn(\"absolute\", !staticMode && \"cursor-move\", layer.isLocked && \"cursor-default\")}\n style={{\n left: layer.x,\n top: layer.y,\n width: layer.width,\n height: layer.height,\n opacity: layer.opacity ?? 1,\n transform,\n cursor: staticMode ? \"default\" : cursor,\n }}\n >\n {Renderer ? (\n <Renderer\n layer={layer}\n ctx={{ selected, zoom: state.zoom, readOnly: readOnly || staticMode }}\n />\n ) : (\n <FallbackRenderer layer={layer} />\n )}\n </div>\n );\n}\n\nfunction FallbackRenderer({ layer }: { layer: Layer<unknown> }) {\n return (\n <div\n className=\"size-full flex items-center justify-center bg-white border border-dashed border-ground-300 caption text-ground-400\"\n title={`No renderer registered for type \"${layer.type}\"`}\n >\n {layer.type}\n </div>\n );\n}\n\nexport { LayerView };\nexport type { LayerViewProps };\n","import { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Renders blue selection rectangles around currently-selected layers.\n * Non-interactive — drag/resize handles can be added in a future iteration.\n */\nfunction LayerSelectionOverlay() {\n const { state } = useCanvasContext();\n const { selectedIds } = useShellContext();\n if (selectedIds.length === 0) return null;\n\n const ids = new Set(selectedIds);\n const selected = state.layers.filter((l) => ids.has(l.id));\n\n return (\n <>\n {selected.map((l) => (\n <div\n key={l.id}\n className=\"absolute pointer-events-none\"\n style={{\n left: l.x,\n top: l.y,\n width: l.width,\n height: l.height,\n transform: `rotate(${l.rotation ?? 0}deg)`,\n outline: `1.5px solid ${state.accentColor}`,\n outlineOffset: -1,\n }}\n aria-hidden\n />\n ))}\n </>\n );\n}\n\nexport { LayerSelectionOverlay };\n","import { useEffect, useState, type RefObject } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface MarqueeOverlayProps {\n /** Ref to the frame element this marquee is constrained to. */\n containerRef: RefObject<HTMLDivElement | null>;\n}\n\n/**\n * Click-and-drag marquee selection. Listens for pointerdown on the frame\n * background; on drag, paints a translucent rectangle and selects all\n * layers whose bounding box intersects it on pointerup.\n */\nfunction MarqueeOverlay({ containerRef }: MarqueeOverlayProps) {\n const { state } = useCanvasContext();\n const { setSelectedIds, readOnly } = useShellContext();\n const [box, setBox] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n\n useEffect(() => {\n const node = containerRef.current;\n if (!node || readOnly) return;\n\n let start: { x: number; y: number } | null = null;\n\n const onDown = (e: PointerEvent) => {\n // Only when user pressed directly on the frame background, not a layer.\n if (e.target !== node) return;\n if (e.button !== 0) return;\n const rect = node.getBoundingClientRect();\n // Coordinates in artboard-pixels (frame element is unscaled by zoom\n // because zoom is applied to a parent container).\n start = {\n x: ((e.clientX - rect.left) / rect.width) * state.frameSize.width,\n y: ((e.clientY - rect.top) / rect.height) * state.frameSize.height,\n };\n setBox({ x: start.x, y: start.y, w: 0, h: 0 });\n };\n\n const onMove = (e: PointerEvent) => {\n if (!start) return;\n const rect = node.getBoundingClientRect();\n const cx = ((e.clientX - rect.left) / rect.width) * state.frameSize.width;\n const cy = ((e.clientY - rect.top) / rect.height) * state.frameSize.height;\n setBox({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n w: Math.abs(cx - start.x),\n h: Math.abs(cy - start.y),\n });\n };\n\n const onUp = (e: PointerEvent) => {\n if (!start || !box) {\n start = null;\n setBox(null);\n return;\n }\n // Compute intersection.\n const x0 = box.x;\n const y0 = box.y;\n const x1 = box.x + box.w;\n const y1 = box.y + box.h;\n const intersects = state.layers.filter((l) => {\n const lx0 = l.x;\n const ly0 = l.y;\n const lx1 = l.x + l.width;\n const ly1 = l.y + l.height;\n return lx0 < x1 && lx1 > x0 && ly0 < y1 && ly1 > y0;\n });\n const ids = intersects.map((l) => l.id);\n if (e.shiftKey) {\n setSelectedIds((prev) => Array.from(new Set([...prev, ...ids])));\n } else {\n setSelectedIds(ids);\n }\n start = null;\n setBox(null);\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n node.removeEventListener(\"pointerdown\", onDown);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [containerRef, readOnly, state.frameSize, state.layers, setSelectedIds, box]);\n\n if (!box || (box.w < 2 && box.h < 2)) return null;\n\n return (\n <div\n className=\"absolute pointer-events-none\"\n style={{\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n background: \"color-mix(in srgb, var(--brand-primary) 10%, transparent)\",\n outline: \"1px solid var(--brand-primary)\",\n }}\n aria-hidden\n />\n );\n}\n\nexport { MarqueeOverlay };\nexport type { MarqueeOverlayProps };\n","import { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Visual grid overlay — renders a SVG pattern based on `state.gridContainer`.\n * Non-interactive; sits behind the layers but inside the artboard.\n */\nfunction GridOverlay() {\n const { state } = useCanvasContext();\n const { frameSize, gridContainer } = state;\n if (!gridContainer) return null;\n\n const { cols, rows, gap, padding } = gridContainer;\n const cellW = (frameSize.width - padding * 2 - gap * (cols - 1)) / cols;\n const cellH = (frameSize.height - padding * 2 - gap * (rows - 1)) / rows;\n\n const lines: { x: number; y: number; w: number; h: number }[] = [];\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n lines.push({\n x: padding + c * (cellW + gap),\n y: padding + r * (cellH + gap),\n w: cellW,\n h: cellH,\n });\n }\n }\n\n return (\n <svg\n className=\"absolute inset-0 pointer-events-none\"\n width={frameSize.width}\n height={frameSize.height}\n aria-hidden\n >\n {lines.map((cell, i) => (\n <rect\n key={i}\n x={cell.x}\n y={cell.y}\n width={cell.w}\n height={cell.h}\n fill=\"none\"\n stroke=\"var(--brand-primary)\"\n strokeOpacity={0.18}\n strokeDasharray=\"3 3\"\n strokeWidth={1}\n />\n ))}\n </svg>\n );\n}\n\nexport { GridOverlay };\n","import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"@hilum/ui\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { LayerView } from \"./LayerView\";\nimport { LayerSelectionOverlay } from \"../overlays/LayerSelectionOverlay\";\nimport { MarqueeOverlay } from \"../overlays/MarqueeOverlay\";\nimport { GridOverlay } from \"../overlays/GridOverlay\";\n\ninterface DesignerFrameProps {\n className?: string;\n /** Hide the selection overlay (e.g. for a custom one). */\n hideSelectionOverlay?: boolean;\n /** Hide the marquee selection box. */\n hideMarquee?: boolean;\n /** Show the grid overlay. */\n showGrid?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Interactive layer container. Renders the artboard, all layers via the\n * RendererProvider, the marquee selection box, the selection handles, and\n * an optional grid.\n */\nfunction DesignerFrame({\n className,\n hideSelectionOverlay = false,\n hideMarquee = false,\n showGrid = false,\n children,\n}: DesignerFrameProps) {\n const { state } = useCanvasContext();\n const { setSelectedIds } = useShellContext();\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div\n ref={ref}\n onPointerDown={(e) => {\n // Click on the frame background = clear selection.\n if (e.target === ref.current) setSelectedIds([]);\n }}\n className={cn(\"relative shadow-elevated\", className)}\n style={{\n width: state.frameSize.width,\n height: state.frameSize.height,\n background: state.artboardColor,\n opacity: state.artboardOpacity,\n overflow: state.artboardClipContent ? \"hidden\" : \"visible\",\n }}\n data-frame\n >\n {showGrid && <GridOverlay />}\n {state.layers.map((l) => (\n <LayerView key={l.id} layer={l} />\n ))}\n {!hideSelectionOverlay && <LayerSelectionOverlay />}\n {!hideMarquee && <MarqueeOverlay containerRef={ref} />}\n {children}\n </div>\n );\n}\n\nexport { DesignerFrame };\nexport type { DesignerFrameProps };\n","import { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { LayerView } from \"./LayerView\";\n\ninterface DesignerStaticFrameProps {\n className?: string;\n /** Override frame size — used by thumbnails to render at a custom resolution. */\n width?: number;\n height?: number;\n}\n\n/**\n * Read-only render of the canvas — no interactivity, no overlays. Use for\n * dashboard thumbnails or print previews. The same renderers from\n * <RendererProvider> are used; their `ctx.readOnly` will be true.\n */\nfunction DesignerStaticFrame({ className, width, height }: DesignerStaticFrameProps) {\n const { state } = useCanvasContext();\n const w = width ?? state.frameSize.width;\n const h = height ?? state.frameSize.height;\n\n return (\n <div\n className={cn(\"relative\", className)}\n style={{\n width: w,\n height: h,\n background: state.artboardColor,\n opacity: state.artboardOpacity,\n overflow: state.artboardClipContent ? \"hidden\" : \"visible\",\n }}\n data-static-frame\n >\n {state.layers.map((l) => (\n <LayerView key={l.id} layer={l} staticMode />\n ))}\n </div>\n );\n}\n\nexport { DesignerStaticFrame };\nexport type { DesignerStaticFrameProps };\n","import { useMemo } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\nexport function useLayers<TData = Record<string, unknown>>(): Layer<TData>[] {\n return useCanvasContext<TData>().state.layers;\n}\n\nexport function useLayer<TData = Record<string, unknown>>(id: string): Layer<TData> | undefined {\n const layers = useLayers<TData>();\n return useMemo(() => layers.find((l) => l.id === id), [layers, id]);\n}\n\nexport function useSelectedLayerIds(): string[] {\n return useShellContext().selectedIds;\n}\n\nexport function useSelectedLayers<TData = Record<string, unknown>>(): Layer<TData>[] {\n const ids = useSelectedLayerIds();\n const layers = useLayers<TData>();\n return useMemo(() => layers.filter((l) => ids.includes(l.id)), [layers, ids]);\n}\n\nexport function useSelectedLayer<TData = Record<string, unknown>>(): Layer<TData> | undefined {\n const selected = useSelectedLayers<TData>();\n return selected[0];\n}\n\nexport function useIsLayerSelected(id: string): boolean {\n return useSelectedLayerIds().includes(id);\n}\n","import { useCallback } from \"react\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface UseZoomReturn {\n zoom: number;\n setZoom: (next: number) => void;\n zoomIn: () => void;\n zoomOut: () => void;\n resetZoom: () => void;\n /** Fit zoom to bring the artboard into view, given an outer container. */\n fitZoom: (container: { width: number; height: number }, padding?: number) => void;\n}\n\nconst ZOOM_STEPS = [0.05, 0.1, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24, 32];\n\nfunction nextStep(zoom: number, dir: \"in\" | \"out\"): number {\n if (dir === \"in\") {\n return ZOOM_STEPS.find((s) => s > zoom) ?? ZOOM_STEPS[ZOOM_STEPS.length - 1]!;\n }\n let prev = ZOOM_STEPS[0]!;\n for (const s of ZOOM_STEPS) {\n if (s >= zoom) break;\n prev = s;\n }\n return prev;\n}\n\nexport function useZoom(): UseZoomReturn {\n const { state, dispatch } = useCanvasContext();\n\n const setZoom = useCallback(\n (next: number) => dispatch({ type: \"SET_ZOOM\", payload: next }),\n [dispatch],\n );\n\n const zoomIn = useCallback(\n () => dispatch({ type: \"SET_ZOOM\", payload: nextStep(state.zoom, \"in\") }),\n [dispatch, state.zoom],\n );\n\n const zoomOut = useCallback(\n () => dispatch({ type: \"SET_ZOOM\", payload: nextStep(state.zoom, \"out\") }),\n [dispatch, state.zoom],\n );\n\n const resetZoom = useCallback(() => dispatch({ type: \"SET_ZOOM\", payload: 1 }), [dispatch]);\n\n const fitZoom = useCallback(\n ({ width, height }: { width: number; height: number }, padding = 64) => {\n const ratio = Math.min(\n (width - padding) / state.frameSize.width,\n (height - padding) / state.frameSize.height,\n );\n dispatch({ type: \"SET_ZOOM\", payload: Math.max(0.05, Math.min(32, ratio)) });\n dispatch({ type: \"SET_PAN\", payload: { x: 0, y: 0 } });\n },\n [dispatch, state.frameSize],\n );\n\n return { zoom: state.zoom, setZoom, zoomIn, zoomOut, resetZoom, fitZoom };\n}\n","import { useEffect, useRef } from \"react\";\nimport { useHistory } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\n/**\n * Wires `@hilum/designer`'s generic `useHistory<T>` to the canvas reducer.\n *\n * Apps don't usually use this directly — `<Designer>` mounts it. The pattern:\n * the reducer commits state on every dispatch; this hook syncs the layers\n * slice into the history stack when changes are user-initiated.\n *\n * For now, the canvas's reducer doesn't directly track history (history lives\n * in @hilum/designer's hook). Apps that want canvas-level undo/redo wire\n * `useHistory<Layer[]>(initialLayers)` and dispatch `SET_LAYERS` to apply\n * undo / redo results.\n */\nexport function useHistoryActions<TData = Record<string, unknown>>() {\n const { state, dispatch } = useCanvasContext<TData>();\n const initialRef = useRef(state.layers);\n const hist = useHistory<Layer<TData>[]>(initialRef.current);\n\n // When state.layers changes (user dispatched a mutation), push to history.\n // Skip the initial mount and any echo from undo/redo.\n const lastSeenRef = useRef(state.layers);\n useEffect(() => {\n if (state.layers === lastSeenRef.current) return;\n if (state.layers === hist.state) {\n // We just reflected an undo/redo result; don't re-push.\n lastSeenRef.current = state.layers;\n return;\n }\n hist.setState(state.layers);\n lastSeenRef.current = state.layers;\n }, [state.layers, hist]);\n\n const undo = () => {\n hist.undo();\n // Apply the new history.state to the reducer on the next tick.\n queueMicrotask(() => dispatch({ type: \"SET_LAYERS\", payload: hist.state }));\n };\n\n const redo = () => {\n hist.redo();\n queueMicrotask(() => dispatch({ type: \"SET_LAYERS\", payload: hist.state }));\n };\n\n return { undo, redo, canUndo: hist.canUndo, canRedo: hist.canRedo };\n}\n","import { Plus } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return `layer-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Renders one toolbar button per registered layer type. Apps that want a\n * single + dropdown can build their own using <DropdownMenu> and the same\n * dispatch call.\n */\nfunction ActionAddLayer() {\n const { state, dispatch } = useCanvasContext();\n const { setSelectedIds } = useShellContext();\n\n if (state.layerTypes.length === 0) {\n return <DesignerToolbarButton label=\"Add layer\" icon={Plus} disabled />;\n }\n\n return (\n <DesignerToolbarGroup>\n {state.layerTypes.map((descriptor) => {\n const Icon = descriptor.icon ?? Plus;\n return (\n <DesignerToolbarButton\n key={descriptor.type}\n label={`Add ${descriptor.label}`}\n icon={Icon}\n onClick={() => {\n const id = generateId();\n const size = descriptor.defaultSize ?? { width: 200, height: 100 };\n const layer: Layer<Record<string, unknown>> = {\n id,\n type: descriptor.type,\n name: descriptor.label,\n x: state.frameSize.width / 2 - size.width / 2,\n y: state.frameSize.height / 2 - size.height / 2,\n width: size.width,\n height: size.height,\n rotation: 0,\n opacity: 1,\n isLocked: false,\n isVisible: true,\n data: descriptor.defaultData as Record<string, unknown>,\n };\n dispatch({ type: \"ADD_LAYER\", payload: layer });\n setSelectedIds([id]);\n }}\n />\n );\n })}\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionAddLayer };\n","import {\n AlignCenter,\n AlignLeft,\n AlignRight,\n AlignVerticalSpaceAround,\n AlignHorizontalSpaceAround,\n AlignStartHorizontal,\n AlignEndHorizontal,\n AlignVerticalJustifyCenter,\n} from \"lucide-react\";\nimport {\n DesignerToolbarButton,\n DesignerToolbarGroup,\n DesignerToolbarSeparator,\n useShellContext,\n} from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Alignment + distribution toolbar group. Operates on currently-selected\n * layers via ShellContext.selectedIds (passed explicitly to the reducer).\n */\nfunction ActionAlign() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length < 2;\n\n const align = (a: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\") => () =>\n dispatch({ type: \"ALIGN_LAYERS\", payload: { targetLayerIds: selectedIds, align: a } });\n\n const distribute = (axis: \"horizontal\" | \"vertical\") => () =>\n dispatch({ type: \"DISTRIBUTE_LAYERS\", payload: { targetLayerIds: selectedIds, axis } });\n\n return (\n <>\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Align left\"\n icon={AlignLeft}\n onClick={align(\"left\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align center\"\n icon={AlignCenter}\n onClick={align(\"center\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align right\"\n icon={AlignRight}\n onClick={align(\"right\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n <DesignerToolbarSeparator />\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Align top\"\n icon={AlignStartHorizontal}\n onClick={align(\"top\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align middle\"\n icon={AlignVerticalJustifyCenter}\n onClick={align(\"middle\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align bottom\"\n icon={AlignEndHorizontal}\n onClick={align(\"bottom\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n <DesignerToolbarSeparator />\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Distribute horizontally\"\n icon={AlignHorizontalSpaceAround}\n onClick={distribute(\"horizontal\")}\n disabled={selectedIds.length < 3}\n />\n <DesignerToolbarButton\n label=\"Distribute vertically\"\n icon={AlignVerticalSpaceAround}\n onClick={distribute(\"vertical\")}\n disabled={selectedIds.length < 3}\n />\n </DesignerToolbarGroup>\n </>\n );\n}\n\nexport { ActionAlign };\n","import { ArrowUp, ArrowDown, ChevronsUp, ChevronsDown } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/** Bring to front / back / forward / backward. */\nfunction ActionArrange() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length === 0;\n\n const arrange = (mode: \"front\" | \"back\" | \"forward\" | \"backward\") => () =>\n dispatch({ type: \"ARRANGE_LAYERS\", payload: { targetLayerIds: selectedIds, mode } });\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Bring to front\"\n icon={ChevronsUp}\n onClick={arrange(\"front\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Bring forward\"\n icon={ArrowUp}\n onClick={arrange(\"forward\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Send backward\"\n icon={ArrowDown}\n onClick={arrange(\"backward\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Send to back\"\n icon={ChevronsDown}\n onClick={arrange(\"back\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionArrange };\n","import { Trash2 } from \"lucide-react\";\nimport { DesignerToolbarButton, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionDelete() {\n const { dispatch } = useCanvasContext();\n const { selectedIds, setSelectedIds } = useShellContext();\n\n return (\n <DesignerToolbarButton\n label=\"Delete\"\n icon={Trash2}\n shortcut=\"Del\"\n disabled={selectedIds.length === 0}\n onClick={() => {\n dispatch({ type: \"DELETE_LAYERS\", payload: selectedIds });\n setSelectedIds([]);\n }}\n />\n );\n}\n\nexport { ActionDelete };\n","import { Copy } from \"lucide-react\";\nimport { DesignerToolbarButton, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionDuplicate() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n\n return (\n <DesignerToolbarButton\n label=\"Duplicate\"\n icon={Copy}\n shortcut=\"⌘D\"\n disabled={selectedIds.length === 0}\n onClick={() => {\n dispatch({ type: \"COPY_LAYERS\", payload: { targetLayerIds: selectedIds } });\n dispatch({ type: \"PASTE_LAYERS\" });\n }}\n />\n );\n}\n\nexport { ActionDuplicate };\n","import { Group, Ungroup } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionGroup() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Group\"\n icon={Group}\n shortcut=\"⌘G\"\n disabled={selectedIds.length < 2}\n onClick={() => {\n const groupId =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `group-${Date.now()}`;\n dispatch({ type: \"GROUP_LAYERS\", payload: { targetLayerIds: selectedIds, groupId } });\n }}\n />\n <DesignerToolbarButton\n label=\"Ungroup\"\n icon={Ungroup}\n shortcut=\"⇧⌘G\"\n disabled={selectedIds.length === 0}\n onClick={() =>\n dispatch({ type: \"UNGROUP_LAYERS\", payload: { targetLayerIds: selectedIds } })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionGroup };\n","import { Lock, Unlock, Eye, EyeOff } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { useSelectedLayers } from \"../hooks/useLayers\";\n\nfunction ActionLock() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const selected = useSelectedLayers();\n const disabled = selectedIds.length === 0;\n\n const allLocked = selected.length > 0 && selected.every((l) => l.isLocked);\n const allHidden = selected.length > 0 && selected.every((l) => l.isVisible === false);\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label={allLocked ? \"Unlock\" : \"Lock\"}\n icon={allLocked ? Unlock : Lock}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"SET_LAYER_PROPERTY\",\n payload: { targetLayerIds: selectedIds, key: \"isLocked\", value: !allLocked },\n })\n }\n />\n <DesignerToolbarButton\n label={allHidden ? \"Show\" : \"Hide\"}\n icon={allHidden ? EyeOff : Eye}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"SET_LAYER_PROPERTY\",\n payload: { targetLayerIds: selectedIds, key: \"isVisible\", value: allHidden },\n })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionLock };\n","import type { ComponentType } from \"react\";\nimport { MousePointer2, Hand } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\n\ninterface ToolDescriptor {\n id: string;\n label: string;\n icon: ComponentType<{ size?: number; className?: string }>;\n shortcut?: string;\n}\n\nconst DEFAULT_TOOLS: ToolDescriptor[] = [\n { id: \"select\", label: \"Select\", icon: MousePointer2, shortcut: \"V\" },\n { id: \"hand\", label: \"Pan\", icon: Hand, shortcut: \"H\" },\n];\n\ninterface ActionToolProps {\n /** Override default tools. */\n tools?: ToolDescriptor[];\n}\n\nfunction ActionTool({ tools = DEFAULT_TOOLS }: ActionToolProps) {\n const { activeTool, setActiveTool } = useShellContext();\n\n return (\n <DesignerToolbarGroup>\n {tools.map((tool) => (\n <DesignerToolbarButton\n key={tool.id}\n label={tool.label}\n icon={tool.icon}\n {...(tool.shortcut !== undefined && { shortcut: tool.shortcut })}\n active={activeTool === tool.id}\n onClick={() => setActiveTool(tool.id)}\n />\n ))}\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionTool };\nexport type { ActionToolProps, ToolDescriptor };\n","import { FlipHorizontal, FlipVertical } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionTransform() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length === 0;\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Flip horizontal\"\n icon={FlipHorizontal}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"TRANSFORM_LAYERS\",\n payload: { targetLayerIds: selectedIds, mode: \"flip-h\" },\n })\n }\n />\n <DesignerToolbarButton\n label=\"Flip vertical\"\n icon={FlipVertical}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"TRANSFORM_LAYERS\",\n payload: { targetLayerIds: selectedIds, mode: \"flip-v\" },\n })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionTransform };\n","import { Undo2, Redo2 } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup } from \"@hilum/designer\";\nimport { useHistoryActions } from \"../hooks/useHistoryActions\";\n\nfunction ActionUndoRedo() {\n const { undo, redo, canUndo, canRedo } = useHistoryActions();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Undo\"\n icon={Undo2}\n shortcut=\"⌘Z\"\n onClick={undo}\n disabled={!canUndo}\n />\n <DesignerToolbarButton\n label=\"Redo\"\n icon={Redo2}\n shortcut=\"⇧⌘Z\"\n onClick={redo}\n disabled={!canRedo}\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionUndoRedo };\n","import { Plus, Minus, Maximize2 } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup } from \"@hilum/designer\";\nimport { useZoom } from \"../hooks/useZoom\";\n\nfunction ActionZoom() {\n const { zoom, zoomIn, zoomOut, resetZoom } = useZoom();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton label=\"Zoom out\" icon={Minus} shortcut=\"⌘-\" onClick={zoomOut} />\n <DesignerToolbarButton label=\"Reset zoom\" icon={Maximize2} shortcut=\"⌘0\" onClick={resetZoom}>\n <span className=\"caption-xs ml-1 tabular-nums\">{Math.round(zoom * 100)}%</span>\n </DesignerToolbarButton>\n <DesignerToolbarButton label=\"Zoom in\" icon={Plus} shortcut=\"⌘=\" onClick={zoomIn} />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionZoom };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/state.ts","../src/context/reducer.ts","../src/context/CanvasContext.tsx","../src/context/CanvasProvider.tsx","../src/renderer/RendererProvider.tsx","../src/components/Designer.tsx","../src/components/DesignerCanvas.tsx","../src/hooks/useDragInteraction.ts","../src/components/LayerView.tsx","../src/overlays/LayerSelectionOverlay.tsx","../src/overlays/MarqueeOverlay.tsx","../src/overlays/GridOverlay.tsx","../src/components/DesignerFrame.tsx","../src/components/DesignerStaticFrame.tsx","../src/hooks/useLayers.ts","../src/hooks/useZoom.ts","../src/hooks/useHistoryActions.ts","../src/actions/ActionAddLayer.tsx","../src/actions/ActionAlign.tsx","../src/actions/ActionArrange.tsx","../src/actions/ActionDelete.tsx","../src/actions/ActionDuplicate.tsx","../src/actions/ActionGroup.tsx","../src/actions/ActionLock.tsx","../src/actions/ActionTool.tsx","../src/actions/ActionTransform.tsx","../src/actions/ActionUndoRedo.tsx","../src/actions/ActionZoom.tsx"],"names":["createContext","useMemo","jsx","useContext","useRef","useEffect","useShellContext","cn","useState","useCallback","generateId","jsxs","Fragment","DesignerToolbarGroup","DesignerToolbarButton","Plus"],"mappings":"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","file":"index.js","sourcesContent":["// Slim CanvasState — generic free-positioned canvas only.\n// All Pappery domain (productType, dpi, binding*, bleed, etc.) is excluded\n// per PHASE_0_AUDIT.md §P0.4.\n\nimport type {\n FrameSize,\n GridContainer,\n Layer,\n LayerTypeDescriptor,\n PanState,\n SurfaceTheme,\n} from \"../types\";\n\nexport interface CanvasState<TData = Record<string, unknown>> {\n /** All layers in z-order. Index 0 = bottom. */\n layers: Layer<TData>[];\n\n /** View state. */\n zoom: number;\n pan: PanState;\n\n /** Artboard / frame. */\n frameSize: FrameSize;\n artboardName: string;\n artboardColor: string;\n artboardOpacity: number;\n /** Whether content is clipped to the frame bounds. */\n artboardClipContent: boolean;\n\n /** Optional grid layout mode. When set, layers can use `gridItem`. */\n gridContainer?: GridContainer | undefined;\n\n /** Clipboard: layers that have been copied / cut. */\n copiedLayers: Layer<TData>[] | null;\n\n /** Theme — chrome reads from here, components reference Hilum semantic vars. */\n uiColor: SurfaceTheme;\n canvasColor: SurfaceTheme;\n /** Editor accent (selection handles, snap guides). Defaults to Hilum brand-primary via CSS var. */\n accentColor: string;\n\n /** Renderer registry: descriptors for the layer kinds the app supports. */\n layerTypes: LayerTypeDescriptor[];\n\n /** When true, mutating actions no-op. */\n readOnly: boolean;\n}\n\nexport function createInitialState<TData>(\n partial: Partial<CanvasState<TData>> = {},\n): CanvasState<TData> {\n return {\n layers: [],\n zoom: 1,\n pan: { x: 0, y: 0 },\n frameSize: { width: 800, height: 600 },\n artboardName: \"Artboard\",\n artboardColor: \"#ffffff\",\n artboardOpacity: 1,\n artboardClipContent: true,\n copiedLayers: null,\n uiColor: \"light\",\n canvasColor: \"light\",\n accentColor: \"var(--brand-primary)\",\n layerTypes: [],\n readOnly: false,\n ...partial,\n };\n}\n","// Generic CanvasState reducer.\n//\n// Per PHASE_0_AUDIT.md §P0.4, layer-mutating actions that depend on\n// selection accept an explicit `targetLayerIds: string[]` payload. This\n// decouples the reducer from ShellContext's selection store.\n\nimport type { GridContainer, Layer } from \"../types\";\nimport type { CanvasState } from \"./state\";\n\n/* ============================================================== *\n * Action types *\n * ============================================================== */\n\nexport type CanvasAction<TData = Record<string, unknown>> =\n // Layer CRUD\n | { type: \"SET_LAYERS\"; payload: Layer<TData>[] }\n | { type: \"ADD_LAYER\"; payload: Layer<TData> }\n | { type: \"UPDATE_LAYER\"; payload: { id: string; updates: Partial<Layer<TData>> } }\n | { type: \"UPDATE_LAYERS\"; payload: Array<{ id: string; updates: Partial<Layer<TData>> }> }\n | { type: \"DELETE_LAYER\"; payload: string }\n | { type: \"DELETE_LAYERS\"; payload: string[] }\n | { type: \"REORDER_LAYERS\"; payload: { fromIndex: number; toIndex: number } }\n // Selection-driven (caller passes targetLayerIds — see P0.4)\n | { type: \"NUDGE_LAYERS\"; payload: { targetLayerIds: string[]; dx: number; dy: number } }\n | {\n type: \"ALIGN_LAYERS\";\n payload: {\n targetLayerIds: string[];\n align: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\";\n };\n }\n | {\n type: \"DISTRIBUTE_LAYERS\";\n payload: { targetLayerIds: string[]; axis: \"horizontal\" | \"vertical\" };\n }\n | { type: \"GROUP_LAYERS\"; payload: { targetLayerIds: string[]; groupId: string } }\n | { type: \"UNGROUP_LAYERS\"; payload: { targetLayerIds: string[] } }\n | {\n type: \"ARRANGE_LAYERS\";\n payload: { targetLayerIds: string[]; mode: \"front\" | \"back\" | \"forward\" | \"backward\" };\n }\n | { type: \"TRANSFORM_LAYERS\"; payload: { targetLayerIds: string[]; mode: \"flip-h\" | \"flip-v\" } }\n | {\n type: \"SET_LAYER_PROPERTY\";\n payload: { targetLayerIds: string[]; key: keyof Layer<TData>; value: unknown };\n }\n // Viewport\n | { type: \"SET_ZOOM\"; payload: number }\n | { type: \"SET_PAN\"; payload: { x: number; y: number } }\n | { type: \"SET_FRAME_SIZE\"; payload: { width: number; height: number } }\n // Artboard chrome\n | { type: \"SET_ARTBOARD_NAME\"; payload: string }\n | { type: \"SET_ARTBOARD_COLOR\"; payload: string }\n | { type: \"SET_ARTBOARD_OPACITY\"; payload: number }\n | { type: \"SET_ARTBOARD_CLIP_CONTENT\"; payload: boolean }\n // Grid\n | { type: \"SET_GRID_CONTAINER\"; payload: GridContainer }\n | { type: \"CLEAR_GRID_CONTAINER\" }\n | { type: \"UPDATE_GRID_CONTAINER\"; payload: Partial<GridContainer> }\n // Theme\n | { type: \"SET_UI_COLOR\"; payload: \"light\" | \"mid\" | \"dark\" }\n | { type: \"SET_CANVAS_COLOR\"; payload: \"light\" | \"mid\" | \"dark\" }\n | { type: \"SET_ACCENT_COLOR\"; payload: string }\n // Clipboard\n | { type: \"COPY_LAYERS\"; payload: { targetLayerIds: string[] } }\n | { type: \"PASTE_LAYERS\"; payload?: { offset?: { dx: number; dy: number } } }\n | { type: \"CLEAR_CLIPBOARD\" }\n // Read-only\n | { type: \"SET_READ_ONLY\"; payload: boolean };\n\n/* ============================================================== *\n * Reducer *\n * ============================================================== */\n\nexport function canvasReducer<TData>(\n state: CanvasState<TData>,\n action: CanvasAction<TData>,\n): CanvasState<TData> {\n if (state.readOnly && action.type !== \"SET_READ_ONLY\" && !isReadActionAllowed(action.type)) {\n return state;\n }\n\n switch (action.type) {\n /* ---------------- Layer CRUD ---------------- */\n\n case \"SET_LAYERS\":\n return { ...state, layers: action.payload };\n\n case \"ADD_LAYER\":\n return { ...state, layers: [...state.layers, action.payload] };\n\n case \"UPDATE_LAYER\": {\n const { id, updates } = action.payload;\n return {\n ...state,\n layers: state.layers.map((l) => (l.id === id ? { ...l, ...updates } : l)),\n };\n }\n\n case \"UPDATE_LAYERS\": {\n const map = new Map(action.payload.map((u) => [u.id, u.updates]));\n return {\n ...state,\n layers: state.layers.map((l) => (map.has(l.id) ? { ...l, ...map.get(l.id)! } : l)),\n };\n }\n\n case \"DELETE_LAYER\":\n return { ...state, layers: state.layers.filter((l) => l.id !== action.payload) };\n\n case \"DELETE_LAYERS\": {\n const ids = new Set(action.payload);\n return { ...state, layers: state.layers.filter((l) => !ids.has(l.id)) };\n }\n\n case \"REORDER_LAYERS\": {\n const { fromIndex, toIndex } = action.payload;\n const next = [...state.layers];\n const [moved] = next.splice(fromIndex, 1);\n if (moved) next.splice(toIndex, 0, moved);\n return { ...state, layers: next };\n }\n\n /* ---------------- Selection-driven mutations ---------------- */\n\n case \"NUDGE_LAYERS\": {\n const { targetLayerIds, dx, dy } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) =>\n ids.has(l.id) && !l.isLocked ? { ...l, x: l.x + dx, y: l.y + dy } : l,\n ),\n };\n }\n\n case \"ALIGN_LAYERS\":\n return {\n ...state,\n layers: alignLayers(state.layers, action.payload.targetLayerIds, action.payload.align),\n };\n\n case \"DISTRIBUTE_LAYERS\":\n return {\n ...state,\n layers: distributeLayers(state.layers, action.payload.targetLayerIds, action.payload.axis),\n };\n\n case \"GROUP_LAYERS\": {\n const { targetLayerIds, groupId } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => (ids.has(l.id) ? { ...l, groupId } : l)),\n };\n }\n\n case \"UNGROUP_LAYERS\": {\n const ids = new Set(action.payload.targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => {\n if (!ids.has(l.id)) return l;\n const { groupId: _gid, ...rest } = l;\n return rest as Layer<TData>;\n }),\n };\n }\n\n case \"ARRANGE_LAYERS\":\n return {\n ...state,\n layers: arrangeLayers(state.layers, action.payload.targetLayerIds, action.payload.mode),\n };\n\n case \"TRANSFORM_LAYERS\": {\n const { targetLayerIds, mode } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) => {\n if (!ids.has(l.id) || l.isLocked) return l;\n const data = l.data as Record<string, unknown>;\n const flipKey = mode === \"flip-h\" ? \"_flipX\" : \"_flipY\";\n const current = (data[flipKey] as number) ?? 1;\n return { ...l, data: { ...data, [flipKey]: -current } as TData };\n }),\n };\n }\n\n case \"SET_LAYER_PROPERTY\": {\n const { targetLayerIds, key, value } = action.payload;\n const ids = new Set(targetLayerIds);\n return {\n ...state,\n layers: state.layers.map((l) =>\n ids.has(l.id) ? ({ ...l, [key]: value } as Layer<TData>) : l,\n ),\n };\n }\n\n /* ---------------- Viewport ---------------- */\n\n case \"SET_ZOOM\":\n return { ...state, zoom: clamp(action.payload, 0.05, 32) };\n\n case \"SET_PAN\":\n return { ...state, pan: action.payload };\n\n case \"SET_FRAME_SIZE\":\n return { ...state, frameSize: action.payload };\n\n /* ---------------- Artboard ---------------- */\n\n case \"SET_ARTBOARD_NAME\":\n return { ...state, artboardName: action.payload };\n case \"SET_ARTBOARD_COLOR\":\n return { ...state, artboardColor: action.payload };\n case \"SET_ARTBOARD_OPACITY\":\n return { ...state, artboardOpacity: clamp(action.payload, 0, 1) };\n case \"SET_ARTBOARD_CLIP_CONTENT\":\n return { ...state, artboardClipContent: action.payload };\n\n /* ---------------- Grid ---------------- */\n\n case \"SET_GRID_CONTAINER\":\n return { ...state, gridContainer: action.payload };\n case \"CLEAR_GRID_CONTAINER\":\n return { ...state, gridContainer: undefined };\n case \"UPDATE_GRID_CONTAINER\":\n return state.gridContainer\n ? { ...state, gridContainer: { ...state.gridContainer, ...action.payload } }\n : state;\n\n /* ---------------- Theme ---------------- */\n\n case \"SET_UI_COLOR\":\n return { ...state, uiColor: action.payload };\n case \"SET_CANVAS_COLOR\":\n return { ...state, canvasColor: action.payload };\n case \"SET_ACCENT_COLOR\":\n return { ...state, accentColor: action.payload };\n\n /* ---------------- Clipboard ---------------- */\n\n case \"COPY_LAYERS\": {\n const ids = new Set(action.payload.targetLayerIds);\n const copied = state.layers.filter((l) => ids.has(l.id)).map(deepClone);\n return { ...state, copiedLayers: copied };\n }\n\n case \"PASTE_LAYERS\": {\n if (!state.copiedLayers || state.copiedLayers.length === 0) return state;\n const offset = action.payload?.offset ?? { dx: 16, dy: 16 };\n const fresh = state.copiedLayers.map((l) => ({\n ...deepClone(l),\n id: generateId(),\n x: l.x + offset.dx,\n y: l.y + offset.dy,\n }));\n return { ...state, layers: [...state.layers, ...fresh] };\n }\n\n case \"CLEAR_CLIPBOARD\":\n return { ...state, copiedLayers: null };\n\n /* ---------------- Read-only ---------------- */\n\n case \"SET_READ_ONLY\":\n return { ...state, readOnly: action.payload };\n\n default:\n return state;\n }\n}\n\n/* ============================================================== *\n * Helpers *\n * ============================================================== */\n\nfunction isReadActionAllowed(type: string): boolean {\n return (\n type === \"SET_ZOOM\" ||\n type === \"SET_PAN\" ||\n type === \"SET_UI_COLOR\" ||\n type === \"SET_CANVAS_COLOR\"\n );\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.min(max, Math.max(min, n));\n}\n\nfunction deepClone<T>(v: T): T {\n if (typeof structuredClone === \"function\") return structuredClone(v);\n return JSON.parse(JSON.stringify(v));\n}\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto)\n return (crypto as Crypto).randomUUID();\n return `layer-${Math.random().toString(36).slice(2, 11)}`;\n}\n\nfunction alignLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n align: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const targets = layers.filter((l) => idSet.has(l.id));\n if (targets.length < 2) return layers;\n\n let value = 0;\n switch (align) {\n case \"left\":\n value = Math.min(...targets.map((l) => l.x));\n break;\n case \"right\": {\n const maxRight = Math.max(...targets.map((l) => l.x + l.width));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: maxRight - l.width } : l));\n }\n case \"center\": {\n const minX = Math.min(...targets.map((l) => l.x));\n const maxX = Math.max(...targets.map((l) => l.x + l.width));\n const center = (minX + maxX) / 2;\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: center - l.width / 2 } : l));\n }\n case \"top\":\n value = Math.min(...targets.map((l) => l.y));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: value } : l));\n case \"bottom\": {\n const maxBottom = Math.max(...targets.map((l) => l.y + l.height));\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: maxBottom - l.height } : l));\n }\n case \"middle\": {\n const minY = Math.min(...targets.map((l) => l.y));\n const maxY = Math.max(...targets.map((l) => l.y + l.height));\n const middle = (minY + maxY) / 2;\n return layers.map((l) => (idSet.has(l.id) ? { ...l, y: middle - l.height / 2 } : l));\n }\n }\n\n return layers.map((l) => (idSet.has(l.id) ? { ...l, x: value } : l));\n}\n\nfunction distributeLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n axis: \"horizontal\" | \"vertical\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const targets = layers.filter((l) => idSet.has(l.id));\n if (targets.length < 3) return layers;\n\n if (axis === \"horizontal\") {\n const sorted = [...targets].sort((a, b) => a.x - b.x);\n const first = sorted[0]!;\n const last = sorted[sorted.length - 1]!;\n const totalSpan = last.x + last.width - first.x;\n const totalWidth = sorted.reduce((s, l) => s + l.width, 0);\n const gap = (totalSpan - totalWidth) / (sorted.length - 1);\n let cursor = first.x;\n const updates = new Map<string, number>();\n for (const l of sorted) {\n updates.set(l.id, cursor);\n cursor += l.width + gap;\n }\n return layers.map((l) => (updates.has(l.id) ? { ...l, x: updates.get(l.id)! } : l));\n } else {\n const sorted = [...targets].sort((a, b) => a.y - b.y);\n const first = sorted[0]!;\n const last = sorted[sorted.length - 1]!;\n const totalSpan = last.y + last.height - first.y;\n const totalHeight = sorted.reduce((s, l) => s + l.height, 0);\n const gap = (totalSpan - totalHeight) / (sorted.length - 1);\n let cursor = first.y;\n const updates = new Map<string, number>();\n for (const l of sorted) {\n updates.set(l.id, cursor);\n cursor += l.height + gap;\n }\n return layers.map((l) => (updates.has(l.id) ? { ...l, y: updates.get(l.id)! } : l));\n }\n}\n\nfunction arrangeLayers<TData>(\n layers: Layer<TData>[],\n ids: string[],\n mode: \"front\" | \"back\" | \"forward\" | \"backward\",\n): Layer<TData>[] {\n const idSet = new Set(ids);\n const indices = layers.map((l, i) => (idSet.has(l.id) ? i : -1)).filter((i) => i >= 0);\n if (indices.length === 0) return layers;\n\n switch (mode) {\n case \"front\": {\n const targets = indices.map((i) => layers[i]!);\n const others = layers.filter((l) => !idSet.has(l.id));\n return [...others, ...targets];\n }\n case \"back\": {\n const targets = indices.map((i) => layers[i]!);\n const others = layers.filter((l) => !idSet.has(l.id));\n return [...targets, ...others];\n }\n case \"forward\": {\n const next = [...layers];\n // Move each selected layer forward by 1, last selected first to avoid collisions.\n for (let i = indices.length - 1; i >= 0; i--) {\n const idx = indices[i]!;\n if (idx < next.length - 1) {\n [next[idx], next[idx + 1]] = [next[idx + 1]!, next[idx]!];\n }\n }\n return next;\n }\n case \"backward\": {\n const next = [...layers];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i]!;\n if (idx > 0) {\n [next[idx], next[idx - 1]] = [next[idx - 1]!, next[idx]!];\n }\n }\n return next;\n }\n }\n}\n\nexport const __test = { alignLayers, distributeLayers, arrangeLayers };\n","import { createContext, useContext, type Dispatch } from \"react\";\nimport type { CanvasAction } from \"./reducer\";\nimport type { CanvasState } from \"./state\";\nimport type { CanvasServices } from \"../services/types\";\n\nexport interface CanvasContextValue<TData = Record<string, unknown>> {\n state: CanvasState<TData>;\n dispatch: Dispatch<CanvasAction<TData>>;\n services: CanvasServices;\n /** Bumped on each commit. Apps can use it as a memoization key. */\n revision: number;\n}\n\n// `unknown` here is fine — consumers narrow via the typed hooks below.\nconst CanvasContext = createContext<CanvasContextValue<unknown> | null>(null);\n\nexport function useCanvasContext<TData = Record<string, unknown>>(): CanvasContextValue<TData> {\n const ctx = useContext(\n CanvasContext as unknown as React.Context<CanvasContextValue<TData> | null>,\n );\n if (!ctx) {\n throw new Error(\n \"@hilum/designer-canvas: useCanvasContext must be used inside <Designer> / <CanvasProvider>.\",\n );\n }\n return ctx;\n}\n\nexport const CanvasContextProvider = CanvasContext.Provider as unknown as React.Provider<\n CanvasContextValue<unknown>\n>;\n\nimport type * as React from \"react\";\n","import { useEffect, useMemo, useReducer, useRef, type ReactNode } from \"react\";\nimport { ShellProvider } from \"@hilum/designer\";\nimport { CanvasContextProvider } from \"./CanvasContext\";\nimport { canvasReducer } from \"./reducer\";\nimport { createInitialState } from \"./state\";\nimport type { CanvasState } from \"./state\";\nimport type { CanvasAction } from \"./reducer\";\nimport type { CanvasServices } from \"../services/types\";\nimport type { Layer } from \"../types\";\n\ninterface CanvasProviderProps<TData = Record<string, unknown>> {\n initial?: Partial<CanvasState<TData>>;\n /** Optional injected services — see PHASE_0_AUDIT.md §P0.6. */\n services?: CanvasServices;\n /** Read-only mode (e.g. for thumbnails). */\n readOnly?: boolean;\n /** Receive every state transition. Useful for syncing to external storage. */\n onChange?: (state: CanvasState<TData>) => void;\n children: ReactNode;\n}\n\n/**\n * Mounts both ShellContext (from @hilum/designer) and CanvasContext.\n * Selection lives in ShellContext; layers / viewport / artboard live here.\n *\n * The reducer is generic on TData; apps narrow it by passing a typed\n * `initial.layerTypes` array.\n */\nexport function CanvasProvider<TData = Record<string, unknown>>({\n initial,\n services = {},\n readOnly = false,\n onChange,\n children,\n}: CanvasProviderProps<TData>) {\n const initialState = useMemo(\n () => createInitialState<TData>({ ...initial, readOnly }),\n [], // initial state captured once at mount\n );\n\n const reducer = canvasReducer as (\n s: CanvasState<TData>,\n a: CanvasAction<TData>,\n ) => CanvasState<TData>;\n // `revision` counts committed state transitions. It lives in the reducer\n // state (rather than a ref bumped during render) so it's always consistent\n // with the `state` it's published alongside. No-op actions (reducer returns\n // the same object) don't bump it.\n const [{ state, revision }, dispatch] = useReducer(\n (current: { state: CanvasState<TData>; revision: number }, action: CanvasAction<TData>) => {\n const next = reducer(current.state, action);\n return next === current.state ? current : { state: next, revision: current.revision + 1 };\n },\n { state: initialState, revision: 0 },\n );\n\n // Map `Layer.id → Layer.type` so DesignerPane.showFor works without the\n // shell knowing about the canvas. See @hilum/designer/ShellContext.\n const resolveKind = useMemo(() => {\n const map = new Map<string, string>();\n for (const l of state.layers as Layer<TData>[]) map.set(l.id, l.type);\n return (id: string) => map.get(id);\n }, [state.layers]);\n\n // Notify after each committed state (including the initial one). Calling\n // onChange during render would run a parent's setState mid-render and fire\n // for renders that didn't change state; an effect keyed on `state` fires\n // exactly once per transition. The latest callback is read through a ref so\n // an inline `onChange` doesn't re-trigger the notification.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n useEffect(() => {\n onChangeRef.current?.(state);\n }, [state]);\n\n const value = useMemo(\n () => ({ state, dispatch, services, revision }),\n [state, dispatch, services, revision],\n );\n\n return (\n <ShellProvider readOnly={readOnly} resolveKind={resolveKind}>\n <CanvasContextProvider value={value as never}>{children}</CanvasContextProvider>\n </ShellProvider>\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { LayerRenderer, RendererRegistry } from \"./types\";\n\nconst RendererContext = createContext<RendererRegistry>({});\n\ninterface RendererProviderProps {\n /** Map of layer.type → renderer. Apps register their kinds here. */\n renderers: RendererRegistry;\n children: ReactNode;\n}\n\n/**\n * Pluggable renderer registry. Apps mount this near the canvas root and\n * pass `{ [layerType]: Component }`. The package never ships concrete\n * renderers — Pappery's text/image/shape renderers stay in Pappery, and\n * each app supplies its own per layer kind.\n */\nexport function RendererProvider({ renderers, children }: RendererProviderProps) {\n const value = useMemo(() => renderers, [renderers]);\n return <RendererContext.Provider value={value}>{children}</RendererContext.Provider>;\n}\n\nexport function useLayerRenderer(type: string): LayerRenderer<unknown> | undefined {\n return useContext(RendererContext)[type];\n}\n\nexport function useAllRenderers(): RendererRegistry {\n return useContext(RendererContext);\n}\n","import type { ReactNode } from \"react\";\nimport { CanvasProvider } from \"../context/CanvasProvider\";\nimport { RendererProvider } from \"../renderer/RendererProvider\";\nimport type { CanvasState } from \"../context/state\";\nimport type { CanvasServices } from \"../services/types\";\nimport type { RendererRegistry } from \"../renderer/types\";\n\ninterface DesignerProps<TData = Record<string, unknown>> {\n /** Initial canvas state. Layers, frame size, theme. */\n initial?: Partial<CanvasState<TData>>;\n /** Renderers per layer type. */\n renderers?: RendererRegistry;\n /** Optional injected services (paths, fonts, units, image upload). */\n services?: CanvasServices;\n /** Read-only mode (e.g. for previews). */\n readOnly?: boolean;\n /** Receive every state transition. */\n onChange?: (state: CanvasState<TData>) => void;\n children: ReactNode;\n}\n\n/**\n * Root provider for a canvas-editor app. Mounts ShellProvider (selection,\n * tool, read-only) + CanvasProvider (layers, viewport, artboard) +\n * RendererProvider (per-type renderers).\n *\n * Place <DesignerCanvas><DesignerFrame /></DesignerCanvas> inside, or\n * compose with @hilum/designer's chrome (DesignerShell, Toolbar, etc.).\n */\nfunction Designer<TData = Record<string, unknown>>({\n initial,\n renderers = {},\n services = {},\n readOnly,\n onChange,\n children,\n}: DesignerProps<TData>) {\n return (\n <CanvasProvider<TData>\n {...(initial !== undefined && { initial })}\n services={services}\n {...(readOnly !== undefined && { readOnly })}\n {...(onChange !== undefined && { onChange })}\n >\n <RendererProvider renderers={renderers}>{children}</RendererProvider>\n </CanvasProvider>\n );\n}\n\nexport { Designer };\nexport type { DesignerProps };\n","import { useRef, useEffect, type ReactNode } from \"react\";\nimport { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface DesignerCanvasProps {\n className?: string;\n children?: ReactNode;\n}\n\n/**\n * Pan / zoom viewport. Wraps an inner transform layer that applies the\n * canvas state's pan + zoom. Children (typically `<DesignerFrame>` and\n * overlays) are rendered inside the transform.\n */\nfunction DesignerCanvas({ className, children }: DesignerCanvasProps) {\n const { state, dispatch } = useCanvasContext();\n const ref = useRef<HTMLDivElement>(null);\n\n // Wheel zoom + ctrl/cmd-pan, Trackpad two-finger pan.\n useEffect(() => {\n const node = ref.current;\n if (!node) return;\n\n const onWheel = (e: WheelEvent) => {\n // Pinch-zoom (ctrlKey on macOS trackpad).\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const factor = Math.exp(-e.deltaY * 0.01);\n const next = Math.min(32, Math.max(0.05, state.zoom * factor));\n dispatch({ type: \"SET_ZOOM\", payload: next });\n } else {\n // Two-finger pan.\n e.preventDefault();\n dispatch({\n type: \"SET_PAN\",\n payload: { x: state.pan.x - e.deltaX, y: state.pan.y - e.deltaY },\n });\n }\n };\n node.addEventListener(\"wheel\", onWheel, { passive: false });\n return () => node.removeEventListener(\"wheel\", onWheel);\n }, [state.zoom, state.pan, dispatch]);\n\n return (\n <div\n ref={ref}\n className={cn(\"relative flex-1 overflow-hidden bg-canvas select-none\", className)}\n data-canvas-root\n >\n <div\n className=\"absolute inset-0 origin-center\"\n style={{\n transform: `translate(${state.pan.x}px, ${state.pan.y}px) scale(${state.zoom})`,\n transformOrigin: \"50% 50%\",\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport { DesignerCanvas };\nexport type { DesignerCanvasProps };\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface UseDragInteractionParams {\n layerId: string;\n /** Pixel scale — typically `1 / zoom`. */\n scale?: number;\n}\n\n/**\n * Pointer-driven drag for a single layer. Returns props to spread on the\n * draggable element. Holds Shift for axis-locked movement.\n *\n * Multi-select drag (move all selected layers) is handled by spreading\n * onPointerDown on each selected frame and dispatching UPDATE_LAYERS in the\n * same frame — this hook handles the single-layer case.\n */\nexport function useDragInteraction({ layerId, scale = 1 }: UseDragInteractionParams) {\n const { state, dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const [dragging, setDragging] = useState(false);\n const startRef = useRef<{\n pointerX: number;\n pointerY: number;\n initial: Map<string, { x: number; y: number }>;\n } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (state.readOnly) return;\n const layer = state.layers.find((l) => l.id === layerId);\n if (!layer || layer.isLocked) return;\n\n // If layer is part of selection, drag all selected. Otherwise drag just this one.\n const ids = selectedIds.includes(layerId) ? selectedIds : [layerId];\n const initial = new Map<string, { x: number; y: number }>();\n for (const id of ids) {\n const l = state.layers.find((x) => x.id === id);\n if (l) initial.set(id, { x: l.x, y: l.y });\n }\n\n startRef.current = { pointerX: e.clientX, pointerY: e.clientY, initial };\n setDragging(true);\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n },\n [state, selectedIds, layerId],\n );\n\n useEffect(() => {\n if (!dragging) return;\n\n const onMove = (e: PointerEvent) => {\n const start = startRef.current;\n if (!start) return;\n let dx = (e.clientX - start.pointerX) * scale;\n let dy = (e.clientY - start.pointerY) * scale;\n if (e.shiftKey) {\n // Axis-lock to the larger delta.\n if (Math.abs(dx) > Math.abs(dy)) dy = 0;\n else dx = 0;\n }\n const updates: Array<{ id: string; updates: { x: number; y: number } }> = [];\n start.initial.forEach((origin, id) => {\n updates.push({ id, updates: { x: origin.x + dx, y: origin.y + dy } });\n });\n dispatch({ type: \"UPDATE_LAYERS\", payload: updates });\n };\n\n const onUp = () => {\n startRef.current = null;\n setDragging(false);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onUp);\n };\n }, [dragging, dispatch, scale]);\n\n return { dragging, onPointerDown };\n}\n\nimport type * as React from \"react\";\n","import { useShellContext } from \"@hilum/designer\";\nimport { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { useDragInteraction } from \"../hooks/useDragInteraction\";\nimport { useLayerRenderer } from \"../renderer/RendererProvider\";\nimport type { Layer } from \"../types\";\n\ninterface LayerViewProps {\n layer: Layer<unknown>;\n /** Disable interactions (used by DesignerStaticFrame). */\n staticMode?: boolean;\n}\n\n/**\n * Internal: renders a single layer at its computed position. Wraps the\n * app-supplied renderer with position / size / rotation / opacity, and\n * wires drag + click-to-select.\n */\nfunction LayerView({ layer, staticMode = false }: LayerViewProps) {\n const { state } = useCanvasContext();\n const { selectedIds, setSelectedIds, readOnly } = useShellContext();\n const Renderer = useLayerRenderer(layer.type);\n const { onPointerDown } = useDragInteraction({\n layerId: layer.id,\n scale: 1 / state.zoom,\n });\n\n const selected = selectedIds.includes(layer.id);\n const isVisible = layer.isVisible !== false;\n\n if (!isVisible) return null;\n\n const transform = `rotate(${layer.rotation ?? 0}deg)`;\n const cursor = layer.isLocked ? \"default\" : \"move\";\n\n return (\n <div\n data-layer-id={layer.id}\n onPointerDown={\n staticMode\n ? undefined\n : (e) => {\n if (readOnly) return;\n if (e.button !== 0) return;\n if (!selected) {\n setSelectedIds(e.shiftKey ? [...selectedIds, layer.id] : [layer.id]);\n }\n onPointerDown(e);\n }\n }\n className={cn(\"absolute\", !staticMode && \"cursor-move\", layer.isLocked && \"cursor-default\")}\n style={{\n left: layer.x,\n top: layer.y,\n width: layer.width,\n height: layer.height,\n opacity: layer.opacity ?? 1,\n transform,\n cursor: staticMode ? \"default\" : cursor,\n }}\n >\n {Renderer ? (\n <Renderer\n layer={layer}\n ctx={{ selected, zoom: state.zoom, readOnly: readOnly || staticMode }}\n />\n ) : (\n <FallbackRenderer layer={layer} />\n )}\n </div>\n );\n}\n\nfunction FallbackRenderer({ layer }: { layer: Layer<unknown> }) {\n return (\n <div\n className=\"size-full flex items-center justify-center bg-white border border-dashed border-ground-300 caption text-ground-400\"\n title={`No renderer registered for type \"${layer.type}\"`}\n >\n {layer.type}\n </div>\n );\n}\n\nexport { LayerView };\nexport type { LayerViewProps };\n","import { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Renders blue selection rectangles around currently-selected layers.\n * Non-interactive — drag/resize handles can be added in a future iteration.\n */\nfunction LayerSelectionOverlay() {\n const { state } = useCanvasContext();\n const { selectedIds } = useShellContext();\n if (selectedIds.length === 0) return null;\n\n const ids = new Set(selectedIds);\n const selected = state.layers.filter((l) => ids.has(l.id));\n\n return (\n <>\n {selected.map((l) => (\n <div\n key={l.id}\n className=\"absolute pointer-events-none\"\n style={{\n left: l.x,\n top: l.y,\n width: l.width,\n height: l.height,\n transform: `rotate(${l.rotation ?? 0}deg)`,\n outline: `1.5px solid ${state.accentColor}`,\n outlineOffset: -1,\n }}\n aria-hidden\n />\n ))}\n </>\n );\n}\n\nexport { LayerSelectionOverlay };\n","import { useEffect, useState, type RefObject } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface MarqueeOverlayProps {\n /** Ref to the frame element this marquee is constrained to. */\n containerRef: RefObject<HTMLDivElement | null>;\n}\n\n/**\n * Click-and-drag marquee selection. Listens for pointerdown on the frame\n * background; on drag, paints a translucent rectangle and selects all\n * layers whose bounding box intersects it on pointerup.\n */\nfunction MarqueeOverlay({ containerRef }: MarqueeOverlayProps) {\n const { state } = useCanvasContext();\n const { setSelectedIds, readOnly } = useShellContext();\n const [box, setBox] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n\n useEffect(() => {\n const node = containerRef.current;\n if (!node || readOnly) return;\n\n let start: { x: number; y: number } | null = null;\n\n const onDown = (e: PointerEvent) => {\n // Only when user pressed directly on the frame background, not a layer.\n if (e.target !== node) return;\n if (e.button !== 0) return;\n const rect = node.getBoundingClientRect();\n // Coordinates in artboard-pixels (frame element is unscaled by zoom\n // because zoom is applied to a parent container).\n start = {\n x: ((e.clientX - rect.left) / rect.width) * state.frameSize.width,\n y: ((e.clientY - rect.top) / rect.height) * state.frameSize.height,\n };\n setBox({ x: start.x, y: start.y, w: 0, h: 0 });\n };\n\n const onMove = (e: PointerEvent) => {\n if (!start) return;\n const rect = node.getBoundingClientRect();\n const cx = ((e.clientX - rect.left) / rect.width) * state.frameSize.width;\n const cy = ((e.clientY - rect.top) / rect.height) * state.frameSize.height;\n setBox({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n w: Math.abs(cx - start.x),\n h: Math.abs(cy - start.y),\n });\n };\n\n const onUp = (e: PointerEvent) => {\n if (!start || !box) {\n start = null;\n setBox(null);\n return;\n }\n // Compute intersection.\n const x0 = box.x;\n const y0 = box.y;\n const x1 = box.x + box.w;\n const y1 = box.y + box.h;\n const intersects = state.layers.filter((l) => {\n const lx0 = l.x;\n const ly0 = l.y;\n const lx1 = l.x + l.width;\n const ly1 = l.y + l.height;\n return lx0 < x1 && lx1 > x0 && ly0 < y1 && ly1 > y0;\n });\n const ids = intersects.map((l) => l.id);\n if (e.shiftKey) {\n setSelectedIds((prev) => Array.from(new Set([...prev, ...ids])));\n } else {\n setSelectedIds(ids);\n }\n start = null;\n setBox(null);\n };\n\n node.addEventListener(\"pointerdown\", onDown);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n node.removeEventListener(\"pointerdown\", onDown);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [containerRef, readOnly, state.frameSize, state.layers, setSelectedIds, box]);\n\n if (!box || (box.w < 2 && box.h < 2)) return null;\n\n return (\n <div\n className=\"absolute pointer-events-none\"\n style={{\n left: box.x,\n top: box.y,\n width: box.w,\n height: box.h,\n background: \"color-mix(in srgb, var(--brand-primary) 10%, transparent)\",\n outline: \"1px solid var(--brand-primary)\",\n }}\n aria-hidden\n />\n );\n}\n\nexport { MarqueeOverlay };\nexport type { MarqueeOverlayProps };\n","import { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Visual grid overlay — renders a SVG pattern based on `state.gridContainer`.\n * Non-interactive; sits behind the layers but inside the artboard.\n */\nfunction GridOverlay() {\n const { state } = useCanvasContext();\n const { frameSize, gridContainer } = state;\n if (!gridContainer) return null;\n\n const { cols, rows, gap, padding } = gridContainer;\n const cellW = (frameSize.width - padding * 2 - gap * (cols - 1)) / cols;\n const cellH = (frameSize.height - padding * 2 - gap * (rows - 1)) / rows;\n\n const lines: { x: number; y: number; w: number; h: number }[] = [];\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n lines.push({\n x: padding + c * (cellW + gap),\n y: padding + r * (cellH + gap),\n w: cellW,\n h: cellH,\n });\n }\n }\n\n return (\n <svg\n className=\"absolute inset-0 pointer-events-none\"\n width={frameSize.width}\n height={frameSize.height}\n aria-hidden\n >\n {lines.map((cell, i) => (\n <rect\n key={i}\n x={cell.x}\n y={cell.y}\n width={cell.w}\n height={cell.h}\n fill=\"none\"\n stroke=\"var(--brand-primary)\"\n strokeOpacity={0.18}\n strokeDasharray=\"3 3\"\n strokeWidth={1}\n />\n ))}\n </svg>\n );\n}\n\nexport { GridOverlay };\n","import { useRef, type ReactNode } from \"react\";\nimport { cn } from \"@hilum/ui\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { LayerView } from \"./LayerView\";\nimport { LayerSelectionOverlay } from \"../overlays/LayerSelectionOverlay\";\nimport { MarqueeOverlay } from \"../overlays/MarqueeOverlay\";\nimport { GridOverlay } from \"../overlays/GridOverlay\";\n\ninterface DesignerFrameProps {\n className?: string;\n /** Hide the selection overlay (e.g. for a custom one). */\n hideSelectionOverlay?: boolean;\n /** Hide the marquee selection box. */\n hideMarquee?: boolean;\n /** Show the grid overlay. */\n showGrid?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Interactive layer container. Renders the artboard, all layers via the\n * RendererProvider, the marquee selection box, the selection handles, and\n * an optional grid.\n */\nfunction DesignerFrame({\n className,\n hideSelectionOverlay = false,\n hideMarquee = false,\n showGrid = false,\n children,\n}: DesignerFrameProps) {\n const { state } = useCanvasContext();\n const { setSelectedIds } = useShellContext();\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div\n ref={ref}\n onPointerDown={(e) => {\n // Click on the frame background = clear selection.\n if (e.target === ref.current) setSelectedIds([]);\n }}\n className={cn(\"relative shadow-elevated\", className)}\n style={{\n width: state.frameSize.width,\n height: state.frameSize.height,\n background: state.artboardColor,\n opacity: state.artboardOpacity,\n overflow: state.artboardClipContent ? \"hidden\" : \"visible\",\n }}\n data-frame\n >\n {showGrid && <GridOverlay />}\n {state.layers.map((l) => (\n <LayerView key={l.id} layer={l} />\n ))}\n {!hideSelectionOverlay && <LayerSelectionOverlay />}\n {!hideMarquee && <MarqueeOverlay containerRef={ref} />}\n {children}\n </div>\n );\n}\n\nexport { DesignerFrame };\nexport type { DesignerFrameProps };\n","import { cn } from \"@hilum/ui\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { LayerView } from \"./LayerView\";\n\ninterface DesignerStaticFrameProps {\n className?: string;\n /** Override frame size — used by thumbnails to render at a custom resolution. */\n width?: number;\n height?: number;\n}\n\n/**\n * Read-only render of the canvas — no interactivity, no overlays. Use for\n * dashboard thumbnails or print previews. The same renderers from\n * <RendererProvider> are used; their `ctx.readOnly` will be true.\n */\nfunction DesignerStaticFrame({ className, width, height }: DesignerStaticFrameProps) {\n const { state } = useCanvasContext();\n const w = width ?? state.frameSize.width;\n const h = height ?? state.frameSize.height;\n\n return (\n <div\n className={cn(\"relative\", className)}\n style={{\n width: w,\n height: h,\n background: state.artboardColor,\n opacity: state.artboardOpacity,\n overflow: state.artboardClipContent ? \"hidden\" : \"visible\",\n }}\n data-static-frame\n >\n {state.layers.map((l) => (\n <LayerView key={l.id} layer={l} staticMode />\n ))}\n </div>\n );\n}\n\nexport { DesignerStaticFrame };\nexport type { DesignerStaticFrameProps };\n","import { useMemo } from \"react\";\nimport { useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\nexport function useLayers<TData = Record<string, unknown>>(): Layer<TData>[] {\n return useCanvasContext<TData>().state.layers;\n}\n\nexport function useLayer<TData = Record<string, unknown>>(id: string): Layer<TData> | undefined {\n const layers = useLayers<TData>();\n return useMemo(() => layers.find((l) => l.id === id), [layers, id]);\n}\n\nexport function useSelectedLayerIds(): string[] {\n return useShellContext().selectedIds;\n}\n\nexport function useSelectedLayers<TData = Record<string, unknown>>(): Layer<TData>[] {\n const ids = useSelectedLayerIds();\n const layers = useLayers<TData>();\n return useMemo(() => layers.filter((l) => ids.includes(l.id)), [layers, ids]);\n}\n\nexport function useSelectedLayer<TData = Record<string, unknown>>(): Layer<TData> | undefined {\n const selected = useSelectedLayers<TData>();\n return selected[0];\n}\n\nexport function useIsLayerSelected(id: string): boolean {\n return useSelectedLayerIds().includes(id);\n}\n","import { useCallback } from \"react\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\ninterface UseZoomReturn {\n zoom: number;\n setZoom: (next: number) => void;\n zoomIn: () => void;\n zoomOut: () => void;\n resetZoom: () => void;\n /** Fit zoom to bring the artboard into view, given an outer container. */\n fitZoom: (container: { width: number; height: number }, padding?: number) => void;\n}\n\nconst ZOOM_STEPS = [0.05, 0.1, 0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24, 32];\n\nfunction nextStep(zoom: number, dir: \"in\" | \"out\"): number {\n if (dir === \"in\") {\n return ZOOM_STEPS.find((s) => s > zoom) ?? ZOOM_STEPS[ZOOM_STEPS.length - 1]!;\n }\n let prev = ZOOM_STEPS[0]!;\n for (const s of ZOOM_STEPS) {\n if (s >= zoom) break;\n prev = s;\n }\n return prev;\n}\n\nexport function useZoom(): UseZoomReturn {\n const { state, dispatch } = useCanvasContext();\n\n const setZoom = useCallback(\n (next: number) => dispatch({ type: \"SET_ZOOM\", payload: next }),\n [dispatch],\n );\n\n const zoomIn = useCallback(\n () => dispatch({ type: \"SET_ZOOM\", payload: nextStep(state.zoom, \"in\") }),\n [dispatch, state.zoom],\n );\n\n const zoomOut = useCallback(\n () => dispatch({ type: \"SET_ZOOM\", payload: nextStep(state.zoom, \"out\") }),\n [dispatch, state.zoom],\n );\n\n const resetZoom = useCallback(() => dispatch({ type: \"SET_ZOOM\", payload: 1 }), [dispatch]);\n\n const fitZoom = useCallback(\n ({ width, height }: { width: number; height: number }, padding = 64) => {\n const ratio = Math.min(\n (width - padding) / state.frameSize.width,\n (height - padding) / state.frameSize.height,\n );\n dispatch({ type: \"SET_ZOOM\", payload: Math.max(0.05, Math.min(32, ratio)) });\n dispatch({ type: \"SET_PAN\", payload: { x: 0, y: 0 } });\n },\n [dispatch, state.frameSize],\n );\n\n return { zoom: state.zoom, setZoom, zoomIn, zoomOut, resetZoom, fitZoom };\n}\n","import { useEffect, useRef } from \"react\";\nimport { useHistory } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\n/**\n * Wires `@hilum/designer`'s generic `useHistory<T>` to the canvas reducer.\n *\n * Apps don't usually use this directly — `<Designer>` mounts it. The pattern:\n * the reducer commits state on every dispatch; this hook syncs the layers\n * slice into the history stack when changes are user-initiated.\n *\n * For now, the canvas's reducer doesn't directly track history (history lives\n * in @hilum/designer's hook). Apps that want canvas-level undo/redo wire\n * `useHistory<Layer[]>(initialLayers)` and dispatch `SET_LAYERS` to apply\n * undo / redo results.\n */\nexport function useHistoryActions<TData = Record<string, unknown>>() {\n const { state, dispatch } = useCanvasContext<TData>();\n const initialRef = useRef(state.layers);\n const hist = useHistory<Layer<TData>[]>(initialRef.current);\n\n // When state.layers changes (user dispatched a mutation), push to history.\n // Skip the initial mount and any echo from undo/redo.\n const lastSeenRef = useRef(state.layers);\n useEffect(() => {\n if (state.layers === lastSeenRef.current) return;\n if (state.layers === hist.state) {\n // We just reflected an undo/redo result; don't re-push.\n lastSeenRef.current = state.layers;\n return;\n }\n hist.setState(state.layers);\n lastSeenRef.current = state.layers;\n }, [state.layers, hist]);\n\n const undo = () => {\n hist.undo();\n // Apply the new history.state to the reducer on the next tick.\n queueMicrotask(() => dispatch({ type: \"SET_LAYERS\", payload: hist.state }));\n };\n\n const redo = () => {\n hist.redo();\n queueMicrotask(() => dispatch({ type: \"SET_LAYERS\", payload: hist.state }));\n };\n\n return { undo, redo, canUndo: hist.canUndo, canRedo: hist.canRedo };\n}\n","import { Plus } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport type { Layer } from \"../types\";\n\nfunction generateId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) return crypto.randomUUID();\n return `layer-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Renders one toolbar button per registered layer type. Apps that want a\n * single + dropdown can build their own using <DropdownMenu> and the same\n * dispatch call.\n */\nfunction ActionAddLayer() {\n const { state, dispatch } = useCanvasContext();\n const { setSelectedIds } = useShellContext();\n\n if (state.layerTypes.length === 0) {\n return <DesignerToolbarButton label=\"Add layer\" icon={Plus} disabled />;\n }\n\n return (\n <DesignerToolbarGroup>\n {state.layerTypes.map((descriptor) => {\n const Icon = descriptor.icon ?? Plus;\n return (\n <DesignerToolbarButton\n key={descriptor.type}\n label={`Add ${descriptor.label}`}\n icon={Icon}\n onClick={() => {\n const id = generateId();\n const size = descriptor.defaultSize ?? { width: 200, height: 100 };\n const layer: Layer<Record<string, unknown>> = {\n id,\n type: descriptor.type,\n name: descriptor.label,\n x: state.frameSize.width / 2 - size.width / 2,\n y: state.frameSize.height / 2 - size.height / 2,\n width: size.width,\n height: size.height,\n rotation: 0,\n opacity: 1,\n isLocked: false,\n isVisible: true,\n data: descriptor.defaultData as Record<string, unknown>,\n };\n dispatch({ type: \"ADD_LAYER\", payload: layer });\n setSelectedIds([id]);\n }}\n />\n );\n })}\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionAddLayer };\n","import {\n AlignCenter,\n AlignLeft,\n AlignRight,\n AlignVerticalSpaceAround,\n AlignHorizontalSpaceAround,\n AlignStartHorizontal,\n AlignEndHorizontal,\n AlignVerticalJustifyCenter,\n} from \"lucide-react\";\nimport {\n DesignerToolbarButton,\n DesignerToolbarGroup,\n DesignerToolbarSeparator,\n useShellContext,\n} from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/**\n * Alignment + distribution toolbar group. Operates on currently-selected\n * layers via ShellContext.selectedIds (passed explicitly to the reducer).\n */\nfunction ActionAlign() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length < 2;\n\n const align = (a: \"left\" | \"center\" | \"right\" | \"top\" | \"middle\" | \"bottom\") => () =>\n dispatch({ type: \"ALIGN_LAYERS\", payload: { targetLayerIds: selectedIds, align: a } });\n\n const distribute = (axis: \"horizontal\" | \"vertical\") => () =>\n dispatch({ type: \"DISTRIBUTE_LAYERS\", payload: { targetLayerIds: selectedIds, axis } });\n\n return (\n <>\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Align left\"\n icon={AlignLeft}\n onClick={align(\"left\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align center\"\n icon={AlignCenter}\n onClick={align(\"center\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align right\"\n icon={AlignRight}\n onClick={align(\"right\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n <DesignerToolbarSeparator />\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Align top\"\n icon={AlignStartHorizontal}\n onClick={align(\"top\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align middle\"\n icon={AlignVerticalJustifyCenter}\n onClick={align(\"middle\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Align bottom\"\n icon={AlignEndHorizontal}\n onClick={align(\"bottom\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n <DesignerToolbarSeparator />\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Distribute horizontally\"\n icon={AlignHorizontalSpaceAround}\n onClick={distribute(\"horizontal\")}\n disabled={selectedIds.length < 3}\n />\n <DesignerToolbarButton\n label=\"Distribute vertically\"\n icon={AlignVerticalSpaceAround}\n onClick={distribute(\"vertical\")}\n disabled={selectedIds.length < 3}\n />\n </DesignerToolbarGroup>\n </>\n );\n}\n\nexport { ActionAlign };\n","import { ArrowUp, ArrowDown, ChevronsUp, ChevronsDown } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\n/** Bring to front / back / forward / backward. */\nfunction ActionArrange() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length === 0;\n\n const arrange = (mode: \"front\" | \"back\" | \"forward\" | \"backward\") => () =>\n dispatch({ type: \"ARRANGE_LAYERS\", payload: { targetLayerIds: selectedIds, mode } });\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Bring to front\"\n icon={ChevronsUp}\n onClick={arrange(\"front\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Bring forward\"\n icon={ArrowUp}\n onClick={arrange(\"forward\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Send backward\"\n icon={ArrowDown}\n onClick={arrange(\"backward\")}\n disabled={disabled}\n />\n <DesignerToolbarButton\n label=\"Send to back\"\n icon={ChevronsDown}\n onClick={arrange(\"back\")}\n disabled={disabled}\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionArrange };\n","import { Trash2 } from \"lucide-react\";\nimport { DesignerToolbarButton, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionDelete() {\n const { dispatch } = useCanvasContext();\n const { selectedIds, setSelectedIds } = useShellContext();\n\n return (\n <DesignerToolbarButton\n label=\"Delete\"\n icon={Trash2}\n shortcut=\"Del\"\n disabled={selectedIds.length === 0}\n onClick={() => {\n dispatch({ type: \"DELETE_LAYERS\", payload: selectedIds });\n setSelectedIds([]);\n }}\n />\n );\n}\n\nexport { ActionDelete };\n","import { Copy } from \"lucide-react\";\nimport { DesignerToolbarButton, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionDuplicate() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n\n return (\n <DesignerToolbarButton\n label=\"Duplicate\"\n icon={Copy}\n shortcut=\"⌘D\"\n disabled={selectedIds.length === 0}\n onClick={() => {\n dispatch({ type: \"COPY_LAYERS\", payload: { targetLayerIds: selectedIds } });\n dispatch({ type: \"PASTE_LAYERS\" });\n }}\n />\n );\n}\n\nexport { ActionDuplicate };\n","import { Group, Ungroup } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionGroup() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Group\"\n icon={Group}\n shortcut=\"⌘G\"\n disabled={selectedIds.length < 2}\n onClick={() => {\n const groupId =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `group-${Date.now()}`;\n dispatch({ type: \"GROUP_LAYERS\", payload: { targetLayerIds: selectedIds, groupId } });\n }}\n />\n <DesignerToolbarButton\n label=\"Ungroup\"\n icon={Ungroup}\n shortcut=\"⇧⌘G\"\n disabled={selectedIds.length === 0}\n onClick={() =>\n dispatch({ type: \"UNGROUP_LAYERS\", payload: { targetLayerIds: selectedIds } })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionGroup };\n","import { Lock, Unlock, Eye, EyeOff } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\nimport { useSelectedLayers } from \"../hooks/useLayers\";\n\nfunction ActionLock() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const selected = useSelectedLayers();\n const disabled = selectedIds.length === 0;\n\n const allLocked = selected.length > 0 && selected.every((l) => l.isLocked);\n const allHidden = selected.length > 0 && selected.every((l) => l.isVisible === false);\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label={allLocked ? \"Unlock\" : \"Lock\"}\n icon={allLocked ? Unlock : Lock}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"SET_LAYER_PROPERTY\",\n payload: { targetLayerIds: selectedIds, key: \"isLocked\", value: !allLocked },\n })\n }\n />\n <DesignerToolbarButton\n label={allHidden ? \"Show\" : \"Hide\"}\n icon={allHidden ? EyeOff : Eye}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"SET_LAYER_PROPERTY\",\n payload: { targetLayerIds: selectedIds, key: \"isVisible\", value: allHidden },\n })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionLock };\n","import type { ComponentType } from \"react\";\nimport { MousePointer2, Hand } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\n\ninterface ToolDescriptor {\n id: string;\n label: string;\n icon: ComponentType<{ size?: number; className?: string }>;\n shortcut?: string;\n}\n\nconst DEFAULT_TOOLS: ToolDescriptor[] = [\n { id: \"select\", label: \"Select\", icon: MousePointer2, shortcut: \"V\" },\n { id: \"hand\", label: \"Pan\", icon: Hand, shortcut: \"H\" },\n];\n\ninterface ActionToolProps {\n /** Override default tools. */\n tools?: ToolDescriptor[];\n}\n\nfunction ActionTool({ tools = DEFAULT_TOOLS }: ActionToolProps) {\n const { activeTool, setActiveTool } = useShellContext();\n\n return (\n <DesignerToolbarGroup>\n {tools.map((tool) => (\n <DesignerToolbarButton\n key={tool.id}\n label={tool.label}\n icon={tool.icon}\n {...(tool.shortcut !== undefined && { shortcut: tool.shortcut })}\n active={activeTool === tool.id}\n onClick={() => setActiveTool(tool.id)}\n />\n ))}\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionTool };\nexport type { ActionToolProps, ToolDescriptor };\n","import { FlipHorizontal, FlipVertical } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup, useShellContext } from \"@hilum/designer\";\nimport { useCanvasContext } from \"../context/CanvasContext\";\n\nfunction ActionTransform() {\n const { dispatch } = useCanvasContext();\n const { selectedIds } = useShellContext();\n const disabled = selectedIds.length === 0;\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Flip horizontal\"\n icon={FlipHorizontal}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"TRANSFORM_LAYERS\",\n payload: { targetLayerIds: selectedIds, mode: \"flip-h\" },\n })\n }\n />\n <DesignerToolbarButton\n label=\"Flip vertical\"\n icon={FlipVertical}\n disabled={disabled}\n onClick={() =>\n dispatch({\n type: \"TRANSFORM_LAYERS\",\n payload: { targetLayerIds: selectedIds, mode: \"flip-v\" },\n })\n }\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionTransform };\n","import { Undo2, Redo2 } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup } from \"@hilum/designer\";\nimport { useHistoryActions } from \"../hooks/useHistoryActions\";\n\nfunction ActionUndoRedo() {\n const { undo, redo, canUndo, canRedo } = useHistoryActions();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton\n label=\"Undo\"\n icon={Undo2}\n shortcut=\"⌘Z\"\n onClick={undo}\n disabled={!canUndo}\n />\n <DesignerToolbarButton\n label=\"Redo\"\n icon={Redo2}\n shortcut=\"⇧⌘Z\"\n onClick={redo}\n disabled={!canRedo}\n />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionUndoRedo };\n","import { Plus, Minus, Maximize2 } from \"lucide-react\";\nimport { DesignerToolbarButton, DesignerToolbarGroup } from \"@hilum/designer\";\nimport { useZoom } from \"../hooks/useZoom\";\n\nfunction ActionZoom() {\n const { zoom, zoomIn, zoomOut, resetZoom } = useZoom();\n\n return (\n <DesignerToolbarGroup>\n <DesignerToolbarButton label=\"Zoom out\" icon={Minus} shortcut=\"⌘-\" onClick={zoomOut} />\n <DesignerToolbarButton label=\"Reset zoom\" icon={Maximize2} shortcut=\"⌘0\" onClick={resetZoom}>\n <span className=\"caption-xs ml-1 tabular-nums\">{Math.round(zoom * 100)}%</span>\n </DesignerToolbarButton>\n <DesignerToolbarButton label=\"Zoom in\" icon={Plus} shortcut=\"⌘=\" onClick={zoomIn} />\n </DesignerToolbarGroup>\n );\n}\n\nexport { ActionZoom };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hilum/designer-canvas",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.10.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Generic free-positioned canvas engine — Layer model, pan/zoom, drag/resize, snap guides, marquee, 49 generic actions, pluggable renderers and services",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,11 +13,13 @@
|
|
|
13
13
|
"access": "public"
|
|
14
14
|
},
|
|
15
15
|
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
16
17
|
"exports": {
|
|
17
18
|
".": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
}
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./package.json": "./package.json"
|
|
21
23
|
},
|
|
22
24
|
"files": [
|
|
23
25
|
"dist",
|
|
@@ -32,11 +34,6 @@
|
|
|
32
34
|
"react": "^19.0.0",
|
|
33
35
|
"react-dom": "^19.0.0"
|
|
34
36
|
},
|
|
35
|
-
"peerDependenciesMeta": {
|
|
36
|
-
"lucide-react": {
|
|
37
|
-
"optional": true
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
37
|
"dependencies": {},
|
|
41
38
|
"devDependencies": {
|
|
42
39
|
"@types/react": "^19.0.0",
|
|
@@ -45,8 +42,8 @@
|
|
|
45
42
|
"tailwindcss": "^4.2.0",
|
|
46
43
|
"tsup": "^8.3.0",
|
|
47
44
|
"typescript": "^5.7.0",
|
|
48
|
-
"@hilum/designer": "3.
|
|
49
|
-
"@hilum/ui": "3.
|
|
45
|
+
"@hilum/designer": "3.10.0",
|
|
46
|
+
"@hilum/ui": "3.10.0"
|
|
50
47
|
},
|
|
51
48
|
"scripts": {
|
|
52
49
|
"build": "tsup",
|