@bigbinary/neeto-atoms 1.0.37 → 1.0.38

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 (28) hide show
  1. package/dist/{DatePicker-CCN3b1oz.js → DatePicker-IrQUHqdL.js} +89 -22
  2. package/dist/{DatePicker-CCN3b1oz.js.map → DatePicker-IrQUHqdL.js.map} +1 -1
  3. package/dist/{TimePicker-wPi2k6Z8.js → TimePicker-BzlF3JWj.js} +43 -29
  4. package/dist/TimePicker-BzlF3JWj.js.map +1 -0
  5. package/dist/{TimePickerPanel-DAhz3B2d.js → TimePickerPanel-CgEbjExH.js} +200 -2
  6. package/dist/TimePickerPanel-CgEbjExH.js.map +1 -0
  7. package/dist/cjs/{DatePicker-DRQubO2h.js → DatePicker-DdTclP8E.js} +88 -21
  8. package/dist/cjs/{DatePicker-DRQubO2h.js.map → DatePicker-DdTclP8E.js.map} +1 -1
  9. package/dist/cjs/{TimePicker-BG_vYH3r.js → TimePicker-Cwwa1DD8.js} +42 -28
  10. package/dist/cjs/TimePicker-Cwwa1DD8.js.map +1 -0
  11. package/dist/cjs/{TimePickerPanel-6xA-hjhm.js → TimePickerPanel-CAdLD7qW.js} +204 -3
  12. package/dist/cjs/TimePickerPanel-CAdLD7qW.js.map +1 -0
  13. package/dist/cjs/components/DatePicker.js +2 -2
  14. package/dist/cjs/components/TimePicker.js +2 -2
  15. package/dist/cjs/components/index.js +3 -3
  16. package/dist/cjs/index.js +3 -3
  17. package/dist/components/DatePicker/utils.d.ts +4 -0
  18. package/dist/components/DatePicker.js +2 -2
  19. package/dist/components/TimePicker/utils.d.ts +1 -0
  20. package/dist/components/TimePicker.js +2 -2
  21. package/dist/components/index.js +3 -3
  22. package/dist/index.js +3 -3
  23. package/dist/utils/inputMask.d.ts +38 -0
  24. package/package.json +1 -1
  25. package/dist/TimePicker-wPi2k6Z8.js.map +0 -1
  26. package/dist/TimePickerPanel-DAhz3B2d.js.map +0 -1
  27. package/dist/cjs/TimePicker-BG_vYH3r.js.map +0 -1
  28. package/dist/cjs/TimePickerPanel-6xA-hjhm.js.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { forwardRef, useId, useRef, useState, useCallback, useEffect } from 'react';
2
+ import { forwardRef, useId, useRef, useState, useMemo, useCallback, useEffect, useLayoutEffect } from 'react';
3
3
  import { g as getDefaultOptions$1, t as toDate, c as constructFrom, m as millisecondsInHour, b as millisecondsInMinute, d as millisecondsInSecond, e as getWeekYear, s as startOfWeek, f as startOfISOWeek, h as getWeek, i as getISOWeek, j as addDays, k as getTimezoneOffsetInMilliseconds, l as enUS, n as longFormatters, o as isProtectedWeekYearToken, w as warnOrThrowProtectedError, p as isProtectedDayOfYearToken, q as format, C as Calendar$1 } from './Calendar-CjOBwDbx.js';
4
4
  import { Popover, PopoverAnchor, PopoverContent } from './primitives/Popover.js';
5
5
  import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from './primitives/Field.js';
6
6
  import { c as cn } from './utils-BJnb9o5c.js';
7
+ import { i as isFixedWidthFormat, c as buildRangeMaskTemplate, b as buildMaskTemplate, d as dateToTimeValue, T as TimePickerPanel, a as applyMask } from './TimePickerPanel-CgEbjExH.js';
7
8
  import { Button } from './primitives/Button.js';
8
- import { d as dateToTimeValue, T as TimePickerPanel } from './TimePickerPanel-DAhz3B2d.js';
9
9
  import { c as createLucideIcon } from './createLucideIcon-C8ycilSN.js';
