@cloud-ru/ds-calendar 1.0.12 → 1.0.13

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/CHANGELOG.md CHANGED
@@ -3,6 +3,12 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 1.0.13 (2026-09-02)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **PDS-4414:** fix FieldDate calendar interactions ([668e3c3](https://github.com/cloud-ru-tech/snack-v2/commit/668e3c3309265b6ad2fef903eb2b9b05b89f7655))
11
+
6
12
  ## 1.0.12 (2026-09-01)
7
13
 
8
14
  **Note:** Version bump only for package @ds/calendar
@@ -1,2 +1,2 @@
1
- import { CalendarDropdownProps } from '../../components/CalendarDropdown/CalendarDropdown';
1
+ import { CalendarDropdownProps } from '../../components';
2
2
  export declare function DesktopCalendarDropdown({ children, closeOnApply, onApply, onCurrent, open: openProp, onOpenChange, triggerClassName, trigger, placement, hoverDelayOpen, hoverDelayClose, closeOnEscapeKey, triggerClickByKeys, triggerRef, outsideClick, fallbackPlacements, disableSpanWrapper, closeOnPopstate, className, 'data-test-id': testId, ...calendarProps }: CalendarDropdownProps): import("react/jsx-runtime").JSX.Element;
@@ -9,22 +9,27 @@ const dropdown_1 = require("@cloud-ru/ds-dropdown");
9
9
  const utils_1 = require("@cloud-ru/ds-utils");
10
10
  const classnames_1 = __importDefault(require("classnames"));
11
11
  const react_1 = require("react");
12
- const Calendar_1 = require("../../components/Calendar");
12
+ const components_1 = require("../../components");
13
13
  const styles_module_scss_1 = __importDefault(require('../../components/CalendarDropdown/styles.module.css'));
14
14
  const utils_2 = require("../../utils");
15
15
  const Footer_1 = require("../Footer");
16
+ const utils_3 = require("./utils");
16
17
  function DesktopCalendarDropdown({ children, closeOnApply = false, onApply, onCurrent, open: openProp, onOpenChange, triggerClassName, trigger = 'click', placement = 'bottom-start', hoverDelayOpen, hoverDelayClose, closeOnEscapeKey, triggerClickByKeys, triggerRef, outsideClick, fallbackPlacements, disableSpanWrapper, closeOnPopstate, className, 'data-test-id': testId, ...calendarProps }) {
17
18
  const [open, setOpen] = (0, utils_1.useUncontrolledProp)(openProp, false, onOpenChange);
18
19
  const getTestId = (0, react_1.useMemo)(() => (0, utils_2.getTestIdBuilder)(testId), [testId]);
20
+ const resolvedFallbackPlacements = (0, react_1.useMemo)(() => fallbackPlacements ?? (0, utils_3.getAlignedFallbackPlacements)(placement), [fallbackPlacements, placement]);
19
21
  const handleFooterApply = (0, react_1.useCallback)(() => {
20
22
  onApply?.();
21
23
  if (closeOnApply) {
22
24
  setOpen(false);
23
25
  }
24
26
  }, [closeOnApply, onApply, setOpen]);
25
- const content = ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.calendarDropdownContent, className), "data-test-id": getTestId('content'), children: (0, jsx_runtime_1.jsx)(Calendar_1.Calendar, { ...calendarProps, bottomSlot: (0, jsx_runtime_1.jsx)(Footer_1.Footer, { inline: true, onApply: handleFooterApply, onCurrent: onCurrent }) }) }));
27
+ const content = ((0, jsx_runtime_1.jsx)("div", { className: (0, classnames_1.default)(styles_module_scss_1.default.calendarDropdownContent, className), "data-test-id": getTestId('content'), children: (0, jsx_runtime_1.jsx)(components_1.Calendar, { ...calendarProps, bottomSlot: (0, jsx_runtime_1.jsx)(Footer_1.Footer, { inline: true, onApply: handleFooterApply, onCurrent: onCurrent }) }) }));
26
28
  return ((0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, { className: styles_module_scss_1.default.dropdown,
27
29
  // Календарь сам управляет внутренними отступами (header/body/footer) — общий padding
28
30
  // dropdown-контейнера в макете отсутствует.
29
- bodyPadding: false, "data-test-id": testId, triggerClassName: triggerClassName, trigger: trigger, placement: placement, hoverDelayOpen: hoverDelayOpen, hoverDelayClose: hoverDelayClose, closeOnEscapeKey: closeOnEscapeKey, triggerClickByKeys: triggerClickByKeys, triggerRef: triggerRef, outsideClick: outsideClick, fallbackPlacements: fallbackPlacements, disableSpanWrapper: disableSpanWrapper, closeOnPopstate: closeOnPopstate, open: open, onOpenChange: setOpen, content: content, widthStrategy: 'gte', children: children }));
31
+ bodyPadding: false, "data-test-id": testId, triggerClassName: triggerClassName, trigger: trigger, placement: placement, hoverDelayOpen: hoverDelayOpen, hoverDelayClose: hoverDelayClose, closeOnEscapeKey: closeOnEscapeKey, triggerClickByKeys: triggerClickByKeys, triggerRef: triggerRef, outsideClick: outsideClick, fallbackPlacements: resolvedFallbackPlacements, disableSpanWrapper: disableSpanWrapper, closeOnPopstate: closeOnPopstate, open: open, onOpenChange: setOpen, content: content,
32
+ // Ширина floating-узла совпадает с видимым календарём. Растягивание до ширины триггера
33
+ // создаёт прозрачную область, которая ошибочно считается внутренней для outside-click.
34
+ widthStrategy: 'auto', children: children }));
30
35
  }
