@xom11/whiteboard 0.11.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/dist/{ExcalidrawWithMenus-EAVPOPJZ.mjs → ExcalidrawWithMenus-WENZRYYE.mjs} +2 -3
- package/dist/ExcalidrawWithMenus-WENZRYYE.mjs.map +1 -0
- package/dist/catalog.json +57 -0
- package/dist/chunk-4D5CSIJO.mjs +1167 -0
- package/dist/chunk-4D5CSIJO.mjs.map +1 -0
- package/dist/chunk-5UTGXHLJ.mjs +57 -0
- package/dist/chunk-5UTGXHLJ.mjs.map +1 -0
- package/dist/chunk-6V4SH4JJ.mjs +1801 -0
- package/dist/chunk-6V4SH4JJ.mjs.map +1 -0
- package/dist/chunk-AZIARTGX.mjs +23 -0
- package/dist/chunk-AZIARTGX.mjs.map +1 -0
- package/dist/chunk-BKSXPNPQ.mjs +348 -0
- package/dist/chunk-BKSXPNPQ.mjs.map +1 -0
- package/dist/{chunk-YVJP7NRG.mjs → chunk-CRAPWQKJ.mjs} +7 -9
- package/dist/chunk-CRAPWQKJ.mjs.map +1 -0
- package/dist/chunk-CSCF3YFZ.mjs +388 -0
- package/dist/chunk-CSCF3YFZ.mjs.map +1 -0
- package/dist/chunk-HNQLZIEP.mjs +78 -0
- package/dist/chunk-HNQLZIEP.mjs.map +1 -0
- package/dist/chunk-IBTRMWD6.mjs +28 -0
- package/dist/chunk-IBTRMWD6.mjs.map +1 -0
- package/dist/chunk-ICR4CVOE.mjs +57 -0
- package/dist/chunk-ICR4CVOE.mjs.map +1 -0
- package/dist/chunk-LVNCYP4J.mjs +57 -0
- package/dist/chunk-LVNCYP4J.mjs.map +1 -0
- package/dist/chunk-MFOGFFIL.mjs +95 -0
- package/dist/chunk-MFOGFFIL.mjs.map +1 -0
- package/dist/chunk-NVJ7K3DK.mjs +29 -0
- package/dist/chunk-NVJ7K3DK.mjs.map +1 -0
- package/dist/chunk-O4WIZFRQ.mjs +11 -0
- package/dist/chunk-O4WIZFRQ.mjs.map +1 -0
- package/dist/{chunk-C6SCVOMC.mjs → chunk-QGNU34T7.mjs} +5 -41
- package/dist/chunk-QGNU34T7.mjs.map +1 -0
- package/dist/chunk-R5FL6S7L.mjs +22 -0
- package/dist/chunk-R5FL6S7L.mjs.map +1 -0
- package/dist/{chunk-7P7SQFOW.mjs → chunk-SGFJLHHG.mjs} +3 -3
- package/dist/chunk-SGFJLHHG.mjs.map +1 -0
- package/dist/{chunk-PWIMZIB6.mjs → chunk-WWMQ2VHZ.mjs} +7 -8
- package/dist/chunk-WWMQ2VHZ.mjs.map +1 -0
- package/dist/chunk-YIPI3WUL.mjs +61 -0
- package/dist/chunk-YIPI3WUL.mjs.map +1 -0
- package/dist/chunk-ZBJBQKJ2.mjs +330 -0
- package/dist/chunk-ZBJBQKJ2.mjs.map +1 -0
- package/dist/geometry-2d.d.mts +3 -6
- package/dist/geometry-2d.d.ts +3 -6
- package/dist/geometry-2d.js +7007 -2633
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +8 -4
- package/dist/geometry-3d.d.mts +4 -7
- package/dist/geometry-3d.d.ts +4 -7
- package/dist/geometry-3d.js +5446 -2507
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +7 -4
- package/dist/graph-2d.d.mts +4 -7
- package/dist/graph-2d.d.ts +4 -7
- package/dist/graph-2d.js +5300 -1677
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +10 -3
- package/dist/host-DOAYVL35.mjs +3199 -0
- package/dist/host-DOAYVL35.mjs.map +1 -0
- package/dist/host-GKNQBBUE.mjs +1142 -0
- package/dist/host-GKNQBBUE.mjs.map +1 -0
- package/dist/{host-Z3TEJKZA.mjs → host-QS2EOTRJ.mjs} +4 -4
- package/dist/{host-Z3TEJKZA.mjs.map → host-QS2EOTRJ.mjs.map} +1 -1
- package/dist/host-TLIXN4CF.mjs +2374 -0
- package/dist/host-TLIXN4CF.mjs.map +1 -0
- package/dist/index.css +4 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +659 -19
- package/dist/index.d.ts +659 -19
- package/dist/index.js +13736 -9491
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1465 -342
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +3 -4
- package/dist/latex.d.ts +3 -4
- package/dist/latex.js +33 -18
- package/dist/latex.js.map +1 -1
- package/dist/latex.mjs +2 -3
- package/dist/render-SA4JTOW3.mjs +8 -0
- package/dist/render-SA4JTOW3.mjs.map +1 -0
- package/dist/serialize-3NZS6A6Q.mjs +6 -0
- package/dist/serialize-3NZS6A6Q.mjs.map +1 -0
- package/dist/{types-CinstD7T.d.mts → types-rA4slL08.d.mts} +69 -4
- package/dist/{types-CinstD7T.d.ts → types-rA4slL08.d.ts} +69 -4
- package/package.json +34 -6
- package/dist/ExcalidrawWithMenus-EAVPOPJZ.mjs.map +0 -1
- package/dist/chunk-74VEEZBV.mjs +0 -619
- package/dist/chunk-74VEEZBV.mjs.map +0 -1
- package/dist/chunk-7P7SQFOW.mjs.map +0 -1
- package/dist/chunk-BJTO5JO5.mjs +0 -11
- package/dist/chunk-BJTO5JO5.mjs.map +0 -1
- package/dist/chunk-C6SCVOMC.mjs.map +0 -1
- package/dist/chunk-D257NCQW.mjs +0 -58
- package/dist/chunk-D257NCQW.mjs.map +0 -1
- package/dist/chunk-G7FR3AIV.mjs +0 -193
- package/dist/chunk-G7FR3AIV.mjs.map +0 -1
- package/dist/chunk-HTBLO5JO.mjs +0 -41
- package/dist/chunk-HTBLO5JO.mjs.map +0 -1
- package/dist/chunk-PWIMZIB6.mjs.map +0 -1
- package/dist/chunk-SBDMF4NQ.mjs +0 -212
- package/dist/chunk-SBDMF4NQ.mjs.map +0 -1
- package/dist/chunk-WQOABS6N.mjs +0 -197
- package/dist/chunk-WQOABS6N.mjs.map +0 -1
- package/dist/chunk-YVJP7NRG.mjs.map +0 -1
- package/dist/host-N6ACNJKI.mjs +0 -3226
- package/dist/host-N6ACNJKI.mjs.map +0 -1
- package/dist/host-NKGV6RF2.mjs +0 -1134
- package/dist/host-NKGV6RF2.mjs.map +0 -1
- package/dist/host-XVK7UCRE.mjs +0 -2908
- package/dist/host-XVK7UCRE.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stamps/graph-2d/editor/handlers.ts","../src/stamps/graph-2d/editor/MiniBoard.tsx","../src/stamps/graph-2d/editor/EditorPanel.tsx","../src/stamps/graph-2d/editor/tools.tsx","../src/stamps/graph-2d/editor/rows/FunctionRow.tsx","../src/stamps/graph-2d/editor/rows/ParameterRow.tsx","../src/stamps/graph-2d/host.tsx"],"names":["id","MiniBoard","useRef","useEffect","useImperativeHandle","jsx","GraphEditorPanel","jsxs","Fragment","useState","forwardRef","Graph2DStampHost","useCallback"],"mappings":"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","file":"host-GKNQBBUE.mjs","sourcesContent":["// src/stamps/graph-2d/editor/handlers.ts\nimport type { Store } from '../../../core/scene/store';\nimport type { GraphTool } from './tools';\n\nexport interface HandlerCtx {\n store: Store;\n toolRef: { current: GraphTool };\n pendingIdsRef: { current: string[] };\n pushPending: (id: string) => void;\n clearPending: () => void;\n setTool: (t: GraphTool) => void;\n nextLabel: (kind: string) => string;\n /** Lookup nearest function2d id within vertical hit tolerance. */\n getNearestFunctionId: (coord: { x: number; y: number }) => string | null;\n /** Lookup any object at coord via JSXGraph hasPoint (pointOnCurve, point, etc.). */\n getHitObjectId: (coord: { x: number; y: number }) => string | null;\n}\n\nexport interface Coord { x: number; y: number; }\n\nexport function handleDown(ctx: HandlerCtx, coord: Coord): void {\n const tool = ctx.toolRef.current;\n switch (tool) {\n case 'move':\n return;\n case 'point':\n addFreePoint(ctx, coord);\n return;\n case 'slider':\n // Opens dialog separately — handled in EditorPanel. Reset tool.\n ctx.setTool('move');\n return;\n case 'pointOnCurve':\n addPointOnCurve(ctx, coord);\n return;\n case 'intersect':\n handleIntersect(ctx, coord);\n return;\n case 'tangent':\n handleTangent(ctx, coord);\n return;\n case 'slope':\n handleSlope(ctx, coord);\n return;\n case 'extremum':\n case 'root':\n handleAnalysisTool(ctx, coord, tool);\n return;\n case 'segment':\n case 'line':\n handleTwoPointTool(ctx, coord, tool);\n return;\n case 'polygon':\n handlePolygonTool(ctx, coord);\n return;\n }\n}\n\nfunction addFreePoint(ctx: HandlerCtx, coord: Coord): void {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction addPointOnCurve(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n const id = ctx.nextLabel('pointOnCurve');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'pointOnCurve', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, x: coord.x },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleIntersect(ctx: HandlerCtx, coord: Coord): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(fid);\n return;\n }\n const fa = ctx.pendingIdsRef.current[0];\n if (fa === fid) return;\n const id = ctx.nextLabel('intersection');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'intersection', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n // NOTE: 'lineLine' is semantically imprecise for function2d curves but\n // works as a discriminant tag — TODO refactor to 'curveCurve' kind in\n // a follow-up when intersection kind is extended.\n attrs: { kind: 'lineLine', ref1: fa, ref2: fid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handleTangent(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('tangent2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'tangent2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleSlope(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n if (!hitId) return;\n const obj = ctx.store.getState().objects[hitId];\n if (!obj || obj.kind !== 'pointOnCurve') return;\n const id = ctx.nextLabel('slope2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'slope2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { pointId: hitId },\n },\n },\n });\n ctx.setTool('move');\n}\n\nfunction handleAnalysisTool(ctx: HandlerCtx, coord: Coord, tool: 'extremum' | 'root'): void {\n const fid = ctx.getNearestFunctionId(coord);\n if (!fid) return;\n // MVP: use default domain [-10, 10]. UI can override via properties post-creation.\n if (tool === 'extremum') {\n const id = ctx.nextLabel('extremum2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'extremum2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 }, mode: 'min' },\n },\n },\n });\n } else {\n const id = ctx.nextLabel('root2d');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'root2d', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { functionId: fid, interval: { min: -10, max: 10 } },\n },\n },\n });\n }\n ctx.setTool('move');\n}\n\nfunction handleTwoPointTool(ctx: HandlerCtx, coord: Coord, tool: 'segment' | 'line'): void {\n const hitId = ctx.getHitObjectId(coord);\n const pid = hitId ?? (() => {\n // Auto-add free point at click location\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n if (ctx.pendingIdsRef.current.length === 0) {\n ctx.pushPending(pid);\n return;\n }\n const p1 = ctx.pendingIdsRef.current[0];\n if (p1 === pid) return;\n const id = ctx.nextLabel(tool);\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: tool, label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1, attrs: { p1, p2: pid },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n}\n\nfunction handlePolygonTool(ctx: HandlerCtx, coord: Coord): void {\n const hitId = ctx.getHitObjectId(coord);\n // Close polygon if clicking first pending point and have ≥3 vertices\n if (hitId && ctx.pendingIdsRef.current[0] === hitId && ctx.pendingIdsRef.current.length >= 3) {\n const id = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'polygon', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { points: [...ctx.pendingIdsRef.current] },\n },\n },\n });\n ctx.clearPending();\n ctx.setTool('move');\n return;\n }\n // Otherwise add new point + push to pending\n const pid = hitId ?? (() => {\n const id = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id, kind: 'point', label: id, visible: true, locked: false,\n layer: 'default', schemaVersion: 1,\n attrs: { constraint: { kind: 'free', x: coord.x, y: coord.y } },\n },\n },\n });\n return id;\n })();\n ctx.pushPending(pid);\n}\n","'use client';\n// src/stamps/graph-2d/editor/MiniBoard.tsx\n//\n// JSXGraph mini-board cho graph-2d editor.\n// Reuses the pattern from geometry-2d/editor/MiniBoard.tsx adapted for graph2d domain:\n// - createEmptyState('graph2d') instead of '2d'\n// - Init view from state.meta.view (default [-10, 10])\n// - getNearestFunctionId / findHitObject helpers for graph-specific hit-test\n// - Tools from TOOLS / GraphTool\n\nimport React, { useEffect, useId, useImperativeHandle, useRef } from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type State,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport type { Store } from '../../../core/scene/store';\nimport { paletteFor } from './theme';\nimport { handleDown, type HandlerCtx } from './handlers';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GraphTool } from './tools';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\n\n \ntype JxgObj = any;\n\n/**\n * Imperative handle exposed bởi MiniBoard. Sau Tier 2 F: tool / showAxis /\n * showGrid / undo-redo do host owns; handle chỉ giữ state read + highlight +\n * bbox.\n */\nexport interface MiniBoardHandle {\n getState: () => State;\n getStore: () => Store;\n highlight: (id: string | null) => void;\n getContainer: () => HTMLDivElement | null;\n getBbox: () => [number, number, number, number];\n}\n\ninterface MiniBoardProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n onReady?: () => void;\n onSelectionChange?: (id: string | undefined) => void;\n}\n\nexport const MiniBoard = React.forwardRef<MiniBoardHandle, MiniBoardProps>(\n function MiniBoard(\n { store, selectedTool, showAxis, showGrid, isDark, onReady, onSelectionChange: _onSelectionChange },\n ref,\n ) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_graph_jxg';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const rendererRef = useRef<JxgRenderer | null>(null);\n\n const toolSM = useToolStateMachine<GraphTool>(selectedTool);\n\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n // Tier 2 F — sync `selectedTool` prop → internal toolSM.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) toolSM.setTool(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init ────────────────────────────────────────────────────────────\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n\n void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.graph',\n boardOptions: {\n boundingbox: [-10, 10, 10, -10],\n axis: showAxisRef.current,\n grid: showGridRef.current,\n showCopyright: false,\n showNavigation: true,\n keepAspectRatio: false,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n const theme = paletteFor(isDarkRef.current);\n rendererRef.current = new JxgRenderer(store, board, { theme });\n\n // Ctrl/Cmd + wheel zoom\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.graph');\n }\n\n // Pointer-down handler — only active when tool != move\n const onDown = (evt: JxgObj) => {\n const b = boardRef.current;\n if (!b || toolSM.toolRef.current === 'move') return;\n\n // Convert JSXGraph event → user-space coords.\n // Pattern from geometry-3d MiniBoard3D: use getUsrCoordsOfMouse if available,\n // fall back to manual calculation via board.origin + unitX/unitY.\n let ux = 0, uy = 0;\n safeJsx('MiniBoard.graph.pointerCoords', () => {\n \n const usr = (b as any).getUsrCoordsOfMouse?.(evt);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n ux = usr[0] as number; uy = usr[1] as number;\n } else if (b.origin?.scrCoords && containerRef.current) {\n // Fallback: manual pixel → user-space\n const rect = containerRef.current.getBoundingClientRect();\n const px = (evt.clientX ?? 0) - rect.left;\n const py = (evt.clientY ?? 0) - rect.top;\n const ox = b.origin.scrCoords[1];\n const oy = b.origin.scrCoords[2];\n const bUnitX = b.unitX || 1;\n const bUnitY = b.unitY || 1;\n ux = (px - ox) / bUnitX;\n uy = (oy - py) / bUnitY;\n }\n });\n\n const ctx: HandlerCtx = {\n store,\n toolRef: toolSM.toolRef,\n pendingIdsRef: toolSM.pendingIdsRef,\n pushPending: toolSM.pushPending,\n clearPending: toolSM.clearPending,\n setTool: toolSM.setTool,\n nextLabel: (kind) => sceneNextLabel(store.getState(), kind),\n getNearestFunctionId: ({ x, y }) =>\n findNearestFunction(b, store, rendererRef.current, x, y),\n getHitObjectId: ({ x, y }) =>\n findHitObject(b, rendererRef.current, x, y),\n };\n safeJsx('MiniBoard.graph.handleDown', () =>\n handleDown(ctx, { x: ux, y: uy }),\n );\n };\n\n board.on('down', onDown);\n onReady?.();\n })();\n\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n rendererRef.current?.dispose();\n rendererRef.current = null;\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n useImperativeHandle(\n ref,\n () => ({\n getState: () => store.getState(),\n getStore: () => store,\n highlight: (id) => rendererRef.current?.highlight(id),\n getContainer: () => containerRef.current,\n getBbox: () => boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n }),\n [store],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"graph-miniboard\"\n className=\"h-full w-full\"\n style={{ touchAction: 'none' }}\n />\n );\n },\n);\n\n// ─── Hit-test helpers ──────────────────────────────────────────────────────────\n\n/**\n * Find the id of the nearest function2d object within vertical tolerance `tolY`\n * (in world/user-space units — default 0.5 units; may need tuning for zoom levels).\n *\n * Iterates over function2d objects in state.order and evaluates el.Y(x) on the\n * JSXGraph functiongraph element via JxgRenderer.getElement(id).\n */\nfunction findNearestFunction(\n _board: JxgObj,\n store: Store,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n tolY = 0.5,\n): string | null {\n if (!renderer) return null;\n const state = store.getState();\n let bestId: string | null = null;\n let bestDist = Infinity;\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind !== 'function2d') continue;\n const el = renderer.getElement(id) as { Y?: (x: number) => number } | null;\n if (!el || typeof el.Y !== 'function') continue;\n let fy: number;\n try {\n fy = el.Y(x);\n } catch {\n continue;\n }\n if (!Number.isFinite(fy)) continue;\n const d = Math.abs(y - fy);\n if (d < tolY && d < bestDist) {\n bestDist = d;\n bestId = id;\n }\n }\n return bestId;\n}\n\n/**\n * Find the id of any rendered object at (x, y) by delegating to JSXGraph hasPoint.\n * Creates a temporary invisible point at (x, y) in screen coords to call hasPoint.\n */\nfunction findHitObject(\n board: JxgObj,\n renderer: JxgRenderer | null,\n x: number,\n y: number,\n): string | null {\n if (!renderer || !board) return null;\n // Create a temporary invisible probe point at user coords\n let screen: JxgObj | null = null;\n try {\n screen = board.create('point', [x, y], { visible: false, withLabel: false, name: '' });\n } catch {\n return null;\n }\n let result: string | null = null;\n try {\n for (const [id, el] of renderer.listElements().entries()) {\n \n const e = el as any;\n if (e?.hasPoint?.(screen.X(), screen.Y())) {\n result = id;\n break;\n }\n }\n } finally {\n try { board.removeObject(screen); } catch { /* ignore */ }\n }\n return result;\n}\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { MiniBoard, type MiniBoardHandle } from './MiniBoard';\nimport { useEditorState, type Store } from '../../../core/scene';\nimport type { GraphTool } from './tools';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost } from '../../shared/Toast';\n\n// ---------- Public handle ----------\n\nexport interface GraphEditorPanelHandle {\n insert: () => boolean;\n hasContent: () => boolean;\n getStore: () => Store | null;\n highlight: (id: string | null) => void;\n}\n\n// ---------- Props ----------\n\nexport interface GraphEditorPanelProps {\n /** Scene store do Host tạo qua `useStampStore`. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Callback khi selection thay đổi qua editor action. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GraphTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n /** Notify host về canUndo/canRedo qua store subscribe (Tier 2 F). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n isDark?: boolean;\n /** Khi true (desktop) panel offset left chừa chỗ LeftPanel. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo/insert buttons. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n}\n\n// ---------- Component ----------\n\nconst GraphEditorPanelInner = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(\n {\n store,\n onInsert,\n onClose,\n onSelectionChange,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n },\n ref,\n ) {\n const miniRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const onSelectionChangeRef = useRef(onSelectionChange);\n useEffect(() => { onSelectionChangeRef.current = onSelectionChange; }, [onSelectionChange]);\n\n // Tier 2 F — propagate canUndo/canRedo + keyboard shortcuts qua shared hook.\n useEditorState({ store, onHistoryChange });\n\n useEffect(() => {\n const sync = () => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n const handleReady = useCallback(() => {\n setReady(true);\n }, []);\n\n // ---------- Insert ----------\n\n const performInsert = useCallback((): boolean => {\n const h = miniRef.current;\n if (!h) return false;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n // Fire async SVG export\n void (async () => {\n try {\n const { renderGraphSvgFromState } = await import('../render');\n const { stringifySceneState } = await import('../serialize');\n const jsonState = stringifySceneState(state);\n const svgString = await renderGraphSvgFromState(state, !!isDark);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('[GraphEditorPanel] insert failed:', err);\n }\n })();\n return true;\n }, [isDark, onInsert]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(miniRef.current?.getState().objects ?? {}).length > 0,\n getStore: () => miniRef.current?.getStore() ?? null,\n highlight: (id) => miniRef.current?.highlight(id),\n }), [performInsert]);\n\n // ---------- Layout ----------\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Đồ thị hàm số\"\n data-testid=\"graph-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n Đồ thị hàm số\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button\n type=\"button\"\n data-testid=\"graph-editor-close-btn\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* MiniBoard */}\n <div className=\"flex-1 min-h-0\">\n <MiniBoard\n ref={miniRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n isDark={isDark}\n onReady={handleReady}\n onSelectionChange={(id) => {\n onSelectionChangeRef.current?.(id);\n }}\n />\n </div>\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, nhấp trên bảng để tương tác.</span>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n type=\"button\"\n onClick={performInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"graph-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const GraphEditorPanel = forwardRef<GraphEditorPanelHandle, GraphEditorPanelProps>(\n function GraphEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GraphEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","// src/stamps/graph-2d/editor/tools.ts\n//\n// Graph-2d tool catalog. 12 tools chia thành 4 groups (basic/function/analysis/draw).\n// Field naming `key` (đã đổi từ `id` ở Phase 4) khớp StampToolDef trong shared template.\n//\n// Shortcuts: single-letter (không chord 2-key). Vì graph chỉ có 12 tool —\n// đủ phím không cần chord. Editor là separate instance nên K/L/M có thể trùng\n// với 2D mà không conflict (chỉ 1 editor active tại 1 thời điểm).\n\nimport type { ReactNode } from 'react';\nimport React from 'react';\n\nexport type GraphTool =\n | 'move'\n | 'point'\n | 'slider'\n | 'pointOnCurve'\n | 'intersect'\n | 'tangent'\n | 'slope'\n | 'extremum'\n | 'root'\n | 'segment'\n | 'line'\n | 'polygon';\n\nexport type GraphToolGroup = 'basic' | 'function' | 'analysis' | 'draw';\n\nexport interface ToolDef {\n key: GraphTool;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: GraphToolGroup;\n shortcut?: string;\n}\n\nexport const GROUPS: GraphToolGroup[] = ['basic', 'function', 'analysis', 'draw'];\n\nexport const GROUP_LABELS: Record<GraphToolGroup, string> = {\n basic: 'Cơ bản',\n function: 'Hàm',\n analysis: 'Phân tích',\n draw: 'Vẽ',\n};\n\n// =============== Inline SVG icons (currentColor stroke, viewBox 24x24) ===============\n\nconst C_POINT = '#2563eb'; // blue\nconst C_FUNC = '#059669'; // emerald\nconst C_HELP = '#dc2626'; // red helper\n\nconst wrap = (children: ReactNode): React.ReactElement => (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {children}\n </svg>\n);\n\nconst Icon = {\n move: wrap(<path d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\" fill=\"currentColor\" fillOpacity=\"0.12\" />),\n point: wrap(<><circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_POINT} stroke=\"none\" /><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"none\" /></>),\n slider: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><circle cx=\"15\" cy=\"12\" r=\"2.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n pointOnCurve: wrap(<><path d=\"M3 18 Q8 4 14 14 T21 6\" /><circle cx=\"14\" cy=\"14\" r=\"2\" fill={C_POINT} stroke=\"none\" /></>),\n intersect: wrap(<><path d=\"M3 6 Q12 22 21 6\" /><path d=\"M3 18 Q12 2 21 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_POINT} stroke=\"none\" /></>),\n tangent: wrap(<><path d=\"M3 16 Q12 4 21 16\" stroke={C_FUNC} /><line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" stroke={C_HELP} strokeDasharray=\"3 2\" /><circle cx=\"12\" cy=\"10\" r=\"1.8\" fill={C_POINT} stroke=\"none\" /></>),\n slope: wrap(<><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"6\" /><line x1=\"4\" y1=\"20\" x2=\"14\" y2=\"20\" stroke={C_HELP} strokeDasharray=\"2 2\" /><line x1=\"14\" y1=\"20\" x2=\"14\" y2=\"11\" stroke={C_HELP} strokeDasharray=\"2 2\" /></>),\n extremum: wrap(<><path d=\"M3 20 Q9 4 15 16 T21 8\" /><circle cx=\"9\" cy=\"8.5\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /><circle cx=\"15\" cy=\"16\" r=\"1.8\" fill={C_HELP} stroke=\"none\" /></>),\n root: wrap(<><line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" /><path d=\"M5 6 Q9 18 12 12 Q15 6 19 18\" /><circle cx=\"12\" cy=\"12\" r=\"1.6\" fill={C_HELP} stroke=\"none\" /></>),\n segment: wrap(<><line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" /><circle cx=\"5\" cy=\"18\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"6\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n line: wrap(<><line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" /><circle cx=\"9\" cy=\"14.7\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"15\" cy=\"9.3\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" /></>),\n polygon: wrap(<><polygon points=\"5,18 12,4 19,12 16,20 8,20\" fill=\"currentColor\" fillOpacity=\"0.12\" /><circle cx=\"5\" cy=\"18\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"12\" cy=\"4\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /><circle cx=\"19\" cy=\"12\" r=\"1.2\" fill=\"currentColor\" stroke=\"none\" /></>),\n};\n\n// =============== TOOLS array ===============\n\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Di chuyển / chọn', icon: Icon.move, group: 'basic', shortcut: 'S' },\n { key: 'point', label: 'Điểm', hint: 'Tạo điểm tự do', icon: Icon.point, group: 'basic', shortcut: 'P' },\n { key: 'slider', label: 'Slider', hint: 'Tạo tham số', icon: Icon.slider, group: 'basic', shortcut: 'B' },\n { key: 'pointOnCurve', label: 'Điểm trên đồ thị', hint: 'Tạo điểm trên hàm số', icon: Icon.pointOnCurve, group: 'function', shortcut: 'O' },\n { key: 'intersect', label: 'Giao điểm', hint: 'Giao 2 đồ thị', icon: Icon.intersect, group: 'function', shortcut: 'I' },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Tiếp tuyến tại điểm', icon: Icon.tangent, group: 'function', shortcut: 'T' },\n { key: 'slope', label: 'Hệ số góc', hint: 'Slope triangle', icon: Icon.slope, group: 'function', shortcut: 'K' },\n { key: 'extremum', label: 'Cực trị', hint: 'Tìm cực trị trong khoảng', icon: Icon.extremum, group: 'analysis', shortcut: 'E' },\n { key: 'root', label: 'Nghiệm', hint: 'Tìm nghiệm trong khoảng', icon: Icon.root, group: 'analysis', shortcut: 'R' },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Vẽ đoạn thẳng', icon: Icon.segment, group: 'draw', shortcut: 'M' },\n { key: 'line', label: 'Đường thẳng', hint: 'Vẽ đường thẳng', icon: Icon.line, group: 'draw', shortcut: 'L' },\n { key: 'polygon', label: 'Đa giác', hint: 'Vẽ đa giác', icon: Icon.polygon, group: 'draw', shortcut: 'Y' },\n];\n","'use client';\nimport React, { useEffect, useState, type KeyboardEvent } from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { Function2DAttrs } from '../../../../core/scene/kinds/function2d';\nimport type { Store } from '../../../../core/scene/store';\nimport { compile } from '../../../../core/scene/expressions/parser';\n\nexport interface FunctionRowProps {\n obj: SceneObject<Function2DAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function FunctionRow({ obj, store, selected, onClick }: FunctionRowProps): React.ReactElement {\n const [local, setLocal] = useState(obj.attrs.expression);\n const [error, setError] = useState<string | null>(null);\n\n // Sync local draft khi store expression thay đổi từ bên ngoài\n useEffect(() => {\n setLocal(obj.attrs.expression);\n setError(null);\n }, [obj.attrs.expression]);\n\n function commit(value: string) {\n if (value === obj.attrs.expression) {\n setError(null);\n return;\n }\n // Use compile (includes full syntax check via new Function) to validate\n const result = compile(value, {});\n if (typeof result === 'string') {\n // compile returns an error string on failure\n setError(result);\n return;\n }\n setError(null);\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { expression: value } },\n });\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Enter') {\n e.preventDefault();\n commit(local);\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n setLocal(obj.attrs.expression);\n setError(null);\n (e.target as HTMLInputElement).blur();\n }\n }\n\n function handleToggleVisible() {\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { visible: !obj.attrs.visible } },\n });\n }\n\n return (\n <li\n data-testid={`function-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Color swatch */}\n <span\n className=\"inline-block h-3 w-3 shrink-0 rounded-full\"\n style={{ backgroundColor: obj.attrs.color }}\n aria-hidden=\"true\"\n />\n {/* Label */}\n <span className=\"shrink-0 font-mono text-[11px] text-slate-700\">\n {obj.label}(x) =\n </span>\n {/* Expression input */}\n <input\n type=\"text\"\n value={local}\n onChange={(e) => {\n setLocal(e.target.value);\n setError(null);\n }}\n onKeyDown={handleKeyDown}\n onBlur={() => commit(local)}\n onClick={(e) => e.stopPropagation()}\n className={[\n 'min-w-0 flex-1 rounded border px-1.5 py-0.5 font-mono text-xs outline-none focus:ring-1',\n error\n ? 'border-red-400 focus:ring-red-300'\n : 'border-slate-300 focus:ring-blue-300',\n ].join(' ')}\n data-testid={`function-row-input-${obj.id}`}\n aria-label=\"Biểu thức\"\n />\n {/* Error indicator */}\n {error && (\n <span\n data-testid={`function-row-error-${obj.id}`}\n className=\"shrink-0 text-[10px] text-red-600\"\n title={error}\n >\n ⚠\n </span>\n )}\n {/* Visibility toggle */}\n <button\n type=\"button\"\n aria-label=\"Ẩn/hiện hàm\"\n aria-pressed={!obj.attrs.visible}\n onClick={(e) => { e.stopPropagation(); handleToggleVisible(); }}\n className=\"shrink-0 rounded px-1 text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800\"\n >\n {obj.attrs.visible ? '👁' : '🚫'}\n </button>\n </li>\n );\n}\n","'use client';\nimport React from 'react';\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { ParameterAttrs } from '../../../../core/scene/kinds/parameter';\nimport type { Store } from '../../../../core/scene/store';\n\nexport interface ParameterRowProps {\n obj: SceneObject<ParameterAttrs>;\n store: Store;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function ParameterRow({ obj, store, selected, onClick }: ParameterRowProps): React.ReactElement {\n const { value, min, max, step } = obj.attrs;\n\n function handleSliderChange(e: React.ChangeEvent<HTMLInputElement>) {\n const newVal = parseFloat(e.target.value);\n if (!Number.isFinite(newVal)) return;\n store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: obj.id, patch: { value: newVal } },\n });\n }\n\n return (\n <li\n data-testid={`parameter-row-${obj.id}`}\n aria-selected={selected}\n onClick={onClick}\n className={\n 'flex items-center gap-1.5 border-b border-zinc-100 px-2 py-1 text-xs cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : 'hover:bg-zinc-50 dark:hover:bg-zinc-900')\n }\n >\n {/* Label */}\n <span className=\"shrink-0 w-4 font-mono text-[11px] font-semibold text-slate-700\">\n {obj.label}\n </span>\n\n {/* Slider */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleSliderChange}\n onClick={(e) => e.stopPropagation()}\n className=\"min-w-0 flex-1 accent-blue-600\"\n data-testid={`parameter-row-slider-${obj.id}`}\n aria-label={`Tham số ${obj.label}`}\n />\n\n {/* Numeric display */}\n <span\n data-testid={`parameter-row-value-${obj.id}`}\n className=\"shrink-0 w-8 text-right font-mono text-[11px] text-slate-600\"\n >\n {Number.isInteger(value) ? value : parseFloat(value.toFixed(3))}\n </span>\n </li>\n );\n}\n","'use client';\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport React from 'react';\nimport {\n GraphEditorPanel,\n type GraphEditorPanelHandle,\n} from './editor/EditorPanel';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\nimport { isGraph2DCustomData, type Graph2DCustomData } from './types';\nimport { parseSceneState } from './serialize';\nimport { TOOLS, GROUPS, GROUP_LABELS, type GraphTool, type GraphToolGroup } from './editor/tools';\nimport { FunctionRow } from './editor/rows/FunctionRow';\nimport { ParameterRow } from './editor/rows/ParameterRow';\nimport type { Function2DAttrs } from '../../core/scene/kinds/function2d';\nimport type { ParameterAttrs } from '../../core/scene/kinds/parameter';\nimport type { Store } from '../../core/scene/store';\nimport type { SceneObject, State } from '../../core/scene/types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nconst GraphIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 3 L3 21 L21 21\" />\n <path d=\"M6 14 Q9 8 12 10 Q15 12 18 6\" />\n </svg>\n);\n\nfunction makeRenderRow(store: Store) {\n return function renderRow(\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ): React.ReactNode {\n if (obj.kind === 'function2d') {\n return (\n <FunctionRow\n obj={obj as unknown as SceneObject<Function2DAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n if (obj.kind === 'parameter') {\n return (\n <ParameterRow\n obj={obj as unknown as SceneObject<ParameterAttrs>}\n store={store}\n selected={defaults.selected}\n onClick={defaults.onClick}\n />\n );\n }\n // Fallback to default ObjectRow\n return null;\n };\n}\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGraph2DCustomData(data)) return null;\n const state = parseSceneState(data.jsonState);\n if (!state) {\n console.warn('Graph2DStampHost: jsonState corrupted hoặc không hợp lệ');\n return null;\n }\n return state;\n}\n\nexport const Graph2DStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function Graph2DStampHost({ api, editingElement, onClose, isDark }, ref) {\n const panelRef = useRef<GraphEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('graph2d', editingElement, parseInitialState);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === 'graph2d' ? initialMeta.view : null;\n const [selectedTool, setSelectedTool] = useState<GraphTool>('move');\n const [showAxis, setShowAxisState] = useState<boolean>(initialView?.showAxis ?? true);\n const [showGrid, setShowGridState] = useState<boolean>(initialView?.showGrid ?? true);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => sceneStore.undo(), [sceneStore]);\n const handleRedo = useCallback(() => sceneStore.redo(), [sceneStore]);\n\n const handleShowAxisChange = useCallback((b: boolean) => {\n setShowAxisState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showAxis: b } } });\n }, [sceneStore]);\n\n const handleShowGridChange = useCallback((b: boolean) => {\n setShowGridState(b);\n sceneStore.dispatch({ type: 'UPDATE_VIEW', payload: { patch: { showGrid: b } } });\n }, [sceneStore]);\n\n // ---------- Add buttons (dispatch trực tiếp vào store) ----------\n\n const handleAddFunction = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'function2d');\n const id = `f${existing.length + 1}`;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'function2d',\n label: id,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { expression: 'x', color: '#2563eb', visible: true },\n },\n },\n });\n }, [sceneStore]);\n\n const handleAddParameter = useCallback(() => {\n const existing = Object.values(sceneStore.getState().objects).filter((o) => o.kind === 'parameter');\n const labels = 'abcdefghijklmnopqrstuvwxyz';\n const usedLabels = new Set(existing.map((o) => o.label));\n let label = 'a';\n for (const c of labels) {\n if (!usedLabels.has(c)) { label = c; break; }\n }\n const id = label;\n sceneStore.dispatch({\n type: 'ADD',\n payload: {\n obj: {\n id,\n kind: 'parameter',\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs: { value: 1, min: -5, max: 5, step: 0.1 },\n },\n },\n });\n }, [sceneStore]);\n\n // ---------- Insert ----------\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): Graph2DCustomData => ({\n kind: 'graph2d',\n version: 2,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Graph2D insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n const renderRow = useMemo(() => makeRenderRow(sceneStore), [sceneStore]);\n\n return (\n <>\n <StampLeftPanel<GraphTool, GraphToolGroup>\n title=\"Đồ thị\"\n icon={GraphIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUPS}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: handleShowAxisChange,\n onShowGridChange: handleShowGridChange,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.highlight(id);\n },\n renderRow,\n addButtons: [\n { label: '+ Hàm f(x)', testId: 'add-function-btn', onClick: handleAddFunction },\n { label: '+ Tham số', testId: 'add-parameter-btn', onClick: handleAddParameter },\n ],\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GraphEditorPanel\n ref={panelRef}\n store={sceneStore}\n onInsert={handleInsert}\n onClose={onClose}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n isDark={isDark}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n />\n </>\n );\n },\n);\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { renderLatexToSvg, isLatexCustomData } from './chunk-X5R72SSJ.mjs';
|
|
3
3
|
import { useIsMobile } from './chunk-P2AOIF7S.mjs';
|
|
4
|
-
import { insertStampImage } from './chunk-
|
|
5
|
-
import './chunk-
|
|
4
|
+
import { insertStampImage } from './chunk-QGNU34T7.mjs';
|
|
5
|
+
import './chunk-5UTGXHLJ.mjs';
|
|
6
6
|
import { forwardRef, useState, useRef, useEffect, useCallback, useImperativeHandle, useMemo } from 'react';
|
|
7
7
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
8
8
|
|
|
@@ -462,5 +462,5 @@ var LatexStampHost = forwardRef(
|
|
|
462
462
|
);
|
|
463
463
|
|
|
464
464
|
export { LatexStampHost };
|
|
465
|
-
//# sourceMappingURL=host-
|
|
466
|
-
//# sourceMappingURL=host-
|
|
465
|
+
//# sourceMappingURL=host-QS2EOTRJ.mjs.map
|
|
466
|
+
//# sourceMappingURL=host-QS2EOTRJ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/host.tsx"],"names":["EditorPopover","jsxs","jsx","forwardRef","LatexStampHost","useRef","useState","useCallback","useImperativeHandle","Fragment"],"mappings":"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","file":"host-Z3TEJKZA.mjs","sourcesContent":["'use client';\n\nimport React from 'react';\n\n// ---------- Shared shell (latex copy — geometry copy stays in src/stamp/StampLeftPanel.tsx) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\nfunction Shell({ title, icon, onClose, children, isMobile, drawerOpen, onDrawerClose }: ShellProps) {\n const mobileAttrs = isMobile\n ? {\n 'data-mobile-drawer': 'true',\n 'data-drawer-state': drawerOpen ? 'open' : 'closed',\n }\n : {};\n const handleHeaderClose = () => {\n if (isMobile) onDrawerClose?.();\n else onClose();\n };\n return (\n <>\n {isMobile && drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={isMobile && !drawerOpen ? 'true' : undefined}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n {...mobileAttrs}\n className={\n isMobile\n ? 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200'\n }\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={handleHeaderClose}\n aria-label={isMobile ? 'Đóng ngăn công cụ' : 'Đóng'}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" 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 <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n </>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n isMobile,\n drawerOpen,\n onDrawerClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell\n title=\"Công thức LaTeX\"\n icon=\"∑\"\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={onDrawerClose}\n >\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n data-snippet={s.snippet}\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n\n// Back-compat alias\nexport { LeftPanel as LatexLeftPanel };\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from '../render';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Trigger mở snippet drawer trên mobile. */\n onOpenDrawer?: () => void;\n}\n\nexport interface EditorPopoverHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const EditorPopover = forwardRef<EditorPopoverHandle, Props>(function EditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 50 }\n : isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n className={\n isMobile\n ? 'flex h-full w-full flex-col bg-white'\n : 'w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5'\n }\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className={`flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white${isMobile ? '' : ' rounded-t-lg'}`}>\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn snippet\"\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 <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n data-testid=\"latex-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 <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"16\" height=\"16\" 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 <div className={`space-y-2 p-3${isMobile ? ' flex min-h-0 flex-1 flex-col' : ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className={`w-full rounded border border-slate-300 px-2 py-1.5 font-mono outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200${\n isMobile ? ' min-h-[44px] text-base' : ' text-sm'\n }`}\n autoFocus\n />\n <div\n className={[\n 'flex items-center justify-center rounded border p-3 text-center',\n isMobile ? 'min-h-0 flex-1 overflow-auto' : 'min-h-[64px]',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n {!isMobile && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </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={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n )}\n {isMobile && (\n <div className=\"text-center text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Bấm Chèn ở thanh trên\n </div>\n )}\n </div>\n </div>\n );\n});\n\n// Back-compat aliases\nexport { EditorPopover as LatexEditorPopover };\nexport type { EditorPopoverHandle as LatexEditorHandle };\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { LeftPanel as LatexLeftPanel } from './editor/LeftPanel';\nimport {\n EditorPopover as LatexEditorPopover,\n type EditorPopoverHandle as LatexEditorHandle,\n} from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isLatexCustomData, type LatexCustomData } from './types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nexport const LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initial = useMemo(() => {\n if (editingElement && isLatexCustomData(editingElement.customData)) {\n return {\n initialValue: editingElement.customData.src,\n displayMode: !!editingElement.customData.displayMode,\n };\n }\n return { initialValue: '', displayMode: false };\n }, [editingElement]);\n\n const [displayMode, setDisplayMode] = useState(initial.displayMode);\n\n const handleInsert = useCallback(\n async (svgString: string, src: string, dm: boolean) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): LatexCustomData => ({\n kind: 'latex',\n version: 1,\n src,\n displayMode: dm,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Latex insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <LatexLeftPanel\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsertSnippet={(s) => editorRef.current?.insertAtCursor(s)}\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <LatexEditorPopover\n ref={editorRef}\n x={0}\n y={0}\n initialValue={initial.initialValue}\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsert={handleInsert}\n onClose={onClose}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/stamps/latex/editor/LeftPanel.tsx","../src/stamps/latex/editor/EditorPopover.tsx","../src/stamps/latex/host.tsx"],"names":["EditorPopover","jsxs","jsx","forwardRef","LatexStampHost","useRef","useState","useCallback","useImperativeHandle","Fragment"],"mappings":"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","file":"host-QS2EOTRJ.mjs","sourcesContent":["'use client';\n\nimport React from 'react';\n\n// ---------- Shared shell (latex copy — geometry copy stays in src/stamp/StampLeftPanel.tsx) ----------\n\ninterface ShellProps {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n children: React.ReactNode;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\nfunction Shell({ title, icon, onClose, children, isMobile, drawerOpen, onDrawerClose }: ShellProps) {\n const mobileAttrs = isMobile\n ? {\n 'data-mobile-drawer': 'true',\n 'data-drawer-state': drawerOpen ? 'open' : 'closed',\n }\n : {};\n const handleHeaderClose = () => {\n if (isMobile) onDrawerClose?.();\n else onClose();\n };\n return (\n <>\n {isMobile && drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={isMobile && !drawerOpen ? 'true' : undefined}\n data-testid=\"stamp-left-panel\"\n data-stamp-area=\"true\"\n {...mobileAttrs}\n className={\n isMobile\n ? 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md'\n : 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200'\n }\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n onClick={handleHeaderClose}\n aria-label={isMobile ? 'Đóng ngăn công cụ' : 'Đóng'}\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" 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 <div className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-4\">{children}</div>\n </aside>\n </>\n );\n}\n\nfunction Section({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {label}\n </h4>\n {children}\n </section>\n );\n}\n\n// ---------- LaTeX left panel ----------\n\ninterface LatexLeftPanelProps {\n displayMode: boolean;\n onDisplayModeChange: (b: boolean) => void;\n onInsertSnippet: (snippet: string) => void;\n onClose: () => void;\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n\ninterface SnippetDef {\n label: string;\n preview: string;\n snippet: string;\n}\n\nconst SNIPPETS: { group: string; items: SnippetDef[] }[] = [\n {\n group: 'Phân số & luỹ thừa',\n items: [\n { label: 'Phân số', preview: 'a⁄b', snippet: '\\\\frac{a}{b}' },\n { label: 'Luỹ thừa', preview: 'x²', snippet: '^{2}' },\n { label: 'Chỉ số', preview: 'x₁', snippet: '_{1}' },\n { label: 'Căn', preview: '√x', snippet: '\\\\sqrt{x}' },\n { label: 'Căn n', preview: 'ⁿ√x', snippet: '\\\\sqrt[n]{x}' },\n ],\n },\n {\n group: 'Tổng & tích phân',\n items: [\n { label: 'Tổng', preview: 'Σ', snippet: '\\\\sum_{i=1}^{n}' },\n { label: 'Tích', preview: 'Π', snippet: '\\\\prod_{i=1}^{n}' },\n { label: 'Tích phân', preview: '∫', snippet: '\\\\int_{a}^{b}' },\n { label: 'Giới hạn', preview: 'lim', snippet: '\\\\lim_{x \\\\to 0}' },\n ],\n },\n {\n group: 'Ký hiệu',\n items: [\n { label: 'α', preview: 'α', snippet: '\\\\alpha' },\n { label: 'β', preview: 'β', snippet: '\\\\beta' },\n { label: 'π', preview: 'π', snippet: '\\\\pi' },\n { label: 'θ', preview: 'θ', snippet: '\\\\theta' },\n { label: '≠', preview: '≠', snippet: '\\\\neq' },\n { label: '≤', preview: '≤', snippet: '\\\\leq' },\n { label: '≥', preview: '≥', snippet: '\\\\geq' },\n { label: '∞', preview: '∞', snippet: '\\\\infty' },\n { label: '→', preview: '→', snippet: '\\\\to' },\n ],\n },\n];\n\nexport function LeftPanel({\n displayMode,\n onDisplayModeChange,\n onInsertSnippet,\n onClose,\n isMobile,\n drawerOpen,\n onDrawerClose,\n}: LatexLeftPanelProps) {\n return (\n <Shell\n title=\"Công thức LaTeX\"\n icon=\"∑\"\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={onDrawerClose}\n >\n <Section label=\"Chế độ hiển thị\">\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(false)}\n aria-pressed={!displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n !displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Inline</span>\n <span className=\"block text-[10px] text-slate-500\">$ ... $</span>\n </button>\n <button\n type=\"button\"\n onClick={() => onDisplayModeChange(true)}\n aria-pressed={displayMode}\n className={[\n 'rounded-md border px-2 py-1.5 text-xs transition',\n displayMode\n ? 'border-emerald-500 bg-emerald-50 text-emerald-700 ring-1 ring-emerald-300'\n : 'border-slate-200 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50',\n ].join(' ')}\n >\n <span className=\"block font-medium\">Block</span>\n <span className=\"block text-[10px] text-slate-500\">$$ ... $$</span>\n </button>\n </div>\n </Section>\n\n {SNIPPETS.map((group) => (\n <Section key={group.group} label={group.group}>\n <div className=\"flex flex-wrap gap-1\">\n {group.items.map((s) => (\n <button\n key={s.snippet}\n type=\"button\"\n data-snippet={s.snippet}\n onClick={() => onInsertSnippet(s.snippet)}\n title={s.snippet}\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-xs text-slate-700 transition hover:border-emerald-300 hover:bg-emerald-50 hover:text-emerald-700\"\n >\n {s.preview}\n </button>\n ))}\n </div>\n </Section>\n ))}\n\n <Section label=\"Phím tắt\">\n <div className=\"flex flex-wrap gap-2 text-[11px] text-slate-600\">\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Enter</kbd>\n chèn\n </span>\n <span className=\"inline-flex items-center gap-1\">\n <kbd className=\"rounded border border-slate-300 bg-slate-50 px-1.5 py-0.5 font-mono\">Esc</kbd>\n đóng\n </span>\n </div>\n </Section>\n </Shell>\n );\n}\n\n// Back-compat alias\nexport { LeftPanel as LatexLeftPanel };\n","'use client';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { renderLatexToSvg } from '../render';\n\ninterface Props {\n /**\n * Legacy: vị trí absolute x/y nếu cần (test). Khi cả 2 = 0 và `centered` !== false,\n * popover sẽ tự center floating ở giữa khu vực bảng. Khi `withLeftPanel` = true,\n * vị trí center được offset 120px để chừa chỗ panel trái.\n */\n x: number;\n y: number;\n initialValue: string;\n onInsert: (svgString: string, src: string, displayMode: boolean) => void;\n onClose: () => void;\n /** Khi controlled từ parent (StampLeftPanel), parent set giá trị này. */\n displayMode?: boolean;\n onDisplayModeChange?: (b: boolean) => void;\n /** Khi true, position center offset cho panel trái. */\n withLeftPanel?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Trigger mở snippet drawer trên mobile. */\n onOpenDrawer?: () => void;\n}\n\nexport interface EditorPopoverHandle {\n /** Chèn snippet vào vị trí con trỏ trong textbox. */\n insertAtCursor: (snippet: string) => void;\n /** Có content hợp lệ để chèn không (input không rỗng + preview ok). */\n hasContent: () => boolean;\n /** Trigger insert programmatically — return true nếu chèn thành công. */\n tryInsert: () => boolean;\n}\n\nconst DEBOUNCE_MS = 100;\n\nexport const EditorPopover = forwardRef<EditorPopoverHandle, Props>(function EditorPopover(\n {\n x,\n y,\n initialValue,\n onInsert,\n onClose,\n displayMode: controlledDisplayMode,\n onDisplayModeChange,\n withLeftPanel = false,\n isMobile = false,\n onOpenDrawer,\n },\n ref,\n) {\n const [value, setValue] = useState(initialValue);\n const [internalDisplayMode] = useState(false);\n const displayMode = controlledDisplayMode ?? internalDisplayMode;\n // onDisplayModeChange chỉ dùng khi controlled từ parent — không cần local setter\n void onDisplayModeChange;\n\n const [previewSvg, setPreviewSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(async () => {\n try {\n const svg = await renderLatexToSvg(value, displayMode);\n setPreviewSvg(svg);\n setError(null);\n } catch (err) {\n setPreviewSvg(null);\n setError((err as Error).message);\n }\n }, DEBOUNCE_MS);\n return () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, [value, displayMode]);\n\n const handleInsert = useCallback(() => {\n if (!previewSvg) return;\n onInsert(previewSvg, value, displayMode);\n }, [previewSvg, value, displayMode, onInsert]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleInsert();\n }\n },\n [onClose, handleInsert],\n );\n\n // Imperative API: snippet button trong panel trái gọi vào, click-outside auto-insert.\n useImperativeHandle(\n ref,\n () => ({\n insertAtCursor: (snippet: string) => {\n const el = inputRef.current;\n if (!el) {\n setValue((v) => v + snippet);\n return;\n }\n const start = el.selectionStart ?? value.length;\n const end = el.selectionEnd ?? value.length;\n const next = value.slice(0, start) + snippet + value.slice(end);\n setValue(next);\n requestAnimationFrame(() => {\n el.focus();\n const pos = start + snippet.length;\n try {\n el.setSelectionRange(pos, pos);\n } catch {\n /* ignore */\n }\n });\n },\n hasContent: () => value.trim().length > 0 && !!previewSvg && !error,\n tryInsert: () => {\n if (!previewSvg || error || !value.trim()) return false;\n onInsert(previewSvg, value, displayMode);\n return true;\n },\n }),\n [value, previewSvg, error, displayMode, onInsert],\n );\n\n // Position: nếu x/y > 0 → dùng legacy absolute (cho tests cũ). Còn không thì center floating.\n const isLegacyPosition = x > 0 || y > 0;\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 50 }\n : isLegacyPosition\n ? { position: 'absolute', top: y, left: x, zIndex: 50 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 50,\n };\n\n return (\n <div\n style={wrapperStyle}\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n className={\n isMobile\n ? 'flex h-full w-full flex-col bg-white'\n : 'w-[420px] max-w-[calc(100vw-280px)] rounded-lg border border-slate-300 bg-white shadow-2xl ring-1 ring-black/5'\n }\n role=\"dialog\"\n aria-label=\"Nhập công thức LaTeX\"\n >\n <header className={`flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-indigo-600 to-purple-600 px-3 py-2 text-white${isMobile ? '' : ' rounded-t-lg'}`}>\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn snippet\"\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 <span className=\"text-base leading-none\">∑</span>\n Công thức LaTeX\n </h3>\n {isMobile && (\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!previewSvg || !!error}\n data-testid=\"latex-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 <button\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"16\" height=\"16\" 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 <div className={`space-y-2 p-3${isMobile ? ' flex min-h-0 flex-1 flex-col' : ''}`}>\n <input\n ref={inputRef}\n type=\"text\"\n role=\"textbox\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Vd: \\frac{a^2+b^2}{c}\"\n className={`w-full rounded border border-slate-300 px-2 py-1.5 font-mono outline-none focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200${\n isMobile ? ' min-h-[44px] text-base' : ' text-sm'\n }`}\n autoFocus\n />\n <div\n className={[\n 'flex items-center justify-center rounded border p-3 text-center',\n isMobile ? 'min-h-0 flex-1 overflow-auto' : 'min-h-[64px]',\n error ? 'border-rose-300 bg-rose-50 text-rose-700' : 'border-slate-200 bg-slate-50',\n ].join(' ')}\n >\n {error ? (\n <span className=\"text-xs\">Lỗi: {error.slice(0, 80)}</span>\n ) : previewSvg ? (\n <span dangerouslySetInnerHTML={{ __html: previewSvg }} />\n ) : (\n <span className=\"text-xs text-slate-400\">(xem trước)</span>\n )}\n </div>\n {!isMobile && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Enter để chèn\n </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={!previewSvg || !!error}\n className=\"rounded bg-indigo-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-indigo-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </div>\n )}\n {isMobile && (\n <div className=\"text-center text-[11px] text-slate-500\">\n {displayMode ? 'Block' : 'Inline'} · Bấm Chèn ở thanh trên\n </div>\n )}\n </div>\n </div>\n );\n});\n\n// Back-compat aliases\nexport { EditorPopover as LatexEditorPopover };\nexport type { EditorPopoverHandle as LatexEditorHandle };\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { LeftPanel as LatexLeftPanel } from './editor/LeftPanel';\nimport {\n EditorPopover as LatexEditorPopover,\n type EditorPopoverHandle as LatexEditorHandle,\n} from './editor/EditorPopover';\nimport { insertStampImage } from '../shared/insertImage';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { isLatexCustomData, type LatexCustomData } from './types';\nimport type { StampHostProps, StampHostHandle } from '../shared/types';\n\nexport const LatexStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function LatexStampHost({ api, editingElement, onClose }, ref) {\n const editorRef = useRef<LatexEditorHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const initial = useMemo(() => {\n if (editingElement && isLatexCustomData(editingElement.customData)) {\n return {\n initialValue: editingElement.customData.src,\n displayMode: !!editingElement.customData.displayMode,\n };\n }\n return { initialValue: '', displayMode: false };\n }, [editingElement]);\n\n const [displayMode, setDisplayMode] = useState(initial.displayMode);\n\n const handleInsert = useCallback(\n async (svgString: string, src: string, dm: boolean) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): LatexCustomData => ({\n kind: 'latex',\n version: 1,\n src,\n displayMode: dm,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Latex insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => editorRef.current?.tryInsert() ?? false,\n hasContent: () => editorRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <LatexLeftPanel\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsertSnippet={(s) => editorRef.current?.insertAtCursor(s)}\n onClose={onClose}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <LatexEditorPopover\n ref={editorRef}\n x={0}\n y={0}\n initialValue={initial.initialValue}\n displayMode={displayMode}\n onDisplayModeChange={setDisplayMode}\n onInsert={handleInsert}\n onClose={onClose}\n withLeftPanel={!isMobile}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n />\n </>\n );\n },\n);\n"]}
|