@vertigis/react-ui 14.0.0 → 14.0.1

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.
@@ -67,7 +67,7 @@ const Root = styled(Box)(({ theme: { palette, shape, typography } }) => ({
67
67
  },
68
68
  },
69
69
  }));
70
- export const ColorInput = forwardRef(function ColorInput({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ButtonProps, className, classes: classesProp, disabled, presetColors, onChange, value: unsanitizedValue, sketchPickerStyle = {}, ...others }, ref) {
70
+ export const ColorInput = forwardRef(({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, ButtonProps, className, classes: classesProp, disabled, presetColors, onChange, value: unsanitizedValue, sketchPickerStyle = {}, ...others }, ref) => {
71
71
  const theme = useTheme();
72
72
  const [buttonEl, setButtonEl] = useState();
73
73
  const handleColorPopoverOpen = (event) => setButtonEl(event.currentTarget);
@@ -82,7 +82,7 @@ export const ColorInput = forwardRef(function ColorInput({ "aria-labelledby": ar
82
82
  // See https://github.com/mui-org/material-ui/pull/20278.
83
83
  const muiFormControl = useFormControl();
84
84
  // `RGB(0,0,0)` will fail, we should instead convert to `rgb(0,0,0)`
85
- const value = unsanitizedValue && unsanitizedValue.toLowerCase();
85
+ const value = unsanitizedValue?.toLowerCase();
86
86
  // Color allows us to easily convert between different color types
87
87
  const color = parseColor(value);
88
88
  // The rgb object will be used for passing values to the color picker component
@@ -113,7 +113,7 @@ export const ColorInput = forwardRef(function ColorInput({ "aria-labelledby": ar
113
113
  g: rgb.g,
114
114
  b: rgb.b,
115
115
  a: rgb.alpha,
116
- }, onChangeComplete: handleColorPickerChangeComplete, presetColors: presetColors || defaultColors, styles: {
116
+ }, onChangeComplete: handleColorPickerChangeComplete, presetColors: presetColors ?? defaultColors, styles: {
117
117
  default: {
118
118
  picker: {
119
119
  background: theme.palette.background.paper,
@@ -74,7 +74,7 @@ const CopyableText = forwardRef((props, ref) => {
74
74
  readOnly: true,
75
75
  "data-test": "CopyableText-Input",
76
76
  ...inputProps,
77
- }, inputRef: mergeRefs(ref, localRef), value: value || "", "data-test": "CopyableText-Input-Wrapper", ...otherInputProps }), _jsx(Tooltip, { "data-test": "CopyableText-Tooltip", open: open, onOpen: handleTooltipOpen, onClose: handleTooltipClose, title: showClickedMessage ? tooltipCopiedText : tooltipCopyText, placement: "bottom", children: _jsx(Button, { className: classes.iconButton, "data-test": "CopyableText-IconButton", disabled: !value, onClick: handleCopyUrl, onMouseDown: handleMouseDown, children: _jsx(CopyIcon, {}) }) })] }));
77
+ }, inputRef: mergeRefs(ref, localRef), value: value ?? "", "data-test": "CopyableText-Input-Wrapper", ...otherInputProps }), _jsx(Tooltip, { "data-test": "CopyableText-Tooltip", open: open, onOpen: handleTooltipOpen, onClose: handleTooltipClose, title: showClickedMessage ? tooltipCopiedText : tooltipCopyText, placement: "bottom", children: _jsx(Button, { className: classes.iconButton, "data-test": "CopyableText-IconButton", disabled: !value, onClick: handleCopyUrl, onMouseDown: handleMouseDown, children: _jsx(CopyIcon, {}) }) })] }));
78
78
  });
79
79
  CopyableText.displayName = "CopyableText";
80
80
  export default CopyableText;
