@hilum/designer-canvas 0.1.2 → 0.1.4
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.d.ts +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
package/dist/index.d.ts
CHANGED
|
@@ -201,7 +201,7 @@ interface CanvasState<TData = Record<string, unknown>> {
|
|
|
201
201
|
/** Whether content is clipped to the frame bounds. */
|
|
202
202
|
artboardClipContent: boolean;
|
|
203
203
|
/** Optional grid layout mode. When set, layers can use `gridItem`. */
|
|
204
|
-
gridContainer?: GridContainer;
|
|
204
|
+
gridContainer?: GridContainer | undefined;
|
|
205
205
|
/** Clipboard: layers that have been copied / cut. */
|
|
206
206
|
copiedLayers: Layer<TData>[] | null;
|
|
207
207
|
/** Theme — chrome reads from here, components reference Hilum semantic vars. */
|
package/dist/index.js
CHANGED
|
@@ -15,7 +15,6 @@ function createInitialState(partial = {}) {
|
|
|
15
15
|
artboardColor: "#ffffff",
|
|
16
16
|
artboardOpacity: 1,
|
|
17
17
|
artboardClipContent: true,
|
|
18
|
-
gridContainer: void 0,
|
|
19
18
|
copiedLayers: null,
|
|
20
19
|
uiColor: "light",
|
|
21
20
|
canvasColor: "light",
|
|
@@ -376,10 +375,10 @@ function Designer({
|
|
|
376
375
|
return /* @__PURE__ */ jsx(
|
|
377
376
|
CanvasProvider,
|
|
378
377
|
{
|
|
379
|
-
initial,
|
|
378
|
+
...initial !== void 0 && { initial },
|
|
380
379
|
services,
|
|
381
|
-
readOnly,
|
|
382
|
-
onChange,
|
|
380
|
+
...readOnly !== void 0 && { readOnly },
|
|
381
|
+
...onChange !== void 0 && { onChange },
|
|
383
382
|
children: /* @__PURE__ */ jsx(RendererProvider, { renderers, children })
|
|
384
383
|
}
|
|
385
384
|
);
|
|
@@ -411,7 +410,7 @@ function DesignerCanvas({ className, children }) {
|
|
|
411
410
|
"div",
|
|
412
411
|
{
|
|
413
412
|
ref,
|
|
414
|
-
className: cn("relative flex-1 overflow-hidden bg-
|
|
413
|
+
className: cn("relative flex-1 overflow-hidden bg-ground-100 select-none", className),
|
|
415
414
|
"data-canvas-root": true,
|
|
416
415
|
children: /* @__PURE__ */ jsx(
|
|
417
416
|
"div",
|
|
@@ -530,7 +529,7 @@ function FallbackRenderer({ layer }) {
|
|
|
530
529
|
return /* @__PURE__ */ jsx(
|
|
531
530
|
"div",
|
|
532
531
|
{
|
|
533
|
-
className: "size-full flex items-center justify-center bg-white border border-dashed border-
|
|
532
|
+
className: "size-full flex items-center justify-center bg-white border border-dashed border-ground-300 caption text-ground-400",
|
|
534
533
|
title: `No renderer registered for type "${layer.type}"`,
|
|
535
534
|
children: layer.type
|
|
536
535
|
}
|
|
@@ -1110,7 +1109,7 @@ function ActionTool({ tools = DEFAULT_TOOLS }) {
|
|
|
1110
1109
|
{
|
|
1111
1110
|
label: tool.label,
|
|
1112
1111
|
icon: tool.icon,
|
|
1113
|
-
shortcut: tool.shortcut,
|
|
1112
|
+
...tool.shortcut !== void 0 && { shortcut: tool.shortcut },
|
|
1114
1113
|
active: activeTool === tool.id,
|
|
1115
1114
|
onClick: () => setActiveTool(tool.id)
|
|
1116
1115
|
},
|
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;\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 gridContainer: undefined,\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={initial}\n services={services}\n readOnly={readOnly}\n onChange={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-taupe-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-taupe-300 caption text-taupe-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 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, 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hilum/designer-canvas",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
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",
|
|
@@ -26,22 +26,26 @@
|
|
|
26
26
|
],
|
|
27
27
|
"//": "Tests for this package live in src/**/*.test.ts and run from the root via `pnpm test`.",
|
|
28
28
|
"peerDependencies": {
|
|
29
|
+
"lucide-react": "^0.511.0",
|
|
29
30
|
"react": "^19.0.0",
|
|
30
31
|
"react-dom": "^19.0.0",
|
|
31
|
-
"@hilum/designer": "0.1.
|
|
32
|
-
"@hilum/ui": "0.1.
|
|
32
|
+
"@hilum/designer": "0.1.4",
|
|
33
|
+
"@hilum/ui": "0.1.4"
|
|
33
34
|
},
|
|
34
|
-
"
|
|
35
|
-
"lucide-react":
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"lucide-react": {
|
|
37
|
+
"optional": true
|
|
38
|
+
}
|
|
36
39
|
},
|
|
40
|
+
"dependencies": {},
|
|
37
41
|
"devDependencies": {
|
|
38
42
|
"@types/react": "^19.0.0",
|
|
39
43
|
"@types/react-dom": "^19.0.0",
|
|
40
44
|
"tailwindcss": "^4.2.0",
|
|
41
45
|
"tsup": "^8.3.0",
|
|
42
46
|
"typescript": "^5.7.0",
|
|
43
|
-
"@hilum/designer": "0.1.
|
|
44
|
-
"@hilum/ui": "0.1.
|
|
47
|
+
"@hilum/designer": "0.1.4",
|
|
48
|
+
"@hilum/ui": "0.1.4"
|
|
45
49
|
},
|
|
46
50
|
"scripts": {
|
|
47
51
|
"build": "tsup",
|