@manuscripts/style-guide 3.5.25 → 3.5.27

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Manuscripts Style Guide
2
2
 
3
- React components for Manuscripts applications.
3
+ React components for Manuscripts applications.
4
4
 
5
5
  ## Example usage
6
6
 
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.zestOrange = exports.veryLightYellow = exports.contrastOrange = exports.butteryYellow = exports.wheatYellow = exports.contrastGreen = exports.veryLightGreen = exports.peppermintGreen = exports.springGreen = exports.killarneyGreen = exports.contrastRed = exports.darkRed = exports.chablisRed = exports.mandysRed = exports.punchRed = exports.veryLightBlue = exports.graphBlue1 = exports.focusBlue = exports.powderBlue = exports.aliceBlue = exports.jellyBeanBlue = exports.white = exports.alabasterGrey = exports.seashellGrey = exports.mercuryGrey = exports.greyLight = exports.greyMutedText = exports.greyMuted = exports.greyDark = exports.black = exports.manuscriptsSecondary = exports.manuscriptsXLight2 = exports.manuscriptsXLight = exports.manuscriptsLight = exports.manuscriptsIcons = exports.manuscriptsBlue = exports.manuscriptsBlueDark = void 0;
18
+ exports.zestOrange = exports.veryLightYellow = exports.contrastOrange = exports.butteryYellow = exports.wheatYellow = exports.contrastGreen = exports.veryLightGreen = exports.peppermintGreen = exports.springGreen = exports.killarneyGreen = exports.contrastRed = exports.darkRed = exports.chablisRed = exports.mandysRed = exports.punchRed = exports.veryLightBlue = exports.graphBlue1 = exports.focusBlue = exports.powderBlue = exports.aliceBlue = exports.jellyBeanBlue = exports.disabled = exports.white = exports.alabasterGrey = exports.seashellGrey = exports.mercuryGrey = exports.greyLight = exports.greyMutedText = exports.greyMuted = exports.greyDark = exports.black = exports.manuscriptsSecondary = exports.manuscriptsXLight2 = exports.manuscriptsXLight = exports.manuscriptsLight = exports.manuscriptsIcons = exports.manuscriptsBlue = exports.manuscriptsBlueDark = void 0;
19
19
  exports.manuscriptsBlueDark = '#0b6bb8';
20
20
  exports.manuscriptsBlue = '#0d79d0';
21
21
  exports.manuscriptsIcons = '#1a9bc7';
@@ -32,6 +32,7 @@ exports.mercuryGrey = '#e2e2e2';
32
32
  exports.seashellGrey = '#f2f2f2';
33
33
  exports.alabasterGrey = '#fafafa';
34
34
  exports.white = '#fff';
35
+ exports.disabled = '#f5f5f5';
35
36
  exports.jellyBeanBlue = '#2781a1';
36
37
  exports.aliceBlue = '#f2fbfc';
37
38
  exports.powderBlue = '#ddf3fa';
@@ -10,7 +10,7 @@ const react_1 = require("react");
10
10
  const react_datepicker_1 = __importDefault(require("react-datepicker"));
11
11
  const styled_components_1 = __importDefault(require("styled-components"));
12
12
  const icons_1 = require("./icons");