@@ -22,7 +22,7 @@ const StyledMUIFormControl = styled(MUIFormControl)({
22
22
  /**
23
23
  * A simple extension for a Form Control that includes inline help.
24
24
  */
25
- const FormControl = forwardRef(function FormControl(props, ref) {
25
+ const FormControl = forwardRef((props, ref) => {
26
26
  const { children, classes, inlineHelpContent, inlineHelpUrl, inlineHelpTitle, ...other } = props;
27
27
  const { inlineHelp: inlineHelpClass, ...otherClasses } = mergeStyles(gcxFormControlClasses, classes);
28
28
  return (_jsxs(StyledMUIFormControl, { ...other, classes: otherClasses, ref: ref, children: [children, inlineHelpContent && (_jsx(InlineHelp, { title: inlineHelpTitle, className: inlineHelpClass, url: inlineHelpUrl, children: inlineHelpContent }))] }));
@@ -22,7 +22,7 @@ const StyledMUIFormLabel = styled(MUIFormLabel)(({ theme: { spacing, palette } }
22
22
  fontSize: "0.875em",
23
23
  },
24
24
  }));
25
- export const FormLabel = forwardRef(function FormLabel(props, ref) {
25
+ export const FormLabel = forwardRef((props, ref) => {
26
26
  const { children, classes, className, error: errorProp, ...other } = props;
27
27
  // Careful. `useFormControl` can return undefined.
28
28
  // See https://github.com/mui-org/material-ui/pull/20278.
@@ -10,8 +10,8 @@ import { useId } from "../utils/react.js";
10
10
  * Like TextField, but uses a FormLabel instead of an InputLabel. Also allows
11
11
  * for inline help.
12
12
  */
13
- const FormLabelAutocompleteField = forwardRef(function FormLabelAutocompleteField(props, ref) {
14
- const { AutocompleteProps, defaultValue, disableClearable, disabled, filterOptions, FormHelperTextProps, fullWidth = false, getOptionLabel, helperText, id: idProp, label, onBlur, onChange, onFocus, options, placeholder, value, ...other } = props;
13
+ const FormLabelAutocompleteField = forwardRef((props, ref) => {
14
+ const { AutocompleteProps, defaultValue, disableClearable, disabled, filterOptions, FormHelperTextProps, fullWidth = false, getOptionLabel, helperText, id: idProp, label, onBlur, onChange, onFocus, options, value, ...other } = props;
15
15
  const id = useId(idProp);
16
16
  const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
17
17
  const inputLabelId = label && id ? `${id}-label` : undefined;
@@ -9,12 +9,12 @@ import { useId } from "../utils/react.js";
9
9
  * Like TextField, but uses a FormLabel instead of an InputLabel. Also allows
10
10
  * for inline help.
11
11
  */
12
- const FormLabelColorField = forwardRef(function FormLabelColorField(props, ref) {
12
+ const FormLabelColorField = forwardRef((props, ref) => {
13
13
  const { defaultValue, FormHelperTextProps, fullWidth = false, helperText, id: idProp, label, onBlur, onChange, onFocus, placeholder, type, value, disabled, ColorInputProps, ...other } = props;
14
14
  const id = useId(idProp);
15
15
  const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
16
16
  const inputLabelId = label && id ? `${id}-label` : undefined;
17
- return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, disabled: disabled, ...other, children: [label && (_jsx(FormLabel, { htmlFor: id, id: inputLabelId, children: label })), helperText && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: helperText })), _jsx(ColorInput, { id: id, placeholder: placeholder, onBlur: onBlur, onFocus: onFocus, defaultValue: defaultValue, "aria-describedby": helperTextId, "aria-labelledby": inputLabelId, onChange: onChange, value: value, disabled: disabled, ...ColorInputProps,
17
+ return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, disabled: disabled, ...other, children: [label && (_jsx(FormLabel, { htmlFor: id, id: inputLabelId, children: label })), helperText && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: helperText })), _jsx(ColorInput, { id: id, onBlur: onBlur, onFocus: onFocus, defaultValue: defaultValue, "aria-describedby": helperTextId, "aria-labelledby": inputLabelId, onChange: onChange, value: value, disabled: disabled, ...ColorInputProps,
18
18
  // Workaround typings issue.
19
19
  ref: ColorInputProps?.ref })] }));
20
20
  });
@@ -12,7 +12,7 @@ import { useId } from "../utils/react.js";
12
12
  * Like TextField, but uses a FormLabel instead of an InputLabel, and uses
13
13
  * NumberInput instead of a normal input.
14
14
  */
15
- const FormLabelNumberField = forwardRef(function FormLabelNumberField(props, ref) {
15
+ const FormLabelNumberField = forwardRef((props, ref) => {
16
16
  const { autoComplete, autoFocus = false, children, className, defaultValue, FormHelperTextProps, fullWidth = false, helperText, id: idProp, InputLabelProps, inputProps, InputProps, inputRef, label, name, NumberInputComponent, onBlur, onChange, onFocus, placeholder, value, min, max, numberOutOfRangeErrorText, invalidNumberErrorText, maxDecimalPlacesErrorText, error, onError, onErrorEnd, allowUndefined, maxDecimalPlaces = DEFAULT_DECIMAL_PLACES, correctOnBlur = true, ...other } = props;
17
17
  const id = useId(idProp);
18
18
  const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
@@ -47,7 +47,7 @@ const FormLabelNumberField = forwardRef(function FormLabelNumberField(props, ref
47
47
  setNumberError(undefined);
48
48
  onErrorEnd?.(numericValue, textValue);
49
49
  }, [onErrorEnd]);
50
- return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, error: error || !!numberError, ...other, children: [label && (_jsx(FormLabel, { htmlFor: id, id: inputLabelId, children: label })), (helperText || numberError) && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: numberError ?? helperText })), _jsx(FormNumberInput
50
+ return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, error: error ?? !!numberError, ...other, children: [label && (_jsx(FormLabel, { htmlFor: id, id: inputLabelId, children: label })), (helperText ?? numberError) && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: numberError ?? helperText })), _jsx(FormNumberInput
51
51
  // All of the properties fron here down to `InputProps` can be overridden by it.
52
52
  // Any after that must be controlled by this component itself.
53
53
  , {
@@ -12,7 +12,7 @@ import { useId } from "../utils/react.js";
12
12
  * Like TextField, but uses a FormLabel instead of an InputLabel. Also allows
13
13
  * for inline help.
14
14
  */
15
- const FormLabelSliderField = forwardRef(function FormLabelSliderField(props, ref) {
15
+ const FormLabelSliderField = forwardRef((props, ref) => {
16
16
  const { autoComplete, autoFocus = false, defaultValue, disabled, FormHelperTextProps, fullWidth = false, helperText, id: idProp, InputLabelProps, inputProps, InputProps, inputRef, label, name, onBlur, onChange, onFocus, onKeyDown, onMouseUp, placeholder, value, SliderProps, numberOutOfRangeErrorText, invalidNumberErrorText, onError, onErrorEnd, error, maxDecimalPlacesErrorText, NumberInputComponent, ...other } = props;
17
17
  const inputId = `${useId(idProp)}-input`;
18
18
  const sliderId = `${useId(idProp)}-slider`;
@@ -62,7 +62,7 @@ const FormLabelSliderField = forwardRef(function FormLabelSliderField(props, ref
62
62
  //
63
63
  // eslint-disable-next-line jsx-a11y/no-autofocus
64
64
  autoFocus: autoFocus, defaultValue: defaultValue, fullWidth: fullWidth, id: inputId, inputProps: inputProps, inputRef: inputRef ?? inputReference, name: name, onChange: onChange, placeholder: placeholder, value: value, error: error, onError: handleError, onErrorEnd: handleErrorEnd, min, max, ...InputProps, sx: { maxWidth: typography.pxToRem(74), ...InputProps?.sx } }));
65
- return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, disabled: disabled, error: error || !!numberError, ...other, children: [label && (_jsx(FormLabel, { htmlFor: inputId, id: inputLabelId, children: label })), (helperText || !!numberError) && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: numberError ?? helperText })), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Slider, { "aria-describedby": helperTextId, "aria-labelledby": inputLabelId, defaultValue: defaultValue, name: name, id: sliderId, value: value, onChange: handleSliderChange, disabled: disabled, min, max, ...SliderProps }), InputElement] })] }));
65
+ return (_jsxs(FormControl, { fullWidth: fullWidth, ref: ref, disabled: disabled, error: error ?? !!numberError, ...other, children: [label && (_jsx(FormLabel, { htmlFor: inputId, id: inputLabelId, children: label })), (helperText ?? !!numberError) && (_jsx(FormHelperText, { ...FormHelperTextProps, id: helperTextId, children: numberError ?? helperText })), _jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Slider, { "aria-describedby": helperTextId, "aria-labelledby": inputLabelId, defaultValue: defaultValue, name: name, id: sliderId, value: value, onChange: handleSliderChange, disabled: disabled, min, max, ...SliderProps }), InputElement] })] }));
66
66
  });
