@manuscripts/style-guide 1.8.2 → 1.8.3-LEAN-3321-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.
@@ -18,7 +18,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
18
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.Menus = void 0;
21
+ exports.Label = exports.Block = exports.BlockItem = exports.StyleBlock = exports.ListContainer = exports.bulletListContextMenu = exports.orderedListContextMenu = exports.Menus = void 0;
22
22
  const react_1 = __importDefault(require("react"));
23
23
  const styled_components_1 = __importDefault(require("styled-components"));
24
24
  const Submenu_1 = require("./Submenu");
@@ -58,3 +58,56 @@ const Menus = ({ menus, innerRef, handleClick, }) => {
58
58
  })));
59
59
  };
60
60
  exports.Menus = Menus;
61
+ exports.orderedListContextMenu = [
62
+ { items: ['1.', '2.', '3.'], type: 'order' },
63
+ { items: ['A.', 'B.', 'C.'], type: 'alpha-upper' },
64
+ { items: ['a.', 'b.', 'c.'], type: 'alpha-lower' },
65
+ { items: ['I.', 'II.', 'III.'], type: 'roman-upper' },
66
+ { items: ['i.', 'ii.', 'iii.'], type: 'roman-lower' },
67
+ ];
68
+ exports.bulletListContextMenu = [
69
+ { items: ['•', '•', '•'], type: 'bullet' },
70
+ { items: ['-', '-', '-'], type: 'simple' },
71
+ ];
72
+ exports.ListContainer = styled_components_1.default.div `
73
+ padding: ${(props) => props.theme.grid.unit * 4}px;
74
+ display: grid;
75
+ grid-template-columns:
76
+ ${(props) => props.theme.grid.unit * 21}px
77
+ ${(props) => props.theme.grid.unit * 21}px;
78
+ gap: 6px;
79
+ `;
80
+ exports.StyleBlock = styled_components_1.default.div `
81
+ border: 1px solid ${(props) => props.theme.colors.border.tertiary};
82
+ padding: ${(props) => props.theme.grid.unit * 2}px;
83
+ cursor: pointer;
84
+ display: flex;
85
+ flex-direction: column;
86
+ row-gap: ${(props) => props.theme.grid.unit * 2}px;
87
+
88
+ &:hover {
89
+ background: ${(props) => props.theme.colors.button.default.border.hover};
90
+ }
91
+
92
+ &:active {
93
+ border-color: ${(props) => props.theme.colors.border.primary};
94
+ }
95
+ `;
96
+ exports.BlockItem = styled_components_1.default.div `
97
+ display: flex;
98
+ align-items: center;
99
+ gap: 6px;
100
+ `;
101
+ exports.Block = styled_components_1.default.div `
102
+ height: 3px;
103
+ width: ${(props) => props.theme.grid.unit * 14}px;
104
+ background: ${(props) => props.theme.colors.border.tertiary};
105
+ `;
106
+ exports.Label = styled_components_1.default.div `
107
+ font-family: Lato, serif;
108
+ font-size: ${(props) => props.theme.font.size.small};
109
+ font-weight: ${(props) => props.theme.font.weight.normal};
110
+ line-height: ${(props) => props.theme.font.lineHeight.small};
111
+ font-style: normal;
112
+ color: ${(props) => (props.hide && 'white') || 'initial'};
113
+ `;
@@ -23,6 +23,7 @@ const TriangleCollapsed_1 = __importDefault(require("@manuscripts/assets/react/T
23
23
  const react_1 = __importDefault(require("react"));
24
24
  const styled_components_1 = __importDefault(require("styled-components"));
25
25
  const menus_1 = require("../../lib/menus");
26
+ const Menus_1 = require("./Menus");
26
27
  const Shortcut_1 = require("./Shortcut");
27
28
  exports.Text = styled_components_1.default.div `
28
29
  flex: 1 0 auto;
@@ -37,8 +38,6 @@ exports.SubmenusContainer = styled_components_1.default.div `
37
38
  box-shadow: 0 4px 9px 0 rgba(84, 83, 83, 0.3);
38
39
  color: #353535;
39
40
  min-width: 150px;
40
- max-height: 70vh;
41
- overflow-y: auto;
42
41
  padding: 4px 0;
43
42
  white-space: nowrap;
44
43
  width: auto;
@@ -96,7 +95,7 @@ const Submenu = ({ menu, handleClick }) => {
96
95
  if ((0, menus_1.isMenuSeparator)(menu)) {
97
96
  return react_1.default.createElement(Separator, null);
98
97
  }
99
- if (!menu.submenu) {
98
+ if (!menu.submenu && !menu.options) {
100
99
  return (react_1.default.createElement(Container, { isOpen: menu.isOpen, className: menu.isEnabled ? '' : 'disabled', onMouseDown: (e) => {
101
100
  e.preventDefault();
102
101
  handleClick([]);
@@ -105,6 +104,17 @@ const Submenu = ({ menu, handleClick }) => {
105
104
  react_1.default.createElement(exports.Text, null, menu.label),
106
105
  menu.shortcut && react_1.default.createElement(Shortcut_1.Shortcut, { shortcut: menu.shortcut })));
107
106
  }
107
+ if (menu.options) {
108
+ const styles = menu.id === 'bullet-list-context-menu'
109
+ ? Menus_1.bulletListContextMenu
110
+ : Menus_1.orderedListContextMenu;
111
+ return (react_1.default.createElement(Menus_1.ListContainer, null, styles.map((style, index) => (react_1.default.createElement(Menus_1.StyleBlock, { key: index, onClick: () => {
112
+ menu.options && menu.options[style.type]();
113
+ handleClick([-1, -1]);
114
+ } }, style.items.map((style, index) => (react_1.default.createElement(Menus_1.BlockItem, { key: index },
115
+ react_1.default.createElement(Menus_1.Label, { hide: style === '-' }, style),
116
+ react_1.default.createElement(Menus_1.Block, null)))))))));
117
+ }
108
118
  return (react_1.default.createElement(SubmenuContainer, null,
109
119
  react_1.default.createElement(Container, { onMouseDown: (e) => {
110
120
  e.preventDefault();
@@ -96,8 +96,7 @@ const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
96
96
  return selections.has(item.attrs.id);
97
97
  };
98
98
  const handleClick = () => {
99
- const items = Array.from(selections.values());
100
- return onInsert(items);
99
+ return onInsert(notes.filter(({ node }) => selections.has(node.attrs.id)));
101
100
  };
102
101
  return (react_1.default.createElement(Container, null,
103
102
  react_1.default.createElement(NotesContainer, null,
@@ -113,11 +112,11 @@ const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) => {
113
112
  };
114
113
  exports.TableFootnotesSelector = TableFootnotesSelector;
115
114
  const TableFootnotesList = ({ notes, isSelected, onSelect }) => {
116
- return (react_1.default.createElement(NotesListContainer, null, notes.map((note, index) => {
115
+ return (react_1.default.createElement(NotesListContainer, null, notes.map(({ node, index }) => {
117
116
  var _a;
118
- return (react_1.default.createElement(FootnoteItem, { onClick: () => onSelect(note), key: note.attrs.id },
119
- react_1.default.createElement(StatusIcon, null, isSelected(note) ? (react_1.default.createElement(AddedIcon_1.default, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (react_1.default.createElement(AddIcon_1.default, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
120
- react_1.default.createElement(NoteText, null, ++index + '. ' + ((_a = note.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
117
+ return (react_1.default.createElement(FootnoteItem, { onClick: () => onSelect(node), key: node.attrs.id },
118
+ react_1.default.createElement(StatusIcon, null, isSelected(node) ? (react_1.default.createElement(AddedIcon_1.default, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (react_1.default.createElement(AddIcon_1.default, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
119
+ react_1.default.createElement(NoteText, null, (index ? index + '. ' : '') + ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
121
120
  })));
122
121
  };
123
122
  const NotesListContainer = styled_components_1.default.div `
@@ -19,8 +19,7 @@ exports.useDropdown = void 0;
19
19
  const react_1 = require("react");
20
20
  const useDropdown = () => {
21
21
  const [isOpen, setOpen] = (0, react_1.useState)(false);
22
- const toggleOpen = (0, react_1.useCallback)((e) => {
23
- e === null || e === void 0 ? void 0 : e.stopPropagation();
22
+ const toggleOpen = (0, react_1.useCallback)(() => {
24
23
  setOpen((open) => !open);
25
24
  }, []);
26
25
  const wrapperRef = (0, react_1.useRef)(null);
@@ -67,6 +67,9 @@ const useMenus = (menus) => {
67
67
  const index = indices[depth];
68
68
  setPointer(transformPointer(depth, index));
69
69
  }
70
+ if (menu.options) {
71
+ setPointer([-1, -1, -1]);
72
+ }
70
73
  }, [state]);
71
74
  const ref = (0, react_1.useRef)(null);
72
75
  (0, react_1.useEffect)(() => {
@@ -51,3 +51,56 @@ export const Menus = ({ menus, innerRef, handleClick, }) => {
51
51
  })))));
52
52
  })));
53
53
  };
54
+ export const orderedListContextMenu = [
55
+ { items: ['1.', '2.', '3.'], type: 'order' },
56
+ { items: ['A.', 'B.', 'C.'], type: 'alpha-upper' },
57
+ { items: ['a.', 'b.', 'c.'], type: 'alpha-lower' },
58
+ { items: ['I.', 'II.', 'III.'], type: 'roman-upper' },
59
+ { items: ['i.', 'ii.', 'iii.'], type: 'roman-lower' },
60
+ ];
61
+ export const bulletListContextMenu = [
62
+ { items: ['•', '•', '•'], type: 'bullet' },
63
+ { items: ['-', '-', '-'], type: 'simple' },
64
+ ];
65
+ export const ListContainer = styled.div `
66
+ padding: ${(props) => props.theme.grid.unit * 4}px;
67
+ display: grid;
68
+ grid-template-columns:
69
+ ${(props) => props.theme.grid.unit * 21}px
70
+ ${(props) => props.theme.grid.unit * 21}px;
71
+ gap: 6px;
72
+ `;
73
+ export const StyleBlock = styled.div `
74
+ border: 1px solid ${(props) => props.theme.colors.border.tertiary};
75
+ padding: ${(props) => props.theme.grid.unit * 2}px;
76
+ cursor: pointer;
77
+ display: flex;
78
+ flex-direction: column;
79
+ row-gap: ${(props) => props.theme.grid.unit * 2}px;
80
+
81
+ &:hover {
82
+ background: ${(props) => props.theme.colors.button.default.border.hover};
83
+ }
84
+
85
+ &:active {
86
+ border-color: ${(props) => props.theme.colors.border.primary};
87
+ }
88
+ `;
89
+ export const BlockItem = styled.div `
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 6px;
93
+ `;
94
+ export const Block = styled.div `
95
+ height: 3px;
96
+ width: ${(props) => props.theme.grid.unit * 14}px;
97
+ background: ${(props) => props.theme.colors.border.tertiary};
98
+ `;
99
+ export const Label = styled.div `
100
+ font-family: Lato, serif;
101
+ font-size: ${(props) => props.theme.font.size.small};
102
+ font-weight: ${(props) => props.theme.font.weight.normal};
103
+ line-height: ${(props) => props.theme.font.lineHeight.small};
104
+ font-style: normal;
105
+ color: ${(props) => (props.hide && 'white') || 'initial'};
106
+ `;
@@ -17,6 +17,7 @@ import TriangleCollapsed from '@manuscripts/assets/react/TriangleCollapsed';
17
17
  import React from 'react';
18
18
  import styled from 'styled-components';
19
19
  import { isMenuSeparator } from '../../lib/menus';
20
+ import { Block, BlockItem, bulletListContextMenu, Label, ListContainer, orderedListContextMenu, StyleBlock, } from './Menus';
20
21
  import { Shortcut } from './Shortcut';
21
22
  export const Text = styled.div `
22
23
  flex: 1 0 auto;
@@ -31,8 +32,6 @@ export const SubmenusContainer = styled.div `
31
32
  box-shadow: 0 4px 9px 0 rgba(84, 83, 83, 0.3);
32
33
  color: #353535;
33
34
  min-width: 150px;
34
- max-height: 70vh;
35
- overflow-y: auto;
36
35
  padding: 4px 0;
37
36
  white-space: nowrap;
38
37
  width: auto;
@@ -90,7 +89,7 @@ export const Submenu = ({ menu, handleClick }) => {
90
89
  if (isMenuSeparator(menu)) {
91
90
  return React.createElement(Separator, null);
92
91
  }
93
- if (!menu.submenu) {
92
+ if (!menu.submenu && !menu.options) {
94
93
  return (React.createElement(Container, { isOpen: menu.isOpen, className: menu.isEnabled ? '' : 'disabled', onMouseDown: (e) => {
95
94
  e.preventDefault();
96
95
  handleClick([]);
@@ -99,6 +98,17 @@ export const Submenu = ({ menu, handleClick }) => {
99
98
  React.createElement(Text, null, menu.label),
100
99
  menu.shortcut && React.createElement(Shortcut, { shortcut: menu.shortcut })));
101
100
  }
101
+ if (menu.options) {
102
+ const styles = menu.id === 'bullet-list-context-menu'
103
+ ? bulletListContextMenu
104
+ : orderedListContextMenu;
105
+ return (React.createElement(ListContainer, null, styles.map((style, index) => (React.createElement(StyleBlock, { key: index, onClick: () => {
106
+ menu.options && menu.options[style.type]();
107
+ handleClick([-1, -1]);
108
+ } }, style.items.map((style, index) => (React.createElement(BlockItem, { key: index },
109
+ React.createElement(Label, { hide: style === '-' }, style),
110
+ React.createElement(Block, null)))))))));
111
+ }
102
112
  return (React.createElement(SubmenuContainer, null,
103
113
  React.createElement(Container, { onMouseDown: (e) => {
104
114
  e.preventDefault();
@@ -67,8 +67,7 @@ export const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) =>
67
67
  return selections.has(item.attrs.id);
68
68
  };
69
69
  const handleClick = () => {
70
- const items = Array.from(selections.values());
71
- return onInsert(items);
70
+ return onInsert(notes.filter(({ node }) => selections.has(node.attrs.id)));
72
71
  };
73
72
  return (React.createElement(Container, null,
74
73
  React.createElement(NotesContainer, null,
@@ -83,11 +82,11 @@ export const TableFootnotesSelector = ({ notes, onAdd, onInsert, onCancel }) =>
83
82
  React.createElement(PrimaryButton, { onClick: handleClick, disabled: selections.size === 0 }, "Insert")))));
84
83
  };
85
84
  const TableFootnotesList = ({ notes, isSelected, onSelect }) => {
86
- return (React.createElement(NotesListContainer, null, notes.map((note, index) => {
85
+ return (React.createElement(NotesListContainer, null, notes.map(({ node, index }) => {
87
86
  var _a;
88
- return (React.createElement(FootnoteItem, { onClick: () => onSelect(note), key: note.attrs.id },
89
- React.createElement(StatusIcon, null, isSelected(note) ? (React.createElement(AddedIcon, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (React.createElement(AddIcon, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
90
- React.createElement(NoteText, null, ++index + '. ' + ((_a = note.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
87
+ return (React.createElement(FootnoteItem, { onClick: () => onSelect(node), key: node.attrs.id },
88
+ React.createElement(StatusIcon, null, isSelected(node) ? (React.createElement(AddedIcon, { "data-cy": 'plus-icon-ok', width: 24, height: 24 })) : (React.createElement(AddIcon, { "data-cy": 'plus-icon', width: 24, height: 24 }))),
89
+ React.createElement(NoteText, null, (index ? index + '. ' : '') + ((_a = node.firstChild) === null || _a === void 0 ? void 0 : _a.textContent))));
91
90
  })));
92
91
  };
93
92
  const NotesListContainer = styled.div `
@@ -16,8 +16,7 @@
16
16
  import { useCallback, useEffect, useRef, useState } from 'react';
17
17
  export const useDropdown = () => {
18
18
  const [isOpen, setOpen] = useState(false);
19
- const toggleOpen = useCallback((e) => {
20
- e === null || e === void 0 ? void 0 : e.stopPropagation();
19
+ const toggleOpen = useCallback(() => {
21
20
  setOpen((open) => !open);
22
21
  }, []);
23
22
  const wrapperRef = useRef(null);
@@ -64,6 +64,9 @@ export const useMenus = (menus) => {
64
64
  const index = indices[depth];
65
65
  setPointer(transformPointer(depth, index));
66
66
  }
67
+ if (menu.options) {
68
+ setPointer([-1, -1, -1]);
69
+ }
67
70
  }, [state]);
68
71
  const ref = useRef(null);
69
72
  useEffect(() => {
@@ -21,4 +21,19 @@ interface MenusProps {
21
21
  handleClick: (position: number[]) => void;
22
22
  }
23
23
  export declare const Menus: React.FC<MenusProps>;
24
+ export declare const orderedListContextMenu: {
25
+ items: string[];
26
+ type: string;
27
+ }[];
28
+ export declare const bulletListContextMenu: {
29
+ items: string[];
30
+ type: string;
31
+ }[];
32
+ export declare const ListContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
33
+ export declare const StyleBlock: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
34
+ export declare const BlockItem: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
35
+ export declare const Block: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
36
+ export declare const Label: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
37
+ hide?: boolean | undefined;
38
+ }, never>;
24
39
  export {};
@@ -15,9 +15,13 @@
15
15
  */
16
16
  import { FootnoteNode } from '@manuscripts/transform';
17
17
  import React from 'react';
18
+ export type FootnoteWithIndex = {
19
+ node: FootnoteNode;
20
+ index?: string;
21
+ };
18
22
  export declare const TableFootnotesSelector: React.FC<{
19
- notes: FootnoteNode[];
23
+ notes: FootnoteWithIndex[];
20
24
  onAdd: () => void;
21
- onInsert: (notes: FootnoteNode[]) => void;
25
+ onInsert: (notes: FootnoteWithIndex[]) => void;
22
26
  onCancel: () => void;
23
27
  }>;
@@ -16,6 +16,6 @@
16
16
  /// <reference types="react" />
17
17
  export declare const useDropdown: () => {
18
18
  isOpen: boolean;
19
- toggleOpen: (e: any) => void;
19
+ toggleOpen: () => void;
20
20
  wrapperRef: import("react").RefObject<HTMLDivElement>;
21
21
  };
@@ -13,6 +13,8 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import { ManuscriptTransaction } from '@manuscripts/transform';
17
+ export type Dispatch = (tr: ManuscriptTransaction) => void;
16
18
  export interface MenuShortcut {
17
19
  mac: string;
18
20
  pc: string;
@@ -26,6 +28,9 @@ export interface MenuSpec {
26
28
  isEnabled: boolean;
27
29
  run?: () => void;
28
30
  submenu?: (MenuSpec | MenuSeparator)[];
31
+ options?: {
32
+ [key: string]: () => void;
33
+ };
29
34
  }
30
35
  export interface Menu extends MenuSpec {
31
36
  isOpen: boolean;
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": "1.8.2",
4
+ "version": "1.8.3-LEAN-3321-0",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",
@@ -33,8 +33,8 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@manuscripts/assets": "^0.6.4",
36
- "@manuscripts/json-schema": "^2.2.6",
37
- "@manuscripts/transform": "^2.1.6",
36
+ "@manuscripts/json-schema": "^2.2.7",
37
+ "@manuscripts/transform": "2.1.10-LEAN-3321",
38
38
  "@reach/tabs": "^0.18.0",
39
39
  "date-fns": "^2.29.3",
40
40
  "formik": "^2.2.9",
@@ -103,4 +103,4 @@
103
103
  "@types/react": "^17.0.2",
104
104
  "jackspeak": "2.1.1"
105
105
  }
106
- }
106
+ }