@bigbinary/neeto-atoms 1.0.145 → 1.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/dist/{DatePicker-DznpJnhm.js → DatePicker-BC9AOZJ2.js} +696 -131
  2. package/dist/DatePicker-BC9AOZJ2.js.map +1 -0
  3. package/dist/{TimePicker-BA7JhrYd.js → TimePicker-CJ8K2zea.js} +192 -17
  4. package/dist/TimePicker-CJ8K2zea.js.map +1 -0
  5. package/dist/{TranslationProvider-Dd0ITHC0.js → TranslationProvider-BJjfFEgX.js} +12 -1
  6. package/dist/{TranslationProvider-Dd0ITHC0.js.map → TranslationProvider-BJjfFEgX.js.map} +1 -1
  7. package/dist/cjs/{DatePicker-CMcp7TGb.js → DatePicker-aGLz-3Bz.js} +707 -141
  8. package/dist/cjs/DatePicker-aGLz-3Bz.js.map +1 -0
  9. package/dist/cjs/{TimePicker-CVGXEgk5.js → TimePicker-BhOW7vbV.js} +217 -41
  10. package/dist/cjs/TimePicker-BhOW7vbV.js.map +1 -0
  11. package/dist/cjs/{TranslationProvider-DOeyGtbV.js → TranslationProvider-C1JDwKEN.js} +12 -1
  12. package/dist/cjs/{TranslationProvider-DOeyGtbV.js.map → TranslationProvider-C1JDwKEN.js.map} +1 -1
  13. package/dist/cjs/components/DatePicker.js +7 -6
  14. package/dist/cjs/components/DatePicker.js.map +1 -1
  15. package/dist/cjs/components/TimePicker.js +7 -7
  16. package/dist/cjs/components/TranslationProvider.js +1 -1
  17. package/dist/cjs/components/index.js +7 -7
  18. package/dist/cjs/index.js +8 -8
  19. package/dist/cjs/{TimePickerPanel-DvVRLqeM.js → utils-S4yTubWZ.js} +25 -197
  20. package/dist/cjs/utils-S4yTubWZ.js.map +1 -0
  21. package/dist/components/DatePicker/DatePickerFooter.d.ts +1 -0
  22. package/dist/components/DatePicker/RangeCalendar.d.ts +2 -1
  23. package/dist/components/DatePicker/SegmentedTimeInput.d.ts +17 -0
  24. package/dist/components/DatePicker/TimeSection.d.ts +22 -0
  25. package/dist/components/DatePicker/constants.d.ts +1 -1
  26. package/dist/components/DatePicker/segmentedTime.d.ts +58 -0
  27. package/dist/components/DatePicker/types.d.ts +33 -4
  28. package/dist/components/DatePicker/utils.d.ts +3 -0
  29. package/dist/components/DatePicker.js +7 -6
  30. package/dist/components/DatePicker.js.map +1 -1
  31. package/dist/components/TimePicker.js +6 -6
  32. package/dist/components/TranslationProvider.js +1 -1
  33. package/dist/components/index.js +6 -6
  34. package/dist/index.js +8 -8
  35. package/dist/translations/index.d.ts +11 -0
  36. package/dist/utils/inputMask.d.ts +2 -1
  37. package/dist/{TimePickerPanel-n-Dz1p5N.js → utils-Ca3DmOrC.js} +22 -197
  38. package/dist/utils-Ca3DmOrC.js.map +1 -0
  39. package/package.json +1 -1
  40. package/dist/DatePicker-DznpJnhm.js.map +0 -1
  41. package/dist/TimePicker-BA7JhrYd.js.map +0 -1
  42. package/dist/TimePickerPanel-n-Dz1p5N.js.map +0 -1
  43. package/dist/cjs/DatePicker-CMcp7TGb.js.map +0 -1
  44. package/dist/cjs/TimePicker-CVGXEgk5.js.map +0 -1
  45. package/dist/cjs/TimePickerPanel-DvVRLqeM.js.map +0 -1
@@ -10,7 +10,7 @@ var Callout = require('../Callout-Bci3POCo.js');
10
10
  var Checkbox = require('../Checkbox-83g1FDsc.js');
11
11
  var ColorPicker = require('../ColorPicker-CODJ0QKs.js');
12
12
  var DataTable = require('../DataTable-KvsmFjeu.js');
13
- var DatePicker = require('../DatePicker-CMcp7TGb.js');
13
+ var DatePicker = require('../DatePicker-aGLz-3Bz.js');
14
14
  var Dialog = require('../Dialog-B_FZwr_u.js');
15
15
  var Empty = require('../Empty-Bwpsj82B.js');
16
16
  var Input = require('../Input-DFvMBpiU.js');
@@ -29,11 +29,10 @@ var Stepper = require('../Stepper-BZBdL6JW.js');
29
29
  var Switch = require('../Switch-BbRK3HUZ.js');
30
30
  var Tabs = require('../Tabs-BQl63Ewe.js');
31
31
  var Textarea = require('../Textarea-bxleSw86.js');
32
- var TimePicker = require('../TimePicker-CVGXEgk5.js');
33
- var TimePickerPanel = require('../TimePickerPanel-DvVRLqeM.js');
32
+ var TimePicker = require('../TimePicker-BhOW7vbV.js');
34
33
  var Toastr = require('../Toastr-DgllCbfd.js');
35
34
  var Tooltip = require('../Tooltip-B6uv_2Jz.js');
36
- var TranslationProvider = require('../TranslationProvider-DOeyGtbV.js');
35
+ var TranslationProvider = require('../TranslationProvider-C1JDwKEN.js');
37
36
  var Tree = require('../Tree-D1QjLPS9.js');
38
37
  var TreeSelect = require('../TreeSelect-CrLmpq26.js');
39
38
  var Typography = require('../Typography-Ctlu_0Qy.js');
@@ -113,9 +112,12 @@ require('../primitives/Pagination.js');
113
112
  require('../chevron-left-BldoOh5p.js');
114
113
  require('../ellipsis-4aubOI2n.js');
115
114
  require('../primitives/Calendar.js');
115
+ require('../utils-S4yTubWZ.js');
116
116
  require('dayjs');
117
117
  require('dayjs/plugin/customParseFormat');
