@manuscripts/style-guide 2.0.28 → 2.0.29-LEAN-4077.3

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.
@@ -38,6 +38,7 @@ const icons = {
38
38
  Edit: icons_1.EditIcon,
39
39
  AddOutline: icons_1.AddOutlineIcon,
40
40
  Scroll: icons_1.ScrollIcon,
41
+ Delete: icons_1.DeleteIcon,
41
42
  };
42
43
  const ContextMenu = ({ actions }) => (react_1.default.createElement(Button_1.IconButtonGroup, { size: 32 }, actions.map((action) => {
43
44
  const Icon = icons[action.icon];
@@ -83,6 +83,7 @@ var Category;
83
83
  (function (Category) {
84
84
  Category["error"] = "error";
85
85
  Category["confirmation"] = "confirmation";
86
+ Category["warning"] = "warning";
86
87
  })(Category = exports.Category || (exports.Category = {}));
87
88
  const PrimaryAction = (props) => props.isDestructive ? (props.hasForm ? (react_1.default.createElement(Button_1.PrimaryButton, { danger: true, disabled: props.disabled, form: "formDialog", type: "submit" }, props.title)) : (react_1.default.createElement(Button_1.PrimaryButton, { danger: true, disabled: props.disabled, onClick: props.action, autoFocus: true }, props.title))) : props.hasForm ? (react_1.default.createElement(Button_1.PrimaryButton, { disabled: props.disabled, form: "formDialog", type: "submit" }, props.title)) : (react_1.default.createElement(Button_1.PrimaryButton, { disabled: props.disabled, onClick: props.action, autoFocus: true }, props.title));
88
89
  const SecondaryAction = (props) => (react_1.default.createElement(Button_1.SecondaryButton, { disabled: props.disabled, onClick: props.action }, props.title));
@@ -125,6 +126,8 @@ class Dialog extends react_1.default.Component {
125
126
  react_1.default.createElement(HeaderContainer, null,
126
127
  category === Category.error && (react_1.default.createElement(Icon, null,
127
128
  react_1.default.createElement(icons_1.AttentionRedIcon, null))),
129
+ category === Category.warning && (react_1.default.createElement(Icon, null,
130
+ react_1.default.createElement(icons_1.AttentionOrangeIcon, null))),
128
131
  header),
129
132
  react_1.default.createElement(exports.MessageContainer, null,
130
133
  message,
@@ -0,0 +1,139 @@
1
+ "use strict";
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 (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.MultiValueInput = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const styled_components_1 = __importDefault(require("styled-components"));
32
+ const TextField_1 = require("./TextField");
33
+ const Container = styled_components_1.default.div `
34
+ ${TextField_1.commonStyles}
35
+
36
+ display: flex;
37
+ flex-wrap: wrap;
38
+ gap: 4px;
39
+ align-items: center;
40
+ padding: 0;
41
+ background: hotpink
42
+
43
+
44
+ &:hover Input {
45
+ background-color: ${(props) => props.theme.colors.background.fifth};
46
+ }
47
+ &:has(Input:focus) {
48
+ background-color: ${(props) => props.theme.colors.background.fifth};
49
+ border-color: ${(props) => props.theme.colors.border.field.hover};
50
+ }
51
+ `;
52
+ const Chip = styled_components_1.default.span `
53
+ display: flex;
54
+ align-items: center;
55
+ background-color: #f2f2f2;
56
+ color: ${(props) => props.theme.colors.text.primary};
57
+ border-radius: 12px;
58
+ border: 1px solid ${(props) => props.theme.colors.border.tertiary};
59
+ padding: ${(props) => props.theme.grid.unit}px;
60
+ font-size: ${(props) => props.theme.font.size.small};
61
+ line-height: ${(props) => props.theme.font.lineHeight.normal};
62
+
63
+ & + Input {
64
+ padding-left: 0;
65
+ }
66
+ `;
67
+ const RemoveButton = styled_components_1.default.button `
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ width: 10px;
72
+ height: 10px;
73
+ color: white;
74
+ background: #6e6e6e;
75
+ margin-left: 4px;
76
+ border: none;
77
+ border-radius: 100%;
78
+ cursor: pointer;
79
+ font-size: 10px;
80
+
81
+ &:hover {
82
+ background: black;
83
+ }
84
+ `;
85
+ const Input = styled_components_1.default.input `
86
+ ${TextField_1.commonStyles}
87
+
88
+ border: none;
89
+ flex: 1;
90
+ min-width: 6em;
91
+ padding: 10px 16px;
92
+
93
+ appearance: none;
94
+ -moz-appearance: textfield;
95
+ -webkit-appearance: none;
96
+
97
+ &::-webkit-outer-spin-button,
98
+ &::-webkit-inner-spin-button {
99
+ -webkit-appearance: none;
100
+ margin: 0;
101
+ }
102
+
103
+ &::-moz-appearance: textfield;
104
+ `;
105
+ const MultiValueInput = ({ inputType, initialValues = [], onChange, }) => {
106
+ const [values, setValues] = (0, react_1.useState)(initialValues);
107
+ const [currentValue, setCurrentValue] = (0, react_1.useState)('');
108
+ const handleAddValue = (e) => {
109
+ if (e.key === 'Enter' && currentValue.trim()) {
110
+ e.preventDefault();
111
+ if (!values.includes(currentValue.trim())) {
112
+ const updatedValues = [...values, currentValue.trim()];
113
+ setValues(updatedValues);
114
+ onChange === null || onChange === void 0 ? void 0 : onChange(updatedValues);
115
+ }
116
+ setCurrentValue('');
117
+ }
118
+ };
119
+ const handleInputChange = (e) => {
120
+ const value = e.target.value;
121
+ if (inputType === 'number' && /^\d*$/.test(value)) {
122
+ setCurrentValue(value);
123
+ }
124
+ else if (inputType === 'text') {
125
+ setCurrentValue(value);
126
+ }
127
+ };
128
+ const handleRemoveValue = (index) => {
129
+ const updatedValues = values.filter((_, i) => i !== index);
130
+ setValues(updatedValues);
131
+ onChange === null || onChange === void 0 ? void 0 : onChange(updatedValues);
132
+ };
133
+ return (react_1.default.createElement(Container, null,
134
+ values.map((value, index) => (react_1.default.createElement(Chip, { key: index },
135
+ value,
136
+ react_1.default.createElement(RemoveButton, { onMouseUp: () => handleRemoveValue(index) }, "\u00D7")))),
137
+ react_1.default.createElement(Input, { type: inputType, value: currentValue, onChange: handleInputChange, onKeyDown: handleAddValue, placeholder: inputType === 'number' ? 'Enter number' : 'Enter text' })));
138
+ };
139
+ exports.MultiValueInput = MultiValueInput;
@@ -41,10 +41,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
41
41
  return (mod && mod.__esModule) ? mod : { "default": mod };
42
42
  };
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.TextFieldWrapper = exports.TextFieldLabel = exports.TextFieldGroup = exports.TextArea = exports.TextField = void 0;
44
+ exports.TextFieldWrapper = exports.TextFieldLabel = exports.TextFieldGroup = exports.TextArea = exports.TextField = exports.commonStyles = void 0;
45
45
  const react_1 = __importDefault(require("react"));
46
46
  const styled_components_1 = __importStar(require("styled-components"));
47
- const commonStyles = (0, styled_components_1.css) `
47
+ exports.commonStyles = (0, styled_components_1.css) `
48
48
  border: 1px solid
49
49
  ${(props) => props.error
50
50
  ? props.theme.colors.border.error
@@ -75,10 +75,10 @@ const commonStyles = (0, styled_components_1.css) `
75
75
  `;
76
76
  exports.TextField = styled_components_1.default.input `
77
77
  display: block;
78
- ${commonStyles}
78
+ ${exports.commonStyles}
79
79
  `;
80
80
  exports.TextArea = styled_components_1.default.textarea `
81
- ${commonStyles}
81
+ ${exports.commonStyles}
82
82
  max-width: 100%;
83
83
  `;
84
84
  exports.TextFieldGroup = styled_components_1.default.div `
package/dist/cjs/index.js CHANGED
@@ -42,6 +42,7 @@ __exportStar(require("./components/Avatar"), exports);
42
42
  __exportStar(require("./components/Dialog"), exports);
43
43
  __exportStar(require("./components/Checkbox"), exports);
44
44
  __exportStar(require("./components/Form"), exports);
45
+ __exportStar(require("./components/MultiValueInput"), exports);
45
46
  __exportStar(require("./components/Resizer"), exports);
46
47
  __exportStar(require("./components/SaveStatus"), exports);
47
48
  __exportStar(require("./components/StyledModal"), exports);
@@ -16,7 +16,7 @@
16
16
  import React from 'react';
17
17
  import styled from 'styled-components';
18
18
  import { IconButton, IconButtonGroup } from './Button';
19
- import { AddCommentIcon, AddOutlineIcon, EditIcon, ScrollIcon } from './icons';
19
+ import { AddCommentIcon, AddOutlineIcon, DeleteIcon, EditIcon, ScrollIcon, } from './icons';
20
20
  import { Tooltip } from './Tooltip';
21
21
  const ContextMenuIconButton = styled(IconButton) `
22
22
  color: #6e6e6e;
@@ -32,6 +32,7 @@ const icons = {
32
32
  Edit: EditIcon,
33
33
  AddOutline: AddOutlineIcon,
34
34
  Scroll: ScrollIcon,
35
+ Delete: DeleteIcon,
35
36
  };
36
37
  export const ContextMenu = ({ actions }) => (React.createElement(IconButtonGroup, { size: 32 }, actions.map((action) => {
37
38
  const Icon = icons[action.icon];
@@ -25,7 +25,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
25
25
  import React from 'react';
26
26
  import styled from 'styled-components';
27
27
  import { ButtonGroup, PrimaryButton, SecondaryButton } from './Button';
28
- import { AttentionRedIcon } from './icons';
28
+ import { AttentionOrangeIcon, AttentionRedIcon } from './icons';
29
29
  import { StyledModal } from './StyledModal';
30
30
  import { TextField } from './TextField';
31
31
  const Icon = styled.div `
@@ -77,6 +77,7 @@ export var Category;
77
77
  (function (Category) {
78
78
  Category["error"] = "error";
79
79
  Category["confirmation"] = "confirmation";
80
+ Category["warning"] = "warning";
80
81
  })(Category || (Category = {}));
81
82
  const PrimaryAction = (props) => props.isDestructive ? (props.hasForm ? (React.createElement(PrimaryButton, { danger: true, disabled: props.disabled, form: "formDialog", type: "submit" }, props.title)) : (React.createElement(PrimaryButton, { danger: true, disabled: props.disabled, onClick: props.action, autoFocus: true }, props.title))) : props.hasForm ? (React.createElement(PrimaryButton, { disabled: props.disabled, form: "formDialog", type: "submit" }, props.title)) : (React.createElement(PrimaryButton, { disabled: props.disabled, onClick: props.action, autoFocus: true }, props.title));
82
83
  const SecondaryAction = (props) => (React.createElement(SecondaryButton, { disabled: props.disabled, onClick: props.action }, props.title));
@@ -119,6 +120,8 @@ export class Dialog extends React.Component {
119
120
  React.createElement(HeaderContainer, null,
120
121
  category === Category.error && (React.createElement(Icon, null,
121
122
  React.createElement(AttentionRedIcon, null))),
123
+ category === Category.warning && (React.createElement(Icon, null,
124
+ React.createElement(AttentionOrangeIcon, null))),
122
125
  header),
123
126
  React.createElement(MessageContainer, null,
124
127
  message,
@@ -0,0 +1,109 @@
1
+ import React, { useState } from 'react';
2
+ import styled from 'styled-components';
3
+ import { commonStyles } from './TextField';
4
+ const Container = styled.div `
5
+ ${commonStyles}
6
+
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ gap: 4px;
10
+ align-items: center;
11
+ padding: 0;
12
+ background: hotpink
13
+
14
+
15
+ &:hover Input {
16
+ background-color: ${(props) => props.theme.colors.background.fifth};
17
+ }
18
+ &:has(Input:focus) {
19
+ background-color: ${(props) => props.theme.colors.background.fifth};
20
+ border-color: ${(props) => props.theme.colors.border.field.hover};
21
+ }
22
+ `;
23
+ const Chip = styled.span `
24
+ display: flex;
25
+ align-items: center;
26
+ background-color: #f2f2f2;
27
+ color: ${(props) => props.theme.colors.text.primary};
28
+ border-radius: 12px;
29
+ border: 1px solid ${(props) => props.theme.colors.border.tertiary};
30
+ padding: ${(props) => props.theme.grid.unit}px;
31
+ font-size: ${(props) => props.theme.font.size.small};
32
+ line-height: ${(props) => props.theme.font.lineHeight.normal};
33
+
34
+ & + Input {
35
+ padding-left: 0;
36
+ }
37
+ `;
38
+ const RemoveButton = styled.button `
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ width: 10px;
43
+ height: 10px;
44
+ color: white;
45
+ background: #6e6e6e;
46
+ margin-left: 4px;
47
+ border: none;
48
+ border-radius: 100%;
49
+ cursor: pointer;
50
+ font-size: 10px;
51
+
52
+ &:hover {
53
+ background: black;
54
+ }
55
+ `;
56
+ const Input = styled.input `
57
+ ${commonStyles}
58
+
59
+ border: none;
60
+ flex: 1;
61
+ min-width: 6em;
62
+ padding: 10px 16px;
63
+
64
+ appearance: none;
65
+ -moz-appearance: textfield;
66
+ -webkit-appearance: none;
67
+
68
+ &::-webkit-outer-spin-button,
69
+ &::-webkit-inner-spin-button {
70
+ -webkit-appearance: none;
71
+ margin: 0;
72
+ }
73
+
74
+ &::-moz-appearance: textfield;
75
+ `;
76
+ export const MultiValueInput = ({ inputType, initialValues = [], onChange, }) => {
77
+ const [values, setValues] = useState(initialValues);
78
+ const [currentValue, setCurrentValue] = useState('');
79
+ const handleAddValue = (e) => {
80
+ if (e.key === 'Enter' && currentValue.trim()) {
81
+ e.preventDefault();
82
+ if (!values.includes(currentValue.trim())) {
83
+ const updatedValues = [...values, currentValue.trim()];
84
+ setValues(updatedValues);
85
+ onChange === null || onChange === void 0 ? void 0 : onChange(updatedValues);
86
+ }
87
+ setCurrentValue('');
88
+ }
89
+ };
90
+ const handleInputChange = (e) => {
91
+ const value = e.target.value;
92
+ if (inputType === 'number' && /^\d*$/.test(value)) {
93
+ setCurrentValue(value);
94
+ }
95
+ else if (inputType === 'text') {
96
+ setCurrentValue(value);
97
+ }
98
+ };
99
+ const handleRemoveValue = (index) => {
100
+ const updatedValues = values.filter((_, i) => i !== index);
101
+ setValues(updatedValues);
102
+ onChange === null || onChange === void 0 ? void 0 : onChange(updatedValues);
103
+ };
104
+ return (React.createElement(Container, null,
105
+ values.map((value, index) => (React.createElement(Chip, { key: index },
106
+ value,
107
+ React.createElement(RemoveButton, { onMouseUp: () => handleRemoveValue(index) }, "\u00D7")))),
108
+ React.createElement(Input, { type: inputType, value: currentValue, onChange: handleInputChange, onKeyDown: handleAddValue, placeholder: inputType === 'number' ? 'Enter number' : 'Enter text' })));
109
+ };
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import React from 'react';
17
17
  import styled, { css } from 'styled-components';
18
- const commonStyles = css `
18
+ export const commonStyles = css `
19
19
  border: 1px solid
20
20
  ${(props) => props.error
21
21
  ? props.theme.colors.border.error
package/dist/es/index.js CHANGED
@@ -22,6 +22,7 @@ export * from './components/Avatar';
22
22
  export * from './components/Dialog';
23
23
  export * from './components/Checkbox';
24
24
  export * from './components/Form';
25
+ export * from './components/MultiValueInput';
25
26
  export * from './components/Resizer';
26
27
  export * from './components/SaveStatus';
27
28
  export * from './components/StyledModal';
@@ -42,7 +42,8 @@ interface DialogProps {
42
42
  }
43
43
  export declare enum Category {
44
44
  error = "error",
45
- confirmation = "confirmation"
45
+ confirmation = "confirmation",
46
+ warning = "warning"
46
47
  }
47
48
  export declare class Dialog extends React.Component<DialogProps, DialogState> {
48
49
  state: DialogState;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface MultiValueInputProps {
3
+ inputType: 'text' | 'number';
4
+ initialValues?: string[];
5
+ onChange?: (values: string[]) => void;
6
+ }
7
+ export declare const MultiValueInput: React.FC<MultiValueInputProps>;
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import React from 'react';
17
17
  import { ErrorProps } from './Form';
18
+ export declare const commonStyles: import("styled-components").FlattenInterpolation<import("styled-components").ThemedStyledProps<ErrorProps, import("styled-components").DefaultTheme>>;
18
19
  export declare const TextField: import("styled-components").StyledComponent<"input", import("styled-components").DefaultTheme, ErrorProps, never>;
19
20
  export declare const TextArea: import("styled-components").StyledComponent<"textarea", import("styled-components").DefaultTheme, ErrorProps, never>;
20
21
  export declare const TextFieldGroup: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
@@ -23,6 +23,7 @@ export * from './components/Avatar';
23
23
  export * from './components/Dialog';
24
24
  export * from './components/Checkbox';
25
25
  export * from './components/Form';
26
+ export * from './components/MultiValueInput';
26
27
  export * from './components/Resizer';
27
28
  export * from './components/SaveStatus';
28
29
  export * from './components/StyledModal';
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.28",
4
+ "version": "2.0.29-LEAN-4077.3",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",