@vkontakte/vkui 8.2.1 → 8.2.2
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.
- package/dist/components/DateInput/DateInput.js +1 -1
- package/dist/components/DateInput/DateInput.js.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/components/Search/Search.js +1 -4
- package/dist/components/Search/Search.js.map +1 -1
- package/dist/components/Snackbar/subcomponents/Basic/Basic.d.ts +1 -1
- package/dist/components/Snackbar/subcomponents/Basic/Basic.d.ts.map +1 -1
- package/dist/components/Snackbar/subcomponents/Basic/Basic.js +11 -2
- package/dist/components/Snackbar/subcomponents/Basic/Basic.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.js +1 -1
- package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +2 -0
- package/dist/cssm/components/Search/Search.js +1 -4
- package/dist/cssm/components/Search/Search.js.map +1 -1
- package/dist/cssm/components/Search/Search.module.css +8 -11
- package/dist/cssm/components/Snackbar/subcomponents/Basic/Basic.js +11 -2
- package/dist/cssm/components/Snackbar/subcomponents/Basic/Basic.js.map +1 -1
- package/dist/cssm/components/Snackbar/subcomponents/Basic/Basic.module.css +0 -8
- package/dist/cssm/hooks/useMergeProps.js +1 -1
- package/dist/cssm/hooks/useMergeProps.js.map +1 -1
- package/dist/cssm/lib/date.js +1 -1
- package/dist/cssm/lib/date.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/hooks/useMergeProps.js +1 -1
- package/dist/hooks/useMergeProps.js.map +1 -1
- package/dist/lib/date.js +1 -1
- package/dist/lib/date.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/DateInput/DateInput.tsx +1 -1
- package/src/components/DateRangeInput/DateRangeInput.tsx +1 -1
- package/src/components/PullToRefresh/PullToRefresh.module.css +2 -0
- package/src/components/PullToRefresh/PullToRefresh.module.css.d.ts.map +1 -1
- package/src/components/Search/Search.module.css +8 -11
- package/src/components/Search/Search.module.css.d.ts.map +1 -1
- package/src/components/Search/Search.tsx +1 -1
- package/src/components/Snackbar/subcomponents/Basic/Basic.module.css +0 -8
- package/src/components/Snackbar/subcomponents/Basic/Basic.module.css.d.ts.map +1 -1
- package/src/components/Snackbar/subcomponents/Basic/Basic.tsx +9 -3
- package/src/hooks/useMergeProps.ts +1 -1
- package/src/lib/date.ts +1 -1
- package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +1 -1
|
@@ -213,7 +213,7 @@ const getInternalValue = (value)=>{
|
|
|
213
213
|
openCalendar,
|
|
214
214
|
accessible
|
|
215
215
|
]);
|
|
216
|
-
const showCalendarButton = !disableCalendar && (accessible || !
|
|
216
|
+
const showCalendarButton = !disableCalendar && (accessible || !value);
|
|
217
217
|
const showClearButton = value && !readOnly;
|
|
218
218
|
useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {
|
|
219
219
|
capture: false
|
|
@@ -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 { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useLocale } from '../../hooks/useLocale';\nimport {\n convertDateToTimeZone,\n createDateInTimeZone,\n dateFormatter,\n dateTimeFormatter,\n isMatch,\n parse,\n startOfDay,\n startOfMinute,\n} from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { cacheDateTimeFormat } from '../../lib/intlCache';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps, type CalendarTestsProps } from '../Calendar/Calendar';\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 labelDateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n} as const;\n\nconst labelDateTimeFormat = /*#__PURE__*/ cacheDateTimeFormat();\n\nconst densityClassNames = {\n none: styles.densityNone,\n compact: styles.densityCompact,\n};\n\nexport type DateInputPropsTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n dayFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n monthFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n yearFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода часа.\n */\n hourFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода минут.\n */\n minuteFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string | undefined;\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 | '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 HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateInputPropsTestsProps {\n /**\n * Обработчик изменения выбранной даты.\n */\n onChange?: ((value: Date | null) => void) | undefined;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarTestsProps | undefined;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto | undefined;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean | undefined;\n /**\n * `aria-label` для календаря.\n */\n calendarLabel?: string | undefined;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string | undefined;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string | undefined;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean | undefined;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: ((opened: boolean) => void) | undefined;\n /**\n * `aria-label` для поля изменения дня.\n */\n changeDayLabel?: string | undefined;\n /**\n * Обработчик нажатия на кнопку `\"Done\"`. Используется совместно с флагом `enableTime`.\n */\n onApply?: ((value?: Date) => void) | undefined;\n /**\n * Функция для кастомного форматирования отображаемого значения даты.\n * Позволяет переопределить стандартное отображение даты и вернуть собственное представление.\n */\n renderCustomValue?: ((date: Date | undefined) => React.ReactNode) | undefined;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string | undefined;\n /**\n * @deprecated Since 8.0.0. Будет удалено в 9.0.0.\n *\n * Включает режим в котором DateInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean | undefined /* TODO [>=v9] удалить свойство */;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: boolean | undefined;\n /**\n * Управление поведением возврата фокуса при закрытии всплывающего окна.\n * @default true\n */\n restoreFocus?: boolean | (() => boolean | HTMLElement) | undefined;\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\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 = true,\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 const focusTrapRootRef = React.useRef<HTMLDivElement | null>(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 const referenceDate = value ?? (enableTime ? startOfMinute(now) : startOfDay(now));\n const parsed = parse(formattedValue, mask, referenceDate);\n const toUpdate = createDateInTimeZone(parsed, timezone);\n updateValue(toUpdate);\n }\n },\n [enableTime, maxElement, timezone, 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 { density = '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, setInternalValue],\n );\n\n const onCalendarChange = React.useCallback(\n (value: Date) => {\n if (enableTime) {\n const valueForDisplay = convertDateToTimeZone(value, timezone) as Date;\n setInternalValue(valueForDisplay);\n return;\n }\n updateValue(value);\n if (closeOnChange) {\n removeFocusFromField();\n }\n },\n [enableTime, timezone, 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 = useLocale();\n const currentDateLabel = value\n ? labelDateTimeFormat(locale, labelDateTimeFormatOptions).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 useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {\n capture: false,\n });\n\n return (\n <FormField\n style={style}\n className={classNames(\n density !== 'regular' && densityClassNames[density],\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 rootRef={focusTrapRootRef}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? (Boolean(accessible) && handleRestoreFocus)}\n >\n <div ref={focusTrapRootRef}>\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 timezone={timezone}\n {...(calendarTestsProps ?? {})}\n />\n </div>\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useExternRef","useGlobalEscKeyDown","useLocale","convertDateToTimeZone","createDateInTimeZone","dateFormatter","dateTimeFormatter","isMatch","parse","startOfDay","startOfMinute","cacheDateTimeFormat","useIsomorphicLayoutEffect","Calendar","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","useDateInputValue","labelDateTimeFormatOptions","weekday","year","month","day","labelDateTimeFormat","densityClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","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","focusTrapRootRef","disableCalendar","updateValue","setInternalValue","getLastUpdatedValue","clearValue","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","now","Date","referenceDate","parsed","toUpdate","refs","useMemo","rootRef","calendarRef","open","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","closeCalendar","toggleCalendar","openCalendar","handleRestoreFocus","onClear","density","handleRootRef","resetValueOnCloseCalendar","onCalendarChange","valueForDisplay","onDoneButtonClick","customValue","undefined","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","format","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","capture","role","aria-labelledby","after","Fragment","hoverMode","label","onClick","data-testid","div","Component","aria-hidden","tabIndex","onFocus","normalize","minValue","maxValue","onKeyDown","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","autoUpdateOnTargetResize","Boolean","ref","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 { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useLocale } from '../../hooks/useLocale';\nimport {\n convertDateToTimeZone,\n createDateInTimeZone,\n dateFormatter,\n dateTimeFormatter,\n isMatch,\n parse,\n startOfDay,\n startOfMinute,\n} from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { cacheDateTimeFormat } from '../../lib/intlCache';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps, type CalendarTestsProps } from '../Calendar/Calendar';\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 labelDateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n} as const;\n\nconst labelDateTimeFormat = /*#__PURE__*/ cacheDateTimeFormat();\n\nconst densityClassNames = {\n none: styles.densityNone,\n compact: styles.densityCompact,\n};\n\nexport type DateInputPropsTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n dayFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n monthFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n yearFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода часа.\n */\n hourFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода минут.\n */\n minuteFieldTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string | undefined;\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 | '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 HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateInputPropsTestsProps {\n /**\n * Обработчик изменения выбранной даты.\n */\n onChange?: ((value: Date | null) => void) | undefined;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarTestsProps | undefined;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto | undefined;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean | undefined;\n /**\n * `aria-label` для календаря.\n */\n calendarLabel?: string | undefined;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string | undefined;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string | undefined;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean | undefined;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: ((opened: boolean) => void) | undefined;\n /**\n * `aria-label` для поля изменения дня.\n */\n changeDayLabel?: string | undefined;\n /**\n * Обработчик нажатия на кнопку `\"Done\"`. Используется совместно с флагом `enableTime`.\n */\n onApply?: ((value?: Date) => void) | undefined;\n /**\n * Функция для кастомного форматирования отображаемого значения даты.\n * Позволяет переопределить стандартное отображение даты и вернуть собственное представление.\n */\n renderCustomValue?: ((date: Date | undefined) => React.ReactNode) | undefined;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string | undefined;\n /**\n * @deprecated Since 8.0.0. Будет удалено в 9.0.0.\n *\n * Включает режим в котором DateInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean | undefined /* TODO [>=v9] удалить свойство */;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: boolean | undefined;\n /**\n * Управление поведением возврата фокуса при закрытии всплывающего окна.\n * @default true\n */\n restoreFocus?: boolean | (() => boolean | HTMLElement) | undefined;\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\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 = true,\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 const focusTrapRootRef = React.useRef<HTMLDivElement | null>(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 const referenceDate = value ?? (enableTime ? startOfMinute(now) : startOfDay(now));\n const parsed = parse(formattedValue, mask, referenceDate);\n const toUpdate = createDateInTimeZone(parsed, timezone);\n updateValue(toUpdate);\n }\n },\n [enableTime, maxElement, timezone, 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 { density = '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, setInternalValue],\n );\n\n const onCalendarChange = React.useCallback(\n (value: Date) => {\n if (enableTime) {\n const valueForDisplay = convertDateToTimeZone(value, timezone) as Date;\n setInternalValue(valueForDisplay);\n return;\n }\n updateValue(value);\n if (closeOnChange) {\n removeFocusFromField();\n }\n },\n [enableTime, timezone, 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 = useLocale();\n const currentDateLabel = value\n ? labelDateTimeFormat(locale, labelDateTimeFormatOptions).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 || !value);\n const showClearButton = value && !readOnly;\n\n useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {\n capture: false,\n });\n\n return (\n <FormField\n style={style}\n className={classNames(\n density !== 'regular' && densityClassNames[density],\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 rootRef={focusTrapRootRef}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? (Boolean(accessible) && handleRestoreFocus)}\n >\n <div ref={focusTrapRootRef}>\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 timezone={timezone}\n {...(calendarTestsProps ?? {})}\n />\n </div>\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useExternRef","useGlobalEscKeyDown","useLocale","convertDateToTimeZone","createDateInTimeZone","dateFormatter","dateTimeFormatter","isMatch","parse","startOfDay","startOfMinute","cacheDateTimeFormat","useIsomorphicLayoutEffect","Calendar","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","useDateInputValue","labelDateTimeFormatOptions","weekday","year","month","day","labelDateTimeFormat","densityClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","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","focusTrapRootRef","disableCalendar","updateValue","setInternalValue","getLastUpdatedValue","clearValue","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","now","Date","referenceDate","parsed","toUpdate","refs","useMemo","rootRef","calendarRef","open","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","closeCalendar","toggleCalendar","openCalendar","handleRestoreFocus","onClear","density","handleRootRef","resetValueOnCloseCalendar","onCalendarChange","valueForDisplay","onDoneButtonClick","customValue","undefined","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","format","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","capture","role","aria-labelledby","after","Fragment","hoverMode","label","onClick","data-testid","div","Component","aria-hidden","tabIndex","onFocus","normalize","minValue","maxValue","onKeyDown","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","autoUpdateOnTargetResize","Boolean","ref","aria-label"],"mappings":"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"}
|
|
@@ -211,7 +211,7 @@ const getInternalValue = (value)=>{
|
|
|
211
211
|
openCalendar,
|
|
212
212
|
accessible
|
|
213
213
|
]);
|
|
214
|
-
const showCalendarButton = !disableCalendar && (accessible || !
|
|
214
|
+
const showCalendarButton = !disableCalendar && (accessible || !value);
|
|
215
215
|
const showClearButton = value && !readOnly;
|
|
216
216
|
useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {
|
|
217
217
|
capture: false
|
|
@@ -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 { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useLocale } from '../../hooks/useLocale';\nimport { dateFormatter, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { cacheDateTimeFormat } from '../../lib/intlCache';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type CalendarRangeTestsProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\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 labelDateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n} as const;\n\nconst labelDateTimeFormat = /*#__PURE__*/ cacheDateTimeFormat();\n\nconst densityClassNames = {\n none: dateInputStyles.densityNone,\n compact: dateInputStyles.densityCompact,\n};\n\ntype DateTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n day?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n month?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n year?: string | undefined;\n};\n\nexport type DateRangeInputTestsProps = {\n /**\n * Передает атрибуты `data-testid` для полей ввода начальной даты.\n */\n startDateTestsProps?: DateTestsProps | undefined;\n /**\n * Передает атрибуты `data-testid` для полей ввода конечной даты.\n */\n endDateTestsProps?: DateTestsProps | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string | undefined;\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 | '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 HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateRangeInputTestsProps {\n /**\n * Обработчик изменения выбранного промежутка.\n */\n onChange?: ((value: DateRangeType | null) => void) | undefined;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarRangeTestsProps | undefined;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto | undefined;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean | undefined;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: ((opened: boolean) => void) | undefined;\n /**\n * Label для календаря.\n */\n calendarLabel?: string | undefined;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string | undefined;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string | undefined;\n /**\n * Label для ввода дня начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartDayLabel?: string | undefined;\n /**\n * Label для ввода месяца начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartMonthLabel?: string | undefined;\n /**\n * Label для ввода года начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartYearLabel?: string | undefined;\n /**\n * Label для ввода дня конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndDayLabel?: string | undefined;\n /**\n * Label для ввода месяца конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndMonthLabel?: string | undefined;\n /**\n * Label для ввода года конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndYearLabel?: string | undefined;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean | undefined;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: boolean | undefined;\n /**\n * Управление поведением возврата фокуса при закрытии всплывающего окна.\n * @default true\n */\n restoreFocus?: boolean | (() => boolean | HTMLElement) | undefined;\n /**\n * @deprecated Since 8.0.0. Будет удалено в 9.0.0.\n *\n * Включает режим в котором DateRangeInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateRangeInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean /* TODO [>=v9] удалить свойство */ | undefined;\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\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 = true,\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 const focusTrapRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null>({\n value: valueProp,\n defaultValue: defaultValue as DateRangeType | null,\n 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(null), [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 { density = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType) => {\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 = useLocale();\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 labelDateTimeFormat(locale, labelDateTimeFormatOptions).format(startDate),\n labelDateTimeFormat(locale, labelDateTimeFormatOptions).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 useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {\n capture: false,\n });\n\n return (\n <FormField\n style={style}\n className={classNames(\n density !== 'regular' && densityClassNames[density],\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 rootRef={focusTrapRootRef}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? Boolean(accessible)}\n >\n <div ref={focusTrapRootRef}>\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 </div>\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useCustomEnsuredControl","useExternRef","useGlobalEscKeyDown","useLocale","dateFormatter","isMatch","parse","cacheDateTimeFormat","CalendarRange","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","labelDateTimeFormatOptions","weekday","year","month","day","labelDateTimeFormat","densityClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","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","focusTrapRootRef","disableCalendar","updateValue","onInternalValueChange","useCallback","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","density","handleRootRef","onCalendarChange","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","startDate","endDate","format","join","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","capture","role","aria-labelledby","after","hoverMode","label","onClick","data-testid","div","Component","aria-hidden","tabIndex","onFocus","normalize","minValue","maxValue","onKeyDown","undefined","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","Boolean","ref","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 { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useLocale } from '../../hooks/useLocale';\nimport { dateFormatter, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { cacheDateTimeFormat } from '../../lib/intlCache';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type CalendarRangeTestsProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\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 labelDateTimeFormatOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n} as const;\n\nconst labelDateTimeFormat = /*#__PURE__*/ cacheDateTimeFormat();\n\nconst densityClassNames = {\n none: dateInputStyles.densityNone,\n compact: dateInputStyles.densityCompact,\n};\n\ntype DateTestsProps = {\n /**\n * Передает атрибут `data-testid` для поля ввода дня.\n */\n day?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода месяца.\n */\n month?: string | undefined;\n /**\n * Передает атрибут `data-testid` для поля ввода года.\n */\n year?: string | undefined;\n};\n\nexport type DateRangeInputTestsProps = {\n /**\n * Передает атрибуты `data-testid` для полей ввода начальной даты.\n */\n startDateTestsProps?: DateTestsProps | undefined;\n /**\n * Передает атрибуты `data-testid` для полей ввода конечной даты.\n */\n endDateTestsProps?: DateTestsProps | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки показа календаря.\n */\n showCalendarButtonTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки очистки даты.\n */\n clearButtonTestId?: string | undefined;\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 | '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 HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateRangeInputTestsProps {\n /**\n * Обработчик изменения выбранного промежутка.\n */\n onChange?: ((value: DateRangeType | null) => void) | undefined;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в календаре.\n */\n calendarTestsProps?: CalendarRangeTestsProps | undefined;\n /**\n * Расположение календаря относительно поля ввода.\n */\n calendarPlacement?: PlacementWithAuto | undefined;\n /**\n * Автоматически закрывать календарь при изменениях.\n */\n closeOnChange?: boolean | undefined;\n /**\n * Обработчик изменения состояния открытия календаря.\n */\n onCalendarOpenChanged?: ((opened: boolean) => void) | undefined;\n /**\n * Label для календаря.\n */\n calendarLabel?: string | undefined;\n /**\n * Label для кнопки очистки. Делает доступным для ассистивных технологий.\n */\n clearFieldLabel?: string | undefined;\n /**\n * Label для кнопки открытия календаря. Делает доступным для ассистивных технологий.\n */\n showCalendarLabel?: string | undefined;\n /**\n * Label для ввода дня начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartDayLabel?: string | undefined;\n /**\n * Label для ввода месяца начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartMonthLabel?: string | undefined;\n /**\n * Label для ввода года начальной даты. Делает доступным для ассистивных технологий.\n */\n changeStartYearLabel?: string | undefined;\n /**\n * Label для ввода дня конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndDayLabel?: string | undefined;\n /**\n * Label для ввода месяца конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndMonthLabel?: string | undefined;\n /**\n * Label для ввода года конечной даты. Делает доступным для ассистивных технологий.\n */\n changeEndYearLabel?: string | undefined;\n /**\n * Отключение открытия календаря.\n */\n disableCalendar?: boolean | undefined;\n /**\n * Позволяет отключить захват фокуса при появлении календаря.\n */\n disableFocusTrap?: boolean | undefined;\n /**\n * Управление поведением возврата фокуса при закрытии всплывающего окна.\n * @default true\n */\n restoreFocus?: boolean | (() => boolean | HTMLElement) | undefined;\n /**\n * @deprecated Since 8.0.0. Будет удалено в 9.0.0.\n *\n * Включает режим в котором DateRangeInput доступен\n * для ассистивных технологий.\n * В этом режиме:\n * - календарь больше не открывает при фокусе на DateRangeInput;\n * - иконка календаря видна всегда, чтобы пользователи\n * ассистивных технологий могли открыть календарь по клику на иконку;\n * - календарь при открытии получает фокус, клавиатурный\n * фокус зациклен и не выходит за пределы календаря пока календарь не закрыт.\n */\n accessible?: boolean /* TODO [>=v9] удалить свойство */ | undefined;\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\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 = true,\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 const focusTrapRootRef = React.useRef<HTMLDivElement | null>(null);\n\n const disableCalendar = readOnly ? true : disableCalendarProp;\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null>({\n value: valueProp,\n defaultValue: defaultValue as DateRangeType | null,\n 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(null), [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 { density = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType) => {\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 = useLocale();\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 labelDateTimeFormat(locale, labelDateTimeFormatOptions).format(startDate),\n labelDateTimeFormat(locale, labelDateTimeFormatOptions).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 || !value);\n const showClearButton = value && !readOnly;\n\n useGlobalEscKeyDown(open && !disableCalendar, closeCalendar, {\n capture: false,\n });\n\n return (\n <FormField\n style={style}\n className={classNames(\n density !== 'regular' && densityClassNames[density],\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 rootRef={focusTrapRootRef}\n disabled={disableFocusTrap ?? !accessible}\n restoreFocus={restoreFocus ?? Boolean(accessible)}\n >\n <div ref={focusTrapRootRef}>\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 </div>\n </FocusTrap>\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useCustomEnsuredControl","useExternRef","useGlobalEscKeyDown","useLocale","dateFormatter","isMatch","parse","cacheDateTimeFormat","CalendarRange","FocusTrap","FormField","IconButton","InputLikeDivider","NumberInputLike","Popper","Text","VisuallyHidden","labelDateTimeFormatOptions","weekday","year","month","day","labelDateTimeFormat","densityClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","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","focusTrapRootRef","disableCalendar","updateValue","onInternalValueChange","useCallback","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","density","handleRootRef","onCalendarChange","calendarPlacement","setCalendarPlacement","useState","locale","currentDateLabel","startDate","endDate","format","join","currentDateLabelId","useId","ariaLabelId","showCalendarOnInputAreaClick","showCalendarButton","showClearButton","capture","role","aria-labelledby","after","hoverMode","label","onClick","data-testid","div","Component","aria-hidden","tabIndex","onFocus","normalize","minValue","maxValue","onKeyDown","undefined","onElementSelect","targetRef","offsetByMainAxis","placement","onPlacementChange","Boolean","ref","aria-label"],"mappings":"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"}
|
|
@@ -220,10 +220,7 @@ autoComplete = 'off', autoCapitalize, autoCorrect, disabled, list, maxLength, mi
|
|
|
220
220
|
onClick: onCancel,
|
|
221
221
|
onFocus: setFocusedTrue,
|
|
222
222
|
onBlur: setFocusedFalse,
|
|
223
|
-
children:
|
|
224
|
-
className: "vkuiSearch__afterTextClip",
|
|
225
|
-
children: after
|
|
226
|
-
})
|
|
223
|
+
children: after
|
|
227
224
|
})
|
|
228
225
|
})
|
|
229
226
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Search/Search.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useMergeProps } from '../../hooks/useMergeProps';\nimport { useNativeFormResetListener } from '../../hooks/useNativeFormResetListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { touchEnabled } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HasDataAttribute, HasRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton, type IconButtonProps } from '../IconButton/IconButton';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Search.module.css';\n\nconst warn = warnOnce('Search');\n\nexport type RenderIconButtonFn = (\n icon: React.ReactNode,\n props?: (Partial<IconButtonProps> & HasDataAttribute) | undefined,\n) => React.ReactElement;\n\nexport interface SearchProps\n extends Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n | 'autoComplete'\n | 'autoCapitalize'\n | 'autoCorrect'\n | 'disabled'\n | 'list'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'pattern'\n | 'enterKeyHint'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'value'\n | 'form'\n | 'onChange'\n | 'onFocus'\n | 'onBlur'\n >,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onFocus' | 'onBlur'>,\n HasRootRef<HTMLDivElement> {\n /**\n * @deprecated Since 7.9.0. Вместо этого используйте `slotProps={ input: { getRootRef: ... } }`.\n */\n getRef?: React.Ref<HTMLInputElement> | undefined;\n /**\n * Свойства, которые можно прокинуть внутрь компонента:\n * - `root`: свойства для прокидывания в корень компонента;\n * - `input`: свойства для прокидывания в поле ввода;\n * - `clearButton`: свойства для прокидывания в кнопку очистки.\n */\n slotProps?:\n | {\n root?:\n | (React.HTMLAttributes<HTMLDivElement> & HasRootRef<HTMLDivElement> & HasDataAttribute)\n | undefined;\n input?: React.InputHTMLAttributes<HTMLInputElement> &\n HasRootRef<HTMLInputElement> &\n HasDataAttribute;\n clearButton?: React.HTMLAttributes<HTMLElement> &\n HasRootRef<HTMLElement> &\n HasDataAttribute;\n }\n | undefined;\n /**\n * Only iOS. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode | undefined;\n /**\n * Контент, отображаемый перед полем ввода.\n */\n before?: React.ReactNode | undefined;\n /**\n * Иконка поиска. Может быть React-элементом или функцией, возвращающей элемент.\n */\n icon?: React.ReactNode | ((renderFn: RenderIconButtonFn) => React.ReactNode) | undefined;\n /**\n * Обработчик нажатия на иконку поиска.\n */\n onIconClick?: React.PointerEventHandler<HTMLElement> | undefined;\n /**\n * Значение поля ввода по умолчанию.\n */\n defaultValue?: string | undefined;\n /**\n * Текст для скринридеров, описывающий иконку поиска.\n */\n iconLabel?: string | undefined;\n /**\n * Текст для скринридеров, описывающий кнопку очистки.\n */\n clearLabel?: string | undefined;\n /**\n * @deprecated Since 8.1.0. Будет удалено в **VKUI v10**. Вместо этого используйте `slotProps={ clearButton: { 'data-testid': ... } }`.\n *\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string | undefined;\n /**\n * Удаляет отступы у компонента.\n */\n noPadding?: boolean | undefined;\n /**\n * Текст для кнопки Найти.\n */\n findButtonText?: string | undefined;\n /**\n * Обработчик, при нажатии на кнопку \"Найти\".\n */\n onFindButtonClick?: React.MouseEventHandler<HTMLElement> | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки поиска.\n */\n findButtonTestId?: string | undefined;\n /**\n * Скрывает кнопку очистки.\n */\n hideClearButton?: boolean | undefined;\n}\n\n/**\n * @see https://vkui.io/components/search\n */\nexport const Search = ({\n // SearchProps\n after = 'Отмена',\n before = <Icon16SearchOutline />,\n icon: iconProp,\n onIconClick,\n iconLabel,\n clearLabel = 'Очистить',\n clearButtonTestId,\n noPadding,\n findButtonText = 'Найти',\n onFindButtonClick,\n findButtonTestId,\n hideClearButton,\n getRef,\n\n // input props\n autoComplete = 'off',\n autoCapitalize,\n autoCorrect,\n disabled,\n list,\n maxLength,\n minLength,\n name,\n pattern,\n placeholder: placeholderProp = 'Поиск',\n enterKeyHint,\n readOnly,\n required,\n value,\n form,\n id: idProp,\n inputMode,\n defaultValue,\n autoFocus,\n tabIndex,\n spellCheck,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n\n slotProps,\n ...restProps\n}: SearchProps): React.ReactNode => {\n /* istanbul ignore if: не проверяем в тестах */\n if (process.env.NODE_ENV === 'development') {\n if (getRef) {\n warn('Свойство `getRef` устаревшее, используйте `slotProps={ input: { getRootRef: ... } }`');\n }\n if (clearButtonTestId) {\n warn(\n \"Свойство `clearButtonTestId` устаревшее, используйте `slotProps={ clearButton: { 'data-testid': ... } }`\",\n );\n }\n }\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n\n const rootRest = useMergeProps(restProps, slotProps?.root);\n\n const {\n id,\n placeholder,\n getRootRef: getInputRef,\n onChange,\n onFocus: onInputFocus,\n onBlur: onInputBlur,\n ...inputRest\n } = useMergeProps(\n {\n getRootRef: getRef,\n className: styles.nativeInput,\n placeholder: placeholderProp,\n autoComplete,\n autoCapitalize,\n autoCorrect,\n disabled,\n list,\n maxLength,\n minLength,\n name,\n pattern,\n enterKeyHint,\n readOnly,\n required,\n value,\n form,\n id: idProp,\n inputMode,\n defaultValue,\n autoFocus,\n tabIndex,\n spellCheck,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n },\n slotProps?.input,\n );\n\n const {\n onClick: onClearButtonClick,\n onPointerDown: onClearButtonPointerDown,\n ...clearButtonRest\n } = useMergeProps({ className: styles.icon }, slotProps?.clearButton);\n\n const inputRef = useExternRef(getInputRef);\n const [isFocused, setFocusedTrue, setFocusedFalse] = useBooleanState(false);\n const generatedId = React.useId();\n const inputId = id ? id : `search-${generatedId}`;\n\n const [hasValue, setHasValue] = React.useState<boolean>(() =>\n Boolean(inputRest.value || inputRest.defaultValue),\n );\n const checkHasValue: React.ChangeEventHandler<HTMLInputElement> = (e) =>\n setHasValue(Boolean(e.currentTarget.value));\n\n const { density = 'none' } = useAdaptivity();\n const { density: adaptiveDensity } = useAdaptivityConditionalRender();\n const platform = usePlatform();\n\n const hasAfter = platform === 'ios' && hasReactNode(after);\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n onInputFocus && onInputFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n onInputBlur && onInputBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => onIconClick?.(e),\n [onIconClick],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (inputRest.value !== undefined) {\n setHasValue(Boolean(inputRest.value));\n }\n }, [inputRest.value]);\n\n useNativeFormResetListener(inputRef, () => {\n setHasValue(Boolean(inputRest.defaultValue));\n });\n\n const renderIconButton: RenderIconButtonFn = (icon, props = {}) => (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconClickStart}\n className={styles.icon}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n onClick={noop}\n {...props}\n >\n <VisuallyHidden>{iconLabel}</VisuallyHidden>\n {icon}\n </IconButton>\n );\n\n const showControls = Boolean(\n iconProp || !hideClearButton || (adaptiveDensity.compact && onFindButtonClick),\n );\n\n const onClearPointerDown: React.PointerEventHandler<HTMLElement> = (e) => {\n // Сначала вызываем внешний обработчик, затем локальную логику, чтобы можно было предотвратить обработку фокуса на поле ввода.\n onClearButtonPointerDown?.(e);\n\n e.preventDefault();\n inputRef.current?.focus();\n if (touchEnabled()) {\n onCancel();\n }\n };\n\n const onClearClick: React.MouseEventHandler<HTMLElement> = (e) => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n\n onClearButtonClick?.(e);\n };\n\n return (\n <RootComponent\n baseClassName={classNames(\n 'vkuiInternalSearch',\n styles.host,\n density === 'none' && styles.densityNone,\n density === 'compact' && styles.densityCompact,\n isFocused && styles.focused,\n hasValue && styles.hasValue,\n hasAfter && styles.hasAfter,\n iconProp && styles.hasIcon,\n inputRest.disabled && styles.disabled,\n !noPadding && styles.withPadding,\n isRtl && styles.rtl,\n )}\n {...rootRest}\n >\n <div className={styles.field}>\n <label htmlFor={inputId} className={styles.label}>\n {placeholder}\n </label>\n <div className={styles.input}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n id={inputId}\n placeholder={placeholder}\n getRootRef={inputRef}\n onChange={callMultiple(onChange, checkHasValue)}\n onFocus={onFocus}\n onBlur={onBlur}\n {...inputRest}\n />\n </div>\n {showControls && (\n <div className={styles.controls}>\n {iconProp &&\n (typeof iconProp === 'function'\n ? iconProp(renderIconButton)\n : renderIconButton(iconProp))}\n {!hideClearButton && (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onClearPointerDown}\n onClick={onClearClick}\n tabIndex={hasValue ? undefined : -1}\n disabled={inputRest.disabled}\n data-testid={clearButtonTestId}\n {...clearButtonRest}\n >\n <VisuallyHidden>{clearLabel}</VisuallyHidden>\n {platform === 'ios' ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n )}\n {adaptiveDensity.compact && onFindButtonClick && (\n <Button\n mode=\"primary\"\n size=\"m\"\n className={classNames(styles.findButton, adaptiveDensity.compact.className)}\n focusVisibleMode=\"inside\"\n onClick={onFindButtonClick}\n tabIndex={hasValue ? undefined : -1}\n data-testid={findButtonTestId}\n >\n {findButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n {hasAfter && (\n <div className={styles.after}>\n <Button\n mode=\"tertiary\"\n size=\"m\"\n focusVisibleMode=\"inside\"\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n <span className={styles.afterTextClip}>{after}</span>\n </Button>\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","hasReactNode","noop","useAdaptivity","useAdaptivityConditionalRender","useBooleanState","useConfigDirection","useExternRef","useMergeProps","useNativeFormResetListener","usePlatform","callMultiple","touchEnabled","useIsomorphicLayoutEffect","warnOnce","Button","IconButton","RootComponent","Headline","VisuallyHidden","warn","Search","after","before","icon","iconProp","onIconClick","iconLabel","clearLabel","clearButtonTestId","noPadding","findButtonText","onFindButtonClick","findButtonTestId","hideClearButton","getRef","autoComplete","autoCapitalize","autoCorrect","disabled","list","maxLength","minLength","name","pattern","placeholder","placeholderProp","enterKeyHint","readOnly","required","value","form","id","idProp","inputMode","defaultValue","autoFocus","tabIndex","spellCheck","onChange","onChangeProp","onFocus","onFocusProp","onBlur","onBlurProp","slotProps","restProps","process","env","NODE_ENV","direction","isRtl","rootRest","root","getRootRef","getInputRef","onInputFocus","onInputBlur","inputRest","className","input","onClick","onClearButtonClick","onPointerDown","onClearButtonPointerDown","clearButtonRest","clearButton","inputRef","isFocused","setFocusedTrue","setFocusedFalse","generatedId","useId","inputId","hasValue","setHasValue","useState","Boolean","checkHasValue","e","currentTarget","density","adaptiveDensity","platform","hasAfter","onCancel","useCallback","nativeInputValueSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","undefined","renderIconButton","props","hoverMode","showControls","compact","onClearPointerDown","preventDefault","focus","onClearClick","baseClassName","div","label","htmlFor","Component","type","level","weight","data-testid","mode","size","focusVisibleMode","activeMode","span"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Search/Search.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useMergeProps } from '../../hooks/useMergeProps';\nimport { useNativeFormResetListener } from '../../hooks/useNativeFormResetListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { touchEnabled } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HasDataAttribute, HasRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton, type IconButtonProps } from '../IconButton/IconButton';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Search.module.css';\n\nconst warn = warnOnce('Search');\n\nexport type RenderIconButtonFn = (\n icon: React.ReactNode,\n props?: (Partial<IconButtonProps> & HasDataAttribute) | undefined,\n) => React.ReactElement;\n\nexport interface SearchProps\n extends Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n | 'autoComplete'\n | 'autoCapitalize'\n | 'autoCorrect'\n | 'disabled'\n | 'list'\n | 'maxLength'\n | 'minLength'\n | 'name'\n | 'pattern'\n | 'enterKeyHint'\n | 'placeholder'\n | 'readOnly'\n | 'required'\n | 'value'\n | 'form'\n | 'onChange'\n | 'onFocus'\n | 'onBlur'\n >,\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'onFocus' | 'onBlur'>,\n HasRootRef<HTMLDivElement> {\n /**\n * @deprecated Since 7.9.0. Вместо этого используйте `slotProps={ input: { getRootRef: ... } }`.\n */\n getRef?: React.Ref<HTMLInputElement> | undefined;\n /**\n * Свойства, которые можно прокинуть внутрь компонента:\n * - `root`: свойства для прокидывания в корень компонента;\n * - `input`: свойства для прокидывания в поле ввода;\n * - `clearButton`: свойства для прокидывания в кнопку очистки.\n */\n slotProps?:\n | {\n root?:\n | (React.HTMLAttributes<HTMLDivElement> & HasRootRef<HTMLDivElement> & HasDataAttribute)\n | undefined;\n input?: React.InputHTMLAttributes<HTMLInputElement> &\n HasRootRef<HTMLInputElement> &\n HasDataAttribute;\n clearButton?: React.HTMLAttributes<HTMLElement> &\n HasRootRef<HTMLElement> &\n HasDataAttribute;\n }\n | undefined;\n /**\n * Only iOS. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode | undefined;\n /**\n * Контент, отображаемый перед полем ввода.\n */\n before?: React.ReactNode | undefined;\n /**\n * Иконка поиска. Может быть React-элементом или функцией, возвращающей элемент.\n */\n icon?: React.ReactNode | ((renderFn: RenderIconButtonFn) => React.ReactNode) | undefined;\n /**\n * Обработчик нажатия на иконку поиска.\n */\n onIconClick?: React.PointerEventHandler<HTMLElement> | undefined;\n /**\n * Значение поля ввода по умолчанию.\n */\n defaultValue?: string | undefined;\n /**\n * Текст для скринридеров, описывающий иконку поиска.\n */\n iconLabel?: string | undefined;\n /**\n * Текст для скринридеров, описывающий кнопку очистки.\n */\n clearLabel?: string | undefined;\n /**\n * @deprecated Since 8.1.0. Будет удалено в **VKUI v10**. Вместо этого используйте `slotProps={ clearButton: { 'data-testid': ... } }`.\n *\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string | undefined;\n /**\n * Удаляет отступы у компонента.\n */\n noPadding?: boolean | undefined;\n /**\n * Текст для кнопки Найти.\n */\n findButtonText?: string | undefined;\n /**\n * Обработчик, при нажатии на кнопку \"Найти\".\n */\n onFindButtonClick?: React.MouseEventHandler<HTMLElement> | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки поиска.\n */\n findButtonTestId?: string | undefined;\n /**\n * Скрывает кнопку очистки.\n */\n hideClearButton?: boolean | undefined;\n}\n\n/**\n * @see https://vkui.io/components/search\n */\nexport const Search = ({\n // SearchProps\n after = 'Отмена',\n before = <Icon16SearchOutline />,\n icon: iconProp,\n onIconClick,\n iconLabel,\n clearLabel = 'Очистить',\n clearButtonTestId,\n noPadding,\n findButtonText = 'Найти',\n onFindButtonClick,\n findButtonTestId,\n hideClearButton,\n getRef,\n\n // input props\n autoComplete = 'off',\n autoCapitalize,\n autoCorrect,\n disabled,\n list,\n maxLength,\n minLength,\n name,\n pattern,\n placeholder: placeholderProp = 'Поиск',\n enterKeyHint,\n readOnly,\n required,\n value,\n form,\n id: idProp,\n inputMode,\n defaultValue,\n autoFocus,\n tabIndex,\n spellCheck,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n\n slotProps,\n ...restProps\n}: SearchProps): React.ReactNode => {\n /* istanbul ignore if: не проверяем в тестах */\n if (process.env.NODE_ENV === 'development') {\n if (getRef) {\n warn('Свойство `getRef` устаревшее, используйте `slotProps={ input: { getRootRef: ... } }`');\n }\n if (clearButtonTestId) {\n warn(\n \"Свойство `clearButtonTestId` устаревшее, используйте `slotProps={ clearButton: { 'data-testid': ... } }`\",\n );\n }\n }\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n\n const rootRest = useMergeProps(restProps, slotProps?.root);\n\n const {\n id,\n placeholder,\n getRootRef: getInputRef,\n onChange,\n onFocus: onInputFocus,\n onBlur: onInputBlur,\n ...inputRest\n } = useMergeProps(\n {\n getRootRef: getRef,\n className: styles.nativeInput,\n placeholder: placeholderProp,\n autoComplete,\n autoCapitalize,\n autoCorrect,\n disabled,\n list,\n maxLength,\n minLength,\n name,\n pattern,\n enterKeyHint,\n readOnly,\n required,\n value,\n form,\n id: idProp,\n inputMode,\n defaultValue,\n autoFocus,\n tabIndex,\n spellCheck,\n onChange: onChangeProp,\n onFocus: onFocusProp,\n onBlur: onBlurProp,\n },\n slotProps?.input,\n );\n\n const {\n onClick: onClearButtonClick,\n onPointerDown: onClearButtonPointerDown,\n ...clearButtonRest\n } = useMergeProps({ className: styles.icon }, slotProps?.clearButton);\n\n const inputRef = useExternRef(getInputRef);\n const [isFocused, setFocusedTrue, setFocusedFalse] = useBooleanState(false);\n const generatedId = React.useId();\n const inputId = id ? id : `search-${generatedId}`;\n\n const [hasValue, setHasValue] = React.useState<boolean>(() =>\n Boolean(inputRest.value || inputRest.defaultValue),\n );\n const checkHasValue: React.ChangeEventHandler<HTMLInputElement> = (e) =>\n setHasValue(Boolean(e.currentTarget.value));\n\n const { density = 'none' } = useAdaptivity();\n const { density: adaptiveDensity } = useAdaptivityConditionalRender();\n const platform = usePlatform();\n\n const hasAfter = platform === 'ios' && hasReactNode(after);\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n onInputFocus && onInputFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n onInputBlur && onInputBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => onIconClick?.(e),\n [onIconClick],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (inputRest.value !== undefined) {\n setHasValue(Boolean(inputRest.value));\n }\n }, [inputRest.value]);\n\n useNativeFormResetListener(inputRef, () => {\n setHasValue(Boolean(inputRest.defaultValue));\n });\n\n const renderIconButton: RenderIconButtonFn = (icon, props = {}) => (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconClickStart}\n className={styles.icon}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n onClick={noop}\n {...props}\n >\n <VisuallyHidden>{iconLabel}</VisuallyHidden>\n {icon}\n </IconButton>\n );\n\n const showControls = Boolean(\n iconProp || !hideClearButton || (adaptiveDensity.compact && onFindButtonClick),\n );\n\n const onClearPointerDown: React.PointerEventHandler<HTMLElement> = (e) => {\n // Сначала вызываем внешний обработчик, затем локальную логику, чтобы можно было предотвратить обработку фокуса на поле ввода.\n onClearButtonPointerDown?.(e);\n\n e.preventDefault();\n inputRef.current?.focus();\n if (touchEnabled()) {\n onCancel();\n }\n };\n\n const onClearClick: React.MouseEventHandler<HTMLElement> = (e) => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n\n onClearButtonClick?.(e);\n };\n\n return (\n <RootComponent\n baseClassName={classNames(\n 'vkuiInternalSearch',\n styles.host,\n density === 'none' && styles.densityNone,\n density === 'compact' && styles.densityCompact,\n isFocused && styles.focused,\n hasValue && styles.hasValue,\n hasAfter && styles.hasAfter,\n iconProp && styles.hasIcon,\n inputRest.disabled && styles.disabled,\n !noPadding && styles.withPadding,\n isRtl && styles.rtl,\n )}\n {...rootRest}\n >\n <div className={styles.field}>\n <label htmlFor={inputId} className={styles.label}>\n {placeholder}\n </label>\n <div className={styles.input}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n id={inputId}\n placeholder={placeholder}\n getRootRef={inputRef}\n onChange={callMultiple(onChange, checkHasValue)}\n onFocus={onFocus}\n onBlur={onBlur}\n {...inputRest}\n />\n </div>\n {showControls && (\n <div className={styles.controls}>\n {iconProp &&\n (typeof iconProp === 'function'\n ? iconProp(renderIconButton)\n : renderIconButton(iconProp))}\n {!hideClearButton && (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onClearPointerDown}\n onClick={onClearClick}\n tabIndex={hasValue ? undefined : -1}\n disabled={inputRest.disabled}\n data-testid={clearButtonTestId}\n {...clearButtonRest}\n >\n <VisuallyHidden>{clearLabel}</VisuallyHidden>\n {platform === 'ios' ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n )}\n {adaptiveDensity.compact && onFindButtonClick && (\n <Button\n mode=\"primary\"\n size=\"m\"\n className={classNames(styles.findButton, adaptiveDensity.compact.className)}\n focusVisibleMode=\"inside\"\n onClick={onFindButtonClick}\n tabIndex={hasValue ? undefined : -1}\n data-testid={findButtonTestId}\n >\n {findButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n {hasAfter && (\n <div className={styles.after}>\n <Button\n mode=\"tertiary\"\n size=\"m\"\n focusVisibleMode=\"inside\"\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n {after}\n </Button>\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","hasReactNode","noop","useAdaptivity","useAdaptivityConditionalRender","useBooleanState","useConfigDirection","useExternRef","useMergeProps","useNativeFormResetListener","usePlatform","callMultiple","touchEnabled","useIsomorphicLayoutEffect","warnOnce","Button","IconButton","RootComponent","Headline","VisuallyHidden","warn","Search","after","before","icon","iconProp","onIconClick","iconLabel","clearLabel","clearButtonTestId","noPadding","findButtonText","onFindButtonClick","findButtonTestId","hideClearButton","getRef","autoComplete","autoCapitalize","autoCorrect","disabled","list","maxLength","minLength","name","pattern","placeholder","placeholderProp","enterKeyHint","readOnly","required","value","form","id","idProp","inputMode","defaultValue","autoFocus","tabIndex","spellCheck","onChange","onChangeProp","onFocus","onFocusProp","onBlur","onBlurProp","slotProps","restProps","process","env","NODE_ENV","direction","isRtl","rootRest","root","getRootRef","getInputRef","onInputFocus","onInputBlur","inputRest","className","input","onClick","onClearButtonClick","onPointerDown","onClearButtonPointerDown","clearButtonRest","clearButton","inputRef","isFocused","setFocusedTrue","setFocusedFalse","generatedId","useId","inputId","hasValue","setHasValue","useState","Boolean","checkHasValue","e","currentTarget","density","adaptiveDensity","platform","hasAfter","onCancel","useCallback","nativeInputValueSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","undefined","renderIconButton","props","hoverMode","showControls","compact","onClearPointerDown","preventDefault","focus","onClearClick","baseClassName","div","label","htmlFor","Component","type","level","weight","data-testid","mode","size","focusVisibleMode","activeMode"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Basic.d.ts","sourceRoot":"","sources":["../../../../../src/components/Snackbar/subcomponents/Basic/Basic.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"Basic.d.ts","sourceRoot":"","sources":["../../../../../src/components/Snackbar/subcomponents/Basic/Basic.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAkBnE,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAErC;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAEpC;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;IAE/C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAErC;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAEtC;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU;CAAG;AAEpG,wBAAgB,KAAK,CAAC,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EACN,KAAK,EACL,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EACb,EAAE,kBAAkB,GAAG,KAAK,CAAC,SAAS,CA+BtC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
3
4
|
import { classNames } from "@vkontakte/vkjs";
|
|
4
5
|
import { useAdaptivity } from "../../../../hooks/useAdaptivity.js";
|
|
6
|
+
import { ColorSchemeProvider } from "../../../ColorSchemeProvider/ColorSchemeProvider.js";
|
|
5
7
|
import { RootComponent } from "../../../RootComponent/RootComponent.js";
|
|
6
8
|
import { Paragraph } from "../../../Typography/Paragraph/Paragraph.js";
|
|
7
9
|
import { Subhead } from "../../../Typography/Subhead/Subhead.js";
|
|
@@ -17,9 +19,9 @@ const densityClassNames = {
|
|
|
17
19
|
export function Basic({ layout: layoutProps, action, after, before, mode, subtitle, children, ...restProps }) {
|
|
18
20
|
const { density = 'none' } = useAdaptivity();
|
|
19
21
|
const layout = after || subtitle ? 'vertical' : 'none';
|
|
20
|
-
|
|
22
|
+
const snackbar = /*#__PURE__*/ _jsxs(RootComponent, {
|
|
21
23
|
...restProps,
|
|
22
|
-
baseClassName: classNames("vkuiBasic__body", stylesLayout[layoutProps || layout], density !== 'compact' && densityClassNames[density]
|
|
24
|
+
baseClassName: classNames("vkuiBasic__body", stylesLayout[layoutProps || layout], density !== 'compact' && densityClassNames[density]),
|
|
23
25
|
children: [
|
|
24
26
|
before && /*#__PURE__*/ _jsx("div", {
|
|
25
27
|
className: "vkuiBasic__before",
|
|
@@ -48,6 +50,13 @@ export function Basic({ layout: layoutProps, action, after, before, mode, subtit
|
|
|
48
50
|
})
|
|
49
51
|
]
|
|
50
52
|
});
|
|
53
|
+
if (mode === 'dark') {
|
|
54
|
+
return /*#__PURE__*/ _jsx(ColorSchemeProvider, {
|
|
55
|
+
value: "dark",
|
|
56
|
+
children: snackbar
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return snackbar;
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
//# sourceMappingURL=Basic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/components/Snackbar/subcomponents/Basic/Basic.tsx"],"sourcesContent":["'use client';\n\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../../src/components/Snackbar/subcomponents/Basic/Basic.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../../../hooks/useAdaptivity';\nimport type { HTMLAttributesWithRootRef } from '../../../../types';\nimport { ColorSchemeProvider } from '../../../ColorSchemeProvider/ColorSchemeProvider';\nimport { RootComponent } from '../../../RootComponent/RootComponent';\nimport { Paragraph } from '../../../Typography/Paragraph/Paragraph';\nimport { Subhead } from '../../../Typography/Subhead/Subhead';\nimport styles from './Basic.module.css';\n\nconst stylesLayout = {\n none: styles.layoutNone,\n vertical: styles.layoutVertical,\n horizontal: styles.layoutHorizontal,\n};\n\nconst densityClassNames = {\n none: styles.densityNone,\n regular: styles.densityRegular,\n};\n\nexport interface BasicProps {\n /**\n * Элемент действия.\n * Не может использоваться одновременно с `subtitle`.\n */\n action?: React.ReactNode | undefined;\n\n /**\n * Контент в правой части, может быть иконкой 24x24.\n */\n after?: React.ReactNode | undefined;\n\n /**\n * Варианты расположения кнопки действия\n * По умолчанию на десктопах, или при наличии элементов `after` или `subtitle`\n * имеет значение `vertical`, в остальных случаях `horizontal`.\n */\n layout?: 'vertical' | 'horizontal' | undefined;\n\n /**\n * Может быть следующими компонентами:\n * - цветная иконка 24x24 или 28x28 пикселя\n * - `<Avatar size={32} />`\n * - `<Image size={40} />`.\n */\n before?: React.ReactNode | undefined;\n\n /**\n * Задает стиль снекбара.\n */\n mode?: 'default' | 'dark' | undefined;\n\n /**\n * Дополнительная строка текста под `children`.\n * Не может использоваться одновременно с `action`.\n */\n subtitle?: React.ReactNode | undefined;\n}\n\nexport interface SnackbarBasicProps extends HTMLAttributesWithRootRef<HTMLDivElement>, BasicProps {}\n\nexport function Basic({\n layout: layoutProps,\n action,\n after,\n before,\n mode,\n subtitle,\n children,\n ...restProps\n}: SnackbarBasicProps): React.ReactNode {\n const { density = 'none' } = useAdaptivity();\n const layout = after || subtitle ? 'vertical' : 'none';\n\n const snackbar = (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.body,\n stylesLayout[layoutProps || layout],\n density !== 'compact' && densityClassNames[density],\n )}\n >\n {before && <div className={styles.before}>{before}</div>}\n\n <div className={styles.content}>\n <Paragraph className={styles.contentText}>{children}</Paragraph>\n {subtitle && !action && <Subhead className={styles.contentSubtitle}>{subtitle}</Subhead>}\n\n {action && !subtitle && <div className={styles.action}>{action}</div>}\n </div>\n\n {after && <div className={styles.after}>{after}</div>}\n </RootComponent>\n );\n\n if (mode === 'dark') {\n return <ColorSchemeProvider value=\"dark\">{snackbar}</ColorSchemeProvider>;\n }\n\n return snackbar;\n}\n"],"names":["React","classNames","useAdaptivity","ColorSchemeProvider","RootComponent","Paragraph","Subhead","stylesLayout","none","vertical","horizontal","densityClassNames","regular","Basic","layout","layoutProps","action","after","before","mode","subtitle","children","restProps","density","snackbar","baseClassName","div","className","value"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,qCAAkC;AAEhE,SAASC,mBAAmB,QAAQ,sDAAmD;AACvF,SAASC,aAAa,QAAQ,0CAAuC;AACrE,SAASC,SAAS,QAAQ,6CAA0C;AACpE,SAASC,OAAO,QAAQ,yCAAsC;AAG9D,MAAMC,eAAe;IACnBC,IAAI;IACJC,QAAQ;IACRC,UAAU;AACZ;AAEA,MAAMC,oBAAoB;IACxBH,IAAI;IACJI,OAAO;AACT;AA2CA,OAAO,SAASC,MAAM,EACpBC,QAAQC,WAAW,EACnBC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,IAAI,EACJC,QAAQ,EACRC,QAAQ,EACR,GAAGC,WACgB;IACnB,MAAM,EAAEC,UAAU,MAAM,EAAE,GAAGrB;IAC7B,MAAMY,SAASG,SAASG,WAAW,aAAa;IAEhD,MAAMI,yBACJ,MAACpB;QACE,GAAGkB,SAAS;QACbG,eAAexB,8BAEbM,YAAY,CAACQ,eAAeD,OAAO,EACnCS,YAAY,aAAaZ,iBAAiB,CAACY,QAAQ;;YAGpDL,wBAAU,KAACQ;gBAAIC,SAAS;0BAAkBT;;0BAE3C,MAACQ;gBAAIC,SAAS;;kCACZ,KAACtB;wBAAUsB,SAAS;kCAAuBN;;oBAC1CD,YAAY,CAACJ,wBAAU,KAACV;wBAAQqB,SAAS;kCAA2BP;;oBAEpEJ,UAAU,CAACI,0BAAY,KAACM;wBAAIC,SAAS;kCAAkBX;;;;YAGzDC,uBAAS,KAACS;gBAAIC,SAAS;0BAAiBV;;;;IAI7C,IAAIE,SAAS,QAAQ;QACnB,qBAAO,KAAChB;YAAoByB,OAAM;sBAAQJ;;IAC5C;IAEA,OAAOA;AACT"}
|