@react-md/core 6.0.2 → 6.2.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.
Files changed (230) hide show
  1. package/dist/RootHtml.d.ts +1 -1
  2. package/dist/RootHtml.js.map +1 -1
  3. package/dist/_base.scss +6 -2
  4. package/dist/_border-radius.scss +92 -0
  5. package/dist/_core.scss +2 -0
  6. package/dist/_spacing.scss +86 -0
  7. package/dist/app-bar/_app-bar.scss +9 -7
  8. package/dist/app-bar/styles.js +1 -1
  9. package/dist/app-bar/styles.js.map +1 -1
  10. package/dist/autocomplete/defaults.d.ts +1 -0
  11. package/dist/autocomplete/defaults.js +2 -6
  12. package/dist/autocomplete/defaults.js.map +1 -1
  13. package/dist/autocomplete/types.d.ts +9 -9
  14. package/dist/autocomplete/types.js.map +1 -1
  15. package/dist/avatar/Avatar.d.ts +1 -1
  16. package/dist/avatar/Avatar.js +1 -1
  17. package/dist/avatar/Avatar.js.map +1 -1
  18. package/dist/avatar/_avatar.scss +3 -3
  19. package/dist/avatar/styles.d.ts +29 -1
  20. package/dist/avatar/styles.js.map +1 -1
  21. package/dist/badge/_badge.scss +10 -2
  22. package/dist/box/_box.scss +78 -11
  23. package/dist/box/styles.d.ts +26 -3
  24. package/dist/box/styles.js.map +1 -1
  25. package/dist/button/AsyncButton.d.ts +2 -2
  26. package/dist/button/AsyncButton.js.map +1 -1
  27. package/dist/button/Button.d.ts +1 -1
  28. package/dist/button/Button.js.map +1 -1
  29. package/dist/button/_button.scss +21 -11
  30. package/dist/card/CardHeader.d.ts +1 -1
  31. package/dist/card/CardHeader.js.map +1 -1
  32. package/dist/card/_card.scss +9 -7
  33. package/dist/chip/Chip.d.ts +1 -1
  34. package/dist/chip/Chip.js.map +1 -1
  35. package/dist/chip/_chip.scss +9 -7
  36. package/dist/dialog/Dialog.d.ts +1 -1
  37. package/dist/dialog/Dialog.js.map +1 -1
  38. package/dist/dialog/_dialog.scss +7 -6
  39. package/dist/divider/_divider.scss +3 -2
  40. package/dist/expansion-panel/ExpansionPanel.d.ts +1 -1
  41. package/dist/expansion-panel/ExpansionPanel.js.map +1 -1
  42. package/dist/expansion-panel/ExpansionPanelHeader.d.ts +1 -1
  43. package/dist/expansion-panel/ExpansionPanelHeader.js.map +1 -1
  44. package/dist/expansion-panel/_expansion-panel.scss +4 -3
  45. package/dist/files/FileInput.d.ts +1 -1
  46. package/dist/files/FileInput.js.map +1 -1
  47. package/dist/form/FormMessageContainer.d.ts +1 -1
  48. package/dist/form/FormMessageContainer.js.map +1 -1
  49. package/dist/form/InputToggle.d.ts +2 -2
  50. package/dist/form/InputToggle.js.map +1 -1
  51. package/dist/form/NativeSelect.d.ts +1 -1
  52. package/dist/form/NativeSelect.js.map +1 -1
  53. package/dist/form/OptGroup.d.ts +1 -1
  54. package/dist/form/OptGroup.js.map +1 -1
  55. package/dist/form/Password.d.ts +1 -1
  56. package/dist/form/Password.js.map +1 -1
  57. package/dist/form/Select.d.ts +2 -2
  58. package/dist/form/Select.js.map +1 -1
  59. package/dist/form/Slider.d.ts +1 -1
  60. package/dist/form/Slider.js.map +1 -1
  61. package/dist/form/Switch.d.ts +3 -3
  62. package/dist/form/Switch.js.map +1 -1
  63. package/dist/form/SwitchTrack.d.ts +1 -1
  64. package/dist/form/SwitchTrack.js.map +1 -1
  65. package/dist/form/TextArea.d.ts +2 -2
  66. package/dist/form/TextArea.js +1 -1
  67. package/dist/form/TextArea.js.map +1 -1
  68. package/dist/form/TextField.d.ts +1 -1
  69. package/dist/form/TextField.js.map +1 -1
  70. package/dist/form/_form-message.scss +4 -3
  71. package/dist/form/_input-toggle.scss +2 -1
  72. package/dist/form/_label.scss +3 -2
  73. package/dist/form/_password.scss +2 -1
  74. package/dist/form/_select.scss +4 -4
  75. package/dist/form/_slider.scss +4 -3
  76. package/dist/form/_switch.scss +2 -1
  77. package/dist/form/_text-area.scss +3 -2
  78. package/dist/form/_text-field.scss +20 -16
  79. package/dist/form/types.d.ts +5 -5
  80. package/dist/form/types.js.map +1 -1
  81. package/dist/form/utils.js +1 -0
  82. package/dist/form/utils.js.map +1 -1
  83. package/dist/icon/_icon.scss +2 -1
  84. package/dist/interaction/useElementInteraction.js +1 -1
  85. package/dist/interaction/useElementInteraction.js.map +1 -1
  86. package/dist/layout/LayoutAppBar.d.ts +1 -1
  87. package/dist/layout/LayoutAppBar.js.map +1 -1
  88. package/dist/layout/LayoutNav.js +1 -1
  89. package/dist/layout/LayoutNav.js.map +1 -1
  90. package/dist/layout/useMainTabIndex.js +1 -0
  91. package/dist/layout/useMainTabIndex.js.map +1 -1
  92. package/dist/link/_link.scss +3 -2
  93. package/dist/list/ListItemLink.d.ts +1 -1
  94. package/dist/list/ListItemLink.js.map +1 -1
  95. package/dist/list/ListItemText.d.ts +1 -1
  96. package/dist/list/ListItemText.js.map +1 -1
  97. package/dist/list/ListSubheader.d.ts +1 -1
  98. package/dist/list/ListSubheader.js.map +1 -1
  99. package/dist/list/_list.scss +7 -6
  100. package/dist/list/types.d.ts +2 -2
  101. package/dist/list/types.js.map +1 -1
  102. package/dist/menu/Menu.d.ts +3 -3
  103. package/dist/menu/Menu.js.map +1 -1
  104. package/dist/menu/MenuItemInputToggle.d.ts +2 -2
  105. package/dist/menu/MenuItemInputToggle.js.map +1 -1
  106. package/dist/menu/MenuItemTextField.d.ts +1 -1
  107. package/dist/menu/MenuItemTextField.js.map +1 -1
  108. package/dist/menu/MenuSheet.d.ts +1 -1
  109. package/dist/menu/MenuSheet.js.map +1 -1
  110. package/dist/menu/_menu.scss +2 -1
  111. package/dist/navigation/CollapsibleNavGroup.d.ts +2 -2
  112. package/dist/navigation/CollapsibleNavGroup.js.map +1 -1
  113. package/dist/navigation/NavItemLink.d.ts +1 -1
  114. package/dist/navigation/NavItemLink.js.map +1 -1
  115. package/dist/navigation/_navigation.scss +5 -3
  116. package/dist/progress/CircularProgress.d.ts +2 -17
  117. package/dist/progress/CircularProgress.js +19 -23
  118. package/dist/progress/CircularProgress.js.map +1 -1
  119. package/dist/progress/LinearProgress.d.ts +5 -1
  120. package/dist/progress/LinearProgress.js +13 -25
  121. package/dist/progress/LinearProgress.js.map +1 -1
  122. package/dist/progress/circularProgressStyles.d.ts +62 -0
  123. package/dist/progress/circularProgressStyles.js +38 -0
  124. package/dist/progress/circularProgressStyles.js.map +1 -0
  125. package/dist/progress/linearProgressStyles.d.ts +38 -0
  126. package/dist/progress/linearProgressStyles.js +38 -0
  127. package/dist/progress/linearProgressStyles.js.map +1 -0
  128. package/dist/responsive-item/_responsive-item.scss +2 -1
  129. package/dist/searching/caseInsensitive.d.ts +20 -4
  130. package/dist/searching/caseInsensitive.js +5 -1
  131. package/dist/searching/caseInsensitive.js.map +1 -1
  132. package/dist/searching/fuzzy.d.ts +3 -3
  133. package/dist/searching/fuzzy.js +5 -1
  134. package/dist/searching/fuzzy.js.map +1 -1
  135. package/dist/searching/utils.d.ts +2 -1
  136. package/dist/searching/utils.js +11 -2
  137. package/dist/searching/utils.js.map +1 -1
  138. package/dist/segmented-button/_segmented-button.scss +20 -13
  139. package/dist/sheet/_sheet.scss +2 -1
  140. package/dist/snackbar/Toast.d.ts +1 -1
  141. package/dist/snackbar/Toast.js.map +1 -1
  142. package/dist/snackbar/_snackbar.scss +12 -10
  143. package/dist/table/TableCell.d.ts +1 -1
  144. package/dist/table/TableCell.js.map +1 -1
  145. package/dist/table/TableCheckbox.d.ts +1 -1
  146. package/dist/table/TableCheckbox.js.map +1 -1
  147. package/dist/table/TableRadio.d.ts +1 -1
  148. package/dist/table/TableRadio.js.map +1 -1
  149. package/dist/table/_table.scss +5 -4
  150. package/dist/tabs/TabListScrollButton.d.ts +1 -1
  151. package/dist/tabs/TabListScrollButton.js.map +1 -1
  152. package/dist/tabs/_tabs.scss +7 -4
  153. package/dist/theme/utils.js +2 -2
  154. package/dist/theme/utils.js.map +1 -1
  155. package/dist/tooltip/_tooltip.scss +52 -25
  156. package/dist/transition/_transition.scss +2 -1
  157. package/dist/tree/TreeItem.d.ts +2 -2
  158. package/dist/tree/TreeItem.js.map +1 -1
  159. package/dist/tree/_tree.scss +1 -1
  160. package/dist/types.d.ts +29 -2
  161. package/dist/types.js +1 -1
  162. package/dist/types.js.map +1 -1
  163. package/dist/utils/alphaNumericSort.d.ts +9 -9
  164. package/dist/utils/alphaNumericSort.js +5 -1
  165. package/dist/utils/alphaNumericSort.js.map +1 -1
  166. package/dist/utils/bem.js +1 -1
  167. package/dist/utils/bem.js.map +1 -1
  168. package/dist/utils/parseCssLengthUnit.js +3 -0
  169. package/dist/utils/parseCssLengthUnit.js.map +1 -1
  170. package/package.json +13 -13
  171. package/src/RootHtml.tsx +1 -1
  172. package/src/app-bar/styles.ts +1 -1
  173. package/src/autocomplete/defaults.ts +5 -12
  174. package/src/autocomplete/types.ts +9 -12
  175. package/src/avatar/Avatar.tsx +2 -2
  176. package/src/avatar/styles.ts +53 -1
  177. package/src/box/styles.ts +34 -13
  178. package/src/button/AsyncButton.tsx +2 -2
  179. package/src/button/Button.tsx +1 -1
  180. package/src/card/CardHeader.tsx +1 -1
  181. package/src/chip/Chip.tsx +1 -1
  182. package/src/dialog/Dialog.tsx +1 -4
  183. package/src/expansion-panel/ExpansionPanel.tsx +1 -1
  184. package/src/expansion-panel/ExpansionPanelHeader.tsx +1 -1
  185. package/src/files/FileInput.tsx +1 -4
  186. package/src/form/FormMessageContainer.tsx +1 -1
  187. package/src/form/InputToggle.tsx +2 -5
  188. package/src/form/NativeSelect.tsx +1 -1
  189. package/src/form/OptGroup.tsx +1 -4
  190. package/src/form/Password.tsx +1 -1
  191. package/src/form/Select.tsx +2 -3
  192. package/src/form/Slider.tsx +1 -1
  193. package/src/form/Switch.tsx +3 -3
  194. package/src/form/SwitchTrack.tsx +1 -1
  195. package/src/form/TextArea.tsx +3 -6
  196. package/src/form/TextField.tsx +1 -1
  197. package/src/form/types.ts +5 -15
  198. package/src/form/utils.ts +1 -0
  199. package/src/interaction/useElementInteraction.tsx +1 -1
  200. package/src/layout/LayoutAppBar.tsx +1 -1
  201. package/src/layout/LayoutNav.tsx +1 -1
  202. package/src/layout/useMainTabIndex.ts +1 -0
  203. package/src/list/ListItemLink.tsx +1 -1
  204. package/src/list/ListItemText.tsx +1 -4
  205. package/src/list/ListSubheader.tsx +1 -1
  206. package/src/list/types.ts +2 -5
  207. package/src/menu/Menu.tsx +3 -4
  208. package/src/menu/MenuItemInputToggle.tsx +2 -2
  209. package/src/menu/MenuItemTextField.tsx +1 -1
  210. package/src/menu/MenuSheet.tsx +1 -1
  211. package/src/navigation/CollapsibleNavGroup.tsx +2 -2
  212. package/src/navigation/NavItemLink.tsx +1 -1
  213. package/src/progress/CircularProgress.tsx +31 -53
  214. package/src/progress/LinearProgress.tsx +27 -40
  215. package/src/progress/circularProgressStyles.ts +114 -0
  216. package/src/progress/linearProgressStyles.ts +90 -0
  217. package/src/searching/caseInsensitive.ts +29 -7
  218. package/src/searching/fuzzy.ts +12 -6
  219. package/src/searching/utils.ts +13 -2
  220. package/src/snackbar/Toast.tsx +1 -1
  221. package/src/table/TableCell.tsx +1 -4
  222. package/src/table/TableCheckbox.tsx +1 -1
  223. package/src/table/TableRadio.tsx +1 -1
  224. package/src/tabs/TabListScrollButton.tsx +1 -1
  225. package/src/theme/utils.ts +2 -1
  226. package/src/tree/TreeItem.tsx +2 -2
  227. package/src/types.ts +44 -2
  228. package/src/utils/alphaNumericSort.ts +17 -11
  229. package/src/utils/bem.ts +1 -1
  230. package/src/utils/parseCssLengthUnit.ts +4 -0