@@ -0,0 +1,8 @@
1
+ import { CalendarDropdownProps } from '../../components';
2
+ type CalendarPlacement = NonNullable<CalendarDropdownProps['placement']>;
3
+ /**
4
+ * Сохраняет выравнивание `start` / `end` при смене стороны календаря, чтобы после flip он
5
+ * оставался привязан к тому же краю trigger и не смещался к центру широкого поля.
6
+ */
7
+ export declare function getAlignedFallbackPlacements(placement: CalendarPlacement): CalendarPlacement[];
8
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAlignedFallbackPlacements = getAlignedFallbackPlacements;
4
+ const ALIGNED_FALLBACK_PLACEMENTS = {
5
+ top: ['right', 'bottom', 'left'],
6
+ 'top-start': ['right-start', 'bottom-start', 'left-start'],
7
+ 'top-end': ['right-end', 'bottom-end', 'left-end'],
8
+ right: ['top', 'bottom', 'left'],
9
+ 'right-start': ['top-start', 'bottom-start', 'left-start'],
10
+ 'right-end': ['top-end', 'bottom-end', 'left-end'],
11
+ bottom: ['top', 'right', 'left'],
12
+ 'bottom-start': ['top-start', 'right-start', 'left-start'],
13
+ 'bottom-end': ['top-end', 'right-end', 'left-end'],
14
+ left: ['top', 'right', 'bottom'],
15
+ 'left-start': ['top-start', 'right-start', 'bottom-start'],
16
+ 'left-end': ['top-end', 'right-end', 'bottom-end'],
17
+ };
18
+ /**
19
+ * Сохраняет выравнивание `start` / `end` при смене стороны календаря, чтобы после flip он
20
+ * оставался привязан к тому же краю trigger и не смещался к центру широкого поля.
21
+ */
22
+ function getAlignedFallbackPlacements(placement) {
23
+ return ALIGNED_FALLBACK_PLACEMENTS[placement];
24
+ }
@@ -1,2 +1,2 @@
1
- import { CalendarDropdownProps } from '../../components/CalendarDropdown/CalendarDropdown.js';
1
+ import { CalendarDropdownProps } from '../../components/index.js';
2
2
  export declare function DesktopCalendarDropdown({ children, closeOnApply, onApply, onCurrent, open: openProp, onOpenChange, triggerClassName, trigger, placement, hoverDelayOpen, hoverDelayClose, closeOnEscapeKey, triggerClickByKeys, triggerRef, outsideClick, fallbackPlacements, disableSpanWrapper, closeOnPopstate, className, 'data-test-id': testId, ...calendarProps }: CalendarDropdownProps): import("react/jsx-runtime").JSX.Element;
@@ -3,13 +3,15 @@ import { Dropdown } from '@cloud-ru/ds-dropdown';
3
3
  import { useUncontrolledProp } from '@cloud-ru/ds-utils';
4
4
  import cn from 'classnames';
5
5
  import { useCallback, useMemo } from 'react';
6
- import { Calendar } from '../../components/Calendar/index.js';
6
+ import { Calendar } from '../../components/index.js';
7
7
  import styles from '../../components/CalendarDropdown/styles.module.css';
8
8
  import { getTestIdBuilder } from '../../utils.js';
9
9
  import { Footer } from '../Footer/index.js';
