indicator-ui 1.0.46 → 1.0.48

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.
@@ -7,52 +7,59 @@ type FunReturnType<T> = {
7
7
  revertScroll: RevertScroll<T>;
8
8
  };
9
9
  /**
10
- * Хук для сохранения визуальной позиции скролла
11
- * при добавлении элементов в начало списка (prepend) или
12
- * при изменение размера `layout` между `зоной видимости`
13
- * и `началом элемента`.
10
+ * React-хук для фиксации и восстановления якоря скролла.
14
11
  *
15
- * Используется в сценариях, когда новый контент вставляется
16
- * выше текущей видимой области, из-за чего увеличивается
17
- * scrollHeight, а браузер сохраняет `scrollTop`.
12
+ * Предназначен для сохранения визуальной позиции скролла при изменении размеров
13
+ * скроллируемой области (например, при добавлении или удалении элементов).
18
14
  *
19
- * Хук компенсирует это смещение, сохраняя пользователя
20
- * на том же визуальном месте списка.
15
+ * Типичный кейс добавление элементов в начало scroll-контейнера:
16
+ * браузеры могут либо автоматически скорректировать позицию скролла,
17
+ * либо оставить её без изменений, что приводит к визуальному "прыжку".
21
18
  *
22
19
  * Принцип работы:
23
- * 1. `commitScroll` сохраняет текущее состояние скролла и размеры контейнера.
24
- * 2. В DOM добавляются элементы в начало списка (prepend).
25
- * 3. `revertScroll` компенсирует изменение scrollHeight,
26
- * корректируя scrollTop так, чтобы видимая область не сместилась.
20
+ * 1. Перед изменением layout вызывается {@link commitScroll},
21
+ * который сохраняет текущее состояние скролла.
22
+ * 2. Выполняются изменения DOM / layout (важно, чтобы браузер успел пересчитать размеры).
23
+ * 3. После этого вызывается {@link revertScroll}, который корректирует позицию скролла
24
+ * таким образом, чтобы пользователь визуально остался на том же месте.
27
25
  *
28
- * ⚠️ ВАЖНО:
29
- * Между вызовами `commitScroll` и `revertScroll`
30
- * изменение DOM должно происходить до этапа раскраски,
31
- * на этапе просчета `layout`.
26
+ * Хук поддерживает настройку направления скролла по вертикали и горизонтали.
32
27
  *
33
- * ⚠️ ОГРАНИЧЕНИЕ:
34
- * Хук предназначен ТОЛЬКО для сценариев добавления элементов
35
- * в начало списка.
28
+ * @template T
29
+ * Тип HTMLElement, для которого применяется якорь скролла.
36
30
  *
37
- * @template T HTMLElement или его наследник
31
+ * @param {ScrollDirectionOptions} [props]
32
+ * Настройки направления движения скролла.
38
33
  *
39
- * @param props Параметры компенсации скролла
34
+ * @param {'top' | 'bottom'} [props.verticalDirection='bottom']
35
+ * Определяет, в какую сторонц двигается вертикальный scroll.
40
36
  *
41
- * @param props.scrollVerticalDirection
42
- * Направление компенсации по вертикали.
43
- * Для prepend-сценариев обычно используется 'bottom' (по умолчанию).
37
+ * @param {'left' | 'right'} [props.horizontalDirection='right']
38
+ * Определяет, в какую сторонц двигается горизонтальный scroll.
44
39
  *
45
- * @param props.scrollHorizontalDirection
46
- * Направление компенсации по горизонтали (по умолчанию 'right').
40
+ * @returns {FunReturnType<T>}
41
+ * Объект с методами управления якорем скролла.
47
42
  *
48
- * @returns Объект с методами управления якорем скролла
43
+ * @returns {Function} returns.commitScroll
44
+ * Функция для фиксации текущего состояния скролла.
49
45
  *
50
- * @returns.commitScroll
51
- * Сохраняет состояние скролла ДО добавления элементов в начало списка.
46
+ * @returns {Function} returns.revertScroll
47
+ * Функция для восстановления позиции скролла на основе ранее сохранённого состояния.
52
48
  *
53
- * @returns.revertScroll
54
- * Восстанавливает позицию скролла ПОСЛЕ добавления элементов,
55
- * но ДО отрисовки браузером.
49
+ * @example
50
+ * ```ts
51
+ * const { commitScroll, revertScroll } = useScrollAnchor<HTMLDivElement>();
52
+ *
53
+ * const handlePrependItems = () => {
54
+ * const commit = commitScroll(containerRef.current);
55
+ *
56
+ * prependItems();
57
+ *
58
+ * requestAnimationFrame(() => {
59
+ * revertScroll(containerRef.current, commit);
60
+ * });
61
+ * };
62
+ * ```
56
63
  */
