dishui 0.0.74 → 0.0.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +80 -64
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +44 -69
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FloatingDialog.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n const dragStart = useRef({ mx: 0, my: 0, x: 0, y: 0 });\n const resizeStart = useRef({ mx: 0, my: 0, w: 0, h: 0 });\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const onDragStart = useCallback((e: React.MouseEvent) => {\n if (!isFloat || editor.isDestroyed || !editor.isEditable || e.button !== 0) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n dragStart.current = { mx: e.clientX, my: e.clientY, x: attrs.x, y: attrs.y };\n\n const onMove = (ev: MouseEvent) => {\n const dx = ev.clientX - dragStart.current.mx;\n const dy = ev.clientY - dragStart.current.my;\n updateAttributes({\n x: dragStart.current.x + dx,\n y: dragStart.current.y + dy,\n });\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n gestureCleanup.current = onUp;\n }, [editor, isFloat, attrs.x, attrs.y, updateAttributes]);\n\n const onResizeStart = useCallback((e: React.MouseEvent) => {\n if (editor.isDestroyed || !editor.isEditable || e.button !== 0) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n resizeStart.current = { mx: e.clientX, my: e.clientY, w: attrs.width, h: attrs.height };\n\n const onMove = (ev: MouseEvent) => {\n const dw = ev.clientX - resizeStart.current.mx;\n const dh = ev.clientY - resizeStart.current.my;\n updateAttributes({\n width: Math.max(160, resizeStart.current.w + dw),\n height: Math.max(80, resizeStart.current.h + dh),\n });\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n };\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n gestureCleanup.current = onUp;\n }, [editor, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor }}\n onMouseDown={onDragStart}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\">\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onMouseDown={onResizeStart} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FloatingDialog.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/extensions/FloatingDialog.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { cn } from '../../../../utils/cn';\nimport { Node, mergeAttributes } from '@tiptap/react';\nimport { NodeViewWrapper, NodeViewContent, ReactNodeViewRenderer } from '@tiptap/react';\nimport type { NodeViewProps } from '@tiptap/react';\nimport { useNodeEditable } from './MarkdownBlock';\n\ntype DialogLayout = 'block' | 'wrap-left' | 'wrap-right' | 'float';\n\ninterface DialogAttrs {\n x: number;\n y: number;\n width: number;\n height: number;\n borderColor: string;\n bgColor: string;\n title: string;\n layout: DialogLayout;\n zIndex: number;\n}\n\nconst DIALOG_COLORS = [\n { label: 'Blue', border: '#3b82f6', bg: '#eff6ff' },\n { label: 'Green', border: '#22c55e', bg: '#f0fdf4' },\n { label: 'Orange', border: '#f97316', bg: '#fff7ed' },\n { label: 'Red', border: '#ef4444', bg: '#fef2f2' },\n { label: 'Purple', border: '#8b5cf6', bg: '#faf5ff' },\n { label: 'Gray', border: '#6b7280', bg: '#f9fafb' },\n];\n\nconst LAYOUT_OPTIONS: { key: DialogLayout; label: string; icon: React.ReactNode }[] = [\n {\n key: 'block', label: 'Block',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" /><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\" /><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\" /></svg>,\n },\n {\n key: 'wrap-left', label: 'Wrap Left',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"2\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"15\" y1=\"5\" x2=\"22\" y2=\"5\" /><line x1=\"15\" y1=\"8\" x2=\"22\" y2=\"8\" /><line x1=\"15\" y1=\"11\" x2=\"22\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'wrap-right', label: 'Wrap Right',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"12\" y=\"4\" width=\"10\" height=\"8\" rx=\"1\" /><line x1=\"2\" y1=\"5\" x2=\"9\" y2=\"5\" /><line x1=\"2\" y1=\"8\" x2=\"9\" y2=\"8\" /><line x1=\"2\" y1=\"11\" x2=\"9\" y2=\"11\" /><line x1=\"2\" y1=\"15\" x2=\"22\" y2=\"15\" /><line x1=\"2\" y1=\"18\" x2=\"22\" y2=\"18\" /></svg>,\n },\n {\n key: 'float', label: 'Float',\n icon: <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" /><path d=\"M2 2h4M18 2h4M2 22h4M18 22h4\" strokeDasharray=\"2 2\" /><line x1=\"2\" y1=\"12\" x2=\"6\" y2=\"12\" strokeDasharray=\"2 2\" /><line x1=\"18\" y1=\"12\" x2=\"22\" y2=\"12\" strokeDasharray=\"2 2\" /></svg>,\n },\n];\n\n/** Scan the document and return all zIndex values of float-layout floatingDialog nodes */\nfunction collectFloatZIndices(editor: NodeViewProps['editor']): number[] {\n const indices: number[] = [];\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n indices.push(node.attrs.zIndex ?? 10);\n }\n });\n return indices;\n}\n\nconst FloatingDialogView: React.FC<NodeViewProps> = ({\n node,\n editor,\n updateAttributes: writeAttributes,\n deleteNode,\n selected,\n}) => {\n const editable = useNodeEditable(editor);\n const updateAttributes = useCallback((attributes: Record<string, unknown>) => {\n if (!editor.isDestroyed && editor.isEditable) writeAttributes(attributes);\n }, [editor, writeAttributes]);\n const gestureCleanup = useRef<(() => void) | null>(null);\n const attrs = node.attrs as DialogAttrs;\n const layout = attrs.layout || 'block';\n const isFloat = layout === 'float';\n const zIndex = attrs.zIndex ?? 10;\n\n const [editingTitle, setEditingTitle] = useState(false);\n const [localTitle, setLocalTitle] = useState(attrs.title);\n const [showColorPicker, setShowColorPicker] = useState(false);\n const [showLayoutPicker, setShowLayoutPicker] = useState(false);\n\n const colorRef = useRef<HTMLDivElement>(null);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setLocalTitle(attrs.title);\n }, [attrs.title]);\n\n useEffect(() => {\n if (!editable) {\n gestureCleanup.current?.();\n setEditingTitle(false);\n setLocalTitle(attrs.title);\n setShowColorPicker(false);\n setShowLayoutPicker(false);\n }\n }, [editable, attrs.title]);\n\n useEffect(() => {\n const cleanup = () => gestureCleanup.current?.();\n editor.on('destroy', cleanup);\n window.addEventListener('blur', cleanup);\n return () => {\n cleanup();\n editor.off('destroy', cleanup);\n window.removeEventListener('blur', cleanup);\n };\n }, [editor]);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (colorRef.current && !colorRef.current.contains(e.target as globalThis.Node)) {\n setShowColorPicker(false);\n }\n if (layoutRef.current && !layoutRef.current.contains(e.target as globalThis.Node)) {\n setShowLayoutPicker(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const startGesture = useCallback((e: React.PointerEvent<HTMLDivElement>, resize: boolean) => {\n if (editor.isDestroyed || !editor.isEditable || !e.isPrimary || e.button !== 0) return;\n if (!resize && (!isFloat || (e.target as HTMLElement).closest('button, input'))) return;\n gestureCleanup.current?.();\n e.preventDefault();\n e.stopPropagation();\n\n const target = e.currentTarget;\n const doc = target.ownerDocument;\n const pointerId = e.pointerId;\n const { clientX, clientY } = e;\n let lastX = resize ? attrs.width : attrs.x;\n let lastY = resize ? attrs.height : attrs.y;\n const startX = lastX;\n const startY = lastY;\n\n const onMove = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return;\n const x = resize ? Math.max(160, startX + ev.clientX - clientX) : startX + ev.clientX - clientX;\n const y = resize ? Math.max(80, startY + ev.clientY - clientY) : startY + ev.clientY - clientY;\n if (x === lastX && y === lastY) return;\n lastX = x;\n lastY = y;\n updateAttributes(resize ? { width: x, height: y } : { x, y });\n };\n const cleanup = () => {\n doc.removeEventListener('pointermove', onMove);\n doc.removeEventListener('pointerup', onEnd);\n doc.removeEventListener('pointercancel', onEnd);\n target.removeEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = null;\n if (target.hasPointerCapture(pointerId)) target.releasePointerCapture(pointerId);\n };\n const onEnd = (ev: PointerEvent) => {\n if (ev.pointerId === pointerId) cleanup();\n };\n // Capture keeps the gesture paired even when a finger leaves the handle.\n target.setPointerCapture(pointerId);\n doc.addEventListener('pointermove', onMove);\n doc.addEventListener('pointerup', onEnd);\n doc.addEventListener('pointercancel', onEnd);\n target.addEventListener('lostpointercapture', onEnd);\n gestureCleanup.current = cleanup;\n }, [editor, isFloat, attrs.x, attrs.y, attrs.width, attrs.height, updateAttributes]);\n\n const saveTitle = useCallback(() => {\n updateAttributes({ title: localTitle });\n setEditingTitle(false);\n }, [localTitle, updateAttributes]);\n\n const bringForward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const maxZ = Math.max(...all);\n if (zIndex < maxZ) {\n updateAttributes({ zIndex: maxZ + 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const sendBackward = useCallback(() => {\n const all = collectFloatZIndices(editor);\n const minZ = Math.min(...all);\n if (zIndex > minZ) {\n updateAttributes({ zIndex: minZ - 1 });\n } else if (zIndex > 1) {\n updateAttributes({ zIndex: zIndex - 1 });\n }\n }, [editor, zIndex, updateAttributes]);\n\n const wrapperClass = cn(\n 'rte-float-dialog',\n `rte-float-dialog--${layout}`,\n selected && 'rte-float-dialog--selected',\n );\n\n const wrapperStyle: React.CSSProperties = isFloat\n ? { position: 'absolute', left: attrs.x, top: attrs.y, zIndex }\n : {};\n\n const boxStyle: React.CSSProperties = {\n width: layout === 'block' ? '100%' : attrs.width,\n minHeight: attrs.height,\n borderColor: attrs.borderColor,\n backgroundColor: attrs.bgColor,\n };\n\n const layoutIcon = LAYOUT_OPTIONS.find((l) => l.key === layout)?.icon;\n\n return (\n <NodeViewWrapper className={wrapperClass} style={wrapperStyle}>\n <div className=\"rte-float-dialog__box\" style={boxStyle}>\n {/* Title bar */}\n <div\n className=\"rte-float-dialog__titlebar\"\n style={{ borderBottomColor: attrs.borderColor, touchAction: isFloat && editable ? 'none' : undefined }}\n onPointerDown={(e) => startGesture(e, false)}\n contentEditable={false}\n >\n {isFloat && (\n <span className=\"rte-float-dialog__drag-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\" /><circle cx=\"15\" cy=\"5\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" /><circle cx=\"15\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"19\" r=\"1.5\" /><circle cx=\"15\" cy=\"19\" r=\"1.5\" />\n </svg>\n </span>\n )}\n\n {editingTitle && editable ? (\n <input\n className=\"rte-float-dialog__title-input\"\n value={localTitle}\n onChange={(e) => setLocalTitle(e.target.value)}\n placeholder=\"Title...\"\n onMouseDown={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onBlur={saveTitle}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === 'Escape') saveTitle(); }}\n autoFocus\n />\n ) : (\n <span className=\"rte-float-dialog__title\" onDoubleClick={() => { if (!editor.isDestroyed && editor.isEditable) setEditingTitle(true); }}>\n {attrs.title || 'Dialog'}\n </span>\n )}\n\n {editable && <div className=\"rte-float-dialog__actions\" onPointerDown={(e) => e.stopPropagation()}>\n {/* Z-order controls — only for float layout */}\n {isFloat && (\n <div className=\"rte-float-dialog__zorder\">\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); bringForward(); }}\n title=\"Bring to Front\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); sendBackward(); }}\n title=\"Send to Back\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"3\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <rect x=\"8\" y=\"2\" width=\"13\" height=\"13\" rx=\"2\" opacity=\"0.4\" />\n </svg>\n </button>\n </div>\n )}\n\n {/* Layout picker */}\n <div ref={layoutRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowLayoutPicker(!showLayoutPicker); }}\n title={`Layout: ${layout}`}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {layoutIcon}\n </button>\n {showLayoutPicker && (\n <div className=\"rte-float-dialog__layout-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {LAYOUT_OPTIONS.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`rte-float-dialog__layout-option ${layout === opt.key ? 'rte-float-dialog__layout-option--active' : ''}`}\n onClick={() => { updateAttributes({ layout: opt.key }); setShowLayoutPicker(false); }}\n title={opt.label}\n >\n {opt.icon}\n <span>{opt.label}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Color picker */}\n <div ref={colorRef} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn\"\n onClick={(e) => { e.stopPropagation(); setShowColorPicker(!showColorPicker); }}\n title=\"Color\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill={attrs.borderColor} stroke={attrs.borderColor} strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n </svg>\n </button>\n {showColorPicker && (\n <div className=\"rte-float-dialog__color-dropdown\" onMouseDown={(e) => e.stopPropagation()}>\n {DIALOG_COLORS.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n className=\"rte-float-dialog__color-swatch\"\n style={{ backgroundColor: c.border }}\n onClick={() => { updateAttributes({ borderColor: c.border, bgColor: c.bg }); setShowColorPicker(false); }}\n title={c.label}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Delete */}\n <button\n type=\"button\"\n className=\"rte-float-dialog__action-btn rte-float-dialog__action-btn--danger\"\n onClick={(e) => { e.stopPropagation(); if (!editor.isDestroyed && editor.isEditable) deleteNode(); }}\n title=\"Delete\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>}\n </div>\n\n {/* Rich text body — Tiptap editable content */}\n <NodeViewContent className=\"rte-float-dialog__body\" />\n\n {/* Resize handle */}\n {editable && <div className=\"rte-float-dialog__resize-handle\" onPointerDown={(e) => startGesture(e, true)} contentEditable={false}>\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\">\n <circle cx=\"8\" cy=\"8\" r=\"1.2\" /><circle cx=\"4\" cy=\"8\" r=\"1.2\" /><circle cx=\"8\" cy=\"4\" r=\"1.2\" />\n </svg>\n </div>}\n </div>\n </NodeViewWrapper>\n );\n};\n\n/** Scan document for the highest zIndex among existing float dialogs */\nexport function getNextFloatZIndex(editor: { state: { doc: { descendants: (cb: (node: { type: { name: string }; attrs: Record<string, unknown> }) => void) => void } } }): number {\n let maxZ = 9;\n editor.state.doc.descendants((node) => {\n if (node.type.name === 'floatingDialog' && node.attrs.layout === 'float') {\n const z = (node.attrs.zIndex as number) ?? 10;\n if (z > maxZ) maxZ = z;\n }\n });\n return maxZ + 1;\n}\n\nexport const FloatingDialogExtension = Node.create({\n name: 'floatingDialog',\n group: 'block',\n content: 'block+',\n draggable: true,\n isolating: true,\n defining: true,\n\n addAttributes() {\n return {\n title: { default: 'Note' },\n x: { default: 20 },\n y: { default: 0 },\n width: { default: 280 },\n height: { default: 120 },\n borderColor: { default: '#3b82f6' },\n bgColor: { default: '#eff6ff' },\n layout: { default: 'block' },\n zIndex: { default: 10 },\n };\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"floating-dialog\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'floating-dialog' }), 0];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(FloatingDialogView);\n },\n});\n\nexport default FloatingDialogExtension;\n"],"mappings":"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"}
|