@ryuzaki13/react-foundation-lib 1.3.1 → 1.4.1

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 (38) hide show
  1. package/README.md +20 -16
  2. package/dist/table/index.d.ts +1 -0
  3. package/dist/table/index.d.ts.map +1 -1
  4. package/dist/table/index.js +77 -64
  5. package/dist/table/index.js.map +1 -1
  6. package/dist/table/tanStackFeatures.d.ts +19 -0
  7. package/dist/table/tanStackFeatures.d.ts.map +1 -0
  8. package/dist/table/types.d.ts +17 -2
  9. package/dist/table/types.d.ts.map +1 -1
  10. package/package.json +9 -9
  11. package/src/array/README.mdx +1630 -0
  12. package/src/binary/README.mdx +1405 -0
  13. package/src/copy/README.mdx +992 -0
  14. package/src/crypto/README.mdx +1052 -0
  15. package/src/dom/README.mdx +2179 -0
  16. package/src/file/README.mdx +1957 -0
  17. package/src/formatters/README.mdx +469 -0
  18. package/src/formatters/boolean/README.mdx +494 -0
  19. package/src/formatters/date/README.mdx +732 -0
  20. package/src/formatters/number/README.mdx +542 -0
  21. package/src/formatters/pipeline/README.mdx +629 -0
  22. package/src/formatters/rowBased/README.mdx +486 -0
  23. package/src/formatters/strings/README.mdx +442 -0
  24. package/src/formatters/valueState/README.mdx +459 -0
  25. package/src/formulas/README.mdx +1283 -0
  26. package/src/binary/README.md +0 -110
  27. package/src/docs/browserAndReact.mdx +0 -150
  28. package/src/docs/filesAndExcel.mdx +0 -163
  29. package/src/docs/formatters-runtime.mdx +0 -455
  30. package/src/docs/formatters.mdx +0 -380
  31. package/src/docs/odataAndTables.mdx +0 -178
  32. package/src/docs/pureUtilities.mdx +0 -96
  33. package/src/docs/runtimeAndState.mdx +0 -155
  34. package/src/file/README.md +0 -289
  35. package/src/formatters/date/README.md +0 -520
  36. package/src/formatters/number/README.md +0 -123
  37. package/src/formatters/valueState/README.md +0 -275
  38. package/src/formulas/README.md +0 -42
package/README.md CHANGED
@@ -30,7 +30,7 @@ import type { RowRecord } from "@ryuzaki13/react-foundation-lib/types";
30
30
  | Entry point | Что может потребоваться в host-проекте |
31
31
  | ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
32
32
  | `formatters`, `array`, `utils`, `validators` | Обычно не требуют дополнительных runtime-зависимостей. |
33
- | `hooks`, `dom`, `copy`, `media`, `pwa` | `react`, если используются React hooks. |
33
+ | `hooks`, `binary`, `dom`, `copy`, `media`, `pwa` | `react`: `binary` экспортирует `useBinaryFile`, остальные entrypoints требуют React при использовании hooks. |
34
34
  | `query-client`, `error-report` | `@tanstack/react-query`, `@tanstack/query-persist-client-core`, `@tanstack/query-broadcast-client-experimental`. |
35
35
  | `odata-service` | `zod`; отдельные helpers типизируются вокруг `@tanstack/react-query`. |
36
36
  | `odata`, `notifications` | `zustand`, для отдельных store-helpers также `immer`. |
@@ -80,6 +80,7 @@ npm run pack:dry-run
80
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
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
82
  | Runtime-форматирование ячеек таблицы | [`formatters/pipeline`](./src/formatters/pipeline/index.ts), тесты в [`formatters/pipeline`](./src/formatters/pipeline) |
83
+ | Группировка, дедупликация, порядок и нормализация массивов | [`array`](./src/array/index.ts), подробный README: [`array/README.mdx`](./src/array/README.mdx) |
83
84
  | OData metadata, filters, sorts, path, values | [`odata-service`](./src/odata-service/index.ts), тесты в [`odata-service`](./src/odata-service) |
84
85
  | Справочные code/text пары OData collections | [`odata`](./src/odata/index.ts), тест: [`odata.test.ts`](./src/odata/odata.test.ts) |
