@mantine/dates 9.0.2 → 9.1.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 (45) hide show
  1. package/cjs/components/MonthPicker/MonthPicker.cjs +67 -7
  2. package/cjs/components/MonthPicker/MonthPicker.cjs.map +1 -1
  3. package/cjs/components/MonthPicker/MonthPicker.module.cjs +11 -0
  4. package/cjs/components/MonthPicker/MonthPicker.module.cjs.map +1 -0
  5. package/cjs/components/MonthPickerInput/MonthPickerInput.cjs +2 -1
  6. package/cjs/components/MonthPickerInput/MonthPickerInput.cjs.map +1 -1
  7. package/cjs/components/SpinInput/SpinInput.cjs +2 -2
  8. package/cjs/components/SpinInput/SpinInput.cjs.map +1 -1
  9. package/cjs/components/TimePicker/TimePicker.cjs +19 -8
  10. package/cjs/components/TimePicker/TimePicker.cjs.map +1 -1
  11. package/cjs/components/TimePicker/use-time-picker.cjs +3 -2
  12. package/cjs/components/TimePicker/use-time-picker.cjs.map +1 -1
  13. package/cjs/components/YearPicker/YearPicker.cjs +67 -7
  14. package/cjs/components/YearPicker/YearPicker.cjs.map +1 -1
  15. package/cjs/components/YearPicker/YearPicker.module.cjs +11 -0
  16. package/cjs/components/YearPicker/YearPicker.module.cjs.map +1 -0
  17. package/cjs/components/YearPickerInput/YearPickerInput.cjs +2 -1
  18. package/cjs/components/YearPickerInput/YearPickerInput.cjs.map +1 -1
  19. package/esm/components/MonthPicker/MonthPicker.mjs +69 -9
  20. package/esm/components/MonthPicker/MonthPicker.mjs.map +1 -1
  21. package/esm/components/MonthPicker/MonthPicker.module.mjs +11 -0
  22. package/esm/components/MonthPicker/MonthPicker.module.mjs.map +1 -0
  23. package/esm/components/MonthPickerInput/MonthPickerInput.mjs +2 -1
  24. package/esm/components/MonthPickerInput/MonthPickerInput.mjs.map +1 -1
  25. package/esm/components/SpinInput/SpinInput.mjs +2 -2
  26. package/esm/components/SpinInput/SpinInput.mjs.map +1 -1
  27. package/esm/components/TimePicker/TimePicker.mjs +19 -8
  28. package/esm/components/TimePicker/TimePicker.mjs.map +1 -1
  29. package/esm/components/TimePicker/use-time-picker.mjs +3 -2
  30. package/esm/components/TimePicker/use-time-picker.mjs.map +1 -1
  31. package/esm/components/YearPicker/YearPicker.mjs +69 -9
  32. package/esm/components/YearPicker/YearPicker.mjs.map +1 -1
  33. package/esm/components/YearPicker/YearPicker.module.mjs +11 -0
  34. package/esm/components/YearPicker/YearPicker.module.mjs.map +1 -0
  35. package/esm/components/YearPickerInput/YearPickerInput.mjs +2 -1
  36. package/esm/components/YearPickerInput/YearPickerInput.mjs.map +1 -1
  37. package/lib/components/MonthPicker/MonthPicker.d.ts +13 -1
  38. package/lib/components/SpinInput/SpinInput.d.ts +2 -1
  39. package/lib/components/TimePicker/TimePicker.d.ts +5 -1
  40. package/lib/components/TimePicker/TimePicker.types.d.ts +1 -0
  41. package/lib/components/TimePicker/use-time-picker.d.ts +3 -2
  42. package/lib/components/YearPicker/YearPicker.d.ts +13 -1
  43. package/package.json +5 -5
  44. package/styles.css +96 -0
  45. package/styles.layer.css +96 -0
@@ -2,14 +2,35 @@
2
2
  require("../../_virtual/_rolldown/runtime.cjs");
3
3
  const require_use_dates_state = require("../../hooks/use-dates-state/use-dates-state.cjs");
4
4
  const require_Calendar = require("../Calendar/Calendar.cjs");
5
+ const require_pick_calendar_levels_props = require("../Calendar/pick-calendar-levels-props/pick-calendar-levels-props.cjs");
6
+ const require_MonthPicker_module = require("./MonthPicker.module.cjs");
7
+ let react = require("react");
5
8
  let react_jsx_runtime = require("react/jsx-runtime");
6
9
  let _mantine_core = require("@mantine/core");
7
10
  //#region packages/@mantine/dates/src/components/MonthPicker/MonthPicker.tsx
11
+ const varsResolver = (0, _mantine_core.createVarsResolver)((_, { size }) => ({ monthPickerRoot: { "--preset-font-size": (0, _mantine_core.getFontSize)(size) } }));
8
12
  const defaultProps = { type: "default" };
9
13
  const MonthPicker = (0, _mantine_core.factory)((_props) => {
10
14
  const props = (0, _mantine_core.useProps)("MonthPicker", defaultProps, _props);
11
- const { classNames, styles, vars, type, defaultValue, value, onChange, __staticSelector, getMonthControlProps, allowSingleDateInRange, allowDeselect, onMouseLeave, onMonthSelect, __updateDateOnMonthSelect, onLevelChange, ...others } = props;
12
- const { onDateChange, onRootMouseLeave, onHoveredDateChange, getControlProps } = require_use_dates_state.useDatesState({
15
+ const { classNames, styles, vars, type, defaultValue, value, onChange, __staticSelector, getMonthControlProps, allowSingleDateInRange, allowDeselect, onMouseLeave, onMonthSelect, __updateDateOnMonthSelect, __onPresetSelect, __stopPropagation, presets, className, style, unstyled, size, attributes, onLevelChange, ...rest } = props;
16
+ const { calendarProps, others } = require_pick_calendar_levels_props.pickCalendarProps(rest);
17
+ const setDateRef = (0, react.useRef)(null);
18
+ const setLevelRef = (0, react.useRef)(null);
19
+ const getStyles = (0, _mantine_core.useStyles)({
20
+ name: __staticSelector || "MonthPicker",
21
+ classes: require_MonthPicker_module.default,
22
+ props,
23
+ className,
24
+ style,
25
+ classNames,
26
+ styles,
27
+ unstyled,
28
+ attributes,
29
+ rootSelector: presets ? "monthPickerRoot" : void 0,
30
+ varsResolver,
31
+ vars
32
+ });
33
+ const { onDateChange, onRootMouseLeave, onHoveredDateChange, getControlProps, setValue } = require_use_dates_state.useDatesState({
13
34
  type,
14
35
  level: "month",
15
36
  allowDeselect,
@@ -24,7 +45,12 @@ const MonthPicker = (0, _mantine_core.factory)((_props) => {
24
45
  styles,
25
46
  props
26
47
  });
27
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Calendar.Calendar, {
48
+ const calendar = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Calendar.Calendar, {
49
+ classNames: resolvedClassNames,
50
+ styles: resolvedStyles,
51
+ size,
52
+ ...calendarProps,
53
+ ...!presets ? others : {},
28
54
  minLevel: "year",
29
55
  __updateDateOnMonthSelect: __updateDateOnMonthSelect ?? false,
30
56
  __staticSelector: __staticSelector || "MonthPicker",
@@ -38,13 +64,47 @@ const MonthPicker = (0, _mantine_core.factory)((_props) => {
38
64
  ...getControlProps(date),
39
65
  ...getMonthControlProps?.(date)
40
66
  }),
41
- classNames: resolvedClassNames,
42
- styles: resolvedStyles,
43
67
  onLevelChange,
44
- ...others
68
+ __setDateRef: setDateRef,
69
+ __setLevelRef: setLevelRef,
70
+ __stopPropagation,
71
+ attributes,
72
+ ...!presets ? {
73
+ className,
74
+ style
75
+ } : {}
76
+ });
77
+ if (!presets) return calendar;
78
+ const handlePresetSelect = (val) => {
79
+ const _val = Array.isArray(val) ? val[0] : val;
80
+ if (_val !== void 0) {
81
+ setDateRef.current?.(_val);
82
+ setLevelRef.current?.("year");
83
+ __onPresetSelect ? __onPresetSelect(_val) : setValue(val);
84
+ }
85
+ };
86
+ const presetButtons = presets.map((preset, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.UnstyledButton, {
87
+ ...getStyles("presetButton"),
88
+ onClick: () => handlePresetSelect(preset.value),
89
+ onMouseDown: (event) => event.preventDefault(),
90
+ "data-mantine-stop-propagation": __stopPropagation || void 0,
91
+ children: preset.label
92
+ }, index));
93
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mantine_core.Box, {
94
+ ...getStyles("monthPickerRoot"),
95
+ size,
96
+ ...others,
97
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
98
+ ...getStyles("presetsList"),
99
+ children: presetButtons
100
+ }), calendar]
45
101
  });
46
102
  });
47
- MonthPicker.classes = require_Calendar.Calendar.classes;
103
+ MonthPicker.classes = {
104
+ ...require_Calendar.Calendar.classes,
105
+ ...require_MonthPicker_module.default
106
+ };
107
+ MonthPicker.varsResolver = varsResolver;
48
108
  MonthPicker.displayName = "@mantine/dates/MonthPicker";
49
109
  //#endregion
50
110
  exports.MonthPicker = MonthPicker;
