@react-md/core 6.2.1 → 6.3.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 (153) hide show
  1. package/dist/datetime/NativeDateField.d.ts +24 -0
  2. package/dist/datetime/NativeDateField.js +63 -0
  3. package/dist/datetime/NativeDateField.js.map +1 -0
  4. package/dist/datetime/NativeTimeField.d.ts +26 -0
  5. package/dist/datetime/NativeTimeField.js +63 -0
  6. package/dist/datetime/NativeTimeField.js.map +1 -0
  7. package/dist/datetime/useDateField.d.ts +120 -0
  8. package/dist/datetime/useDateField.js +35 -0
  9. package/dist/datetime/useDateField.js.map +1 -0
  10. package/dist/datetime/useTimeField.d.ts +124 -0
  11. package/dist/datetime/useTimeField.js +65 -0
  12. package/dist/datetime/useTimeField.js.map +1 -0
  13. package/dist/datetime/utils.d.ts +34 -0
  14. package/dist/datetime/utils.js +27 -0
  15. package/dist/datetime/utils.js.map +1 -0
  16. package/dist/draggable/utils.d.ts +3 -6
  17. package/dist/draggable/utils.js.map +1 -1
  18. package/dist/expansion-panel/ExpansionList.js +1 -1
  19. package/dist/expansion-panel/ExpansionList.js.map +1 -1
  20. package/dist/expansion-panel/useExpansionList.d.ts +2 -7
  21. package/dist/expansion-panel/useExpansionList.js.map +1 -1
  22. package/dist/form/FormMessage.js +3 -1
  23. package/dist/form/FormMessage.js.map +1 -1
  24. package/dist/form/FormMessageContainer.d.ts +2 -1
  25. package/dist/form/FormMessageContainer.js +3 -2
  26. package/dist/form/FormMessageContainer.js.map +1 -1
  27. package/dist/form/FormMessageCounter.d.ts +3 -2
  28. package/dist/form/FormMessageCounter.js +5 -2
  29. package/dist/form/FormMessageCounter.js.map +1 -1
  30. package/dist/form/Listbox.d.ts +3 -10
  31. package/dist/form/Listbox.js +8 -27
  32. package/dist/form/Listbox.js.map +1 -1
  33. package/dist/form/ListboxProvider.d.ts +17 -0
  34. package/dist/form/ListboxProvider.js +33 -1
  35. package/dist/form/ListboxProvider.js.map +1 -1
  36. package/dist/form/NativeSelect.js +1 -0
  37. package/dist/form/NativeSelect.js.map +1 -1
  38. package/dist/form/TextArea.js +1 -0
  39. package/dist/form/TextArea.js.map +1 -1
  40. package/dist/form/TextField.js +1 -0
  41. package/dist/form/TextField.js.map +1 -1
  42. package/dist/form/_form-message.scss +13 -0
  43. package/dist/form/_text-field.scss +12 -3
  44. package/dist/form/formMessageContainerStyles.d.ts +7 -0
  45. package/dist/form/formMessageContainerStyles.js +4 -2
  46. package/dist/form/formMessageContainerStyles.js.map +1 -1
  47. package/dist/form/sliderUtils.d.ts +3 -7
  48. package/dist/form/sliderUtils.js.map +1 -1
  49. package/dist/form/types.d.ts +13 -0
  50. package/dist/form/types.js.map +1 -1
  51. package/dist/form/useCombobox.d.ts +6 -2
  52. package/dist/form/useCombobox.js +8 -9
  53. package/dist/form/useCombobox.js.map +1 -1
  54. package/dist/form/useFormReset.d.ts +4 -1
  55. package/dist/form/useFormReset.js +9 -4
  56. package/dist/form/useFormReset.js.map +1 -1
  57. package/dist/form/useNumberField.d.ts +5 -5
  58. package/dist/form/useNumberField.js +10 -2
  59. package/dist/form/useNumberField.js.map +1 -1
  60. package/dist/form/useSelectCombobox.js +2 -2
  61. package/dist/form/useSelectCombobox.js.map +1 -1
  62. package/dist/form/useTextField.d.ts +76 -59
  63. package/dist/form/useTextField.js +7 -1
  64. package/dist/form/useTextField.js.map +1 -1
  65. package/dist/interaction/utils.d.ts +14 -0
  66. package/dist/interaction/utils.js +23 -12
  67. package/dist/interaction/utils.js.map +1 -1
  68. package/dist/menu/MenuBar.js +1 -1
  69. package/dist/menu/MenuBar.js.map +1 -1
  70. package/dist/menu/MenuItemTextField.d.ts +1 -2
  71. package/dist/menu/MenuItemTextField.js.map +1 -1
  72. package/dist/menu/MenuWidget.js +3 -2
  73. package/dist/menu/MenuWidget.js.map +1 -1
  74. package/dist/movement/constants.d.ts +10 -0
  75. package/dist/movement/constants.js +20 -4
  76. package/dist/movement/constants.js.map +1 -1
  77. package/dist/movement/types.d.ts +59 -10
  78. package/dist/movement/types.js.map +1 -1
  79. package/dist/movement/useKeyboardMovementProvider.d.ts +5 -1
  80. package/dist/movement/useKeyboardMovementProvider.js +171 -73
  81. package/dist/movement/useKeyboardMovementProvider.js.map +1 -1
  82. package/dist/tabs/useTabList.js +1 -1
  83. package/dist/tabs/useTabList.js.map +1 -1
  84. package/dist/test-utils/drag.d.ts +6 -9
  85. package/dist/transition/useCarousel.d.ts +2 -2
  86. package/dist/transition/useCarousel.js.map +1 -1
  87. package/dist/tree/Tree.js +1 -1
  88. package/dist/tree/Tree.js.map +1 -1
  89. package/dist/tree/useTreeMovement.d.ts +2 -1
  90. package/dist/tree/useTreeMovement.js +2 -1
  91. package/dist/tree/useTreeMovement.js.map +1 -1
  92. package/dist/types.d.ts +14 -0
  93. package/dist/types.js.map +1 -1
  94. package/dist/utils/getMiddleOfRange.d.ts +2 -3
  95. package/dist/utils/getMiddleOfRange.js.map +1 -1
  96. package/dist/utils/getPercentage.d.ts +2 -9
  97. package/dist/utils/getPercentage.js +1 -1
  98. package/dist/utils/getPercentage.js.map +1 -1
  99. package/dist/utils/getRangeSteps.d.ts +2 -3
  100. package/dist/utils/getRangeSteps.js +0 -3
  101. package/dist/utils/getRangeSteps.js.map +1 -1
  102. package/dist/utils/nearest.d.ts +2 -3
  103. package/dist/utils/nearest.js +0 -3
  104. package/dist/utils/nearest.js.map +1 -1
  105. package/dist/utils/trigonometry.d.ts +31 -0
  106. package/dist/utils/trigonometry.js +25 -0
  107. package/dist/utils/trigonometry.js.map +1 -0
  108. package/dist/window-splitter/useWindowSplitter.d.ts +1 -1
  109. package/dist/window-splitter/useWindowSplitter.js.map +1 -1
  110. package/package.json +1 -1
  111. package/src/datetime/NativeDateField.tsx +92 -0
  112. package/src/datetime/NativeTimeField.tsx +94 -0
  113. package/src/datetime/useDateField.ts +193 -0
  114. package/src/datetime/useTimeField.ts +233 -0
  115. package/src/datetime/utils.ts +48 -0
  116. package/src/draggable/utils.ts +3 -6
  117. package/src/expansion-panel/ExpansionList.tsx +2 -1
  118. package/src/expansion-panel/useExpansionList.ts +6 -12
  119. package/src/form/FormMessage.tsx +4 -0
  120. package/src/form/FormMessageContainer.tsx +8 -4
  121. package/src/form/FormMessageCounter.tsx +17 -6
  122. package/src/form/Listbox.tsx +18 -46
  123. package/src/form/ListboxProvider.ts +61 -1
  124. package/src/form/NativeSelect.tsx +1 -0
  125. package/src/form/TextArea.tsx +1 -0
  126. package/src/form/TextField.tsx +1 -0
  127. package/src/form/formMessageContainerStyles.ts +10 -2
  128. package/src/form/sliderUtils.ts +3 -7
  129. package/src/form/types.ts +15 -0
  130. package/src/form/useCombobox.ts +15 -10
  131. package/src/form/useFormReset.ts +12 -5
  132. package/src/form/useNumberField.ts +17 -14
  133. package/src/form/useSelectCombobox.ts +2 -2
  134. package/src/form/useTextField.ts +102 -69
  135. package/src/interaction/utils.ts +18 -20
  136. package/src/menu/MenuBar.tsx +1 -1
  137. package/src/menu/MenuItemTextField.tsx +1 -3
  138. package/src/menu/MenuWidget.tsx +4 -2
  139. package/src/movement/constants.ts +26 -4
  140. package/src/movement/types.ts +84 -19
  141. package/src/movement/useKeyboardMovementProvider.ts +209 -95
  142. package/src/tabs/useTabList.ts +1 -1
  143. package/src/test-utils/drag.ts +8 -12
  144. package/src/transition/useCarousel.ts +2 -2
  145. package/src/tree/Tree.tsx +1 -1
  146. package/src/tree/useTreeMovement.ts +4 -0
  147. package/src/types.ts +16 -0
  148. package/src/utils/getMiddleOfRange.ts +2 -3
  149. package/src/utils/getPercentage.ts +3 -11
  150. package/src/utils/getRangeSteps.ts +3 -3
  151. package/src/utils/nearest.ts +3 -3
  152. package/src/utils/trigonometry.ts +46 -0
  153. package/src/window-splitter/useWindowSplitter.ts +3 -2