118
118
  require('@bigbinary/neeto-commons-frontend/utils');
119
+ require('../primitives/Label.js');
120
+ require('../primitives/Switch.js');
119
121
  require('../primitives/Empty.js');
120
122
  require('../primitives/InputGroup.js');
121
123
  require('../input-group-Cr4T8woC.js');
@@ -123,7 +125,6 @@ require('../input-CgaZr1ov.js');
123
125
  require('../textarea-DW3Fg4w6.js');
124
126
  require('../withIconSize-C6LP0R7o.js');
125
127
  require('../primitives/Kbd.js');
126
- require('../primitives/Label.js');
127
128
  require('../primitives/HoverCard.js');
128
129
  require('../primitives/Progress.js');
129
130
  require('../primitives/RadioGroup.js');
@@ -133,7 +134,6 @@ require('../primitives/Sheet.js');
133
134
  require('../sheet-C33j5mif.js');
134
135
  require('../primitives/Slider.js');
135
136
  require('../index-EyWRfsCG.js');
136
- require('../primitives/Switch.js');
137
137
  require('../primitives/Tabs.js');
138
138
  require('../primitives/Textarea.js');
139
139
  require('../primitives/ScrollArea.js');
@@ -181,7 +181,7 @@ exports.Switch = Switch.Switch;
181
181
  exports.Tabs = Tabs.Tabs;
182
182
  exports.Textarea = Textarea.Textarea;
183
183
  exports.TimePicker = TimePicker.TimePicker;
184
- exports.TimePickerPanel = TimePickerPanel.TimePickerPanel;
184
+ exports.TimePickerPanel = TimePicker.TimePickerPanel;
185
185
  exports.Toastr = Toastr.Toastr;
186
186
  exports.Tooltip = Tooltip.Tooltip;
187
187
  exports.TranslationProvider = TranslationProvider.TranslationProvider;
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var utils$1 = require('@bigbinary/neeto-commons-frontend/utils');
4
- var TranslationProvider = require('./TranslationProvider-DOeyGtbV.js');
4
+ var TranslationProvider = require('./TranslationProvider-C1JDwKEN.js');
5
5
  var components_DropdownMenu = require('./components/DropdownMenu.js');
6
6
  var useMobile = require('./use-mobile-Be9CI6km.js');
7
7
  var utils = require('./utils-BhM0B89p.js');
@@ -14,7 +14,7 @@ var Callout = require('./Callout-Bci3POCo.js');
14
14
  var Checkbox = require('./Checkbox-83g1FDsc.js');
15
15
  var ColorPicker = require('./ColorPicker-CODJ0QKs.js');
16
16
  var DataTable = require('./DataTable-KvsmFjeu.js');
17
- var DatePicker = require('./DatePicker-CMcp7TGb.js');
17
+ var DatePicker = require('./DatePicker-aGLz-3Bz.js');
18
18
  var Dialog = require('./Dialog-B_FZwr_u.js');
19
19
  var DirectionProvider = require('./DirectionProvider-BTtE4FcN.js');
20
20
  var Empty = require('./Empty-Bwpsj82B.js');
@@ -34,7 +34,7 @@ var Stepper = require('./Stepper-BZBdL6JW.js');
34
34
  var Switch = require('./Switch-BbRK3HUZ.js');
35
35
  var Tabs = require('./Tabs-BQl63Ewe.js');
36
36
  var Textarea = require('./Textarea-bxleSw86.js');
37
- var TimePicker = require('./TimePicker-CVGXEgk5.js');
37
+ var TimePicker = require('./TimePicker-BhOW7vbV.js');
38
38
  var Toastr = require('./Toastr-DgllCbfd.js');
39
39
  var Tooltip = require('./Tooltip-B6uv_2Jz.js');
40
40
  var Tree = require('./Tree-D1QjLPS9.js');
@@ -115,11 +115,11 @@ require('./primitives/Pagination.js');
115
115
  require('./chevron-left-BldoOh5p.js');
116
116
  require('./ellipsis-4aubOI2n.js');
117
117
  require('./primitives/Calendar.js');
118
- require('./TimePickerPanel-DvVRLqeM.js');
119
- require('./primitives/ScrollArea.js');
120
- require('./index-EyWRfsCG.js');
118
+ require('./utils-S4yTubWZ.js');
121
119
  require('dayjs');
122
120
  require('dayjs/plugin/customParseFormat');
121
+ require('./primitives/Label.js');
122
+ require('./primitives/Switch.js');
123
123
  require('./primitives/Empty.js');
124
124
  require('./primitives/InputGroup.js');
125
125
  require('./input-group-Cr4T8woC.js');
@@ -127,7 +127,6 @@ require('./input-CgaZr1ov.js');
127
127
  require('./textarea-DW3Fg4w6.js');
128
128
  require('./withIconSize-C6LP0R7o.js');
129
129
  require('./primitives/Kbd.js');
130
- require('./primitives/Label.js');
131
130
  require('./primitives/HoverCard.js');
132
131
  require('./primitives/Progress.js');
133
132
  require('./primitives/RadioGroup.js');
@@ -136,9 +135,10 @@ require('./SelectFieldWrapper-CIh_atln.js');
136
135
  require('./primitives/Sheet.js');
137
136
  require('./sheet-C33j5mif.js');
138
137
  require('./primitives/Slider.js');
139
- require('./primitives/Switch.js');
138
+ require('./index-EyWRfsCG.js');
140
139
  require('./primitives/Tabs.js');
141
140
  require('./primitives/Textarea.js');
141
+ require('./primitives/ScrollArea.js');
142
142
  require('./index-CPmGpPzg.js');
143
143
  require('./redux-DEF7lAd1.js');
144
144
 
@@ -1,10 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ var createLucideIcon = require('./createLucideIcon-D0tRgV6l.js');
3
4
  var React = require('react');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var utils$1 = require('./utils-BhM0B89p.js');
6
- var primitives_Button = require('./primitives/Button.js');
7
- var primitives_ScrollArea = require('./primitives/ScrollArea.js');
8
5
  var pureDayjs = require('dayjs');
9
6
  var customParseFormat = require('dayjs/plugin/customParseFormat');