13
- const DatePicker = ({ id, originalDate, date, handleDateChange, placeholder, showTimeSelect, required, }) => {
13
+ const DatePicker = ({ id, originalDate, date, handleDateChange, placeholder, showTimeSelect, required, disabled, }) => {
14
14
  const [selectedDate, setSelectedDate] = (0, react_1.useState)(date || null);
15
15
  (0, react_1.useEffect)(() => {
16
16
  setSelectedDate(date ?? null);
@@ -22,7 +22,7 @@ const DatePicker = ({ id, originalDate, date, handleDateChange, placeholder, sho
22
22
  const format = showTimeSelect
23
23
  ? 'd MMM yyyy, EEEE h:mm aa'
24
24
  : 'd MMM yyyy, EEEE';
25
- return ((0, jsx_runtime_1.jsxs)(Calendar, { children: [(0, jsx_runtime_1.jsx)(react_datepicker_1.default, { id: id, selected: selectedDate, onChange: handleChange, placeholderText: placeholder, minDate: originalDate, showTimeSelect: showTimeSelect, dateFormat: format, className: "calendar-input", popperPlacement: "bottom", required: required }), (0, jsx_runtime_1.jsx)(IconWrapper, { children: (0, jsx_runtime_1.jsx)(icons_1.CalendarIcon, { width: 16, height: 16 }) })] }));
25
+ return ((0, jsx_runtime_1.jsxs)(Calendar, { children: [(0, jsx_runtime_1.jsx)(react_datepicker_1.default, { id: id, selected: selectedDate, onChange: handleChange, placeholderText: placeholder, minDate: originalDate, showTimeSelect: showTimeSelect, dateFormat: format, className: "calendar-input", popperPlacement: "bottom", required: required, disabled: disabled }), (0, jsx_runtime_1.jsx)(IconWrapper, { children: (0, jsx_runtime_1.jsx)(icons_1.CalendarIcon, { width: 16, height: 16 }) })] }));
26
26
  };
27
27
  exports.DatePicker = DatePicker;
28
28
  const Calendar = styled_components_1.default.div `
@@ -177,6 +177,18 @@ const Calendar = styled_components_1.default.div `
177
177
  border-color: ${(props) => props.theme.colors.text.greyMuted};
178
178
  background-color: #f2fbfc;
179
179
  }
180
+
181
+ &:disabled {
182
+ cursor: not-allowed;
183
+ background-color: ${(props) => props.theme.colors.background.disabled};
184
+ border-color: ${(props) => props.theme.colors.border.field.default};
185
+ color: ${(props) => props.theme.colors.text.secondary};
186
+
187
+ &:hover {
188
+ border-color: ${(props) => props.theme.colors.border.field.default};
189
+ background-color: ${(props) => props.theme.colors.background.disabled};
190
+ }
191
+ }
180
192
  }
181
193
  `;
182
194
  const IconWrapper = styled_components_1.default.div `
@@ -46,7 +46,8 @@ const ContentOuter = styled_components_1.default.div `
46
46
  display: grid;
47
47
  grid-template-rows: ${(props) => (props.open ? '1fr' : '0fr')};
48
48
  overflow: ${(props) => (props.open ? 'visible' : 'hidden')};
49
- transition: grid-template-rows 0.25s ease,
49
+ transition:
50
+ grid-template-rows 0.25s ease,
50
51
  overflow 0s ${(props) => (props.open ? '0.25s' : '0s')} allow-discrete;
51
52
  `;
52
53
  const ContentInner = styled_components_1.default.div `
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.Resizer = void 0;
7
4
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const react_1 = __importDefault(require("react"));
5
+ const react_1 = require("react");
9
6
  const ResizerButton_1 = require("./ResizerButton");
10
7
  const ResizerInner_1 = require("./ResizerInner");
11
8
  const inners = {
@@ -18,92 +15,93 @@ const inners = {
18
15
  start: ResizerInner_1.HorizontalStartResizerInner,
19
16
  },
20
17
  };
21
- class Resizer extends react_1.default.Component {
22
- constructor() {
23
- super(...arguments);
24
- this.resizerRef = react_1.default.createRef();
25
- this.state = {
26
- isHovering: false,
27
- isResizing: false,
28
- startPosition: 0,
29
- };
30
- this.scheduleResize = (delta) => {
31
- if (this.state.isResizing && delta) {
32
- this.props.onResize(delta);
33
- }
34
- };
35
- this.mouseDownHandler = (e) => {
36
- e.preventDefault();
37
- if (!this.resizerRef.current || e.target !== this.resizerRef.current) {
38
- return;
18
+ const DISABLE_RESIZE_NODE_NAMES = new Set([
19
+ 'IFRAME',
20
+ 'HTML',
21
+ null,
22
+ ]);
23
+ const OUT_OF_BOUNDS_OFFSET = 32;
24
+ const Resizer = ({ collapsed, direction, onResize, onResizeButton, onResizeEnd, side, buttonInner, }) => {
25
+ const resizerRef = (0, react_1.useRef)(null);
26
+ const [isHovering, setIsHovering] = (0, react_1.useState)(false);
27
+ const isResizingRef = (0, react_1.useRef)(false);
28
+ const startPositionRef = (0, react_1.useRef)(0);
29
+ const cleanupRef = (0, react_1.useRef)(null);
30
+ const onResizeRef = (0, react_1.useRef)(onResize);
31
+ const onResizeButtonRef = (0, react_1.useRef)(onResizeButton);
32
+ const onResizeEndRef = (0, react_1.useRef)(onResizeEnd);
33
+ const directionRef = (0, react_1.useRef)(direction);
34
+ const sideRef = (0, react_1.useRef)(side);
35
+ (0, react_1.useEffect)(() => {
36
+ onResizeRef.current = onResize;
37
+ onResizeButtonRef.current = onResizeButton;
38
+ onResizeEndRef.current = onResizeEnd;
39
+ directionRef.current = direction;
40
+ sideRef.current = side;
41
+ }, [onResize, onResizeButton, onResizeEnd, direction, side]);
42
+ const getPosition = (0, react_1.useCallback)((e) => directionRef.current === 'row' ? e.screenX : e.screenY, []);
43
+ const getDelta = (0, react_1.useCallback)((position) => {
44
+ return sideRef.current === 'end'
45
+ ? position - startPositionRef.current
46
+ : startPositionRef.current - position;
47
+ }, []);
48
+ const detachListeners = (0, react_1.useCallback)(() => {
49
+ if (cleanupRef.current) {
50
+ cleanupRef.current();
51
+ cleanupRef.current = null;
52
+ }
53
+ }, []);
54
+ (0, react_1.useEffect)(() => {
55
+ return () => detachListeners();
56
+ }, [detachListeners]);
57
+ const mouseUpHandler = (0, react_1.useCallback)((e, outOfBounds = false) => {
58
+ detachListeners();
59
+ isResizingRef.current = false;
60
+ const position = getPosition(e);
61
+ const adjustedPosition = outOfBounds
62
+ ? position - OUT_OF_BOUNDS_OFFSET
63
+ : position;
64
+ const delta = getDelta(adjustedPosition);
65
+ if (delta === 0) {
66
+ onResizeButtonRef.current();
67
+ }
68
+ onResizeRef.current(delta);
69
+ onResizeEndRef.current(delta);
70
+ }, [detachListeners, getPosition, getDelta]);
71
+ const mouseMoveHandler = (0, react_1.useCallback)((e) => {
72
+ if (isResizingRef.current) {
73
+ const delta = getDelta(getPosition(e));
74
+ if (delta) {
75
+ onResizeRef.current(delta);
39
76
  }
40
- if (this.state.isResizing) {
41
- return;
42
- }
43
- this.setState({
44
- isResizing: true,
45
- startPosition: this.getPosition(e),
46
- });
47
- window.addEventListener('mousemove', this.mouseMoveHandler);
48
- window.addEventListener('mouseup', this.mouseUpHandler);
49
- window.addEventListener('mouseout', this.handleOutofBounds);
50
- };
51
- this.mouseUpHandler = (e, outOfBounds = false) => {
52
- window.removeEventListener('mousemove', this.mouseMoveHandler);
53
- window.removeEventListener('mouseup', this.mouseUpHandler);
54
- window.removeEventListener('mouseout', this.handleOutofBounds);
55
- this.setState({
56
- isResizing: false,
57
- });
58
- const position = this.getPosition(e);
59
- const adjustedPosition = outOfBounds ? position - 32 : position;
60
- const delta = this.getDelta(adjustedPosition);
61
- if (delta === 0) {
62
- this.props.onResizeButton();
63
- }
64
- this.props.onResize(delta);
65
- this.props.onResizeEnd(delta);
66
- };
67
- this.mouseMoveHandler = (e) => {
68
- const position = this.getPosition(e);
69
- const delta = this.getDelta(position);
70
- this.scheduleResize(delta);
77
+ }
78
+ }, [getPosition, getDelta]);
79
+ const handleOutOfBounds = (0, react_1.useCallback)((e) => {
80
+ if (isResizingRef.current &&
81
+ DISABLE_RESIZE_NODE_NAMES.has(e.relatedTarget ? e.relatedTarget.nodeName : null)) {
82
+ mouseUpHandler(e, true);
83
+ }
84
+ }, [mouseUpHandler]);
85
+ const mouseDownHandler = (0, react_1.useCallback)((e) => {
86
+ e.preventDefault();
87
+ if (!resizerRef.current || e.target !== resizerRef.current) {
88
+ return;
89
+ }
90
+ if (isResizingRef.current) {
91
+ return;
92
+ }
93
+ isResizingRef.current = true;
94
+ startPositionRef.current = getPosition(e);
95
+ window.addEventListener('mousemove', mouseMoveHandler);
96
+ window.addEventListener('mouseup', mouseUpHandler);
97
+ window.addEventListener('mouseout', handleOutOfBounds);
98
+ cleanupRef.current = () => {
99
+ window.removeEventListener('mousemove', mouseMoveHandler);
100
+ window.removeEventListener('mouseup', mouseUpHandler);
101
+ window.removeEventListener('mouseout', handleOutOfBounds);
71
102
  };
72
- this.mouseEnterHandler = () => {
73
- this.setState({
74
- isHovering: true,
75
- });
76
- };
77
- this.mouseLeaveHandler = () => {
78
- this.setState({
79
- isHovering: false,
80
- });
81
- };
82
- this.handleOutofBounds = (e) => {
83
- const disableResizeNodes = [
84
- 'IFRAME',
85
- 'HTML',
86
- null,
87
- ];
88
- if (this.state.isResizing &&
89
- disableResizeNodes.includes(e.relatedTarget && e.relatedTarget.nodeName)) {
90
- this.mouseUpHandler(e, true);
91
- }
92
- };
93
- this.getDelta = (delta) => {
94
- const { startPosition } = this.state;
95
- return this.props.side === 'end'
96
- ? delta - startPosition
97
- : startPosition - delta;
98
- };
99
- this.getPosition = (e) => {
100
- return this.props.direction === 'row' ? e.screenX : e.screenY;
101
- };
102
- }
103
- render() {
104
- const { buttonInner, direction, side } = this.props;
105
- const ResizerInner = inners[direction][side];
106
- return ((0, jsx_runtime_1.jsx)(ResizerInner, { ref: this.resizerRef, onMouseDown: this.mouseDownHandler, onMouseEnter: this.mouseEnterHandler, onMouseLeave: this.mouseLeaveHandler, children: (0, jsx_runtime_1.jsx)(ResizerButton_1.ResizerButton, { direction: direction, isCollapsed: this.props.collapsed, isVisible: this.state.isHovering, onClick: this.props.onResizeButton, side: side, buttonInner: buttonInner }) }));
107
- }
108
- }
103
+ }, [getPosition, mouseMoveHandler, mouseUpHandler, handleOutOfBounds]);
104
+ const ResizerInner = inners[direction][side];
105
+ return ((0, jsx_runtime_1.jsx)(ResizerInner, { ref: resizerRef, onMouseDown: mouseDownHandler, onMouseEnter: () => setIsHovering(true), onMouseLeave: () => setIsHovering(false), children: (0, jsx_runtime_1.jsx)(ResizerButton_1.ResizerButton, { direction: direction, isCollapsed: collapsed, isVisible: isHovering, onClick: onResizeButton, side: side, buttonInner: buttonInner }) }));
106
+ };
109
107
  exports.Resizer = Resizer;
@@ -1,11 +1,41 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
6
36
  exports.ResizerButton = void 0;
7
37
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const react_1 = __importDefault(require("react"));
38
+ const react_1 = __importStar(require("react"));
9
39
  const ResizerButtonInner_1 = require("./ResizerButtonInner");
10
40
  const inners = {
11
41
  column: {
@@ -17,15 +47,9 @@ const inners = {
17
47
  start: ResizerButtonInner_1.HorizontalStartResizerButtonInner,
18
48
  },
19
49
  };
20
- class ResizerButton extends react_1.default.PureComponent {
21
- render() {
22
- const { buttonInner, direction, side, isCollapsed, onClick, isVisible } = this.props;
23
- const ResizerButtonInner = buttonInner || inners[direction][side];
24
- return ((0, jsx_runtime_1.jsx)(ResizerButtonInner, { "aria-expanded": !isCollapsed, isCollapsed: isCollapsed, isVisible: isVisible, onClick: onClick, onMouseDown: (event) => event.preventDefault(), tabIndex: 0 }));
25
- }
26
- }
27
- exports.ResizerButton = ResizerButton;
28
- ResizerButton.defaultProps = {
29
- isCollapsed: false,
30
- isVisible: false,
31
- };
50
+ exports.ResizerButton = react_1.default.memo(({ buttonInner, direction, side, isCollapsed = false, isVisible = false, onClick, }) => {
51
+ const preventMouseDown = (0, react_1.useCallback)((event) => event.preventDefault(), []);
52
+ const ResizerButtonInner = buttonInner || inners[direction][side];
53
+ return ((0, jsx_runtime_1.jsx)(ResizerButtonInner, { "aria-expanded": !isCollapsed, isCollapsed: isCollapsed, isVisible: isVisible, onClick: onClick, onMouseDown: preventMouseDown, tabIndex: 0 }));
54
+ });
55
+ exports.ResizerButton.displayName = 'ResizerButton';
@@ -8,6 +8,11 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_select_1 = __importDefault(require("react-select"));
9
9
  const styled_components_1 = require("styled-components");
10
10
  const selectStyles = (theme, error, variant, listMaxHeight) => ({
11
+ container: (base, state) => ({
12
+ ...base,
13
+ cursor: state.isDisabled ? 'not-allowed' : 'default',
14
+ pointerEvents: state.isDisabled ? 'auto' : base.pointerEvents,
15
+ }),
11
16
  control: (base, state) => ({
12
17
  ...base,
13
18
  minHeight: variant === 'large' ? 40 : 32,
@@ -37,6 +42,7 @@ const selectStyles = (theme, error, variant, listMaxHeight) => ({
37
42
  : theme.colors.background.primary,
38
43
  transition: 'border-color 120ms ease, box-shadow 120ms ease',
39
44
  cursor: state.isDisabled ? 'not-allowed' : 'pointer',
45
+ pointerEvents: state.isDisabled ? 'none' : base.pointerEvents,
40
46
  }),
41
47
  valueContainer: (base) => ({
42
48
  ...base,
@@ -67,6 +67,7 @@ exports.defaultTheme = {
67
67
  warning: colors.veryLightYellow,
68
68
  selected: colors.aliceBlue,
69
69
  muted: colors.greyMuted,
70
+ disabled: colors.disabled,
70
71
  tracked: {
71
72
  active: colors.veryLightBlue,
72
73
  default: colors.white,
package/dist/es/colors.js CHANGED
@@ -29,6 +29,7 @@ export const mercuryGrey = '#e2e2e2';
29
29
  export const seashellGrey = '#f2f2f2';
30
30
  export const alabasterGrey = '#fafafa';
31
31
  export const white = '#fff';
32
+ export const disabled = '#f5f5f5';
32
33
  export const jellyBeanBlue = '#2781a1';
33
34
  export const aliceBlue = '#f2fbfc';
34
35
  export const powderBlue = '#ddf3fa';
@@ -4,7 +4,7 @@ import { useEffect, useState } from 'react';
4
4
  import ReactDatePicker from 'react-datepicker';
5
5
  import styled from 'styled-components';
6
6
  import { CalendarIcon } from './icons';
7
- export const DatePicker = ({ id, originalDate, date, handleDateChange, placeholder, showTimeSelect, required, }) => {
7
+ export const DatePicker = ({ id, originalDate, date, handleDateChange, placeholder, showTimeSelect, required, disabled, }) => {
8
8
  const [selectedDate, setSelectedDate] = useState(date || null);
9
9
  useEffect(() => {
10
10
  setSelectedDate(date ?? null);
@@ -16,7 +16,7 @@ export const DatePicker = ({ id, originalDate, date, handleDateChange, placehold
16
16
  const format = showTimeSelect
17
17
  ? 'd MMM yyyy, EEEE h:mm aa'
18
18
  : 'd MMM yyyy, EEEE';
19
- return (_jsxs(Calendar, { children: [_jsx(ReactDatePicker, { id: id, selected: selectedDate, onChange: handleChange, placeholderText: placeholder, minDate: originalDate, showTimeSelect: showTimeSelect, dateFormat: format, className: "calendar-input", popperPlacement: "bottom", required: required }), _jsx(IconWrapper, { children: _jsx(CalendarIcon, { width: 16, height: 16 }) })] }));
19
+ return (_jsxs(Calendar, { children: [_jsx(ReactDatePicker, { id: id, selected: selectedDate, onChange: handleChange, placeholderText: placeholder, minDate: originalDate, showTimeSelect: showTimeSelect, dateFormat: format, className: "calendar-input", popperPlacement: "bottom", required: required, disabled: disabled }), _jsx(IconWrapper, { children: _jsx(CalendarIcon, { width: 16, height: 16 }) })] }));
20
20
  };
21
21
  const Calendar = styled.div `
22
22
  width: 100%;
@@ -170,6 +170,18 @@ const Calendar = styled.div `
170
170
  border-color: ${(props) => props.theme.colors.text.greyMuted};
171
171
  background-color: #f2fbfc;
172
172
  }
173
+
174
+ &:disabled {
175
+ cursor: not-allowed;
176
+ background-color: ${(props) => props.theme.colors.background.disabled};
177
+ border-color: ${(props) => props.theme.colors.border.field.default};
178
+ color: ${(props) => props.theme.colors.text.secondary};
179
+
180
+ &:hover {
181
+ border-color: ${(props) => props.theme.colors.border.field.default};
182
+ background-color: ${(props) => props.theme.colors.background.disabled};
183
+ }
184
+ }
173
185
  }
174
186
  `;
175
187
  const IconWrapper = styled.div `
@@ -39,7 +39,8 @@ const ContentOuter = styled.div `
39
39
  display: grid;
40
40
  grid-template-rows: ${(props) => (props.open ? '1fr' : '0fr')};
41
41
  overflow: ${(props) => (props.open ? 'visible' : 'hidden')};
42
- transition: grid-template-rows 0.25s ease,
42
+ transition:
43
+ grid-template-rows 0.25s ease,
43
44
  overflow 0s ${(props) => (props.open ? '0.25s' : '0s')} allow-discrete;
44
45
  `;
45
46
  const ContentInner = styled.div `
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import React from 'react';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
3
  import { ResizerButton } from './ResizerButton';
4
4
  import { HorizontalEndResizerInner, HorizontalStartResizerInner, VerticalEndResizerInner, VerticalStartResizerInner, } from './ResizerInner';
5
5
  const inners = {
@@ -12,91 +12,92 @@ const inners = {
12
12
  start: HorizontalStartResizerInner,
13
13
  },
14
14
  };
15
- export class Resizer extends React.Component {
16
- constructor() {
17
- super(...arguments);
18
- this.resizerRef = React.createRef();
19
- this.state = {
20
- isHovering: false,
21
- isResizing: false,
22
- startPosition: 0,
23
- };
24
- this.scheduleResize = (delta) => {
25
- if (this.state.isResizing && delta) {
26
- this.props.onResize(delta);
27
- }
28
- };
29
- this.mouseDownHandler = (e) => {
30
- e.preventDefault();
31
- if (!this.resizerRef.current || e.target !== this.resizerRef.current) {
32
- return;
33
- }
34
- if (this.state.isResizing) {
35
- return;
36
- }
37
- this.setState({
38
- isResizing: true,
39
- startPosition: this.getPosition(e),
40
- });
41
- window.addEventListener('mousemove', this.mouseMoveHandler);
42
- window.addEventListener('mouseup', this.mouseUpHandler);
43
- window.addEventListener('mouseout', this.handleOutofBounds);
44
- };
45
- this.mouseUpHandler = (e, outOfBounds = false) => {
46
- window.removeEventListener('mousemove', this.mouseMoveHandler);
47
- window.removeEventListener('mouseup', this.mouseUpHandler);
48
- window.removeEventListener('mouseout', this.handleOutofBounds);
49
- this.setState({
50
- isResizing: false,
51
- });
52
- const position = this.getPosition(e);
53
- const adjustedPosition = outOfBounds ? position - 32 : position;
54
- const delta = this.getDelta(adjustedPosition);
55
- if (delta === 0) {
56
- this.props.onResizeButton();
57
- }
58
- this.props.onResize(delta);
59
- this.props.onResizeEnd(delta);
60
- };
61
- this.mouseMoveHandler = (e) => {
62
- const position = this.getPosition(e);
63
- const delta = this.getDelta(position);
64
- this.scheduleResize(delta);
65
- };
66
- this.mouseEnterHandler = () => {
67
- this.setState({
68
- isHovering: true,
69
- });
70
- };
71
- this.mouseLeaveHandler = () => {
72
- this.setState({
73
- isHovering: false,
74
- });
75
- };
76
- this.handleOutofBounds = (e) => {
77
- const disableResizeNodes = [
78
- 'IFRAME',
79
- 'HTML',
80
- null,
81
- ];
82
- if (this.state.isResizing &&
83
- disableResizeNodes.includes(e.relatedTarget && e.relatedTarget.nodeName)) {
84
- this.mouseUpHandler(e, true);
15
+ const DISABLE_RESIZE_NODE_NAMES = new Set([
16
+ 'IFRAME',
17
+ 'HTML',
18
+ null,
19
+ ]);
20
+ const OUT_OF_BOUNDS_OFFSET = 32;
21
+ export const Resizer = ({ collapsed, direction, onResize, onResizeButton, onResizeEnd, side, buttonInner, }) => {
22
+ const resizerRef = useRef(null);
23
+ const [isHovering, setIsHovering] = useState(false);
24
+ const isResizingRef = useRef(false);
25
+ const startPositionRef = useRef(0);
26
+ const cleanupRef = useRef(null);
27
+ const onResizeRef = useRef(onResize);
28
+ const onResizeButtonRef = useRef(onResizeButton);
29
+ const onResizeEndRef = useRef(onResizeEnd);
30
+ const directionRef = useRef(direction);
31
+ const sideRef = useRef(side);
32
+ useEffect(() => {
33
+ onResizeRef.current = onResize;
34
+ onResizeButtonRef.current = onResizeButton;
35
+ onResizeEndRef.current = onResizeEnd;
36
+ directionRef.current = direction;
37
+ sideRef.current = side;
38
+ }, [onResize, onResizeButton, onResizeEnd, direction, side]);
39
+ const getPosition = useCallback((e) => directionRef.current === 'row' ? e.screenX : e.screenY, []);
40
+ const getDelta = useCallback((position) => {
41
+ return sideRef.current === 'end'
42
+ ? position - startPositionRef.current
43
+ : startPositionRef.current - position;
44
+ }, []);
45
+ const detachListeners = useCallback(() => {
46
+ if (cleanupRef.current) {
47
+ cleanupRef.current();
48
+ cleanupRef.current = null;
49
+ }
50
+ }, []);
51
+ useEffect(() => {
52
+ return () => detachListeners();
53
+ }, [detachListeners]);
54
+ const mouseUpHandler = useCallback((e, outOfBounds = false) => {
55
+ detachListeners();
56
+ isResizingRef.current = false;
57
+ const position = getPosition(e);
58
+ const adjustedPosition = outOfBounds
59
+ ? position - OUT_OF_BOUNDS_OFFSET
60
+ : position;
61
+ const delta = getDelta(adjustedPosition);
62
+ if (delta === 0) {
63
+ onResizeButtonRef.current();
64
+ }
65
+ onResizeRef.current(delta);
66
+ onResizeEndRef.current(delta);
67
+ }, [detachListeners, getPosition, getDelta]);
68
+ const mouseMoveHandler = useCallback((e) => {
69
+ if (isResizingRef.current) {
70
+ const delta = getDelta(getPosition(e));
71
+ if (delta) {
72
+ onResizeRef.current(delta);
85
73
  }
74
+ }
75
+ }, [getPosition, getDelta]);
76
+ const handleOutOfBounds = useCallback((e) => {
77
+ if (isResizingRef.current &&
78
+ DISABLE_RESIZE_NODE_NAMES.has(e.relatedTarget ? e.relatedTarget.nodeName : null)) {
79
+ mouseUpHandler(e, true);
80
+ }
81
+ }, [mouseUpHandler]);
82
+ const mouseDownHandler = useCallback((e) => {
83
+ e.preventDefault();
84
+ if (!resizerRef.current || e.target !== resizerRef.current) {
85
+ return;
86
+ }
87
+ if (isResizingRef.current) {
88
+ return;
89
+ }
90
+ isResizingRef.current = true;
91
+ startPositionRef.current = getPosition(e);
92
+ window.addEventListener('mousemove', mouseMoveHandler);
93
+ window.addEventListener('mouseup', mouseUpHandler);
94
+ window.addEventListener('mouseout', handleOutOfBounds);
95
+ cleanupRef.current = () => {
96
+ window.removeEventListener('mousemove', mouseMoveHandler);
97
+ window.removeEventListener('mouseup', mouseUpHandler);
98
+ window.removeEventListener('mouseout', handleOutOfBounds);
86
99
  };
87
- this.getDelta = (delta) => {
88
- const { startPosition } = this.state;
89
- return this.props.side === 'end'
90
- ? delta - startPosition
91
- : startPosition - delta;
92
- };
93
- this.getPosition = (e) => {
94
- return this.props.direction === 'row' ? e.screenX : e.screenY;
95
- };
96
- }
97
- render() {
98
- const { buttonInner, direction, side } = this.props;
99
- const ResizerInner = inners[direction][side];
100
- return (_jsx(ResizerInner, { ref: this.resizerRef, onMouseDown: this.mouseDownHandler, onMouseEnter: this.mouseEnterHandler, onMouseLeave: this.mouseLeaveHandler, children: _jsx(ResizerButton, { direction: direction, isCollapsed: this.props.collapsed, isVisible: this.state.isHovering, onClick: this.props.onResizeButton, side: side, buttonInner: buttonInner }) }));
101
- }
102
- }
100
+ }, [getPosition, mouseMoveHandler, mouseUpHandler, handleOutOfBounds]);
101
+ const ResizerInner = inners[direction][side];
102
+ return (_jsx(ResizerInner, { ref: resizerRef, onMouseDown: mouseDownHandler, onMouseEnter: () => setIsHovering(true), onMouseLeave: () => setIsHovering(false), children: _jsx(ResizerButton, { direction: direction, isCollapsed: collapsed, isVisible: isHovering, onClick: onResizeButton, side: side, buttonInner: buttonInner }) }));
103
+ };
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import React from 'react';
2
+ import React, { useCallback } from 'react';
3
3
  import { HorizontalEndResizerButtonInner, HorizontalStartResizerButtonInner, VerticalEndResizerButtonInner, VerticalStartResizerButtonInner, } from './ResizerButtonInner';
4
4
  const inners = {
5
5
  column: {
@@ -11,14 +11,9 @@ const inners = {
11
11
  start: HorizontalStartResizerButtonInner,
12
12
  },
13
13
  };
14
- export class ResizerButton extends React.PureComponent {
15
- render() {
16
- const { buttonInner, direction, side, isCollapsed, onClick, isVisible } = this.props;
17
- const ResizerButtonInner = buttonInner || inners[direction][side];
18
- return (_jsx(ResizerButtonInner, { "aria-expanded": !isCollapsed, isCollapsed: isCollapsed, isVisible: isVisible, onClick: onClick, onMouseDown: (event) => event.preventDefault(), tabIndex: 0 }));
19
- }
20
- }
21
- ResizerButton.defaultProps = {
22
- isCollapsed: false,
23
- isVisible: false,
24
- };
14
+ export const ResizerButton = React.memo(({ buttonInner, direction, side, isCollapsed = false, isVisible = false, onClick, }) => {
15
+ const preventMouseDown = useCallback((event) => event.preventDefault(), []);
16
+ const ResizerButtonInner = buttonInner || inners[direction][side];
17
+ return (_jsx(ResizerButtonInner, { "aria-expanded": !isCollapsed, isCollapsed: isCollapsed, isVisible: isVisible, onClick: onClick, onMouseDown: preventMouseDown, tabIndex: 0 }));
18
+ });
19
+ ResizerButton.displayName = 'ResizerButton';
@@ -2,6 +2,11 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import Select from 'react-select';
3
3
  import { useTheme } from 'styled-components';
4
4
  const selectStyles = (theme, error, variant, listMaxHeight) => ({
5
+ container: (base, state) => ({
6
+ ...base,
7
+ cursor: state.isDisabled ? 'not-allowed' : 'default',
8
+ pointerEvents: state.isDisabled ? 'auto' : base.pointerEvents,
9
+ }),
5
10
  control: (base, state) => ({
6
11
  ...base,
7
12
  minHeight: variant === 'large' ? 40 : 32,
@@ -31,6 +36,7 @@ const selectStyles = (theme, error, variant, listMaxHeight) => ({
31
36
  : theme.colors.background.primary,
32
37
  transition: 'border-color 120ms ease, box-shadow 120ms ease',
33
38
  cursor: state.isDisabled ? 'not-allowed' : 'pointer',
39
+ pointerEvents: state.isDisabled ? 'none' : base.pointerEvents,
34
40
  }),
35
41
  valueContainer: (base) => ({
36
42
  ...base,
@@ -31,6 +31,7 @@ export const defaultTheme = {
31
31
  warning: colors.veryLightYellow,
32
32
  selected: colors.aliceBlue,
33
33
  muted: colors.greyMuted,
34
+ disabled: colors.disabled,
34
35
  tracked: {
35
36
  active: colors.veryLightBlue,
36
37
  default: colors.white,
@@ -29,6 +29,7 @@ export declare const mercuryGrey = "#e2e2e2";
29
29
  export declare const seashellGrey = "#f2f2f2";
30
30
  export declare const alabasterGrey = "#fafafa";
31
31
  export declare const white = "#fff";
32
+ export declare const disabled = "#f5f5f5";
32
33
  export declare const jellyBeanBlue = "#2781a1";
33
34
  export declare const aliceBlue = "#f2fbfc";
34
35
  export declare const powderBlue = "#ddf3fa";
@@ -23,5 +23,6 @@ export interface DatePickerProps {
23
23
  placeholder?: string;
24
24
  showTimeSelect?: boolean;
25
25
  required?: boolean;
26
+ disabled?: boolean;
26
27
  }
27
28
  export declare const DatePicker: React.FC<DatePickerProps>;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { ResizerButtonInnerProps } from './ResizerButtonInner';
3
3
  import { ResizerDirection, ResizerSide } from './types';
4
- interface Props {
4
+ interface ResizerProps {
5
5
  collapsed: boolean;
6
6
  direction: ResizerDirection;
7
7
  onResize: (resizeDelta: number) => void;
@@ -10,27 +10,5 @@ interface Props {
10
10
  side: ResizerSide;
11
11
  buttonInner?: React.ComponentType<ResizerButtonInnerProps>;
12
12
  }
13
- interface State {
14
- isHovering: boolean;
15
- isResizing: boolean;
16
- startPosition: number;
17
- }
18
- export declare class Resizer extends React.Component<Props, State> {
19
- resizerRef: React.RefObject<HTMLDivElement | null>;
20
- state: {
21
- isHovering: boolean;
22
- isResizing: boolean;
23
- startPosition: number;
24
- };
25
- render(): import("react/jsx-runtime").JSX.Element;
26
- private scheduleResize;
27
- private mouseDownHandler;
28
- private mouseUpHandler;
29
- private mouseMoveHandler;
30
- private mouseEnterHandler;
31
- private mouseLeaveHandler;
32
- private handleOutofBounds;
33
- private getDelta;
34
- private getPosition;
35
- }
13
+ export declare const Resizer: React.FC<ResizerProps>;
36
14
  export {};
@@ -1,18 +1,13 @@
1
1
  import React from 'react';
2
2
  import { ResizerButtonInnerProps } from './ResizerButtonInner';
3
3
  import { ResizerDirection, ResizerSide } from './types';
4
- interface Props extends React.HTMLProps<HTMLButtonElement> {
4
+ interface ResizerButtonProps {
5
5
  direction: ResizerDirection;
6
- isCollapsed: boolean;
7
- isVisible: boolean;
6
+ isCollapsed?: boolean;
7
+ isVisible?: boolean;
8
+ onClick?: React.MouseEventHandler;
8
9
  side: ResizerSide;
9
10
  buttonInner?: React.ComponentType<ResizerButtonInnerProps>;
10
11
  }
11
- export declare class ResizerButton extends React.PureComponent<Props> {
12
- static defaultProps: {
13
- isCollapsed: boolean;
14
- isVisible: boolean;
15
- };
16
- render(): import("react/jsx-runtime").JSX.Element;
17
- }
12
+ export declare const ResizerButton: React.FC<ResizerButtonProps>;
18
13
  export {};
@@ -85,6 +85,7 @@ interface Background {
85
85
  selected: string;
86
86
  tracked: States;
87
87
  muted: string;
88
+ disabled: string;
88
89
  }
89
90
  interface Border {
90
91
  field: States;
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": "3.5.25",
4
+ "version": "3.5.27",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",