@ryuzaki13/react-foundation-lib 1.4.0 → 1.4.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.
Files changed (101) hide show
  1. package/README.md +172 -114
  2. package/dist/chunks/{formatters-CBgrBeSA.js → formatters-D33Uh3si.js} +7 -8
  3. package/dist/chunks/{formatters-CBgrBeSA.js.map → formatters-D33Uh3si.js.map} +1 -1
  4. package/dist/chunks/odata-service-CWkHASdw.js +2211 -0
  5. package/dist/chunks/odata-service-CWkHASdw.js.map +1 -0
  6. package/dist/chunks/{validate-BW-7BZy_.js → validate-DyzojM0w.js} +2 -2
  7. package/dist/chunks/{validate-BW-7BZy_.js.map → validate-DyzojM0w.js.map} +1 -1
  8. package/dist/error-report/index.js +2 -2
  9. package/dist/excel/index.js +20 -21
  10. package/dist/excel/index.js.map +1 -1
  11. package/dist/formatters/index.js +4 -5
  12. package/dist/{odata → odata-service}/buildSeparatedArrays.d.ts +1 -1
  13. package/dist/odata-service/buildSeparatedArrays.d.ts.map +1 -0
  14. package/dist/{odata/types.d.ts → odata-service/collectionTypes.d.ts} +1 -1
  15. package/dist/odata-service/collectionTypes.d.ts.map +1 -0
  16. package/dist/{odata → odata-service}/dateUtils.d.ts +1 -1
  17. package/dist/odata-service/dateUtils.d.ts.map +1 -0
  18. package/dist/{odata → odata-service}/findCollectionPairs.d.ts +1 -1
  19. package/dist/odata-service/findCollectionPairs.d.ts.map +1 -0
  20. package/dist/odata-service/index.d.ts +5 -0
  21. package/dist/odata-service/index.d.ts.map +1 -1
  22. package/dist/odata-service/index.js +2 -2
  23. package/dist/{odata/store.d.ts → odata-service/odataCollectionStore.d.ts} +1 -1
  24. package/dist/odata-service/odataCollectionStore.d.ts.map +1 -0
  25. package/dist/query-client/index.js.map +1 -1
  26. package/dist/query-client/queryClient.d.ts +1 -3
  27. package/dist/query-client/queryClient.d.ts.map +1 -1
  28. package/package.json +1 -5
  29. package/src/array/README.mdx +1630 -0
  30. package/src/binary/README.mdx +1405 -0
  31. package/src/bounded-copy-stack/README.mdx +257 -0
  32. package/src/context-menu/README.mdx +326 -0
  33. package/src/copy/README.mdx +992 -0
  34. package/src/crypto/README.mdx +1052 -0
  35. package/src/currency/README.mdx +155 -0
  36. package/src/date-segments/README.mdx +319 -0
  37. package/src/dom/README.mdx +2179 -0
  38. package/src/error/README.mdx +95 -0
  39. package/src/error-report/README.mdx +612 -0
  40. package/src/excel/README.mdx +449 -0
  41. package/src/file/README.mdx +1957 -0
  42. package/src/fingerprint/README.mdx +100 -0
  43. package/src/form/README.mdx +101 -0
  44. package/src/formatters/README.mdx +469 -0
  45. package/src/formatters/boolean/README.mdx +494 -0
  46. package/src/formatters/date/README.mdx +732 -0
  47. package/src/formatters/number/README.mdx +542 -0
  48. package/src/formatters/pipeline/README.mdx +629 -0
  49. package/src/formatters/rowBased/README.mdx +486 -0
  50. package/src/formatters/strings/README.mdx +442 -0
  51. package/src/formatters/valueState/README.mdx +459 -0
  52. package/src/formulas/README.mdx +1283 -0
  53. package/src/foundationLib.mdx +70 -54
  54. package/src/hooks/README.mdx +988 -0
  55. package/src/http/README.mdx +126 -0
  56. package/src/media/README.mdx +1853 -0
  57. package/src/notifications/README.mdx +323 -0
  58. package/src/number-scale/README.mdx +318 -0
  59. package/src/odata-service/README.mdx +2916 -0
  60. package/src/presets/README.mdx +136 -0
  61. package/src/pwa/README.mdx +394 -0
  62. package/src/query-client/README.mdx +2500 -0
  63. package/src/range-output/README.mdx +161 -0
  64. package/src/seo/README.mdx +279 -0
  65. package/src/session-storage/README.mdx +125 -0
  66. package/src/string-comparison/README.mdx +96 -0
  67. package/src/table/README.mdx +3106 -0
  68. package/src/three-scene/README.mdx +248 -0
  69. package/src/types/README.mdx +172 -0
  70. package/src/utils/README.mdx +1724 -0
  71. package/src/validators/README.mdx +239 -0
  72. package/src/virtualizer/README.mdx +138 -0
  73. package/src/xml/README.mdx +149 -0
  74. package/dist/chunks/dateUtils-B5V5aXB-.js +0 -847
  75. package/dist/chunks/dateUtils-B5V5aXB-.js.map +0 -1
  76. package/dist/chunks/odata-service-B6TxBSLm.js +0 -1277
  77. package/dist/chunks/odata-service-B6TxBSLm.js.map +0 -1
  78. package/dist/odata/buildSeparatedArrays.d.ts.map +0 -1
  79. package/dist/odata/dateUtils.d.ts.map +0 -1
  80. package/dist/odata/findCollectionPairs.d.ts.map +0 -1
  81. package/dist/odata/index.d.ts +0 -6
  82. package/dist/odata/index.d.ts.map +0 -1
  83. package/dist/odata/index.js +0 -102
  84. package/dist/odata/index.js.map +0 -1
  85. package/dist/odata/store.d.ts.map +0 -1
  86. package/dist/odata/types.d.ts.map +0 -1
  87. package/src/binary/README.md +0 -110
  88. package/src/docs/browserAndReact.mdx +0 -150
  89. package/src/docs/filesAndExcel.mdx +0 -163
  90. package/src/docs/formatters-runtime.mdx +0 -455
  91. package/src/docs/formatters.mdx +0 -380
  92. package/src/docs/odataAndTables.mdx +0 -178
  93. package/src/docs/pureUtilities.mdx +0 -96
  94. package/src/docs/runtimeAndState.mdx +0 -155
  95. package/src/file/README.md +0 -289
  96. package/src/formatters/date/README.md +0 -520
  97. package/src/formatters/number/README.md +0 -123
  98. package/src/formatters/valueState/README.md +0 -275
  99. package/src/formulas/README.md +0 -42
  100. package/src/pwa/README.md +0 -638
  101. package/src/query-client/README.md +0 -565
package/README.md CHANGED
@@ -27,19 +27,21 @@ import type { RowRecord } from "@ryuzaki13/react-foundation-lib/types";
27
27
 
28
28
  Большинство внешних пакетов объявлены как optional peers. Это означает только то, что их не нужно ставить для каждого сценария. Если host использует entrypoint, который импортирует внешний пакет, совместимая peer-зависимость должна быть установлена в host-проекте.
29
29
 
