@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
@@ -1,5 +1,5 @@
1
1
  import { type CSSProperties, type HTMLAttributes } from "react";
2
- import { type LabelRequiredForA11y } from "../types.js";
2
+ import { type LabelRequiredForA11y, type PropsWithRef } from "../types.js";
3
3
  import { type ProgressProps } from "./types.js";
4
4
  /**
5
5
  * @since 6.0.0 Added the `theme` prop
@@ -15,6 +15,10 @@ export interface LinearProgressProps extends Omit<HTMLAttributes<HTMLSpanElement
15
15
  * An optional className to apply to the progress bar.
16
16
  */
17
17
  barClassName?: string;
18
+ /**
19
+ * @since 6.1.0
20
+ */
21
+ barProps?: PropsWithRef<HTMLAttributes<HTMLSpanElement>>;
18
22
  /**
19
23
  * Boolean if the progress should be reversed. This will change the progress
20
24
  * direction from `left-to-right` to be `right-to-left`. If the current
@@ -1,11 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cnb } from "cnbuilder";
3
2
  import { forwardRef, useMemo } from "react";
4
- import { cssUtils } from "../cssUtils.js";
5
3
  import { useEnsuredId } from "../useEnsuredId.js";
6
- import { bem } from "../utils/bem.js";
7
4
  import { getPercentage } from "../utils/getPercentage.js";
8
- const styles = bem("rmd-linear-progress");
5
+ import { linearProgress, linearProgressBar } from "./linearProgressStyles.js";
9
6
  /**
10
7
  * @example Indeterminate Example
11
8
  * ```tsx
@@ -34,7 +31,7 @@ const styles = bem("rmd-linear-progress");
34
31
  * @since 6.0.0 Supports rendering as any of the theme colors and
35
32
  * requires a label for accessibility.
36
33
  */ export const LinearProgress = /*#__PURE__*/ forwardRef(function LinearProgress(props, ref) {
37
- const { id: propId, style: propStyle, className, barStyle: propBarStyle, barClassName, min = 0, max = 100, value, reverse = false, theme = "primary", disableTransition = false, vertical = false, verticalHeight = 240, ...remaining } = props;
34
+ const { id: propId, style: propStyle, className, barStyle: propBarStyle, barClassName, barProps, min = 0, max = 100, value, reverse, theme, disableTransition, vertical, verticalHeight = 240, ...remaining } = props;
38
35
  const id = useEnsuredId(propId, "linear-progress");
39
36
  const style = useMemo(()=>{
40
37
  if (!vertical || verticalHeight === null) {
@@ -72,8 +69,7 @@ const styles = bem("rmd-linear-progress");
72
69
  propBarStyle,
73
70
  vertical
74
71
  ]);
75
- const determinate = typeof progress === "number";
76
- const indeterminate = !determinate;
72
+ const indeterminate = typeof progress !== "number";
77
73
  return /*#__PURE__*/ _jsx("span", {
78
74
  ...remaining,
79
75
  id: id,
@@ -83,30 +79,22 @@ const styles = bem("rmd-linear-progress");
83
79
  "aria-valuemin": min,
84
80
  "aria-valuemax": max,
85
81
  "aria-valuenow": value,
86
- className: cnb(styles({
82
+ className: linearProgress({
83
+ className,
84
+ theme,
87
85
  vertical,
88
- horizontal: !vertical,
89
- determinate,
90
86
  indeterminate
91
- }), theme !== "current-color" && cssUtils({
92
- textColor: theme
93
- }), className),
87
+ }),
94
88
  children: /*#__PURE__*/ _jsx("span", {
89
+ ...barProps,
95
90
  style: barStyle,
96
- className: cnb(styles("bar", {
91
+ className: linearProgressBar({
92
+ className: barClassName,
93
+ reverse,
97
94
  vertical,
98
- "vertical-reverse": vertical && reverse,
99
- horizontal: !vertical,
100
- "horizontal-reverse": !vertical && reverse,
101
- animate: !disableTransition && determinate,
102
- determinate,
103
95
  indeterminate,
104
- "determinate-reverse": determinate && reverse && !vertical,
105
- "determinate-vertical-reverse": determinate && reverse && vertical,
106
- "indeterminate-reverse": indeterminate && reverse && !vertical,
107
- "indeterminate-vertical": indeterminate && vertical,
108
- "indeterminate-vertical-reverse": indeterminate && reverse && vertical
109
- }), barClassName)
96
+ disableTransition
97
+ })
110
98
  })
111
99
  });
112
100
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/progress/LinearProgress.tsx"],"sourcesContent":["import { cnb } from \"cnbuilder\";\nimport {\n type CSSProperties,\n type HTMLAttributes,\n forwardRef,\n useMemo,\n} from \"react\";\n\nimport { cssUtils } from \"../cssUtils.js\";\nimport { type LabelRequiredForA11y } from \"../types.js\";\nimport { useEnsuredId } from \"../useEnsuredId.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { getPercentage } from \"../utils/getPercentage.js\";\nimport { type ProgressProps } from \"./types.js\";\n\n/**\n * @since 6.0.0 Added the `theme` prop\n */\nexport interface LinearProgressProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"id\" | \"children\">,\n ProgressProps {\n /**\n * An optional style to apply to the progress bar. This will be merged with\n * the current width or height tracking the progress when a `value` is also\n * provided.\n */\n barStyle?: CSSProperties;\n\n /**\n * An optional className to apply to the progress bar.\n */\n barClassName?: string;\n\n /**\n * Boolean if the progress should be reversed. This will change the progress\n * direction from `left-to-right` to be `right-to-left`. If the current\n * language is a rtl language and this prop is enabled, the direction will\n * still be `left-to-right`.\n *\n * @defaultValue `false`\n */\n reverse?: boolean;\n\n /**\n * Boolean if the progress should be vertical instead of horizontal. When\n * this prop is set, you should also set the `verticalHeight` prop to a height\n * value you want for your progress bar.\n *\n * @defaultValue `false`\n */\n vertical?: boolean;\n\n /**\n * Since there isn't really a good way to have \"auto height\", you'll need to\n * manually set the progress bar's height with this prop to some pixel value.\n * If you'd prefer to set the height in Sass/css, set this value to `null`\n * instead since this value would be passed down as a `height` inline style.\n *\n * @defaultValue `240`\n */\n verticalHeight?: number | null;\n}\n\nconst styles = bem(\"rmd-linear-progress\");\n\n/**\n * @example Indeterminate Example\n * ```tsx\n * import { LinearProgress } from \"@react-md/core/progress/LinearProgress\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return <LinearProgress aria-label=\"Loading\" />;\n * }\n * ```\n *\n * @example Determinate Example\n * ```tsx\n * import { LinearProgress } from \"@react-md/core/progress/LinearProgress\";\n * import { useState, type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * // a number from 0 - 100\n * const [progress, setProgress] = useState(0);\n *\n * return <LinearProgress aria-label=\"File upload\" value={progress} />;\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/progress#linear-progress | Progress Demos}\n * @since 6.0.0 Supports rendering as any of the theme colors and\n * requires a label for accessibility.\n */\nexport const LinearProgress = forwardRef<\n HTMLSpanElement,\n LabelRequiredForA11y<LinearProgressProps>\n>(function LinearProgress(props, ref) {\n const {\n id: propId,\n style: propStyle,\n className,\n barStyle: propBarStyle,\n barClassName,\n min = 0,\n max = 100,\n value,\n reverse = false,\n theme = \"primary\",\n disableTransition = false,\n vertical = false,\n verticalHeight = 240,\n ...remaining\n } = props;\n\n const id = useEnsuredId(propId, \"linear-progress\");\n const style = useMemo(() => {\n if (!vertical || verticalHeight === null) {\n return propStyle;\n }\n\n return {\n ...propStyle,\n height: verticalHeight,\n };\n }, [propStyle, vertical, verticalHeight]);\n\n let progress: number | undefined;\n if (typeof value === \"number\") {\n progress = getPercentage({ min, max, value, validate: true });\n }\n const barStyle = useMemo(() => {\n if (typeof progress !== \"number\") {\n return propBarStyle;\n }\n\n const key = vertical ? \"height\" : \"width\";\n return {\n ...propBarStyle,\n [key]: `${progress * 100}%`,\n };\n }, [progress, propBarStyle, vertical]);\n\n const determinate = typeof progress === \"number\";\n const indeterminate = !determinate;\n return (\n <span\n {...remaining}\n id={id}\n ref={ref}\n style={style}\n role=\"progressbar\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n className={cnb(\n styles({\n vertical,\n horizontal: !vertical,\n determinate,\n indeterminate,\n }),\n theme !== \"current-color\" && cssUtils({ textColor: theme }),\n className\n )}\n >\n <span\n style={barStyle}\n className={cnb(\n styles(\"bar\", {\n vertical,\n \"vertical-reverse\": vertical && reverse,\n horizontal: !vertical,\n \"horizontal-reverse\": !vertical && reverse,\n animate: !disableTransition && determinate,\n determinate,\n indeterminate,\n \"determinate-reverse\": determinate && reverse && !vertical,\n \"determinate-vertical-reverse\": determinate && reverse && vertical,\n \"indeterminate-reverse\": indeterminate && reverse && !vertical,\n \"indeterminate-vertical\": indeterminate && vertical,\n \"indeterminate-vertical-reverse\":\n indeterminate && reverse && vertical,\n }),\n barClassName\n )}\n />\n </span>\n );\n});\n"],"names":["cnb","forwardRef","useMemo","cssUtils","useEnsuredId","bem","getPercentage","styles","LinearProgress","props","ref","id","propId","style","propStyle","className","barStyle","propBarStyle","barClassName","min","max","value","reverse","theme","disableTransition","vertical","verticalHeight","remaining","height","progress","validate","key","determinate","indeterminate","span","role","aria-valuemin","aria-valuemax","aria-valuenow","horizontal","textColor","animate"],"mappings":";AAAA,SAASA,GAAG,QAAQ,YAAY;AAChC,SAGEC,UAAU,EACVC,OAAO,QACF,QAAQ;AAEf,SAASC,QAAQ,QAAQ,iBAAiB;AAE1C,SAASC,YAAY,QAAQ,qBAAqB;AAClD,SAASC,GAAG,QAAQ,kBAAkB;AACtC,SAASC,aAAa,QAAQ,4BAA4B;AAmD1D,MAAMC,SAASF,IAAI;AAEnB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,MAAMG,+BAAiBP,WAG5B,SAASO,eAAeC,KAAK,EAAEC,GAAG;IAClC,MAAM,EACJC,IAAIC,MAAM,EACVC,OAAOC,SAAS,EAChBC,SAAS,EACTC,UAAUC,YAAY,EACtBC,YAAY,EACZC,MAAM,CAAC,EACPC,MAAM,GAAG,EACTC,KAAK,EACLC,UAAU,KAAK,EACfC,QAAQ,SAAS,EACjBC,oBAAoB,KAAK,EACzBC,WAAW,KAAK,EAChBC,iBAAiB,GAAG,EACpB,GAAGC,WACJ,GAAGlB;IAEJ,MAAME,KAAKP,aAAaQ,QAAQ;IAChC,MAAMC,QAAQX,QAAQ;QACpB,IAAI,CAACuB,YAAYC,mBAAmB,MAAM;YACxC,OAAOZ;QACT;QAEA,OAAO;YACL,GAAGA,SAAS;YACZc,QAAQF;QACV;IACF,GAAG;QAACZ;QAAWW;QAAUC;KAAe;IAExC,IAAIG;IACJ,IAAI,OAAOR,UAAU,UAAU;QAC7BQ,WAAWvB,cAAc;YAAEa;YAAKC;YAAKC;YAAOS,UAAU;QAAK;IAC7D;IACA,MAAMd,WAAWd,QAAQ;QACvB,IAAI,OAAO2B,aAAa,UAAU;YAChC,OAAOZ;QACT;QAEA,MAAMc,MAAMN,WAAW,WAAW;QAClC,OAAO;YACL,GAAGR,YAAY;YACf,CAACc,IAAI,EAAE,GAAGF,WAAW,IAAI,CAAC,CAAC;QAC7B;IACF,GAAG;QAACA;QAAUZ;QAAcQ;KAAS;IAErC,MAAMO,cAAc,OAAOH,aAAa;IACxC,MAAMI,gBAAgB,CAACD;IACvB,qBACE,KAACE;QACE,GAAGP,SAAS;QACbhB,IAAIA;QACJD,KAAKA;QACLG,OAAOA;QACPsB,MAAK;QACLC,iBAAejB;QACfkB,iBAAejB;QACfkB,iBAAejB;QACfN,WAAWf,IACTO,OAAO;YACLkB;YACAc,YAAY,CAACd;YACbO;YACAC;QACF,IACAV,UAAU,mBAAmBpB,SAAS;YAAEqC,WAAWjB;QAAM,IACzDR;kBAGF,cAAA,KAACmB;YACCrB,OAAOG;YACPD,WAAWf,IACTO,OAAO,OAAO;gBACZkB;gBACA,oBAAoBA,YAAYH;gBAChCiB,YAAY,CAACd;gBACb,sBAAsB,CAACA,YAAYH;gBACnCmB,SAAS,CAACjB,qBAAqBQ;gBAC/BA;gBACAC;gBACA,uBAAuBD,eAAeV,WAAW,CAACG;gBAClD,gCAAgCO,eAAeV,WAAWG;gBAC1D,yBAAyBQ,iBAAiBX,WAAW,CAACG;gBACtD,0BAA0BQ,iBAAiBR;gBAC3C,kCACEQ,iBAAiBX,WAAWG;YAChC,IACAP;;;AAKV,GAAG"}
1
+ {"version":3,"sources":["../../src/progress/LinearProgress.tsx"],"sourcesContent":["import {\n type CSSProperties,\n type HTMLAttributes,\n forwardRef,\n useMemo,\n} from \"react\";\n\nimport { type LabelRequiredForA11y, type PropsWithRef } from \"../types.js\";\nimport { useEnsuredId } from \"../useEnsuredId.js\";\nimport { getPercentage } from \"../utils/getPercentage.js\";\nimport { linearProgress, linearProgressBar } from \"./linearProgressStyles.js\";\nimport { type ProgressProps } from \"./types.js\";\n\n/**\n * @since 6.0.0 Added the `theme` prop\n */\nexport interface LinearProgressProps\n extends Omit<HTMLAttributes<HTMLSpanElement>, \"id\" | \"children\">,\n ProgressProps {\n /**\n * An optional style to apply to the progress bar. This will be merged with\n * the current width or height tracking the progress when a `value` is also\n * provided.\n */\n barStyle?: CSSProperties;\n\n /**\n * An optional className to apply to the progress bar.\n */\n barClassName?: string;\n\n /**\n * @since 6.1.0\n */\n barProps?: PropsWithRef<HTMLAttributes<HTMLSpanElement>>;\n\n /**\n * Boolean if the progress should be reversed. This will change the progress\n * direction from `left-to-right` to be `right-to-left`. If the current\n * language is a rtl language and this prop is enabled, the direction will\n * still be `left-to-right`.\n *\n * @defaultValue `false`\n */\n reverse?: boolean;\n\n /**\n * Boolean if the progress should be vertical instead of horizontal. When\n * this prop is set, you should also set the `verticalHeight` prop to a height\n * value you want for your progress bar.\n *\n * @defaultValue `false`\n */\n vertical?: boolean;\n\n /**\n * Since there isn't really a good way to have \"auto height\", you'll need to\n * manually set the progress bar's height with this prop to some pixel value.\n * If you'd prefer to set the height in Sass/css, set this value to `null`\n * instead since this value would be passed down as a `height` inline style.\n *\n * @defaultValue `240`\n */\n verticalHeight?: number | null;\n}\n\n/**\n * @example Indeterminate Example\n * ```tsx\n * import { LinearProgress } from \"@react-md/core/progress/LinearProgress\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return <LinearProgress aria-label=\"Loading\" />;\n * }\n * ```\n *\n * @example Determinate Example\n * ```tsx\n * import { LinearProgress } from \"@react-md/core/progress/LinearProgress\";\n * import { useState, type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * // a number from 0 - 100\n * const [progress, setProgress] = useState(0);\n *\n * return <LinearProgress aria-label=\"File upload\" value={progress} />;\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/progress#linear-progress | Progress Demos}\n * @since 6.0.0 Supports rendering as any of the theme colors and\n * requires a label for accessibility.\n */\nexport const LinearProgress = forwardRef<\n HTMLSpanElement,\n LabelRequiredForA11y<LinearProgressProps>\n>(function LinearProgress(props, ref) {\n const {\n id: propId,\n style: propStyle,\n className,\n barStyle: propBarStyle,\n barClassName,\n barProps,\n min = 0,\n max = 100,\n value,\n reverse,\n theme,\n disableTransition,\n vertical,\n verticalHeight = 240,\n ...remaining\n } = props;\n\n const id = useEnsuredId(propId, \"linear-progress\");\n const style = useMemo(() => {\n if (!vertical || verticalHeight === null) {\n return propStyle;\n }\n\n return {\n ...propStyle,\n height: verticalHeight,\n };\n }, [propStyle, vertical, verticalHeight]);\n\n let progress: number | undefined;\n if (typeof value === \"number\") {\n progress = getPercentage({ min, max, value, validate: true });\n }\n const barStyle = useMemo(() => {\n if (typeof progress !== \"number\") {\n return propBarStyle;\n }\n\n const key = vertical ? \"height\" : \"width\";\n return {\n ...propBarStyle,\n [key]: `${progress * 100}%`,\n };\n }, [progress, propBarStyle, vertical]);\n\n const indeterminate = typeof progress !== \"number\";\n return (\n <span\n {...remaining}\n id={id}\n ref={ref}\n style={style}\n role=\"progressbar\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n className={linearProgress({\n className,\n theme,\n vertical,\n indeterminate,\n })}\n >\n <span\n {...barProps}\n style={barStyle}\n className={linearProgressBar({\n className: barClassName,\n reverse,\n vertical,\n indeterminate,\n disableTransition,\n })}\n />\n </span>\n );\n});\n"],"names":["forwardRef","useMemo","useEnsuredId","getPercentage","linearProgress","linearProgressBar","LinearProgress","props","ref","id","propId","style","propStyle","className","barStyle","propBarStyle","barClassName","barProps","min","max","value","reverse","theme","disableTransition","vertical","verticalHeight","remaining","height","progress","validate","key","indeterminate","span","role","aria-valuemin","aria-valuemax","aria-valuenow"],"mappings":";AAAA,SAGEA,UAAU,EACVC,OAAO,QACF,QAAQ;AAGf,SAASC,YAAY,QAAQ,qBAAqB;AAClD,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,cAAc,EAAEC,iBAAiB,QAAQ,4BAA4B;AAwD9E;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,MAAMC,+BAAiBN,WAG5B,SAASM,eAAeC,KAAK,EAAEC,GAAG;IAClC,MAAM,EACJC,IAAIC,MAAM,EACVC,OAAOC,SAAS,EAChBC,SAAS,EACTC,UAAUC,YAAY,EACtBC,YAAY,EACZC,QAAQ,EACRC,MAAM,CAAC,EACPC,MAAM,GAAG,EACTC,KAAK,EACLC,OAAO,EACPC,KAAK,EACLC,iBAAiB,EACjBC,QAAQ,EACRC,iBAAiB,GAAG,EACpB,GAAGC,WACJ,GAAGnB;IAEJ,MAAME,KAAKP,aAAaQ,QAAQ;IAChC,MAAMC,QAAQV,QAAQ;QACpB,IAAI,CAACuB,YAAYC,mBAAmB,MAAM;YACxC,OAAOb;QACT;QAEA,OAAO;YACL,GAAGA,SAAS;YACZe,QAAQF;QACV;IACF,GAAG;QAACb;QAAWY;QAAUC;KAAe;IAExC,IAAIG;IACJ,IAAI,OAAOR,UAAU,UAAU;QAC7BQ,WAAWzB,cAAc;YAAEe;YAAKC;YAAKC;YAAOS,UAAU;QAAK;IAC7D;IACA,MAAMf,WAAWb,QAAQ;QACvB,IAAI,OAAO2B,aAAa,UAAU;YAChC,OAAOb;QACT;QAEA,MAAMe,MAAMN,WAAW,WAAW;QAClC,OAAO;YACL,GAAGT,YAAY;YACf,CAACe,IAAI,EAAE,GAAGF,WAAW,IAAI,CAAC,CAAC;QAC7B;IACF,GAAG;QAACA;QAAUb;QAAcS;KAAS;IAErC,MAAMO,gBAAgB,OAAOH,aAAa;IAC1C,qBACE,KAACI;QACE,GAAGN,SAAS;QACbjB,IAAIA;QACJD,KAAKA;QACLG,OAAOA;QACPsB,MAAK;QACLC,iBAAehB;QACfiB,iBAAehB;QACfiB,iBAAehB;QACfP,WAAWT,eAAe;YACxBS;YACAS;YACAE;YACAO;QACF;kBAEA,cAAA,KAACC;YACE,GAAGf,QAAQ;YACZN,OAAOG;YACPD,WAAWR,kBAAkB;gBAC3BQ,WAAWG;gBACXK;gBACAG;gBACAO;gBACAR;YACF;;;AAIR,GAAG"}
@@ -0,0 +1,62 @@
1
+ import { type ProgressTheme } from "./types.js";
2
+ /**
3
+ * @since 6.2.0
4
+ */
5
+ export interface CircularProgressClassNameOptions {
6
+ className?: string;
7
+ /**
8
+ * @defaultValue `"primary"`
9
+ * @since 6.0.0
10
+ */
11
+ theme?: ProgressTheme;
12
+ /**
13
+ * Set to `true` to render as a smaller size.
14
+ *
15
+ * @defaultValue `false`
16
+ * @since 2.3.0
17
+ * @since 6.0.0 Renamed from `small`
18
+ */
19
+ dense?: boolean;
20
+ /**
21
+ * Boolean if the circular progress should be centered using left and right
22
+ * margins.
23
+ *
24
+ * @defaultValue `false`
25
+ * @since 6.0.0 Renamed from `centered`
26
+ */
27
+ disableCentered?: boolean;
28
+ }
29
+ /**
30
+ * @since 6.2.0
31
+ */
32
+ export declare function circularProgress(options?: CircularProgressClassNameOptions): string;
33
+ /**
34
+ * @since 6.2.0
35
+ */
36
+ export interface CircularProgressSvgClassNameOptions {
37
+ className?: string;
38
+ /** @defaultValue `false` */
39
+ indeterminate?: boolean;
40
+ /** @defaultValue `false` */
41
+ disableShrink?: boolean;
42
+ }
43
+ /**
44
+ * @since 6.2.0
45
+ */
46
+ export declare function circularProgressSvg(options?: CircularProgressSvgClassNameOptions): string;
47
+ /**
48
+ * @since 6.2.0
49
+ */
50
+ export interface CircularProgressCircleClassNameOptions {
51
+ className?: string;
52
+ /** @defaultValue `false` */
53
+ indeterminate?: boolean;
54
+ /** @defaultValue `false` */
55
+ disableShrink?: boolean;
56
+ /** @defaultValue `false` */
57
+ disableTransition?: boolean;
58
+ }
59
+ /**
60
+ * @since 6.2.0
61
+ */
62
+ export declare function circularProgressCircle(options?: CircularProgressCircleClassNameOptions): string;
@@ -0,0 +1,38 @@
1
+ import { cnb } from "cnbuilder";
2
+ import { cssUtils } from "../cssUtils.js";
3
+ import { bem } from "../utils/bem.js";
4
+ const styles = bem("rmd-circular-progress");
5
+ /**
6
+ * @since 6.2.0
7
+ */ export function circularProgress(options = {}) {
8
+ const { className, theme = "primary", dense, disableCentered } = options;
9
+ return cnb(styles({
10
+ dense,
11
+ centered: !disableCentered
12
+ }), theme !== "current-color" && cssUtils({
13
+ textColor: theme
14
+ }), className);
15
+ }
16
+ /**
17
+ * @since 6.2.0
18
+ */ export function circularProgressSvg(options = {}) {
19
+ const { className, indeterminate, disableShrink } = options;
20
+ return cnb(styles("svg", {
21
+ determinate: !indeterminate,
22
+ indeterminate: indeterminate && !disableShrink,
23
+ "rotate-only": indeterminate && disableShrink
24
+ }), className);
25
+ }
26
+ /**
27
+ * @since 6.2.0
28
+ */ export function circularProgressCircle(options = {}) {
29
+ const { className, indeterminate, disableShrink, disableTransition } = options;
30
+ return cnb(styles("circle", {
31
+ animate: !disableTransition && !indeterminate,
32
+ determinate: !indeterminate,
33
+ indeterminate: indeterminate && !disableShrink,
34
+ "rotate-only": indeterminate && disableShrink
35
+ }), className);
36
+ }
37
+
38
+ //# sourceMappingURL=circularProgressStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/progress/circularProgressStyles.ts"],"sourcesContent":["import { cnb } from \"cnbuilder\";\n\nimport { cssUtils } from \"../cssUtils.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type ProgressTheme } from \"./types.js\";\n\nconst styles = bem(\"rmd-circular-progress\");\n\n/**\n * @since 6.2.0\n */\nexport interface CircularProgressClassNameOptions {\n className?: string;\n\n /**\n * @defaultValue `\"primary\"`\n * @since 6.0.0\n */\n theme?: ProgressTheme;\n\n /**\n * Set to `true` to render as a smaller size.\n *\n * @defaultValue `false`\n * @since 2.3.0\n * @since 6.0.0 Renamed from `small`\n */\n dense?: boolean;\n\n /**\n * Boolean if the circular progress should be centered using left and right\n * margins.\n *\n * @defaultValue `false`\n * @since 6.0.0 Renamed from `centered`\n */\n disableCentered?: boolean;\n}\n\n/**\n * @since 6.2.0\n */\nexport function circularProgress(\n options: CircularProgressClassNameOptions = {}\n): string {\n const { className, theme = \"primary\", dense, disableCentered } = options;\n\n return cnb(\n styles({ dense, centered: !disableCentered }),\n theme !== \"current-color\" && cssUtils({ textColor: theme }),\n className\n );\n}\n\n/**\n * @since 6.2.0\n */\nexport interface CircularProgressSvgClassNameOptions {\n className?: string;\n /** @defaultValue `false` */\n indeterminate?: boolean;\n /** @defaultValue `false` */\n disableShrink?: boolean;\n}\n\n/**\n * @since 6.2.0\n */\nexport function circularProgressSvg(\n options: CircularProgressSvgClassNameOptions = {}\n): string {\n const { className, indeterminate, disableShrink } = options;\n\n return cnb(\n styles(\"svg\", {\n determinate: !indeterminate,\n indeterminate: indeterminate && !disableShrink,\n \"rotate-only\": indeterminate && disableShrink,\n }),\n className\n );\n}\n/**\n * @since 6.2.0\n */\nexport interface CircularProgressCircleClassNameOptions {\n className?: string;\n /** @defaultValue `false` */\n indeterminate?: boolean;\n /** @defaultValue `false` */\n disableShrink?: boolean;\n /** @defaultValue `false` */\n disableTransition?: boolean;\n}\n\n/**\n * @since 6.2.0\n */\nexport function circularProgressCircle(\n options: CircularProgressCircleClassNameOptions = {}\n): string {\n const { className, indeterminate, disableShrink, disableTransition } =\n options;\n\n return cnb(\n styles(\"circle\", {\n animate: !disableTransition && !indeterminate,\n determinate: !indeterminate,\n indeterminate: indeterminate && !disableShrink,\n \"rotate-only\": indeterminate && disableShrink,\n }),\n className\n );\n}\n"],"names":["cnb","cssUtils","bem","styles","circularProgress","options","className","theme","dense","disableCentered","centered","textColor","circularProgressSvg","indeterminate","disableShrink","determinate","circularProgressCircle","disableTransition","animate"],"mappings":"AAAA,SAASA,GAAG,QAAQ,YAAY;AAEhC,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,GAAG,QAAQ,kBAAkB;AAGtC,MAAMC,SAASD,IAAI;AAiCnB;;CAEC,GACD,OAAO,SAASE,iBACdC,UAA4C,CAAC,CAAC;IAE9C,MAAM,EAAEC,SAAS,EAAEC,QAAQ,SAAS,EAAEC,KAAK,EAAEC,eAAe,EAAE,GAAGJ;IAEjE,OAAOL,IACLG,OAAO;QAAEK;QAAOE,UAAU,CAACD;IAAgB,IAC3CF,UAAU,mBAAmBN,SAAS;QAAEU,WAAWJ;IAAM,IACzDD;AAEJ;AAaA;;CAEC,GACD,OAAO,SAASM,oBACdP,UAA+C,CAAC,CAAC;IAEjD,MAAM,EAAEC,SAAS,EAAEO,aAAa,EAAEC,aAAa,EAAE,GAAGT;IAEpD,OAAOL,IACLG,OAAO,OAAO;QACZY,aAAa,CAACF;QACdA,eAAeA,iBAAiB,CAACC;QACjC,eAAeD,iBAAiBC;IAClC,IACAR;AAEJ;AAcA;;CAEC,GACD,OAAO,SAASU,uBACdX,UAAkD,CAAC,CAAC;IAEpD,MAAM,EAAEC,SAAS,EAAEO,aAAa,EAAEC,aAAa,EAAEG,iBAAiB,EAAE,GAClEZ;IAEF,OAAOL,IACLG,OAAO,UAAU;QACfe,SAAS,CAACD,qBAAqB,CAACJ;QAChCE,aAAa,CAACF;QACdA,eAAeA,iBAAiB,CAACC;QACjC,eAAeD,iBAAiBC;IAClC,IACAR;AAEJ"}
@@ -0,0 +1,38 @@
1
+ import { type ProgressTheme } from "./types.js";
2
+ /**
3
+ * @since 6.2.0
4
+ */
5
+ export interface LinearProgressClassNameOptions {
6
+ className?: string;
7
+ /**
8
+ * @defaultValue `"primary"`
9
+ * @since 6.0.0
10
+ */
11
+ theme?: ProgressTheme;
12
+ /** @defaultValue `false` */
13
+ vertical?: boolean;
14
+ /** @defaultValue `false` */
15
+ indeterminate?: boolean;
16
+ }
17
+ /**
18
+ * @since 6.2.0
19
+ */
20
+ export declare function linearProgress(options?: LinearProgressClassNameOptions): string;
21
+ /**
22
+ * @since 6.2.0
23
+ */
24
+ export interface LinearProgressBarClassNameOptions {
25
+ className?: string;
26
+ /** @defaultValue `false` */
27
+ reverse?: boolean;
28
+ /** @defaultValue `false` */
29
+ vertical?: boolean;
30
+ /** @defaultValue `false` */
31
+ indeterminate?: boolean;
32
+ /** @defaultValue `false` */
33
+ disableTransition?: boolean;
34
+ }
35
+ /**
36
+ * @since 6.2.0
37
+ */
38
+ export declare function linearProgressBar(options?: LinearProgressBarClassNameOptions): string;
@@ -0,0 +1,38 @@
1
+ import { cnb } from "cnbuilder";
2
+ import { cssUtils } from "../cssUtils.js";
3
+ import { bem } from "../utils/bem.js";
4
+ const styles = bem("rmd-linear-progress");
5
+ /**
6
+ * @since 6.2.0
7
+ */ export function linearProgress(options = {}) {
8
+ const { className, theme = "primary", vertical, indeterminate } = options;
9
+ return cnb(styles({
10
+ vertical,
11
+ horizontal: !vertical,
12
+ determinate: !indeterminate,
13
+ indeterminate
14
+ }), theme !== "current-color" && cssUtils({
15
+ textColor: theme
16
+ }), className);
17
+ }
18
+ /**
19
+ * @since 6.2.0
20
+ */ export function linearProgressBar(options = {}) {
21
+ const { className, reverse, vertical, indeterminate, disableTransition } = options;
22
+ return cnb(styles("bar", {
23
+ vertical,
24
+ "vertical-reverse": vertical && reverse,
25
+ horizontal: !vertical,
26
+ "horizontal-reverse": !vertical && reverse,
27
+ animate: !disableTransition && !indeterminate,
28
+ determinate: !indeterminate,
29
+ indeterminate,
30
+ "determinate-reverse": !indeterminate && reverse && !vertical,
31
+ "determinate-vertical-reverse": !indeterminate && reverse && vertical,
32
+ "indeterminate-reverse": indeterminate && reverse && !vertical,
33
+ "indeterminate-vertical": indeterminate && vertical,
34
+ "indeterminate-vertical-reverse": indeterminate && reverse && vertical
35
+ }), className);
36
+ }
37
+
38
+ //# sourceMappingURL=linearProgressStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/progress/linearProgressStyles.ts"],"sourcesContent":["import { cnb } from \"cnbuilder\";\n\nimport { cssUtils } from \"../cssUtils.js\";\nimport { bem } from \"../utils/bem.js\";\nimport { type ProgressTheme } from \"./types.js\";\n\nconst styles = bem(\"rmd-linear-progress\");\n\n/**\n * @since 6.2.0\n */\nexport interface LinearProgressClassNameOptions {\n className?: string;\n\n /**\n * @defaultValue `\"primary\"`\n * @since 6.0.0\n */\n theme?: ProgressTheme;\n\n /** @defaultValue `false` */\n vertical?: boolean;\n\n /** @defaultValue `false` */\n indeterminate?: boolean;\n}\n\n/**\n * @since 6.2.0\n */\nexport function linearProgress(\n options: LinearProgressClassNameOptions = {}\n): string {\n const { className, theme = \"primary\", vertical, indeterminate } = options;\n\n return cnb(\n styles({\n vertical,\n horizontal: !vertical,\n determinate: !indeterminate,\n indeterminate,\n }),\n theme !== \"current-color\" && cssUtils({ textColor: theme }),\n className\n );\n}\n\n/**\n * @since 6.2.0\n */\nexport interface LinearProgressBarClassNameOptions {\n className?: string;\n\n /** @defaultValue `false` */\n reverse?: boolean;\n /** @defaultValue `false` */\n vertical?: boolean;\n /** @defaultValue `false` */\n indeterminate?: boolean;\n /** @defaultValue `false` */\n disableTransition?: boolean;\n}\n\n/**\n * @since 6.2.0\n */\nexport function linearProgressBar(\n options: LinearProgressBarClassNameOptions = {}\n): string {\n const { className, reverse, vertical, indeterminate, disableTransition } =\n options;\n\n return cnb(\n styles(\"bar\", {\n vertical,\n \"vertical-reverse\": vertical && reverse,\n horizontal: !vertical,\n \"horizontal-reverse\": !vertical && reverse,\n animate: !disableTransition && !indeterminate,\n determinate: !indeterminate,\n indeterminate,\n \"determinate-reverse\": !indeterminate && reverse && !vertical,\n \"determinate-vertical-reverse\": !indeterminate && reverse && vertical,\n \"indeterminate-reverse\": indeterminate && reverse && !vertical,\n \"indeterminate-vertical\": indeterminate && vertical,\n \"indeterminate-vertical-reverse\": indeterminate && reverse && vertical,\n }),\n className\n );\n}\n"],"names":["cnb","cssUtils","bem","styles","linearProgress","options","className","theme","vertical","indeterminate","horizontal","determinate","textColor","linearProgressBar","reverse","disableTransition","animate"],"mappings":"AAAA,SAASA,GAAG,QAAQ,YAAY;AAEhC,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,GAAG,QAAQ,kBAAkB;AAGtC,MAAMC,SAASD,IAAI;AAqBnB;;CAEC,GACD,OAAO,SAASE,eACdC,UAA0C,CAAC,CAAC;IAE5C,MAAM,EAAEC,SAAS,EAAEC,QAAQ,SAAS,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGJ;IAElE,OAAOL,IACLG,OAAO;QACLK;QACAE,YAAY,CAACF;QACbG,aAAa,CAACF;QACdA;IACF,IACAF,UAAU,mBAAmBN,SAAS;QAAEW,WAAWL;IAAM,IACzDD;AAEJ;AAkBA;;CAEC,GACD,OAAO,SAASO,kBACdR,UAA6C,CAAC,CAAC;IAE/C,MAAM,EAAEC,SAAS,EAAEQ,OAAO,EAAEN,QAAQ,EAAEC,aAAa,EAAEM,iBAAiB,EAAE,GACtEV;IAEF,OAAOL,IACLG,OAAO,OAAO;QACZK;QACA,oBAAoBA,YAAYM;QAChCJ,YAAY,CAACF;QACb,sBAAsB,CAACA,YAAYM;QACnCE,SAAS,CAACD,qBAAqB,CAACN;QAChCE,aAAa,CAACF;QACdA;QACA,uBAAuB,CAACA,iBAAiBK,WAAW,CAACN;QACrD,gCAAgC,CAACC,iBAAiBK,WAAWN;QAC7D,yBAAyBC,iBAAiBK,WAAW,CAACN;QACtD,0BAA0BC,iBAAiBD;QAC3C,kCAAkCC,iBAAiBK,WAAWN;IAChE,IACAF;AAEJ"}
@@ -6,6 +6,7 @@
6
6
  @use "sass:map";
7
7
  @use "sass:math";
8
8
  @use "../utils";
9
+ @use "../spacing";
9
10
  @use "../theme/colors";
10
11
  @use "../theme/theme";
11
12
 
@@ -85,7 +86,7 @@ $overlay-z-index: 0 !default;
85
86
 
86
87
  /// The default `ResponsiveItemOverlay` padding.
87
88
  /// @type Number
88
- $overlay-padding: 1rem !default;
89
+ $overlay-padding: spacing.get-var(md) !default;
89
90
 
90
91
  /// The default width to apply to the `position="left"`, `"position="right"`,
91
92
  /// `position="center"`, or `position="absolute-center"`
@@ -1,4 +1,4 @@
1
- import { type TextExtractor } from "../types.js";
1
+ import { type AutomaticTextExtraction, type TextExtractor } from "../types.js";
2
2
  import { type BaseSearchOptions } from "./types.js";
3
3
  /**
4
4
  * @since 6.0.0
@@ -123,17 +123,33 @@ export interface CaseInsensitiveOptions<T> extends BaseSearchOptions<T>, CaseIns
123
123
  * caseInsensitiveSearch({
124
124
  * list: fruits,
125
125
  * query: "ap",
126
- * extractor: (item) => item.name,
127
126
  * });
128
127
  * // [{ name: "Apple", value: 0 }, { name: "Grape", value: 2 }]
129
128
  * ```
130
129
  *
130
+ * @example Objects With Custom Names
131
+ * ```ts
132
+ * const fruits = [
133
+ * { nameField: "Apple", value: 0 },
134
+ * { nameField: "Banana", value: 1 },
135
+ * { nameField: "Grape", value: 2 },
136
+ * { nameField: "Orange", value: 3 },
137
+ * ];
138
+ *
139
+ * caseInsensitiveSearch({
140
+ * list: fruits,
141
+ * query: "ap",
142
+ * extractor: (item) => item.nameField,
143
+ * });
144
+ * // [{ nameField: "Apple", value: 0 }, { nameField: "Grape", value: 2 }]
145
+ * ```
146
+ *
131
147
  * @since 6.0.0
132
148
  */
133
- export declare function caseInsensitiveSearch<T extends string>(options: Omit<CaseInsensitiveOptions<T>, "extractor"> & {
149
+ export declare function caseInsensitiveSearch<T extends AutomaticTextExtraction>(options: CaseInsensitiveOptions<T> & {
134
150
  type?: "filter";
135
151
  }): readonly T[];
136
- export declare function caseInsensitiveSearch<T extends string>(options: Omit<CaseInsensitiveOptions<T>, "extractor"> & {
152
+ export declare function caseInsensitiveSearch<T extends AutomaticTextExtraction>(options: CaseInsensitiveOptions<T> & {
137
153
  type: "search";
138
154
  }): T | undefined;
139
155
  export declare function caseInsensitiveSearch<T>(options: CaseInsensitiveOptions<T> & {
@@ -1,4 +1,8 @@
1
1
  import { defaultExtractor, search } from "./utils.js";
2
+ /**
3
+ * @since 6.2.0
4
+ * @internal
5
+ */ const DEFAULT_EXTRACTOR = defaultExtractor("caseInsensitiveSearch");
2
6
  /**
3
7
  * @since 6.0.0
4
8
  */ export function isCaseInsensitiveMatch(options) {
@@ -10,7 +14,7 @@ import { defaultExtractor, search } from "./utils.js";
10
14
  return matchIndex !== -1;
11
15
  }
12
16
  export function caseInsensitiveSearch(options) {
13
- const { list, type = "filter", query, extractor = defaultExtractor("caseInsensitiveSearch"), startsWith, whitespace } = options;
17
+ const { list, type = "filter", query, extractor = DEFAULT_EXTRACTOR, startsWith, whitespace } = options;
14
18
  return search({
15
19
  type,
16
20
  list,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/searching/caseInsensitive.ts"],"sourcesContent":["import { type TextExtractor } from \"../types.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\nimport { defaultExtractor, search } from \"./utils.js\";\n\n/**\n * @since 6.0.0\n */\nexport interface CaseInsensitiveStartsWithOptions {\n /**\n * Set this to `true` if the item in the list must start with the query\n * instead of only including it.\n *\n * @example Search Example\n * ```ts\n * const fruits = [\"Banana\", \"Grape\", \"Apple\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * type: \"search\",\n * });\n * // \"Grape\"\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * type: \"search\",\n * startsWith: true,\n * });\n * // \"Apple\"\n * ```\n *\n * @example Filter Example\n * ```ts\n * const fruits = [\"Apple\", \"Banana\", \"Grape\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * startsWith: true,\n * });\n * // [\"Apple\"]\n * ```\n *\n * @defaultValue `false`\n */\n startsWith?: boolean;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface IsCaseInsensitiveMatchOptions\n extends CaseInsensitiveStartsWithOptions {\n /**\n * The current search query.\n */\n query: string;\n\n /**\n * The current value to compare against.\n */\n value: string;\n}\n\n/**\n * @since 6.0.0\n */\nexport function isCaseInsensitiveMatch(\n options: IsCaseInsensitiveMatchOptions\n): boolean {\n const { query, value, startsWith } = options;\n const matchIndex = value.indexOf(query);\n if (startsWith) {\n return matchIndex === 0;\n }\n\n return matchIndex !== -1;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface CaseInsensitiveOptions<T>\n extends BaseSearchOptions<T>,\n CaseInsensitiveStartsWithOptions {}\n\n/**\n * @example String list\n * ```ts\n * const fruits = [\"Apple\", \"Banana\", \"Grape\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * startsWith: true,\n * });\n * // [\"Apple\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" a p\",\n * });\n * // []\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" a p\",\n * whitespace: \"ignore\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" ap \",\n * whitespace: \"trim\",\n * });\n * // [\"Apple\", \"Grape\"]\n * ```\n *\n * @example Objects\n * ```ts\n * const fruits = [\n * { name: \"Apple\", value: 0 },\n * { name: \"Banana\", value: 1 },\n * { name: \"Grape\", value: 2 },\n * { name: \"Orange\", value: 3 },\n * ];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * extractor: (item) => item.name,\n * });\n * // [{ name: \"Apple\", value: 0 }, { name: \"Grape\", value: 2 }]\n * ```\n *\n * @since 6.0.0\n */\nexport function caseInsensitiveSearch<T extends string>(\n options: Omit<CaseInsensitiveOptions<T>, \"extractor\"> & { type?: \"filter\" }\n): readonly T[];\nexport function caseInsensitiveSearch<T extends string>(\n options: Omit<CaseInsensitiveOptions<T>, \"extractor\"> & { type: \"search\" }\n): T | undefined;\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"filter\";\n }\n): readonly T[];\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T> & {\n extractor: TextExtractor<T>;\n type: \"search\";\n }\n): T | undefined;\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T>\n): readonly T[] | T | undefined {\n const {\n list,\n type = \"filter\",\n query,\n extractor = defaultExtractor(\"caseInsensitiveSearch\"),\n startsWith,\n whitespace,\n } = options;\n\n return search({\n type,\n list,\n query,\n extractor,\n whitespace,\n filter(q, value) {\n return isCaseInsensitiveMatch({\n query: q,\n value,\n startsWith,\n });\n },\n });\n}\n"],"names":["defaultExtractor","search","isCaseInsensitiveMatch","options","query","value","startsWith","matchIndex","indexOf","caseInsensitiveSearch","list","type","extractor","whitespace","filter","q"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,MAAM,QAAQ,aAAa;AAqEtD;;CAEC,GACD,OAAO,SAASC,uBACdC,OAAsC;IAEtC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGH;IACrC,MAAMI,aAAaF,MAAMG,OAAO,CAACJ;IACjC,IAAIE,YAAY;QACd,OAAOC,eAAe;IACxB;IAEA,OAAOA,eAAe,CAAC;AACzB;AAqFA,OAAO,SAASE,sBACdN,OAAkC;IAElC,MAAM,EACJO,IAAI,EACJC,OAAO,QAAQ,EACfP,KAAK,EACLQ,YAAYZ,iBAAiB,wBAAwB,EACrDM,UAAU,EACVO,UAAU,EACX,GAAGV;IAEJ,OAAOF,OAAO;QACZU;QACAD;QACAN;QACAQ;QACAC;QACAC,QAAOC,CAAC,EAAEV,KAAK;YACb,OAAOH,uBAAuB;gBAC5BE,OAAOW;gBACPV;gBACAC;YACF;QACF;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/searching/caseInsensitive.ts"],"sourcesContent":["import { type AutomaticTextExtraction, type TextExtractor } from \"../types.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\nimport { defaultExtractor, search } from \"./utils.js\";\n\n/**\n * @since 6.2.0\n * @internal\n */\nconst DEFAULT_EXTRACTOR = defaultExtractor(\"caseInsensitiveSearch\");\n\n/**\n * @since 6.0.0\n */\nexport interface CaseInsensitiveStartsWithOptions {\n /**\n * Set this to `true` if the item in the list must start with the query\n * instead of only including it.\n *\n * @example Search Example\n * ```ts\n * const fruits = [\"Banana\", \"Grape\", \"Apple\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * type: \"search\",\n * });\n * // \"Grape\"\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * type: \"search\",\n * startsWith: true,\n * });\n * // \"Apple\"\n * ```\n *\n * @example Filter Example\n * ```ts\n * const fruits = [\"Apple\", \"Banana\", \"Grape\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * startsWith: true,\n * });\n * // [\"Apple\"]\n * ```\n *\n * @defaultValue `false`\n */\n startsWith?: boolean;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface IsCaseInsensitiveMatchOptions\n extends CaseInsensitiveStartsWithOptions {\n /**\n * The current search query.\n */\n query: string;\n\n /**\n * The current value to compare against.\n */\n value: string;\n}\n\n/**\n * @since 6.0.0\n */\nexport function isCaseInsensitiveMatch(\n options: IsCaseInsensitiveMatchOptions\n): boolean {\n const { query, value, startsWith } = options;\n const matchIndex = value.indexOf(query);\n if (startsWith) {\n return matchIndex === 0;\n }\n\n return matchIndex !== -1;\n}\n\n/**\n * @since 6.0.0\n */\nexport interface CaseInsensitiveOptions<T>\n extends BaseSearchOptions<T>,\n CaseInsensitiveStartsWithOptions {}\n\n/**\n * @example String list\n * ```ts\n * const fruits = [\"Apple\", \"Banana\", \"Grape\", \"Orange\"];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * startsWith: true,\n * });\n * // [\"Apple\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" a p\",\n * });\n * // []\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" a p\",\n * whitespace: \"ignore\",\n * });\n * // [\"Apple\", \"Grape\"]\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \" ap \",\n * whitespace: \"trim\",\n * });\n * // [\"Apple\", \"Grape\"]\n * ```\n *\n * @example Objects\n * ```ts\n * const fruits = [\n * { name: \"Apple\", value: 0 },\n * { name: \"Banana\", value: 1 },\n * { name: \"Grape\", value: 2 },\n * { name: \"Orange\", value: 3 },\n * ];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * });\n * // [{ name: \"Apple\", value: 0 }, { name: \"Grape\", value: 2 }]\n * ```\n *\n * @example Objects With Custom Names\n * ```ts\n * const fruits = [\n * { nameField: \"Apple\", value: 0 },\n * { nameField: \"Banana\", value: 1 },\n * { nameField: \"Grape\", value: 2 },\n * { nameField: \"Orange\", value: 3 },\n * ];\n *\n * caseInsensitiveSearch({\n * list: fruits,\n * query: \"ap\",\n * extractor: (item) => item.nameField,\n * });\n * // [{ nameField: \"Apple\", value: 0 }, { nameField: \"Grape\", value: 2 }]\n * ```\n *\n * @since 6.0.0\n */\nexport function caseInsensitiveSearch<T extends AutomaticTextExtraction>(\n options: CaseInsensitiveOptions<T> & { type?: \"filter\" }\n): readonly T[];\nexport function caseInsensitiveSearch<T extends AutomaticTextExtraction>(\n options: CaseInsensitiveOptions<T> & { type: \"search\" }\n): T | undefined;\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"filter\";\n }\n): readonly T[];\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T> & {\n extractor: TextExtractor<T>;\n type: \"search\";\n }\n): T | undefined;\nexport function caseInsensitiveSearch<T>(\n options: CaseInsensitiveOptions<T>\n): readonly T[] | T | undefined {\n const {\n list,\n type = \"filter\",\n query,\n extractor = DEFAULT_EXTRACTOR,\n startsWith,\n whitespace,\n } = options;\n\n return search({\n type,\n list,\n query,\n extractor,\n whitespace,\n filter(q, value) {\n return isCaseInsensitiveMatch({\n query: q,\n value,\n startsWith,\n });\n },\n });\n}\n"],"names":["defaultExtractor","search","DEFAULT_EXTRACTOR","isCaseInsensitiveMatch","options","query","value","startsWith","matchIndex","indexOf","caseInsensitiveSearch","list","type","extractor","whitespace","filter","q"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,MAAM,QAAQ,aAAa;AAEtD;;;CAGC,GACD,MAAMC,oBAAoBF,iBAAiB;AAqE3C;;CAEC,GACD,OAAO,SAASG,uBACdC,OAAsC;IAEtC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGH;IACrC,MAAMI,aAAaF,MAAMG,OAAO,CAACJ;IACjC,IAAIE,YAAY;QACd,OAAOC,eAAe;IACxB;IAEA,OAAOA,eAAe,CAAC;AACzB;AAqGA,OAAO,SAASE,sBACdN,OAAkC;IAElC,MAAM,EACJO,IAAI,EACJC,OAAO,QAAQ,EACfP,KAAK,EACLQ,YAAYX,iBAAiB,EAC7BK,UAAU,EACVO,UAAU,EACX,GAAGV;IAEJ,OAAOH,OAAO;QACZW;QACAD;QACAN;QACAQ;QACAC;QACAC,QAAOC,CAAC,EAAEV,KAAK;YACb,OAAOH,uBAAuB;gBAC5BE,OAAOW;gBACPV;gBACAC;YACF;QACF;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { type TextExtractor } from "../types.js";
1
+ import { type AutomaticTextExtraction, type TextExtractor } from "../types.js";
2
2
  import { type BaseSearchOptions } from "./types.js";
3
3
  /**
4
4
  * @example
@@ -112,10 +112,10 @@ export type FuzzySearchOptions<T> = BaseSearchOptions<T>;
112
112
  *
113
113
  * @since 6.0.0
114
114
  */
115
- export declare function fuzzySearch<T extends string>(options: Omit<FuzzySearchOptions<T>, "extractor"> & {
115
+ export declare function fuzzySearch<T extends AutomaticTextExtraction>(options: FuzzySearchOptions<T> & {
116
116
  type?: "filter";
117
117
  }): readonly T[];
118
- export declare function fuzzySearch<T extends string>(options: Omit<FuzzySearchOptions<T>, "extractor"> & {
118
+ export declare function fuzzySearch<T extends AutomaticTextExtraction>(options: FuzzySearchOptions<T> & {
119
119
  type?: "search";
120
120
  }): T | undefined;
121
121
  export declare function fuzzySearch<T>(option: FuzzySearchOptions<T> & {
@@ -1,4 +1,8 @@
1
1
  import { defaultExtractor, search } from "./utils.js";
2
+ /**
3
+ * @since 6.2.0
4
+ * @internal
5
+ */ const DEFAULT_EXTRACTOR = defaultExtractor("fuzzySearch");
2
6
  /**
3
7
  * @example
4
8
  * ```tsx
@@ -34,7 +38,7 @@ import { defaultExtractor, search } from "./utils.js";
34
38
  .replace(/\*\*/g, "*\\*"), "i");
35
39
  }
36
40
  export function fuzzySearch(options) {
37
- const { list, type = "filter", query, extractor = defaultExtractor("fuzzySearch"), whitespace } = options;
41
+ const { list, type = "filter", query, extractor = DEFAULT_EXTRACTOR, whitespace } = options;
38
42
  // lazy initialize the RegExp since the base `filter` function will modify the
39
43
  // query and never call the filter function if:
40
44
  // - there is no query
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/searching/fuzzy.ts"],"sourcesContent":["import { type TextExtractor } from \"../types.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\nimport { defaultExtractor, search } from \"./utils.js\";\n\n/**\n * @example\n * ```tsx\n * import { createFuzzyRegExp } from \"@react-md/core/searching/fuzzy\":\n * import { toSearchQuery } from \"@react-md/core/searching/toSearchQuery\":\n * import { useDeferredValue, useMemo, useState, type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const [value, setValue] = useState(\"\");\n * const deferredValue = useDeferredValue(value)\n *\n * const match = useMemo(() => {\n * const query = toSearchQuery(deferredValue);\n * if (!query) {\n * return;\n * }\n *\n * const fuzzyRegExp = createFuzzyRegExp(query);\n * return options.find(option => fuzzyRegExp.test(option.label)):\n * }, [options])\n *\n * if (match) {\n * // do something\n * }\n * }\n *\n * ```\n *\n * @since 6.0.0\n * @see {@link fuzzySearch}\n */\nexport function createFuzzyRegExp(query: string): RegExp {\n return new RegExp(\n query\n .split(\"\")\n .join(\"\\\\w*\")\n .replace(/(\\(|\\||\\)|\\\\(?!w\\*)|\\[|\\|-|\\.|\\^|\\+|\\$|\\?|^(?!w)\\*)/g, \"\\\\$1\")\n // Couldn't get the matching of two '*' working, so replace them here..\n .replace(/\\*\\*/g, \"*\\\\*\"),\n \"i\"\n );\n}\n\n/**\n * @since 6.0.0\n */\nexport type FuzzySearchOptions<T> = BaseSearchOptions<T>;\n\n/**\n * Filters a list by making sure that all the letters appear in order ignoring\n * case, punctuation, whitespace, and special characters. This is kind of the\n * same filtering that appears in text editors.\n *\n * @example Simple Example\n * ```ts\n * const list = [\n * \"at\",\n * \"charAt\",\n * \"charCodeAt\",\n * \"codePointAt\",\n * \"concat\",\n * \"constructor\",\n * \"endsWith\",\n * \"includes\",\n * \"indexOf\",\n * \"lastIndexOf\",\n * \"length\",\n * \"localeCompare\",\n * \"match\",\n * \"matchAll\",\n * \"normalize\",\n * \"padEnd\",\n * \"padStart\",\n * \"repeat\",\n * \"replace\",\n * \"replaceAll\",\n * \"search\",\n * \"slice\",\n * \"split\",\n * \"startsWith\",\n * \"substring\",\n * \"toLocaleLowerCase\",\n * \"toLocaleUpperCase\",\n * \"toLowerCase\",\n * \"toString\",\n * \"toUpperCase\",\n * \"trim\",\n * \"trimEnd\",\n * \"trimStart\",\n * \"valueOf\",\n * ];\n *\n * fuzzySearch({\n * list,\n * query: \"la\",\n * });\n * // [\n * // \"lastIndexOf\",\n * // ^^\n * // \"localeCompare\",\n * // ^ ^\n * // \"replace\",\n * // ^^\n * // \"replaceAll\",\n * // ^^\n * // \"toLocaleLowerCase\",\n * // ^ ^\n * // \"toLocaleUpperCase\",\n * // ^ ^\n * // \"toLowerCase\",\n * // ^ ^\n * // ]\n *\n * fuzzySearch({\n * list,\n * query: \"ad\",\n * type: \"search\",\n * });\n * // \"charCodeAt\"\n * // ^ ^\n * ```\n *\n * @since 6.0.0\n */\nexport function fuzzySearch<T extends string>(\n options: Omit<FuzzySearchOptions<T>, \"extractor\"> & { type?: \"filter\" }\n): readonly T[];\nexport function fuzzySearch<T extends string>(\n options: Omit<FuzzySearchOptions<T>, \"extractor\"> & { type?: \"search\" }\n): T | undefined;\nexport function fuzzySearch<T>(\n option: FuzzySearchOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"filter\";\n }\n): readonly T[];\nexport function fuzzySearch<T>(\n option: FuzzySearchOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"search\";\n }\n): T | undefined;\nexport function fuzzySearch<T>(\n options: FuzzySearchOptions<T>\n): readonly T[] | T | undefined {\n const {\n list,\n type = \"filter\",\n query,\n extractor = defaultExtractor(\"fuzzySearch\"),\n whitespace,\n } = options;\n\n // lazy initialize the RegExp since the base `filter` function will modify the\n // query and never call the filter function if:\n // - there is no query\n // - the list is empty\n let regexp: RegExp;\n return search({\n type,\n list,\n query,\n extractor,\n whitespace,\n filter(query, value) {\n return (\n value.length > 0 && (regexp ??= createFuzzyRegExp(query)).test(value)\n );\n },\n });\n}\n"],"names":["defaultExtractor","search","createFuzzyRegExp","query","RegExp","split","join","replace","fuzzySearch","options","list","type","extractor","whitespace","regexp","filter","value","length","test"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,MAAM,QAAQ,aAAa;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BC,GACD,OAAO,SAASC,kBAAkBC,KAAa;IAC7C,OAAO,IAAIC,OACTD,MACGE,KAAK,CAAC,IACNC,IAAI,CAAC,QACLC,OAAO,CAAC,wDAAwD,OACjE,uEAAuE;KACtEA,OAAO,CAAC,SAAS,SACpB;AAEJ;AAqGA,OAAO,SAASC,YACdC,OAA8B;IAE9B,MAAM,EACJC,IAAI,EACJC,OAAO,QAAQ,EACfR,KAAK,EACLS,YAAYZ,iBAAiB,cAAc,EAC3Ca,UAAU,EACX,GAAGJ;IAEJ,8EAA8E;IAC9E,+CAA+C;IAC/C,sBAAsB;IACtB,sBAAsB;IACtB,IAAIK;IACJ,OAAOb,OAAO;QACZU;QACAD;QACAP;QACAS;QACAC;QACAE,QAAOZ,KAAK,EAAEa,KAAK;YACjB,OACEA,MAAMC,MAAM,GAAG,KAAK,AAACH,CAAAA,WAAWZ,kBAAkBC,MAAK,EAAGe,IAAI,CAACF;QAEnE;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/searching/fuzzy.ts"],"sourcesContent":["import { type AutomaticTextExtraction, type TextExtractor } from \"../types.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\nimport { defaultExtractor, search } from \"./utils.js\";\n\n/**\n * @since 6.2.0\n * @internal\n */\nconst DEFAULT_EXTRACTOR = defaultExtractor(\"fuzzySearch\");\n\n/**\n * @example\n * ```tsx\n * import { createFuzzyRegExp } from \"@react-md/core/searching/fuzzy\":\n * import { toSearchQuery } from \"@react-md/core/searching/toSearchQuery\":\n * import { useDeferredValue, useMemo, useState, type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const [value, setValue] = useState(\"\");\n * const deferredValue = useDeferredValue(value)\n *\n * const match = useMemo(() => {\n * const query = toSearchQuery(deferredValue);\n * if (!query) {\n * return;\n * }\n *\n * const fuzzyRegExp = createFuzzyRegExp(query);\n * return options.find(option => fuzzyRegExp.test(option.label)):\n * }, [options])\n *\n * if (match) {\n * // do something\n * }\n * }\n *\n * ```\n *\n * @since 6.0.0\n * @see {@link fuzzySearch}\n */\nexport function createFuzzyRegExp(query: string): RegExp {\n return new RegExp(\n query\n .split(\"\")\n .join(\"\\\\w*\")\n .replace(/(\\(|\\||\\)|\\\\(?!w\\*)|\\[|\\|-|\\.|\\^|\\+|\\$|\\?|^(?!w)\\*)/g, \"\\\\$1\")\n // Couldn't get the matching of two '*' working, so replace them here..\n .replace(/\\*\\*/g, \"*\\\\*\"),\n \"i\"\n );\n}\n\n/**\n * @since 6.0.0\n */\nexport type FuzzySearchOptions<T> = BaseSearchOptions<T>;\n\n/**\n * Filters a list by making sure that all the letters appear in order ignoring\n * case, punctuation, whitespace, and special characters. This is kind of the\n * same filtering that appears in text editors.\n *\n * @example Simple Example\n * ```ts\n * const list = [\n * \"at\",\n * \"charAt\",\n * \"charCodeAt\",\n * \"codePointAt\",\n * \"concat\",\n * \"constructor\",\n * \"endsWith\",\n * \"includes\",\n * \"indexOf\",\n * \"lastIndexOf\",\n * \"length\",\n * \"localeCompare\",\n * \"match\",\n * \"matchAll\",\n * \"normalize\",\n * \"padEnd\",\n * \"padStart\",\n * \"repeat\",\n * \"replace\",\n * \"replaceAll\",\n * \"search\",\n * \"slice\",\n * \"split\",\n * \"startsWith\",\n * \"substring\",\n * \"toLocaleLowerCase\",\n * \"toLocaleUpperCase\",\n * \"toLowerCase\",\n * \"toString\",\n * \"toUpperCase\",\n * \"trim\",\n * \"trimEnd\",\n * \"trimStart\",\n * \"valueOf\",\n * ];\n *\n * fuzzySearch({\n * list,\n * query: \"la\",\n * });\n * // [\n * // \"lastIndexOf\",\n * // ^^\n * // \"localeCompare\",\n * // ^ ^\n * // \"replace\",\n * // ^^\n * // \"replaceAll\",\n * // ^^\n * // \"toLocaleLowerCase\",\n * // ^ ^\n * // \"toLocaleUpperCase\",\n * // ^ ^\n * // \"toLowerCase\",\n * // ^ ^\n * // ]\n *\n * fuzzySearch({\n * list,\n * query: \"ad\",\n * type: \"search\",\n * });\n * // \"charCodeAt\"\n * // ^ ^\n * ```\n *\n * @since 6.0.0\n */\nexport function fuzzySearch<T extends AutomaticTextExtraction>(\n options: FuzzySearchOptions<T> & { type?: \"filter\" }\n): readonly T[];\nexport function fuzzySearch<T extends AutomaticTextExtraction>(\n options: FuzzySearchOptions<T> & { type?: \"search\" }\n): T | undefined;\nexport function fuzzySearch<T>(\n option: FuzzySearchOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"filter\";\n }\n): readonly T[];\nexport function fuzzySearch<T>(\n option: FuzzySearchOptions<T> & {\n extractor: TextExtractor<T>;\n type?: \"search\";\n }\n): T | undefined;\nexport function fuzzySearch<T>(\n options: FuzzySearchOptions<T>\n): readonly T[] | T | undefined {\n const {\n list,\n type = \"filter\",\n query,\n extractor = DEFAULT_EXTRACTOR,\n whitespace,\n } = options;\n\n // lazy initialize the RegExp since the base `filter` function will modify the\n // query and never call the filter function if:\n // - there is no query\n // - the list is empty\n let regexp: RegExp;\n return search({\n type,\n list,\n query,\n extractor,\n whitespace,\n filter(query, value) {\n return (\n value.length > 0 && (regexp ??= createFuzzyRegExp(query)).test(value)\n );\n },\n });\n}\n"],"names":["defaultExtractor","search","DEFAULT_EXTRACTOR","createFuzzyRegExp","query","RegExp","split","join","replace","fuzzySearch","options","list","type","extractor","whitespace","regexp","filter","value","length","test"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,MAAM,QAAQ,aAAa;AAEtD;;;CAGC,GACD,MAAMC,oBAAoBF,iBAAiB;AAE3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BC,GACD,OAAO,SAASG,kBAAkBC,KAAa;IAC7C,OAAO,IAAIC,OACTD,MACGE,KAAK,CAAC,IACNC,IAAI,CAAC,QACLC,OAAO,CAAC,wDAAwD,OACjE,uEAAuE;KACtEA,OAAO,CAAC,SAAS,SACpB;AAEJ;AAqGA,OAAO,SAASC,YACdC,OAA8B;IAE9B,MAAM,EACJC,IAAI,EACJC,OAAO,QAAQ,EACfR,KAAK,EACLS,YAAYX,iBAAiB,EAC7BY,UAAU,EACX,GAAGJ;IAEJ,8EAA8E;IAC9E,+CAA+C;IAC/C,sBAAsB;IACtB,sBAAsB;IACtB,IAAIK;IACJ,OAAOd,OAAO;QACZW;QACAD;QACAP;QACAS;QACAC;QACAE,QAAOZ,KAAK,EAAEa,KAAK;YACjB,OACEA,MAAMC,MAAM,GAAG,KAAK,AAACH,CAAAA,WAAWZ,kBAAkBC,MAAK,EAAGe,IAAI,CAACF;QAEnE;IACF;AACF"}
@@ -2,9 +2,10 @@ import { type TextExtractor } from "../types.js";
2
2
  import { type BaseSearchOptions } from "./types.js";
3
3
  /**
4
4
  * @since 6.0.0
5
+ * @since 6.2.0 Added support for `item.name` and `item.label`.
5
6
  * @internal
6
7
  */
7
- export declare const defaultExtractor: (name: string) => (item: unknown) => string;
8
+ export declare const defaultExtractor: (usageName: string, propName?: string) => (item: unknown) => string;
8
9
  /**
9
10
  * @internal
10
11
  * @since 6.0.0
@@ -1,12 +1,21 @@
1
1
  import { toSearchQuery } from "./toSearchQuery.js";
2
2
  /**
3
3
  * @since 6.0.0
4
+ * @since 6.2.0 Added support for `item.name` and `item.label`.
4
5
  * @internal
5
- */ export const defaultExtractor = (name)=>(item)=>{
6
+ */ export const defaultExtractor = (usageName, propName = "extractor")=>(item)=>{
6
7
  if (typeof item === "string") {
7
8
  return item;
8
9
  }
9
- throw new Error(`A \`TextExtractor\` must be provided to \`${name}\` for lists that do not contain strings`);
10
+ if (item && typeof item === "object") {
11
+ if ("label" in item && typeof item.label === "string") {
12
+ return item.label;
13
+ }
14
+ if ("name" in item && typeof item.name === "string") {
15
+ return item.name;
16
+ }
17
+ }
18
+ throw new Error(`\`${usageName}\` requires the \`${propName}\` prop for lists that do not contain strings or known object types.`);
10
19
  };
11
20
  /**
12
21
  * @internal
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/searching/utils.ts"],"sourcesContent":["import { type TextExtractor } from \"../types.js\";\nimport { toSearchQuery } from \"./toSearchQuery.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n * @internal\n */\nexport const defaultExtractor =\n (name: string) =>\n (item: unknown): string => {\n if (typeof item === \"string\") {\n return item;\n }\n\n throw new Error(\n `A \\`TextExtractor\\` must be provided to \\`${name}\\` for lists that do not contain strings`\n );\n };\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport interface SearchOptions<T> extends BaseSearchOptions<T> {\n type: \"search\" | \"filter\";\n filter: (query: string, value: string) => boolean;\n extractor: TextExtractor<T>;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function search<T>(\n options: SearchOptions<T>\n): readonly T[] | T | undefined {\n const { list, type, query, filter, extractor, whitespace = \"keep\" } = options;\n const fallback = type === \"search\" ? undefined : list;\n if (!list.length) {\n return fallback;\n }\n\n const q = toSearchQuery(query, whitespace);\n if (!q) {\n return fallback;\n }\n\n const fn = type === \"search\" ? \"find\" : \"filter\";\n return list[fn]((item) =>\n filter(q, toSearchQuery(extractor(item), whitespace))\n );\n}\n"],"names":["toSearchQuery","defaultExtractor","name","item","Error","search","options","list","type","query","filter","extractor","whitespace","fallback","undefined","length","q","fn"],"mappings":"AACA,SAASA,aAAa,QAAQ,qBAAqB;AAGnD;;;CAGC,GACD,OAAO,MAAMC,mBACX,CAACC,OACD,CAACC;QACC,IAAI,OAAOA,SAAS,UAAU;YAC5B,OAAOA;QACT;QAEA,MAAM,IAAIC,MACR,CAAC,0CAA0C,EAAEF,KAAK,wCAAwC,CAAC;IAE/F,EAAE;AAYJ;;;CAGC,GACD,OAAO,SAASG,OACdC,OAAyB;IAEzB,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,KAAK,EAAEC,MAAM,EAAEC,SAAS,EAAEC,aAAa,MAAM,EAAE,GAAGN;IACtE,MAAMO,WAAWL,SAAS,WAAWM,YAAYP;IACjD,IAAI,CAACA,KAAKQ,MAAM,EAAE;QAChB,OAAOF;IACT;IAEA,MAAMG,IAAIhB,cAAcS,OAAOG;IAC/B,IAAI,CAACI,GAAG;QACN,OAAOH;IACT;IAEA,MAAMI,KAAKT,SAAS,WAAW,SAAS;IACxC,OAAOD,IAAI,CAACU,GAAG,CAAC,CAACd,OACfO,OAAOM,GAAGhB,cAAcW,UAAUR,OAAOS;AAE7C"}
1
+ {"version":3,"sources":["../../src/searching/utils.ts"],"sourcesContent":["import { type TextExtractor } from \"../types.js\";\nimport { toSearchQuery } from \"./toSearchQuery.js\";\nimport { type BaseSearchOptions } from \"./types.js\";\n\n/**\n * @since 6.0.0\n * @since 6.2.0 Added support for `item.name` and `item.label`.\n * @internal\n */\nexport const defaultExtractor =\n (usageName: string, propName = \"extractor\") =>\n (item: unknown): string => {\n if (typeof item === \"string\") {\n return item;\n }\n\n if (item && typeof item === \"object\") {\n if (\"label\" in item && typeof item.label === \"string\") {\n return item.label;\n }\n\n if (\"name\" in item && typeof item.name === \"string\") {\n return item.name;\n }\n }\n\n throw new Error(\n `\\`${usageName}\\` requires the \\`${propName}\\` prop for lists that do not contain strings or known object types.`\n );\n };\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport interface SearchOptions<T> extends BaseSearchOptions<T> {\n type: \"search\" | \"filter\";\n filter: (query: string, value: string) => boolean;\n extractor: TextExtractor<T>;\n}\n\n/**\n * @internal\n * @since 6.0.0\n */\nexport function search<T>(\n options: SearchOptions<T>\n): readonly T[] | T | undefined {\n const { list, type, query, filter, extractor, whitespace = \"keep\" } = options;\n const fallback = type === \"search\" ? undefined : list;\n if (!list.length) {\n return fallback;\n }\n\n const q = toSearchQuery(query, whitespace);\n if (!q) {\n return fallback;\n }\n\n const fn = type === \"search\" ? \"find\" : \"filter\";\n return list[fn]((item) =>\n filter(q, toSearchQuery(extractor(item), whitespace))\n );\n}\n"],"names":["toSearchQuery","defaultExtractor","usageName","propName","item","label","name","Error","search","options","list","type","query","filter","extractor","whitespace","fallback","undefined","length","q","fn"],"mappings":"AACA,SAASA,aAAa,QAAQ,qBAAqB;AAGnD;;;;CAIC,GACD,OAAO,MAAMC,mBACX,CAACC,WAAmBC,WAAW,WAAW,GAC1C,CAACC;QACC,IAAI,OAAOA,SAAS,UAAU;YAC5B,OAAOA;QACT;QAEA,IAAIA,QAAQ,OAAOA,SAAS,UAAU;YACpC,IAAI,WAAWA,QAAQ,OAAOA,KAAKC,KAAK,KAAK,UAAU;gBACrD,OAAOD,KAAKC,KAAK;YACnB;YAEA,IAAI,UAAUD,QAAQ,OAAOA,KAAKE,IAAI,KAAK,UAAU;gBACnD,OAAOF,KAAKE,IAAI;YAClB;QACF;QAEA,MAAM,IAAIC,MACR,CAAC,EAAE,EAAEL,UAAU,kBAAkB,EAAEC,SAAS,oEAAoE,CAAC;IAErH,EAAE;AAYJ;;;CAGC,GACD,OAAO,SAASK,OACdC,OAAyB;IAEzB,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,KAAK,EAAEC,MAAM,EAAEC,SAAS,EAAEC,aAAa,MAAM,EAAE,GAAGN;IACtE,MAAMO,WAAWL,SAAS,WAAWM,YAAYP;IACjD,IAAI,CAACA,KAAKQ,MAAM,EAAE;QAChB,OAAOF;IACT;IAEA,MAAMG,IAAInB,cAAcY,OAAOG;IAC/B,IAAI,CAACI,GAAG;QACN,OAAOH;IACT;IAEA,MAAMI,KAAKT,SAAS,WAAW,SAAS;IACxC,OAAOD,IAAI,CAACU,GAAG,CAAC,CAAChB,OACfS,OAAOM,GAAGnB,cAAcc,UAAUV,OAAOW;AAE7C"}