@vkontakte/vkui 7.7.1 → 7.8.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 (77) hide show
  1. package/dist/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  2. package/dist/components/CalendarHeader/CalendarHeader.js +1 -1
  3. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  4. package/dist/components/DateInput/DateInput.d.ts +1 -1
  5. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  6. package/dist/components/DateInput/DateInput.js +9 -5
  7. package/dist/components/DateInput/DateInput.js.map +1 -1
  8. package/dist/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  9. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  10. package/dist/components/DateRangeInput/DateRangeInput.js +11 -7
  11. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  12. package/dist/components/ModalCard/ModalCardInternal.d.ts +1 -1
  13. package/dist/components/ModalCard/ModalCardInternal.d.ts.map +1 -1
  14. package/dist/components/ModalCard/ModalCardInternal.js +9 -3
  15. package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
  16. package/dist/components/ModalCard/types.d.ts +9 -1
  17. package/dist/components/ModalCard/types.d.ts.map +1 -1
  18. package/dist/components/ModalCard/types.js.map +1 -1
  19. package/dist/components/ModalOverlay/ModalOverlay.d.ts +3 -1
  20. package/dist/components/ModalOverlay/ModalOverlay.d.ts.map +1 -1
  21. package/dist/components/ModalOverlay/ModalOverlay.js +7 -3
  22. package/dist/components/ModalOverlay/ModalOverlay.js.map +1 -1
  23. package/dist/components/ModalPage/ModalPageInternal.d.ts +1 -1
  24. package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
  25. package/dist/components/ModalPage/ModalPageInternal.js +9 -3
  26. package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
  27. package/dist/components/ModalPage/types.d.ts +9 -1
  28. package/dist/components/ModalPage/types.d.ts.map +1 -1
  29. package/dist/components/ModalPage/types.js.map +1 -1
  30. package/dist/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.d.ts +1 -1
  31. package/dist/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.d.ts.map +1 -1
  32. package/dist/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.js +4 -2
  33. package/dist/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.js.map +1 -1
  34. package/dist/components/Popper/Popper.d.ts +5 -1
  35. package/dist/components/Popper/Popper.d.ts.map +1 -1
  36. package/dist/components/Popper/Popper.js +4 -2
  37. package/dist/components/Popper/Popper.js.map +1 -1
  38. package/dist/components.css +1 -1
  39. package/dist/components.css.map +1 -1
  40. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +1 -1
  41. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  42. package/dist/cssm/components/DateInput/DateInput.js +7 -4
  43. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  44. package/dist/cssm/components/DateInput/DateInput.module.css +11 -4
  45. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +9 -7
  46. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  47. package/dist/cssm/components/ModalCard/ModalCardInternal.js +6 -2
  48. package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
  49. package/dist/cssm/components/ModalCard/types.js.map +1 -1
  50. package/dist/cssm/components/ModalOverlay/ModalOverlay.js +4 -2
  51. package/dist/cssm/components/ModalOverlay/ModalOverlay.js.map +1 -1
  52. package/dist/cssm/components/ModalPage/ModalPageInternal.js +6 -2
  53. package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
  54. package/dist/cssm/components/ModalPage/types.js.map +1 -1
  55. package/dist/cssm/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.js +1 -1
  56. package/dist/cssm/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.js.map +1 -1
  57. package/dist/cssm/components/Popper/Popper.js +3 -2
  58. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  59. package/dist/vkui.css +1 -1
  60. package/dist/vkui.css.map +1 -1
  61. package/package.json +4 -3
  62. package/src/components/CalendarHeader/CalendarHeader.tsx +5 -1
  63. package/src/components/DateInput/DateInput.module.css +11 -3
  64. package/src/components/DateInput/DateInput.module.css.d.ts.map +1 -1
  65. package/src/components/DateInput/DateInput.tsx +13 -3
  66. package/src/components/DateRangeInput/DateRangeInput.tsx +15 -6
  67. package/src/components/ModalCard/ModalCardInternal.tsx +7 -1
  68. package/src/components/ModalCard/types.ts +9 -1
  69. package/src/components/ModalOverlay/ModalOverlay.tsx +7 -1
  70. package/src/components/ModalPage/ModalPageInternal.tsx +7 -1
  71. package/src/components/ModalPage/types.ts +9 -1
  72. package/src/components/ModalRoot/VisuallyHiddenModalOverlay/VisuallyHiddenModalOverlay.tsx +2 -0
  73. package/src/components/Popper/Popper.tsx +6 -0
  74. package/src/lib/floating/useFloatingWithInteractions/__snapshots__/useFloatingWithInteractions.test.tsx.snap +6 -6
  75. package/dist/cssm/components/DateRangeInput/DateRangeInput.module.css +0 -24
  76. package/src/components/DateRangeInput/DateRangeInput.module.css +0 -20
  77. package/src/components/DateRangeInput/DateRangeInput.module.css.d.ts.map +0 -1
@@ -138,7 +138,7 @@ export const CalendarHeader = ({ viewDate, onChange, prevMonthHidden: prevMonthH
138
138
  forceDropdownPortal: false,
139
139
  selectType: "accent",
140
140
  "aria-label": changeYearLabel,
141
- "data-testid": yearDropdownTestId,
141
+ "data-testid": typeof yearDropdownTestId === 'string' ? yearDropdownTestId : yearDropdownTestId?.(currentYear),
142
142
  onInputKeyDown: stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen
143
143
  })
