@ryuzaki13/react-foundation-lib 1.4.2 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/hooks/useFloatingListbox.d.ts +1 -1
  2. package/package.json +1 -5
  3. package/src/array/README.mdx +4 -12
  4. package/src/binary/README.mdx +3 -11
  5. package/src/bounded-copy-stack/README.mdx +8 -14
  6. package/src/context-menu/README.mdx +11 -11
  7. package/src/copy/README.mdx +3 -11
  8. package/src/crypto/README.mdx +3 -11
  9. package/src/date-segments/README.mdx +3 -3
  10. package/src/dom/README.mdx +3 -11
  11. package/src/error/README.mdx +2 -2
  12. package/src/file/README.mdx +3 -11
  13. package/src/fingerprint/README.mdx +3 -3
  14. package/src/form/README.mdx +2 -2
  15. package/src/formatters/README.mdx +0 -6
  16. package/src/formatters/boolean/README.mdx +3 -11
  17. package/src/formulas/README.mdx +2 -8
  18. package/src/http/README.mdx +3 -3
  19. package/src/media/README.mdx +4 -4
  20. package/src/notifications/README.mdx +2 -2
  21. package/src/number-scale/README.mdx +1 -1
  22. package/src/odata-service/README.mdx +5 -11
  23. package/src/presets/README.mdx +2 -2
  24. package/src/pwa/README.mdx +0 -8
  25. package/src/query-client/README.mdx +5 -8
  26. package/src/range-output/README.mdx +3 -3
  27. package/src/session-storage/README.mdx +2 -2
  28. package/src/string-comparison/README.mdx +2 -2
  29. package/src/table/README.mdx +2 -10
  30. package/src/types/README.mdx +13 -13
  31. package/src/utils/README.mdx +4 -10
  32. package/src/validators/README.mdx +3 -3
  33. package/src/virtualizer/README.mdx +2 -6
  34. package/src/xml/README.mdx +3 -3
  35. package/dist/currency/currency.d.ts +0 -8
  36. package/dist/currency/currency.d.ts.map +0 -1
  37. package/dist/currency/index.d.ts +0 -2
  38. package/dist/currency/index.d.ts.map +0 -1
  39. package/dist/currency/index.js +0 -16
  40. package/dist/currency/index.js.map +0 -1
  41. package/src/currency/README.mdx +0 -155
