@manuscripts/style-guide 3.4.0 → 3.4.2

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.
Files changed (39) hide show
  1. package/dist/cjs/components/Checkbox.js +34 -16
  2. package/dist/cjs/components/ContextMenu.js +1 -1
  3. package/dist/cjs/components/Form.js +94 -1
  4. package/dist/cjs/components/Menus/Menus.js +3 -3
  5. package/dist/cjs/components/Menus/Shortcut.js +1 -1
  6. package/dist/cjs/components/Menus/Submenu.js +11 -7
  7. package/dist/cjs/components/MultiValueInput.js +3 -3
  8. package/dist/cjs/components/RadioButton.js +62 -39
  9. package/dist/cjs/components/SelectField.js +90 -1
  10. package/dist/cjs/components/StyledModal.js +20 -1
  11. package/dist/cjs/components/TextField.js +57 -11
  12. package/dist/cjs/components/ToggleSwitch.js +69 -0
  13. package/dist/cjs/hooks/use-menus.js +5 -3
  14. package/dist/cjs/index.js +1 -0
  15. package/dist/es/components/Checkbox.js +34 -16
  16. package/dist/es/components/ContextMenu.js +1 -1
  17. package/dist/es/components/Form.js +93 -0
  18. package/dist/es/components/Menus/Menus.js +3 -3
  19. package/dist/es/components/Menus/Shortcut.js +1 -1
  20. package/dist/es/components/Menus/Submenu.js +11 -7
  21. package/dist/es/components/MultiValueInput.js +3 -3
  22. package/dist/es/components/RadioButton.js +62 -39
  23. package/dist/es/components/SelectField.js +90 -1
  24. package/dist/es/components/StyledModal.js +19 -0
  25. package/dist/es/components/TextField.js +56 -10
  26. package/dist/es/components/ToggleSwitch.js +62 -0
  27. package/dist/es/hooks/use-menus.js +5 -3
  28. package/dist/es/index.js +1 -0
  29. package/dist/types/components/Form.d.ts +15 -0
  30. package/dist/types/components/Menus/Menus.d.ts +1 -1
  31. package/dist/types/components/Menus/Submenu.d.ts +1 -1
  32. package/dist/types/components/SelectField.d.ts +4 -1
  33. package/dist/types/components/StyledModal.d.ts +4 -0
  34. package/dist/types/components/TextField.d.ts +16 -4
  35. package/dist/types/components/ToggleSwitch.d.ts +25 -0
  36. package/dist/types/hooks/use-menus.d.ts +1 -1
  37. package/dist/types/index.d.ts +1 -0
  38. package/dist/types/lib/menus.d.ts +2 -1
  39. package/package.json +1 -1
@@ -1,33 +1,75 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Field } from 'formik';
2
3
  import styled, { css } from 'styled-components';
3
4
  export const commonStyles = css `
4
5
  border: 1px solid
5
6
  ${(props) => props.error
6
7
  ? props.theme.colors.border.error
7
8
  : props.theme.colors.border.field.default};
8
- border-radius: ${(props) => props.theme.grid.radius.small};
9
+ border-radius: 3px;
9
10
  box-sizing: border-box;
10
11
  font: ${(props) => props.theme.font.weight.normal}
11
12
  ${(props) => props.theme.font.size.medium} / 1
12
13
  ${(props) => props.theme.font.family.sans};
14
+ line-height: ${(props) => props.theme.font.lineHeight.large};
13
15
  outline: none;
14
- padding: 10px ${(props) => props.theme.grid.unit * 4}px;
16
+ padding: ${(props) => {
17
+ if (props.variant === 'small') {
18
+ return '0 12px';
19
+ }
20
+ if (props.variant === 'large') {
21
+ return '4px 16px';
22
+ }
23
+ return '0 12px';
24
+ }};
25
+ min-height: ${(props) => {
26
+ if (props.variant === 'small') {
27
+ return '32px';
28
+ }
29
+ if (props.variant === 'large') {
30
+ return '40px';
31
+ }
32
+ return '40px';
33
+ }};
15
34
  position: relative;
16
35
  width: 100%;
17
- ${(props) => props.error && 'z-index: 2'};
36
+ background-color: #fff;
37
+ color: ${(props) => props.theme.colors.text.primary};
38
+
39
+ &::placeholder {
40
+ color: ${(props) => props.theme.colors.text.secondary};
41
+ opacity: 1;
42
+ font-family: ${(props) => props.theme.font.family.sans};
43
+ font-size: ${(props) => props.theme.font.size.medium};
44
+ font-style: italic;
45
+ font-weight: ${(props) => props.theme.font.weight.normal};
46
+ line-height: ${(props) => props.theme.font.lineHeight.large};
47
+ }
18
48
 
19
- &:focus {
20
- border-color: ${(props) => props.theme.colors.border.field.hover};
21
- background-color: ${(props) => props.theme.colors.background.fifth};
49
+ &:hover:not(:disabled) {
50
+ background-color: #f2fbfc;
22
51
  }
23
52
 
24
- &:hover {
25
- background-color: ${(props) => props.theme.colors.background.fifth};
53
+ &:focus:not(:disabled) {
54
+ border: 2px solid
55
+ ${(props) => props.error
56
+ ? props.theme.colors.border.error
57
+ : props.theme.colors.brand.default};
58
+ background-color: #f2fbfc;
59
+
60
+ &::placeholder {
61
+ color: #c9c9c9;
62
+ }
26
63
  }
27
64
 
28
- &:invalid {
29
- box-shadow: none;
65
+ &:disabled {
66
+ background-color: #f5f5f5;
67
+ border-color: #e4e4e4;
68
+ color: #b3b3b3;
69
+ cursor: not-allowed;
30
70
  }
71
+
72
+ ${(props) => props.error && 'z-index: 2'};
31
73
  `;
