@yoopta/ui 6.0.1 → 6.0.2

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"floating-block-actions.js","sources":["../src/floating-block-actions/context.tsx","../src/floating-block-actions/floating-block-actions.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { YooptaBlockData } from '@yoopta/editor';\n\nexport type FloatingBlockActionsContextValue = {\n /** Currently hovered block ID */\n blockId: string | null;\n /** Block data for the hovered block */\n blockData: YooptaBlockData | null;\n /** Whether actions are visible */\n isVisible: boolean;\n /** Hide the floating actions manually */\n hide: () => void;\n};\n\nexport const FloatingBlockActionsContext = createContext<FloatingBlockActionsContextValue | null>(null);\n\nexport const useFloatingBlockActionsContext = () => {\n const context = useContext(FloatingBlockActionsContext);\n\n if (!context) {\n throw new Error('FloatingBlockActions components must be used within <FloatingBlockActions>');\n }\n\n return context;\n};\n","import {\n type CSSProperties,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { type YooptaBlockData, useYooptaEditor } from '@yoopta/editor';\n\nimport { FloatingBlockActionsContext } from './context';\nimport { throttle } from '../utils/throttle';\nimport './floating-block-actions.css';\n\ntype FloatingBlockActionsApi = {\n /** Currently hovered block ID */\n blockId: string | null;\n /** Block data for the hovered block */\n blockData: YooptaBlockData | null;\n /** Whether actions are visible */\n isVisible: boolean;\n /** Hide the floating actions manually */\n hide: () => void;\n};\n\ntype FloatingBlockActionsRootProps = {\n children: ReactNode | ((api: FloatingBlockActionsApi) => ReactNode);\n /** When true, hover tracking is paused (e.g., when BlockOptions is open) */\n frozen?: boolean;\n className?: string;\n style?: CSSProperties;\n};\n\ntype FloatingBlockActionsButtonProps = {\n children: ReactNode;\n onClick?: (event: React.MouseEvent) => void;\n className?: string;\n disabled?: boolean;\n title?: string;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>;\n\nconst HIDDEN_STYLES: CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n opacity: 0,\n pointerEvents: 'none',\n transform: 'scale(0.95)',\n transition: 'transform 150ms ease-out',\n};\n\nconst getVisibleStyles = (top: number, left: number, width: number): CSSProperties => ({\n position: 'fixed',\n top,\n left,\n opacity: 1,\n pointerEvents: 'auto',\n transform: `scale(1) translateX(-${width + 2}px)`,\n transition: 'transform 150ms ease-out',\n});\n\nconst FloatingBlockActionsRoot = ({ children, style, frozen = false, className = '' }: FloatingBlockActionsRootProps) => {\n const editor = useYooptaEditor();\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Internal state\n const [blockId, setBlockId] = useState<string | null>(null);\n const [styles, setStyles] = useState<CSSProperties>({ ...style, ...HIDDEN_STYLES });\n\n // Derived state\n const blockData = blockId ? editor.children[blockId] ?? null : null;\n const isVisible = blockId !== null && styles.opacity === 1;\n\n // Hide actions\n const hide = useCallback(() => {\n setBlockId(null);\n setStyles({ ...style, ...HIDDEN_STYLES });\n }, [style]);\n\n // Update position based on block element\n const updatePosition = useCallback((blockElement: HTMLElement) => {\n const rect = blockElement.getBoundingClientRect();\n const containerWidth = containerRef.current?.offsetWidth ?? 46;\n\n // Account for margin collapse: if the rendered element has margin-top,\n // it collapses through the parent wrapper, making rect.top appear\n // higher than where the content visually starts\n let marginOffset = 0;\n const renderedElement = blockElement.querySelector('[data-element-type]') as HTMLElement | null;\n if (renderedElement) {\n const elementStyle = window.getComputedStyle(renderedElement);\n marginOffset = parseFloat(elementStyle.marginTop) || 0;\n }\n\n setStyles({ ...style, ...getVisibleStyles(rect.top + marginOffset, rect.left, containerWidth) });\n }, [style]);\n\n // Find closest block to cursor\n const findClosestBlock = useCallback(\n (mouseY: number): { element: HTMLElement; data: YooptaBlockData } | null => {\n if (!editor.refElement) return null;\n\n const blocks = editor.refElement.querySelectorAll<HTMLElement>('[data-yoopta-block]');\n const viewportHeight = window.innerHeight;\n const VIEWPORT_MARGIN = 200;\n const MAX_DISTANCE = 100;\n\n let closestBlock: HTMLElement | null = null;\n let minDistance = Infinity;\n\n for (const blockElement of blocks) {\n const rect = blockElement.getBoundingClientRect();\n\n // Skip blocks outside viewport\n if (rect.bottom < -VIEWPORT_MARGIN || rect.top > viewportHeight + VIEWPORT_MARGIN) {\n continue;\n }\n\n // Cursor is within block bounds\n if (mouseY >= rect.top && mouseY <= rect.bottom) {\n closestBlock = blockElement;\n minDistance = 0;\n break;\n }\n\n // Calculate distance\n const distance = mouseY < rect.top ? rect.top - mouseY : mouseY - rect.bottom;\n if (distance < minDistance) {\n minDistance = distance;\n closestBlock = blockElement;\n }\n }\n\n if (closestBlock && minDistance <= MAX_DISTANCE) {\n const foundBlockId = closestBlock.getAttribute('data-yoopta-block-id');\n const foundBlockData = foundBlockId ? editor.children[foundBlockId] : null;\n\n if (foundBlockId && foundBlockData) {\n return { element: closestBlock, data: foundBlockData };\n }\n }\n\n return null;\n },\n [editor],\n );\n\n // Mouse move handler\n const handleMouseMove = useCallback(\n (event: MouseEvent) => {\n // If frozen, ignore mouse movement\n if (frozen) return;\n\n const target = event.target as HTMLElement;\n const isInsideEditor = editor.refElement?.contains(target);\n const isInsideActions = containerRef.current?.contains(target);\n\n // Check if mouse is within extended bounds of floating actions (hover bridge)\n // This creates a \"ghost\" area that doesn't block interactions but keeps actions visible\n const isInExtendedBounds = (() => {\n if (!containerRef.current) return false;\n const rect = containerRef.current.getBoundingClientRect();\n const padding = { top: 8, right: 24, bottom: 8, left: 8 };\n return (\n event.clientX >= rect.left - padding.left &&\n event.clientX <= rect.right + padding.right &&\n event.clientY >= rect.top - padding.top &&\n event.clientY <= rect.bottom + padding.bottom\n );\n })();\n\n // Inside floating actions or extended hover area - keep current state\n if (isInsideActions || isInExtendedBounds) return;\n\n // Outside editor - hide\n if (!isInsideEditor) {\n hide();\n return;\n }\n\n // Read-only mode - ignore\n if (editor.readOnly) return;\n\n const closestBlock = findClosestBlock(event.clientY);\n\n if (closestBlock) {\n const { element, data } = closestBlock;\n // Only update if different block\n if (data.id !== blockId) {\n setBlockId(data.id);\n updatePosition(element);\n }\n } else if (blockId !== null) {\n hide();\n }\n },\n [frozen, editor, blockId, findClosestBlock, updatePosition, hide],\n );\n\n // Throttled mouse move\n const throttledMouseMove = useMemo(\n () => throttle(handleMouseMove, 100, { leading: true, trailing: true }),\n [handleMouseMove],\n );\n\n // Set up event listeners\n useEffect(() => {\n const handleScroll = () => {\n if (frozen) return;\n hide();\n };\n\n document.addEventListener('mousemove', throttledMouseMove);\n document.addEventListener('scroll', handleScroll, true);\n\n return () => {\n document.removeEventListener('mousemove', throttledMouseMove);\n document.removeEventListener('scroll', handleScroll, true);\n };\n }, [throttledMouseMove, hide, frozen]);\n\n // Context value\n const contextValue = useMemo<FloatingBlockActionsApi>(\n () => ({\n blockId,\n blockData,\n isVisible,\n hide,\n }),\n [blockId, blockData, isVisible, hide],\n );\n\n // Render props or regular children\n const content = typeof children === 'function' ? children(contextValue) : children;\n\n return (\n <FloatingBlockActionsContext.Provider value={contextValue}>\n <div\n ref={containerRef}\n className={`yoopta-ui-floating-block-actions ${className}`}\n style={styles}\n contentEditable={false}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {content}\n </div>\n </FloatingBlockActionsContext.Provider>\n );\n};\n\nFloatingBlockActionsRoot.displayName = 'FloatingBlockActions';\n\nconst FloatingBlockActionsButton = forwardRef<HTMLButtonElement, FloatingBlockActionsButtonProps>(\n ({ children, onClick, className = '', disabled, title, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={`yoopta-ui-floating-action-button ${className}`}\n onClick={onClick}\n disabled={disabled}\n title={title}\n aria-label={title}\n {...props}\n >\n {children}\n </button>\n ),\n);\n\nFloatingBlockActionsButton.displayName = 'FloatingBlockActions.Button';\n\nexport const FloatingBlockActions = Object.assign(FloatingBlockActionsRoot, {\n Root: FloatingBlockActionsRoot,\n Button: FloatingBlockActionsButton,\n});\n\nexport type { FloatingBlockActionsRootProps, FloatingBlockActionsButtonProps, FloatingBlockActionsApi };"],"names":["_jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"floating-toolbar.js","sources":["../src/floating-toolbar/context.tsx","../src/floating-toolbar/floating-toolbar.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { CSSProperties } from 'react';\n\nexport type FloatingToolbarContextValue = {\n /** Whether toolbar is open/visible */\n isOpen: boolean;\n /** Floating UI styles for positioning */\n floatingStyles: CSSProperties;\n /** Ref setter for the floating element */\n setFloatingRef: (node: HTMLElement | null) => void;\n};\n\nexport const FloatingToolbarContext = createContext<FloatingToolbarContextValue | null>(null);\n\nexport const useFloatingToolbarContext = () => {\n const context = useContext(FloatingToolbarContext);\n\n if (!context) {\n throw new Error('FloatingToolbar components must be used within <FloatingToolbar>');\n }\n\n return context;\n};\n","import {\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n FloatingPortal,\n autoUpdate,\n flip,\n inline,\n offset,\n shift,\n useFloating,\n useTransitionStyles,\n} from '@floating-ui/react';\nimport { useYooptaEditor } from '@yoopta/editor';\n\nimport { FloatingToolbarContext, useFloatingToolbarContext } from './context';\nimport { throttle } from '../utils/throttle';\nimport './floating-toolbar.css';\n\ntype FloatingToolbarApi = {\n isOpen: boolean;\n};\n\ntype FloatingToolbarRootProps = {\n children: ReactNode | ((api: FloatingToolbarApi) => ReactNode);\n /** When true, selection tracking is paused (e.g., when a popover is open) */\n frozen?: boolean;\n className?: string;\n};\n\nconst FloatingToolbarRoot = ({ children, frozen = false, className = '' }: FloatingToolbarRootProps) => {\n const editor = useYooptaEditor();\n const [isOpen, setIsOpen] = useState(false);\n\n // Local ref to track floating element for checking if active element is inside\n const floatingElRef = useRef<HTMLElement | null>(null);\n\n // Floating UI setup with autoUpdate for proper positioning\n const { refs, floatingStyles, context } = useFloating({\n placement: 'top-start',\n open: isOpen,\n middleware: [inline(), flip(), shift(), offset(10)],\n whileElementsMounted: autoUpdate,\n });\n\n const { isMounted, styles: transitionStyles } = useTransitionStyles(context, {\n duration: 100,\n });\n\n // Combined styles\n const combinedStyles: CSSProperties = useMemo(\n () => ({ ...floatingStyles, ...transitionStyles }),\n [floatingStyles, transitionStyles],\n );\n\n // Keep setReference in a ref for stable callback\n const setReferenceFnRef = useRef(refs.setReference);\n setReferenceFnRef.current = refs.setReference;\n\n // Close toolbar\n const close = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n // Open toolbar\n const open = useCallback(() => {\n setIsOpen(true);\n }, []);\n\n // Text selection change handler\n const selectionChange = useCallback(() => {\n if (frozen) return;\n\n // Check if active element is inside the toolbar\n const toolbarEl = floatingElRef.current;\n if (toolbarEl?.contains(document.activeElement)) {\n return;\n }\n\n const domSelection = window.getSelection();\n\n if (\n !domSelection ||\n domSelection?.isCollapsed ||\n domSelection?.anchorOffset === domSelection?.focusOffset\n ) {\n if (isOpen) {\n close();\n }\n return;\n }\n\n const domRange = domSelection.getRangeAt(0);\n const selectionRect = domRange.getBoundingClientRect();\n const text = domRange.toString().trim();\n\n const ancestor = domRange?.commonAncestorContainer;\n\n // Check if inside custom editor\n const isInsideCustomEditor = !!(ancestor as Element)?.closest?.('[data-custom-editor]');\n\n if (!editor.refElement?.contains(ancestor) || isInsideCustomEditor) {\n if (isOpen) {\n close();\n }\n return;\n }\n\n if (domRange && text.length > 0) {\n const reference = {\n getBoundingClientRect: () => selectionRect,\n getClientRects: () => domRange.getClientRects(),\n };\n\n setReferenceFnRef.current(reference);\n\n if (!isOpen) {\n open();\n }\n }\n }, [frozen, editor.refElement, close, open, isOpen]);\n\n // Block selection change handler\n const onBlockSelectionChange = useCallback(() => {\n if (\n !Array.isArray(editor.path.selected) ||\n editor.path.selected.length === 0 ||\n (editor.path.source !== 'mousemove' && editor.path.source !== 'keyboard')\n ) {\n if (isOpen) {\n close();\n }\n return;\n }\n\n const firstSelectedBlockPath = Math.min(...editor.path.selected);\n const lastSelectedBlockPath = Math.max(...editor.path.selected);\n\n let isBottomDirection = true;\n\n if (typeof editor.path.current === 'number') {\n isBottomDirection =\n Math.abs(editor.path.current - lastSelectedBlockPath) <=\n Math.abs(editor.path.current - firstSelectedBlockPath);\n }\n\n const selectedBlock = editor.getBlock({\n at: isBottomDirection ? lastSelectedBlockPath : firstSelectedBlockPath,\n });\n\n if (!selectedBlock) return;\n\n const blockEl = editor.refElement?.querySelector(`[data-yoopta-block-id=\"${selectedBlock.id}\"]`);\n\n if (!blockEl) return;\n\n setReferenceFnRef.current(blockEl);\n\n if (!isOpen) {\n open();\n }\n }, [editor, close, open, isOpen]);\n\n // Throttled selection change\n const throttledSelectionChange = useMemo(\n () =>\n throttle(selectionChange, 200, {\n leading: true,\n trailing: true,\n }),\n [selectionChange],\n );\n\n // Selection tracking effect\n useEffect(() => {\n if (!Array.isArray(editor.path.selected) && !editor.path.selection) {\n if (isOpen) {\n close();\n }\n return;\n }\n\n if (Array.isArray(editor.path.selected) && !editor.path.selection) {\n onBlockSelectionChange();\n return;\n }\n\n window.document.addEventListener('selectionchange', throttledSelectionChange);\n return () => window.document.removeEventListener('selectionchange', throttledSelectionChange);\n }, [editor.path.selected, editor.path.selection, isOpen, throttledSelectionChange, close, onBlockSelectionChange]);\n\n // Ref callback that updates both local ref and floating ref\n const handleFloatingRef = useCallback(\n (node: HTMLElement | null) => {\n floatingElRef.current = node;\n refs.setFloating(node);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [refs.setFloating, refs.setReference],\n );\n\n // Context value - use isMounted for visibility\n const contextValue = useMemo(\n () => ({\n isOpen: isMounted,\n floatingStyles: combinedStyles,\n setFloatingRef: handleFloatingRef,\n }),\n [isMounted, combinedStyles, handleFloatingRef],\n );\n\n // Render props or regular children\n const content = typeof children === 'function' ? children({ isOpen: isMounted }) : children;\n\n return (\n <FloatingToolbarContext.Provider value={contextValue}>\n <div contentEditable={false} className={className}>{content}</div>\n </FloatingToolbarContext.Provider>\n );\n};\n\nFloatingToolbarRoot.displayName = 'FloatingToolbar';\n\ntype FloatingToolbarContentProps = {\n children: ReactNode;\n className?: string;\n} & HTMLAttributes<HTMLDivElement>;\n\nconst FloatingToolbarContent = ({ children, className = '', ...props }: FloatingToolbarContentProps) => {\n const editor = useYooptaEditor();\n const { isOpen, floatingStyles, setFloatingRef } = useFloatingToolbarContext();\n\n if (!isOpen) return null;\n\n return (\n <FloatingPortal root={editor.refElement} id={`yoopta-ui-floating-toolbar-portal-${editor.id}`}>\n <div\n ref={setFloatingRef}\n className={`yoopta-ui-floating-toolbar ${className}`}\n style={floatingStyles}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => {\n // preventDefault stops Safari from collapsing text selection\n e.preventDefault();\n e.stopPropagation();\n }}\n {...props}\n >\n {children}\n </div>\n </FloatingPortal>\n );\n};\n\nFloatingToolbarContent.displayName = 'FloatingToolbar.Content';\n\ntype FloatingToolbarGroupProps = HTMLAttributes<HTMLDivElement>;\n\nconst FloatingToolbarGroup = forwardRef<HTMLDivElement, FloatingToolbarGroupProps>(\n ({ className = '', children, ...props }, ref) => (\n <div ref={ref} className={`yoopta-ui-floating-toolbar-group ${className}`} {...props}>\n {children}\n </div>\n ),\n);\n\nFloatingToolbarGroup.displayName = 'FloatingToolbar.Group';\n\ntype FloatingToolbarSeparatorProps = HTMLAttributes<HTMLDivElement>;\n\nconst FloatingToolbarSeparator = forwardRef<HTMLDivElement, FloatingToolbarSeparatorProps>(\n ({ className = '', ...props }, ref) => (\n <div ref={ref} className={`yoopta-ui-floating-toolbar-separator ${className}`} {...props} />\n ),\n);\n\nFloatingToolbarSeparator.displayName = 'FloatingToolbar.Separator';\n\ntype FloatingToolbarButtonProps = {\n active?: boolean;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n} & HTMLAttributes<HTMLButtonElement>;\n\nconst FloatingToolbarButton = forwardRef<HTMLButtonElement, FloatingToolbarButtonProps>(\n ({ className = '', children, active, disabled, type = 'button', ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n data-active={active}\n className={`yoopta-ui-floating-toolbar-button ${className}`}\n onMouseDown={(e) => {\n // preventDefault stops Safari from collapsing text selection on button click\n e.preventDefault();\n e.stopPropagation();\n props.onMouseDown?.(e);\n }}\n onClick={(e) => {\n e.stopPropagation();\n props.onClick?.(e);\n }}\n {...props}\n >\n {children}\n </button>\n ),\n);\n\nFloatingToolbarButton.displayName = 'FloatingToolbar.Button';\n\nexport const FloatingToolbar = Object.assign(FloatingToolbarRoot, {\n Root: FloatingToolbarRoot,\n Content: FloatingToolbarContent,\n Group: FloatingToolbarGroup,\n Separator: FloatingToolbarSeparator,\n Button: FloatingToolbarButton,\n});\n\nexport type {\n FloatingToolbarRootProps,\n FloatingToolbarContentProps,\n FloatingToolbarGroupProps,\n FloatingToolbarSeparatorProps,\n FloatingToolbarButtonProps,\n FloatingToolbarApi,\n};\n"],"names":["_jsx"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"highlight-color-picker.js","sources":["../src/highlight-color-picker/highlight-color-picker.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport { cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react';\nimport { HexColorInput, HexColorPicker } from 'react-colorful';\n\nimport { debounce } from '../utils/debounce';\nimport './highlight-color-picker.css';\n\nexport type HighlightColorPickerProps = {\n /** Current color values (hex format) */\n value?: {\n color?: string;\n backgroundColor?: string;\n };\n /** Callback when color changes */\n onChange?: (values: { color?: string; backgroundColor?: string }) => void;\n /** Preset colors to display */\n presets?: string[];\n /** Show hex input field */\n showInput?: boolean;\n /** Custom className */\n className?: string;\n /** Trigger element */\n children: ReactElement;\n /** Placement of the popover */\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Offset from trigger */\n offset?: number;\n};\n\nconst DEFAULT_PRESETS = [\n '#FFFF00',\n '#FFE066',\n '#FFCC99',\n '#FF9999',\n '#99CCFF',\n '#99FF99',\n '#FF99FF',\n '#CC99FF',\n];\n\nexport const HighlightColorPicker = forwardRef<HTMLDivElement, HighlightColorPickerProps>(\n (\n {\n value = { backgroundColor: '#FFFF00' },\n onChange,\n presets = DEFAULT_PRESETS,\n showInput = true,\n className,\n children,\n placement = 'bottom',\n offset: offsetValue = 8,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [mode, setMode] = useState<'color' | 'backgroundColor'>('backgroundColor');\n const [color, setColor] = useState(value.backgroundColor);\n const [textColor, setTextColor] = useState(value.color);\n\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n onOpenChange: setIsOpen,\n placement,\n middleware: [offset(offsetValue), flip(), shift()],\n whileElementsMounted: autoUpdate,\n });\n\n // Keep track of value ref for debounced callback\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const modeRef = useRef(mode);\n modeRef.current = mode;\n\n useEffect(() => {\n if (value.backgroundColor) {\n setColor(value.backgroundColor);\n }\n if (value.color) {\n setTextColor(value.color);\n }\n }, [value]);\n\n // Debounced onChange to prevent flooding undo/redo history during color picker drag\n const debouncedOnChange = useMemo(\n () =>\n debounce((newColor: string, colorMode: 'color' | 'backgroundColor') => {\n if (colorMode === 'backgroundColor') {\n onChange?.({ ...valueRef.current, backgroundColor: newColor });\n } else {\n onChange?.({ ...valueRef.current, color: newColor });\n }\n }, 300),\n [onChange],\n );\n\n // Cleanup debounce on unmount\n useEffect(() => () => {\n debouncedOnChange.cancel();\n }, [debouncedOnChange]);\n\n // Close on outside click\n // [TODO] - rewrite to useDismiss hook from @floating-ui\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const referenceEl = refs.reference.current;\n const floatingEl = refs.floating.current;\n\n // `referenceEl` may be a VirtualElement (no `contains`)\n if (referenceEl && referenceEl instanceof Element && referenceEl.contains(target)) return;\n if (floatingEl?.contains(target)) return;\n\n // Flush any pending debounced changes before closing\n debouncedOnChange.flush();\n setIsOpen(false);\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, refs.floating, refs.reference, debouncedOnChange]);\n\n // Handler for color picker (continuous changes) - uses debounce\n const handlePickerChange = useCallback(\n (newColor: string) => {\n // Update visual state immediately for feedback\n if (modeRef.current === 'backgroundColor') {\n setColor(newColor);\n } else {\n setTextColor(newColor);\n }\n // Debounce the actual onChange to prevent history flooding\n debouncedOnChange(newColor, modeRef.current);\n },\n [debouncedOnChange],\n );\n\n // Handler for presets and hex input (discrete changes) - immediate\n const handleColorChange = useCallback(\n (newColor: string) => {\n // Cancel any pending debounced changes\n debouncedOnChange.cancel();\n\n // Update visual state\n if (mode === 'backgroundColor') {\n setColor(newColor);\n onChange?.({ ...value, backgroundColor: newColor });\n } else {\n setTextColor(newColor);\n onChange?.({ ...value, color: newColor });\n }\n },\n [mode, value, onChange, debouncedOnChange],\n );\n\n // Handler for removing color (set to undefined)\n const handleRemoveColor = useCallback(() => {\n debouncedOnChange.cancel();\n\n if (mode === 'backgroundColor') {\n setColor(undefined);\n onChange?.({ ...value, backgroundColor: undefined });\n } else {\n setTextColor(undefined);\n onChange?.({ ...value, color: undefined });\n }\n }, [mode, value, onChange, debouncedOnChange]);\n\n const currentColor = mode === 'backgroundColor' ? color : textColor;\n\n const trigger = cloneElement(children, {\n ref: refs.setReference,\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n setIsOpen((v) => !v);\n children.props.onClick?.(e);\n },\n });\n\n const setFloatingRef = (node: HTMLDivElement | null) => {\n refs.setFloating(node);\n if (!ref) return;\n if (typeof ref === 'function') ref(node);\n else {\n // eslint-disable-next-line no-param-reassign\n ref.current = node;\n }\n };\n\n return (\n <>\n {trigger}\n {isOpen && (\n <div\n ref={setFloatingRef}\n style={floatingStyles}\n className={`yoopta-ui-highlight-color-picker ${className ?? ''}`}\n onClick={(e) => e.stopPropagation()}\n contentEditable={false}\n onMouseDown={(e) => e.stopPropagation()}>\n {/* Mode Toggle */}\n <div className=\"yoopta-ui-highlight-color-picker-mode-toggle\">\n <button\n type=\"button\"\n className=\"yoopta-ui-highlight-color-picker-mode-btn\"\n data-active={mode === 'backgroundColor'}\n onMouseDown={() => setMode('backgroundColor')}\n aria-label=\"Background color\">\n Background\n </button>\n <button\n type=\"button\"\n className=\"yoopta-ui-highlight-color-picker-mode-btn\"\n data-active={mode === 'color'}\n onMouseDown={() => setMode('color')}\n aria-label=\"Text color\">\n Text\n </button>\n </div>\n\n <div className=\"yoopta-ui-highlight-color-picker-picker\">\n <HexColorPicker\n color={currentColor}\n onChange={handlePickerChange}\n className=\"yoopta-ui-highlight-color-picker-react-colorful\"\n />\n </div>\n\n {presets.length > 0 && (\n <div className=\"yoopta-ui-highlight-color-picker-presets\">\n <button\n type=\"button\"\n className=\"yoopta-ui-highlight-color-picker-preset yoopta-ui-highlight-color-picker-preset-remove\"\n data-selected={!currentColor}\n onClick={handleRemoveColor}\n aria-label={`Remove ${mode === 'backgroundColor' ? 'background' : 'text'} color`}\n />\n {presets.map((presetColor) => {\n const isSelected = currentColor?.toLowerCase() === presetColor.toLowerCase();\n return (\n <button\n key={presetColor}\n type=\"button\"\n className=\"yoopta-ui-highlight-color-picker-preset\"\n data-selected={isSelected}\n style={{ backgroundColor: presetColor }}\n onClick={() => handleColorChange(presetColor)}\n aria-label={`Select color ${presetColor}`}\n />\n );\n })}\n </div>\n )}\n\n {showInput && (\n <div className=\"yoopta-ui-highlight-color-picker-hex-row\">\n <div\n className=\"yoopta-ui-highlight-color-picker-swatch\"\n style={{ backgroundColor: currentColor }}\n />\n <HexColorInput\n color={currentColor}\n onChange={handleColorChange}\n className=\"yoopta-ui-highlight-color-picker-hex-input\"\n prefixed\n />\n </div>\n )}\n </div>\n )}\n </>\n );\n },\n);\n\nHighlightColorPicker.displayName = 'HighlightColorPicker';\n\n"],"names":["_jsxs","_Fragment","_jsx","HexColorPicker","HexColorInput"],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","sources":["../src/overlay/Overlay.tsx"],"sourcesContent":["import type { MouseEvent, ReactNode } from 'react';\nimport { FloatingOverlay } from '@floating-ui/react';\n\ntype Props = {\n children: ReactNode;\n lockScroll?: boolean;\n className?: string;\n onClick?: (e: MouseEvent) => void;\n onMouseDown?: (e: MouseEvent) => void;\n style?: React.CSSProperties;\n};\n\nconst Overlay = ({ className, children, lockScroll = true, ...props }: Props) => {\n const onMouseDown = (e: MouseEvent) => {\n e.stopPropagation();\n props.onMouseDown?.(e);\n };\n\n const onClick = (e: MouseEvent) => {\n e.stopPropagation();\n props.onClick?.(e);\n };\n\n return (\n <FloatingOverlay\n lockScroll={lockScroll}\n className={className}\n {...props}\n onClick={onClick}\n onMouseDown={onMouseDown}>\n {children}\n </FloatingOverlay>\n );\n};\n\nexport { Overlay };\n\n"],"names":["_jsx"],"mappings":";;;;;;;AAYA,MAAM,OAAO,GAAG,CAAC,EAA2D,KAAI;AAA/D,IAAA,IAAA,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,EAAA,GAAA,EAAmB,EAAd,KAAK,GAAlD,MAAA,CAAA,EAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,YAAA,CAAoD,CAAF,CAAA;AACjE,IAAA,MAAM,WAAW,GAAG,CAAC,CAAa,KAAI;;QACpC,CAAC,CAAC,eAAe,EAAE,CAAC;AACpB,QAAA,CAAA,EAAA,GAAA,KAAK,CAAC,WAAW,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAC,CAAC,CAAC;AACzB,KAAC,CAAC;AAEF,IAAA,MAAM,OAAO,GAAG,CAAC,CAAa,KAAI;;QAChC,CAAC,CAAC,eAAe,EAAE,CAAC;AACpB,QAAA,CAAA,EAAA,GAAA,KAAK,CAAC,OAAO,MAAG,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,CAAC,CAAC,CAAC;AACrB,KAAC,CAAC;IAEF,QACEA,GAAC,CAAA,eAAe,EACd,MAAA,CAAA,MAAA,CAAA,EAAA,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EAAA,EAChB,KAAK,EACT,EAAA,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACvB,EAAA,EAAA,QAAA,EAAA,QAAQ,EACO,CAAA,CAAA,EAClB;AACJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"portal.js","sources":["../src/portal/Portal.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { useYooptaEditor } from '@yoopta/editor';\n\ntype Props = {\n children: ReactNode;\n id: string;\n};\n\nconst Portal = (props: Props) => {\n const editor = useYooptaEditor();\n\n return (\n <FloatingPortal id={`${props.id}-${editor.id}`} root={editor.refElement}>\n {props.children}\n </FloatingPortal>\n );\n};\n\nexport { Portal };\n"],"names":["_jsx"],"mappings":";;;;;;;AASA,MAAM,MAAM,GAAG,CAAC,KAAY,KAAI;AAC9B,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,QACEA,GAAC,CAAA,cAAc,EAAC,MAAA,CAAA,MAAA,CAAA,EAAA,EAAE,EAAE,CAAA,EAAG,KAAK,CAAC,EAAE,CAAA,CAAA,EAAI,MAAM,CAAC,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EACpE,EAAA,EAAA,QAAA,EAAA,KAAK,CAAC,QAAQ,EACA,CAAA,CAAA,EACjB;AACJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection-box.js","sources":["../src/selection-box/hooks.ts","../src/selection-box/SelectionBox.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Paths, type YooEditor } from '@yoopta/editor';\n\nimport type { RectangeSelectionProps, RectangeSelectionState } from './SelectionBox';\n\ntype Coords = [number, number];\n\nconst SCROLL_EDGE_THRESHOLD = 60;\nconst SCROLL_MAX_SPEED = 15;\n\n// origin is in page (document) coordinates; coords is in viewport coordinates.\n// Convert origin to viewport space for hit-testing against getBoundingClientRect().\nconst findBlocksUnderSelection = (editor: YooEditor, originPage: Coords, coords: Coords): number[] => {\n const blocksUnderSelection: number[] = [];\n const blocks = editor.refElement?.querySelectorAll(`[data-yoopta-block]`);\n\n if (!blocks) return blocksUnderSelection;\n\n // Convert origin from page to viewport coords\n const scrollX = typeof window !== 'undefined' ? window.scrollX : 0;\n const scrollY = typeof window !== 'undefined' ? window.scrollY : 0;\n const originViewport: Coords = [originPage[0] - scrollX, originPage[1] - scrollY];\n\n const selectionRect = {\n top: Math.min(originViewport[1], coords[1]),\n left: Math.min(originViewport[0], coords[0]),\n bottom: Math.max(originViewport[1], coords[1]),\n right: Math.max(originViewport[0], coords[0]),\n };\n\n blocks.forEach((blockEl, i) => {\n const blockRect = blockEl.getBoundingClientRect();\n\n if (\n selectionRect.top < blockRect.bottom &&\n selectionRect.bottom > blockRect.top &&\n selectionRect.left < blockRect.right &&\n selectionRect.right > blockRect.left\n ) {\n blocksUnderSelection.push(i);\n }\n });\n\n return blocksUnderSelection;\n};\n\ntype RectangeSelectionReturn = RectangeSelectionState & {\n onClose: () => void;\n};\n\nconst INITIAL_STATE: RectangeSelectionState = {\n origin: [0, 0],\n coords: [0, 0],\n selection: false,\n};\n\n// [TODO] - Fix selection when multiple editors\nexport const useRectangeSelectionBox = ({\n editor,\n root,\n}: RectangeSelectionProps): RectangeSelectionReturn => {\n const [state, setState] = useState<RectangeSelectionState>(INITIAL_STATE);\n\n // Use refs to avoid stale closures in event handlers\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const scrollRafRef = useRef<number | null>(null);\n const lastMouseYRef = useRef(0);\n const lastMouseXRef = useRef(0);\n\n const onClose = useCallback(() => {\n setState(INITIAL_STATE);\n }, []);\n\n useEffect(() => {\n if (editor.readOnly) return;\n\n const getRootElement = (): HTMLElement | Document | null => {\n if (root && 'current' in root) return root.current;\n if (root) return root;\n return null;\n };\n\n const elementMouseEl = getRootElement();\n\n // Skip if root element is not yet available (e.g., ref not mounted)\n if (!elementMouseEl) return;\n\n if (editor.refElement?.contains(elementMouseEl as Node)) {\n throw new Error(\n 'Root element should not be a child of the editor. Please check the `selectionBoxElement` prop',\n );\n }\n\n const onMouseDown = (event: MouseEvent) => {\n const isInsideEditor = editor.refElement?.contains(event.target as Node);\n const selectedBlocks = Paths.getSelectedPaths(editor);\n\n if (\n !isInsideEditor &&\n !stateRef.current.selection &&\n Array.isArray(selectedBlocks) &&\n selectedBlocks.length > 0\n ) {\n editor.setPath({ current: null });\n onClose();\n return;\n }\n\n if (isInsideEditor) return;\n\n // Prevent native text selection when starting selection box\n event.preventDefault();\n\n // Clear any existing native selection\n window.getSelection()?.removeAllRanges();\n\n // Add user-select: none to editor during selection\n if (editor.refElement) {\n editor.refElement.style.userSelect = 'none';\n }\n\n // Store origin in page (document) coordinates so it stays anchored\n // to the document position even when the page scrolls.\n const scrollX = typeof window !== 'undefined' ? window.scrollX : 0;\n const scrollY = typeof window !== 'undefined' ? window.scrollY : 0;\n const originPage: Coords = [event.clientX + scrollX, event.clientY + scrollY];\n // Current coords stay in viewport space (clientX/clientY)\n const currentCoords: Coords = [event.clientX, event.clientY];\n setState({\n origin: originPage,\n coords: currentCoords,\n selection: true,\n });\n };\n\n const updateSelectionFromCoords = (clientX: number, clientY: number) => {\n const newCoords: Coords = [clientX, clientY];\n\n setState((prevState) => ({\n ...prevState,\n coords: newCoords,\n }));\n\n const blocksUnderSelection = findBlocksUnderSelection(\n editor,\n stateRef.current.origin,\n newCoords,\n );\n\n editor.setPath({ current: null, selected: blocksUnderSelection, source: 'selection-box' });\n };\n\n const startAutoScroll = () => {\n if (scrollRafRef.current !== null) return;\n\n const tick = () => {\n if (!stateRef.current.selection) {\n scrollRafRef.current = null;\n return;\n }\n\n const mouseY = lastMouseYRef.current;\n const viewportHeight = window.innerHeight;\n let scrollDelta = 0;\n\n if (mouseY < SCROLL_EDGE_THRESHOLD) {\n // Near top edge — scroll up\n const proximity = 1 - mouseY / SCROLL_EDGE_THRESHOLD;\n scrollDelta = -Math.round(SCROLL_MAX_SPEED * proximity);\n } else if (mouseY > viewportHeight - SCROLL_EDGE_THRESHOLD) {\n // Near bottom edge — scroll down\n const proximity = 1 - (viewportHeight - mouseY) / SCROLL_EDGE_THRESHOLD;\n scrollDelta = Math.round(SCROLL_MAX_SPEED * proximity);\n }\n\n if (scrollDelta !== 0) {\n window.scrollBy(0, scrollDelta);\n // Update selection to account for scroll — origin shifts with viewport\n updateSelectionFromCoords(lastMouseXRef.current, lastMouseYRef.current);\n scrollRafRef.current = requestAnimationFrame(tick);\n } else {\n scrollRafRef.current = null;\n }\n };\n\n scrollRafRef.current = requestAnimationFrame(tick);\n };\n\n const stopAutoScroll = () => {\n if (scrollRafRef.current !== null) {\n cancelAnimationFrame(scrollRafRef.current);\n scrollRafRef.current = null;\n }\n };\n\n const onMouseMove = (event: MouseEvent) => {\n if (!stateRef.current.selection) return;\n\n // Prevent native selection during drag\n event.preventDefault();\n\n // Clear any native selection that might have occurred\n window.getSelection()?.removeAllRanges();\n\n lastMouseXRef.current = event.clientX;\n lastMouseYRef.current = event.clientY;\n\n updateSelectionFromCoords(event.clientX, event.clientY);\n\n // Start auto-scrolling if near viewport edges\n if (\n event.clientY < SCROLL_EDGE_THRESHOLD ||\n event.clientY > window.innerHeight - SCROLL_EDGE_THRESHOLD\n ) {\n startAutoScroll();\n } else {\n stopAutoScroll();\n }\n };\n\n const onMouseUp = () => {\n stopAutoScroll();\n if (stateRef.current.selection) {\n // Restore user-select on editor\n if (editor.refElement) {\n editor.refElement.style.userSelect = '';\n }\n onClose();\n }\n };\n\n elementMouseEl.addEventListener('mousedown', onMouseDown as EventListener);\n elementMouseEl.addEventListener('mousemove', onMouseMove as EventListener);\n elementMouseEl.addEventListener('mouseup', onMouseUp);\n\n return () => {\n stopAutoScroll();\n elementMouseEl.removeEventListener('mousedown', onMouseDown as EventListener);\n elementMouseEl.removeEventListener('mousemove', onMouseMove as EventListener);\n elementMouseEl.removeEventListener('mouseup', onMouseUp);\n };\n }, [editor, root, onClose]);\n\n return {\n ...state,\n onClose,\n };\n};\n\n","import type { CSSProperties } from 'react';\nimport { useMemo } from 'react';\nimport type { YooEditor } from '@yoopta/editor';\nimport { useYooptaEditor, useYooptaReadOnly } from '@yoopta/editor';\n\nimport { useRectangeSelectionBox } from './hooks';\n\nexport type SelectionBoxRoot = HTMLElement | { current: HTMLElement | null };\n\nexport type RectangeSelectionProps = {\n editor: YooEditor;\n root?: SelectionBoxRoot;\n};\n\nexport type RectangeSelectionState = {\n origin: [number, number];\n coords: [number, number];\n selection: boolean;\n};\n\nexport type SelectionBoxProps = {\n selectionBoxElement?: SelectionBoxRoot | null;\n};\n\nconst getTransform = (origin: [number, number], coords: [number, number]): string | undefined => {\n if (origin[1] > coords[1] && origin[0] > coords[0]) return 'scaleY(-1) scaleX(-1)';\n if (origin[1] > coords[1]) return 'scaleY(-1)';\n if (origin[0] > coords[0]) return 'scaleX(-1)';\n return undefined;\n};\n\nconst SelectionBox = ({ selectionBoxElement }: SelectionBoxProps) => {\n const editor = useYooptaEditor();\n const isReadOnly = useYooptaReadOnly();\n // origin is in page (document) coordinates; coords is in viewport coordinates\n const { coords, origin, selection } = useRectangeSelectionBox({\n editor,\n root: selectionBoxElement ?? undefined,\n });\n\n // Convert origin from page to viewport coordinates for position: fixed rendering\n const originViewport: [number, number] = useMemo(\n () => [\n origin[0] - (typeof window !== 'undefined' ? window.scrollX : 0),\n origin[1] - (typeof window !== 'undefined' ? window.scrollY : 0),\n ],\n [origin, coords], // recalc when coords change (which happens on scroll too)\n );\n\n const selectionBoxStyle = useMemo<CSSProperties>(\n () => ({\n zIndex: 10,\n left: originViewport[0],\n top: originViewport[1],\n height: Math.abs(coords[1] - originViewport[1] - 1),\n width: Math.abs(coords[0] - originViewport[0] - 1),\n userSelect: 'none',\n transformOrigin: 'top left',\n transform: getTransform(originViewport, coords),\n position: 'fixed',\n backgroundColor: 'rgba(35, 131, 226, 0.14)',\n }),\n [originViewport, coords],\n );\n\n if (!selection || isReadOnly) return null;\n\n return <div style={selectionBoxStyle} />;\n};\n\nexport { SelectionBox };\n\n"],"names":["_jsx"],"mappings":"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"}