@xom11/whiteboard 0.27.0 → 0.28.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 (60) hide show
  1. package/dist/ai.d.mts +1 -1
  2. package/dist/ai.d.ts +1 -1
  3. package/dist/ai.js +54 -23
  4. package/dist/ai.js.map +1 -1
  5. package/dist/ai.mjs +54 -23
  6. package/dist/ai.mjs.map +1 -1
  7. package/dist/catalog.json +4 -4
  8. package/dist/{chunk-D5JLJ3PT.mjs → chunk-5JM35CXV.mjs} +4 -4
  9. package/dist/{chunk-D5JLJ3PT.mjs.map → chunk-5JM35CXV.mjs.map} +1 -1
  10. package/dist/{chunk-KYMBUTPO.mjs → chunk-BU5KLO3P.mjs} +3 -3
  11. package/dist/{chunk-KYMBUTPO.mjs.map → chunk-BU5KLO3P.mjs.map} +1 -1
  12. package/dist/{chunk-AYJPOHCI.mjs → chunk-H22OZYTW.mjs} +3 -3
  13. package/dist/{chunk-AYJPOHCI.mjs.map → chunk-H22OZYTW.mjs.map} +1 -1
  14. package/dist/{chunk-I3L56GVH.mjs → chunk-OQIQNKPQ.mjs} +3 -3
  15. package/dist/{chunk-I3L56GVH.mjs.map → chunk-OQIQNKPQ.mjs.map} +1 -1
  16. package/dist/{chunk-KZGPSTZI.mjs → chunk-QCZVFEN4.mjs} +4 -4
  17. package/dist/{chunk-KZGPSTZI.mjs.map → chunk-QCZVFEN4.mjs.map} +1 -1
  18. package/dist/{chunk-4ETJ4CDY.mjs → chunk-QRUAEXLR.mjs} +4 -4
  19. package/dist/{chunk-4ETJ4CDY.mjs.map → chunk-QRUAEXLR.mjs.map} +1 -1
  20. package/dist/{chunk-HLAOGXEK.mjs → chunk-V3YJ6JFL.mjs} +3 -3
  21. package/dist/{chunk-HLAOGXEK.mjs.map → chunk-V3YJ6JFL.mjs.map} +1 -1
  22. package/dist/{chunk-D5LWSN2Y.mjs → chunk-ZTQBUKLJ.mjs} +30 -13
  23. package/dist/chunk-ZTQBUKLJ.mjs.map +1 -0
  24. package/dist/geometry-2d.d.mts +1 -1
  25. package/dist/geometry-2d.d.ts +1 -1
  26. package/dist/geometry-2d.js +143 -33
  27. package/dist/geometry-2d.js.map +1 -1
  28. package/dist/geometry-2d.mjs +3 -3
  29. package/dist/geometry-3d.d.mts +1 -1
  30. package/dist/geometry-3d.d.ts +1 -1
  31. package/dist/geometry-3d.js +28 -11
  32. package/dist/geometry-3d.js.map +1 -1
  33. package/dist/geometry-3d.mjs +3 -3
  34. package/dist/graph-2d.d.mts +1 -1
  35. package/dist/graph-2d.d.ts +1 -1
  36. package/dist/graph-2d.js +28 -11
  37. package/dist/graph-2d.js.map +1 -1
  38. package/dist/graph-2d.mjs +3 -3
  39. package/dist/{host-M26FS244.mjs → host-2ISGVO7O.mjs} +5 -5
  40. package/dist/{host-M26FS244.mjs.map → host-2ISGVO7O.mjs.map} +1 -1
  41. package/dist/{host-HAYCJJ2T.mjs → host-4P766V4J.mjs} +110 -27
  42. package/dist/host-4P766V4J.mjs.map +1 -0
  43. package/dist/{host-LTJHAY5A.mjs → host-HOSJHQ5H.mjs} +6 -6
  44. package/dist/{host-LTJHAY5A.mjs.map → host-HOSJHQ5H.mjs.map} +1 -1
  45. package/dist/index.d.mts +9 -4
  46. package/dist/index.d.ts +9 -4
  47. package/dist/index.js +147 -35
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +17 -15
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/latex.d.mts +1 -1
  52. package/dist/latex.d.ts +1 -1
  53. package/dist/serialize-N4G6RFBB.mjs +9 -0
  54. package/dist/{serialize-C3LSUMSA.mjs.map → serialize-N4G6RFBB.mjs.map} +1 -1
  55. package/dist/{types-zc_Pa0mp.d.mts → types-BHYC2Fiw.d.mts} +25 -1
  56. package/dist/{types-zc_Pa0mp.d.ts → types-BHYC2Fiw.d.ts} +25 -1
  57. package/package.json +1 -1
  58. package/dist/chunk-D5LWSN2Y.mjs.map +0 -1
  59. package/dist/host-HAYCJJ2T.mjs.map +0 -1
  60. package/dist/serialize-C3LSUMSA.mjs +0 -9
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stamps/geometry-2d/editor/icons.tsx","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers/pointerDown/move.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/select.ts","../src/stamps/geometry-2d/editor/handlers/utils.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/point.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/singleTarget.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/polygon.ts","../src/stamps/geometry-2d/editor/handlers/finalize/lines.ts","../src/stamps/geometry-2d/editor/handlers/classifyPointVsCircle.ts","../src/stamps/geometry-2d/editor/handlers/finalize/shared.ts","../src/stamps/geometry-2d/editor/handlers/finalize/circles.ts","../src/stamps/geometry-2d/editor/handlers/finalize/points.ts","../src/stamps/geometry-2d/editor/handlers/finalize/polygons.ts","../src/stamps/geometry-2d/editor/handlers/finalize/measure.ts","../src/stamps/geometry-2d/editor/handlers/finalize/registry.ts","../src/stamps/geometry-2d/editor/handlers/finalizeShape.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/handlers/transform.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/multiClick.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/index.ts","../src/stamps/geometry-2d/editor/handlers/pointerMove.ts","../src/stamps/geometry-2d/editor/handlers/pointerUp.ts","../src/stamps/geometry-2d/editor/hitTest.ts","../src/stamps/geometry-2d/editor/snapshot.ts","../src/stamps/geometry-2d/editor/preview.ts","../src/stamps/geometry-2d/editor/previewActions.ts","../src/stamps/geometry-2d/editor/attrMapping.ts","../src/stamps/geometry-2d/editor/buildHandle.ts","../src/stamps/geometry-2d/editor/idResolvers.ts","../src/stamps/geometry-2d/editor/useAxisGridSync.ts","../src/stamps/geometry-2d/editor/useEditorShortcuts.ts","../src/stamps/geometry-2d/editor/useJxgSceneIdMap.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/MultiPropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/geometry-2d/editor/useAiFigure.ts","../src/stamps/geometry-2d/editor/AiFigurePrompt.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/geometry-2d/editor/dslRenderRow.tsx","../src/stamps/geometry-2d/host.tsx"],"names":["id","label","sc","jxgFromSceneId","useEffect","MiniBoard2D","useRef","jxgIdToSceneId","screenCoordsOf","objectsAt","clearPreviewSegs","removePhantom","jsx","jsxs","useState","rect","w","left","top","Icons","useLayoutEffect","createPortal","useMemo","unsupported","useCallback","forwardRef","GeometryEditorPanelInner","useImperativeHandle","GeometryEditorPanel","GeometryStampHost","Fragment"],"mappings":"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","file":"host-HAYCJJ2T.mjs","sourcesContent":["import React from 'react';\n\n// Design system:\n// - Main strokes use currentColor → respect active state (white-on-emerald).\n// - 4 accent colors stay fixed across states:\n// point → blue dot (signature từ GeoGebra)\n// construct → red dashed/solid helper line (perpendicular, bisector, parallel, tangent)\n// fill → orange polygon/area fill (light)\n// arc → emerald arc cho measurement\n// - ViewBox 24×24, stroke 1.4–1.7, round caps cho cảm giác sketch-like.\nconst C_POINT = '#2563eb';\nconst C_CONSTRUCT = '#dc2626';\nconst C_FILL = '#f59e0b';\nconst C_ARC = '#059669';\n\nexport const Icon = {\n // ===== Basic =====\n cursor: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\"\n fill=\"currentColor\" fillOpacity=\"0.12\"\n stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\"\n />\n </svg>\n ),\n select: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <rect x=\"2.5\" y=\"2.5\" width=\"14\" height=\"14\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"2 1.8\"/>\n <path d=\"M10 10 L21 14.5 L14.5 16 L12.5 22 Z\" fill=\"currentColor\" fillOpacity=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n ),\n\n // ===== Point =====\n point: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9.5\" cy=\"14\" r=\"3.2\" fill={C_POINT}/>\n <text x=\"13.5\" y=\"10.5\" fontSize=\"9.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill={C_POINT}>A</text>\n </svg>\n ),\n midpoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"4\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n perpFoot: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Base line ngang (input — currentColor) */}\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n {/* Vertical dashed line từ BLUE point xuống chân (construct/red) */}\n <line x1=\"9\" y1=\"5\" x2=\"9\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n {/* Right-angle mark tại chân */}\n <rect x=\"9\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n {/* BLUE point gốc */}\n <circle cx=\"9\" cy=\"5\" r=\"2\" fill={C_POINT}/>\n {/* RED point chân (output) */}\n <circle cx=\"9\" cy=\"17\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n intersect: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <path d=\"M3 5 L21 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <path d=\"M21 5 L3 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Line =====\n segment: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"18\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"6\" r=\"2.2\" fill={C_POINT}/>\n </svg>\n ),\n line: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"21\" x2=\"22\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"8.5\" cy=\"15.5\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"15.5\" cy=\"8.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n ray: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n vector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"18\" y2=\"6\"/>\n <polyline points=\"13,5 19,5 19,11\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2\" fill={C_POINT} stroke=\"none\"/>\n </svg>\n ),\n\n // ===== Construct =====\n perpendicular: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <rect x=\"12\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n <circle cx=\"12\" cy=\"17\" r=\"1.8\" fill={C_POINT}/>\n </svg>\n ),\n parallel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Đường đen = đã có (input). Đường đỏ = đường song song mới dựng đi qua điểm xanh. */}\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"2\" y1=\"19\" x2=\"22\" y2=\"16\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"17.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n perpBisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"22\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n <circle cx=\"4\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n </svg>\n ),\n bisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"23\" y2=\"11\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n </svg>\n ),\n\n // ===== Polygon =====\n polygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"6,5 18,6 22,14 13,21 4,16\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"6\" cy=\"5\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"6\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"22\" cy=\"14\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"21\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"16\" r=\"1.5\" fill={C_POINT}/>\n </svg>\n ),\n regularPolygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"12,3 20.5,8 20.5,16 12,21 3.5,16 3.5,8\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"3\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"20.5\" cy=\"8\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n\n // ===== Circle =====\n circleCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"11\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n semicircle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Nửa đường tròn emerald-arc, 2 endpoint blue ở đáy */}\n <path d=\"M 4 16 A 8 8 0 0 1 20 16\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <circle cx=\"4\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n arcCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tâm blue (lớn) + cung emerald + 2 đầu cung blue (nhỏ), 2 bán kính nét đứt */}\n <path d=\"M 6 6 A 9 9 0 0 1 18 18\" stroke={C_ARC} strokeWidth=\"1.7\" fill=\"none\"/>\n <line x1=\"12\" y1=\"12\" x2=\"6\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <line x1=\"12\" y1=\"12\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"6\" cy=\"6\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"18\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n arc3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle arc đi qua 3 điểm: (4,17), (12,9), (20,17). Tâm (12,17), r=8. */}\n <path d=\"M 4 17 A 8 8 0 0 1 20 17\" stroke={C_ARC} strokeWidth=\"1.8\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"9\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n sectorCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tâm blue + 2 bán kính + cung emerald + fill orange */}\n <path d=\"M 12 12 L 5 7 A 8.6 8.6 0 0 1 19 7 Z\"\n fill={C_FILL} fillOpacity=\"0.25\"\n stroke={C_ARC} strokeWidth=\"1.6\"/>\n <line x1=\"12\" y1=\"12\" x2=\"5\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <line x1=\"12\" y1=\"12\" x2=\"19\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n circle3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n tangent: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle C=(10,13) r=5; external point P=(20,4); tangent points T1≈(14.5,15.2), T2≈(8.3,8.3) */}\n <circle cx=\"10\" cy=\"13\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"20\" y1=\"4\" x2=\"14.5\" y2=\"15.2\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <line x1=\"20\" y1=\"4\" x2=\"8.3\" y2=\"8.3\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <circle cx=\"20\" cy=\"4\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"14.5\" cy=\"15.2\" r=\"1.4\" fill={C_CONSTRUCT}/>\n <circle cx=\"8.3\" cy=\"8.3\" r=\"1.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Triangle centers =====\n centroid: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tam giác outline + fill orange nhạt */}\n <polygon points=\"4,20 20,20 12,4\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 3 medians: vertex → midpoint cạnh đối diện (xám dashed) */}\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"20\" y1=\"20\" x2=\"8\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.5\" fill={C_POINT}/>\n {/* Trọng tâm RED tại giao 3 medians */}\n <circle cx=\"12\" cy=\"14.67\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n circumcenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Đường tròn ngoại tiếp */}\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Tam giác nội tiếp */}\n <polygon points=\"12,3 21,16 3,16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"12\" cy=\"3\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"3\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm ngoại tiếp RED */}\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n incenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 12,4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Đường tròn nội tiếp */}\n <circle cx=\"12\" cy=\"14\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm nội tiếp RED */}\n <circle cx=\"12\" cy=\"14\" r=\"2.2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n orthocenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 8,5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 2 altitudes (dashed red) — đủ giao điểm */}\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"20\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <line x1=\"3\" y1=\"20\" x2=\"14.5\" y2=\"11.5\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"8\" cy=\"5\" r=\"1.6\" fill={C_POINT}/>\n {/* Trực tâm RED — giao 2 altitudes */}\n <circle cx=\"8\" cy=\"14.5\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Measure =====\n angle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M14 20 A 10 10 0 0 0 11 13.4\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n distance: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <line x1=\"5\" y1=\"16\" x2=\"19\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n <circle cx=\"5\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <text x=\"8.5\" y=\"11\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm</text>\n </svg>\n ),\n area: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"4,10 14,3.5 21,12 16,21 5,18\" fill={C_FILL} fillOpacity=\"0.32\" stroke={C_FILL} strokeWidth=\"1.4\"/>\n <text x=\"1.5\" y=\"8\" fontSize=\"6.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm²</text>\n </svg>\n ),\n\n // ===== Edit =====\n toggleLabel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <text x=\"1.5\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\">A</text>\n <text x=\"12\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" fillOpacity=\"0.35\">A</text>\n </svg>\n ),\n toggleVisible: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"8\" cy=\"12\" r=\"3.2\" fill={C_POINT}/>\n <circle cx=\"17\" cy=\"12\" r=\"3.2\" fill=\"none\" stroke={C_POINT} strokeWidth=\"1.6\"/>\n </svg>\n ),\n trash: (\n // Eraser hình bình hành — GeoGebra dùng eraser, không phải trash bin.\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <path d=\"M14.5 3 L21 9.5 L11.5 19 L4 19 L4 11.5 Z\" fill=\"currentColor\" fillOpacity=\"0.14\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"9.5\" y1=\"8\" x2=\"16\" y2=\"14.5\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n </svg>\n ),\n\n // ===== Transform =====\n // Style chung: BLUE = input (điểm gốc / tâm), RED = output (ảnh sau biến hình).\n // Mảnh, ít chi tiết — focus vào quan hệ điểm gốc ↔ ảnh.\n translate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Vector tịnh tiến rời (mũi tên đen) — START thẳng hàng dọc với chấm xanh (x=7), xuống dưới đáy icon, song song với gốc→ảnh */}\n <line x1=\"7\" y1=\"21\" x2=\"12.5\" y2=\"16.25\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n <polyline points=\"11.94,17.85 12.5,16.25 10.83,16.57\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\"/>\n {/* Điểm gốc BLUE → mũi tên xám → ảnh RED (cùng hướng vector trên) */}\n <line x1=\"7\" y1=\"15\" x2=\"18\" y2=\"5.5\" stroke=\"#94a3b8\" strokeWidth=\"1.4\"/>\n <polyline points=\"15.54,5.97 18,5.5 17.18,7.86\" stroke=\"#94a3b8\" strokeWidth=\"1.4\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"15\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"5.5\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n rotate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Tâm quay BLUE (lớn) ở dưới + 2 bán kính + cung α (centered tại vertex, bulge lên) + α + gốc BLUE → ảnh RED */}\n <line x1=\"12\" y1=\"18\" x2=\"20\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n <line x1=\"12\" y1=\"18\" x2=\"4\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n {/* Arc r=4 quanh vertex (12,18): start (14.22,14.67) → end (9.34,15.01), short arc bulge UP */}\n <path d=\"M 14.22 14.67 A 4 4 0 0 0 9.34 15.01\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\"/>\n <text x=\"10\" y=\"14\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">α</text>\n <circle cx=\"12\" cy=\"18\" r=\"2.4\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"20\" cy=\"6\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"9\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectLine: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Trục đối xứng (đường đen chéo) */}\n <line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n {/* Điểm gốc BLUE (phía trên trục) + ảnh RED (phía dưới trục, đối xứng) */}\n <circle cx=\"5\" cy=\"11\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"19\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectPoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Điểm gốc BLUE + tâm BLUE (lớn hơn) + ảnh RED, thẳng hàng & cách đều */}\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.45\"/>\n <circle cx=\"5\" cy=\"19\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"19\" cy=\"5\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n dilate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tâm vị tự BLUE + điểm gốc BLUE (gần tâm) + ảnh RED (xa hơn) — chừa chỗ cho k phía trên đường */}\n <line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"4\" cy=\"19\" r=\"2.2\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"8\" cy=\"15.5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"5.7\" r=\"1.9\" fill={C_CONSTRUCT}/>\n <text x=\"10.5\" y=\"10.5\" fontSize=\"8\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">k</text>\n </svg>\n ),\n\n // ===== Special shapes =====\n square: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"5\" y=\"5\" width=\"14\" height=\"14\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n rectangle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"7\" width=\"18\" height=\"10\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"3\" cy=\"17\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"17\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"7\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n rhombus: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M 12 3 L 21 12 L 12 21 L 3 12 Z\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"3\" cy=\"12\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"21\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"12\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n parallelogram: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M 5 19 L 21 19 L 19 5 L 3 5 Z\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"3\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"19\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n isoTrapezoid: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M 3 19 L 21 19 L 17 5 L 7 5 Z\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"3\" cy=\"19\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"19\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"7\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n isoTriangle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M 12 4 L 21 20 L 3 20 Z\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"3\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.7\" fill={C_POINT}/>\n {/* dashed perpendicular bisector hint */}\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" stroke={C_CONSTRUCT} strokeWidth=\"0.8\" strokeDasharray=\"1.5 1.5\" opacity=\"0.7\"/>\n </svg>\n ),\n rightTriangle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M 4 20 L 20 20 L 4 4 Z\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n {/* right-angle marker */}\n <path d=\"M 4 17 L 7 17 L 7 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <circle cx=\"4\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"4\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n\n // ===== Nâng cao / kind chưa có icon =====\n excenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5 16 L12 5 L19 16 Z\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"20\" r=\"3\" fill=\"none\" stroke={C_CONSTRUCT} strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"20\" r=\"1.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n tangencyPoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"10\" cy=\"12\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <line x1=\"16.5\" y1=\"3\" x2=\"16.5\" y2=\"21\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"16.5\" cy=\"12\" r=\"2.2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n secondIntersection: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"12\" r=\"6.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <line x1=\"2\" y1=\"8\" x2=\"22\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"6.2\" cy=\"9.6\" r=\"1.6\" fill=\"currentColor\"/>\n <circle cx=\"15.8\" cy=\"14.4\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n arcMidpoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <path d=\"M4 17 A 9 9 0 0 1 20 17\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n <circle cx=\"4\" cy=\"17\" r=\"1.6\" fill=\"currentColor\"/>\n <circle cx=\"20\" cy=\"17\" r=\"1.6\" fill=\"currentColor\"/>\n <circle cx=\"12\" cy=\"8.2\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n circleIntersection: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9\" cy=\"12\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"15\" cy=\"12\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"7.6\" r=\"2\" fill={C_CONSTRUCT}/>\n <circle cx=\"12\" cy=\"16.4\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n tangentPointExt: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <circle cx=\"14\" cy=\"12\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"3.5\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <line x1=\"3.5\" y1=\"12\" x2=\"17.5\" y2=\"7.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <line x1=\"3.5\" y1=\"12\" x2=\"17.5\" y2=\"16.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <circle cx=\"17.5\" cy=\"7.5\" r=\"1.8\" fill={C_CONSTRUCT}/>\n <circle cx=\"17.5\" cy=\"16.5\" r=\"1.8\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n circleCR: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"7.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <line x1=\"12\" y1=\"12\" x2=\"19.5\" y2=\"12\" stroke={C_CONSTRUCT} strokeWidth=\"1.3\"/>\n </svg>\n ),\n incircle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 19 L12 4 L21 19 Z\" stroke=\"currentColor\" strokeWidth=\"1.3\" strokeLinejoin=\"round\"/>\n <circle cx=\"12\" cy=\"14\" r=\"4.2\" fill=\"none\" stroke={C_CONSTRUCT} strokeWidth=\"1.3\"/>\n </svg>\n ),\n excircle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M6 9 L14 4 L18 13 Z\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n <circle cx=\"9\" cy=\"17\" r=\"4.6\" fill=\"none\" stroke={C_CONSTRUCT} strokeWidth=\"1.3\"/>\n </svg>\n ),\n pointOn: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"7.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"17.3\" cy=\"6.7\" r=\"2.4\" fill={C_POINT}/>\n </svg>\n ),\n};\n\nexport const GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport function UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nexport function RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"21 7 21 13 15 13\" />\n <path d=\"M20.49 13a9 9 0 1 1-2.12-9.36L21 7\" />\n </svg>\n );\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi MiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'perpFoot'\n | 'intersect'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'semicircle'\n | 'arcCenter'\n | 'arc3'\n | 'sectorCenter'\n | 'circle3'\n | 'tangent'\n | 'centroid'\n | 'circumcenter'\n | 'incenter'\n | 'orthocenter'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate'\n | 'square'\n | 'rectangle'\n | 'rhombus'\n | 'parallelogram'\n | 'isoTrapezoid'\n | 'isoTriangle'\n | 'rightTriangle'\n | 'excenter'\n | 'tangencyPoint'\n | 'secondIntersection'\n | 'arcMidpoint'\n | 'circleIntersection'\n | 'tangentPointExt'\n | 'circleCR'\n | 'incircle'\n | 'excircle'\n | 'pointOn';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'triangle'\n | 'measure'\n | 'edit'\n | 'transform'\n | 'special'\n | 'advanced';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. 'lineOrCircle' = line hoặc circle (loại trừ point). 'pointOrLine' = point hoặc line/đoạn (loại trừ circle). */\n accepts?: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'>;\n}\n\n// ============== Tool icons — imported from icons.tsx ==============\nimport { Icon } from './icons';\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'perpFoot', label: 'Chân đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpFoot, group: 'point', needs: 2, accepts: ['point', 'line'] },\n { key: 'intersect', label: 'Giao điểm của 2 đối tượng', hint: 'Click 2 đường/đường tròn có sẵn', icon: Icon.intersect, group: 'point', needs: 2, accepts: ['lineOrCircle', 'lineOrCircle'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm (đỉnh ở giữa) hoặc 2 đường/đoạn (sẽ tạo 2 tia phân giác)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['pointOrLine', 'pointOrLine', 'pointOrLine'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'semicircle', label: 'Nửa đường tròn (đường kính)', hint: 'Click 2 điểm — bán nguyệt qua đường kính', icon: Icon.semicircle, group: 'circle', needs: 2 },\n { key: 'arcCenter', label: 'Cung tròn (tâm + 2 điểm)', hint: 'Click tâm O → A → B (cung từ A đến B)', icon: Icon.arcCenter, group: 'circle', needs: 3 },\n { key: 'arc3', label: 'Cung tròn qua 3 điểm', hint: 'Click 3 điểm trên cung', icon: Icon.arc3, group: 'circle', needs: 3 },\n { key: 'sectorCenter', label: 'Hình quạt (tâm + 2 điểm)', hint: 'Click tâm O → A → B (quạt OAB)', icon: Icon.sectorCenter, group: 'circle', needs: 3 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'centroid', label: 'Trọng tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.centroid, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'circumcenter', label: 'Tâm đường tròn ngoại tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.circumcenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'incenter', label: 'Tâm đường tròn nội tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.incenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'orthocenter', label: 'Trực tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.orthocenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n // ===== Hình đặc biệt (parametric construction) =====\n { key: 'square', label: 'Hình vuông', hint: 'Click 2 điểm — cạnh đầu (3 đỉnh còn lại tự suy, vuông góc + bằng cạnh)',\n icon: Icon.square, group: 'special', needs: 2, accepts: ['point', 'point'] },\n { key: 'rectangle', label: 'Hình chữ nhật', hint: 'Click 2 điểm đáy + 1 điểm chiều cao (auto vuông góc tại đỉnh 2)',\n icon: Icon.rectangle, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'rhombus', label: 'Hình thoi', hint: 'Click 2 điểm cạnh + 1 điểm hướng (auto bằng độ dài cạnh)',\n icon: Icon.rhombus, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'parallelogram', label: 'Hình bình hành', hint: 'Click 3 điểm liên tiếp (đỉnh 4 tự suy)',\n icon: Icon.parallelogram, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'isoTrapezoid', label: 'Hình thang cân', hint: 'Click 2 điểm đáy lớn + 1 đỉnh trên (đỉnh 4 phản chiếu qua trung trực)',\n icon: Icon.isoTrapezoid, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'isoTriangle', label: 'Tam giác cân', hint: 'Click 2 điểm đáy + 1 đỉnh (auto trên trung trực)',\n icon: Icon.isoTriangle, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'rightTriangle', label: 'Tam giác vuông', hint: 'Click đỉnh vuông + 2 đầu cạnh (cạnh 2 auto vuông góc)',\n icon: Icon.rightTriangle, group: 'special', needs: 3, accepts: ['point', 'point', 'point'] },\n // ===== Điểm / đường tròn thông dụng (kind chưa có icon trước v0.27) =====\n { key: 'pointOn', label: 'Điểm trên đối tượng', hint: 'Click 1 đường/đoạn/đường tròn có sẵn', icon: Icon.pointOn, group: 'point', needs: 1, accepts: ['lineOrCircle'] },\n { key: 'circleCR', label: 'Đường tròn (tâm + bán kính)', hint: 'Click tâm rồi nhập bán kính', icon: Icon.circleCR, group: 'circle', needs: 1, accepts: ['point'] },\n { key: 'incircle', label: 'Đường tròn nội tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.incircle, group: 'circle', needs: 3, accepts: ['point', 'point', 'point'] },\n // ===== Nâng cao =====\n { key: 'excenter', label: 'Tâm đường tròn bàng tiếp', hint: 'Click 3 đỉnh tam giác (đỉnh đầu = đỉnh đối diện)', icon: Icon.excenter, group: 'advanced', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'excircle', label: 'Đường tròn bàng tiếp', hint: 'Click 3 đỉnh tam giác (đỉnh đầu = đỉnh đối diện)', icon: Icon.excircle, group: 'advanced', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'tangencyPoint', label: 'Tiếp điểm (đường tiếp xúc)', hint: 'Click 1 đường tròn + 1 tiếp tuyến có sẵn', icon: Icon.tangencyPoint, group: 'advanced', needs: 2, accepts: ['circle', 'line'] },\n { key: 'secondIntersection', label: 'Giao điểm thứ hai', hint: 'Click 1 đường + 1 đường tròn + giao điểm đã biết', icon: Icon.secondIntersection, group: 'advanced', needs: 3, accepts: ['line', 'circle', 'point'] },\n { key: 'arcMidpoint', label: 'Điểm giữa cung', hint: 'Click đường tròn → 2 đầu cung A,B → 1 điểm phía cung KHÔNG chứa', icon: Icon.arcMidpoint, group: 'advanced', needs: 4, accepts: ['circle', 'point', 'point', 'point'] },\n { key: 'circleIntersection', label: 'Giao 2 đường tròn', hint: 'Click 2 đường tròn (tạo cả 2 giao điểm)', icon: Icon.circleIntersection, group: 'advanced', needs: 2, accepts: ['circle', 'circle'] },\n { key: 'tangentPointExt', label: 'Tiếp điểm từ điểm ngoài', hint: 'Click 1 điểm ngoài + 1 đường tròn (tạo cả 2 tiếp điểm)', icon: Icon.tangentPointExt, group: 'advanced', needs: 2, accepts: ['point', 'circle'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n triangle: 'Tam giác',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n special: 'Hình đặc biệt',\n advanced: 'Nâng cao',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'triangle',\n 'measure',\n 'edit',\n 'transform',\n 'special',\n 'advanced',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n \ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching.\n *\n * Ưu tiên `elementClass` (numeric constant do JSXGraph set đúng cho mọi derived\n * element — intersection, reflection, glider, parallelpoint, mirrorpoint, ...\n * đều trả về OBJECT_CLASS_POINT). Nếu không có (test mocks), fallback sang\n * `elType` string với danh sách mở rộng các kiểu thường gặp.\n *\n * Constants từ JSXGraph: OBJECT_CLASS_POINT=1, OBJECT_CLASS_LINE=2, OBJECT_CLASS_CIRCLE=3.\n */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const ec = typeof obj.elementClass === 'number' ? obj.elementClass : null;\n if (ec === 1) return 'point';\n if (ec === 2) return 'line';\n if (ec === 3) return 'circle';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (\n e === 'point' || e === 'glider' || e === 'midpoint' ||\n e === 'intersection' || e === 'otherintersection' ||\n e === 'reflection' || e === 'mirrorpoint' || e === 'mirrorelement' ||\n e === 'orthogonalprojection' || e === 'parallelpoint'\n ) return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n if (a === 'lineOrCircle') return kind === 'line' || kind === 'circle';\n if (a === 'pointOrLine') return kind === 'point' || kind === 'line';\n return a === kind;\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \nexport function handleMoveTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n\n // Click-select trong move tool (chế độ cơ bản): cho phép chọn 1 / shift-add\n // mà không cần switch sang tool 'select'. Hành vi drag điểm + pan nền của\n // JSXGraph vẫn nguyên (selection chỉ là side-effect, không stopPropagation).\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n return;\n }\n // Empty space + không additive: clear selection (popover sẽ tự đóng qua\n // selectionTick effect ở MiniBoard).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \nexport function handleSelectTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n // Ưu tiên điểm: exact hit → nearest-within-12px → mới đến hit khác (line/circle).\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee.\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","import type { HandlerCtx } from './ctx';\n\nexport type SceneObj = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: Record<string, unknown>;\n};\n\nexport function freshId(ctx: HandlerCtx, prefix: string): string {\n const counter = ctx.store.getState().counter;\n // Loop until unique (counter is monotonic but ids may have been deleted/reused\n // in non-trivial scenarios; safer to probe).\n let n = counter + 1;\n let id = `${prefix}_${n}`;\n const objs = ctx.store.getState().objects;\n while (id in objs) {\n n += 1;\n id = `${prefix}_${n}`;\n }\n return id;\n}\n\nexport function mkSceneObj(\n id: string,\n kind: string,\n label: string,\n attrs: Record<string, unknown>,\n): SceneObj {\n return {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n}\n\n/** Tạo point free + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddFreePoint(ctx: HandlerCtx, x: number, y: number): string {\n const id = freshId(ctx, 'p');\n const label = ctx.nextLabel('point');\n const obj = mkSceneObj(id, 'point', label, { constraint: { kind: 'free', x, y } });\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\n/** Tạo intersection point + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddIntersection(\n ctx: HandlerCtx,\n attrs: Record<string, unknown>,\n): string {\n const id = freshId(ctx, 'X');\n const label = ctx.nextLabel('intersection');\n const obj = mkSceneObj(id, 'intersection', label, attrs);\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, dispatchAddIntersection } from '../utils';\n\n \ntype JxgObj = any;\n\nexport function handlePointTool(\n ctx: HandlerCtx,\n \n _e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n): void {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.jxgIdToSceneId(a);\n const bId = ctx.jxgIdToSceneId(b);\n if (aId && bId) {\n try {\n const aKind = objKind(a);\n const bKind = objKind(b);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: aId, ref2: bId });\n return;\n }\n // line-circle / circle-circle: pick branch nearest click.\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const branch: 0 | 1 = d0 <= d1 ? 0 : 1;\n const isLineCircle = (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n if (isLineCircle) {\n dispatchAddIntersection(ctx, { kind: 'lineCircle', ref1: aId, ref2: bId, branch });\n } else {\n dispatchAddIntersection(ctx, { kind: 'circleCircle', ref1: aId, ref2: bId, branch });\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n dispatchAddFreePoint(ctx, x, y);\n}\n","import type { ToolDef, GeomTool } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \ntype JxgObj = any;\n\nexport function handleSingleTargetTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n \n e: any,\n bestHit: JxgObj | null,\n): boolean {\n if (!(toolDef.needs === 1 && toolDef.accepts)) return false;\n const hit = bestHit ?? ctx.findNearestPointJxg(e, 12);\n if (!hit) {\n ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return true;\n }\n const sid = ctx.jxgIdToSceneId(hit);\n if (!sid) return true;\n if (t === 'delete') {\n ctx.store.dispatch({ type: 'DELETE', payload: { id: sid } });\n return true;\n }\n if (t === 'toggleLabel') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n const cur = (obj.attrs as { showLabel?: boolean }).showLabel;\n const next = !(cur ?? false);\n ctx.store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: sid, patch: { showLabel: next } } });\n return true;\n }\n if (t === 'toggleVisible') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n ctx.store.dispatch({ type: 'UPDATE', payload: { id: sid, patch: { visible: !obj.visible } } });\n return true;\n }\n return true;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { GeomTool, ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, freshId, mkSceneObj } from '../utils';\n\n \ntype JxgObj = any;\n\nexport function handlePolygonTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n \n e: any,\n x: number,\n y: number,\n bestHit: JxgObj | null,\n): boolean {\n if (toolDef.needs !== -1) return false;\n const snappedPoint: JxgObj | null =\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n const snappedId = snappedPoint ? ctx.jxgIdToSceneId(snappedPoint) : null;\n // Close ring: click back on first pending point.\n if (\n ctx.pendingIdsRef.current.length >= 3 &&\n snappedId &&\n snappedId === ctx.pendingIdsRef.current[0]\n ) {\n ctx.clearPreviewSegs();\n const vertices = ctx.pendingIdsRef.current.slice();\n const isArea = t === 'area';\n const id = freshId(ctx, isArea ? 'area' : 'poly');\n const label = ctx.nextLabel('polygon');\n // Tool 'area' = polygon + showValue + fill phân biệt visual với polygon\n // thường. JSXGraph polygon.Area() live-update khi đỉnh di chuyển.\n const attrs: Record<string, unknown> = { vertices };\n if (isArea) {\n attrs.showValue = true;\n attrs.fillOpacity = 0.18;\n attrs.color = '#1d4ed8';\n }\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, attrs) },\n });\n ctx.clearPending();\n return true;\n }\n if (snappedId && ctx.pendingIdsRef.current.includes(snappedId)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return true;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex.\n let pickId: string | null = snappedId;\n let pickJxg: JxgObj | null = snappedPoint;\n if (!pickId) {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pickJxg = ctx.jxgFromSceneId(pickId);\n }\n // Live preview segment from previous vertex to new pick.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current && pickJxg) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pickJxg], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n if (pickJxg) ctx.pendingRef.current.push(pickJxg);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n return true;\n}\n","import type { GeometryToolModule } from './_types';\nimport type { HandlerCtx } from '../ctx';\nimport { objKind } from '../../tools';\nimport { freshId, mkSceneObj } from '../utils';\nimport { classifyPointVsCircle } from '../classifyPointVsCircle';\nimport { findPickIdByKind } from './shared';\n\nexport const segmentTool: GeometryToolModule = {\n key: 'segment',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: ids[0], p2: ids[1] }) },\n });\n },\n};\n\nexport const lineTool: GeometryToolModule = {\n key: 'line',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: ids[0], p2: ids[1] }) },\n });\n },\n};\n\n/** Shared body cho perpendicular & parallel (order-flexible point+line). */\nfunction finalizePerpParallel(ctx: HandlerCtx, key: 'perpendicular' | 'parallel'): void {\n const throughPoint = findPickIdByKind(ctx, 'point');\n const toLine = findPickIdByKind(ctx, 'line');\n if (!throughPoint || !toLine) return;\n const id = freshId(ctx, key === 'perpendicular' ? 'perp' : 'par');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: key, throughPoint, toLine },\n }) },\n });\n}\n\nexport const perpendicularTool: GeometryToolModule = {\n key: 'perpendicular',\n finalize(ctx) {\n finalizePerpParallel(ctx, 'perpendicular');\n },\n};\n\nexport const parallelTool: GeometryToolModule = {\n key: 'parallel',\n finalize(ctx) {\n finalizePerpParallel(ctx, 'parallel');\n },\n};\n\nexport const perpBisectorTool: GeometryToolModule = {\n key: 'perpBisector',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'pb');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'perpBisector', p1: ids[0], p2: ids[1] },\n }) },\n });\n },\n};\n\nexport const angleBisectorTool: GeometryToolModule = {\n key: 'angleBisector',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const picks = ctx.pendingRef.current;\n // Mode 2-line: 2 picks đều là line/segment → tạo 2 scene line (2 tia\n // phân giác vuông góc với nhau qua giao điểm 2 đường).\n if (picks.length === 2 && objKind(picks[0]) === 'line' && objKind(picks[1]) === 'line') {\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisectorLines', line1: ids[0], line2: ids[1], branch },\n }) },\n });\n }\n return;\n }\n // Mode 3-point: behavior cũ.\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisector', p1: ids[0], vertex: ids[1], p2: ids[2] },\n }) },\n });\n },\n};\n\nexport const tangentTool: GeometryToolModule = {\n key: 'tangent',\n finalize(ctx) {\n const throughId = findPickIdByKind(ctx, 'point');\n const circleId = findPickIdByKind(ctx, 'circle');\n if (!throughId || !circleId) return;\n // Lấy JXG object tương ứng để classify vị trí P vs đường tròn.\n // pendingRef + pendingIdsRef cùng index → match qua indexOf id.\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n const through = picks[ids.indexOf(throughId)];\n const circle = picks[ids.indexOf(circleId)];\n const pos = classifyPointVsCircle(through, circle);\n if (pos === 'inside') {\n ctx.toast?.('Điểm nằm trong đường tròn — không có tiếp tuyến', {\n variant: 'warning',\n id: 'tangent-invalid-inside',\n });\n return;\n }\n if (pos === 'on') {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch: 'on' },\n }) },\n });\n return;\n }\n // outside → 2 scene element riêng, mỗi cái 1 nhánh tiếp tuyến.\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch },\n }) },\n });\n }\n },\n};\n\nexport const rayTool: GeometryToolModule = {\n key: 'ray',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: ids[0], through: ids[1] }) },\n });\n },\n};\n\nexport const vectorTool: GeometryToolModule = {\n key: 'vector',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: ids[0], to: ids[1] }) },\n });\n },\n};\n"," \ntype JxgObj = any;\n\nexport type PointVsCircle = 'inside' | 'on' | 'outside';\n\n/**\n * Classify a JXG point's position relative to a JXG circle.\n *\n * Uses a relative epsilon (max(1e-9, 1e-6 * r)) for the on-circle check so\n * that user-snapped points (which may carry tiny floating-point error)\n * register as on the circle rather than just inside/outside.\n *\n * Defensive: if either argument is null/undefined, returns 'inside' so the\n * caller will refuse to draw rather than risk a wrong tangent.\n */\nexport function classifyPointVsCircle(point: JxgObj, circle: JxgObj): PointVsCircle {\n if (!point || !circle || !circle.center) return 'inside';\n const dx = point.X() - circle.center.X();\n const dy = point.Y() - circle.center.Y();\n const d = Math.hypot(dx, dy);\n const r = typeof circle.Radius === 'function' ? circle.Radius() : Number(circle.radius);\n if (!Number.isFinite(d) || !Number.isFinite(r)) return 'inside';\n const eps = Math.max(1e-9, 1e-6 * r);\n if (Math.abs(d - r) <= eps) return 'on';\n return d < r ? 'inside' : 'outside';\n}\n","// finalize/shared.ts\nimport { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n/**\n * Tìm scene id của pending pick theo `objKind`. Dùng cho tool order-flexible\n * (perpendicular, parallel, tangent): user có thể click điểm trước hay đường\n * trước, finalizeShape dò pendingRef theo kind để biết role.\n */\nexport function findPickIdByKind(ctx: HandlerCtx, kind: 'point' | 'line' | 'circle'): string | null {\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n for (let i = 0; i < picks.length; i += 1) {\n if (objKind(picks[i]) === kind && ids[i]) return ids[i];\n }\n return null;\n}\n\n// ─── Helpers cho special-shape constraint promotion ─────────────────────────\n\nexport type Vec = { x: number; y: number };\n\nexport function readJxgPos(ctx: HandlerCtx, id: string): Vec {\n\n const j = ctx.jxgFromSceneId(id) as any;\n if (!j || typeof j.X !== 'function') return { x: 0, y: 0 };\n return { x: j.X(), y: j.Y() };\n}\n\n/** Signed scalar offset của P từ T dọc theo perp(A→B) chuẩn hoá. */\nexport function computePerpendicularT(P: Vec, T: Vec, A: Vec, B: Vec): number {\n const dx = B.x - A.x, dy = B.y - A.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-12) return 0;\n const ux = -dy / len, uy = dx / len;\n return (P.x - T.x) * ux + (P.y - T.y) * uy;\n}\n\n/** Signed scalar offset của P từ midpoint(A,B) dọc theo perp(A→B) chuẩn hoá. */\nexport function computePerpBisectorT(P: Vec, A: Vec, B: Vec): number {\n const Mx = (A.x + B.x) / 2, My = (A.y + B.y) / 2;\n const dx = B.x - A.x, dy = B.y - A.y;\n const len = Math.hypot(dx, dy);\n if (len < 1e-12) return 0;\n const ux = -dy / len, uy = dx / len;\n return (P.x - Mx) * ux + (P.y - My) * uy;\n}\n\nexport function computeCircleTheta(P: Vec, C: Vec): number {\n return Math.atan2(P.y - C.y, P.x - C.x);\n}\n","import type { GeometryToolModule } from './_types';\nimport { freshId, mkSceneObj } from '../utils';\n\nexport const circleCenterTool: GeometryToolModule = {\n key: 'circleCenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n center: ids[0],\n surfacePoint: ids[1],\n }),\n },\n });\n },\n};\n\nexport const circle3Tool: GeometryToolModule = {\n key: 'circle3',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'cc');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n construction: { kind: 'circumscribed', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n },\n};\n\nexport const semicircleTool: GeometryToolModule = {\n key: 'semicircle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n if (ids[0] === ids[1]) {\n ctx.toast?.('Cần 2 điểm phân biệt', { variant: 'warning', id: 'semicircle-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'semicircle', p1: ids[0], p2: ids[1] },\n }),\n },\n });\n },\n};\n\nexport const arcCenterTool: GeometryToolModule = {\n key: 'arcCenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc-center-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n },\n};\n\nexport const arc3Tool: GeometryToolModule = {\n key: 'arc3',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc3-dup' });\n return;\n }\n const picks = ctx.pendingRef.current;\n const ax = picks[0].X(), ay = picks[0].Y();\n const bx = picks[1].X(), by = picks[1].Y();\n const cx = picks[2].X(), cy = picks[2].Y();\n const cross = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);\n if (Math.abs(cross) < 1e-6) {\n ctx.toast?.('Không vẽ được cung qua 3 điểm thẳng hàng', {\n variant: 'warning', id: 'arc3-collinear',\n });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'by3Points', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n },\n};\n\nexport const sectorCenterTool: GeometryToolModule = {\n key: 'sectorCenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'sector-center-dup' });\n return;\n }\n const id = freshId(ctx, 'sec');\n const label = ctx.nextLabel('sector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'sector', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n },\n};\n\nexport const incircleTool: GeometryToolModule = {\n key: 'incircle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'ic');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, {\n construction: { kind: 'incircle', p1: ids[0], p2: ids[1], p3: ids[2] },\n }) },\n });\n },\n};\n\nexport const excircleTool: GeometryToolModule = {\n key: 'excircle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'exc');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, {\n construction: { kind: 'excircle', p1: ids[0], p2: ids[1], p3: ids[2], opposite: ids[0] },\n }) },\n });\n },\n};\n","import type { GeometryToolModule } from './_types';\nimport { objKind } from '../../tools';\nimport { freshId, mkSceneObj } from '../utils';\nimport { findPickIdByKind } from './shared';\n\nexport const midpointTool: GeometryToolModule = {\n key: 'midpoint',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'mp');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'midpoint', p1: ids[0], p2: ids[1] },\n }) },\n });\n },\n};\n\nexport const perpFootTool: GeometryToolModule = {\n key: 'perpFoot',\n finalize(ctx) {\n const fromPoint = findPickIdByKind(ctx, 'point');\n const onLine = findPickIdByKind(ctx, 'line');\n if (!fromPoint || !onLine) return;\n const id = freshId(ctx, 'pf');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'perpFoot', from: fromPoint, onLine },\n }) },\n });\n },\n};\n\nexport const centroidTool: GeometryToolModule = {\n key: 'centroid',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'g');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'centroid', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n },\n};\n\nexport const circumcenterTool: GeometryToolModule = {\n key: 'circumcenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'o');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'circumcenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n },\n};\n\nexport const incenterTool: GeometryToolModule = {\n key: 'incenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'i');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'incenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n },\n};\n\nexport const orthocenterTool: GeometryToolModule = {\n key: 'orthocenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'h');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'orthocenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n },\n};\n\nexport const excenterTool: GeometryToolModule = {\n key: 'excenter',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'ex');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'excenter', vertices: [ids[0], ids[1], ids[2]], opposite: ids[0] },\n }) },\n });\n },\n};\n\nexport const tangencyPointTool: GeometryToolModule = {\n key: 'tangencyPoint',\n finalize(ctx) {\n const circleId = findPickIdByKind(ctx, 'circle');\n const lineId = findPickIdByKind(ctx, 'line');\n if (!circleId || !lineId) return;\n const id = freshId(ctx, 'tp');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'tangencyPoint', circle: circleId, onLine: lineId },\n }) },\n });\n },\n};\n\nexport const secondIntersectionTool: GeometryToolModule = {\n key: 'secondIntersection',\n finalize(ctx) {\n const lineId = findPickIdByKind(ctx, 'line');\n const circleId = findPickIdByKind(ctx, 'circle');\n const otherId = findPickIdByKind(ctx, 'point');\n if (!lineId || !circleId || !otherId) return;\n const id = freshId(ctx, 'X');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'secondIntersection', line: lineId, circle: circleId, other: otherId },\n }) },\n });\n },\n};\n\nexport const arcMidpointTool: GeometryToolModule = {\n key: 'arcMidpoint',\n finalize(ctx) {\n const circleId = findPickIdByKind(ctx, 'circle');\n const picks = ctx.pendingRef.current;\n const allIds = ctx.pendingIdsRef.current;\n const ptIds: string[] = [];\n for (let i = 0; i < picks.length; i += 1) {\n if (objKind(picks[i]) === 'point' && allIds[i]) ptIds.push(allIds[i]);\n }\n if (!circleId || ptIds.length < 3) return;\n const id = freshId(ctx, 'M');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'arcMidpoint', circle: circleId, a: ptIds[0], b: ptIds[1], notContaining: ptIds[2] },\n }) },\n });\n },\n};\n\nexport const circleIntersectionTool: GeometryToolModule = {\n key: 'circleIntersection',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n for (const which of [0, 1] as const) {\n const id = freshId(ctx, 'X');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'circleIntersection', c1: ids[0], c2: ids[1], which },\n }) },\n });\n }\n },\n};\n\nexport const tangentPointExtTool: GeometryToolModule = {\n key: 'tangentPointExt',\n finalize(ctx) {\n const fromId = findPickIdByKind(ctx, 'point');\n const circleId = findPickIdByKind(ctx, 'circle');\n if (!fromId || !circleId) return;\n for (const which of [0, 1] as const) {\n const id = freshId(ctx, 'T');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'tangentPointExt', from: fromId, circle: circleId, which },\n }) },\n });\n }\n },\n};\n\nexport const pointOnTool: GeometryToolModule = {\n key: 'pointOn',\n finalize(ctx, _toolDef, clickXY) {\n const obj = ctx.pendingRef.current[0];\n const objId = ctx.pendingIdsRef.current[0];\n if (!obj || !objId) return;\n const kind = objKind(obj);\n const id = freshId(ctx, 'p');\n const label = ctx.nextLabel('point');\n const px = clickXY?.x ?? 0;\n const py = clickXY?.y ?? 0;\n let constraint: Record<string, unknown> | null = null;\n if (kind === 'circle') {\n\n const o = (obj as any).center ?? (obj as any).midpoint;\n const ox = o ? o.X() : 0; const oy = o ? o.Y() : 0;\n constraint = { kind: 'onCircle', circleId: objId, theta: Math.atan2(py - oy, px - ox) };\n } else if (kind === 'line') {\n\n const elType = ((obj as any).elType || '').toString().toLowerCase();\n\n const p1 = (obj as any).point1; const p2 = (obj as any).point2;\n let t = 0;\n if (p1 && p2) {\n const dx = p2.X() - p1.X(); const dy = p2.Y() - p1.Y();\n const len2 = dx * dx + dy * dy || 1;\n t = ((px - p1.X()) * dx + (py - p1.Y()) * dy) / len2;\n }\n constraint = elType === 'segment'\n ? { kind: 'onSegment', segmentId: objId, t }\n : { kind: 'onLine', lineId: objId, t };\n }\n if (!constraint) return;\n ctx.store.dispatch({ type: 'ADD', payload: { obj: mkSceneObj(id, 'point', label, { constraint }) } });\n },\n};\n","import type { GeometryToolModule } from './_types';\nimport type { HandlerCtx } from '../ctx';\nimport { freshId, mkSceneObj } from '../utils';\nimport {\n readJxgPos,\n computePerpendicularT,\n computePerpBisectorT,\n computeCircleTheta,\n} from './shared';\n\nexport const squareTool: GeometryToolModule = {\n key: 'square',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'sq');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, {\n construction: { kind: 'square', p1: ids[0], p2: ids[1] },\n }) },\n });\n },\n};\n\nexport const rectangleTool: GeometryToolModule = {\n key: 'rectangle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const [aId, bId, cId] = ids;\n const P = readJxgPos(ctx, cId);\n const Aj = readJxgPos(ctx, aId);\n const Bj = readJxgPos(ctx, bId);\n const t = computePerpendicularT(P, Bj, Aj, Bj);\n const polyId = freshId(ctx, 'rect');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'TRANSACTION',\n payload: { actions: [\n { type: 'UPDATE_ATTRS', payload: { id: cId, patch: {\n constraint: { kind: 'onPerpendicular', through: bId, perpToA: aId, perpToB: bId, t },\n } } },\n { type: 'ADD', payload: { obj: mkSceneObj(polyId, 'polygon', label, {\n construction: { kind: 'rectangle', p1: aId, p2: bId, p3: cId },\n }) } },\n ] },\n });\n },\n};\n\nexport const rhombusTool: GeometryToolModule = {\n key: 'rhombus',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const [aId, bId, cId] = ids;\n const P = readJxgPos(ctx, cId);\n const Bj = readJxgPos(ctx, bId);\n const theta = computeCircleTheta(P, Bj);\n const polyId = freshId(ctx, 'rho');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'TRANSACTION',\n payload: { actions: [\n { type: 'UPDATE_ATTRS', payload: { id: cId, patch: {\n constraint: { kind: 'onCircleAroundPoint', center: bId, radiusPoint: aId, theta },\n } } },\n { type: 'ADD', payload: { obj: mkSceneObj(polyId, 'polygon', label, {\n construction: { kind: 'rhombus', p1: aId, p2: bId, p3: cId },\n }) } },\n ] },\n });\n },\n};\n\n/** Shared body cho parallelogram & isoTrapezoid (cùng construction shape, khác kind). */\nfunction finalizePgmTrap(ctx: HandlerCtx, key: 'parallelogram' | 'isoTrapezoid'): void {\n const ids = ctx.pendingIdsRef.current;\n const [aId, bId, cId] = ids;\n const prefix = key === 'parallelogram' ? 'pgm' : 'trap';\n const polyId = freshId(ctx, prefix);\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(polyId, 'polygon', label, {\n construction: { kind: key, p1: aId, p2: bId, p3: cId },\n }) },\n });\n}\n\nexport const parallelogramTool: GeometryToolModule = {\n key: 'parallelogram',\n finalize(ctx) {\n finalizePgmTrap(ctx, 'parallelogram');\n },\n};\n\nexport const isoTrapezoidTool: GeometryToolModule = {\n key: 'isoTrapezoid',\n finalize(ctx) {\n finalizePgmTrap(ctx, 'isoTrapezoid');\n },\n};\n\nexport const isoTriangleTool: GeometryToolModule = {\n key: 'isoTriangle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n // ids = [base1, base2, apex] (theo thứ tự click — hint UI nói rõ).\n const [b1Id, b2Id, apexId] = ids;\n const P = readJxgPos(ctx, apexId);\n const B1 = readJxgPos(ctx, b1Id);\n const B2 = readJxgPos(ctx, b2Id);\n const t = computePerpBisectorT(P, B1, B2);\n const polyId = freshId(ctx, 'iso');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'TRANSACTION',\n payload: { actions: [\n { type: 'UPDATE_ATTRS', payload: { id: apexId, patch: {\n constraint: { kind: 'onPerpBisector', p1: b1Id, p2: b2Id, t },\n } } },\n { type: 'ADD', payload: { obj: mkSceneObj(polyId, 'polygon', label, {\n construction: { kind: 'isoTriangle', base1: b1Id, base2: b2Id, apex: apexId },\n }) } },\n ] },\n });\n },\n};\n\nexport const rightTriangleTool: GeometryToolModule = {\n key: 'rightTriangle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n // ids = [rightAngle, leg1End, leg2End].\n const [rId, p1Id, p2Id] = ids;\n const P = readJxgPos(ctx, p2Id);\n const R = readJxgPos(ctx, rId);\n const P1 = readJxgPos(ctx, p1Id);\n const t = computePerpendicularT(P, R, R, P1);\n const polyId = freshId(ctx, 'rtri');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'TRANSACTION',\n payload: { actions: [\n { type: 'UPDATE_ATTRS', payload: { id: p2Id, patch: {\n constraint: { kind: 'onPerpendicular', through: rId, perpToA: rId, perpToB: p1Id, t },\n } } },\n { type: 'ADD', payload: { obj: mkSceneObj(polyId, 'polygon', label, {\n construction: { kind: 'rightTriangle', rightAngle: rId, leg1End: p1Id, leg2End: p2Id },\n }) } },\n ] },\n });\n },\n};\n","import type { GeometryToolModule } from './_types';\nimport { objKind } from '../../tools';\nimport { dispatchAddIntersection, freshId, mkSceneObj } from '../utils';\n\nexport const angleTool: GeometryToolModule = {\n key: 'angle',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n // ids = [p1, vertex, p2] — tool def 'accepts: [\"point\", \"point\", \"point\"]'\n // và LeftPanel hint \"Click 3 điểm có sẵn (đỉnh ở giữa)\". User click theo\n // thứ tự: cạnh-A, đỉnh, cạnh-B.\n const id = freshId(ctx, 'ang');\n const label = ctx.nextLabel('angle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'angle', label, {\n p1: ids[0], vertex: ids[1], p2: ids[2],\n }) },\n });\n },\n};\n\nexport const distanceTool: GeometryToolModule = {\n key: 'distance',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n const id = freshId(ctx, 'd');\n const label = ctx.nextLabel('distance');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'distance', label, { p1: ids[0], p2: ids[1] }) },\n });\n },\n};\n\nexport const intersectTool: GeometryToolModule = {\n key: 'intersect',\n finalize(ctx) {\n const ids = ctx.pendingIdsRef.current;\n // ids[0], ids[1] là line hoặc circle theo accept 'lineOrCircle'.\n // Resolve kind từ pendingRef để biết lineLine / lineCircle / circleCircle.\n const picks = ctx.pendingRef.current;\n const pendIds = ctx.pendingIdsRef.current;\n const aIdx = pendIds.indexOf(ids[0]);\n const bIdx = pendIds.indexOf(ids[1]);\n if (aIdx < 0 || bIdx < 0) return;\n const aKind = objKind(picks[aIdx]);\n const bKind = objKind(picks[bIdx]);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: ids[0], ref2: ids[1] });\n return;\n }\n const isLineCircle =\n (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n const isCircleCircle = aKind === 'circle' && bKind === 'circle';\n if (!isLineCircle && !isCircleCircle) return;\n // 2 nhánh → tạo 2 scene intersection (giống GeoGebra \"Intersect Two Objects\").\n for (const branch of [0, 1] as const) {\n dispatchAddIntersection(ctx, {\n kind: isLineCircle ? 'lineCircle' : 'circleCircle',\n ref1: ids[0],\n ref2: ids[1],\n branch,\n });\n }\n },\n};\n","// finalize/registry.ts\nimport type { GeometryToolModule } from './_types';\nimport * as lines from './lines';\nimport * as circles from './circles';\nimport * as points from './points';\nimport * as polygons from './polygons';\nimport * as measure from './measure';\n\nconst ALL: GeometryToolModule[] = [\n ...Object.values(lines), ...Object.values(circles), ...Object.values(points),\n ...Object.values(polygons), ...Object.values(measure),\n].filter((m): m is GeometryToolModule => !!m && typeof (m as any).finalize === 'function');\n\nexport const TOOL_MODULES: ReadonlyMap<string, GeometryToolModule> =\n new Map(ALL.map((m) => [m.key, m]));\n","import type { ToolDef } from '../tools';\nimport type { HandlerCtx } from './ctx';\nimport { TOOL_MODULES } from './finalize/registry';\n\n// ─── Finalize shape (dispatch ADD per tool) ──────────────────────────────────\n\nexport function finalizeShape(ctx: HandlerCtx, toolDef: ToolDef, clickXY?: { x: number; y: number }): void {\n TOOL_MODULES.get(toolDef.key)?.finalize(ctx, toolDef, clickXY);\n}\n"," \nexport type JxgObj = any;\n\nimport type { State, SceneObject } from '../../../core/scene';\n\n/**\n * Trả về danh sách id điểm \"định nghĩa\" object — dùng cho transform tools\n * (translate/rotate/reflect/dilate) cần biết các điểm gốc để clone.\n *\n * Signature: `(obj: SceneObject, state: State)`. `state` được pass để\n * forward-compatible với các kind phái sinh (vd: lookup dependentsOf cho\n * compound shapes); hiện tại chỉ đọc `obj.kind` + `obj.attrs`.\n */\nexport function getDefiningPoints(obj: SceneObject, _state: State): string[] {\n if (obj.kind === 'point' || obj.kind === 'intersection') return [obj.id];\n if (obj.kind === 'segment' || obj.kind === 'line') {\n const a = obj.attrs as { p1: string; p2: string };\n return [a.p1, a.p2];\n }\n if (obj.kind === 'ray') {\n const a = obj.attrs as { origin: string; through: string };\n return [a.origin, a.through];\n }\n if (obj.kind === 'vector') {\n const a = obj.attrs as { from: string; to: string };\n return [a.from, a.to];\n }\n if (obj.kind === 'circle') {\n const a = obj.attrs as { center: string; surfacePoint: string };\n return [a.center, a.surfacePoint];\n }\n if (obj.kind === 'polygon') {\n return [...(obj.attrs as { vertices: string[] }).vertices];\n }\n return [];\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import type { TransformDef } from '../../../../core/scene/kinds/2d-constraint';\nimport { getDefiningPoints } from '../transforms';\nimport type { HandlerCtx, TransformToolKey } from './ctx';\nimport { freshId, mkSceneObj } from './utils';\n\nexport function finalizeTransform(\n ctx: HandlerCtx,\n tool: TransformToolKey,\n pendingIds: string[],\n value: number,\n): void {\n if (tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const id = freshId(ctx, 'rpoly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, {\n construction: { kind: 'regular', p1: pendingIds[0], p2: pendingIds[1], n },\n }) },\n });\n return;\n }\n\n if (tool === 'circleCR') {\n const r = Math.abs(value);\n if (!(r > 0)) { ctx.flashWarn('Bán kính phải > 0'); return; }\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, { center: pendingIds[0], radius: r }) },\n });\n return;\n }\n\n // 5 transform tools: pendingIds[0] = source object.\n const sourceId = pendingIds[0];\n const state = ctx.store.getState();\n const source = state.objects[sourceId];\n if (!source) {\n ctx.flashWarn('Đối tượng nguồn không còn');\n return;\n }\n const defining = getDefiningPoints(source, state);\n if (defining.length === 0) {\n ctx.flashWarn('Không thể biến đổi đối tượng này');\n return;\n }\n\n let transformDef: TransformDef | null = null;\n if (tool === 'translate') {\n // pendingIds = [source, A, B]; vector = B − A. Đọc toạ độ live qua JxgObj.\n const a = ctx.jxgFromSceneId(pendingIds[1]);\n const b = ctx.jxgFromSceneId(pendingIds[2]);\n if (!a || !b || typeof a.X !== 'function' || typeof b.X !== 'function') {\n ctx.flashWarn('Không đọc được toạ độ vector');\n return;\n }\n transformDef = { kind: 'translate', dx: b.X() - a.X(), dy: b.Y() - a.Y() };\n } else if (tool === 'rotate') {\n transformDef = { kind: 'rotate', angleRad: (value * Math.PI) / 180, center: pendingIds[1] };\n } else if (tool === 'reflectLine') {\n transformDef = { kind: 'reflectLine', line: pendingIds[1] };\n } else if (tool === 'reflectPoint') {\n transformDef = { kind: 'reflectPoint', center: pendingIds[1] };\n } else if (tool === 'dilate') {\n transformDef = { kind: 'dilate', k: value, center: pendingIds[1] };\n }\n if (!transformDef) return;\n\n // Tạo N transformed point + collect ids. Dispatch tuần tự (không gom vào\n // transaction) vì freshId/nextLabel cần đọc state đã commit để cấp id+label\n // không trùng. Trade-off: undo sẽ tách thành N+1 step thay vì 1.\n const newPointIds: string[] = [];\n for (const defId of defining) {\n const newId = freshId(ctx, 'p');\n const newLabel = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(newId, 'point', newLabel, {\n constraint: { kind: 'transformed', source: defId, transform: transformDef! },\n color: '#0ea5e9',\n }) },\n });\n newPointIds.push(newId);\n }\n // Tạo wrapper cùng kind từ N point mới (point thì không cần wrapper).\n recreateFromTransformedPoints(ctx, source, newPointIds);\n}\n\n/**\n * Dựng object cùng kind với source từ N point đã transform. Tuân thủ schema\n * attrs của kind tương ứng. Không hỗ trợ kind 'point' (đã có sẵn point biến\n * hình), 'intersection' / 'angle' / 'distance' (measurement — không có ý\n * nghĩa biến hình), 'circle' với construction circumscribed.\n */\nfunction recreateFromTransformedPoints(\n ctx: HandlerCtx,\n source: { kind: string; attrs: Record<string, unknown> },\n pointIds: string[],\n): void {\n const k = source.kind;\n if (k === 'point' || k === 'intersection') return; // point đơn đã có sẵn\n\n if (k === 'segment' && pointIds.length === 2) {\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'line' && pointIds.length === 2) {\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'ray' && pointIds.length === 2) {\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: pointIds[0], through: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'vector' && pointIds.length === 2) {\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: pointIds[0], to: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'circle' && pointIds.length === 2) {\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, { center: pointIds[0], surfacePoint: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'polygon' && pointIds.length >= 3) {\n const id = freshId(ctx, 'poly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, { vertices: pointIds, color: '#0ea5e9' }) },\n });\n return;\n }\n // Other kinds (angle/distance/derived line constructions) — biến hình không\n // có ý nghĩa định nghĩa. Bỏ qua.\n}\n","import { objKind, type ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint } from '../utils';\nimport { finalizeShape } from '../finalizeShape';\nimport { finalizeTransform } from '../transform';\n\n \ntype JxgObj = any;\n\nexport function handleMultiClickTool(\n ctx: HandlerCtx,\n toolDef: ToolDef,\n \n e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n bestHit: JxgObj | null,\n): void {\n let pick: JxgObj | null = null;\n let pickId: string | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n // 'lineOrCircle' slot có thể được lấp bởi line hoặc circle.\n // 'pointOrLine' slot có thể được lấp bởi point hoặc line.\n let i = remaining.indexOf(u);\n if (i < 0 && (u === 'line' || u === 'circle')) i = remaining.indexOf('lineOrCircle');\n if (i < 0 && (u === 'point' || u === 'line')) i = remaining.indexOf('pointOrLine');\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('lineOrCircle') && (lineHit || circleHit)) {\n pick = lineHit ?? circleHit;\n }\n else if (remaining.includes('pointOrLine') && (strictPoint || lineHit)) {\n pick = strictPoint ?? lineHit;\n }\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point') || remaining.includes('pointOrLine')) {\n const near = ctx.findNearestPointJxg(e, 12);\n if (near) {\n pick = near;\n } else {\n // Mode A tool nhận 'point' / 'pointOrLine' + click khu vực rỗng → tự tạo\n // free point tại vị trí click. Đỡ cho user phải đổi sang tool 'point'\n // rồi quay lại (tangent / perpendicular / parallel / angleBisector ...).\n // Các slot khác (line/circle) vẫn yêu cầu hit object có sẵn.\n //\n // angleBisector: nếu lần click đầu đã là line thì cấm tạo free-point\n // (mode 2-line đã chốt) — handled by mode-consistency check phía dưới.\n //\n // pickId set trực tiếp từ return value của dispatchAddFreePoint vì\n // reverse-map (jxgIdToSceneRef) được rebuild qua store subscribe →\n // chưa sync xong tại thời điểm này; gọi jxgIdToSceneId(pick) sẽ ra null.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n ctx.flashWarn('Đã chọn đường — click thêm 1 đường/đoạn nữa để tạo 2 tia phân giác');\n return;\n }\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm'\n : k === 'line' ? 'một đường/đoạn'\n : k === 'circle' ? 'một đường tròn'\n : k === 'lineOrCircle' ? 'một đường hoặc đường tròn'\n : k === 'pointOrLine' ? 'một điểm hoặc đường/đoạn'\n : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n // angleBisector: ép tính nhất quán mode (3-point ↔ 2-line) — không trộn lẫn.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0) {\n const firstKind = objKind(ctx.pendingRef.current[0]);\n const newKind = objKind(pick);\n if (firstKind === 'line' && newKind !== 'line') {\n ctx.flashWarn('Đã chọn đường — chỉ click thêm 1 đường/đoạn nữa');\n return;\n }\n if (firstKind === 'point' && newKind !== 'point') {\n ctx.flashWarn('Đã chọn điểm — click thêm điểm (đỉnh ở giữa)');\n return;\n }\n }\n if (!pickId) pickId = ctx.jxgIdToSceneId(pick);\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) {\n pick = snapped;\n pickId = ctx.jxgIdToSceneId(snapped);\n } else {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n\n // angleBisector 2-line mode: finalize ngay khi đủ 2 đường (không chờ 3 picks).\n if (toolDef.key === 'angleBisector'\n && ctx.pendingIdsRef.current.length === 2\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n finalizeShape(ctx, toolDef);\n ctx.clearPending();\n return;\n }\n\n if (ctx.pendingIdsRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n // 3 popover transform tools cần numeric input (góc / tỷ số / số cạnh) trước\n // khi finalize → emit info để MiniBoard show TransformParamPopover.\n if (tk === 'rotate' || tk === 'dilate' || tk === 'regularPolygon' || tk === 'circleCR') {\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = {\n tool: tk,\n pendingIds: ctx.pendingIdsRef.current.slice(),\n anchorScreen: { x: cx, y: cy },\n };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending — wait for confirm/cancel from MiniBoard.\n return;\n }\n // 3 no-popover transform tools (translate/reflectLine/reflectPoint):\n // finalize ngay khi đủ pick — không cần numeric param.\n if (tk === 'translate' || tk === 'reflectLine' || tk === 'reflectPoint') {\n finalizeTransform(ctx, tk, ctx.pendingIdsRef.current.slice(), 0);\n ctx.clearPending();\n return;\n }\n\n // Non-transform multi-click tools: dispatch ADD for the shape directly.\n // Truyền toạ độ click (board coords) để pointOn tính theta/t bám vị trí.\n finalizeShape(ctx, toolDef, { x, y });\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n","import { objKind, TOOLS } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { handleMoveTool } from './move';\nimport { handleSelectTool } from './select';\nimport { handlePointTool } from './point';\nimport { handleSingleTargetTool } from './singleTarget';\nimport { handlePolygonTool } from './polygon';\nimport { handleMultiClickTool } from './multiClick';\n\n \nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n\n if (t === 'move') return handleMoveTool(ctx, e);\n if (t === 'select') return handleSelectTool(ctx, e);\n\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target).\n // Filter hits không có scene id (vd auxiliary points của 'regularpolygon' do\n // JSXGraph tự sinh — không có id trong renderer.elements, không thể dùng làm\n // pick cho tool). Nếu không filter, aux point sẽ cướp click khỏi border/edge\n // bên cạnh, làm tool perp/parallel/... đứng yên không tiến tới needs.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const bestHit = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n\n if (t === 'point') return handlePointTool(ctx, e, x, y, hits);\n if (handleSingleTargetTool(ctx, t, toolDef, e, bestHit)) return;\n if (handlePolygonTool(ctx, t, toolDef, e, x, y, bestHit)) return;\n\n handleMultiClickTool(ctx, toolDef, e, x, y, hits, bestHit);\n}\n","import { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n \nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n const toUsr = (px: number, py: number): [number, number] => {\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n \n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n"," \ntype JxgObj = any;\n\nimport { objKind } from '../tools';\nimport { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n \nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n } else if (kind === 'line' || kind === 'circle') {\n \n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const best: JxgObj | null =\n hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0] ?? null;\n if (!best) {\n ctx.lastMoveClickRef.current = { id: null, time: 0 };\n return;\n }\n const bestId = ctx.jxgIdToSceneId(best);\n const now = Date.now();\n const isDouble =\n bestId !== null && ctx.lastMoveClickRef.current.id === bestId && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { id: bestId, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n if (!bestId) return;\n ctx.emitSelect({ id: bestId, anchorScreen: { x: cx + 8, y: cy + 8 } });\n}\n","// src/stamps/geometry-2d/editor/hitTest.ts\nimport type { State, SceneObject } from '../../../core/scene';\nimport { listObjects } from '../../../core/scene';\nimport { safeJsx } from '../../shared/safeJsx';\n\n \ntype JxgObj = any;\n\n/**\n * Tìm point gần (x, y) nhất trong state, trong vòng tol.\n *\n * Sử dụng `pointCoord(id) => [x, y] | null` để hit-test theo toạ độ JSXGraph\n * thực tế (resolve qua JxgRenderer Map). Trả về `null` nếu không có point nào\n * trong vòng tol.\n */\nexport function findNearestPoint(\n state: State,\n pointCoord: (id: string) => [number, number] | null,\n x: number,\n y: number,\n tolPx: number,\n excludeIds: Set<string> = new Set(),\n): SceneObject | null {\n let best: SceneObject | null = null;\n let bestDistSq = tolPx * tolPx;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'point' && obj.kind !== 'intersection') continue;\n if (excludeIds.has(obj.id)) continue;\n const coord = pointCoord(obj.id);\n if (!coord) continue;\n const dx = coord[0] - x;\n const dy = coord[1] - y;\n const d2 = dx * dx + dy * dy;\n if (d2 < bestDistSq) {\n bestDistSq = d2;\n best = obj;\n }\n }\n return best;\n}\n\n/**\n * Lấy screen coords (x, y px) của event dưới cursor. Ưu tiên JSXGraph's\n * `getMousePosition`; fallback về container's getBoundingClientRect (cần cho\n * touch event hoặc khi board chưa cache mouse position).\n */\nexport function screenCoordsOf(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n): [number, number] | null {\n if (!board) return null;\n try {\n const mp = board.getMousePosition ? board.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through to container rect */ }\n if (container) {\n const rect = container.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n}\n\n/**\n * List JSXGraph objects whose `hasPoint(sx, sy)` chứa cursor — đã loại\n * `excludes` (vd phantom + preview shape + preview segments).\n *\n * Phantom là invisible point JSXGraph kéo theo cursor để dựng live-preview;\n * nếu không loại trừ, click chỗ trống sẽ snap trúng phantom (cách click 0px)\n * → drawing \"đứng\" vì pendingRef nhét phantom (không có scene id), tool\n * không tiến tới được `needs` threshold. (Regression từ commit 95a6c13.)\n */\nexport function objectsAt(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n excludes: Iterable<JxgObj>,\n): JxgObj[] {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return [];\n const [sx, sy] = sc;\n const excludeSet = new Set<JxgObj>();\n for (const e of excludes) if (e) excludeSet.add(e);\n const out: JxgObj[] = [];\n safeJsx('hitTest.objectsAt', () => {\n for (const o of (board.objectsList || [])) {\n if (excludeSet.has(o)) continue;\n if (o && typeof o.hasPoint === 'function' && o.hasPoint(sx, sy)) out.push(o);\n }\n });\n return out;\n}\n\n/**\n * Tìm JSXGraph point gần cursor (trong `tolPx` pixels). Dùng `findNearestPoint`\n * với `pointCoord` đọc từ JSXGraph's `coords.scrCoords` qua resolver `jxgFromSceneId`.\n * Trả JSXGraph object (không phải scene id) để caller dùng làm pick.\n */\nexport function findNearestJxgPoint(\n board: JxgObj,\n container: HTMLElement | null,\n state: State,\n jxgFromSceneId: (id: string) => JxgObj | null,\n evt: JxgObj,\n tolPx = 12,\n): JxgObj | null {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return null;\n const [sx, sy] = sc;\n const pointCoord = (id: string): [number, number] | null => {\n const j = jxgFromSceneId(id);\n const sc2 = j?.coords?.scrCoords;\n return sc2 ? [sc2[1], sc2[2]] : null;\n };\n const result = findNearestPoint(state, pointCoord, sx, sy, tolPx);\n return result ? jxgFromSceneId(result.id) : null;\n}\n\n/**\n * Khi user click trúng label text của một element, JSXGraph trả về text obj\n * thay vì owner. Promote về owner để properties popover hiển thị đúng\n * properties của shape, không phải của text.\n */\nexport function promoteToLabelOwner(board: JxgObj, o: JxgObj): JxgObj {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text' || !board) return o;\n const promoted = safeJsx<JxgObj | null>('hitTest.promoteToLabelOwner', () => {\n for (const c of (board.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n}\n","import type { State } from '../../../core/scene';\nimport type { ObjectSnapshot } from './MiniBoard.types';\n\n/**\n * Build snapshot từ scene object để PropertiesPopover render. Trả null nếu\n * object kind không hỗ trợ properties panel (vd polygon, angle, …).\n *\n * Pure function — không touch board/JSXGraph state. Caller pass anchorScreen\n * (vị trí pixel mà popover sẽ hiển thị).\n */\nexport function buildObjectSnapshot(\n state: State,\n id: string,\n anchorScreen: { x: number; y: number },\n): ObjectSnapshot | null {\n const obj = state.objects[id];\n if (!obj) return null;\n const k = obj.kind;\n if (k !== 'point' && k !== 'line' && k !== 'circle' && k !== 'segment' && k !== 'ray' && k !== 'vector') {\n return null;\n }\n const a = obj.attrs as Record<string, unknown>;\n const jKind: 'point' | 'line' | 'circle' = k === 'point' ? 'point' : (k === 'circle' ? 'circle' : 'line');\n return {\n id,\n kind: jKind,\n name: obj.label,\n color: (a.color as string) ?? '#0f172a',\n width: (a.width as number) ?? 2,\n dash: (a.dash as number) ?? 0,\n face: (a.face as ObjectSnapshot['face']) ?? 'o',\n showLabel: (a.showLabel as boolean) ?? true,\n showValue: (a.showValue as boolean) ?? false,\n screenCoords: anchorScreen,\n };\n}\n","// Pure preview-shape factory cho 2D editor — không component state, không\n// React. Dùng bởi MiniBoard.tsx `refreshPreview` mỗi khi user thay đổi\n// pending picks. Mirror legacy live-preview (commit ce78521), tách khỏi\n// MiniBoard.tsx để giảm size component file.\n\nimport { safeJsx } from '../../shared/safeJsx';\nimport { objKind, type ToolDef } from './tools';\n\n \ntype JxgObj = any;\n\nconst PREVIEW_STYLE: Record<string, unknown> = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.65,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n};\n\nconst CIRCLE_PREVIEW_STYLE: Record<string, unknown> = {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n};\n\n/**\n * Build transient JSXGraph object để live-preview shape user đang dựng. Trả\n * `null` khi:\n * - Tool không phải shape-tool (vd select/move).\n * - Số pick chưa đủ cho preview cụ thể.\n * - Pick types không hợp lệ với tool (vd perpendicular cần line input).\n *\n * Tất cả create calls wrap trong safeJsx để swallow exception từ JSXGraph\n * khi state stale (vd board destroyed giữa chừng).\n */\nexport function buildPreviewShape(\n board: JxgObj,\n toolDef: ToolDef,\n picks: JxgObj[],\n phantom: JxgObj,\n): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.buildPreviewShape', () => {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'line':\n return board.create('line', [picks[0], phantom], PREVIEW_STYLE);\n case 'ray':\n return board.create('line', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: true,\n });\n case 'vector':\n return board.create('arrow', [picks[0], phantom], PREVIEW_STYLE);\n case 'circleCenter':\n return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n case 'circle3':\n if (picks.length === 1) return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('circumcircle', [picks[0], picks[1], phantom], CIRCLE_PREVIEW_STYLE);\n }\n return null;\n case 'angle':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('angle', [picks[0], picks[1], phantom], {\n ...PREVIEW_STYLE,\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.15,\n });\n }\n return null;\n case 'perpBisector':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'angleBisector':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) return board.create('bisector', [picks[0], picks[1], phantom], PREVIEW_STYLE);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent': {\n if (picks.length !== 1) return null;\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return board.create(toolDef.key, [picks[0], phantom], PREVIEW_STYLE);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = board.create('glider', [phantom.X(), phantom.Y(), picks[0]], {\n visible: false,\n withLabel: false,\n });\n return board.create('tangent', [glider], PREVIEW_STYLE);\n }\n return null;\n }\n default:\n return null;\n }\n }, null);\n}\n\n/**\n * Tạo phantom point (invisible, fixed) làm endpoint kéo theo cursor cho\n * live-preview. Trả `null` nếu board không sẵn sàng (mock/test path).\n */\nexport function createPhantomPoint(board: JxgObj): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.createPhantomPoint', () => board.create('point', [0, 0], {\n visible: false,\n fixed: true,\n withLabel: false,\n name: '',\n }), null);\n}\n","import { safeJsx } from '../../shared/safeJsx';\nimport { buildPreviewShape, createPhantomPoint } from './preview';\nimport { TOOLS } from './tools';\nimport type { ToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GeomTool } from './tools';\n\n \ntype JxgObj = any;\n\nexport interface PreviewRefs {\n previewSegRef: { current: JxgObj[] };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n pendingRef: { current: JxgObj[] };\n}\n\n/**\n * Xoá tất cả preview segment objects (preview vertex-by-vertex của polygon\n * tool). Reset previewSegRef.current về mảng rỗng.\n */\nexport function clearPreviewSegs(\n board: JxgObj,\n previewSegRef: { current: JxgObj[] },\n): void {\n if (!board) return;\n for (const s of previewSegRef.current) {\n safeJsx('previewActions.removePreviewSeg', () => board.removeObject(s));\n }\n previewSegRef.current = [];\n}\n\n/**\n * Xoá phantom point + preview shape (cả 2 đều transient, không nằm trong\n * scene store). Phantom là invisible point JSXGraph theo cursor; preview\n * shape là live-preview của shape user đang dựng.\n */\nexport function removePhantom(\n board: JxgObj,\n refs: { previewShapeRef: { current: JxgObj }; phantomRef: { current: JxgObj } },\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n if (refs.phantomRef.current) {\n safeJsx('previewActions.removePhantom', () => board.removeObject(refs.phantomRef.current));\n refs.phantomRef.current = null;\n }\n}\n\n/**\n * Tear down old preview shape và build fresh từ current picks + phantom.\n * Phantom được tạo lazily — không spawn hidden point trước khi user có ít\n * nhất 1 real pick. Skip nếu tool variable-length (polygon: needs === -1)\n * vì handlers.ts emit per-vertex segments riêng qua previewSegRef.\n */\nexport function refreshPreviewShape(\n board: JxgObj,\n toolSM: ToolStateMachine<GeomTool>,\n refs: PreviewRefs,\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n const t = toolSM.toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = refs.pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n if (!refs.phantomRef.current) {\n refs.phantomRef.current = createPhantomPoint(board);\n if (!refs.phantomRef.current) return;\n }\n refs.previewShapeRef.current = buildPreviewShape(board, toolDef, picks, refs.phantomRef.current);\n}\n","import type { Store } from '../../../core/scene/store';\n\nexport interface MutatePatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n}\n\n/**\n * Áp patch từ PropertiesPopover lên scene store.\n *\n * PropertiesPopover phát attrs theo tên JSXGraph (strokeColor, strokeWidth,\n * withLabel, name, …). Scene attrs dùng tên ngắn gọn (color, width,\n * showLabel, …) và `label` là field top-level của SceneObject (không nằm\n * trong attrs). Map ở đây để popover khỏi cần biết shape của scene.\n *\n * - `remove: true` → dispatch DELETE.\n * - `attrs.name` (string) → dispatch UPDATE với `label` patch.\n * - JSXGraph attr names → scene names (strokeColor → color, strokeWidth →\n * width, withLabel → showLabel). `fillColor` cũng map sang `color` (fallback\n * khi popover không truyền strokeColor).\n */\nexport function applyMutatePatch(store: Store, id: string, patch: MutatePatch): void {\n if (patch.remove) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n return;\n }\n if (!patch.attrs) return;\n const { name, withLabel, strokeColor, fillColor, strokeWidth, ...rest } = patch.attrs as {\n name?: unknown;\n withLabel?: unknown;\n strokeColor?: unknown;\n fillColor?: unknown;\n strokeWidth?: unknown;\n [k: string]: unknown;\n };\n if (typeof name === 'string') {\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { label: name } } });\n }\n const mapped: Record<string, unknown> = { ...rest };\n // strokeColor / fillColor cùng đại diện cho cùng 1 thuộc tính `color` ở\n // scene. PropertiesPopover thường thêm sẵn `color` cùng strokeColor —\n // ưu tiên `color` (đã có trong rest); fallback strokeColor → fillColor.\n if (strokeColor !== undefined && mapped.color === undefined) mapped.color = strokeColor;\n if (fillColor !== undefined && mapped.color === undefined) mapped.color = fillColor;\n if (strokeWidth !== undefined && mapped.width === undefined) mapped.width = strokeWidth;\n if (withLabel !== undefined && mapped.showLabel === undefined) mapped.showLabel = withLabel;\n if (Object.keys(mapped).length > 0) {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id, patch: mapped } });\n }\n}\n","import { listObjects } from '../../../core/scene';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { applyMutatePatch } from './attrMapping';\nimport { finalizeTransform, type HandlerCtx, type TransformToolKey } from './handlers';\nimport type {\n MiniBoardHandle,\n ObjectSnapshot,\n SelectionStateSnapshot,\n TransformPopoverInfo,\n} from './MiniBoard.types';\nimport { buildObjectSnapshot } from './snapshot';\n\n \ntype JxgObj = any;\n\nexport interface BuildHandleDeps {\n // refs\n containerRef: { readonly current: HTMLDivElement | null };\n boardRef: { readonly current: JxgObj };\n rendererRef: { readonly current: JxgRenderer | null };\n selectSubsRef: { readonly current: Set<(snap: ObjectSnapshot) => void> };\n transformSubsRef: { readonly current: Set<(info: TransformPopoverInfo) => void> };\n selectionStateSubsRef: { readonly current: Set<(snap: SelectionStateSnapshot | null) => void> };\n selectedSetRef: { readonly current: Set<string> };\n \n pendingTransformRef: { current: any };\n ctxRef: { readonly current: HandlerCtx | null };\n // callbacks / values\n store: Store;\n clearPending: () => void;\n clearSelection: () => void;\n deleteSelection: () => void;\n emitTransform: (info: TransformPopoverInfo) => void;\n}\n\n/**\n * Build MiniBoardHandle object cho `useImperativeHandle`. Methods read refs\n * trực tiếp nên handle có thể tạo trước khi board boot xong; gọi method\n * trước onReady?.() có thể trả stale refs.\n *\n * Tách ra file riêng để giảm size MiniBoard.tsx — handle có 25+ methods,\n * chiếm ~60 dòng object literal.\n */\nexport function buildMiniBoardHandle(d: BuildHandleDeps): MiniBoardHandle {\n return {\n getContainer: () => d.containerRef.current,\n getBbox: () => d.boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n getState: () => d.store.getState(),\n getStore: () => d.store,\n highlight: (id) => { d.rendererRef.current?.highlight(id); },\n snapshotObject: (id, anchorScreen) => buildObjectSnapshot(d.store.getState(), id, anchorScreen),\n mutateObject: (id, patch) => applyMutatePatch(d.store, id, patch),\n getAllPointNames: () => listObjects(d.store.getState())\n .filter((o) => o.kind === 'point' || o.kind === 'intersection')\n .map((o) => o.label),\n onSelect: (cb) => {\n d.selectSubsRef.current.add(cb);\n return () => { d.selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb) => {\n d.transformSubsRef.current.add(cb);\n return () => { d.transformSubsRef.current.delete(cb); };\n },\n onSelectionState: (cb) => {\n d.selectionStateSubsRef.current.add(cb);\n return () => { d.selectionStateSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const info = d.pendingTransformRef.current as\n | { tool: TransformToolKey; pendingIds: string[]; anchorScreen: { x: number; y: number } }\n | null;\n if (info && d.ctxRef.current) {\n safeJsx('buildHandle.finalizeTransform', () =>\n finalizeTransform(d.ctxRef.current!, info.tool, info.pendingIds, value),\n );\n }\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n cancelTransformParam: () => {\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n getSelectionSize: () => d.selectedSetRef.current.size,\n clearSelection: d.clearSelection,\n deleteSelection: d.deleteSelection,\n };\n}\n","import type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n \ntype JxgObj = any;\n\n/**\n * Resolve scene id → JSXGraph object qua renderer's elements map.\n *\n * Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]: cho phép preview\n * shape của tool perpendicular/parallel/tangent kéo theo cạnh đa giác làm\n * parent (border là sub-segment auto-tạo, không có scene id riêng).\n */\nexport function jxgFromSceneId(renderer: JxgRenderer | null, id: string): JxgObj {\n if (!renderer) return null;\n \n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n \n const poly = elements.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n const borders = poly?.borders;\n if (Array.isArray(borders) && borders[idx]) return borders[idx];\n return null;\n }\n return elements.get(id) ?? null;\n}\n\n/**\n * Resolve JSXGraph object → scene id. Trước hết check reverse-map (cached),\n * sau đó dò polygon borders để trả synthetic \"<polyId>:border:<idx>\" cho\n * construct tools dùng cạnh đa giác như line input.\n */\nexport function jxgIdToSceneId(\n renderer: JxgRenderer | null,\n idMap: Map<string, string>,\n jxgObj: JxgObj,\n): string | null {\n if (!jxgObj?.id) return null;\n const direct = idMap.get(String(jxgObj.id));\n if (direct) return direct;\n if (!renderer) return null;\n \n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n // Direct fallback: idMap rebuild qua store.subscribe có thể chạy TRƯỚC\n // JxgRenderer subscriber (cùng store, đăng ký theo order useEffect), nên\n // idMap luôn thiếu entry của object vừa được renderer tạo trong dispatch\n // hiện tại. Walk renderer.elements để bù.\n for (const [sid, el] of elements) {\n if (el === jxgObj) return sid;\n \n const borders = (el as any)?.borders;\n if (Array.isArray(borders)) {\n const idx = borders.indexOf(jxgObj);\n if (idx >= 0) return `${sid}:border:${idx}`;\n }\n }\n return null;\n}\n","import { useEffect } from 'react';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { themeAxis, themeGrid } from './theme';\n\n \ntype JxgObj = any;\n\ninterface Params {\n boardRef: { readonly current: JxgObj };\n /** Refs giữ axis x/y JSXGraph objects để cleanup khi toggle off. */\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n isDarkRef: { readonly current: boolean };\n showAxis: boolean;\n showGrid: boolean;\n}\n\n/**\n * Sync hiển thị axis + grid khi user toggle qua LeftPanel.\n *\n * - Axis: tự tạo/xoá 2 axis object qua `boardRef.current.create('axis', ...)`.\n * - Grid: xoá grid cũ trong `board.objects` rồi tạo mới khi enable. Match\n * theme color (axis/grid) theo `isDarkRef.current`.\n *\n * Mỗi effect chạy độc lập theo `showAxis` / `showGrid` để switch nhanh\n * không re-do cả 2 mỗi lần toggle 1.\n */\nexport function useAxisGridSync({\n boardRef,\n axisObjsRef,\n isDarkRef,\n showAxis,\n showGrid,\n}: Params): void {\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleAxis', () => {\n if (axisObjsRef.current.x) {\n safeJsx('useAxisGridSync.removeAxisX', () => b.removeObject(axisObjsRef.current.x));\n axisObjsRef.current.x = undefined;\n }\n if (axisObjsRef.current.y) {\n safeJsx('useAxisGridSync.removeAxisY', () => b.removeObject(axisObjsRef.current.y));\n axisObjsRef.current.y = undefined;\n }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleGrid', () => {\n for (const o of Object.values(b.objects || {}) as JxgObj[]) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('useAxisGridSync.removeGrid', () => b.removeObject(o));\n }\n }\n if (showGrid) b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showGrid]);\n}\n","import { useEffect } from 'react';\nimport type { Store } from '../../../core/scene/store';\n\ninterface Params {\n store: Store;\n /** Current selection ids — Delete/Backspace act on. */\n selectedSetRef: { readonly current: Set<string> };\n deleteSelection: () => void;\n}\n\n/**\n * Capture-phase keyboard shortcuts cho 2D editor:\n *\n * - Ctrl/Cmd+Z → undo\n * - Ctrl/Cmd+Shift+Z / Ctrl/Cmd+Y → redo\n * - Delete/Backspace → delete selection\n *\n * Esc cố ý KHÔNG xử lý ở đây — user nhấn Esc khi đang vẽ dở (mid-tool action)\n * không nên mất pending picks. Popovers (Properties/Transform) tự handle Esc\n * qua onKeyDown / document listener ở bubble phase.\n *\n * Capture phase + stopPropagation để win với Excalidraw's bubble handlers\n * (vốn nắm các phím tương tự). Ignore khi focus đang ở input/textarea/contentEditable.\n */\nexport function useEditorShortcuts({\n store,\n selectedSetRef,\n deleteSelection,\n}: Params): void {\n useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n const lk = e.key.toLowerCase();\n if ((e.metaKey || e.ctrlKey) && lk === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.undo(); return;\n }\n if ((e.metaKey || e.ctrlKey) && ((lk === 'z' && e.shiftKey) || (lk === 'y' && !e.shiftKey))) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.redo(); return;\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField && selectedSetRef.current.size > 0) {\n e.preventDefault(); e.stopPropagation(); deleteSelection();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, selectedSetRef, deleteSelection]);\n}\n","import { useEffect, useRef } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n \ntype JxgObj = any;\n\ninterface Params {\n store: Store;\n rendererRef: { readonly current: JxgRenderer | null };\n}\n\ninterface Result {\n /** Reverse map: JSXGraph internal id (string) → scene id. */\n jxgIdToSceneRef: { readonly current: Map<string, string> };\n}\n\n/**\n * Maintain a reverse lookup `JSXGraph internal id → scene id`, rebuilt every\n * time store dispatches. Cần thiết vì JSXGraph events nắm element ref nhưng\n * scene logic chỉ biết scene id; map này cho phép translate ngược.\n *\n * Renderer's `elements` map (scene-id → JxgObj) là source of truth — hook\n * subscribe store + rebuild map mỗi event.\n */\nexport function useJxgSceneIdMap({ store, rendererRef }: Params): Result {\n const jxgIdToSceneRef = useRef<Map<string, string>>(new Map());\n useEffect(() => {\n const rebuild = (): void => {\n const r = rendererRef.current;\n if (!r) return;\n \n const elements: Map<string, JxgObj> | undefined = (r as any).elements;\n const next = new Map<string, string>();\n if (elements) {\n for (const [sid, jxg] of elements) {\n \n const jid = (jxg as any)?.id;\n if (jid) next.set(String(jid), sid);\n }\n }\n jxgIdToSceneRef.current = next;\n };\n rebuild();\n return store.subscribe(() => rebuild());\n }, [store, rendererRef]);\n return { jxgIdToSceneRef };\n}\n","'use client';\n/**\n * MiniBoard.tsx — JSXGraph mini-board cho geometry-2d editor.\n *\n * Sau Sub-PR 2.3.3 (Scene v2 Phase 2):\n * - Scene state qua `core/scene` Store + JxgRenderer (diff subscribe).\n * - Pointer handlers (handleDown/Up/Move) dispatch ADD/DELETE/UPDATE_ATTRS.\n * - Tool + pending picks qua `useToolStateMachine`.\n * - Selection = Set<sceneId> (UI state).\n * - Undo/Redo qua store (immer snapshot stack).\n *\n * EditorPanel/host/render.ts vẫn dùng API cũ — clean ở 2.3.4 / 2.3.7.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type Store,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { DEFAULT_VIEW_2D } from '../../../core/scene/types';\nimport { handleDown, handleMove, handleUp, type HandlerCtx } from './handlers';\nimport {\n findNearestJxgPoint,\n objectsAt as objectsAtImpl,\n promoteToLabelOwner,\n screenCoordsOf as screenCoordsOfImpl,\n} from './hitTest';\nimport { paletteFor, themeAxis, themeGrid, themeLabel } from './theme';\nimport { GROUP_LABELS, TOOLS, type GeomTool, type ToolDef } from './tools';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\nimport { buildObjectSnapshot } from './snapshot';\nimport {\n clearPreviewSegs as clearPreviewSegsImpl,\n removePhantom as removePhantomImpl,\n refreshPreviewShape,\n} from './previewActions';\nimport { buildMiniBoardHandle } from './buildHandle';\nimport {\n jxgFromSceneId as jxgFromSceneIdImpl,\n jxgIdToSceneId as jxgIdToSceneIdImpl,\n} from './idResolvers';\nimport { useAxisGridSync } from './useAxisGridSync';\nimport { useEditorShortcuts } from './useEditorShortcuts';\nimport { useJxgSceneIdMap } from './useJxgSceneIdMap';\n\nimport type { MiniBoardHandle, ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo } from './MiniBoard.types';\n\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\nexport type { ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo, MiniBoardHandle } from './MiniBoard.types';\n\ntype JxgObj = any;\n\ninterface Props {\n /** Signal \"board boot xong\" — parent gọi handle methods qua ref sau khi nhận. */\n onReady?: () => void;\n /** Scene store do Host tạo qua `useStampStore`. View info đọc từ `store.getState().meta.view`. */\n store: Store;\n /** Tool hiện tại — host owns state (Tier 2 F). */\n selectedTool: GeomTool;\n /** Hiển thị axis — host owns state (Tier 2 F). */\n showAxis: boolean;\n /** Hiển thị grid — host owns state (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n /** Toast hook từ EditorPanel ToastProvider — handlers dùng cho invalid construction. */\n toast?: import('../../shared/Toast').ShowToastFn;\n}\n\nexport const MiniBoard2D = forwardRef<MiniBoardHandle, Props>(function MiniBoard2D(\n { onReady, store, selectedTool, showAxis, showGrid, isDark, toast },\n ref,\n) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\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 const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n\n const toolSM = useToolStateMachine<GeomTool>(selectedTool);\n\n // bbox init đọc 1 lần lúc mount từ store.meta.view; axis/grid drive bằng prop.\n const initialMeta = store.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n const selectedSetRef = useRef<Set<string>>(new Set());\n const [selectionTick, setSelectionTick] = useState(0);\n\n // Sync selection halo overlay + emit selection state snapshot khi\n // selectedSetRef đổi. Dùng tick để notify (selectedSetRef là ref nên\n // React không track trực tiếp).\n useEffect(() => {\n const ids = [...selectedSetRef.current];\n rendererRef.current?.highlight(ids);\n const anchor = lastClickClientRef.current ?? { x: 0, y: 0 };\n const snap: SelectionStateSnapshot | null =\n ids.length === 0 ? null : { ids, anchor: { x: anchor.x + 8, y: anchor.y + 8 } };\n selectionStateSubsRef.current.forEach((cb) =>\n safeJsx('MiniBoard.emitSelectionState.cb', () => cb(snap)),\n );\n }, [selectionTick]);\n\n // Pending / preview / marquee state.\n const pendingRef = useRef<JxgObj[]>([]);\n const previewSegRef = useRef<JxgObj[]>([]);\n const phantomRef = useRef<JxgObj>(null);\n const previewShapeRef = useRef<JxgObj>(null);\n const previewRafRef = useRef<number | null>(null);\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n const lastMoveClickRef = useRef<{ id: string | null; time: number }>({ id: null, time: 0 });\n const lastClickClientRef = useRef<{ x: number; y: number } | null>(null);\n const pendingTransformRef = useRef<any>(null);\n\n // Subscribers cho popover (select + transform). Store-level changes propagate\n // qua `useEditorState` ở EditorPanel level — MiniBoard không owns store\n // subscription nữa (Tier 2 F).\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const selectionStateSubsRef = useRef<Set<(snap: SelectionStateSnapshot | null) => void>>(new Set());\n\n const { jxgIdToSceneRef } = useJxgSceneIdMap({ store, rendererRef });\n\n const jxgFromSceneId = useCallback(\n (id: string) => jxgFromSceneIdImpl(rendererRef.current, id),\n [],\n );\n const jxgIdToSceneId = useCallback(\n (jxgObj: JxgObj) => jxgIdToSceneIdImpl(rendererRef.current, jxgIdToSceneRef.current, jxgObj),\n [jxgIdToSceneRef],\n );\n\n // ─── Hit-test helpers ──────────────────────────────────────────────────────\n // Mỗi callback wrap pure function ở hitTest.ts, gom refs vào tham số.\n const screenCoordsOf = useCallback(\n (evt: JxgObj) => screenCoordsOfImpl(boardRef.current, containerRef.current, evt),\n [],\n );\n const objectsAt = useCallback(\n (evt: JxgObj) => objectsAtImpl(boardRef.current, containerRef.current, evt, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]),\n [],\n );\n const findNearestPointJxg = useCallback(\n (evt: JxgObj, tolPx = 12) =>\n findNearestJxgPoint(boardRef.current, containerRef.current, store.getState(), jxgFromSceneId, evt, tolPx),\n [jxgFromSceneId, store],\n );\n const promoteLabel = useCallback(\n (o: JxgObj) => promoteToLabelOwner(boardRef.current, o),\n [],\n );\n\n // ─── Selection / pending / preview actions ─────────────────────────────────\n const toggleSelect = useCallback((id: string, additive: boolean) => {\n if (!additive) { selectedSetRef.current.clear(); selectedSetRef.current.add(id); }\n else if (selectedSetRef.current.has(id)) selectedSetRef.current.delete(id);\n else selectedSetRef.current.add(id);\n rendererRef.current?.highlight([...selectedSetRef.current]);\n setSelectionTick((t) => t + 1);\n }, []);\n const clearSelection = useCallback(() => {\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, []);\n const deleteSelection = useCallback(() => {\n if (selectedSetRef.current.size === 0) return;\n store.transaction((dispatch) => {\n for (const id of selectedSetRef.current) dispatch({ type: 'DELETE', payload: { id } });\n });\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, [store]);\n\n const clearPreviewSegs = useCallback(\n () => clearPreviewSegsImpl(boardRef.current, previewSegRef),\n [],\n );\n const removePhantom = useCallback(\n () => removePhantomImpl(boardRef.current, { previewShapeRef, phantomRef }),\n [],\n );\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n toolSM.clearPending();\n }, [clearPreviewSegs, removePhantom, toolSM]);\n const refreshPreview = useCallback(\n () => refreshPreviewShape(boardRef.current, toolSM, {\n previewSegRef, phantomRef, previewShapeRef, pendingRef,\n }),\n [toolSM],\n );\n\n // ─── Warning flash ─────────────────────────────────────────────────────────\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const nextLabelFor = useCallback(\n (kind: string): string => sceneNextLabel(store.getState(), kind),\n [store],\n );\n\n // ─── Snapshot + emit helpers ───────────────────────────────────────────────\n const buildSnapshot = useCallback(\n (id: string, anchorScreen: { x: number; y: number }): ObjectSnapshot | null =>\n buildObjectSnapshot(store.getState(), id, anchorScreen),\n [store],\n );\n const emitSelect = useCallback((info: { id: string; anchorScreen: { x: number; y: number } }) => {\n const snap = buildSnapshot(info.id, info.anchorScreen);\n if (!snap) return;\n selectSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)));\n }, [buildSnapshot]);\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitTransform.cb', () => cb(info)));\n }, []);\n\n // ─── Handler context (read latest refs at call time) ───────────────────────\n const ctxRef = useRef<HandlerCtx | null>(null);\n ctxRef.current = {\n boardRef,\n toolRef: toolSM.toolRef as { current: GeomTool },\n pendingRef,\n pendingIdsRef: toolSM.pendingIdsRef as { current: string[] },\n previewSegRef,\n axisObjsRef,\n selectedSetRef,\n marqueeRef,\n moveDownRef,\n lastMoveClickRef,\n lastClickClientRef,\n pendingTransformRef,\n phantomRef,\n previewShapeRef,\n previewRafRef,\n jxgRef,\n store,\n jxgIdToSceneId,\n jxgFromSceneId,\n screenCoordsOf,\n objectsAt,\n promoteLabel,\n findNearestPointJxg,\n toggleSelect,\n clearSelection,\n nextLabel: nextLabelFor,\n clearPending,\n clearPreviewSegs,\n refreshPreview,\n flashWarn,\n toast,\n emitTransform: emitTransform as HandlerCtx['emitTransform'],\n emitSelect: emitSelect as HandlerCtx['emitSelect'],\n setPendingCount: () => { /* derived from toolSM */ },\n setSelectionTick: (fn) => setSelectionTick(fn),\n };\n\n useEditorShortcuts({\n store,\n selectedSetRef,\n deleteSelection,\n });\n useAxisGridSync({ boardRef, axisObjsRef, isDarkRef, showAxis, showGrid });\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n toolSM.setTool(t);\n const b = boardRef.current;\n if (b) safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }, [clearPending, toolSM]);\n\n // Tier 2 F — host owns `selectedTool`. Sync prop → internal toolSM khi đổi.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) handleToolChange(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init (async JSXGraph load) ───────────────────────────────────────\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 void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.2d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: initialView.bbox as [number, number, number, number],\n axis: false, grid: false,\n showCopyright: false, showNavigation: true,\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n precision: { hasPoint: 8, mouse: 4, touch: 16 },\n },\n extraOptionTweaks: (opts) => {\n // Apply theme label/text stroke color sau common defaults. Selection\n // highlight (đỏ) chủ động qua JxgRenderer.highlight() — đã disable\n // JSXGraph hover-highlight qua defaults.disableElementHighlight.\n if (opts.label) opts.label.strokeColor = themeLabel(isDarkRef.current);\n if (opts.text) opts.text.strokeColor = themeLabel(isDarkRef.current);\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n rendererRef.current = new JxgRenderer(store, board, {\n theme: paletteFor(isDarkRef.current),\n });\n\n // Ctrl/Cmd + wheel zoom (Excalidraw-style).\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.2d');\n }\n\n if (showAxisRef.current) safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n if (showGridRef.current) safeJsx('MiniBoard.initGrid', () =>\n board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }),\n );\n\n const fire = (h: (ctx: HandlerCtx, e: JxgObj) => void) =>\n (e: JxgObj) => { if (ctxRef.current) h(ctxRef.current, e); };\n board.on('down', fire(handleDown));\n board.on('up', fire(handleUp));\n board.on('move', fire(handleMove));\n\n // Hover cursor: pointer khi di chuột qua bất kỳ object có scene id (loại\n // phantom + preview transient). Apply mọi tool — drag (move), snap target\n // (drawing tools), click-to-select (select). Reset về '' khi rời object.\n board.on('move', (e: JxgObj) => {\n const container = containerRef.current;\n if (!container) return;\n const hits = objectsAtImpl(boardRef.current, container, e, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]);\n container.style.cursor = hits.length > 0 ? 'pointer' : '';\n });\n\n onReady?.();\n })();\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n if (previewRafRef.current != null) { cancelAnimationFrame(previewRafRef.current); previewRafRef.current = 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 // Handle delivery qua ref. Methods đọc trực tiếp từ refs — handle có thể\n // tạo trước khi board boot xong; gọi method trước onReady?.() sẽ trả stale\n // refs. Object literal được build ở `buildHandle.ts` để giảm size file.\n useImperativeHandle(\n ref,\n () => buildMiniBoardHandle({\n containerRef, boardRef, rendererRef,\n selectSubsRef, transformSubsRef, selectionStateSubsRef,\n selectedSetRef, pendingTransformRef, ctxRef,\n store,\n clearPending, clearSelection, deleteSelection,\n emitTransform,\n }),\n \n [store, clearSelection, deleteSelection, clearPending, emitTransform],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n});\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n \n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n // Hooks must be called unconditionally — before any early return\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\n/**\n * MultiPropertiesPopover — popover compact cho multi-select (≥2 đối tượng).\n *\n * Khác với PropertiesPopover (single-select): chỉ phơi ra các action chung\n * cho mọi kind — đổi màu + xóa. Các trường kind-specific (face, dash, name,\n * showValue) bị ẩn vì không có ngữ nghĩa nhất quán trên selection nhiều kind\n * khác nhau.\n *\n * EditorPanel gọi `onColor(c)` cho mỗi id selected; `onDelete()` xóa tất cả.\n */\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\ntype Section = 'color' | null;\n\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n ),\n};\n\nexport interface MultiPropertiesPopoverProps {\n anchor: { x: number; y: number };\n count: number;\n isDark?: boolean;\n onColor: (color: string) => void;\n onDelete: () => void;\n onClose: () => void;\n}\n\nexport const MultiPropertiesPopover: React.FC<MultiPropertiesPopoverProps> = (props) => {\n const { anchor, count, isDark, onColor, onDelete, onClose } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n const doDelete = () => { onDelete(); onClose(); };\n\n if (typeof document === 'undefined') return null;\n\n const PillBtn = ({ id, label, icon, active, onClick }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean; onClick: () => void;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n data-testid=\"multi-properties-popover\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label={`Thuộc tính (${count} đối tượng)`}\n >\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <span className=\"px-1 text-[11px] font-medium text-slate-500\">{count} đã chọn</span>\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"color\" label=\"Đổi màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá tất cả\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {section === 'color' && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu (áp cho {count} đối tượng)</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => onColor(c)}\n className=\"h-6 w-6 rounded border border-slate-200\"\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon' | 'circleCR';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n circleCR: { aria: 'Bán kính đường tròn', label: 'Bán kính', step: 0.5, min: 0 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { serializeState } from '../dsl/serialize';\n\nexport type AiFigureMode = 'build' | 'refine';\n\nexport interface UseAiFigureResult {\n prompt: string;\n setPrompt: (value: string) => void;\n isLoading: boolean;\n error: string | null;\n submit: () => Promise<State | null>;\n cancel: () => void;\n tokens: number;\n mode: AiFigureMode;\n setMode: (mode: AiFigureMode) => void;\n entityCount: { points: number; shapes: number };\n hasUnsupported: boolean;\n}\n\nexport interface UseAiFigureOptions {\n currentState?: State | null;\n}\n\nexport function useAiFigure(\n generator?: GenerateGeometryFigure,\n options: UseAiFigureOptions = {},\n): UseAiFigureResult {\n const { currentState } = options;\n const [prompt, setPrompt] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [tokens, setTokens] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n\n const { dsl: currentDsl, unsupported, entityCount, hasContent } = useMemo(() => {\n if (!currentState || currentState.order.length === 0) {\n return {\n dsl: null,\n unsupported: [],\n entityCount: { points: 0, shapes: 0 },\n hasContent: false,\n };\n }\n const { dsl, unsupported } = serializeState(currentState);\n return {\n dsl,\n unsupported,\n entityCount: { points: dsl.points.length, shapes: dsl.shapes.length },\n hasContent: true,\n };\n }, [currentState]);\n\n const hasUnsupported = unsupported.length > 0;\n\n const initialMode: AiFigureMode = hasContent && !hasUnsupported ? 'refine' : 'build';\n const [mode, setModeInternal] = useState<AiFigureMode>(initialMode);\n\n useEffect(() => {\n if (!hasContent && mode === 'refine') setModeInternal('build');\n if (hasUnsupported && mode === 'refine') setModeInternal('build');\n }, [hasContent, hasUnsupported, mode]);\n\n const setMode = useCallback((next: AiFigureMode) => {\n setModeInternal(next);\n }, []);\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const submit = useCallback(async (): Promise<State | null> => {\n const problem = prompt.trim();\n if (!problem) {\n setError('Nhập đề bài cần dựng hình.');\n return null;\n }\n if (!generator) {\n setError('Tính năng dựng hình AI chưa được cấu hình.');\n return null;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n const requestId = ++requestIdRef.current;\n abortRef.current = controller;\n setIsLoading(true);\n setError(null);\n setTokens(0);\n\n try {\n const generated = await generator(problem, {\n signal: controller.signal,\n onProgress: (info) => {\n if (requestId === requestIdRef.current) setTokens(info.tokens);\n },\n ...(mode === 'refine' && currentDsl ? { currentDsl } : {}),\n });\n if (controller.signal.aborted || requestId !== requestIdRef.current) return null;\n if (!generated.ok) {\n setError(generated.message);\n return null;\n }\n return generated.state;\n } catch (caught) {\n if (\n controller.signal.aborted ||\n (caught instanceof DOMException && caught.name === 'AbortError')\n ) {\n return null;\n }\n if (requestId === requestIdRef.current) {\n setError(\n caught instanceof Error && caught.message\n ? caught.message\n : 'Không thể dựng hình bằng AI.',\n );\n }\n return null;\n } finally {\n if (requestId === requestIdRef.current) {\n abortRef.current = null;\n setIsLoading(false);\n }\n }\n }, [generator, prompt, mode, currentDsl]);\n\n const cancel = useCallback(() => {\n abortRef.current?.abort();\n }, []);\n\n return {\n prompt,\n setPrompt,\n isLoading,\n error,\n submit,\n cancel,\n tokens,\n mode,\n setMode,\n entityCount,\n hasUnsupported,\n };\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { useAiFigure } from './useAiFigure';\nimport { handleExtractProblem } from '../ai/handleExtractProblem';\nimport { fileToImagePart, validateFile } from '../ai/vision/preprocess';\nimport type { ImagePart } from '../ai/providers/types';\n\ninterface Props {\n generator: GenerateGeometryFigure;\n onGenerated: (state: State) => void;\n currentState?: State | null;\n extractProblem?: typeof handleExtractProblem;\n}\n\n// SVG icons giữ inline để khỏi tăng bundle deps; theo tone \"math-instrument refined\".\nconst PaperclipIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.75}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...props}\n >\n <path d=\"M21.44 11.05 12.25 20.24a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66L9.41 17.41a2 2 0 1 1-2.83-2.83l8.49-8.49\" />\n </svg>\n);\n\nconst ArrowUpIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.25}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n {...props}\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n);\n\nconst StopIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden {...props}>\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\n </svg>\n);\n\nexport function AiFigurePrompt({\n generator,\n onGenerated,\n currentState,\n extractProblem = handleExtractProblem,\n}: Props) {\n const {\n prompt,\n setPrompt,\n isLoading,\n error,\n submit,\n cancel,\n tokens,\n mode,\n setMode,\n entityCount,\n hasUnsupported,\n } = useAiFigure(generator, { currentState });\n\n // ── timer ──────────────────────────────────────────────\n const [elapsed, setElapsed] = useState(0);\n useEffect(() => {\n if (!isLoading) {\n setElapsed(0);\n return;\n }\n const id = setInterval(() => setElapsed((s) => s + 1), 1000);\n return () => clearInterval(id);\n }, [isLoading]);\n\n // ── image / vision state ───────────────────────────────\n const [image, setImage] = useState<ImagePart | null>(null);\n const [ocrLoading, setOcrLoading] = useState(false);\n const [ocrError, setOcrError] = useState<string | null>(null);\n const [ocrWarning, setOcrWarning] = useState<string | null>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const imagePreview = image\n ? `data:${image.mediaType};base64,${image.base64}`\n : null;\n\n useEffect(() => {\n setOcrError(null);\n setOcrWarning(null);\n }, [image]);\n\n const handleFile = useCallback(\n async (file: File) => {\n if (isLoading || ocrLoading) return;\n const v = validateFile(file);\n if (!v.ok) {\n setOcrError(v.message);\n return;\n }\n try {\n const part = await fileToImagePart(file);\n setImage(part);\n } catch (e) {\n setOcrError(e instanceof Error ? e.message : 'Không decode được ảnh');\n }\n },\n [isLoading, ocrLoading],\n );\n\n const handleFileInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) void handleFile(file);\n e.target.value = '';\n },\n [handleFile],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLElement>) => {\n const item = Array.from(e.clipboardData.items).find(\n (it) => it.kind === 'file' && it.type.startsWith('image/'),\n );\n if (!item) return;\n const file = item.getAsFile();\n if (!file) return;\n e.preventDefault();\n void handleFile(file);\n },\n [handleFile],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n setIsDragOver(false);\n const file = Array.from(e.dataTransfer.files).find((f) =>\n f.type.startsWith('image/'),\n );\n if (file) void handleFile(file);\n },\n [handleFile],\n );\n\n const runOcr = useCallback(async () => {\n if (!image) return;\n setOcrLoading(true);\n setOcrError(null);\n setOcrWarning(null);\n try {\n const r = await extractProblem(image);\n if (r.kind === 'success' || r.kind === 'low-confidence') {\n setPrompt(r.text);\n if (r.kind === 'low-confidence') setOcrWarning(r.warning);\n // Focus textarea sau OCR để user review/edit ngay.\n requestAnimationFrame(() => textareaRef.current?.focus());\n } else {\n setOcrError(r.message);\n }\n } finally {\n setOcrLoading(false);\n }\n }, [image, setPrompt, extractProblem]);\n\n const handleSendClick = useCallback(async () => {\n // Khi có ảnh + textarea rỗng → ưu tiên OCR trước (single-click flow).\n if (image && !prompt.trim() && !ocrLoading) {\n await runOcr();\n return;\n }\n const generated = await submit();\n if (generated) onGenerated(generated);\n }, [image, prompt, ocrLoading, runOcr, submit, onGenerated]);\n\n const handleSwitchToBuild = useCallback(() => {\n if (currentState && currentState.order.length > 0) {\n const ok = window.confirm(\n 'Dựng mới sẽ thay toàn bộ hình hiện tại bằng hình mới từ AI. Tiếp tục?',\n );\n if (!ok) return;\n }\n setMode('build');\n }, [currentState, setMode]);\n\n // ── derived ────────────────────────────────────────────\n const hasContent = currentState != null && currentState.order.length > 0;\n const promptEmpty = !prompt.trim();\n const willOcr = image != null && promptEmpty;\n const sendDisabled =\n (!image && promptEmpty) || ocrLoading || (isLoading && !willOcr);\n const refineChipLabel =\n entityCount.points + entityCount.shapes > 0\n ? `Thêm vào · ${entityCount.points}đ, ${entityCount.shapes}đoạn`\n : 'Thêm vào';\n\n const placeholder = willOcr\n ? 'Bấm gửi để đọc đề từ ảnh — hoặc tự gõ ở đây…'\n : mode === 'refine'\n ? 'Mô tả phần cần thêm (vd: trung điểm M của BC). Có thể dán ảnh đề (Ctrl+V).'\n : 'Mô tả đề bài cần dựng — hoặc dán/đính ảnh đề (Ctrl+V).';\n\n return (\n <div className=\"border-b border-slate-200 bg-slate-50 px-3 py-3\">\n {/* Header label + mode pills */}\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium tracking-wide text-slate-600\">\n Dựng hình bằng AI\n </span>\n {hasContent && (\n <div className=\"flex items-center gap-1\" role=\"tablist\" aria-label=\"Chế độ AI\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'refine'}\n data-testid=\"geometry-ai-mode-refine\"\n onClick={() => setMode('refine')}\n disabled={isLoading || hasUnsupported}\n title={\n hasUnsupported\n ? 'Hình có đối tượng ngoài DSL — chỉ dựng mới được'\n : refineChipLabel\n }\n className={`rounded-full px-2.5 py-0.5 text-[11px] transition ${\n mode === 'refine'\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-500 hover:text-emerald-700'\n } ${hasUnsupported ? 'cursor-not-allowed opacity-40' : ''}`}\n >\n {refineChipLabel}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === 'build'}\n data-testid=\"geometry-ai-mode-build\"\n onClick={handleSwitchToBuild}\n disabled={isLoading}\n className={`rounded-full px-2.5 py-0.5 text-[11px] transition ${\n mode === 'build'\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-500 hover:text-emerald-700'\n }`}\n >\n Dựng mới\n </button>\n </div>\n )}\n </div>\n\n {hasUnsupported && (\n <p\n className=\"mb-1.5 text-[10px] text-amber-700\"\n data-testid=\"geometry-ai-unsupported-warning\"\n >\n Hình có đối tượng ngoài DSL — chỉ dựng mới được\n </p>\n )}\n\n {/* Composer */}\n <div\n onDragOver={(e) => {\n e.preventDefault();\n setIsDragOver(true);\n }}\n onDragLeave={() => setIsDragOver(false)}\n onDrop={handleDrop}\n onPaste={handlePaste}\n aria-label=\"Khu vực kéo thả ảnh\"\n role=\"region\"\n className={\n 'group relative flex flex-col rounded-2xl bg-white shadow-sm transition-all duration-150 ' +\n 'ring-1 ring-slate-200 focus-within:ring-2 focus-within:ring-emerald-400/70 focus-within:shadow-md ' +\n (isDragOver ? 'ring-2 ring-emerald-500 bg-emerald-50/40' : '')\n }\n >\n {/* Image chip */}\n {image && imagePreview && (\n <div className=\"flex flex-wrap gap-2 px-3 pt-2.5\">\n <div className=\"group/chip relative\">\n <img\n src={imagePreview}\n alt=\"Ảnh đề bài\"\n className=\"max-h-48 max-w-full h-auto w-auto rounded-lg border border-slate-200 shadow-sm\"\n />\n <button\n type=\"button\"\n onClick={() => setImage(null)}\n disabled={ocrLoading || isLoading}\n aria-label=\"Xoá ảnh\"\n className=\"absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full bg-slate-900/85 text-[11px] font-medium text-white shadow ring-2 ring-white transition hover:bg-slate-900 disabled:opacity-50\"\n >\n ×\n </button>\n </div>\n </div>\n )}\n\n {/* Textarea */}\n <textarea\n ref={textareaRef}\n id=\"geometry-ai-prompt\"\n aria-label=\"Đề bài cho AI\"\n data-testid=\"geometry-ai-textarea\"\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey) && !sendDisabled) {\n e.preventDefault();\n void handleSendClick();\n }\n }}\n disabled={isLoading}\n rows={2}\n placeholder={placeholder}\n className=\"block w-full resize-none rounded-2xl bg-transparent px-3.5 pt-2.5 pb-1 text-sm leading-relaxed text-slate-800 placeholder:text-slate-400 outline-none disabled:opacity-60 field-sizing-content max-h-44\"\n />\n\n {/* Bottom action bar */}\n <div className=\"flex items-center justify-between gap-2 px-2 pb-2 pt-1\">\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={isLoading || ocrLoading}\n aria-label=\"Đính ảnh đề bài\"\n title=\"Đính ảnh (cũng có thể dán bằng Ctrl+V hoặc kéo thả)\"\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-emerald-700 disabled:opacity-40\"\n >\n <PaperclipIcon className=\"h-[18px] w-[18px]\" />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n className=\"sr-only\"\n onChange={handleFileInput}\n disabled={isLoading || ocrLoading}\n aria-label=\"Chọn ảnh đề bài\"\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Status text */}\n {(isLoading || ocrLoading) && (\n <span className=\"font-mono text-[10px] tabular-nums text-slate-500\">\n {ocrLoading\n ? 'đọc ảnh…'\n : tokens > 0\n ? `${tokens}tok · ${elapsed}s`\n : `${elapsed}s`}\n </span>\n )}\n\n {/* Send / Stop button */}\n {isLoading ? (\n <button\n type=\"button\"\n onClick={cancel}\n aria-label=\"Huỷ dựng hình AI\"\n data-testid=\"geometry-ai-cancel\"\n title={`Đang dựng… ${elapsed}s — bấm để huỷ`}\n className=\"flex h-8 w-8 items-center justify-center rounded-full bg-amber-500 text-white shadow-sm transition hover:scale-105 hover:bg-amber-600 active:scale-95\"\n >\n <StopIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => void handleSendClick()}\n disabled={sendDisabled}\n aria-label={willOcr ? 'Đọc đề từ ảnh' : 'Dựng bằng AI'}\n title={willOcr ? 'Đọc đề từ ảnh (sẽ điền vào ô chat)' : 'Dựng bằng AI (Ctrl/⌘+Enter)'}\n data-testid={willOcr ? 'geometry-ai-ocr' : 'geometry-ai-submit'}\n className=\"flex h-8 w-8 items-center justify-center rounded-full bg-emerald-600 text-white shadow-sm transition hover:scale-105 hover:bg-emerald-700 active:scale-95 disabled:cursor-not-allowed disabled:bg-slate-300 disabled:hover:scale-100\"\n >\n <ArrowUpIcon className=\"h-[18px] w-[18px]\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Drag overlay hint */}\n {isDragOver && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center rounded-2xl bg-emerald-50/60 text-xs font-medium text-emerald-700\">\n Thả ảnh vào đây\n </div>\n )}\n </div>\n\n {/* Footer hint + alerts */}\n <p className=\"mt-1.5 px-1 text-[10px] text-slate-500\">\n Dán ảnh (Ctrl+V), kéo thả, hoặc bấm <span aria-hidden>📎</span> để đính ảnh đề.\n </p>\n\n {error && (\n <p role=\"alert\" className=\"mt-1 px-1 text-xs text-red-600\">\n {error}\n </p>\n )}\n {ocrError && (\n <p role=\"alert\" className=\"mt-1 px-1 text-xs text-red-600\">\n {ocrError}\n </p>\n )}\n {ocrWarning && (\n <p className=\"mt-1 rounded bg-amber-50 px-2 py-1 text-[11px] text-amber-700\">\n {ocrWarning}\n </p>\n )}\n </div>\n );\n}\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, useSyncExternalStore } from 'react';\nimport { MiniBoard2D, type MiniBoardHandle, type GeomTool, type ObjectSnapshot, type SelectionStateSnapshot, type TransformPopoverInfo } from './MiniBoard';\nimport { serializeBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { MultiPropertiesPopover } from './MultiPropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { buildObjectSnapshot } from './snapshot';\nimport { UndoIcon, RedoIcon } from './icons';\nimport { useEditorState, type State, type Store } from '../../../core/scene';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost, useToast } from '../../shared/Toast';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { AiFigurePrompt } from './AiFigurePrompt';\n\ninterface Props {\n /** Scene store do Host tạo qua `useStampStore`. View info đã ở store.meta.view. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GeomTool;\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 /** 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. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n /** Báo lên Host khi selection đổi qua action trong editor. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Client-safe bridge to a server-side AI generation call. */\n generateGeometryFigure?: GenerateGeometryFigure;\n}\n\nexport interface GeometryEditorPanelHandle {\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n /** Highlight object theo id từ bên ngoài (ObjectListPanel trong Host). */\n selectObject: (id: string | null) => void;\n}\n\nconst GeometryEditorPanelInner = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanelInner(\n {\n store,\n onInsert,\n onClose,\n withLeftPanel = false,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n onSelectionChange,\n generateGeometryFigure,\n },\n ref,\n ) {\n const { showToast } = useToast();\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n /** Multi-select snapshot — render compact popover khi ids.length > 1. */\n const [multiSelection, setMultiSelection] = useState<SelectionStateSnapshot | null>(null);\n // Handlers emit cả 6 transform tool (rotate/dilate/regularPolygon/translate/\n // reflectLine/reflectPoint); TransformParamPopover chỉ render 3 tool có\n // numeric param — guard ở chỗ render.\n const [transformPopover, setTransformPopover] = useState<TransformPopoverInfo>(null);\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 // Reactive scene state — for AiFigurePrompt currentState (multi-step refine).\n const currentSceneState = useSyncExternalStore(\n (cb) => store.subscribe(cb),\n () => store.getState(),\n () => store.getState(),\n );\n\n // hasContent: track store size để gate Insert button.\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 const h = handleRef.current;\n if (!h) return;\n setReady(true);\n h.onSelect((snap: ObjectSnapshot) => {\n setPropsPopover(snap);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(snap.id);\n });\n h.onTransformParam((info) => setTransformPopover(info));\n // selection-state channel: fire mỗi khi selectedSetRef đổi (click,\n // shift-click, marquee, clearSelection). Derive popover từ size:\n // 0 → ẩn cả 2 popover\n // 1 → single PropertiesPopover (derive ObjectSnapshot từ store)\n // ≥2 → MultiPropertiesPopover (compact: color + delete)\n h.onSelectionState((snap) => {\n if (!snap || snap.ids.length === 0) {\n setPropsPopover(null);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n return;\n }\n if (snap.ids.length === 1) {\n const id = snap.ids[0];\n const single = buildObjectSnapshot(store.getState(), id, snap.anchor);\n if (single) {\n setPropsPopover(single);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(id);\n }\n return;\n }\n setMultiSelection(snap);\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n });\n }, [store]);\n\n const dismissPropsPopover = useCallback(() => {\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const dismissMultiPopover = useCallback(() => {\n setMultiSelection(null);\n handleRef.current?.clearSelection();\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const applyMultiColor = useCallback((color: string) => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { attrs: { strokeColor: color, color } });\n }\n }, [multiSelection]);\n\n const applyMultiDelete = useCallback(() => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { remove: true });\n }\n h.clearSelection();\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n }, [multiSelection]);\n\n // Build serialized state (format v2) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const h = handleRef.current;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const bbox = h.getBbox();\n const jsonState = serializeBoard(state, { bbox, showAxis, showGrid });\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert, showAxis, showGrid]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n const loadAiFigure = useCallback((generated: State) => {\n handleRef.current?.clearSelection();\n setPropsPopover(null);\n setMultiSelection(null);\n setTransformPopover(null);\n onSelectionChangeRef.current?.(undefined);\n const current = store.getState();\n store.dispatch({\n type: 'LOAD',\n payload: { state: { ...generated, meta: current.meta } },\n });\n }, [store]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(handleRef.current?.getState().objects ?? {}).length > 0,\n selectObject: (id) => handleRef.current?.highlight(id),\n }), [performInsert]);\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=\"Dựng hình học\"\n data-testid=\"geometry-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 <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\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 <UndoIcon />\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 <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\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=\"geometry-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 onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\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 {generateGeometryFigure && (\n <AiFigurePrompt generator={generateGeometryFigure} onGenerated={loadAiFigure} currentState={currentSceneState} />\n )}\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex-1\">\n <MiniBoard2D\n ref={handleRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReady={handleReady}\n isDark={isDark}\n toast={showToast}\n />\n </div>\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {multiSelection && multiSelection.ids.length > 1 && (\n <MultiPropertiesPopover\n anchor={multiSelection.anchor}\n count={multiSelection.ids.length}\n isDark={isDark}\n onColor={applyMultiColor}\n onDelete={applyMultiDelete}\n onClose={dismissMultiPopover}\n />\n )}\n\n {transformPopover && (transformPopover.tool === 'rotate' || transformPopover.tool === 'dilate' || transformPopover.tool === 'regularPolygon' || transformPopover.tool === 'circleCR') && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : transformPopover.tool === 'circleCR' ? 3\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\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, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <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 onClick={handleInsert}\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=\"geometry-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 GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GeometryEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","// src/stamps/geometry-2d/editor/dslRenderRow.tsx\n//\n// Factory tạo renderRow cho `StampLeftPanel.objects.renderRow`. Reuse shared\n// `ObjectRow` nhưng inject `describeDsl` cho title → tab Đối tượng hiển thị\n// mô tả DSL-style (issue #41).\n\nimport type { ReactNode } from 'react';\nimport { ObjectRow } from '../../../core/scene/ui/ObjectRow';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\nimport { describeDsl } from '../dsl/describeDsl';\n\nexport function makeDslRenderRow(store: Store) {\n return function renderDslRow(\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ): ReactNode {\n const state = store.getState();\n const noop = () => { /* rename + color stub theo ObjectRow default */ };\n return (\n <ObjectRow\n obj={obj}\n state={state}\n selected={defaults.selected}\n onSelect={defaults.onClick}\n onToggleVisible={(id) => {\n const o = state.objects[id];\n if (!o) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !o.visible } } });\n }}\n onToggleLocked={(id) => {\n const o = state.objects[id];\n if (!o) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !o.locked } } });\n }}\n onRename={noop}\n onChangeColor={noop}\n onDelete={(id) => store.dispatch({ type: 'DELETE', payload: { id } })}\n describe={describeDsl}\n />\n );\n };\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { GeometryIconHeader } from './editor/icons';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, GROUP_LABELS, TOOLS, letterForGroup, type GeomGroup } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { deserializeBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport { DEFAULT_VIEW_2D, type State } from '../../core/scene';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport { makeDslRenderRow } from './editor/dslRenderRow';\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGeometryCustomData(data)) return null;\n return deserializeBoard(data.jsonState);\n}\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark, generateGeometryFigure }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('2d', editingElement, parseInitialState);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const [selectedTool, setSelectedTool] = useState<GeomTool>('move');\n const [showAxis, setShowAxis] = useState<boolean>(initialView.showAxis);\n const [showGrid, setShowGrid] = useState<boolean>(initialView.showGrid);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\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 { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => setSelectedTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const renderRow = useMemo(() => makeDslRenderRow(sceneStore), [sceneStore]);\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: (): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry 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 return (\n <>\n <StampLeftPanel<GeomTool, GeomGroup>\n title=\"Hình học\"\n icon={GeometryIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.selectObject(id);\n },\n renderRow,\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GeometryEditorPanel\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 withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n generateGeometryFigure={generateGeometryFigure}\n />\n </>\n );\n },\n);\n"]}