10
7
  var utils = require('@bigbinary/neeto-commons-frontend/utils');
@@ -14,6 +11,20 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
11
  var pureDayjs__default = /*#__PURE__*/_interopDefault(pureDayjs);
15
12
  var customParseFormat__default = /*#__PURE__*/_interopDefault(customParseFormat);
16
13
 
14
+ /**
15
+ * @license lucide-react v0.577.0 - ISC
16
+ *
17
+ * This source code is licensed under the ISC license.
18
+ * See the LICENSE file in the root directory of this source tree.
19
+ */
20
+
21
+
22
+ const __iconNode = [
23
+ ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
24
+ ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }]
25
+ ];
26
+ const Clock = createLucideIcon.createLucideIcon("clock", __iconNode);
27
+
17
28
  function useControlledOpen(controlledOpen, onOpenChange) {
18
29
  const [internalOpen, setInternalOpen] = React.useState(false);
19
30
  const isControlled = controlledOpen !== void 0;
@@ -70,12 +81,14 @@ const isValidChar = (ch, hasAmPm) => DIGIT.test(ch) || hasAmPm && AMPM_CHAR.test
70
81
  const buildMaskTemplate = (format) => {
71
82
  let pattern = "";
72
83
  let hasAmPm = false;
73
- for (const char of format) {
84
+ for (let i = 0; i < format.length; i++) {
85
+ const char = format[i];
74
86
  if (FORMAT_CHARS.has(char)) {
75
87
  pattern += "#";
76
88
  } else if (char === "A") {
77
- pattern += "@";
89
+ pattern += "@@";
78
90
  hasAmPm = true;
91
+ if (format[i + 1] === "A") i++;
79
92
  } else {
80
93
  pattern += char;
81
94
  }
@@ -247,27 +260,6 @@ const applyMask = (inputText, template, previousText = "", nativeCursorPos) => {
247
260
  };
248
261
  };
249
262
 
250
- const COLUMN_HEIGHT = 224;
251
- const ITEM_HEIGHT = 32;
252
- const PERIODS = ["AM", "PM"];
253
- const SIZE_CONFIG = {
254
- small: {
255
- trigger: "h-8 md:h-7",
256
- input: "text-base md:text-xs",
257
- icon: "size-3.5"
258
- },
259
- medium: {
260
- trigger: "h-8",
261
- input: "text-base md:text-sm",
262
- icon: "size-4"
263
- },
264
- large: {
265
- trigger: "h-10",
266
- input: "text-base md:text-sm",
267
- icon: "size-5"
268
- }
269
- };
270
-
271
263
  pureDayjs__default.default.extend(customParseFormat__default.default);
272
264
  const generateRange = (start, end, step = 1) => {
273
265
  const result = [];
@@ -388,175 +380,7 @@ const timeValueToDayjs = (time) => {
388
380
  return utils.dayjs(`${today} ${h}:${m}:${s}`);
389
381
  };
390
382
 
391
- const TimeColumn = ({
392
- items,
393
- selected,
394
- onSelect,
395
- disabled = false,
396
- className,
397
- padStart = 2
398
- }) => {
399
- const selectedRef = React.useRef(null);
400
- React.useEffect(() => {
401
- if (selectedRef.current) {
402
- selectedRef.current.scrollIntoView({
403
- block: "center",
404
- behavior: "smooth"
405
- });
406
- }
407
- }, [selected]);
408
- return /* @__PURE__ */ jsxRuntime.jsx(
409
- primitives_ScrollArea.ScrollArea,
410
- {
411
- className: utils$1.cn("w-16", className),
412
- style: { height: COLUMN_HEIGHT },
413
- children: /* @__PURE__ */ jsxRuntime.jsx(
414
- "div",
415
- {
416
- className: "flex flex-col items-center py-2",
417
- role: "listbox",
418
- "aria-label": "Time selection",
419
- children: items.map((item) => {
420
- const isSelected = item === selected;
421
- const displayValue = typeof item === "number" ? padNumber(item, padStart) : item;
422
- return /* @__PURE__ */ jsxRuntime.jsx(
423
- primitives_Button.Button,
424
- {
425
- ref: isSelected ? selectedRef : void 0,
426
- variant: isSelected ? "default" : "ghost",
427
- size: "sm",
428
- role: "option",
429
- "aria-selected": isSelected,
430
- disabled,
431
- className: utils$1.cn(
432
- "w-12 justify-center font-mono text-sm",
433
- !isSelected && "text-muted-foreground"
434
- ),
435
- style: { height: ITEM_HEIGHT },
436
- onClick: () => onSelect(item),
437
- children: displayValue
438
- },
439
- item
440
- );
441
- })
442
- }
443
- )
444
- }
445
- );
446
- };
447
- TimeColumn.displayName = "TimeColumn";
448
-
449
- const TimePickerPanel = React.forwardRef(
450
- ({
451
- value,
452
- onChange,
453
- format = "24",
454
- showSeconds = false,
455
- minuteStep = 1,
456
- secondStep = 1,
457
- disabled = false,
458
- className
459
- }, ref) => {
460
- const getInitialTime = React.useCallback(
461
- () => ({
462
- hours: value?.hours ?? 0,
463
- minutes: value?.minutes ?? 0,
464
- seconds: value?.seconds ?? 0
465
- }),
466
- [value]
467
- );
468
- const [internalTime, setInternalTime] = React.useState(getInitialTime);
469
- React.useEffect(() => {
470
- setInternalTime(getInitialTime());
471
- }, [getInitialTime]);
472
- const hours = format === "12" ? generateRange(1, 12) : generateRange(0, 23);
473
- const minutes = generateRange(0, 59, minuteStep);
474
- const seconds = generateRange(0, 59, secondStep);
475
- const { hour12, period } = format === "12" ? to12Hour(internalTime.hours) : { hour12: internalTime.hours, period: "AM" };
476
- const handleHourSelect = (hourValue) => {
477
- const hour = Number(hourValue);
478
- const newHours = format === "12" ? to24Hour(hour, period) : hour;
479
- const newTime = { ...internalTime, hours: newHours };
480
- setInternalTime(newTime);
481
- onChange?.(newTime);
482
- };
483
- const handleMinuteSelect = (minuteValue) => {
484
- const newTime = { ...internalTime, minutes: Number(minuteValue) };
485
- setInternalTime(newTime);
486
- onChange?.(newTime);
487
- };
488
- const handleSecondSelect = (secondValue) => {
489
- const newTime = { ...internalTime, seconds: Number(secondValue) };
490
- setInternalTime(newTime);
491
- onChange?.(newTime);
492
- };
493
- const handlePeriodSelect = (newPeriod) => {
494
- const newHours = to24Hour(hour12, newPeriod);
495
- const newTime = { ...internalTime, hours: newHours };
496
- setInternalTime(newTime);
497
- onChange?.(newTime);
498
- };
499
- return /* @__PURE__ */ jsxRuntime.jsxs(
500
- "div",
501
- {
502
- ref,
503
- className: utils$1.cn("flex", className),
504
- role: "group",
505
- "aria-label": "Time picker",
506
- children: [
507
- /* @__PURE__ */ jsxRuntime.jsx(
508
- TimeColumn,
509
- {
510
- items: hours,
511
- selected: format === "12" ? hour12 : internalTime.hours,
512
- onSelect: handleHourSelect,
513
- disabled
514
- }
515
- ),
516
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-inline-end border-border" }),
517
- /* @__PURE__ */ jsxRuntime.jsx(
518
- TimeColumn,
519
- {
520
- items: minutes,
521
- selected: internalTime.minutes,
522
- onSelect: handleMinuteSelect,
523
- disabled
524
- }
525
- ),
526
- showSeconds && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
527
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-inline-end border-border" }),
528
- /* @__PURE__ */ jsxRuntime.jsx(
529
- TimeColumn,
530
- {
531
- items: seconds,
532
- selected: internalTime.seconds ?? 0,
533
- onSelect: handleSecondSelect,
534
- disabled
535
- }
536
- )
537
- ] }),
538
- format === "12" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
539
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-inline-end border-border" }),
540
- /* @__PURE__ */ jsxRuntime.jsx(
541
- TimeColumn,
542
- {
543
- items: [...PERIODS],
544
- selected: period,
545
- onSelect: handlePeriodSelect,
546
- disabled,
547
- padStart: 0
548
- }
549
- )
550
- ] })
551
- ]
552
- }
553
- );
554
- }
555
- );
556
- TimePickerPanel.displayName = "TimePickerPanel";
557
-
558
- exports.SIZE_CONFIG = SIZE_CONFIG;
559
- exports.TimePickerPanel = TimePickerPanel;
383
+ exports.Clock = Clock;
560
384
  exports.applyMask = applyMask;