10
+ import { getAlignedFallbackPlacements } from './utils.js';
10
11
  export function DesktopCalendarDropdown({ children, closeOnApply = false, onApply, onCurrent, open: openProp, onOpenChange, triggerClassName, trigger = 'click', placement = 'bottom-start', hoverDelayOpen, hoverDelayClose, closeOnEscapeKey, triggerClickByKeys, triggerRef, outsideClick, fallbackPlacements, disableSpanWrapper, closeOnPopstate, className, 'data-test-id': testId, ...calendarProps }) {
11
12
  const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
12
13
  const getTestId = useMemo(() => getTestIdBuilder(testId), [testId]);
14
+ const resolvedFallbackPlacements = useMemo(() => fallbackPlacements ?? getAlignedFallbackPlacements(placement), [fallbackPlacements, placement]);
13
15
  const handleFooterApply = useCallback(() => {
14
16
  onApply?.();
15
17
  if (closeOnApply) {
@@ -20,5 +22,8 @@ export function DesktopCalendarDropdown({ children, closeOnApply = false, onAppl
20
22
  return (_jsx(Dropdown, { className: styles.dropdown,
21
23
  // Календарь сам управляет внутренними отступами (header/body/footer) — общий padding
22
24
  // dropdown-контейнера в макете отсутствует.
23
- bodyPadding: false, "data-test-id": testId, triggerClassName: triggerClassName, trigger: trigger, placement: placement, hoverDelayOpen: hoverDelayOpen, hoverDelayClose: hoverDelayClose, closeOnEscapeKey: closeOnEscapeKey, triggerClickByKeys: triggerClickByKeys, triggerRef: triggerRef, outsideClick: outsideClick, fallbackPlacements: fallbackPlacements, disableSpanWrapper: disableSpanWrapper, closeOnPopstate: closeOnPopstate, open: open, onOpenChange: setOpen, content: content, widthStrategy: 'gte', children: children }));
25
+ bodyPadding: false, "data-test-id": testId, triggerClassName: triggerClassName, trigger: trigger, placement: placement, hoverDelayOpen: hoverDelayOpen, hoverDelayClose: hoverDelayClose, closeOnEscapeKey: closeOnEscapeKey, triggerClickByKeys: triggerClickByKeys, triggerRef: triggerRef, outsideClick: outsideClick, fallbackPlacements: resolvedFallbackPlacements, disableSpanWrapper: disableSpanWrapper, closeOnPopstate: closeOnPopstate, open: open, onOpenChange: setOpen, content: content,
26
+ // Ширина floating-узла совпадает с видимым календарём. Растягивание до ширины триггера
27
+ // создаёт прозрачную область, которая ошибочно считается внутренней для outside-click.
28
+ widthStrategy: 'auto', children: children }));
24
29
  }
@@ -0,0 +1,8 @@
1
+ import { CalendarDropdownProps } from '../../components/index.js';
2
+ type CalendarPlacement = NonNullable<CalendarDropdownProps['placement']>;
3
+ /**
4
+ * Сохраняет выравнивание `start` / `end` при смене стороны календаря, чтобы после flip он
5
+ * оставался привязан к тому же краю trigger и не смещался к центру широкого поля.
6
+ */
7
+ export declare function getAlignedFallbackPlacements(placement: CalendarPlacement): CalendarPlacement[];
8
+ export {};
@@ -0,0 +1,21 @@
1
+ const ALIGNED_FALLBACK_PLACEMENTS = {
2
+ top: ['right', 'bottom', 'left'],
3
+ 'top-start': ['right-start', 'bottom-start', 'left-start'],
4
+ 'top-end': ['right-end', 'bottom-end', 'left-end'],
5
+ right: ['top', 'bottom', 'left'],
6
+ 'right-start': ['top-start', 'bottom-start', 'left-start'],
7
+ 'right-end': ['top-end', 'bottom-end', 'left-end'],
8
+ bottom: ['top', 'right', 'left'],
9
+ 'bottom-start': ['top-start', 'right-start', 'left-start'],
10
+ 'bottom-end': ['top-end', 'right-end', 'left-end'],
11
+ left: ['top', 'right', 'bottom'],
12
+ 'left-start': ['top-start', 'right-start', 'bottom-start'],
13
+ 'left-end': ['top-end', 'right-end', 'bottom-end'],
14
+ };
15
+ /**
16
+ * Сохраняет выравнивание `start` / `end` при смене стороны календаря, чтобы после flip он
17
+ * оставался привязан к тому же краю trigger и не смещался к центру широкого поля.
18
+ */
19
+ export function getAlignedFallbackPlacements(placement) {
20
+ return ALIGNED_FALLBACK_PLACEMENTS[placement];
21
+ }