UNPKG

@atlaskit/editor-plugin-media

Version:

Media plugin for @atlaskit/editor-core

218 lines (217 loc) 7.33 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; /** @jsx jsx */ import { useRef, useState } from 'react'; import { jsx } from '@emotion/react'; import { BorderIcon } from '@atlaskit/editor-common/icons'; import { DropdownMenuSharedCssClassName } from '@atlaskit/editor-common/styles'; import { Popup } from '@atlaskit/editor-common/ui'; import { borderColorPalette, borderPaletteTooltipMessages, ColorPalette } from '@atlaskit/editor-common/ui-color'; import { ArrowKeyNavigationType, DropdownMenu, ToolbarButton } from '@atlaskit/editor-common/ui-menu'; import { hexToEditorBorderPaletteColor } from '@atlaskit/editor-palette'; import ExpandIcon from '@atlaskit/icon/glyph/chevron-down'; import Tooltip from '@atlaskit/tooltip'; import { messages } from './messages'; import { buttonStyle, buttonWrapperStyle, contextualMenuArrow, contextualMenuColorIcon, contextualSubMenu, itemSpacing, line, menuItemDimensions, toolbarButtonWrapper } from './styles'; var ImageBorder = function ImageBorder(_ref) { var formatMessage = _ref.intl.formatMessage, toggleBorder = _ref.toggleBorder, borderMark = _ref.borderMark, setBorder = _ref.setBorder; var popupTarget = useRef(null); var enabled = !!borderMark; var color = borderMark === null || borderMark === void 0 ? void 0 : borderMark.color; var size = borderMark === null || borderMark === void 0 ? void 0 : borderMark.size; var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), isOpen = _useState2[0], setIsOpen = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), isColorSubmenuOpen = _useState4[0], setIsColorSubmenuOpen = _useState4[1]; var _useState5 = useState(false), _useState6 = _slicedToArray(_useState5, 2), isSizeSubmenuOpen = _useState6[0], setIsSizeSubmenuOpen = _useState6[1]; var handleSubMenuRef = function handleSubMenuRef(ref) { if (!ref) { return; } var rect = ref.getBoundingClientRect(); if (rect.left + rect.width > window.innerWidth) { ref.style.left = "-".concat(rect.width, "px"); } }; var borderSizeOptions = [{ name: formatMessage(messages.borderSizeSubtle), value: 1 }, { name: formatMessage(messages.borderSizeMedium), value: 2 }, { name: formatMessage(messages.borderSizeBold), value: 3 }]; var items = [{ content: formatMessage(messages.borderColor), value: { name: 'color' }, elemAfter: jsx("div", { className: DropdownMenuSharedCssClassName.SUBMENU }, jsx("div", { css: contextualMenuColorIcon(color && hexToEditorBorderPaletteColor(color)) }), isColorSubmenuOpen && jsx("div", { css: contextualSubMenu(0), ref: handleSubMenuRef }, jsx(ColorPalette, { onClick: function onClick(color) { setBorder({ color: color }); setIsOpen(!isOpen); }, selectedColor: color !== null && color !== void 0 ? color : null, paletteOptions: { palette: borderColorPalette, paletteColorTooltipMessages: borderPaletteTooltipMessages, hexToPaletteColor: hexToEditorBorderPaletteColor } }))) }, { content: formatMessage(messages.borderSize), value: { name: 'size' }, elemAfter: jsx("div", { className: DropdownMenuSharedCssClassName.SUBMENU }, jsx("div", { css: contextualMenuArrow }), isSizeSubmenuOpen && jsx("div", { css: contextualSubMenu(1), ref: handleSubMenuRef }, borderSizeOptions.map(function (_ref2, idx) { var name = _ref2.name, value = _ref2.value; return jsx(Tooltip, { key: idx, content: name }, jsx("span", { css: buttonWrapperStyle }, jsx("button", { css: buttonStyle(value === size), "aria-label": name, role: "radio", "aria-checked": value === size, onClick: function onClick() { setBorder({ size: value }); setIsOpen(false); }, onMouseDown: function onMouseDown(e) { e.preventDefault(); } }, jsx("div", { css: line(value, value === size), role: "presentation" })))); }))) }]; /** * We want to change direction of our dropdowns a bit early, * not exactly when it hits the boundary. */ var fitTolerance = 10; var fitWidth = menuItemDimensions.width; var fitHeight = items.length * (menuItemDimensions.height + itemSpacing); return jsx("div", null, jsx("div", { css: toolbarButtonWrapper({ enabled: enabled, isOpen: isOpen }) }, jsx(ToolbarButton, { className: "image-border-toolbar-btn", selected: enabled, onClick: toggleBorder, spacing: "compact", "aria-label": enabled ? formatMessage(messages.removeBorder) : formatMessage(messages.addBorder), iconBefore: jsx(BorderIcon, { label: "" }), title: enabled ? formatMessage(messages.removeBorder) : formatMessage(messages.addBorder) }), jsx("div", { ref: popupTarget }, jsx(ToolbarButton, { className: "image-border-toolbar-dropdown", selected: enabled || isOpen, "aria-label": formatMessage(messages.borderOptions), title: formatMessage(messages.borderOptions), spacing: "compact", iconBefore: jsx(ExpandIcon, { label: "" }), onClick: function onClick() { setIsOpen(!isOpen); } }))), jsx(Popup, { target: popupTarget.current ? popupTarget.current : undefined, fitWidth: fitWidth + fitTolerance, fitHeight: fitHeight + fitTolerance, forcePlacement: true, stick: true }, jsx("div", { onMouseLeave: function onMouseLeave() { setIsColorSubmenuOpen(false); setIsSizeSubmenuOpen(false); } }, jsx(DropdownMenu //This needs be removed when the a11y is completely handled //Disabling key navigation now as it works only partially //Same with packages/editor/editor-plugin-table/src/plugins/table/ui/FloatingContextualMenu/ContextualMenu.tsx , { arrowKeyNavigationProviderOptions: { type: ArrowKeyNavigationType.MENU, disableArrowKeyNavigation: true }, items: [{ items: items }], isOpen: isOpen, onOpenChange: function onOpenChange() { setIsOpen(false); setIsColorSubmenuOpen(false); setIsSizeSubmenuOpen(false); }, onItemActivated: function onItemActivated(_ref3) { var item = _ref3.item; if (item.value.name === 'color') { setIsColorSubmenuOpen(!isColorSubmenuOpen); } if (item.value.name === 'size') { setIsSizeSubmenuOpen(!isSizeSubmenuOpen); } }, onMouseEnter: function onMouseEnter(_ref4) { var item = _ref4.item; if (item.value.name === 'color') { setIsColorSubmenuOpen(true); } if (item.value.name === 'size') { setIsSizeSubmenuOpen(true); } }, onMouseLeave: function onMouseLeave(_ref5) { var item = _ref5.item; if (item.value.name === 'color') { setIsColorSubmenuOpen(false); } if (item.value.name === 'size') { setIsSizeSubmenuOpen(false); } }, fitWidth: fitWidth + fitTolerance, fitHeight: fitHeight + fitTolerance })))); }; export default ImageBorder;