roosterjs
Version:
A simple facade for all roosterjs code
1,084 lines (1,011 loc) • 293 kB
JavaScript
var roosterjsReact;
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./packages/roosterjs-react/lib/colorPicker/component/renderColorPicker.tsx":
/*!**********************************************************************************!*\
!*** ./packages/roosterjs-react/lib/colorPicker/component/renderColorPicker.tsx ***!
\**********************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getColorPickerDropDown = exports.renderColorPicker = void 0;
var React = __webpack_require__(/*! react */ "react");
var backgroundColors_1 = __webpack_require__(/*! ../utils/backgroundColors */ "./packages/roosterjs-react/lib/colorPicker/utils/backgroundColors.ts");
var Styling_1 = __webpack_require__(/*! @fluentui/react/lib/Styling */ "@fluentui/react/lib/Theme");
var textColors_1 = __webpack_require__(/*! ../utils/textColors */ "./packages/roosterjs-react/lib/colorPicker/utils/textColors.ts");
var getClassNamesForColorPicker_1 = __webpack_require__(/*! ../utils/getClassNamesForColorPicker */ "./packages/roosterjs-react/lib/colorPicker/utils/getClassNamesForColorPicker.ts");
var classNames = (0, Styling_1.mergeStyleSets)({
colorSquare: {
width: '20px',
height: '20px',
margin: '4px',
borderStyle: 'solid',
borderWidth: '2px',
'&:hover': {
borderColor: 'red',
},
},
colorSquareBorder: {
borderColor: 'transparent',
},
colorSquareBorderWhite: {
borderColor: '#bebebe',
},
});
/**
* @internal
* Render a color picker
* @param item Color items
* @param colorDef Definition of colors
* @param onClick On click event handler
*/
function renderColorPicker(item, colorDef, onClick) {
var key = item.key;
var buttonColor = colorDef[key].lightModeColor;
return (React.createElement("button", { onClick: function (e) { return onClick(e, item); }, title: item.text },
React.createElement("div", { className: classNames.colorSquare +
' ' +
(key == 'textColorWhite' || key == 'backgroundColorWhite'
? classNames.colorSquareBorderWhite
: classNames.colorSquareBorder), style: {
backgroundColor: buttonColor,
} })));
}
exports.renderColorPicker = renderColorPicker;
/**
* Get a drop down data object of color picker used by drop down button
* @param colorSet The set of color, text or background
* @returns The color picker drop down for ribbon button
*/
function getColorPickerDropDown(colorSet) {
return {
items: colorSet == 'background' ? backgroundColors_1.BackgroundColorDropDownItems : textColors_1.TextColorDropDownItems,
itemClassName: (0, getClassNamesForColorPicker_1.getColorPickerItemClassName)(),
allowLivePreview: true,
itemRender: colorSet == 'background'
? function (item, onClick) { return renderColorPicker(item, backgroundColors_1.BackgroundColors, onClick); }
: function (item, onClick) { return renderColorPicker(item, textColors_1.TextColors, onClick); },
commandBarSubMenuProperties: {
className: (0, getClassNamesForColorPicker_1.getColorPickerContainerClassName)(),
},
};
}
exports.getColorPickerDropDown = getColorPickerDropDown;
/***/ }),
/***/ "./packages/roosterjs-react/lib/colorPicker/index.ts":
/*!***********************************************************!*\
!*** ./packages/roosterjs-react/lib/colorPicker/index.ts ***!
\***********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getColorPickerDropDown = exports.getTextColorValue = exports.getBackgroundColorValue = void 0;
var backgroundColors_1 = __webpack_require__(/*! ./utils/backgroundColors */ "./packages/roosterjs-react/lib/colorPicker/utils/backgroundColors.ts");
Object.defineProperty(exports, "getBackgroundColorValue", ({ enumerable: true, get: function () { return backgroundColors_1.getBackgroundColorValue; } }));
var textColors_1 = __webpack_require__(/*! ./utils/textColors */ "./packages/roosterjs-react/lib/colorPicker/utils/textColors.ts");
Object.defineProperty(exports, "getTextColorValue", ({ enumerable: true, get: function () { return textColors_1.getTextColorValue; } }));
var renderColorPicker_1 = __webpack_require__(/*! ./component/renderColorPicker */ "./packages/roosterjs-react/lib/colorPicker/component/renderColorPicker.tsx");
Object.defineProperty(exports, "getColorPickerDropDown", ({ enumerable: true, get: function () { return renderColorPicker_1.getColorPickerDropDown; } }));
/***/ }),
/***/ "./packages/roosterjs-react/lib/colorPicker/utils/backgroundColors.ts":
/*!****************************************************************************!*\
!*** ./packages/roosterjs-react/lib/colorPicker/utils/backgroundColors.ts ***!
\****************************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getBackgroundColorValue = exports.BackgroundColorDropDownItems = exports.BackgroundColors = void 0;
/**
* @internal
*/
var BackgroundColors = {
backgroundColorCyan: { lightModeColor: '#00ffff', darkModeColor: '#005357' },
backgroundColorGreen: { lightModeColor: '#00ff00', darkModeColor: '#005e00' },
backgroundColorYellow: { lightModeColor: '#ffff00', darkModeColor: '#383e00' },
backgroundColorOrange: { lightModeColor: '#ff8000', darkModeColor: '#bf4c00' },
backgroundColorRed: { lightModeColor: '#ff0000', darkModeColor: '#ff2711' },
backgroundColorMagenta: { lightModeColor: '#ff00ff', darkModeColor: '#e700e8' },
backgroundColorLightCyan: { lightModeColor: '#80ffff', darkModeColor: '#004c4f' },
backgroundColorLightGreen: { lightModeColor: '#80ff80', darkModeColor: '#005400' },
backgroundColorLightYellow: { lightModeColor: '#ffff80', darkModeColor: '#343c00' },
backgroundColorLightOrange: { lightModeColor: '#ffc080', darkModeColor: '#77480b' },
backgroundColorLightRed: { lightModeColor: '#ff8080', darkModeColor: '#bc454a' },
backgroundColorLightMagenta: { lightModeColor: '#ff80ff', darkModeColor: '#aa2bad' },
backgroundColorWhite: { lightModeColor: '#ffffff', darkModeColor: '#333333' },
backgroundColorLightGray: { lightModeColor: '#cccccc', darkModeColor: '#535353' },
backgroundColorGray: { lightModeColor: '#999999', darkModeColor: '#777777' },
backgroundColorDarkGray: { lightModeColor: '#666666', darkModeColor: '#a0a0a0' },
backgroundColorDarkerGray: { lightModeColor: '#333333', darkModeColor: '#cfcfcf' },
backgroundColorBlack: { lightModeColor: '#000000', darkModeColor: '#ffffff' },
};
exports.BackgroundColors = BackgroundColors;
/**
* @internal
* List of colors in drop down list
*/
var BackgroundColorDropDownItems = {
backgroundColorCyan: 'Cyan',
backgroundColorGreen: 'Green',
backgroundColorYellow: 'Yellow',
backgroundColorOrange: 'Orange',
backgroundColorRed: 'Red',
backgroundColorMagenta: 'Magenta',
backgroundColorLightCyan: 'Light cyan',
backgroundColorLightGreen: 'Light green',
backgroundColorLightYellow: 'Light yellow',
backgroundColorLightOrange: 'Light orange',
backgroundColorLightRed: 'Light red',
backgroundColorLightMagenta: 'Light magenta',
backgroundColorWhite: 'White',
backgroundColorLightGray: 'Light gray',
backgroundColorGray: 'Gray',
backgroundColorDarkGray: 'Dark gray',
backgroundColorDarkerGray: 'Darker gray',
backgroundColorBlack: 'Black',
};
exports.BackgroundColorDropDownItems = BackgroundColorDropDownItems;
/**
* Get mode independent color value of background color from the given color key
* @param key The key to get color from
* @returns A model independent color value of the given key
*/
function getBackgroundColorValue(key) {
return BackgroundColors[key];
}
exports.getBackgroundColorValue = getBackgroundColorValue;
/***/ }),
/***/ "./packages/roosterjs-react/lib/colorPicker/utils/getClassNamesForColorPicker.ts":
/*!***************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/colorPicker/utils/getClassNamesForColorPicker.ts ***!
\***************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getColorPickerItemClassName = exports.getColorPickerContainerClassName = void 0;
var Styling_1 = __webpack_require__(/*! @fluentui/react/lib/Styling */ "@fluentui/react/lib/Theme");
var classNames = (0, Styling_1.mergeStyleSets)({
colorPickerContainer: {
width: '192px',
padding: '8px',
overflow: 'hidden',
'& ul': {
width: '192px',
overflow: 'hidden',
},
},
colorMenuItem: {
display: 'inline-block',
width: '32px',
height: '32px',
'& button': {
padding: '0px',
minWidth: '0px',
background: 'transparent',
border: 'none',
},
},
});
/**
* @internal
*/
function getColorPickerContainerClassName() {
return classNames.colorPickerContainer;
}
exports.getColorPickerContainerClassName = getColorPickerContainerClassName;
/**
* @internal
*/
function getColorPickerItemClassName() {
return classNames.colorMenuItem;
}
exports.getColorPickerItemClassName = getColorPickerItemClassName;
/***/ }),
/***/ "./packages/roosterjs-react/lib/colorPicker/utils/textColors.ts":
/*!**********************************************************************!*\
!*** ./packages/roosterjs-react/lib/colorPicker/utils/textColors.ts ***!
\**********************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getTextColorValue = exports.TextColorDropDownItems = exports.TextColors = void 0;
/**
* @internal
*/
var TextColors = {
textColorLightBlue: { lightModeColor: '#51a7f9', darkModeColor: '#0075c2' },
textColorLightGreen: { lightModeColor: '#6fc040', darkModeColor: '#207a00' },
textColorLightYellow: { lightModeColor: '#f5d427', darkModeColor: '#5d4d00' },
textColorLightOrange: { lightModeColor: '#f3901d', darkModeColor: '#ab5500' },
textColorLightRed: { lightModeColor: '#ed5c57', darkModeColor: '#df504d' },
textColorLightPurple: { lightModeColor: '#b36ae2', darkModeColor: '#ab63da' },
textColorBlue: { lightModeColor: '#0c64c0', darkModeColor: '#6da0ff' },
textColorGreen: { lightModeColor: '#0c882a', darkModeColor: '#3da848' },
textColorYellow: { lightModeColor: '#dcbe22', darkModeColor: '#6d5c00' },
textColorOrange: { lightModeColor: '#de6a19', darkModeColor: '#d3610c' },
textColorRed: { lightModeColor: '#c82613', darkModeColor: '#ff6847' },
textColorPurple: { lightModeColor: '#763e9b', darkModeColor: '#d394f9' },
textColorDarkBlue: { lightModeColor: '#174e86', darkModeColor: '#93b8f9' },
textColorDarkGreen: { lightModeColor: '#0f5c1a', darkModeColor: '#7fc57b' },
textColorDarkYellow: { lightModeColor: '#c3971d', darkModeColor: '#946f00' },
textColorDarkOrange: { lightModeColor: '#be5b17', darkModeColor: '#de7633' },
textColorDarkRed: { lightModeColor: '#861106', darkModeColor: '#ff9b7c' },
textColorDarkPurple: { lightModeColor: '#5e327c', darkModeColor: '#dea9fd' },
textColorDarkerBlue: { lightModeColor: '#002451', darkModeColor: '#cedbff' },
textColorDarkerGreen: { lightModeColor: '#06400c', darkModeColor: '#a3da9b' },
textColorDarkerYellow: { lightModeColor: '#a37519', darkModeColor: '#b5852a' },
textColorDarkerOrange: { lightModeColor: '#934511', darkModeColor: '#ef935c' },
textColorDarkerRed: { lightModeColor: '#570606', darkModeColor: '#ffc0b1' },
textColorDarkerPurple: { lightModeColor: '#3b204d', darkModeColor: '#eecaff' },
textColorWhite: { lightModeColor: '#ffffff', darkModeColor: '#333333' },
textColorLightGray: { lightModeColor: '#cccccc', darkModeColor: '#535353' },
textColorGray: { lightModeColor: '#999999', darkModeColor: '#777777' },
textColorDarkGray: { lightModeColor: '#666666', darkModeColor: '#a0a0a0' },
textColorDarkerGray: { lightModeColor: '#333333', darkModeColor: '#cfcfcf' },
textColorBlack: { lightModeColor: '#000000', darkModeColor: '#ffffff' },
};
exports.TextColors = TextColors;
/**
* @internal
*/
var TextColorDropDownItems = {
textColorLightBlue: 'Light blue',
textColorLightGreen: 'Light green',
textColorLightYellow: 'Light yellow',
textColorLightOrange: 'Light orange',
textColorLightRed: 'Light red',
textColorLightPurple: 'Light purple',
textColorBlue: 'Blue',
textColorGreen: 'Green',
textColorYellow: 'Yellow',
textColorOrange: 'Orange',
textColorRed: 'Red',
textColorPurple: 'Purple',
textColorDarkBlue: 'Dark blue',
textColorDarkGreen: 'Dark green',
textColorDarkYellow: 'Dark yellow',
textColorDarkOrange: 'Dark orange',
textColorDarkRed: 'Dark red',
textColorDarkPurple: 'Dark purple',
textColorDarkerBlue: 'Darker blue',
textColorDarkerGreen: 'Darker green',
textColorDarkerYellow: 'Darker yellow',
textColorDarkerOrange: 'Darker orange',
textColorDarkerRed: 'Darker red',
textColorDarkerPurple: 'Darker purple',
textColorWhite: 'White',
textColorLightGray: 'Light gray',
textColorGray: 'Gray',
textColorDarkGray: 'Dark gray',
textColorDarkerGray: 'Darker gray',
textColorBlack: 'Black',
};
exports.TextColorDropDownItems = TextColorDropDownItems;
/**
* Get mode independent color value of text color from the given color key
* @param key The key to get color from
* @returns A model independent color value of the given key
*/
function getTextColorValue(key) {
return TextColors[key];
}
exports.getTextColorValue = getTextColorValue;
/***/ }),
/***/ "./packages/roosterjs-react/lib/common/index.ts":
/*!******************************************************!*\
!*** ./packages/roosterjs-react/lib/common/index.ts ***!
\******************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getLocalizedString = exports.createUIUtilities = void 0;
var createUIUtilities_1 = __webpack_require__(/*! ./utils/createUIUtilities */ "./packages/roosterjs-react/lib/common/utils/createUIUtilities.tsx");
Object.defineProperty(exports, "createUIUtilities", ({ enumerable: true, get: function () { return createUIUtilities_1.createUIUtilities; } }));
var getLocalizedString_1 = __webpack_require__(/*! ./utils/getLocalizedString */ "./packages/roosterjs-react/lib/common/utils/getLocalizedString.ts");
Object.defineProperty(exports, "getLocalizedString", ({ enumerable: true, get: function () { return getLocalizedString_1.getLocalizedString; } }));
/***/ }),
/***/ "./packages/roosterjs-react/lib/common/utils/createUIUtilities.tsx":
/*!*************************************************************************!*\
!*** ./packages/roosterjs-react/lib/common/utils/createUIUtilities.tsx ***!
\*************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createUIUtilities = void 0;
var React = __webpack_require__(/*! react */ "react");
var ReactDOM = __webpack_require__(/*! react-dom */ "react-dom");
var Theme_1 = __webpack_require__(/*! @fluentui/react/lib/Theme */ "@fluentui/react/lib/Theme");
var WindowProvider_1 = __webpack_require__(/*! @fluentui/react/lib/WindowProvider */ "@fluentui/react/lib/Theme");
/**
* Create the UI Utilities object for plugins to render additional react components
* @param container Container DIV of editor
* @param theme Current theme used by editor
* @returns A UIUtilities object
*/
function createUIUtilities(container, theme) {
return {
renderComponent: function (element) {
var doc = container.ownerDocument;
var div = doc.createElement('div');
doc.body.appendChild(div);
ReactDOM.render(React.createElement(WindowProvider_1.WindowProvider, { window: doc.defaultView },
React.createElement(Theme_1.ThemeProvider, { theme: theme }, element)), div);
return function () {
ReactDOM.unmountComponentAtNode(div);
doc.body.removeChild(div);
};
},
isRightToLeft: function () {
var _a;
var dir = container &&
((_a = container.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.getComputedStyle(container).direction);
return dir == 'rtl';
},
};
}
exports.createUIUtilities = createUIUtilities;
/***/ }),
/***/ "./packages/roosterjs-react/lib/common/utils/getLocalizedString.ts":
/*!*************************************************************************!*\
!*** ./packages/roosterjs-react/lib/common/utils/getLocalizedString.ts ***!
\*************************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getLocalizedString = void 0;
/**
* Get a localized string
* @param strings The LocalizedStrings map
* @param key Key of the string
* @param defaultString Default unlocalized string, will be used if strings is not specified or the give key doesn't exist in strings
* @returns A localized string from the string map, or defaultString
*/
function getLocalizedString(strings, key, defaultString) {
var str = strings === null || strings === void 0 ? void 0 : strings[key];
if (typeof str == 'function') {
return str();
}
else if (typeof str == 'string') {
return str;
}
else {
return defaultString;
}
}
exports.getLocalizedString = getLocalizedString;
/***/ }),
/***/ "./packages/roosterjs-react/lib/common/utils/renderReactComponent.ts":
/*!***************************************************************************!*\
!*** ./packages/roosterjs-react/lib/common/utils/renderReactComponent.ts ***!
\***************************************************************************/
/***/ ((__unused_webpack_module, exports) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.renderReactComponent = void 0;
/**
* @internal
*/
function renderReactComponent(uiUtilities, reactElement) {
if (uiUtilities) {
return uiUtilities.renderComponent(reactElement);
}
else {
throw new Error('UIUtilities is required but not provided. Please call ReactEditorPlugin.setUIUtilities() to set a valid uiUtilities object');
}
}
exports.renderReactComponent = renderReactComponent;
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/index.ts":
/*!***********************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/index.ts ***!
\***********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createTableEditMenuProvider = exports.createImageEditMenuProvider = exports.createListEditMenuProvider = exports.createContextMenuProvider = exports.createContextMenuPlugin = void 0;
var createContextMenuPlugin_1 = __webpack_require__(/*! ./plugin/createContextMenuPlugin */ "./packages/roosterjs-react/lib/contextMenu/plugin/createContextMenuPlugin.tsx");
Object.defineProperty(exports, "createContextMenuPlugin", ({ enumerable: true, get: function () { return createContextMenuPlugin_1.createContextMenuPlugin; } }));
var createContextMenuProvider_1 = __webpack_require__(/*! ./utils/createContextMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts");
Object.defineProperty(exports, "createContextMenuProvider", ({ enumerable: true, get: function () { return createContextMenuProvider_1.createContextMenuProvider; } }));
var createListEditMenuProvider_1 = __webpack_require__(/*! ./menus/createListEditMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/menus/createListEditMenuProvider.ts");
Object.defineProperty(exports, "createListEditMenuProvider", ({ enumerable: true, get: function () { return createListEditMenuProvider_1.createListEditMenuProvider; } }));
var createImageEditMenuProvider_1 = __webpack_require__(/*! ./menus/createImageEditMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/menus/createImageEditMenuProvider.tsx");
Object.defineProperty(exports, "createImageEditMenuProvider", ({ enumerable: true, get: function () { return createImageEditMenuProvider_1.createImageEditMenuProvider; } }));
var createTableEditMenuProvider_1 = __webpack_require__(/*! ./menus/createTableEditMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/menus/createTableEditMenuProvider.ts");
Object.defineProperty(exports, "createTableEditMenuProvider", ({ enumerable: true, get: function () { return createTableEditMenuProvider_1.createTableEditMenuProvider; } }));
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/menus/createImageEditMenuProvider.tsx":
/*!****************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/menus/createImageEditMenuProvider.tsx ***!
\****************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createImageEditMenuProvider = void 0;
var createContextMenuProvider_1 = __webpack_require__(/*! ../utils/createContextMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts");
var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "roosterjs-content-model-api");
var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "roosterjs-content-model-api");
var showInputDialog_1 = __webpack_require__(/*! ../../inputDialog/utils/showInputDialog */ "./packages/roosterjs-react/lib/inputDialog/utils/showInputDialog.tsx");
var MIN_WIDTH = 10;
var MIN_HEIGHT = 10;
var ImageAltTextMenuItem = {
key: 'menuNameImageAltText',
unlocalizedText: 'Add alternate text',
onClick: function (_, editor, node, strings, uiUtilities) {
var image = node;
var initValue = image.alt;
(0, showInputDialog_1.showInputDialog)(uiUtilities, 'menuNameImageAltText', 'Add alternate text', {
altText: {
labelKey: null,
unlocalizedLabel: null,
initValue: initValue,
},
}, strings).then(function (values) {
editor.focus();
editor.setDOMSelection({
type: 'image',
image: image,
});
if (values) {
(0, roosterjs_content_model_api_1.setImageAltText)(editor, values.altText);
}
});
},
};
var sizeMap = {
menuNameImageSizeBestFit: 0,
menuNameImageSizeSmall: 0.25,
menuNameImageSizeMedium: 0.5,
menuNameImageSizeOriginal: 1,
};
var ImageResizeMenuItem = {
key: 'menuNameImageResize',
unlocalizedText: 'Size',
subItems: {
menuNameImageSizeBestFit: 'Best fit',
menuNameImageSizeSmall: 'Small',
menuNameImageSizeMedium: 'Medium',
menuNameImageSizeOriginal: 'Original',
},
onClick: function (key, editor, _) {
var _a;
var selection = editor.getDOMSelection();
if (!selection || selection.type !== 'image') {
return;
}
var percentage = (_a = sizeMap[key]) !== null && _a !== void 0 ? _a : 0;
if (percentage > 0) {
var _b = selection.image, naturalWidth = _b.naturalWidth, naturalHeight = _b.naturalHeight;
resizeByPercentage(editor, percentage, naturalWidth, naturalHeight);
}
else {
resetImage(editor);
}
},
};
var ImageRotateMenuItem = {
key: 'menuNameImageRotate',
unlocalizedText: 'Rotate image',
subItems: {
menuNameImageRotateLeft: 'Left',
menuNameImageRotateRight: 'Right',
},
shouldShow: function (_, node, imageEditor) {
return (!!(imageEditor === null || imageEditor === void 0 ? void 0 : imageEditor.isOperationAllowed('rotate')) &&
imageEditor.canRegenerateImage(node));
},
onClick: function (key, _editor, _node, _strings, _uiUtilities, imageEdit) {
switch (key) {
case 'menuNameImageRotateLeft':
imageEdit === null || imageEdit === void 0 ? void 0 : imageEdit.rotateImage(-Math.PI / 2);
break;
case 'menuNameImageRotateRight':
imageEdit === null || imageEdit === void 0 ? void 0 : imageEdit.rotateImage(Math.PI / 2);
break;
}
},
};
var ImageFlipMenuItem = {
key: 'menuNameImageFlip',
unlocalizedText: 'Flip image',
subItems: {
menuNameImageRotateFlipHorizontally: 'Flip Horizontally',
menuNameImageRotateFlipVertically: 'Flip Vertically',
},
shouldShow: function (_, node, imageEditor) {
return (!!(imageEditor === null || imageEditor === void 0 ? void 0 : imageEditor.isOperationAllowed('rotate')) &&
imageEditor.canRegenerateImage(node));
},
onClick: function (key, _editor, _node, _strings, _uiUtilities, imageEdit) {
switch (key) {
case 'menuNameImageRotateFlipHorizontally':
imageEdit === null || imageEdit === void 0 ? void 0 : imageEdit.flipImage('horizontal');
break;
case 'menuNameImageRotateFlipVertically':
imageEdit === null || imageEdit === void 0 ? void 0 : imageEdit.flipImage('vertical');
break;
}
},
};
var ImageCropMenuItem = {
key: 'menuNameImageCrop',
unlocalizedText: 'Crop image',
shouldShow: function (_, node, imageEditor) {
return (!!(imageEditor === null || imageEditor === void 0 ? void 0 : imageEditor.isOperationAllowed('crop')) &&
imageEditor.canRegenerateImage(node));
},
onClick: function (_, _editor, _node, _strings, _uiUtilities, imageEdit) {
imageEdit === null || imageEdit === void 0 ? void 0 : imageEdit.cropImage();
},
};
var ImageRemoveMenuItem = {
key: 'menuNameImageRemove',
unlocalizedText: 'Remove image',
onClick: function (_, editor, node) {
removeImage(editor);
},
};
var ImageCopyMenuItem = {
key: 'menuNameImageCopy',
unlocalizedText: 'Copy image',
onClick: function (_, editor) {
var _a;
(_a = editor.getDocument()) === null || _a === void 0 ? void 0 : _a.execCommand('copy');
},
};
var ImageCutMenuItem = {
key: 'menuNameImageCut',
unlocalizedText: 'Cut image',
onClick: function (_, editor) {
var _a;
(_a = editor.getDocument()) === null || _a === void 0 ? void 0 : _a.execCommand('cut');
},
};
function shouldShowImageEditItems(editor, _) {
var selection = editor.getDOMSelection();
return (selection === null || selection === void 0 ? void 0 : selection.type) === 'image' && !!selection.image;
}
/**
* Create a new instance of ContextMenuProvider to support image editing functionalities in context menu
* @returns A new ContextMenuProvider
*/
function createImageEditMenuProvider(imageEditor, strings) {
return (0, createContextMenuProvider_1.createContextMenuProvider)('imageEdit', [
ImageAltTextMenuItem,
ImageResizeMenuItem,
ImageCropMenuItem,
ImageRemoveMenuItem,
ImageRotateMenuItem,
ImageFlipMenuItem,
ImageCopyMenuItem,
ImageCutMenuItem,
], strings, shouldShowImageEditItems, imageEditor);
}
exports.createImageEditMenuProvider = createImageEditMenuProvider;
function removeImage(editor) {
editor.formatContentModel(function (model) {
var changed = false;
(0, roosterjs_content_model_dom_1.iterateSelections)(model, function (_, __, block, segments) {
segments === null || segments === void 0 ? void 0 : segments.forEach(function (segment) {
if (segment.segmentType == 'Image' && (block === null || block === void 0 ? void 0 : block.blockType) == 'Paragraph') {
var index = block.segments.indexOf(segment);
if (index >= 0) {
(0, roosterjs_content_model_dom_1.mutateBlock)(block).segments.splice(index, 1);
changed = true;
}
}
});
});
return changed;
}, {
apiName: 'DeleteImage',
});
}
function resizeByPercentage(editor, percentage, naturalWidth, naturalHeight) {
(0, roosterjs_content_model_api_1.formatImageWithContentModel)(editor, 'resizeImage', function (segment) {
(0, roosterjs_content_model_dom_1.updateImageMetadata)(segment, function (format) {
var validFormat = Object.assign({
naturalWidth: naturalWidth,
naturalHeight: naturalHeight,
leftPercent: 0,
rightPercent: 0,
topPercent: 0,
bottomPercent: 0,
angleRad: 0,
}, format);
var newWidth = Math.max(MIN_WIDTH, validFormat.naturalWidth *
(1 - validFormat.leftPercent - validFormat.rightPercent) *
percentage);
var newHeight = Math.max(MIN_HEIGHT, validFormat.naturalHeight *
(1 - validFormat.topPercent - validFormat.bottomPercent) *
percentage);
validFormat.widthPx = newWidth;
validFormat.heightPx = newHeight;
segment.format.width = newWidth + 'px';
segment.format.height = newHeight + 'px';
return validFormat;
});
});
}
function resetImage(editor) {
(0, roosterjs_content_model_api_1.formatImageWithContentModel)(editor, 'resizeImage', function (segment) {
(0, roosterjs_content_model_dom_1.updateImageMetadata)(segment, function () { return null; });
delete segment.format.width;
delete segment.format.height;
segment.format.maxWidth = '100%';
});
}
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/menus/createListEditMenuProvider.ts":
/*!**************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/menus/createListEditMenuProvider.ts ***!
\**************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createListEditMenuProvider = void 0;
var createContextMenuProvider_1 = __webpack_require__(/*! ../utils/createContextMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts");
var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "roosterjs-content-model-api");
var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "roosterjs-content-model-api");
var showInputDialog_1 = __webpack_require__(/*! ../../inputDialog/utils/showInputDialog */ "./packages/roosterjs-react/lib/inputDialog/utils/showInputDialog.tsx");
var ListNumberResetMenuItem = {
key: 'menuNameListNumberReset',
unlocalizedText: 'Restart at 1',
onClick: function (_, editor, node) {
(0, roosterjs_content_model_api_1.setListStartNumber)(editor, 1);
},
};
var ListNumberEditMenuItem = {
key: 'menuNameListNumberEdit',
unlocalizedText: 'Set numbering value',
onClick: function (_, editor, node, strings, uiUtilities) {
var listAndLi = getEditingList(editor, node);
if (listAndLi) {
var list = listAndLi.list, li = listAndLi.li;
var startNumber_1 = list.start;
for (var child = list.firstChild; child; child = child.nextSibling) {
if (child === li) {
break;
}
else if ((0, roosterjs_content_model_dom_1.isNodeOfType)(child, 'ELEMENT_NODE') && (0, roosterjs_content_model_dom_1.isElementOfType)(child, 'li')) {
startNumber_1 += 1;
}
}
(0, showInputDialog_1.showInputDialog)(uiUtilities, 'menuNameListNumberEdit', 'Set numbering value', {
value: {
labelKey: 'dialogTextSetListNumber',
unlocalizedLabel: 'Set value to',
initValue: startNumber_1.toString(),
},
}, strings).then(function (values) {
editor.focus();
if (values) {
var result = parseInt(values.value);
if (result > 0 && result != startNumber_1) {
(0, roosterjs_content_model_api_1.setListStartNumber)(editor, Math.floor(result));
}
}
});
}
},
};
function getEditingList(editor, node) {
var domHelper = editor.getDOMHelper();
var li = domHelper.findClosestElementAncestor(node, 'LI');
var list = li && domHelper.findClosestElementAncestor(li, 'ol');
return (list === null || list === void 0 ? void 0 : list.isContentEditable) ? { list: list, li: li } : null;
}
/**
* Create a new instance of ContextMenuProvider to support list number editing functionalities in context menu
* @returns A new ContextMenuProvider
*/
function createListEditMenuProvider(strings) {
return (0, createContextMenuProvider_1.createContextMenuProvider)('listEdit', [ListNumberResetMenuItem, ListNumberEditMenuItem], strings, function (editor, node) { return !!getEditingList(editor, node); });
}
exports.createListEditMenuProvider = createListEditMenuProvider;
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/menus/createTableEditMenuProvider.ts":
/*!***************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/menus/createTableEditMenuProvider.ts ***!
\***************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createTableEditMenuProvider = void 0;
var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
var createContextMenuProvider_1 = __webpack_require__(/*! ../utils/createContextMenuProvider */ "./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts");
var roosterjs_content_model_api_1 = __webpack_require__(/*! roosterjs-content-model-api */ "roosterjs-content-model-api");
var renderColorPicker_1 = __webpack_require__(/*! ../../colorPicker/component/renderColorPicker */ "./packages/roosterjs-react/lib/colorPicker/component/renderColorPicker.tsx");
var getClassNamesForColorPicker_1 = __webpack_require__(/*! ../../colorPicker/utils/getClassNamesForColorPicker */ "./packages/roosterjs-react/lib/colorPicker/utils/getClassNamesForColorPicker.ts");
var backgroundColors_1 = __webpack_require__(/*! ../../colorPicker/utils/backgroundColors */ "./packages/roosterjs-react/lib/colorPicker/utils/backgroundColors.ts");
var TableEditOperationMap = {
menuNameTableInsertAbove: 'insertAbove',
menuNameTableInsertBelow: 'insertBelow',
menuNameTableInsertLeft: 'insertLeft',
menuNameTableInsertRight: 'insertRight',
menuNameTableDeleteTable: 'deleteTable',
menuNameTableDeleteColumn: 'deleteColumn',
menuNameTableDeleteRow: 'deleteRow',
menuNameTableMergeAbove: 'mergeAbove',
menuNameTableMergeBelow: 'mergeBelow',
menuNameTableMergeLeft: 'mergeLeft',
menuNameTableMergeRight: 'mergeRight',
menuNameTableMergeCells: 'mergeCells',
menuNameTableSplitHorizontally: 'splitHorizontally',
menuNameTableSplitVertically: 'splitVertically',
menuNameTableAlignLeft: 'alignCellLeft',
menuNameTableAlignCenter: 'alignCellCenter',
menuNameTableAlignRight: 'alignCellRight',
menuNameTableAlignTop: 'alignCellTop',
menuNameTableAlignMiddle: 'alignCellMiddle',
menuNameTableAlignBottom: 'alignCellBottom',
menuNameTableAlignTableLeft: 'alignLeft',
menuNameTableAlignTableCenter: 'alignCenter',
menuNameTableAlignTableRight: 'alignRight',
};
var ColorValues = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, backgroundColors_1.BackgroundColors), {
// Add this value to satisfy compiler
menuNameTableCellShade: null });
function onClick(key, editor) {
var operation = TableEditOperationMap[key];
if (operation) {
(0, roosterjs_content_model_api_1.editTable)(editor, operation);
}
}
var TableEditInsertMenuItem = {
key: 'menuNameTableInsert',
unlocalizedText: 'Insert',
subItems: {
menuNameTableInsertAbove: 'Insert above',
menuNameTableInsertBelow: 'Insert below',
menuNameTableInsertLeft: 'Insert left',
menuNameTableInsertRight: 'Insert right',
},
onClick: onClick,
};
var TableEditDeleteMenuItem = {
key: 'menuNameTableDelete',
unlocalizedText: 'Delete',
subItems: {
menuNameTableDeleteColumn: 'Delete column',
menuNameTableDeleteRow: 'Delete row',
menuNameTableDeleteTable: 'Delete table',
},
onClick: onClick,
};
var TableEditMergeMenuItem = {
key: 'menuNameTableMerge',
unlocalizedText: 'Merge',
subItems: {
menuNameTableMergeAbove: 'Merge above',
menuNameTableMergeBelow: 'Merge below',
menuNameTableMergeLeft: 'Merge left',
menuNameTableMergeRight: 'Merge right',
'-': '-',
menuNameTableMergeCells: 'Merge selected cells',
},
onClick: onClick,
};
var TableEditSplitMenuItem = {
key: 'menuNameTableSplit',
unlocalizedText: 'Split',
subItems: {
menuNameTableSplitHorizontally: 'Split horizontally',
menuNameTableSplitVertically: 'Split vertically',
},
onClick: onClick,
};
var TableEditAlignMenuItem = {
key: 'menuNameTableAlign',
unlocalizedText: 'Align cell',
subItems: {
menuNameTableAlignLeft: 'Align left',
menuNameTableAlignCenter: 'Align center',
menuNameTableAlignRight: 'Align right',
'-': '-',
menuNameTableAlignTop: 'Align top',
menuNameTableAlignMiddle: 'Align middle',
menuNameTableAlignBottom: 'Align bottom',
},
onClick: onClick,
};
var TableEditAlignTableMenuItem = {
key: 'menuNameTableAlignTable',
unlocalizedText: 'Align table',
subItems: {
menuNameTableAlignTableLeft: 'Align left',
menuNameTableAlignTableCenter: 'Align center',
menuNameTableAlignTableRight: 'Align right',
},
onClick: onClick,
};
var TableEditCellShadeMenuItem = {
key: 'menuNameTableCellShade',
unlocalizedText: 'Shading',
subItems: backgroundColors_1.BackgroundColorDropDownItems,
onClick: function (key, editor) {
(0, roosterjs_content_model_api_1.setTableCellShade)(editor, ColorValues[key].lightModeColor);
},
itemRender: function (item, click) { return (0, renderColorPicker_1.renderColorPicker)(item, ColorValues, click); },
itemClassName: (0, getClassNamesForColorPicker_1.getColorPickerItemClassName)(),
commandBarSubMenuProperties: {
className: (0, getClassNamesForColorPicker_1.getColorPickerContainerClassName)(),
},
};
function getEditingTable(editor, node) {
var domHelper = editor.getDOMHelper();
var td = domHelper.findClosestElementAncestor(node, 'TD,TH');
var table = td && domHelper.findClosestElementAncestor(td, 'table');
return (table === null || table === void 0 ? void 0 : table.isContentEditable) ? { table: table, td: td } : null;
}
/**
* Create a new instance of ContextMenuProvider to support table editing functionalities in context menu
* @returns A new ContextMenuProvider
*/
function createTableEditMenuProvider(strings) {
return (0, createContextMenuProvider_1.createContextMenuProvider)('tableEdit', [
TableEditInsertMenuItem,
TableEditDeleteMenuItem,
TableEditMergeMenuItem,
TableEditSplitMenuItem,
TableEditAlignMenuItem,
TableEditAlignTableMenuItem,
TableEditCellShadeMenuItem,
], strings, function (editor, node) { return !!getEditingTable(editor, node); });
}
exports.createTableEditMenuProvider = createTableEditMenuProvider;
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/plugin/createContextMenuPlugin.tsx":
/*!*************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/plugin/createContextMenuPlugin.tsx ***!
\*************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createContextMenuPlugin = void 0;
var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
var React = __webpack_require__(/*! react */ "react");
var roosterjs_content_model_plugins_1 = __webpack_require__(/*! roosterjs-content-model-plugins */ "roosterjs-content-model-api");
var ContextualMenu_1 = __webpack_require__(/*! @fluentui/react/lib/ContextualMenu */ "@fluentui/react/lib/Theme");
var renderReactComponent_1 = __webpack_require__(/*! ../../common/utils/renderReactComponent */ "./packages/roosterjs-react/lib/common/utils/renderReactComponent.ts");
function normalizeItems(items) {
var dividerKey = 0;
return items.map(function (item) {
return item || {
name: '-',
key: 'divider_' + (dividerKey++).toString(),
};
});
}
var ContextMenuPlugin = /** @class */ (function (_super) {
(0, tslib_1.__extends)(ContextMenuPlugin, _super);
function ContextMenuPlugin() {
var _this = _super.call(this, {
render: function (container, items, onDismiss) {
var normalizedItems = normalizeItems(items);
if (normalizedItems.length > 0) {
_this.disposer = (0, renderReactComponent_1.renderReactComponent)(_this.uiUtilities, React.createElement(ContextualMenu_1.ContextualMenu, { target: container, onDismiss: onDismiss, items: normalizedItems }));
}
},
dismiss: function (_) {
var _a;
(_a = _this.disposer) === null || _a === void 0 ? void 0 : _a.call(_this);
_this.disposer = null;
},
}) || this;
_this.uiUtilities = null;
_this.disposer = null;
return _this;
}
ContextMenuPlugin.prototype.setUIUtilities = function (uiUtilities) {
this.uiUtilities = uiUtilities;
};
return ContextMenuPlugin;
}(roosterjs_content_model_plugins_1.ContextMenuPluginBase));
/**
* Create a new instance of ContextMenu plugin with context menu implementation based on FluentUI.
*/
function createContextMenuPlugin() {
return new ContextMenuPlugin();
}
exports.createContextMenuPlugin = createContextMenuPlugin;
/***/ }),
/***/ "./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts":
/*!*************************************************************************************!*\
!*** ./packages/roosterjs-react/lib/contextMenu/utils/createContextMenuProvider.ts ***!
\*************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.createContextMenuProvider = void 0;
var tslib_1 = __webpack_require__(/*! tslib */ "./node_modules/tslib/tslib.es6.mjs");
var getLocalizedString_1 = __webpack_require__(/*! ../../common/utils/getLocalizedString */ "./packages/roosterjs-react/lib/common/utils/getLocalizedString.ts");
var roosterjs_content_model_dom_1 = __webpack_require__(/*! roosterjs-content-model-dom */ "roosterjs-content-model-api");
/**
* A plugin of editor to provide context menu items
*/
var ContextMenuProviderImpl = /** @class */ (function () {
/**
* Create a new instance of ContextMenuProviderImpl class
* @param menuName Name of this group of menus
* @param items Menu items that will be show
* @param strings Localized strings of these menu items
* @param shouldAddMenuItems A general checker to decide if we should add this group of menu items
*/
function ContextMenuProviderImpl(menuName, items, strings, shouldAddMenuItems, context) {
this.menuName = menuName;
this.items = items;
this.strings = strings;
this.shouldAddMenuItems = shouldAddMenuItems;
this.context = context;
this.editor = null;
this.targetNode = null;
this.uiUtilities = null;
}
/**
* Get a friendly name of this plugin
*/
ContextMenuProviderImpl.prototype.getName = function () {
return this.menuName;
};
/**
* Initialize this plugin. This should only be called from Editor
* @param editor Editor instance
*/
ContextMenuProviderImpl.prototype.initialize = function (editor) {
this.editor = editor;
};
/**
* Dispose this plugin
*/
ContextMenuProviderImpl.prototype.dispose = function () {
this.editor = null;
};
ContextMenuProviderImpl.prototype.getContextMenuItems = function (node) {
var _this = this;
var _a;
var editor = this.editor;
this.targetNode = node;
return editor && ((_a = this.shouldAddMenuItems) === null || _a === void 0 ? void 0 : _a.call(this, editor, node))
? this.items
.filter(function (item) { return !item.shouldShow || item.shouldShow(editor, node, _this.context); })
.map(function (item) { return _this.convertMenuItems(item, node); })
: [];
};
ContextMenuProviderImpl.prototype.setUIUtilities = function (uiUtilities) {
this.uiUtilities = uiUtilities;
};
ContextMenuProviderImpl.prototype.convertMenuItems = function (item, node) {
var _this = this;
var _a;
var selectedId = this.editor && ((_a = item.getSelectedId) === null || _a === void 0 ? void 0 : _a.call(item, this.editor, node));
return {
key: item.key,
data: item,
text: (0, getLocalizedString_1.getLocalizedString)(this.strings, item.key, item.unlocalizedText),
ariaLabel: (0, getLocalizedString_1.getLocalizedString)(this.strings, item.key, item.unlocalizedText),
onClick: function () { return _this.onClick(item, item.key); },
iconProps: item.iconProps,
subMenuProps: item.subItems
? (0, tslib_1.__assign)({ onItemClick: function (_, menuItem) { return menuItem && _this.onClick(item, menuItem.data); }, items: (0, roosterjs_content_model_dom_1.getObjectKeys)(item.subItems).map(function (key) {
var _a;
return ({
key: key,
data: key,
text: (0, getLocalizedString_1.getLocalizedString)(_this.strings, key, (_a = item.subItems) === null || _a === void 0 ? void 0 : _a[key]),
className: item.itemClassName,
onRender: item.itemRender
? function (subItem) { var _a; return (_a = item.itemRender) === null || _a === void 0 ? void 0 : _a.call(item, subItem, function () { return _this.onClick(item, key); }); }
: undefined,
iconProps: key == selectedId
? {
iconName: 'Checkmark',
}
: undefined,
});
}) }, (item.commandBarSubMenuProperties || {})) : undefined,
};
};
ContextMenuProviderImpl.prototype.onClick = function (item, key) {
if (this.editor && this.targetNode && this.uiUtilities) {
item.onClick(key, this.editor, this.targetNode, this.strings, this.uiUtilities, this.context);
}
};
return ContextMenuProviderImpl;
}());
/**
* Create a new instance of ContextMenuProviderImpl class
* @param menuName Name of this group of menus
* @param items Menu items that will be show
* @param strings Localized strings of these menu items
* @param shouldAddMenuItems A general checker to decide if we should add this group of menu items
*/
function createContextMenuProvider(menuName, items, strings, shouldAddMenuItems, context) {
return new ContextMenuProviderImpl(menuName, items, strings, shouldAddMenuItems, context);
}
exports.createContextMenuProvider = createConte