85
86
  | TanStack Table helpers | [`table`](./src/table/index.ts), тесты в [`table`](./src/table) |
@@ -95,9 +96,11 @@ npm run pack:dry-run
95
96
 
96
97
  ## Форматирование и значения
97
98
 
99
+ Полный пользовательский путеводитель находится в [`formatters/README.mdx`](./src/formatters/README.mdx). Он объясняет общие правила, публичную границу единственного entrypoint `@ryuzaki13/react-foundation-lib/formatters` и ведёт к подробным документам каждой предметной области. Разделы ниже дают только краткую карту пакета и не заменяют API-документацию.
100
+
98
101
  ### `formatters/date`
99
102
 
100
- Файлы: [`formatters/date/index.ts`](./src/formatters/date/index.ts), подробный README: [`formatters/date/README.md`](./src/formatters/date/README.md).
103
+ Файлы: [`formatters/date/index.ts`](./src/formatters/date/index.ts), подробный README: [`formatters/date/README.mdx`](./src/formatters/date/README.mdx).
101
104
 
102
105
  Главная идея: модуль работает в плавающей календарной семантике. ISO/OData строки с timezone не пересчитываются в timezone клиента, а сохраняют видимые компоненты даты и времени.
103
106
 
@@ -125,7 +128,7 @@ npm run pack:dry-run
125
128
 
126
129
  ### `formatters/number`
127
130
 
128
- Файлы: [`formatters/number/index.ts`](./src/formatters/number/index.ts), README: [`formatters/number/README.md`](./src/formatters/number/README.md).
131
+ Файлы: [`formatters/number/index.ts`](./src/formatters/number/index.ts), README: [`formatters/number/README.mdx`](./src/formatters/number/README.mdx).
129
132
 
130
133
  Модуль форматирует числа через presets и кеширует `Intl.NumberFormat`. Это стандартный путь для таблиц, графиков и SAP-like строк.
131
134
 
@@ -136,7 +139,7 @@ npm run pack:dry-run
136
139
  | `formatNumber(value, presetOrName)` | Универсальный formatter по имени preset или объекту preset. |
137
140
  | `formatNumberAsInteger`, `formatNumberAsDecimal*`, `formatNumberAsCurrency`, `formatNumberAsPercent`, `formatNumberAsPrice`, `formatNumberAsTonnage` | Типовые UI-форматы. |
138
141
  | `formatNumberAs*OrEmpty` | То же, но semantic zero отображается пустой строкой. |
139
- | `formatCompactNumber`, `formatNumberAsChartAxis`, `formatNumberAsChartTooltip`, `formatNumberAsCurrencyChartAxis` | Compact-формат для осей и tooltip графиков. |
142
+ | Встроенные `compact-*` presets и собственный `NumberFormatPreset.compact` | Compact-формат с `тыс`, `млн`, `млрд`, `трлн`. |
140
143
  | `parseNumber`, `toFiniteNumber`, `toPositiveInteger`, `isPositiveValue`, `isZeroValue` | Чтение SAP-like чисел из `unknown`. |
141
144
  | `registerNumberPreset`, `getNumberPreset`, `getNumberPresetNames`, `resetNumberPresets`, `clearFormatCache` | Реестр presets и кеш formatter-ов. |
142
145
 
@@ -152,7 +155,7 @@ npm run pack:dry-run
152
155
 
153
156
  ### `formatters/strings`
154
157
 
155
- Файлы: [`formatters/strings/index.ts`](./src/formatters/strings/index.ts).
158
+ Файлы: [`formatters/strings/index.ts`](./src/formatters/strings/index.ts), подробный README: [`formatters/strings/README.mdx`](./src/formatters/strings/README.mdx).
156
159
 
157
160
  | API | Поведение |
158
161
  | ---------------------------------------------------- | --------------------------------------------------------------- |
@@ -182,7 +185,7 @@ npm run pack:dry-run
182
185
 
183
186
  ### `formatters/boolean`
184
187
 
