@skyservice-developers/vue-dev-kit 2.14.3 → 2.15.0

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.
package/README.md CHANGED
@@ -30,7 +30,8 @@ import {
30
30
  SkyTable,
31
31
  // грід на TanStack + примітиви таблиці + композабли
32
32
  SkyDataTable, createSkyColumnHelper, skyTableFeatures,
33
- SkyTableRoot, SkyTableHeader, SkyTableHead, SkyTableBody, SkyTableRow, SkyTableCell,
33
+ SkyTableRoot, SkyTableHeader, SkyTableHead, SkyTableBody, SkyTableVirtualBody,
34
+ SkyTableRow, SkyTableCell,
34
35
  useTableSort, useTableSelection, useColumnVisibility,
35
36
  FunctionalCalendar, SkyDateRangePicker,
36
37
  SkyFilterDropdown,
@@ -437,6 +438,10 @@ import {
437
438
 
438
439
  Кастомний select **з полем пошуку** у дропдауні — для довгих списків опцій. Дизайн 1:1 зі `SkySelect`, той самий формат опцій (`{ value, text }`) та стани. Не використовує нативний `<select>`, тому працює на старих браузерах (перевірено з Chromium 84): без `flex gap`, `inset`, `:focus-visible`, `Array.at()` тощо.
439
440
 
441
+ Панель не вилазить за нижній край вікна: якщо знизу тісно, вона розкривається **вгору**, а висоту обмежує під доступне місце — скролиться список усередині. Сторона переобирається на скрол і ресайз, поки панель відкрита. Teleport-а немає, тож контейнер з `overflow: hidden` (напр. `Modal`) панель усе одно обріже — там беріть `SkyFilterDropdown`.
442
+
443
+ Поле пошуку з'являється **від 6 опцій** (`searchThreshold`): на коротких списках воно лише шумить. Коли пошуку немає, стрілками й `Enter` керує сам тригер — фокус нікуди не переносимо.
444
+
440
445
  ```vue
441
446
  <SkySelectSearch
442
447
  v-model="selected"
@@ -463,6 +468,7 @@ import {
463
468
  | `hint` | `String` | `''` | Підказка під полем |
464
469
  | `searchPlaceholder` | `String` | `'Пошук…'` | Placeholder поля пошуку |
465
470
  | `noResultsText` | `String` | `'Нічого не знайдено'` | Текст за відсутності збігів |
471
+ | `searchThreshold` | `Number` | `6` | Від скількох опцій показувати поле пошуку. `0` — завжди, `Infinity` — ніколи |
466
472
 
467
473
  #### Events
468
474
 
@@ -908,8 +914,37 @@ const columns = [
908
914
  | `initialSorting` | `SortingState` | — | Початкове сортування |
909
915
  | `emptyText` | `String` | `'Даних немає'` | Текст порожнього стану |
910
916
  | `interactiveRows` | `Boolean` | `false` | Курсор і hover на рядках |
917
+ | `virtual` | `Boolean \| SkyDataTableVirtualOptions` | `false` | Віртуалізація тіла — у DOM лише видиме вікно рядків |
918
+
919
+ Слоти: `toolbar`, `actions`, `footer`, `empty` (усі отримують `{ table }`). Події: `row-click`, `reach-end` (тільки у віртуальному режимі). Інстанс таблиці доступний через `ref` → `tableRef.table`.
920
+
921
+ #### Віртуалізація
911
922
 
912
- Слоти: `toolbar`, `actions`, `footer`, `empty` (усі отримують `{ table }`). Подія: `row-click`. Інстанс таблиці доступний через `ref` → `tableRef.table`.
923
+ На кілька тисяч рядків браузер провисає не на даних, а на DOM. Проп `virtual` лишає в розмітці тільки видиме вікно:
924
+
925
+ ```vue
926
+ <SkyDataTable :columns="columns" :data="rows" row-id="id" virtual />
927
+
928
+ <SkyDataTable
929
+ :columns="columns"
930
+ :data="rows"
931
+ row-id="id"
932
+ :virtual="{ estimateSize: 44, overscan: 8 }"
933
+ @reach-end="loadMore"
934
+ />
935
+ ```
936
+
937
+ | Опція | Тип | За замовчуванням | Опис |
938
+ |-------|-----|------------------|------|
939
+ | `estimateSize` | `Number` | `40` | Очікувана висота рядка в px |
940
+ | `overscan` | `Number` | `6` | Скільки рядків тримати понад видиме вікно |
941
+ | `dynamic` | `Boolean` | `false` | Рядки різної висоти — вимірювання через ResizeObserver |
942
+
943
+ Змінюється рівно одне: хто вирішує, які рядки зараз у DOM. Сортування, фільтрація, вибір і `getRowCount()` працюють по всьому набору даних.
944
+
945
+ > **Потрібна обмежена висота.** Скрол-контейнером є тіло таблиці — дайте таблиці `height` або `flex: 1; min-height: 0`, інакше скролитиметься сторінка й вікно не зсуватиметься.
946
+
947
+ > **Не поєднуйте з `pageSize`.** На сторінці в кілька десятків рядків віртуалізувати нічого; компонент попередить у консолі. Природна пара до `virtual` — довантаження за `reach-end`.
913
948
 
914
949
  #### Набір фіч
915
950
 
@@ -940,7 +975,7 @@ const features = tableFeatures({
940
975
  <script setup>
941
976
  import {
942
977
  SkyTableRoot, SkyTableHeader, SkyTableHead,
943
- SkyTableBody, SkyTableRow, SkyTableCell,
978
+ SkyTableBody, SkyTableVirtualBody, SkyTableRow, SkyTableCell,
944
979
  } from '@skyservice-developers/vue-dev-kit'
945
980
 
946
981
  const columns = [
@@ -968,7 +1003,7 @@ const columns = [
968
1003
 
969
1004
  | Шар | Експорти | Коли підключати |
970
1005
  |-----|----------|-----------------|
971
- | Примітиви (`shared/ui/table`) | `SkyTableRoot`, `SkyTableHeader`, `SkyTableHead`, `SkyTableBody`, `SkyTableRow`, `SkyTableCell`, `SkyTableEmpty` | завжди |
1006
+ | Примітиви (`shared/ui/table`) | `SkyTableRoot`, `SkyTableHeader`, `SkyTableHead`, `SkyTableBody`, `SkyTableVirtualBody`, `SkyTableRow`, `SkyTableCell`, `SkyTableEmpty` | завжди |
972
1007
  | Композабли (`shared/lib/table`) | `useTableSort`, `useTableSelection`, `useColumnVisibility` | за потреби |
973
1008
  | Фічі (`features/table`) | `TableMassActions`, `TableColumnSettings`, `TableVirtualBody` | опційно, кожна окремо |
974
1009
 
@@ -980,13 +1015,46 @@ const { visibility, visibleColumns } = useColumnVisibility(columns, { storageKey
980
1015
 
981
1016
  Композабли не сортують і не фільтрують дані — вони тримають стан, а дані лишаються за застосунком (зазвичай сортує сервер). Колонка вибору описується як звичайна колонка (`{ name: '_select', width: 44 }`), щоб грід шапки й рядків рахувався з одного джерела.
982
1017
 
983
- > `vue-virtual-scroller` імпортує лише `TableVirtualBody`. Не потрібна віртуалізація — беріть `SkyTableBody`, і залежність не знадобиться.
1018
+ #### Тіло: два режими, один контракт
1019
+
1020
+ `SkyTableBody` без пропа `rows` — прозора обгортка (рядки складаєте самі, як вище). З `rows` — ітерує сам і віддає scoped-слот:
1021
+
1022
+ ```vue
1023
+ <SkyTableBody :rows="rows" :row-key="row => row.id">
1024
+ <template #empty><SkyTableEmpty text="Даних немає" /></template>
1025
+ <template #default="{ row }">
1026
+ <SkyTableRow><SkyTableCell>{{ row.name }}</SkyTableCell></SkyTableRow>
1027
+ </template>
1028
+ </SkyTableBody>
1029
+ ```
1030
+
1031
+ `SkyTableVirtualBody` приймає ті самі `rows`/`rowKey` і віддає той самий слот, лишаючи в DOM тільки видиме вікно рядків. Тому перемикання віртуалізації — це заміна тега, а не переписування розмітки:
1032
+
1033
+ ```vue
1034
+ <component :is="virtual ? SkyTableVirtualBody : SkyTableBody" :rows="rows" :row-key="row => row.id">
1035
+ <template #default="{ row }">…</template>
1036
+ </component>
1037
+ ```
1038
+
1039
+ | Prop `SkyTableVirtualBody` | Тип | За замовчуванням | Опис |
1040
+ |------|-----|------------------|------|
1041
+ | `rows` | `TRow[]` | — | Рядки (обовʼязково) |
1042
+ | `rowKey` | `(row, index) => string \| number` | індекс | Ключ рядка |
1043
+ | `estimateSize` | `Number` | `40` | Очікувана висота рядка в px |
1044
+ | `overscan` | `Number` | `6` | Скільки рядків тримати понад видиме вікно |
1045
+ | `dynamic` | `Boolean` | `false` | Рядки різної висоти — вимірювання через ResizeObserver |
1046
+
1047
+ Подія `reach-end` — коли останній рядок увійшов у вікно.
1048
+
1049
+ > **Потрібна обмежена висота.** Скрол-контейнером є саме тіло. Якщо таблиця росте разом з контентом і скролиться сторінка, вікно ніколи не зсувається. Дайте таблиці `height` або `flex: 1; min-height: 0`.
1050
+
1051
+ > `TableVirtualBody` з `features/table` лишається як сумісна обгортка зі старим контрактом (`items` + слот `{ item, index }`). У новому коді беріть `SkyTableVirtualBody`.
984
1052
 
985
1053
  ---
986
1054
 
987
1055
  ### SkyTable
988
1056
 
989
- Віртуал-скрол таблиця (на `vue-virtual-scroller`) для великих списків — у DOM тримаються лише видимі рядки. Розмітка й стилі 1:1 з таблицею товарів POS: чекбокси, масові дії, сортування, зміна ширини/видимості колонок, розкриття вкладених рядків (модифікацій), inline-редагування комірок і теги.
1057
+ Віртуал-скрол таблиця (на `@tanstack/vue-virtual`) для великих списків — у DOM тримаються лише видимі рядки. Розмітка й стилі 1:1 з таблицею товарів POS: чекбокси, масові дії, сортування, зміна ширини/видимості колонок, розкриття вкладених рядків (модифікацій), inline-редагування комірок і теги.
990
1058
 
991
1059
  ```vue
992
1060
  <SkyTable
@@ -1076,7 +1144,7 @@ const json = { items, total: items.length }
1076
1144
  |------|-------|------|
1077
1145
  | `cell-<name>` | `{ row, value, item }` | Кастомний рендер комірки колонки `<name>` |
1078
1146
 
1079
- > **Примітка:** компонент розрахований на хост-середовище Skyservice POS. Він читає словник i18n з `window.lang` (з UA-фолбеками) і використовує host-assets за абсолютними шляхами (`/image/dragons/…`, `/svg/arrow_black.svg`), які віддає застосунок-хост — тому в бібліотеці вони навмисно не бандляться (`vite.config` → `transformAssetUrls.includeAbsolute: false`). `vue-virtual-scroller` — зовнішня залежність: встанови її в застосунку-хості.
1147
+ > **Примітка:** компонент розрахований на хост-середовище Skyservice POS. Він читає словник i18n з `window.lang` (з UA-фолбеками) і використовує host-assets за абсолютними шляхами (`/image/dragons/…`, `/svg/arrow_black.svg`), які віддає застосунок-хост — тому в бібліотеці вони навмисно не бандляться (`vite.config` → `transformAssetUrls.includeAbsolute: false`). `@tanstack/vue-virtual` — зовнішня залежність: встанови її в застосунку-хості.
1080
1148
 
1081
1149
  ---
1082
1150
 
@@ -1357,7 +1425,7 @@ src/
1357
1425
  │ ├── SkyBadge/
1358
1426
  │ ├── SkyCard/ SkyCardHeader/ SkyCardRow/
1359
1427
  │ ├── SkyLoader/
1360
- │ ├── table/ # примітиви композиційної таблиці (Root/Header/Head/Body/Row/Cell/Empty)
1428
+ │ ├── table/ # примітиви композиційної таблиці (Root/Header/Head/Body/VirtualBody/Row/Cell/Empty)
1361
1429
  │ ├── SkyTable/ # готова віртуал-скрол таблиця (Header/Row/Footer/DynamicScroller/items/*)
1362
1430
  │ ├── SkyTileCard/
1363
1431
  │ ├── SkyFilterDropdown/ # оболонка фільтра (тригер + панель) + FilterSearch
@@ -1,7 +1,17 @@
1
1
  import { ColumnDef, SortingState, TableFeatures } from '@tanstack/vue-table';
2
2
 
3
+ /** Налаштування віртуалізації тіла — те саме, що приймає SkyTableVirtualBody. */
4
+ export interface SkyDataTableVirtualOptions {
5
+ /** Очікувана висота рядка в px. За замовчуванням 40 — як `--sky-table-row-height`. */
6
+ estimateSize?: number;
7
+ /** Скільки рядків тримати в DOM понад видиме вікно. */
8
+ overscan?: number;
9
+ /** Рядки різної висоти. Вмикає вимірювання рядків — дорожче, лише за потреби. */
10
+ dynamic?: boolean;
11
+ }
3
12
  declare const _default: <TData extends Record<string, any>>(__VLS_props: Awaited<typeof __VLS_setup>["props"], __VLS_ctx?: __VLS_Prettify<Pick<Awaited<typeof __VLS_setup>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
4
13
  props: __VLS_Prettify<__VLS_OmitKeepDiscriminatedUnion<(Partial<{}> & Omit<{
14
+ readonly "onReach-end"?: (() => any) | undefined;
5
15
  readonly "onRow-click"?: ((row: TData) => any) | undefined;
6
16
  } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>) & {
7
17
  /** Опис колонок у форматі TanStack. Ширину беремо з `size` / `meta.widthFr`. */
@@ -23,6 +33,15 @@ declare const _default: <TData extends Record<string, any>>(__VLS_props: Awaited
23
33
  emptyText?: string;
24
34
  /** Курсор-вказівник і hover на рядках. */
25
35
  interactiveRows?: boolean;
36
+ /**
37
+ * Віртуалізація тіла: в DOM лишається тільки видиме вікно рядків.
38
+ * `true` — з дефолтами, обʼєкт — з налаштуваннями.
39
+ *
40
+ * Вимагає обмеженої висоти таблиці й несумісна з `pageSize`: на сторінці
41
+ * в кілька десятків рядків віртуалізувати нічого. Природна пара до неї —
42
+ * не пагінація, а довантаження за подією `reach-end`.
43
+ */
44
+ virtual?: boolean | SkyDataTableVirtualOptions;
26
45
  }, keyof import('vue').VNodeProps | keyof import('vue').AllowedComponentProps>> & {} & (import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps);
27
46
  expose(exposed: import('vue').ShallowUnwrapRef<{
28
47
  table: import('@tanstack/vue-table').VueTable<{
@@ -200,7 +219,7 @@ declare const _default: <TData extends Record<string, any>>(__VLS_props: Awaited
200
219
  }, TData>;
201
220
  }): any;
202
221
  }>;
203
- emit: (evt: "row-click", row: TData) => void;
222
+ emit: ((evt: "reach-end") => void) & ((evt: "row-click", row: TData) => void);
204
223
  }>) => import('vue').VNode & {
205
224
  __ctx?: Awaited<typeof __VLS_setup>;
206
225
  };
@@ -1,2 +1,3 @@
1
1
  export { default as SkyDataTable } from './SkyDataTable.vue';
2
+ export type { SkyDataTableVirtualOptions } from './SkyDataTable.vue';
2
3
  export { default as SkyDataTableColumnToggle } from './SkyDataTableColumnToggle.vue';
@@ -1,9 +1,8 @@
1
-
2
1
  declare function __VLS_template(): {
3
2
  default?(_: {
4
3
  item: any;
5
- index: any;
6
- active: any;
4
+ index: number;
5
+ active: boolean;
7
6
  }): any;
8
7
  };
9
8
  declare const __VLS_component: import('vue').DefineComponent<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
@@ -12,7 +11,10 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
12
11
  keyField?: string;
13
12
  /** Очікувана мінімальна висота рядка — база для розрахунку вікна. */
14
13
  minItemSize?: number;
15
- /** Поля, зміна яких змінює висоту рядка (розкриті модифікації, теги). */
14
+ /**
15
+ * @deprecated Більше ні на що не впливає: висоту рядків тепер стежить
16
+ * ResizeObserver, тож перелічувати залежності вручну не треба.
17
+ */
16
18
  sizeDependencies?: (row: any) => unknown[];
17
19
  }>, {
18
20
  keyField: string;
@@ -26,7 +28,10 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
26
28
  keyField?: string;
27
29
  /** Очікувана мінімальна висота рядка — база для розрахунку вікна. */
28
30
  minItemSize?: number;
29
- /** Поля, зміна яких змінює висоту рядка (розкриті модифікації, теги). */
31
+ /**
32
+ * @deprecated Більше ні на що не впливає: висоту рядків тепер стежить
33
+ * ResizeObserver, тож перелічувати залежності вручну не треба.
34
+ */
30
35
  sizeDependencies?: (row: any) => unknown[];
31
36
  }>, {
32
37
  keyField: string;
@@ -12,6 +12,11 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
12
12
  hint?: string;
13
13
  searchPlaceholder?: string;
14
14
  noResultsText?: string;
15
+ /**
16
+ * Скільки опцій має бути, щоб з'явилось поле пошуку. На коротких списках воно
17
+ * лише заважає — усе видно й так. `0` — показувати завжди, `Infinity` — ніколи.
18
+ */
19
+ searchThreshold?: number;
15
20
  }>, {
16
21
  modelValue: undefined;
17
22
  id: undefined;
@@ -21,6 +26,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
21
26
  hint: string;
22
27
  searchPlaceholder: string;
23
28
  noResultsText: string;
29
+ searchThreshold: number;
24
30
  }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
25
31
  "update:modelValue": (value: string | number) => void;
26
32
  }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