67
67
  function getNumberErrorText(val, min, max) {
68
68
  const hasMax = typeof max === "number" && !isNaN(max);
@@ -10,7 +10,7 @@ import { useId } from "../utils/react.js";
10
10
  * Like TextField, but uses a FormLabel instead of an InputLabel. Also allows
11
11
  * for inline help.
12
12
  */
13
- const FormLabelTextField = forwardRef(function FormLabelTextField(props, ref) {
13
+ const FormLabelTextField = forwardRef((props, ref) => {
14
14
  const { autoComplete, autoFocus = false, children, defaultValue, FormHelperTextProps, fullWidth = false, helperText, id: idProp, InputLabelProps, inputProps, InputProps, inputRef, label, maxRows, minRows, multiline = false, name, nativeSelect = false, onBlur, onChange, onFocus, placeholder, rows, select = false, SelectProps, type, value, ...other } = props;
15
15
  const id = useId(idProp);
16
16
  const helperTextId = helperText && id ? `${id}-helper-text` : undefined;
@@ -11,7 +11,7 @@ export const iconMenuClasses = {
11
11
  root: `${PREFIX}-root`,
12
12
  iconButton: `${PREFIX}-iconButton`,
13
13
  };
14
- const IconMenu = forwardRef(function IconMenu({ id: idProp, children, icon, className, classes: classesProp, disabled, IconButtonProps, MenuProps, ...others }, ref) {
14
+ const IconMenu = forwardRef(({ id: idProp, children, icon, className, classes: classesProp, disabled, IconButtonProps, MenuProps, ...others }, ref) => {
15
15
  const anchorRef = useRef();
16
16
  const [open, setOpen] = useState(false);
17
17
  const id = useId(idProp);
@@ -32,7 +32,7 @@ const StyledPopover = styled(Popover)(({ theme: { spacing } }) => ({
32
32
  wordWrap: "break-word",
33
33
  },
34
34
  }));
35
- const InlineHelp = forwardRef(function InlineHelp({ children, classes: classesProp, className, icon, onClose, title, url, ...other }, ref) {
35
+ const InlineHelp = forwardRef(({ children, classes: classesProp, className, icon, onClose, title, url, ...other }, ref) => {
36
36
  const [iconBtnEl, setIconBtnEl] = useState();
37
37
  const theme = useTheme();
38
38
  const classes = mergeStyles(inlineHelpClasses, classesProp);
package/Link/Link.js CHANGED
@@ -24,7 +24,7 @@ const StyledMUILink = styled(MUILink)(() => ({
24
24
  margin: "0 0.2em",
25
25
  },
26
26
  }));
27
- const Link = forwardRef(function Link({ classes, children, showExternalLinkIcon, ...otherProps }, ref) {
27
+ const Link = forwardRef(({ classes, children, showExternalLinkIcon, ...otherProps }, ref) => {
28
28
  const { externalLinkIcon: externalLinkIconClass, ...otherClasses } = mergeStyles(gcxLinkClasses, classes);
29
29
  return (_jsxs(StyledMUILink, { ...otherProps, classes: otherClasses, ref: ref, children: [children, showExternalLinkIcon && (_jsx(LinkExternal, { className: externalLinkIconClass, fontSize: "inherit", "data-test": "Link-external-icon" }))] }));
30
30
  });
package/Loader/Loader.js CHANGED
@@ -65,7 +65,7 @@ const Root = styled("div")(({ theme: { palette } }) => ({
65
65
  visibility: "visible",
66
66
  },
67
67
  }));
68
- const Loader = forwardRef(function Loader({ className, classes: classesProp, showBackground, visible, children }, ref) {
68
+ const Loader = forwardRef(({ className, classes: classesProp, showBackground, visible, children }, ref) => {
69
69
  const classes = mergeStyles(loaderClasses, classesProp);
70
70
  return (_jsx(Fade, { in: visible, ref: ref, children: _jsxs(Root, { "aria-hidden": "true", className: clsx(classes.root, className, {
71
71
  [classes.showBackground]: showBackground,
@@ -6,9 +6,7 @@ import { markdownToHtml } from "../utils/markdown.js";
6
6
  /**
7
7
  * A component that renders markdown as HTML.
8
8
  */
9
- const Markdown = ({ markdown, inline, escapeHtml, sanitize = sanitizeHtml, linkTarget, className, ...otherProps }) => {
10
- return (_jsx(Box, { component: inline ? "span" : "div", className: clsx("GcxMarkdown", className), dangerouslySetInnerHTML: {
11
- __html: sanitize(markdownToHtml(markdown, { inline, escapeHtml, linkTarget })),
12
- }, ...otherProps }));
13
- };
9
+ const Markdown = ({ markdown, inline, escapeHtml, sanitize = sanitizeHtml, linkTarget, className, ...otherProps }) => (_jsx(Box, { component: inline ? "span" : "div", className: clsx("GcxMarkdown", className), dangerouslySetInnerHTML: {
10
+ __html: sanitize(markdownToHtml(markdown, { inline, escapeHtml, linkTarget })),
11
+ }, ...otherProps }));
14
12
  export default Markdown;
@@ -1,10 +1,6 @@
1
1
  import { createContext } from "react";
2
- const formatNumber = (n) => {
3
- return `${n}`;
4
- };
5
- const parseNumber = (s) => {
6
- return +s;
7
- };
2
+ const formatNumber = (n) => `${n}`;
3
+ const parseNumber = (s) => +s;
8
4
  /**
9
5
  * A React context for components that gives access to number formatting
10
6
  * utilities.
@@ -9,10 +9,10 @@ export const DEFAULT_DECIMAL_PLACES = 16;
9
9
  * formatting and parsing. Default formatting and parsing can be overridden by
10
10
  * wrapping this component in a NumberFormatContext.Provider.
11
11
  */
12
- const NumberInput = forwardRef(function NumberInput({ onChange, onBlur, value, defaultValue, max, min, error, onError, onErrorEnd, allowUndefined, correctOnBlur = true, maxDecimalPlaces = DEFAULT_DECIMAL_PLACES, ...props }, ref) {
12
+ const NumberInput = forwardRef(({ onChange, onBlur, value, defaultValue, max, min, error, onError, onErrorEnd, allowUndefined, correctOnBlur = true, maxDecimalPlaces = DEFAULT_DECIMAL_PLACES, ...props }, ref) => {
13
13
  const { formatNumber, parseNumber } = useContext(NumberFormatContext);
14
14
  const [textValue, setTextValue] = useState(value === undefined ? "" : formatNumber(value));
15
- const [numericValue, setNumericValue] = useState(value === undefined ? NaN : value);
15
+ const [numericValue, setNumericValue] = useState(value ?? NaN);
16
16
  const [lastValid, setLastValid] = useState(numericValue);
17
17
  const isValidNaN = useCallback((val) => allowUndefined && !val?.trim(), [allowUndefined]);
18
18
  const isOutOfRange = useCallback((val) => (typeof min === "number" && val < min) || (typeof max === "number" && val > max), [min, max]);
@@ -22,14 +22,16 @@ const NumberInput = forwardRef(function NumberInput({ onChange, onBlur, value, d
22
22
  : // If the user begins to type a negative number, do not present an invalid
23
23
  // error.
24
24
  textValue?.trim() !== "-" && parseNumber(textValue) !== numericValue;
25
- const previousError = usePrevious(error || invalidError);
25
+ const previousError = usePrevious(error ?? invalidError);
26
26
  useEffect(() => {
27
- if (!isNaN(numericValue) && !isOutOfRange(numericValue) && !isTooPrecise(numericValue)) {
27
+ if (!isNaN(numericValue) &&
28
+ !isOutOfRange(numericValue) &&
29
+ !isTooPrecise(numericValue)) {
28
30
  setLastValid(numericValue);
29
31
  }
30
32
  }, [numericValue, isOutOfRange, isTooPrecise]);
31
33
  useEffect(() => {
32
- const e = error || invalidError;
34
+ const e = error ?? invalidError;
33
35
  if (e !== previousError) {
34
36
  if (invalidError) {
35
37
  const inputVal = parseNumber(textValue);
@@ -95,7 +97,11 @@ const NumberInput = forwardRef(function NumberInput({ onChange, onBlur, value, d
95
97
  return newValue;
96
98
  }, [max, min, maxDecimalPlaces]);
97
99
  useEffect(() => {
98
- if (value !== undefined) {
100
+ if (value === undefined) {
101
+ setTextValue("");
102
+ setNumericValue(NaN);
103
+ }
104
+ else {
99
105
  // For controlled components, only update the text from the value if
100
106
  // it's a valid number, and represents a number different from the
101
107
  // one in the text box. Otherwise leave it alone so that it's not
@@ -105,10 +111,6 @@ const NumberInput = forwardRef(function NumberInput({ onChange, onBlur, value, d
105
111
  }
106
112
  setNumericValue(correctValue(value));
107
113
  }
108
- else {
109
- setTextValue("");
110
- setNumericValue(NaN);
111
- }
112
114
  // eslint-disable-next-line react-hooks/exhaustive-deps -- It's intentional to omit numericValue. We only want this to run when the incoming value changes, not when numericValue changes in handleChange().
113
115
  }, [value, formatNumber, correctValue]);
114
116
  const handleChange = useCallback(event => {
@@ -130,7 +132,7 @@ const NumberInput = forwardRef(function NumberInput({ onChange, onBlur, value, d
130
132
  }
131
133
  onBlur?.(event);
132
134
  }, [correctOnBlur, reformat, onBlur]);
133
- return (_jsx(Input, { ref: ref, type: "text", value: textValue, onChange: handleChange, onBlur: handleBlur, defaultValue: typeof defaultValue === "number" ? formatNumber(defaultValue) : undefined, "data-test": "NumberInput-container", error: error || invalidError, ...props }));
135
+ return (_jsx(Input, { ref: ref, type: "text", value: textValue, onChange: handleChange, onBlur: handleBlur, defaultValue: typeof defaultValue === "number" ? formatNumber(defaultValue) : undefined, "data-test": "NumberInput-container", error: error ?? invalidError, ...props }));
134
136
  });
135
137
  export default NumberInput;
136
138
  function getDecimalPlaces(value) {
@@ -7,13 +7,11 @@ import FormLabelAutocompleteField from "../FormLabelAutocompleteField/FormLabelA
7
7
  import FormLabelSliderField from "../FormLabelSliderField/index.js";
8
8
  import FormLabelTextField from "../FormLabelTextField/index.js";
9
9
  import { useId } from "../utils/react.js";
10
- const getDecorationValues = (t) => {
11
- return [
12
- { id: "none", label: t.decorationNone },
13
- { id: "line-through", label: t.decorationLineThrough },
14
- { id: "underline", label: t.decorationLineUnderline },
15
- ];
16
- };
10
+ const getDecorationValues = (t) => [
11
+ { id: "none", label: t.decorationNone },
12
+ { id: "line-through", label: t.decorationLineThrough },
13
+ { id: "underline", label: t.decorationLineUnderline },
14
+ ];
17
15
  const capitalizeFirstLetter = (value) => `${value.charAt(0).toUpperCase() + value.slice(1)}`;
18
16
  const defaultFontJson = {
19
17
  size: 9,
@@ -50,7 +48,7 @@ export const FontInput = ({ font, fontFamilies, languageResources, onChange, Aut
50
48
  decoration: font.decoration ?? "none",
51
49
  size: font.size ?? 9,
52
50
  };
53
- let fontFamily = fontList.find(f => f.font.family == fontWithDefaults.family &&
51
+ let fontFamily = fontList.find(f => f.font.family === fontWithDefaults.family &&
54
52
  f.font.style === fontWithDefaults.style &&
55
53
  f.font.weight === fontWithDefaults.weight);
56
54
  if (!fontFamily) {
@@ -71,11 +69,7 @@ export const FontInput = ({ font, fontFamilies, languageResources, onChange, Aut
71
69
  };
72
70
  fontList.push(fontFamily);
73
71
  }
74
- return (_jsxs(Box, { ...props, children: [_jsx(AutocompleteInput, { fullWidth: true, disableClearable: true, options: fontList, label: text.fontFamily, "aria-labelledby": labelId, filterOptions: (options, state) => {
75
- return fontList.filter(f => f.name
76
- .toLocaleLowerCase()
77
- .indexOf(state.inputValue.toLocaleLowerCase()) !== -1);
78
- }, getOptionLabel: option => option.name, value: fontFamily, onChange: (event, newValue, reason, details) => {
72
+ return (_jsxs(Box, { ...props, children: [_jsx(AutocompleteInput, { fullWidth: true, disableClearable: true, options: fontList, label: text.fontFamily, "aria-labelledby": labelId, filterOptions: (options, state) => fontList.filter(f => f.name.toLocaleLowerCase().includes(state.inputValue.toLocaleLowerCase())), getOptionLabel: option => option.name, value: fontFamily, onChange: (event, newValue, reason, details) => {
79
73
  onChange({
80
74
  ...font,
81
75
  family: newValue.font.family,
@@ -89,87 +89,83 @@ const SimpleFillSymbolInput = props => {
89
89
  }, children: getSimpleFillStyles(text).map(fillStyle => (_jsx("option", { value: fillStyle.id, children: fillStyle.label }, fillStyle.id))) })] }))] }));
90
90
  };
91
91
  export default SimpleFillSymbolInput;
92
- export const getSimpleFillStyles = (t) => {
93
- return [
94
- {
95
- id: "esriSFSBackwardDiagonal",
96
- label: t.fillStyleBackwardDiagonal,
97
- },
98
- {
99
- id: "esriSFSCross",
100
- label: t.fillStyleCross,
101
- },
102
- {
103
- id: "esriSFSDiagonalCross",
104
- label: t.fillStyleDiagonalCross,
105
- },
106
- {
107
- id: "esriSFSForwardDiagonal",
108
- label: t.fillStyleForwardDiagonal,
109
- },
110
- {
111
- id: "esriSFSHorizontal",
112
- label: t.fillStyleHorizontal,
113
- },
114
- {
115
- id: "esriSFSNull",
116
- label: t.fillStyleNone,
117
- },
118
- {
119
- id: "esriSFSSolid",
120
- label: t.fillStyleSolid,
121
- },
122
- {
123
- id: "esriSFSVertical",
124
- label: t.fillStyleVertical,
125
- },
126
- ];
127
- };
128
- export const getSimpleLineStyles = (t) => {
129
- return [
130
- {
131
- id: "esriSLSDash",
132
- label: t.lineStyleDash,
133
- },
134
- {
135
- id: "esriSLSDashDot",
136
- label: t.lineStyleDashDot,
137
- },
138
- {
139
- id: "esriSLSDot",
140
- label: t.lineStyleDot,
141
- },
142
- {
143
- id: "esriSLSLongDash",
144
- label: t.lineStyleLongDash,
145
- },
146
- {
147
- id: "esriSLSLongDashDot",
148
- label: t.lineStyleLongDashDot,
149
- },
150
- {
151
- id: "esriSLSNull",
152
- label: t.lineStyleNone,
153
- },
154
- {
155
- id: "esriSLSShortDash",
156
- label: t.lineStyleShortDash,
157
- },
158
- {
159
- id: "esriSLSShortDashDot",
160
- label: t.lineStyleShortDashDot,
161
- },
162
- {
163
- id: "esriSLSShortDashDotDot",
164
- label: t.lineStyleShortDashDotDot,
165
- },
166
- {
167
- id: "esriSLSShortDot",
168
- label: t.lineStyleShortDot,
169
- },
170
- {
171
- id: "esriSLSSolid",
172
- label: t.lineStyleSolid,
173
- },
174
- ];
175
- };
92
+ export const getSimpleFillStyles = (t) => [
93
+ {
94
+ id: "esriSFSBackwardDiagonal",
95
+ label: t.fillStyleBackwardDiagonal,
96
+ },
97
+ {
98
+ id: "esriSFSCross",
99
+ label: t.fillStyleCross,
100
+ },
101
+ {
102
+ id: "esriSFSDiagonalCross",
103
+ label: t.fillStyleDiagonalCross,
104
+ },
105
+ {
106
+ id: "esriSFSForwardDiagonal",
107
+ label: t.fillStyleForwardDiagonal,
108
+ },
109
+ {
110
+ id: "esriSFSHorizontal",
111
+ label: t.fillStyleHorizontal,
112
+ },
113
+ {
114
+ id: "esriSFSNull",
115
+ label: t.fillStyleNone,
116
+ },
117
+ {
118
+ id: "esriSFSSolid",
119
+ label: t.fillStyleSolid,
120
+ },
121
+ {
122
+ id: "esriSFSVertical",
123
+ label: t.fillStyleVertical,
124
+ },
125
+ ];
126
+ export const getSimpleLineStyles = (t) => [
127
+ {
128
+ id: "esriSLSDash",
129
+ label: t.lineStyleDash,
130
+ },
131
+ {
132
+ id: "esriSLSDashDot",
133
+ label: t.lineStyleDashDot,
134
+ },
135
+ {
136
+ id: "esriSLSDot",
137
+ label: t.lineStyleDot,
138
+ },
139
+ {
140
+ id: "esriSLSLongDash",
141
+ label: t.lineStyleLongDash,
142
+ },
143
+ {
144
+ id: "esriSLSLongDashDot",
145
+ label: t.lineStyleLongDashDot,
146
+ },
147
+ {
148
+ id: "esriSLSNull",
149
+ label: t.lineStyleNone,
150
+ },
151
+ {
152
+ id: "esriSLSShortDash",
153
+ label: t.lineStyleShortDash,
154
+ },
155
+ {
156
+ id: "esriSLSShortDashDot",
157
+ label: t.lineStyleShortDashDot,
158
+ },
159
+ {
160
+ id: "esriSLSShortDashDotDot",
161
+ label: t.lineStyleShortDashDotDot,
162
+ },
163
+ {
164
+ id: "esriSLSShortDot",
165
+ label: t.lineStyleShortDot,
166
+ },
167
+ {
168
+ id: "esriSLSSolid",
169
+ label: t.lineStyleSolid,
170
+ },
171
+ ];
@@ -75,51 +75,49 @@ const SimpleLineSymbolInput = props => {
75
75
  } })] }))] }));
76
76
  };
77
77
  export default SimpleLineSymbolInput;
78
- export const getSimpleLineStyles = (t) => {
79
- return [
80
- {
81
- id: "esriSLSDash",
82
- label: t.lineStyleDash,
83
- },
84
- {
85
- id: "esriSLSDashDot",
86
- label: t.lineStyleDashDot,
87
- },
88
- {
89
- id: "esriSLSDot",
90
- label: t.lineStyleDot,
91
- },
92
- {
93
- id: "esriSLSLongDash",
94
- label: t.lineStyleLongDash,
95
- },
96
- {
97
- id: "esriSLSLongDashDot",
98
- label: t.lineStyleLongDashDot,
99
- },
100
- {
101
- id: "esriSLSNull",
102
- label: t.lineStyleNone,
103
- },
104
- {
105
- id: "esriSLSShortDash",
106
- label: t.lineStyleShortDash,
107
- },
108
- {
109
- id: "esriSLSShortDashDot",
110
- label: t.lineStyleShortDashDot,
111
- },
112
- {
113
- id: "esriSLSShortDashDotDot",
114
- label: t.lineStyleShortDashDotDot,
115
- },
116
- {
117
- id: "esriSLSShortDot",
118
- label: t.lineStyleShortDot,
119
- },
120
- {
121
- id: "esriSLSSolid",
122
- label: t.lineStyleSolid,
123
- },
124
- ];
125
- };
78
+ export const getSimpleLineStyles = (t) => [
79
+ {
80
+ id: "esriSLSDash",
81
+ label: t.lineStyleDash,
82
+ },
83
+ {
84
+ id: "esriSLSDashDot",
85
+ label: t.lineStyleDashDot,
86
+ },
87
+ {
88
+ id: "esriSLSDot",
89
+ label: t.lineStyleDot,
90
+ },
91
+ {
92
+ id: "esriSLSLongDash",
93
+ label: t.lineStyleLongDash,
94
+ },
95
+ {
96
+ id: "esriSLSLongDashDot",
97
+ label: t.lineStyleLongDashDot,
98
+ },
99
+ {
100
+ id: "esriSLSNull",
101
+ label: t.lineStyleNone,
102
+ },
103
+ {
104
+ id: "esriSLSShortDash",
105
+ label: t.lineStyleShortDash,
106
+ },
107
+ {
108
+ id: "esriSLSShortDashDot",
109
+ label: t.lineStyleShortDashDot,
110
+ },
111
+ {
112
+ id: "esriSLSShortDashDotDot",
113
+ label: t.lineStyleShortDashDotDot,
114
+ },
115
+ {
116
+ id: "esriSLSShortDot",
117
+ label: t.lineStyleShortDot,
118
+ },
119
+ {
120
+ id: "esriSLSSolid",
121
+ label: t.lineStyleSolid,
122
+ },
123
+ ];
@@ -150,13 +150,11 @@ const SimpleMarkerSymbolInput = props => {
150
150
  } })] }))] }));
151
151
  };
152
152
  export default SimpleMarkerSymbolInput;
153
- export const getSimpleMarkerStyles = (t) => {
154
- return [
155
- { id: "esriSMSCircle", label: t.markerStyleCircle },
156
- { id: "esriSMSCross", label: t.markerStyleCross },
157
- { id: "esriSMSDiamond", label: t.markerStyleDiamond },
158
- { id: "esriSMSSquare", label: t.markerStyleSquare },
159
- { id: "esriSMSTriangle", label: t.markerStyleTriangle },
160
- { id: "esriSMSX", label: t.markerStyleX },
161
- ];
162
- };
153
+ export const getSimpleMarkerStyles = (t) => [
154
+ { id: "esriSMSCircle", label: t.markerStyleCircle },
155
+ { id: "esriSMSCross", label: t.markerStyleCross },
156
+ { id: "esriSMSDiamond", label: t.markerStyleDiamond },
157
+ { id: "esriSMSSquare", label: t.markerStyleSquare },
158
+ { id: "esriSMSTriangle", label: t.markerStyleTriangle },
159
+ { id: "esriSMSX", label: t.markerStyleX },
160
+ ];
@@ -114,18 +114,14 @@ const TextSymbolInput = props => {
114
114
  } })] }))] }))] }));
115
115
  };
116
116
  export default TextSymbolInput;
117
- const getHorizontalAlignmentValues = (t) => {
118
- return [
119
- { id: "left", label: t.horizontalAlignmentLeft },
120
- { id: "right", label: t.horizontalAlignmentRight },
121
- { id: "center", label: t.horizontalAlignmentCenter },
122
- ];
123
- };
124
- const getVerticalAlignmentValues = (t) => {
125
- return [
126
- { id: "baseline", label: t.verticalAlignmentBaseline },
127
- { id: "top", label: t.verticalAlignmentTop },
128
- { id: "middle", label: t.verticalAlignmentMiddle },
129
- { id: "bottom", label: t.verticalAlignmentBottom },
130
- ];
131
- };
117
+ const getHorizontalAlignmentValues = (t) => [
118
+ { id: "left", label: t.horizontalAlignmentLeft },
119
+ { id: "right", label: t.horizontalAlignmentRight },
120
+ { id: "center", label: t.horizontalAlignmentCenter },
121
+ ];
122
+ const getVerticalAlignmentValues = (t) => [
123
+ { id: "baseline", label: t.verticalAlignmentBaseline },
124
+ { id: "top", label: t.verticalAlignmentTop },
125
+ { id: "middle", label: t.verticalAlignmentMiddle },
126
+ { id: "bottom", label: t.verticalAlignmentBottom },
127
+ ];
package/Tab/Tab.js CHANGED
@@ -49,7 +49,7 @@ const Root = styled("div")({
49
49
  },
50
50
  });
51
51
  export * from "@mui/material/Tab";
52
- const Tab = forwardRef(function Tab(props, ref) {
52
+ const Tab = forwardRef((props, ref) => {
53
53
  const { className, classes, disabled, endAdornment, label, ...other } = props;
54
54
  const { endAdornment: endAdornmentClass, fullWidthContainer: fullWidthContainerClass, tabAdorned: tabAdornedClass, tabContainer: tabContainerClass, labelWrapper: labelWrapperClass, ...otherClasses } = mergeStyles(gcxTabClasses, classes);
55
55
  return (_jsxs(Root, { className: clsx(tabContainerClass, {
package/Tabs/Tabs.js CHANGED
@@ -21,7 +21,7 @@ const StyledTabs = styled(MUITabs)({
21
21
  backgroundColor: "transparent",
22
22
  },
23
23
  });
24
- const Tabs = forwardRef(function Tabs({ classes, indicatorColor, ...props }, ref) {
24
+ const Tabs = forwardRef(({ classes, indicatorColor, ...props }, ref) => {
25
25
  const { indicator: indicatorClass, indicatorTransparent: indicatorTransparentClass, ...otherClasses } = mergeStyles(gcxTabsClasses, classes);
26
26
  return (_jsx(StyledTabs, { indicatorColor: indicatorColor, ...props, classes: {
27
27
  indicator: clsx(indicatorClass, {
@@ -34,7 +34,7 @@ export default function createSvgIcon(path, displayName, mirror) {
34
34
  return (_jsx(StyledIcon, { classes: otherClasses, className: clsx(className, {
35
35
  [mirroredClass]: direction === "rtl" &&
36
36
  mirror !== false &&
37
- (mirror || shouldMirror(displayName)),
37
+ (mirror ?? shouldMirror(displayName)),
38
38
  }), ref: ref, ...otherProps }));
39
39
  };
40
40
  // Copied from MUI implementation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertigis/react-ui",
3
- "version": "14.0.0",
3
+ "version": "14.0.1",
4
4
  "description": "Utilities and React components used in VertiGIS applications.",
5
5
  "keywords": [
6
6
  "vertigis",
@@ -36,7 +36,7 @@ const getDefaultOptions = (pxToRem) => ({
36
36
  // Defaults should match https://meridian.vertigis.com/docs/design-language/#typography
37
37
  // Use `pxToRem` so clients with different root font sizes still work properly.
38
38
  typography: {
39
- fontFamily: `"Segoe UI", "Helvetica Neue", "Roboto", Helvetica, Arial, sans-serif`,
39
+ fontFamily: '"Segoe UI", "Helvetica Neue", "Roboto", Helvetica, Arial, sans-serif',
40
40
  fontWeightLight,
41
41
  fontWeightRegular,
42
42
  fontWeightMedium,
@@ -221,8 +221,8 @@ function getOverrides(theme) {
221
221
  MuiAutocomplete: {
222
222
  styleOverrides: {
223
223
  root: {
224
- [".MuiInput-root"]: {
225
- [".MuiInput-input"]: {
224
+ ".MuiInput-root": {
225
+ ".MuiInput-input": {
226
226
  // Let the height expand to fit content
227
227
  height: "auto",
228
228
  padding: "5px 8px",
@@ -635,7 +635,7 @@ function getOverrides(theme) {
635
635
  // styling for any existing code still using this
636
636
  // property.
637
637
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
638
- // @ts-ignore
638
+ // @ts-expect-error
639
639
  props: { button: true },
640
640
  style: {
641
641
  ...getMenuItemStyles(theme),
@@ -686,7 +686,7 @@ function getOverrides(theme) {
686
686
  },
687
687
  paddingTop: 4,
688
688
  paddingBottom: 4,
689
- ["& .MuiListItemIcon-root svg"]: {
689
+ "& .MuiListItemIcon-root svg": {
690
690
  // MUI sets this to 1.25rem, which ignores the
691
691
  // theme's `htmlFontSize` setting. Override with
692
692
  // pxToRem to get the correct height regardless of
@@ -1036,7 +1036,7 @@ function getOverrides(theme) {
1036
1036
  }
1037
1037
  function createTheme(options = {}) {
1038
1038
  // Merge the VertiGIS Studio theme defaults with any user specified theme options
1039
- const mode = options && options.palette && options.palette.mode === "dark" ? "dark" : "light";
1039
+ const mode = options?.palette && options.palette.mode === "dark" ? "dark" : "light";
1040
1040
  // If we are using light mode, then we want to use our defined light theme palette
1041
1041
  const modeOptions = mode === "light" ? lightThemeOverrides : {};
1042
1042
  const { dense = false, ...overrides } = options;
package/utils/throttle.js CHANGED
@@ -13,7 +13,8 @@ export function throttle(func, msBetweenRequests) {
13
13
  if (!isScheduled) {
14
14
  window.setTimeout(() => {
15
15
  isScheduled = false;
16
- void func(...args);
16
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
17
+ func(...args);
17
18
  }, msBetweenRequests);
18
19
  isScheduled = true;
19
20
  }
@@ -30,7 +31,8 @@ export function throttleAnimation(func) {
30
31
  if (!isScheduled) {
31
32
  requestAnimationFrame(() => {
32
33
  isScheduled = false;
33
- void func(...args);
34
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
35
+ func(...args);
34
36
  });
35
37
  isScheduled = true;
36
38
  }
package/utils/url.js CHANGED
@@ -69,6 +69,6 @@ export function setHashParams(kvp) {
69
69
  * @param paramsString The string to be set as the hash string.
70
70
  */
71
71
  function setHashParamsString(paramsString) {
72
- paramsString = paramsString.startsWith("#") ? paramsString : `#${paramsString}`;
73
- history.replaceState(null, document.title, getUrlWithoutHash() + paramsString);
72
+ const pString = paramsString.startsWith("#") ? paramsString : `#${paramsString}`;
73
+ history.replaceState(null, document.title, getUrlWithoutHash() + pString);
74
74
  }