30
- | Entry point | Что может потребоваться в host-проекте |
31
- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
32
- | `formatters`, `array`, `utils`, `validators` | Обычно не требуют дополнительных runtime-зависимостей. |
33
- | `hooks`, `dom`, `copy`, `media`, `pwa` | `react`, если используются React hooks. |
34
- | `query-client`, `error-report` | `@tanstack/react-query`, `@tanstack/query-persist-client-core`, `@tanstack/query-broadcast-client-experimental`. |
35
- | `odata-service` | `zod`; отдельные helpers типизируются вокруг `@tanstack/react-query`. |
36
- | `odata`, `notifications` | `zustand`, для отдельных store-helpers также `immer`. |
37
- | `table` | `@tanstack/react-table` и `react` для selection hooks. |
38
- | `virtualizer` | `@tanstack/react-virtual` и `react`. |
39
- | `hooks` search helpers | `@tanstack/react-router`. |
40
- | `hooks` DnD helpers | `@dnd-kit/core`, `@dnd-kit/sortable`. |
41
- | `hooks` floating/listbox и DOM references | `@floating-ui/react`. |
42
- | `excel` | `write-excel-file`. |
30
+ | Entry point | Что может потребоваться в host-проекте |
31
+ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
32
+ | `formatters`, `array` | Обычно не требуют дополнительных runtime-зависимостей. |
33
+ | `utils`, `hooks`, `binary`, `dom`, `copy`, `media`, `pwa` | `react`: `utils` экспортирует React helpers, `binary` — `useBinaryFile`, остальные entrypoints содержат hooks. |
34
+ | `query-client`, `error-report` | `@tanstack/react-query`, `@tanstack/query-persist-client-core`, `@tanstack/query-broadcast-client-experimental`. |
35
+ | `odata-service` | `zod`, `zustand`, `immer`, `react`; `unwrapODataQueryResult` типизирован вокруг `@tanstack/react-query`. |
36
+ | `notifications` | `zustand`. |
37
+ | `table` | `@tanstack/react-table` и `react` для selection hooks. |
38
+ | `virtualizer` | `@tanstack/react-virtual` и `react`. |
39
+ | `three-scene` | `react`; hook также использует browser media APIs. |
40
+ | `hooks` search helpers | `@tanstack/react-router`. |
41
+ | `hooks` DnD helpers | `@dnd-kit/core`, `@dnd-kit/sortable`. |
42
+ | `hooks`, `validators` floating/listbox и DOM references | `@floating-ui/react`. |
43
+ | `excel` | `write-excel-file`. |
44
+ | `fingerprint` | `@fingerprintjs/fingerprintjs`. |
43
45
 
44
46
  Такая схема оставляет пакет библиотечным: зависимости не зашиваются в bundle, а host-приложение контролирует версии React, TanStack, Zod и других runtime-библиотек.
45
47
 
