@yoopta/ui 6.0.0-beta.14 → 6.0.0-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/element-options/context/element-options-context.d.ts +1 -1
  2. package/dist/element-options.js +5 -18
  3. package/dist/floating-toolbar/floating-toolbar.d.ts.map +1 -1
  4. package/dist/floating-toolbar.js +1 -1
  5. package/dist/highlight-color-picker/highlight-color-picker.d.ts +1 -0
  6. package/dist/highlight-color-picker/highlight-color-picker.d.ts.map +1 -1
  7. package/dist/highlight-color-picker/index.d.ts +0 -1
  8. package/dist/highlight-color-picker/index.d.ts.map +1 -1
  9. package/dist/highlight-color-picker.js +1 -1
  10. package/dist/index.js +1 -1
  11. package/package.json +3 -4
  12. package/dist/action-menu-list.js.map +0 -1
  13. package/dist/block-dnd.js.map +0 -1
  14. package/dist/block-options.js.map +0 -1
  15. package/dist/chunks/_tslib-8f8de673.js +0 -36
  16. package/dist/chunks/_tslib-8f8de673.js.map +0 -1
  17. package/dist/chunks/floating-ui.react-727e4287.js +0 -5
  18. package/dist/chunks/floating-ui.react-d2303b03.js +0 -4506
  19. package/dist/chunks/floating-ui.react-d2303b03.js.map +0 -1
  20. package/dist/chunks/floating-ui.react-feaab622.js +0 -4506
  21. package/dist/chunks/floating-ui.react-feaab622.js.map +0 -1
  22. package/dist/chunks/highlight-color-picker-027fa4b4.js +0 -93
  23. package/dist/chunks/highlight-color-picker-027fa4b4.js.map +0 -1
  24. package/dist/chunks/highlight-color-picker-a1a292a9.js +0 -1
  25. package/dist/chunks/highlight-color-picker-a979e7a3.js +0 -93
  26. package/dist/chunks/highlight-color-picker-a979e7a3.js.map +0 -1
  27. package/dist/chunks/highlight-color-picker-ce0b19ac.js +0 -1
  28. package/dist/chunks/index-bfd2e7c4.js +0 -6
  29. package/dist/chunks/index-bfd2e7c4.js.map +0 -1
  30. package/dist/chunks/style-inject.es-746bb8ed.js +0 -29
  31. package/dist/chunks/style-inject.es-746bb8ed.js.map +0 -1
  32. package/dist/chunks/throttle-278836f4.js +0 -45
  33. package/dist/chunks/throttle-278836f4.js.map +0 -1
  34. package/dist/element-options.js.map +0 -1
  35. package/dist/floating-block-actions.js.map +0 -1
  36. package/dist/floating-toolbar.js.map +0 -1
  37. package/dist/highlight-color-picker.js.map +0 -1
  38. package/dist/index.js.map +0 -1
  39. package/dist/overlay.js.map +0 -1
  40. package/dist/portal.js.map +0 -1
  41. package/dist/selection-box.js.map +0 -1
  42. package/dist/slash-command-menu.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"element-options.js","sources":["../src/element-options/components/element-options-color-picker.tsx","../src/element-options/context/element-options-context.tsx","../src/element-options/components/element-options-content.tsx","../src/element-options/components/element-options-group.tsx","../src/element-options/components/element-options-input.tsx","../src/element-options/components/element-options-label.tsx","../src/element-options/components/element-options-root.tsx","../../../../node_modules/shared/src/utils.ts","../../../../node_modules/lucide-react/src/defaultAttributes.ts","../../../../node_modules/lucide-react/src/Icon.ts","../../../../node_modules/lucide-react/src/createLucideIcon.ts","../../../../node_modules/lucide-react/src/icons/check.ts","../../../../node_modules/lucide-react/src/icons/chevron-down.ts","../../../../node_modules/lucide-react/src/icons/ellipsis.ts","../src/element-options/components/element-options-select.tsx","../src/element-options/components/element-options-separator.tsx","../src/element-options/components/element-options-slider.tsx","../src/element-options/components/element-options-toggle.tsx","../src/element-options/components/element-options-trigger.tsx","../src/element-options/index.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react';\nimport { HexColorPicker } from 'react-colorful';\n\nimport { Portal } from '../../portal';\nimport type { ElementOptionsColorPickerProps } from '../types';\n\nconst DEFAULT_PRESET_COLORS = [\n '#000000',\n '#6B7280',\n '#EF4444',\n '#F59E0B',\n '#22C55E',\n '#3B82F6',\n '#8B5CF6',\n '#EC4899',\n];\n\nexport const ElementOptionsColorPicker = ({\n value,\n onChange,\n presetColors = DEFAULT_PRESET_COLORS,\n className,\n style,\n}: ElementOptionsColorPickerProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (triggerRef.current) {\n refs.setReference(triggerRef.current);\n }\n }, [refs]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n !triggerRef.current.contains(target) &&\n refs.floating.current &&\n !refs.floating.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, refs.floating]);\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(!isOpen);\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n const handlePresetClick = (color: string) => {\n onChange(color);\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n className={className}\n style={style}\n onClick={handleTriggerClick}\n onMouseDown={handleMouseDown}\n data-element-options-color-picker\n data-state={isOpen ? 'open' : 'closed'}\n aria-expanded={isOpen}>\n <span\n data-element-options-color-preview\n style={{ backgroundColor: value }}\n />\n <span data-element-options-color-value>{value}</span>\n </button>\n\n {isOpen && (\n <Portal id=\"element-options-color-picker-portal\">\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n data-element-options-color-picker-content\n onMouseDown={handleMouseDown}>\n <HexColorPicker color={value} onChange={onChange} />\n\n {presetColors.length > 0 && (\n <div data-element-options-color-presets>\n {presetColors.map((color) => (\n <button\n key={color}\n type=\"button\"\n data-element-options-color-preset\n data-selected={color === value}\n style={{ backgroundColor: color }}\n onClick={() => handlePresetClick(color)}\n onMouseDown={handleMouseDown}\n aria-label={`Select color ${color}`}\n />\n ))}\n </div>\n )}\n </div>\n </Portal>\n )}\n </>\n );\n};\n\nElementOptionsColorPicker.displayName = 'ElementOptions.ColorPicker';\n\n","import { createContext, useContext } from 'react';\nimport { Elements } from '@yoopta/editor';\n\nimport type { ElementOptionsContextValue } from '../types';\n\nexport const ElementOptionsContext = createContext<ElementOptionsContextValue | null>(null);\nElementOptionsContext.displayName = 'ElementOptionsContext';\n\nexport function useElementOptionsContext(): ElementOptionsContextValue {\n const context = useContext(ElementOptionsContext);\n\n if (!context) {\n throw new Error('useElementOptionsContext must be used within an ElementOptions.Root');\n }\n\n return context;\n}\n\nexport function useElementOptions() {\n const { blockId, element, editor, isOpen, setIsOpen } = useElementOptionsContext();\n return { blockId, element, editor, isOpen, setIsOpen };\n}\n\nexport function useUpdateElementProps<T extends Record<string, unknown>>() {\n const { blockId, element, editor } = useElementOptionsContext();\n\n return (props: Partial<T>) => {\n Elements.updateElement(editor, {\n blockId,\n type: element.type,\n props: { ...element.props, ...props },\n });\n };\n}\n\n","import { useEffect, useRef } from 'react';\nimport {\n useFloating,\n offset,\n flip,\n shift,\n autoUpdate,\n type Placement,\n} from '@floating-ui/react';\n\nimport { Portal } from '../../portal';\nimport { useElementOptionsContext } from '../context/element-options-context';\nimport type { ElementOptionsContentProps } from '../types';\n\nexport const ElementOptionsContent = ({\n children,\n className,\n style,\n side = 'bottom',\n align = 'end',\n sideOffset = 4,\n alignOffset = 0,\n}: ElementOptionsContentProps) => {\n const { isOpen, setIsOpen, triggerRef, contentRef } = useElementOptionsContext();\n const internalContentRef = useRef<HTMLDivElement>(null);\n\n // Build placement string for floating-ui\n const placement: Placement = align === 'center' ? side : `${side}-${align}`;\n\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement,\n middleware: [\n offset({ mainAxis: sideOffset, crossAxis: alignOffset }),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n // Sync trigger ref with floating-ui\n useEffect(() => {\n if (triggerRef.current) {\n refs.setReference(triggerRef.current);\n }\n }, [triggerRef, refs]);\n\n // Handle click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const triggerEl = triggerRef.current;\n const contentEl = internalContentRef.current;\n\n if (\n triggerEl &&\n !triggerEl.contains(target) &&\n contentEl &&\n !contentEl.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, setIsOpen, triggerRef]);\n\n if (!isOpen) return null;\n\n return (\n <Portal id=\"element-options-portal\">\n <div\n ref={(node) => {\n refs.setFloating(node);\n internalContentRef.current = node;\n if (contentRef) {\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n }}\n className={className}\n style={{ ...floatingStyles, ...style }}\n data-element-options-content\n data-state=\"open\"\n data-side={side}\n data-align={align}\n role=\"dialog\"\n aria-modal=\"true\">\n {children}\n </div>\n </Portal>\n );\n};\n\nElementOptionsContent.displayName = 'ElementOptions.Content';\n\n","import type { ElementOptionsGroupProps } from '../types';\n\nexport const ElementOptionsGroup = ({\n children,\n className,\n style,\n}: ElementOptionsGroupProps) => (\n <div className={className} style={style} data-element-options-group>\n {children}\n </div>\n);\n\nElementOptionsGroup.displayName = 'ElementOptions.Group';\n\n","import type { ElementOptionsInputProps } from '../types';\n\nexport const ElementOptionsInput = ({\n value,\n onChange,\n placeholder,\n type = 'text',\n className,\n style,\n}: ElementOptionsInputProps) => {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n return (\n <input\n type={type}\n value={value}\n onChange={handleChange}\n onMouseDown={handleMouseDown}\n placeholder={placeholder}\n className={className}\n style={style}\n data-element-options-input\n />\n );\n};\n\nElementOptionsInput.displayName = 'ElementOptions.Input';\n\n","import type { ElementOptionsLabelProps } from '../types';\n\nexport const ElementOptionsLabel = ({\n children,\n className,\n style,\n}: ElementOptionsLabelProps) => (\n <label className={className} style={style} data-element-options-label>\n {children}\n </label>\n);\n\nElementOptionsLabel.displayName = 'ElementOptions.Label';\n\n","import { useMemo, useRef, useState } from 'react';\nimport { useYooptaEditor } from '@yoopta/editor';\n\nimport { ElementOptionsContext } from '../context/element-options-context';\nimport type { ElementOptionsRootProps } from '../types';\n\nexport const ElementOptionsRoot = ({\n blockId,\n element,\n children,\n anchorRef,\n className,\n style,\n}: ElementOptionsRootProps) => {\n const editor = useYooptaEditor();\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const contextValue = useMemo(\n () => ({\n blockId,\n element,\n editor,\n isOpen,\n setIsOpen,\n triggerRef,\n contentRef,\n anchorRef: anchorRef ?? null,\n }),\n [blockId, element, editor, isOpen, anchorRef],\n );\n\n return (\n <ElementOptionsContext.Provider value={contextValue}>\n <div\n className={className}\n style={style}\n data-element-options-root\n data-state={isOpen ? 'open' : 'closed'}>\n {children}\n </div>\n </ElementOptionsContext.Provider>\n );\n};\n\nElementOptionsRoot.displayName = 'ElementOptions.Root';\n","import { CamelToPascal } from './utility-types';\n\n/**\n * Converts string to kebab case\n *\n * @param {string} string\n * @returns {string} A kebabized string\n */\nexport const toKebabCase = (string: string) =>\n string.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n\n/**\n * Converts string to pascal case\n *\n * @param {string} string\n * @returns {string} A pascalized string\n */\nexport const toPascalCase = <T extends string>(string: T): CamelToPascal<T> => {\n const camelCase = string.replace(/^([A-Z])|[\\s-_]+(\\w)/g, (match, p1, p2) =>\n p2 ? p2.toUpperCase() : p1.toLowerCase(),\n );\n\n return (camelCase.charAt(0).toUpperCase() + camelCase.slice(1)) as CamelToPascal<T>;\n};\n\n/**\n * Merges classes into a single string\n *\n * @param {array} classes\n * @returns {string} A string of classes\n */\nexport const mergeClasses = <ClassType = string | undefined | null>(...classes: ClassType[]) =>\n classes\n .filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n })\n .join(' ');\n","export default {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n","import { createElement, forwardRef } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport { IconNode, LucideProps } from './types';\nimport { mergeClasses } from '@lucide/shared';\n\ninterface IconComponentProps extends LucideProps {\n iconNode: IconNode;\n}\n\n/**\n * Lucide icon component\n *\n * @component Icon\n * @param {object} props\n * @param {string} props.color - The color of the icon\n * @param {number} props.size - The size of the icon\n * @param {number} props.strokeWidth - The stroke width of the icon\n * @param {boolean} props.absoluteStrokeWidth - Whether to use absolute stroke width\n * @param {string} props.className - The class name of the icon\n * @param {IconNode} props.children - The children of the icon\n * @param {IconNode} props.iconNode - The icon node of the icon\n *\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst Icon = forwardRef<SVGSVGElement, IconComponentProps>(\n (\n {\n color = 'currentColor',\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = '',\n children,\n iconNode,\n ...rest\n },\n ref,\n ) => {\n return createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? (Number(strokeWidth) * 24) / Number(size) : strokeWidth,\n className: mergeClasses('lucide', className),\n ...rest,\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n );\n },\n);\n\nexport default Icon;\n","import { createElement, forwardRef } from 'react';\nimport { mergeClasses, toKebabCase } from '@lucide/shared';\nimport { IconNode, LucideProps } from './types';\nimport Icon from './Icon';\n\n/**\n * Create a Lucide icon component\n * @param {string} iconName\n * @param {array} iconNode\n * @returns {ForwardRefExoticComponent} LucideIcon\n */\nconst createLucideIcon = (iconName: string, iconNode: IconNode) => {\n const Component = forwardRef<SVGSVGElement, LucideProps>(({ className, ...props }, ref) =>\n createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props,\n }),\n );\n\n Component.displayName = `${iconName}`;\n\n return Component;\n};\n\nexport default createLucideIcon;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Check\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Check = createLucideIcon('Check', [['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }]]);\n\nexport default Check;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ChevronDown\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ChevronDown = createLucideIcon('ChevronDown', [\n ['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }],\n]);\n\nexport default ChevronDown;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Ellipsis\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Ellipsis = createLucideIcon('Ellipsis', [\n ['circle', { cx: '12', cy: '12', r: '1', key: '41hilf' }],\n ['circle', { cx: '19', cy: '12', r: '1', key: '1wjl8i' }],\n ['circle', { cx: '5', cy: '12', r: '1', key: '1pcz8c' }],\n]);\n\nexport default Ellipsis;\n","import { useEffect, useRef, useState } from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react';\nimport { Check, ChevronDown } from 'lucide-react';\n\nimport { Portal } from '../../portal';\nimport type { ElementOptionsSelectProps, SelectOption } from '../types';\n\nexport const ElementOptionsSelect = <T extends string = string>({\n value,\n options,\n onValueChange,\n placeholder = 'Select...',\n className,\n style,\n renderOption,\n renderValue,\n}: ElementOptionsSelectProps<T>) => {\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n const { refs, floatingStyles } = useFloating({\n open: isOpen,\n placement: 'bottom-start',\n middleware: [\n offset(4),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (triggerRef.current) {\n refs.setReference(triggerRef.current);\n }\n }, [refs]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n triggerRef.current &&\n !triggerRef.current.contains(target) &&\n refs.floating.current &&\n !refs.floating.current.contains(target)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isOpen, refs.floating]);\n\n const handleSelect = (optionValue: T) => {\n onValueChange(optionValue);\n setIsOpen(false);\n };\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(!isOpen);\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n const defaultRenderOption = (option: SelectOption<T>) => (\n <>\n {option.icon && <span data-element-options-select-icon>{option.icon}</span>}\n {option.color && (\n <span\n data-element-options-select-color\n style={{ backgroundColor: option.color }}\n />\n )}\n <span>{option.label}</span>\n </>\n );\n\n const defaultRenderValue = (option: SelectOption<T> | undefined) => (\n <>\n {option?.icon && <span data-element-options-select-icon>{option.icon}</span>}\n {option?.color && (\n <span\n data-element-options-select-color\n style={{ backgroundColor: option.color }}\n />\n )}\n <span>{option?.label ?? placeholder}</span>\n </>\n );\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n className={className}\n style={style}\n onClick={handleTriggerClick}\n onMouseDown={handleMouseDown}\n data-element-options-select\n data-state={isOpen ? 'open' : 'closed'}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\">\n <span data-element-options-select-value>\n {renderValue ? renderValue(selectedOption) : defaultRenderValue(selectedOption)}\n </span>\n <ChevronDown data-element-options-select-chevron />\n </button>\n\n {isOpen && (\n <Portal id=\"element-options-select-portal\">\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n data-element-options-select-content\n role=\"listbox\"\n aria-activedescendant={value}\n tabIndex={0}>\n {options.map((option) => (\n <button\n key={String(option.value)}\n type=\"button\"\n role=\"option\"\n aria-selected={option.value === value}\n data-element-options-select-item\n data-selected={option.value === value}\n onClick={() => handleSelect(option.value)}\n onMouseDown={handleMouseDown}>\n <span data-element-options-select-item-content>\n {renderOption ? renderOption(option) : defaultRenderOption(option)}\n </span>\n {option.value === value && (\n <Check data-element-options-select-check />\n )}\n </button>\n ))}\n </div>\n </Portal>\n )}\n </>\n );\n};\n\nElementOptionsSelect.displayName = 'ElementOptions.Select';\n\n","import type { ElementOptionsSeparatorProps } from '../types';\n\nexport const ElementOptionsSeparator = ({\n className,\n style,\n}: ElementOptionsSeparatorProps) => (\n <div\n className={className}\n style={style}\n data-element-options-separator\n role=\"separator\"\n aria-orientation=\"horizontal\"\n />\n);\n\nElementOptionsSeparator.displayName = 'ElementOptions.Separator';\n\n","import type { ElementOptionsSliderProps } from '../types';\n\nexport const ElementOptionsSlider = ({\n value,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n className,\n style,\n}: ElementOptionsSliderProps) => {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onValueChange(Number(e.target.value));\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const percentage = ((value - min) / (max - min)) * 100;\n\n return (\n <div\n className={className}\n style={style}\n data-element-options-slider\n onMouseDown={handleMouseDown}>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={handleChange}\n data-element-options-slider-input\n style={{\n // CSS variable for styling the track fill\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ['--slider-percentage' as any]: `${percentage}%`,\n }}\n />\n <span data-element-options-slider-value>{value}</span>\n </div>\n );\n};\n\nElementOptionsSlider.displayName = 'ElementOptions.Slider';\n\n","import type { ElementOptionsToggleProps } from '../types';\n\nexport const ElementOptionsToggle = ({\n checked,\n onCheckedChange,\n label,\n className,\n style,\n}: ElementOptionsToggleProps) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onCheckedChange(!checked);\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onCheckedChange(!checked);\n }\n };\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n className={className}\n style={style}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n data-element-options-toggle\n data-state={checked ? 'checked' : 'unchecked'}>\n <span data-element-options-toggle-thumb />\n {label && <span data-element-options-toggle-label>{label}</span>}\n </button>\n );\n};\n\nElementOptionsToggle.displayName = 'ElementOptions.Toggle';\n\n","import { useEffect } from 'react';\nimport {\n type Placement,\n autoUpdate,\n flip,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react';\nimport { MoreHorizontal } from 'lucide-react';\n\nimport { useElementOptionsContext } from '../context/element-options-context';\nimport type { ElementOptionsTriggerProps } from '../types';\n\nexport const ElementOptionsTrigger = ({\n children,\n className,\n style,\n side,\n align,\n sideOffset = 0,\n alignOffset = 0,\n}: ElementOptionsTriggerProps) => {\n const { isOpen, setIsOpen, triggerRef, anchorRef } = useElementOptionsContext();\n\n // Determine if we should use floating positioning\n const useFloatingPosition = Boolean(anchorRef && side);\n\n // Build placement string for floating-ui\n const placement: Placement = side\n ? align === 'center' || !align\n ? side\n : `${side}-${align}`\n : 'bottom';\n\n const { refs, floatingStyles } = useFloating({\n placement,\n middleware: [\n offset({ mainAxis: sideOffset, crossAxis: alignOffset }),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n // Sync anchor ref with floating-ui\n useEffect(() => {\n if (anchorRef?.current && useFloatingPosition) {\n refs.setReference(anchorRef.current);\n }\n }, [anchorRef, refs, useFloatingPosition]);\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(!isOpen);\n };\n\n const handleMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n };\n\n // Combine styles: floating styles (if using floating positioning) + custom styles\n const combinedStyles = useFloatingPosition\n ? { ...floatingStyles, ...style }\n : style;\n\n return (\n <button\n ref={(node) => {\n // Set both refs\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = node;\n if (useFloatingPosition) {\n refs.setFloating(node);\n }\n }}\n type=\"button\"\n className={className}\n style={combinedStyles}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n data-element-options-trigger\n data-state={isOpen ? 'open' : 'closed'}\n aria-expanded={isOpen}\n aria-haspopup=\"dialog\">\n {children ?? <MoreHorizontal className=\"yoo-element-options-trigger-icon\" />}\n </button>\n );\n};\n\nElementOptionsTrigger.displayName = 'ElementOptions.Trigger';\n","import './element-options.css';\n\nimport { ElementOptionsColorPicker } from './components/element-options-color-picker';\nimport { ElementOptionsContent } from './components/element-options-content';\nimport { ElementOptionsGroup } from './components/element-options-group';\nimport { ElementOptionsInput } from './components/element-options-input';\nimport { ElementOptionsLabel } from './components/element-options-label';\nimport { ElementOptionsRoot } from './components/element-options-root';\nimport { ElementOptionsSelect } from './components/element-options-select';\nimport { ElementOptionsSeparator } from './components/element-options-separator';\nimport { ElementOptionsSlider } from './components/element-options-slider';\nimport { ElementOptionsToggle } from './components/element-options-toggle';\nimport { ElementOptionsTrigger } from './components/element-options-trigger';\n\n// Export types\nexport type {\n Side,\n Align,\n ElementOptionsContextValue,\n ElementOptionsRootProps,\n ElementOptionsTriggerProps,\n ElementOptionsContentProps,\n ElementOptionsGroupProps,\n ElementOptionsLabelProps,\n ElementOptionsSeparatorProps,\n ElementOptionsSelectProps,\n ElementOptionsColorPickerProps,\n ElementOptionsToggleProps,\n ElementOptionsSliderProps,\n ElementOptionsInputProps,\n SelectOption,\n} from './types';\n\n// Export context and hooks\nexport {\n ElementOptionsContext,\n useElementOptionsContext,\n useElementOptions,\n useUpdateElementProps,\n} from './context/element-options-context';\n\n// Export individual components\nexport { ElementOptionsRoot } from './components/element-options-root';\nexport { ElementOptionsTrigger } from './components/element-options-trigger';\nexport { ElementOptionsContent } from './components/element-options-content';\nexport { ElementOptionsGroup } from './components/element-options-group';\nexport { ElementOptionsLabel } from './components/element-options-label';\nexport { ElementOptionsSeparator } from './components/element-options-separator';\nexport { ElementOptionsSelect } from './components/element-options-select';\nexport { ElementOptionsColorPicker } from './components/element-options-color-picker';\nexport { ElementOptionsToggle } from './components/element-options-toggle';\nexport { ElementOptionsSlider } from './components/element-options-slider';\nexport { ElementOptionsInput } from './components/element-options-input';\n\n// Export compound component\nexport const ElementOptions = Object.assign(ElementOptionsRoot, {\n Root: ElementOptionsRoot,\n Trigger: ElementOptionsTrigger,\n Content: ElementOptionsContent,\n Group: ElementOptionsGroup,\n Label: ElementOptionsLabel,\n Separator: ElementOptionsSeparator,\n Select: ElementOptionsSelect,\n ColorPicker: ElementOptionsColorPicker,\n Toggle: ElementOptionsToggle,\n Slider: ElementOptionsSlider,\n Input: ElementOptionsInput,\n});\n"],"names":["_jsxs","_Fragment","_jsx","HexColorPicker","MoreHorizontal"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13]}
