@skyservice-developers/vue-dev-kit 2.10.1 → 2.12.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.
Files changed (50) hide show
  1. package/README.md +292 -37
  2. package/dist/features/data-table/SkyDataTable.vue.d.ts +210 -0
  3. package/dist/features/data-table/SkyDataTableColumnToggle.vue.d.ts +36 -0
  4. package/dist/features/data-table/index.d.ts +2 -0
  5. package/dist/features/index.d.ts +2 -0
  6. package/dist/features/table/TableColumnSettings.vue.d.ts +31 -0
  7. package/dist/features/table/TableMassActions.vue.d.ts +56 -0
  8. package/dist/features/table/TableVirtualBody.vue.d.ts +65 -0
  9. package/dist/features/table/index.d.ts +3 -0
  10. package/dist/index.d.ts +1 -0
  11. package/dist/shared/lib/table/index.d.ts +8 -0
  12. package/dist/shared/lib/table/tableFeatures.d.ts +110 -0
  13. package/dist/shared/lib/table/useColumnVisibility.d.ts +29 -0
  14. package/dist/shared/lib/table/useTableSelection.d.ts +34 -0
  15. package/dist/shared/lib/table/useTableSort.d.ts +28 -0
  16. package/dist/shared/ui/Dialog/Dialog.vue.d.ts +1 -4
  17. package/dist/shared/ui/DialogModal/DialogModal.vue.d.ts +3 -0
  18. package/dist/shared/ui/DialogNext/DialogNext.vue.d.ts +3 -0
  19. package/dist/shared/ui/Modal/Modal.vue.d.ts +3 -0
  20. package/dist/shared/ui/SkyDateRangePicker/SkyDateRangePicker.vue.d.ts +749 -0
  21. package/dist/shared/ui/SkyDateRangePicker/index.d.ts +1 -0
  22. package/dist/shared/ui/SkyTable/DynamicScroller.vue.d.ts +2 -2
  23. package/dist/shared/ui/SkyTable/Row.vue.d.ts +2 -2
  24. package/dist/shared/ui/SkyTable/items/itemDefault.vue.d.ts +2 -2
  25. package/dist/shared/ui/SkyTable/items/itemInput.vue.d.ts +1 -1
  26. package/dist/shared/ui/SkyTable/items/itemSelect.vue.d.ts +2 -2
  27. package/dist/shared/ui/SkyTable/items/itemTagEditor.vue.d.ts +2 -2
  28. package/dist/shared/ui/SkyTable/items/itemTags.vue.d.ts +1 -1
  29. package/dist/shared/ui/functional-calendar/components/Arrows.vue.d.ts +49 -0
  30. package/dist/shared/ui/functional-calendar/components/Day.vue.d.ts +81 -0
  31. package/dist/shared/ui/functional-calendar/components/Footer.vue.d.ts +2 -0
  32. package/dist/shared/ui/functional-calendar/components/FunctionalCalendar.vue.d.ts +554 -0
  33. package/dist/shared/ui/functional-calendar/components/MonthYearPicker.vue.d.ts +27 -0
  34. package/dist/shared/ui/functional-calendar/components/PickerInputs.vue.d.ts +41 -0
  35. package/dist/shared/ui/functional-calendar/components/TimePicker.vue.d.ts +23 -0
  36. package/dist/shared/ui/functional-calendar/components/WeekNumbers.vue.d.ts +22 -0
  37. package/dist/shared/ui/index.d.ts +3 -0
  38. package/dist/shared/ui/table/SkyTableBody.vue.d.ts +11 -0
  39. package/dist/shared/ui/table/SkyTableCell.vue.d.ts +45 -0
  40. package/dist/shared/ui/table/SkyTableEmpty.vue.d.ts +39 -0
  41. package/dist/shared/ui/table/SkyTableHead.vue.d.ts +34 -0
  42. package/dist/shared/ui/table/SkyTableHeader.vue.d.ts +40 -0
  43. package/dist/shared/ui/table/SkyTableRoot.vue.d.ts +50 -0
  44. package/dist/shared/ui/table/SkyTableRow.vue.d.ts +49 -0
  45. package/dist/shared/ui/table/index.d.ts +9 -0
  46. package/dist/shared/ui/table/types.d.ts +36 -0
  47. package/dist/style.css +1 -1
  48. package/dist/vue-dev-kit.cjs +14 -12
  49. package/dist/vue-dev-kit.js +11879 -8743
  50. package/package.json +11 -2
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Vue 3 developer toolkit для Skyservice mini-apps: UI компоненти + TypeScript SDK (iframe bridge + HTTP API клієнт).
4
4
 