@@ -66,6 +68,7 @@ npm run pack:dry-run
66
68
  - [Peer-зависимости](#peer-зависимости)
67
69
  - [Проверка пакета](#проверка-пакета)
68
70
  - [Быстрый выбор модуля](#быстрый-выбор-модуля)
71
+ - [Полный каталог документации](#полный-каталог-документации)
69
72
  - [Форматирование и значения](#форматирование-и-значения)
70
73
  - [OData, таблицы и экспорт](#odata-таблицы-и-экспорт)
71
74
  - [Browser, React hooks и UI-поведение](#browser-react-hooks-и-ui-поведение)
@@ -74,30 +77,79 @@ npm run pack:dry-run
74
77
 
75
78
  ## Быстрый выбор модуля
76
79
 
77
- | Нужно | Идти сюда |
78
- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
79
- | Даты, диапазоны, ABAP/OData date literals | [`formatters/date`](./src/formatters/date/index.ts), тесты: [`formatDate.test.ts`](./src/formatters/date/formatDate.test.ts), [`dateRange.test.ts`](./src/formatters/date/dateRange.test.ts) |
80
- | Числа, проценты, валютные числа, compact axis labels | [`formatters/number`](./src/formatters/number/index.ts), тесты: [`formatNumber.test.ts`](./src/formatters/number/formatNumber.test.ts), [`parseNumber.test.ts`](./src/formatters/number/parseNumber.test.ts) |
81
- | Строки, ФИО, телефон, leading zeros, SAP boolean | [`formatters`](./src/formatters/index.ts), тесты: [`common.test.ts`](./src/formatters/common.test.ts), [`boolean.test.ts`](./src/formatters/boolean/boolean.test.ts), [`strings.test.ts`](./src/formatters/strings/strings.test.ts) |
82
- | Runtime-форматирование ячеек таблицы | [`formatters/pipeline`](./src/formatters/pipeline/index.ts), тесты в [`formatters/pipeline`](./src/formatters/pipeline) |
83
- | OData metadata, filters, sorts, path, values | [`odata-service`](./src/odata-service/index.ts), тесты в [`odata-service`](./src/odata-service) |
84
- | Справочные code/text пары OData collections | [`odata`](./src/odata/index.ts), тест: [`odata.test.ts`](./src/odata/odata.test.ts) |
85
- | TanStack Table helpers | [`table`](./src/table/index.ts), тесты в [`table`](./src/table) |
86
- | Tree table преобразования | [`tree-table`](./src/tree-table/index.ts), тесты в [`tree-table`](./src/tree-table) |
87
- | Excel export | [`excel`](./src/excel/index.ts), тесты: [`excel.test.ts`](./src/excel/excel.test.ts), [`tableExport.test.ts`](./src/excel/tableExport.test.ts) |
88
- | FileReader, изображения, base64 Blob | [`file`](./src/file/index.ts), [`binary`](./src/binary/index.ts) |
89
- | DOM overlay, portal, focus, download | [`dom`](./src/dom/index.ts), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx) |
90
- | Debounce/throttle, DnD sensors, search params, listbox | [`hooks`](./src/hooks/index.ts), [`utils/keyboard.ts`](./src/utils/keyboard.ts) |
91
- | QueryClient, persistence, broadcast | [`query-client`](./src/query-client/index.ts), README: [`query-client/README.md`](./src/query-client/README.md) |
92
- | PWA service worker update и `x-sw-cache` policy | [`pwa`](./src/pwa/index.ts), README: [`pwa/README.md`](./src/pwa/README.md) |
93
- | Подстановки открытых границ диапазона | [`range-output`](./src/range-output/index.ts), тест: [`rangeOutput.test.ts`](./src/range-output/rangeOutput.test.ts) |
94
- | Unknown guards, className, stable stringify, clone | [`validators`](./src/validators/index.ts), [`utils`](./src/utils/index.ts) |
80
+ | Нужно | Идти сюда |
81
+ | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
82
+ | Даты, диапазоны, ABAP/OData date literals | [`formatters/date`](./src/formatters/date/index.ts), тесты: [`formatDate.test.ts`](./src/formatters/date/formatDate.test.ts), [`dateRange.test.ts`](./src/formatters/date/dateRange.test.ts) |
83
+ | Числа, проценты, валютные числа, compact axis labels | [`formatters/number`](./src/formatters/number/index.ts), тесты: [`formatNumber.test.ts`](./src/formatters/number/formatNumber.test.ts), [`parseNumber.test.ts`](./src/formatters/number/parseNumber.test.ts) |
84
+ | Строки, ФИО, телефон, leading zeros, SAP boolean | [`formatters`](./src/formatters/index.ts), тесты: [`common.test.ts`](./src/formatters/common.test.ts), [`boolean.test.ts`](./src/formatters/boolean/boolean.test.ts), [`strings.test.ts`](./src/formatters/strings/strings.test.ts) |
85
+ | Runtime-форматирование ячеек таблицы | [`formatters/pipeline`](./src/formatters/pipeline/index.ts), тесты в [`formatters/pipeline`](./src/formatters/pipeline) |
86
+ | Группировка, дедупликация, порядок и нормализация массивов | [`array`](./src/array/index.ts), подробный README: [`array/README.mdx`](./src/array/README.mdx) |
87
+ | OData metadata, values, path, filters, sorts, code/text collections и store | [`odata-service`](./src/odata-service/index.ts), подробный README: [`odata-service/README.mdx`](./src/odata-service/README.mdx), тесты в [`odata-service`](./src/odata-service) |
88
+ | TanStack Table helpers | [`table`](./src/table/index.ts), единый подробный справочник: [`table/README.mdx`](./src/table/README.mdx), тесты в [`table`](./src/table) |
89
+ | Tree table преобразования | [`tree-table`](./src/tree-table/index.ts), документация в общем справочнике [`table/README.mdx`](./src/table/README.mdx), тесты в [`tree-table`](./src/tree-table) |
90
+ | Excel export | [`excel`](./src/excel/index.ts), подробный README: [`excel/README.mdx`](./src/excel/README.mdx), тесты: [`excel.test.ts`](./src/excel/excel.test.ts), [`tableExport.test.ts`](./src/excel/tableExport.test.ts) |
91
+ | FileReader, изображения, base64 Blob | [`file`](./src/file/index.ts), [`binary`](./src/binary/index.ts) |
92
+ | DOM overlay, portal, focus, download | [`dom`](./src/dom/index.ts), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx) |
93
+ | Debounce/throttle, DnD sensors, search params, listbox | [`hooks`](./src/hooks/index.ts), подробный README: [`hooks/README.mdx`](./src/hooks/README.mdx), [`utils/keyboard.ts`](./src/utils/keyboard.ts) |
94
+ | Breakpoints, media queries и responsive props | [`media`](./src/media/index.ts), подробный README: [`media/README.mdx`](./src/media/README.mdx), тест: [`media.test.ts`](./src/media/media.test.ts) |
95
+ | QueryClient, persistence, broadcast | [`query-client`](./src/query-client/index.ts), подробный README: [`query-client/README.mdx`](./src/query-client/README.mdx) |
96
+ | PWA service worker update и `x-sw-cache` policy | [`pwa`](./src/pwa/index.ts), подробный README: [`pwa/README.mdx`](./src/pwa/README.mdx) |
97
+ | Подстановки открытых границ диапазона | [`range-output`](./src/range-output/index.ts), подробный README: [`range-output/README.mdx`](./src/range-output/README.mdx), тест: [`rangeOutput.test.ts`](./src/range-output/rangeOutput.test.ts) |
98
+ | Unknown guards, className, stable stringify, clone | [`validators`](./src/validators/index.ts), [`utils`](./src/utils/index.ts), подробные README: [`validators`](./src/validators/README.mdx), [`utils`](./src/utils/README.mdx) |
99
+
100
+ ## Полный каталог документации
101
+
102
+ Каждый публичный subpath из `package.json#exports` покрыт русскоязычным MDX-руководством. Документы `tree-table` и `pwa/sw-cache-policy` намеренно объединены с ближайшим владельцем, чтобы правила одного сценария не расходились между файлами.
103
+
104
+ | Публичный import path | Подробная документация |
105
+ | ---------------------- | ------------------------------------------------------------------------------ |
106
+ | `/array` | [`array/README.mdx`](./src/array/README.mdx) |
107
+ | `/binary` | [`binary/README.mdx`](./src/binary/README.mdx) |
108
+ | `/bounded-copy-stack` | [`bounded-copy-stack/README.mdx`](./src/bounded-copy-stack/README.mdx) |
109
+ | `/context-menu` | [`context-menu/README.mdx`](./src/context-menu/README.mdx) |
110
+ | `/copy` | [`copy/README.mdx`](./src/copy/README.mdx) |
111
+ | `/crypto` | [`crypto/README.mdx`](./src/crypto/README.mdx) |
112
+ | `/currency` | [`currency/README.mdx`](./src/currency/README.mdx) |
113
+ | `/date-segments` | [`date-segments/README.mdx`](./src/date-segments/README.mdx) |
114
+ | `/dom` | [`dom/README.mdx`](./src/dom/README.mdx) |
115
+ | `/error` | [`error/README.mdx`](./src/error/README.mdx) |
116
+ | `/error-report` | [`error-report/README.mdx`](./src/error-report/README.mdx) |
117
+ | `/excel` | [`excel/README.mdx`](./src/excel/README.mdx) |
118
+ | `/file` | [`file/README.mdx`](./src/file/README.mdx) |
119
+ | `/fingerprint` | [`fingerprint/README.mdx`](./src/fingerprint/README.mdx) |
120
+ | `/form` | [`form/README.mdx`](./src/form/README.mdx) |
121
+ | `/formatters` | [`formatters/README.mdx`](./src/formatters/README.mdx) и его предметные README |
122
+ | `/formulas` | [`formulas/README.mdx`](./src/formulas/README.mdx) |
123
+ | `/hooks` | [`hooks/README.mdx`](./src/hooks/README.mdx) |
124
+ | `/http` | [`http/README.mdx`](./src/http/README.mdx) |
125
+ | `/media` | [`media/README.mdx`](./src/media/README.mdx) |
126
+ | `/notifications` | [`notifications/README.mdx`](./src/notifications/README.mdx) |
127
+ | `/number-scale` | [`number-scale/README.mdx`](./src/number-scale/README.mdx) |
128
+ | `/odata-service` | [`odata-service/README.mdx`](./src/odata-service/README.mdx) |
129
+ | `/presets` | [`presets/README.mdx`](./src/presets/README.mdx) |
130
+ | `/pwa` | [`pwa/README.mdx`](./src/pwa/README.mdx) |
131
+ | `/pwa/sw-cache-policy` | Раздел cache policy в [`pwa/README.mdx`](./src/pwa/README.mdx) |
132
+ | `/query-client` | [`query-client/README.mdx`](./src/query-client/README.mdx) |
133
+ | `/range-output` | [`range-output/README.mdx`](./src/range-output/README.mdx) |
134
+ | `/seo` | [`seo/README.mdx`](./src/seo/README.mdx) |
135
+ | `/session-storage` | [`session-storage/README.mdx`](./src/session-storage/README.mdx) |
136
+ | `/string-comparison` | [`string-comparison/README.mdx`](./src/string-comparison/README.mdx) |
137
+ | `/table` | [`table/README.mdx`](./src/table/README.mdx) |
138
+ | `/three-scene` | [`three-scene/README.mdx`](./src/three-scene/README.mdx) |
139
+ | `/tree-table` | Раздел tree-table в [`table/README.mdx`](./src/table/README.mdx) |
140
+ | `/types` | [`types/README.mdx`](./src/types/README.mdx) |
141
+ | `/utils` | [`utils/README.mdx`](./src/utils/README.mdx) |
142
+ | `/validators` | [`validators/README.mdx`](./src/validators/README.mdx) |
143
+ | `/virtualizer` | [`virtualizer/README.mdx`](./src/virtualizer/README.mdx) |
144
+ | `/xml` | [`xml/README.mdx`](./src/xml/README.mdx) |
95
145
 
96
146
  ## Форматирование и значения
97
147
 
148
+ Полный пользовательский путеводитель находится в [`formatters/README.mdx`](./src/formatters/README.mdx). Он объясняет общие правила, публичную границу единственного entrypoint `@ryuzaki13/react-foundation-lib/formatters` и ведёт к подробным документам каждой предметной области. Разделы ниже дают только краткую карту пакета и не заменяют API-документацию.
149
+
98
150
  ### `formatters/date`
99
151
 
100
- Файлы: [`formatters/date/index.ts`](./src/formatters/date/index.ts), подробный README: [`formatters/date/README.md`](./src/formatters/date/README.md).
152
+ Файлы: [`formatters/date/index.ts`](./src/formatters/date/index.ts), подробный README: [`formatters/date/README.mdx`](./src/formatters/date/README.mdx).
101
153
 
102
154
  Главная идея: модуль работает в плавающей календарной семантике. ISO/OData строки с timezone не пересчитываются в timezone клиента, а сохраняют видимые компоненты даты и времени.
103
155
 
@@ -125,7 +177,7 @@ npm run pack:dry-run
125
177
 
126
178
  ### `formatters/number`
127
179
 
128
- Файлы: [`formatters/number/index.ts`](./src/formatters/number/index.ts), README: [`formatters/number/README.md`](./src/formatters/number/README.md).
180
+ Файлы: [`formatters/number/index.ts`](./src/formatters/number/index.ts), README: [`formatters/number/README.mdx`](./src/formatters/number/README.mdx).
129
181
 
130
182
  Модуль форматирует числа через presets и кеширует `Intl.NumberFormat`. Это стандартный путь для таблиц, графиков и SAP-like строк.
131
183
 
@@ -136,7 +188,7 @@ npm run pack:dry-run
136
188
  | `formatNumber(value, presetOrName)` | Универсальный formatter по имени preset или объекту preset. |
137
189
  | `formatNumberAsInteger`, `formatNumberAsDecimal*`, `formatNumberAsCurrency`, `formatNumberAsPercent`, `formatNumberAsPrice`, `formatNumberAsTonnage` | Типовые UI-форматы. |
138
190
  | `formatNumberAs*OrEmpty` | То же, но semantic zero отображается пустой строкой. |
139
- | `formatCompactNumber`, `formatNumberAsChartAxis`, `formatNumberAsChartTooltip`, `formatNumberAsCurrencyChartAxis` | Compact-формат для осей и tooltip графиков. |
191
+ | Встроенные `compact-*` presets и собственный `NumberFormatPreset.compact` | Compact-формат с `тыс`, `млн`, `млрд`, `трлн`. |
140
192
  | `parseNumber`, `toFiniteNumber`, `toPositiveInteger`, `isPositiveValue`, `isZeroValue` | Чтение SAP-like чисел из `unknown`. |
141
193
  | `registerNumberPreset`, `getNumberPreset`, `getNumberPresetNames`, `resetNumberPresets`, `clearFormatCache` | Реестр presets и кеш formatter-ов. |
142
194
 
@@ -152,7 +204,7 @@ npm run pack:dry-run
152
204
 
153
205
  ### `formatters/strings`
154
206
 
155
- Файлы: [`formatters/strings/index.ts`](./src/formatters/strings/index.ts).
207
+ Файлы: [`formatters/strings/index.ts`](./src/formatters/strings/index.ts), подробный README: [`formatters/strings/README.mdx`](./src/formatters/strings/README.mdx).
156
208
 
157
209
  | API | Поведение |
158
210
  | ---------------------------------------------------- | --------------------------------------------------------------- |
@@ -182,7 +234,7 @@ npm run pack:dry-run
182
234
 
183
235
  ### `formatters/boolean`
184
236
 
185
- Файлы: [`formatters/boolean/index.ts`](./src/formatters/boolean/index.ts), тест: [`boolean.test.ts`](./src/formatters/boolean/boolean.test.ts).
237
+ Файлы: [`formatters/boolean/index.ts`](./src/formatters/boolean/index.ts), подробный README: [`formatters/boolean/README.mdx`](./src/formatters/boolean/README.mdx), тест: [`boolean.test.ts`](./src/formatters/boolean/boolean.test.ts).
186
238
 
187
239
  | API | Поведение |
188
240
  | ------------------ | ------------------------------------------------------------- |
@@ -192,7 +244,7 @@ npm run pack:dry-run
192
244
 
193
245
  ### `formatters/valueState`
194
246
 
195
- Файлы: [`formatters/valueState/index.ts`](./src/formatters/valueState/index.ts), README: [`formatters/valueState/README.md`](./src/formatters/valueState/README.md).
247
+ Файлы: [`formatters/valueState/index.ts`](./src/formatters/valueState/index.ts), README: [`formatters/valueState/README.mdx`](./src/formatters/valueState/README.mdx).
196
248
 
197
249
  Модуль вычисляет визуальный `State` (`none`, `information`, `success`, `warning`, `error`) по значению.
198
250
 
@@ -210,7 +262,7 @@ npm run pack:dry-run
210
262
 
211
263
  ### `formatters/pipeline`
212
264
 
213
- Файлы: [`formatters/pipeline/index.ts`](./src/formatters/pipeline/index.ts).
265
+ Файлы: [`formatters/pipeline/index.ts`](./src/formatters/pipeline/index.ts), подробный README: [`formatters/pipeline/README.mdx`](./src/formatters/pipeline/README.mdx).
214
266
 
215
267
  Pipeline — runtime форматирования ячейки. Он принимает сериализуемый `FormattersPipelineConfig` версии `1`, валидирует `plan` или строит линейный plan из `graph`, компилирует executor и возвращает display-result.
216
268
 
@@ -249,7 +301,7 @@ Pipeline — runtime форматирования ячейки. Он прини
249
301
 
250
302
  ### `formatters/rowBased`
251
303
 
252
- Файлы: [`formatters/rowBased/index.ts`](./src/formatters/rowBased/index.ts), тест: [`rowBased.test.ts`](./src/formatters/rowBased/rowBased.test.ts).
304
+ Файлы: [`formatters/rowBased/index.ts`](./src/formatters/rowBased/index.ts), подробный README: [`formatters/rowBased/README.mdx`](./src/formatters/rowBased/README.mdx), тест: [`rowBased.test.ts`](./src/formatters/rowBased/rowBased.test.ts).
253
305
 
254
306
  Это маленький реестр формул для row-based override внутри pipeline.
255
307
 
@@ -264,7 +316,7 @@ Pipeline — runtime форматирования ячейки. Он прини
264
316
 
265
317
  ### `formulas`
266
318
 
267
- Файлы: [`formulas/index.ts`](./src/formulas/index.ts), README: [`formulas/README.md`](./src/formulas/README.md).
319
+ Файлы: [`formulas/index.ts`](./src/formulas/index.ts), подробный README: [`formulas/README.mdx`](./src/formulas/README.mdx).
268
320
 
269
321
  Инфраструктура реестра клиентских формул таблицы для calculated/clientOnly measure-колонок. Definitions принадлежат host-приложению и не входят в foundation-пакет.
270
322
 
@@ -274,8 +326,8 @@ Pipeline — runtime форматирования ячейки. Он прини
274
326
  | `compileTableFormula` | Компилирует formulaId + keys в executor; не кидает runtime errors наружу. |
275
327
  | `executeTableFormula` | Разовый запуск формулы. |
276
328
  | `createTableFormulaRegistry` | Нормализует definitions и запрещает дубли. |
277
- | `configureTableFormulaRegistry` | Устанавливает созданный host-приложением реестр до первого runtime-вызова. |
278
- | `getTableFormulaList`, `getTableFormulaById` | Доступ к активному реестру host-приложения. |
329
+ | `configureTableFormulaRegistry` | Устанавливает созданный host-приложением реестр до первого runtime-вызова. |
330
+ | `getTableFormulaList`, `getTableFormulaById` | Доступ к активному реестру host-приложения. |
279
331
  | `validateTableFormulaDependencies` | Проверяет наличие formula, доступность dependencies, out-of-range и unused dependencies. |
280
332
 
281
333
  Поведение из тестов: невалидный результат формулы дает `invalid_result`, runtime exception дает `runtime_error`, отсутствующая формула дает `formula_not_found`.
@@ -284,7 +336,7 @@ Pipeline — runtime форматирования ячейки. Он прини
284
336
 
285
337
  ### `date-segments`
286
338
 
287
- Файл: [`date-segments/index.ts`](./src/date-segments/index.ts), тест: [`mask.test.ts`](./src/date-segments/mask.test.ts).
339
+ Файл: [`date-segments/index.ts`](./src/date-segments/index.ts), подробный README: [`date-segments/README.mdx`](./src/date-segments/README.mdx), тест: [`mask.test.ts`](./src/date-segments/mask.test.ts).
288
340
 
289
341
  Утилиты для segmented date input.
290
342
 
@@ -298,7 +350,7 @@ Pipeline — runtime форматирования ячейки. Он прини
298
350
 
299
351
  ### `number-scale`
300
352
 
301
- Файлы: [`number-scale/index.ts`](./src/number-scale/index.ts), тест: [`numberScale.test.ts`](./src/number-scale/numberScale.test.ts).
353
+ Файлы: [`number-scale/index.ts`](./src/number-scale/index.ts), подробный README: [`number-scale/README.mdx`](./src/number-scale/README.mdx), тест: [`numberScale.test.ts`](./src/number-scale/numberScale.test.ts).
302
354
 
303
355
  Математика числовых слайдеров и шкал.
304
356
 
@@ -314,7 +366,7 @@ Pipeline — runtime форматирования ячейки. Он прини
314
366
 
315
367
  ### `currency`
316
368
 
317
- Файл: [`currency/currency.ts`](./src/currency/currency.ts), тест: [`currency.test.ts`](./src/currency/currency.test.ts).
369
+ Файл: [`currency/currency.ts`](./src/currency/currency.ts), подробный README: [`currency/README.mdx`](./src/currency/README.mdx), тест: [`currency.test.ts`](./src/currency/currency.test.ts).
318
370
 
319
371
  | API | Поведение |
320
372
  | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
@@ -327,7 +379,9 @@ Pipeline — runtime форматирования ячейки. Он прини
327
379
 
328
380
  ### `odata-service`
329
381
 
330
- Файл: [`odata-service/index.ts`](./src/odata-service/index.ts). Это чистый слой metadata/value/filter helpers. Transport и fetch лежат в пакете `@ryuzaki13/react-foundation-api/odata`.
382
+ Файл: [`odata-service/index.ts`](./src/odata-service/index.ts), подробный справочник: [`odata-service/README.mdx`](./src/odata-service/README.mdx). Это единый entrypoint metadata/value/path/filter/sort helpers, code/text collections и общих настроек OData-справочников. Transport и fetch лежат в пакете `@ryuzaki13/react-foundation-api/odata`.
383
+
384
+ Прежний subpath `@ryuzaki13/react-foundation-lib/odata` удалён без compatibility alias. Его API перенесён в `@ryuzaki13/react-foundation-lib/odata-service`.
331
385
 
332
386
  #### Metadata и path
333
387
 
@@ -381,6 +435,17 @@ Pipeline — runtime форматирования ячейки. Он прини
381
435
 
382
436
  Тесты: [`filters.test.ts`](./src/odata-service/filters.test.ts), [`filterDefinitions.test.ts`](./src/odata-service/filterDefinitions.test.ts), [`sorts.ts`](./src/odata-service/sorts.ts), [`sqlFilters.test.ts`](./src/odata-service/sqlFilters.test.ts).
383
437
 
438
+ #### Справочные коллекции и store
439
+
440
+ | API | Поведение |
441
+ | -------------------------------------------------- | ------------------------------------------------------------------------------ |
442
+ | `findCollectionPairs` | Ищет пары `code` + `*_txt/_text/_t`, поддерживает custom suffixes. |
443
+ | `buildSeparatedArrays` | Строит отдельные code/text массивы для каждой пары, дедуплицирует и сортирует. |
444
+ | `ODataDateFormat` | Форматирует `Date` в `datetime'...'`, `datetimeoffset'...'`, `time'...'`. |
445
+ | `useODataCollectionStore`, `odataCollectionConfig` | Zustand-store общих defaults: visible limit, search thresholds и debounce. |
446
+
447
+ Тест: [`collection.test.ts`](./src/odata-service/collection.test.ts).
448
+
384
449
  ### `range-output`
385
450
 
386
451
  Файлы: [`range-output/index.ts`](./src/range-output/index.ts), тест: [`rangeOutput.test.ts`](./src/range-output/rangeOutput.test.ts).
@@ -390,20 +455,9 @@ Pipeline — runtime форматирования ячейки. Он прини
390
455
  | `readRangeOutputValueFallback` | Читает сериализуемые подстановки `start/end` из объекта с `outputValueFallback` через переданный парсер. |
391
456
  | `resolveRangeOutputValue` | Заменяет `null` в открытых границах диапазона на заданные подстановочные значения для внешней передачи. |
392
457
 
393
- ### `odata`
394
-
395
- Файлы: [`odata/index.ts`](./src/odata/index.ts), тест: [`odata.test.ts`](./src/odata/odata.test.ts).
396
-
397
- | API | Поведение |
398
- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
399
- | `buildSeparatedArrays` | Из одной коллекции строит отдельные массивы code/text для каждой пары, дедуплицирует и сортирует. |
400
- | `findCollectionPairs` | Ищет пары `code` + `*_txt/_text/_t`, поддерживает custom suffixes. |
401
- | `ODataDateFormat` | Форматирует `Date` в `datetime'...'`, `datetimeoffset'...'`, `time'...'`. |
402
- | `useODataCollectionStore`, `odataCollectionConfig` | Zustand-store настроек коллекции: pagination, search, selected, dependent filters. |
403
-
404
458
  ### `table`
405
459
 
406
- Файлы: [`table/index.ts`](./src/table/index.ts), тесты в [`table`](./src/table).
460
+ Файлы: [`table/index.ts`](./src/table/index.ts), единый подробный справочник для `table` и `tree-table`: [`table/README.mdx`](./src/table/README.mdx), тесты в [`table`](./src/table).
407
461
 
408
462
  | API | Поведение |
409
463
  | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
@@ -414,8 +468,8 @@ Pipeline — runtime форматирования ячейки. Он прини
414
468
  | `normalizeTableColumnWidth`, `normalizeTableColumnSizing`, `patchTableColumnWidth`, `removeTableColumnWidth` | Column sizing с min width, default `60`. |
415
469
  | `pruneTableRowSelection`, `toggleTableRowSelection` | `none`, `single`, `multi`; single не снимается повторным кликом. |
416
470
  | `useTableRowSelection` | Hook поверх selection helpers. |
417
- | `pruneTableCellSelection`, `toggleTableCellSelection` | Детерминированный выбор координат `rowId + columnId`. |
418
- | `shouldActivateTableCellSelection` | Direct либо безопасная активация по Ctrl/Command без Shift/Alt. |
471
+ | `pruneTableCellSelection`, `toggleTableCellSelection` | Детерминированный выбор координат `rowId + columnId`. |
472
+ | `shouldActivateTableCellSelection` | Direct либо безопасная активация по Ctrl/Command без Shift/Alt. |
419
473
  | `resolveTableColumnFormattingContextFromODataColumn` | OData column -> pipeline context; numeric types force measure. |
420
474
  | `createTableColumnVisibilityFromODataMetadata` | Стартовая visibility; code скрывается, если есть text-пара. |
421
475
  | `createTableColumnsFromODataMetadata` | Генерация TanStack columns из metadata. |
@@ -427,7 +481,7 @@ Pipeline — runtime форматирования ячейки. Он прини
427
481
 
428
482
  ### `tree-table`
429
483
 
430
- Файлы: [`tree-table/index.ts`](./src/tree-table/index.ts).
484
+ Файлы: [`tree-table/index.ts`](./src/tree-table/index.ts), документация включена в единый справочник [`table/README.mdx`](./src/table/README.mdx).
431
485
 
432
486
  | API | Поведение |
433
487
  | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
@@ -439,7 +493,7 @@ Pipeline — runtime форматирования ячейки. Он прини
439
493
 
440
494
  ### `excel`
441
495
 
442
- Файлы: [`excel/index.ts`](./src/excel/index.ts).
496
+ Файлы: [`excel/index.ts`](./src/excel/index.ts), подробный README: [`excel/README.mdx`](./src/excel/README.mdx).
443
497
 
444
498
  | API | Поведение |
445
499
  | -------------------------------- | --------------------------------------------------------------------- |
@@ -455,7 +509,7 @@ Pipeline — runtime форматирования ячейки. Он прини
455
509
 
456
510
  ### `file` и `binary`
457
511
 
458
- Файлы: [`file/index.ts`](./src/file/index.ts), README: [`file/README.md`](./src/file/README.md); [`binary/index.ts`](./src/binary/index.ts), README: [`binary/README.md`](./src/binary/README.md).
512
+ Файлы: [`file/index.ts`](./src/file/index.ts), подробный README: [`file/README.mdx`](./src/file/README.mdx); [`binary/index.ts`](./src/binary/index.ts), README: [`binary/README.mdx`](./src/binary/README.mdx).
459
513
 
460
514
  `file`:
461
515
 
@@ -479,7 +533,7 @@ Pipeline — runtime форматирования ячейки. Он прини
479
533
 
480
534
  ### `xml`
481
535
 
482
- Файл: [`xml/xml.ts`](./src/xml/xml.ts), тест: [`xml.test.ts`](./src/xml/xml.test.ts).
536
+ Файл: [`xml/xml.ts`](./src/xml/xml.ts), подробный README: [`xml/README.mdx`](./src/xml/README.mdx), тест: [`xml.test.ts`](./src/xml/xml.test.ts).
483
537
 
484
538
  | API | Поведение |
485
539
  | ---------------- | ----------------------------------------------------- |
@@ -491,7 +545,7 @@ Pipeline — runtime форматирования ячейки. Он прини
491
545
 
492
546
  ### `dom`
493
547
 
494
- Файлы: [`dom/index.ts`](./src/dom/index.ts), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx).
548
+ Файлы: [`dom/index.ts`](./src/dom/index.ts), подробный README: [`dom/README.mdx`](./src/dom/README.mdx), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx).
495
549
 
496
550
  | API | Поведение |
497
551
  | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
@@ -507,7 +561,7 @@ Pipeline — runtime форматирования ячейки. Он прини
507
561
 
508
562
  ### `hooks`
509
563
 
510
- Файлы: [`hooks/index.ts`](./src/hooks/index.ts).
564
+ Файлы: [`hooks/index.ts`](./src/hooks/index.ts), подробный README: [`hooks/README.mdx`](./src/hooks/README.mdx).
511
565
 
512
566
  | API | Поведение |
513
567
  | ----------------------- | -------------------------------------------------------------------------------------------- |
@@ -524,31 +578,32 @@ Pipeline — runtime форматирования ячейки. Он прини
524
578
 
525
579
  ### `copy`
526
580
 
527
- Файлы: [`copy/index.ts`](./src/copy/index.ts).
581
+ Файлы: [`copy/index.ts`](./src/copy/index.ts), подробный README: [`copy/README.mdx`](./src/copy/README.mdx).
528
582
 
529
583
  | API | Поведение |
530
584
  | -------------------------------- | --------------------------------------------------------------------------------------- |
531
585
  | `useCopyText` | Clipboard API в secure context, fallback через `execCommand`; пустой текст не копирует. |
532
586
  | `useElementText` | Trimmed `textContent` ref. |
533
587
  | `useCopyElementText` | Копирует текст из ref. |
534
- | `useCopyFeedback` | `isCopied` на 2 секунды. |
588
+ | `useCopyFeedback` | `isCopied` на 2 секунды; повторные вызовы создают независимые timers. |
535
589
  | `useCopyElementTextWithFeedback` | Копирование элемента + feedback. |
536
590
 
537
591
  ### `media`
538
592
 
539
- Файлы: [`media/index.ts`](./src/media/index.ts), тест: [`media.test.ts`](./src/media/media.test.ts).
593
+ Файлы: [`media/index.ts`](./src/media/index.ts), подробный README: [`media/README.mdx`](./src/media/README.mdx), тест: [`media.test.ts`](./src/media/media.test.ts).
540
594
 
541
- | API | Поведение |
542
- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
543
- | `BREAKPOINTS_EM`, `Breakpoint`, `MediaMatches` | Проектные брейкпоинты в `em`: mobile/tablet/laptop. |
544
- | `useMatchMedia` | Singleton external store на `useSyncExternalStore`; учитывает изменение root `em`. |
545
- | `ResponsiveValue`, `resolveResponsiveValue`, `resolveProps` | Responsive props с fallback по брейкпоинтам. |
546
- | `getCurrentFontSize`, `getCurrentLineHeight`, `getControlHeight` | DOM font metrics с safe defaults. |
547
- | `pxToEm` | px -> em строка. |
595
+ | API | Поведение |
596
+ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
597
+ | `BREAKPOINTS_EM`, `Breakpoint`, `MediaMatches` | Проектные брейкпоинты в `em`: mobile/tablet/laptop. |
598
+ | `useMediaQuery` | SSR-safe подписка на произвольный media query с настраиваемым fallback. |
599
+ | `useMatchMedia` | Singleton external store на `useSyncExternalStore`; учитывает изменение root `em`. |
600
+ | `ResponsiveMap`, `ResponsiveValue`, `isResponsiveMap`, `resolveResponsiveValue`, `resolveProps` | Responsive props с точным fallback-порядком по брейкпоинтам. |
601
+ | `getCurrentFontSize`, `getCurrentLineHeight`, `getControlHeight` | DOM font metrics с server/invalid-value fallback; line-height нормализуется через `16`. |
602
+ | `pxToEm` | Числовая строка `px / base` без суффикса `em`; при отсутствии base читается root font-size. |
548
603
 
549
604
  ### `context-menu`
550
605
 
551
- Файлы: [`context-menu/index.ts`](./src/context-menu/index.ts), тесты: [`anchor.test.ts`](./src/context-menu/anchor.test.ts), [`state.test.ts`](./src/context-menu/state.test.ts).
606
+ Файлы: [`context-menu/index.ts`](./src/context-menu/index.ts), подробный README: [`context-menu/README.mdx`](./src/context-menu/README.mdx), тесты: [`anchor.test.ts`](./src/context-menu/anchor.test.ts), [`state.test.ts`](./src/context-menu/state.test.ts).
552
607
 
553
608
  | API | Поведение |
554
609
  | --------------------------------------------------------- | ---------------------------------------------------------------------------------- |
@@ -559,7 +614,7 @@ Pipeline — runtime форматирования ячейки. Он прини
559
614
 
560
615
  ### `notifications`
561
616
 
562
- Файлы: [`notifications/index.ts`](./src/notifications/index.ts), тест: [`store.test.ts`](./src/notifications/store.test.ts).
617
+ Файлы: [`notifications/index.ts`](./src/notifications/index.ts), подробный README: [`notifications/README.mdx`](./src/notifications/README.mdx), тест: [`store.test.ts`](./src/notifications/store.test.ts).
563
618
 
564
619
  | API | Поведение |
565
620
  | -------------------------- | ------------------------------------------------------------------------------------------------- |
@@ -571,7 +626,7 @@ Pipeline — runtime форматирования ячейки. Он прини
571
626
 
572
627
  ### `pwa` и `virtualizer`
573
628
 
574
- Файлы: [`pwa/index.ts`](./src/pwa/index.ts), README: [`pwa/README.md`](./src/pwa/README.md); [`virtualizer/index.ts`](./src/virtualizer/index.ts).
629
+ Файлы: [`pwa/index.ts`](./src/pwa/index.ts), подробный README: [`pwa/README.mdx`](./src/pwa/README.mdx); [`virtualizer/index.ts`](./src/virtualizer/index.ts), подробный README: [`virtualizer/README.mdx`](./src/virtualizer/README.mdx).
575
630
 
576
631
  `pwa`:
577
632
 
@@ -592,22 +647,24 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
592
647
 
593
648
  ### `query-client`
594
649
 
595
- Файлы: [`query-client/index.ts`](./src/query-client/index.ts), README: [`query-client/README.md`](./src/query-client/README.md), optimistic guide: [`OPTIMISTIC_UPDATE.md`](./src/query-client/OPTIMISTIC_UPDATE.md).
650
+ Файлы: [`query-client/index.ts`](./src/query-client/index.ts), единый подробный справочник: [`query-client/README.mdx`](./src/query-client/README.mdx). Раздел optimistic update теперь входит в этот документ.
596
651
 
597
- | API | Поведение |
598
- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ |
599
- | `createQueryClient` | Singleton QueryClient defaults: stale/gc, retry, error handlers, optional persister. |
600
- | `persistedQueryMeta`, `shouldPersistQuery`, `createReactQueryPersister`, `createIndexedDbQueryStorage` | Opt-in persistence справочников в IndexedDB. |
601
- | `installReactQueryBroadcast`, `broadcastCacheEvent`, `setBroadcastFn` | Sync query cache и cache events между вкладками. |
602
- | `onMutateOptimistic`, `onErrorOptimistic`, `onSuccessOptimistic`, `onSettledOptimistic` | Helpers для точечного optimistic update. |
652
+ | API | Поведение |
653
+ | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- |
654
+ | `createQueryClient` | Создаёт настроенный QueryClient; singleton lifecycle обеспечивает host. |
655
+ | `persistedQueryMeta`, `shouldPersistQuery`, `createReactQueryPersister`, `createIndexedDbQueryStorage` | Opt-in persistence справочников в IndexedDB. |
656
+ | `configureQueryPersistenceProjectAdapter`, `getQueryPersistenceProjectAdapter` | Host namespace и buster для persistent cache. |
657
+ | `installReactQueryBroadcast`, `broadcastCacheEvent`, `setBroadcastFn` | Sync query cache и cache events между вкладками. |
658
+ | `sessionScopedQueryMeta`, `resetSessionScopedQueries`, `installSessionScopedQueryReset` | Очистка auth/session-dependent query локально и между вкладками. |
659
+ | `onMutateOptimistic`, `onErrorOptimistic`, `onSuccessOptimistic`, `onSettledOptimistic` | Helpers для точечного optimistic update. |
603
660
 
604
661
  Поведение из тестов: persistence сохраняет только `meta.persist === true`, broadcast игнорирует невалидные сообщения и не зацикливает remote events, `onSettledOptimistic` по умолчанию invalidates с `refetchType: "none"`.
605
662
 
606
- Тесты: [`queryClient.test.ts`](./src/query-client/queryClient.test.ts), [`persistence.test.ts`](./src/query-client/persistence.test.ts), [`broadcast.test.ts`](./src/query-client/broadcast.test.ts), [`broadcast.integration.test.ts`](./src/query-client/broadcast.integration.test.ts).
663
+ Тесты: [`queryClient.test.ts`](./src/query-client/queryClient.test.ts), [`persistence.test.ts`](./src/query-client/persistence.test.ts), [`broadcast.test.ts`](./src/query-client/broadcast.test.ts), [`broadcast.integration.test.ts`](./src/query-client/broadcast.integration.test.ts), [`sessionScoped.test.ts`](./src/query-client/sessionScoped.test.ts).
607
664
 
608
665
  ### `error` и `error-report`
609
666
 
610
- Файлы: [`error/index.ts`](./src/error/index.ts), [`error-report/index.ts`](./src/error-report/index.ts).
667
+ Файлы: [`error/index.ts`](./src/error/index.ts), подробный README: [`error/README.mdx`](./src/error/README.mdx); [`error-report/index.ts`](./src/error-report/index.ts), подробный README: [`error-report/README.mdx`](./src/error-report/README.mdx).
611
668
 
612
669
  `error`:
613
670
 
@@ -634,24 +691,25 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
634
691
 
635
692
  ### `array`
636
693
 
637
- Файлы: [`array/index.ts`](./src/array/index.ts), тесты: [`array.test.ts`](./src/array/array.test.ts), [`reorder.test.ts`](./src/array/reorder.test.ts).
638
-
639
- | API | Поведение |
640
- | --------------------------------------------------- | -------------------------------------------------------------------------- |
641
- | `arrayGroupBy`, `arrayGroupByToArray` | Группировка по ключу, порядок элементов внутри группы сохраняется. |
642
- | `arrayToMap` | Map-object по первому встреченному значению ключа. |
643
- | `arrayUniqueBy` | Дедупликация по ключу без перестановки первого значения. |
644
- | `filterAndDeduplicateIds` | Оставляет только allowed ids, убирает пустые и дубли. |
645
- | `appendMissingIds` | Добавляет отсутствующие ids в конец базового списка. |
646
- | `pickExistingMapValues` | Значения `Map` в порядке keys, отсутствующие ключи пропускаются. |
647
- | `arraysEqual` | Строго по длине, порядку и ссылочным значениям. |
648
- | `moveItem`, `moveArrayItem`, `moveArrayItemByIndex` | Immutable reorder; некорректные индексы возвращают копию без перестановки. |
649
- | `normalizeObjects` | Trim key, отсекает пустые/дубли, по умолчанию shallow copy. |
650
- | `normalizeStringArray`, `addUnique` | Нормализация string ids. |
694
+ Файлы: [`array/index.ts`](./src/array/index.ts), подробный README: [`array/README.mdx`](./src/array/README.mdx), тесты: [`array.test.ts`](./src/array/array.test.ts), [`reorder.test.ts`](./src/array/reorder.test.ts).
695
+
696
+ | API | Поведение |
697
+ | --------------------------------------------------- | ---------------------------------------------------------------------------- |
698
+ | `arrayGroupBy`, `arrayGroupByToArray` | Группировка по ключу, порядок элементов внутри группы сохраняется. |
699
+ | `arrayToMap` | Map-object по первому встреченному значению ключа. |
700
+ | `arrayUniqueBy` | Дедупликация по ключу без перестановки первого значения. |
701
+ | `arrayDeduplicate` | Дедупликация значений через семантику `Set` с сохранением первого вхождения. |
702
+ | `filterAndDeduplicateIds` | Оставляет только allowed ids, убирает пустые и дубли. |
703
+ | `appendMissingIds` | Добавляет отсутствующие ids в конец базового списка. |
704
+ | `pickExistingMapValues` | Значения `Map` в порядке keys, отсутствующие ключи пропускаются. |
705
+ | `arraysEqual` | Строго по длине, порядку и ссылочным значениям. |
706
+ | `moveItem`, `moveArrayItem`, `moveArrayItemByIndex` | Immutable reorder; некорректные индексы возвращают копию без перестановки. |
707
+ | `normalizeObjects` | Trim key, отсекает пустые/дубли, по умолчанию shallow copy. |
708
+ | `normalizeStringArray`, `addUnique` | Нормализация string ids. |
651
709
 
652
710
  ### `utils`
653
711
 
654
- Файлы: [`utils/index.ts`](./src/utils/index.ts), тесты: [`utils.test.ts`](./src/utils/utils.test.ts), [`keyboard.test.ts`](./src/utils/keyboard.test.ts), [`createLazyComponent.test.tsx`](./src/utils/createLazyComponent.test.tsx).
712
+ Файлы: [`utils/index.ts`](./src/utils/index.ts), подробный README: [`utils/README.mdx`](./src/utils/README.mdx), тесты: [`utils.test.ts`](./src/utils/utils.test.ts), [`keyboard.test.ts`](./src/utils/keyboard.test.ts), [`createLazyComponent.test.tsx`](./src/utils/createLazyComponent.test.tsx).
655
713
 
656
714
  | API | Поведение |
657
715
  | ------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
@@ -670,25 +728,25 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
670
728
 
671
729
  ### `validators` и `types`
672
730
 
673
- Файлы: [`validators/index.ts`](./src/validators/index.ts), [`types/index.ts`](./src/types/index.ts), тест: [`validators.test.ts`](./src/validators/validators.test.ts).
731
+ Файлы: [`validators/index.ts`](./src/validators/index.ts), подробный README: [`validators/README.mdx`](./src/validators/README.mdx); [`types/index.ts`](./src/types/index.ts), подробный README: [`types/README.mdx`](./src/types/README.mdx); тест: [`validators.test.ts`](./src/validators/validators.test.ts).
674
732
 
675
- | API | Поведение |
676
- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
677
- | `isSafe` | Type guard от `null/undefined`. |
678
- | `isObject`, `isRecord`, `asRecord`, `isPlainObject` | Guards для object-like values; массивы не считаются record. |
679
- | `IMAGE_EXTENSIONS`, `isImageExtension` | Проверка image extension без учета регистра. |
680
- | `isDomReference` | Floating UI reference -> DOM `Element`. |
733
+ | API | Поведение |
734
+ | -------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
735
+ | `isSafe` | Type guard от `null/undefined`. |
736
+ | `isObject`, `isRecord`, `asRecord`, `isPlainObject` | Guards для object-like values; массивы не считаются record. |
737
+ | `IMAGE_EXTENSIONS`, `isImageExtension` | Проверка image extension без учета регистра. |
738
+ | `isDomReference` | Floating UI reference -> DOM `Element`. |
681
739
  | `State`, `AbapBoolean`, `Primitive`, `BaseType`, `InputType`, `RangeType`, `RowRecord` | Общие технические типы. |
682
740
 
683
741
  ### `string-comparison`
684
742
 
685
- Файл: [`string-comparison/compareStrings.ts`](./src/string-comparison/compareStrings.ts), тест: [`compareStrings.test.ts`](./src/string-comparison/compareStrings.test.ts).
743
+ Файл: [`string-comparison/compareStrings.ts`](./src/string-comparison/compareStrings.ts), подробный README: [`string-comparison/README.mdx`](./src/string-comparison/README.mdx), тест: [`compareStrings.test.ts`](./src/string-comparison/compareStrings.test.ts).
686
744
 
687
745
  `compareStrings` использует фиксированный `Intl.Collator("ru-RU", { numeric: true, sensitivity: "base" })` и UTF-16 fallback. Используй для справочников и UI-списков вместо ad hoc `localeCompare`.
688
746
 
689
747
  ### `crypto` и `session-storage`
690
748
 
691
- Файлы: [`crypto/index.ts`](./src/crypto/index.ts), [`session-storage/index.ts`](./src/session-storage/index.ts).
749
+ Файлы: [`crypto/index.ts`](./src/crypto/index.ts), подробный README: [`crypto/README.mdx`](./src/crypto/README.mdx); [`session-storage/index.ts`](./src/session-storage/index.ts), подробный README: [`session-storage/README.mdx`](./src/session-storage/README.mdx).
692
750
 
693
751
  | API | Поведение |
694
752
  | -------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
@@ -701,7 +759,7 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
701
759
 
702
760
  ### `presets`
703
761
 
704
- Файл: [`presets/presets.ts`](./src/presets/presets.ts), тест: [`presets.test.ts`](./src/presets/presets.test.ts).
762
+ Файл: [`presets/presets.ts`](./src/presets/presets.ts), подробный README: [`presets/README.mdx`](./src/presets/README.mdx), тест: [`presets.test.ts`](./src/presets/presets.test.ts).
705
763
 
706
764
  | API | Поведение |
707
765
  | --------------------------- | ------------------------------------------------------------------------------------------ |
@@ -711,7 +769,7 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
711
769
 
712
770
  ### `bounded-copy-stack`
713
771
 
714
- Файл: [`bounded-copy-stack/boundedCopyStack.ts`](./src/bounded-copy-stack/boundedCopyStack.ts), тест: [`boundedCopyStack.test.ts`](./src/bounded-copy-stack/boundedCopyStack.test.ts).
772
+ Файл: [`bounded-copy-stack/boundedCopyStack.ts`](./src/bounded-copy-stack/boundedCopyStack.ts), подробный README: [`bounded-copy-stack/README.mdx`](./src/bounded-copy-stack/README.mdx), тест: [`boundedCopyStack.test.ts`](./src/bounded-copy-stack/boundedCopyStack.test.ts).
715
773
 
716
774
  | API | Поведение |
717
775
  | --------------------------------- | ----------------------------------------------------------------------------------------- |