@@ -1 +1 @@
1
- {"version":3,"file":"MonthPicker.cjs","names":["useDatesState","Calendar"],"sources":["../../../src/components/MonthPicker/MonthPicker.tsx"],"sourcesContent":["import {\n BoxProps,\n ElementProps,\n factory,\n Factory,\n MantineComponentStaticProperties,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n} from '@mantine/core';\nimport { useDatesState } from '../../hooks';\nimport { CalendarLevel, DatePickerType, DateStringValue, PickerBaseProps } from '../../types';\nimport { Calendar, CalendarBaseProps } from '../Calendar';\nimport { DecadeLevelBaseSettings } from '../DecadeLevel';\nimport { DecadeLevelGroupStylesNames } from '../DecadeLevelGroup';\nimport { YearLevelBaseSettings } from '../YearLevel';\nimport { YearLevelGroupStylesNames } from '../YearLevelGroup';\n\nexport type MonthPickerStylesNames = DecadeLevelGroupStylesNames | YearLevelGroupStylesNames;\n\ntype MonthPickerLevel = Exclude<CalendarLevel, 'month'>;\n\nexport interface MonthPickerBaseProps<Type extends DatePickerType = 'default'>\n extends\n PickerBaseProps<Type>,\n DecadeLevelBaseSettings,\n YearLevelBaseSettings,\n Omit<CalendarBaseProps, 'onNextMonth' | 'onPreviousMonth' | 'hasNextLevel'> {\n /** Max level that user can go up to @default 'decade' */\n maxLevel?: CalendarLevel;\n\n /** Initial displayed level (uncontrolled) */\n defaultLevel?: CalendarLevel;\n\n /** Current displayed level (controlled) */\n level?: CalendarLevel;\n\n /** Called when level changes */\n onLevelChange?: (level: MonthPickerLevel) => void;\n}\n\nexport interface MonthPickerProps<Type extends DatePickerType = 'default'>\n extends\n BoxProps,\n MonthPickerBaseProps<Type>,\n StylesApiProps<MonthPickerFactory>,\n ElementProps<'div', 'onChange' | 'value' | 'defaultValue'> {\n /** Called when month is selected */\n onMonthSelect?: (date: DateStringValue) => void;\n}\n\nexport type MonthPickerFactory = Factory<{\n props: MonthPickerProps;\n ref: HTMLDivElement;\n stylesNames: MonthPickerStylesNames;\n}>;\n\nconst defaultProps = {\n type: 'default',\n} satisfies Partial<MonthPickerProps>;\n\ntype MonthPickerComponent = (<Type extends DatePickerType = 'default'>(\n props: MonthPickerProps<Type> & { ref?: React.Ref<HTMLDivElement> }\n) => React.JSX.Element) & {\n displayName?: string;\n} & MantineComponentStaticProperties<MonthPickerFactory>;\n\nexport const MonthPicker: MonthPickerComponent = factory<MonthPickerFactory>((_props) => {\n const props = useProps('MonthPicker', defaultProps, _props);\n const {\n classNames,\n styles,\n vars,\n type,\n defaultValue,\n value,\n onChange,\n __staticSelector,\n getMonthControlProps,\n allowSingleDateInRange,\n allowDeselect,\n onMouseLeave,\n onMonthSelect,\n __updateDateOnMonthSelect,\n onLevelChange,\n ...others\n } = props;\n\n const { onDateChange, onRootMouseLeave, onHoveredDateChange, getControlProps } = useDatesState({\n type: type as any,\n level: 'month',\n allowDeselect,\n allowSingleDateInRange,\n value,\n defaultValue,\n onChange: onChange as any,\n onMouseLeave,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<MonthPickerFactory>({\n classNames,\n styles,\n props,\n });\n\n return (\n <Calendar\n minLevel=\"year\"\n __updateDateOnMonthSelect={__updateDateOnMonthSelect ?? false}\n __staticSelector={__staticSelector || 'MonthPicker'}\n onMouseLeave={onRootMouseLeave}\n onMonthMouseEnter={(_event, date) => onHoveredDateChange(date)}\n onMonthSelect={(date) => {\n onDateChange(date);\n onMonthSelect?.(date);\n }}\n getMonthControlProps={(date) => ({\n ...getControlProps(date),\n ...getMonthControlProps?.(date),\n })}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n onLevelChange={onLevelChange as any}\n {...others}\n />\n );\n}) as any;\n\nMonthPicker.classes = Calendar.classes;\nMonthPicker.displayName = '@mantine/dates/MonthPicker';\n\nexport namespace MonthPicker {\n export type Props<Type extends DatePickerType = 'default'> = MonthPickerProps<Type>;\n export type StylesNames = MonthPickerStylesNames;\n export type Factory = MonthPickerFactory;\n}\n"],"mappings":";;;;;;;AAyDA,MAAM,eAAe,EACnB,MAAM,WACP;AAQD,MAAa,eAAA,GAAA,cAAA,UAAiE,WAAW;CACvF,MAAM,SAAA,GAAA,cAAA,UAAiB,eAAe,cAAc,OAAO;CAC3D,MAAM,EACJ,YACA,QACA,MACA,MACA,cACA,OACA,UACA,kBACA,sBACA,wBACA,eACA,cACA,eACA,2BACA,eACA,GAAG,WACD;CAEJ,MAAM,EAAE,cAAc,kBAAkB,qBAAqB,oBAAoBA,wBAAAA,cAAc;EACvF;EACN,OAAO;EACP;EACA;EACA;EACA;EACU;EACV;EACD,CAAC;CAEF,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAA4D;EACtF;EACA;EACA;EACD,CAAC;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,iBAAAA,UAAD;EACE,UAAS;EACT,2BAA2B,6BAA6B;EACxD,kBAAkB,oBAAoB;EACtC,cAAc;EACd,oBAAoB,QAAQ,SAAS,oBAAoB,KAAK;EAC9D,gBAAgB,SAAS;AACvB,gBAAa,KAAK;AAClB,mBAAgB,KAAK;;EAEvB,uBAAuB,UAAU;GAC/B,GAAG,gBAAgB,KAAK;GACxB,GAAG,uBAAuB,KAAK;GAChC;EACD,YAAY;EACZ,QAAQ;EACO;EACf,GAAI;EACJ,CAAA;EAEJ;AAEF,YAAY,UAAUA,iBAAAA,SAAS;AAC/B,YAAY,cAAc"}
1
+ {"version":3,"file":"MonthPicker.cjs","names":["pickCalendarProps","useDatesState","Calendar","UnstyledButton","Box","classes"],"sources":["../../../src/components/MonthPicker/MonthPicker.tsx"],"sourcesContent":["import { useRef } from 'react';\nimport {\n Box,\n BoxProps,\n createVarsResolver,\n ElementProps,\n factory,\n Factory,\n getFontSize,\n MantineComponentStaticProperties,\n StylesApiProps,\n UnstyledButton,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useDatesState } from '../../hooks';\nimport {\n CalendarLevel,\n DatePickerType,\n DateStringValue,\n DateValue,\n PickerBaseProps,\n} from '../../types';\nimport { Calendar, CalendarBaseProps, pickCalendarProps } from '../Calendar';\nimport { DecadeLevelBaseSettings } from '../DecadeLevel';\nimport { DecadeLevelGroupStylesNames } from '../DecadeLevelGroup';\nimport { YearLevelBaseSettings } from '../YearLevel';\nimport { YearLevelGroupStylesNames } from '../YearLevelGroup';\nimport classes from './MonthPicker.module.css';\n\nexport interface MonthPickerPreset<Type extends DatePickerType> {\n value: Type extends 'range'\n ? [DateStringValue | null, DateStringValue | null]\n : Type extends 'multiple'\n ? DateStringValue[]\n : DateStringValue | null;\n label: React.ReactNode;\n}\n\nexport type MonthPickerCssVariables = {\n monthPickerRoot: '--preset-font-size';\n};\n\nexport type MonthPickerStylesNames =\n | DecadeLevelGroupStylesNames\n | YearLevelGroupStylesNames\n | 'presetsList'\n | 'presetButton'\n | 'monthPickerRoot';\n\ntype MonthPickerLevel = Exclude<CalendarLevel, 'month'>;\n\nexport interface MonthPickerBaseProps<Type extends DatePickerType = 'default'>\n extends\n PickerBaseProps<Type>,\n DecadeLevelBaseSettings,\n YearLevelBaseSettings,\n Omit<CalendarBaseProps, 'onNextMonth' | 'onPreviousMonth' | 'hasNextLevel'> {\n /** Max level that user can go up to @default 'decade' */\n maxLevel?: CalendarLevel;\n\n /** Initial displayed level (uncontrolled) */\n defaultLevel?: CalendarLevel;\n\n /** Current displayed level (controlled) */\n level?: CalendarLevel;\n\n /** Called when level changes */\n onLevelChange?: (level: MonthPickerLevel) => void;\n\n /** Predefined values to pick from */\n presets?: MonthPickerPreset<Type>[];\n\n /** If defined, called with preset value, suppresses `onChange` call */\n __onPresetSelect?: (\n preset: Type extends 'range'\n ? [DateStringValue | null, DateStringValue | null]\n : DateStringValue | null\n ) => void;\n}\n\nexport interface MonthPickerProps<Type extends DatePickerType = 'default'>\n extends\n BoxProps,\n MonthPickerBaseProps<Type>,\n StylesApiProps<MonthPickerFactory>,\n ElementProps<'div', 'onChange' | 'value' | 'defaultValue'> {\n /** Called when month is selected */\n onMonthSelect?: (date: DateStringValue) => void;\n}\n\nexport type MonthPickerFactory = Factory<{\n props: MonthPickerProps;\n ref: HTMLDivElement;\n stylesNames: MonthPickerStylesNames;\n vars: MonthPickerCssVariables;\n}>;\n\nconst varsResolver = createVarsResolver<MonthPickerFactory>((_, { size }) => ({\n monthPickerRoot: {\n '--preset-font-size': getFontSize(size),\n },\n}));\n\nconst defaultProps = {\n type: 'default',\n} satisfies Partial<MonthPickerProps>;\n\ntype MonthPickerComponent = (<Type extends DatePickerType = 'default'>(\n props: MonthPickerProps<Type> & { ref?: React.Ref<HTMLDivElement> }\n) => React.JSX.Element) & {\n displayName?: string;\n} & MantineComponentStaticProperties<MonthPickerFactory>;\n\nexport const MonthPicker: MonthPickerComponent = factory<MonthPickerFactory>((_props) => {\n const props = useProps('MonthPicker', defaultProps, _props);\n const {\n classNames,\n styles,\n vars,\n type,\n defaultValue,\n value,\n onChange,\n __staticSelector,\n getMonthControlProps,\n allowSingleDateInRange,\n allowDeselect,\n onMouseLeave,\n onMonthSelect,\n __updateDateOnMonthSelect,\n __onPresetSelect,\n __stopPropagation,\n presets,\n className,\n style,\n unstyled,\n size,\n attributes,\n onLevelChange,\n ...rest\n } = props;\n\n const { calendarProps, others } = pickCalendarProps(rest);\n const setDateRef = useRef<((date: DateValue) => void) | null>(null);\n const setLevelRef = useRef<((level: CalendarLevel) => void) | null>(null);\n\n const getStyles = useStyles<MonthPickerFactory>({\n name: __staticSelector || 'MonthPicker',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n rootSelector: presets ? 'monthPickerRoot' : undefined,\n varsResolver,\n vars,\n });\n\n const { onDateChange, onRootMouseLeave, onHoveredDateChange, getControlProps, setValue } =\n useDatesState({\n type: type as any,\n level: 'month',\n allowDeselect,\n allowSingleDateInRange,\n value,\n defaultValue,\n onChange: onChange as any,\n onMouseLeave,\n });\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<MonthPickerFactory>({\n classNames,\n styles,\n props,\n });\n\n const calendar = (\n <Calendar\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n size={size}\n {...calendarProps}\n {...(!presets ? others : {})}\n minLevel=\"year\"\n __updateDateOnMonthSelect={__updateDateOnMonthSelect ?? false}\n __staticSelector={__staticSelector || 'MonthPicker'}\n onMouseLeave={onRootMouseLeave}\n onMonthMouseEnter={(_event, date) => onHoveredDateChange(date)}\n onMonthSelect={(date) => {\n onDateChange(date);\n onMonthSelect?.(date);\n }}\n getMonthControlProps={(date) => ({\n ...getControlProps(date),\n ...getMonthControlProps?.(date),\n })}\n onLevelChange={onLevelChange as any}\n __setDateRef={setDateRef}\n __setLevelRef={setLevelRef}\n __stopPropagation={__stopPropagation}\n attributes={attributes}\n {...(!presets ? { className, style } : {})}\n />\n );\n\n if (!presets) {\n return calendar;\n }\n\n const handlePresetSelect = (\n val: DateStringValue | null | [DateStringValue | null, DateStringValue | null]\n ) => {\n const _val = Array.isArray(val) ? val[0] : val;\n if (_val !== undefined) {\n setDateRef.current?.(_val);\n setLevelRef.current?.('year');\n __onPresetSelect ? __onPresetSelect(_val) : setValue(val);\n }\n };\n\n const presetButtons = presets.map((preset, index) => (\n <UnstyledButton\n key={index}\n {...getStyles('presetButton')}\n onClick={() => handlePresetSelect(preset.value)}\n onMouseDown={(event) => event.preventDefault()}\n data-mantine-stop-propagation={__stopPropagation || undefined}\n >\n {preset.label}\n </UnstyledButton>\n ));\n\n return (\n <Box {...getStyles('monthPickerRoot')} size={size} {...others}>\n <div {...getStyles('presetsList')}>{presetButtons}</div>\n {calendar}\n </Box>\n );\n}) as any;\n\nMonthPicker.classes = { ...Calendar.classes, ...classes };\nMonthPicker.varsResolver = varsResolver;\nMonthPicker.displayName = '@mantine/dates/MonthPicker';\n\nexport namespace MonthPicker {\n export type Props<Type extends DatePickerType = 'default'> = MonthPickerProps<Type>;\n export type StylesNames = MonthPickerStylesNames;\n export type Factory = MonthPickerFactory;\n}\n"],"mappings":";;;;;;;;;;AAmGA,MAAM,gBAAA,GAAA,cAAA,qBAAuD,GAAG,EAAE,YAAY,EAC5E,iBAAiB,EACf,uBAAA,GAAA,cAAA,aAAkC,KAAK,EACxC,EACF,EAAE;AAEH,MAAM,eAAe,EACnB,MAAM,WACP;AAQD,MAAa,eAAA,GAAA,cAAA,UAAiE,WAAW;CACvF,MAAM,SAAA,GAAA,cAAA,UAAiB,eAAe,cAAc,OAAO;CAC3D,MAAM,EACJ,YACA,QACA,MACA,MACA,cACA,OACA,UACA,kBACA,sBACA,wBACA,eACA,cACA,eACA,2BACA,kBACA,mBACA,SACA,WACA,OACA,UACA,MACA,YACA,eACA,GAAG,SACD;CAEJ,MAAM,EAAE,eAAe,WAAWA,mCAAAA,kBAAkB,KAAK;CACzD,MAAM,cAAA,GAAA,MAAA,QAAwD,KAAK;CACnE,MAAM,eAAA,GAAA,MAAA,QAA8D,KAAK;CAEzE,MAAM,aAAA,GAAA,cAAA,WAA0C;EAC9C,MAAM,oBAAoB;EAC1B,SAAA,2BAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc,UAAU,oBAAoB,KAAA;EAC5C;EACA;EACD,CAAC;CAEF,MAAM,EAAE,cAAc,kBAAkB,qBAAqB,iBAAiB,aAC5EC,wBAAAA,cAAc;EACN;EACN,OAAO;EACP;EACA;EACA;EACA;EACU;EACV;EACD,CAAC;CAEJ,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAA4D;EACtF;EACA;EACA;EACD,CAAC;CAEF,MAAM,WACJ,iBAAA,GAAA,kBAAA,KAACC,iBAAAA,UAAD;EACE,YAAY;EACZ,QAAQ;EACF;EACN,GAAI;EACJ,GAAK,CAAC,UAAU,SAAS,EAAE;EAC3B,UAAS;EACT,2BAA2B,6BAA6B;EACxD,kBAAkB,oBAAoB;EACtC,cAAc;EACd,oBAAoB,QAAQ,SAAS,oBAAoB,KAAK;EAC9D,gBAAgB,SAAS;AACvB,gBAAa,KAAK;AAClB,mBAAgB,KAAK;;EAEvB,uBAAuB,UAAU;GAC/B,GAAG,gBAAgB,KAAK;GACxB,GAAG,uBAAuB,KAAK;GAChC;EACc;EACf,cAAc;EACd,eAAe;EACI;EACP;EACZ,GAAK,CAAC,UAAU;GAAE;GAAW;GAAO,GAAG,EAAE;EACzC,CAAA;AAGJ,KAAI,CAAC,QACH,QAAO;CAGT,MAAM,sBACJ,QACG;EACH,MAAM,OAAO,MAAM,QAAQ,IAAI,GAAG,IAAI,KAAK;AAC3C,MAAI,SAAS,KAAA,GAAW;AACtB,cAAW,UAAU,KAAK;AAC1B,eAAY,UAAU,OAAO;AAC7B,sBAAmB,iBAAiB,KAAK,GAAG,SAAS,IAAI;;;CAI7D,MAAM,gBAAgB,QAAQ,KAAK,QAAQ,UACzC,iBAAA,GAAA,kBAAA,KAACC,cAAAA,gBAAD;EAEE,GAAI,UAAU,eAAe;EAC7B,eAAe,mBAAmB,OAAO,MAAM;EAC/C,cAAc,UAAU,MAAM,gBAAgB;EAC9C,iCAA+B,qBAAqB,KAAA;YAEnD,OAAO;EACO,EAPV,MAOU,CACjB;AAEF,QACE,iBAAA,GAAA,kBAAA,MAACC,cAAAA,KAAD;EAAK,GAAI,UAAU,kBAAkB;EAAQ;EAAM,GAAI;YAAvD,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,GAAI,UAAU,cAAc;aAAG;GAAoB,CAAA,EACvD,SACG;;EAER;AAEF,YAAY,UAAU;CAAE,GAAGF,iBAAAA,SAAS;CAAS,GAAGG,2BAAAA;CAAS;AACzD,YAAY,eAAe;AAC3B,YAAY,cAAc"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ //#region packages/@mantine/dates/src/components/MonthPicker/MonthPicker.module.css
3
+ var MonthPicker_module_default = {
4
+ "monthPickerRoot": "m_53c9e871",
5
+ "presetsList": "m_cccb8ff3",
6
+ "presetButton": "m_7b4fbf50"
7
+ };
8
+ //#endregion
9
+ exports.default = MonthPicker_module_default;
10
+
11
+ //# sourceMappingURL=MonthPicker.module.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MonthPicker.module.cjs","names":[],"sources":["../../../src/components/MonthPicker/MonthPicker.module.css"],"sourcesContent":[".monthPickerRoot {\n display: flex;\n font-size: var(--preset-font-size);\n}\n\n.presetsList {\n display: flex;\n flex-direction: column;\n border-inline-end: 1px solid;\n padding-inline-end: 0.5em;\n margin-inline-end: 0.5em;\n\n @mixin where-light {\n border-color: var(--mantine-color-gray-2);\n }\n\n @mixin where-dark {\n border-color: var(--mantine-color-dark-5);\n }\n}\n\n.presetButton {\n padding: 0.52em 0.8em;\n border-radius: var(--mantine-radius-default);\n font-size: var(--preset-font-size);\n white-space: nowrap;\n\n @mixin hover {\n @mixin where-light {\n background-color: var(--mantine-color-gray-0);\n }\n\n @mixin where-dark {\n background-color: var(--mantine-color-dark-5);\n }\n }\n}\n"],"mappings":""}
@@ -18,7 +18,7 @@ const defaultProps = {
18
18
  };
19
19
  const MonthPickerInput = (0, _mantine_core.factory)((_props) => {
20
20
  const props = (0, _mantine_core.useProps)("MonthPickerInput", defaultProps, _props);
21
- const { type, value, defaultValue, onChange, valueFormat, labelSeparator, locale, classNames, styles, unstyled, closeOnChange, size, variant, dropdownType, sortDates, minDate, maxDate, vars, valueFormatter, attributes, ...rest } = props;
21
+ const { type, value, defaultValue, onChange, valueFormat, labelSeparator, locale, classNames, styles, unstyled, closeOnChange, size, variant, dropdownType, sortDates, minDate, maxDate, vars, valueFormatter, presets, attributes, ...rest } = props;
22
22
  const { resolvedClassNames, resolvedStyles } = (0, _mantine_core.useResolvedStylesApi)({
23
23
  classNames,
24
24
  styles,
@@ -76,6 +76,7 @@ const MonthPickerInput = (0, _mantine_core.factory)((_props) => {
76
76
  __stopPropagation: dropdownType === "popover",
77
77
  minDate,
78
78
  maxDate,
79
+ presets,
79
80
  attributes
80
81
  })
81
82
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MonthPickerInput.cjs","names":["pickCalendarProps","useDatesInput","PickerInputBase","MonthPicker","getDefaultClampedDate"],"sources":["../../../src/components/MonthPickerInput/MonthPickerInput.tsx"],"sourcesContent":["import {\n __InputStylesNames,\n BoxProps,\n factory,\n Factory,\n InputVariant,\n MantineComponentStaticProperties,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n} from '@mantine/core';\nimport { useDatesInput } from '../../hooks';\nimport { DatePickerType } from '../../types';\nimport { getDefaultClampedDate } from '../../utils';\nimport { pickCalendarProps } from '../Calendar';\nimport { MonthPicker, MonthPickerBaseProps, MonthPickerStylesNames } from '../MonthPicker';\nimport { DateInputSharedProps, PickerInputBase } from '../PickerInputBase';\n\nexport type MonthPickerInputStylesNames =\n | __InputStylesNames\n | 'placeholder'\n | MonthPickerStylesNames;\n\nexport interface MonthPickerInputProps<Type extends DatePickerType = 'default'>\n extends\n BoxProps,\n DateInputSharedProps,\n MonthPickerBaseProps<Type>,\n StylesApiProps<MonthPickerInputFactory> {\n /** `dayjs` format for input value @default \"MMMM YYYY\" */\n valueFormat?: string;\n}\n\nexport type MonthPickerInputFactory = Factory<{\n props: MonthPickerInputProps;\n ref: HTMLButtonElement;\n stylesNames: MonthPickerInputStylesNames;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n type: 'default',\n size: 'sm',\n valueFormat: 'MMMM YYYY',\n closeOnChange: true,\n sortDates: true,\n dropdownType: 'popover',\n} satisfies Partial<MonthPickerInputProps>;\n\ntype MonthPickerInputComponent = (<Type extends DatePickerType = 'default'>(\n props: MonthPickerInputProps<Type> & { ref?: React.Ref<HTMLButtonElement> }\n) => React.JSX.Element) & {\n displayName?: string;\n} & MantineComponentStaticProperties<MonthPickerInputFactory>;\n\nexport const MonthPickerInput: MonthPickerInputComponent = factory<MonthPickerInputFactory>(\n (_props) => {\n const props = useProps('MonthPickerInput', defaultProps, _props);\n const {\n type,\n value,\n defaultValue,\n onChange,\n valueFormat,\n labelSeparator,\n locale,\n classNames,\n styles,\n unstyled,\n closeOnChange,\n size,\n variant,\n dropdownType,\n sortDates,\n minDate,\n maxDate,\n vars,\n valueFormatter,\n attributes,\n ...rest\n } = props;\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<MonthPickerInputFactory>({\n classNames,\n styles,\n props,\n });\n\n const { calendarProps, others } = pickCalendarProps(rest);\n\n const {\n _value,\n setValue,\n formattedValue,\n dropdownHandlers,\n dropdownOpened,\n onClear,\n shouldClear,\n } = useDatesInput({\n type: type as any,\n value,\n defaultValue,\n onChange: onChange as any,\n locale,\n format: valueFormat,\n labelSeparator,\n closeOnChange,\n sortDates,\n valueFormatter,\n });\n\n return (\n <PickerInputBase\n formattedValue={formattedValue}\n dropdownOpened={dropdownOpened}\n dropdownHandlers={dropdownHandlers}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n onClear={onClear}\n shouldClear={shouldClear}\n value={_value}\n size={size}\n variant={variant}\n dropdownType={dropdownType}\n {...others}\n attributes={attributes}\n type={type as any}\n __staticSelector=\"MonthPickerInput\"\n >\n <MonthPicker\n {...calendarProps}\n size={size}\n variant={variant}\n type={type}\n value={_value}\n defaultDate={\n calendarProps.defaultDate ||\n (Array.isArray(_value)\n ? _value[0] || getDefaultClampedDate({ maxDate, minDate })\n : _value || getDefaultClampedDate({ maxDate, minDate }))\n }\n onChange={setValue}\n locale={locale}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n __staticSelector=\"MonthPickerInput\"\n __stopPropagation={dropdownType === 'popover'}\n minDate={minDate}\n maxDate={maxDate}\n attributes={attributes}\n />\n </PickerInputBase>\n );\n }\n) as any;\n\nMonthPickerInput.classes = { ...PickerInputBase.classes, ...MonthPicker.classes };\nMonthPickerInput.displayName = '@mantine/dates/MonthPickerInput';\n\nexport namespace MonthPickerInput {\n export type Props<Type extends DatePickerType = 'default'> = MonthPickerInputProps<Type>;\n export type StylesNames = MonthPickerInputStylesNames;\n export type Factory = MonthPickerInputFactory;\n}\n"],"mappings":";;;;;;;;;;AAwCA,MAAM,eAAe;CACnB,MAAM;CACN,MAAM;CACN,aAAa;CACb,eAAe;CACf,WAAW;CACX,cAAc;CACf;AAQD,MAAa,oBAAA,GAAA,cAAA,UACV,WAAW;CACV,MAAM,SAAA,GAAA,cAAA,UAAiB,oBAAoB,cAAc,OAAO;CAChE,MAAM,EACJ,MACA,OACA,cACA,UACA,aACA,gBACA,QACA,YACA,QACA,UACA,eACA,MACA,SACA,cACA,WACA,SACA,SACA,MACA,gBACA,YACA,GAAG,SACD;CAEJ,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAAiE;EAC3F;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,eAAe,WAAWA,mCAAAA,kBAAkB,KAAK;CAEzD,MAAM,EACJ,QACA,UACA,gBACA,kBACA,gBACA,SACA,gBACEC,wBAAAA,cAAc;EACV;EACN;EACA;EACU;EACV;EACA,QAAQ;EACR;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD;EACkB;EACA;EACE;EAClB,YAAY;EACZ,QAAQ;EACE;EACD;EACI;EACb,OAAO;EACD;EACG;EACK;EACd,GAAI;EACQ;EACN;EACN,kBAAiB;YAEjB,iBAAA,GAAA,kBAAA,KAACC,oBAAAA,aAAD;GACE,GAAI;GACE;GACG;GACH;GACN,OAAO;GACP,aACE,cAAc,gBACb,MAAM,QAAQ,OAAO,GAClB,OAAO,MAAMC,iCAAAA,sBAAsB;IAAE;IAAS;IAAS,CAAC,GACxD,UAAUA,iCAAAA,sBAAsB;IAAE;IAAS;IAAS,CAAC;GAE3D,UAAU;GACF;GACR,YAAY;GACZ,QAAQ;GACE;GACV,kBAAiB;GACjB,mBAAmB,iBAAiB;GAC3B;GACA;GACG;GACZ,CAAA;EACc,CAAA;EAGvB;AAED,iBAAiB,UAAU;CAAE,GAAGF,wBAAAA,gBAAgB;CAAS,GAAGC,oBAAAA,YAAY;CAAS;AACjF,iBAAiB,cAAc"}
1
+ {"version":3,"file":"MonthPickerInput.cjs","names":["pickCalendarProps","useDatesInput","PickerInputBase","MonthPicker","getDefaultClampedDate"],"sources":["../../../src/components/MonthPickerInput/MonthPickerInput.tsx"],"sourcesContent":["import {\n __InputStylesNames,\n BoxProps,\n factory,\n Factory,\n InputVariant,\n MantineComponentStaticProperties,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n} from '@mantine/core';\nimport { useDatesInput } from '../../hooks';\nimport { DatePickerType } from '../../types';\nimport { getDefaultClampedDate } from '../../utils';\nimport { pickCalendarProps } from '../Calendar';\nimport { MonthPicker, MonthPickerBaseProps, MonthPickerStylesNames } from '../MonthPicker';\nimport { DateInputSharedProps, PickerInputBase } from '../PickerInputBase';\n\nexport type MonthPickerInputStylesNames =\n | __InputStylesNames\n | 'placeholder'\n | MonthPickerStylesNames;\n\nexport interface MonthPickerInputProps<Type extends DatePickerType = 'default'>\n extends\n BoxProps,\n DateInputSharedProps,\n MonthPickerBaseProps<Type>,\n StylesApiProps<MonthPickerInputFactory> {\n /** `dayjs` format for input value @default \"MMMM YYYY\" */\n valueFormat?: string;\n}\n\nexport type MonthPickerInputFactory = Factory<{\n props: MonthPickerInputProps;\n ref: HTMLButtonElement;\n stylesNames: MonthPickerInputStylesNames;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n type: 'default',\n size: 'sm',\n valueFormat: 'MMMM YYYY',\n closeOnChange: true,\n sortDates: true,\n dropdownType: 'popover',\n} satisfies Partial<MonthPickerInputProps>;\n\ntype MonthPickerInputComponent = (<Type extends DatePickerType = 'default'>(\n props: MonthPickerInputProps<Type> & { ref?: React.Ref<HTMLButtonElement> }\n) => React.JSX.Element) & {\n displayName?: string;\n} & MantineComponentStaticProperties<MonthPickerInputFactory>;\n\nexport const MonthPickerInput: MonthPickerInputComponent = factory<MonthPickerInputFactory>(\n (_props) => {\n const props = useProps('MonthPickerInput', defaultProps, _props);\n const {\n type,\n value,\n defaultValue,\n onChange,\n valueFormat,\n labelSeparator,\n locale,\n classNames,\n styles,\n unstyled,\n closeOnChange,\n size,\n variant,\n dropdownType,\n sortDates,\n minDate,\n maxDate,\n vars,\n valueFormatter,\n presets,\n attributes,\n ...rest\n } = props;\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<MonthPickerInputFactory>({\n classNames,\n styles,\n props,\n });\n\n const { calendarProps, others } = pickCalendarProps(rest);\n\n const {\n _value,\n setValue,\n formattedValue,\n dropdownHandlers,\n dropdownOpened,\n onClear,\n shouldClear,\n } = useDatesInput({\n type: type as any,\n value,\n defaultValue,\n onChange: onChange as any,\n locale,\n format: valueFormat,\n labelSeparator,\n closeOnChange,\n sortDates,\n valueFormatter,\n });\n\n return (\n <PickerInputBase\n formattedValue={formattedValue}\n dropdownOpened={dropdownOpened}\n dropdownHandlers={dropdownHandlers}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n onClear={onClear}\n shouldClear={shouldClear}\n value={_value}\n size={size}\n variant={variant}\n dropdownType={dropdownType}\n {...others}\n attributes={attributes}\n type={type as any}\n __staticSelector=\"MonthPickerInput\"\n >\n <MonthPicker\n {...calendarProps}\n size={size}\n variant={variant}\n type={type}\n value={_value}\n defaultDate={\n calendarProps.defaultDate ||\n (Array.isArray(_value)\n ? _value[0] || getDefaultClampedDate({ maxDate, minDate })\n : _value || getDefaultClampedDate({ maxDate, minDate }))\n }\n onChange={setValue}\n locale={locale}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n unstyled={unstyled}\n __staticSelector=\"MonthPickerInput\"\n __stopPropagation={dropdownType === 'popover'}\n minDate={minDate}\n maxDate={maxDate}\n presets={presets}\n attributes={attributes}\n />\n </PickerInputBase>\n );\n }\n) as any;\n\nMonthPickerInput.classes = { ...PickerInputBase.classes, ...MonthPicker.classes };\nMonthPickerInput.displayName = '@mantine/dates/MonthPickerInput';\n\nexport namespace MonthPickerInput {\n export type Props<Type extends DatePickerType = 'default'> = MonthPickerInputProps<Type>;\n export type StylesNames = MonthPickerInputStylesNames;\n export type Factory = MonthPickerInputFactory;\n}\n"],"mappings":";;;;;;;;;;AAwCA,MAAM,eAAe;CACnB,MAAM;CACN,MAAM;CACN,aAAa;CACb,eAAe;CACf,WAAW;CACX,cAAc;CACf;AAQD,MAAa,oBAAA,GAAA,cAAA,UACV,WAAW;CACV,MAAM,SAAA,GAAA,cAAA,UAAiB,oBAAoB,cAAc,OAAO;CAChE,MAAM,EACJ,MACA,OACA,cACA,UACA,aACA,gBACA,QACA,YACA,QACA,UACA,eACA,MACA,SACA,cACA,WACA,SACA,SACA,MACA,gBACA,SACA,YACA,GAAG,SACD;CAEJ,MAAM,EAAE,oBAAoB,oBAAA,GAAA,cAAA,sBAAiE;EAC3F;EACA;EACA;EACD,CAAC;CAEF,MAAM,EAAE,eAAe,WAAWA,mCAAAA,kBAAkB,KAAK;CAEzD,MAAM,EACJ,QACA,UACA,gBACA,kBACA,gBACA,SACA,gBACEC,wBAAAA,cAAc;EACV;EACN;EACA;EACU;EACV;EACA,QAAQ;EACR;EACA;EACA;EACA;EACD,CAAC;AAEF,QACE,iBAAA,GAAA,kBAAA,KAACC,wBAAAA,iBAAD;EACkB;EACA;EACE;EAClB,YAAY;EACZ,QAAQ;EACE;EACD;EACI;EACb,OAAO;EACD;EACG;EACK;EACd,GAAI;EACQ;EACN;EACN,kBAAiB;YAEjB,iBAAA,GAAA,kBAAA,KAACC,oBAAAA,aAAD;GACE,GAAI;GACE;GACG;GACH;GACN,OAAO;GACP,aACE,cAAc,gBACb,MAAM,QAAQ,OAAO,GAClB,OAAO,MAAMC,iCAAAA,sBAAsB;IAAE;IAAS;IAAS,CAAC,GACxD,UAAUA,iCAAAA,sBAAsB;IAAE;IAAS;IAAS,CAAC;GAE3D,UAAU;GACF;GACR,YAAY;GACZ,QAAQ;GACE;GACV,kBAAiB;GACjB,mBAAmB,iBAAiB;GAC3B;GACA;GACA;GACG;GACZ,CAAA;EACc,CAAA;EAGvB;AAED,iBAAiB,UAAU;CAAE,GAAGF,wBAAAA,gBAAgB;CAAS,GAAGC,oBAAAA,YAAY;CAAS;AACjF,iBAAiB,cAAc"}
@@ -5,7 +5,7 @@ let react_jsx_runtime = require("react/jsx-runtime");
5
5
  let _mantine_hooks = require("@mantine/hooks");
6
6
  //#region packages/@mantine/dates/src/components/SpinInput/SpinInput.tsx
7
7
  const getMaxDigit = (max) => Number(max.toFixed(0)[0]);
8
- function SpinInput({ value, min, max, onChange, focusable, step, onNextInput, onPreviousInput, onFocus, readOnly, allowTemporaryZero = false, placeholder = "--", ...others }) {
8
+ function SpinInput({ value, min, max, onChange, focusable, step, onNextInput, onPreviousInput, onFocus, readOnly, allowTemporaryZero = false, placeholder = "--", disableAutoAdvance = false, ...others }) {
9
9
  const maxDigit = getMaxDigit(max);
10
10
  const arrowsMax = max + 1 - step;
11
11
  const handleChange = (value) => {
@@ -15,7 +15,7 @@ function SpinInput({ value, min, max, onChange, focusable, step, onNextInput, on
15
15
  const parsedValue = parseInt(clearValue, 10);
16
16
  const clampedValue = allowTemporaryZero && parsedValue === 0 && min > 0 ? 0 : (0, _mantine_hooks.clamp)(parsedValue, min, max);
17
17
  onChange(clampedValue);
18
- if (clampedValue > maxDigit || value.startsWith("00")) onNextInput?.();
18
+ if (!disableAutoAdvance && (clampedValue > maxDigit || value.startsWith("00"))) onNextInput?.();
19
19
  }
20
20
  };
21
21
  const handleKeyDown = (event) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SpinInput.cjs","names":["padTime"],"sources":["../../../src/components/SpinInput/SpinInput.tsx"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { padTime } from '../TimePicker/utils/pad-time/pad-time';\n\ninterface SpinInputProps extends Omit<React.ComponentProps<'input'>, 'onChange' | 'value'> {\n value: number | null;\n min: number;\n max: number;\n onChange: (value: number | null) => void;\n focusable: boolean;\n step: number;\n onNextInput?: () => void;\n onPreviousInput?: () => void;\n allowTemporaryZero?: boolean;\n placeholder?: string;\n}\n\nconst getMaxDigit = (max: number) => Number(max.toFixed(0)[0]);\n\nexport function SpinInput({\n value,\n min,\n max,\n onChange,\n focusable,\n step,\n onNextInput,\n onPreviousInput,\n onFocus,\n readOnly,\n allowTemporaryZero = false,\n placeholder = '--',\n ...others\n}: SpinInputProps) {\n const maxDigit = getMaxDigit(max);\n const arrowsMax = max + 1 - step;\n\n const handleChange = (value: string) => {\n if (readOnly) {\n return;\n }\n\n const clearValue = value.replace(/\\D/g, '');\n if (clearValue !== '') {\n const parsedValue = parseInt(clearValue, 10);\n const clampedValue =\n allowTemporaryZero && parsedValue === 0 && min > 0 ? 0 : clamp(parsedValue, min, max);\n\n onChange(clampedValue);\n\n if (clampedValue > maxDigit || value.startsWith('00')) {\n onNextInput?.();\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (readOnly) {\n return;\n }\n\n if (event.key === '0' || event.key === 'Num0') {\n if (value === 0) {\n event.preventDefault();\n onNextInput?.();\n }\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n onChange(min);\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n onChange(max);\n }\n\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n\n if (value !== null) {\n onChange(null);\n } else {\n onPreviousInput?.();\n }\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n onNextInput?.();\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n onPreviousInput?.();\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n const newValue = value === null ? min : clamp(value + step, min, arrowsMax);\n onChange(newValue);\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n const newValue = value === null ? arrowsMax : clamp(value - step, min, arrowsMax);\n onChange(newValue);\n }\n };\n\n return (\n <input\n type=\"text\"\n role=\"spinbutton\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value === null ? 0 : value}\n data-empty={value === null || undefined}\n inputMode=\"numeric\"\n placeholder={placeholder}\n value={value === null ? '' : padTime(value)}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n onFocus={(event) => {\n event.currentTarget.select();\n onFocus?.(event);\n }}\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.select();\n }}\n onMouseDown={(event) => event.stopPropagation()}\n {...others}\n />\n );\n}\n\nSpinInput.displayName = '@mantine/dates/SpinInput';\n"],"mappings":";;;;;;AAgBA,MAAM,eAAe,QAAgB,OAAO,IAAI,QAAQ,EAAE,CAAC,GAAG;AAE9D,SAAgB,UAAU,EACxB,OACA,KACA,KACA,UACA,WACA,MACA,aACA,iBACA,SACA,UACA,qBAAqB,OACrB,cAAc,MACd,GAAG,UACc;CACjB,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,YAAY,MAAM,IAAI;CAE5B,MAAM,gBAAgB,UAAkB;AACtC,MAAI,SACF;EAGF,MAAM,aAAa,MAAM,QAAQ,OAAO,GAAG;AAC3C,MAAI,eAAe,IAAI;GACrB,MAAM,cAAc,SAAS,YAAY,GAAG;GAC5C,MAAM,eACJ,sBAAsB,gBAAgB,KAAK,MAAM,IAAI,KAAA,GAAA,eAAA,OAAU,aAAa,KAAK,IAAI;AAEvF,YAAS,aAAa;AAEtB,OAAI,eAAe,YAAY,MAAM,WAAW,KAAK,CACnD,gBAAe;;;CAKrB,MAAM,iBAAiB,UAAiD;AACtE,MAAI,SACF;AAGF,MAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ;OACjC,UAAU,GAAG;AACf,UAAM,gBAAgB;AACtB,mBAAe;;;AAInB,MAAI,MAAM,QAAQ,QAAQ;AACxB,SAAM,gBAAgB;AACtB,YAAS,IAAI;;AAGf,MAAI,MAAM,QAAQ,OAAO;AACvB,SAAM,gBAAgB;AACtB,YAAS,IAAI;;AAGf,MAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,UAAU;AACvD,SAAM,gBAAgB;AAEtB,OAAI,UAAU,KACZ,UAAS,KAAK;OAEd,oBAAmB;;AAIvB,MAAI,MAAM,QAAQ,cAAc;AAC9B,SAAM,gBAAgB;AACtB,kBAAe;;AAGjB,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AACtB,sBAAmB;;AAGrB,MAAI,MAAM,QAAQ,WAAW;AAC3B,SAAM,gBAAgB;AAEtB,YADiB,UAAU,OAAO,OAAA,GAAA,eAAA,OAAY,QAAQ,MAAM,KAAK,UAAU,CACzD;;AAGpB,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AAEtB,YADiB,UAAU,OAAO,aAAA,GAAA,eAAA,OAAkB,QAAQ,MAAM,KAAK,UAAU,CAC/D;;;AAItB,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,MAAK;EACL,MAAK;EACL,iBAAe;EACf,iBAAe;EACf,iBAAe,UAAU,OAAO,IAAI;EACpC,cAAY,UAAU,QAAQ,KAAA;EAC9B,WAAU;EACG;EACb,OAAO,UAAU,OAAO,KAAKA,iBAAAA,QAAQ,MAAM;EAC3C,WAAW,UAAU,aAAa,MAAM,cAAc,MAAM;EAC5D,WAAW;EACX,UAAU,UAAU;AAClB,SAAM,cAAc,QAAQ;AAC5B,aAAU,MAAM;;EAElB,UAAU,UAAU;AAClB,SAAM,iBAAiB;AACvB,SAAM,cAAc,QAAQ;;EAE9B,cAAc,UAAU,MAAM,iBAAiB;EAC/C,GAAI;EACJ,CAAA;;AAIN,UAAU,cAAc"}
1
+ {"version":3,"file":"SpinInput.cjs","names":["padTime"],"sources":["../../../src/components/SpinInput/SpinInput.tsx"],"sourcesContent":["import { clamp } from '@mantine/hooks';\nimport { padTime } from '../TimePicker/utils/pad-time/pad-time';\n\ninterface SpinInputProps extends Omit<React.ComponentProps<'input'>, 'onChange' | 'value'> {\n value: number | null;\n min: number;\n max: number;\n onChange: (value: number | null) => void;\n focusable: boolean;\n step: number;\n onNextInput?: () => void;\n onPreviousInput?: () => void;\n allowTemporaryZero?: boolean;\n placeholder?: string;\n disableAutoAdvance?: boolean;\n}\n\nconst getMaxDigit = (max: number) => Number(max.toFixed(0)[0]);\n\nexport function SpinInput({\n value,\n min,\n max,\n onChange,\n focusable,\n step,\n onNextInput,\n onPreviousInput,\n onFocus,\n readOnly,\n allowTemporaryZero = false,\n placeholder = '--',\n disableAutoAdvance = false,\n ...others\n}: SpinInputProps) {\n const maxDigit = getMaxDigit(max);\n const arrowsMax = max + 1 - step;\n\n const handleChange = (value: string) => {\n if (readOnly) {\n return;\n }\n\n const clearValue = value.replace(/\\D/g, '');\n if (clearValue !== '') {\n const parsedValue = parseInt(clearValue, 10);\n const clampedValue =\n allowTemporaryZero && parsedValue === 0 && min > 0 ? 0 : clamp(parsedValue, min, max);\n\n onChange(clampedValue);\n\n if (!disableAutoAdvance && (clampedValue > maxDigit || value.startsWith('00'))) {\n onNextInput?.();\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (readOnly) {\n return;\n }\n\n if (event.key === '0' || event.key === 'Num0') {\n if (value === 0) {\n event.preventDefault();\n onNextInput?.();\n }\n }\n\n if (event.key === 'Home') {\n event.preventDefault();\n onChange(min);\n }\n\n if (event.key === 'End') {\n event.preventDefault();\n onChange(max);\n }\n\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n\n if (value !== null) {\n onChange(null);\n } else {\n onPreviousInput?.();\n }\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n onNextInput?.();\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n onPreviousInput?.();\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n const newValue = value === null ? min : clamp(value + step, min, arrowsMax);\n onChange(newValue);\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n const newValue = value === null ? arrowsMax : clamp(value - step, min, arrowsMax);\n onChange(newValue);\n }\n };\n\n return (\n <input\n type=\"text\"\n role=\"spinbutton\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value === null ? 0 : value}\n data-empty={value === null || undefined}\n inputMode=\"numeric\"\n placeholder={placeholder}\n value={value === null ? '' : padTime(value)}\n onChange={(event) => handleChange(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n onFocus={(event) => {\n event.currentTarget.select();\n onFocus?.(event);\n }}\n onClick={(event) => {\n event.stopPropagation();\n event.currentTarget.select();\n }}\n onMouseDown={(event) => event.stopPropagation()}\n {...others}\n />\n );\n}\n\nSpinInput.displayName = '@mantine/dates/SpinInput';\n"],"mappings":";;;;;;AAiBA,MAAM,eAAe,QAAgB,OAAO,IAAI,QAAQ,EAAE,CAAC,GAAG;AAE9D,SAAgB,UAAU,EACxB,OACA,KACA,KACA,UACA,WACA,MACA,aACA,iBACA,SACA,UACA,qBAAqB,OACrB,cAAc,MACd,qBAAqB,OACrB,GAAG,UACc;CACjB,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,YAAY,MAAM,IAAI;CAE5B,MAAM,gBAAgB,UAAkB;AACtC,MAAI,SACF;EAGF,MAAM,aAAa,MAAM,QAAQ,OAAO,GAAG;AAC3C,MAAI,eAAe,IAAI;GACrB,MAAM,cAAc,SAAS,YAAY,GAAG;GAC5C,MAAM,eACJ,sBAAsB,gBAAgB,KAAK,MAAM,IAAI,KAAA,GAAA,eAAA,OAAU,aAAa,KAAK,IAAI;AAEvF,YAAS,aAAa;AAEtB,OAAI,CAAC,uBAAuB,eAAe,YAAY,MAAM,WAAW,KAAK,EAC3E,gBAAe;;;CAKrB,MAAM,iBAAiB,UAAiD;AACtE,MAAI,SACF;AAGF,MAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ;OACjC,UAAU,GAAG;AACf,UAAM,gBAAgB;AACtB,mBAAe;;;AAInB,MAAI,MAAM,QAAQ,QAAQ;AACxB,SAAM,gBAAgB;AACtB,YAAS,IAAI;;AAGf,MAAI,MAAM,QAAQ,OAAO;AACvB,SAAM,gBAAgB;AACtB,YAAS,IAAI;;AAGf,MAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,UAAU;AACvD,SAAM,gBAAgB;AAEtB,OAAI,UAAU,KACZ,UAAS,KAAK;OAEd,oBAAmB;;AAIvB,MAAI,MAAM,QAAQ,cAAc;AAC9B,SAAM,gBAAgB;AACtB,kBAAe;;AAGjB,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AACtB,sBAAmB;;AAGrB,MAAI,MAAM,QAAQ,WAAW;AAC3B,SAAM,gBAAgB;AAEtB,YADiB,UAAU,OAAO,OAAA,GAAA,eAAA,OAAY,QAAQ,MAAM,KAAK,UAAU,CACzD;;AAGpB,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AAEtB,YADiB,UAAU,OAAO,aAAA,GAAA,eAAA,OAAkB,QAAQ,MAAM,KAAK,UAAU,CAC/D;;;AAItB,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,MAAK;EACL,MAAK;EACL,iBAAe;EACf,iBAAe;EACf,iBAAe,UAAU,OAAO,IAAI;EACpC,cAAY,UAAU,QAAQ,KAAA;EAC9B,WAAU;EACG;EACb,OAAO,UAAU,OAAO,KAAKA,iBAAAA,QAAQ,MAAM;EAC3C,WAAW,UAAU,aAAa,MAAM,cAAc,MAAM;EAC5D,WAAW;EACX,UAAU,UAAU;AAClB,SAAM,cAAc,QAAQ;AAC5B,aAAU,MAAM;;EAElB,UAAU,UAAU;AAClB,SAAM,iBAAiB;AACvB,SAAM,cAAc,QAAQ;;EAE9B,cAAc,UAAU,MAAM,iBAAiB;EAC/C,GAAI;EACJ,CAAA;;AAIN,UAAU,cAAc"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  require("../../_virtual/_rolldown/runtime.cjs");
3
+ const require_pad_time = require("./utils/pad-time/pad-time.cjs");
3
4
  const require_SpinInput = require("../SpinInput/SpinInput.cjs");
4
5
  const require_TimePicker_context = require("./TimePicker.context.cjs");
5
6
  const require_AmPmInput = require("./AmPmInput/AmPmInput.cjs");
@@ -17,6 +18,7 @@ let _mantine_core = require("@mantine/core");
17
18
  let _mantine_hooks = require("@mantine/hooks");
18
19
  //#region packages/@mantine/dates/src/components/TimePicker/TimePicker.tsx
19
20
  const defaultProps = {
21
+ type: "time",
20
22
  hoursStep: 1,
21
23
  minutesStep: 1,
22
24
  secondsStep: 1,
@@ -29,12 +31,16 @@ const defaultProps = {
29
31
  maxDropdownContentHeight: 200,
30
32
  hoursPlaceholder: "--",
31
33
  minutesPlaceholder: "--",
32
- secondsPlaceholder: "--"
34
+ secondsPlaceholder: "--",
35
+ minHoursDigits: 2
33
36
  };
34
37
  const varsResolver = (0, _mantine_core.createVarsResolver)((_theme, { size }) => ({ dropdown: { "--control-font-size": (0, _mantine_core.getFontSize)(size) } }));
35
38
  const TimePicker = (0, _mantine_core.factory)((_props) => {
36
39
  const props = (0, _mantine_core.useProps)("TimePicker", defaultProps, _props);
37
- const { classNames, className, style, styles, unstyled, vars, onClick, format, value, defaultValue, onChange, hoursStep, minutesStep, secondsStep, withSeconds, hoursInputLabel, minutesInputLabel, secondsInputLabel, amPmInputLabel, amPmLabels, clearable, clearSectionMode, onMouseDown, onFocusCapture, onBlurCapture, min, max, popoverProps, withDropdown, rightSection, onFocus, onBlur, clearButtonProps, hoursInputProps, minutesInputProps, secondsInputProps, amPmSelectProps, readOnly, disabled, size, name, form, hiddenInputProps, labelProps, pasteSplit, hoursRef, minutesRef, secondsRef, amPmRef, presets, maxDropdownContentHeight, scrollAreaProps, attributes, reverseTimeControlsList, hoursPlaceholder, minutesPlaceholder, secondsPlaceholder, ...others } = props;
40
+ const { classNames, className, style, styles, unstyled, vars, onClick, type, format: _format, value, defaultValue, onChange, hoursStep, minutesStep, secondsStep, withSeconds, hoursInputLabel, minutesInputLabel, secondsInputLabel, amPmInputLabel, amPmLabels, clearable, clearSectionMode, onMouseDown, onFocusCapture, onBlurCapture, min, max, popoverProps, withDropdown, rightSection, onFocus, onBlur, clearButtonProps, hoursInputProps, minutesInputProps, secondsInputProps, amPmSelectProps, readOnly, disabled, size, name, form, hiddenInputProps, labelProps, pasteSplit, hoursRef, minutesRef, secondsRef, amPmRef, presets, maxDropdownContentHeight, scrollAreaProps, attributes, reverseTimeControlsList, hoursPlaceholder, minutesPlaceholder, secondsPlaceholder, minHoursDigits, ...others } = props;
41
+ const isDuration = type === "duration";
42
+ const format = isDuration ? "24h" : _format;
43
+ const resolvedHoursPlaceholder = isDuration && hoursPlaceholder === "--" ? "-".repeat(minHoursDigits) : hoursPlaceholder;
38
44
  const { resolvedClassNames, resolvedStyles } = (0, _mantine_core.useResolvedStylesApi)({
39
45
  classNames,
40
46
  styles,
@@ -65,7 +71,8 @@ const TimePicker = (0, _mantine_core.factory)((_props) => {
65
71
  clearable,
66
72
  disabled,
67
73
  readOnly,
68
- pasteSplit
74
+ pasteSplit,
75
+ type
69
76
  });
70
77
  const _hoursRef = (0, _mantine_hooks.useMergedRef)(controller.refs.hours, hoursRef);
71
78
  const _minutesRef = (0, _mantine_hooks.useMergedRef)(controller.refs.minutes, minutesRef);
@@ -108,7 +115,7 @@ const TimePicker = (0, _mantine_core.factory)((_props) => {
108
115
  transitionProps: { duration: 0 },
109
116
  position: "bottom-start",
110
117
  withRoles: false,
111
- disabled: disabled || readOnly || !withDropdown,
118
+ disabled: disabled || readOnly || !withDropdown || isDuration,
112
119
  ...popoverProps,
113
120
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mantine_core.Popover.Target, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_mantine_core.InputBase, {
114
121
  component: "div",
@@ -168,14 +175,18 @@ const TimePicker = (0, _mantine_core.factory)((_props) => {
168
175
  ...hoursInputProps,
169
176
  ...getStyles("field", {
170
177
  className: hoursInputProps?.className,
171
- style: hoursInputProps?.style
178
+ style: isDuration ? {
179
+ width: `calc(${Math.max(minHoursDigits, require_pad_time.padTime(controller.values.hours ?? 0).length)}ch + 0.3em)`,
180
+ ...hoursInputProps?.style
181
+ } : hoursInputProps?.style
172
182
  }),
173
183
  value: controller.values.hours,
174
184
  onChange: controller.setHours,
175
185
  onNextInput: () => controller.focus("minutes"),
176
186
  min: format === "12h" ? 1 : 0,
177
- max: format === "12h" ? 12 : 23,
187
+ max: isDuration ? 9999 : format === "12h" ? 12 : 23,
178
188
  allowTemporaryZero: format === "12h",
189
+ disableAutoAdvance: isDuration,
179
190
  focusable: true,
180
191
  step: hoursStep,
181
192
  ref: _hoursRef,
@@ -192,7 +203,7 @@ const TimePicker = (0, _mantine_core.factory)((_props) => {
192
203
  if (format === "12h" && (actualInputValue ? parseInt(actualInputValue, 10) : null) === 0) controller.setHours(12);
193
204
  hoursInputProps?.onBlur?.(event);
194
205
  },
195
- placeholder: hoursPlaceholder
206
+ placeholder: resolvedHoursPlaceholder
196
207
  }),
197
208
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: ":" }),
198
209
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_SpinInput.SpinInput, {
@@ -247,7 +258,7 @@ const TimePicker = (0, _mantine_core.factory)((_props) => {
247
258
  },
248
259
  placeholder: secondsPlaceholder
249
260
  })] }),
250
- format === "12h" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AmPmInput.AmPmInput, {
261
+ format === "12h" && !isDuration && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_AmPmInput.AmPmInput, {
251
262
  ...amPmSelectProps,
252
263
  inputType: withDropdown ? "input" : "select",
253
264
  labels: amPmLabels,
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.cjs","names":["getParsedTime","useTimePicker","getTimeString","clampTime","TimePickerProvider","Popover","InputBase","CloseButton","SpinInput","AmPmInput","TimePresets","TimeControlsList","AmPmControlsList","classes"],"sources":["../../../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport {\n __BaseInputProps,\n __InputStylesNames,\n BoxProps,\n ClearSectionMode,\n CloseButton,\n CloseButtonProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getFontSize,\n InputBase,\n InputVariant,\n Popover,\n PopoverProps,\n ScrollAreaProps,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useId, useMergedRef } from '@mantine/hooks';\nimport { SpinInput } from '../SpinInput';\nimport { AmPmInput } from './AmPmInput/AmPmInput';\nimport { AmPmControlsList } from './TimeControlsList/AmPmControlsList';\nimport { TimeControlsList } from './TimeControlsList/TimeControlsList';\nimport { TimePickerProvider } from './TimePicker.context';\nimport {\n TimePickerAmPmLabels,\n TimePickerFormat,\n TimePickerPasteSplit,\n TimePickerPresets,\n} from './TimePicker.types';\nimport { TimePresets } from './TimePresets/TimePresets';\nimport { useTimePicker } from './use-time-picker';\nimport { clampTime } from './utils/clamp-time/clamp-time';\nimport { getParsedTime } from './utils/get-parsed-time/get-parsed-time';\nimport { getTimeString } from './utils/get-time-string/get-time-string';\nimport classes from './TimePicker.module.css';\n\nexport type TimePickerStylesNames =\n | 'fieldsRoot'\n | 'fieldsGroup'\n | 'field'\n | 'controlsList'\n | 'controlsListGroup'\n | 'control'\n | 'dropdown'\n | 'presetsRoot'\n | 'presetsGroup'\n | 'presetsGroupLabel'\n | 'presetControl'\n | 'scrollarea'\n | __InputStylesNames;\n\nexport type TimePickerCssVariables = {\n dropdown: '--control-font-size';\n};\n\nexport interface TimePickerProps\n extends\n BoxProps,\n __BaseInputProps,\n StylesApiProps<TimePickerFactory>,\n ElementProps<'div', 'onChange' | 'defaultValue'> {\n /** Controlled component value */\n value?: string;\n\n /** Uncontrolled component default value */\n defaultValue?: string;\n\n /** Called when the value changes */\n onChange?: (value: string) => void;\n\n /** Determines whether the clear button should be displayed @default false */\n clearable?: boolean;\n\n /** Determines how the clear button and rightSection are rendered @default 'both' */\n clearSectionMode?: ClearSectionMode;\n\n /** `name` prop passed down to the hidden input */\n name?: string;\n\n /** `form` prop passed down to the hidden input */\n form?: string;\n\n /** Min possible time value in `hh:mm:ss` format */\n min?: string;\n\n /** Max possible time value in `hh:mm:ss` format */\n max?: string;\n\n /** Time format, `'24h'` by default */\n format?: TimePickerFormat;\n\n /** Number by which hours are incremented/decremented @default 1 */\n hoursStep?: number;\n\n /** Number by which minutes are incremented/decremented @default 1 */\n minutesStep?: number;\n\n /** Number by which seconds are incremented/decremented @default 1 */\n secondsStep?: number;\n\n /** Determines whether the seconds input should be displayed @default false */\n withSeconds?: boolean;\n\n /** `aria-label` of hours input */\n hoursInputLabel?: string;\n\n /** `aria-label` of minutes input */\n minutesInputLabel?: string;\n\n /** `aria-label` of seconds input */\n secondsInputLabel?: string;\n\n /** `aria-label` of am/pm input */\n amPmInputLabel?: string;\n\n /** Labels used for am/pm values @default { am: 'AM', pm: 'PM' } */\n amPmLabels?: TimePickerAmPmLabels;\n\n /** Determines whether the dropdown with time controls list should be visible when the input has focus @default false */\n withDropdown?: boolean;\n\n /** Props passed down to `Popover` component */\n popoverProps?: PopoverProps;\n\n /** Called once when one of the inputs is focused, not called when focused is shifted between hours, minutes, seconds and am/pm inputs */\n onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n\n /** Called once when the focus is no longer on any of the inputs */\n onBlur?: (event: React.FocusEvent<HTMLDivElement>) => void;\n\n /** Props passed down to clear button */\n clearButtonProps?: CloseButtonProps & ElementProps<'button'> & DataAttributes;\n\n /** Props passed down to hours input */\n hoursInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to minutes input */\n minutesInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to seconds input */\n secondsInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to am/pm select */\n amPmSelectProps?: React.ComponentProps<'select'> & DataAttributes;\n\n /** If set, the value cannot be updated */\n readOnly?: boolean;\n\n /** If set, the component becomes disabled */\n disabled?: boolean;\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** A function to transform paste values, by default time in 24h format can be parsed on paste for example `23:34:22` */\n pasteSplit?: TimePickerPasteSplit;\n\n /** A ref object to get node reference of the hours input */\n hoursRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the minutes input */\n minutesRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the seconds input */\n secondsRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the am/pm select */\n amPmRef?: React.Ref<HTMLSelectElement>;\n\n /** Time presets to display in the dropdown */\n presets?: TimePickerPresets;\n\n /** Maximum height of the content displayed in the dropdown in px @default 200 */\n maxDropdownContentHeight?: number;\n\n /** Props passed down to all underlying `ScrollArea` components */\n scrollAreaProps?: ScrollAreaProps;\n\n /** If set, the time controls list are reversed, @default false */\n reverseTimeControlsList?: boolean;\n\n /** Hours input placeholder, @default -- */\n hoursPlaceholder?: string;\n\n /** Minutes input placeholder, @default -- */\n minutesPlaceholder?: string;\n\n /** Seconds input placeholder, @default -- */\n secondsPlaceholder?: string;\n}\n\nexport type TimePickerFactory = Factory<{\n props: TimePickerProps;\n ref: HTMLDivElement;\n stylesNames: TimePickerStylesNames;\n vars: TimePickerCssVariables;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n hoursStep: 1,\n minutesStep: 1,\n secondsStep: 1,\n format: '24h',\n amPmLabels: { am: 'AM', pm: 'PM' },\n pasteSplit: getParsedTime,\n maxDropdownContentHeight: 200,\n hoursPlaceholder: '--',\n minutesPlaceholder: '--',\n secondsPlaceholder: '--',\n} satisfies Partial<TimePickerProps>;\n\nconst varsResolver = createVarsResolver<TimePickerFactory>((_theme, { size }) => ({\n dropdown: {\n '--control-font-size': getFontSize(size),\n },\n}));\n\nexport const TimePicker = factory<TimePickerFactory>((_props) => {\n const props = useProps('TimePicker', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n onClick,\n format,\n value,\n defaultValue,\n onChange,\n hoursStep,\n minutesStep,\n secondsStep,\n withSeconds,\n hoursInputLabel,\n minutesInputLabel,\n secondsInputLabel,\n amPmInputLabel,\n amPmLabels,\n clearable,\n clearSectionMode,\n onMouseDown,\n onFocusCapture,\n onBlurCapture,\n min,\n max,\n popoverProps,\n withDropdown,\n rightSection,\n onFocus,\n onBlur,\n clearButtonProps,\n hoursInputProps,\n minutesInputProps,\n secondsInputProps,\n amPmSelectProps,\n readOnly,\n disabled,\n size,\n name,\n form,\n hiddenInputProps,\n labelProps,\n pasteSplit,\n hoursRef,\n minutesRef,\n secondsRef,\n amPmRef,\n presets,\n maxDropdownContentHeight,\n scrollAreaProps,\n attributes,\n reverseTimeControlsList,\n hoursPlaceholder,\n minutesPlaceholder,\n secondsPlaceholder,\n ...others\n } = props;\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<TimePickerFactory>({\n classNames,\n styles,\n props,\n });\n\n const getStyles = useStyles<TimePickerFactory>({\n name: 'TimePicker',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const controller = useTimePicker({\n value,\n defaultValue,\n onChange,\n format,\n amPmLabels,\n withSeconds,\n min,\n max,\n clearable,\n disabled,\n readOnly,\n pasteSplit,\n });\n\n const _hoursRef = useMergedRef(controller.refs.hours, hoursRef);\n const _minutesRef = useMergedRef(controller.refs.minutes, minutesRef);\n const _secondsRef = useMergedRef(controller.refs.seconds, secondsRef);\n const _amPmRef = useMergedRef(controller.refs.amPm, amPmRef);\n\n const hoursInputId = useId();\n const hasFocusRef = useRef(false);\n const [dropdownOpened, setDropdownOpened] = useState(false);\n\n const handleFocus = (event: React.FocusEvent<any>) => {\n if (!hasFocusRef.current) {\n hasFocusRef.current = true;\n onFocus?.(event);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n const computedValue = controller.values;\n const timeString = getTimeString({\n ...computedValue,\n format,\n amPmLabels,\n withSeconds: !!withSeconds,\n });\n\n if (timeString.valid && (min || max)) {\n const clamped = clampTime(timeString.value, min, max);\n\n if (clamped.timeString !== timeString.value) {\n controller.setTimeString(clamped.timeString);\n }\n }\n hasFocusRef.current = false;\n onBlur?.(event);\n }\n };\n\n return (\n <TimePickerProvider value={{ getStyles, scrollAreaProps, maxDropdownContentHeight }}>\n <Popover\n opened={dropdownOpened}\n transitionProps={{ duration: 0 }}\n position=\"bottom-start\"\n withRoles={false}\n disabled={disabled || readOnly || !withDropdown}\n {...popoverProps}\n >\n <Popover.Target>\n <InputBase\n component=\"div\"\n size={size}\n disabled={disabled}\n onClick={(event) => {\n onClick?.(event);\n controller.focus('hours');\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onFocusCapture={(event) => {\n setDropdownOpened(true);\n onFocusCapture?.(event);\n }}\n onBlurCapture={(event) => {\n setDropdownOpened(false);\n onBlurCapture?.(event);\n }}\n rightSection={rightSection}\n __clearSection={\n <CloseButton\n {...clearButtonProps}\n size={size}\n onClick={(event) => {\n controller.clear();\n clearButtonProps?.onClick?.(event);\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n clearButtonProps?.onMouseDown?.(event);\n }}\n />\n }\n __clearable={controller.isClearable}\n __clearSectionMode={clearSectionMode}\n labelProps={{ htmlFor: hoursInputId, ...labelProps }}\n style={style}\n className={className}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n __staticSelector=\"TimePicker\"\n {...others}\n >\n <div {...getStyles('fieldsRoot')} dir=\"ltr\">\n <div {...getStyles('fieldsGroup')} onBlur={handleBlur}>\n <SpinInput\n id={hoursInputId}\n {...hoursInputProps}\n {...getStyles('field', {\n className: hoursInputProps?.className,\n style: hoursInputProps?.style,\n })}\n value={controller.values.hours}\n onChange={controller.setHours}\n onNextInput={() => controller.focus('minutes')}\n min={format === '12h' ? 1 : 0}\n max={format === '12h' ? 12 : 23}\n allowTemporaryZero={format === '12h'}\n focusable\n step={hoursStep}\n ref={_hoursRef}\n aria-label={hoursInputLabel}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n hoursInputProps?.onFocus?.(event);\n }}\n onBlur={(event) => {\n const actualInputValue = event.currentTarget.value;\n const numericValue = actualInputValue ? parseInt(actualInputValue, 10) : null;\n\n if (format === '12h' && numericValue === 0) {\n controller.setHours(12);\n }\n hoursInputProps?.onBlur?.(event);\n }}\n placeholder={hoursPlaceholder}\n />\n <span>:</span>\n <SpinInput\n {...minutesInputProps}\n {...getStyles('field', {\n className: minutesInputProps?.className,\n style: minutesInputProps?.style,\n })}\n value={controller.values.minutes}\n onChange={controller.setMinutes}\n min={0}\n max={59}\n focusable\n step={minutesStep}\n ref={_minutesRef}\n onPreviousInput={() => controller.focus('hours')}\n onNextInput={() =>\n withSeconds ? controller.focus('seconds') : controller.focus('amPm')\n }\n aria-label={minutesInputLabel}\n tabIndex={-1}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n minutesInputProps?.onFocus?.(event);\n }}\n placeholder={minutesPlaceholder}\n />\n\n {withSeconds && (\n <>\n <span>:</span>\n <SpinInput\n {...secondsInputProps}\n {...getStyles('field', {\n className: secondsInputProps?.className,\n style: secondsInputProps?.style,\n })}\n value={controller.values.seconds}\n onChange={controller.setSeconds}\n min={0}\n max={59}\n focusable\n step={secondsStep}\n ref={_secondsRef}\n onPreviousInput={() => controller.focus('minutes')}\n onNextInput={() => controller.focus('amPm')}\n aria-label={secondsInputLabel}\n tabIndex={-1}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n secondsInputProps?.onFocus?.(event);\n }}\n placeholder={secondsPlaceholder}\n />\n </>\n )}\n\n {format === '12h' && (\n <AmPmInput\n {...amPmSelectProps}\n inputType={withDropdown ? 'input' : 'select'}\n labels={amPmLabels}\n value={controller.values.amPm}\n onChange={controller.setAmPm}\n ref={_amPmRef}\n aria-label={amPmInputLabel}\n onPreviousInput={() =>\n withSeconds ? controller.focus('seconds') : controller.focus('minutes')\n }\n readOnly={readOnly}\n disabled={disabled}\n tabIndex={-1}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n amPmSelectProps?.onFocus?.(event);\n }}\n />\n )}\n </div>\n </div>\n\n <input\n type=\"hidden\"\n name={name}\n form={form}\n value={controller.hiddenInputValue}\n {...hiddenInputProps}\n />\n </InputBase>\n </Popover.Target>\n <Popover.Dropdown\n {...getStyles('dropdown')}\n onMouseDown={(event) => event.preventDefault()}\n >\n {presets ? (\n <TimePresets\n value={controller.hiddenInputValue}\n onChange={controller.setTimeString}\n format={format}\n presets={presets}\n amPmLabels={amPmLabels}\n withSeconds={withSeconds || false}\n />\n ) : (\n <div {...getStyles('controlsListGroup')}>\n <TimeControlsList\n min={format === '12h' ? 1 : 0}\n max={format === '12h' ? 12 : 23}\n step={hoursStep}\n value={controller.values.hours}\n onSelect={controller.setHours}\n reversed={reverseTimeControlsList}\n />\n <TimeControlsList\n min={0}\n max={59}\n step={minutesStep}\n value={controller.values.minutes}\n onSelect={controller.setMinutes}\n reversed={reverseTimeControlsList}\n />\n {withSeconds && (\n <TimeControlsList\n min={0}\n max={59}\n step={secondsStep}\n value={controller.values.seconds}\n onSelect={controller.setSeconds}\n reversed={reverseTimeControlsList}\n />\n )}\n {format === '12h' && (\n <AmPmControlsList\n labels={amPmLabels}\n value={controller.values.amPm}\n onSelect={controller.setAmPm}\n />\n )}\n </div>\n )}\n </Popover.Dropdown>\n </Popover>\n </TimePickerProvider>\n );\n});\n\nTimePicker.displayName = '@mantine/dates/TimePicker';\nTimePicker.classes = classes;\nTimePicker.varsResolver = varsResolver;\n\nexport namespace TimePicker {\n export type Props = TimePickerProps;\n export type StylesNames = TimePickerStylesNames;\n export type Factory = TimePickerFactory;\n export type CssVariables = TimePickerCssVariables;\n export type Format = TimePickerFormat;\n export type AmPmLabels = TimePickerAmPmLabels;\n export type PasteSplit = TimePickerPasteSplit;\n export type Presets = TimePickerPresets;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimePicker.cjs","names":["getParsedTime","useTimePicker","getTimeString","clampTime","TimePickerProvider","Popover","InputBase","CloseButton","SpinInput","padTime","AmPmInput","TimePresets","TimeControlsList","AmPmControlsList","classes"],"sources":["../../../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport {\n __BaseInputProps,\n __InputStylesNames,\n BoxProps,\n ClearSectionMode,\n CloseButton,\n CloseButtonProps,\n createVarsResolver,\n DataAttributes,\n ElementProps,\n factory,\n Factory,\n getFontSize,\n InputBase,\n InputVariant,\n Popover,\n PopoverProps,\n ScrollAreaProps,\n StylesApiProps,\n useProps,\n useResolvedStylesApi,\n useStyles,\n} from '@mantine/core';\nimport { useId, useMergedRef } from '@mantine/hooks';\nimport { SpinInput } from '../SpinInput';\nimport { AmPmInput } from './AmPmInput/AmPmInput';\nimport { AmPmControlsList } from './TimeControlsList/AmPmControlsList';\nimport { TimeControlsList } from './TimeControlsList/TimeControlsList';\nimport { TimePickerProvider } from './TimePicker.context';\nimport {\n TimePickerAmPmLabels,\n TimePickerFormat,\n TimePickerPasteSplit,\n TimePickerPresets,\n TimePickerType,\n} from './TimePicker.types';\nimport { TimePresets } from './TimePresets/TimePresets';\nimport { useTimePicker } from './use-time-picker';\nimport { clampTime } from './utils/clamp-time/clamp-time';\nimport { getParsedTime } from './utils/get-parsed-time/get-parsed-time';\nimport { getTimeString } from './utils/get-time-string/get-time-string';\nimport { padTime } from './utils/pad-time/pad-time';\nimport classes from './TimePicker.module.css';\n\nexport type TimePickerStylesNames =\n | 'fieldsRoot'\n | 'fieldsGroup'\n | 'field'\n | 'controlsList'\n | 'controlsListGroup'\n | 'control'\n | 'dropdown'\n | 'presetsRoot'\n | 'presetsGroup'\n | 'presetsGroupLabel'\n | 'presetControl'\n | 'scrollarea'\n | __InputStylesNames;\n\nexport type TimePickerCssVariables = {\n dropdown: '--control-font-size';\n};\n\nexport interface TimePickerProps\n extends\n BoxProps,\n __BaseInputProps,\n StylesApiProps<TimePickerFactory>,\n ElementProps<'div', 'onChange' | 'defaultValue'> {\n /** TimePicker type, `'time'` for regular time input, `'duration'` for duration input that allows values greater than 24 hours @default 'time' */\n type?: TimePickerType;\n\n /** Controlled component value */\n value?: string;\n\n /** Uncontrolled component default value */\n defaultValue?: string;\n\n /** Called when the value changes */\n onChange?: (value: string) => void;\n\n /** Determines whether the clear button should be displayed @default false */\n clearable?: boolean;\n\n /** Determines how the clear button and rightSection are rendered @default 'both' */\n clearSectionMode?: ClearSectionMode;\n\n /** `name` prop passed down to the hidden input */\n name?: string;\n\n /** `form` prop passed down to the hidden input */\n form?: string;\n\n /** Min possible time value in `hh:mm:ss` format */\n min?: string;\n\n /** Max possible time value in `hh:mm:ss` format */\n max?: string;\n\n /** Time format, `'24h'` by default */\n format?: TimePickerFormat;\n\n /** Number by which hours are incremented/decremented @default 1 */\n hoursStep?: number;\n\n /** Number by which minutes are incremented/decremented @default 1 */\n minutesStep?: number;\n\n /** Number by which seconds are incremented/decremented @default 1 */\n secondsStep?: number;\n\n /** Determines whether the seconds input should be displayed @default false */\n withSeconds?: boolean;\n\n /** `aria-label` of hours input */\n hoursInputLabel?: string;\n\n /** `aria-label` of minutes input */\n minutesInputLabel?: string;\n\n /** `aria-label` of seconds input */\n secondsInputLabel?: string;\n\n /** `aria-label` of am/pm input */\n amPmInputLabel?: string;\n\n /** Labels used for am/pm values @default { am: 'AM', pm: 'PM' } */\n amPmLabels?: TimePickerAmPmLabels;\n\n /** Determines whether the dropdown with time controls list should be visible when the input has focus @default false */\n withDropdown?: boolean;\n\n /** Props passed down to `Popover` component */\n popoverProps?: PopoverProps;\n\n /** Called once when one of the inputs is focused, not called when focused is shifted between hours, minutes, seconds and am/pm inputs */\n onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n\n /** Called once when the focus is no longer on any of the inputs */\n onBlur?: (event: React.FocusEvent<HTMLDivElement>) => void;\n\n /** Props passed down to clear button */\n clearButtonProps?: CloseButtonProps & ElementProps<'button'> & DataAttributes;\n\n /** Props passed down to hours input */\n hoursInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to minutes input */\n minutesInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to seconds input */\n secondsInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** Props passed down to am/pm select */\n amPmSelectProps?: React.ComponentProps<'select'> & DataAttributes;\n\n /** If set, the value cannot be updated */\n readOnly?: boolean;\n\n /** If set, the component becomes disabled */\n disabled?: boolean;\n\n /** Props passed down to the hidden input */\n hiddenInputProps?: React.ComponentProps<'input'> & DataAttributes;\n\n /** A function to transform paste values, by default time in 24h format can be parsed on paste for example `23:34:22` */\n pasteSplit?: TimePickerPasteSplit;\n\n /** A ref object to get node reference of the hours input */\n hoursRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the minutes input */\n minutesRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the seconds input */\n secondsRef?: React.Ref<HTMLInputElement>;\n\n /** A ref object to get node reference of the am/pm select */\n amPmRef?: React.Ref<HTMLSelectElement>;\n\n /** Time presets to display in the dropdown */\n presets?: TimePickerPresets;\n\n /** Maximum height of the content displayed in the dropdown in px @default 200 */\n maxDropdownContentHeight?: number;\n\n /** Props passed down to all underlying `ScrollArea` components */\n scrollAreaProps?: ScrollAreaProps;\n\n /** If set, the time controls list are reversed, @default false */\n reverseTimeControlsList?: boolean;\n\n /** Hours input placeholder, @default -- */\n hoursPlaceholder?: string;\n\n /** Minutes input placeholder, @default -- */\n minutesPlaceholder?: string;\n\n /** Seconds input placeholder, @default -- */\n secondsPlaceholder?: string;\n\n /** Minimum number of digits displayed in the hours input, applicable only when `type=\"duration\"` is set @default 2 */\n minHoursDigits?: number;\n}\n\nexport type TimePickerFactory = Factory<{\n props: TimePickerProps;\n ref: HTMLDivElement;\n stylesNames: TimePickerStylesNames;\n vars: TimePickerCssVariables;\n variant: InputVariant;\n}>;\n\nconst defaultProps = {\n type: 'time',\n hoursStep: 1,\n minutesStep: 1,\n secondsStep: 1,\n format: '24h',\n amPmLabels: { am: 'AM', pm: 'PM' },\n pasteSplit: getParsedTime,\n maxDropdownContentHeight: 200,\n hoursPlaceholder: '--',\n minutesPlaceholder: '--',\n secondsPlaceholder: '--',\n minHoursDigits: 2,\n} satisfies Partial<TimePickerProps>;\n\nconst varsResolver = createVarsResolver<TimePickerFactory>((_theme, { size }) => ({\n dropdown: {\n '--control-font-size': getFontSize(size),\n },\n}));\n\nexport const TimePicker = factory<TimePickerFactory>((_props) => {\n const props = useProps('TimePicker', defaultProps, _props);\n const {\n classNames,\n className,\n style,\n styles,\n unstyled,\n vars,\n onClick,\n type,\n format: _format,\n value,\n defaultValue,\n onChange,\n hoursStep,\n minutesStep,\n secondsStep,\n withSeconds,\n hoursInputLabel,\n minutesInputLabel,\n secondsInputLabel,\n amPmInputLabel,\n amPmLabels,\n clearable,\n clearSectionMode,\n onMouseDown,\n onFocusCapture,\n onBlurCapture,\n min,\n max,\n popoverProps,\n withDropdown,\n rightSection,\n onFocus,\n onBlur,\n clearButtonProps,\n hoursInputProps,\n minutesInputProps,\n secondsInputProps,\n amPmSelectProps,\n readOnly,\n disabled,\n size,\n name,\n form,\n hiddenInputProps,\n labelProps,\n pasteSplit,\n hoursRef,\n minutesRef,\n secondsRef,\n amPmRef,\n presets,\n maxDropdownContentHeight,\n scrollAreaProps,\n attributes,\n reverseTimeControlsList,\n hoursPlaceholder,\n minutesPlaceholder,\n secondsPlaceholder,\n minHoursDigits,\n ...others\n } = props;\n\n const isDuration = type === 'duration';\n const format = isDuration ? '24h' : _format!;\n const resolvedHoursPlaceholder =\n isDuration && hoursPlaceholder === '--' ? '-'.repeat(minHoursDigits!) : hoursPlaceholder;\n\n const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<TimePickerFactory>({\n classNames,\n styles,\n props,\n });\n\n const getStyles = useStyles<TimePickerFactory>({\n name: 'TimePicker',\n classes,\n props,\n className,\n style,\n classNames,\n styles,\n unstyled,\n attributes,\n vars,\n varsResolver,\n });\n\n const controller = useTimePicker({\n value,\n defaultValue,\n onChange,\n format,\n amPmLabels,\n withSeconds,\n min,\n max,\n clearable,\n disabled,\n readOnly,\n pasteSplit,\n type: type!,\n });\n\n const _hoursRef = useMergedRef(controller.refs.hours, hoursRef);\n const _minutesRef = useMergedRef(controller.refs.minutes, minutesRef);\n const _secondsRef = useMergedRef(controller.refs.seconds, secondsRef);\n const _amPmRef = useMergedRef(controller.refs.amPm, amPmRef);\n\n const hoursInputId = useId();\n const hasFocusRef = useRef(false);\n const [dropdownOpened, setDropdownOpened] = useState(false);\n\n const handleFocus = (event: React.FocusEvent<any>) => {\n if (!hasFocusRef.current) {\n hasFocusRef.current = true;\n onFocus?.(event);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n const computedValue = controller.values;\n const timeString = getTimeString({\n ...computedValue,\n format,\n amPmLabels,\n withSeconds: !!withSeconds,\n });\n\n if (timeString.valid && (min || max)) {\n const clamped = clampTime(timeString.value, min, max);\n\n if (clamped.timeString !== timeString.value) {\n controller.setTimeString(clamped.timeString);\n }\n }\n hasFocusRef.current = false;\n onBlur?.(event);\n }\n };\n\n return (\n <TimePickerProvider value={{ getStyles, scrollAreaProps, maxDropdownContentHeight }}>\n <Popover\n opened={dropdownOpened}\n transitionProps={{ duration: 0 }}\n position=\"bottom-start\"\n withRoles={false}\n disabled={disabled || readOnly || !withDropdown || isDuration}\n {...popoverProps}\n >\n <Popover.Target>\n <InputBase\n component=\"div\"\n size={size}\n disabled={disabled}\n onClick={(event) => {\n onClick?.(event);\n controller.focus('hours');\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onFocusCapture={(event) => {\n setDropdownOpened(true);\n onFocusCapture?.(event);\n }}\n onBlurCapture={(event) => {\n setDropdownOpened(false);\n onBlurCapture?.(event);\n }}\n rightSection={rightSection}\n __clearSection={\n <CloseButton\n {...clearButtonProps}\n size={size}\n onClick={(event) => {\n controller.clear();\n clearButtonProps?.onClick?.(event);\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n clearButtonProps?.onMouseDown?.(event);\n }}\n />\n }\n __clearable={controller.isClearable}\n __clearSectionMode={clearSectionMode}\n labelProps={{ htmlFor: hoursInputId, ...labelProps }}\n style={style}\n className={className}\n classNames={resolvedClassNames}\n styles={resolvedStyles}\n attributes={attributes}\n __staticSelector=\"TimePicker\"\n {...others}\n >\n <div {...getStyles('fieldsRoot')} dir=\"ltr\">\n <div {...getStyles('fieldsGroup')} onBlur={handleBlur}>\n <SpinInput\n id={hoursInputId}\n {...hoursInputProps}\n {...getStyles('field', {\n className: hoursInputProps?.className,\n style: isDuration\n ? {\n width: `calc(${Math.max(minHoursDigits!, padTime(controller.values.hours ?? 0).length)}ch + 0.3em)`,\n ...hoursInputProps?.style,\n }\n : hoursInputProps?.style,\n })}\n value={controller.values.hours}\n onChange={controller.setHours}\n onNextInput={() => controller.focus('minutes')}\n min={format === '12h' ? 1 : 0}\n max={isDuration ? 9999 : format === '12h' ? 12 : 23}\n allowTemporaryZero={format === '12h'}\n disableAutoAdvance={isDuration}\n focusable\n step={hoursStep}\n ref={_hoursRef}\n aria-label={hoursInputLabel}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n hoursInputProps?.onFocus?.(event);\n }}\n onBlur={(event) => {\n const actualInputValue = event.currentTarget.value;\n const numericValue = actualInputValue ? parseInt(actualInputValue, 10) : null;\n\n if (format === '12h' && numericValue === 0) {\n controller.setHours(12);\n }\n hoursInputProps?.onBlur?.(event);\n }}\n placeholder={resolvedHoursPlaceholder}\n />\n <span>:</span>\n <SpinInput\n {...minutesInputProps}\n {...getStyles('field', {\n className: minutesInputProps?.className,\n style: minutesInputProps?.style,\n })}\n value={controller.values.minutes}\n onChange={controller.setMinutes}\n min={0}\n max={59}\n focusable\n step={minutesStep}\n ref={_minutesRef}\n onPreviousInput={() => controller.focus('hours')}\n onNextInput={() =>\n withSeconds ? controller.focus('seconds') : controller.focus('amPm')\n }\n aria-label={minutesInputLabel}\n tabIndex={-1}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n minutesInputProps?.onFocus?.(event);\n }}\n placeholder={minutesPlaceholder}\n />\n\n {withSeconds && (\n <>\n <span>:</span>\n <SpinInput\n {...secondsInputProps}\n {...getStyles('field', {\n className: secondsInputProps?.className,\n style: secondsInputProps?.style,\n })}\n value={controller.values.seconds}\n onChange={controller.setSeconds}\n min={0}\n max={59}\n focusable\n step={secondsStep}\n ref={_secondsRef}\n onPreviousInput={() => controller.focus('minutes')}\n onNextInput={() => controller.focus('amPm')}\n aria-label={secondsInputLabel}\n tabIndex={-1}\n readOnly={readOnly}\n disabled={disabled}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n secondsInputProps?.onFocus?.(event);\n }}\n placeholder={secondsPlaceholder}\n />\n </>\n )}\n\n {format === '12h' && !isDuration && (\n <AmPmInput\n {...amPmSelectProps}\n inputType={withDropdown ? 'input' : 'select'}\n labels={amPmLabels}\n value={controller.values.amPm}\n onChange={controller.setAmPm}\n ref={_amPmRef}\n aria-label={amPmInputLabel}\n onPreviousInput={() =>\n withSeconds ? controller.focus('seconds') : controller.focus('minutes')\n }\n readOnly={readOnly}\n disabled={disabled}\n tabIndex={-1}\n onPaste={controller.onPaste}\n onFocus={(event) => {\n handleFocus(event);\n amPmSelectProps?.onFocus?.(event);\n }}\n />\n )}\n </div>\n </div>\n\n <input\n type=\"hidden\"\n name={name}\n form={form}\n value={controller.hiddenInputValue}\n {...hiddenInputProps}\n />\n </InputBase>\n </Popover.Target>\n <Popover.Dropdown\n {...getStyles('dropdown')}\n onMouseDown={(event) => event.preventDefault()}\n >\n {presets ? (\n <TimePresets\n value={controller.hiddenInputValue}\n onChange={controller.setTimeString}\n format={format}\n presets={presets}\n amPmLabels={amPmLabels}\n withSeconds={withSeconds || false}\n />\n ) : (\n <div {...getStyles('controlsListGroup')}>\n <TimeControlsList\n min={format === '12h' ? 1 : 0}\n max={format === '12h' ? 12 : 23}\n step={hoursStep}\n value={controller.values.hours}\n onSelect={controller.setHours}\n reversed={reverseTimeControlsList}\n />\n <TimeControlsList\n min={0}\n max={59}\n step={minutesStep}\n value={controller.values.minutes}\n onSelect={controller.setMinutes}\n reversed={reverseTimeControlsList}\n />\n {withSeconds && (\n <TimeControlsList\n min={0}\n max={59}\n step={secondsStep}\n value={controller.values.seconds}\n onSelect={controller.setSeconds}\n reversed={reverseTimeControlsList}\n />\n )}\n {format === '12h' && (\n <AmPmControlsList\n labels={amPmLabels}\n value={controller.values.amPm}\n onSelect={controller.setAmPm}\n />\n )}\n </div>\n )}\n </Popover.Dropdown>\n </Popover>\n </TimePickerProvider>\n );\n});\n\nTimePicker.displayName = '@mantine/dates/TimePicker';\nTimePicker.classes = classes;\nTimePicker.varsResolver = varsResolver;\n\nexport namespace TimePicker {\n export type Props = TimePickerProps;\n export type StylesNames = TimePickerStylesNames;\n export type Factory = TimePickerFactory;\n export type CssVariables = TimePickerCssVariables;\n export type Format = TimePickerFormat;\n export type AmPmLabels = TimePickerAmPmLabels;\n export type PasteSplit = TimePickerPasteSplit;\n export type Presets = TimePickerPresets;\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ const require_get_time_string = require("./utils/get-time-string/get-time-string
6
6
  let react = require("react");
7
7
  let _mantine_hooks = require("@mantine/hooks");
8
8
  //#region packages/@mantine/dates/src/components/TimePicker/use-time-picker.ts
9
- function useTimePicker({ value, defaultValue, onChange, format, amPmLabels, withSeconds = false, min, max, clearable, readOnly, disabled, pasteSplit }) {
9
+ function useTimePicker({ value, defaultValue, onChange, format, amPmLabels, withSeconds = false, min, max, clearable, readOnly, disabled, pasteSplit, type }) {
10
10
  const parsedTime = require_get_parsed_time.getParsedTime({
11
11
  time: value || defaultValue || "",
12
12
  amPmLabels,
@@ -132,7 +132,8 @@ function useTimePicker({ value, defaultValue, onChange, format, amPmLabels, with
132
132
  });
133
133
  if (timeString.valid) {
134
134
  acceptChange.current = false;
135
- const clamped = require_clamp_time.clampTime(timeString.value, min || "00:00:00", max || "23:59:59");
135
+ const defaultMax = type === "duration" ? "9999:59:59" : "23:59:59";
136
+ const clamped = require_clamp_time.clampTime(timeString.value, min || "00:00:00", max || defaultMax);
136
137
  onChange?.(clamped.timeString);
137
138
  setHours(parsedTime.hours);
138
139
  setMinutes(parsedTime.minutes);
@@ -1 +1 @@
1
- {"version":3,"file":"use-time-picker.cjs","names":["getParsedTime","getTimeString","clampTime"],"sources":["../../../src/components/TimePicker/use-time-picker.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useDidUpdate } from '@mantine/hooks';\nimport type {\n TimePickerAmPmLabels,\n TimePickerFormat,\n TimePickerPasteSplit,\n} from './TimePicker.types';\nimport { clampTime } from './utils/clamp-time/clamp-time';\nimport { getParsedTime } from './utils/get-parsed-time/get-parsed-time';\nimport { getTimeString } from './utils/get-time-string/get-time-string';\n\ninterface UseTimePickerInput {\n value: string | undefined;\n defaultValue: string | undefined;\n onChange: ((value: string) => void) | undefined;\n format: TimePickerFormat;\n amPmLabels: TimePickerAmPmLabels;\n withSeconds: boolean | undefined;\n min: string | undefined;\n max: string | undefined;\n readOnly: boolean | undefined;\n disabled: boolean | undefined;\n clearable: boolean | undefined;\n pasteSplit: TimePickerPasteSplit | undefined;\n}\n\nexport function useTimePicker({\n value,\n defaultValue,\n onChange,\n format,\n amPmLabels,\n withSeconds = false,\n min,\n max,\n clearable,\n readOnly,\n disabled,\n pasteSplit,\n}: UseTimePickerInput) {\n const parsedTime = getParsedTime({\n time: value || defaultValue || '',\n amPmLabels,\n format,\n });\n\n const initialTimeString = getTimeString({\n hours: parsedTime.hours,\n minutes: parsedTime.minutes,\n seconds: parsedTime.seconds,\n format,\n withSeconds,\n amPm: parsedTime.amPm,\n amPmLabels,\n });\n\n const acceptChange = useRef(true);\n const wasInvalidBefore = useRef(!initialTimeString.valid);\n\n const [hours, setHours] = useState<number | null>(parsedTime.hours);\n const [minutes, setMinutes] = useState<number | null>(parsedTime.minutes);\n const [seconds, setSeconds] = useState<number | null>(parsedTime.seconds);\n const [amPm, setAmPm] = useState<string | null>(parsedTime.amPm);\n\n const isClearable =\n clearable &&\n !readOnly &&\n !disabled &&\n (hours !== null || minutes !== null || seconds !== null || amPm !== null);\n\n const hoursRef = useRef<HTMLInputElement>(null);\n const minutesRef = useRef<HTMLInputElement>(null);\n const secondsRef = useRef<HTMLInputElement>(null);\n const amPmRef = useRef<HTMLSelectElement>(null);\n\n const focus = (field: 'hours' | 'minutes' | 'seconds' | 'amPm') => {\n if (field === 'hours') {\n hoursRef.current?.focus();\n }\n\n if (field === 'minutes') {\n minutesRef.current?.focus();\n }\n\n if (field === 'seconds') {\n secondsRef.current?.focus();\n }\n\n if (field === 'amPm') {\n amPmRef.current?.focus();\n }\n };\n\n const handleTimeChange = (field: 'hours' | 'minutes' | 'seconds' | 'amPm', val: any) => {\n const computedValue = { hours, minutes, seconds, amPm, [field]: val };\n\n const timeString = getTimeString({ ...computedValue, format, withSeconds, amPmLabels });\n\n if (timeString.valid) {\n acceptChange.current = false;\n wasInvalidBefore.current = false;\n if (field === 'hours') {\n setHours(val);\n }\n if (field === 'minutes') {\n setMinutes(val);\n }\n if (field === 'seconds') {\n setSeconds(val);\n }\n if (field === 'amPm') {\n setAmPm(val);\n }\n\n onChange?.(timeString.value);\n } else {\n acceptChange.current = false;\n if (!wasInvalidBefore.current) {\n onChange?.('');\n wasInvalidBefore.current = true;\n }\n }\n };\n\n const setTimeString = (timeString: string) => {\n acceptChange.current = false;\n\n const parsedTime = getParsedTime({ time: timeString, amPmLabels, format });\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n\n const next = getTimeString({ ...parsedTime, format, withSeconds, amPmLabels });\n wasInvalidBefore.current = !next.valid;\n onChange?.(timeString);\n };\n\n const onHoursChange = (value: number | null) => {\n let adjustedValue = value;\n if (format === '12h' && typeof value === 'number' && value > 12) {\n adjustedValue = ((value - 1) % 12) + 1;\n }\n\n setHours(adjustedValue);\n handleTimeChange('hours', adjustedValue);\n focus('hours');\n };\n\n const onMinutesChange = (value: number | null) => {\n setMinutes(value);\n handleTimeChange('minutes', value);\n focus('minutes');\n };\n\n const onSecondsChange = (value: number | null) => {\n setSeconds(value);\n handleTimeChange('seconds', value);\n focus('seconds');\n };\n\n const onAmPmChange = (value: string | null) => {\n setAmPm(value);\n handleTimeChange('amPm', value);\n focus('amPm');\n };\n\n const clear = () => {\n acceptChange.current = false;\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setAmPm(null);\n onChange?.('');\n wasInvalidBefore.current = true;\n focus('hours');\n };\n\n const onPaste = (event: React.ClipboardEvent<any>) => {\n event.preventDefault();\n const pastedValue = event.clipboardData.getData('text');\n const parsedTime = (pasteSplit || getParsedTime)({ time: pastedValue, format, amPmLabels });\n const timeString = getTimeString({ ...parsedTime, format, withSeconds, amPmLabels });\n if (timeString.valid) {\n acceptChange.current = false;\n const clamped = clampTime(timeString.value, min || '00:00:00', max || '23:59:59');\n onChange?.(clamped.timeString);\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n }\n };\n\n const hiddenInputValue = getTimeString({\n hours,\n minutes,\n seconds,\n format,\n withSeconds,\n amPm,\n amPmLabels: amPmLabels!,\n });\n\n useDidUpdate(() => {\n if (value === '') {\n acceptChange.current = false;\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setAmPm(null);\n acceptChange.current = true;\n return;\n }\n\n if (acceptChange.current && typeof value === 'string') {\n const parsedTime = getParsedTime({ time: value || '', amPmLabels, format });\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n }\n acceptChange.current = true;\n }, [value]);\n\n return {\n refs: { hours: hoursRef, minutes: minutesRef, seconds: secondsRef, amPm: amPmRef },\n values: { hours, minutes, seconds, amPm },\n setHours: onHoursChange,\n setMinutes: onMinutesChange,\n setSeconds: onSecondsChange,\n setAmPm: onAmPmChange,\n focus,\n clear,\n onPaste,\n setTimeString,\n isClearable,\n hiddenInputValue: hiddenInputValue.value,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-time-picker.cjs","names":["getParsedTime","getTimeString","clampTime"],"sources":["../../../src/components/TimePicker/use-time-picker.ts"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useDidUpdate } from '@mantine/hooks';\nimport type {\n TimePickerAmPmLabels,\n TimePickerFormat,\n TimePickerPasteSplit,\n TimePickerType,\n} from './TimePicker.types';\nimport { clampTime } from './utils/clamp-time/clamp-time';\nimport { getParsedTime } from './utils/get-parsed-time/get-parsed-time';\nimport { getTimeString } from './utils/get-time-string/get-time-string';\n\ninterface UseTimePickerInput {\n value: string | undefined;\n defaultValue: string | undefined;\n onChange: ((value: string) => void) | undefined;\n format: TimePickerFormat;\n amPmLabels: TimePickerAmPmLabels;\n withSeconds: boolean | undefined;\n min: string | undefined;\n max: string | undefined;\n readOnly: boolean | undefined;\n disabled: boolean | undefined;\n clearable: boolean | undefined;\n pasteSplit: TimePickerPasteSplit | undefined;\n type: TimePickerType;\n}\n\nexport function useTimePicker({\n value,\n defaultValue,\n onChange,\n format,\n amPmLabels,\n withSeconds = false,\n min,\n max,\n clearable,\n readOnly,\n disabled,\n pasteSplit,\n type,\n}: UseTimePickerInput) {\n const parsedTime = getParsedTime({\n time: value || defaultValue || '',\n amPmLabels,\n format,\n });\n\n const initialTimeString = getTimeString({\n hours: parsedTime.hours,\n minutes: parsedTime.minutes,\n seconds: parsedTime.seconds,\n format,\n withSeconds,\n amPm: parsedTime.amPm,\n amPmLabels,\n });\n\n const acceptChange = useRef(true);\n const wasInvalidBefore = useRef(!initialTimeString.valid);\n\n const [hours, setHours] = useState<number | null>(parsedTime.hours);\n const [minutes, setMinutes] = useState<number | null>(parsedTime.minutes);\n const [seconds, setSeconds] = useState<number | null>(parsedTime.seconds);\n const [amPm, setAmPm] = useState<string | null>(parsedTime.amPm);\n\n const isClearable =\n clearable &&\n !readOnly &&\n !disabled &&\n (hours !== null || minutes !== null || seconds !== null || amPm !== null);\n\n const hoursRef = useRef<HTMLInputElement>(null);\n const minutesRef = useRef<HTMLInputElement>(null);\n const secondsRef = useRef<HTMLInputElement>(null);\n const amPmRef = useRef<HTMLSelectElement>(null);\n\n const focus = (field: 'hours' | 'minutes' | 'seconds' | 'amPm') => {\n if (field === 'hours') {\n hoursRef.current?.focus();\n }\n\n if (field === 'minutes') {\n minutesRef.current?.focus();\n }\n\n if (field === 'seconds') {\n secondsRef.current?.focus();\n }\n\n if (field === 'amPm') {\n amPmRef.current?.focus();\n }\n };\n\n const handleTimeChange = (field: 'hours' | 'minutes' | 'seconds' | 'amPm', val: any) => {\n const computedValue = { hours, minutes, seconds, amPm, [field]: val };\n\n const timeString = getTimeString({ ...computedValue, format, withSeconds, amPmLabels });\n\n if (timeString.valid) {\n acceptChange.current = false;\n wasInvalidBefore.current = false;\n if (field === 'hours') {\n setHours(val);\n }\n if (field === 'minutes') {\n setMinutes(val);\n }\n if (field === 'seconds') {\n setSeconds(val);\n }\n if (field === 'amPm') {\n setAmPm(val);\n }\n\n onChange?.(timeString.value);\n } else {\n acceptChange.current = false;\n if (!wasInvalidBefore.current) {\n onChange?.('');\n wasInvalidBefore.current = true;\n }\n }\n };\n\n const setTimeString = (timeString: string) => {\n acceptChange.current = false;\n\n const parsedTime = getParsedTime({ time: timeString, amPmLabels, format });\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n\n const next = getTimeString({ ...parsedTime, format, withSeconds, amPmLabels });\n wasInvalidBefore.current = !next.valid;\n onChange?.(timeString);\n };\n\n const onHoursChange = (value: number | null) => {\n let adjustedValue = value;\n if (format === '12h' && typeof value === 'number' && value > 12) {\n adjustedValue = ((value - 1) % 12) + 1;\n }\n\n setHours(adjustedValue);\n handleTimeChange('hours', adjustedValue);\n focus('hours');\n };\n\n const onMinutesChange = (value: number | null) => {\n setMinutes(value);\n handleTimeChange('minutes', value);\n focus('minutes');\n };\n\n const onSecondsChange = (value: number | null) => {\n setSeconds(value);\n handleTimeChange('seconds', value);\n focus('seconds');\n };\n\n const onAmPmChange = (value: string | null) => {\n setAmPm(value);\n handleTimeChange('amPm', value);\n focus('amPm');\n };\n\n const clear = () => {\n acceptChange.current = false;\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setAmPm(null);\n onChange?.('');\n wasInvalidBefore.current = true;\n focus('hours');\n };\n\n const onPaste = (event: React.ClipboardEvent<any>) => {\n event.preventDefault();\n const pastedValue = event.clipboardData.getData('text');\n const parsedTime = (pasteSplit || getParsedTime)({ time: pastedValue, format, amPmLabels });\n const timeString = getTimeString({ ...parsedTime, format, withSeconds, amPmLabels });\n if (timeString.valid) {\n acceptChange.current = false;\n const defaultMax = type === 'duration' ? '9999:59:59' : '23:59:59';\n const clamped = clampTime(timeString.value, min || '00:00:00', max || defaultMax);\n onChange?.(clamped.timeString);\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n }\n };\n\n const hiddenInputValue = getTimeString({\n hours,\n minutes,\n seconds,\n format,\n withSeconds,\n amPm,\n amPmLabels: amPmLabels!,\n });\n\n useDidUpdate(() => {\n if (value === '') {\n acceptChange.current = false;\n setHours(null);\n setMinutes(null);\n setSeconds(null);\n setAmPm(null);\n acceptChange.current = true;\n return;\n }\n\n if (acceptChange.current && typeof value === 'string') {\n const parsedTime = getParsedTime({ time: value || '', amPmLabels, format });\n setHours(parsedTime.hours);\n setMinutes(parsedTime.minutes);\n setSeconds(parsedTime.seconds);\n setAmPm(parsedTime.amPm);\n }\n acceptChange.current = true;\n }, [value]);\n\n return {\n refs: { hours: hoursRef, minutes: minutesRef, seconds: secondsRef, amPm: amPmRef },\n values: { hours, minutes, seconds, amPm },\n setHours: onHoursChange,\n setMinutes: onMinutesChange,\n setSeconds: onSecondsChange,\n setAmPm: onAmPmChange,\n focus,\n clear,\n onPaste,\n setTimeString,\n isClearable,\n hiddenInputValue: hiddenInputValue.value,\n };\n}\n"],"mappings":"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"}