@@ -4,17 +4,28 @@ import { type BaseSearchOptions } from "./types.js";
4
4
 
5
5
  /**
6
6
  * @since 6.0.0
7
+ * @since 6.2.0 Added support for `item.name` and `item.label`.
7
8
  * @internal
8
9
  */
9
10
  export const defaultExtractor =
10
- (name: string) =>
11
+ (usageName: string, propName = "extractor") =>
11
12
  (item: unknown): string => {
12
13
  if (typeof item === "string") {
13
14
  return item;
14
15
  }
15
16
 
17
+ if (item && typeof item === "object") {
18
+ if ("label" in item && typeof item.label === "string") {
19
+ return item.label;
20
+ }
21
+
22
+ if ("name" in item && typeof item.name === "string") {
23
+ return item.name;
24
+ }
25
+ }
26
+
16
27
  throw new Error(
17
- `A \`TextExtractor\` must be provided to \`${name}\` for lists that do not contain strings`
28
+ `\`${usageName}\` requires the \`${propName}\` prop for lists that do not contain strings or known object types.`
18
29
  );
19
30
  };
20
31
 
@@ -104,7 +104,7 @@ export interface ConfigurableToastProps
104
104
  * Any additional props that should be provided to the `<div>` that surrounds
105
105
  * the toast `children`.