@@ -51,8 +51,8 @@ export declare function useFloatingListbox<T>({ options, selectedIndex, open, on
51
51
  setFloating: (node: HTMLElement | null) => void;
52
52
  } & import("@floating-ui/react").ExtendedRefs<import("@floating-ui/react").ReferenceType>;
53
53
  context: {
54
- update: () => void;
55
54
  x: number;
55
+ update: () => void;
56
56
  y: number;
57
57
  placement: Placement;
58
58
  strategy: import("@floating-ui/utils").Strategy;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ryuzaki13/react-foundation-lib",
3
- "version": "1.4.2",
3
+ "version": "1.4.4",
4
4
  "description": "Reusable React and TypeScript foundation utilities, hooks, and primitives.",
5
5
  "license": "MIT",
6
6
  "author": "Ryuzaki13",
@@ -57,10 +57,6 @@
57
57
  "types": "./dist/crypto/index.d.ts",
58
58
  "import": "./dist/crypto/index.js"
59
59
  },
60
- "./currency": {
61
- "types": "./dist/currency/index.d.ts",
62
- "import": "./dist/currency/index.js"
63
- },
64
60
  "./date-segments": {
65
61
  "types": "./dist/date-segments/index.d.ts",
66
62
  "import": "./dist/date-segments/index.js"
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Array" />
4
4
 
5
- # Работа с массивами через `@ryuzaki13/react-foundation-lib/array`
5
+ # Работа с массивами
6
6
 
7
7
  Модуль `array` содержит небольшие типизированные функции для типовых операций с массивами:
8
8
 
@@ -16,11 +16,9 @@ import { Meta } from "@storybook/addon-docs/blocks";
16
16
 
17
17
  Функции не зависят от React, браузерного DOM, TanStack или других внешних runtime-библиотек. Их можно использовать в обычном TypeScript/JavaScript-коде, React-компонентах, store, mapper, validator и на границах сохранения или восстановления конфигурации.
18
18
 
19
- README рассчитан на разработчика, который использует опубликованный пакет и не читает его исходный код. Здесь отдельно объясняются базовые понятия JavaScript/TypeScript, точное поведение каждой функции, ограничения и типовые ошибки.
20
-
21
19
  ## Содержание
22
20
 
23
- - [Установка и импорт](#установка-и-импорт)
21
+ - [Импорт](#импорт)
24
22
  - [Минимальные понятия JavaScript и TypeScript](#минимальные-понятия-javascript-и-typescript)
25
23
  - [Как выбрать функцию](#как-выбрать-функцию)
26
24
  - [Быстрый старт](#быстрый-старт)
@@ -37,20 +35,14 @@ README рассчитан на разработчика, который испо
37
35
  - [Краткий справочник API](#краткий-справочник-api)
38
36
  - [Вопросы и ответы](#вопросы-и-ответы)
39
37
 
40
- ## Установка и импорт
41
-
42
- Установите пакет в приложении:
43
-
44
- ```bash
45
- npm install @ryuzaki13/react-foundation-lib
46
- ```
38
+ ## Импорт
47
39
 
48
40
  Импортируйте функции только из точечного entrypoint `/array`:
49
41
 
50
42
  ```ts
51
43
  import { arrayGroupBy, arrayToMap, arrayUniqueBy, moveArrayItem } from "@ryuzaki13/react-foundation-lib/array";
52
44
 
53
- import type { ReorderAction } from "@ryuzaki13/react-foundation-lib/array";
45
+ import { type ReorderAction } from "@ryuzaki13/react-foundation-lib/array";
54
46
  ```
55
47
 
56
48
  Корневой импорт пакета не поддерживается:
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Binary" />
4
4
 
5
- # Работа с бинарными данными через `@ryuzaki13/react-foundation-lib/binary`
5
+ # Работа с бинарными данными
6
6
 
7
7
  Модуль `binary` преобразует строковое бинарное содержимое в браузерный `Blob`, определяет предполагаемый MIME-тип документа и предоставляет React hook для типового сценария «base64 → `{ blob, mime }`».
8
8
 
@@ -16,12 +16,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
16
16
 
17
17
  Модуль является предметно-независимым foundation-слоем. Он не знает бизнес-коды документов, не выполняет HTTP/OData-запросы, не загружает файлы с диска, не создаёт viewer и не проверяет, безопасно ли содержимое.
18
18
 
19
- README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия, все публичные функции, точный приоритет MIME, поддерживаемые форматы, ошибки, React lifecycle, безопасность и управление object URL.
20
-
21
19
  ## Содержание
22
20
 
23
21
  - [Назначение и границы модуля](#назначение-и-границы-модуля)
24
- - [Установка и импорт](#установка-и-импорт)
22
+ - [Импорт](#импорт)
25
23
  - [Минимальные понятия](#минимальные-понятия)
26
24
  - [Как выбрать API](#как-выбрать-api)
27
25
  - [Быстрый старт](#быстрый-старт)
@@ -72,13 +70,7 @@ README рассчитан на разработчика, который испо
72
70
 
73
71
  Не копируйте логику скачивания рядом с `binaryToBlob`. Для готового `Blob` уже существует `downloadFileFromBlob` в `/dom`.
74
72
 
75
- ## Установка и импорт
76
-
77
- Установите пакет:
78
-
79
- ```bash
80
- npm install @ryuzaki13/react-foundation-lib
81
- ```
73
+ ## Импорт
82
74
 
83
75
  Импортируйте API только из опубликованного subpath `/binary`:
84
76
 
@@ -2,16 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Data/Bounded Copy Stack" />
4
4
 
5
- # Ограниченный стек копий через `@ryuzaki13/react-foundation-lib/bounded-copy-stack`
5
+ # Ограниченный стек копий
6
6
 
7
7
  Модуль хранит небольшой список последних скопированных сущностей. Новый элемент помещается в начало, повтор по `fingerprint` обновляет существующую запись, а старые записи удаляются при превышении лимита.
8
8
 
9
- Документ рассчитан на разработчика без доступа к исходникам пакета. Ниже объясняются структура элемента, различие `id` и `fingerprint`, порядок записей, ссылки на payload и все граничные случаи.
10
-
11
9
  ## Содержание
12
10
 
13
11
  - [Назначение и границы](#назначение-и-границы)
14
- - [Установка и импорт](#установка-и-импорт)
12
+ - [Импорт](#импорт)
15
13
  - [Основные понятия](#основные-понятия)
16
14
  - [Быстрый старт](#быстрый-старт)
17
15
  - [`pushBoundedCopyStackItem`](#pushboundedcopystackitem)
@@ -44,11 +42,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
44
42
 
45
43
  Clipboard helpers находятся в `@ryuzaki13/react-foundation-lib/copy`. Владелец state/storage находится в host-приложении.
46
44
 
47
- ## Установка и импорт
48
-
49
- ```bash
50
- npm install @ryuzaki13/react-foundation-lib
51
- ```
45
+ ## Импорт
52
46
 
53
47
  ```ts
54
48
  import {
@@ -57,11 +51,11 @@ import {
57
51
  pushBoundedCopyStackItem
58
52
  } from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
59
53
 
60
- import type {
61
- BoundedCopyStackItem,
62
- BoundedCopyStackOptions,
63
- BoundedCopyStackPushInput,
64
- BoundedCopyStackPushResult
54
+ import {
55
+ type BoundedCopyStackItem,
56
+ type BoundedCopyStackOptions,
57
+ type BoundedCopyStackPushInput,
58
+ type BoundedCopyStackPushResult
65
59
  } from "@ryuzaki13/react-foundation-lib/bounded-copy-stack";
66
60
  ```
67
61
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Interaction/Context Menu State" />
4
4
 
5
- # Состояние и anchors контекстного меню через `@ryuzaki13/react-foundation-lib/context-menu`
5
+ # Состояние и anchors контекстного меню
6
6
 
7
7
  Модуль описывает открытое/закрытое состояние контекстного меню, источник открытия и два вида anchor: DOM element или экранная точка. Также он создаёт virtual anchor для Floating UI.
8
8
 
@@ -11,7 +11,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
11
11
  ## Содержание
12
12
 
13
13
  - [Назначение и границы](#назначение-и-границы)
14
- - [Установка и импорт](#установка-и-импорт)
14
+ - [Импорт](#импорт)
15
15
  - [Модель данных](#модель-данных)
16
16
  - [Получение точки](#получение-точки)
17
17
  - [`createVirtualAnchor`](#createvirtualanchor)
@@ -48,7 +48,7 @@ host React/Floating UI/menu component
48
48
 
49
49
  Готовый visual primitive находится в `@ryuzaki13/react-foundation-ui/context-menu`.
50
50
 
51
- ## Установка и импорт
51
+ ## Импорт
52
52
 
53
53
  ```ts
54
54
  import {
@@ -61,14 +61,14 @@ import {
61
61
  toggleMenu
62
62
  } from "@ryuzaki13/react-foundation-lib/context-menu";
63
63
 
64
- import type {
65
- ElementMenuAnchor,
66
- MenuAnchor,
67
- MenuOpenSource,
68
- MenuPoint,
69
- MenuState,
70
- OpenMenuPayload,
71
- PointMenuAnchor
64
+ import {
65
+ type ElementMenuAnchor,
66
+ type MenuAnchor,
67
+ type MenuOpenSource,
68
+ type MenuPoint,
69
+ type MenuState,
70
+ type OpenMenuPayload,
71
+ type PointMenuAnchor
72
72
  } from "@ryuzaki13/react-foundation-lib/context-menu";
73
73
  ```
74
74
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Copy" />
4
4
 
5
- # Копирование текста через `@ryuzaki13/react-foundation-lib/copy`
5
+ # Копирование текста
6
6
 
7
7
  Модуль `copy` содержит React hooks для копирования текста в системный буфер обмена, чтения текста из DOM-элемента и показа короткого состояния «скопировано».
8
8
 
@@ -14,12 +14,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
14
14
 
15
15
  Модуль ориентирован на браузер. Он скрывает технический выбор между современным Clipboard API и legacy fallback, но не отменяет браузерные разрешения и ограничения безопасности.
16
16
 
17
- README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия React и DOM, точное поведение каждого hook, обработка ошибок, доступность, тестирование и известные ограничения.
18
-
19
17
  ## Содержание
20
18
 
21
19
  - [Назначение и границы модуля](#назначение-и-границы-модуля)
22
- - [Установка и импорт](#установка-и-импорт)
20
+ - [Импорт](#импорт)
23
21
  - [Минимальные понятия](#минимальные-понятия)
24
22
  - [Как выбрать API](#как-выбрать-api)
25
23
  - [Быстрый старт](#быстрый-старт)
@@ -72,13 +70,7 @@ README рассчитан на разработчика, который испо
72
70
  | Реализовать визуальную кнопку/tooltip | UI-компонент приложения или foundation UI-пакет |
73
71
  | Скопировать изображение или rich HTML | Отдельная реализация Clipboard API для нужного формата |
74
72
 
75
- ## Установка и импорт
76
-
77
- Установите пакет:
78
-
79
- ```bash
80
- npm install @ryuzaki13/react-foundation-lib
81
- ```
73
+ ## Импорт
82
74
 
83
75
  Модуль использует React hooks. Приложение должно предоставить совместимые peer-зависимости React:
84
76
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Crypto" />
4
4
 
5
- # Идентификаторы и строковые hash через `@ryuzaki13/react-foundation-lib/crypto`
5
+ # Идентификаторы и строковые hash
6
6
 
7
7
  Модуль `crypto` предоставляет небольшие функции для двух разных задач:
8
8
 
@@ -13,12 +13,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
13
13
 
14
14
  Несмотря на имя entrypoint, строковые hash этого модуля не являются криптографическими. Они не подходят для паролей, подписей, access token, проверки безопасности или сокрытия персональных данных.
15
15
 
16
- README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Здесь объясняются базовые понятия, точные форматы результатов, browser runtime, Unicode, коллизии, React/SSR, тестирование и безопасные границы применения.
17
-
18
16
  ## Содержание
19
17
 
20
18
  - [Назначение и границы модуля](#назначение-и-границы-модуля)
21
- - [Установка и импорт](#установка-и-импорт)
19
+ - [Импорт](#импорт)
22
20
  - [Минимальные понятия](#минимальные-понятия)
23
21
  - [Как выбрать API](#как-выбрать-api)
24
22
  - [Быстрый старт](#быстрый-старт)
@@ -71,13 +69,7 @@ README рассчитан на разработчика, который испо
71
69
  | Детерминированные hash | `hashString`, `hashString128`, `hashString128Base64Url`, `stringToElementId` | Та же точная строка даёт тот же результат. |
72
70
  | Случайный идентификатор | `uuidv4` | Каждый вызов должен создавать новое случайное значение. |
73
71
 
74
- ## Установка и импорт
75
-
76
- Установите пакет:
77
-
78
- ```bash
79
- npm install @ryuzaki13/react-foundation-lib
80
- ```
72
+ ## Импорт
81
73
 
82
74
  Импортируйте функции только из опубликованного subpath `/crypto`:
83
75
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Date/Segments" />
4
4
 
5
- # Сегменты даты и времени через `@ryuzaki13/react-foundation-lib/date-segments`
5
+ # Сегменты даты и времени
6
6
 
7
7
  Модуль разбирает строковую маску на редактируемые сегменты и литералы, преобразует `Date` в значения полей и строго собирает `Date` обратно. Он предназначен для segment-based date/time inputs.
8
8
 
@@ -11,7 +11,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
11
11
  ## Содержание
12
12
 
13
13
  - [Назначение и границы](#назначение-и-границы)
14
- - [Установка и импорт](#установка-и-импорт)
14
+ - [Импорт](#импорт)
15
15
  - [Базовые понятия](#базовые-понятия)
16
16
  - [Поддерживаемые tokens](#поддерживаемые-tokens)
17
17
  - [`parseDateSegmentMask`](#parsedatesegmentmask)
@@ -40,7 +40,7 @@ new Date(2026, 2, 3, 18, 3)
40
40
 
41
41
  Модуль не рендерит input, не управляет focus/caret, не форматирует итоговую дату для UI/backend и не парсит ISO/OData строку. Для общего парсинга/форматирования используйте `/formatters`.
42
42
 
43
- ## Установка и импорт
43
+ ## Импорт
44
44
 
45
45
  ```ts
46
46
  import {
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/DOM" />
4
4
 
5
- # Browser DOM и focus helpers через `@ryuzaki13/react-foundation-lib/dom`
5
+ # Browser DOM и focus helpers
6
6
 
7
7
  Модуль `dom` содержит небольшие browser helpers и React hooks для типовых инфраструктурных задач:
8
8
 
@@ -17,12 +17,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
17
17
 
18
18
  Модуль является низкоуровневым browser foundation-слоем. Он не создаёт готовые кнопки, dialog, modal, popover, tooltip или download UI. Визуальный компонент по-прежнему отвечает за семантический HTML, ARIA, стили, анимацию, стек overlay, сообщения об ошибках и пользовательский сценарий.
19
19
 
20
- README рассчитан на разработчика, который использует опубликованный пакет без прямого доступа к исходному коду. Здесь объясняются базовые понятия DOM и React, все публичные функции, точный lifecycle, defaults, cleanup, ограничения доступности, тестирование и частые ошибки.
21
-
22
20
  ## Содержание
23
21
 
24
22
  - [Назначение и границы модуля](#назначение-и-границы-модуля)
25
- - [Установка и импорт](#установка-и-импорт)
23
+ - [Импорт](#импорт)
26
24
  - [Runtime и browser boundary](#runtime-и-browser-boundary)
27
25
  - [Минимальные понятия](#минимальные-понятия)
28
26
  - [Как выбрать API](#как-выбрать-api)
@@ -91,13 +89,7 @@ README рассчитан на разработчика, который испо
91
89
 
92
90
  Если приложению нужен готовый UI primitive, сначала ищите его в `@ryuzaki13/react-foundation-ui`. Модуль `dom` нужен авторам primitives и для специальных browser-сценариев, а не для повторной сборки локальных modal/dialog в каждом feature.
93
91
 
94
- ## Установка и импорт
95
-
96
- Установите пакет:
97
-
98
- ```bash
99
- npm install @ryuzaki13/react-foundation-lib
100
- ```
92
+ ## Импорт
101
93
 
102
94
  Entrypoint экспортирует React hooks, поэтому host-приложение должно предоставить совместимые peer-зависимости:
103
95
 
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Errors/Missing Context" />
4
4
 
5
- # Ошибка отсутствующего React context через `@ryuzaki13/react-foundation-lib/error`
5
+ # Ошибка отсутствующего React context
6
6
 
7
7
  Модуль создаёт единообразное диагностическое сообщение, когда custom hook вызван вне нужного Provider.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```ts
12
12
  import { createMissingContextError, createMissingContextErrorMessage } from "@ryuzaki13/react-foundation-lib/error";
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/File" />
4
4
 
5
- # Работа с пользовательскими файлами через `@ryuzaki13/react-foundation-lib/file`
5
+ # Работа с пользовательскими файлами
6
6
 
7
7
  Модуль `file` содержит browser helpers для четырёх связанных задач:
8
8
 
@@ -13,12 +13,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
13
13
 
14
14
  Модуль является низкоуровневым foundation-слоем. Он не рисует `<input type="file">`, не отправляет файл на backend, не показывает preview или progress, не проверяет реальное содержимое файла и не заменяет серверную валидацию.
15
15
 
16
- README рассчитан на разработчика, который использует опубликованный пакет без доступа к исходному коду. Поэтому ниже отдельно объясняются базовые понятия JavaScript/TypeScript, точный порядок проверок, структура результатов, все публичные функции и типы, фактические классы ошибок, ограничения безопасности и известные особенности текущей реализации.
17
-
18
16
  ## Содержание
19
17
 
20
18
  - [Назначение и границы модуля](#назначение-и-границы-модуля)
21
- - [Установка и импорт](#установка-и-импорт)
19
+ - [Импорт](#импорт)
22
20
  - [Runtime и browser boundary](#runtime-и-browser-boundary)
23
21
  - [Минимальные понятия](#минимальные-понятия)
24
22
  - [Как выбрать API](#как-выбрать-api)
@@ -90,13 +88,7 @@ README рассчитан на разработчика, который испо
90
88
 
91
89
  Если нужен только обычный upload через `multipart/form-data`, браузерный `File` можно положить в `FormData` напрямую. Предварительное чтение всего файла через `readFile` для этого не обязательно.
92
90
 
93
- ## Установка и импорт
94
-
95
- Установите пакет:
96
-
97
- ```bash
98
- npm install @ryuzaki13/react-foundation-lib
99
- ```
91
+ ## Импорт
100
92
 
101
93
  Импортируйте API только из опубликованного subpath `/file`:
102
94
 
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Browser/Client Fingerprint" />
4
4
 
5
- # Client fingerprint через `@ryuzaki13/react-foundation-lib/fingerprint`
5
+ # Client fingerprint
6
6
 
7
7
  `getClientFingerprint` лениво загружает FingerprintJS, получает `visitorId` и кеширует Promise на всё время жизни JavaScript-модуля.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```bash
12
- npm install @ryuzaki13/react-foundation-lib @fingerprintjs/fingerprintjs
12
+ npm install @fingerprintjs/fingerprintjs
13
13
  ```
14
14
 
15
15
  ```ts
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Forms/Form Errors" />
4
4
 
5
- # Чтение первой ошибки формы через `@ryuzaki13/react-foundation-lib/form`
5
+ # Чтение первой ошибки формы
6
6
 
7
7
  Модуль содержит одну функцию `readFirstFormError`. Она получает неоднородный массив ошибок и возвращает первое найденное текстовое сообщение.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```ts
12
12
  import { readFirstFormError } from "@ryuzaki13/react-foundation-lib/form";
@@ -8,12 +8,6 @@ import { Meta } from "@storybook/addon-docs/blocks";
8
8
 
9
9
  Документация разделена по предметным областям, чтобы разработчику не приходилось читать один огромный файл. Этот README объясняет общие правила, помогает выбрать API и подробно описывает небольшие helpers верхнего уровня.
10
10
 
11
- ## Установка
12
-
13
- ```bash
14
- npm install @ryuzaki13/react-foundation-lib
15
- ```
16
-
17
11
  Пакет является ESM. Корневого импорта пакета нет. Все formatter functions и их типы импортируются из точечного entrypoint:
18
12
 
19
13
  ```ts
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Formatters/Boolean" />
4
4
 
5
- # Boolean и ABAP boolean через `@ryuzaki13/react-foundation-lib/formatters`
5
+ # Boolean и ABAP boolean
6
6
 
7
7
  Подмодуль `boolean` преобразует значения между JavaScript `boolean` и двухсимвольным ABAP-контрактом:
8
8
 
@@ -11,12 +11,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
11
11
 
12
12
  Также он предоставляет более широкий parser `parseBoolean` для простых пользовательских или transport-значений.
13
13
 
14
- README рассчитан на разработчика без доступа к исходному коду. Ниже описано точное, местами неочевидное поведение всех трёх публичных функций. Особенно важно не путать строгий `parseAbapBoolean`, расширенный `parseBoolean` и truthy-семантику `toAbapBoolean`.
15
-
16
14
  ## Содержание
17
15
 
18
16
  - [Назначение и границы](#назначение-и-границы)
19
- - [Установка и импорт](#установка-и-импорт)
17
+ - [Импорт](#импорт)
20
18
  - [Минимальные понятия](#минимальные-понятия)
21
19
  - [Как выбрать функцию](#как-выбрать-функцию)
22
20
  - [`parseAbapBoolean`](#parseabapboolean)
@@ -47,13 +45,7 @@ README рассчитан на разработчика без доступа к
47
45
  - не сериализует JSON, URL или OData query;
48
46
  - не гарантирует, что широкий `toAbapBoolean(unknown)` подходит конкретному backend-контракту.
49
47
 
50
- ## Установка и импорт
51
-
52
- Установите пакет:
53
-
54
- ```bash
55
- npm install @ryuzaki13/react-foundation-lib
56
- ```
48
+ ## Импорт
57
49
 
58
50
  Все boolean helpers импортируются из единственного опубликованного subpath `/formatters`:
59
51
 
@@ -17,12 +17,10 @@ import { Meta } from "@storybook/addon-docs/blocks";
17
17
  контролируемая причина ошибки выполнения
18
18
  ```
19
19
 
20
- README рассчитан на разработчика без доступа к исходному коду. Здесь описано точное поведение всего публичного API, включая преобразование значений, реестр, validation, ошибки и связь с formatter pipeline.
21
-
22
20
  ## Содержание
23
21
 
24
22
  - [Назначение и границы](#назначение-и-границы)
25
- - [Установка и импорт](#установка-и-импорт)
23
+ - [Импорт](#импорт)
26
24
  - [Быстрый старт](#быстрый-старт)
27
25
  - [Основные понятия](#основные-понятия)
28
26
  - [Описание формулы](#описание-формулы)
@@ -71,11 +69,7 @@ Host-приложение владеет прикладными `TableFormulaDef
71
69
 
72
70
  Сериализуемая конфигурация колонки хранит только стабильный `formulaId` и ordered dependencies. Реальная функция остаётся доверенным кодом приложения.
73
71
 
74
- ## Установка и импорт
75
-
76
- ```bash
77
- npm install @ryuzaki13/react-foundation-lib
78
- ```
72
+ ## Импорт
79
73
 
80
74
  Используйте только опубликованный package subpath `/formulas`:
81
75
 
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/HTTP/Headers and Text Response" />
4
4
 
5
- # HTTP headers и текстовые ответы через `@ryuzaki13/react-foundation-lib/http`
5
+ # HTTP headers и текстовые ответы
6
6
 
7
7
  Модуль создаёт стандартный набор HTTP-заголовков запрета кеширования и обычный `Response` с UTF-8 plain text.
8
8
 
9
9
  ## Содержание
10
10
 
11
11
  - [Назначение и границы](#назначение-и-границы)
12
- - [Установка и импорт](#установка-и-импорт)
12
+ - [Импорт](#импорт)
13
13
  - [`createNoStoreHeaders`](#createnostoreheaders)
14
14
  - [`createTextHttpResponse`](#createtexthttpresponse)
15
15
  - [Runtime и безопасность](#runtime-и-безопасность)
@@ -26,7 +26,7 @@ Headers с no-store + Response(text/plain; charset=UTF-8)
26
26
 
27
27
  Модуль не выполняет `fetch`, не сериализует JSON, не задаёт CORS, CSP, cookies или authorization и не превращает ошибки transport в response автоматически.
28
28
 
29
- ## Установка и импорт
29
+ ## Импорт
30
30
 
31
31
  ```ts
32
32
  import { createNoStoreHeaders, createTextHttpResponse } from "@ryuzaki13/react-foundation-lib/http";
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Media" />
4
4
 
5
- # Адаптивность и media queries через `@ryuzaki13/react-foundation-lib/media`
5
+ # Адаптивность и media queries
6
6
 
7
7
  Модуль `media` содержит общий низкоуровневый контракт адаптивности для React-приложений:
8
8
 
@@ -14,12 +14,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
14
14
  - преобразование количества пикселей относительно размера `em`;
15
15
  - расчёт проектной высоты control.
16
16
 
17
- Документ рассчитан на разработчика, который использует опубликованный пакет без доступа к его исходному коду. Поэтому ниже отдельно объясняются базовые понятия CSS и React, точные значения, fallback-порядок, SSR, hydration, подписки, cleanup, ограничения и все публичные exports.
17
+ Ниже отдельно объясняются базовые понятия CSS и React, точные значения, fallback-порядок, SSR, hydration, подписки, cleanup, ограничения и все публичные exports.
18
18
 
19
19
  ## Содержание
20
20
 
21
21
  - [Граница ответственности](#граница-ответственности)
22
- - [Установка и импорт](#установка-и-импорт)
22
+ - [Импорт](#импорт)
23
23
  - [Минимальные понятия](#минимальные-понятия)
24
24
  - [Как выбрать API](#как-выбрать-api)
25
25
  - [Проектные брейкпоинты](#проектные-брейкпоинты)
@@ -82,7 +82,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
82
82
 
83
83
  Если задача решается только стилями, сначала используйте CSS. JavaScript hook нужен, когда media query действительно влияет на вычисления, выбор поведения, параметры сторонней библиотеки или внешний store.
84
84
 
85
- ## Установка и импорт
85
+ ## Импорт
86
86
 
87
87
  Установите пакет:
88
88
 
@@ -22,12 +22,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
22
22
 
23
23
  Для ошибок внутри формы лучше показывать сообщение рядом с полем. Уведомление — дополнительный, а не единственный канал обратной связи.
24
24
 
25
- ## Установка и импорт
25
+ ## Импорт
26
26
 
27
27
  Модулю нужен peer dependency `zustand`.
28
28
 
29
29
  ```bash
30
- npm install @ryuzaki13/react-foundation-lib zustand
30
+ npm install zustand
31
31
  ```
32
32
 
33
33
  ```ts
@@ -13,7 +13,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
13
13
  3. преобразует значение в позицию `0..100%` и обратно;
14
14
  4. работает с дискретными точками `marks`.
15
15
 
16
- ## Установка и импорт
16
+ ## Импорт
17
17
 
18
18
  ```ts
19
19
  import {
@@ -15,14 +15,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
15
15
  - поиска пар «код + текст» в справочных коллекциях;
16
16
  - хранения общих настроек OData-справочников.
17
17
 
18
- README рассчитан на разработчика без доступа к исходному коду и с минимальным знанием JavaScript/TypeScript. В примерах объясняется не только вызов функции, но и смысл входных данных, результат, ограничения и типичные ошибки.
18
+ В примерах объясняется не только вызов функции, но и смысл входных данных, результат, ограничения и типичные ошибки.
19
19
 
20
20
  > Ранее helpers справочных коллекций публиковались через отдельный subpath `@ryuzaki13/react-foundation-lib/odata`. Теперь этот код входит в `odata-service`. Старый subpath удалён без compatibility alias.
21
21
 
22
22
  ## Содержание
23
23
 
24
24
  - [Что делает и чего не делает модуль](#что-делает-и-чего-не-делает-модуль)
25
- - [Установка и импорт](#установка-и-импорт)
25
+ - [Импорт](#импорт)
26
26
  - [Зависимости и среда выполнения](#зависимости-и-среда-выполнения)
27
27
  - [OData V2 простыми словами](#odata-v2-простыми-словами)
28
28
  - [Быстрый старт](#быстрый-старт)
@@ -99,13 +99,7 @@ host entity / feature / widget
99
99
  бизнес-правила, экран, пользовательский сценарий
100
100
  ```
101
101
 
102
- ## Установка и импорт
103
-
104
- Установите пакет:
105
-
106
- ```bash
107
- npm install @ryuzaki13/react-foundation-lib
108
- ```
102
+ ## Импорт
109
103
 
110
104
  Для полного entrypoint также разрешите совместимые peer dependencies, если package manager не сделал этого автоматически:
111
105
 
@@ -142,7 +136,7 @@ import { buildODataFilter } from "@ryuzaki13/react-foundation-lib";
142
136
  import { buildODataFilter } from "@ryuzaki13/react-foundation-lib/dist/odata-service/filters";
143
137
 
144
138
  // Неверно: прежний subpath удалён после объединения модулей.
145
- import { findCollectionPairs } from "@ryuzaki13/react-foundation-lib/odata";
139
+ import { findCollectionPairs } from "@ryuzaki13/react-foundation-lib/odata-service";
146
140
  ```
147
141
 
148
142
  ### `import type` для TypeScript-типов
@@ -2586,7 +2580,7 @@ beforeEach(() => {
2586
2580
  До:
2587
2581
 
2588
2582
  ```ts
2589
- import { buildSeparatedArrays, findCollectionPairs, ODataDateFormat, useODataCollectionStore } from "@ryuzaki13/react-foundation-lib/odata";
2583
+ import { buildSeparatedArrays, findCollectionPairs, ODataDateFormat, useODataCollectionStore } from "@ryuzaki13/react-foundation-lib/odata-service";
2590
2584
  ```
2591
2585
 
2592
2586
  После:
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Data/Presets" />
4
4
 
5
- # Общие preset helpers через `@ryuzaki13/react-foundation-lib/presets`
5
+ # Общие preset helpers
6
6
 
7
7
  Модуль проверяет восстановленные preset ids, сопоставляет их с option objects и ищет одну option по id.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```ts
12
12
  import { getPresetOption, normalizePresetIds, resolvePresetOptionsByIds } from "@ryuzaki13/react-foundation-lib/presets";
@@ -13,14 +13,6 @@ import { Meta } from "@storybook/addon-docs/blocks";
13
13
 
14
14
  Используйте точный subpath. Внутренний файл `serviceWorker` не является самостоятельным публичным export, даже если отдельные функции используются самим hook.
15
15
 
16
- ## Установка
17
-
18
- Для `useServiceWorkerUpdate` нужен React. Cache policy не имеет React-зависимости.
19
-
20
- ```bash
21
- npm install @ryuzaki13/react-foundation-lib react
22
- ```
23
-
24
16
  ## Часть 1. Обновление Service Worker
25
17
 
26
18
  ### Задача hook
@@ -14,14 +14,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
14
14
  - синхронизирует cache data и invalidation между вкладками;
15
15
  - предоставляет низкоуровневые helpers для optimistic update и rollback.
16
16
 
17
- README рассчитан на разработчика без доступа к исходному коду и с минимальным знанием JavaScript, TypeScript и TanStack Query. Здесь описаны установка, инициализация, жизненный цикл данных, точное поведение функций, ограничения browser API и полный публичный API.
17
+ Здесь описаны жизненный цикл данных, точное поведение функций, ограничения browser API и полный публичный API.
18
18
 
19
19
  > Ранее optimistic update был описан отдельным документом. Теперь весь смысл, примеры, ограничения и API находятся только на этой странице.
20
20
 
21
21
  ## Содержание
22
22
 
23
23
  - [Назначение и границы](#назначение-и-границы)
24
- - [Установка и импорт](#установка-и-импорт)
24
+ - [Импорт](#импорт)
25
25
  - [Обязательные build-time constants](#обязательные-build-time-constants)
26
26
  - [Основные понятия TanStack Query](#основные-понятия-tanstack-query)
27
27
  - [Как выбрать cache strategy](#как-выбрать-cache-strategy)
@@ -92,15 +92,12 @@ queryOptions/useQuery/useMutation
92
92
 
93
93
  Broadcast не является четвёртым хранилищем. Он только передаёт изменения между уже работающими вкладками.
94
94
 
95
- ## Установка и импорт
95
+ ## Импорт
96
96
 
97
- Установите foundation-пакет и совместимые peer dependencies:
97
+ Установите совместимые peer dependencies:
98
98
 
99
99
  ```bash
100
- npm install @ryuzaki13/react-foundation-lib
101
- npm install react @tanstack/react-query \
102
- @tanstack/query-persist-client-core \
103
- @tanstack/query-broadcast-client-experimental
100
+ npm install react @tanstack/react-query @tanstack/query-persist-client-core @tanstack/query-broadcast-client-experimental
104
101
  ```
105
102
 
106
103
  Публичный импорт:
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Data/Range Output" />
4
4
 
5
- # Подстановка открытых границ через `@ryuzaki13/react-foundation-lib/range-output`
5
+ # Подстановка открытых границ
6
6
 
7
7
  Модуль хранит в UI открытые границы диапазона как `null`, но позволяет подставить конкретные значения при внешнем выводе или сохранении.
8
8
 
9
9
  ## Содержание
10
10
 
11
11
  - [Назначение](#назначение)
12
- - [Установка и импорт](#установка-и-импорт)
12
+ - [Импорт](#импорт)
13
13
  - [Контракты](#контракты)
14
14
  - [`readRangeOutputValueFallback`](#readrangeoutputvaluefallback)
15
15
  - [`resolveRangeOutputValue`](#resolverangeoutputvalue)
@@ -28,7 +28,7 @@ external output [0, 6]
28
28
 
29
29
  Исходное UI-значение не изменяется. `null` заменяется только при построении отдельного output tuple.
30
30
 
31
- ## Установка и импорт
31
+ ## Импорт
32
32
 
33
33
  ```ts
34
34
  import { readRangeOutputValueFallback, resolveRangeOutputValue } from "@ryuzaki13/react-foundation-lib/range-output";
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Browser/Session Storage ID" />
4
4
 
5
- # Идентификатор вкладочной сессии через `@ryuzaki13/react-foundation-lib/session-storage`
5
+ # Идентификатор вкладочной сессии
6
6
 
7
7
  `getSessionStorageId` возвращает стабильный id в пределах одной browser-вкладки. При первом вызове id создаётся и сохраняется в `sessionStorage`, при следующих — читается по тому же ключу.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```ts
12
12
  import { getSessionStorageId } from "@ryuzaki13/react-foundation-lib/session-storage";
@@ -2,11 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Data/String Comparison" />
4
4
 
5
- # Сравнение строк через `@ryuzaki13/react-foundation-lib/string-comparison`
5
+ # Сравнение строк
6
6
 
7
7
  `compareStrings` задаёт единый порядок строк для русскоязычных UI-списков, смешанной кириллицы/латиницы и числовых суффиксов.
8
8
 
9
- ## Установка и импорт
9
+ ## Импорт
10
10
 
11
11
  ```ts
12
12
  import { compareStrings } from "@ryuzaki13/react-foundation-lib/string-comparison";
@@ -9,14 +9,12 @@ import { Meta } from "@storybook/addon-docs/blocks";
9
9
  - `@ryuzaki13/react-foundation-lib/table` — типы и helpers для TanStack Table v9, колонок, layout, выбора строк и ячеек, а также OData metadata;
10
10
  - `@ryuzaki13/react-foundation-lib/tree-table` — построение древовидных строк и преобразование плоских аналитических данных в иерархию.
11
11
 
12
- Документ рассчитан на разработчика без доступа к исходному коду пакета и с минимальным знанием JavaScript, TypeScript, React и TanStack Table. В нём объясняются не только названия функций, но и смысл каждого состояния, правила идентификаторов, результат вызова, ограничения и типичные ошибки.
13
-
14
12
  > Документ один, потому что плоская и древовидная таблицы используют общие понятия строк, колонок, идентификаторов и selection. Публичных import path при этом два: API `tree-table` не реэкспортируется из `table`, а API `table` не реэкспортируется из `tree-table`.
15
13
 
16
14
  ## Содержание
17
15
 
18
16
  - [Назначение и границы](#назначение-и-границы)
19
- - [Установка и импорт](#установка-и-импорт)
17
+ - [Импорт](#импорт)
20
18
  - [Что нужно знать перед началом](#что-нужно-знать-перед-началом)
21
19
  - [Как выбрать нужную часть API](#как-выбрать-нужную-часть-api)
22
20
  - [Быстрый старт: плоская таблица](#быстрый-старт-плоская-таблица)
@@ -134,13 +132,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
134
132
  table helpers очищают только локальный UI state
135
133
  ```
136
134
 
137
- ## Установка и импорт
138
-
139
- Установите пакет:
140
-
141
- ```bash
142
- npm install @ryuzaki13/react-foundation-lib
143
- ```
135
+ ## Импорт
144
136
 
145
137
  Для `table` host должен разрешить совместимые peer dependencies React и TanStack Table:
146
138
 
@@ -2,13 +2,13 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Contracts/Common Types" />
4
4
 
5
- # Общие технические типы `@ryuzaki13/react-foundation-lib/types`
5
+ # Общие технические типы
6
6
 
7
7
  Модуль содержит небольшие общие TypeScript-контракты для value state, ABAP boolean, базовых значений, диапазонов и строк таблицы. Единственная runtime-функция — `isBaseType`.
8
8
 
9
9
  ## Содержание
10
10
 
11
- - [Установка и импорт](#установка-и-импорт)
11
+ - [Импорт](#импорт)
12
12
  - [`State`](#state)
13
13
  - [`AbapBoolean`](#abapboolean)
14
14
  - [`Primitive` и `BaseType`](#primitive-и-basetype)
@@ -18,21 +18,21 @@ import { Meta } from "@storybook/addon-docs/blocks";
18
18
  - [`RowRecord`](#rowrecord)
19
19
  - [Ошибки проектирования](#ошибки-проектирования)
20
20
 
21
- ## Установка и импорт
21
+ ## Импорт
22
22
 
23
23
  ```ts
24
24
  import { isBaseType } from "@ryuzaki13/react-foundation-lib/types";
25
25
 
26
- import type {
27
- AbapBoolean,
28
- ArrayType,
29
- BaseType,
30
- InputType,
31
- ObjectType,
32
- Primitive,
33
- RangeType,
34
- RowRecord,
35
- State
26
+ import {
27
+ type AbapBoolean,
28
+ type ArrayType,
29
+ type BaseType,
30
+ type InputType,
31
+ type ObjectType,
32
+ type Primitive,
33
+ type RangeType,
34
+ type RowRecord,
35
+ type State
36
36
  } from "@ryuzaki13/react-foundation-lib/types";
37
37
  ```
38
38
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/API/Utils" />
4
4
 
5
- # Общие утилиты `@ryuzaki13/react-foundation-lib/utils`
5
+ # Общие утилиты
6
6
 
7
7
  Модуль `utils` объединяет небольшие технические функции, которые нужны в разных частях React- и TypeScript-приложения:
8
8
 
@@ -16,14 +16,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
16
16
  - копирование древовидной структуры;
17
17
  - единая точка вывода ошибок в `console.error`.
18
18
 
19
- Документ рассчитан на разработчика без доступа к исходному коду пакета и с минимальным знанием JavaScript, TypeScript и React. Поэтому ниже объясняются назначение каждого аргумента, точный результат, побочные эффекты, различия похожих функций и ограничения.
19
+ Ниже объясняются назначение каждого аргумента, точный результат, побочные эффекты, различия похожих функций и ограничения.
20
20
 
21
21
  > `utils` — это опубликованный entrypoint, а не приглашение складывать сюда любую бизнес-логику. В модуле нет HTTP-запросов, UI-компонентов, доменных правил, нормализации пользовательского ввода и криптографии.
22
22
 
23
23
  ## Содержание
24
24
 
25
25
  - [Назначение и границы](#назначение-и-границы)
26
- - [Установка и импорт](#установка-и-импорт)
26
+ - [Импорт](#импорт)
27
27
  - [Среда выполнения](#среда-выполнения)
28
28
  - [Минимальные понятия](#минимальные-понятия)
29
29
  - [Как выбрать функцию](#как-выбрать-функцию)
@@ -98,13 +98,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
98
98
  | UI primitives | `@ryuzaki13/react-foundation-ui/<module>` |
99
99
  | Бизнес-преобразование сущности | entity/feature/widget host-приложения |
100
100
 
101
- ## Установка и импорт
102
-
103
- Установите пакет:
104
-
105
- ```bash
106
- npm install @ryuzaki13/react-foundation-lib
107
- ```
101
+ ## Импорт
108
102
 
109
103
  Entrypoint `/utils` также экспортирует React-функции `childrenCount` и `createLazyComponent`. Поэтому host-приложение должно разрешить совместимую peer dependency React:
110
104
 
@@ -2,7 +2,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Validation/Runtime Guards" />
4
4
 
5
- # Runtime guards и validators через `@ryuzaki13/react-foundation-lib/validators`
5
+ # Runtime guards и validators
6
6
 
7
7
  Модуль содержит небольшие проверки для `unknown`, object-like значений, image extensions, positive integer, URL и Floating UI DOM reference.
8
8
 
@@ -10,7 +10,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
10
10
 
11
11
  ## Содержание
12
12
 
13
- - [Установка и импорт](#установка-и-импорт)
13
+ - [Импорт](#импорт)
14
14
  - [Как работают type guards](#как-работают-type-guards)
15
15
  - [`isSafe`](#issafe)
16
16
  - [`isObject`, `isRecord`, `asRecord`](#isobject-isrecord-asrecord)
@@ -22,7 +22,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
22
22
  - [Security boundary](#security-boundary)
23
23
  - [Полный API](#полный-api)
24
24
 
25
- ## Установка и импорт
25
+ ## Импорт
26
26
 
27
27
  ```ts
28
28
  import {
@@ -2,15 +2,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/React/Virtualizer Pagination" />
4
4
 
5
- # Дозагрузка virtualized списка через `@ryuzaki13/react-foundation-lib/virtualizer`
5
+ # Дозагрузка virtualized списка
6
6
 
7
7
  `useFetchNextPageEffect` вызывает `fetchNextPage`, когда последняя отрендеренная virtual item достигает конца уже загруженного списка.
8
8
 
9
- ## Установка и импорт
10
-
11
- ```bash
12
- npm install react @tanstack/react-virtual @ryuzaki13/react-foundation-lib
13
- ```
9
+ ## Импорт
14
10
 
15
11
  ```ts
16
12
  import { useFetchNextPageEffect } from "@ryuzaki13/react-foundation-lib/virtualizer";
@@ -2,14 +2,14 @@ import { Meta } from "@storybook/addon-docs/blocks";
2
2
 
3
3
  <Meta title="Foundation Lib/Data/XML" />
4
4
 
5
- # Простые XML helpers через `@ryuzaki13/react-foundation-lib/xml`
5
+ # Простые XML helpers
6
6
 
7
7
  Модуль экранирует XML-текст, строит последовательность простых полей и читает текст первого тега через `DOMParser`.
8
8
 
9
9
  ## Содержание
10
10
 
11
11
  - [Назначение и границы](#назначение-и-границы)
12
- - [Установка и импорт](#установка-и-импорт)
12
+ - [Импорт](#импорт)
13
13
  - [`escapeXmlValue`](#escapexmlvalue)
14
14
  - [`buildXmlFields`](#buildxmlfields)
15
15
  - [`getXmlTagText`](#getxmltagtext)
@@ -33,7 +33,7 @@ import { Meta } from "@storybook/addon-docs/blocks";
33
33
  - не проверяет parser errors;
34
34
  - не выполняет network request.
35
35
 
36
- ## Установка и импорт
36
+ ## Импорт
37
37
 
38
38
  ```ts
39
39
  import { buildXmlFields, escapeXmlValue, getXmlTagText } from "@ryuzaki13/react-foundation-lib/xml";
@@ -1,8 +0,0 @@
1
- import { type WrappedODataParameters } from "../odata-service";
2
- /** Runtime-режим валюты, который задается общим OData-параметром страницы. */
3
- export type CurrencyMode = "internal" | "rub";
4
- /** Собирает display-подпись с валютным суффиксом. */
5
- export declare function resolveCurrencyAwareLabel(label: string, currencyLabels: readonly [string, string] | undefined, currencyMode: CurrencyMode | null | undefined): string;
6
- /** Определяет режим валюты по общему OData-параметру `p_curr`. */
7
- export declare function resolveCurrencyModeFromODataParameters(params?: WrappedODataParameters): CurrencyMode | null;
8
- //# sourceMappingURL=currency.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../src/currency/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAI/D,8EAA8E;AAC9E,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,KAAK,CAAC;AAE9C,qDAAqD;AACrD,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACrD,YAAY,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAC3C,MAAM,CAWR;AAED,kEAAkE;AAClE,wBAAgB,sCAAsC,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,YAAY,GAAG,IAAI,CAU3G"}
@@ -1,2 +0,0 @@
1
- export * from "./currency";
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -1,16 +0,0 @@
1
- //#region src/currency/currency.ts
2
- var e = "p_curr";
3
- function t(e, t, n) {
4
- if (!t || !n) return e;
5
- let r = t[n === "internal" ? 0 : 1]?.trim() ?? "", i = r.startsWith(",");
6
- return r ? `${e}${i ? "" : " "}${r}` : e;
7
- }
8
- function n(t) {
9
- if (!t || !Object.prototype.hasOwnProperty.call(t, e)) return null;
10
- let n = t[e]?.value;
11
- return n === !1 ? "internal" : n === !0 ? "rub" : null;
12
- }
13
- //#endregion
14
- export { t as resolveCurrencyAwareLabel, n as resolveCurrencyModeFromODataParameters };
15
-
16
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/currency/currency.ts"],"sourcesContent":["import { type WrappedODataParameters } from \"../odata-service\";\n\nconst CURRENCY_PARAMETER_ID = \"p_curr\";\n\n/** Runtime-режим валюты, который задается общим OData-параметром страницы. */\nexport type CurrencyMode = \"internal\" | \"rub\";\n\n/** Собирает display-подпись с валютным суффиксом. */\nexport function resolveCurrencyAwareLabel(\n\tlabel: string,\n\tcurrencyLabels: readonly [string, string] | undefined,\n\tcurrencyMode: CurrencyMode | null | undefined\n): string {\n\tif (!currencyLabels || !currencyMode) {\n\t\treturn label;\n\t}\n\n\tconst currencyLabelIndex = currencyMode === \"internal\" ? 0 : 1;\n\tconst currencyLabel = currencyLabels[currencyLabelIndex]?.trim() ?? \"\";\n\tconst hasComma = currencyLabel.startsWith(\",\");\n\n\t// NOTE: нужно закрепить правило, что запятая ставится в currencyLabel\n\treturn currencyLabel ? `${label}${hasComma ? \"\" : \" \"}${currencyLabel}` : label;\n}\n\n/** Определяет режим валюты по общему OData-параметру `p_curr`. */\nexport function resolveCurrencyModeFromODataParameters(params?: WrappedODataParameters): CurrencyMode | null {\n\tif (!params || !Object.prototype.hasOwnProperty.call(params, CURRENCY_PARAMETER_ID)) {\n\t\treturn null;\n\t}\n\n\tconst value = params[CURRENCY_PARAMETER_ID]?.value;\n\tif (value === false) return \"internal\";\n\tif (value === true) return \"rub\";\n\n\treturn null;\n}\n"],"mappings":";AAEA,IAAM,IAAwB;AAM9B,SAAgB,EACf,GACA,GACA,GACS;CACT,IAAI,CAAC,KAAkB,CAAC,GACvB,OAAO;CAIR,IAAM,IAAgB,EADK,MAAiB,aAAa,IAAI,EACL,EAAE,KAAK,KAAK,IAC9D,IAAW,EAAc,WAAW,GAAG;CAG7C,OAAO,IAAgB,GAAG,IAAQ,IAAW,KAAK,MAAM,MAAkB;AAC3E;AAGA,SAAgB,EAAuC,GAAsD;CAC5G,IAAI,CAAC,KAAU,CAAC,OAAO,UAAU,eAAe,KAAK,GAAQ,CAAqB,GACjF,OAAO;CAGR,IAAM,IAAQ,EAAO,EAAsB,EAAE;CAI7C,OAHI,MAAU,KAAc,aACxB,MAAU,KAAa,QAEpB;AACR"}
@@ -1,155 +0,0 @@
1
- import { Meta } from "@storybook/addon-docs/blocks";
2
-
3
- <Meta title="Foundation Lib/Data/Currency" />
4
-
5
- # Валютные подписи через `@ryuzaki13/react-foundation-lib/currency`
6
-
7
- Модуль связывает общий OData-параметр `p_curr` с отображаемой подписью показателя. Он определяет один из двух режимов валюты и добавляет соответствующий суффикс к label.
8
-
9
- ## Содержание
10
-
11
- - [Назначение](#назначение)
12
- - [Установка и импорт](#установка-и-импорт)
13
- - [`CurrencyMode`](#currencymode)
14
- - [`resolveCurrencyModeFromODataParameters`](#resolvecurrencymodefromodataparameters)
15
- - [`resolveCurrencyAwareLabel`](#resolvecurrencyawarelabel)
16
- - [Готовый pipeline](#готовый-pipeline)
17
- - [Ограничения и ошибки](#ограничения-и-ошибки)
18
- - [API-справочник](#api-справочник)
19
-
20
- ## Назначение
21
-
22
- ```text
23
- wrapped OData params
24
- { p_curr: { value: true } }
25
- │
26
- ▼
27
- CurrencyMode "rub"
28
- │
29
- ▼
30
- "Выручка" + ["за тн", "руб/тн"]
31
- │
32
- ▼
33
- "Выручка руб/тн"
34
- ```
35
-
36
- Модуль не форматирует денежное число, не конвертирует валюту и не строит OData query. Для чисел используйте `/formatters`, для OData params — `/odata-service`.
37
-
38
- ## Установка и импорт
39
-
40
- ```ts
41
- import { resolveCurrencyAwareLabel, resolveCurrencyModeFromODataParameters } from "@ryuzaki13/react-foundation-lib/currency";
42
-
43
- import type { CurrencyMode } from "@ryuzaki13/react-foundation-lib/currency";
44
- ```
45
-
46
- Модуль ESM, не требует React или browser API. Параметры должны иметь публичную wrapped-форму из `/odata-service`.
47
-
48
- ## `CurrencyMode`
49
-
50
- ```ts
51
- type CurrencyMode = "internal" | "rub";
52
- ```
53
-
54
- - `internal` — внутренний режим;
55
- - `rub` — рублёвый режим.
56
-
57
- `null` используется resolver-функцией, когда режим определить нельзя.
58
-
59
- ## `resolveCurrencyModeFromODataParameters`
60
-
61
- ```ts
62
- const mode = resolveCurrencyModeFromODataParameters(params);
63
- ```
64
-
65
- Функция читает только собственное поле `p_curr.value`:
66
-
67
- | Вход | Результат |
68
- | ------------------------------- | ------------ |
69
- | параметров нет | `null` |
70
- | поля `p_curr` нет | `null` |
71
- | `{ p_curr: { value: false } }` | `"internal"` |
72
- | `{ p_curr: { value: true } }` | `"rub"` |
73
- | `{ p_curr: { value: "true" } }` | `null` |
74
- | `{ p_curr: { value: 1 } }` | `null` |
75
-
76
- Строка `"true"` намеренно не приводится к boolean. Нормализуйте внешний payload на OData boundary, а не внутри UI label.
77
-
78
- Пример с helper `/odata-service`:
79
-
80
- ```ts
81
- import { wrapODataParams } from "@ryuzaki13/react-foundation-lib/odata-service";
82
-
83
- const params = wrapODataParams({ p_curr: true });
84
- const mode = resolveCurrencyModeFromODataParameters(params);
85
- // "rub".
86
- ```
87
-
88
- ## `resolveCurrencyAwareLabel`
89
-
90
- ```ts
91
- const label = resolveCurrencyAwareLabel("Выручка", ["за тн", "руб/тн"], "rub");
92
- // "Выручка руб/тн".
93
- ```
94
-
95
- Пара `currencyLabels` имеет фиксированный смысл:
96
-
97
- ```ts
98
- readonly[(internalLabel, rubLabel)];
99
- ```
100
-
101
- | Mode | Индекс суффикса |
102
- | ---------- | --------------: |
103
- | `internal` | 0 |
104
- | `rub` | 1 |
105
-
106
- Точные правила:
107
-
108
- - без `currencyLabels` возвращается исходный `label`;
109
- - при `null`/`undefined` mode возвращается исходный `label`;
110
- - суффикс обрезается через `trim()`;
111
- - пустой суффикс не добавляется;
112
- - обычно между label и суффиксом добавляется один пробел;
113
- - если обрезанный суффикс начинается с запятой, дополнительный пробел не добавляется.
114
-
115
- ```ts
116
- resolveCurrencyAwareLabel("Выручка", [", за тн", ", руб/тн"], "rub");
117
- // "Выручка, руб/тн".
118
-
119
- resolveCurrencyAwareLabel("Выручка", ["", " "], "rub");
120
- // "Выручка".
121
- ```
122
-
123
- Исходный `label` не обрезается и не нормализуется.
124
-
125
- ## Готовый pipeline
126
-
127
- ```ts
128
- function buildMetricLabel(
129
- baseLabel: string,
130
- currencyLabels: readonly [string, string] | undefined,
131
- params: WrappedODataParameters | undefined
132
- ) {
133
- const mode = resolveCurrencyModeFromODataParameters(params);
134
- return resolveCurrencyAwareLabel(baseLabel, currencyLabels, mode);
135
- }
136
- ```
137
-
138
- Resolver чистый: одинаковый вход даёт одинаковую строку и не меняет params/labels.
139
-
140
- ## Ограничения и ошибки
141
-
142
- - Поддерживается только параметр с точным id `p_curr`.
143
- - Поддерживаются только два режима; код валюты `USD`, `EUR` и exchange rate не обрабатываются.
144
- - Функция не проверяет грамматику и единицы измерения.
145
- - Запятая должна входить в сам суффикс, если нужна форма `"Выручка, руб"`.
146
- - Не передавайте плоский `{ p_curr: true }`: ожидается `{ p_curr: { value: true } }`.
147
- - Не используйте label helper для финансовых вычислений.
148
-
149
- ## API-справочник
150
-
151
- | Export | Результат |
152
- | ---------------------------------------- | ----------------------- |
153
- | `CurrencyMode` | `"internal" \| "rub"` |
154
- | `resolveCurrencyModeFromODataParameters` | `CurrencyMode \| null` |
155
- | `resolveCurrencyAwareLabel` | Итоговая display-строка |