32
74
  export const TextField = styled.input `
33
75
  display: block;
@@ -37,6 +79,10 @@ export const TextArea = styled.textarea `
37
79
  ${commonStyles}
38
80
  max-width: 100%;
39
81
  `;
82
+ export const YearInput = styled.input `
83
+ ${commonStyles}
84
+ `;
85
+ export const YearField = styled(Field).attrs({ as: YearInput }) ``;
40
86
  export const TextFieldGroup = styled.div `
41
87
  & ${TextField}:first-of-type {
42
88
  margin-top: ${(props) => props.theme.grid.unit}px;
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import styled from 'styled-components';
3
+ const Track = styled.button `
4
+ position: relative;
5
+ width: 30px;
6
+ height: 16px;
7
+ border-radius: 999px;
8
+ border: 1px solid
9
+ ${(props) => props.checked ? '#0d79d0' : props.theme.colors.text.secondary};
10
+ background: ${(props) => props.checked ? '#0d79d0' : props.theme.colors.text.secondary};
11
+ padding: 0;
12
+ cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};
13
+ transition:
14
+ background-color 120ms ease,
15
+ border-color 120ms ease,
16
+ box-shadow 120ms ease;
17
+ outline: none;
18
+ flex-shrink: 0;
19
+
20
+ &:focus-visible {
21
+ box-shadow: 0 0 0 2px #0d79d04d;
22
+ }
23
+
24
+ &:disabled {
25
+ background: #c9c9c9;
26
+ border-color: #c9c9c9;
27
+ }
28
+ `;
29
+ const Thumb = styled.span `
30
+ position: absolute;
31
+ top: 0;
32
+ left: ${(props) => (props.checked ? '14px' : '0px')};
33
+ width: 14px;
34
+ height: 14px;
35
+ border-radius: 50%;
36
+ background: #fff;
37
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
38
+ transition: left 120ms ease;
39
+
40
+ ${(props) => props.disabled &&
41
+ `
42
+ background: #fdfdfd;
43
+ box-shadow: none;
44
+ `}
45
+ `;
46
+ const LabelText = styled.span `
47
+ color: ${(props) => props.disabled ? '#b3b3b3' : props.theme.colors.text.primary};
48
+ font: ${(props) => props.theme.font.weight.normal}
49
+ ${(props) => props.theme.font.size.medium} / 1
50
+ ${(props) => props.theme.font.family.sans};
51
+ line-height: 20px;
52
+ `;
53
+ const Container = styled.label `
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: 8px;
57
+ cursor: pointer;
58
+ flex-direction: ${(props) => props.labelPosition === 'left' ? 'row' : 'row-reverse'};
59
+ `;
60
+ export const ToggleSwitch = ({ checked, disabled, onChange, label, id, labelPosition = 'left', }) => {
61
+ return (_jsxs(Container, { labelPosition: labelPosition, children: [label && _jsx(LabelText, { disabled: disabled, children: label }), _jsx(Track, { id: id, type: "button", role: "switch", "aria-checked": checked, "aria-label": label, checked: checked, disabled: disabled, onClick: () => !disabled && onChange(!checked), children: _jsx(Thumb, { checked: checked, disabled: disabled }) })] }));
62
+ };
@@ -28,6 +28,7 @@ const getSubmenuState = (specs, pointer, position) => {
28
28
  const current = [...position, index];
29
29
  return {
30
30
  ...spec,
31
+ position: current,
31
32
  submenu: spec.submenu && getSubmenuState(spec.submenu, pointer, current),
32
33
  isOpen: isPart(pointer, current),
33
34
  };
@@ -38,6 +39,7 @@ const getMenuState = (specs, pointer) => {
38
39
  const position = [index];
39
40
  return {
40
41
  ...spec,
42
+ position,
41
43
  submenu: spec.submenu && getSubmenuState(spec.submenu, pointer, position),
42
44
  isOpen: isPart(pointer, position),
43
45
  };
@@ -86,13 +88,13 @@ export const useMenus = (menus) => {
86
88
  document.removeEventListener('click', handleClickOutside);
87
89
  };
88
90
  }, []);
89
- const closeAll = useCallback(() => {
90
- setPointer(initialPointer);
91
+ const close = useCallback((depth) => {
92
+ setPointer(depth === undefined ? initialPointer : transformPointer(depth, -1));
91
93
  }, []);
92
94
  return {
93
95
  menus: state,
94
96
  handleClick,
95
- closeAll,
97
+ close,
96
98
  ref,
97
99
  };
98
100
  };
package/dist/es/index.js CHANGED
@@ -34,6 +34,7 @@ export * from './components/TextField';
34
34
  export * from './components/TextFieldContainer';
35
35
  export * from './components/TextFieldError';
36
36
  export * from './components/TextFieldGroupContainer';
37
+ export * from './components/ToggleSwitch';
37
38
  export { ToggleHeader, ToggleIcon } from './components/ToggleHeader';
38
39
  export * from './components/Tooltip';
39
40
  export * from './components/icons';
@@ -23,3 +23,18 @@ export interface FormErrors {
23
23
  export interface ErrorProps {
24
24
  error?: string | null | Record<string, unknown>;
25
25
  }
26
+ export declare const FormContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
27
+ export declare const FormField: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
28
+ export declare const FormRow: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
29
+ direction?: "row" | "column";
30
+ justify?: string;
31
+ align?: string;
32
+ }, never>;
33
+ export declare const FormLabel: import("styled-components").StyledComponent<"legend", import("styled-components").DefaultTheme, {}, never>;
34
+ export declare const FormActionsBar: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
35
+ export declare const FormTitle: import("styled-components").StyledComponent<"h2", import("styled-components").DefaultTheme, {}, never>;
36
+ export declare const FormSubtitle: import("styled-components").StyledComponent<"p", import("styled-components").DefaultTheme, {}, never>;
37
+ export declare const Label: import("styled-components").StyledComponent<"label", import("styled-components").DefaultTheme, {}, never>;
38
+ export declare const LabelText: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
39
+ export declare const InputHelperText: import("styled-components").StyledComponent<"span", import("styled-components").DefaultTheme, {}, never>;
40
+ export declare const InputErrorText: import("styled-components").StyledComponent<"span", import("styled-components").DefaultTheme, {}, never>;
@@ -19,7 +19,7 @@ interface MenusProps {
19
19
  menus: Menu[];
20
20
  innerRef: Ref<HTMLDivElement>;
21
21
  handleClick: (position: number[]) => void;
22
- closeAll: () => void;
22
+ close: (depth?: number) => void;
23
23
  }
24
24
  export declare const Menus: React.FC<MenusProps>;
25
25
  export {};
@@ -23,7 +23,7 @@ export declare const NestedSubmenusContainer: import("styled-components").Styled
23
23
  export interface SubmenuProps {
24
24
  menu: Menu | MenuSeparator;
25
25
  handleClick: (position: number[]) => void;
26
- closeAll: () => void;
26
+ close: (depth?: number) => void;
27
27
  }
28
28
  export declare const SubmenuLabel: React.FC<SubmenuProps>;
29
29
  export declare const Submenu: React.FC<SubmenuProps>;
@@ -22,6 +22,9 @@ export type OptionType = {
22
22
  interface Props {
23
23
  id?: string;
24
24
  options: OptionType[];
25
+ error?: boolean;
26
+ variant?: 'small' | 'large';
27
+ isDisabled?: boolean;
25
28
  }
26
- export declare const SelectField: React.FC<Props & FieldProps>;
29
+ export declare const SelectField: React.FC<Props & Partial<FieldProps>>;
27
30
  export {};
@@ -44,6 +44,10 @@ export declare const ModalSidebarHeader: import("styled-components").StyledCompo
44
44
  export declare const ModalSidebarTitle: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
45
45
  export declare const ModelContent: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
46
46
  export declare const ScrollableModalContent: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
47
+ export declare const ModalCardBody: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {
48
+ width?: number | string;
49
+ }, never>;
50
+ export declare const ModalTitle: import("styled-components").StyledComponent<"h2", import("styled-components").DefaultTheme, {}, never>;
47
51
  export declare const StyledModal: import("styled-components").StyledComponent<React.FC<ReactModal.Props & ThemeProps<ReactModal> & Props>, import("styled-components").DefaultTheme, {
48
52
  closeTimeoutMS: 800;
49
53
  overlayClassName: {
@@ -13,11 +13,23 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import { Field } from 'formik';
16
17
  import React from 'react';
17
- import { ErrorProps } from './Form';
18
- export declare const commonStyles: import("styled-components").FlattenInterpolation<import("styled-components").ThemedStyledProps<ErrorProps, import("styled-components").DefaultTheme>>;
19
- export declare const TextField: import("styled-components").StyledComponent<"input", import("styled-components").DefaultTheme, ErrorProps, never>;
20
- export declare const TextArea: import("styled-components").StyledComponent<"textarea", import("styled-components").DefaultTheme, ErrorProps, never>;
18
+ export interface BaseTextFieldProps {
19
+ error?: boolean | string;
20
+ variant?: 'small' | 'large';
21
+ }
22
+ export interface TextFieldProps extends React.InputHTMLAttributes<HTMLInputElement>, BaseTextFieldProps {
23
+ }
24
+ export interface TextAreaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>, BaseTextFieldProps {
25
+ }
26
+ export declare const commonStyles: import("styled-components").FlattenInterpolation<import("styled-components").ThemedStyledProps<BaseTextFieldProps, import("styled-components").DefaultTheme>>;
27
+ export declare const TextField: import("styled-components").StyledComponent<"input", import("styled-components").DefaultTheme, TextFieldProps, never>;
28
+ export declare const TextArea: import("styled-components").StyledComponent<"textarea", import("styled-components").DefaultTheme, TextAreaProps, never>;
29
+ export declare const YearInput: import("styled-components").StyledComponent<"input", import("styled-components").DefaultTheme, TextFieldProps, never>;
30
+ export declare const YearField: import("styled-components").StyledComponent<typeof Field, import("styled-components").DefaultTheme, {
31
+ as: import("styled-components").StyledComponent<"input", import("styled-components").DefaultTheme, TextFieldProps, never>;
32
+ }, "as">;
21
33
  export declare const TextFieldGroup: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
22
34
  export declare const TextFieldLabel: import("styled-components").StyledComponent<"label", import("styled-components").DefaultTheme, {}, never>;
23
35
  export declare const TextFieldWrapper: React.FC<{
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * © 2026 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 interface ToggleSwitchProps {
18
+ checked: boolean;
19
+ disabled?: boolean;
20
+ onChange: (checked: boolean) => void;
21
+ label?: string;
22
+ id?: string;
23
+ labelPosition?: 'left' | 'right';
24
+ }
25
+ export declare const ToggleSwitch: React.FC<ToggleSwitchProps>;
@@ -2,6 +2,6 @@ import { Menu, MenuSpec } from '../lib/menus';
2
2
  export declare const useMenus: (menus: MenuSpec[]) => {
3
3
  menus: Menu[];
4
4
  handleClick: (indices: number[]) => void;
5
- closeAll: () => void;
5
+ close: (depth?: number) => void;
6
6
  ref: import("react").RefObject<HTMLDivElement | null>;
7
7
  };
@@ -35,6 +35,7 @@ export * from './components/TextField';
35
35
  export * from './components/TextFieldContainer';
36
36
  export * from './components/TextFieldError';
37
37
  export * from './components/TextFieldGroupContainer';
38
+ export * from './components/ToggleSwitch';
38
39
  export { ToggleHeader, ToggleIcon } from './components/ToggleHeader';
39
40
  export * from './components/Tooltip';
40
41
  export * from './components/icons';
@@ -21,7 +21,7 @@ export interface MenuShortcut {
21
21
  export interface MenuComponentProps {
22
22
  menu: Menu;
23
23
  handleClick: (position: number[]) => void;
24
- closeAll: () => void;
24
+ close: (depth?: number) => void;
25
25
  }
26
26
  export interface MenuSpec {
27
27
  id: string;
@@ -38,6 +38,7 @@ export interface MenuSpec {
38
38
  export interface Menu extends MenuSpec {
39
39
  isOpen: boolean;
40
40
  submenu?: (Menu | MenuSeparator)[];
41
+ position?: number[];
41
42
  }
42
43
  export type MenuSeparator = {
43
44
  role: 'separator';
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.4.0",
4
+ "version": "3.4.2",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-style-guide",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",