@xom11/whiteboard 0.24.2 → 0.25.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.
Files changed (84) hide show
  1. package/README.md +84 -11
  2. package/dist/ai.d.mts +422 -566
  3. package/dist/ai.d.ts +422 -566
  4. package/dist/ai.js +1527 -407
  5. package/dist/ai.js.map +1 -1
  6. package/dist/ai.mjs +1008 -512
  7. package/dist/ai.mjs.map +1 -1
  8. package/dist/catalog.json +4 -4
  9. package/dist/{chunk-BKSXPNPQ.mjs → chunk-AYSFWUPK.mjs} +4 -3
  10. package/dist/chunk-AYSFWUPK.mjs.map +1 -0
  11. package/dist/chunk-B4NJJZFR.mjs +18 -0
  12. package/dist/chunk-B4NJJZFR.mjs.map +1 -0
  13. package/dist/{chunk-LVNCYP4J.mjs → chunk-CJBLJUWG.mjs} +5 -5
  14. package/dist/{chunk-LVNCYP4J.mjs.map → chunk-CJBLJUWG.mjs.map} +1 -1
  15. package/dist/{chunk-7WQXXEVR.mjs → chunk-ESVPQWHX.mjs} +5 -5
  16. package/dist/{chunk-7WQXXEVR.mjs.map → chunk-ESVPQWHX.mjs.map} +1 -1
  17. package/dist/{chunk-KRC2XOIG.mjs → chunk-I24QOHPU.mjs} +3 -3
  18. package/dist/{chunk-KRC2XOIG.mjs.map → chunk-I24QOHPU.mjs.map} +1 -1
  19. package/dist/{chunk-ZBJBQKJ2.mjs → chunk-IHUFOV7L.mjs} +4 -19
  20. package/dist/chunk-IHUFOV7L.mjs.map +1 -0
  21. package/dist/{chunk-AZIARTGX.mjs → chunk-M42TGYT6.mjs} +3 -3
  22. package/dist/{chunk-AZIARTGX.mjs.map → chunk-M42TGYT6.mjs.map} +1 -1
  23. package/dist/{chunk-45CGKJ7S.mjs → chunk-NDEZJKNY.mjs} +4 -4
  24. package/dist/{chunk-45CGKJ7S.mjs.map → chunk-NDEZJKNY.mjs.map} +1 -1
  25. package/dist/{chunk-BEZSQKPY.mjs → chunk-ONBCUWVI.mjs} +5 -4
  26. package/dist/chunk-ONBCUWVI.mjs.map +1 -0
  27. package/dist/{chunk-WM2VDYQA.mjs → chunk-REIJZDVZ.mjs} +4 -3
  28. package/dist/chunk-REIJZDVZ.mjs.map +1 -0
  29. package/dist/{chunk-2WF6KIGF.mjs → chunk-TB4CL25L.mjs} +9 -8
  30. package/dist/chunk-TB4CL25L.mjs.map +1 -0
  31. package/dist/chunk-VNCCIV6O.mjs +938 -0
  32. package/dist/chunk-VNCCIV6O.mjs.map +1 -0
  33. package/dist/{chunk-CGZZO4BX.mjs → chunk-VRHWDZ66.mjs} +5 -5
  34. package/dist/{chunk-CGZZO4BX.mjs.map → chunk-VRHWDZ66.mjs.map} +1 -1
  35. package/dist/{chunk-4DS3MKID.mjs → chunk-YSJOVBCD.mjs} +4 -4
  36. package/dist/{chunk-4DS3MKID.mjs.map → chunk-YSJOVBCD.mjs.map} +1 -1
  37. package/dist/geometry-2d.d.mts +2 -2
  38. package/dist/geometry-2d.d.ts +2 -2
  39. package/dist/geometry-2d.js +1383 -23
  40. package/dist/geometry-2d.js.map +1 -1
  41. package/dist/geometry-2d.mjs +6 -5
  42. package/dist/geometry-3d.d.mts +2 -2
  43. package/dist/geometry-3d.d.ts +2 -2
  44. package/dist/geometry-3d.js +2 -2
  45. package/dist/geometry-3d.js.map +1 -1
  46. package/dist/geometry-3d.mjs +5 -4
  47. package/dist/graph-2d.d.mts +2 -2
  48. package/dist/graph-2d.d.ts +2 -2
  49. package/dist/graph-2d.js +2 -2
  50. package/dist/graph-2d.js.map +1 -1
  51. package/dist/graph-2d.mjs +8 -7
  52. package/dist/{host-ZIQ77W33.mjs → host-A64ITWVX.mjs} +7 -6
  53. package/dist/host-A64ITWVX.mjs.map +1 -0
  54. package/dist/{host-EPZCNFLH.mjs → host-L7FMFZUW.mjs} +226 -29
  55. package/dist/host-L7FMFZUW.mjs.map +1 -0
  56. package/dist/{host-LKCMYEAV.mjs → host-QK53UYMD.mjs} +11 -10
  57. package/dist/host-QK53UYMD.mjs.map +1 -0
  58. package/dist/index.d.mts +3 -3
  59. package/dist/index.d.ts +3 -3
  60. package/dist/index.js +1414 -54
  61. package/dist/index.js.map +1 -1
  62. package/dist/index.mjs +18 -17
  63. package/dist/index.mjs.map +1 -1
  64. package/dist/latex.d.mts +2 -2
  65. package/dist/latex.d.ts +2 -2
  66. package/dist/render-3WTY7NZB.mjs +9 -0
  67. package/dist/{render-SA4JTOW3.mjs.map → render-3WTY7NZB.mjs.map} +1 -1
  68. package/dist/serialize-SRJVKYUG.mjs +8 -0
  69. package/dist/{serialize-JAVOU22E.mjs.map → serialize-SRJVKYUG.mjs.map} +1 -1
  70. package/dist/{types-vtvyKGAA.d.mts → types-DWRyCa2m.d.mts} +187 -2
  71. package/dist/{types-Crbefnfe.d.ts → types-DWRyCa2m.d.ts} +187 -2
  72. package/package.json +1 -1
  73. package/dist/chunk-2WF6KIGF.mjs.map +0 -1
  74. package/dist/chunk-BEZSQKPY.mjs.map +0 -1
  75. package/dist/chunk-BKSXPNPQ.mjs.map +0 -1
  76. package/dist/chunk-WM2VDYQA.mjs.map +0 -1
  77. package/dist/chunk-ZBJBQKJ2.mjs.map +0 -1
  78. package/dist/host-EPZCNFLH.mjs.map +0 -1
  79. package/dist/host-LKCMYEAV.mjs.map +0 -1
  80. package/dist/host-ZIQ77W33.mjs.map +0 -1
  81. package/dist/render-SA4JTOW3.mjs +0 -8
  82. package/dist/serialize-JAVOU22E.mjs +0 -7
  83. package/dist/types-DxlMPh-6.d.mts +0 -49
  84. package/dist/types-DxlMPh-6.d.ts +0 -49
@@ -1 +0,0 @@
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-LKCMYEAV.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)&nbsp;=\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"]}