@@ -33,6 +39,11 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
33
39
  hint?: string;
34
40
  searchPlaceholder?: string;
35
41
  noResultsText?: string;
42
+ /**
43
+ * Скільки опцій має бути, щоб з'явилось поле пошуку. На коротких списках воно
44
+ * лише заважає — усе видно й так. `0` — показувати завжди, `Infinity` — ніколи.
45
+ */
46
+ searchThreshold?: number;
36
47
  }>, {
37
48
  modelValue: undefined;
38
49
  id: undefined;
@@ -42,6 +53,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
42
53
  hint: string;
43
54
  searchPlaceholder: string;
44
55
  noResultsText: string;
56
+ searchThreshold: number;
45
57
  }>>> & Readonly<{
46
58
  "onUpdate:modelValue"?: ((value: string | number) => any) | undefined;
47
59
  }>, {
@@ -53,6 +65,7 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
53
65
  state: "success" | "error" | "default";
54
66
  hint: string;
55
67
  noResultsText: string;
68
+ searchThreshold: number;
56
69
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
57
70
  export default _default;
58
71
  type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
@@ -7,8 +7,8 @@ declare const __VLS_component: import('vue').DefineComponent<{}, {
7
7
  $emit: (event: "checkbox" | "open" | "selectUpdate" | "inputEdit" | "openContext" | "openTagsModal" | "deleteTag" | "deleteRow" | "shrink" | "expand", ...args: any[]) => void;
8
8
  selected: unknown[];
9
9
  index: number;
10
- item: Record<string, any>;
11
10
  params: Record<string, any>;
11
+ item: Record<string, any>;
12
12
  selectedColumns: Record<string, any>;
13
13
  widthColumns: Record<string, any>;
14
14
  tableViewExpanded: boolean;
@@ -17,8 +17,8 @@ declare const __VLS_component: import('vue').DefineComponent<{}, {
17
17
  $props: {
18
18
  readonly selected?: unknown[] | undefined;
19
19
  readonly index?: number | undefined;
20
- readonly item?: Record<string, any> | undefined;
21
20
  readonly params?: Record<string, any> | undefined;
21
+ readonly item?: Record<string, any> | undefined;
22
22
  readonly selectedColumns?: Record<string, any> | undefined;
23
23
  readonly widthColumns?: Record<string, any> | undefined;
24
24
  readonly tableViewExpanded?: boolean | undefined;
@@ -8,15 +8,15 @@ declare const __VLS_component: import('vue').DefineComponent<{}, {
8
8
  name: string;
9
9
  section: string;
10
10
  index: number;
11
- item: Record<string, any>;
12
11
  params: Record<string, any>;
12
+ item: Record<string, any>;
13
13
  widthFlex: string;
14
14
  $props: {
15
15
  readonly name?: string | undefined;
16
16
  readonly section?: string | undefined;
17
17
  readonly index?: number | undefined;
18
- readonly item?: Record<string, any> | undefined;
19
18
  readonly params?: Record<string, any> | undefined;
19
+ readonly item?: Record<string, any> | undefined;
20
20
  readonly widthFlex?: string | undefined;
21
21
  };
22
22
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
@@ -42,8 +42,8 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
42
42
  };
43
43
  }>> & Readonly<{}>, {
44
44
  index: number;
45
- item: Record<string, any>;
46
45
  params: Record<string, any>;
46
+ item: Record<string, any>;
47
47
  widthFlex: string;
48
48
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
49
49
  export default _default;
@@ -1,13 +1,13 @@
1
1
  declare const _default: import('vue').DefineComponent<{}, {
2
2
  $emit: (event: "selectUpdate", ...args: any[]) => void;
3
3
  index: number;
4
- item: Record<string, any>;
5
4
  params: Record<string, any>;
5
+ item: Record<string, any>;
6
6
  widthFlex: string;
7
7
  $props: {
8
8
  readonly index?: number | undefined;
9
- readonly item?: Record<string, any> | undefined;
10
9
  readonly params?: Record<string, any> | undefined;
10
+ readonly item?: Record<string, any> | undefined;
11
11
  readonly widthFlex?: string | undefined;
12
12
  };
13
13
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
@@ -1,11 +1,11 @@
1
1
  declare const _default: import('vue').DefineComponent<{}, {
2
2
  $emit: (event: "inputEdit", ...args: any[]) => void;
3
- item: Record<string, any>;
4
3
  params: Record<string, any>;
4
+ item: Record<string, any>;
5
5
  widthFlex: string;
6
6
  $props: {
7
- readonly item?: Record<string, any> | undefined;
8
7
  readonly params?: Record<string, any> | undefined;
8
+ readonly item?: Record<string, any> | undefined;
9
9
  readonly widthFlex?: string | undefined;
10
10
  };
11
11
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
@@ -42,8 +42,8 @@ declare const _default: import('vue').DefineComponent<import('vue').ExtractPropT
42
42
  };
43
43
  }>> & Readonly<{}>, {
44
44
  index: number;
45
- item: Record<string, any>;
46
45
  params: Record<string, any>;
46
+ item: Record<string, any>;
47
47
  widthFlex: string;
48
48
  }, {}, {
49
49
  TagsInput: import('vue').DefineComponent<import('vue').ExtractPropTypes<{
@@ -1,11 +1,2 @@
1
- declare function __VLS_template(): {
2
- default?(_: {}): any;
3
- };
4
- declare const __VLS_component: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
5
- declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
1
+ declare const _default: boolean;
6
2
  export default _default;
7
- type __VLS_WithTemplateSlots<T, S> = T & {
8
- new (): {
9
- $slots: S;
10
- };
11
- };
@@ -0,0 +1,43 @@
1
+ declare const _default: <TRow>(__VLS_props: Awaited<typeof __VLS_setup>["props"], __VLS_ctx?: __VLS_Prettify<Pick<Awaited<typeof __VLS_setup>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
2
+ props: __VLS_Prettify<__VLS_OmitKeepDiscriminatedUnion<(Partial<{}> & Omit<{
3
+ readonly "onReach-end"?: (() => any) | undefined;
4
+ } & import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, never>) & {
5
+ /** Рядки. На відміну від SkyTableBody тут вони обовʼязкові. */
6
+ rows: TRow[];
7
+ /** Ключ рядка. Індекс за замовчуванням — лише для статичних списків. */
8
+ rowKey?: (row: TRow, index: number) => string | number;
9
+ /** Очікувана висота рядка в px — база для розрахунку вікна. */
10
+ estimateSize?: number;
11
+ /** Скільки рядків тримати в DOM понад видиме вікно. */
12
+ overscan?: number;
13
+ /**
14
+ * Рядки різної висоти (перенос тексту, розкриті деталі). Вмикає вимірювання
15
+ * кожного видимого рядка через ResizeObserver — точно, але дорожче.
16
+ * Якщо висота фіксована, лишайте `false`: тоді геометрія рахується
17
+ * арифметикою, без жодного читання з DOM.
18
+ */
19
+ dynamic?: boolean;
20
+ }, keyof import('vue').VNodeProps | keyof import('vue').AllowedComponentProps>> & {} & (import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps);
21
+ expose(exposed: import('vue').ShallowUnwrapRef<{}>): void;
22
+ attrs: any;
23
+ slots: ReturnType<() => Readonly<{
24
+ default(props: {
25
+ row: TRow;
26
+ index: number;
27
+ }): unknown;
28
+ empty(): unknown;
29
+ }> & {
30
+ default(props: {
31
+ row: TRow;
32
+ index: number;
33
+ }): unknown;
34
+ empty(): unknown;
35
+ }>;
36
+ emit: (evt: "reach-end") => void;
37
+ }>) => import('vue').VNode & {
38
+ __ctx?: Awaited<typeof __VLS_setup>;
39
+ };
40
+ export default _default;
41
+ type __VLS_Prettify<T> = {
42
+ [K in keyof T]: T[K];
43
+ } & {};
@@ -2,6 +2,7 @@ export { default as SkyTableRoot } from './SkyTableRoot.vue';
2
2
  export { default as SkyTableHeader } from './SkyTableHeader.vue';
3
3
  export { default as SkyTableHead } from './SkyTableHead.vue';
4
4
  export { default as SkyTableBody } from './SkyTableBody.vue';
5
+ export { default as SkyTableVirtualBody } from './SkyTableVirtualBody.vue';
5
6
  export { default as SkyTableRow } from './SkyTableRow.vue';
6
7
  export { default as SkyTableCell } from './SkyTableCell.vue';
7
8
  export { default as SkyTableEmpty } from './SkyTableEmpty.vue';