144
144
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CalendarHeader/CalendarHeader.tsx"],"sourcesContent":["'use client';\n\nimport { type ChangeEvent } from 'react';\nimport * as React from 'react';\nimport {\n Icon12Dropdown,\n Icon20ChevronLeftOutline,\n Icon20ChevronRightOutline,\n} from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, getMonths, getYears } from '../../lib/calendar';\nimport { addMonths, setMonth, setYear, subMonths } from '../../lib/date';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { CustomSelect, type SelectProps } from '../CustomSelect/CustomSelect';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CalendarHeader.module.css';\n\ntype ArrowMonthProps = Omit<React.AllHTMLAttributes<HTMLElement>, 'onClick' | 'aria-label'>;\n\nexport type CalendarHeaderTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора месяца в заголовке календаря.\n */\n monthDropdownTestId?: string | ((monthIndex: number) => string);\n /**\n * Передает атрибут `data-testid` для дропдауна выбора года в заголовке календаря.\n */\n yearDropdownTestId?: string | ((year: number) => string);\n /**\n * Передает атрибут `data-testid` для кнопки перехода к следующему месяцу в заголовке календаря.\n */\n nextMonthButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки перехода к предыдущему месяцу в заголовке календаря.\n */\n prevMonthButtonTestId?: string;\n};\n\nexport interface CalendarHeaderProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n CalendarHeaderTestsProps {\n /**\n * Отображаемая дата.\n */\n viewDate: Date;\n /**\n * Скрывает иконку для переключения на предыдущий месяц.\n */\n prevMonthHidden?: boolean;\n /**\n * Скрывает иконку для переключения на следующий месяц.\n */\n nextMonthHidden?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для кнопки предыдущего месяца.\n */\n prevMonthLabel?: string;\n /**\n * `aria-label` для кнопки следующего месяца.\n */\n nextMonthLabel?: string;\n /**\n * `aria-label` для селектора месяца.\n */\n changeMonthLabel?: string;\n /**\n * `aria-label` для селектора года.\n */\n changeYearLabel?: string;\n /**\n * Кастомная иконка для кнопки предыдущего месяца.\n */\n prevMonthIcon?: React.ReactNode;\n /**\n * Кастомная иконка для кнопки следующего месяца.\n */\n nextMonthIcon?: React.ReactNode;\n /**\n * Дополнительные свойства для кнопки предыдущего месяца.\n */\n prevMonthProps?: ArrowMonthProps;\n /**\n * Дополнительные свойства для кнопки следующего месяца.\n */\n nextMonthProps?: ArrowMonthProps;\n /**\n * Функция для проверки блокировки месяца.\n */\n isMonthDisabled?: (monthNumber: number, year?: number) => boolean;\n /**\n * Функция для проверки блокировки года.\n */\n isYearDisabled?: (yearNumber: number) => boolean;\n /**\n * Обработчик изменения отображаемой даты.\n */\n onChange: (viewDate: Date) => void;\n /**\n * Нажатие на кнопку переключения на следующий месяц.\n */\n onNextMonth?: () => void;\n /**\n * Нажатие на кнопку переключения на предыдущий месяц.\n */\n onPrevMonth?: () => void;\n}\n\nexport const CalendarHeader = ({\n viewDate,\n onChange,\n prevMonthHidden: prevMonthHiddenProp = false,\n nextMonthHidden: nextMonthHiddenProp = false,\n disablePickers = false,\n onNextMonth,\n onPrevMonth,\n prevMonthProps = {},\n nextMonthProps = {},\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n prevMonthIcon = (\n <Icon20ChevronLeftOutline className={styles.navIconAccent} width={30} height={30} />\n ),\n nextMonthIcon = (\n <Icon20ChevronRightOutline className={styles.navIconAccent} width={30} height={30} />\n ),\n isMonthDisabled,\n isYearDisabled,\n monthDropdownTestId,\n yearDropdownTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n ...restProps\n}: CalendarHeaderProps): React.ReactNode => {\n const { locale, direction } = useConfigProvider();\n\n const onMonthsChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange(setMonth(viewDate, Number(newValue))),\n [onChange, viewDate],\n );\n const onYearChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange(setYear(viewDate, Number(newValue))),\n [onChange, viewDate],\n );\n\n const currentYear = viewDate.getFullYear();\n const currentMonth = viewDate.getMonth();\n\n const months = React.useMemo(\n () =>\n getMonths(locale).map(({ value, label }) => ({\n value,\n label: <span className={styles.month}>{label}</span>,\n disabled: isMonthDisabled && isMonthDisabled(value),\n })),\n [locale, isMonthDisabled],\n );\n\n const years = React.useMemo(\n () =>\n getYears(currentYear, 100).map((year) => ({\n ...year,\n disabled: isYearDisabled && isYearDisabled(year.value),\n })),\n [currentYear, isYearDisabled],\n );\n\n const formatter = new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n });\n\n const { className: prevMonthClassName, ...restPrevMonthProps } = prevMonthProps;\n const { className: nextMonthClassName, ...restNextMonthProps } = nextMonthProps;\n\n let nextMonthHidden =\n nextMonthHiddenProp || (currentMonth === 11 && currentYear === DEFAULT_MAX_YEAR);\n if (isMonthDisabled && !nextMonthHidden) {\n nextMonthHidden = isMonthDisabled(\n currentMonth === 11 ? 0 : currentMonth + 1,\n currentMonth === 11 ? Math.min(currentYear + 1, DEFAULT_MAX_YEAR) : currentYear,\n );\n }\n\n let prevMonthHidden =\n prevMonthHiddenProp || (currentMonth === 0 && currentYear === DEFAULT_MIN_YEAR);\n if (isMonthDisabled && !prevMonthHidden) {\n prevMonthHidden = isMonthDisabled(\n currentMonth === 0 ? 11 : currentMonth - 1,\n currentMonth === 0 ? Math.max(currentYear - 1, DEFAULT_MIN_YEAR) : currentYear,\n );\n }\n\n const stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen = React.useCallback(\n (event: React.KeyboardEvent, isOpen: boolean) => {\n if (isOpen && event.key === 'Escape') {\n event.stopPropagation();\n }\n },\n [],\n );\n\n return (\n <RootComponent baseClassName={styles.host} {...restProps}>\n {!prevMonthHidden && (\n <AdaptivityProvider sizeX=\"regular\">\n <Tappable\n baseClassName={classNames(styles.navIcon, styles.navIconPrev, prevMonthClassName)}\n onClick={onPrevMonth}\n data-testid={prevMonthButtonTestId}\n {...restPrevMonthProps}\n >\n <VisuallyHidden>\n {prevMonthLabel}, {formatter.format(subMonths(viewDate, 1))}\n </VisuallyHidden>\n {direction === 'ltr' ? prevMonthIcon : nextMonthIcon}\n </Tappable>\n </AdaptivityProvider>\n )}\n {disablePickers ? (\n <Paragraph\n className={classNames(styles.pickers, 'vkuiInternalCalendarHeader__pickers')}\n weight=\"2\"\n >\n <span className={styles.month}>\n {new Intl.DateTimeFormat(locale, {\n month: 'long',\n }).format(viewDate)}\n </span>\n &nbsp;\n {new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n }).format(viewDate)}\n </Paragraph>\n ) : (\n <AdaptivityProvider sizeY=\"compact\">\n <div className={classNames(styles.pickers, 'vkuiInternalCalendarHeader__pickers')}>\n <CustomSelect\n className={classNames(styles.picker, 'vkuiInternalCalendarHeader__picker')}\n value={currentMonth}\n options={months}\n dropdownOffsetDistance={4}\n dropdownAutoWidth\n icon={<Icon12Dropdown />}\n onChange={onMonthsChange}\n forceDropdownPortal={false}\n selectType=\"accent\"\n aria-label={changeMonthLabel}\n data-testid={\n typeof monthDropdownTestId === 'string'\n ? monthDropdownTestId\n : monthDropdownTestId?.(currentMonth)\n }\n onInputKeyDown={stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen}\n />\n <CustomSelect\n className={classNames(styles.picker, 'vkuiInternalCalendarHeader__picker')}\n value={currentYear}\n options={years}\n dropdownOffsetDistance={4}\n dropdownAutoWidth\n icon={<Icon12Dropdown />}\n onChange={onYearChange}\n forceDropdownPortal={false}\n selectType=\"accent\"\n aria-label={changeYearLabel}\n data-testid={yearDropdownTestId}\n onInputKeyDown={stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen}\n />\n </div>\n </AdaptivityProvider>\n )}\n {!nextMonthHidden && (\n <AdaptivityProvider sizeX=\"regular\">\n <Tappable\n baseClassName={classNames(styles.navIcon, styles.navIconNext, nextMonthClassName)}\n onClick={onNextMonth}\n data-testid={nextMonthButtonTestId}\n {...restNextMonthProps}\n >\n <VisuallyHidden>\n {nextMonthLabel}, {formatter.format(addMonths(viewDate, 1))}\n </VisuallyHidden>\n {direction === 'ltr' ? nextMonthIcon : prevMonthIcon}\n </Tappable>\n </AdaptivityProvider>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","Icon12Dropdown","Icon20ChevronLeftOutline","Icon20ChevronRightOutline","classNames","DEFAULT_MAX_YEAR","DEFAULT_MIN_YEAR","getMonths","getYears","addMonths","setMonth","setYear","subMonths","AdaptivityProvider","useConfigProvider","CustomSelect","RootComponent","Tappable","Paragraph","VisuallyHidden","styles","CalendarHeader","viewDate","onChange","prevMonthHidden","prevMonthHiddenProp","nextMonthHidden","nextMonthHiddenProp","disablePickers","onNextMonth","onPrevMonth","prevMonthProps","nextMonthProps","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","prevMonthIcon","className","navIconAccent","width","height","nextMonthIcon","isMonthDisabled","isYearDisabled","monthDropdownTestId","yearDropdownTestId","prevMonthButtonTestId","nextMonthButtonTestId","restProps","locale","direction","onMonthsChange","useCallback","_","newValue","Number","onYearChange","currentYear","getFullYear","currentMonth","getMonth","months","useMemo","map","value","label","span","month","disabled","years","year","formatter","Intl","DateTimeFormat","prevMonthClassName","restPrevMonthProps","nextMonthClassName","restNextMonthProps","Math","min","max","stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen","event","isOpen","key","stopPropagation","baseClassName","host","sizeX","navIcon","navIconPrev","onClick","data-testid","format","pickers","weight","sizeY","div","picker","options","dropdownOffsetDistance","dropdownAutoWidth","icon","forceDropdownPortal","selectType","aria-label","onInputKeyDown","navIconNext"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/CalendarHeader/CalendarHeader.tsx"],"sourcesContent":["'use client';\n\nimport { type ChangeEvent } from 'react';\nimport * as React from 'react';\nimport {\n Icon12Dropdown,\n Icon20ChevronLeftOutline,\n Icon20ChevronRightOutline,\n} from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, getMonths, getYears } from '../../lib/calendar';\nimport { addMonths, setMonth, setYear, subMonths } from '../../lib/date';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { CustomSelect, type SelectProps } from '../CustomSelect/CustomSelect';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CalendarHeader.module.css';\n\ntype ArrowMonthProps = Omit<React.AllHTMLAttributes<HTMLElement>, 'onClick' | 'aria-label'>;\n\nexport type CalendarHeaderTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора месяца в заголовке календаря.\n */\n monthDropdownTestId?: string | ((monthIndex: number) => string);\n /**\n * Передает атрибут `data-testid` для дропдауна выбора года в заголовке календаря.\n */\n yearDropdownTestId?: string | ((year: number) => string);\n /**\n * Передает атрибут `data-testid` для кнопки перехода к следующему месяцу в заголовке календаря.\n */\n nextMonthButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки перехода к предыдущему месяцу в заголовке календаря.\n */\n prevMonthButtonTestId?: string;\n};\n\nexport interface CalendarHeaderProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n CalendarHeaderTestsProps {\n /**\n * Отображаемая дата.\n */\n viewDate: Date;\n /**\n * Скрывает иконку для переключения на предыдущий месяц.\n */\n prevMonthHidden?: boolean;\n /**\n * Скрывает иконку для переключения на следующий месяц.\n */\n nextMonthHidden?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для кнопки предыдущего месяца.\n */\n prevMonthLabel?: string;\n /**\n * `aria-label` для кнопки следующего месяца.\n */\n nextMonthLabel?: string;\n /**\n * `aria-label` для селектора месяца.\n */\n changeMonthLabel?: string;\n /**\n * `aria-label` для селектора года.\n */\n changeYearLabel?: string;\n /**\n * Кастомная иконка для кнопки предыдущего месяца.\n */\n prevMonthIcon?: React.ReactNode;\n /**\n * Кастомная иконка для кнопки следующего месяца.\n */\n nextMonthIcon?: React.ReactNode;\n /**\n * Дополнительные свойства для кнопки предыдущего месяца.\n */\n prevMonthProps?: ArrowMonthProps;\n /**\n * Дополнительные свойства для кнопки следующего месяца.\n */\n nextMonthProps?: ArrowMonthProps;\n /**\n * Функция для проверки блокировки месяца.\n */\n isMonthDisabled?: (monthNumber: number, year?: number) => boolean;\n /**\n * Функция для проверки блокировки года.\n */\n isYearDisabled?: (yearNumber: number) => boolean;\n /**\n * Обработчик изменения отображаемой даты.\n */\n onChange: (viewDate: Date) => void;\n /**\n * Нажатие на кнопку переключения на следующий месяц.\n */\n onNextMonth?: () => void;\n /**\n * Нажатие на кнопку переключения на предыдущий месяц.\n */\n onPrevMonth?: () => void;\n}\n\nexport const CalendarHeader = ({\n viewDate,\n onChange,\n prevMonthHidden: prevMonthHiddenProp = false,\n nextMonthHidden: nextMonthHiddenProp = false,\n disablePickers = false,\n onNextMonth,\n onPrevMonth,\n prevMonthProps = {},\n nextMonthProps = {},\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n prevMonthIcon = (\n <Icon20ChevronLeftOutline className={styles.navIconAccent} width={30} height={30} />\n ),\n nextMonthIcon = (\n <Icon20ChevronRightOutline className={styles.navIconAccent} width={30} height={30} />\n ),\n isMonthDisabled,\n isYearDisabled,\n monthDropdownTestId,\n yearDropdownTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n ...restProps\n}: CalendarHeaderProps): React.ReactNode => {\n const { locale, direction } = useConfigProvider();\n\n const onMonthsChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange(setMonth(viewDate, Number(newValue))),\n [onChange, viewDate],\n );\n const onYearChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange(setYear(viewDate, Number(newValue))),\n [onChange, viewDate],\n );\n\n const currentYear = viewDate.getFullYear();\n const currentMonth = viewDate.getMonth();\n\n const months = React.useMemo(\n () =>\n getMonths(locale).map(({ value, label }) => ({\n value,\n label: <span className={styles.month}>{label}</span>,\n disabled: isMonthDisabled && isMonthDisabled(value),\n })),\n [locale, isMonthDisabled],\n );\n\n const years = React.useMemo(\n () =>\n getYears(currentYear, 100).map((year) => ({\n ...year,\n disabled: isYearDisabled && isYearDisabled(year.value),\n })),\n [currentYear, isYearDisabled],\n );\n\n const formatter = new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n });\n\n const { className: prevMonthClassName, ...restPrevMonthProps } = prevMonthProps;\n const { className: nextMonthClassName, ...restNextMonthProps } = nextMonthProps;\n\n let nextMonthHidden =\n nextMonthHiddenProp || (currentMonth === 11 && currentYear === DEFAULT_MAX_YEAR);\n if (isMonthDisabled && !nextMonthHidden) {\n nextMonthHidden = isMonthDisabled(\n currentMonth === 11 ? 0 : currentMonth + 1,\n currentMonth === 11 ? Math.min(currentYear + 1, DEFAULT_MAX_YEAR) : currentYear,\n );\n }\n\n let prevMonthHidden =\n prevMonthHiddenProp || (currentMonth === 0 && currentYear === DEFAULT_MIN_YEAR);\n if (isMonthDisabled && !prevMonthHidden) {\n prevMonthHidden = isMonthDisabled(\n currentMonth === 0 ? 11 : currentMonth - 1,\n currentMonth === 0 ? Math.max(currentYear - 1, DEFAULT_MIN_YEAR) : currentYear,\n );\n }\n\n const stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen = React.useCallback(\n (event: React.KeyboardEvent, isOpen: boolean) => {\n if (isOpen && event.key === 'Escape') {\n event.stopPropagation();\n }\n },\n [],\n );\n\n return (\n <RootComponent baseClassName={styles.host} {...restProps}>\n {!prevMonthHidden && (\n <AdaptivityProvider sizeX=\"regular\">\n <Tappable\n baseClassName={classNames(styles.navIcon, styles.navIconPrev, prevMonthClassName)}\n onClick={onPrevMonth}\n data-testid={prevMonthButtonTestId}\n {...restPrevMonthProps}\n >\n <VisuallyHidden>\n {prevMonthLabel}, {formatter.format(subMonths(viewDate, 1))}\n </VisuallyHidden>\n {direction === 'ltr' ? prevMonthIcon : nextMonthIcon}\n </Tappable>\n </AdaptivityProvider>\n )}\n {disablePickers ? (\n <Paragraph\n className={classNames(styles.pickers, 'vkuiInternalCalendarHeader__pickers')}\n weight=\"2\"\n >\n <span className={styles.month}>\n {new Intl.DateTimeFormat(locale, {\n month: 'long',\n }).format(viewDate)}\n </span>\n &nbsp;\n {new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n }).format(viewDate)}\n </Paragraph>\n ) : (\n <AdaptivityProvider sizeY=\"compact\">\n <div className={classNames(styles.pickers, 'vkuiInternalCalendarHeader__pickers')}>\n <CustomSelect\n className={classNames(styles.picker, 'vkuiInternalCalendarHeader__picker')}\n value={currentMonth}\n options={months}\n dropdownOffsetDistance={4}\n dropdownAutoWidth\n icon={<Icon12Dropdown />}\n onChange={onMonthsChange}\n forceDropdownPortal={false}\n selectType=\"accent\"\n aria-label={changeMonthLabel}\n data-testid={\n typeof monthDropdownTestId === 'string'\n ? monthDropdownTestId\n : monthDropdownTestId?.(currentMonth)\n }\n onInputKeyDown={stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen}\n />\n <CustomSelect\n className={classNames(styles.picker, 'vkuiInternalCalendarHeader__picker')}\n value={currentYear}\n options={years}\n dropdownOffsetDistance={4}\n dropdownAutoWidth\n icon={<Icon12Dropdown />}\n onChange={onYearChange}\n forceDropdownPortal={false}\n selectType=\"accent\"\n aria-label={changeYearLabel}\n data-testid={\n typeof yearDropdownTestId === 'string'\n ? yearDropdownTestId\n : yearDropdownTestId?.(currentYear)\n }\n onInputKeyDown={stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen}\n />\n </div>\n </AdaptivityProvider>\n )}\n {!nextMonthHidden && (\n <AdaptivityProvider sizeX=\"regular\">\n <Tappable\n baseClassName={classNames(styles.navIcon, styles.navIconNext, nextMonthClassName)}\n onClick={onNextMonth}\n data-testid={nextMonthButtonTestId}\n {...restNextMonthProps}\n >\n <VisuallyHidden>\n {nextMonthLabel}, {formatter.format(addMonths(viewDate, 1))}\n </VisuallyHidden>\n {direction === 'ltr' ? nextMonthIcon : prevMonthIcon}\n </Tappable>\n </AdaptivityProvider>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","Icon12Dropdown","Icon20ChevronLeftOutline","Icon20ChevronRightOutline","classNames","DEFAULT_MAX_YEAR","DEFAULT_MIN_YEAR","getMonths","getYears","addMonths","setMonth","setYear","subMonths","AdaptivityProvider","useConfigProvider","CustomSelect","RootComponent","Tappable","Paragraph","VisuallyHidden","styles","CalendarHeader","viewDate","onChange","prevMonthHidden","prevMonthHiddenProp","nextMonthHidden","nextMonthHiddenProp","disablePickers","onNextMonth","onPrevMonth","prevMonthProps","nextMonthProps","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","prevMonthIcon","className","navIconAccent","width","height","nextMonthIcon","isMonthDisabled","isYearDisabled","monthDropdownTestId","yearDropdownTestId","prevMonthButtonTestId","nextMonthButtonTestId","restProps","locale","direction","onMonthsChange","useCallback","_","newValue","Number","onYearChange","currentYear","getFullYear","currentMonth","getMonth","months","useMemo","map","value","label","span","month","disabled","years","year","formatter","Intl","DateTimeFormat","prevMonthClassName","restPrevMonthProps","nextMonthClassName","restNextMonthProps","Math","min","max","stopPropogationOfEscapeKeyboardEventWhenSelectIsOpen","event","isOpen","key","stopPropagation","baseClassName","host","sizeX","navIcon","navIconPrev","onClick","data-testid","format","pickers","weight","sizeY","div","picker","options","dropdownOffsetDistance","dropdownAutoWidth","icon","forceDropdownPortal","selectType","aria-label","onInputKeyDown","navIconNext"],"mappings":"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"}
@@ -81,7 +81,7 @@ const CALENDAR_MUTATION_OBSERVER_OPTIONS = {
81
81
  };
82
82
  /**
83
83
  * @see https://vkui.io/components/date-input
84
- */ export const DateInput = ({ enableTime, shouldDisableDate, disableFuture, disablePast, minDateTime, maxDateTime, 'value': valueProp, defaultValue, onChange, 'calendarPlacement': calendarPlacementProp = 'bottom-start', style, className, doneButtonText, DoneButton, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, accessible, calendarLabel = 'Календарь', prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeDayLabel = 'День', changeMonthLabel = 'Месяц', changeYearLabel = 'Год', changeHoursLabel = 'Час', changeMinutesLabel = 'Минута', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', showNeighboringMonth, size, viewDate, onHeaderChange, onNextMonth, onPrevMonth, prevMonthIcon, nextMonthIcon, renderDayContent, onCalendarOpenChanged, calendarTestsProps, dayFieldTestId, monthFieldTestId, yearFieldTestId, hourFieldTestId, minuteFieldTestId, showCalendarButtonTestId, clearButtonTestId, id, onApply, renderCustomValue, timezone, restoreFocus, disableFocusTrap, readOnly, 'disableCalendar': disableCalendarProp = false, 'aria-label': ariaLabel = '', ...props })=>{
84
+ */ export const DateInput = ({ enableTime, shouldDisableDate, disableFuture, disablePast, minDateTime, maxDateTime, 'value': valueProp, defaultValue, onChange, 'calendarPlacement': calendarPlacementProp = 'bottom-start', style, className, doneButtonText, DoneButton, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, accessible, calendarLabel = 'Календарь', prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeDayLabel = 'День', changeMonthLabel = 'Месяц', changeYearLabel = 'Год', changeHoursLabel = 'Час', changeMinutesLabel = 'Минута', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', showNeighboringMonth, size, viewDate, onHeaderChange, onNextMonth, onPrevMonth, prevMonthIcon, nextMonthIcon, renderDayContent, onCalendarOpenChanged, calendarTestsProps, dayFieldTestId, monthFieldTestId, yearFieldTestId, hourFieldTestId, minuteFieldTestId, showCalendarButtonTestId, clearButtonTestId, id, onApply, renderCustomValue, timezone, restoreFocus, disableFocusTrap, readOnly, 'disableCalendar': disableCalendarProp = false, 'aria-label': ariaLabel = '', before, ...props })=>{
85
85
  const daysRef = React.useRef(null);
86
86
  const monthsRef = React.useRef(null);
87
87
  const yearsRef = React.useRef(null);
@@ -214,22 +214,25 @@ const CALENDAR_MUTATION_OBSERVER_OPTIONS = {
214
214
  openCalendar,
215
215
  accessible
216
216
  ]);
217
+ const showCalendarButton = !disableCalendar && (accessible || !accessible && !value);
218
+ const showClearButton = value && !readOnly;
217
219
  return /*#__PURE__*/ _jsxs(FormField, {
218
220
  style: style,
219
- className: classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className),
221
+ className: classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], !!before && styles.hasBefore, (showCalendarButton || showClearButton) && styles.hasAfter, className),
220
222
  getRootRef: handleRootRef,
221
223
  role: "group",
222
224
  "aria-labelledby": `${ariaLabelId} ${currentDateLabelId}`,
225
+ before: before,
223
226
  after: /*#__PURE__*/ _jsxs(React.Fragment, {
224
227
  children: [
225
- !disableCalendar && (accessible || !accessible && !value) ? /*#__PURE__*/ _jsx(IconButton, {
228
+ showCalendarButton ? /*#__PURE__*/ _jsx(IconButton, {
226
229
  hoverMode: "opacity",
227
230
  label: showCalendarLabel,
228
231
  onClick: toggleCalendar,
229
232
  "data-testid": showCalendarButtonTestId,
230
233
  children: /*#__PURE__*/ _jsx(Icon20CalendarOutline, {})
231
234
  }) : null,
232
- value && !readOnly ? /*#__PURE__*/ _jsx(IconButton, {
235
+ showClearButton ? /*#__PURE__*/ _jsx(IconButton, {
233
236
  hoverMode: "opacity",
234
237
  label: clearFieldLabel,
235
238
  onClick: clear,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DateInput/DateInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { type UseFocusTrapProps } from '../../hooks/useFocusTrap';\nimport {\n dateFormatter,\n dateTimeFormatter,\n isMatch,\n parse,\n startOfDay,\n startOfMinute,\n} from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps, type CalendarTestsProps } from '../Calendar/Calendar';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { NumberInputLike } from '../NumberInputLike/NumberInputLike';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport { useDateInputValue } from './hooks';\nimport '../InputLike/InputLike.module.css'; // Reorder css\nimport styles from './DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nexport type DateInputPropsTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n dayFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n monthFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n yearFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода часа.\n */\n hourFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода минут.\n */\n minuteFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string;\n};\n\nexport interface DateInputProps\n extends Omit<\n React.InputHTMLAttributes<HTMLDivElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size'\n >,\n Pick<\n CalendarProps,\n | 'disablePast'\n | 'disableFuture'\n | 'enableTime'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'defaultValue'\n | 'doneButtonText'\n | 'DoneButton'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'changeHoursLabel'\n | 'changeMinutesLabel'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'showNeighboringMonth'\n | 'size'\n | 'viewDate'\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'minDateTime'\n | 'maxDateTime'\n | 'renderDayContent'\n >,\n Pick<UseFocusTrapProps, 'restoreFocus'>,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateInputPropsTestsProps {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarTestsProps;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean;\n /**\n * `aria-label` для календаря.\n */\n calendarLabel?: string;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: (opened: boolean) => void;\n /**\n * `aria-label` для поля изменения дня.\n */\n changeDayLabel?: string;\n /**\n * Обработчик нажатия на кнопку `\"Done\"`. Используется совместно с флагом `enableTime`.\n */\n onApply?: (value?: Date) => void;\n /**\n * Функция для кастомного форматирования отображаемого значения даты.\n * Позволяет переопределить стандартное отображение даты и вернуть собственное представление.\n */\n renderCustomValue?: (date: Date | undefined) => React.ReactNode;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string;\n /**\n * Включает режим в котором DateInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean /* TODO [>=v8] включить по умолчанию */;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: UseFocusTrapProps['disabled'];\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n max = 31;\n break;\n case 1:\n max = 12;\n break;\n case 2:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n case 3:\n max = 23;\n break;\n case 4:\n max = 59;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarProps['value']) => {\n const newValue = ['', '', '', '', ''];\n if (value) {\n newValue[0] = String(value.getDate()).padStart(2, '0');\n newValue[1] = String(value.getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value.getFullYear()).padStart(4, '0');\n newValue[3] = String(value.getHours()).padStart(2, '0');\n newValue[4] = String(value.getMinutes()).padStart(2, '0');\n }\n return newValue;\n};\n\nconst CALENDAR_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex'],\n};\n\n/**\n * @see https://vkui.io/components/date-input\n */\nexport const DateInput = ({\n enableTime,\n shouldDisableDate,\n disableFuture,\n disablePast,\n minDateTime,\n maxDateTime,\n 'value': valueProp,\n defaultValue,\n onChange,\n 'calendarPlacement': calendarPlacementProp = 'bottom-start',\n style,\n className,\n doneButtonText,\n DoneButton,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n accessible,\n calendarLabel = 'Календарь',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeDayLabel = 'День',\n changeMonthLabel = 'Месяц',\n changeYearLabel = 'Год',\n changeHoursLabel = 'Час',\n changeMinutesLabel = 'Минута',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n showNeighboringMonth,\n size,\n viewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n renderDayContent,\n onCalendarOpenChanged,\n calendarTestsProps,\n dayFieldTestId,\n monthFieldTestId,\n yearFieldTestId,\n hourFieldTestId,\n minuteFieldTestId,\n showCalendarButtonTestId,\n clearButtonTestId,\n id,\n onApply,\n renderCustomValue,\n timezone,\n restoreFocus,\n disableFocusTrap,\n readOnly,\n 'disableCalendar': disableCalendarProp = false,\n 'aria-label': ariaLabel = '',\n ...props\n}: DateInputProps): React.ReactNode => {\n const daysRef = React.useRef<HTMLSpanElement>(null);\n const monthsRef = React.useRef<HTMLSpanElement>(null);\n const yearsRef = React.useRef<HTMLSpanElement>(null);\n const hoursRef = React.useRef<HTMLSpanElement>(null);\n const minutesRef = React.useRef<HTMLSpanElement>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const { value, updateValue, setInternalValue, getLastUpdatedValue, clearValue } =\n useDateInputValue({\n value: valueProp,\n defaultValue,\n onChange,\n timezone,\n });\n\n const maxElement = enableTime ? 4 : 2;\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n for (let i = 0; i <= maxElement; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n return;\n }\n }\n\n let formattedValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n let mask = 'dd.MM.yyyy';\n if (enableTime) {\n formattedValue += ` ${internalValue[3]}:${internalValue[4]}`;\n mask += ' HH:mm';\n }\n\n if (isMatch(formattedValue, mask)) {\n const now = new Date();\n updateValue(\n parse(formattedValue, mask, value ?? (enableTime ? startOfMinute(now) : startOfDay(now))),\n );\n }\n },\n [enableTime, maxElement, updateValue, value],\n );\n\n const refs = React.useMemo(\n () => [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n closeCalendar,\n toggleCalendar,\n openCalendar,\n handleRestoreFocus,\n } = useDateInput({\n maxElement,\n refs,\n autoFocus,\n disabled: disabled || readOnly,\n elementsConfig,\n onClear: clearValue,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n accessible,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n useIsomorphicLayoutEffect(\n function resetValueOnCloseCalendar() {\n if (!open) {\n setInternalValue(getLastUpdatedValue());\n }\n },\n [open, getLastUpdatedValue],\n );\n\n const onCalendarChange = React.useCallback(\n (value?: Date | undefined) => {\n if (!value) {\n return;\n }\n if (enableTime) {\n setInternalValue(value);\n return;\n }\n updateValue(value);\n if (closeOnChange) {\n removeFocusFromField();\n }\n },\n [enableTime, updateValue, closeOnChange, setInternalValue, removeFocusFromField],\n );\n\n const onDoneButtonClick = React.useCallback(() => {\n if (!value) {\n return;\n }\n const newValue = updateValue(value);\n onApply?.(newValue);\n removeFocusFromField();\n }, [onApply, removeFocusFromField, updateValue, value]);\n\n const customValue = React.useMemo(\n () => !open && renderCustomValue?.(value || undefined),\n [open, renderCustomValue, value],\n );\n\n // при переключении месяцев высота календаря может меняться,\n // чтобы календарь не прыгал при переключении месяцев каждый раз на\n // лучшую позицию мы запоминаем последнюю удачную, чтобы календарь оставался\n // на ней, пока помещается.\n const [calendarPlacement, setCalendarPlacement] =\n React.useState<PlacementWithAuto>(calendarPlacementProp);\n\n const { locale } = useConfigProvider();\n const currentDateLabel = value\n ? new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(value)\n : null;\n const currentDateLabelId = React.useId();\n const ariaLabelId = React.useId();\n\n const showCalendarOnInputAreaClick = React.useCallback(() => {\n handleFieldEnter();\n if (accessible) {\n openCalendar();\n }\n }, [handleFieldEnter, openCalendar, accessible]);\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n role=\"group\"\n aria-labelledby={`${ariaLabelId} ${currentDateLabelId}`}\n after={\n <React.Fragment>\n {!disableCalendar && (accessible || (!accessible && !value)) ? (\n <IconButton\n hoverMode=\"opacity\"\n label={showCalendarLabel}\n onClick={toggleCalendar}\n data-testid={showCalendarButtonTestId}\n >\n <Icon20CalendarOutline />\n </IconButton>\n ) : null}\n {value && !readOnly ? (\n <IconButton\n hoverMode=\"opacity\"\n label={clearFieldLabel}\n onClick={clear}\n data-testid={clearButtonTestId}\n >\n <Icon16Clear />\n </IconButton>\n ) : null}\n </React.Fragment>\n }\n disabled={disabled}\n {...props}\n >\n <div className={styles.wrapper}>\n {ariaLabel && <VisuallyHidden id={ariaLabelId}>{ariaLabel}</VisuallyHidden>}\n {currentDateLabel && (\n <VisuallyHidden id={currentDateLabelId}>{currentDateLabel}</VisuallyHidden>\n )}\n <VisuallyHidden\n id={id}\n Component=\"input\"\n readOnly\n aria-hidden\n tabIndex={readOnly ? 0 : -1}\n name={name}\n value={\n value\n ? enableTime\n ? dateTimeFormatter.format(value)\n : dateFormatter.format(value)\n : ''\n }\n onFocus={handleFieldEnter}\n />\n <Text\n className={classNames(styles.input, customValue && styles.hidden)}\n // Инцидент: в PR https://github.com/VKCOM/VKUI/pull/6649 стабильно ломается порядок стилей\n // из-за чего `.Typography--normalize` перебивает стили.\n normalize={false}\n Component=\"span\" // для <span> нормализация не нужна\n onClick={showCalendarOnInputAreaClick}\n >\n <NumberInputLike\n value={internalValue[0]}\n minValue={1}\n maxValue={31}\n length={2}\n getRootRef={daysRef}\n index={0}\n onKeyDown={handleKeyDown}\n onElementSelect={setFocusedElement}\n label={changeDayLabel}\n readOnly={readOnly}\n data-testid={dayFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[1]}\n minValue={1}\n maxValue={12}\n length={2}\n getRootRef={monthsRef}\n index={1}\n onElementSelect={setFocusedElement}\n onKeyDown={handleKeyDown}\n readOnly={readOnly}\n label={changeMonthLabel}\n data-testid={monthFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[2]}\n minValue={1}\n maxValue={275750}\n length={4}\n getRootRef={yearsRef}\n index={2}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeYearLabel}\n onKeyDown={handleKeyDown}\n data-testid={yearFieldTestId}\n />\n {enableTime && (\n <React.Fragment>\n <InputLikeDivider className={styles.inputTimeDivider}> </InputLikeDivider>\n <NumberInputLike\n value={internalValue[3]}\n minValue={1}\n maxValue={24}\n length={2}\n getRootRef={hoursRef}\n index={3}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeHoursLabel}\n onKeyDown={handleKeyDown}\n data-testid={hourFieldTestId}\n />\n <InputLikeDivider>:</InputLikeDivider>\n <NumberInputLike\n value={internalValue[4]}\n minValue={1}\n maxValue={59}\n length={2}\n getRootRef={minutesRef}\n index={4}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeMinutesLabel}\n onKeyDown={handleKeyDown}\n data-testid={minuteFieldTestId}\n />\n </React.Fragment>\n )}\n </Text>\n {customValue && (\n <Text className={styles.customValue} aria-hidden normalize={false}>\n {customValue}\n </Text>\n )}\n </div>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n onPlacementChange={setCalendarPlacement}\n autoUpdateOnTargetResize\n >\n <FocusTrap\n onClose={closeCalendar}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? (Boolean(accessible) && handleRestoreFocus)}\n captureEscapeKeyboardEvent={false}\n mutationObserverOptions={CALENDAR_MUTATION_OBSERVER_OPTIONS}\n >\n <Calendar\n aria-label={calendarLabel}\n role=\"dialog\"\n value={value}\n onChange={onCalendarChange}\n enableTime={enableTime}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onDoneButtonClick={onDoneButtonClick}\n getRootRef={calendarRef}\n doneButtonText={doneButtonText}\n DoneButton={DoneButton}\n disablePickers={disablePickers}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n showNeighboringMonth={showNeighboringMonth}\n renderDayContent={renderDayContent}\n size={size}\n viewDate={viewDate}\n onHeaderChange={onHeaderChange}\n onNextMonth={onNextMonth}\n onPrevMonth={onPrevMonth}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n minDateTime={minDateTime}\n maxDateTime={maxDateTime}\n {...calendarTestsProps}\n />\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useExternRef","dateFormatter","dateTimeFormatter","isMatch","parse","startOfDay","startOfMinute","useIsomorphicLayoutEffect","Calendar","useConfigProvider","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","useDateInputValue","styles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","CALENDAR_MUTATION_OBSERVER_OPTIONS","childList","subtree","attributes","attributeFilter","DateInput","enableTime","shouldDisableDate","disableFuture","disablePast","minDateTime","maxDateTime","valueProp","defaultValue","onChange","calendarPlacementProp","style","className","doneButtonText","DoneButton","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","accessible","calendarLabel","prevMonthLabel","nextMonthLabel","changeDayLabel","changeMonthLabel","changeYearLabel","changeHoursLabel","changeMinutesLabel","clearFieldLabel","showCalendarLabel","showNeighboringMonth","size","viewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","renderDayContent","onCalendarOpenChanged","calendarTestsProps","dayFieldTestId","monthFieldTestId","yearFieldTestId","hourFieldTestId","minuteFieldTestId","showCalendarButtonTestId","clearButtonTestId","id","onApply","renderCustomValue","timezone","restoreFocus","disableFocusTrap","readOnly","disableCalendarProp","ariaLabel","props","daysRef","useRef","monthsRef","yearsRef","hoursRef","minutesRef","disableCalendar","updateValue","setInternalValue","getLastUpdatedValue","clearValue","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","now","Date","refs","useMemo","rootRef","calendarRef","open","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","closeCalendar","toggleCalendar","openCalendar","handleRestoreFocus","onClear","sizeY","handleRootRef","resetValueOnCloseCalendar","onCalendarChange","onDoneButtonClick","customValue","undefined","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","Intl","DateTimeFormat","weekday","year","month","day","format","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","role","aria-labelledby","after","Fragment","hoverMode","label","onClick","data-testid","div","wrapper","Component","aria-hidden","tabIndex","onFocus","input","hidden","normalize","minValue","maxValue","onKeyDown","onElementSelect","inputTimeDivider","targetRef","offsetByMainAxis","placement","onPlacementChange","autoUpdateOnTargetResize","onClose","Boolean","captureEscapeKeyboardEvent","mutationObserverOptions","aria-label"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/DateInput/DateInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { type UseFocusTrapProps } from '../../hooks/useFocusTrap';\nimport {\n dateFormatter,\n dateTimeFormatter,\n isMatch,\n parse,\n startOfDay,\n startOfMinute,\n} from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps, type CalendarTestsProps } from '../Calendar/Calendar';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { NumberInputLike } from '../NumberInputLike/NumberInputLike';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport { useDateInputValue } from './hooks';\nimport '../InputLike/InputLike.module.css'; // Reorder css\nimport styles from './DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nexport type DateInputPropsTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n dayFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n monthFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n yearFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода часа.\n */\n hourFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода минут.\n */\n minuteFieldTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string;\n};\n\nexport interface DateInputProps\n extends Omit<\n React.InputHTMLAttributes<HTMLDivElement>,\n 'value' | 'defaultValue' | 'onChange' | 'size'\n >,\n Pick<\n CalendarProps,\n | 'disablePast'\n | 'disableFuture'\n | 'enableTime'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'defaultValue'\n | 'doneButtonText'\n | 'DoneButton'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'changeHoursLabel'\n | 'changeMinutesLabel'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'showNeighboringMonth'\n | 'size'\n | 'viewDate'\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'minDateTime'\n | 'maxDateTime'\n | 'renderDayContent'\n >,\n Pick<UseFocusTrapProps, 'restoreFocus'>,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateInputPropsTestsProps {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarTestsProps;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean;\n /**\n * `aria-label` для календаря.\n */\n calendarLabel?: string;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: (opened: boolean) => void;\n /**\n * `aria-label` для поля изменения дня.\n */\n changeDayLabel?: string;\n /**\n * Обработчик нажатия на кнопку `\"Done\"`. Используется совместно с флагом `enableTime`.\n */\n onApply?: (value?: Date) => void;\n /**\n * Функция для кастомного форматирования отображаемого значения даты.\n * Позволяет переопределить стандартное отображение даты и вернуть собственное представление.\n */\n renderCustomValue?: (date: Date | undefined) => React.ReactNode;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string;\n /**\n * Включает режим в котором DateInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean /* TODO [>=v8] включить по умолчанию */;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: UseFocusTrapProps['disabled'];\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n max = 31;\n break;\n case 1:\n max = 12;\n break;\n case 2:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n case 3:\n max = 23;\n break;\n case 4:\n max = 59;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarProps['value']) => {\n const newValue = ['', '', '', '', ''];\n if (value) {\n newValue[0] = String(value.getDate()).padStart(2, '0');\n newValue[1] = String(value.getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value.getFullYear()).padStart(4, '0');\n newValue[3] = String(value.getHours()).padStart(2, '0');\n newValue[4] = String(value.getMinutes()).padStart(2, '0');\n }\n return newValue;\n};\n\nconst CALENDAR_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex'],\n};\n\n/**\n * @see https://vkui.io/components/date-input\n */\nexport const DateInput = ({\n enableTime,\n shouldDisableDate,\n disableFuture,\n disablePast,\n minDateTime,\n maxDateTime,\n 'value': valueProp,\n defaultValue,\n onChange,\n 'calendarPlacement': calendarPlacementProp = 'bottom-start',\n style,\n className,\n doneButtonText,\n DoneButton,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n accessible,\n calendarLabel = 'Календарь',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeDayLabel = 'День',\n changeMonthLabel = 'Месяц',\n changeYearLabel = 'Год',\n changeHoursLabel = 'Час',\n changeMinutesLabel = 'Минута',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n showNeighboringMonth,\n size,\n viewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n renderDayContent,\n onCalendarOpenChanged,\n calendarTestsProps,\n dayFieldTestId,\n monthFieldTestId,\n yearFieldTestId,\n hourFieldTestId,\n minuteFieldTestId,\n showCalendarButtonTestId,\n clearButtonTestId,\n id,\n onApply,\n renderCustomValue,\n timezone,\n restoreFocus,\n disableFocusTrap,\n readOnly,\n 'disableCalendar': disableCalendarProp = false,\n 'aria-label': ariaLabel = '',\n before,\n ...props\n}: DateInputProps): React.ReactNode => {\n const daysRef = React.useRef<HTMLSpanElement>(null);\n const monthsRef = React.useRef<HTMLSpanElement>(null);\n const yearsRef = React.useRef<HTMLSpanElement>(null);\n const hoursRef = React.useRef<HTMLSpanElement>(null);\n const minutesRef = React.useRef<HTMLSpanElement>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const { value, updateValue, setInternalValue, getLastUpdatedValue, clearValue } =\n useDateInputValue({\n value: valueProp,\n defaultValue,\n onChange,\n timezone,\n });\n\n const maxElement = enableTime ? 4 : 2;\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n for (let i = 0; i <= maxElement; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n return;\n }\n }\n\n let formattedValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n let mask = 'dd.MM.yyyy';\n if (enableTime) {\n formattedValue += ` ${internalValue[3]}:${internalValue[4]}`;\n mask += ' HH:mm';\n }\n\n if (isMatch(formattedValue, mask)) {\n const now = new Date();\n updateValue(\n parse(formattedValue, mask, value ?? (enableTime ? startOfMinute(now) : startOfDay(now))),\n );\n }\n },\n [enableTime, maxElement, updateValue, value],\n );\n\n const refs = React.useMemo(\n () => [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n closeCalendar,\n toggleCalendar,\n openCalendar,\n handleRestoreFocus,\n } = useDateInput({\n maxElement,\n refs,\n autoFocus,\n disabled: disabled || readOnly,\n elementsConfig,\n onClear: clearValue,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n accessible,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n useIsomorphicLayoutEffect(\n function resetValueOnCloseCalendar() {\n if (!open) {\n setInternalValue(getLastUpdatedValue());\n }\n },\n [open, getLastUpdatedValue],\n );\n\n const onCalendarChange = React.useCallback(\n (value?: Date | undefined) => {\n if (!value) {\n return;\n }\n if (enableTime) {\n setInternalValue(value);\n return;\n }\n updateValue(value);\n if (closeOnChange) {\n removeFocusFromField();\n }\n },\n [enableTime, updateValue, closeOnChange, setInternalValue, removeFocusFromField],\n );\n\n const onDoneButtonClick = React.useCallback(() => {\n if (!value) {\n return;\n }\n const newValue = updateValue(value);\n onApply?.(newValue);\n removeFocusFromField();\n }, [onApply, removeFocusFromField, updateValue, value]);\n\n const customValue = React.useMemo(\n () => !open && renderCustomValue?.(value || undefined),\n [open, renderCustomValue, value],\n );\n\n // при переключении месяцев высота календаря может меняться,\n // чтобы календарь не прыгал при переключении месяцев каждый раз на\n // лучшую позицию мы запоминаем последнюю удачную, чтобы календарь оставался\n // на ней, пока помещается.\n const [calendarPlacement, setCalendarPlacement] =\n React.useState<PlacementWithAuto>(calendarPlacementProp);\n\n const { locale } = useConfigProvider();\n const currentDateLabel = value\n ? new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(value)\n : null;\n const currentDateLabelId = React.useId();\n const ariaLabelId = React.useId();\n\n const showCalendarOnInputAreaClick = React.useCallback(() => {\n handleFieldEnter();\n if (accessible) {\n openCalendar();\n }\n }, [handleFieldEnter, openCalendar, accessible]);\n\n const showCalendarButton = !disableCalendar && (accessible || (!accessible && !value));\n const showClearButton = value && !readOnly;\n\n return (\n <FormField\n style={style}\n className={classNames(\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n !!before && styles.hasBefore,\n (showCalendarButton || showClearButton) && styles.hasAfter,\n className,\n )}\n getRootRef={handleRootRef}\n role=\"group\"\n aria-labelledby={`${ariaLabelId} ${currentDateLabelId}`}\n before={before}\n after={\n <React.Fragment>\n {showCalendarButton ? (\n <IconButton\n hoverMode=\"opacity\"\n label={showCalendarLabel}\n onClick={toggleCalendar}\n data-testid={showCalendarButtonTestId}\n >\n <Icon20CalendarOutline />\n </IconButton>\n ) : null}\n {showClearButton ? (\n <IconButton\n hoverMode=\"opacity\"\n label={clearFieldLabel}\n onClick={clear}\n data-testid={clearButtonTestId}\n >\n <Icon16Clear />\n </IconButton>\n ) : null}\n </React.Fragment>\n }\n disabled={disabled}\n {...props}\n >\n <div className={styles.wrapper}>\n {ariaLabel && <VisuallyHidden id={ariaLabelId}>{ariaLabel}</VisuallyHidden>}\n {currentDateLabel && (\n <VisuallyHidden id={currentDateLabelId}>{currentDateLabel}</VisuallyHidden>\n )}\n <VisuallyHidden\n id={id}\n Component=\"input\"\n readOnly\n aria-hidden\n tabIndex={readOnly ? 0 : -1}\n name={name}\n value={\n value\n ? enableTime\n ? dateTimeFormatter.format(value)\n : dateFormatter.format(value)\n : ''\n }\n onFocus={handleFieldEnter}\n />\n <Text\n className={classNames(styles.input, customValue && styles.hidden)}\n // Инцидент: в PR https://github.com/VKCOM/VKUI/pull/6649 стабильно ломается порядок стилей\n // из-за чего `.Typography--normalize` перебивает стили.\n normalize={false}\n Component=\"span\" // для <span> нормализация не нужна\n onClick={showCalendarOnInputAreaClick}\n >\n <NumberInputLike\n value={internalValue[0]}\n minValue={1}\n maxValue={31}\n length={2}\n getRootRef={daysRef}\n index={0}\n onKeyDown={handleKeyDown}\n onElementSelect={setFocusedElement}\n label={changeDayLabel}\n readOnly={readOnly}\n data-testid={dayFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[1]}\n minValue={1}\n maxValue={12}\n length={2}\n getRootRef={monthsRef}\n index={1}\n onElementSelect={setFocusedElement}\n onKeyDown={handleKeyDown}\n readOnly={readOnly}\n label={changeMonthLabel}\n data-testid={monthFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[2]}\n minValue={1}\n maxValue={275750}\n length={4}\n getRootRef={yearsRef}\n index={2}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeYearLabel}\n onKeyDown={handleKeyDown}\n data-testid={yearFieldTestId}\n />\n {enableTime && (\n <React.Fragment>\n <InputLikeDivider className={styles.inputTimeDivider}> </InputLikeDivider>\n <NumberInputLike\n value={internalValue[3]}\n minValue={1}\n maxValue={24}\n length={2}\n getRootRef={hoursRef}\n index={3}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeHoursLabel}\n onKeyDown={handleKeyDown}\n data-testid={hourFieldTestId}\n />\n <InputLikeDivider>:</InputLikeDivider>\n <NumberInputLike\n value={internalValue[4]}\n minValue={1}\n maxValue={59}\n length={2}\n getRootRef={minutesRef}\n index={4}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeMinutesLabel}\n onKeyDown={handleKeyDown}\n data-testid={minuteFieldTestId}\n />\n </React.Fragment>\n )}\n </Text>\n {customValue && (\n <Text className={styles.customValue} aria-hidden normalize={false}>\n {customValue}\n </Text>\n )}\n </div>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n onPlacementChange={setCalendarPlacement}\n autoUpdateOnTargetResize\n >\n <FocusTrap\n onClose={closeCalendar}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? (Boolean(accessible) && handleRestoreFocus)}\n captureEscapeKeyboardEvent={false}\n mutationObserverOptions={CALENDAR_MUTATION_OBSERVER_OPTIONS}\n >\n <Calendar\n aria-label={calendarLabel}\n role=\"dialog\"\n value={value}\n onChange={onCalendarChange}\n enableTime={enableTime}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onDoneButtonClick={onDoneButtonClick}\n getRootRef={calendarRef}\n doneButtonText={doneButtonText}\n DoneButton={DoneButton}\n disablePickers={disablePickers}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n showNeighboringMonth={showNeighboringMonth}\n renderDayContent={renderDayContent}\n size={size}\n viewDate={viewDate}\n onHeaderChange={onHeaderChange}\n onNextMonth={onNextMonth}\n onPrevMonth={onPrevMonth}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n minDateTime={minDateTime}\n maxDateTime={maxDateTime}\n {...calendarTestsProps}\n />\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useExternRef","dateFormatter","dateTimeFormatter","isMatch","parse","startOfDay","startOfMinute","useIsomorphicLayoutEffect","Calendar","useConfigProvider","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","useDateInputValue","styles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","CALENDAR_MUTATION_OBSERVER_OPTIONS","childList","subtree","attributes","attributeFilter","DateInput","enableTime","shouldDisableDate","disableFuture","disablePast","minDateTime","maxDateTime","valueProp","defaultValue","onChange","calendarPlacementProp","style","className","doneButtonText","DoneButton","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","accessible","calendarLabel","prevMonthLabel","nextMonthLabel","changeDayLabel","changeMonthLabel","changeYearLabel","changeHoursLabel","changeMinutesLabel","clearFieldLabel","showCalendarLabel","showNeighboringMonth","size","viewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","renderDayContent","onCalendarOpenChanged","calendarTestsProps","dayFieldTestId","monthFieldTestId","yearFieldTestId","hourFieldTestId","minuteFieldTestId","showCalendarButtonTestId","clearButtonTestId","id","onApply","renderCustomValue","timezone","restoreFocus","disableFocusTrap","readOnly","disableCalendarProp","ariaLabel","before","props","daysRef","useRef","monthsRef","yearsRef","hoursRef","minutesRef","disableCalendar","updateValue","setInternalValue","getLastUpdatedValue","clearValue","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","now","Date","refs","useMemo","rootRef","calendarRef","open","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","closeCalendar","toggleCalendar","openCalendar","handleRestoreFocus","onClear","sizeY","handleRootRef","resetValueOnCloseCalendar","onCalendarChange","onDoneButtonClick","customValue","undefined","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","Intl","DateTimeFormat","weekday","year","month","day","format","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","hasBefore","hasAfter","role","aria-labelledby","after","Fragment","hoverMode","label","onClick","data-testid","div","wrapper","Component","aria-hidden","tabIndex","onFocus","input","hidden","normalize","minValue","maxValue","onKeyDown","onElementSelect","inputTimeDivider","targetRef","offsetByMainAxis","placement","onPlacementChange","autoUpdateOnTargetResize","onClose","Boolean","captureEscapeKeyboardEvent","mutationObserverOptions","aria-label"],"mappings":"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"}
@@ -9,6 +9,14 @@
9
9
  --vkui_internal--DateInput_input_margin_inline_end: 14px;
10
10
  }
11
11
 
12
+ .hasBefore .wrapper {
13
+ --vkui_internal--DateInput_input_margin_inline_start: 0px;
14
+ }
15
+
16
+ .hasAfter .wrapper {
17
+ --vkui_internal--DateInput_input_margin_inline_end: 0px;
18
+ }
19
+
12
20
  .input {
13
21
  z-index: var(--vkui_internal--z_index_form_field_element);
14
22
  display: block;
@@ -52,13 +60,12 @@
52
60
  letter-spacing: 6px !important;
53
61
  }
54
62
 
55
- .sizeYCompact .input {
56
- -webkit-margin-end: 22px;
57
- margin-inline-end: 22px;
63
+ .sizeYCompact:not(.hasAfter) .wrapper {
64
+ --vkui_internal--DateInput_input_margin_inline_end: 22px;
58
65
  }
59
66
 
60
67
  @media (pointer: fine) and (min-width: 768px),(max-height: 414.9px) {
61
- .sizeYNone .input {
68
+ .sizeYNone:not(.hasAfter) .wrapper {
62
69
  --vkui_internal--DateInput_input_margin_inline_end: 22px;
63
70
  }
64
71
  }
@@ -18,11 +18,10 @@ import { NumberInputLike } from "../NumberInputLike/NumberInputLike.js";
18
18
  import { Popper } from "../Popper/Popper.js";
19
19
  import { Text } from "../Typography/Text/Text.js";
20
20
  import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.js";
21
- import styles from "./DateRangeInput.module.css";
22
21
  import dateInputStyles from "../DateInput/DateInput.module.css";
23
22
  const sizeYClassNames = {
24
- none: styles.sizeYNone,
25
- compact: styles.sizeYCompact
23
+ none: dateInputStyles.sizeYNone,
24
+ compact: dateInputStyles.sizeYCompact
26
25
  };
27
26
  const elementsConfig = (index)=>{
28
27
  let length = 2;
@@ -81,7 +80,7 @@ const CALENDAR_MUTATION_OBSERVER_OPTIONS = {
81
80
  };
82
81
  /**
83
82
  * @see https://vkui.io/components/date-range-input
84
- */ export const DateRangeInput = ({ shouldDisableDate, disableFuture, disablePast, 'value': valueProp, defaultValue, onChange, 'calendarPlacement': calendarPlacementProp = 'bottom-start', style, className, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, disableFocusTrap, restoreFocus, calendarLabel = 'Календарь', prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeMonthLabel = 'Месяц', changeYearLabel = 'Год', changeStartDayLabel = 'День начала', changeStartMonthLabel = 'Месяц начала', changeStartYearLabel = 'Год начала', changeEndDayLabel = 'День окончания', changeEndMonthLabel = 'Месяц окончания', changeEndYearLabel = 'Год окончания', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', 'aria-label': ariaLabel = '', prevMonthIcon, nextMonthIcon, onCalendarOpenChanged, renderDayContent, calendarTestsProps, startDateTestsProps, endDateTestsProps, clearButtonTestId, showCalendarButtonTestId, id, accessible, readOnly, 'disableCalendar': disableCalendarProp = false, ...props })=>{
83
+ */ export const DateRangeInput = ({ shouldDisableDate, disableFuture, disablePast, 'value': valueProp, defaultValue, onChange, 'calendarPlacement': calendarPlacementProp = 'bottom-start', style, className, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, disableFocusTrap, restoreFocus, calendarLabel = 'Календарь', prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeMonthLabel = 'Месяц', changeYearLabel = 'Год', changeStartDayLabel = 'День начала', changeStartMonthLabel = 'Месяц начала', changeStartYearLabel = 'Год начала', changeEndDayLabel = 'День окончания', changeEndMonthLabel = 'Месяц окончания', changeEndYearLabel = 'Год окончания', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', 'aria-label': ariaLabel = '', prevMonthIcon, nextMonthIcon, onCalendarOpenChanged, renderDayContent, calendarTestsProps, startDateTestsProps, endDateTestsProps, clearButtonTestId, showCalendarButtonTestId, id, accessible, readOnly, 'disableCalendar': disableCalendarProp = false, before, ...props })=>{
85
84
  const daysStartRef = React.useRef(null);
86
85
  const monthsStartRef = React.useRef(null);
87
86
  const yearsStartRef = React.useRef(null);
@@ -224,22 +223,25 @@ const CALENDAR_MUTATION_OBSERVER_OPTIONS = {
224
223
  openCalendar,
225
224
  accessible
226
225
  ]);
226
+ const showCalendarButton = !disableCalendar && (accessible || !accessible && !value);
227
+ const showClearButton = value && !readOnly;
227
228
  return /*#__PURE__*/ _jsxs(FormField, {
228
229
  style: style,
229
- className: classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className),
230
+ className: classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], !!before && dateInputStyles.hasBefore, (showCalendarButton || showClearButton) && dateInputStyles.hasAfter, className),
230
231
  getRootRef: handleRootRef,
231
232
  role: "group",
232
233
  "aria-labelledby": `${ariaLabelId} ${currentDateLabelId}`,
234
+ before: before,
233
235
  after: /*#__PURE__*/ _jsxs(_Fragment, {
234
236
  children: [
235
- !disableCalendar && (accessible || !accessible && !value) ? /*#__PURE__*/ _jsx(IconButton, {
237
+ showCalendarButton ? /*#__PURE__*/ _jsx(IconButton, {
236
238
  hoverMode: "opacity",
237
239
  label: showCalendarLabel,
238
240
  onClick: toggleCalendar,
239
241
  "data-testid": showCalendarButtonTestId,
240
242
  children: /*#__PURE__*/ _jsx(Icon20CalendarOutline, {})
241
243
  }) : null,
242
- value && !readOnly ? /*#__PURE__*/ _jsx(IconButton, {
244
+ showClearButton ? /*#__PURE__*/ _jsx(IconButton, {
243
245
  hoverMode: "opacity",
244
246
  label: clearFieldLabel,
245
247
  onClick: clear,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { type UseFocusTrapProps } from '../../hooks/useFocusTrap';\nimport { dateFormatter, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type CalendarRangeTestsProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { NumberInputLike } from '../NumberInputLike/NumberInputLike';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './DateRangeInput.module.css';\nimport dateInputStyles from '../DateInput/DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\ntype DateTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n day?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n month?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n year?: string;\n};\n\nexport type DateRangeInputTestsProps = {\n /**\n * Передает атрибуты `data-testid` для полей ввода начальной даты.\n */\n startDateTestsProps?: DateTestsProps;\n /**\n * Передает атрибуты `data-testid` для полей ввода конечной даты.\n */\n endDateTestsProps?: DateTestsProps;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string;\n};\n\nexport interface DateRangeInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'onChange'>,\n Pick<\n CalendarRangeProps,\n | 'disablePast'\n | 'disableFuture'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'defaultValue'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'renderDayContent'\n >,\n Pick<UseFocusTrapProps, 'restoreFocus'>,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateRangeInputTestsProps {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarRangeTestsProps;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: (opened: boolean) => void;\n /**\n * Label для календаря.\n */\n calendarLabel?: string;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string;\n /**\n * Label для ввода дня начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartDayLabel?: string;\n /**\n * Label для ввода месяца начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartMonthLabel?: string;\n /**\n * Label для ввода года начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartYearLabel?: string;\n /**\n * Label для ввода дня конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndDayLabel?: string;\n /**\n * Label для ввода месяца конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndMonthLabel?: string;\n /**\n * Label для ввода года конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndYearLabel?: string;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: UseFocusTrapProps['disabled'];\n /**\n * Включает режим в котором DateRangeInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateRangeInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean; // TODO [>=8]: включить по умолчанию.\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n case 3:\n max = 31;\n break;\n case 1:\n case 4:\n max = 12;\n break;\n case 2:\n case 5:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarRangeProps['value']) => {\n const newValue = ['', '', '', '', '', ''];\n if (value?.[0]) {\n newValue[0] = String(value[0].getDate()).padStart(2, '0');\n newValue[1] = String(value[0].getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value[0].getFullYear()).padStart(4, '0');\n }\n if (value?.[1]) {\n newValue[3] = String(value[1].getDate()).padStart(2, '0');\n newValue[4] = String(value[1].getMonth() + 1).padStart(2, '0');\n newValue[5] = String(value[1].getFullYear()).padStart(4, '0');\n }\n return newValue;\n};\n\nconst CALENDAR_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex'],\n};\n\n/**\n * @see https://vkui.io/components/date-range-input\n */\nexport const DateRangeInput = ({\n shouldDisableDate,\n disableFuture,\n disablePast,\n 'value': valueProp,\n defaultValue,\n onChange,\n 'calendarPlacement': calendarPlacementProp = 'bottom-start',\n style,\n className,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n disableFocusTrap,\n restoreFocus,\n calendarLabel = 'Календарь',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Месяц',\n changeYearLabel = 'Год',\n changeStartDayLabel = 'День начала',\n changeStartMonthLabel = 'Месяц начала',\n changeStartYearLabel = 'Год начала',\n changeEndDayLabel = 'День окончания',\n changeEndMonthLabel = 'Месяц окончания',\n changeEndYearLabel = 'Год окончания',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n 'aria-label': ariaLabel = '',\n prevMonthIcon,\n nextMonthIcon,\n onCalendarOpenChanged,\n renderDayContent,\n calendarTestsProps,\n startDateTestsProps,\n endDateTestsProps,\n clearButtonTestId,\n showCalendarButtonTestId,\n id,\n accessible,\n readOnly,\n 'disableCalendar': disableCalendarProp = false,\n ...props\n}: DateRangeInputProps): React.ReactNode => {\n const daysStartRef = React.useRef<HTMLSpanElement>(null);\n const monthsStartRef = React.useRef<HTMLSpanElement>(null);\n const yearsStartRef = React.useRef<HTMLSpanElement>(null);\n const daysEndRef = React.useRef<HTMLSpanElement>(null);\n const monthsEndRef = React.useRef<HTMLSpanElement>(null);\n const yearsEndRef = React.useRef<HTMLSpanElement>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const _onChange = React.useCallback(\n (newValue: DateRangeType | null | undefined) => onChange?.(newValue || undefined),\n [onChange],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n let isStartValid = true;\n let isEndValid = true;\n for (let i = 0; i <= 2; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isStartValid = false;\n }\n }\n for (let i = 3; i <= 5; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isEndValid = false;\n }\n }\n const formattedStartValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n const formattedEndValue = `${internalValue[3]}.${internalValue[4]}.${internalValue[5]}`;\n const mask = 'dd.MM.yyyy';\n\n if (!isMatch(formattedStartValue, mask)) {\n isStartValid = false;\n }\n if (!isMatch(formattedEndValue, mask)) {\n isEndValid = false;\n }\n\n if (!isStartValid && !isEndValid) {\n return;\n }\n\n const valueExists = Array.isArray(value);\n const now = new Date();\n const start = isStartValid\n ? parse(formattedStartValue, mask, (valueExists && value?.[0]) || now)\n : null;\n const end = isEndValid\n ? parse(formattedEndValue, mask, (valueExists && value?.[1]) || now)\n : null;\n if (start && end && end > start) {\n updateValue([start, end]);\n }\n },\n [updateValue, value],\n );\n\n const refs = React.useMemo(\n () => [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n );\n\n const onClear = React.useCallback(() => updateValue(undefined), [updateValue]);\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n closeCalendar,\n toggleCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement: 5,\n refs,\n autoFocus,\n disabled: disabled || readOnly,\n elementsConfig,\n onClear,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n accessible,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType | undefined) => {\n updateValue(newValue);\n if (closeOnChange && newValue?.[1] && newValue[1] !== value?.[1]) {\n removeFocusFromField();\n }\n },\n [updateValue, closeOnChange, value, removeFocusFromField],\n );\n\n // при переключении месяцев высота календаря может меняться,\n // чтобы календарь не прыгал при переключении месяцев каждый раз на\n // лучшую позицию мы запоминаем последнюю удачную, чтобы календарь оставался\n // на ней, пока помещается.\n const [calendarPlacement, setCalendarPlacement] =\n React.useState<PlacementWithAuto>(calendarPlacementProp);\n\n const { locale } = useConfigProvider();\n const currentDateLabel = React.useMemo(() => {\n if (!value) {\n return null;\n }\n const [startDate, endDate] = value;\n if (!startDate || !endDate) {\n return null;\n }\n return [\n new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(startDate),\n new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(endDate),\n ].join(' - ');\n }, [locale, value]);\n\n const currentDateLabelId = React.useId();\n const ariaLabelId = React.useId();\n\n const showCalendarOnInputAreaClick = React.useCallback(() => {\n handleFieldEnter();\n if (accessible) {\n openCalendar();\n }\n }, [handleFieldEnter, openCalendar, accessible]);\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n role=\"group\"\n aria-labelledby={`${ariaLabelId} ${currentDateLabelId}`}\n after={\n <>\n {!disableCalendar && (accessible || (!accessible && !value)) ? (\n <IconButton\n hoverMode=\"opacity\"\n label={showCalendarLabel}\n onClick={toggleCalendar}\n data-testid={showCalendarButtonTestId}\n >\n <Icon20CalendarOutline />\n </IconButton>\n ) : null}\n {value && !readOnly ? (\n <IconButton\n hoverMode=\"opacity\"\n label={clearFieldLabel}\n onClick={clear}\n data-testid={clearButtonTestId}\n >\n <Icon16Clear />\n </IconButton>\n ) : null}\n </>\n }\n disabled={disabled}\n {...props}\n >\n <div className={dateInputStyles.wrapper}>\n {ariaLabel && <VisuallyHidden id={ariaLabelId}>{ariaLabel}</VisuallyHidden>}\n {currentDateLabel && (\n <VisuallyHidden id={currentDateLabelId}>{currentDateLabel}</VisuallyHidden>\n )}\n <VisuallyHidden\n id={id}\n Component=\"input\"\n readOnly\n aria-hidden\n name={name}\n tabIndex={readOnly ? 0 : -1}\n value={\n value\n ? `${value[0] ? dateFormatter.format(value[0]) : ''} - ${\n value[1] ? dateFormatter.format(value[1]) : ''\n }`\n : ''\n }\n onFocus={handleFieldEnter}\n />\n <Text\n className={dateInputStyles.input}\n onClick={showCalendarOnInputAreaClick}\n normalize={false}\n >\n <NumberInputLike\n value={internalValue[0]}\n minValue={1}\n maxValue={31}\n onKeyDown={readOnly ? undefined : handleKeyDown}\n length={2}\n getRootRef={daysStartRef}\n index={0}\n readOnly={readOnly}\n onElementSelect={setFocusedElement}\n label={changeStartDayLabel}\n data-testid={startDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[1]}\n minValue={1}\n maxValue={12}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={monthsStartRef}\n index={1}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeStartMonthLabel}\n data-testid={startDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[2]}\n minValue={1}\n maxValue={275750}\n onKeyDown={handleKeyDown}\n length={4}\n getRootRef={yearsStartRef}\n index={2}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeStartYearLabel}\n data-testid={startDateTestsProps?.year}\n />\n <InputLikeDivider>{' — '}</InputLikeDivider>\n <NumberInputLike\n value={internalValue[3]}\n minValue={1}\n maxValue={31}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={daysEndRef}\n index={3}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndDayLabel}\n data-testid={endDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[4]}\n minValue={1}\n maxValue={12}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={monthsEndRef}\n index={4}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndMonthLabel}\n data-testid={endDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[5]}\n minValue={1}\n maxValue={275750}\n onKeyDown={handleKeyDown}\n length={4}\n getRootRef={yearsEndRef}\n index={5}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndYearLabel}\n data-testid={endDateTestsProps?.year}\n />\n </Text>\n </div>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n onPlacementChange={setCalendarPlacement}\n >\n <FocusTrap\n onClose={closeCalendar}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? Boolean(accessible)}\n captureEscapeKeyboardEvent={false}\n mutationObserverOptions={CALENDAR_MUTATION_OBSERVER_OPTIONS}\n >\n <CalendarRange\n value={value}\n role=\"dialog\"\n onChange={onCalendarChange}\n aria-label={calendarLabel}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n getRootRef={calendarRef}\n disablePickers={disablePickers}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n renderDayContent={renderDayContent}\n {...calendarTestsProps}\n />\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useCustomEnsuredControl","useExternRef","dateFormatter","isMatch","parse","CalendarRange","useConfigProvider","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","styles","dateInputStyles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","CALENDAR_MUTATION_OBSERVER_OPTIONS","childList","subtree","attributes","attributeFilter","DateRangeInput","shouldDisableDate","disableFuture","disablePast","valueProp","defaultValue","onChange","calendarPlacementProp","style","className","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","disableFocusTrap","restoreFocus","calendarLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","changeStartDayLabel","changeStartMonthLabel","changeStartYearLabel","changeEndDayLabel","changeEndMonthLabel","changeEndYearLabel","clearFieldLabel","showCalendarLabel","ariaLabel","prevMonthIcon","nextMonthIcon","onCalendarOpenChanged","renderDayContent","calendarTestsProps","startDateTestsProps","endDateTestsProps","clearButtonTestId","showCalendarButtonTestId","id","accessible","readOnly","disableCalendarProp","props","daysStartRef","useRef","monthsStartRef","yearsStartRef","daysEndRef","monthsEndRef","yearsEndRef","disableCalendar","_onChange","useCallback","undefined","updateValue","onInternalValueChange","internalValue","isStartValid","isEndValid","i","formattedStartValue","formattedEndValue","mask","valueExists","Array","isArray","now","Date","start","end","refs","useMemo","onClear","rootRef","calendarRef","open","openCalendar","closeCalendar","toggleCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","maxElement","sizeY","handleRootRef","onCalendarChange","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","startDate","endDate","Intl","DateTimeFormat","weekday","year","month","day","format","join","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","role","aria-labelledby","after","hoverMode","label","onClick","data-testid","div","wrapper","Component","aria-hidden","tabIndex","onFocus","input","normalize","minValue","maxValue","onKeyDown","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","onClose","Boolean","captureEscapeKeyboardEvent","mutationObserverOptions","aria-label"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { type UseFocusTrapProps } from '../../hooks/useFocusTrap';\nimport { dateFormatter, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type CalendarRangeTestsProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { NumberInputLike } from '../NumberInputLike/NumberInputLike';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport dateInputStyles from '../DateInput/DateInput.module.css';\n\nconst sizeYClassNames = {\n none: dateInputStyles.sizeYNone,\n compact: dateInputStyles.sizeYCompact,\n};\n\ntype DateTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n day?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n month?: string;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n year?: string;\n};\n\nexport type DateRangeInputTestsProps = {\n /**\n * Передает атрибуты `data-testid` для полей ввода начальной даты.\n */\n startDateTestsProps?: DateTestsProps;\n /**\n * Передает атрибуты `data-testid` для полей ввода конечной даты.\n */\n endDateTestsProps?: DateTestsProps;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string;\n};\n\nexport interface DateRangeInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'defaultValue' | 'onChange'>,\n Pick<\n CalendarRangeProps,\n | 'disablePast'\n | 'disableFuture'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'defaultValue'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'renderDayContent'\n >,\n Pick<UseFocusTrapProps, 'restoreFocus'>,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateRangeInputTestsProps {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarRangeTestsProps;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: (opened: boolean) => void;\n /**\n * Label для календаря.\n */\n calendarLabel?: string;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string;\n /**\n * Label для ввода дня начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartDayLabel?: string;\n /**\n * Label для ввода месяца начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartMonthLabel?: string;\n /**\n * Label для ввода года начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartYearLabel?: string;\n /**\n * Label для ввода дня конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndDayLabel?: string;\n /**\n * Label для ввода месяца конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndMonthLabel?: string;\n /**\n * Label для ввода года конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndYearLabel?: string;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: UseFocusTrapProps['disabled'];\n /**\n * Включает режим в котором DateRangeInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateRangeInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean; // TODO [>=8]: включить по умолчанию.\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n case 3:\n max = 31;\n break;\n case 1:\n case 4:\n max = 12;\n break;\n case 2:\n case 5:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarRangeProps['value']) => {\n const newValue = ['', '', '', '', '', ''];\n if (value?.[0]) {\n newValue[0] = String(value[0].getDate()).padStart(2, '0');\n newValue[1] = String(value[0].getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value[0].getFullYear()).padStart(4, '0');\n }\n if (value?.[1]) {\n newValue[3] = String(value[1].getDate()).padStart(2, '0');\n newValue[4] = String(value[1].getMonth() + 1).padStart(2, '0');\n newValue[5] = String(value[1].getFullYear()).padStart(4, '0');\n }\n return newValue;\n};\n\nconst CALENDAR_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['tabindex'],\n};\n\n/**\n * @see https://vkui.io/components/date-range-input\n */\nexport const DateRangeInput = ({\n shouldDisableDate,\n disableFuture,\n disablePast,\n 'value': valueProp,\n defaultValue,\n onChange,\n 'calendarPlacement': calendarPlacementProp = 'bottom-start',\n style,\n className,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n disableFocusTrap,\n restoreFocus,\n calendarLabel = 'Календарь',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Месяц',\n changeYearLabel = 'Год',\n changeStartDayLabel = 'День начала',\n changeStartMonthLabel = 'Месяц начала',\n changeStartYearLabel = 'Год начала',\n changeEndDayLabel = 'День окончания',\n changeEndMonthLabel = 'Месяц окончания',\n changeEndYearLabel = 'Год окончания',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n 'aria-label': ariaLabel = '',\n prevMonthIcon,\n nextMonthIcon,\n onCalendarOpenChanged,\n renderDayContent,\n calendarTestsProps,\n startDateTestsProps,\n endDateTestsProps,\n clearButtonTestId,\n showCalendarButtonTestId,\n id,\n accessible,\n readOnly,\n 'disableCalendar': disableCalendarProp = false,\n before,\n ...props\n}: DateRangeInputProps): React.ReactNode => {\n const daysStartRef = React.useRef<HTMLSpanElement>(null);\n const monthsStartRef = React.useRef<HTMLSpanElement>(null);\n const yearsStartRef = React.useRef<HTMLSpanElement>(null);\n const daysEndRef = React.useRef<HTMLSpanElement>(null);\n const monthsEndRef = React.useRef<HTMLSpanElement>(null);\n const yearsEndRef = React.useRef<HTMLSpanElement>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const _onChange = React.useCallback(\n (newValue: DateRangeType | null | undefined) => onChange?.(newValue || undefined),\n [onChange],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n let isStartValid = true;\n let isEndValid = true;\n for (let i = 0; i <= 2; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isStartValid = false;\n }\n }\n for (let i = 3; i <= 5; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isEndValid = false;\n }\n }\n const formattedStartValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n const formattedEndValue = `${internalValue[3]}.${internalValue[4]}.${internalValue[5]}`;\n const mask = 'dd.MM.yyyy';\n\n if (!isMatch(formattedStartValue, mask)) {\n isStartValid = false;\n }\n if (!isMatch(formattedEndValue, mask)) {\n isEndValid = false;\n }\n\n if (!isStartValid && !isEndValid) {\n return;\n }\n\n const valueExists = Array.isArray(value);\n const now = new Date();\n const start = isStartValid\n ? parse(formattedStartValue, mask, (valueExists && value?.[0]) || now)\n : null;\n const end = isEndValid\n ? parse(formattedEndValue, mask, (valueExists && value?.[1]) || now)\n : null;\n if (start && end && end > start) {\n updateValue([start, end]);\n }\n },\n [updateValue, value],\n );\n\n const refs = React.useMemo(\n () => [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n );\n\n const onClear = React.useCallback(() => updateValue(undefined), [updateValue]);\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n closeCalendar,\n toggleCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement: 5,\n refs,\n autoFocus,\n disabled: disabled || readOnly,\n elementsConfig,\n onClear,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n accessible,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType | undefined) => {\n updateValue(newValue);\n if (closeOnChange && newValue?.[1] && newValue[1] !== value?.[1]) {\n removeFocusFromField();\n }\n },\n [updateValue, closeOnChange, value, removeFocusFromField],\n );\n\n // при переключении месяцев высота календаря может меняться,\n // чтобы календарь не прыгал при переключении месяцев каждый раз на\n // лучшую позицию мы запоминаем последнюю удачную, чтобы календарь оставался\n // на ней, пока помещается.\n const [calendarPlacement, setCalendarPlacement] =\n React.useState<PlacementWithAuto>(calendarPlacementProp);\n\n const { locale } = useConfigProvider();\n const currentDateLabel = React.useMemo(() => {\n if (!value) {\n return null;\n }\n const [startDate, endDate] = value;\n if (!startDate || !endDate) {\n return null;\n }\n return [\n new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(startDate),\n new Intl.DateTimeFormat(locale, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(endDate),\n ].join(' - ');\n }, [locale, value]);\n\n const currentDateLabelId = React.useId();\n const ariaLabelId = React.useId();\n\n const showCalendarOnInputAreaClick = React.useCallback(() => {\n handleFieldEnter();\n if (accessible) {\n openCalendar();\n }\n }, [handleFieldEnter, openCalendar, accessible]);\n\n const showCalendarButton = !disableCalendar && (accessible || (!accessible && !value));\n const showClearButton = value && !readOnly;\n\n return (\n <FormField\n style={style}\n className={classNames(\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n !!before && dateInputStyles.hasBefore,\n (showCalendarButton || showClearButton) && dateInputStyles.hasAfter,\n className,\n )}\n getRootRef={handleRootRef}\n role=\"group\"\n aria-labelledby={`${ariaLabelId} ${currentDateLabelId}`}\n before={before}\n after={\n <>\n {showCalendarButton ? (\n <IconButton\n hoverMode=\"opacity\"\n label={showCalendarLabel}\n onClick={toggleCalendar}\n data-testid={showCalendarButtonTestId}\n >\n <Icon20CalendarOutline />\n </IconButton>\n ) : null}\n {showClearButton ? (\n <IconButton\n hoverMode=\"opacity\"\n label={clearFieldLabel}\n onClick={clear}\n data-testid={clearButtonTestId}\n >\n <Icon16Clear />\n </IconButton>\n ) : null}\n </>\n }\n disabled={disabled}\n {...props}\n >\n <div className={dateInputStyles.wrapper}>\n {ariaLabel && <VisuallyHidden id={ariaLabelId}>{ariaLabel}</VisuallyHidden>}\n {currentDateLabel && (\n <VisuallyHidden id={currentDateLabelId}>{currentDateLabel}</VisuallyHidden>\n )}\n <VisuallyHidden\n id={id}\n Component=\"input\"\n readOnly\n aria-hidden\n name={name}\n tabIndex={readOnly ? 0 : -1}\n value={\n value\n ? `${value[0] ? dateFormatter.format(value[0]) : ''} - ${\n value[1] ? dateFormatter.format(value[1]) : ''\n }`\n : ''\n }\n onFocus={handleFieldEnter}\n />\n <Text\n className={dateInputStyles.input}\n onClick={showCalendarOnInputAreaClick}\n normalize={false}\n >\n <NumberInputLike\n value={internalValue[0]}\n minValue={1}\n maxValue={31}\n onKeyDown={readOnly ? undefined : handleKeyDown}\n length={2}\n getRootRef={daysStartRef}\n index={0}\n readOnly={readOnly}\n onElementSelect={setFocusedElement}\n label={changeStartDayLabel}\n data-testid={startDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[1]}\n minValue={1}\n maxValue={12}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={monthsStartRef}\n index={1}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeStartMonthLabel}\n data-testid={startDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[2]}\n minValue={1}\n maxValue={275750}\n onKeyDown={handleKeyDown}\n length={4}\n getRootRef={yearsStartRef}\n index={2}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeStartYearLabel}\n data-testid={startDateTestsProps?.year}\n />\n <InputLikeDivider>{' — '}</InputLikeDivider>\n <NumberInputLike\n value={internalValue[3]}\n minValue={1}\n maxValue={31}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={daysEndRef}\n index={3}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndDayLabel}\n data-testid={endDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[4]}\n minValue={1}\n maxValue={12}\n onKeyDown={handleKeyDown}\n length={2}\n getRootRef={monthsEndRef}\n index={4}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndMonthLabel}\n data-testid={endDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <NumberInputLike\n value={internalValue[5]}\n minValue={1}\n maxValue={275750}\n onKeyDown={handleKeyDown}\n length={4}\n getRootRef={yearsEndRef}\n index={5}\n onElementSelect={setFocusedElement}\n readOnly={readOnly}\n label={changeEndYearLabel}\n data-testid={endDateTestsProps?.year}\n />\n </Text>\n </div>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n onPlacementChange={setCalendarPlacement}\n >\n <FocusTrap\n onClose={closeCalendar}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? Boolean(accessible)}\n captureEscapeKeyboardEvent={false}\n mutationObserverOptions={CALENDAR_MUTATION_OBSERVER_OPTIONS}\n >\n <CalendarRange\n value={value}\n role=\"dialog\"\n onChange={onCalendarChange}\n aria-label={calendarLabel}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n getRootRef={calendarRef}\n disablePickers={disablePickers}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n renderDayContent={renderDayContent}\n {...calendarTestsProps}\n />\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useCustomEnsuredControl","useExternRef","dateFormatter","isMatch","parse","CalendarRange","useConfigProvider","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","dateInputStyles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","CALENDAR_MUTATION_OBSERVER_OPTIONS","childList","subtree","attributes","attributeFilter","DateRangeInput","shouldDisableDate","disableFuture","disablePast","valueProp","defaultValue","onChange","calendarPlacementProp","style","className","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","disableFocusTrap","restoreFocus","calendarLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","changeStartDayLabel","changeStartMonthLabel","changeStartYearLabel","changeEndDayLabel","changeEndMonthLabel","changeEndYearLabel","clearFieldLabel","showCalendarLabel","ariaLabel","prevMonthIcon","nextMonthIcon","onCalendarOpenChanged","renderDayContent","calendarTestsProps","startDateTestsProps","endDateTestsProps","clearButtonTestId","showCalendarButtonTestId","id","accessible","readOnly","disableCalendarProp","before","props","daysStartRef","useRef","monthsStartRef","yearsStartRef","daysEndRef","monthsEndRef","yearsEndRef","disableCalendar","_onChange","useCallback","undefined","updateValue","onInternalValueChange","internalValue","isStartValid","isEndValid","i","formattedStartValue","formattedEndValue","mask","valueExists","Array","isArray","now","Date","start","end","refs","useMemo","onClear","rootRef","calendarRef","open","openCalendar","closeCalendar","toggleCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","maxElement","sizeY","handleRootRef","onCalendarChange","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","startDate","endDate","Intl","DateTimeFormat","weekday","year","month","day","format","join","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","hasBefore","hasAfter","role","aria-labelledby","after","hoverMode","label","onClick","data-testid","div","wrapper","Component","aria-hidden","tabIndex","onFocus","input","normalize","minValue","maxValue","onKeyDown","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","onClose","Boolean","captureEscapeKeyboardEvent","mutationObserverOptions","aria-label"],"mappings":"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"}
@@ -32,10 +32,12 @@ const transitionStateClassNames = {
32
32
  * В компоненте заложена вся логика модального окна.
33
33
  *
34
34
  * @private
35
- */ export const ModalCardInternal = ({ icon, title, titleComponent, description, descriptionComponent, children, actions, size, open, style: styleProp, className, preventClose, ModalOverlay = ModalOverlayDefault, modalOverlayTestId, modalDismissButtonTestId, getRootRef, dismissButtonMode, dismissLabel, noFocusToDialog, restoreFocus, onOpen, onOpened, onClose = noop, onClosed, disableFocusTrap, disableModalOverlay, ...restProps })=>{
35
+ */ export const ModalCardInternal = ({ icon, title, titleComponent, description, descriptionComponent, children, actions, size, open, style: styleProp, className, preventClose, ModalOverlay = ModalOverlayDefault, modalOverlayTestId, modalDismissButtonTestId, getRootRef, dismissButtonMode, dismissLabel, noFocusToDialog, restoreFocus, onOpen, onOpened, onClose = noop, onClosed, disableFocusTrap, disableModalOverlay, disableOpenAnimation, disableCloseAnimation, ...restProps })=>{
36
36
  const platform = usePlatform();
37
37
  const [transitionState, { ref, onTransitionEnd }] = useCSSTransition(open, {
38
- enableAppear: true,
38
+ enableAppear: !disableOpenAnimation,
39
+ enableEnter: !disableOpenAnimation,
40
+ enableExit: !disableCloseAnimation,
39
41
  onEnter () {
40
42
  onOpen?.();
41
43
  },
@@ -70,6 +72,8 @@ const transitionStateClassNames = {
70
72
  getRootRef: setBackdropEl,
71
73
  "data-testid": modalOverlayTestId,
72
74
  visible: open,
75
+ disableOpenAnimation: disableOpenAnimation,
76
+ disableCloseAnimation: disableCloseAnimation,
73
77
  onClick: closable ? function handleBackdropClick(event) {
74
78
  onClose('click-overlay', event);
75
79
  } : undefined