sykpcomposer 1.20.123 → 1.20.125

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageComponent-462c3315.js","sources":["../src/lexical/ui/ImageResizer.tsx","../node_modules/react-image-crop/dist/index.js","../src/lexical/nodes/ImageComponent.tsx"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type { LexicalEditor } from \"lexical\";\r\n\r\nimport * as React from \"react\";\r\nimport { useRef } from \"react\";\r\n\r\nfunction clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nconst Direction = {\r\n east: 1 << 0,\r\n north: 1 << 3,\r\n south: 1 << 1,\r\n west: 1 << 2,\r\n};\r\n\r\nexport default function ImageResizer({\r\n onResizeStart,\r\n onResizeEnd,\r\n buttonRef,\r\n imageRef,\r\n maxWidth,\r\n editor,\r\n showCaption,\r\n setShowCaption,\r\n enableCaptions,\r\n}: {\r\n editor: LexicalEditor;\r\n buttonRef: { current: null | HTMLButtonElement };\r\n imageRef: { current: null | HTMLElement };\r\n maxWidth?: number;\r\n onResizeEnd: (width: \"inherit\" | number, height: \"inherit\" | number) => void;\r\n onResizeStart: () => void;\r\n setShowCaption: (show: boolean) => void;\r\n showCaption: boolean;\r\n enableCaptions: boolean;\r\n}): JSX.Element {\r\n const controlWrapperRef = useRef<HTMLDivElement>(null);\r\n const userSelect = useRef({\r\n priority: \"\",\r\n value: \"default\",\r\n });\r\n const positioningRef = useRef<{\r\n currentHeight: \"inherit\" | number;\r\n currentWidth: \"inherit\" | number;\r\n direction: number;\r\n isResizing: boolean;\r\n ratio: number;\r\n startHeight: number;\r\n startWidth: number;\r\n startX: number;\r\n startY: number;\r\n }>({\r\n currentHeight: 0,\r\n currentWidth: 0,\r\n direction: 0,\r\n isResizing: false,\r\n ratio: 0,\r\n startHeight: 0,\r\n startWidth: 0,\r\n startX: 0,\r\n startY: 0,\r\n });\r\n\r\n const editorRootElement = editor.getRootElement();\r\n // Find max width, accounting for editor padding.\r\n const maxWidthContainer =\r\n editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().width - 20\r\n : 100;\r\n const maxHeightContainer =\r\n editorRootElement !== null\r\n ? editorRootElement.getBoundingClientRect().height - 20\r\n : 100;\r\n\r\n const minWidth = 100;\r\n const minHeight = 100;\r\n\r\n const setStartCursor = (direction: number) => {\r\n const ew = direction === Direction.east || direction === Direction.west;\r\n const ns = direction === Direction.north || direction === Direction.south;\r\n const nwse =\r\n (direction & Direction.north && direction & Direction.west) ||\r\n (direction & Direction.south && direction & Direction.east);\r\n\r\n const cursorDir = ew ? \"ew\" : ns ? \"ns\" : nwse ? \"nwse\" : \"nesw\";\r\n\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\r\n \"cursor\",\r\n `${cursorDir}-resize`,\r\n \"important\"\r\n );\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\r\n \"cursor\",\r\n `${cursorDir}-resize`,\r\n \"important\"\r\n );\r\n userSelect.current.value = document.body.style.getPropertyValue(\r\n \"-webkit-user-select\"\r\n );\r\n userSelect.current.priority = document.body.style.getPropertyPriority(\r\n \"-webkit-user-select\"\r\n );\r\n document.body.style.setProperty(\r\n \"-webkit-user-select\",\r\n `none`,\r\n \"important\"\r\n );\r\n }\r\n };\r\n\r\n const setEndCursor = () => {\r\n if (editorRootElement !== null) {\r\n editorRootElement.style.setProperty(\"cursor\", \"text\");\r\n }\r\n if (document.body !== null) {\r\n document.body.style.setProperty(\"cursor\", \"default\");\r\n document.body.style.setProperty(\r\n \"-webkit-user-select\",\r\n userSelect.current.value,\r\n userSelect.current.priority\r\n );\r\n }\r\n };\r\n\r\n const handlePointerDown = (\r\n event: React.PointerEvent<HTMLDivElement>,\r\n direction: number\r\n ) => {\r\n if (!editor.isEditable()) {\r\n return;\r\n }\r\n\r\n const image = imageRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n\r\n if (image !== null && controlWrapper !== null) {\r\n event.preventDefault();\r\n const { width, height } = image.getBoundingClientRect();\r\n const positioning = positioningRef.current;\r\n positioning.startWidth = width;\r\n positioning.startHeight = height;\r\n positioning.ratio = width / height;\r\n positioning.currentWidth = width;\r\n positioning.currentHeight = height;\r\n positioning.startX = event.clientX;\r\n positioning.startY = event.clientY;\r\n positioning.isResizing = true;\r\n positioning.direction = direction;\r\n setStartCursor(direction);\r\n onResizeStart();\r\n controlWrapper.classList.add(\"image-control-wrapper--resizing\");\r\n image.style.height = `${height}px`;\r\n image.style.width = `${width}px`;\r\n\r\n document.addEventListener(\"pointermove\", handlePointerMove);\r\n document.addEventListener(\"pointerup\", handlePointerUp);\r\n }\r\n };\r\n const handlePointerMove = (event: PointerEvent) => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n\r\n const isHorizontal =\r\n positioning.direction & (Direction.east | Direction.west);\r\n const isVertical =\r\n positioning.direction & (Direction.south | Direction.north);\r\n if (image !== null && positioning.isResizing) {\r\n if (isHorizontal && isVertical) {\r\n let diff = Math.floor(positioning.startX - event.clientX);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer\r\n );\r\n\r\n const height = width / positioning.ratio;\r\n if (height>600) {\r\n alert(\"Image height cannot be greater than 600px.\")\r\n handlePointerUp();\r\n return;\r\n }\r\n image.style.width = `${width}px`;\r\n image.style.height = `${height}px`;\r\n positioning.currentHeight = height;\r\n positioning.currentWidth = width;\r\n } else if (isVertical) {\r\n let diff = Math.floor(positioning.startY - event.clientY);\r\n diff = positioning.direction & Direction.south ? -diff : diff;\r\n\r\n const height = positioning.startHeight + diff;\r\n const isIncreasingHeight = height > positioning.startHeight;\r\n\r\n if (isIncreasingHeight && height > 600) {\r\n alert(\"Image height cannot be greater than 600px.\");\r\n handlePointerUp();\r\n return;\r\n }\r\n const clampedHeight = clamp(height, minHeight, maxHeightContainer);\r\n image.style.height = `${clampedHeight}px`;\r\n image.style.maxHeight = `${clampedHeight}px`;\r\n positioning.currentHeight = clampedHeight;\r\n } else {\r\n let diff = Math.floor(positioning.startX - event.clientX);\r\n diff = positioning.direction & Direction.east ? -diff : diff;\r\n const width = clamp(\r\n positioning.startWidth + diff,\r\n minWidth,\r\n maxWidthContainer\r\n );\r\n\r\n image.style.width = `${width}px`;\r\n image.style.maxWidth = `${width}px`;\r\n positioning.currentWidth = width;\r\n }\r\n if (image) {\r\n image.setAttribute(\"width\", `${positioning.currentWidth}`);\r\n image.setAttribute(\"height\", `${positioning.currentHeight}`);\r\n }\r\n }\r\n };\r\n const handlePointerUp = () => {\r\n const image = imageRef.current;\r\n const positioning = positioningRef.current;\r\n const controlWrapper = controlWrapperRef.current;\r\n if (image !== null && controlWrapper !== null && positioning.isResizing) {\r\n const width = positioning.currentWidth;\r\n const height = positioning.currentHeight;\r\n positioning.startWidth = 0;\r\n positioning.startHeight = 0;\r\n positioning.ratio = 0;\r\n positioning.startX = 0;\r\n positioning.startY = 0;\r\n positioning.currentWidth = 0;\r\n positioning.currentHeight = 0;\r\n positioning.isResizing = false;\r\n controlWrapper.classList.remove(\"image-control-wrapper--resizing\");\r\n setEndCursor();\r\n onResizeEnd(width, height);\r\n\r\n document.removeEventListener(\"pointermove\", handlePointerMove);\r\n document.removeEventListener(\"pointerup\", handlePointerUp);\r\n }\r\n };\r\n return (\r\n <div ref={controlWrapperRef}>\r\n <div\r\n className=\"image-resizer image-resizer-n\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-ne\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-e\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-se\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.east);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-s\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-sw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.south | Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-w\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.west);\r\n }}\r\n />\r\n <div\r\n className=\"image-resizer image-resizer-nw\"\r\n onPointerDown={(event) => {\r\n handlePointerDown(event, Direction.north | Direction.west);\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n","import p, { PureComponent as k, createRef as E } from \"react\";\nconst M = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n unit: \"px\"\n}, v = (o, e, t) => Math.min(Math.max(o, e), t), S = (...o) => o.filter((e) => e && typeof e == \"string\").join(\" \"), Y = (o, e) => o === e || o.width === e.width && o.height === e.height && o.x === e.x && o.y === e.y && o.unit === e.unit;\nfunction H(o, e, t, h) {\n const i = y(o, t, h);\n return o.width && (i.height = i.width / e), o.height && (i.width = i.height * e), i.y + i.height > h && (i.height = h - i.y, i.width = i.height * e), i.x + i.width > t && (i.width = t - i.x, i.height = i.width / e), o.unit === \"%\" ? D(i, t, h) : i;\n}\nfunction I(o, e, t) {\n const h = y(o, e, t);\n return h.x = (e - h.width) / 2, h.y = (t - h.height) / 2, o.unit === \"%\" ? D(h, e, t) : h;\n}\nfunction D(o, e, t) {\n return o.unit === \"%\" ? { ...M, ...o, unit: \"%\" } : {\n unit: \"%\",\n x: o.x ? o.x / e * 100 : 0,\n y: o.y ? o.y / t * 100 : 0,\n width: o.width ? o.width / e * 100 : 0,\n height: o.height ? o.height / t * 100 : 0\n };\n}\nfunction y(o, e, t) {\n return o.unit ? o.unit === \"px\" ? { ...M, ...o, unit: \"px\" } : {\n unit: \"px\",\n x: o.x ? o.x * e / 100 : 0,\n y: o.y ? o.y * t / 100 : 0,\n width: o.width ? o.width * e / 100 : 0,\n height: o.height ? o.height * t / 100 : 0\n } : { ...M, ...o, unit: \"px\" };\n}\nfunction P(o, e, t, h, i, n = 0, s = 0, w = h, a = i) {\n const r = { ...o };\n let c = Math.min(n, h), d = Math.min(s, i), g = Math.min(w, h), l = Math.min(a, i);\n e && (e > 1 ? (c = s ? s * e : c, d = c / e, g = w * e) : (d = n ? n / e : d, c = d * e, l = a / e)), r.y < 0 && (r.height = Math.max(r.height + r.y, d), r.y = 0), r.x < 0 && (r.width = Math.max(r.width + r.x, c), r.x = 0);\n const m = h - (r.x + r.width);\n m < 0 && (r.x = Math.min(r.x, h - c), r.width += m);\n const x = i - (r.y + r.height);\n if (x < 0 && (r.y = Math.min(r.y, i - d), r.height += x), r.width < c && ((t === \"sw\" || t == \"nw\") && (r.x -= c - r.width), r.width = c), r.height < d && ((t === \"nw\" || t == \"ne\") && (r.y -= d - r.height), r.height = d), r.width > g && ((t === \"sw\" || t == \"nw\") && (r.x -= g - r.width), r.width = g), r.height > l && ((t === \"nw\" || t == \"ne\") && (r.y -= l - r.height), r.height = l), e) {\n const b = r.width / r.height;\n if (b < e) {\n const C = Math.max(r.width / e, d);\n (t === \"nw\" || t == \"ne\") && (r.y -= C - r.height), r.height = C;\n } else if (b > e) {\n const C = Math.max(r.height * e, c);\n (t === \"sw\" || t == \"nw\") && (r.x -= C - r.width), r.width = C;\n }\n }\n return r;\n}\nfunction _(o, e, t, h) {\n const i = { ...o };\n return e === \"ArrowLeft\" ? h === \"nw\" ? (i.x -= t, i.y -= t, i.width += t, i.height += t) : h === \"w\" ? (i.x -= t, i.width += t) : h === \"sw\" ? (i.x -= t, i.width += t, i.height += t) : h === \"ne\" ? (i.y += t, i.width -= t, i.height -= t) : h === \"e\" ? i.width -= t : h === \"se\" && (i.width -= t, i.height -= t) : e === \"ArrowRight\" && (h === \"nw\" ? (i.x += t, i.y += t, i.width -= t, i.height -= t) : h === \"w\" ? (i.x += t, i.width -= t) : h === \"sw\" ? (i.x += t, i.width -= t, i.height -= t) : h === \"ne\" ? (i.y -= t, i.width += t, i.height += t) : h === \"e\" ? i.width += t : h === \"se\" && (i.width += t, i.height += t)), e === \"ArrowUp\" ? h === \"nw\" ? (i.x -= t, i.y -= t, i.width += t, i.height += t) : h === \"n\" ? (i.y -= t, i.height += t) : h === \"ne\" ? (i.y -= t, i.width += t, i.height += t) : h === \"sw\" ? (i.x += t, i.width -= t, i.height -= t) : h === \"s\" ? i.height -= t : h === \"se\" && (i.width -= t, i.height -= t) : e === \"ArrowDown\" && (h === \"nw\" ? (i.x += t, i.y += t, i.width -= t, i.height -= t) : h === \"n\" ? (i.y += t, i.height -= t) : h === \"ne\" ? (i.y += t, i.width -= t, i.height -= t) : h === \"sw\" ? (i.x -= t, i.width += t, i.height += t) : h === \"s\" ? i.height += t : h === \"se\" && (i.width += t, i.height += t)), i;\n}\nconst f = { capture: !0, passive: !1 };\nlet $ = 0;\nconst u = class u extends k {\n constructor() {\n super(...arguments), this.docMoveBound = !1, this.mouseDownOnCrop = !1, this.dragStarted = !1, this.evData = {\n startClientX: 0,\n startClientY: 0,\n startCropX: 0,\n startCropY: 0,\n clientX: 0,\n clientY: 0,\n isResize: !0\n }, this.componentRef = E(), this.mediaRef = E(), this.initChangeCalled = !1, this.instanceId = `rc-${$++}`, this.state = {\n cropIsActive: !1,\n newCropIsBeingDrawn: !1\n }, this.onCropPointerDown = (e) => {\n const { crop: t, disabled: h } = this.props, i = this.getBox();\n if (!t)\n return;\n const n = y(t, i.width, i.height);\n if (h)\n return;\n e.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n const s = e.target.dataset.ord, w = !!s;\n let a = e.clientX, r = e.clientY, c = n.x, d = n.y;\n if (s) {\n const g = e.clientX - i.x, l = e.clientY - i.y;\n let m = 0, x = 0;\n s === \"ne\" || s == \"e\" ? (m = g - (n.x + n.width), x = l - n.y, c = n.x, d = n.y + n.height) : s === \"se\" || s === \"s\" ? (m = g - (n.x + n.width), x = l - (n.y + n.height), c = n.x, d = n.y) : s === \"sw\" || s == \"w\" ? (m = g - n.x, x = l - (n.y + n.height), c = n.x + n.width, d = n.y) : (s === \"nw\" || s == \"n\") && (m = g - n.x, x = l - n.y, c = n.x + n.width, d = n.y + n.height), a = c + i.x + m, r = d + i.y + x;\n }\n this.evData = {\n startClientX: a,\n startClientY: r,\n startCropX: c,\n startCropY: d,\n clientX: e.clientX,\n clientY: e.clientY,\n isResize: w,\n ord: s\n }, this.mouseDownOnCrop = !0, this.setState({ cropIsActive: !0 });\n }, this.onComponentPointerDown = (e) => {\n const { crop: t, disabled: h, locked: i, keepSelection: n, onChange: s } = this.props, w = this.getBox();\n if (h || i || n && t)\n return;\n e.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n const a = e.clientX - w.x, r = e.clientY - w.y, c = {\n unit: \"px\",\n x: a,\n y: r,\n width: 0,\n height: 0\n };\n this.evData = {\n startClientX: e.clientX,\n startClientY: e.clientY,\n startCropX: a,\n startCropY: r,\n clientX: e.clientX,\n clientY: e.clientY,\n isResize: !0\n }, this.mouseDownOnCrop = !0, s(y(c, w.width, w.height), D(c, w.width, w.height)), this.setState({ cropIsActive: !0, newCropIsBeingDrawn: !0 });\n }, this.onDocPointerMove = (e) => {\n const { crop: t, disabled: h, onChange: i, onDragStart: n } = this.props, s = this.getBox();\n if (h || !t || !this.mouseDownOnCrop)\n return;\n e.cancelable && e.preventDefault(), this.dragStarted || (this.dragStarted = !0, n && n(e));\n const { evData: w } = this;\n w.clientX = e.clientX, w.clientY = e.clientY;\n let a;\n w.isResize ? a = this.resizeCrop() : a = this.dragCrop(), Y(t, a) || i(\n y(a, s.width, s.height),\n D(a, s.width, s.height)\n );\n }, this.onComponentKeyDown = (e) => {\n const { crop: t, disabled: h, onChange: i, onComplete: n } = this.props;\n if (h)\n return;\n const s = e.key;\n let w = !1;\n if (!t)\n return;\n const a = this.getBox(), r = this.makePixelCrop(a), d = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? u.nudgeStepLarge : e.shiftKey ? u.nudgeStepMedium : u.nudgeStep;\n if (s === \"ArrowLeft\" ? (r.x -= d, w = !0) : s === \"ArrowRight\" ? (r.x += d, w = !0) : s === \"ArrowUp\" ? (r.y -= d, w = !0) : s === \"ArrowDown\" && (r.y += d, w = !0), w) {\n e.cancelable && e.preventDefault(), r.x = v(r.x, 0, a.width - r.width), r.y = v(r.y, 0, a.height - r.height);\n const g = y(r, a.width, a.height), l = D(r, a.width, a.height);\n i(g, l), n && n(g, l);\n }\n }, this.onHandlerKeyDown = (e, t) => {\n const {\n aspect: h = 0,\n crop: i,\n disabled: n,\n minWidth: s = 0,\n minHeight: w = 0,\n maxWidth: a,\n maxHeight: r,\n onChange: c,\n onComplete: d\n } = this.props, g = this.getBox();\n if (n || !i)\n return;\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\" || e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")\n e.stopPropagation(), e.preventDefault();\n else\n return;\n const m = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? u.nudgeStepLarge : e.shiftKey ? u.nudgeStepMedium : u.nudgeStep, x = y(i, g.width, g.height), b = _(x, e.key, m, t), C = P(\n b,\n h,\n t,\n g.width,\n g.height,\n s,\n w,\n a,\n r\n );\n if (!Y(i, C)) {\n const R = D(C, g.width, g.height);\n c(C, R), d && d(C, R);\n }\n }, this.onDocPointerDone = (e) => {\n const { crop: t, disabled: h, onComplete: i, onDragEnd: n } = this.props, s = this.getBox();\n this.unbindDocMove(), !(h || !t) && this.mouseDownOnCrop && (this.mouseDownOnCrop = !1, this.dragStarted = !1, n && n(e), i && i(y(t, s.width, s.height), D(t, s.width, s.height)), this.setState({ cropIsActive: !1, newCropIsBeingDrawn: !1 }));\n }, this.onDragFocus = () => {\n var e;\n (e = this.componentRef.current) == null || e.scrollTo(0, 0);\n };\n }\n get document() {\n return document;\n }\n // We unfortunately get the bounding box every time as x+y changes\n // due to scrolling.\n getBox() {\n const e = this.mediaRef.current;\n if (!e)\n return { x: 0, y: 0, width: 0, height: 0 };\n const { x: t, y: h, width: i, height: n } = e.getBoundingClientRect();\n return { x: t, y: h, width: i, height: n };\n }\n componentDidUpdate(e) {\n const { crop: t, onComplete: h } = this.props;\n if (h && !e.crop && t) {\n const { width: i, height: n } = this.getBox();\n i && n && h(y(t, i, n), D(t, i, n));\n }\n }\n componentWillUnmount() {\n this.resizeObserver && this.resizeObserver.disconnect(), this.unbindDocMove();\n }\n bindDocMove() {\n this.docMoveBound || (this.document.addEventListener(\"pointermove\", this.onDocPointerMove, f), this.document.addEventListener(\"pointerup\", this.onDocPointerDone, f), this.document.addEventListener(\"pointercancel\", this.onDocPointerDone, f), this.docMoveBound = !0);\n }\n unbindDocMove() {\n this.docMoveBound && (this.document.removeEventListener(\"pointermove\", this.onDocPointerMove, f), this.document.removeEventListener(\"pointerup\", this.onDocPointerDone, f), this.document.removeEventListener(\"pointercancel\", this.onDocPointerDone, f), this.docMoveBound = !1);\n }\n getCropStyle() {\n const { crop: e } = this.props;\n if (e)\n return {\n top: `${e.y}${e.unit}`,\n left: `${e.x}${e.unit}`,\n width: `${e.width}${e.unit}`,\n height: `${e.height}${e.unit}`\n };\n }\n dragCrop() {\n const { evData: e } = this, t = this.getBox(), h = this.makePixelCrop(t), i = e.clientX - e.startClientX, n = e.clientY - e.startClientY;\n return h.x = v(e.startCropX + i, 0, t.width - h.width), h.y = v(e.startCropY + n, 0, t.height - h.height), h;\n }\n getPointRegion(e, t, h, i) {\n const { evData: n } = this, s = n.clientX - e.x, w = n.clientY - e.y;\n let a;\n i && t ? a = t === \"nw\" || t === \"n\" || t === \"ne\" : a = w < n.startCropY;\n let r;\n return h && t ? r = t === \"nw\" || t === \"w\" || t === \"sw\" : r = s < n.startCropX, r ? a ? \"nw\" : \"sw\" : a ? \"ne\" : \"se\";\n }\n resolveMinDimensions(e, t, h = 0, i = 0) {\n const n = Math.min(h, e.width), s = Math.min(i, e.height);\n return !t || !n && !s ? [n, s] : t > 1 ? n ? [n, n / t] : [s * t, s] : s ? [s * t, s] : [n, n / t];\n }\n resizeCrop() {\n const { evData: e } = this, { aspect: t = 0, maxWidth: h, maxHeight: i } = this.props, n = this.getBox(), [s, w] = this.resolveMinDimensions(n, t, this.props.minWidth, this.props.minHeight);\n let a = this.makePixelCrop(n);\n const r = this.getPointRegion(n, e.ord, s, w), c = e.ord || r;\n let d = e.clientX - e.startClientX, g = e.clientY - e.startClientY;\n (s && c === \"nw\" || c === \"w\" || c === \"sw\") && (d = Math.min(d, -s)), (w && c === \"nw\" || c === \"n\" || c === \"ne\") && (g = Math.min(g, -w));\n const l = {\n unit: \"px\",\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n r === \"ne\" ? (l.x = e.startCropX, l.width = d, t ? (l.height = l.width / t, l.y = e.startCropY - l.height) : (l.height = Math.abs(g), l.y = e.startCropY - l.height)) : r === \"se\" ? (l.x = e.startCropX, l.y = e.startCropY, l.width = d, t ? l.height = l.width / t : l.height = g) : r === \"sw\" ? (l.x = e.startCropX + d, l.y = e.startCropY, l.width = Math.abs(d), t ? l.height = l.width / t : l.height = g) : r === \"nw\" && (l.x = e.startCropX + d, l.width = Math.abs(d), t ? (l.height = l.width / t, l.y = e.startCropY - l.height) : (l.height = Math.abs(g), l.y = e.startCropY + g));\n const m = P(\n l,\n t,\n r,\n n.width,\n n.height,\n s,\n w,\n h,\n i\n );\n return t || u.xyOrds.indexOf(c) > -1 ? a = m : u.xOrds.indexOf(c) > -1 ? (a.x = m.x, a.width = m.width) : u.yOrds.indexOf(c) > -1 && (a.y = m.y, a.height = m.height), a.x = v(a.x, 0, n.width - a.width), a.y = v(a.y, 0, n.height - a.height), a;\n }\n renderCropSelection() {\n const {\n ariaLabels: e = u.defaultProps.ariaLabels,\n disabled: t,\n locked: h,\n renderSelectionAddon: i,\n ruleOfThirds: n,\n crop: s\n } = this.props, w = this.getCropStyle();\n if (s)\n return /* @__PURE__ */ p.createElement(\n \"div\",\n {\n style: w,\n className: \"ReactCrop__crop-selection\",\n onPointerDown: this.onCropPointerDown,\n \"aria-label\": e.cropArea,\n tabIndex: 0,\n onKeyDown: this.onComponentKeyDown,\n role: \"group\"\n },\n !t && !h && /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__drag-elements\", onFocus: this.onDragFocus }, /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__drag-bar ord-n\", \"data-ord\": \"n\" }), /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__drag-bar ord-e\", \"data-ord\": \"e\" }), /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__drag-bar ord-s\", \"data-ord\": \"s\" }), /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__drag-bar ord-w\", \"data-ord\": \"w\" }), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-nw\",\n \"data-ord\": \"nw\",\n tabIndex: 0,\n \"aria-label\": e.nwDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"nw\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-n\",\n \"data-ord\": \"n\",\n tabIndex: 0,\n \"aria-label\": e.nDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"n\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-ne\",\n \"data-ord\": \"ne\",\n tabIndex: 0,\n \"aria-label\": e.neDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"ne\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-e\",\n \"data-ord\": \"e\",\n tabIndex: 0,\n \"aria-label\": e.eDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"e\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-se\",\n \"data-ord\": \"se\",\n tabIndex: 0,\n \"aria-label\": e.seDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"se\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-s\",\n \"data-ord\": \"s\",\n tabIndex: 0,\n \"aria-label\": e.sDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"s\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-sw\",\n \"data-ord\": \"sw\",\n tabIndex: 0,\n \"aria-label\": e.swDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"sw\"),\n role: \"button\"\n }\n ), /* @__PURE__ */ p.createElement(\n \"div\",\n {\n className: \"ReactCrop__drag-handle ord-w\",\n \"data-ord\": \"w\",\n tabIndex: 0,\n \"aria-label\": e.wDragHandle,\n onKeyDown: (a) => this.onHandlerKeyDown(a, \"w\"),\n role: \"button\"\n }\n )),\n i && /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__selection-addon\", onPointerDown: (a) => a.stopPropagation() }, i(this.state)),\n n && /* @__PURE__ */ p.createElement(p.Fragment, null, /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-hz\" }), /* @__PURE__ */ p.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-vt\" }))\n );\n }\n makePixelCrop(e) {\n const t = { ...M, ...this.props.crop || {} };\n return y(t, e.width, e.height);\n }\n render() {\n const { aspect: e, children: t, circularCrop: h, className: i, crop: n, disabled: s, locked: w, style: a, ruleOfThirds: r } = this.props, { cropIsActive: c, newCropIsBeingDrawn: d } = this.state, g = n ? this.renderCropSelection() : null, l = S(\n \"ReactCrop\",\n i,\n c && \"ReactCrop--active\",\n s && \"ReactCrop--disabled\",\n w && \"ReactCrop--locked\",\n d && \"ReactCrop--new-crop\",\n n && e && \"ReactCrop--fixed-aspect\",\n n && h && \"ReactCrop--circular-crop\",\n n && r && \"ReactCrop--rule-of-thirds\",\n !this.dragStarted && n && !n.width && !n.height && \"ReactCrop--invisible-crop\",\n h && \"ReactCrop--no-animate\"\n );\n return /* @__PURE__ */ p.createElement(\"div\", { ref: this.componentRef, className: l, style: a }, /* @__PURE__ */ p.createElement(\"div\", { ref: this.mediaRef, className: \"ReactCrop__child-wrapper\", onPointerDown: this.onComponentPointerDown }, t), n ? /* @__PURE__ */ p.createElement(\"svg\", { className: \"ReactCrop__crop-mask\", width: \"100%\", height: \"100%\" }, /* @__PURE__ */ p.createElement(\"defs\", null, /* @__PURE__ */ p.createElement(\"mask\", { id: `hole-${this.instanceId}` }, /* @__PURE__ */ p.createElement(\"rect\", { width: \"100%\", height: \"100%\", fill: \"white\" }), h ? /* @__PURE__ */ p.createElement(\n \"ellipse\",\n {\n cx: `${n.x + n.width / 2}${n.unit}`,\n cy: `${n.y + n.height / 2}${n.unit}`,\n rx: `${n.width / 2}${n.unit}`,\n ry: `${n.height / 2}${n.unit}`,\n fill: \"black\"\n }\n ) : /* @__PURE__ */ p.createElement(\n \"rect\",\n {\n x: `${n.x}${n.unit}`,\n y: `${n.y}${n.unit}`,\n width: `${n.width}${n.unit}`,\n height: `${n.height}${n.unit}`,\n fill: \"black\"\n }\n ))), /* @__PURE__ */ p.createElement(\"rect\", { fill: \"black\", fillOpacity: 0.5, width: \"100%\", height: \"100%\", mask: `url(#hole-${this.instanceId})` })) : void 0, g);\n }\n};\nu.xOrds = [\"e\", \"w\"], u.yOrds = [\"n\", \"s\"], u.xyOrds = [\"nw\", \"ne\", \"se\", \"sw\"], u.nudgeStep = 1, u.nudgeStepMedium = 10, u.nudgeStepLarge = 100, u.defaultProps = {\n ariaLabels: {\n cropArea: \"Use the arrow keys to move the crop selection area\",\n nwDragHandle: \"Use the arrow keys to move the north west drag handle to change the crop selection area\",\n nDragHandle: \"Use the up and down arrow keys to move the north drag handle to change the crop selection area\",\n neDragHandle: \"Use the arrow keys to move the north east drag handle to change the crop selection area\",\n eDragHandle: \"Use the up and down arrow keys to move the east drag handle to change the crop selection area\",\n seDragHandle: \"Use the arrow keys to move the south east drag handle to change the crop selection area\",\n sDragHandle: \"Use the up and down arrow keys to move the south drag handle to change the crop selection area\",\n swDragHandle: \"Use the arrow keys to move the south west drag handle to change the crop selection area\",\n wDragHandle: \"Use the up and down arrow keys to move the west drag handle to change the crop selection area\"\n }\n};\nlet X = u;\nexport {\n X as Component,\n X as ReactCrop,\n Y as areCropsEqual,\n I as centerCrop,\n v as clamp,\n S as cls,\n P as containCrop,\n D as convertToPercentCrop,\n y as convertToPixelCrop,\n X as default,\n M as defaultCrop,\n H as makeAspectCrop,\n _ as nudgeCrop\n};\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {\r\n BaseSelection,\r\n LexicalCommand,\r\n LexicalEditor,\r\n NodeKey,\r\n} from \"lexical\";\r\n\r\nimport \"./ImageNode.css\";\r\n\r\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\r\nimport LexicalErrorBoundary from \"@lexical/react/LexicalErrorBoundary\";\r\nimport { LexicalNestedComposer } from \"@lexical/react/LexicalNestedComposer\";\r\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\r\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\r\nimport { mergeRegister } from \"@lexical/utils\";\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n $isRangeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_CRITICAL,\r\n COMMAND_PRIORITY_LOW,\r\n createCommand,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from \"lexical\";\r\nimport { Suspense, useCallback, useEffect, useRef, useState } from \"react\";\r\nimport ContentEditable from \"../ui/ContentEditable\";\r\nimport ImageResizer from \"../ui/ImageResizer\";\r\nimport Placeholder from \"../ui/Placeholder\";\r\nimport { $isImageNode } from \"./ImageNode\";\r\nimport ReactCrop, { type Crop, type PixelCrop } from \"react-image-crop\";\r\nimport \"react-image-crop/dist/ReactCrop.css\";\r\n\r\nexport const RIGHT_CLICK_IMAGE_COMMAND: LexicalCommand<MouseEvent> =\r\n createCommand(\"RIGHT_CLICK_IMAGE_COMMAND\");\r\n\r\nfunction LazyImage({\r\n altText,\r\n className,\r\n src,\r\n width,\r\n height,\r\n maxWidth,\r\n imageRef,\r\n startCrop,\r\n setStartCrop,\r\n isFocused,\r\n nodeKey,\r\n}: {\r\n altText: string;\r\n className: string | null;\r\n height: \"inherit\" | number;\r\n maxWidth?: number;\r\n src: string;\r\n width: \"inherit\" | number;\r\n imageRef: any;\r\n startCrop: boolean;\r\n setStartCrop: any;\r\n isFocused: boolean;\r\n nodeKey: NodeKey;\r\n}): JSX.Element {\r\n const [completedCrop, setCompletedCrop] = useState<PixelCrop | null>(null);\r\n const [crop, setCrop] = useState<Crop>({\r\n //@ts-ignore\r\n unit: \"px\", // Can be 'px' or '%'\r\n x: 25,\r\n y: 25,\r\n width: 50,\r\n height: 50,\r\n });\r\n const [editor] = useLexicalComposerContext();\r\n\r\n const applyCrop = () => {\r\n if (completedCrop) {\r\n const image = imageRef.current;\r\n if (!image || !completedCrop) return;\r\n\r\n const scaleX = image.naturalWidth / image.width;\r\n const scaleY = image.naturalHeight / image.height;\r\n\r\n const offscreen = new OffscreenCanvas(\r\n completedCrop.width * scaleX,\r\n completedCrop.height * scaleY\r\n );\r\n const ctx = offscreen.getContext(\"2d\");\r\n if (!ctx) {\r\n throw new Error(\"No 2D context available\");\r\n }\r\n\r\n (ctx as any).drawImage(\r\n image,\r\n completedCrop.x * scaleX,\r\n completedCrop.y * scaleY,\r\n completedCrop.width * scaleX,\r\n completedCrop.height * scaleY,\r\n 0,\r\n 0,\r\n completedCrop.width * scaleX,\r\n completedCrop.height * scaleY\r\n );\r\n\r\n (offscreen as any).convertToBlob({ type: \"image/png\" }).then((blob: any) => {\r\n setStartCrop(false);\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n const base64data = reader.result as string;\r\n\r\n // Update the node's src directly without local state\r\n setTimeout(() => {\r\n editor.update(\r\n () => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node) && base64data) {\r\n node.setSrc(base64data);\r\n }\r\n },\r\n { tag: 'crop' }\r\n );\r\n }, 100);\r\n };\r\n reader.onerror = () => {\r\n console.error(\"Error reading the cropped image blob\");\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n };\r\n\r\n const handleToggleCrop = () => {\r\n if (startCrop) return;\r\n setStartCrop((prev: any) => {\r\n if (prev === false) {\r\n const image = imageRef.current;\r\n\r\n //@ts-ignore\r\n setCrop({\r\n unit: \"px\", // Can be 'px' or '%'\r\n x: 0,\r\n y: 0,\r\n width: image.width,\r\n height: image.height,\r\n });\r\n }\r\n return !prev;\r\n });\r\n };\r\n\r\n const lastCompletedCropRef = useRef<PixelCrop | null>(null);\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n\r\n // Store completed crop reference\r\n useEffect(() => {\r\n if (completedCrop) {\r\n lastCompletedCropRef.current = completedCrop;\r\n }\r\n }, [completedCrop]);\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(event.target as Node)\r\n ) {\r\n setStartCrop(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, []);\r\n\r\n return (\r\n <div ref={containerRef}>\r\n {isFocused && (\r\n <button\r\n style={{ zIndex: 999 }}\r\n className=\"image-caption-button\"\r\n onClick={() => handleToggleCrop()}\r\n >\r\n Crop\r\n </button>\r\n )}\r\n\r\n {startCrop && (\r\n <button\r\n style={{ zIndex: 999 }}\r\n className=\"image-caption-button\"\r\n onClick={() => applyCrop()}\r\n >\r\n Apply Crop\r\n </button>\r\n )}\r\n\r\n {startCrop ? (\r\n <ReactCrop\r\n crop={crop}\r\n onChange={(c) => setCrop(c)}\r\n onComplete={(c) => setCompletedCrop(c)}\r\n >\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n width={typeof width === \"number\" ? width : undefined}\r\n height={typeof height === \"number\" ? height : undefined}\r\n style={{\r\n height,\r\n maxWidth,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n crossOrigin=\"anonymous\"\r\n/>\r\n\r\n </ReactCrop>\r\n ) : (\r\n // When startCrop is false, show the cropped image or original image\r\n<img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n width={typeof width === \"number\" ? width : undefined}\r\n height={typeof height === \"number\" ? height : undefined}\r\n style={{\r\n height,\r\n maxWidth,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n crossOrigin=\"anonymous\"\r\n/>\r\n\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport default function ImageComponent({\r\n src,\r\n altText,\r\n nodeKey,\r\n width,\r\n height,\r\n maxWidth,\r\n resizable,\r\n showCaption,\r\n caption,\r\n enableCaptions\r\n}: {\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: \"inherit\" | number;\r\n maxWidth?: number;\r\n nodeKey: NodeKey;\r\n resizable: boolean;\r\n showCaption: boolean;\r\n src: string;\r\n width: \"inherit\" | number;\r\n enableCaptions: boolean;\r\n}): JSX.Element {\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [isResizing, setIsResizing] = useState<boolean>(false);\r\n const [editor] = useLexicalComposerContext();\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const [startCrop, setStartCrop] = useState<boolean>(false);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n const customDeleteImage = useCallback((payload: KeyboardEvent) => {\r\n if (!isSelected) {\r\n return false;\r\n }\r\n \r\n // Prevent the default deletion behavior.\r\n payload.preventDefault();\r\n \r\n editor.update(() => {\r\n const imageNode = $getNodeByKey(nodeKey);\r\n if ($isImageNode(imageNode)) {\r\n imageNode.remove();\r\n }\r\n });\r\n \r\n return true;\r\n }, [isSelected, editor, nodeKey]);\r\n \r\n const onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption]\r\n );\r\n\r\n const onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected]\r\n );\r\n\r\n const onClick = useCallback(\r\n (payload: MouseEvent) => {\r\n const event = payload;\r\n if (isResizing) {\r\n return true;\r\n }\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n [isResizing, isSelected, setSelected, clearSelection]\r\n );\r\n\r\n const onRightClick = useCallback(\r\n (event: MouseEvent): void => {\r\n editor.getEditorState().read(() => {\r\n const latestSelection = $getSelection();\r\n const domElement = event.target as HTMLElement;\r\n if (\r\n domElement.tagName === \"IMG\" &&\r\n $isRangeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n editor.dispatchCommand(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n event as MouseEvent\r\n );\r\n }\r\n });\r\n },\r\n [editor]\r\n );\r\n useEffect(() => {\r\n const onKeyDown = (e: KeyboardEvent) => {\r\n // Check if the pressed key is Delete or Backspace\r\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && isSelected) {\r\n // Stop the event from propagating to other plugins (like the table plugin)\r\n e.stopPropagation();\r\n e.preventDefault();\r\n editor.update(() => {\r\n const imageNode = $getNodeByKey(nodeKey);\r\n if ($isImageNode(imageNode)) {\r\n imageNode.remove();\r\n }\r\n });\r\n }\r\n };\r\n \r\n const rootElement = editor.getRootElement();\r\n rootElement?.addEventListener(\"keydown\", onKeyDown);\r\n \r\n return () => {\r\n rootElement?.removeEventListener(\"keydown\", onKeyDown);\r\n };\r\n }, [isSelected, editor, nodeKey]);\r\n \r\n useEffect(() => {\r\n let isMounted = true;\r\n const rootElement = editor.getRootElement();\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n RIGHT_CLICK_IMAGE_COMMAND,\r\n onClick,\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n customDeleteImage,\r\n 4\r\n ),\r\n \r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n customDeleteImage,\r\n 4\r\n ),\r\n \r\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(KEY_ESCAPE_COMMAND, onEscape, COMMAND_PRIORITY_LOW)\r\n );\r\n\r\n rootElement?.addEventListener(\"contextmenu\", onRightClick);\r\n\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n rootElement?.removeEventListener(\"contextmenu\", onRightClick);\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isResizing,\r\n isSelected,\r\n nodeKey,\r\n // onDelete,\r\n onEnter,\r\n onEscape,\r\n onClick,\r\n onRightClick,\r\n setSelected,\r\n ]);\r\n\r\n const setShowCaption = () => {\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setShowCaption(true);\r\n }\r\n });\r\n };\r\n\r\n const onResizeEnd = (\r\n nextWidth: \"inherit\" | number,\r\n nextHeight: \"inherit\" | number\r\n ) => {\r\n // Delay hiding the resize bars for click case\r\n setTimeout(() => {\r\n setIsResizing(false);\r\n }, 200);\r\n\r\n editor.update(() => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isImageNode(node)) {\r\n node.setWidthAndHeight(nextWidth, nextHeight);\r\n }\r\n });\r\n };\r\n\r\n const onResizeStart = () => {\r\n if (!startCrop) {\r\n setIsResizing(true);\r\n }\r\n };\r\n const draggable = isSelected && $isNodeSelection(selection) && !isResizing;\r\n const isFocused = isSelected || isResizing;\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? \"draggable\" : \"\"}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n width={width}\r\n height={height}\r\n maxWidth={maxWidth}\r\n imageRef={imageRef}\r\n startCrop={startCrop}\r\n setStartCrop={setStartCrop}\r\n isFocused={isFocused}\r\n nodeKey={nodeKey}\r\n />\r\n </div>\r\n\r\n {showCaption && (\r\n <div className=\"image-caption-container\">\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable className=\"ImageNode__contentEditable\" />\r\n }\r\n placeholder={\r\n <Placeholder className=\"ImageNode__placeholder\">\r\n Enter a caption...\r\n </Placeholder>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n </div>\r\n )}\r\n\r\n {!startCrop &&\r\n resizable &&\r\n $isNodeSelection(selection) &&\r\n isFocused && (\r\n <ImageResizer\r\n showCaption={showCaption}\r\n setShowCaption={setShowCaption}\r\n editor={editor}\r\n buttonRef={buttonRef}\r\n maxWidth={maxWidth}\r\n onResizeStart={startCrop ? () => {} : onResizeStart}\r\n onResizeEnd={startCrop ? () => {} : onResizeEnd}\r\n enableCaptions={enableCaptions}\r\n imageRef={imageRef}\r\n />\r\n )}\r\n </>\r\n </Suspense>\r\n );\r\n}\r\n"],"names":["clamp","value","min","max","Direction","ImageResizer","onResizeStart","onResizeEnd","buttonRef","imageRef","maxWidth","editor","showCaption","setShowCaption","enableCaptions","controlWrapperRef","useRef","userSelect","positioningRef","editorRootElement","maxWidthContainer","maxHeightContainer","minWidth","minHeight","setStartCursor","direction","ew","ns","nwse","cursorDir","setEndCursor","handlePointerDown","event","image","controlWrapper","width","height","positioning","handlePointerMove","handlePointerUp","isHorizontal","isVertical","diff","clampedHeight","jsxs","jsx","M","v","o","e","t","S","Y","D","y","P","h","i","n","s","w","a","r","c","d","g","l","m","x","b","C","_","f","$","u","k","E","R","p","X","RIGHT_CLICK_IMAGE_COMMAND","createCommand","LazyImage","altText","className","src","startCrop","setStartCrop","isFocused","nodeKey","completedCrop","setCompletedCrop","useState","crop","setCrop","useLexicalComposerContext","applyCrop","scaleX","scaleY","offscreen","ctx","blob","reader","base64data","node","$getNodeByKey","$isImageNode","handleToggleCrop","prev","lastCompletedCropRef","containerRef","useEffect","handleClickOutside","ReactCrop","ImageComponent","resizable","caption","isSelected","setSelected","clearSelection","useLexicalNodeSelection","isResizing","setIsResizing","selection","setSelection","activeEditorRef","customDeleteImage","useCallback","payload","imageNode","onEnter","latestSelection","$getSelection","buttonElem","$isNodeSelection","$setSelection","onEscape","parentRootElement","onClick","onRightClick","$isRangeSelection","onKeyDown","rootElement","isMounted","unregister","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","activeEditor","COMMAND_PRIORITY_LOW","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","nextWidth","nextHeight","draggable","Suspense","Fragment","LexicalNestedComposer","RichTextPlugin","ContentEditable","Placeholder","LexicalErrorBoundary"],"mappings":"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","x_google_ignoreList":[1]}
@@ -1,5 +1,5 @@
1
- import { a as G, w as L, c as U, n as H, o as M, Y as V, G as W, v as X, e as A, j as e, p as $, i as Y, C as w, q as k, s as Z, y as J, u as Q, d as B, x as q, z as K, b as O, f as ee, g as te, k as ne, h as se, I as ae, r as oe, A as ie, B as le, l as re, L as ce, P as ue, m as me, T as de, D as pe, E as ge } from "./index-19249db0.js";
2
- import { d as fe } from "./LexicalNestedComposer.prod-d18c51bc.js";
1
+ import { a as G, w as L, c as U, n as H, o as M, Y as V, G as W, v as X, e as A, j as e, p as $, i as Y, C as w, q as k, s as Z, y as J, u as Q, d as B, x as q, z as K, b as O, f as ee, g as te, k as ne, h as se, I as ae, r as oe, A as ie, B as le, l as re, L as ce, P as ue, m as me, T as de, D as pe, E as ge } from "./index-c6d40f36.js";
2
+ import { d as fe } from "./LexicalNestedComposer.prod-fd8d53c1.js";
3
3
  import { useState as C, useCallback as y, useEffect as T, useRef as D, Suspense as he } from "react";