106
106
  */
107
- contentProps?: PropsWithRef<ToastContentProps, HTMLDivElement>;
107
+ contentProps?: PropsWithRef<ToastContentProps>;
108
108
 
109
109
  /**
110
110
  * Set this to `true` if the `children` for the toast should no longer be
@@ -119,10 +119,7 @@ export interface TableCellProps extends TableCellAttributes, TableCellOptions {
119
119
  *
120
120
  * @since 6.0.0
121
121
  */
122
- contentProps?: PropsWithRef<
123
- ButtonHTMLAttributes<HTMLButtonElement>,
124
- HTMLButtonElement
125
- >;
122
+ contentProps?: PropsWithRef<ButtonHTMLAttributes<HTMLButtonElement>>;
126
123
 
127
124
  /**
128
125
  * Any additional props to pass to the `IconRotator` when the `aria-sort` prop
@@ -73,7 +73,7 @@ export interface TableCheckboxProps
73
73
  * @see {@link TableCheckboxSupportedCheckboxProps}
74
74
  * @since 6.0.0
75
75
  */
76
- checkboxProps?: PropsWithRef<CheckboxProps, HTMLInputElement>;
76
+ checkboxProps?: PropsWithRef<CheckboxProps>;
77
77
  }
78
78
 
79
79
  /**
@@ -68,7 +68,7 @@ export interface TableRadioProps
68
68
  * @see {@link TableRadioSupportedRadioProps}
69
69
  * @since 6.0.0
70
70
  */