5
+ 📖 **Документація з живими демо:** https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/
6
+
5
7
  > **v2.0.0 breaking changes:**
6
8
  > - Vue 2 більше не підтримується (тільки Vue 3.4+).
7
9
  > - Додано повноцінний SDK (`bridge` + `SkyserviceAPI`), раніше опублікований як окремий пакет `skyservice-sdk` (задепрекейтнутий).
@@ -22,14 +24,20 @@ import '@skyservice-developers/vue-dev-kit/style.css'
22
24
  import {
23
25
  // shared/ui
24
26
  Header, Modal, Dialog,
25
- SkyButton, SkySelect, SkySelectSearch, SkyInput, SkySearchInput, SkyCheckbox,
27
+ SkyButton, SkySelect, SkySelectSearch, SkyInput, SkySearchInput, SkyCheckbox, SkyTabs,
26
28
  SkyAlert, SkyBadge, SkyLoader,
27
29
  SkyCard, SkyCardHeader, SkyCardRow,
28
30
  SkyTable,
31
+ // грід на TanStack + примітиви таблиці + композабли
32
+ SkyDataTable, createSkyColumnHelper, skyTableFeatures,
33
+ SkyTableRoot, SkyTableHeader, SkyTableHead, SkyTableBody, SkyTableRow, SkyTableCell,
34
+ useTableSort, useTableSelection, useColumnVisibility,
35
+ FunctionalCalendar, SkyDateRangePicker,
29
36
  // widgets
30
37
  SkyTileCard,
31
38
  // features
32
39
  SkyCheckboxFilter,
40
+ TableMassActions, TableColumnSettings, TableVirtualBody,
33
41
  // sdk
34
42
  navigate, SkyserviceAPI, isInsideIframe,
35
43
  // sky-service-ui-components
@@ -209,6 +217,24 @@ import {
209
217
  </Modal>
210
218
  ```
211
219
 
220
+ Шапку можна зібрати слотами — так само як у `Header`: `#title` / `#subtitle`
221
+ перекривають відповідні props, `#header-actions` додає елементи справа
222
+ (кнопка "Назад" лишається на місці).
223
+
224
+ ```vue
225
+ <Modal v-model="show">
226
+ <template #title>
227
+ <h4 style="margin: 0">Замовлення №1042 <SkyBadge tone="success" label="Оплачено" /></h4>
228
+ </template>
229
+ <template #subtitle>Оновлено щойно</template>
230
+ <template #header-actions>
231
+ <SkyButton variant="outline">Друк</SkyButton>
232
+ </template>
233
+
234
+ <p>Контент</p>
235
+ </Modal>
236
+ ```
237
+
212
238
  #### Props
213
239
 
214
240
  | Prop | Тип | За замовчуванням | Опис |
@@ -227,8 +253,17 @@ import {
227
253
  | Slot | Опис |
228
254
  |------|------|
229
255
  | `default` | Основний контент |
256
+ | `title` | Кастомний заголовок (замість пропа `title`) |
257
+ | `subtitle` | Кастомний підзаголовок (замість пропа `subtitle`) |
258
+ | `header-actions` | Елементи справа в шапці (кнопки, бейджі) |
230
259
  | `footer` | Футер з кнопками |
231
260
 
261
+ #### CSS змінні
262
+
263
+ | Змінна | За замовчуванням | Опис |
264
+ |--------|------------------|------|
265
+ | `--sky-modal-header-actions-gap` | `8px` | Відступ між елементами в `#header-actions` |
266
+
232
267
  #### Events
233
268
 
234
269
  | Event | Опис |
@@ -271,8 +306,33 @@ import {
271
306
  | Slot | Опис |
272
307
  |------|------|
273
308
  | `default` | Основний контент |
309
+ | `title` | Кастомний заголовок (замість пропа `title`) |
310
+ | `subtitle` | Кастомний підзаголовок (замість пропа `subtitle`) |
311
+ | `header-actions` | Елементи справа в шапці (кнопки, бейджі) |
274
312
  | `buttons` | Кнопки у футері |
275
313
 
314
+ Слоти шапки працюють в обох режимах — `next` (ліворуч кнопка "Назад") і
315
+ `classic` (праворуч ×); `#header-actions` рендериться ліворуч від ×.
316
+
317
+ ```vue
318
+ <Dialog v-model="show" mode="next">
319
+ <template #title>Замовлення №1042</template>
320
+ <template #subtitle>3 позиції · 1 240 ₴</template>
321
+ <template #header-actions>
322
+ <SkyButton variant="outline">Друк</SkyButton>
323
+ </template>
324
+
325
+ <div style="padding: 20px">Контент</div>
326
+ </Dialog>
327
+ ```
328
+
329
+ #### CSS змінні
330
+
331
+ | Змінна | За замовчуванням | Опис |
332
+ |--------|------------------|------|
333
+ | `--sky-dialog-header-actions-gap` | `8px` | Відступ між елементами в `#header-actions` |
334
+ | `--sky-dialog-title-max-width-with-actions` | `50%` | Ширина заголовка в `classic`, коли є `#header-actions` |
335
+
276
336
  #### Events
277
337
 
278
338
  | Event | Опис |
@@ -329,60 +389,47 @@ import {
329
389
 
330
390
  ### SkySelect
331
391
 
332
- Кастомний select з дропдауном, клавіатурною навігацією та підтримкою рядків і об'єктів як опцій.
392
+ Нативний `<select>` у фірмовому стилі, зі станами `default | success | error` та підказкою під полем.
333
393
 
334
394
  ```vue
335
- <!-- Об'єкти -->
336
395
  <SkySelect
337
- v-model="selected"
396
+ v-model="payment"
338
397
  :options="[
339
- { label: 'Готівка', value: 'cash' },
340
- { label: 'Картка', value: 'card' },
398
+ { value: 'cash', text: 'Готівка' },
399
+ { value: 'card', text: 'Картка' },
341
400
  ]"
342
401
  placeholder="Оберіть спосіб оплати"
343
402
  />
344
403
 
345
- <!-- Рядки -->
346
- <SkySelect v-model="selected" :options="['Кг', 'Шт', 'Л']" />
347
-
348
- <!-- На всю ширину -->
349
- <SkySelect v-model="selected" :options="options" block />
404
+ <SkySelect v-model="payment" :options="options" state="error" hint="Оберіть спосіб" />
405
+ <SkySelect v-model="payment" :options="options" disabled />
350
406
  ```
351
407
 
352
408
  #### Props
353
409
 
354
410
  | Prop | Тип | За замовчуванням | Опис |
355
411
  |------|-----|------------------|------|
356
- | `modelValue` / `value` | `any` | `null` | Поточне значення (v-model) |
357
- | `options` | `Array` | `[]` | `Array<{ label, value } \| string>` |
358
- | `placeholder` | `String` | `''` | Текст-заглушка |
412
+ | `modelValue` | `string \| number` | — | Поточне значення (v-model) |
413
+ | `options` | `Array<{ value: string \| number; text: string }>` | — | Список опцій (обов'язковий) |
414
+ | `id` | `String` | — | HTML id |
359
415
  | `disabled` | `Boolean` | `false` | Вимкнений стан |
360
- | `block` | `Boolean` | `false` | Повна ширина |
361
- | `teleport` | `Boolean` | `false` | Рендерить дропдаун в `<body>` (для модалок/overflow:hidden контейнерів) |
416
+ | `state` | `'default' \| 'success' \| 'error'` | `'default'` | Візуальний стан рамки |
417
+ | `placeholder` | `String` | `''` | Текст-заглушка (рендериться як `disabled hidden` опція) |
418
+ | `hint` | `String` | `''` | Підказка під полем у кольорі `state` |
362
419
 
363
- #### Клавіатура
420
+ #### Events
364
421
 
365
- | Клавіша | Дія |
366
- |---------|-----|
367
- | `Enter` / `Space` | Відкрити дропдаун |
368
- | `↑` / `↓` | Навігація по опціях |
369
- | `Enter` | Вибрати поточну опцію |
370
- | `Esc` | Закрити дропдаун |
422
+ | Event | Payload | Опис |
423
+ |-------|---------|------|
424
+ | `update:modelValue` | `string \| number` | Emit при виборі опції |
371
425
 
372
- #### CSS змінні
426
+ > **Формат опцій — тільки `{ value, text }`.** Масив рядків або `{ label, value }` дадуть порожні пункти:
427
+ > компонент читає `option.value` і `option.text`. Мапте дані заздалегідь — `units.map(u => ({ value: u, text: u }))`.
373
428
 
374
- ```css
375
- --sky-select-padding: 10px 14px
376
- --sky-select-radius: 6px
377
- --sky-select-font-size: 14px
378
- --sky-select-border: 1px solid #d1d5db
379
- --sky-select-dropdown-shadow: 0 4px 12px rgba(0,0,0,0.1)
380
- --sky-select-dropdown-max-height: 220px
381
- --sky-select-option-hover-bg: #f3f4f6
382
- --sky-select-option-selected-color: #24973f
383
- ```
429
+ > Список малює браузер, тож клавіатура й поведінка на мобільних — рідні для платформи, а дропдаун
430
+ > не обрізається контейнерами з `overflow: hidden` (усередині `Modal` teleport не потрібен).
431
+ > Компонент займає всю ширину контейнера — обмежуйте батьківський блок, якщо треба вужче.
384
432
 
385
- ---
386
433
 
387
434
  ### SkySelectSearch
388
435
 
@@ -527,6 +574,39 @@ import {
527
574
 
528
575
  ---
529
576
 
577
+ ### SkyTabs
578
+
579
+ Сегментовані таби з анімованим індикатором: біла «пігулка» плавно переїжджає під активну опцію й підлаштовує ширину під довжину тексту.
580
+
581
+ ```vue
582
+ <SkyTabs
583
+ v-model="period"
584
+ :options="[
585
+ { value: 'day', text: 'День' },
586
+ { value: 'week', text: 'Тиждень' },
587
+ { value: 'month', text: 'Місяць' },
588
+ ]"
589
+ />
590
+ ```
591
+
592
+ #### Props
593
+
594
+ | Prop | Тип | За замовчуванням | Опис |
595
+ |------|-----|------------------|------|
596
+ | `modelValue` | `string \| number` | — | Активне значення (v-model) |
597
+ | `options` | `Array<{ value: string \| number; text: string }>` | — | Список табів (обов'язковий) |
598
+ | `disabled` | `Boolean` | `false` | Блокує весь набір |
599
+
600
+ #### Events
601
+
602
+ | Event | Payload | Опис |
603
+ |-------|---------|------|
604
+ | `update:modelValue` | `string \| number` | Emit при виборі таба |
605
+
606
+ > Індикатор вимірює активну кнопку через `getBoundingClientRect()`: на першому рендері стає на місце без анімації, далі — з переходом. Реагує на `resize` вікна і зміну кількості опцій. У прихованому контейнері (`display: none`) розміри нульові — позиція виправиться після показу.
607
+
608
+ ---
609
+
530
610
  ### SkyAlert
531
611
 
532
612
  Інформаційне повідомлення з 4 тональностями та опціональною іконкою.
@@ -779,6 +859,129 @@ Shell-контейнер для карток: ribbon / header / body / footer
779
859
 
780
860
  ---
781
861
 
862
+ ### SkyDataTable
863
+
864
+ Грід на [TanStack Table v9](https://tanstack.com/table/latest): headless-ядро тримає стан і обчислення, розмітка й стилі — наші. Візуально це та сама таблиця, що в POS. Повний опис — у [документації](https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/components/data-table).
865
+
866
+ ```vue
867
+ <script setup lang="ts">
868
+ import { h } from 'vue'
869
+ import { SkyDataTable, SkyBadge, createSkyColumnHelper } from '@skyservice-developers/vue-dev-kit'
870
+
871
+ const column = createSkyColumnHelper<Product>()
872
+
873
+ const columns = [
874
+ column.accessor('name', { header: 'Назва', meta: { widthFr: 2 } }),
875
+ column.accessor('price', {
876
+ header: 'Ціна',
877
+ size: 110,
878
+ meta: { align: 'right' },
879
+ cell: ({ getValue }) => `${getValue()} ₴`,
880
+ }),
881
+ column.accessor('status', {
882
+ header: 'Статус',
883
+ size: 150,
884
+ enableSorting: false,
885
+ cell: ({ getValue }) =>
886
+ h(SkyBadge, { tone: getValue() === 'Активний' ? 'success' : 'default', label: getValue() }),
887
+ }),
888
+ ]
889
+ </script>
890
+
891
+ <template>
892
+ <SkyDataTable :columns="columns" :data="products" :page-size="25" row-id="id" searchable />
893
+ </template>
894
+ ```
895
+
896
+ #### Props
897
+
898
+ | Prop | Тип | За замовчуванням | Опис |
899
+ |------|-----|------------------|------|
900
+ | `columns` | `ColumnDef[]` | — | Опис колонок (TanStack) |
901
+ | `data` | `TData[]` | — | Дані |
902
+ | `features` | `TableFeatures` | `skyTableFeatures` | Власний набір фіч |
903
+ | `rowId` | `String \| (row) => string` | — | Ключ рядка |
904
+ | `pageSize` | `Number` | `0` | Розмір сторінки; `0` — без пагінації |
905
+ | `searchable` | `Boolean` | `false` | Поле глобального пошуку в тулбарі |
906
+ | `initialSorting` | `SortingState` | — | Початкове сортування |
907
+ | `emptyText` | `String` | `'Даних немає'` | Текст порожнього стану |
908
+ | `interactiveRows` | `Boolean` | `false` | Курсор і hover на рядках |
909
+
910
+ Слоти: `toolbar`, `actions`, `footer`, `empty` (усі отримують `{ table }`). Подія: `row-click`. Інстанс таблиці доступний через `ref` → `tableRef.table`.
911
+
912
+ #### Набір фіч
913
+
914
+ Фічі TanStack v9 вмикаються явно — кіт експортує стабільний `skyTableFeatures` (сортування, вибір, видимість колонок, пагінація, фільтрація + слоти row-моделей і реєстри `sortFns`/`filterFns`). Потрібно більше — зберіть свій обʼєкт і передайте пропом `features`:
915
+
916
+ ```ts
917
+ import { tableFeatures, rowExpandingFeature, createExpandedRowModel } from '@tanstack/vue-table'
918
+ import { skyTableFeatures } from '@skyservice-developers/vue-dev-kit'
919
+
920
+ const features = tableFeatures({
921
+ ...skyTableFeatures,
922
+ rowExpandingFeature,
923
+ expandedRowModel: createExpandedRowModel(),
924
+ })
925
+ ```
926
+
927
+ Ширина колонок: `size: 150` — фіксовані px, `meta: { widthFr: 2 }` — гнучка частка (має пріоритет над `size`), `meta: { align }` і `meta: { minWidthScreen }` — вирівнювання й приховування на вузьких екранах.
928
+
929
+ > `@tanstack/vue-table` входить у залежності пакета й лишається зовнішнім у бандлі — застосунки, які гріда не використовують, його не тягнуть.
930
+
931
+ ---
932
+
933
+ ### Таблиця з примітивів (композиційна)
934
+
935
+ Набір примітивів і композаблів замість одного великого компонента: береш тільки те, що треба. Без вибору рядків, без масових дій, без віртуалізації — і нічого з цього не потрапляє в бандл. Повний опис — у [документації](https://74cfe434-a2b3-4d49-8fa7-db7343e399dc.apps.platform365.online/components/table).
936
+
937
+ ```vue
938
+ <script setup>
939
+ import {
940
+ SkyTableRoot, SkyTableHeader, SkyTableHead,
941
+ SkyTableBody, SkyTableRow, SkyTableCell,
942
+ } from '@skyservice-developers/vue-dev-kit'
943
+
944
+ const columns = [
945
+ { name: 'name', title: 'Товар', widthFr: 2 },
946
+ { name: 'price', title: 'Ціна', width: 90, align: 'right' },
947
+ ]
948
+ </script>
949
+
950
+ <template>
951
+ <SkyTableRoot :columns="columns">
952
+ <SkyTableHeader>
953
+ <SkyTableHead v-for="c in columns" :key="c.name" :column="c" />
954
+ </SkyTableHeader>
955
+ <SkyTableBody>
956
+ <SkyTableRow v-for="row in rows" :key="row.id">
957
+ <SkyTableCell>{{ row.name }}</SkyTableCell>
958
+ <SkyTableCell align="right">{{ row.price }}</SkyTableCell>
959
+ </SkyTableRow>
960
+ </SkyTableBody>
961
+ </SkyTableRoot>
962
+ </template>
963
+ ```
964
+
965
+ #### Що входить
966
+
967
+ | Шар | Експорти | Коли підключати |
968
+ |-----|----------|-----------------|
969
+ | Примітиви (`shared/ui/table`) | `SkyTableRoot`, `SkyTableHeader`, `SkyTableHead`, `SkyTableBody`, `SkyTableRow`, `SkyTableCell`, `SkyTableEmpty` | завжди |
970
+ | Композабли (`shared/lib/table`) | `useTableSort`, `useTableSelection`, `useColumnVisibility` | за потреби |
971
+ | Фічі (`features/table`) | `TableMassActions`, `TableColumnSettings`, `TableVirtualBody` | опційно, кожна окремо |
972
+
973
+ ```ts
974
+ const { sort, toggle } = useTableSort({ initial: { of: 'name', ot: 'asc' } })
975
+ const { selected, isSelected, toggle: select, toggleAll } = useTableSelection(rows, { rowId: 'id' })
976
+ const { visibility, visibleColumns } = useColumnVisibility(columns, { storageKey: 'products' })
977
+ ```
978
+
979
+ Композабли не сортують і не фільтрують дані — вони тримають стан, а дані лишаються за застосунком (зазвичай сортує сервер). Колонка вибору описується як звичайна колонка (`{ name: '_select', width: 44 }`), щоб грід шапки й рядків рахувався з одного джерела.
980
+
981
+ > `vue-virtual-scroller` імпортує лише `TableVirtualBody`. Не потрібна віртуалізація — беріть `SkyTableBody`, і залежність не знадобиться.
982
+
983
+ ---
984
+
782
985
  ### SkyTable
783
986
 
784
987
  Віртуал-скрол таблиця (на `vue-virtual-scroller`) для великих списків — у DOM тримаються лише видимі рядки. Розмітка й стилі 1:1 з таблицею товарів POS: чекбокси, масові дії, сортування, зміна ширини/видимості колонок, розкриття вкладених рядків (модифікацій), inline-редагування комірок і теги.
@@ -875,6 +1078,33 @@ const json = { items, total: items.length }
875
1078
 
876
1079
  ---
877
1080
 
1081
+ ### FunctionalCalendar
1082
+
1083
+ Перенесено зі SkyMarket (`src/lib/functional-calendar`), стилі й розмітка 1:1. Форк [vue-functional-calendar](https://github.com/ManukMinasyan/vue-functional-calendar) під Vue 3 — пропси, події та слоти без змін відносно оригіналу.
1084
+
1085
+ ```vue
1086
+ <FunctionalCalendar
1087
+ :value="calendarData"
1088
+ @input="calendarData = $event"
1089
+ is-date-range
1090
+ is-modal
1091
+ />
1092
+ ```
1093
+
1094
+ ### SkyDateRangePicker
1095
+
1096
+ Перенесено зі SkyMarket (`DatePickerRange.vue`) — готовий попап-піка діапазону дат на базі `FunctionalCalendar`: іконка-тригер, лейбл періоду, пресети (Сьогодні / Вчора / Тиждень / Місяць / Минулий-Поточний місяць / За весь час), стилі 1:1. На відміну від оригіналу, який читав `store`/`@/langs` конкретного застосунку, тут стан і тексти (з UA-фолбеками) локальні.
1097
+
1098
+ ```vue
1099
+ <SkyDateRangePicker v-model="range" @set-date="onPreset" />
1100
+ ```
1101
+
1102
+ ```js
1103
+ const range = reactive({ start: '', end: '' }) // { start, end } у форматі yyyy-mm-dd
1104
+ ```
1105
+
1106
+ ---
1107
+
878
1108
  ## Features
879
1109
 
880
1110
  ### SkyCheckboxFilter
@@ -1008,6 +1238,23 @@ npm run playground
1008
1238
  npm run build
1009
1239
  ```
1010
1240
 
1241
+ ## Реліз
1242
+
1243
+ Публікація на npm автоматична — пуш у `main` запускає GitHub Action
1244
+ `Publish to npm`, який збирає й публікує пакет. Руками `npm publish` не запускати.
1245
+
1246
+ | Що треба | Що зробити |
1247
+ | --- | --- |
1248
+ | Випустити нову версію | Бампнути `version` у `package.json` → змержити в `main` |
1249
+ | Залити зміни без релізу | Не чіпати `version` — публікація пропуститься, CI лишиться зеленим |
1250
+ | Опублікувати вручну | Actions → Publish to npm → Run workflow |
1251
+
1252
+ Публікація пропускається, якщо версія з `package.json` уже є в реєстрі. Пуші, що
1253
+ зачіпають лише `**.md` або `.github/**`, воркфлоу не запускають — для них
1254
+ є ручний запуск.
1255
+
1256
+ Поки версію не бампнули, споживачі змін не бачать: npm далі віддає попередню.
1257
+
1011
1258
  ## Структура проекту
1012
1259
 
1013
1260
  Організовано за Feature-Sliced Design:
@@ -1028,18 +1275,26 @@ src/
1028
1275
  │ ├── BaseTeleport/
1029
1276
  │ ├── SkyButton/
1030
1277
  │ ├── SkySelect/ SkySelectSearch/ SkyInput/ SkySearchInput/ SkyCheckbox/
1278
+ │ ├── SkyTabs/ # сегментовані таби з анімованим індикатором
1031
1279
  │ ├── SkyAlert/
1032
1280
  │ ├── SkyBadge/
1033
1281
  │ ├── SkyCard/ SkyCardHeader/ SkyCardRow/
1034
1282
  │ ├── SkyLoader/
1035
- │ ├── SkyTable/ # віртуал-скрол таблиця (Header/Row/Footer/DynamicScroller/items/*)
1283
+ │ ├── table/ # примітиви композиційної таблиці (Root/Header/Head/Body/Row/Cell/Empty)
1284
+ │ ├── SkyTable/ # готова віртуал-скрол таблиця (Header/Row/Footer/DynamicScroller/items/*)
1036
1285
  │ ├── SkyTileCard/
1286
+ │ ├── functional-calendar/ # форк vue-functional-calendar, перенесений зі SkyMarket 1:1
1287
+ │ ├── SkyDateRangePicker/ # DatePickerRange зі SkyMarket, store/langs → props/локальний стан
1037
1288
  │ └── <Component>/
1038
1289
  │ ├── <Component>.vue
1039
1290
  │ └── index.ts
1291
+ │ └── lib/
1292
+ │ └── table/ # skyTableFeatures + useTableSort / useTableSelection / useColumnVisibility
1040
1293
  ├── features/ # фічові блоки (orchestration shared/ui)
1041
1294
  │ ├── index.ts
1042
- │ └── SkyCheckboxFilter/
1295
+ │ ├── SkyCheckboxFilter/
1296
+ │ ├── table/ # TableMassActions / TableColumnSettings / TableVirtualBody
1297
+ │ └── data-table/ # SkyDataTable на TanStack v9 + перемикач колонок
1043
1298
  ├── sdk/ # TypeScript SDK (без Vue залежностей)
1044
1299
  │ ├── bridge.ts # iframe postMessage API
1045
1300
  │ ├── api.ts # SkyserviceAPI HTTP клієнт