@@ -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};\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, 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>(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(HIDDEN_STYLES);\n }, []);\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 setStyles(getVisibleStyles(rect.top + 2, rect.left, containerWidth));\n }, []);\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 // Outside editor - hide\n if (!isInsideEditor) {\n hide();\n return;\n }\n\n // Read-only mode - ignore\n if (editor.readOnly) return;\n\n // Inside floating actions - keep current state\n if (isInsideActions) 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 console.log('FloatingToolbarRoot refs', refs);\n console.log('FloatingToolbarRoot open state', { isOpen, isMounted });\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 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) => e.stopPropagation()}\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 {...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":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
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 { useLayoutEffect, useRef, useState } from 'react';\nimport { FloatingPortal } from '@floating-ui/react';\nimport { useYooptaEditor } from '@yoopta/editor';\n\ntype Props = {\n children: ReactNode;\n id: string;\n};\n\n// Global map to track portal container usage count per editor\nconst portalContainerRefs = new WeakMap<HTMLElement, number>();\n\n// Get or create portal container synchronously\nconst getOrCreatePortalContainer = (editorEl: HTMLElement): HTMLElement => {\n let portalContainer = editorEl.querySelector('.yoopta-portal-container') as HTMLElement;\n\n if (!portalContainer) {\n portalContainer = document.createElement('div');\n portalContainer.className = 'yoopta-portal-container';\n editorEl.appendChild(portalContainer);\n portalContainerRefs.set(portalContainer, 0);\n }\n\n return portalContainer;\n};\n\nconst Portal = (props: Props) => {\n const editor = useYooptaEditor();\n const rootElRef = useRef<HTMLElement | null>(null);\n const [, forceUpdate] = useState(0);\n\n // Initialize portal container synchronously on first render\n if (!rootElRef.current && editor.refElement) {\n rootElRef.current = getOrCreatePortalContainer(editor.refElement);\n // Increment usage count\n const currentCount = portalContainerRefs.get(rootElRef.current) ?? 0;\n portalContainerRefs.set(rootElRef.current, currentCount + 1);\n }\n\n // Handle cleanup and editor changes\n useLayoutEffect(() => {\n const editorEl = editor.refElement;\n if (!editorEl) return;\n\n // If rootEl doesn't match current editor, update it\n if (!rootElRef.current || !editorEl.contains(rootElRef.current)) {\n rootElRef.current = getOrCreatePortalContainer(editorEl);\n const currentCount = portalContainerRefs.get(rootElRef.current) ?? 0;\n portalContainerRefs.set(rootElRef.current, currentCount + 1);\n forceUpdate((n) => n + 1);\n }\n\n return () => {\n if (rootElRef.current) {\n // Decrement usage count\n const count = portalContainerRefs.get(rootElRef.current) ?? 0;\n const newCount = Math.max(0, count - 1);\n portalContainerRefs.set(rootElRef.current, newCount);\n\n // Only remove container if no portals are using it\n if (newCount === 0 && rootElRef.current.parentNode) {\n rootElRef.current.remove();\n portalContainerRefs.delete(rootElRef.current);\n }\n rootElRef.current = null;\n }\n };\n }, [editor.refElement]);\n\n if (!rootElRef.current) return null;\n\n return (\n <FloatingPortal id={`${props.id}-${editor.id}`} root={rootElRef.current}>\n {props.children}\n </FloatingPortal>\n );\n};\n\nexport { Portal };\n"],"names":["_jsx"],"mappings":"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"}
@@ -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 findBlocksUnderSelection = (editor: YooEditor, origin: 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 const selectionRect = {\n top: Math.min(origin[1], coords[1]),\n left: Math.min(origin[0], coords[0]),\n bottom: Math.max(origin[1], coords[1]),\n right: Math.max(origin[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 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 const coords: Coords = [event.pageX, event.pageY - window.scrollY];\n setState({\n origin: coords,\n coords,\n selection: true,\n });\n };\n\n const onMouseMove = (event: MouseEvent) => {\n if (!stateRef.current.selection) return;\n\n const newCoords: Coords = [event.pageX, event.pageY - window.scrollY];\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 onMouseUp = () => {\n if (stateRef.current.selection) {\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 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 const { coords, origin, selection } = useRectangeSelectionBox({\n editor,\n root: selectionBoxElement ?? undefined,\n });\n\n const selectionBoxStyle = useMemo<CSSProperties>(\n () => ({\n zIndex: 10,\n left: origin[0],\n top: origin[1],\n height: Math.abs(coords[1] - origin[1] - 1),\n width: Math.abs(coords[0] - origin[0] - 1),\n userSelect: 'none',\n transformOrigin: 'top left',\n transform: getTransform(origin, coords),\n position: 'fixed',\n backgroundColor: 'rgba(35, 131, 226, 0.14)',\n }),\n [origin, 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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"}