@xom11/whiteboard 0.27.0 → 0.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai.d.mts +236 -295
- package/dist/ai.d.ts +236 -295
- package/dist/ai.js +6015 -7577
- package/dist/ai.js.map +1 -1
- package/dist/ai.mjs +4804 -5426
- package/dist/ai.mjs.map +1 -1
- package/dist/catalog.json +4 -4
- package/dist/{chunk-D5JLJ3PT.mjs → chunk-5JM35CXV.mjs} +4 -4
- package/dist/{chunk-D5JLJ3PT.mjs.map → chunk-5JM35CXV.mjs.map} +1 -1
- package/dist/{chunk-KYMBUTPO.mjs → chunk-BU5KLO3P.mjs} +3 -3
- package/dist/{chunk-KYMBUTPO.mjs.map → chunk-BU5KLO3P.mjs.map} +1 -1
- package/dist/{chunk-AJAHD35N.mjs → chunk-E6EDOPGT.mjs} +3 -105
- package/dist/chunk-E6EDOPGT.mjs.map +1 -0
- package/dist/{chunk-KZGPSTZI.mjs → chunk-GEC2D2EQ.mjs} +4 -4
- package/dist/{chunk-KZGPSTZI.mjs.map → chunk-GEC2D2EQ.mjs.map} +1 -1
- package/dist/{chunk-AYJPOHCI.mjs → chunk-H22OZYTW.mjs} +3 -3
- package/dist/{chunk-AYJPOHCI.mjs.map → chunk-H22OZYTW.mjs.map} +1 -1
- package/dist/{chunk-I3L56GVH.mjs → chunk-OQIQNKPQ.mjs} +3 -3
- package/dist/{chunk-I3L56GVH.mjs.map → chunk-OQIQNKPQ.mjs.map} +1 -1
- package/dist/{chunk-4ETJ4CDY.mjs → chunk-QRUAEXLR.mjs} +4 -4
- package/dist/{chunk-4ETJ4CDY.mjs.map → chunk-QRUAEXLR.mjs.map} +1 -1
- package/dist/{chunk-HLAOGXEK.mjs → chunk-V3YJ6JFL.mjs} +3 -3
- package/dist/{chunk-HLAOGXEK.mjs.map → chunk-V3YJ6JFL.mjs.map} +1 -1
- package/dist/{chunk-D5LWSN2Y.mjs → chunk-ZTQBUKLJ.mjs} +30 -13
- package/dist/chunk-ZTQBUKLJ.mjs.map +1 -0
- package/dist/geometry-2d.d.mts +1 -2
- package/dist/geometry-2d.d.ts +1 -2
- package/dist/geometry-2d.js +961 -3586
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +3 -3
- package/dist/geometry-3d.d.mts +1 -2
- package/dist/geometry-3d.d.ts +1 -2
- package/dist/geometry-3d.js +28 -11
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +3 -3
- package/dist/graph-2d.d.mts +1 -2
- package/dist/graph-2d.d.ts +1 -2
- package/dist/graph-2d.js +28 -11
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +3 -3
- package/dist/{host-M26FS244.mjs → host-2ISGVO7O.mjs} +5 -5
- package/dist/{host-M26FS244.mjs.map → host-2ISGVO7O.mjs.map} +1 -1
- package/dist/{host-HAYCJJ2T.mjs → host-HKMZSCIT.mjs} +142 -318
- package/dist/host-HKMZSCIT.mjs.map +1 -0
- package/dist/{host-LTJHAY5A.mjs → host-HOSJHQ5H.mjs} +6 -6
- package/dist/{host-LTJHAY5A.mjs.map → host-HOSJHQ5H.mjs.map} +1 -1
- package/dist/index.d.mts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +913 -3540
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -16
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +1 -2
- package/dist/latex.d.ts +1 -2
- package/dist/serialize-N4G6RFBB.mjs +9 -0
- package/dist/{serialize-C3LSUMSA.mjs.map → serialize-N4G6RFBB.mjs.map} +1 -1
- package/dist/{types-zc_Pa0mp.d.ts → types-C3FjpoUi.d.mts} +22 -229
- package/dist/{types-zc_Pa0mp.d.mts → types-C3FjpoUi.d.ts} +22 -229
- package/package.json +1 -9
- package/dist/chunk-AJAHD35N.mjs.map +0 -1
- package/dist/chunk-D5LWSN2Y.mjs.map +0 -1
- package/dist/chunk-T3SOHYB2.mjs +0 -851
- package/dist/chunk-T3SOHYB2.mjs.map +0 -1
- package/dist/handleExtractProblem-C-U5KluK.d.mts +0 -158
- package/dist/handleExtractProblem-C-U5KluK.d.ts +0 -158
- package/dist/host-HAYCJJ2T.mjs.map +0 -1
- package/dist/serialize-C3LSUMSA.mjs +0 -9
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { isGraph2DCustomData } from './chunk-O4WIZFRQ.mjs';
|
|
3
3
|
import { paletteFor } from './chunk-BNBOIDO5.mjs';
|
|
4
|
-
import { parseSceneState } from './chunk-
|
|
4
|
+
import { parseSceneState } from './chunk-V3YJ6JFL.mjs';
|
|
5
5
|
import { useToolStateMachine } from './chunk-NVJ7K3DK.mjs';
|
|
6
|
-
import { initJxgBoard, attachJxgWheelZoom, ToastHost, STAMP_PANEL_DESKTOP, ToastProvider, useStampStore, StampLeftPanel, safeJsx } from './chunk-
|
|
6
|
+
import { initJxgBoard, attachJxgWheelZoom, ToastHost, STAMP_PANEL_DESKTOP, ToastProvider, useStampStore, StampLeftPanel, safeJsx } from './chunk-OQIQNKPQ.mjs';
|
|
7
7
|
import { JxgRenderer } from './chunk-SZDAS7LK.mjs';
|
|
8
|
-
import { useEditorState, nextLabel } from './chunk-
|
|
8
|
+
import { useEditorState, nextLabel } from './chunk-ZTQBUKLJ.mjs';
|
|
9
9
|
import { compile } from './chunk-IHUFOV7L.mjs';
|
|
10
10
|
import './chunk-73Q7ADVL.mjs';
|
|
11
11
|
import './chunk-B4NJJZFR.mjs';
|
|
@@ -519,7 +519,7 @@ var GraphEditorPanelInner = forwardRef(
|
|
|
519
519
|
void (async () => {
|
|
520
520
|
try {
|
|
521
521
|
const { renderGraphSvgFromState } = await import('./render-ZX2O2IK7.mjs');
|
|
522
|
-
const { stringifySceneState } = await import('./serialize-
|
|
522
|
+
const { stringifySceneState } = await import('./serialize-N4G6RFBB.mjs');
|
|
523
523
|
const jsonState = stringifySceneState(state);
|
|
524
524
|
const svgString = await renderGraphSvgFromState(state, !!isDark);
|
|
525
525
|
onInsert(jsonState, svgString);
|
|
@@ -1141,5 +1141,5 @@ var Graph2DStampHost = forwardRef(
|
|
|
1141
1141
|
);
|
|
1142
1142
|
|
|
1143
1143
|
export { Graph2DStampHost };
|
|
1144
|
-
//# sourceMappingURL=host-
|
|
1145
|
-
//# sourceMappingURL=host-
|
|
1144
|
+
//# sourceMappingURL=host-HOSJHQ5H.mjs.map
|
|
1145
|
+
//# sourceMappingURL=host-HOSJHQ5H.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/editor/tools.tsx","../src/stamps/graph-2d/editor/rows/FunctionRow.tsx","../src/stamps/graph-2d/editor/rows/ParameterRow.tsx","../src/stamps/graph-2d/host.tsx"],"names":["id","MiniBoard","useRef","useEffect","useImperativeHandle","jsx","GraphEditorPanel","jsxs","Fragment","useState","forwardRef","Graph2DStampHost","useCallback"],"mappings":"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","file":"host-LTJHAY5A.mjs","sourcesContent":["// src/stamps/graph-2d/editor/handlers.ts\nimport type { Store } from '../../../core/scene/store';\nimport type { GraphTool } from './tools';\n\nexport interface HandlerCtx {\n store: Store;\n toolRef: { current: GraphTool };\n pendingIdsRef: { current: string[] };\n pushPending: (id: string) => void;\n clearPending: () => void;\n setTool: (t: GraphTool) => void;\n nextLabel: (kind: string) => string;\n /** Lookup nearest function2d id within vertical hit tolerance. */\n getNearestFunctionId: (coord: { x: number; y: number }) => string | null;\n /** Lookup any object at coord via JSXGraph hasPoint (pointOnCurve, point, etc.). */\n getHitObjectId: (coord: { x: number; y: number }) => string | null;\n}\n\nexport interface Coord { x: number; y: number; }\n\nexport function handleDown(ctx: HandlerCtx, coord: Coord): void {\n const tool = ctx.toolRef.current;\n switch (tool) {\n case 'move':\n return;\n case 'point':\n addFreePoint(ctx, coord);\n return;\n case 'slider':\n // Opens dialog separately — handled in EditorPanel. Reset tool.\n ctx.setTool('move');\n return;\n case 'pointOnCurve':\n addPointOnCurve(ctx, coord);\n return;\n case 'intersect':\n handleIntersect(ctx, coord);\n return;\n case 'tangent':\n handleTangent(ctx, coord);\n return;\n case 'slope':\n handleSlope(ctx, coord);\n return;\n case 'extremum':\n case 'root':\n handleAnalysisTool(ctx, coord, tool);\n return;\n case 'segment':\n case 'line':\n handleTwoPointTool(ctx, coord, tool);\n return;\n case 'polygon':\n handlePolygonTool(ctx, coord);\n return;\n }\n}\n\nfunction addFreePoint(ctx: HandlerCtx, coord: Coord): void {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction addPointOnCurve(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n const id = ctx.nextLabel('pointOnCurve');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'pointOnCurve', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, x: coord.x },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleIntersect(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(fid);\n return;\n }\n const fa = ctx.pendingIdsRef.current[0];\n if (fa === fid) return;\n const id = ctx.nextLabel('intersection');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'intersection', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n // NOTE: 'lineLine' is semantically imprecise for function2d curves but\n // works as a discriminant tag — TODO refactor to 'curveCurve' kind in\n // a follow-up when intersection kind is extended.\n attrs: { kind: 'lineLine', ref1: fa, ref2: fid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handleTangent(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('tangent2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'tangent2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleSlope(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('slope2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'slope2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleAnalysisTool(ctx: HandlerCtx, coord: Coord, tool: 'extremum' | 'root'): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n // MVP: use default domain [-10, 10]. UI can override via properties post-creation.\n if (tool === 'extremum') {\n const id = ctx.nextLabel('extremum2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'extremum2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 }, mode: 'min' },\n },\n },\n });\n } else {\n const id = ctx.nextLabel('root2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'root2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 } },\n },\n },\n });\n }\n ctx.setTool('move');\n}\n\nfunction handleTwoPointTool(ctx: HandlerCtx, coord: Coord, tool: 'segment' | 'line'): void {\n const hitId = ctx.getHitObjectId(coord);\n const pid = hitId ?? (() => {\n // Auto-add free point at click location\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(pid);\n return;\n }\n const p1 = ctx.pendingIdsRef.current[0];\n if (p1 === pid) return;\n const id = ctx.nextLabel(tool);\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: tool, label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { p1, p2: pid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handlePolygonTool(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n // Close polygon if clicking first pending point and have ≥3 vertices\n if (hitId && ctx.pendingIdsRef.current[0] === hitId && ctx.pendingIdsRef.current.length >= 3) {\n const id = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'polygon', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { points: [...ctx.pendingIdsRef.current] },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n return;\n }\n // Otherwise add new point + push to pending\n const pid = hitId ?? (() => {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n ctx.pushPending(pid);\n}\n","'use client';\n// src/stamps/graph-2d/editor/MiniBoard.tsx\n//\n// JSXGraph mini-board cho graph-2d editor.\n// Reuses the pattern from geometry-2d/editor/MiniBoard.tsx adapted for graph2d domain:\n// - createEmptyState('graph2d') instead of '2d'\n// - Init view from state.meta.view (default [-10, 10])\n// - getNearestFunctionId / findHitObject helpers for graph-specific hit-test\n// - Tools from TOOLS / GraphTool\n\nimport React, { useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type State,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport type { Store } from '../../../core/scene/store';\nimport { paletteFor } from './theme';\nimport { handleDown, type HandlerCtx } from './handlers';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GraphTool } from './tools';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n \ntype JxgObj = any;\n\n/**\n * Imperative handle exposed bởi MiniBoard. Sau Tier 2 F: tool / showAxis /\n * showGrid / undo-redo do host owns; handle chỉ giữ state read + highlight +\n * bbox.\n */\nexport interface MiniBoardHandle {\n getState: () => State;\n getStore: () => Store;\n highlight: (id: string | null) => void;\n getContainer: () => HTMLDivElement | null;\n getBbox: () => [number, number, number, number];\n}\n\ninterface MiniBoardProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n onReady?: () => void;\n onSelectionChange?: (id: string | undefined) => void;\n}\n\nexport const MiniBoard = React.forwardRef<MiniBoardHandle, MiniBoardProps>(\n function MiniBoard(\n { store, selectedTool, showAxis, showGrid, isDark, onReady, onSelectionChange: _onSelectionChange },\n ref,\n ) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_graph_jxg';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const rendererRef = useRef<JxgRenderer | null>(null);\n\n const toolSM = useToolStateMachine<GraphTool>(selectedTool);\n\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Tier 2 F — sync `selectedTool` prop → internal toolSM.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) toolSM.setTool(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init ────────────────────────────────────────────────────────────\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.graph',\n boardOptions: {\n boundingbox: [-10, 10, 10, -10],\n axis: showAxisRef.current,\n grid: showGridRef.current,\n showCopyright: false,\n showNavigation: true,\n keepAspectRatio: false,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n const theme = paletteFor(isDarkRef.current);\n rendererRef.current = new JxgRenderer(store, board, { theme });\n\n // Ctrl/Cmd + wheel zoom\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.graph');\n }\n\n // Pointer-down handler — only active when tool != move\n const onDown = (evt: JxgObj) => {\n const b = boardRef.current;\n if (!b || toolSM.toolRef.current === 'move') return;\n\n // Convert JSXGraph event → user-space coords.\n // Pattern from geometry-3d MiniBoard3D: use getUsrCoordsOfMouse if available,\n // fall back to manual calculation via board.origin + unitX/unitY.\n let ux = 0, uy = 0;\n safeJsx('MiniBoard.graph.pointerCoords', () => {\n \n const usr = (b as any).getUsrCoordsOfMouse?.(evt);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n ux = usr[0] as number; uy = usr[1] as number;\n } else if (b.origin?.scrCoords && containerRef.current) {\n // Fallback: manual pixel → user-space\n const rect = containerRef.current.getBoundingClientRect();\n const px = (evt.clientX ?? 0) - rect.left;\n const py = (evt.clientY ?? 0) - rect.top;\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const bUnitX = b.unitX || 1;\n const bUnitY = b.unitY || 1;\n ux = (px - ox) / bUnitX;\n uy = (oy - py) / bUnitY;\n }\n });\n\n const ctx: HandlerCtx = {\n store,\n toolRef: toolSM.toolRef,\n pendingIdsRef: toolSM.pendingIdsRef,\n pushPending: toolSM.pushPending,\n clearPending: toolSM.clearPending,\n setTool: toolSM.setTool,\n nextLabel: (kind) => sceneNextLabel(store.getState(), kind),\n getNearestFunctionId: ({ x, y }) =>\n findNearestFunction(b, store, rendererRef.current, x, y),\n getHitObjectId: ({ x, y }) =>\n findHitObject(b, rendererRef.current, x, y),\n };\n safeJsx('MiniBoard.graph.handleDown', () =>\n handleDown(ctx, { x: ux, y: uy }),\n );\n };\n\n board.on('down', onDown);\n onReady?.();\n })();\n\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n rendererRef.current?.dispose();\n rendererRef.current = null;\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n useImperativeHandle(\n ref,\n () => ({\n getState: () => store.getState(),\n getStore: () => store,\n highlight: (id) => rendererRef.current?.highlight(id),\n getContainer: () => containerRef.current,\n getBbox: () => boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n }),\n [store],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"graph-miniboard\"\n className=\"h-full w-full\"\n style={{ touchAction: 'none' }}\n />\n );\n },\n);\n\n// ─── Hit-test helpers ──────────────────────────────────────────────────────────\n\n/**\n * Find the id of the nearest function2d object within vertical tolerance `tolY`\n * (in world/user-space units — default 0.5 units; may need tuning for zoom levels).\n *\n * Iterates over function2d objects in state.order and evaluates el.Y(x) on the\n * JSXGraph functiongraph element via JxgRenderer.getElement(id).\n */\nfunction findNearestFunction(\n _board: JxgObj,\n store: Store,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n tolY = 0.5,\n): string | null {\n if (!renderer) return null;\n const state = store.getState();\n let bestId: string | null = null;\n let bestDist = Infinity;\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind !== 'function2d') continue;\n const el = renderer.getElement(id) as { Y?: (x: number) => number } | null;\n if (!el || typeof el.Y !== 'function') continue;\n let fy: number;\n try {\n fy = el.Y(x);\n } catch {\n continue;\n }\n if (!Number.isFinite(fy)) continue;\n const d = Math.abs(y - fy);\n if (d < tolY && d < bestDist) {\n bestDist = d;\n bestId = id;\n }\n }\n return bestId;\n}\n\n/**\n * Find the id of any rendered object at (x, y) by delegating to JSXGraph hasPoint.\n * Creates a temporary invisible point at (x, y) in screen coords to call hasPoint.\n */\nfunction findHitObject(\n board: JxgObj,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n): string | null {\n if (!renderer || !board) return null;\n // Create a temporary invisible probe point at user coords\n let screen: JxgObj | null = null;\n try {\n screen = board.create('point', [x, y], { visible: false, withLabel: false, name: '' });\n } catch {\n return null;\n }\n let result: string | null = null;\n try {\n for (const [id, el] of renderer.listElements().entries()) {\n \n const e = el as any;\n if (e?.hasPoint?.(screen.X(), screen.Y())) {\n result = id;\n break;\n }\n }\n } finally {\n try { board.removeObject(screen); } catch { /* ignore */ }\n }\n return result;\n}\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { MiniBoard, type MiniBoardHandle } from './MiniBoard';\nimport { useEditorState, type Store } from '../../../core/scene';\nimport type { GraphTool } from './tools';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost } from '../../shared/Toast';\n\n// ---------- Public handle ----------\n\nexport interface GraphEditorPanelHandle {\n insert: () => boolean;\n hasContent: () => boolean;\n getStore: () => Store | null;\n highlight: (id: string | null) => void;\n}\n\n// ---------- Props ----------\n\nexport interface GraphEditorPanelProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Callback khi selection thay đổi qua editor action. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n /** Notify host về canUndo/canRedo qua store subscribe (Tier 2 F). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n isDark?: boolean;\n /** Khi true (desktop) panel offset left chừa chỗ LeftPanel. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo/insert buttons. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\n// ---------- Component ----------\n\nconst GraphEditorPanelInner = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(\n {\n store,\n onInsert,\n onClose,\n onSelectionChange,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n },\n ref,\n ) {\n const miniRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const onSelectionChangeRef = useRef(onSelectionChange);\n useEffect(() => { onSelectionChangeRef.current = onSelectionChange; }, [onSelectionChange]);\n\n // Tier 2 F — propagate canUndo/canRedo + keyboard shortcuts qua shared hook.\n useEditorState({ store, onHistoryChange });\n\n useEffect(() => {\n const sync = () => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n const handleReady = useCallback(() => {\n setReady(true);\n }, []);\n\n // ---------- Insert ----------\n\n const performInsert = useCallback((): boolean => {\n const h = miniRef.current;\n if (!h) return false;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n // Fire async SVG export\n void (async () => {\n try {\n const { renderGraphSvgFromState } = await import('../render');\n const { stringifySceneState } = await import('../serialize');\n const jsonState = stringifySceneState(state);\n const svgString = await renderGraphSvgFromState(state, !!isDark);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('[GraphEditorPanel] insert failed:', err);\n }\n })();\n return true;\n }, [isDark, onInsert]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(miniRef.current?.getState().objects ?? {}).length > 0,\n getStore: () => miniRef.current?.getStore() ?? null,\n highlight: (id) => miniRef.current?.highlight(id),\n }), [performInsert]);\n\n // ---------- Layout ----------\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Đồ thị hàm số\"\n data-testid=\"graph-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n Đồ thị hàm số\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button\n type=\"button\"\n data-testid=\"graph-editor-close-btn\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* MiniBoard */}\n <div className=\"flex-1 min-h-0\">\n <MiniBoard\n ref={miniRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n isDark={isDark}\n onReady={handleReady}\n onSelectionChange={(id) => {\n onSelectionChangeRef.current?.(id);\n }}\n />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, nhấp trên bảng để tương tác.</span>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const GraphEditorPanel = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GraphEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","// src/stamps/graph-2d/editor/tools.ts\n//\n// Graph-2d tool catalog. 12 tools chia thành 4 groups (basic/function/analysis/draw).\n// Field naming `key` (đã đổi từ `id` ở Phase 4) khớp StampToolDef trong shared template.\n//\n// Shortcuts: single-letter (không chord 2-key). Vì graph chỉ có 12 tool —\n// đủ phím không cần chord. Editor là separate instance nên K/L/M có thể trùng\n// với 2D mà không conflict (chỉ 1 editor active tại 1 thời điểm).\n\nimport type { ReactNode } from 'react';\nimport React from 'react';\n\nexport type GraphTool =\n | 'move'\n | 'point'\n | 'slider'\n | 'pointOnCurve'\n | 'intersect'\n | 'tangent'\n | 'slope'\n | 'extremum'\n | 'root'\n | 'segment'\n | 'line'\n | 'polygon';\n\nexport type GraphToolGroup = 'basic' | 'function' | 'analysis' | 'draw';\n\nexport interface ToolDef {\n key: GraphTool;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: GraphToolGroup;\n shortcut?: string;\n}\n\nexport const GROUPS: GraphToolGroup[] = ['basic', 'function', 'analysis', 'draw'];\n\nexport const GROUP_LABELS: Record<GraphToolGroup, string> = {\n basic: 'Cơ bản',\n function: 'Hàm',\n analysis: 'Phân tích',\n draw: 'Vẽ',\n};\n\n// =============== Inline SVG icons (currentColor stroke, viewBox 24x24) ===============\n\nconst C_POINT = '#2563eb'; // blue\nconst C_FUNC = '#059669'; // emerald\nconst C_HELP = '#dc2626'; // red helper\n\nconst wrap = (children: ReactNode): React.ReactElement => (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {children}\n </svg>\n);\n\nconst Icon = {\n move: wrap(<path d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\" fill=\"currentColor\" fillOpacity=\"0.12\" />),\n point: wrap(<><circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_POINT} stroke=\"none\" /><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"none\" /></>),\n slider: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><circle cx=\"15\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n pointOnCurve: wrap(<><path d=\"M3 18 Q8 4 14 14 T21 6\" /><circle cx=\"14\" cy=\"14\" r=\"2\" fill={C_POINT} stroke=\"none\" /></>),\n intersect: wrap(<><path d=\"M3 6 Q12 22 21 6\" /><path d=\"M3 18 Q12 2 21 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_POINT} stroke=\"none\" /></>),\n tangent: wrap(<><path d=\"M3 16 Q12 4 21 16\" stroke={C_FUNC} /><line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" stroke={C_HELP} strokeDasharray=\"3 2\" /><circle cx=\"12\" cy=\"10\" r=\"1.8\" fill={C_POINT} stroke=\"none\" /></>),\n slope: wrap(<><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\" /><line x1=\"4\" y1=\"20\" x2=\"14\" y2=\"20\" stroke={C_HELP} strokeDasharray=\"2 2\" /><line x1=\"14\" y1=\"20\" x2=\"14\" y2=\"11\" stroke={C_HELP} strokeDasharray=\"2 2\" /></>),\n extremum: wrap(<><path d=\"M3 20 Q9 4 15 16 T21 8\" /><circle cx=\"9\" cy=\"8.5\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /><circle cx=\"15\" cy=\"16\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /></>),\n root: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><path d=\"M5 6 Q9 18 12 12 Q15 6 19 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_HELP} stroke=\"none\" /></>),\n segment: wrap(<><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" /><circle cx=\"5\" cy=\"18\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"6\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n line: wrap(<><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" /><circle cx=\"9\" cy=\"14.7\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"15\" cy=\"9.3\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n polygon: wrap(<><polygon points=\"5,18 12,4 19,12 16,20 8,20\" fill=\"currentColor\" fillOpacity=\"0.12\" /><circle cx=\"5\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"12\" cy=\"4\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /></>),\n};\n\n// =============== TOOLS array ===============\n\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Di chuyển / chọn', icon: Icon.move, group: 'basic', shortcut: 'S' },\n { key: 'point', label: 'Điểm', hint: 'Tạo điểm tự do', icon: Icon.point, group: 'basic', shortcut: 'P' },\n { key: 'slider', label: 'Slider', hint: 'Tạo tham số', icon: Icon.slider, group: 'basic', shortcut: 'B' },\n { key: 'pointOnCurve', label: 'Điểm trên đồ thị', hint: 'Tạo điểm trên hàm số', icon: Icon.pointOnCurve, group: 'function', shortcut: 'O' },\n { key: 'intersect', label: 'Giao điểm', hint: 'Giao 2 đồ thị', icon: Icon.intersect, group: 'function', shortcut: 'I' },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Tiếp tuyến tại điểm', icon: Icon.tangent, group: 'function', shortcut: 'T' },\n { key: 'slope', label: 'Hệ số góc', hint: 'Slope triangle', icon: Icon.slope, group: 'function', shortcut: 'K' },\n { key: 'extremum', label: 'Cực trị', hint: 'Tìm cực trị trong khoảng', icon: Icon.extremum, group: 'analysis', shortcut: 'E' },\n { key: 'root', label: 'Nghiệm', hint: 'Tìm nghiệm trong khoảng', icon: Icon.root, group: 'analysis', shortcut: 'R' },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Vẽ đoạn thẳng', icon: Icon.segment, group: 'draw', shortcut: 'M' },\n { key: 'line', label: 'Đường thẳng', hint: 'Vẽ đường thẳng', icon: Icon.line, group: 'draw', shortcut: 'L' },\n { key: 'polygon', label: 'Đa giác', hint: 'Vẽ đa giác', icon: Icon.polygon, group: 'draw', shortcut: 'Y' },\n];\n","'use client';\nimport React, { useEffect, useState, type KeyboardEvent } from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { Function2DAttrs } from '../../../../core/scene/kinds/function2d';\nimport type { Store } from '../../../../core/scene/store';\nimport { compile } from '../../../../core/scene/expressions/parser';\n\nexport interface FunctionRowProps {\n obj: SceneObject<Function2DAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function FunctionRow({ obj, store, selected, onClick }: FunctionRowProps): React.ReactElement {\n const [local, setLocal] = useState(obj.attrs.expression);\n const [error, setError] = useState<string | null>(null);\n\n // Sync local draft khi store expression thay đổi từ bên ngoài\n useEffect(() => {\n setLocal(obj.attrs.expression);\n setError(null);\n }, [obj.attrs.expression]);\n\n function commit(value: string) {\n if (value === obj.attrs.expression) {\n setError(null);\n return;\n }\n // Use compile (includes full syntax check via new Function) to validate\n const result = compile(value, {});\n if (typeof result === 'string') {\n // compile returns an error string on failure\n setError(result);\n return;\n }\n setError(null);\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { expression: value } },\n });\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit(local);\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n setLocal(obj.attrs.expression);\n setError(null);\n (e.target as HTMLInputElement).blur();\n }\n }\n\n function handleToggleVisible() {\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { visible: !obj.attrs.visible } },\n });\n }\n\n return (\n <li\n data-testid={`function-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Color swatch */}\n <span\n className=\"inline-block h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: obj.attrs.color }}\n aria-hidden=\"true\"\n />\n {/* Label */}\n <span className=\"shrink-0 font-mono text-[11px] text-slate-700\">\n {obj.label}(x) =\n </span>\n {/* Expression input */}\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value);\n setError(null);\n }}\n onKeyDown={handleKeyDown}\n onBlur={() => commit(local)}\n onClick={(e) => e.stopPropagation()}\n className={[\n 'min-w-0 flex-1 rounded border px-1.5 py-0.5 font-mono text-xs outline-none focus:ring-1',\n error\n ? 'border-red-400 focus:ring-red-300'\n : 'border-slate-300 focus:ring-blue-300',\n ].join(' ')}\n data-testid={`function-row-input-${obj.id}`}\n aria-label=\"Biểu thức\"\n />\n {/* Error indicator */}\n {error && (\n <span\n data-testid={`function-row-error-${obj.id}`}\n className=\"shrink-0 text-[10px] text-red-600\"\n title={error}\n >\n ⚠\n </span>\n )}\n {/* Visibility toggle */}\n <button\n type=\"button\"\n aria-label=\"Ẩn/hiện hàm\"\n aria-pressed={!obj.attrs.visible}\n onClick={(e) => { e.stopPropagation(); handleToggleVisible(); }}\n className=\"shrink-0 rounded px-1 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n {obj.attrs.visible ? '👁' : '🚫'}\n </button>\n </li>\n );\n}\n","'use client';\nimport React from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { ParameterAttrs } from '../../../../core/scene/kinds/parameter';\nimport type { Store } from '../../../../core/scene/store';\n\nexport interface ParameterRowProps {\n obj: SceneObject<ParameterAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function ParameterRow({ obj, store, selected, onClick }: ParameterRowProps): React.ReactElement {\n const { value, min, max, step } = obj.attrs;\n\n function handleSliderChange(e: React.ChangeEvent<HTMLInputElement>) {\n const newVal = parseFloat(e.target.value);\n if (!Number.isFinite(newVal)) return;\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { value: newVal } },\n });\n }\n\n return (\n <li\n data-testid={`parameter-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Label */}\n <span className=\"shrink-0 w-4 font-mono text-[11px] font-semibold text-slate-700\">\n {obj.label}\n </span>\n\n {/* Slider */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleSliderChange}\n onClick={(e) => e.stopPropagation()}\n className=\"min-w-0 flex-1 accent-blue-600\"\n data-testid={`parameter-row-slider-${obj.id}`}\n aria-label={`Tham số ${obj.label}`}\n />\n\n {/* Numeric display */}\n <span\n data-testid={`parameter-row-value-${obj.id}`}\n className=\"shrink-0 w-8 text-right font-mono text-[11px] text-slate-600\"\n >\n {Number.isInteger(value) ? value : parseFloat(value.toFixed(3))}\n </span>\n </li>\n );\n}\n","'use client';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport React from 'react';\nimport {\n GraphEditorPanel,\n type GraphEditorPanelHandle,\n} from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\nimport { parseSceneState } from './serialize';\nimport { TOOLS, GROUPS, GROUP_LABELS, type GraphTool, type GraphToolGroup } from './editor/tools';\nimport { FunctionRow } from './editor/rows/FunctionRow';\nimport { ParameterRow } from './editor/rows/ParameterRow';\nimport type { Function2DAttrs } from '../../core/scene/kinds/function2d';\nimport type { ParameterAttrs } from '../../core/scene/kinds/parameter';\nimport type { Store } from '../../core/scene/store';\nimport type { SceneObject, State } from '../../core/scene/types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nconst GraphIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n);\n\nfunction makeRenderRow(store: Store) {\n return function renderRow(\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ): React.ReactNode {\n if (obj.kind === 'function2d') {\n return (\n <FunctionRow\n obj={obj as unknown as SceneObject<Function2DAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n if (obj.kind === 'parameter') {\n return (\n <ParameterRow\n obj={obj as unknown as SceneObject<ParameterAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n // Fallback to default ObjectRow\n return null;\n };\n}\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGraph2DCustomData(data)) return null;\n const state = parseSceneState(data.jsonState);\n if (!state) {\n console.warn('Graph2DStampHost: jsonState corrupted hoặc không hợp lệ');\n return null;\n }\n return state;\n}\n\nexport const Graph2DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Graph2DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GraphEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('graph2d', editingElement, parseInitialState);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === 'graph2d' ? initialMeta.view : null;\n const [selectedTool, setSelectedTool] = useState<GraphTool>('move');\n const [showAxis, setShowAxisState] = useState<boolean>(initialView?.showAxis ?? true);\n const [showGrid, setShowGridState] = useState<boolean>(initialView?.showGrid ?? true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => sceneStore.undo(), [sceneStore]);\n const handleRedo = useCallback(() => sceneStore.redo(), [sceneStore]);\n\n const handleShowAxisChange = useCallback((b: boolean) => {\n setShowAxisState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showAxis: b } } });\n }, [sceneStore]);\n\n const handleShowGridChange = useCallback((b: boolean) => {\n setShowGridState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showGrid: b } } });\n }, [sceneStore]);\n\n // ---------- Add buttons (dispatch trực tiếp vào store) ----------\n\n const handleAddFunction = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'function2d');\n const id = `f${existing.length + 1}`;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'function2d',\n label: id,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { expression: 'x', color: '#2563eb', visible: true },\n },\n },\n });\n }, [sceneStore]);\n\n const handleAddParameter = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'parameter');\n const labels = 'abcdefghijklmnopqrstuvwxyz';\n const usedLabels = new Set(existing.map((o) => o.label));\n let label = 'a';\n for (const c of labels) {\n if (!usedLabels.has(c)) { label = c; break; }\n }\n const id = label;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'parameter',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { value: 1, min: -5, max: 5, step: 0.1 },\n },\n },\n });\n }, [sceneStore]);\n\n // ---------- Insert ----------\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Graph2DCustomData => ({\n kind: 'graph2d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Graph2D insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n const renderRow = useMemo(() => makeRenderRow(sceneStore), [sceneStore]);\n\n return (\n <>\n <StampLeftPanel<GraphTool, GraphToolGroup>\n title=\"Đồ thị\"\n icon={GraphIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUPS}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: handleShowAxisChange,\n onShowGridChange: handleShowGridChange,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.highlight(id);\n },\n renderRow,\n addButtons: [\n { label: '+ Hàm f(x)', testId: 'add-function-btn', onClick: handleAddFunction },\n { label: '+ Tham số', testId: 'add-parameter-btn', onClick: handleAddParameter },\n ],\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GraphEditorPanel\n ref={panelRef}\n store={sceneStore}\n onInsert={handleInsert}\n onClose={onClose}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isDark={isDark}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n />\n </>\n );\n },\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/editor/tools.tsx","../src/stamps/graph-2d/editor/rows/FunctionRow.tsx","../src/stamps/graph-2d/editor/rows/ParameterRow.tsx","../src/stamps/graph-2d/host.tsx"],"names":["id","MiniBoard","useRef","useEffect","useImperativeHandle","jsx","GraphEditorPanel","jsxs","Fragment","useState","forwardRef","Graph2DStampHost","useCallback"],"mappings":"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","file":"host-HOSJHQ5H.mjs","sourcesContent":["// src/stamps/graph-2d/editor/handlers.ts\nimport type { Store } from '../../../core/scene/store';\nimport type { GraphTool } from './tools';\n\nexport interface HandlerCtx {\n store: Store;\n toolRef: { current: GraphTool };\n pendingIdsRef: { current: string[] };\n pushPending: (id: string) => void;\n clearPending: () => void;\n setTool: (t: GraphTool) => void;\n nextLabel: (kind: string) => string;\n /** Lookup nearest function2d id within vertical hit tolerance. */\n getNearestFunctionId: (coord: { x: number; y: number }) => string | null;\n /** Lookup any object at coord via JSXGraph hasPoint (pointOnCurve, point, etc.). */\n getHitObjectId: (coord: { x: number; y: number }) => string | null;\n}\n\nexport interface Coord { x: number; y: number; }\n\nexport function handleDown(ctx: HandlerCtx, coord: Coord): void {\n const tool = ctx.toolRef.current;\n switch (tool) {\n case 'move':\n return;\n case 'point':\n addFreePoint(ctx, coord);\n return;\n case 'slider':\n // Opens dialog separately — handled in EditorPanel. Reset tool.\n ctx.setTool('move');\n return;\n case 'pointOnCurve':\n addPointOnCurve(ctx, coord);\n return;\n case 'intersect':\n handleIntersect(ctx, coord);\n return;\n case 'tangent':\n handleTangent(ctx, coord);\n return;\n case 'slope':\n handleSlope(ctx, coord);\n return;\n case 'extremum':\n case 'root':\n handleAnalysisTool(ctx, coord, tool);\n return;\n case 'segment':\n case 'line':\n handleTwoPointTool(ctx, coord, tool);\n return;\n case 'polygon':\n handlePolygonTool(ctx, coord);\n return;\n }\n}\n\nfunction addFreePoint(ctx: HandlerCtx, coord: Coord): void {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction addPointOnCurve(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n const id = ctx.nextLabel('pointOnCurve');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'pointOnCurve', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, x: coord.x },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleIntersect(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(fid);\n return;\n }\n const fa = ctx.pendingIdsRef.current[0];\n if (fa === fid) return;\n const id = ctx.nextLabel('intersection');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'intersection', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n // NOTE: 'lineLine' is semantically imprecise for function2d curves but\n // works as a discriminant tag — TODO refactor to 'curveCurve' kind in\n // a follow-up when intersection kind is extended.\n attrs: { kind: 'lineLine', ref1: fa, ref2: fid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handleTangent(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('tangent2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'tangent2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleSlope(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('slope2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'slope2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleAnalysisTool(ctx: HandlerCtx, coord: Coord, tool: 'extremum' | 'root'): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n // MVP: use default domain [-10, 10]. UI can override via properties post-creation.\n if (tool === 'extremum') {\n const id = ctx.nextLabel('extremum2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'extremum2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 }, mode: 'min' },\n },\n },\n });\n } else {\n const id = ctx.nextLabel('root2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'root2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 } },\n },\n },\n });\n }\n ctx.setTool('move');\n}\n\nfunction handleTwoPointTool(ctx: HandlerCtx, coord: Coord, tool: 'segment' | 'line'): void {\n const hitId = ctx.getHitObjectId(coord);\n const pid = hitId ?? (() => {\n // Auto-add free point at click location\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(pid);\n return;\n }\n const p1 = ctx.pendingIdsRef.current[0];\n if (p1 === pid) return;\n const id = ctx.nextLabel(tool);\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: tool, label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { p1, p2: pid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handlePolygonTool(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n // Close polygon if clicking first pending point and have ≥3 vertices\n if (hitId && ctx.pendingIdsRef.current[0] === hitId && ctx.pendingIdsRef.current.length >= 3) {\n const id = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'polygon', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { points: [...ctx.pendingIdsRef.current] },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n return;\n }\n // Otherwise add new point + push to pending\n const pid = hitId ?? (() => {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n ctx.pushPending(pid);\n}\n","'use client';\n// src/stamps/graph-2d/editor/MiniBoard.tsx\n//\n// JSXGraph mini-board cho graph-2d editor.\n// Reuses the pattern from geometry-2d/editor/MiniBoard.tsx adapted for graph2d domain:\n// - createEmptyState('graph2d') instead of '2d'\n// - Init view from state.meta.view (default [-10, 10])\n// - getNearestFunctionId / findHitObject helpers for graph-specific hit-test\n// - Tools from TOOLS / GraphTool\n\nimport React, { useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type State,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport type { Store } from '../../../core/scene/store';\nimport { paletteFor } from './theme';\nimport { handleDown, type HandlerCtx } from './handlers';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GraphTool } from './tools';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n \ntype JxgObj = any;\n\n/**\n * Imperative handle exposed bởi MiniBoard. Sau Tier 2 F: tool / showAxis /\n * showGrid / undo-redo do host owns; handle chỉ giữ state read + highlight +\n * bbox.\n */\nexport interface MiniBoardHandle {\n getState: () => State;\n getStore: () => Store;\n highlight: (id: string | null) => void;\n getContainer: () => HTMLDivElement | null;\n getBbox: () => [number, number, number, number];\n}\n\ninterface MiniBoardProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n onReady?: () => void;\n onSelectionChange?: (id: string | undefined) => void;\n}\n\nexport const MiniBoard = React.forwardRef<MiniBoardHandle, MiniBoardProps>(\n function MiniBoard(\n { store, selectedTool, showAxis, showGrid, isDark, onReady, onSelectionChange: _onSelectionChange },\n ref,\n ) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_graph_jxg';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const rendererRef = useRef<JxgRenderer | null>(null);\n\n const toolSM = useToolStateMachine<GraphTool>(selectedTool);\n\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Tier 2 F — sync `selectedTool` prop → internal toolSM.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) toolSM.setTool(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init ────────────────────────────────────────────────────────────\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.graph',\n boardOptions: {\n boundingbox: [-10, 10, 10, -10],\n axis: showAxisRef.current,\n grid: showGridRef.current,\n showCopyright: false,\n showNavigation: true,\n keepAspectRatio: false,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n const theme = paletteFor(isDarkRef.current);\n rendererRef.current = new JxgRenderer(store, board, { theme });\n\n // Ctrl/Cmd + wheel zoom\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.graph');\n }\n\n // Pointer-down handler — only active when tool != move\n const onDown = (evt: JxgObj) => {\n const b = boardRef.current;\n if (!b || toolSM.toolRef.current === 'move') return;\n\n // Convert JSXGraph event → user-space coords.\n // Pattern from geometry-3d MiniBoard3D: use getUsrCoordsOfMouse if available,\n // fall back to manual calculation via board.origin + unitX/unitY.\n let ux = 0, uy = 0;\n safeJsx('MiniBoard.graph.pointerCoords', () => {\n \n const usr = (b as any).getUsrCoordsOfMouse?.(evt);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n ux = usr[0] as number; uy = usr[1] as number;\n } else if (b.origin?.scrCoords && containerRef.current) {\n // Fallback: manual pixel → user-space\n const rect = containerRef.current.getBoundingClientRect();\n const px = (evt.clientX ?? 0) - rect.left;\n const py = (evt.clientY ?? 0) - rect.top;\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const bUnitX = b.unitX || 1;\n const bUnitY = b.unitY || 1;\n ux = (px - ox) / bUnitX;\n uy = (oy - py) / bUnitY;\n }\n });\n\n const ctx: HandlerCtx = {\n store,\n toolRef: toolSM.toolRef,\n pendingIdsRef: toolSM.pendingIdsRef,\n pushPending: toolSM.pushPending,\n clearPending: toolSM.clearPending,\n setTool: toolSM.setTool,\n nextLabel: (kind) => sceneNextLabel(store.getState(), kind),\n getNearestFunctionId: ({ x, y }) =>\n findNearestFunction(b, store, rendererRef.current, x, y),\n getHitObjectId: ({ x, y }) =>\n findHitObject(b, rendererRef.current, x, y),\n };\n safeJsx('MiniBoard.graph.handleDown', () =>\n handleDown(ctx, { x: ux, y: uy }),\n );\n };\n\n board.on('down', onDown);\n onReady?.();\n })();\n\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n rendererRef.current?.dispose();\n rendererRef.current = null;\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n useImperativeHandle(\n ref,\n () => ({\n getState: () => store.getState(),\n getStore: () => store,\n highlight: (id) => rendererRef.current?.highlight(id),\n getContainer: () => containerRef.current,\n getBbox: () => boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n }),\n [store],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"graph-miniboard\"\n className=\"h-full w-full\"\n style={{ touchAction: 'none' }}\n />\n );\n },\n);\n\n// ─── Hit-test helpers ──────────────────────────────────────────────────────────\n\n/**\n * Find the id of the nearest function2d object within vertical tolerance `tolY`\n * (in world/user-space units — default 0.5 units; may need tuning for zoom levels).\n *\n * Iterates over function2d objects in state.order and evaluates el.Y(x) on the\n * JSXGraph functiongraph element via JxgRenderer.getElement(id).\n */\nfunction findNearestFunction(\n _board: JxgObj,\n store: Store,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n tolY = 0.5,\n): string | null {\n if (!renderer) return null;\n const state = store.getState();\n let bestId: string | null = null;\n let bestDist = Infinity;\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind !== 'function2d') continue;\n const el = renderer.getElement(id) as { Y?: (x: number) => number } | null;\n if (!el || typeof el.Y !== 'function') continue;\n let fy: number;\n try {\n fy = el.Y(x);\n } catch {\n continue;\n }\n if (!Number.isFinite(fy)) continue;\n const d = Math.abs(y - fy);\n if (d < tolY && d < bestDist) {\n bestDist = d;\n bestId = id;\n }\n }\n return bestId;\n}\n\n/**\n * Find the id of any rendered object at (x, y) by delegating to JSXGraph hasPoint.\n * Creates a temporary invisible point at (x, y) in screen coords to call hasPoint.\n */\nfunction findHitObject(\n board: JxgObj,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n): string | null {\n if (!renderer || !board) return null;\n // Create a temporary invisible probe point at user coords\n let screen: JxgObj | null = null;\n try {\n screen = board.create('point', [x, y], { visible: false, withLabel: false, name: '' });\n } catch {\n return null;\n }\n let result: string | null = null;\n try {\n for (const [id, el] of renderer.listElements().entries()) {\n \n const e = el as any;\n if (e?.hasPoint?.(screen.X(), screen.Y())) {\n result = id;\n break;\n }\n }\n } finally {\n try { board.removeObject(screen); } catch { /* ignore */ }\n }\n return result;\n}\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { MiniBoard, type MiniBoardHandle } from './MiniBoard';\nimport { useEditorState, type Store } from '../../../core/scene';\nimport type { GraphTool } from './tools';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost } from '../../shared/Toast';\n\n// ---------- Public handle ----------\n\nexport interface GraphEditorPanelHandle {\n insert: () => boolean;\n hasContent: () => boolean;\n getStore: () => Store | null;\n highlight: (id: string | null) => void;\n}\n\n// ---------- Props ----------\n\nexport interface GraphEditorPanelProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Callback khi selection thay đổi qua editor action. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n /** Notify host về canUndo/canRedo qua store subscribe (Tier 2 F). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n isDark?: boolean;\n /** Khi true (desktop) panel offset left chừa chỗ LeftPanel. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo/insert buttons. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\n// ---------- Component ----------\n\nconst GraphEditorPanelInner = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(\n {\n store,\n onInsert,\n onClose,\n onSelectionChange,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n },\n ref,\n ) {\n const miniRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const onSelectionChangeRef = useRef(onSelectionChange);\n useEffect(() => { onSelectionChangeRef.current = onSelectionChange; }, [onSelectionChange]);\n\n // Tier 2 F — propagate canUndo/canRedo + keyboard shortcuts qua shared hook.\n useEditorState({ store, onHistoryChange });\n\n useEffect(() => {\n const sync = () => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n const handleReady = useCallback(() => {\n setReady(true);\n }, []);\n\n // ---------- Insert ----------\n\n const performInsert = useCallback((): boolean => {\n const h = miniRef.current;\n if (!h) return false;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n // Fire async SVG export\n void (async () => {\n try {\n const { renderGraphSvgFromState } = await import('../render');\n const { stringifySceneState } = await import('../serialize');\n const jsonState = stringifySceneState(state);\n const svgString = await renderGraphSvgFromState(state, !!isDark);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('[GraphEditorPanel] insert failed:', err);\n }\n })();\n return true;\n }, [isDark, onInsert]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(miniRef.current?.getState().objects ?? {}).length > 0,\n getStore: () => miniRef.current?.getStore() ?? null,\n highlight: (id) => miniRef.current?.highlight(id),\n }), [performInsert]);\n\n // ---------- Layout ----------\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Đồ thị hàm số\"\n data-testid=\"graph-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n Đồ thị hàm số\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button\n type=\"button\"\n data-testid=\"graph-editor-close-btn\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* MiniBoard */}\n <div className=\"flex-1 min-h-0\">\n <MiniBoard\n ref={miniRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n isDark={isDark}\n onReady={handleReady}\n onSelectionChange={(id) => {\n onSelectionChangeRef.current?.(id);\n }}\n />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, nhấp trên bảng để tương tác.</span>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const GraphEditorPanel = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GraphEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","// src/stamps/graph-2d/editor/tools.ts\n//\n// Graph-2d tool catalog. 12 tools chia thành 4 groups (basic/function/analysis/draw).\n// Field naming `key` (đã đổi từ `id` ở Phase 4) khớp StampToolDef trong shared template.\n//\n// Shortcuts: single-letter (không chord 2-key). Vì graph chỉ có 12 tool —\n// đủ phím không cần chord. Editor là separate instance nên K/L/M có thể trùng\n// với 2D mà không conflict (chỉ 1 editor active tại 1 thời điểm).\n\nimport type { ReactNode } from 'react';\nimport React from 'react';\n\nexport type GraphTool =\n | 'move'\n | 'point'\n | 'slider'\n | 'pointOnCurve'\n | 'intersect'\n | 'tangent'\n | 'slope'\n | 'extremum'\n | 'root'\n | 'segment'\n | 'line'\n | 'polygon';\n\nexport type GraphToolGroup = 'basic' | 'function' | 'analysis' | 'draw';\n\nexport interface ToolDef {\n key: GraphTool;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: GraphToolGroup;\n shortcut?: string;\n}\n\nexport const GROUPS: GraphToolGroup[] = ['basic', 'function', 'analysis', 'draw'];\n\nexport const GROUP_LABELS: Record<GraphToolGroup, string> = {\n basic: 'Cơ bản',\n function: 'Hàm',\n analysis: 'Phân tích',\n draw: 'Vẽ',\n};\n\n// =============== Inline SVG icons (currentColor stroke, viewBox 24x24) ===============\n\nconst C_POINT = '#2563eb'; // blue\nconst C_FUNC = '#059669'; // emerald\nconst C_HELP = '#dc2626'; // red helper\n\nconst wrap = (children: ReactNode): React.ReactElement => (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {children}\n </svg>\n);\n\nconst Icon = {\n move: wrap(<path d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\" fill=\"currentColor\" fillOpacity=\"0.12\" />),\n point: wrap(<><circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_POINT} stroke=\"none\" /><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"none\" /></>),\n slider: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><circle cx=\"15\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n pointOnCurve: wrap(<><path d=\"M3 18 Q8 4 14 14 T21 6\" /><circle cx=\"14\" cy=\"14\" r=\"2\" fill={C_POINT} stroke=\"none\" /></>),\n intersect: wrap(<><path d=\"M3 6 Q12 22 21 6\" /><path d=\"M3 18 Q12 2 21 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_POINT} stroke=\"none\" /></>),\n tangent: wrap(<><path d=\"M3 16 Q12 4 21 16\" stroke={C_FUNC} /><line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" stroke={C_HELP} strokeDasharray=\"3 2\" /><circle cx=\"12\" cy=\"10\" r=\"1.8\" fill={C_POINT} stroke=\"none\" /></>),\n slope: wrap(<><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\" /><line x1=\"4\" y1=\"20\" x2=\"14\" y2=\"20\" stroke={C_HELP} strokeDasharray=\"2 2\" /><line x1=\"14\" y1=\"20\" x2=\"14\" y2=\"11\" stroke={C_HELP} strokeDasharray=\"2 2\" /></>),\n extremum: wrap(<><path d=\"M3 20 Q9 4 15 16 T21 8\" /><circle cx=\"9\" cy=\"8.5\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /><circle cx=\"15\" cy=\"16\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /></>),\n root: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><path d=\"M5 6 Q9 18 12 12 Q15 6 19 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_HELP} stroke=\"none\" /></>),\n segment: wrap(<><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" /><circle cx=\"5\" cy=\"18\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"6\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n line: wrap(<><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" /><circle cx=\"9\" cy=\"14.7\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"15\" cy=\"9.3\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n polygon: wrap(<><polygon points=\"5,18 12,4 19,12 16,20 8,20\" fill=\"currentColor\" fillOpacity=\"0.12\" /><circle cx=\"5\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"12\" cy=\"4\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /></>),\n};\n\n// =============== TOOLS array ===============\n\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Di chuyển / chọn', icon: Icon.move, group: 'basic', shortcut: 'S' },\n { key: 'point', label: 'Điểm', hint: 'Tạo điểm tự do', icon: Icon.point, group: 'basic', shortcut: 'P' },\n { key: 'slider', label: 'Slider', hint: 'Tạo tham số', icon: Icon.slider, group: 'basic', shortcut: 'B' },\n { key: 'pointOnCurve', label: 'Điểm trên đồ thị', hint: 'Tạo điểm trên hàm số', icon: Icon.pointOnCurve, group: 'function', shortcut: 'O' },\n { key: 'intersect', label: 'Giao điểm', hint: 'Giao 2 đồ thị', icon: Icon.intersect, group: 'function', shortcut: 'I' },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Tiếp tuyến tại điểm', icon: Icon.tangent, group: 'function', shortcut: 'T' },\n { key: 'slope', label: 'Hệ số góc', hint: 'Slope triangle', icon: Icon.slope, group: 'function', shortcut: 'K' },\n { key: 'extremum', label: 'Cực trị', hint: 'Tìm cực trị trong khoảng', icon: Icon.extremum, group: 'analysis', shortcut: 'E' },\n { key: 'root', label: 'Nghiệm', hint: 'Tìm nghiệm trong khoảng', icon: Icon.root, group: 'analysis', shortcut: 'R' },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Vẽ đoạn thẳng', icon: Icon.segment, group: 'draw', shortcut: 'M' },\n { key: 'line', label: 'Đường thẳng', hint: 'Vẽ đường thẳng', icon: Icon.line, group: 'draw', shortcut: 'L' },\n { key: 'polygon', label: 'Đa giác', hint: 'Vẽ đa giác', icon: Icon.polygon, group: 'draw', shortcut: 'Y' },\n];\n","'use client';\nimport React, { useEffect, useState, type KeyboardEvent } from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { Function2DAttrs } from '../../../../core/scene/kinds/function2d';\nimport type { Store } from '../../../../core/scene/store';\nimport { compile } from '../../../../core/scene/expressions/parser';\n\nexport interface FunctionRowProps {\n obj: SceneObject<Function2DAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function FunctionRow({ obj, store, selected, onClick }: FunctionRowProps): React.ReactElement {\n const [local, setLocal] = useState(obj.attrs.expression);\n const [error, setError] = useState<string | null>(null);\n\n // Sync local draft khi store expression thay đổi từ bên ngoài\n useEffect(() => {\n setLocal(obj.attrs.expression);\n setError(null);\n }, [obj.attrs.expression]);\n\n function commit(value: string) {\n if (value === obj.attrs.expression) {\n setError(null);\n return;\n }\n // Use compile (includes full syntax check via new Function) to validate\n const result = compile(value, {});\n if (typeof result === 'string') {\n // compile returns an error string on failure\n setError(result);\n return;\n }\n setError(null);\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { expression: value } },\n });\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit(local);\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n setLocal(obj.attrs.expression);\n setError(null);\n (e.target as HTMLInputElement).blur();\n }\n }\n\n function handleToggleVisible() {\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { visible: !obj.attrs.visible } },\n });\n }\n\n return (\n <li\n data-testid={`function-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Color swatch */}\n <span\n className=\"inline-block h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: obj.attrs.color }}\n aria-hidden=\"true\"\n />\n {/* Label */}\n <span className=\"shrink-0 font-mono text-[11px] text-slate-700\">\n {obj.label}(x) =\n </span>\n {/* Expression input */}\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value);\n setError(null);\n }}\n onKeyDown={handleKeyDown}\n onBlur={() => commit(local)}\n onClick={(e) => e.stopPropagation()}\n className={[\n 'min-w-0 flex-1 rounded border px-1.5 py-0.5 font-mono text-xs outline-none focus:ring-1',\n error\n ? 'border-red-400 focus:ring-red-300'\n : 'border-slate-300 focus:ring-blue-300',\n ].join(' ')}\n data-testid={`function-row-input-${obj.id}`}\n aria-label=\"Biểu thức\"\n />\n {/* Error indicator */}\n {error && (\n <span\n data-testid={`function-row-error-${obj.id}`}\n className=\"shrink-0 text-[10px] text-red-600\"\n title={error}\n >\n ⚠\n </span>\n )}\n {/* Visibility toggle */}\n <button\n type=\"button\"\n aria-label=\"Ẩn/hiện hàm\"\n aria-pressed={!obj.attrs.visible}\n onClick={(e) => { e.stopPropagation(); handleToggleVisible(); }}\n className=\"shrink-0 rounded px-1 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n {obj.attrs.visible ? '👁' : '🚫'}\n </button>\n </li>\n );\n}\n","'use client';\nimport React from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { ParameterAttrs } from '../../../../core/scene/kinds/parameter';\nimport type { Store } from '../../../../core/scene/store';\n\nexport interface ParameterRowProps {\n obj: SceneObject<ParameterAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function ParameterRow({ obj, store, selected, onClick }: ParameterRowProps): React.ReactElement {\n const { value, min, max, step } = obj.attrs;\n\n function handleSliderChange(e: React.ChangeEvent<HTMLInputElement>) {\n const newVal = parseFloat(e.target.value);\n if (!Number.isFinite(newVal)) return;\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { value: newVal } },\n });\n }\n\n return (\n <li\n data-testid={`parameter-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Label */}\n <span className=\"shrink-0 w-4 font-mono text-[11px] font-semibold text-slate-700\">\n {obj.label}\n </span>\n\n {/* Slider */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleSliderChange}\n onClick={(e) => e.stopPropagation()}\n className=\"min-w-0 flex-1 accent-blue-600\"\n data-testid={`parameter-row-slider-${obj.id}`}\n aria-label={`Tham số ${obj.label}`}\n />\n\n {/* Numeric display */}\n <span\n data-testid={`parameter-row-value-${obj.id}`}\n className=\"shrink-0 w-8 text-right font-mono text-[11px] text-slate-600\"\n >\n {Number.isInteger(value) ? value : parseFloat(value.toFixed(3))}\n </span>\n </li>\n );\n}\n","'use client';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport React from 'react';\nimport {\n GraphEditorPanel,\n type GraphEditorPanelHandle,\n} from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\nimport { parseSceneState } from './serialize';\nimport { TOOLS, GROUPS, GROUP_LABELS, type GraphTool, type GraphToolGroup } from './editor/tools';\nimport { FunctionRow } from './editor/rows/FunctionRow';\nimport { ParameterRow } from './editor/rows/ParameterRow';\nimport type { Function2DAttrs } from '../../core/scene/kinds/function2d';\nimport type { ParameterAttrs } from '../../core/scene/kinds/parameter';\nimport type { Store } from '../../core/scene/store';\nimport type { SceneObject, State } from '../../core/scene/types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nconst GraphIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n);\n\nfunction makeRenderRow(store: Store) {\n return function renderRow(\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ): React.ReactNode {\n if (obj.kind === 'function2d') {\n return (\n <FunctionRow\n obj={obj as unknown as SceneObject<Function2DAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n if (obj.kind === 'parameter') {\n return (\n <ParameterRow\n obj={obj as unknown as SceneObject<ParameterAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n // Fallback to default ObjectRow\n return null;\n };\n}\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGraph2DCustomData(data)) return null;\n const state = parseSceneState(data.jsonState);\n if (!state) {\n console.warn('Graph2DStampHost: jsonState corrupted hoặc không hợp lệ');\n return null;\n }\n return state;\n}\n\nexport const Graph2DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Graph2DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GraphEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('graph2d', editingElement, parseInitialState);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === 'graph2d' ? initialMeta.view : null;\n const [selectedTool, setSelectedTool] = useState<GraphTool>('move');\n const [showAxis, setShowAxisState] = useState<boolean>(initialView?.showAxis ?? true);\n const [showGrid, setShowGridState] = useState<boolean>(initialView?.showGrid ?? true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => sceneStore.undo(), [sceneStore]);\n const handleRedo = useCallback(() => sceneStore.redo(), [sceneStore]);\n\n const handleShowAxisChange = useCallback((b: boolean) => {\n setShowAxisState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showAxis: b } } });\n }, [sceneStore]);\n\n const handleShowGridChange = useCallback((b: boolean) => {\n setShowGridState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showGrid: b } } });\n }, [sceneStore]);\n\n // ---------- Add buttons (dispatch trực tiếp vào store) ----------\n\n const handleAddFunction = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'function2d');\n const id = `f${existing.length + 1}`;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'function2d',\n label: id,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { expression: 'x', color: '#2563eb', visible: true },\n },\n },\n });\n }, [sceneStore]);\n\n const handleAddParameter = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'parameter');\n const labels = 'abcdefghijklmnopqrstuvwxyz';\n const usedLabels = new Set(existing.map((o) => o.label));\n let label = 'a';\n for (const c of labels) {\n if (!usedLabels.has(c)) { label = c; break; }\n }\n const id = label;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'parameter',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { value: 1, min: -5, max: 5, step: 0.1 },\n },\n },\n });\n }, [sceneStore]);\n\n // ---------- Insert ----------\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Graph2DCustomData => ({\n kind: 'graph2d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Graph2D insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n const renderRow = useMemo(() => makeRenderRow(sceneStore), [sceneStore]);\n\n return (\n <>\n <StampLeftPanel<GraphTool, GraphToolGroup>\n title=\"Đồ thị\"\n icon={GraphIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUPS}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: handleShowAxisChange,\n onShowGridChange: handleShowGridChange,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.highlight(id);\n },\n renderRow,\n addButtons: [\n { label: '+ Hàm f(x)', testId: 'add-function-btn', onClick: handleAddFunction },\n { label: '+ Tham số', testId: 'add-parameter-btn', onClick: handleAddParameter },\n ],\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GraphEditorPanel\n ref={panelRef}\n store={sceneStore}\n onInsert={handleInsert}\n onClose={onClose}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isDark={isDark}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n />\n </>\n );\n },\n);\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -3,8 +3,8 @@ import { NonDeletedExcalidrawElement } from '@excalidraw/excalidraw/element/type
|
|
|
3
3
|
export { ExcalidrawElement, NonDeletedExcalidrawElement } from '@excalidraw/excalidraw/element/types';
|
|
4
4
|
import { AppState, BinaryFiles } from '@excalidraw/excalidraw/types';
|
|
5
5
|
export { AppState, BinaryFiles } from '@excalidraw/excalidraw/types';
|
|
6
|
-
import { S as StampType, G as GenerateGeometryFigure } from './types-
|
|
7
|
-
export { A as AiFigureProgress,
|
|
6
|
+
import { S as StampType, G as GenerateGeometryFigure, a as GeometryDraftPreview } from './types-C3FjpoUi.mjs';
|
|
7
|
+
export { A as AiFigureProgress, b as AiFigureUiResult, B as BaseStampCustomData } from './types-C3FjpoUi.mjs';
|
|
8
8
|
import { GeometryCustomData } from './geometry-2d.mjs';
|
|
9
9
|
export { geometryStamp } from './geometry-2d.mjs';
|
|
10
10
|
import { LatexCustomData } from './latex.mjs';
|
|
@@ -14,8 +14,6 @@ export { geometry3dStamp } from './geometry-3d.mjs';
|
|
|
14
14
|
import { Graph2DCustomData } from './graph-2d.mjs';
|
|
15
15
|
export { graph2dStamp } from './graph-2d.mjs';
|
|
16
16
|
import { PDFDocumentProxy } from 'pdfjs-dist';
|
|
17
|
-
export { E as ExtractUiResult, H as HandleExtractProblemOptions, I as ImagePart, V as VisionRequest, h as handleExtractProblem } from './handleExtractProblem-C-U5KluK.mjs';
|
|
18
|
-
import 'zod';
|
|
19
17
|
import 'react';
|
|
20
18
|
|
|
21
19
|
interface SyncableAppState {
|
|
@@ -124,8 +122,13 @@ interface WhiteboardProps {
|
|
|
124
122
|
* `generateFigure()` on a server boundary so API credentials never reach the browser.
|
|
125
123
|
*/
|
|
126
124
|
generateGeometryFigure?: GenerateGeometryFigure;
|
|
125
|
+
/**
|
|
126
|
+
* Geometry-2d live draft. GV: package gọi callback này (debounced) với SVG hình
|
|
127
|
+
* đang dựng + vị trí chèn; `null` khi clear. Consumer broadcast cho học sinh.
|
|
128
|
+
*/
|
|
129
|
+
onGeometryDraft?: (draft: GeometryDraftPreview | null) => void;
|
|
127
130
|
}
|
|
128
|
-
declare function Whiteboard({ storageKey, readOnly, onSceneChange, onFilesChange, onApi, langCode, stamps, initialScene, initialFiles, generateGeometryFigure, }: WhiteboardProps): react_jsx_runtime.JSX.Element;
|
|
131
|
+
declare function Whiteboard({ storageKey, readOnly, onSceneChange, onFilesChange, onApi, langCode, stamps, initialScene, initialFiles, generateGeometryFigure, onGeometryDraft, }: WhiteboardProps): react_jsx_runtime.JSX.Element;
|
|
129
132
|
|
|
130
133
|
declare function pickSyncableAppState(s: AppState): SyncableAppState;
|
|
131
134
|
|
|
@@ -278,4 +281,4 @@ declare function insertPdfPages(api: ExApi, source: File | Blob | ArrayBuffer, o
|
|
|
278
281
|
*/
|
|
279
282
|
declare function parsePageRange(input: string, totalPages: number): number[];
|
|
280
283
|
|
|
281
|
-
export { ALL_STAMPS, DEFAULT_STAMPS, EXPERIMENTAL_STAMPS, type ExcalidrawSceneSnapshot, GenerateGeometryFigure, Geometry3DCustomData, GeometryCustomData, Graph2DCustomData, type InsertPdfPagesOptions, type InsertPdfPagesResult, type InsertRasterizedPagesOptions, type InsertRasterizedPagesResult, LatexCustomData, type RasterizeOptions, type RasterizedPage, STABLE_STAMPS, STAMP_CATALOG, type StampCatalogEntry, type StampCustomData, StampType, type SyncableAppState, Whiteboard, type WhiteboardProps, closePdfDocument, configurePdfWorker, findCatalogEntry, findStampForCustomData, insertPdfPages, insertRasterizedPagesIntoScene, isStampElement, loadPdfDocument, parsePageRange, pickSyncableAppState, rasterizePdf, restoreMissingStampFiles };
|
|
284
|
+
export { ALL_STAMPS, DEFAULT_STAMPS, EXPERIMENTAL_STAMPS, type ExcalidrawSceneSnapshot, GenerateGeometryFigure, Geometry3DCustomData, GeometryCustomData, GeometryDraftPreview, Graph2DCustomData, type InsertPdfPagesOptions, type InsertPdfPagesResult, type InsertRasterizedPagesOptions, type InsertRasterizedPagesResult, LatexCustomData, type RasterizeOptions, type RasterizedPage, STABLE_STAMPS, STAMP_CATALOG, type StampCatalogEntry, type StampCustomData, StampType, type SyncableAppState, Whiteboard, type WhiteboardProps, closePdfDocument, configurePdfWorker, findCatalogEntry, findStampForCustomData, insertPdfPages, insertRasterizedPagesIntoScene, isStampElement, loadPdfDocument, parsePageRange, pickSyncableAppState, rasterizePdf, restoreMissingStampFiles };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { NonDeletedExcalidrawElement } from '@excalidraw/excalidraw/element/type
|
|
|
3
3
|
export { ExcalidrawElement, NonDeletedExcalidrawElement } from '@excalidraw/excalidraw/element/types';
|
|
4
4
|
import { AppState, BinaryFiles } from '@excalidraw/excalidraw/types';
|
|
5
5
|
export { AppState, BinaryFiles } from '@excalidraw/excalidraw/types';
|
|
6
|
-
import { S as StampType, G as GenerateGeometryFigure } from './types-
|
|
7
|
-
export { A as AiFigureProgress,
|
|
6
|
+
import { S as StampType, G as GenerateGeometryFigure, a as GeometryDraftPreview } from './types-C3FjpoUi.js';
|
|
7
|
+
export { A as AiFigureProgress, b as AiFigureUiResult, B as BaseStampCustomData } from './types-C3FjpoUi.js';
|
|
8
8
|
import { GeometryCustomData } from './geometry-2d.js';
|
|
9
9
|
export { geometryStamp } from './geometry-2d.js';
|
|
10
10
|
import { LatexCustomData } from './latex.js';
|
|
@@ -14,8 +14,6 @@ export { geometry3dStamp } from './geometry-3d.js';
|
|
|
14
14
|
import { Graph2DCustomData } from './graph-2d.js';
|
|
15
15
|
export { graph2dStamp } from './graph-2d.js';
|
|
16
16
|
import { PDFDocumentProxy } from 'pdfjs-dist';
|
|
17
|
-
export { E as ExtractUiResult, H as HandleExtractProblemOptions, I as ImagePart, V as VisionRequest, h as handleExtractProblem } from './handleExtractProblem-C-U5KluK.js';
|
|
18
|
-
import 'zod';
|
|
19
17
|
import 'react';
|
|
20
18
|
|
|
21
19
|
interface SyncableAppState {
|
|
@@ -124,8 +122,13 @@ interface WhiteboardProps {
|
|
|
124
122
|
* `generateFigure()` on a server boundary so API credentials never reach the browser.
|
|
125
123
|
*/
|
|
126
124
|
generateGeometryFigure?: GenerateGeometryFigure;
|
|
125
|
+
/**
|
|
126
|
+
* Geometry-2d live draft. GV: package gọi callback này (debounced) với SVG hình
|
|
127
|
+
* đang dựng + vị trí chèn; `null` khi clear. Consumer broadcast cho học sinh.
|
|
128
|
+
*/
|
|
129
|
+
onGeometryDraft?: (draft: GeometryDraftPreview | null) => void;
|
|
127
130
|
}
|
|
128
|
-
declare function Whiteboard({ storageKey, readOnly, onSceneChange, onFilesChange, onApi, langCode, stamps, initialScene, initialFiles, generateGeometryFigure, }: WhiteboardProps): react_jsx_runtime.JSX.Element;
|
|
131
|
+
declare function Whiteboard({ storageKey, readOnly, onSceneChange, onFilesChange, onApi, langCode, stamps, initialScene, initialFiles, generateGeometryFigure, onGeometryDraft, }: WhiteboardProps): react_jsx_runtime.JSX.Element;
|
|
129
132
|
|
|
130
133
|
declare function pickSyncableAppState(s: AppState): SyncableAppState;
|
|
131
134
|
|
|
@@ -278,4 +281,4 @@ declare function insertPdfPages(api: ExApi, source: File | Blob | ArrayBuffer, o
|
|
|
278
281
|
*/
|
|
279
282
|
declare function parsePageRange(input: string, totalPages: number): number[];
|
|
280
283
|
|
|
281
|
-
export { ALL_STAMPS, DEFAULT_STAMPS, EXPERIMENTAL_STAMPS, type ExcalidrawSceneSnapshot, GenerateGeometryFigure, Geometry3DCustomData, GeometryCustomData, Graph2DCustomData, type InsertPdfPagesOptions, type InsertPdfPagesResult, type InsertRasterizedPagesOptions, type InsertRasterizedPagesResult, LatexCustomData, type RasterizeOptions, type RasterizedPage, STABLE_STAMPS, STAMP_CATALOG, type StampCatalogEntry, type StampCustomData, StampType, type SyncableAppState, Whiteboard, type WhiteboardProps, closePdfDocument, configurePdfWorker, findCatalogEntry, findStampForCustomData, insertPdfPages, insertRasterizedPagesIntoScene, isStampElement, loadPdfDocument, parsePageRange, pickSyncableAppState, rasterizePdf, restoreMissingStampFiles };
|
|
284
|
+
export { ALL_STAMPS, DEFAULT_STAMPS, EXPERIMENTAL_STAMPS, type ExcalidrawSceneSnapshot, GenerateGeometryFigure, Geometry3DCustomData, GeometryCustomData, GeometryDraftPreview, Graph2DCustomData, type InsertPdfPagesOptions, type InsertPdfPagesResult, type InsertRasterizedPagesOptions, type InsertRasterizedPagesResult, LatexCustomData, type RasterizeOptions, type RasterizedPage, STABLE_STAMPS, STAMP_CATALOG, type StampCatalogEntry, type StampCustomData, StampType, type SyncableAppState, Whiteboard, type WhiteboardProps, closePdfDocument, configurePdfWorker, findCatalogEntry, findStampForCustomData, insertPdfPages, insertRasterizedPagesIntoScene, isStampElement, loadPdfDocument, parsePageRange, pickSyncableAppState, rasterizePdf, restoreMissingStampFiles };
|