@@ -0,0 +1,24 @@
1
+ import { type TextFieldProps } from "../form/TextField.js";
2
+ import { type DateFieldOptions } from "./useDateField.js";
3
+ /** @since 6.3.0 */
4
+ export interface NativeDateFieldProps extends Omit<TextFieldProps, keyof DateFieldOptions | "value">, Omit<DateFieldOptions, "ref"> {
5
+ }
6
+ /**
7
+ * The `NativeDateField` is a simple wrapper around the `TextField` using the
8
+ * `useDateField` hook.
9
+ *
10
+ * @example Simple Example
11
+ * ```tsx
12
+ * import { NativeDateField } from "@react-md/core/datetime/NativeDateField";
13
+ * import { type ReactElement } from "react";
14
+ *
15
+ * function Example(): ReactElement {
16
+ * return <NativeDateField label="Delivery Date" name="delivery" />;
17
+ * }
18
+ * ```
19
+ *
20
+ * @see {@link https://react-md.dev/components/native-time-field | NativeDateField Demos}
21
+ * @see {@link https://react-md.dev/components/text-field | TextField Demos}
22
+ * @since 6.3.0
23
+ */
24
+ export declare const NativeDateField: import("react").ForwardRefExoticComponent<NativeDateFieldProps & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { TextField } from "../form/TextField.js";
5
+ import { useDateField } from "./useDateField.js";
6
+ /**
7
+ * The `NativeDateField` is a simple wrapper around the `TextField` using the
8
+ * `useDateField` hook.
9
+ *
10
+ * @example Simple Example
11
+ * ```tsx
12
+ * import { NativeDateField } from "@react-md/core/datetime/NativeDateField";
13
+ * import { type ReactElement } from "react";
14
+ *
15
+ * function Example(): ReactElement {
16
+ * return <NativeDateField label="Delivery Date" name="delivery" />;
17
+ * }
18
+ * ```
19
+ *
20
+ * @see {@link https://react-md.dev/components/native-time-field | NativeDateField Demos}
21
+ * @see {@link https://react-md.dev/components/text-field | TextField Demos}
22
+ * @since 6.3.0
23
+ */ export const NativeDateField = /*#__PURE__*/ forwardRef(function NativeDateField(props, ref) {
24
+ const { id, min, max, step, onBlur, onInvalid, onChange, helpText, required, validationType, disableMessage, errorIcon, isErrored, getErrorIcon, getErrorMessage, onErrorChange, disableReset, defaultValue, ...remaining } = props;
25
+ const { name, form } = props;
26
+ const { fieldProps } = useDateField({
27
+ id,
28
+ ref,
29
+ name,
30
+ form,
31
+ min,
32
+ max,
33
+ step,
34
+ onBlur,
35
+ onChange,
36
+ onInvalid,
37
+ helpText,
38
+ required,
39
+ validationType,
40
+ disableMessage: disableMessage ?? (!min && !max && !step && !required),
41
+ errorIcon,
42
+ isErrored,
43
+ getErrorIcon,
44
+ getErrorMessage,
45
+ onErrorChange,
46
+ disableReset,
47
+ defaultValue
48
+ });
49
+ let { messageProps } = remaining;
50
+ if (fieldProps.messageProps) {
51
+ messageProps = {
52
+ ...fieldProps.messageProps,
53
+ ...remaining.messageProps
54
+ };
55
+ }
56
+ return /*#__PURE__*/ _jsx(TextField, {
57
+ ...remaining,
58
+ ...fieldProps,
59
+ messageProps: messageProps
60
+ });
61
+ });
62
+
63
+ //# sourceMappingURL=NativeDateField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datetime/NativeDateField.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { TextField, type TextFieldProps } from \"../form/TextField.js\";\nimport { type DateFieldOptions, useDateField } from \"./useDateField.js\";\n\n/** @since 6.3.0 */\nexport interface NativeDateFieldProps\n extends Omit<TextFieldProps, keyof DateFieldOptions | \"value\">,\n Omit<DateFieldOptions, \"ref\"> {}\n\n/**\n * The `NativeDateField` is a simple wrapper around the `TextField` using the\n * `useDateField` hook.\n *\n * @example Simple Example\n * ```tsx\n * import { NativeDateField } from \"@react-md/core/datetime/NativeDateField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return <NativeDateField label=\"Delivery Date\" name=\"delivery\" />;\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/native-time-field | NativeDateField Demos}\n * @see {@link https://react-md.dev/components/text-field | TextField Demos}\n * @since 6.3.0\n */\nexport const NativeDateField = forwardRef<\n HTMLInputElement,\n NativeDateFieldProps\n>(function NativeDateField(props, ref) {\n const {\n id,\n min,\n max,\n step,\n onBlur,\n onInvalid,\n onChange,\n helpText,\n required,\n validationType,\n disableMessage,\n errorIcon,\n isErrored,\n getErrorIcon,\n getErrorMessage,\n onErrorChange,\n disableReset,\n defaultValue,\n ...remaining\n } = props;\n const { name, form } = props;\n const { fieldProps } = useDateField({\n id,\n ref,\n name,\n form,\n min,\n max,\n step,\n onBlur,\n onChange,\n onInvalid,\n helpText,\n required,\n validationType,\n disableMessage: disableMessage ?? (!min && !max && !step && !required),\n errorIcon,\n isErrored,\n getErrorIcon,\n getErrorMessage,\n onErrorChange,\n disableReset,\n defaultValue,\n });\n\n let { messageProps } = remaining;\n if (fieldProps.messageProps) {\n messageProps = {\n ...fieldProps.messageProps,\n ...remaining.messageProps,\n };\n }\n\n return (\n <TextField {...remaining} {...fieldProps} messageProps={messageProps} />\n );\n});\n"],"names":["forwardRef","TextField","useDateField","NativeDateField","props","ref","id","min","max","step","onBlur","onInvalid","onChange","helpText","required","validationType","disableMessage","errorIcon","isErrored","getErrorIcon","getErrorMessage","onErrorChange","disableReset","defaultValue","remaining","name","form","fieldProps","messageProps"],"mappings":"AAAA;;AAEA,SAASA,UAAU,QAAQ,QAAQ;AAEnC,SAASC,SAAS,QAA6B,uBAAuB;AACtE,SAAgCC,YAAY,QAAQ,oBAAoB;AAOxE;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,MAAMC,gCAAkBH,WAG7B,SAASG,gBAAgBC,KAAK,EAAEC,GAAG;IACnC,MAAM,EACJC,EAAE,EACFC,GAAG,EACHC,GAAG,EACHC,IAAI,EACJC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,cAAc,EACdC,cAAc,EACdC,SAAS,EACTC,SAAS,EACTC,YAAY,EACZC,eAAe,EACfC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZ,GAAGC,WACJ,GAAGpB;IACJ,MAAM,EAAEqB,IAAI,EAAEC,IAAI,EAAE,GAAGtB;IACvB,MAAM,EAAEuB,UAAU,EAAE,GAAGzB,aAAa;QAClCI;QACAD;QACAoB;QACAC;QACAnB;QACAC;QACAC;QACAC;QACAE;QACAD;QACAE;QACAC;QACAC;QACAC,gBAAgBA,kBAAmB,CAAA,CAACT,OAAO,CAACC,OAAO,CAACC,QAAQ,CAACK,QAAO;QACpEG;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;IAEA,IAAI,EAAEK,YAAY,EAAE,GAAGJ;IACvB,IAAIG,WAAWC,YAAY,EAAE;QAC3BA,eAAe;YACb,GAAGD,WAAWC,YAAY;YAC1B,GAAGJ,UAAUI,YAAY;QAC3B;IACF;IAEA,qBACE,KAAC3B;QAAW,GAAGuB,SAAS;QAAG,GAAGG,UAAU;QAAEC,cAAcA;;AAE5D,GAAG"}
@@ -0,0 +1,26 @@
1
+ import { type TextFieldProps } from "../form/TextField.js";
2
+ import { type TimeFieldOptions } from "./useTimeField.js";
3
+ /**
4
+ * @since 6.3.0
5
+ */
6
+ export interface NativeTimeFieldProps extends Omit<TextFieldProps, keyof TimeFieldOptions | "value">, Omit<TimeFieldOptions, "ref"> {
7
+ }
8
+ /**
9
+ * The `NativeTimeField` is a simple wrapper around the `TextField` using the
10
+ * `useTimeField` hook.
11
+ *
12
+ * @example Simple Example
13
+ * ```tsx
14
+ * import { NativeTimeField } from "@react-md/core/datetime/NativeTimeField";
15
+ * import { type ReactElement } from "react";
16
+ *
17
+ * function Example(): ReactElement {
18
+ * return <NativeTimeField label="Time" name="appt" />;
19
+ * }
20
+ * ```
21
+ *
22
+ * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}
23
+ * @see {@link https://react-md.dev/components/text-field | TextField Demos}
24
+ * @since 6.3.0
25
+ */
26
+ export declare const NativeTimeField: import("react").ForwardRefExoticComponent<NativeTimeFieldProps & import("react").RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import { TextField } from "../form/TextField.js";
5
+ import { useTimeField } from "./useTimeField.js";
6
+ /**
7
+ * The `NativeTimeField` is a simple wrapper around the `TextField` using the
8
+ * `useTimeField` hook.
9
+ *
10
+ * @example Simple Example
11
+ * ```tsx
12
+ * import { NativeTimeField } from "@react-md/core/datetime/NativeTimeField";
13
+ * import { type ReactElement } from "react";
14
+ *
15
+ * function Example(): ReactElement {
16
+ * return <NativeTimeField label="Time" name="appt" />;
17
+ * }
18
+ * ```
19
+ *
20
+ * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}
21
+ * @see {@link https://react-md.dev/components/text-field | TextField Demos}
22
+ * @since 6.3.0
23
+ */ export const NativeTimeField = /*#__PURE__*/ forwardRef(function NativeTimeField(props, ref) {
24
+ const { id, min, max, step, onBlur, onInvalid, onChange, helpText, required, validationType, disableMessage, errorIcon, isErrored, getErrorIcon, getErrorMessage, onErrorChange, disableReset, defaultValue, ...remaining } = props;
25
+ const { name, form } = props;
26
+ const { fieldProps } = useTimeField({
27
+ id,
28
+ ref,
29
+ name,
30
+ form,
31
+ min,
32
+ max,
33
+ step,
34
+ onBlur,
35
+ onChange,
36
+ onInvalid,
37
+ helpText,
38
+ required,
39
+ validationType,
40
+ disableMessage: disableMessage ?? (!min && !max && !step && !required),
41
+ errorIcon,
42
+ isErrored,
43
+ getErrorIcon,
44
+ getErrorMessage,
45
+ onErrorChange,
46
+ disableReset,
47
+ defaultValue
48
+ });
49
+ let { messageProps } = remaining;
50
+ if (fieldProps.messageProps) {
51
+ messageProps = {
52
+ ...fieldProps.messageProps,
53
+ ...remaining.messageProps
54
+ };
55
+ }
56
+ return /*#__PURE__*/ _jsx(TextField, {
57
+ ...remaining,
58
+ ...fieldProps,
59
+ messageProps: messageProps
60
+ });
61
+ });
62
+
63
+ //# sourceMappingURL=NativeTimeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datetime/NativeTimeField.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { TextField, type TextFieldProps } from \"../form/TextField.js\";\nimport { type TimeFieldOptions, useTimeField } from \"./useTimeField.js\";\n\n/**\n * @since 6.3.0\n */\nexport interface NativeTimeFieldProps\n extends Omit<TextFieldProps, keyof TimeFieldOptions | \"value\">,\n Omit<TimeFieldOptions, \"ref\"> {}\n\n/**\n * The `NativeTimeField` is a simple wrapper around the `TextField` using the\n * `useTimeField` hook.\n *\n * @example Simple Example\n * ```tsx\n * import { NativeTimeField } from \"@react-md/core/datetime/NativeTimeField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * return <NativeTimeField label=\"Time\" name=\"appt\" />;\n * }\n * ```\n *\n * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}\n * @see {@link https://react-md.dev/components/text-field | TextField Demos}\n * @since 6.3.0\n */\nexport const NativeTimeField = forwardRef<\n HTMLInputElement,\n NativeTimeFieldProps\n>(function NativeTimeField(props, ref) {\n const {\n id,\n min,\n max,\n step,\n onBlur,\n onInvalid,\n onChange,\n helpText,\n required,\n validationType,\n disableMessage,\n errorIcon,\n isErrored,\n getErrorIcon,\n getErrorMessage,\n onErrorChange,\n disableReset,\n defaultValue,\n ...remaining\n } = props;\n const { name, form } = props;\n const { fieldProps } = useTimeField({\n id,\n ref,\n name,\n form,\n min,\n max,\n step,\n onBlur,\n onChange,\n onInvalid,\n helpText,\n required,\n validationType,\n disableMessage: disableMessage ?? (!min && !max && !step && !required),\n errorIcon,\n isErrored,\n getErrorIcon,\n getErrorMessage,\n onErrorChange,\n disableReset,\n defaultValue,\n });\n\n let { messageProps } = remaining;\n if (fieldProps.messageProps) {\n messageProps = {\n ...fieldProps.messageProps,\n ...remaining.messageProps,\n };\n }\n\n return (\n <TextField {...remaining} {...fieldProps} messageProps={messageProps} />\n );\n});\n"],"names":["forwardRef","TextField","useTimeField","NativeTimeField","props","ref","id","min","max","step","onBlur","onInvalid","onChange","helpText","required","validationType","disableMessage","errorIcon","isErrored","getErrorIcon","getErrorMessage","onErrorChange","disableReset","defaultValue","remaining","name","form","fieldProps","messageProps"],"mappings":"AAAA;;AAEA,SAASA,UAAU,QAAQ,QAAQ;AAEnC,SAASC,SAAS,QAA6B,uBAAuB;AACtE,SAAgCC,YAAY,QAAQ,oBAAoB;AASxE;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,MAAMC,gCAAkBH,WAG7B,SAASG,gBAAgBC,KAAK,EAAEC,GAAG;IACnC,MAAM,EACJC,EAAE,EACFC,GAAG,EACHC,GAAG,EACHC,IAAI,EACJC,MAAM,EACNC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,cAAc,EACdC,cAAc,EACdC,SAAS,EACTC,SAAS,EACTC,YAAY,EACZC,eAAe,EACfC,aAAa,EACbC,YAAY,EACZC,YAAY,EACZ,GAAGC,WACJ,GAAGpB;IACJ,MAAM,EAAEqB,IAAI,EAAEC,IAAI,EAAE,GAAGtB;IACvB,MAAM,EAAEuB,UAAU,EAAE,GAAGzB,aAAa;QAClCI;QACAD;QACAoB;QACAC;QACAnB;QACAC;QACAC;QACAC;QACAE;QACAD;QACAE;QACAC;QACAC;QACAC,gBAAgBA,kBAAmB,CAAA,CAACT,OAAO,CAACC,OAAO,CAACC,QAAQ,CAACK,QAAO;QACpEG;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;IACF;IAEA,IAAI,EAAEK,YAAY,EAAE,GAAGJ;IACvB,IAAIG,WAAWC,YAAY,EAAE;QAC3BA,eAAe;YACb,GAAGD,WAAWC,YAAY;YAC1B,GAAGJ,UAAUI,YAAY;QAC3B;IACF;IAEA,qBACE,KAAC3B;QAAW,GAAGuB,SAAS;QAAG,GAAGG,UAAU;QAAEC,cAAcA;;AAE5D,GAAG"}
@@ -0,0 +1,120 @@
1
+ import { type InputHTMLAttributes } from "react";
2
+ import { type ProvidedFormMessageProps, type ProvidedTextFieldProps, type TextFieldHookOptions, type TextFieldImplementation, type TextFieldWithMessageImplementation } from "../form/useTextField.js";
3
+ /**
4
+ * @since 6.3.0
5
+ */
6
+ export interface DateFieldConstraints {
7
+ /**
8
+ * This **must** be in the format `yyyy-mm-dd`
9
+ *
10
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#min | min attribute}
11
+ */
12
+ min?: string;
13
+ /**
14
+ * This **must** be in the format `yyyy-mm-dd`
15
+ *
16
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#max | max attribute}
17
+ */
18
+ max?: string;
19
+ /**
20
+ * For date inputs, the value of step is given in days; and is treated as a
21
+ * number of milliseconds equal to 86,400,000 times the step value (the
22
+ * underlying numeric value is in milliseconds). The default value of step is
23
+ * 1, indicating 1 day.
24
+ *
25
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#step | step attribute}
26
+ */
27
+ step?: number | "any";
28
+ }
29
+ /** @since 6.3.0 */
30
+ export interface DateFieldOptions extends Omit<TextFieldHookOptions, "isNumber" | "counter" | "pattern" | "maxLength" | "minLength" | "disableMaxLength">, DateFieldConstraints {
31
+ }
32
+ /** @since 6.3.0 */
33
+ export interface ProvidedDateFieldProps extends Omit<ProvidedTextFieldProps, "value">, Omit<DateFieldConstraints, "step"> {
34
+ type: "date";
35
+ step?: number | "any";
36
+ defaultValue: Required<InputHTMLAttributes<HTMLInputElement>>["defaultValue"];
37
+ }
38
+ /** @since 6.3.0 */
39
+ export interface ProvidedDateFieldMessageProps extends ProvidedDateFieldProps {
40
+ /**
41
+ * These props will be defined as long as the `disableMessage` prop is not
42
+ * `true` from the `useTextField` hook.
43
+ */
44
+ messageProps: ProvidedFormMessageProps;
45
+ }
46
+ /** @since 6.3.0 */
47
+ export interface DateFieldImplementation extends Omit<TextFieldImplementation, "fieldProps"> {
48
+ fieldProps: ProvidedDateFieldProps;
49
+ }
50
+ /** @since 6.3.0 */
51
+ export interface DateFieldWithMessageImplementation extends Omit<TextFieldWithMessageImplementation, "fieldProps"> {
52
+ fieldProps: ProvidedDateFieldMessageProps;
53
+ }
54
+ /** @since 6.3.0 */
55
+ export interface ValidatedDateFieldImplementation extends DateFieldImplementation {
56
+ fieldProps: ProvidedDateFieldProps | ProvidedDateFieldMessageProps;
57
+ }
58
+ /**
59
+ * The `useDateField` is a small wrapper around the {@link useTextField} to be used
60
+ * with `<input type="date" />`. It is used in the `NativeDateField` if an example
61
+ * implementation would like to be seen.
62
+ *
63
+ * @example Simple Example
64
+ * ```tsx
65
+ * import { useDateField } from "@react-md/core/datetime/useDateField";
66
+ * import { TextField } from "@react-md/core/form/TextField";
67
+ * import { type ReactElement } from "react";
68
+ *
69
+ * function Example(): ReactElement {
70
+ * const { value, fieldProps, error, errorMessage } = useDateField({
71
+ * name: "delivery",
72
+ * required: true,
73
+ * min: "2025-01-01",
74
+ * max: "2026-01-01",
75
+ * disableMessage: true,
76
+ * });
77
+ *
78
+ * // value: `""` or `"yyyy-mm-dd"`
79
+ *
80
+ * return <TextField label="Delivery Date" {...fieldProps} />
81
+ * }
82
+ * ```
83
+ *
84
+ * @since 6.3.0
85
+ * @see {@link https://react-md.dev/components/native-date-field | NativeDateField Demos}
86
+ * @see {@link https://react-md.dev/hooks/use-date-field | useDateField Demos}
87
+ */
88
+ export declare function useDateField(options: DateFieldOptions & {
89
+ disableMessage: true;
90
+ }): DateFieldImplementation;
91
+ /**
92
+ * The `useDateField` is a small wrapper around the {@link useTextField} to be used
93
+ * with `<input type="date" />`. It is used in the `NativeDateField` if an example
94
+ * implementation would like to be seen.
95
+ *
96
+ * @example Simple Example
97
+ * ```tsx
98
+ * import { useDateField } from "@react-md/core/datetime/useDateField";
99
+ * import { TextField } from "@react-md/core/form/TextField";
100
+ * import { type ReactElement } from "react";
101
+ *
102
+ * function Example(): ReactElement {
103
+ * const { value, fieldProps } = useDateField({
104
+ * name: "delivery",
105
+ * required: true,
106
+ * min: "2025-01-01",
107
+ * max: "2026-01-01",
108
+ * });
109
+ *
110
+ * // value: `""` or `"yyyy-mm-dd"`
111
+ *
112
+ * return <TextField label="Delivery Date" {...fieldProps} />
113
+ * }
114
+ * ```
115
+ *
116
+ * @since 6.3.0
117
+ * @see {@link https://react-md.dev/components/native-date-field | NativeDateField Demos}
118
+ * @see {@link https://react-md.dev/hooks/use-date-field | useDateField Demos}
119
+ */
120
+ export declare function useDateField(options: DateFieldOptions): DateFieldWithMessageImplementation;
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import { useRef } from "react";
3
+ import { useTextField } from "../form/useTextField.js";
4
+ /**
5
+ * @since 6.3.0
6
+ * @see {@link https://react-md.dev/components/native-date-field | NativeTimeField Demos}
7
+ * @see {@link https://react-md.dev/hooks/use-date-field | useTimeField Demos}
8
+ */ export function useDateField(options) {
9
+ const { min, max, step, ...fieldOptions } = options;
10
+ const { fieldProps, ...impl } = useTextField(fieldOptions);
11
+ // NOTE: Unlike the other text field components, the `value` should **not**
12
+ // be provided since the time input behaves a bit weirdly with the `onChange`
13
+ // event and it is better to rely on default browser behavior instead of
14
+ // controlling the value. The flow is:
15
+ // - user types `12:30`
16
+ // - `onChange` is fired with `12:30`
17
+ // - user selects `30` and hits backspace
18
+ // - `onChange` is fired with `""`
19
+ // If the `value` is set, the other time values would be lost
20
+ const { value, ...allowedFieldProps } = fieldProps;
21
+ const initial = useRef(value);
22
+ return {
23
+ ...impl,
24
+ fieldProps: {
25
+ ...allowedFieldProps,
26
+ defaultValue: initial.current,
27
+ min,
28
+ max,
29
+ step,
30
+ type: "date"
31
+ }
32
+ };
33
+ }
34
+
35
+ //# sourceMappingURL=useDateField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datetime/useDateField.ts"],"sourcesContent":["\"use client\";\n\nimport { type InputHTMLAttributes, useRef } from \"react\";\n\nimport {\n type ProvidedFormMessageProps,\n type ProvidedTextFieldProps,\n type TextFieldHookOptions,\n type TextFieldImplementation,\n type TextFieldWithMessageImplementation,\n useTextField,\n} from \"../form/useTextField.js\";\n\n/**\n * @since 6.3.0\n */\nexport interface DateFieldConstraints {\n /**\n * This **must** be in the format `yyyy-mm-dd`\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#min | min attribute}\n */\n min?: string;\n\n /**\n * This **must** be in the format `yyyy-mm-dd`\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#max | max attribute}\n */\n max?: string;\n\n /**\n * For date inputs, the value of step is given in days; and is treated as a\n * number of milliseconds equal to 86,400,000 times the step value (the\n * underlying numeric value is in milliseconds). The default value of step is\n * 1, indicating 1 day.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date#step | step attribute}\n */\n step?: number | \"any\";\n}\n\n/** @since 6.3.0 */\nexport interface DateFieldOptions\n extends Omit<\n TextFieldHookOptions,\n | \"isNumber\"\n | \"counter\"\n | \"pattern\"\n | \"maxLength\"\n | \"minLength\"\n | \"disableMaxLength\"\n >,\n DateFieldConstraints {}\n\n/** @since 6.3.0 */\nexport interface ProvidedDateFieldProps\n extends Omit<ProvidedTextFieldProps, \"value\">,\n Omit<DateFieldConstraints, \"step\"> {\n type: \"date\";\n step?: number | \"any\";\n defaultValue: Required<InputHTMLAttributes<HTMLInputElement>>[\"defaultValue\"];\n}\n\n/** @since 6.3.0 */\nexport interface ProvidedDateFieldMessageProps extends ProvidedDateFieldProps {\n /**\n * These props will be defined as long as the `disableMessage` prop is not\n * `true` from the `useTextField` hook.\n */\n messageProps: ProvidedFormMessageProps;\n}\n\n/** @since 6.3.0 */\nexport interface DateFieldImplementation\n extends Omit<TextFieldImplementation, \"fieldProps\"> {\n fieldProps: ProvidedDateFieldProps;\n}\n\n/** @since 6.3.0 */\nexport interface DateFieldWithMessageImplementation\n extends Omit<TextFieldWithMessageImplementation, \"fieldProps\"> {\n fieldProps: ProvidedDateFieldMessageProps;\n}\n\n/** @since 6.3.0 */\nexport interface ValidatedDateFieldImplementation\n extends DateFieldImplementation {\n fieldProps: ProvidedDateFieldProps | ProvidedDateFieldMessageProps;\n}\n\n/**\n * The `useDateField` is a small wrapper around the {@link useTextField} to be used\n * with `<input type=\"date\" />`. It is used in the `NativeDateField` if an example\n * implementation would like to be seen.\n *\n * @example Simple Example\n * ```tsx\n * import { useDateField } from \"@react-md/core/datetime/useDateField\";\n * import { TextField } from \"@react-md/core/form/TextField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const { value, fieldProps, error, errorMessage } = useDateField({\n * name: \"delivery\",\n * required: true,\n * min: \"2025-01-01\",\n * max: \"2026-01-01\",\n * disableMessage: true,\n * });\n *\n * // value: `\"\"` or `\"yyyy-mm-dd\"`\n *\n * return <TextField label=\"Delivery Date\" {...fieldProps} />\n * }\n * ```\n *\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-date-field | NativeDateField Demos}\n * @see {@link https://react-md.dev/hooks/use-date-field | useDateField Demos}\n */\nexport function useDateField(\n options: DateFieldOptions & { disableMessage: true }\n): DateFieldImplementation;\n\n/**\n * The `useDateField` is a small wrapper around the {@link useTextField} to be used\n * with `<input type=\"date\" />`. It is used in the `NativeDateField` if an example\n * implementation would like to be seen.\n *\n * @example Simple Example\n * ```tsx\n * import { useDateField } from \"@react-md/core/datetime/useDateField\";\n * import { TextField } from \"@react-md/core/form/TextField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const { value, fieldProps } = useDateField({\n * name: \"delivery\",\n * required: true,\n * min: \"2025-01-01\",\n * max: \"2026-01-01\",\n * });\n *\n * // value: `\"\"` or `\"yyyy-mm-dd\"`\n *\n * return <TextField label=\"Delivery Date\" {...fieldProps} />\n * }\n * ```\n *\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-date-field | NativeDateField Demos}\n * @see {@link https://react-md.dev/hooks/use-date-field | useDateField Demos}\n */\nexport function useDateField(\n options: DateFieldOptions\n): DateFieldWithMessageImplementation;\n\n/**\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-date-field | NativeTimeField Demos}\n * @see {@link https://react-md.dev/hooks/use-date-field | useTimeField Demos}\n */\nexport function useDateField(\n options: DateFieldOptions\n): ValidatedDateFieldImplementation {\n const { min, max, step, ...fieldOptions } = options;\n const { fieldProps, ...impl } = useTextField(fieldOptions);\n\n // NOTE: Unlike the other text field components, the `value` should **not**\n // be provided since the time input behaves a bit weirdly with the `onChange`\n // event and it is better to rely on default browser behavior instead of\n // controlling the value. The flow is:\n // - user types `12:30`\n // - `onChange` is fired with `12:30`\n // - user selects `30` and hits backspace\n // - `onChange` is fired with `\"\"`\n // If the `value` is set, the other time values would be lost\n const { value, ...allowedFieldProps } = fieldProps;\n const initial = useRef(value);\n\n return {\n ...impl,\n fieldProps: {\n ...allowedFieldProps,\n defaultValue: initial.current,\n min,\n max,\n step,\n type: \"date\",\n },\n };\n}\n"],"names":["useRef","useTextField","useDateField","options","min","max","step","fieldOptions","fieldProps","impl","value","allowedFieldProps","initial","defaultValue","current","type"],"mappings":"AAAA;AAEA,SAAmCA,MAAM,QAAQ,QAAQ;AAEzD,SAMEC,YAAY,QACP,0BAA0B;AAmJjC;;;;CAIC,GACD,OAAO,SAASC,aACdC,OAAyB;IAEzB,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,cAAc,GAAGJ;IAC5C,MAAM,EAAEK,UAAU,EAAE,GAAGC,MAAM,GAAGR,aAAaM;IAE7C,2EAA2E;IAC3E,6EAA6E;IAC7E,wEAAwE;IACxE,sCAAsC;IACtC,uBAAuB;IACvB,uCAAuC;IACvC,yCAAyC;IACzC,oCAAoC;IACpC,6DAA6D;IAC7D,MAAM,EAAEG,KAAK,EAAE,GAAGC,mBAAmB,GAAGH;IACxC,MAAMI,UAAUZ,OAAOU;IAEvB,OAAO;QACL,GAAGD,IAAI;QACPD,YAAY;YACV,GAAGG,iBAAiB;YACpBE,cAAcD,QAAQE,OAAO;YAC7BV;YACAC;YACAC;YACAS,MAAM;QACR;IACF;AACF"}
@@ -0,0 +1,124 @@
1
+ import { type InputHTMLAttributes } from "react";
2
+ import { type ProvidedFormMessageProps, type ProvidedTextFieldProps, type TextFieldHookOptions, type TextFieldImplementation, type TextFieldWithMessageImplementation } from "../form/useTextField.js";
3
+ import { type TimeFieldStepOptions } from "./utils.js";
4
+ /** @since 6.3.0 */
5
+ export interface TimeFieldConstraints {
6
+ /**
7
+ * This **must** be in the format `HH:mm`:
8
+ * - `00:30` (12:30 AM)
9
+ * - `15:15` (03:15 PM)
10
+ *
11
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#time_value_format | Time value format}
12
+ */
13
+ min?: string;
14
+ /**
15
+ * This **must** be in the format `HH:mm`:
16
+ * - `00:30` (12:30 AM)
17
+ * - `15:15` (03:15 PM)
18
+ *
19
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#time_value_format | Time value format}
20
+ */
21
+ max?: string;
22
+ /**
23
+ * For time inputs, the value of step is given in seconds, with a scaling
24
+ * factor of 1000 (since the underlying numeric value is in milliseconds).
25
+ * The default value of step is 60, indicating 60 seconds (or 1 minute, or
26
+ * 60,000 milliseconds).
27
+ *
28
+ * When any is set as the value for step, the default 60 seconds is used, and
29
+ * the seconds value is not displayed in the UI.
30
+ *
31
+ * Here are a few examples:
32
+ *
33
+ * - `15` -&gt; 15 seconds
34
+ * - `60` -&gt; 1 minute
35
+ * - `900` -&gt; 15 minutes
36
+ * - `3600` -&gt; 1 hour
37
+ *
38
+ * Since this might be a bit confusing, the values can be provided in an
39
+ * object instead:
40
+ *
41
+ * ```ts
42
+ * { seconds: 30 }
43
+ * { minutes: 1 }
44
+ * { minutes: 15 }
45
+ * { hours: 1 }
46
+ * { seconds: 15, minutes: 30, hours: 1 }
47
+ * ```
48
+ *
49
+ * NOTE: The `min` and `max` props **must** be provided as well for the
50
+ * `step` to work.
51
+ *
52
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#step | step attribute}
53
+ */
54
+ step?: number | "any" | TimeFieldStepOptions;
55
+ }
56
+ /** @since 6.3.0 */
57
+ export interface TimeFieldOptions extends Omit<TextFieldHookOptions, "isNumber" | "counter" | "pattern" | "maxLength" | "minLength" | "disableMaxLength">, TimeFieldConstraints {
58
+ }
59
+ /** @since 6.3.0 */
60
+ export interface ProvidedTimeFieldProps extends Omit<ProvidedTextFieldProps, "value">, Omit<TimeFieldConstraints, "step"> {
61
+ type: "time";
62
+ step?: number | "any";
63
+ defaultValue: Required<InputHTMLAttributes<HTMLInputElement>>["defaultValue"];
64
+ }
65
+ /** @since 6.3.0 */
66
+ export interface ProvidedTimeFieldMessageProps extends ProvidedTimeFieldProps {
67
+ /**
68
+ * These props will be defined as long as the `disableMessage` prop is not
69
+ * `true` from the `useTextField` hook.
70
+ */
71
+ messageProps: ProvidedFormMessageProps;
72
+ }
73
+ /** @since 6.3.0 */
74
+ export interface TimeFieldImplementation extends Omit<TextFieldImplementation, "fieldProps"> {
75
+ fieldProps: ProvidedTimeFieldProps;
76
+ }
77
+ /** @since 6.3.0 */
78
+ export interface TimeFieldWithMessageImplementation extends Omit<TextFieldWithMessageImplementation, "fieldProps"> {
79
+ fieldProps: ProvidedTimeFieldMessageProps;
80
+ }
81
+ /** @since 6.3.0 */
82
+ export interface ValidatedTimeFieldImplementation extends TimeFieldImplementation {
83
+ fieldProps: ProvidedTimeFieldProps | ProvidedTimeFieldMessageProps;
84
+ }
85
+ /**
86
+ * @since 6.3.0
87
+ * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}
88
+ * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}
89
+ */
90
+ export declare function useTimeField(options: TimeFieldOptions & {
91
+ disableMessage: true;
92
+ }): TimeFieldImplementation;
93
+ /**
94
+ * The `useTimeField` is a small wrapper around the {@link useTextField} to be used
95
+ * with `<input type="time" />`. It is used in the `NativeTimeField` if an example
96
+ * implementation would like to be seen.
97
+ *
98
+ * @example Simple Example
99
+ * ```tsx
100
+ * import { useTimeField } from "@react-md/core/datetime/useTimeField";
101
+ * import { TextField } from "@react-md/core/form/TextField";
102
+ * import { type ReactElement } from "react";
103
+ *
104
+ * function Example(): ReactElement {
105
+ * const { value, fieldProps, error, errorMessage } = useTimeField({
106
+ * name: "appt",
107
+ * required: true,
108
+ * min: "08:00",
109
+ * max: "17:00",
110
+ * step: { minute: 15 },
111
+ * disableMessage: true,
112
+ * });
113
+ *
114
+ * // value: `""` or `"HH:mm"`
115
+ *
116
+ * return <TextField label="Appointment" {...fieldProps} />
117
+ * }
118
+ * ```
119
+ *
120
+ * @since 6.3.0
121
+ * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}
122
+ * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}
123
+ */
124
+ export declare function useTimeField(options: TimeFieldOptions): TimeFieldWithMessageImplementation;
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { useRef } from "react";
3
+ import { useTextField } from "../form/useTextField.js";
4
+ import { getTimeStep } from "./utils.js";
5
+ /**
6
+ * The `useTimeField` is a small wrapper around the {@link useTextField} to be used
7
+ * with `<input type="time" />`. It is used in the `NativeTimeField` if an example
8
+ * implementation would like to be seen.
9
+ *
10
+ * @example Simple Example
11
+ * ```tsx
12
+ * import { useTimeField } from "@react-md/core/datetime/useTimeField";
13
+ * import { TextField } from "@react-md/core/form/TextField";
14
+ * import { type ReactElement } from "react";
15
+ *
16
+ * function Example(): ReactElement {
17
+ * const { value, fieldProps } = useTimeField({
18
+ * name: "appt",
19
+ * required: true,
20
+ * min: "08:00",
21
+ * max: "17:00",
22
+ * step: { minute: 15 },
23
+ * });
24
+ *
25
+ * // value: `""` or `"HH:mm"`
26
+ *
27
+ * return <TextField label="Appointment" {...fieldProps} />
28
+ * }
29
+ * ```
30
+ *
31
+ * @since 6.3.0
32
+ * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}
33
+ * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}
34
+ */ export function useTimeField(options) {
35
+ const { min, max, step, ...fieldOptions } = options;
36
+ if (process.env.NODE_ENV !== "production" && typeof step !== "undefined" && (!min || !max)) {
37
+ throw new Error("A `step` was provided to a time field without the `min` or `max` props.");
38
+ }
39
+ const { errorMessage, fieldProps, ...impl } = useTextField(fieldOptions);
40
+ // NOTE: Unlike the other text field components, the `value` should **not**
41
+ // be provided since the time input behaves a bit weirdly with the `onChange`
42
+ // event and it is better to rely on default browser behavior instead of
43
+ // controlling the value. The flow is:
44
+ // - user types `12:30`
45
+ // - `onChange` is fired with `12:30`
46
+ // - user selects `30` and hits backspace
47
+ // - `onChange` is fired with `""`
48
+ // If the `value` is set, the other time values would be lost
49
+ const { value, ...allowedFieldProps } = fieldProps;
50
+ const initial = useRef(value);
51
+ return {
52
+ ...impl,
53
+ errorMessage,
54
+ fieldProps: {
55
+ ...allowedFieldProps,
56
+ defaultValue: initial.current,
57
+ min,
58
+ max,
59
+ step: getTimeStep(step),
60
+ type: "time"
61
+ }
62
+ };
63
+ }
64
+
65
+ //# sourceMappingURL=useTimeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datetime/useTimeField.ts"],"sourcesContent":["\"use client\";\n\nimport { type InputHTMLAttributes, useRef } from \"react\";\n\nimport {\n type ProvidedFormMessageProps,\n type ProvidedTextFieldProps,\n type TextFieldHookOptions,\n type TextFieldImplementation,\n type TextFieldWithMessageImplementation,\n useTextField,\n} from \"../form/useTextField.js\";\nimport { type TimeFieldStepOptions, getTimeStep } from \"./utils.js\";\n\n/** @since 6.3.0 */\nexport interface TimeFieldConstraints {\n /**\n * This **must** be in the format `HH:mm`:\n * - `00:30` (12:30 AM)\n * - `15:15` (03:15 PM)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#time_value_format | Time value format}\n */\n min?: string;\n\n /**\n * This **must** be in the format `HH:mm`:\n * - `00:30` (12:30 AM)\n * - `15:15` (03:15 PM)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#time_value_format | Time value format}\n */\n max?: string;\n\n /**\n * For time inputs, the value of step is given in seconds, with a scaling\n * factor of 1000 (since the underlying numeric value is in milliseconds).\n * The default value of step is 60, indicating 60 seconds (or 1 minute, or\n * 60,000 milliseconds).\n *\n * When any is set as the value for step, the default 60 seconds is used, and\n * the seconds value is not displayed in the UI.\n *\n * Here are a few examples:\n *\n * - `15` -&gt; 15 seconds\n * - `60` -&gt; 1 minute\n * - `900` -&gt; 15 minutes\n * - `3600` -&gt; 1 hour\n *\n * Since this might be a bit confusing, the values can be provided in an\n * object instead:\n *\n * ```ts\n * { seconds: 30 }\n * { minutes: 1 }\n * { minutes: 15 }\n * { hours: 1 }\n * { seconds: 15, minutes: 30, hours: 1 }\n * ```\n *\n * NOTE: The `min` and `max` props **must** be provided as well for the\n * `step` to work.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/time#step | step attribute}\n */\n step?: number | \"any\" | TimeFieldStepOptions;\n}\n\n/** @since 6.3.0 */\nexport interface TimeFieldOptions\n extends Omit<\n TextFieldHookOptions,\n | \"isNumber\"\n | \"counter\"\n | \"pattern\"\n | \"maxLength\"\n | \"minLength\"\n | \"disableMaxLength\"\n >,\n TimeFieldConstraints {}\n\n/** @since 6.3.0 */\nexport interface ProvidedTimeFieldProps\n extends Omit<ProvidedTextFieldProps, \"value\">,\n Omit<TimeFieldConstraints, \"step\"> {\n type: \"time\";\n step?: number | \"any\";\n defaultValue: Required<InputHTMLAttributes<HTMLInputElement>>[\"defaultValue\"];\n}\n\n/** @since 6.3.0 */\nexport interface ProvidedTimeFieldMessageProps extends ProvidedTimeFieldProps {\n /**\n * These props will be defined as long as the `disableMessage` prop is not\n * `true` from the `useTextField` hook.\n */\n messageProps: ProvidedFormMessageProps;\n}\n\n/** @since 6.3.0 */\nexport interface TimeFieldImplementation\n extends Omit<TextFieldImplementation, \"fieldProps\"> {\n fieldProps: ProvidedTimeFieldProps;\n}\n\n/** @since 6.3.0 */\nexport interface TimeFieldWithMessageImplementation\n extends Omit<TextFieldWithMessageImplementation, \"fieldProps\"> {\n fieldProps: ProvidedTimeFieldMessageProps;\n}\n\n/** @since 6.3.0 */\nexport interface ValidatedTimeFieldImplementation\n extends TimeFieldImplementation {\n fieldProps: ProvidedTimeFieldProps | ProvidedTimeFieldMessageProps;\n}\n\n/**\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}\n * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}\n */\nexport function useTimeField(\n options: TimeFieldOptions & { disableMessage: true }\n): TimeFieldImplementation;\n\n/**\n * The `useTimeField` is a small wrapper around the {@link useTextField} to be used\n * with `<input type=\"time\" />`. It is used in the `NativeTimeField` if an example\n * implementation would like to be seen.\n *\n * @example Simple Example\n * ```tsx\n * import { useTimeField } from \"@react-md/core/datetime/useTimeField\";\n * import { TextField } from \"@react-md/core/form/TextField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const { value, fieldProps, error, errorMessage } = useTimeField({\n * name: \"appt\",\n * required: true,\n * min: \"08:00\",\n * max: \"17:00\",\n * step: { minute: 15 },\n * disableMessage: true,\n * });\n *\n * // value: `\"\"` or `\"HH:mm\"`\n *\n * return <TextField label=\"Appointment\" {...fieldProps} />\n * }\n * ```\n *\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}\n * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}\n */\nexport function useTimeField(\n options: TimeFieldOptions\n): TimeFieldWithMessageImplementation;\n\n/**\n * The `useTimeField` is a small wrapper around the {@link useTextField} to be used\n * with `<input type=\"time\" />`. It is used in the `NativeTimeField` if an example\n * implementation would like to be seen.\n *\n * @example Simple Example\n * ```tsx\n * import { useTimeField } from \"@react-md/core/datetime/useTimeField\";\n * import { TextField } from \"@react-md/core/form/TextField\";\n * import { type ReactElement } from \"react\";\n *\n * function Example(): ReactElement {\n * const { value, fieldProps } = useTimeField({\n * name: \"appt\",\n * required: true,\n * min: \"08:00\",\n * max: \"17:00\",\n * step: { minute: 15 },\n * });\n *\n * // value: `\"\"` or `\"HH:mm\"`\n *\n * return <TextField label=\"Appointment\" {...fieldProps} />\n * }\n * ```\n *\n * @since 6.3.0\n * @see {@link https://react-md.dev/components/native-time-field | NativeTimeField Demos}\n * @see {@link https://react-md.dev/hooks/use-time-field | useTimeField Demos}\n */\nexport function useTimeField(\n options: TimeFieldOptions\n): ValidatedTimeFieldImplementation {\n const { min, max, step, ...fieldOptions } = options;\n if (\n process.env.NODE_ENV !== \"production\" &&\n typeof step !== \"undefined\" &&\n (!min || !max)\n ) {\n throw new Error(\n \"A `step` was provided to a time field without the `min` or `max` props.\"\n );\n }\n\n const { errorMessage, fieldProps, ...impl } = useTextField(fieldOptions);\n\n // NOTE: Unlike the other text field components, the `value` should **not**\n // be provided since the time input behaves a bit weirdly with the `onChange`\n // event and it is better to rely on default browser behavior instead of\n // controlling the value. The flow is:\n // - user types `12:30`\n // - `onChange` is fired with `12:30`\n // - user selects `30` and hits backspace\n // - `onChange` is fired with `\"\"`\n // If the `value` is set, the other time values would be lost\n const { value, ...allowedFieldProps } = fieldProps;\n const initial = useRef(value);\n\n return {\n ...impl,\n errorMessage,\n fieldProps: {\n ...allowedFieldProps,\n defaultValue: initial.current,\n min,\n max,\n step: getTimeStep(step),\n type: \"time\",\n },\n };\n}\n"],"names":["useRef","useTextField","getTimeStep","useTimeField","options","min","max","step","fieldOptions","process","env","NODE_ENV","Error","errorMessage","fieldProps","impl","value","allowedFieldProps","initial","defaultValue","current","type"],"mappings":"AAAA;AAEA,SAAmCA,MAAM,QAAQ,QAAQ;AAEzD,SAMEC,YAAY,QACP,0BAA0B;AACjC,SAAoCC,WAAW,QAAQ,aAAa;AAsJpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,aACdC,OAAyB;IAEzB,MAAM,EAAEC,GAAG,EAAEC,GAAG,EAAEC,IAAI,EAAE,GAAGC,cAAc,GAAGJ;IAC5C,IACEK,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBACzB,OAAOJ,SAAS,eACf,CAAA,CAACF,OAAO,CAACC,GAAE,GACZ;QACA,MAAM,IAAIM,MACR;IAEJ;IAEA,MAAM,EAAEC,YAAY,EAAEC,UAAU,EAAE,GAAGC,MAAM,GAAGd,aAAaO;IAE3D,2EAA2E;IAC3E,6EAA6E;IAC7E,wEAAwE;IACxE,sCAAsC;IACtC,uBAAuB;IACvB,uCAAuC;IACvC,yCAAyC;IACzC,oCAAoC;IACpC,6DAA6D;IAC7D,MAAM,EAAEQ,KAAK,EAAE,GAAGC,mBAAmB,GAAGH;IACxC,MAAMI,UAAUlB,OAAOgB;IAEvB,OAAO;QACL,GAAGD,IAAI;QACPF;QACAC,YAAY;YACV,GAAGG,iBAAiB;YACpBE,cAAcD,QAAQE,OAAO;YAC7Bf;YACAC;YACAC,MAAML,YAAYK;YAClBc,MAAM;QACR;IACF;AACF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Since time input steps are based on seconds, this is a simple helper to
3
+ * create the step in a human-readable form.
4
+ *
5
+ * @since 6.3.0
6
+ */
7
+ export interface TimeFieldStepOptions {
8
+ /**
9
+ * @defaultValue `0`
10
+ */
11
+ seconds?: number;
12
+ /**
13
+ * @defaultValue `0`
14
+ */
15
+ minutes?: number;
16
+ /**
17
+ * @defaultValue `0`
18
+ */
19
+ hours?: number;
20
+ }
21
+ /**
22
+ * Since time input steps are based on seconds, this is a simple helper to
23
+ * create the step in a human-readable form.
24
+ *
25
+ * @example Simple Example
26
+ * ```tsx
27
+ * const step1 = getTimeStep({ minutes: 15 });
28
+ * const step2 = getTimeStep({ hours: 1 });
29
+ * const step3 = getTimeStep({ seconds: 15, minutes: 30, hours: 2 });
30
+ * ```
31
+ *
32
+ * @since 6.3.0
33
+ */
34
+ export declare function getTimeStep(step: TimeFieldStepOptions | "any" | number | undefined): number | "any" | undefined;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Since time input steps are based on seconds, this is a simple helper to
3
+ * create the step in a human-readable form.
4
+ *
5
+ * @since 6.3.0
6
+ */ /**
7
+ * Since time input steps are based on seconds, this is a simple helper to
8
+ * create the step in a human-readable form.
9
+ *
10
+ * @example Simple Example
11
+ * ```tsx
12
+ * const step1 = getTimeStep({ minutes: 15 });
13
+ * const step2 = getTimeStep({ hours: 1 });
14
+ * const step3 = getTimeStep({ seconds: 15, minutes: 30, hours: 2 });
15
+ * ```
16
+ *
17
+ * @since 6.3.0
18
+ */ export function getTimeStep(step) {
19
+ if (!step || typeof step === "string" || typeof step === "number") {
20
+ return step;
21
+ }
22
+ const { hours = 0, minutes = 0, seconds = 0 } = step;
23
+ const total = Math.abs(Math.round(seconds + minutes * 60 + hours * 60 * 60));
24
+ return total === 0 ? undefined : total;
25
+ }
26
+
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/datetime/utils.ts"],"sourcesContent":["/**\n * Since time input steps are based on seconds, this is a simple helper to\n * create the step in a human-readable form.\n *\n * @since 6.3.0\n */\nexport interface TimeFieldStepOptions {\n /**\n * @defaultValue `0`\n */\n seconds?: number;\n\n /**\n * @defaultValue `0`\n */\n minutes?: number;\n\n /**\n * @defaultValue `0`\n */\n hours?: number;\n}\n\n/**\n * Since time input steps are based on seconds, this is a simple helper to\n * create the step in a human-readable form.\n *\n * @example Simple Example\n * ```tsx\n * const step1 = getTimeStep({ minutes: 15 });\n * const step2 = getTimeStep({ hours: 1 });\n * const step3 = getTimeStep({ seconds: 15, minutes: 30, hours: 2 });\n * ```\n *\n * @since 6.3.0\n */\nexport function getTimeStep(\n step: TimeFieldStepOptions | \"any\" | number | undefined\n): number | \"any\" | undefined {\n if (!step || typeof step === \"string\" || typeof step === \"number\") {\n return step;\n }\n\n const { hours = 0, minutes = 0, seconds = 0 } = step;\n\n const total = Math.abs(Math.round(seconds + minutes * 60 + hours * 60 * 60));\n return total === 0 ? undefined : total;\n}\n"],"names":["getTimeStep","step","hours","minutes","seconds","total","Math","abs","round","undefined"],"mappings":"AAAA;;;;;CAKC,GAkBD;;;;;;;;;;;;CAYC,GACD,OAAO,SAASA,YACdC,IAAuD;IAEvD,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAY,OAAOA,SAAS,UAAU;QACjE,OAAOA;IACT;IAEA,MAAM,EAAEC,QAAQ,CAAC,EAAEC,UAAU,CAAC,EAAEC,UAAU,CAAC,EAAE,GAAGH;IAEhD,MAAMI,QAAQC,KAAKC,GAAG,CAACD,KAAKE,KAAK,CAACJ,UAAUD,UAAU,KAAKD,QAAQ,KAAK;IACxE,OAAOG,UAAU,IAAII,YAAYJ;AACnC"}