561
385
  exports.buildMaskTemplate = buildMaskTemplate;
562
386
  exports.buildRangeMaskTemplate = buildRangeMaskTemplate;
@@ -564,14 +388,18 @@ exports.coerceToTimeValue = coerceToTimeValue;
564
388
  exports.dateToTimeValue = dateToTimeValue;
565
389
  exports.formatTimeDisplay = formatTimeDisplay;
566
390
  exports.formatTimeWithPattern = formatTimeWithPattern;
391
+ exports.generateRange = generateRange;
567
392
  exports.getDefaultTimeMaskFormat = getDefaultTimeMaskFormat;
568
393
  exports.getTimePlaceholder = getTimePlaceholder;
569
394
  exports.isFixedWidthFormat = isFixedWidthFormat;
395
+ exports.padNumber = padNumber;
570
396
  exports.parseTimeString = parseTimeString;
571
397
  exports.parseTimeWithPattern = parseTimeWithPattern;
572
398
  exports.timeValueEquals = timeValueEquals;
573
399
  exports.timeValueToDayjs = timeValueToDayjs;
400
+ exports.to12Hour = to12Hour;
401
+ exports.to24Hour = to24Hour;
574
402
  exports.useControlledOpen = useControlledOpen;
575
403
  exports.useCursorRestore = useCursorRestore;
576
404
  exports.useOutsideClickClose = useOutsideClickClose;