4
4
  import { createPortal as xe } from "react-dom";
5
5
  function be(t, s) {
@@ -526,4 +526,4 @@ export {
526
526
  ke as UpdateInlineImageDialog,
527
527
  Pe as default
528
528
  };
529
- //# sourceMappingURL=InlineImageComponent-bfd052ab.js.map
529
+ //# sourceMappingURL=InlineImageComponent-a02cb874.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InlineImageComponent-bfd052ab.js","sources":["../src/lexical/utils/getDOMRangeRect.ts","../src/lexical/utils/setFloatingElemPosition.ts","../src/lexical/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/lexical/ui/Select.tsx","../src/lexical/nodes/InlineImageComponent.tsx"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = window.getSelection();\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n): JSX.Element | null {\r\n const [isText, setIsText] = useState(false);\r\n const [isLink, setIsLink] = useState(false);\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n\r\n const updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Select.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype SelectIntrinsicProps = JSX.IntrinsicElements['select'];\r\ninterface SelectProps extends SelectIntrinsicProps {\r\n label: string;\r\n}\r\n\r\nexport default function Select({\r\n children,\r\n label,\r\n className,\r\n ...other\r\n}: SelectProps): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label style={{marginTop: '-1em'}} className=\"Input__label\">\r\n {label}\r\n </label>\r\n <select {...other} className={className || 'select'}>\r\n {children}\r\n </select>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {Position} from './InlineImageNode';\r\nimport type {BaseSelection, LexicalEditor, NodeKey} from 'lexical';\r\n\r\nimport './InlineImageNode.css';\r\n\r\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary';\r\nimport {LexicalNestedComposer} from '@lexical/react/LexicalNestedComposer';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {Suspense, useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nimport useModal from '../hooks/useModal';\r\nimport FloatingTextFormatToolbarPlugin from '../plugins/FloatingTextFormatToolbarPlugin/index';\r\nimport LinkPlugin from '../plugins/LinkPlugin';\r\nimport Button from '../ui/Button';\r\nimport ContentEditable from '../ui/ContentEditable';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport Placeholder from '../ui/Placeholder';\r\nimport Select from '../ui/Select';\r\nimport TextInput from '../ui/TextInput';\r\nimport {$isInlineImageNode, InlineImageNode} from './InlineImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nfunction useSuspenseImage(src: string) {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n}\r\n\r\nfunction LazyImage({\r\n altText,\r\n className,\r\n imageRef,\r\n src,\r\n width,\r\n height,\r\n position,\r\n}: {\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n data-position={position}\r\n style={{\r\n display: 'block',\r\n height,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\n\r\nexport function UpdateInlineImageDialog({\r\n activeEditor,\r\n nodeKey,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n nodeKey: NodeKey;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const editorState = activeEditor.getEditorState();\r\n const node = editorState.read(\r\n () => $getNodeByKey(nodeKey) as InlineImageNode,\r\n );\r\n const [altText, setAltText] = useState(node.getAltText());\r\n const [showCaption, setShowCaption] = useState(node.getShowCaption());\r\n const [position, setPosition] = useState<Position>(node.getPosition());\r\n\r\n const handleShowCaptionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setShowCaption(e.target.checked);\r\n };\r\n\r\n const handlePositionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n setPosition(e.target.value as Position);\r\n };\r\n\r\n const handleOnConfirm = () => {\r\n const payload = {altText, position, showCaption};\r\n if (node) {\r\n activeEditor.update(() => {\r\n node.update(payload);\r\n });\r\n }\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <div style={{marginBottom: '1em'}}>\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n\r\n <Select\r\n style={{marginBottom: '1em', width: '208px'}}\r\n value={position}\r\n label=\"Position\"\r\n name=\"position\"\r\n id=\"position-select\"\r\n onChange={handlePositionChange}>\r\n <option value=\"left\">Left</option>\r\n <option value=\"right\">Right</option>\r\n <option value=\"full\">Full Width</option>\r\n </Select>\r\n\r\n <div className=\"Input__wrapper\">\r\n <input\r\n id=\"caption\"\r\n type=\"checkbox\"\r\n checked={showCaption}\r\n onChange={handleShowCaptionChange}\r\n />\r\n <label htmlFor=\"caption\">Show Caption</label>\r\n </div>\r\n\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n onClick={() => handleOnConfirm()}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function InlineImageComponent({\r\n src,\r\n altText,\r\n nodeKey,\r\n width,\r\n height,\r\n showCaption,\r\n caption,\r\n position,\r\n}: {\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [editor] = useLexicalComposerContext();\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n const onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n onDelete,\r\n onEnter,\r\n onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n <button\r\n className=\"image-edit-button\"\r\n ref={buttonRef}\r\n onClick={() => {\r\n showModal('Update Inline Image', (onClose) => (\r\n <UpdateInlineImageDialog\r\n activeEditor={editor}\r\n nodeKey={nodeKey}\r\n onClose={onClose}\r\n />\r\n ));\r\n }}>\r\n Edit\r\n </button>\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n position={position}\r\n />\r\n </div>\r\n {showCaption && (\r\n <div className=\"image-caption-container\">\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <AutoFocusPlugin />\r\n <LinkPlugin />\r\n <FloatingTextFormatToolbarPlugin />\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable className=\"InlineImageNode__contentEditable\" />\r\n }\r\n placeholder={\r\n <Placeholder className=\"InlineImageNode__placeholder\">\r\n Enter a caption...\r\n </Placeholder>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n </div>\r\n )}\r\n </>\r\n {modal}\r\n </Suspense>\r\n );\r\n}\r\n"],"names":["getDOMRangeRect","nativeSelection","rootElement","domRange","rect","inner","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPosition","targetRect","floatingElem","anchorElem","isLink","verticalGap","horizontalOffset","scrollerElem","floatingElemRect","anchorElementRect","editorScrollerRect","top","left","TextFormatFloatingToolbar","editor","isBold","isItalic","isUnderline","isCode","isStrikethrough","isSubscript","isSuperscript","popupCharStylesEditorRef","useRef","insertLink","useCallback","TOGGLE_LINK_COMMAND","insertComment","INSERT_INLINE_COMMAND","mouseMoveListener","e","x","y","elementUnderMouse","mouseUpListener","useEffect","updateTextFormatFloatingToolbar","selection","$getSelection","popupCharStylesEditorElem","rangeRect","update","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","jsxs","Fragment","jsx","FORMAT_TEXT_COMMAND","useFloatingTextFormatToolbar","isText","setIsText","useState","setIsLink","setIsBold","setIsItalic","setIsUnderline","setIsStrikethrough","setIsSubscript","setIsSuperscript","setIsCode","updatePopup","$isRangeSelection","node","getSelectedNode","parent","$isLinkNode","$isCodeHighlightNode","$isTextNode","$isParagraphNode","rawTextContent","createPortal","FloatingTextFormatToolbarPlugin","useLexicalComposerContext","Select","children","label","className","other","imageCache","useSuspenseImage","src","resolve","img","LazyImage","altText","imageRef","width","height","position","UpdateInlineImageDialog","activeEditor","nodeKey","onClose","$getNodeByKey","setAltText","showCaption","setShowCaption","setPosition","handleShowCaptionChange","handlePositionChange","handleOnConfirm","payload","TextInput","DialogActions","Button","InlineImageComponent","caption","modal","showModal","useModal","buttonRef","isSelected","setSelected","clearSelection","useLexicalNodeSelection","setSelection","activeEditorRef","onDelete","$isNodeSelection","$isInlineImageNode","onEnter","event","latestSelection","buttonElem","$setSelection","onEscape","parentRootElement","isMounted","unregister","_","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","draggable","isFocused","Suspense","LexicalNestedComposer","AutoFocusPlugin","LinkPlugin","RichTextPlugin","ContentEditable","Placeholder","LexicalErrorBoundary"],"mappings":"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"}
1
+ {"version":3,"file":"InlineImageComponent-a02cb874.js","sources":["../src/lexical/utils/getDOMRangeRect.ts","../src/lexical/utils/setFloatingElemPosition.ts","../src/lexical/plugins/FloatingTextFormatToolbarPlugin/index.tsx","../src/lexical/ui/Select.tsx","../src/lexical/nodes/InlineImageComponent.tsx"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nexport function getDOMRangeRect(\r\n nativeSelection: Selection,\r\n rootElement: HTMLElement,\r\n): DOMRect {\r\n const domRange = nativeSelection.getRangeAt(0);\r\n\r\n let rect;\r\n\r\n if (nativeSelection.anchorNode === rootElement) {\r\n let inner = rootElement;\r\n while (inner.firstElementChild != null) {\r\n inner = inner.firstElementChild as HTMLElement;\r\n }\r\n rect = inner.getBoundingClientRect();\r\n } else {\r\n rect = domRange.getBoundingClientRect();\r\n }\r\n\r\n return rect;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nconst VERTICAL_GAP = 10;\r\nconst HORIZONTAL_OFFSET = 5;\r\n\r\nexport function setFloatingElemPosition(\r\n targetRect: DOMRect | null,\r\n floatingElem: HTMLElement,\r\n anchorElem: HTMLElement,\r\n isLink: boolean = false,\r\n verticalGap: number = VERTICAL_GAP,\r\n horizontalOffset: number = HORIZONTAL_OFFSET,\r\n): void {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n if (targetRect === null || !scrollerElem) {\r\n floatingElem.style.opacity = '0';\r\n floatingElem.style.transform = 'translate(-10000px, -10000px)';\r\n return;\r\n }\r\n\r\n const floatingElemRect = floatingElem.getBoundingClientRect();\r\n const anchorElementRect = anchorElem.getBoundingClientRect();\r\n const editorScrollerRect = scrollerElem.getBoundingClientRect();\r\n\r\n let top = targetRect.top - floatingElemRect.height - verticalGap;\r\n let left = targetRect.left - horizontalOffset;\r\n\r\n if (top < editorScrollerRect.top) {\r\n // adjusted height for link element if the element is at top\r\n top +=\r\n floatingElemRect.height +\r\n targetRect.height +\r\n verticalGap * (isLink ? 9 : 2);\r\n }\r\n\r\n if (left + floatingElemRect.width > editorScrollerRect.right) {\r\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset;\r\n }\r\n\r\n top -= anchorElementRect.top;\r\n left -= anchorElementRect.left;\r\n\r\n floatingElem.style.opacity = '1';\r\n floatingElem.style.transform = `translate(${left}px, ${top}px)`;\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './index.css';\r\n\r\nimport {$isCodeHighlightNode} from '@lexical/code';\r\nimport {$isLinkNode, TOGGLE_LINK_COMMAND} from '@lexical/link';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getSelection,\r\n $isParagraphNode,\r\n $isRangeSelection,\r\n $isTextNode,\r\n COMMAND_PRIORITY_LOW,\r\n FORMAT_TEXT_COMMAND,\r\n LexicalEditor,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport {useCallback, useEffect, useRef, useState} from 'react';\r\nimport * as React from 'react';\r\nimport {createPortal} from 'react-dom';\r\n\r\nimport {getDOMRangeRect} from '../../utils/getDOMRangeRect';\r\nimport {getSelectedNode} from '../../utils/getSelectedNode';\r\nimport {setFloatingElemPosition} from '../../utils/setFloatingElemPosition';\r\nimport {INSERT_INLINE_COMMAND} from '../CommentPlugin';\r\n\r\nfunction TextFormatFloatingToolbar({\r\n editor,\r\n anchorElem,\r\n isLink,\r\n isBold,\r\n isItalic,\r\n isUnderline,\r\n isCode,\r\n isStrikethrough,\r\n isSubscript,\r\n isSuperscript,\r\n}: {\r\n editor: LexicalEditor;\r\n anchorElem: HTMLElement;\r\n isBold: boolean;\r\n isCode: boolean;\r\n isItalic: boolean;\r\n isLink: boolean;\r\n isStrikethrough: boolean;\r\n isSubscript: boolean;\r\n isSuperscript: boolean;\r\n isUnderline: boolean;\r\n}): JSX.Element {\r\n const popupCharStylesEditorRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const insertLink = useCallback(() => {\r\n if (!isLink) {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, 'https://');\r\n } else {\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n }\r\n }, [editor, isLink]);\r\n\r\n const insertComment = () => {\r\n editor.dispatchCommand(INSERT_INLINE_COMMAND, undefined);\r\n };\r\n\r\n function mouseMoveListener(e: MouseEvent) {\r\n if (\r\n popupCharStylesEditorRef?.current &&\r\n (e.buttons === 1 || e.buttons === 3)\r\n ) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'none') {\r\n const x = e.clientX;\r\n const y = e.clientY;\r\n const elementUnderMouse = document.elementFromPoint(x, y);\r\n\r\n if (!popupCharStylesEditorRef.current.contains(elementUnderMouse)) {\r\n // Mouse is not over the target element => not a normal click, but probably a drag\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'none';\r\n }\r\n }\r\n }\r\n }\r\n function mouseUpListener(e: MouseEvent) {\r\n if (popupCharStylesEditorRef?.current) {\r\n if (popupCharStylesEditorRef.current.style.pointerEvents !== 'auto') {\r\n popupCharStylesEditorRef.current.style.pointerEvents = 'auto';\r\n }\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (popupCharStylesEditorRef?.current) {\r\n document.addEventListener('mousemove', mouseMoveListener);\r\n document.addEventListener('mouseup', mouseUpListener);\r\n\r\n return () => {\r\n document.removeEventListener('mousemove', mouseMoveListener);\r\n document.removeEventListener('mouseup', mouseUpListener);\r\n };\r\n }\r\n }, [popupCharStylesEditorRef]);\r\n\r\n const updateTextFormatFloatingToolbar = useCallback(() => {\r\n const selection = $getSelection();\r\n\r\n const popupCharStylesEditorElem = popupCharStylesEditorRef.current;\r\n const nativeSelection = window.getSelection();\r\n\r\n if (popupCharStylesEditorElem === null) {\r\n return;\r\n }\r\n\r\n const rootElement = editor.getRootElement();\r\n if (\r\n selection !== null &&\r\n nativeSelection !== null &&\r\n !nativeSelection.isCollapsed &&\r\n rootElement !== null &&\r\n rootElement.contains(nativeSelection.anchorNode)\r\n ) {\r\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement);\r\n\r\n setFloatingElemPosition(\r\n rangeRect,\r\n popupCharStylesEditorElem,\r\n anchorElem,\r\n isLink,\r\n );\r\n }\r\n }, [editor, anchorElem, isLink]);\r\n\r\n useEffect(() => {\r\n const scrollerElem = anchorElem.parentElement;\r\n\r\n const update = () => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n };\r\n\r\n window.addEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.addEventListener('scroll', update);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener('resize', update);\r\n if (scrollerElem) {\r\n scrollerElem.removeEventListener('scroll', update);\r\n }\r\n };\r\n }, [editor, updateTextFormatFloatingToolbar, anchorElem]);\r\n\r\n useEffect(() => {\r\n editor.getEditorState().read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n editorState.read(() => {\r\n updateTextFormatFloatingToolbar();\r\n });\r\n }),\r\n\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n updateTextFormatFloatingToolbar();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [editor, updateTextFormatFloatingToolbar]);\r\n\r\n return (\r\n <div ref={popupCharStylesEditorRef} className=\"floating-text-format-popup\">\r\n {editor.isEditable() && (\r\n <>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n }}\r\n className={'popup-item spaced ' + (isBold ? 'active' : '')}\r\n aria-label=\"Format text as bold\">\r\n <i className=\"format bold\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n }}\r\n className={'popup-item spaced ' + (isItalic ? 'active' : '')}\r\n aria-label=\"Format text as italics\">\r\n <i className=\"format italic\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n }}\r\n className={'popup-item spaced ' + (isUnderline ? 'active' : '')}\r\n aria-label=\"Format text to underlined\">\r\n <i className=\"format underline\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n }}\r\n className={'popup-item spaced ' + (isStrikethrough ? 'active' : '')}\r\n aria-label=\"Format text with a strikethrough\">\r\n <i className=\"format strikethrough\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript');\r\n }}\r\n className={'popup-item spaced ' + (isSubscript ? 'active' : '')}\r\n title=\"Subscript\"\r\n aria-label=\"Format Subscript\">\r\n <i className=\"format subscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript');\r\n }}\r\n className={'popup-item spaced ' + (isSuperscript ? 'active' : '')}\r\n title=\"Superscript\"\r\n aria-label=\"Format Superscript\">\r\n <i className=\"format superscript\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');\r\n }}\r\n className={'popup-item spaced ' + (isCode ? 'active' : '')}\r\n aria-label=\"Insert code block\">\r\n <i className=\"format code\" />\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={insertLink}\r\n className={'popup-item spaced ' + (isLink ? 'active' : '')}\r\n aria-label=\"Insert link\">\r\n <i className=\"format link\" />\r\n </button>\r\n </>\r\n )}\r\n <button\r\n type=\"button\"\r\n onClick={insertComment}\r\n className={'popup-item spaced insert-comment'}\r\n aria-label=\"Insert comment\">\r\n <i className=\"format add-comment\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useFloatingTextFormatToolbar(\r\n editor: LexicalEditor,\r\n anchorElem: HTMLElement,\r\n): JSX.Element | null {\r\n const [isText, setIsText] = useState(false);\r\n const [isLink, setIsLink] = useState(false);\r\n const [isBold, setIsBold] = useState(false);\r\n const [isItalic, setIsItalic] = useState(false);\r\n const [isUnderline, setIsUnderline] = useState(false);\r\n const [isStrikethrough, setIsStrikethrough] = useState(false);\r\n const [isSubscript, setIsSubscript] = useState(false);\r\n const [isSuperscript, setIsSuperscript] = useState(false);\r\n const [isCode, setIsCode] = useState(false);\r\n\r\n const updatePopup = useCallback(() => {\r\n editor.getEditorState().read(() => {\r\n // Should not to pop up the floating toolbar when using IME input\r\n if (editor.isComposing()) {\r\n return;\r\n }\r\n const selection = $getSelection();\r\n const nativeSelection = window.getSelection();\r\n const rootElement = editor.getRootElement();\r\n\r\n if (\r\n nativeSelection !== null &&\r\n (!$isRangeSelection(selection) ||\r\n rootElement === null ||\r\n !rootElement.contains(nativeSelection.anchorNode))\r\n ) {\r\n setIsText(false);\r\n return;\r\n }\r\n\r\n if (!$isRangeSelection(selection)) {\r\n return;\r\n }\r\n\r\n const node = getSelectedNode(selection);\r\n\r\n // Update text format\r\n setIsBold(selection.hasFormat('bold'));\r\n setIsItalic(selection.hasFormat('italic'));\r\n setIsUnderline(selection.hasFormat('underline'));\r\n setIsStrikethrough(selection.hasFormat('strikethrough'));\r\n setIsSubscript(selection.hasFormat('subscript'));\r\n setIsSuperscript(selection.hasFormat('superscript'));\r\n setIsCode(selection.hasFormat('code'));\r\n\r\n // Update links\r\n const parent = node.getParent();\r\n if ($isLinkNode(parent) || $isLinkNode(node)) {\r\n setIsLink(true);\r\n } else {\r\n setIsLink(false);\r\n }\r\n\r\n if (\r\n !$isCodeHighlightNode(selection.anchor.getNode()) &&\r\n selection.getTextContent() !== ''\r\n ) {\r\n setIsText($isTextNode(node) || $isParagraphNode(node));\r\n } else {\r\n setIsText(false);\r\n }\r\n\r\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '');\r\n if (!selection.isCollapsed() && rawTextContent === '') {\r\n setIsText(false);\r\n return;\r\n }\r\n });\r\n }, [editor]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('selectionchange', updatePopup);\r\n return () => {\r\n document.removeEventListener('selectionchange', updatePopup);\r\n };\r\n }, [updatePopup]);\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(() => {\r\n updatePopup();\r\n }),\r\n editor.registerRootListener(() => {\r\n if (editor.getRootElement() === null) {\r\n setIsText(false);\r\n }\r\n }),\r\n );\r\n }, [editor, updatePopup]);\r\n\r\n if (!isText) {\r\n return null;\r\n }\r\n\r\n return createPortal(\r\n <TextFormatFloatingToolbar\r\n editor={editor}\r\n anchorElem={anchorElem}\r\n isLink={isLink}\r\n isBold={isBold}\r\n isItalic={isItalic}\r\n isStrikethrough={isStrikethrough}\r\n isSubscript={isSubscript}\r\n isSuperscript={isSuperscript}\r\n isUnderline={isUnderline}\r\n isCode={isCode}\r\n />,\r\n anchorElem,\r\n );\r\n}\r\n\r\nexport default function FloatingTextFormatToolbarPlugin({\r\n anchorElem = document.body,\r\n}: {\r\n anchorElem?: HTMLElement;\r\n}): JSX.Element | null {\r\n const [editor] = useLexicalComposerContext();\r\n return useFloatingTextFormatToolbar(editor, anchorElem);\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport './Select.css';\r\n\r\nimport * as React from 'react';\r\n\r\ntype SelectIntrinsicProps = JSX.IntrinsicElements['select'];\r\ninterface SelectProps extends SelectIntrinsicProps {\r\n label: string;\r\n}\r\n\r\nexport default function Select({\r\n children,\r\n label,\r\n className,\r\n ...other\r\n}: SelectProps): JSX.Element {\r\n return (\r\n <div className=\"Input__wrapper\">\r\n <label style={{marginTop: '-1em'}} className=\"Input__label\">\r\n {label}\r\n </label>\r\n <select {...other} className={className || 'select'}>\r\n {children}\r\n </select>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\nimport type {Position} from './InlineImageNode';\r\nimport type {BaseSelection, LexicalEditor, NodeKey} from 'lexical';\r\n\r\nimport './InlineImageNode.css';\r\n\r\nimport {AutoFocusPlugin} from '@lexical/react/LexicalAutoFocusPlugin';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport LexicalErrorBoundary from '@lexical/react/LexicalErrorBoundary';\r\nimport {LexicalNestedComposer} from '@lexical/react/LexicalNestedComposer';\r\nimport {RichTextPlugin} from '@lexical/react/LexicalRichTextPlugin';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n $setSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n DRAGSTART_COMMAND,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n KEY_ENTER_COMMAND,\r\n KEY_ESCAPE_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {Suspense, useCallback, useEffect, useRef, useState} from 'react';\r\n\r\nimport useModal from '../hooks/useModal';\r\nimport FloatingTextFormatToolbarPlugin from '../plugins/FloatingTextFormatToolbarPlugin/index';\r\nimport LinkPlugin from '../plugins/LinkPlugin';\r\nimport Button from '../ui/Button';\r\nimport ContentEditable from '../ui/ContentEditable';\r\nimport {DialogActions} from '../ui/Dialog';\r\nimport Placeholder from '../ui/Placeholder';\r\nimport Select from '../ui/Select';\r\nimport TextInput from '../ui/TextInput';\r\nimport {$isInlineImageNode, InlineImageNode} from './InlineImageNode';\r\n\r\nconst imageCache = new Set();\r\n\r\nfunction useSuspenseImage(src: string) {\r\n if (!imageCache.has(src)) {\r\n throw new Promise((resolve) => {\r\n const img = new Image();\r\n img.src = src;\r\n img.onload = () => {\r\n imageCache.add(src);\r\n resolve(null);\r\n };\r\n });\r\n }\r\n}\r\n\r\nfunction LazyImage({\r\n altText,\r\n className,\r\n imageRef,\r\n src,\r\n width,\r\n height,\r\n position,\r\n}: {\r\n altText: string;\r\n className: string | null;\r\n height: 'inherit' | number;\r\n imageRef: {current: null | HTMLImageElement};\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n useSuspenseImage(src);\r\n return (\r\n <img\r\n className={className || undefined}\r\n src={src}\r\n alt={altText}\r\n ref={imageRef}\r\n data-position={position}\r\n style={{\r\n display: 'block',\r\n height,\r\n width,\r\n }}\r\n draggable=\"false\"\r\n />\r\n );\r\n}\r\n\r\nexport function UpdateInlineImageDialog({\r\n activeEditor,\r\n nodeKey,\r\n onClose,\r\n}: {\r\n activeEditor: LexicalEditor;\r\n nodeKey: NodeKey;\r\n onClose: () => void;\r\n}): JSX.Element {\r\n const editorState = activeEditor.getEditorState();\r\n const node = editorState.read(\r\n () => $getNodeByKey(nodeKey) as InlineImageNode,\r\n );\r\n const [altText, setAltText] = useState(node.getAltText());\r\n const [showCaption, setShowCaption] = useState(node.getShowCaption());\r\n const [position, setPosition] = useState<Position>(node.getPosition());\r\n\r\n const handleShowCaptionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setShowCaption(e.target.checked);\r\n };\r\n\r\n const handlePositionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n setPosition(e.target.value as Position);\r\n };\r\n\r\n const handleOnConfirm = () => {\r\n const payload = {altText, position, showCaption};\r\n if (node) {\r\n activeEditor.update(() => {\r\n node.update(payload);\r\n });\r\n }\r\n onClose();\r\n };\r\n\r\n return (\r\n <>\r\n <div style={{marginBottom: '1em'}}>\r\n <TextInput\r\n label=\"Alt Text\"\r\n placeholder=\"Descriptive alternative text\"\r\n onChange={setAltText}\r\n value={altText}\r\n data-test-id=\"image-modal-alt-text-input\"\r\n />\r\n </div>\r\n\r\n <Select\r\n style={{marginBottom: '1em', width: '208px'}}\r\n value={position}\r\n label=\"Position\"\r\n name=\"position\"\r\n id=\"position-select\"\r\n onChange={handlePositionChange}>\r\n <option value=\"left\">Left</option>\r\n <option value=\"right\">Right</option>\r\n <option value=\"full\">Full Width</option>\r\n </Select>\r\n\r\n <div className=\"Input__wrapper\">\r\n <input\r\n id=\"caption\"\r\n type=\"checkbox\"\r\n checked={showCaption}\r\n onChange={handleShowCaptionChange}\r\n />\r\n <label htmlFor=\"caption\">Show Caption</label>\r\n </div>\r\n\r\n <DialogActions>\r\n <Button\r\n data-test-id=\"image-modal-file-upload-btn\"\r\n onClick={() => handleOnConfirm()}>\r\n Confirm\r\n </Button>\r\n </DialogActions>\r\n </>\r\n );\r\n}\r\n\r\nexport default function InlineImageComponent({\r\n src,\r\n altText,\r\n nodeKey,\r\n width,\r\n height,\r\n showCaption,\r\n caption,\r\n position,\r\n}: {\r\n altText: string;\r\n caption: LexicalEditor;\r\n height: 'inherit' | number;\r\n nodeKey: NodeKey;\r\n showCaption: boolean;\r\n src: string;\r\n width: 'inherit' | number;\r\n position: Position;\r\n}): JSX.Element {\r\n const [modal, showModal] = useModal();\r\n const imageRef = useRef<null | HTMLImageElement>(null);\r\n const buttonRef = useRef<HTMLButtonElement | null>(null);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [editor] = useLexicalComposerContext();\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const activeEditorRef = useRef<LexicalEditor | null>(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isInlineImageNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n const onEnter = useCallback(\r\n (event: KeyboardEvent) => {\r\n const latestSelection = $getSelection();\r\n const buttonElem = buttonRef.current;\r\n if (\r\n isSelected &&\r\n $isNodeSelection(latestSelection) &&\r\n latestSelection.getNodes().length === 1\r\n ) {\r\n if (showCaption) {\r\n // Move focus into nested editor\r\n $setSelection(null);\r\n event.preventDefault();\r\n caption.focus();\r\n return true;\r\n } else if (\r\n buttonElem !== null &&\r\n buttonElem !== document.activeElement\r\n ) {\r\n event.preventDefault();\r\n buttonElem.focus();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [caption, isSelected, showCaption],\r\n );\r\n\r\n const onEscape = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (\r\n activeEditorRef.current === caption ||\r\n buttonRef.current === event.target\r\n ) {\r\n $setSelection(null);\r\n editor.update(() => {\r\n setSelected(true);\r\n const parentRootElement = editor.getRootElement();\r\n if (parentRootElement !== null) {\r\n parentRootElement.focus();\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n },\r\n [caption, editor, setSelected],\r\n );\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n const unregister = mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n if (isMounted) {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }\r\n }),\r\n editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n (_, activeEditor) => {\r\n activeEditorRef.current = activeEditor;\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n if (event.target === imageRef.current) {\r\n if (event.shiftKey) {\r\n setSelected(!isSelected);\r\n } else {\r\n clearSelection();\r\n setSelected(true);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n DRAGSTART_COMMAND,\r\n (event) => {\r\n if (event.target === imageRef.current) {\r\n // TODO This is just a temporary workaround for FF to behave like other browsers.\r\n // Ideally, this handles drag & drop too (and all browsers).\r\n event.preventDefault();\r\n return true;\r\n }\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(KEY_ENTER_COMMAND, onEnter, COMMAND_PRIORITY_LOW),\r\n editor.registerCommand(\r\n KEY_ESCAPE_COMMAND,\r\n onEscape,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n return () => {\r\n isMounted = false;\r\n unregister();\r\n };\r\n }, [\r\n clearSelection,\r\n editor,\r\n isSelected,\r\n nodeKey,\r\n onDelete,\r\n onEnter,\r\n onEscape,\r\n setSelected,\r\n ]);\r\n\r\n const draggable = isSelected && $isNodeSelection(selection);\r\n const isFocused = isSelected;\r\n return (\r\n <Suspense fallback={null}>\r\n <>\r\n <div draggable={draggable}>\r\n <button\r\n className=\"image-edit-button\"\r\n ref={buttonRef}\r\n onClick={() => {\r\n showModal('Update Inline Image', (onClose) => (\r\n <UpdateInlineImageDialog\r\n activeEditor={editor}\r\n nodeKey={nodeKey}\r\n onClose={onClose}\r\n />\r\n ));\r\n }}>\r\n Edit\r\n </button>\r\n <LazyImage\r\n className={\r\n isFocused\r\n ? `focused ${$isNodeSelection(selection) ? 'draggable' : ''}`\r\n : null\r\n }\r\n src={src}\r\n altText={altText}\r\n imageRef={imageRef}\r\n width={width}\r\n height={height}\r\n position={position}\r\n />\r\n </div>\r\n {showCaption && (\r\n <div className=\"image-caption-container\">\r\n <LexicalNestedComposer initialEditor={caption}>\r\n <AutoFocusPlugin />\r\n <LinkPlugin />\r\n <FloatingTextFormatToolbarPlugin />\r\n <RichTextPlugin\r\n contentEditable={\r\n <ContentEditable className=\"InlineImageNode__contentEditable\" />\r\n }\r\n placeholder={\r\n <Placeholder className=\"InlineImageNode__placeholder\">\r\n Enter a caption...\r\n </Placeholder>\r\n }\r\n ErrorBoundary={LexicalErrorBoundary}\r\n />\r\n </LexicalNestedComposer>\r\n </div>\r\n )}\r\n </>\r\n {modal}\r\n </Suspense>\r\n );\r\n}\r\n"],"names":["getDOMRangeRect","nativeSelection","rootElement","domRange","rect","inner","VERTICAL_GAP","HORIZONTAL_OFFSET","setFloatingElemPosition","targetRect","floatingElem","anchorElem","isLink","verticalGap","horizontalOffset","scrollerElem","floatingElemRect","anchorElementRect","editorScrollerRect","top","left","TextFormatFloatingToolbar","editor","isBold","isItalic","isUnderline","isCode","isStrikethrough","isSubscript","isSuperscript","popupCharStylesEditorRef","useRef","insertLink","useCallback","TOGGLE_LINK_COMMAND","insertComment","INSERT_INLINE_COMMAND","mouseMoveListener","e","x","y","elementUnderMouse","mouseUpListener","useEffect","updateTextFormatFloatingToolbar","selection","$getSelection","popupCharStylesEditorElem","rangeRect","update","mergeRegister","editorState","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_LOW","jsxs","Fragment","jsx","FORMAT_TEXT_COMMAND","useFloatingTextFormatToolbar","isText","setIsText","useState","setIsLink","setIsBold","setIsItalic","setIsUnderline","setIsStrikethrough","setIsSubscript","setIsSuperscript","setIsCode","updatePopup","$isRangeSelection","node","getSelectedNode","parent","$isLinkNode","$isCodeHighlightNode","$isTextNode","$isParagraphNode","rawTextContent","createPortal","FloatingTextFormatToolbarPlugin","useLexicalComposerContext","Select","children","label","className","other","imageCache","useSuspenseImage","src","resolve","img","LazyImage","altText","imageRef","width","height","position","UpdateInlineImageDialog","activeEditor","nodeKey","onClose","$getNodeByKey","setAltText","showCaption","setShowCaption","setPosition","handleShowCaptionChange","handlePositionChange","handleOnConfirm","payload","TextInput","DialogActions","Button","InlineImageComponent","caption","modal","showModal","useModal","buttonRef","isSelected","setSelected","clearSelection","useLexicalNodeSelection","setSelection","activeEditorRef","onDelete","$isNodeSelection","$isInlineImageNode","onEnter","event","latestSelection","buttonElem","$setSelection","onEscape","parentRootElement","isMounted","unregister","_","CLICK_COMMAND","DRAGSTART_COMMAND","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","draggable","isFocused","Suspense","LexicalNestedComposer","AutoFocusPlugin","LinkPlugin","RichTextPlugin","ContentEditable","Placeholder","LexicalErrorBoundary"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { F as u, H as y, J as E, j as k } from "./index-19249db0.js";
1
+ import { F as u, H as y, J as E, j as k } from "./index-c6d40f36.js";
2
2
  import { useRef as O, useContext as j, useMemo as D, useEffect as h } from "react";
3
3
  function K(e) {
4
4
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
@@ -45,4 +45,4 @@ function P({ initialEditor: e, children: r, initialNodes: o, initialTheme: g, sk
45
45
  export {
46
46
  P as d
47
47
  };
48
- //# sourceMappingURL=LexicalNestedComposer.prod-d18c51bc.js.map
48
+ //# sourceMappingURL=LexicalNestedComposer.prod-fd8d53c1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalNestedComposer.prod-d18c51bc.js","sources":["../node_modules/@lexical/react/LexicalNestedComposer.prod.mjs"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useCollaborationContext as e}from\"@lexical/react/LexicalCollaborationContext\";import{LexicalComposerContext as t,createLexicalComposerContext as r}from\"@lexical/react/LexicalComposerContext\";import{useRef as o,useContext as n,useMemo as l,useEffect as i}from\"react\";import{jsx as a}from\"react/jsx-runtime\";function s(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var c=s((function(e){const t=new URLSearchParams;t.append(\"code\",e);for(let e=1;e<arguments.length;e++)t.append(\"v\",arguments[e]);throw Error(`Minified Lexical error #${e}; visit https://lexical.dev/docs/error?${t} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}));function p(e){const t=e.transform();return null!==t?new Set([t]):new Set}function d({initialEditor:s,children:d,initialNodes:f,initialTheme:u,skipCollabChecks:m}){const h=o(!1),x=n(t);null==x&&c(9);const[_,{getTheme:g}]=x,v=l((()=>{const e=u||g()||void 0,t=r(x,e);if(void 0!==e&&(s._config.theme=e),s._parentEditor=_,f)for(let e of f){let t=null,r=null;if(\"function\"!=typeof e){const o=e;e=o.replace,t=o.with,r=o.withKlass||null}const o=s._nodes.get(e.getType());s._nodes.set(e.getType(),{exportDOM:o?o.exportDOM:void 0,klass:e,replace:t,replaceWithKlass:r,transforms:p(e)})}else{const e=s._nodes=new Map(_._nodes);for(const[t,r]of e)s._nodes.set(t,{exportDOM:r.exportDOM,klass:r.klass,replace:r.replace,replaceWithKlass:r.replaceWithKlass,transforms:p(r.klass)})}return s._config.namespace=_._config.namespace,s._editable=_._editable,[s,t]}),[]),{isCollabActive:w,yjsDocMap:b}=e(),M=m||h.current||b.has(s.getKey());return i((()=>{M&&(h.current=!0)}),[M]),i((()=>_.registerEditableListener((e=>{s.setEditable(e)}))),[s,_]),a(t.Provider,{value:v,children:!w||M?d:null})}export{d as LexicalNestedComposer};\n"],"names":["s","c","t","e","p","d","f","u","m","h","o","x","n","_","g","v","l","r","b","M","i","a"],"mappings":";;AAQyT,SAASA,EAAE,GAAE;AAAC,SAAO,KAAG,EAAE,cAAY,OAAO,UAAU,eAAe,KAAK,GAAE,SAAS,IAAE,EAAE,UAAQ;AAAC;AAAC,IAAIC,IAAED,EAAG,SAAS,GAAE;AAAC,QAAME,IAAE,IAAI;AAAgB,EAAAA,EAAE,OAAO,QAAO,CAAC;AAAE,WAAQC,IAAE,GAAEA,IAAE,UAAU,QAAOA;AAAI,IAAAD,EAAE,OAAO,KAAI,UAAUC,CAAC,CAAC;AAAE,QAAM,MAAM,2BAA2B,CAAC,0CAA0CD,CAAC,gHAAgH;AAAC,CAAC;AAAG,SAASE,EAAE,GAAE;AAAC,QAAMF,IAAE,EAAE,UAAW;AAAC,SAAcA,MAAP,OAAS,oBAAI,IAAI,CAACA,CAAC,CAAC,IAAE,oBAAI;AAAG;AAAC,SAASG,EAAE,EAAC,eAAcL,GAAE,UAASK,GAAE,cAAaC,GAAE,cAAaC,GAAE,kBAAiBC,EAAC,GAAE;AAAC,QAAMC,IAAEC,EAAE,EAAE,GAAEC,IAAEC,EAAEV,CAAC;AAAE,EAAMS,KAAN,QAASV,EAAE,CAAC;AAAE,QAAK,CAACY,GAAE,EAAC,UAASC,EAAC,CAAC,IAAEH,GAAEI,IAAEC,EAAG,MAAI;AAAC,UAAMb,IAAEI,KAAGO,EAAG,KAAE,QAAOZ,IAAEe,EAAEN,GAAER,CAAC;AAAE,QAAYA,MAAT,WAAaH,EAAE,QAAQ,QAAMG,IAAGH,EAAE,gBAAca,GAAEP;AAAE,eAAQH,KAAKG,GAAE;AAAC,YAAIJ,IAAE,MAAKe,IAAE;AAAK,YAAe,OAAOd,KAAnB,YAAqB;AAAC,gBAAMO,IAAEP;AAAE,UAAAA,IAAEO,EAAE,SAAQR,IAAEQ,EAAE,MAAKO,IAAEP,EAAE,aAAW;AAAA,QAAI;AAAC,cAAMA,IAAEV,EAAE,OAAO,IAAIG,EAAE,QAAS,CAAA;AAAE,QAAAH,EAAE,OAAO,IAAIG,EAAE,QAAO,GAAG,EAAC,WAAUO,IAAEA,EAAE,YAAU,QAAO,OAAMP,GAAE,SAAQD,GAAE,kBAAiBe,GAAE,YAAWb,EAAED,CAAC,EAAC,CAAC;AAAA,MAAC;AAAA,SAAK;AAAC,YAAMA,IAAEH,EAAE,SAAO,IAAI,IAAIa,EAAE,MAAM;AAAE,iBAAS,CAACX,GAAEe,CAAC,KAAId;AAAE,QAAAH,EAAE,OAAO,IAAIE,GAAE,EAAC,WAAUe,EAAE,WAAU,OAAMA,EAAE,OAAM,SAAQA,EAAE,SAAQ,kBAAiBA,EAAE,kBAAiB,YAAWb,EAAEa,EAAE,KAAK,EAAC,CAAC;AAAA,IAAC;AAAC,WAAOjB,EAAE,QAAQ,YAAUa,EAAE,QAAQ,WAAUb,EAAE,YAAUa,EAAE,WAAU,CAACb,GAAEE,CAAC;AAAA,EAAC,GAAG,CAAE,CAAA,GAAE,EAAC,gBAAe,GAAE,WAAUgB,EAAC,IAAEf,KAAIgB,IAAEX,KAAGC,EAAE,WAASS,EAAE,IAAIlB,EAAE,OAAM,CAAE;AAAE,SAAOoB,EAAG,MAAI;AAAC,IAAAD,MAAIV,EAAE,UAAQ;AAAA,EAAG,GAAG,CAACU,CAAC,CAAC,GAAEC,EAAG,MAAIP,EAAE,yBAA0B,CAAAV,MAAG;AAAC,IAAAH,EAAE,YAAYG,CAAC;AAAA,EAAC,CAAG,GAAE,CAACH,GAAEa,CAAC,CAAC,GAAEQ,EAAAA,IAAEnB,EAAE,UAAS,EAAC,OAAMa,GAAE,UAAS,CAAC,KAAGI,IAAEd,IAAE,KAAI,CAAC;AAAC;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"LexicalNestedComposer.prod-fd8d53c1.js","sources":["../node_modules/@lexical/react/LexicalNestedComposer.prod.mjs"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport{useCollaborationContext as e}from\"@lexical/react/LexicalCollaborationContext\";import{LexicalComposerContext as t,createLexicalComposerContext as r}from\"@lexical/react/LexicalComposerContext\";import{useRef as o,useContext as n,useMemo as l,useEffect as i}from\"react\";import{jsx as a}from\"react/jsx-runtime\";function s(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var c=s((function(e){const t=new URLSearchParams;t.append(\"code\",e);for(let e=1;e<arguments.length;e++)t.append(\"v\",arguments[e]);throw Error(`Minified Lexical error #${e}; visit https://lexical.dev/docs/error?${t} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}));function p(e){const t=e.transform();return null!==t?new Set([t]):new Set}function d({initialEditor:s,children:d,initialNodes:f,initialTheme:u,skipCollabChecks:m}){const h=o(!1),x=n(t);null==x&&c(9);const[_,{getTheme:g}]=x,v=l((()=>{const e=u||g()||void 0,t=r(x,e);if(void 0!==e&&(s._config.theme=e),s._parentEditor=_,f)for(let e of f){let t=null,r=null;if(\"function\"!=typeof e){const o=e;e=o.replace,t=o.with,r=o.withKlass||null}const o=s._nodes.get(e.getType());s._nodes.set(e.getType(),{exportDOM:o?o.exportDOM:void 0,klass:e,replace:t,replaceWithKlass:r,transforms:p(e)})}else{const e=s._nodes=new Map(_._nodes);for(const[t,r]of e)s._nodes.set(t,{exportDOM:r.exportDOM,klass:r.klass,replace:r.replace,replaceWithKlass:r.replaceWithKlass,transforms:p(r.klass)})}return s._config.namespace=_._config.namespace,s._editable=_._editable,[s,t]}),[]),{isCollabActive:w,yjsDocMap:b}=e(),M=m||h.current||b.has(s.getKey());return i((()=>{M&&(h.current=!0)}),[M]),i((()=>_.registerEditableListener((e=>{s.setEditable(e)}))),[s,_]),a(t.Provider,{value:v,children:!w||M?d:null})}export{d as LexicalNestedComposer};\n"],"names":["s","c","t","e","p","d","f","u","m","h","o","x","n","_","g","v","l","r","b","M","i","a"],"mappings":";;AAQyT,SAASA,EAAE,GAAE;AAAC,SAAO,KAAG,EAAE,cAAY,OAAO,UAAU,eAAe,KAAK,GAAE,SAAS,IAAE,EAAE,UAAQ;AAAC;AAAC,IAAIC,IAAED,EAAG,SAAS,GAAE;AAAC,QAAME,IAAE,IAAI;AAAgB,EAAAA,EAAE,OAAO,QAAO,CAAC;AAAE,WAAQC,IAAE,GAAEA,IAAE,UAAU,QAAOA;AAAI,IAAAD,EAAE,OAAO,KAAI,UAAUC,CAAC,CAAC;AAAE,QAAM,MAAM,2BAA2B,CAAC,0CAA0CD,CAAC,gHAAgH;AAAC,CAAC;AAAG,SAASE,EAAE,GAAE;AAAC,QAAMF,IAAE,EAAE,UAAW;AAAC,SAAcA,MAAP,OAAS,oBAAI,IAAI,CAACA,CAAC,CAAC,IAAE,oBAAI;AAAG;AAAC,SAASG,EAAE,EAAC,eAAcL,GAAE,UAASK,GAAE,cAAaC,GAAE,cAAaC,GAAE,kBAAiBC,EAAC,GAAE;AAAC,QAAMC,IAAEC,EAAE,EAAE,GAAEC,IAAEC,EAAEV,CAAC;AAAE,EAAMS,KAAN,QAASV,EAAE,CAAC;AAAE,QAAK,CAACY,GAAE,EAAC,UAASC,EAAC,CAAC,IAAEH,GAAEI,IAAEC,EAAG,MAAI;AAAC,UAAMb,IAAEI,KAAGO,EAAG,KAAE,QAAOZ,IAAEe,EAAEN,GAAER,CAAC;AAAE,QAAYA,MAAT,WAAaH,EAAE,QAAQ,QAAMG,IAAGH,EAAE,gBAAca,GAAEP;AAAE,eAAQH,KAAKG,GAAE;AAAC,YAAIJ,IAAE,MAAKe,IAAE;AAAK,YAAe,OAAOd,KAAnB,YAAqB;AAAC,gBAAMO,IAAEP;AAAE,UAAAA,IAAEO,EAAE,SAAQR,IAAEQ,EAAE,MAAKO,IAAEP,EAAE,aAAW;AAAA,QAAI;AAAC,cAAMA,IAAEV,EAAE,OAAO,IAAIG,EAAE,QAAS,CAAA;AAAE,QAAAH,EAAE,OAAO,IAAIG,EAAE,QAAO,GAAG,EAAC,WAAUO,IAAEA,EAAE,YAAU,QAAO,OAAMP,GAAE,SAAQD,GAAE,kBAAiBe,GAAE,YAAWb,EAAED,CAAC,EAAC,CAAC;AAAA,MAAC;AAAA,SAAK;AAAC,YAAMA,IAAEH,EAAE,SAAO,IAAI,IAAIa,EAAE,MAAM;AAAE,iBAAS,CAACX,GAAEe,CAAC,KAAId;AAAE,QAAAH,EAAE,OAAO,IAAIE,GAAE,EAAC,WAAUe,EAAE,WAAU,OAAMA,EAAE,OAAM,SAAQA,EAAE,SAAQ,kBAAiBA,EAAE,kBAAiB,YAAWb,EAAEa,EAAE,KAAK,EAAC,CAAC;AAAA,IAAC;AAAC,WAAOjB,EAAE,QAAQ,YAAUa,EAAE,QAAQ,WAAUb,EAAE,YAAUa,EAAE,WAAU,CAACb,GAAEE,CAAC;AAAA,EAAC,GAAG,CAAE,CAAA,GAAE,EAAC,gBAAe,GAAE,WAAUgB,EAAC,IAAEf,KAAIgB,IAAEX,KAAGC,EAAE,WAASS,EAAE,IAAIlB,EAAE,OAAM,CAAE;AAAE,SAAOoB,EAAG,MAAI;AAAC,IAAAD,MAAIV,EAAE,UAAQ;AAAA,EAAG,GAAG,CAACU,CAAC,CAAC,GAAEC,EAAG,MAAIP,EAAE,yBAA0B,CAAAV,MAAG;AAAC,IAAAH,EAAE,YAAYG,CAAC;AAAA,EAAC,CAAG,GAAE,CAACH,GAAEa,CAAC,CAAC,GAAEQ,EAAAA,IAAEnB,EAAE,UAAS,EAAC,OAAMa,GAAE,UAAS,CAAC,KAAGI,IAAEd,IAAE,KAAI,CAAC;AAAC;","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import { a as O, u as S, d as C, w as P, x as g, K as j, e as I, k as D, C as f, h as E, r as $, j as t, E as V, J as R, M as k, N as w } from "./index-19249db0.js";
1
+ import { a as O, u as S, d as C, w as P, x as g, K as j, e as I, k as D, C as f, h as E, r as $, j as t, E as V, J as R, M as k, N as w } from "./index-c6d40f36.js";
2
2
  import { useMemo as y, useState as A, useRef as b, useCallback as M, useEffect as T } from "react";
3
3
  import "react-dom";
4
4
  function W(s) {
@@ -166,4 +166,4 @@ function U({
166
166
  export {
167
167
  U as default
168
168
  };
169
- //# sourceMappingURL=PollComponent-f176afc6.js.map
169
+ //# sourceMappingURL=PollComponent-cb35023a.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PollComponent-f176afc6.js","sources":["../src/lexical/nodes/PollComponent.tsx"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {Option, Options, PollNode} from './PollNode';\r\n\r\nimport './PollNode.css';\r\n\r\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n NodeKey,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport joinClasses from '../utils/joinClasses';\r\nimport {$isPollNode, createPollOption} from './PollNode';\r\n\r\nfunction getTotalVotes(options: Options): number {\r\n return options.reduce((totalVotes, next) => {\r\n return totalVotes + next.votes.length;\r\n }, 0);\r\n}\r\n\r\nfunction PollOptionComponent({\r\n option,\r\n index,\r\n options,\r\n totalVotes,\r\n withPollNode,\r\n}: {\r\n index: number;\r\n option: Option;\r\n options: Options;\r\n totalVotes: number;\r\n withPollNode: (\r\n cb: (pollNode: PollNode) => void,\r\n onSelect?: () => void,\r\n ) => void;\r\n}): JSX.Element {\r\n const {clientID} = useCollaborationContext();\r\n const checkboxRef = useRef(null);\r\n const votesArray = option.votes;\r\n const checkedIndex = votesArray.indexOf(clientID);\r\n const checked = checkedIndex !== -1;\r\n const votes = votesArray.length;\r\n const text = option.text;\r\n\r\n return (\r\n <div className=\"PollNode__optionContainer\">\r\n <div\r\n className={joinClasses(\r\n 'PollNode__optionCheckboxWrapper',\r\n checked && 'PollNode__optionCheckboxChecked',\r\n )}>\r\n <input\r\n ref={checkboxRef}\r\n className=\"PollNode__optionCheckbox\"\r\n type=\"checkbox\"\r\n onChange={(e) => {\r\n withPollNode((node) => {\r\n node.toggleVote(option, clientID);\r\n });\r\n }}\r\n checked={checked}\r\n />\r\n </div>\r\n <div className=\"PollNode__optionInputWrapper\">\r\n <div\r\n className=\"PollNode__optionInputVotes\"\r\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\r\n />\r\n <span className=\"PollNode__optionInputVotesCount\">\r\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\r\n </span>\r\n <input\r\n className=\"PollNode__optionInput\"\r\n type=\"text\"\r\n value={text}\r\n onChange={(e) => {\r\n const target = e.target;\r\n const value = target.value;\r\n const selectionStart = target.selectionStart;\r\n const selectionEnd = target.selectionEnd;\r\n withPollNode(\r\n (node) => {\r\n node.setOptionText(option, value);\r\n },\r\n () => {\r\n target.selectionStart = selectionStart;\r\n target.selectionEnd = selectionEnd;\r\n },\r\n );\r\n }}\r\n placeholder={`Option ${index + 1}`}\r\n />\r\n </div>\r\n <button\r\n disabled={options.length < 3}\r\n className={joinClasses(\r\n 'PollNode__optionDelete',\r\n options.length < 3 && 'PollNode__optionDeleteDisabled',\r\n )}\r\n aria-label=\"Remove\"\r\n onClick={() => {\r\n withPollNode((node) => {\r\n node.deleteOption(option);\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default function PollComponent({\r\n question,\r\n options,\r\n nodeKey,\r\n}: {\r\n nodeKey: NodeKey;\r\n options: Options;\r\n question: string;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const ref = useRef(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n\r\n if (event.target === ref.current) {\r\n if (!event.shiftKey) {\r\n clearSelection();\r\n }\r\n setSelected(!isSelected);\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, onDelete, setSelected]);\r\n\r\n const withPollNode = (\r\n cb: (node: PollNode) => void,\r\n onUpdate?: () => void,\r\n ): void => {\r\n editor.update(\r\n () => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n cb(node);\r\n }\r\n },\r\n {onUpdate},\r\n );\r\n };\r\n\r\n const addOption = () => {\r\n withPollNode((node) => {\r\n node.addOption(createPollOption());\r\n });\r\n };\r\n\r\n const isFocused = $isNodeSelection(selection) && isSelected;\r\n\r\n return (\r\n <div\r\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\r\n ref={ref}>\r\n <div className=\"PollNode__inner\">\r\n <h2 className=\"PollNode__heading\">{question}</h2>\r\n {options.map((option, index) => {\r\n const key = option.uid;\r\n return (\r\n <PollOptionComponent\r\n key={key}\r\n withPollNode={withPollNode}\r\n option={option}\r\n index={index}\r\n options={options}\r\n totalVotes={totalVotes}\r\n />\r\n );\r\n })}\r\n <div className=\"PollNode__footer\">\r\n <Button onClick={addOption} small={true}>\r\n Add Option\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["getTotalVotes","options","totalVotes","next","PollOptionComponent","option","index","withPollNode","clientID","useCollaborationContext","checkboxRef","useRef","votesArray","checked","votes","text","jsxs","jsx","joinClasses","e","node","target","value","selectionStart","selectionEnd","PollComponent","question","nodeKey","editor","useLexicalComposerContext","useMemo","isSelected","setSelected","clearSelection","useLexicalNodeSelection","selection","setSelection","useState","ref","onDelete","useCallback","payload","$isNodeSelection","$getSelection","$getNodeByKey","$isPollNode","useEffect","mergeRegister","editorState","CLICK_COMMAND","event","COMMAND_PRIORITY_LOW","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","cb","onUpdate","addOption","createPollOption","isFocused","key","Button"],"mappings":"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"}
1
+ {"version":3,"file":"PollComponent-cb35023a.js","sources":["../src/lexical/nodes/PollComponent.tsx"],"sourcesContent":["/**\r\n * Copyright (c) Meta Platforms, Inc. and affiliates.\r\n *\r\n * This source code is licensed under the MIT license found in the\r\n * LICENSE file in the root directory of this source tree.\r\n *\r\n */\r\n\r\nimport type {Option, Options, PollNode} from './PollNode';\r\n\r\nimport './PollNode.css';\r\n\r\nimport {useCollaborationContext} from '@lexical/react/LexicalCollaborationContext';\r\nimport {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';\r\nimport {useLexicalNodeSelection} from '@lexical/react/useLexicalNodeSelection';\r\nimport {mergeRegister} from '@lexical/utils';\r\nimport {\r\n $getNodeByKey,\r\n $getSelection,\r\n $isNodeSelection,\r\n BaseSelection,\r\n CLICK_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n KEY_BACKSPACE_COMMAND,\r\n KEY_DELETE_COMMAND,\r\n NodeKey,\r\n} from 'lexical';\r\nimport * as React from 'react';\r\nimport {useCallback, useEffect, useMemo, useRef, useState} from 'react';\r\n\r\nimport Button from '../ui/Button';\r\nimport joinClasses from '../utils/joinClasses';\r\nimport {$isPollNode, createPollOption} from './PollNode';\r\n\r\nfunction getTotalVotes(options: Options): number {\r\n return options.reduce((totalVotes, next) => {\r\n return totalVotes + next.votes.length;\r\n }, 0);\r\n}\r\n\r\nfunction PollOptionComponent({\r\n option,\r\n index,\r\n options,\r\n totalVotes,\r\n withPollNode,\r\n}: {\r\n index: number;\r\n option: Option;\r\n options: Options;\r\n totalVotes: number;\r\n withPollNode: (\r\n cb: (pollNode: PollNode) => void,\r\n onSelect?: () => void,\r\n ) => void;\r\n}): JSX.Element {\r\n const {clientID} = useCollaborationContext();\r\n const checkboxRef = useRef(null);\r\n const votesArray = option.votes;\r\n const checkedIndex = votesArray.indexOf(clientID);\r\n const checked = checkedIndex !== -1;\r\n const votes = votesArray.length;\r\n const text = option.text;\r\n\r\n return (\r\n <div className=\"PollNode__optionContainer\">\r\n <div\r\n className={joinClasses(\r\n 'PollNode__optionCheckboxWrapper',\r\n checked && 'PollNode__optionCheckboxChecked',\r\n )}>\r\n <input\r\n ref={checkboxRef}\r\n className=\"PollNode__optionCheckbox\"\r\n type=\"checkbox\"\r\n onChange={(e) => {\r\n withPollNode((node) => {\r\n node.toggleVote(option, clientID);\r\n });\r\n }}\r\n checked={checked}\r\n />\r\n </div>\r\n <div className=\"PollNode__optionInputWrapper\">\r\n <div\r\n className=\"PollNode__optionInputVotes\"\r\n style={{width: `${votes === 0 ? 0 : (votes / totalVotes) * 100}%`}}\r\n />\r\n <span className=\"PollNode__optionInputVotesCount\">\r\n {votes > 0 && (votes === 1 ? '1 vote' : `${votes} votes`)}\r\n </span>\r\n <input\r\n className=\"PollNode__optionInput\"\r\n type=\"text\"\r\n value={text}\r\n onChange={(e) => {\r\n const target = e.target;\r\n const value = target.value;\r\n const selectionStart = target.selectionStart;\r\n const selectionEnd = target.selectionEnd;\r\n withPollNode(\r\n (node) => {\r\n node.setOptionText(option, value);\r\n },\r\n () => {\r\n target.selectionStart = selectionStart;\r\n target.selectionEnd = selectionEnd;\r\n },\r\n );\r\n }}\r\n placeholder={`Option ${index + 1}`}\r\n />\r\n </div>\r\n <button\r\n disabled={options.length < 3}\r\n className={joinClasses(\r\n 'PollNode__optionDelete',\r\n options.length < 3 && 'PollNode__optionDeleteDisabled',\r\n )}\r\n aria-label=\"Remove\"\r\n onClick={() => {\r\n withPollNode((node) => {\r\n node.deleteOption(option);\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default function PollComponent({\r\n question,\r\n options,\r\n nodeKey,\r\n}: {\r\n nodeKey: NodeKey;\r\n options: Options;\r\n question: string;\r\n}): JSX.Element {\r\n const [editor] = useLexicalComposerContext();\r\n const totalVotes = useMemo(() => getTotalVotes(options), [options]);\r\n const [isSelected, setSelected, clearSelection] =\r\n useLexicalNodeSelection(nodeKey);\r\n const [selection, setSelection] = useState<BaseSelection | null>(null);\r\n const ref = useRef(null);\r\n\r\n const onDelete = useCallback(\r\n (payload: KeyboardEvent) => {\r\n if (isSelected && $isNodeSelection($getSelection())) {\r\n const event: KeyboardEvent = payload;\r\n event.preventDefault();\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n node.remove();\r\n return true;\r\n }\r\n }\r\n return false;\r\n },\r\n [isSelected, nodeKey],\r\n );\r\n\r\n useEffect(() => {\r\n return mergeRegister(\r\n editor.registerUpdateListener(({editorState}) => {\r\n setSelection(editorState.read(() => $getSelection()));\r\n }),\r\n editor.registerCommand<MouseEvent>(\r\n CLICK_COMMAND,\r\n (payload) => {\r\n const event = payload;\r\n\r\n if (event.target === ref.current) {\r\n if (!event.shiftKey) {\r\n clearSelection();\r\n }\r\n setSelected(!isSelected);\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_DELETE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n editor.registerCommand(\r\n KEY_BACKSPACE_COMMAND,\r\n onDelete,\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n }, [clearSelection, editor, isSelected, nodeKey, onDelete, setSelected]);\r\n\r\n const withPollNode = (\r\n cb: (node: PollNode) => void,\r\n onUpdate?: () => void,\r\n ): void => {\r\n editor.update(\r\n () => {\r\n const node = $getNodeByKey(nodeKey);\r\n if ($isPollNode(node)) {\r\n cb(node);\r\n }\r\n },\r\n {onUpdate},\r\n );\r\n };\r\n\r\n const addOption = () => {\r\n withPollNode((node) => {\r\n node.addOption(createPollOption());\r\n });\r\n };\r\n\r\n const isFocused = $isNodeSelection(selection) && isSelected;\r\n\r\n return (\r\n <div\r\n className={`PollNode__container ${isFocused ? 'focused' : ''}`}\r\n ref={ref}>\r\n <div className=\"PollNode__inner\">\r\n <h2 className=\"PollNode__heading\">{question}</h2>\r\n {options.map((option, index) => {\r\n const key = option.uid;\r\n return (\r\n <PollOptionComponent\r\n key={key}\r\n withPollNode={withPollNode}\r\n option={option}\r\n index={index}\r\n options={options}\r\n totalVotes={totalVotes}\r\n />\r\n );\r\n })}\r\n <div className=\"PollNode__footer\">\r\n <Button onClick={addOption} small={true}>\r\n Add Option\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["getTotalVotes","options","totalVotes","next","PollOptionComponent","option","index","withPollNode","clientID","useCollaborationContext","checkboxRef","useRef","votesArray","checked","votes","text","jsxs","jsx","joinClasses","e","node","target","value","selectionStart","selectionEnd","PollComponent","question","nodeKey","editor","useLexicalComposerContext","useMemo","isSelected","setSelected","clearSelection","useLexicalNodeSelection","selection","setSelection","useState","ref","onDelete","useCallback","payload","$isNodeSelection","$getSelection","$getNodeByKey","$isPollNode","useEffect","mergeRegister","editorState","CLICK_COMMAND","event","COMMAND_PRIORITY_LOW","KEY_DELETE_COMMAND","KEY_BACKSPACE_COMMAND","cb","onUpdate","addOption","createPollOption","isFocused","key","Button"],"mappings":"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"}