57
64
  export declare function useScrollAnchor<T extends HTMLElement>(props?: PropsType): FunReturnType<T>;
58
65
  export {};
@@ -1,26 +1,59 @@
1
1
  type Args = any[];
2
+ type Return = Promise<any> | void;
3
+ type Callback<TArgs extends Args, TReturn extends Return> = (...args: TArgs) => TReturn;
2
4
  /**
3
- * React-хук, возвращающий эксклюзивную версию callback-функции.
5
+ * React-хук, возвращающий "заблокированную" (эксклюзивную) версию callback-функции.
4
6
  *
5
- * Функция может быть вызвана многократно, но пока выполняется,
6
- * повторные вызовы будут **игнорироваться**.
7
+ * Полученная функция может вызываться многократно, однако:
8
+ * пока выполняется текущий вызов, все последующие вызовы будут проигнорированы.
7
9
  *
8
- * Полезно для:
9
- * - кнопок Submit (защита от double click)
10
- * - async side-effects, которые нельзя выполнять параллельно
11
- * - любых операций, где нужен mutex на выполнение
10
+ * Хук поддерживает как синхронные, так и асинхронные callback-функции.
11
+ * В случае Promise-базированного callback блокировка снимается после его завершения
12
+ * (`finally`). Для синхронных функций разблокировка происходит сразу после выполнения.
12
13
  *
13
- * @template TArgs Тип аргументов callback-функции
14
- * @param callback Асинхронная или синхронная функция, которую нужно защитить от параллельных вызовов
15
- * @returns Функцию с той же сигнатурой, но блокирующую повторные вызовы пока выполняется
14
+ * Дополнительно можно указать задержку (`delay`), которая определяет время (в миллисекундах)
15
+ * между завершением callback-функции и снятием блокировки.
16
+ *
17
+ * Типичные сценарии использования:
18
+ * - защита кнопок отправки форм от повторных кликов
19
+ * - предотвращение параллельного выполнения async side-effect'ов
20
+ * - реализация простого mutex-механизма на уровне UI
21
+ *
22
+ * @template TArgs
23
+ * Кортеж аргументов callback-функции.
24
+ *
25
+ * @template TReturn
26
+ * Тип возвращаемого значения callback-функции.
27
+ * Может быть `void` для синхронных операций или `Promise<any>` для асинхронных.
28
+ *
29
+ * @param {Callback<TArgs, TReturn>} callback
30
+ * Синхронная или асинхронная функция, вызовы которой должны выполняться эксклюзивно.
31
+ *
32
+ * @param {number} [delay=0]
33
+ * Задержка в миллисекундах перед снятием блокировки после завершения callback-функции.
34
+ *
35
+ * @returns {(…args: TArgs) => TReturn | void}
36
+ * Функция с той же сигнатурой, что и `callback`, но с защитой от параллельных вызовов.
37
+ * Если вызов был проигнорирован из-за активной блокировки, возвращается `void`.
16
38
  *
17
39
  * @example
40
+ * ```ts
18
41
  * const save = useLockedCallback(async (data: string) => {
19
- * await api.save(data)
20
- * })
42
+ * await api.save(data);
43
+ * });
44
+ *
45
+ * save('hello'); // выполнится
46
+ * save('world'); // будет проигнорирован, если предыдущий вызов ещё не завершён
47
+ * ```
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const onClick = useLockedCallback(() => {
52
+ * console.log('clicked');
53
+ * }, 500);
21
54
  *
22
- * save('hello') // выполнится
23
- * save('world') // проигнорируется, если предыдущий вызов ещё не завершился
55
+ * // повторный вызов будет доступен только через 500ms
56
+ * ```
24
57
  */
25
- export declare function useLockedCallback<TArgs extends Args>(callback: (...args: TArgs) => Promise<any> | void): (...args: TArgs) => void | Promise<any>;
58
+ export declare function useLockedCallback<TArgs extends Args, TReturn extends Return>(callback: Callback<TArgs, TReturn>, delay?: number): (...args: TArgs) => TReturn | undefined;
26
59
  export {};
@@ -43,4 +43,5 @@ export type ButtonPropsType<T extends React.ElementType> = AsProps<T, {
43
43
  theme?: "light" | "dark" | undefined;
44
44
  isLoading?: boolean;
45
45
  counter?: React.ReactNode;
46
+ className?: string;
46
47
  }, React.ComponentProps<'button'>>;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "react-components",
12
12
  "ui-kit"
13
13
  ],
14
- "version": "1.0.46",
14
+ "version": "1.0.48",
15
15
  "exports": {
16
16
  ".": {
17
17
  "types": "./dist/types/index.d.ts",