71
- radioProps?: PropsWithRef<RadioProps, HTMLInputElement>;
71
+ radioProps?: PropsWithRef<RadioProps>;
72
72
  }
73
73
 
74
74
  /**
@@ -31,7 +31,7 @@ import {
31
31
  export interface BaseTabListScrollButtonProps
32
32
  extends HTMLAttributes<HTMLDivElement>,
33
33
  ButtonClassNameThemeOptions {
34
- buttonProps?: PropsWithRef<ButtonProps, HTMLButtonElement>;
34
+ buttonProps?: PropsWithRef<ButtonProps>;
35
35
 
36
36
  /** @defaultValue `false` */
37
37
  disableTransition?: boolean;
@@ -1,3 +1,4 @@
1
+ /* eslint-disable no-param-reassign */
1
2
  import { black, white } from "./colors.js";
2
3
 
3
4
  const RGB_REGEX = /^rgb\(((\b([01]?\d\d?|2[0-4]\d|25[0-5])\b),?){3}\)$/;
@@ -37,7 +38,7 @@ export function hexToRGB(hex: string): RGB {
37
38
 
38
39
  export function getRGB(color: string): RGB {
39
40
  // chrome 102.0.50005.63 apparently has whitespace when calling `window.getComputedStyle(element)`
40
- // remove whitepsace to make it easy for supporting rgb or hex
41
+ // remove whitespace to make it easy for supporting rgb or hex
41
42
  color = color.replace(/\s/g, "");
42
43
  const rgbMatches = color.match(RGB_REGEX);
43
44
  if (rgbMatches) {
@@ -48,12 +48,12 @@ export interface TreeItemProps
48
48
  * element. The top-level props are passed to the `<span>` or `<a>` element
49
49
  * instead.
50
50
  */
51
- liProps?: PropsWithRef<HTMLAttributes<HTMLLIElement>, HTMLLIElement>;
51
+ liProps?: PropsWithRef<HTMLAttributes<HTMLLIElement>>;
52
52
 
53
53
  /**
54
54
  * Any additional props to pass to the `TreeGroup` component.
55
55
  */
56
- groupProps?: PropsWithRef<OverridableTreeGroupProps, HTMLUListElement>;
56
+ groupProps?: PropsWithRef<OverridableTreeGroupProps>;
57
57
 
58
58
  /**
59
59
  * This should normally be the text/content to display within the tree item
package/src/types.ts CHANGED
@@ -1,12 +1,25 @@
1
- import type { Dispatch, ReactElement, Ref, SetStateAction } from "react";
1
+ import {
2
+ type Dispatch,
3
+ type HTMLAttributes,
4
+ type ReactElement,
5
+ type Ref,
6
+ type SetStateAction,
7
+ } from "react";
2
8
 
3
9
  /**
4
10
  * A helper type that allows an optional `ref` to also be applied with a props
5
11
  * object even though a `ref` isn't a real prop.
12
+ *
13
+ * @since 6.2.0 Automatically infer the `Element` type param from the provided
14
+ * props.
6
15
  */
7
16
  export type PropsWithRef<
8
17
  Props extends object,
9
- Element extends HTMLElement,
18
+ Element extends HTMLElement = Props extends HTMLAttributes<infer E>
19
+ ? E extends HTMLElement
20
+ ? E
21
+ : never
22
+ : never,
10
23
  > = Props & {
11
24
  /**
12
25
  * An optional ref that can be applied.
@@ -104,6 +117,18 @@ export type HtmlTagName = keyof JSX.IntrinsicElements;
104
117
  */
105
118
  export type TextExtractor<T> = (item: T) => string;
106
119
 
120
+ /**
121
+ * - `"some value"` -&gt; `"some value"`
122
+ * - `{ label: "Hello, world", value: 300 }` -&gt; `"Hello, world!"`
123
+ * - `{ name: "Hello, world", value: 300 }` -&gt; `"Hello, world!"`
124
+ *
125
+ * @since 6.2.0
126
+ */
127
+ export type AutomaticTextExtraction =
128
+ | string
129
+ | { label: string }
130
+ | { name: string };
131
+
107
132
  /**
108
133
  * @since 6.0.0
109
134
  * @internal
@@ -201,3 +226,20 @@ export interface ElementSize {
201
226
  height: number;
202
227
  width: number;
203
228
  }
229
+
230
+ /**
231
+ * @since 6.2.0
232
+ */
233
+ export type OverridableStringUnion<
234
+ Defaults extends string,
235
+ Overrides extends Partial<Record<string, boolean>>,
236
+ > =
237
+ | Exclude<Defaults, { [K in keyof Overrides]: K }[keyof Overrides]>
238
+ | {
239
+ [K in keyof Overrides]: Overrides[K] extends false ? never : K;
240
+ }[keyof Overrides];
241
+
242
+ /**
243
+ * @since 6.2.0
244
+ */
245
+ export type IsEmptyObject<T> = keyof T extends never ? true : false;
@@ -1,5 +1,11 @@
1
1
  import { defaultExtractor } from "../searching/utils.js";
2
- import { type TextExtractor } from "../types.js";
2
+ import { type AutomaticTextExtraction, type TextExtractor } from "../types.js";
3
+
4
+ /**
5
+ * @since 6.2.0
6
+ * @internal
7
+ */
8
+ const DEFAULT_EXTRACTOR = defaultExtractor("alphaNumericSort");
3
9
 
4
10
  /** @since 6.0.0 */
5
11
  export const DEFAULT_COLLATOR_OPTIONS = {
@@ -26,13 +32,13 @@ export interface AlphaNumericSortOptions<T> {
26
32
  * @example Simple Example
27
33
  * ```ts
28
34
  * interface Item {
29
- * name: string;
35
+ * nameField: string;
30
36
  * }
31
37
  *
32
- * const items: Item[] = [{ name: 'Hello' }, { name: 'World' }];
38
+ * const items: Item[] = [{ nameField: 'Hello' }, { nameField: 'World' }];
33
39
  *
34
40
  * alphaNumericSort(items, {
35
- * extractor: (item) => item.name,
41
+ * extractor: (item) => item.nameField,
36
42
  * });
37
43
  * ```
38
44
  *
@@ -87,23 +93,23 @@ export interface AlphaNumericSortOptions<T> {
87
93
  * @param list - The list of strings to sort
88
94
  * @returns a new sorted list
89
95
  */
90
- export function alphaNumericSort<T extends string>(
96
+ export function alphaNumericSort<T extends AutomaticTextExtraction>(
91
97
  list: readonly T[],
92
- options?: Omit<AlphaNumericSortOptions<T>, "extractor">
98
+ options?: AlphaNumericSortOptions<T>
93
99
  ): readonly T[];
94
100
  /**
95
101
  * @example Simple Example
96
102
  * ```ts
97
103
  * interface Item {
98
- * name: string;
104
+ * nameField: string;
99
105
  * }
100
106
  *
101
- * const items: Item[] = [{ name: "World" }, { name: "Hello" }];
107
+ * const items: Item[] = [{ nameField: "World" }, { nameField: "Hello" }];
102
108
  *
103
109
  * const sorted = alphaNumericSort(items, {
104
- * extractor: (item) => item.name,
110
+ * extractor: (item) => item.nameField,
105
111
  * });
106
- * // sorted == [{ name: "Hello" }, { name: "World" }]
112
+ * // sorted == [{ nameField: "Hello" }, { nameField: "World" }]
107
113
  * ```
108
114
  *
109
115
  * @param list - The list of items to sort
@@ -119,7 +125,7 @@ export function alphaNumericSort<T>(
119
125
  ): readonly T[] {
120
126
  const {
121
127
  compare = DEFAULT_COLLATOR.compare,
122
- extractor = defaultExtractor("alphaNumericSort"),
128
+ extractor = DEFAULT_EXTRACTOR,
123
129
  descending = false,
124
130
  } = options;
125
131
 
package/src/utils/bem.ts CHANGED
@@ -8,7 +8,7 @@ function modify(base: string, modifier?: BEMModifier): string {
8
8
  const hasOwn = Object.prototype.hasOwnProperty;
9
9
  return Object.keys(modifier).reduce((s, mod) => {
10
10
  if (hasOwn.call(modifier, mod) && modifier[mod]) {
11
- s = `${s} ${base}--${mod}`;
11
+ return `${s} ${base}--${mod}`;
12
12
  }
13
13
 
14
14
  return s;
@@ -43,6 +43,10 @@ export function parseCssLengthUnit(options: ParseCssLengthUnitOptions): number {
43
43
  return value;
44
44
  }
45
45
 
46
+ if (value.includes("calc")) {
47
+ throw new Error(`Unable to parse a unit with \`calc\`: "${value}"`);
48
+ }
49
+
46
50
  const parsed = parseFloat(value);
47
51
  if (/px$/i.test(value)) {
48
52
  return parsed;