skillgrid 0.0.39 → 0.0.40

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.
@@ -1,8 +1,10 @@
1
1
  import { DialogProps } from '../Dialog';
2
- import { ReactNode } from 'react';
2
+ import { HTMLProps, ReactNode } from 'react';
3
3
  import { AvatarProps } from '../Avatar';
4
4
  export type AlertVariant = 'info' | 'success' | 'warning' | 'error' | 'dialog' | 'avatar';
5
- export interface AlertProps extends Pick<DialogProps, 'placement' | 'open' | 'onOpenChange' | 'children'> {
5
+ /** Поля плейсхолдера для стилизации. */
6
+ type AlertFields = 'title' | 'subTitle' | 'iconSlot' | 'children' | 'textBlock' | 'container' | 'dialog';
7
+ export interface AlertProps extends Omit<DialogProps, 'style' | 'className'> {
6
8
  /**
7
9
  * Вариант отображения Alert. Определяет иконку и цветовую схему.
8
10
  * Вариант `avatar` позволяет отобразить кастомный аватар.
@@ -19,7 +21,10 @@ export interface AlertProps extends Pick<DialogProps, 'placement' | 'open' | 'on
19
21
  /** Заголовок Alert. */
20
22
  title: ReactNode;
21
23
  /** Основной контент/описание Alert. */
22
- description: ReactNode;
23
- /** ID для тестирования. */
24
- 'data-testid'?: string;
24
+ description?: ReactNode;
25
+ /** Inline-стили для отдельных частей Alert. */
26
+ styles?: Partial<Record<AlertFields, HTMLProps<HTMLDivElement>['style']>>;
27
+ /** CSS-классы для отдельных частей Alert. */
28
+ classNames?: Partial<Record<AlertFields, HTMLProps<HTMLDivElement>['className']>>;
25
29
  }
30
+ export {};
@@ -1,8 +1,17 @@
1
1
  import { DialogProps } from './Dialog.type';
2
2
  /**
3
- * Базовый компонент диалогового окна.
4
- * Обеспечивает управление состоянием, фокусом и позиционированием.
5
- * Является основой для более сложных компонентов, таких как Modal.
3
+ * Компонент `Dialog` представляет собой модальное окно, которое можно использовать для
4
+ * отображения важной информации, форм или для запроса подтверждения от пользователя.
5
+ *
6
+ * Он использует `Floating UI` для позиционирования, управляет фокусом внутри себя,
7
+ * блокирует прокрутку основного контента и предоставляет анимации открытия/закрытия.
8
+ *
9
+ * Это полностью контролируемый компонент: его видимостью нужно управлять через пропсы `open` и `onOpenChange`.
10
+ * Поддерживает различные варианты размещения на экране, закрытие перетаскиванием и другие возможности кастомизации.
11
+ *
12
+ * @param {DialogProps} props - Пропсы компонента.
13
+ * @param {React.Ref<HTMLDivElement>} outerRef - Внешний ref, который будет перенаправлен на корневой DOM-элемент диалога.
14
+ * @returns {JSX.Element | null} Рендерит диалог или `null`, если он закрыт (и анимация закрытия завершена).
6
15
  */
7
16
  declare const Dialog: import('react').ForwardRefExoticComponent<DialogProps & import('react').RefAttributes<HTMLDivElement>>;
8
17
  export { Dialog };
@@ -1,29 +1,61 @@
1
- import { HTMLProps } from 'react';
2
- /** Тип позиционирования диалогового окна. */
3
- export type DialogPlacement = 'default' | 'default-stretched' | 'center' | 'center-stretched' | 'mobile' | 'right-drawer' | 'left-drawer';
1
+ import { ComponentProps, HTMLProps } from 'react';
2
+ import { FloatingFocusManagerProps, FloatingOverlay, FloatingPortalProps } from '@floating-ui/react';
3
+ /**
4
+ * Определяет вариант расположения диалогового окна на экране.
5
+ * - `default`: Вверху экрана с вертикальными и горизонтальными отступами.
6
+ * - `default-stretched`: Вверху экрана, растянуто по ширине.
7
+ * - `center`: Строго по центру экрана.
8
+ * - `center-stretched`: По центру экрана, растянуто по ширине.
9
+ * - `bottom-sheet`: Внизу экрана (адаптивный вариант для мобильных устройств).
10
+ * - `right-drawer`: У правого края экрана (похоже на "шторку" или "сайдбар").
11
+ * - `left-drawer`: У левого края экрана.
12
+ */
13
+ export type DialogPlacement = 'default' | 'center' | 'bottom-sheet' | 'bottom-left' | 'bottom-right' | 'right-drawer' | 'left-drawer';
4
14
  /** Пропсы для компонента Dialog. */
5
15
  export interface DialogProps extends Pick<HTMLProps<HTMLDivElement>, 'className' | 'style' | 'children'> {
6
- /** Контролируемое состояние открытия. */
16
+ /** Определяет, открыт ли диалог. Компонент является полностью контролируемым. */
7
17
  open: boolean;
8
- /** Callback при изменении состояния. */
18
+ /** Функция обратного вызова, вызываемая при попытке закрытия диалога (клик на оверлей, Escape). */
9
19
  onOpenChange: (open: boolean) => void;
10
20
  /**
11
- * Позиционирование диалога.
12
- * @default 'top'
21
+ * Определяет, где на экране будет отображаться диалог.
22
+ * @default 'default'
13
23
  */
14
24
  placement?: DialogPlacement;
15
25
  /**
16
- * Отключить закрытие по клику вне диалога.
26
+ * Если `true`, клик по OVERLAY диалога не будет его закрывать.
17
27
  * @default false
18
28
  */
19
29
  disableOutsideClick?: boolean;
20
30
  /**
21
- * Отключить закрытие по Escape.
31
+ * Если `true`, нажатие клавиши Escape не будет закрывать диалог.
22
32
  * @default false
23
33
  */
24
34
  disableEscapeKey?: boolean;
25
- /** testId для тестирования. */
35
+ /**
36
+ * Если `true`, полупрозрачный фон (оверлей) не будет отображаться.
37
+ * @default false
38
+ * */
39
+ disableOverlay?: boolean;
40
+ /** Позволяет закрывать диалог перетаскиванием. Принимает объект с настройками. */
41
+ closeOnDrag?: {
42
+ /** Минимальное смещение в пикселях, необходимое для закрытия диалога. @default 80 */
43
+ threshold: number;
44
+ /** Направление, в котором нужно 'смахнуть' диалог для закрытия. */
45
+ direction: 'top' | 'left' | 'right' | 'bottom';
46
+ };
47
+ /** Идентификатор для использования в автоматизированных тестах. */
26
48
  'data-testid'?: string;
27
- /** Класс для оверлея. */
28
- overlayClassName?: HTMLProps<HTMLDivElement>['className'];
49
+ /** Дополнительные пропсы для кастомизации оверлея (фона). */
50
+ overlayProps?: Pick<ComponentProps<typeof FloatingOverlay>, 'lockScroll' | 'className' | 'style'>;
51
+ /**
52
+ * Дополнительные пропсы для `FloatingPortal`, который используется для рендеринга диалога.
53
+ * @extends https://floating-ui.com/docs/FloatingPortal
54
+ * */
55
+ portalProps?: Partial<FloatingPortalProps>;
56
+ /**
57
+ * Дополнительные пропсы для `FloatingFocusManager`, который используется для рендеринга диалога.
58
+ * @extends https://floating-ui.com/docs/floatingfocusmanager
59
+ * */
60
+ focusManagement?: Partial<FloatingFocusManagerProps>;
29
61
  }
@@ -1 +1,2 @@
1
1
  export { useDialog } from './use-dialog';
2
+ export { useDialogDraggable } from './use-dialog-draggable';
@@ -0,0 +1,42 @@
1
+ import { DialogProps } from '../Dialog.type';
2
+ import { CSSProperties, HTMLProps } from 'react';
3
+ type UseDialogDraggableOptions = Pick<DialogProps, 'placement' | 'open' | 'disableEscapeKey' | 'onOpenChange' | 'closeOnDrag'>;
4
+ /**
5
+ * Хук для управления диалогом с возможностью закрытия через 'смахивание' (drag-to-close).
6
+ * Оборачивает `useDialog` и добавляет обработчики событий указателя (`PointerEvents`)
7
+ * для отслеживания перетаскивания и закрытия диалога при превышении порога.
8
+ *
9
+ * @param {UseDialogDraggableOptions} options - Опции для конфигурации хука.
10
+ * @returns Возвращает объект с данными и пропсами, аналогичный `useDialog`,
11
+ * но с модифицированными `transitionStyles` и `getFloatingProps` для поддержки перетаскивания.
12
+ */
13
+ export declare function useDialogDraggable({ open, onOpenChange, placement, disableEscapeKey, closeOnDrag, }: UseDialogDraggableOptions): {
14
+ isMounted: boolean;
15
+ context: {
16
+ x: number;
17
+ y: number;
18
+ placement: import('@floating-ui/utils').Placement;
19
+ strategy: import('@floating-ui/utils').Strategy;
20
+ middlewareData: import('@floating-ui/core').MiddlewareData;
21
+ isPositioned: boolean;
22
+ update: () => void;
23
+ floatingStyles: React.CSSProperties;
24
+ open: boolean;
25
+ onOpenChange: (open: boolean, event?: Event, reason?: import('@floating-ui/react').OpenChangeReason) => void;
26
+ events: import('@floating-ui/react').FloatingEvents;
27
+ dataRef: React.MutableRefObject<import('@floating-ui/react').ContextData>;
28
+ nodeId: string | undefined;
29
+ floatingId: string | undefined;
30
+ refs: import('@floating-ui/react').ExtendedRefs<import('@floating-ui/react').ReferenceType>;
31
+ elements: import('@floating-ui/react').ExtendedElements<import('@floating-ui/react').ReferenceType>;
32
+ };
33
+ refs: {
34
+ reference: import('react').MutableRefObject<import('@floating-ui/react-dom').ReferenceType | null>;
35
+ floating: React.MutableRefObject<HTMLElement | null>;
36
+ setReference: (node: import('@floating-ui/react-dom').ReferenceType | null) => void;
37
+ setFloating: (node: HTMLElement | null) => void;
38
+ } & import('@floating-ui/react').ExtendedRefs<import('@floating-ui/react').ReferenceType>;
39
+ transitionStyles: CSSProperties;
40
+ getFloatingProps: (userProps: HTMLProps<HTMLElement>) => Record<string, unknown>;
41
+ };
42
+ export {};
@@ -2,16 +2,24 @@ import { Placement } from '@floating-ui/react';
2
2
  import { DialogProps } from '../Dialog.type';
3
3
  type UseDialogOptions = Pick<DialogProps, 'placement' | 'open' | 'disableOutsideClick' | 'disableEscapeKey' | 'onOpenChange'>;
4
4
  /**
5
- * Хук для управления состоянием и взаимодействиями диалогового окна.
6
- * Инкапсулирует логику Floating UI для позиционирования, анимаций и закрытия.
7
- * @returns {object} Объект со свойствами и хендлерами для управления диалогом.
5
+ * Базовый хук для управления состоянием и поведением диалога.
6
+ * Отвечает за логику открытия/закрытия, позиционирование с помощью `Floating UI`,
7
+ * применение анимаций перехода и обработку событий закрытия (клик снаружи, Escape).
8
+ * Не включает логику перетаскивания.
9
+ *
10
+ * @returns Объект с данными и пропсами для `Floating UI`.
11
+ * - `isMounted`: Флаг для условного рендеринга с поддержкой анимации закрытия.
12
+ * - `transitionStyles`: CSS-стили для анимации.
13
+ * - `context`: Контекст `Floating UI`.
14
+ * - `refs`: Ссылки на DOM-элементы для `Floating UI`.
15
+ * - `getFloatingProps`: Функция для получения пропсов, которые нужно передать на элемент диалога.
8
16
  */
9
- export declare function useDialog({ open, onOpenChange, placement, disableOutsideClick, disableEscapeKey, }: UseDialogOptions): {
10
- /** Состояние для условного рендеринга с поддержкой анимации закрытия. */
17
+ export declare function useDialog({ open, onOpenChange, placement, disableEscapeKey, }: UseDialogOptions): {
18
+ /** `isMounted`: Флаг для условного рендеринга с поддержкой анимации закрытия. */
11
19
  isMounted: boolean;
12
- /** Стили для CSS-переходов (анимации). */
20
+ /** `transitionStyles`: CSS-стили для анимации. */
13
21
  transitionStyles: import('react').CSSProperties;
14
- /** Контекст Floating UI. */
22
+ /** `context`: Контекст `Floating UI`. */
15
23
  context: {
16
24
  x: number;
17
25
  y: number;
@@ -30,14 +38,14 @@ export declare function useDialog({ open, onOpenChange, placement, disableOutsid
30
38
  refs: import('@floating-ui/react').ExtendedRefs<import('@floating-ui/react').ReferenceType>;
31
39
  elements: import('@floating-ui/react').ExtendedElements<import('@floating-ui/react').ReferenceType>;
32
40
  };
33
- /** Ссылки на элементы для Floating UI. */
41
+ /** `refs`: Ссылки на DOM-элементы для `Floating UI`. */
34
42
  refs: {
35
43
  reference: import('react').MutableRefObject<import('@floating-ui/react-dom').ReferenceType | null>;
36
44
  floating: React.MutableRefObject<HTMLElement | null>;
37
45
  setReference: (node: import('@floating-ui/react-dom').ReferenceType | null) => void;
38
46
  setFloating: (node: HTMLElement | null) => void;
39
47
  } & import('@floating-ui/react').ExtendedRefs<import('@floating-ui/react').ReferenceType>;
40
- /** Пропсы для плавающего элемента. */
48
+ /** `getFloatingProps`: Функция для получения пропсов, которые нужно передать на элемент диалога. */
41
49
  getFloatingProps: (userProps?: React.HTMLProps<HTMLElement>) => Record<string, unknown>;
42
50
  };
43
51
  export {};
@@ -1,7 +1,7 @@
1
1
  import { ModalProps } from './Modal.type';
2
2
  /**
3
3
  * Компонент модального окна.
4
- * Построен на основе Dialog и добавляет с��андартную разметку (шапка, контент, футер).
4
+ * Построен на основе Dialog и добавляет стандартную разметку (шапка, контент, футер).
5
5
  */
6
6
  declare const Modal: import('react').ForwardRefExoticComponent<ModalProps & import('react').RefAttributes<HTMLDivElement>>;
7
7
  export { Modal };
@@ -2,30 +2,46 @@ import { DialogProps } from '../Dialog';
2
2
  import { FC, HTMLProps, PropsWithChildren, ReactNode } from 'react';
3
3
  import { ButtonProps } from '../Button';
4
4
  /** Поля модального окна для стилизации. */
5
- type ModalFields = 'container' | 'title' | 'subTitle' | 'content' | 'footer';
5
+ type ModalFields = 'dialog' | 'container' | 'leftActionsStack' | 'rightActionsStack' | 'title' | 'subTitle' | 'content' | 'footer' | 'header' | 'grabber';
6
+ export type ModalActionButtonProps = {
7
+ /** Пропсы кнопки действия; можно обернуть кнопку через wrapper. */
8
+ props?: ButtonProps;
9
+ /** Обёрточный компонент для кнопки действия. */
10
+ wrapper?: FC<PropsWithChildren>;
11
+ };
6
12
  /** Пропсы компонента Modal. @extends DialogProps */
7
- export interface ModalProps extends DialogProps {
13
+ export interface ModalProps extends Omit<DialogProps, 'style' | 'className'> {
8
14
  /** Заголовок модального окна. */
9
15
  title?: ReactNode;
10
- /** Слот для элементов в правом верхнем углу (рядом с кнопкой закрытия). */
11
- actions?: ReactNode;
12
16
  /** Подзаголовок под основным заголовком. */
13
17
  subTitle?: ReactNode;
14
18
  /** Содержимое футера (например, кнопки). */
15
19
  footer?: ReactNode;
16
- /** Ширина модального окна в px (допустимо: 480, 620, 800). */
20
+ /** Ширина модального окна в px. */
17
21
  size?: 480 | 620 | 800;
18
22
  /** Inline-стили для отдельных частей модального окна. */
19
23
  styles?: Partial<Record<ModalFields, HTMLProps<HTMLDivElement>['style']>>;
20
24
  /** CSS-классы для отдельных частей модального окна. */
21
25
  classNames?: Partial<Record<ModalFields, HTMLProps<HTMLDivElement>['className']>>;
22
- /** Показывать кнопку закрытия в шапке. @default true */
23
- showCloseButton?: boolean;
24
- /** Пропсы кнопки закрытия; можно обернуть кнопку через wrapper. */
25
- closeButtonProps?: ButtonProps & {
26
- /** Обёрточный компонент для кнопки закрытия. */
27
- wrapper?: FC<PropsWithChildren>;
28
- };
26
+ /** Слот для элементов в правом верхнем углу (рядом с кнопкой закрытия). */
27
+ rightActionsSlot?: ReactNode[];
28
+ /** Слот для элементов в правом верхнем углу (рядом с кнопкой закрытия). */
29
+ leftActionsSlot?: ReactNode[];
30
+ /** Пропсы для кнопки закрытия в правом верхнем углу */
31
+ closeButton?: {
32
+ /**
33
+ * Показывать кнопку закрытия.
34
+ * @default true */
35
+ show: boolean;
36
+ } & ModalActionButtonProps;
37
+ /** Пропсы для кнопки "назад" в левом верхнем углу */
38
+ backButton?: {
39
+ /** Показывать кнопку 'назад'.
40
+ * @default true */
41
+ show: boolean;
42
+ } & ModalActionButtonProps;
43
+ /** Шаблон расположения элементов в шапке модального окна. */
44
+ headerTemplate?: 'title-actions-actions' | 'actions-title-actions';
29
45
  /** Скрыть разделитель в шапке. */
30
46
  hideHeaderDivider?: boolean;
31
47
  /** Скрыть разделитель в футере. */
@@ -0,0 +1,2 @@
1
+ import { FC, SVGProps } from 'react';
2
+ export declare const CrossIcon: FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,2 @@
1
+ import { FC, SVGProps } from 'react';
2
+ export declare const LeftChevronIcon: FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,2 @@
1
+ export { CrossIcon } from './CrossIcon';
2
+ export { LeftChevronIcon } from './LeftChevronIcon';
@@ -1,8 +1,10 @@
1
1
  import { HTMLProps, ReactNode } from 'react';
2
2
  /** Размеры плейсхолдера */
3
3
  export type PlaceholderSize = 'm' | 'l';
4
+ /** Поля плейсхолдера для стилизации. */
5
+ type PlaceholderFields = 'title' | 'subTitle' | 'iconSlot' | 'children' | 'textBlock' | 'container';
4
6
  /** Свойства компонента Placeholder */
5
- export interface PlaceholderProps extends Pick<HTMLProps<HTMLDivElement>, 'className' | 'style' | 'children'> {
7
+ export interface PlaceholderProps extends Pick<HTMLProps<HTMLDivElement>, 'children'> {
6
8
  /** Размер плейсхолдера */
7
9
  size?: PlaceholderSize;
8
10
  /** Иконка плейсхолдера */
@@ -11,10 +13,11 @@ export interface PlaceholderProps extends Pick<HTMLProps<HTMLDivElement>, 'class
11
13
  title?: ReactNode;
12
14
  /** Подзаголовок плейсхолдера */
13
15
  subTitle?: ReactNode;
14
- /** Дополнительные свойства для подзаголовка */
15
- subTitleProps?: Pick<HTMLProps<HTMLParagraphElement>, 'className' | 'style'>;
16
- /** Дополнительные свойства для заголовка */
17
- titleProps?: Pick<HTMLProps<HTMLParagraphElement>, 'className' | 'style'>;
16
+ /** Inline-стили для отдельных частей плейсхолдера. */
17
+ styles?: Partial<Record<PlaceholderFields, HTMLProps<HTMLDivElement>['style']>>;
18
+ /** CSS-классы для отдельных частей плейсхолдера. */
19
+ classNames?: Partial<Record<PlaceholderFields, HTMLProps<HTMLDivElement>['className']>>;
18
20
  /** Идентификатор для тестирования */
19
21
  'data-testid'?: string;
20
22
  }
23
+ export {};
@@ -1,5 +1,5 @@
1
1
  import { ReactNode, HTMLAttributes } from 'react';
2
- import { Nullable } from '../../../../../../src/types';
2
+ import { Nullable } from '../../types';
3
3
  import { BadgeProps } from '../Badge';
4
4
  /**
5
5
  * Tabs визуальный режим табов