577
- //# sourceMappingURL=TimePickerPanel-DvVRLqeM.js.map
405
+ //# sourceMappingURL=utils-S4yTubWZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-S4yTubWZ.js","sources":["../../node_modules/lucide-react/dist/esm/icons/clock.js","../../src/hooks/useControlledOpen.ts","../../src/hooks/useCursorRestore.ts","../../src/hooks/useOutsideClickClose.ts","../../src/utils/inputMask.ts","../../src/components/TimePicker/utils.ts"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 6v6l4 2\", key: \"mmk7yg\" }]\n];\nconst Clock = createLucideIcon(\"clock\", __iconNode);\n\nexport { __iconNode, Clock as default };\n//# sourceMappingURL=clock.js.map\n","import { useCallback, useState } from \"react\";\n\n/** Manages popover open state, supporting both controlled and uncontrolled modes. */\nexport function useControlledOpen(\n controlledOpen: boolean | undefined,\n onOpenChange?: (open: boolean) => void\n): { open: boolean; setOpen: (next: boolean) => void } {\n const [internalOpen, setInternalOpen] = useState(false);\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n return { open, setOpen };\n}\n","import { MutableRefObject, RefObject, useLayoutEffect } from \"react\";\n\ntype CursorTarget = {\n inputRef: RefObject<HTMLInputElement | null>;\n cursorRef: MutableRefObject<number | null>;\n};\n\n/** Restores cursor selection range on the active input after each render, then clears the stored position. */\nexport function useCursorRestore(targets: CursorTarget[]): void {\n useLayoutEffect(() => {\n for (const { inputRef, cursorRef } of targets) {\n const inputEl = inputRef.current;\n const cursor = cursorRef.current;\n\n if (cursor !== null && inputEl && document.activeElement === inputEl) {\n inputEl.setSelectionRange(cursor, cursor);\n cursorRef.current = null;\n }\n }\n });\n}\n","import { RefObject, useEffect } from \"react\";\n\n/** Calls onClose when a pointerdown occurs outside both the container ref and a popover element. */\nexport function useOutsideClickClose({\n enabled,\n containerRef,\n popoverElementId,\n onClose,\n}: {\n enabled: boolean;\n containerRef: RefObject<HTMLElement | null>;\n popoverElementId: string;\n onClose: () => void;\n}): void {\n useEffect(() => {\n if (!enabled) return;\n\n const handlePointerDown = (e: PointerEvent) => {\n const target = e.target as HTMLElement;\n if (containerRef.current?.contains(target)) return;\n\n const popoverEl = document.getElementById(popoverElementId);\n if (popoverEl?.contains(target)) return;\n\n onClose();\n };\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [enabled, containerRef, popoverElementId, onClose]);\n}\n","export interface MaskTemplate {\n pattern: string;\n hasAmPm: boolean;\n}\n\nconst FORMAT_CHARS = new Set([\"d\", \"M\", \"y\", \"H\", \"h\", \"m\", \"s\"]);\n\nconst DIGIT = /\\d/;\nconst AMPM_CHAR = /[APM]/;\nconst VALID_CHAR = /[\\dAPM]/i;\n\nconst isSlot = (ch: string) => ch === \"#\" || ch === \"@\";\n\nconst isValidChar = (ch: string, hasAmPm: boolean) =>\n DIGIT.test(ch) || (hasAmPm && AMPM_CHAR.test(ch));\n\n/**\n * Convert a display format string into a mask template.\n *\n * Format chars (d, M, y, H, h, m, s) → digit slots (#).\n * A or AA → two ampm letter slots (@@), since both render as \"AM\"/\"PM\".\n * Everything else → literal separators.\n *\n * Examples:\n * \"dd/MM/yyyy\" → \"##/##/####\"\n * \"hh:mm AA\" → \"##:## @@\"\n * \"hh:mm A\" → \"##:## @@\"\n */\nexport const buildMaskTemplate = (format: string): MaskTemplate => {\n let pattern = \"\";\n let hasAmPm = false;\n\n for (let i = 0; i < format.length; i++) {\n const char = format[i];\n if (FORMAT_CHARS.has(char)) {\n pattern += \"#\";\n } else if (char === \"A\") {\n pattern += \"@@\";\n hasAmPm = true;\n if (format[i + 1] === \"A\") i++;\n } else {\n pattern += char;\n }\n }\n\n return { pattern, hasAmPm };\n};\n\n/**\n * Build a range mask template: two single-date templates joined by \" - \".\n */\nexport const buildRangeMaskTemplate = (format: string): MaskTemplate => {\n const single = buildMaskTemplate(format);\n\n return {\n pattern: `${single.pattern} - ${single.pattern}`,\n hasAmPm: single.hasAmPm,\n };\n};\n\n// Tokens like MMM/MMMM produce textual output (month names), not digits.\nconst TEXTUAL_WHEN_LONG = new Set([\"M\", \"d\"]);\n\n/**\n * Check if a format string uses only fixed-width numeric tokens (dd, MM, yyyy, etc).\n * Returns false for single-char tokens (d, M) and textual tokens (MMM, MMMM).\n */\nexport const isFixedWidthFormat = (format: string): boolean => {\n let i = 0;\n while (i < format.length) {\n const char = format[i];\n if (!FORMAT_CHARS.has(char)) {\n i++;\n continue;\n }\n\n let count = 0;\n while (i + count < format.length && format[i + count] === char) count++;\n\n if (count === 1) return false;\n if (count >= 3 && TEXTUAL_WHEN_LONG.has(char)) return false;\n\n i += count;\n }\n\n return true;\n};\n\nconst findDeletionPoint = (prev: string, input: string): number => {\n for (let i = 0; i < prev.length; i++) {\n if (i >= input.length || input[i] !== prev[i]) return i;\n }\n\n return prev.length - 1;\n};\n\nconst hasDigitsAfter = (\n text: string,\n pos: number,\n pattern: string\n): boolean => {\n for (let i = pos + 1; i < text.length && i < pattern.length; i++) {\n if (isSlot(pattern[i]) && text[i] !== \"_\") return true;\n }\n\n return false;\n};\n\nconst countValidBefore = (\n text: string,\n pos: number,\n hasAmPm: boolean\n): number => {\n let count = 0;\n for (let i = 0; i < pos && i < text.length; i++) {\n if (isValidChar(text[i].toUpperCase(), hasAmPm)) count++;\n }\n\n return count;\n};\n\nconst extractWithPattern = (text: string, pattern: string): string[] => {\n const chars: string[] = [];\n const upper = text.toUpperCase();\n let pIdx = 0;\n\n for (let i = 0; i < upper.length; i++) {\n const ch = upper[i];\n while (pIdx < pattern.length && !isSlot(pattern[pIdx])) pIdx++;\n if (pIdx >= pattern.length) break;\n\n if (pattern[pIdx] === \"#\" && DIGIT.test(ch)) {\n chars.push(ch);\n pIdx++;\n } else if (pattern[pIdx] === \"@\" && AMPM_CHAR.test(ch)) {\n chars.push(ch);\n pIdx++;\n }\n }\n\n return chars;\n};\n\nconst rebuildFromChars = (validChars: string[], pattern: string): string => {\n let result = \"\";\n let charIdx = 0;\n\n for (let i = 0; i < pattern.length && charIdx < validChars.length; i++) {\n if (!isSlot(pattern[i])) continue;\n\n result += validChars[charIdx];\n charIdx++;\n\n let nextSlot = i + 1;\n while (nextSlot < pattern.length && !isSlot(pattern[nextSlot])) nextSlot++;\n\n const hasMoreChars = charIdx < validChars.length;\n const hasMoreSlots = nextSlot < pattern.length;\n\n if (hasMoreChars || hasMoreSlots) {\n for (let s = i + 1; s < nextSlot; s++) result += pattern[s];\n }\n\n if (hasMoreChars) i = nextSlot - 1;\n }\n\n return result;\n};\n\nconst stripTrailingSeparators = (text: string): string => {\n let end = text.length;\n while (end > 0 && !VALID_CHAR.test(text[end - 1])) end--;\n\n return text.slice(0, end);\n};\n\nconst cursorSlotToDisplayPos = (\n result: string,\n cursorSlot: number,\n pattern: string,\n skipSeparators: boolean\n): number => {\n if (cursorSlot <= 0) return 0;\n\n let slotsFound = 0;\n for (let i = 0; i < result.length; i++) {\n if (!VALID_CHAR.test(result[i])) continue;\n\n slotsFound++;\n if (slotsFound !== cursorSlot) continue;\n\n let pos = i + 1;\n if (skipSeparators) {\n while (\n pos < result.length &&\n pos < pattern.length &&\n !isSlot(pattern[pos])\n ) {\n pos++;\n }\n }\n\n return pos;\n }\n\n return result.length;\n};\n\nconst isValidForSlot = (ch: string, slotChar: string): boolean =>\n slotChar === \"#\"\n ? DIGIT.test(ch)\n : slotChar === \"@\"\n ? AMPM_CHAR.test(ch)\n : false;\n\n/**\n * Apply the mask template to raw input text.\n *\n * - Auto-inserts separators as the user types.\n * - When the mask is full, typing in the middle replaces the digit at cursor.\n * - Backspacing in the middle replaces the digit with '_' placeholder\n * instead of shifting subsequent digits.\n * - AM/PM auto-completes: typing \"A\" or \"P\" expands to \"AM\" or \"PM\".\n */\nexport const applyMask = (\n inputText: string,\n template: MaskTemplate,\n previousText = \"\",\n nativeCursorPos?: number | null\n): { text: string; cursorPosition: number } => {\n const { pattern, hasAmPm } = template;\n\n if (!inputText) return { text: \"\", cursorPosition: 0 };\n\n const isDeleting = inputText.length < previousText.length;\n\n // When backspacing from a full mask, replace the deleted digit with '_'\n // instead of shifting. This keeps other fields (day/month/year) intact.\n if (isDeleting && previousText.length >= pattern.length) {\n const delPos = findDeletionPoint(previousText, inputText);\n\n if (\n !hasDigitsAfter(previousText, delPos, pattern) ||\n delPos >= pattern.length\n ) {\n // Deletion at or near the end — fall through to normal rebuild\n } else if (isSlot(pattern[delPos])) {\n return {\n text:\n previousText.substring(0, delPos) +\n \"_\" +\n previousText.substring(delPos + 1),\n cursorPosition: delPos,\n };\n } else {\n // Separator deleted — restore it\n return { text: previousText, cursorPosition: delPos };\n }\n }\n\n const totalSlots = [...pattern].filter(isSlot).length;\n const slotPatternPositions = [...pattern].reduce<number[]>(\n (acc, ch, i) => (isSlot(ch) ? [...acc, i] : acc),\n []\n );\n\n const cursorInInput = nativeCursorPos ?? inputText.length;\n const cursorSlot = countValidBefore(inputText, cursorInInput, hasAmPm);\n const prevChars = extractWithPattern(previousText, pattern);\n let validChars: string[];\n\n // Replace mode: single char typed on a full mask replaces the digit at cursor.\n const isSingleCharInsert =\n !isDeleting &&\n prevChars.length >= totalSlots &&\n inputText.length - previousText.length === 1;\n\n if (isSingleCharInsert) {\n const insertSlot = cursorSlot - 1;\n const typedChar = inputText[cursorInInput - 1]?.toUpperCase() ?? \"\";\n const slotChar =\n slotPatternPositions[insertSlot] != null\n ? pattern[slotPatternPositions[insertSlot]]\n : null;\n\n if (!slotChar || !isValidForSlot(typedChar, slotChar)) {\n return {\n text: previousText,\n cursorPosition: Math.min(cursorInInput, previousText.length),\n };\n }\n\n validChars = [...prevChars];\n validChars[insertSlot] = typedChar;\n } else {\n validChars = extractWithPattern(inputText, pattern).slice(0, totalSlots);\n }\n\n let result = rebuildFromChars(validChars, pattern);\n\n if (isDeleting) {\n result = stripTrailingSeparators(result);\n }\n\n if (hasAmPm && !isDeleting) {\n const ampmStart = pattern.indexOf(\"@\");\n if (ampmStart >= 0 && result.length > ampmStart) {\n const ampmPortion = result.slice(ampmStart);\n if (ampmPortion === \"A\") result = result.slice(0, ampmStart) + \"AM\";\n else if (ampmPortion === \"P\") result = result.slice(0, ampmStart) + \"PM\";\n }\n }\n\n return {\n text: result,\n cursorPosition: cursorSlotToDisplayPos(\n result,\n cursorSlot,\n pattern,\n !isDeleting\n ),\n };\n};\n","import pureDayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat\";\nimport type { Dayjs } from \"dayjs\";\nimport { dayjs } from \"@bigbinary/neeto-commons-frontend/utils\";\n\nimport type { TimeValue } from \"./types\";\n\npureDayjs.extend(customParseFormat);\n\nexport const generateRange = (\n start: number,\n end: number,\n step = 1\n): number[] => {\n const result: number[] = [];\n for (let i = start; i <= end; i += step) {\n result.push(i);\n }\n\n return result;\n};\n\nexport const to12Hour = (\n hour24: number\n): { hour12: number; period: \"AM\" | \"PM\" } => {\n const period = hour24 >= 12 ? \"PM\" : \"AM\";\n const hour12 = hour24 % 12 || 12;\n\n return { hour12, period };\n};\n\nexport const to24Hour = (hour12: number, period: \"AM\" | \"PM\"): number => {\n if (period === \"AM\") {\n return hour12 === 12 ? 0 : hour12;\n }\n\n return hour12 === 12 ? 12 : hour12 + 12;\n};\n\nexport const dateToTimeValue = (date: Date): TimeValue => ({\n hours: date.getHours(),\n minutes: date.getMinutes(),\n seconds: date.getSeconds(),\n});\n\nexport const coerceToTimeValue = (\n value: TimeValue | Date | Dayjs | string | null | undefined\n): TimeValue | null => {\n if (!value) return null;\n if (value instanceof Date) return dateToTimeValue(value);\n\n if (typeof value === \"string\") {\n const parsed = dayjs(value);\n if (!parsed.isValid()) return null;\n\n return {\n hours: parsed.hour(),\n minutes: parsed.minute(),\n seconds: parsed.second(),\n };\n }\n\n const dayjsLike = value as {\n toDate?: () => Date;\n hour?: () => number;\n minute?: () => number;\n second?: () => number;\n };\n\n if (typeof dayjsLike.hour === \"function\") {\n return {\n hours: dayjsLike.hour!(),\n minutes: dayjsLike.minute!(),\n seconds: dayjsLike.second?.() ?? 0,\n };\n }\n\n if (typeof dayjsLike.toDate === \"function\") {\n return dateToTimeValue(dayjsLike.toDate());\n }\n\n const { hours, minutes, seconds } = value as TimeValue;\n\n if (typeof hours !== \"number\" || typeof minutes !== \"number\") return null;\n\n return { hours, minutes, seconds: seconds ?? 0 };\n};\n\nexport const timeValueEquals = (\n a: TimeValue | null,\n b: TimeValue | null\n): boolean => {\n if (a === null && b === null) return true;\n if (!a || !b) return false;\n\n return (\n a.hours === b.hours &&\n a.minutes === b.minutes &&\n (a.seconds ?? 0) === (b.seconds ?? 0)\n );\n};\n\nexport const getDefaultTimeMaskFormat = (\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (format === \"12\") return showSeconds ? \"hh:mm:ss AA\" : \"hh:mm AA\";\n\n return showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n};\n\nexport const getTimePlaceholder = (\n format: \"12\" | \"24\",\n showSeconds: boolean,\n displayFormat?: string\n): string => displayFormat ?? getDefaultTimeMaskFormat(format, showSeconds);\n\nexport const padNumber = (num: number, length = 2): string =>\n String(num).padStart(length, \"0\");\n\nexport const formatTimeDisplay = (\n time: TimeValue | null,\n format: \"12\" | \"24\",\n showSeconds: boolean\n): string => {\n if (!time) return \"\";\n\n if (format === \"12\") {\n const { hour12, period } = to12Hour(time.hours);\n const parts = [padNumber(hour12), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return `${parts.join(\":\")} ${period}`;\n }\n\n const parts = [padNumber(time.hours), padNumber(time.minutes)];\n if (showSeconds) parts.push(padNumber(time.seconds ?? 0));\n\n return parts.join(\":\");\n};\n\nexport const parseTimeString = (\n input: string,\n format: \"12\" | \"24\"\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n if (format === \"12\") {\n const match = trimmed.match(\n /^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?\\s*(AM|PM)$/i\n );\n if (!match) return null;\n\n const hour12 = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n const period = match[4].toUpperCase() as \"AM\" | \"PM\";\n\n if (hour12 < 1 || hour12 > 12 || minutes > 59 || seconds > 59) return null;\n\n return { hours: to24Hour(hour12, period), minutes, seconds };\n }\n\n const match = trimmed.match(/^(\\d{1,2}):(\\d{1,2})(?::(\\d{1,2}))?$/);\n if (!match) return null;\n\n const hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const seconds = match[3] ? parseInt(match[3], 10) : 0;\n\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n\n return { hours, minutes, seconds };\n};\n\n/**\n * Format a TimeValue using a dayjs-style format string (e.g. \"h:mm A\").\n */\nexport const formatTimeWithPattern = (\n time: TimeValue | null,\n pattern: string\n): string => {\n if (!time) return \"\";\n\n return pureDayjs(\"2000-01-01T00:00:00\")\n .hour(time.hours)\n .minute(time.minutes)\n .second(time.seconds ?? 0)\n .format(pattern);\n};\n\n/**\n * Parse a time string against a dayjs-style format pattern.\n * Returns null if the string does not match the pattern.\n */\nexport const parseTimeWithPattern = (\n input: string,\n pattern: string\n): TimeValue | null => {\n const trimmed = input.trim();\n if (!trimmed) return null;\n\n const parsed = pureDayjs(trimmed, pattern, true);\n if (!parsed.isValid()) return null;\n\n return {\n hours: parsed.hour(),\n minutes: parsed.minute(),\n seconds: parsed.second(),\n };\n};\n\n/**\n * Convert TimeValue to a timezone-aware Dayjs.\n * Formats in browser-local time, then reparses through timezone-aware dayjs.\n */\nexport const timeValueToDayjs = (time: TimeValue): Dayjs => {\n const h = padNumber(time.hours);\n const m = padNumber(time.minutes);\n const s = padNumber(time.seconds ?? 0);\n const today = dayjs(new Date()).format(\"YYYY-MM-DD\");\n\n return dayjs(`${today} ${h}:${m}:${s}`);\n};\n"],"names":["createLucideIcon","useState","useCallback","useLayoutEffect","useEffect","pureDayjs","customParseFormat","dayjs","parts","match","minutes","seconds"],"mappings":"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","x_google_ignoreList":[0]}
@@ -5,6 +5,7 @@ interface DatePickerFooterProps {
5
5
  timezone?: string;
6
6
  onTimezoneChange?: (tz: string | undefined) => void;
7
7
  nowDisabled?: boolean;
8
+ showNow?: boolean;
8
9
  onNow: () => void;
9
10
  onOk: () => void;
10
11
  okLabel?: string;
@@ -13,6 +13,7 @@ interface RangeCalendarProps {
13
13
  onHoverIn: (e: React.MouseEvent<HTMLElement>) => void;
14
14
  onHoverOut: () => void;
15
15
  numberOfMonths?: number;
16
+ className?: string;
16
17
  }
17
- export declare const RangeCalendar: ({ todayDate, weekStartsOn, month, onMonthChange, selected, onSelect, disabled, startMonth, endMonth, onHoverIn, onHoverOut, numberOfMonths, }: RangeCalendarProps) => import("react/jsx-runtime").JSX.Element;
18
+ export declare const RangeCalendar: ({ todayDate, weekStartsOn, month, onMonthChange, selected, onSelect, disabled, startMonth, endMonth, onHoverIn, onHoverOut, numberOfMonths, className, }: RangeCalendarProps) => import("react/jsx-runtime").JSX.Element;
18
19
  export {};
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import type { TimeValue } from "../TimePicker/types";
3
+ import { type SegmentedTimeError } from "./segmentedTime";
4
+ interface SegmentedTimeInputProps {
5
+ value: TimeValue;
6
+ /** Minute increment; minutes snap to it. Omit to take minutes as typed. */
7
+ minuteStep?: number;
8
+ onChange: (value: TimeValue) => void;
9
+ /** Reports why the field can't produce a time yet, or null once it can. */
10
+ onErrorChange: (error: SegmentedTimeError | null) => void;
11
+ invalid?: boolean;
12
+ disabled?: boolean;
13
+ autoFocus?: boolean;
14
+ "aria-describedby"?: string;
15
+ }
16
+ declare const SegmentedTimeInput: React.FC<SegmentedTimeInputProps>;
17
+ export { SegmentedTimeInput };
@@ -0,0 +1,22 @@
1
+ import React from "react";
2
+ import type { TimeValue } from "../TimePicker/types";
3
+ interface TimeSectionProps {
4
+ value: TimeValue;
5
+ /** Minute increment; also shows the hint naming it. Omit for any minute. */
6
+ minuteStep?: number;
7
+ onChange: (value: TimeValue) => void;
8
+ /** Reports whether the typed time is incomplete, so OK can refuse it. */
9
+ onErrorChange: (hasError: boolean) => void;
10
+ /** Show the error even before OK is retried, e.g. right after OK. */
11
+ showError: boolean;
12
+ /** Shows the "Add time" switch; without it the time is always on. */
13
+ optional: boolean;
14
+ hasTime: boolean;
15
+ onHasTimeChange: (hasTime: boolean) => void;
16
+ /** e.g. "India Standard Time (UTC+5:30)"; hidden when null. */
17
+ timezoneLabel: string | null;
18
+ disabled?: boolean;
19
+ className?: string;
20
+ }
21
+ declare const TimeSection: React.FC<TimeSectionProps>;
22
+ export { TimeSection };
@@ -1,6 +1,6 @@
1
1
  import type { TimeValue } from "../TimePicker/types";
2
2
  export declare const DEFAULT_DATE_FORMAT = "dd/MM/yyyy";
3
- export declare const DEFAULT_TIME_FORMAT = "HH:mm:ss";
3
+ export declare const DEFAULT_TIME_FORMAT = "hh:mm A";
4
4
  export declare const CALENDAR_NAVIGATION_YEAR_RANGE = 100;
5
5
  export declare const INITIAL_TIME_VALUE: TimeValue;
6
6
  export declare const SIZE_CONFIG: {
@@ -0,0 +1,58 @@
1
+ import type { TimeValue } from "../TimePicker/types";
2
+ /**
3
+ * State for the segmented time field: one input that reads "1:35 PM" but is
4
+ * typed in three parts. Every function here is pure and returns a new state.
5
+ *
6
+ * `step` is the minute increment (e.g. 5): typed and loaded minutes snap to
7
+ * it, and the arrow keys move by it. 1, the default, leaves minutes as typed.
8
+ *
9
+ * - `text`: what has been typed into the part so far.
10
+ * - `done`: the part is complete; typing into it again starts it over.
11
+ * - `auto`: the field filled the value in itself (e.g. "6" → "05"), so one
12
+ * Backspace removes it whole.
13
+ */
14
+ export interface TimeSegment {
15
+ text: string;
16
+ done: boolean;
17
+ auto: boolean;
18
+ }
19
+ export type SegmentKey = "hour" | "minute" | "period";
20
+ export type SegmentIndex = 0 | 1 | 2;
21
+ export interface SegmentedTime {
22
+ hour: TimeSegment;
23
+ minute: TimeSegment;
24
+ period: TimeSegment;
25
+ active: SegmentIndex;
26
+ }
27
+ export type SegmentedTimeError = "timeRequired" | "hourRequired" | "minuteRequired" | "periodRequired";
28
+ export declare const SEGMENT_KEYS: SegmentKey[];
29
+ /**
30
+ * Rounds minutes to the nearest step, staying within the hour. With step 5:
31
+ * 27 → "25", 28 → "30", 58 → "55". With step 1 they are only padded.
32
+ */
33
+ export declare const snapMinute: (minutes: number | string, step?: number) => string;
34
+ export declare const emptySegmentedTime: () => SegmentedTime;
35
+ export declare const segmentedTimeFromValue: (value: TimeValue, step?: number) => SegmentedTime;
36
+ export declare const isSegmentedTimeEmpty: (state: SegmentedTime) => boolean;
37
+ export declare const getSegmentedTimeError: (state: SegmentedTime) => SegmentedTimeError | null;
38
+ /** The time as a value, or null while the field is incomplete. */
39
+ export declare const segmentedTimeToValue: (state: SegmentedTime) => TimeValue | null;
40
+ export declare const finishActiveSegment: (state: SegmentedTime, step?: number) => SegmentedTime;
41
+ export declare const focusSegment: (state: SegmentedTime, index: number, step?: number) => SegmentedTime;
42
+ /** Clicking empty space in the field lands on the first empty part. */
43
+ export declare const focusFirstEmptySegment: (state: SegmentedTime) => SegmentedTime;
44
+ export declare const nextSegment: (state: SegmentedTime, step?: number) => SegmentedTime;
45
+ export declare const previousSegment: (state: SegmentedTime) => SegmentedTime;
46
+ /**
47
+ * Auto-advance rule: move on as soon as the next key could not extend the
48
+ * current part. "1" waits because 10–12 are still possible; "3" does not.
49
+ */
50
+ export declare const typeDigit: (state: SegmentedTime, digit: string, step?: number) => SegmentedTime;
51
+ export declare const typePeriod: (state: SegmentedTime, letter: "a" | "p", step?: number) => SegmentedTime;
52
+ export declare const togglePeriod: (state: SegmentedTime) => SegmentedTime;
53
+ /** Hour ±1 (wrapping 12 → 1), minutes ± one step on its grid, AM/PM flips. */
54
+ export declare const stepSegment: (state: SegmentedTime, direction: 1 | -1, step?: number) => SegmentedTime;
55
+ /** Deletes right to left across parts, like Backspace in one text input. */
56
+ export declare const backspace: (state: SegmentedTime) => SegmentedTime;
57
+ /** Accepts "1:35 pm", "1:35PM", "13:35" and "1335"; null when it doesn't parse. */
58
+ export declare const parsePastedTime: (text: string, step?: number) => TimeValue | null;