@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.
- package/dist/element-options/context/element-options-context.d.ts +1 -1
- package/dist/element-options.js +5 -18
- package/dist/floating-toolbar/floating-toolbar.d.ts.map +1 -1
- package/dist/floating-toolbar.js +1 -1
- package/dist/highlight-color-picker/highlight-color-picker.d.ts +1 -0
- package/dist/highlight-color-picker/highlight-color-picker.d.ts.map +1 -1
- package/dist/highlight-color-picker/index.d.ts +0 -1
- package/dist/highlight-color-picker/index.d.ts.map +1 -1
- package/dist/highlight-color-picker.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -4
- package/dist/action-menu-list.js.map +0 -1
- package/dist/block-dnd.js.map +0 -1
- package/dist/block-options.js.map +0 -1
- package/dist/chunks/_tslib-8f8de673.js +0 -36
- package/dist/chunks/_tslib-8f8de673.js.map +0 -1
- package/dist/chunks/floating-ui.react-727e4287.js +0 -5
- package/dist/chunks/floating-ui.react-d2303b03.js +0 -4506
- package/dist/chunks/floating-ui.react-d2303b03.js.map +0 -1
- package/dist/chunks/floating-ui.react-feaab622.js +0 -4506
- package/dist/chunks/floating-ui.react-feaab622.js.map +0 -1
- package/dist/chunks/highlight-color-picker-027fa4b4.js +0 -93
- package/dist/chunks/highlight-color-picker-027fa4b4.js.map +0 -1
- package/dist/chunks/highlight-color-picker-a1a292a9.js +0 -1
- package/dist/chunks/highlight-color-picker-a979e7a3.js +0 -93
- package/dist/chunks/highlight-color-picker-a979e7a3.js.map +0 -1
- package/dist/chunks/highlight-color-picker-ce0b19ac.js +0 -1
- package/dist/chunks/index-bfd2e7c4.js +0 -6
- package/dist/chunks/index-bfd2e7c4.js.map +0 -1
- package/dist/chunks/style-inject.es-746bb8ed.js +0 -29
- package/dist/chunks/style-inject.es-746bb8ed.js.map +0 -1
- package/dist/chunks/throttle-278836f4.js +0 -45
- package/dist/chunks/throttle-278836f4.js.map +0 -1
- package/dist/element-options.js.map +0 -1
- package/dist/floating-block-actions.js.map +0 -1
- package/dist/floating-toolbar.js.map +0 -1
- package/dist/highlight-color-picker.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/overlay.js.map +0 -1
- package/dist/portal.js.map +0 -1
- package/dist/selection-box.js.map +0 -1
- 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  - 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  - 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  - 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":";;;;;;;;;;;;;;;;;;;"}
|
package/dist/overlay.js.map
DELETED
|
@@ -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;;;;"}
|
package/dist/portal.js.map
DELETED
|
@@ -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":";;;;;;AAUA;AACA,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAuB,CAAC;AAE/D;AACA,MAAM,0BAA0B,GAAG,CAAC,QAAqB,KAAiB;IACxE,IAAI,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,0BAA0B,CAAgB,CAAC;IAExF,IAAI,CAAC,eAAe,EAAE;AACpB,QAAA,eAAe,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAChD,QAAA,eAAe,CAAC,SAAS,GAAG,yBAAyB,CAAC;AACtD,QAAA,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;AACtC,QAAA,mBAAmB,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAC7C,KAAA;AAED,IAAA,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,KAAY,KAAI;;AAC9B,IAAA,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;AACjC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACnD,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;;IAGpC,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE;QAC3C,SAAS,CAAC,OAAO,GAAG,0BAA0B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;;AAElE,QAAA,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC;QACrE,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;AAC9D,KAAA;;IAGD,eAAe,CAAC,MAAK;;AACnB,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ;YAAE,OAAO;;AAGtB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;AAC/D,YAAA,SAAS,CAAC,OAAO,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;AACzD,YAAA,MAAM,YAAY,GAAG,CAAA,EAAA,GAAA,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC;YACrE,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;YAC7D,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,SAAA;AAED,QAAA,OAAO,MAAK;;YACV,IAAI,SAAS,CAAC,OAAO,EAAE;;AAErB,gBAAA,MAAM,KAAK,GAAG,CAAA,EAAA,GAAA,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAC;AAC9D,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACxC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;;gBAGrD,IAAI,QAAQ,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE;AAClD,oBAAA,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;AAC3B,oBAAA,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC/C,iBAAA;AACD,gBAAA,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC1B,aAAA;AACH,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,SAAS,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI,CAAC;IAEpC,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,SAAS,CAAC,OAAO,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 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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"}
|