@manuscripts/style-guide 2.0.36-LEAN-4311.2 → 2.1.0

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.
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ /*!
3
+ * © 2025 Atypon Systems LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.DraggableModal = void 0;
45
+ const react_1 = __importStar(require("react"));
46
+ const styled_components_1 = __importDefault(require("styled-components"));
47
+ const StyledModal_1 = require("./StyledModal");
48
+ const DraggableModal = ({ children, isOpen, onRequestClose }) => {
49
+ const [pos, setPos] = (0, react_1.useState)({ left: 0, top: 0, prevX: 0, prevY: 0 });
50
+ const [drag, setDrag] = (0, react_1.useState)(false);
51
+ const mouseDown = (event) => {
52
+ if (event.target instanceof Element &&
53
+ (event.target.tagName === 'INPUT' || event.target.tagName === 'BUTTON')) {
54
+ return;
55
+ }
56
+ pos.prevX = event.screenX;
57
+ pos.prevY = event.screenY;
58
+ setPos((state) => (Object.assign(Object.assign({}, state), { prevX: event.screenX, prevY: event.screenY })));
59
+ setDrag(true);
60
+ };
61
+ const mouseMove = (0, react_1.useCallback)(function (event) {
62
+ if (!drag) {
63
+ return;
64
+ }
65
+ const left = pos.left + event.screenX - pos.prevX;
66
+ const top = pos.top + event.screenY - pos.prevY;
67
+ setPos((state) => (Object.assign(Object.assign({}, state), { left,
68
+ top, prevX: event.screenX, prevY: event.screenY })));
69
+ }, [pos, drag]);
70
+ (0, react_1.useEffect)(() => {
71
+ const mouseup = () => {
72
+ setDrag(false);
73
+ };
74
+ document.addEventListener('mouseup', mouseup);
75
+ return () => {
76
+ document.removeEventListener('mouseup', mouseup);
77
+ };
78
+ }, []);
79
+ return (react_1.default.createElement(StyledModal_1.StyledModal, { isOpen: isOpen, onRequestClose: onRequestClose, shouldCloseOnOverlayClick: false, pointerEventsOnBackdrop: "none", style: {
80
+ content: {
81
+ left: pos.left + 'px',
82
+ top: pos.top + 'px',
83
+ transition: 'none',
84
+ },
85
+ } },
86
+ react_1.default.createElement(DraggableModalContainer, { onMouseDown: mouseDown, onMouseMove: mouseMove, "data-cy": "find-replace-modal" }, children)));
87
+ };
88
+ exports.DraggableModal = DraggableModal;
89
+ const DraggableModalContainer = (0, styled_components_1.default)(StyledModal_1.ModalContainer) `
90
+ padding: 0 2rem 2rem 2rem;
91
+ `;
@@ -58,7 +58,6 @@ exports.NestedSubmenusContainer = (0, styled_components_1.default)(exports.Subme
58
58
  position: absolute;
59
59
  top: 0;
60
60
  left: 100%;
61
- overflow: visible;
62
61
  `;
63
62
  const Separator = styled_components_1.default.div `
64
63
  height: 0;
@@ -40,6 +40,10 @@ const transitionDelay = 300;
40
40
  const delayedTransitionTime = totalTransitionTime - transitionDelay;
41
41
  const ReactModalAdapter = (_a) => {
42
42
  var { className, modalClassName } = _a, props = __rest(_a, ["className", "modalClassName"]);
43
+ props.style = props.style || {};
44
+ if (props.pointerEventsOnBackdrop == 'none') {
45
+ props.style.content = Object.assign(Object.assign({}, props.style.content), { pointerEvents: 'all' });
46
+ }
43
47
  return (react_1.default.createElement(react_modal_1.default, Object.assign({ className: modalClassName, portalClassName: className, closeTimeoutMS: totalTransitionTime, preventScroll: true, appElement: document.getElementById('root') }, props)));
44
48
  };
45
49
  exports.ModalContainer = styled_components_1.default.div `
@@ -137,12 +141,15 @@ exports.StyledModal = (0, styled_components_1.default)(ReactModalAdapter).attrs(
137
141
  left: 0;
138
142
  right: 0;
139
143
  bottom: 0;
140
- background-color: ${(props) => props.theme.colors.background.dark};
144
+ background-color: ${(props) => props.pointerEventsOnBackdrop === 'none'
145
+ ? 'rgba(0,0,0,0.1)'
146
+ : props.theme.colors.background.dark};
141
147
  z-index: 1000;
142
148
  display: flex;
143
149
  justify-content: center;
144
150
  align-items: center;
145
151
  opacity: 0;
152
+ pointer-events: ${(props) => props.pointerEventsOnBackdrop || 'auto'};
146
153
 
147
154
  &--after-open {
148
155
  transition: opacity ${totalTransitionTime}ms ease-in-out;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMenus = void 0;
4
4
  const react_1 = require("react");
5
5
  const menus_1 = require("../lib/menus");
6
- const initialPointer = [-1, -1, -1, -1];
6
+ const initialPointer = [-1, -1, -1];
7
7
  const transformPointer = (depth, index) => (pointer) => pointer.map((pointerPart, i) => {
8
8
  if (i === depth) {
9
9
  return index;
@@ -14,8 +14,7 @@ const transformPointer = (depth, index) => (pointer) => pointer.map((pointerPart
14
14
  return pointerPart;
15
15
  });
16
16
  const isPart = (pointer, position) => {
17
- const max = initialPointer.length;
18
- const limit = position.length < max ? position.length : max;
17
+ const limit = position.length < 3 ? position.length : 3;
19
18
  for (let i = 0; i < limit; i++) {
20
19
  if (position[i] !== pointer[i]) {
21
20
  return false;
@@ -61,7 +60,7 @@ const useMenus = (menus) => {
61
60
  }
62
61
  if (menu.run) {
63
62
  menu.run();
64
- setPointer(initialPointer);
63
+ setPointer([-1, -1, -1]);
65
64
  }
66
65
  else if (menu.submenu) {
67
66
  const depth = indices.length - 1;
@@ -73,7 +72,7 @@ const useMenus = (menus) => {
73
72
  (0, react_1.useEffect)(() => {
74
73
  const handleClickOutside = (event) => {
75
74
  if (ref.current && !ref.current.contains(event.target)) {
76
- setPointer(initialPointer);
75
+ setPointer([-1, -1, -1]);
77
76
  }
78
77
  };
79
78
  document.addEventListener('click', handleClickOutside);
package/dist/cjs/index.js CHANGED
@@ -40,6 +40,7 @@ __exportStar(require("./components/RadioButton"), exports);
40
40
  __exportStar(require("./components/AutoSaveInput"), exports);
41
41
  __exportStar(require("./components/Avatar"), exports);
42
42
  __exportStar(require("./components/Dialog"), exports);
43
+ __exportStar(require("./components/DraggableModal"), exports);
43
44
  __exportStar(require("./components/Checkbox"), exports);
44
45
  __exportStar(require("./components/Form"), exports);
45
46
  __exportStar(require("./components/MultiValueInput"), exports);
@@ -0,0 +1,61 @@
1
+ /*!
2
+ * © 2025 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import React, { useCallback, useEffect, useState } from 'react';
17
+ import styled from 'styled-components';
18
+ import { ModalContainer, StyledModal } from './StyledModal';
19
+ export const DraggableModal = ({ children, isOpen, onRequestClose }) => {
20
+ const [pos, setPos] = useState({ left: 0, top: 0, prevX: 0, prevY: 0 });
21
+ const [drag, setDrag] = useState(false);
22
+ const mouseDown = (event) => {
23
+ if (event.target instanceof Element &&
24
+ (event.target.tagName === 'INPUT' || event.target.tagName === 'BUTTON')) {
25
+ return;
26
+ }
27
+ pos.prevX = event.screenX;
28
+ pos.prevY = event.screenY;
29
+ setPos((state) => (Object.assign(Object.assign({}, state), { prevX: event.screenX, prevY: event.screenY })));
30
+ setDrag(true);
31
+ };
32
+ const mouseMove = useCallback(function (event) {
33
+ if (!drag) {
34
+ return;
35
+ }
36
+ const left = pos.left + event.screenX - pos.prevX;
37
+ const top = pos.top + event.screenY - pos.prevY;
38
+ setPos((state) => (Object.assign(Object.assign({}, state), { left,
39
+ top, prevX: event.screenX, prevY: event.screenY })));
40
+ }, [pos, drag]);
41
+ useEffect(() => {
42
+ const mouseup = () => {
43
+ setDrag(false);
44
+ };
45
+ document.addEventListener('mouseup', mouseup);
46
+ return () => {
47
+ document.removeEventListener('mouseup', mouseup);
48
+ };
49
+ }, []);
50
+ return (React.createElement(StyledModal, { isOpen: isOpen, onRequestClose: onRequestClose, shouldCloseOnOverlayClick: false, pointerEventsOnBackdrop: "none", style: {
51
+ content: {
52
+ left: pos.left + 'px',
53
+ top: pos.top + 'px',
54
+ transition: 'none',
55
+ },
56
+ } },
57
+ React.createElement(DraggableModalContainer, { onMouseDown: mouseDown, onMouseMove: mouseMove, "data-cy": "find-replace-modal" }, children)));
58
+ };
59
+ const DraggableModalContainer = styled(ModalContainer) `
60
+ padding: 0 2rem 2rem 2rem;
61
+ `;
@@ -52,7 +52,6 @@ export const NestedSubmenusContainer = styled(SubmenusContainer) `
52
52
  position: absolute;
53
53
  top: 0;
54
54
  left: 100%;
55
- overflow: visible;
56
55
  `;
57
56
  const Separator = styled.div `
58
57
  height: 0;
@@ -34,6 +34,10 @@ const transitionDelay = 300;
34
34
  const delayedTransitionTime = totalTransitionTime - transitionDelay;
35
35
  const ReactModalAdapter = (_a) => {
36
36
  var { className, modalClassName } = _a, props = __rest(_a, ["className", "modalClassName"]);
37
+ props.style = props.style || {};
38
+ if (props.pointerEventsOnBackdrop == 'none') {
39
+ props.style.content = Object.assign(Object.assign({}, props.style.content), { pointerEvents: 'all' });
40
+ }
37
41
  return (React.createElement(ReactModal, Object.assign({ className: modalClassName, portalClassName: className, closeTimeoutMS: totalTransitionTime, preventScroll: true, appElement: document.getElementById('root') }, props)));
38
42
  };
39
43
  export const ModalContainer = styled.div `
@@ -131,12 +135,15 @@ export const StyledModal = styled(ReactModalAdapter).attrs({
131
135
  left: 0;
132
136
  right: 0;
133
137
  bottom: 0;
134
- background-color: ${(props) => props.theme.colors.background.dark};
138
+ background-color: ${(props) => props.pointerEventsOnBackdrop === 'none'
139
+ ? 'rgba(0,0,0,0.1)'
140
+ : props.theme.colors.background.dark};
135
141
  z-index: 1000;
136
142
  display: flex;
137
143
  justify-content: center;
138
144
  align-items: center;
139
145
  opacity: 0;
146
+ pointer-events: ${(props) => props.pointerEventsOnBackdrop || 'auto'};
140
147
 
141
148
  &--after-open {
142
149
  transition: opacity ${totalTransitionTime}ms ease-in-out;
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { isMenuSeparator, } from '../lib/menus';
3
- const initialPointer = [-1, -1, -1, -1];
3
+ const initialPointer = [-1, -1, -1];
4
4
  const transformPointer = (depth, index) => (pointer) => pointer.map((pointerPart, i) => {
5
5
  if (i === depth) {
6
6
  return index;
@@ -11,8 +11,7 @@ const transformPointer = (depth, index) => (pointer) => pointer.map((pointerPart
11
11
  return pointerPart;
12
12
  });
13
13
  const isPart = (pointer, position) => {
14
- const max = initialPointer.length;
15
- const limit = position.length < max ? position.length : max;
14
+ const limit = position.length < 3 ? position.length : 3;
16
15
  for (let i = 0; i < limit; i++) {
17
16
  if (position[i] !== pointer[i]) {
18
17
  return false;
@@ -58,7 +57,7 @@ export const useMenus = (menus) => {
58
57
  }
59
58
  if (menu.run) {
60
59
  menu.run();
61
- setPointer(initialPointer);
60
+ setPointer([-1, -1, -1]);
62
61
  }
63
62
  else if (menu.submenu) {
64
63
  const depth = indices.length - 1;
@@ -70,7 +69,7 @@ export const useMenus = (menus) => {
70
69
  useEffect(() => {
71
70
  const handleClickOutside = (event) => {
72
71
  if (ref.current && !ref.current.contains(event.target)) {
73
- setPointer(initialPointer);
72
+ setPointer([-1, -1, -1]);
74
73
  }
75
74
  };
76
75
  document.addEventListener('click', handleClickOutside);
package/dist/es/index.js CHANGED
@@ -20,6 +20,7 @@ export * from './components/RadioButton';
20
20
  export * from './components/AutoSaveInput';
21
21
  export * from './components/Avatar';
22
22
  export * from './components/Dialog';
23
+ export * from './components/DraggableModal';
23
24
  export * from './components/Checkbox';
24
25
  export * from './components/Form';
25
26
  export * from './components/MultiValueInput';
@@ -0,0 +1,21 @@
1
+ /*!
2
+ * © 2025 Atypon Systems LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import React from 'react';
17
+ export declare const DraggableModal: React.FC<{
18
+ children: React.ReactNode;
19
+ isOpen: boolean;
20
+ onRequestClose: () => void;
21
+ }>;
@@ -18,6 +18,7 @@ import ReactModal from 'react-modal';
18
18
  import { ThemeProps } from 'styled-components';
19
19
  interface Props {
20
20
  modalClassName?: ReactModal.Classes;
21
+ pointerEventsOnBackdrop?: 'all' | 'none' | 'auto';
21
22
  }
22
23
  export declare const ModalContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
23
24
  export declare const ModalHeader: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
@@ -21,6 +21,7 @@ export * from './components/RadioButton';
21
21
  export * from './components/AutoSaveInput';
22
22
  export * from './components/Avatar';
23
23
  export * from './components/Dialog';
24
+ export * from './components/DraggableModal';
24
25
  export * from './components/Checkbox';
25
26
  export * from './components/Form';
26
27
  export * from './components/MultiValueInput';
@@ -41,4 +41,4 @@ export type MenuSeparator = {
41
41
  role: 'separator';
42
42
  };
43
43
  export declare const isMenuSeparator: (menu: any) => menu is MenuSeparator;
44
- export type MenuPointer = [number, number, number, number];
44
+ export type MenuPointer = [number, number, number];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@manuscripts/style-guide",
3
3
  "description": "Shared components for Manuscripts applications",
4
- "version": "2.0.36-LEAN-4311.2",
4
+ "version": "2.1.0",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",