185
- Файлы: [`formatters/boolean/index.ts`](./src/formatters/boolean/index.ts), тест: [`boolean.test.ts`](./src/formatters/boolean/boolean.test.ts).
188
+ Файлы: [`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
189
 
187
190
  | API | Поведение |
188
191
  | ------------------ | ------------------------------------------------------------- |
@@ -192,7 +195,7 @@ npm run pack:dry-run
192
195
 
193
196
  ### `formatters/valueState`
194
197
 
195
- Файлы: [`formatters/valueState/index.ts`](./src/formatters/valueState/index.ts), README: [`formatters/valueState/README.md`](./src/formatters/valueState/README.md).
198
+ Файлы: [`formatters/valueState/index.ts`](./src/formatters/valueState/index.ts), README: [`formatters/valueState/README.mdx`](./src/formatters/valueState/README.mdx).
196
199
 
197
200
  Модуль вычисляет визуальный `State` (`none`, `information`, `success`, `warning`, `error`) по значению.
198
201
 
@@ -210,7 +213,7 @@ npm run pack:dry-run
210
213
 
211
214
  ### `formatters/pipeline`
212
215
 
213
- Файлы: [`formatters/pipeline/index.ts`](./src/formatters/pipeline/index.ts).
216
+ Файлы: [`formatters/pipeline/index.ts`](./src/formatters/pipeline/index.ts), подробный README: [`formatters/pipeline/README.mdx`](./src/formatters/pipeline/README.mdx).
214
217
 
215
218
  Pipeline — runtime форматирования ячейки. Он принимает сериализуемый `FormattersPipelineConfig` версии `1`, валидирует `plan` или строит линейный plan из `graph`, компилирует executor и возвращает display-result.
216
219
 
@@ -249,7 +252,7 @@ Pipeline — runtime форматирования ячейки. Он прини
249
252
 
250
253
  ### `formatters/rowBased`
251
254
 
252
- Файлы: [`formatters/rowBased/index.ts`](./src/formatters/rowBased/index.ts), тест: [`rowBased.test.ts`](./src/formatters/rowBased/rowBased.test.ts).
255
+ Файлы: [`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
256
 
254
257
  Это маленький реестр формул для row-based override внутри pipeline.
255
258
 
@@ -264,7 +267,7 @@ Pipeline — runtime форматирования ячейки. Он прини
264
267
 
265
268
  ### `formulas`
266
269
 
267
- Файлы: [`formulas/index.ts`](./src/formulas/index.ts), README: [`formulas/README.md`](./src/formulas/README.md).
270
+ Файлы: [`formulas/index.ts`](./src/formulas/index.ts), подробный README: [`formulas/README.mdx`](./src/formulas/README.mdx).
268
271
 
269
272
  Инфраструктура реестра клиентских формул таблицы для calculated/clientOnly measure-колонок. Definitions принадлежат host-приложению и не входят в foundation-пакет.
270
273
 
@@ -455,7 +458,7 @@ Pipeline — runtime форматирования ячейки. Он прини
455
458
 
456
459
  ### `file` и `binary`
457
460
 
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).
461
+ Файлы: [`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
462
 
460
463
  `file`:
461
464
 
@@ -491,7 +494,7 @@ Pipeline — runtime форматирования ячейки. Он прини
491
494
 
492
495
  ### `dom`
493
496
 
494
- Файлы: [`dom/index.ts`](./src/dom/index.ts), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx).
497
+ Файлы: [`dom/index.ts`](./src/dom/index.ts), подробный README: [`dom/README.mdx`](./src/dom/README.mdx), тест: [`dom.test.tsx`](./src/dom/dom.test.tsx).
495
498
 
496
499
  | API | Поведение |
497
500
  | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
@@ -524,14 +527,14 @@ Pipeline — runtime форматирования ячейки. Он прини
524
527
 
525
528
  ### `copy`
526
529
 
527
- Файлы: [`copy/index.ts`](./src/copy/index.ts).
530
+ Файлы: [`copy/index.ts`](./src/copy/index.ts), подробный README: [`copy/README.mdx`](./src/copy/README.mdx).
528
531
 
529
532
  | API | Поведение |
530
533
  | -------------------------------- | --------------------------------------------------------------------------------------- |
531
534
  | `useCopyText` | Clipboard API в secure context, fallback через `execCommand`; пустой текст не копирует. |
532
535
  | `useElementText` | Trimmed `textContent` ref. |
533
536
  | `useCopyElementText` | Копирует текст из ref. |
534
- | `useCopyFeedback` | `isCopied` на 2 секунды. |
537
+ | `useCopyFeedback` | `isCopied` на 2 секунды; повторные вызовы создают независимые timers. |
535
538
  | `useCopyElementTextWithFeedback` | Копирование элемента + feedback. |
536
539
 
537
540
  ### `media`
@@ -634,13 +637,14 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
634
637
 
635
638
  ### `array`
636
639
 
637
- Файлы: [`array/index.ts`](./src/array/index.ts), тесты: [`array.test.ts`](./src/array/array.test.ts), [`reorder.test.ts`](./src/array/reorder.test.ts).
640
+ Файлы: [`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).
638
641
 