10
10
  import { X } from './x-_o2T3n6D.js';
11
11
 
@@ -2714,6 +2714,16 @@ const applyTimeToDate = (date, time) => {
2714
2714
  return result;
2715
2715
  };
2716
2716
  const getDisplayFormat = (dateFormat, timeFormat, showTime) => showTime ? `${dateFormat} ${timeFormat}` : dateFormat;
2717
+ const isDatePartComplete = (part, maskEnabled, singleDateLen) => maskEnabled ? part.length >= singleDateLen : part.length > 0;
2718
+ const parseRangeText = (text, displayFormat, maskEnabled, singleDateLen) => {
2719
+ const parts = text.split(" - ");
2720
+ if (parts.length !== 2) return null;
2721
+ if (!isDatePartComplete(parts[0], maskEnabled, singleDateLen) || !isDatePartComplete(parts[1], maskEnabled, singleDateLen))
2722
+ return null;
2723
+ const from = parseDate(parts[0], displayFormat);
2724
+ const to = parseDate(parts[1], displayFormat);
2725
+ return from && to ? [from, to] : null;
2726
+ };
2717
2727
 
2718
2728
  const TIMEZONE_OPTIONS = [
2719
2729
  { label: "Local", value: "" },
@@ -2809,6 +2819,8 @@ const DatePicker = forwardRef(
2809
2819
  const errorId = `error_${generatedId}`;
2810
2820
  const helpTextId = `helpText_${generatedId}`;
2811
2821
  const containerRef = useRef(null);
2822
+ const inputRef = useRef(null);
2823
+ const cursorPosRef = useRef(null);
2812
2824
  const popoverContentId = useRef(
2813
2825
  `datepicker-popover-${generatedId}`
2814
2826
  ).current;
@@ -2829,7 +2841,13 @@ const DatePicker = forwardRef(
2829
2841
  });
2830
2842
  const displayFormat = getDisplayFormat(dateFormat, timeFormat, showTime);
2831
2843
  const sizeConfig = SIZE_CONFIG[size];
2832
- const defaultPlaceholder = showTime ? `${dateFormat.toUpperCase()} ${timeFormat}` : dateFormat.toUpperCase();
2844
+ const maskEnabled = isFixedWidthFormat(displayFormat);
2845
+ const maskTemplate = useMemo(
2846
+ () => maskEnabled ? type === "range" ? buildRangeMaskTemplate(displayFormat) : buildMaskTemplate(displayFormat) : null,
2847
+ [displayFormat, type, maskEnabled]
2848
+ );
2849
+ const singlePlaceholder = showTime ? `${dateFormat.toUpperCase()} ${timeFormat}` : dateFormat.toUpperCase();
2850
+ const defaultPlaceholder = type === "range" ? `${singlePlaceholder} - ${singlePlaceholder}` : singlePlaceholder;
2833
2851
  const getDisplayText = useCallback(() => {
2834
2852
  if (type === "range") {
2835
2853
  const rangeValue = currentValue;
@@ -2954,32 +2972,79 @@ const DatePicker = forwardRef(
2954
2972
  e.preventDefault();
2955
2973
  commitValue(null);
2956
2974
  };
2975
+ useLayoutEffect(() => {
2976
+ if (cursorPosRef.current !== null && inputRef.current && document.activeElement === inputRef.current) {
2977
+ inputRef.current.setSelectionRange(
2978
+ cursorPosRef.current,
2979
+ cursorPosRef.current
2980
+ );
2981
+ cursorPosRef.current = null;
2982
+ }
2983
+ });
2984
+ const singleDateLen = useMemo(
2985
+ () => buildMaskTemplate(displayFormat).pattern.length,
2986
+ [displayFormat]
2987
+ );
2988
+ const parseAndApplyRange = (text) => {
2989
+ const parts = text.split(" - ");
2990
+ if (!isDatePartComplete(parts[0] ?? "", maskEnabled, singleDateLen))
2991
+ return;
2992
+ const from = parseDate(parts[0], displayFormat);
2993
+ if (from) setCalendarMonth(from);
2994
+ const range = parseRangeText(
2995
+ text,
2996
+ displayFormat,
2997
+ maskEnabled,
2998
+ singleDateLen
2999
+ );
3000
+ if (range) setInternalValue(range);
3001
+ };
2957
3002
  const handleInputChange = (e) => {
2958
- const text = e.target.value;
3003
+ let text = e.target.value;
3004
+ if (maskTemplate) {
3005
+ const masked = applyMask(
3006
+ text,
3007
+ maskTemplate,
3008
+ inputText,
3009
+ e.target.selectionStart
3010
+ );
3011
+ text = masked.text;
3012
+ cursorPosRef.current = masked.cursorPosition;
3013
+ }
2959
3014
  setInputText(text);
2960
- if (type === "range") return;
3015
+ if (type === "range") {
3016
+ parseAndApplyRange(text);
3017
+ return;
3018
+ }
3019
+ const isComplete = maskTemplate ? text.length >= maskTemplate.pattern.length : true;
3020
+ if (!isComplete) return;
2961
3021
  const parsed = parseDate(text, displayFormat);
2962
- if (parsed) {
2963
- setCalendarMonth(parsed);
2964
- if (showTime || needConfirm) {
2965
- setPendingDate(parsed);
2966
- setPendingTime(dateToTimeValue(parsed));
2967
- } else {
2968
- setInternalValue(parsed);
2969
- }
3022
+ if (!parsed) return;
3023
+ setCalendarMonth(parsed);
3024
+ if (showTime || needConfirm) {
3025
+ setPendingDate(parsed);
3026
+ setPendingTime(dateToTimeValue(parsed));
3027
+ } else {
3028
+ setInternalValue(parsed);
2970
3029
  }
2971
3030
  };
2972
3031
  const handleInputKeyDown = (e) => {
2973
- if (e.key === "Enter" && type !== "range") {
3032
+ if (e.key === "Escape") return closePopover();
3033
+ if (e.key !== "Enter") return;
3034
+ if (type === "range") {
3035
+ const range = parseRangeText(
3036
+ inputText,
3037
+ displayFormat,
3038
+ maskEnabled,
3039
+ singleDateLen
3040
+ );
3041
+ if (range) commitValue(range);
3042
+ } else {
2974
3043
  const parsed = parseDate(inputText, displayFormat);
2975
- if (parsed) {
2976
- commitValue(parsed);
2977
- }
2978
- setOpen(false);
2979
- onOpenChange?.(false);
2980
- } else if (e.key === "Escape") {
2981
- closePopover();
3044
+ if (parsed) commitValue(parsed);
2982
3045
  }
3046
+ setOpen(false);
3047
+ onOpenChange?.(false);
2983
3048
  };
2984
3049
  const handleInputFocus = () => {
2985
3050
  if (!open) openPopover();
@@ -3024,6 +3089,7 @@ const DatePicker = forwardRef(
3024
3089
  /* @__PURE__ */ jsx(
3025
3090
  "input",
3026
3091
  {
3092
+ ref: inputRef,
3027
3093
  type: "text",
3028
3094
  disabled,
3029
3095
  "aria-label": label || "Pick a date",
@@ -3091,6 +3157,7 @@ const DatePicker = forwardRef(
3091
3157
  mode: "range",
3092
3158
  numberOfMonths: 2,
3093
3159
  captionLayout: "dropdown",
3160
+ className: "[&_[data-outside][data-selected=true]]:!bg-transparent [&_[data-outside][data-selected=true]]:after:!bg-transparent [&_[data-outside]_button]:!bg-transparent [&_[data-outside]_button]:!text-muted-foreground",
3094
3161
  month: calendarMonth,
3095
3162
  onMonthChange: setCalendarMonth,
3096
3163
  selected: currentValue ? {
@@ -3163,4 +3230,4 @@ const DatePicker = forwardRef(
3163
3230
  DatePicker.displayName = "DatePicker";
3164
3231
 
3165
3232
  export { DatePicker as D };
3166
- //# sourceMappingURL=DatePicker-CCN3b1oz.js.map
3233
+ //# sourceMappingURL=DatePicker-IrQUHqdL.js.map