639
642
  | API | Поведение |
640
643
  | --------------------------------------------------- | -------------------------------------------------------------------------- |
641
644
  | `arrayGroupBy`, `arrayGroupByToArray` | Группировка по ключу, порядок элементов внутри группы сохраняется. |
642
645
  | `arrayToMap` | Map-object по первому встреченному значению ключа. |
643
646
  | `arrayUniqueBy` | Дедупликация по ключу без перестановки первого значения. |
647
+ | `arrayDeduplicate` | Дедупликация значений через семантику `Set` с сохранением первого вхождения. |
644
648
  | `filterAndDeduplicateIds` | Оставляет только allowed ids, убирает пустые и дубли. |
645
649
  | `appendMissingIds` | Добавляет отсутствующие ids в конец базового списка. |
646
650
  | `pickExistingMapValues` | Значения `Map` в порядке keys, отсутствующие ключи пропускаются. |
@@ -688,7 +692,7 @@ Service worker runtime helpers живут в [`pwa/serviceWorker.ts`](./src/pwa/
688
692
 
689
693
  ### `crypto` и `session-storage`
690
694
 
691
- Файлы: [`crypto/index.ts`](./src/crypto/index.ts), [`session-storage/index.ts`](./src/session-storage/index.ts).
695
+ Файлы: [`crypto/index.ts`](./src/crypto/index.ts), подробный README: [`crypto/README.mdx`](./src/crypto/README.mdx); [`session-storage/index.ts`](./src/session-storage/index.ts).
692
696
 
693
697
  | API | Поведение |
694
698
  | -------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
@@ -4,6 +4,7 @@ export * from "./columnSizing";
4
4
  export * from "./cellSelection";
5
5
  export * from "./odataAdapter";
6
6
  export * from "./selection";
7
+ export * from "./tanStackFeatures";
7
8
  export * from "./types";
8
9
  export * from "./useTableRowSelection";
9
10
  export * from "./utils";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/table/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/table/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import { d as e, i as t, u as n } from "../chunks/array-D-_yMMUK.js";
2
2
  import { useCallback as r, useEffect as i, useEffectEvent as a, useRef as o, useState as s } from "react";
3
+ import { columnOrderingFeature as c, columnPinningFeature as l, columnResizingFeature as u, columnSizingFeature as d, columnVisibilityFeature as f, createExpandedRowModel as p, rowExpandingFeature as m, rowSelectionFeature as h, tableFeatures as g } from "@tanstack/react-table";
3
4
  //#region src/table/columnLayout.ts
4
- function c({ ids: n, order: r }) {
5
+ function _({ ids: n, order: r }) {
5
6
  return t(e(r, n), n);
6
7
  }
7
- function l({ ids: e, getWidth: t }) {
8
+ function v({ ids: e, getWidth: t }) {
8
9
  return e.map((e) => ({
9
10
  id: e,
10
11
  width: t(e)
@@ -12,14 +13,14 @@ function l({ ids: e, getWidth: t }) {
12
13
  }
13
14
  //#endregion
14
15
  //#region src/table/columnOrder.ts
15
- function u(e) {
16
+ function y(e) {
16
17
  return Array.from(new Set((e ?? []).filter((e) => e.trim().length > 0)));
17
18
  }
18
- function d(e, t, n) {
19
+ function b(e, t, n) {
19
20
  let r = [...e], [i] = r.splice(t, 1);
20
21
  return i === void 0 || r.splice(n, 0, i), r;
21
22
  }
22
- function f(e) {
23
+ function x(e) {
23
24
  let { activeId: t, overId: n, order: r } = e;
24
25
  if (!t || !n || t === n) return [...r];
25
26
  let i = new Set(e.headerIds);
@@ -31,50 +32,50 @@ function f(e) {
31
32
  let s = [...r];
32
33
  s.includes(t) || s.push(t), s.includes(n) || s.push(n);
33
34
  let c = s.indexOf(t), l = s.indexOf(n);
34
- return c === -1 || l === -1 || c === l ? s : d(s, c, l);
35
+ return c === -1 || l === -1 || c === l ? s : b(s, c, l);
35
36
  }
36
- function p(e) {
37
- let t = f(e);
37
+ function S(e) {
38
+ let t = x(e);
38
39
  return n(t, e.order) ? null : t;
39
40
  }
40
41
  //#endregion
41
42
  //#region src/table/columnSizing.ts
42
- var m = 60;
43
- function h(e, t = 60) {
43
+ var C = 60;
44
+ function w(e, t = 60) {
44
45
  let n = Number.isFinite(t) && t > 0 ? Math.floor(t) : 60;
45
46
  return Math.max(n, Number.isFinite(e) ? Math.floor(e) : n);
46
47
  }
47
- function g(e, t = 60) {
48
+ function T(e, t = 60) {
48
49
  let n = {};
49
- for (let [r, i] of Object.entries(e ?? {})) typeof r != "string" || r.trim().length === 0 || !Number.isFinite(i) || (n[r] = h(i, t));
50
+ for (let [r, i] of Object.entries(e ?? {})) typeof r != "string" || r.trim().length === 0 || !Number.isFinite(i) || (n[r] = w(i, t));
50
51
  return n;
51
52
  }
52
- function _(e, t, n, r = 60) {
53
- return t.trim().length === 0 ? g(e, r) : {
54
- ...g(e, r),
55
- [t]: h(n, r)
53
+ function E(e, t, n, r = 60) {
54
+ return t.trim().length === 0 ? T(e, r) : {
55
+ ...T(e, r),
56
+ [t]: w(n, r)
56
57
  };
57
58
  }
58
- function v(e, t) {
59
+ function D(e, t) {
59
60
  let n = {};
60
61
  for (let [r, i] of Object.entries(e)) r !== t && (n[r] = i);
61
62
  return n;
62
63
  }
63
64
  //#endregion
64
65
  //#region src/table/cellSelection.ts
65
- var y = /* @__PURE__ */ new Set(["direct", "primary-modifier"]);
66
- function b(e) {
66
+ var O = /* @__PURE__ */ new Set(["direct", "primary-modifier"]);
67
+ function k(e) {
67
68
  return `${encodeURIComponent(e.rowId)}::${encodeURIComponent(e.columnId)}`;
68
69
  }
69
- function x(e, t) {
70
- let n = new Set(e.map(b)), r = new Set(t.map(b));
70
+ function A(e, t) {
71
+ let n = new Set(e.map(k)), r = new Set(t.map(k));
71
72
  return n.size === r.size && [...n].every((e) => r.has(e));
72
73
  }
73
- function S(e, t, n, r) {
74
+ function j(e, t, n, r) {
74
75
  if (r === "none" || !e?.length) return [];
75
76
  let i = new Map(t.map((e, t) => [e, t])), a = new Map(n.map((e, t) => [e, t])), o = /* @__PURE__ */ new Set(), s = e.filter((e) => {
76
77
  if (!(i.has(e.rowId) && a.has(e.columnId))) return !1;
77
- let t = b(e);
78
+ let t = k(e);
78
79
  return !o.has(t) && (o.add(t), !0);
79
80
  }).sort((e, t) => {
80
81
  let n = (i.get(e.rowId) ?? 0) - (i.get(t.rowId) ?? 0);
@@ -86,52 +87,52 @@ function S(e, t, n, r) {
86
87
  }
87
88
  return s;
88
89
  }
89
- function C(e, t, n) {
90
+ function M(e, t, n) {
90
91
  if (n === "none") return [];
91
- let r = b(t), i = e.some((e) => b(e) === r);
92
- return n === "single" ? i ? [] : [t] : i ? e.filter((e) => b(e) !== r) : [...e, t];
92
+ let r = k(t), i = e.some((e) => k(e) === r);
93
+ return n === "single" ? i ? [] : [t] : i ? e.filter((e) => k(e) !== r) : [...e, t];
93
94
  }
94
- function w(e, t = "direct") {
95
- return typeof e == "string" && y.has(e) ? e : t;
95
+ function N(e, t = "direct") {
96
+ return typeof e == "string" && O.has(e) ? e : t;
96
97
  }
97
- function T(e, t) {
98
+ function P(e, t) {
98
99
  return t === "direct" || (e.ctrlKey || e.metaKey) && !e.shiftKey && !e.altKey;
99
100
  }
100
101
  //#endregion
101
102
  //#region src/table/odataAdapter.ts
102
- function E(e) {
103
+ function F(e) {
103
104
  let { role: t, type: n } = e;
104
105
  return {
105
106
  role: n === "decimal" || n === "float" || n === "double" || n === "int" || n === "byte" ? "measure" : t,
106
107
  type: n
107
108
  };
108
109
  }
109
- function D(e) {
110
+ function I(e) {
110
111
  return e.role === "measure" ? "right" : "left";
111
112
  }
112
- function O(e, t) {
113
+ function L(e, t) {
113
114
  return e.semanticType !== "code" || !e.linkedColumnId || t.get(e.linkedColumnId)?.semanticType !== "text";
114
115
  }
115
- function k(e) {
116
+ function R(e) {
116
117
  if (typeof e.id == "string" && e.id.trim()) return e.id;
117
118
  if ("accessorKey" in e && typeof e.accessorKey == "string" && e.accessorKey.trim()) return e.accessorKey;
118
119
  }
119
- function A(e, t) {
120
+ function z(e, t) {
120
121
  return e.map((e) => "columns" in e && Array.isArray(e.columns) && e.columns.length > 0 ? {
121
122
  ...e,
122
- columns: A(e.columns, t)
123
+ columns: z(e.columns, t)
123
124
  } : t(e));
124
125
  }
125
- function j(e, t) {
126
+ function B(e, t) {
126
127
  let n = new Map(e.map((e) => [e.id, e]));
127
128
  return Object.fromEntries(e.map((e) => {
128
- let r = t?.resolveVisible?.(e) ?? O(e, n);
129
+ let r = t?.resolveVisible?.(e) ?? L(e, n);
129
130
  return [e.id, r];
130
131
  }));
131
132
  }
132
- function M(e, t) {
133
+ function V(e, t) {
133
134
  return e.map((e) => {
134
- let n = E(e), r = D(n), i = t?.resolveFormatting?.(e);
135
+ let n = F(e), r = I(n), i = t?.resolveFormatting?.(e);
135
136
  return {
136
137
  id: e.id,
137
138
  accessorKey: e.id,
@@ -148,17 +149,17 @@ function M(e, t) {
148
149
  };
149
150
  });
150
151
  }
151
- function N(e, t, n) {
152
+ function H(e, t, n) {
152
153
  let r = new Map(t.map((e) => [e.id, e]));
153
- return A(e, (e) => {
154
- let t = k(e);
154
+ return z(e, (e) => {
155
+ let t = R(e);
155
156
  if (!t) return e;
156
157
  let i = n?.resolveMetadataColumn?.({
157
158
  columnId: t,
158
159
  metadataColumnsById: r
159
160
  }) ?? r.get(t);
160
161
  if (!i || e.meta?.formatting?.role && e.meta.formatting.type) return e;
161
- let a = E(i);
162
+ let a = F(i);
162
163
  return {
163
164
  ...e,
164
165
  meta: {
@@ -175,34 +176,34 @@ function N(e, t, n) {
175
176
  }
176
177
  //#endregion
177
178
  //#region src/table/selection.ts
178
- var P = /* @__PURE__ */ new Set([
179
+ var U = /* @__PURE__ */ new Set([
179
180
  "none",
180
181
  "single",
181
182
  "multi"
182
183
  ]);
183
- function F(e) {
184
+ function W(e) {
184
185
  return Object.keys(e).filter((t) => e[t]);
185
186
  }
186
- function I(e, t) {
187
- let n = F(e), r = F(t);
187
+ function G(e, t) {
188
+ let n = W(e), r = W(t);
188
189
  return n.length === r.length && n.every((e) => t[e]);
189
190
  }
190
- function L(e, t = "none") {
191
- return typeof e == "string" && P.has(e) ? e : t;
191
+ function K(e, t = "none") {
192
+ return typeof e == "string" && U.has(e) ? e : t;
192
193
  }
193
- function R(e, t, n) {
194
+ function q(e, t, n) {
194
195
  if (n === "none") return {};
195
- let r = new Set(t), i = F(e).filter((e) => r.has(e));
196
+ let r = new Set(t), i = W(e).filter((e) => r.has(e));
196
197
  if (n === "single") {
197
198
  let e = i.at(-1);
198
199
  return e ? { [e]: !0 } : {};
199
200
  }
200
201
  return Object.fromEntries(i.map((e) => [e, !0]));
201
202
  }
202
- function z(e, t, n) {
203
+ function J(e, t, n) {
203
204
  if (n === "none") return {};
204
205
  if (n === "single") {
205
- let n = F(e);
206
+ let n = W(e);
206
207
  return n.length === 1 && n[0] === t ? e : { [t]: !0 };
207
208
  }
208
209
  if (e[t]) {
@@ -215,15 +216,27 @@ function z(e, t, n) {
215
216
  };
216
217
  }
217
218
  //#endregion
219
+ //#region src/table/tanStackFeatures.ts
220
+ var Y = g({
221
+ columnOrderingFeature: c,
222
+ columnPinningFeature: l,
223
+ columnSizingFeature: d,
224
+ columnResizingFeature: u,
225
+ columnVisibilityFeature: f,
226
+ rowSelectionFeature: h,
227
+ rowExpandingFeature: m,
228
+ expandedRowModel: p()
229
+ });
230
+ //#endregion
218
231
  //#region src/table/useTableRowSelection.ts
219
- function B({ availableRowIds: e, rowById: t, selectionMode: n, selectedRowIds: c, onRowSelectionChange: l }) {
232
+ function X({ availableRowIds: e, rowById: t, selectionMode: n, selectedRowIds: c, onRowSelectionChange: l }) {
220
233
  let [u, d] = s({}), f = o(!1), p = r((e, t) => {
221
234
  let n = Object.keys(e).filter((t) => e[t]), r = Object.keys(t).filter((e) => t[e]);
222
235
  return n.length === r.length && n.every((e) => t[e]);
223
236
  }, []), m = a((e) => {
224
- d((t) => R(t, e, n));
237
+ d((t) => q(t, e, n));
225
238
  }), h = a((e, t) => {
226
- let r = R(Object.fromEntries(e.map((e) => [e, !0])), t, n);
239
+ let r = q(Object.fromEntries(e.map((e) => [e, !0])), t, n);
227
240
  d((e) => p(e, r) ? e : (f.current = !0, r));
228
241
  }), g = a((e) => {
229
242
  if (!l) return;
@@ -255,28 +268,28 @@ function B({ availableRowIds: e, rowById: t, selectionMode: n, selectedRowIds: c
255
268
  rowSelection: u,
256
269
  setRowSelection: d,
257
270
  activateRowSelection: r((e, t) => {
258
- n === "none" || !t || d((t) => z(t, e, n));
271
+ n === "none" || !t || d((t) => J(t, e, n));
259
272
  }, [n])
260
273
  };
261
274
  }
262
275
  //#endregion
263
276
  //#region src/table/utils.ts
264
- var V = (/* @__PURE__ */ "button.a.input.select.textarea.label.summary.audio[controls].video[controls].[contenteditable]:not([contenteditable=\"false\"]).[tabindex]:not(td):not(th):not(tr).[draggable=\"true\"].[role=\"button\"].[role=\"link\"].[role=\"checkbox\"].[role=\"radio\"].[role=\"switch\"].[role=\"menu\"].[role=\"menuitem\"].[role=\"menuitemcheckbox\"].[role=\"menuitemradio\"].[role=\"listbox\"].[role=\"option\"].[role=\"tab\"].[role=\"tablist\"].[role=\"tree\"].[role=\"treeitem\"].[role=\"slider\"].[role=\"spinbutton\"].[role=\"textbox\"].[role=\"searchbox\"].[role=\"combobox\"]".split(".")).join(", ");
265
- function H(e) {
277
+ var Z = (/* @__PURE__ */ "button.a.input.select.textarea.label.summary.audio[controls].video[controls].[contenteditable]:not([contenteditable=\"false\"]).[tabindex]:not(td):not(th):not(tr).[draggable=\"true\"].[role=\"button\"].[role=\"link\"].[role=\"checkbox\"].[role=\"radio\"].[role=\"switch\"].[role=\"menu\"].[role=\"menuitem\"].[role=\"menuitemcheckbox\"].[role=\"menuitemradio\"].[role=\"listbox\"].[role=\"option\"].[role=\"tab\"].[role=\"tablist\"].[role=\"tree\"].[role=\"treeitem\"].[role=\"slider\"].[role=\"spinbutton\"].[role=\"textbox\"].[role=\"searchbox\"].[role=\"combobox\"]".split(".")).join(", ");
278
+ function Q(e) {
266
279
  return e.meta;
267
280
  }
268
- function U(e) {
281
+ function $(e) {
269
282
  return e.meta?.formatting;
270
283
  }
271
- function W(e) {
284
+ function ee(e) {
272
285
  return typeof e == "number" ? `${e}em` : e;
273
286
  }
274
- function G(e, t) {
287
+ function te(e, t) {
275
288
  if (typeof Element > "u" || !(e instanceof Element)) return !1;
276
- let n = t ? `${V}, ${t}` : V;
289
+ let n = t ? `${Z}, ${t}` : Z;
277
290
  return !!e.closest(n);
278
291
  }
279
292
  //#endregion
280
- export { m as DEFAULT_TABLE_COLUMN_MIN_WIDTH, x as areTableCellSelectionsEqual, I as areTableRowSelectionsEqual, l as buildTableColumnLayout, j as createTableColumnVisibilityFromODataMetadata, M as createTableColumnsFromODataMetadata, N as enrichTableColumnsWithODataFormatting, U as getTableColumnFormattingMeta, H as getTableColumnMeta, G as isTableInteractiveElement, w as normalizeTableCellSelectionActivationMode, u as normalizeTableColumnOrder, g as normalizeTableColumnSizing, h as normalizeTableColumnWidth, L as normalizeTableSelectionMode, _ as patchTableColumnWidth, S as pruneTableCellSelection, R as pruneTableRowSelection, v as removeTableColumnWidth, f as reorderTableHeaderColumns, p as resolveReorderedTableHeaderColumns, k as resolveStableColumnId, E as resolveTableColumnFormattingContextFromODataColumn, c as resolveTableColumnOrder, W as resolveTableLength, T as shouldActivateTableCellSelection, C as toggleTableCellSelection, z as toggleTableRowSelection, B as useTableRowSelection };
293
+ export { C as DEFAULT_TABLE_COLUMN_MIN_WIDTH, A as areTableCellSelectionsEqual, G as areTableRowSelectionsEqual, v as buildTableColumnLayout, B as createTableColumnVisibilityFromODataMetadata, V as createTableColumnsFromODataMetadata, H as enrichTableColumnsWithODataFormatting, Y as foundationTableFeatures, $ as getTableColumnFormattingMeta, Q as getTableColumnMeta, te as isTableInteractiveElement, N as normalizeTableCellSelectionActivationMode, y as normalizeTableColumnOrder, T as normalizeTableColumnSizing, w as normalizeTableColumnWidth, K as normalizeTableSelectionMode, E as patchTableColumnWidth, j as pruneTableCellSelection, q as pruneTableRowSelection, D as removeTableColumnWidth, x as reorderTableHeaderColumns, S as resolveReorderedTableHeaderColumns, R as resolveStableColumnId, F as resolveTableColumnFormattingContextFromODataColumn, _ as resolveTableColumnOrder, ee as resolveTableLength, P as shouldActivateTableCellSelection, M as toggleTableCellSelection, J as toggleTableRowSelection, X as useTableRowSelection };
281
294
 
282
295
  //# sourceMappingURL=index.js.map