ics-ui-kit 0.1.12 → 0.1.14

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 (295) hide show
  1. package/README.md +36 -36
  2. package/dist/AlertContext-CxjW1LVL.js.map +1 -1
  3. package/dist/{AlertIcon-5B6AgZpe.js → AlertIcon-BphnEYvV.js} +3 -3
  4. package/dist/AlertIcon-BphnEYvV.js.map +1 -0
  5. package/dist/Button-Dg89xRSi.js.map +1 -1
  6. package/dist/ButtonBase-e6qyv6mD.js.map +1 -1
  7. package/dist/{CheckboxField-cX09-eBX.js → CheckboxField-2zNFubvm.js} +2 -2
  8. package/dist/CheckboxField-2zNFubvm.js.map +1 -0
  9. package/dist/Combination-DeIugdgY.js +353 -0
  10. package/dist/Combination-DeIugdgY.js.map +1 -0
  11. package/dist/{Command-ClIm4U7r.js → Command-D5zgJ7-y.js} +3 -3
  12. package/dist/Command-D5zgJ7-y.js.map +1 -0
  13. package/dist/ComponentVariantProvider-brk0g-hm.js.map +1 -1
  14. package/dist/Description-BTPMlTT-.js.map +1 -1
  15. package/dist/{Dialog-Bs1B5Iu8.js → Dialog-CdnsGyJD.js} +3 -3
  16. package/dist/Dialog-CdnsGyJD.js.map +1 -0
  17. package/dist/Divider-DPW5ZhZ8.js.map +1 -1
  18. package/dist/EmptyState-DRKjscH-.js.map +1 -1
  19. package/dist/ErrorState-B26k67-z.js.map +1 -1
  20. package/dist/FeatureIcon-BGE0Orkc.js.map +1 -1
  21. package/dist/Field-CP_-li9L.js +90 -0
  22. package/dist/Field-CP_-li9L.js.map +1 -0
  23. package/dist/{FieldLabel-QJ4rJFOi.js → FieldLabel-eyKmeWRn.js} +2 -2
  24. package/dist/FieldLabel-eyKmeWRn.js.map +1 -0
  25. package/dist/FolderSvg-cw0DxNVy.js.map +1 -1
  26. package/dist/{FormFooterTemplate-DPB6Dkxn.js → FormFooterTemplate-Cfn5Nmge.js} +3 -3
  27. package/dist/FormFooterTemplate-Cfn5Nmge.js.map +1 -0
  28. package/dist/FormHeader--F6b2aRk.js.map +1 -1
  29. package/dist/{FormStack-DO15vBgd.js → FormStack-Cc_ELdWL.js} +3 -3
  30. package/dist/FormStack-Cc_ELdWL.js.map +1 -0
  31. package/dist/HintState-BxrCAWqq.js.map +1 -1
  32. package/dist/Icon-DH3ev9GK.js.map +1 -1
  33. package/dist/IconButton-DwkpNgn3.js.map +1 -1
  34. package/dist/{IconTooltip-CKJKGHbk.js → IconTooltip-RSxvnBgH.js} +2 -2
  35. package/dist/IconTooltip-RSxvnBgH.js.map +1 -0
  36. package/dist/Indicator-AqxHWPA9.js.map +1 -1
  37. package/dist/InputGroup-BvD9Igmt.js.map +1 -1
  38. package/dist/InputOTP-B2e1nfSO.js.map +1 -1
  39. package/dist/Loader-BpHiL6W-.js.map +1 -1
  40. package/dist/MenuItem-d19Ty84F.js.map +1 -1
  41. package/dist/MenuItemShortcut-D1faeIXp.js.map +1 -1
  42. package/dist/MenuItemText-CRpaPbvg.js.map +1 -1
  43. package/dist/Overlay-CVt011mY.js.map +1 -1
  44. package/dist/{Popover-CY_d3Ggn.js → Popover-CRVD7AtB.js} +20 -19
  45. package/dist/Popover-CRVD7AtB.js.map +1 -0
  46. package/dist/RichButton-DuPTenmS.js.map +1 -1
  47. package/dist/ScrollArea-CuuTeDn3.js.map +1 -1
  48. package/dist/ScrollShadowContainer-DdrnF8qU.js.map +1 -1
  49. package/dist/{SearchSelectTag-DFCX9zT1.js → SearchSelectTag-CA7Ie3Nx.js} +2 -2
  50. package/dist/SearchSelectTag-CA7Ie3Nx.js.map +1 -0
  51. package/dist/{Select-B2WcoFf5.js → Select-MLPTpIl5.js} +24 -23
  52. package/dist/Select-MLPTpIl5.js.map +1 -0
  53. package/dist/{Sheet-zTMuP7C8.js → Sheet-qTIXsqm0.js} +3 -3
  54. package/dist/Sheet-qTIXsqm0.js.map +1 -0
  55. package/dist/Shortcut-D8L15_ed.js.map +1 -1
  56. package/dist/Skeleton-y6I-i9q5.js.map +1 -1
  57. package/dist/TableFillHandle-C_yvCTSl.js +65 -0
  58. package/dist/TableFillHandle-C_yvCTSl.js.map +1 -0
  59. package/dist/Tag-DdHXTyKF.js.map +1 -1
  60. package/dist/Text-DeBE8AKl.js.map +1 -1
  61. package/dist/TextInput-Cj50ImXi.js.map +1 -1
  62. package/dist/{TextOverflowTooltip-DlUgic5y.js → TextOverflowTooltip-B1I5qwAT.js} +2 -2
  63. package/dist/TextOverflowTooltip-B1I5qwAT.js.map +1 -0
  64. package/dist/Toggle-v_HT3Gm2.js.map +1 -1
  65. package/dist/{Tooltip-C4rVuWr4.js → Tooltip-7Duaau0S.js} +3 -3
  66. package/dist/Tooltip-7Duaau0S.js.map +1 -0
  67. package/dist/TriggerButton-CfDObWP9.js.map +1 -1
  68. package/dist/blocks/auth/otp-form.js +1 -1
  69. package/dist/blocks/auth/otp-form.js.map +1 -1
  70. package/dist/circle-BbEzypQJ.js +14 -0
  71. package/dist/circle-BbEzypQJ.js.map +1 -0
  72. package/dist/cn-dsXlqdJg.js.map +1 -1
  73. package/dist/components/alert/Alert.d.ts +4 -0
  74. package/dist/components/alert/Alert.stories.d.ts +1 -0
  75. package/dist/components/alert-dialog.js +3 -3
  76. package/dist/components/alert-dialog.js.map +1 -1
  77. package/dist/components/alert.js +18 -18
  78. package/dist/components/alert.js.map +1 -1
  79. package/dist/components/avatar.js.map +1 -1
  80. package/dist/components/background-pattern.js.map +1 -1
  81. package/dist/components/badge.js.map +1 -1
  82. package/dist/components/banner.js.map +1 -1
  83. package/dist/components/breadcrumb.js.map +1 -1
  84. package/dist/components/button.js.map +1 -1
  85. package/dist/components/calendar.js.map +1 -1
  86. package/dist/components/card.js +1 -1
  87. package/dist/components/card.js.map +1 -1
  88. package/dist/components/carousel.js.map +1 -1
  89. package/dist/components/checkbox.js +1 -1
  90. package/dist/components/collapsible.js.map +1 -1
  91. package/dist/components/color-tile.js.map +1 -1
  92. package/dist/components/command/Command.stories.d.ts +1 -0
  93. package/dist/components/command.js +1 -1
  94. package/dist/components/container.js.map +1 -1
  95. package/dist/components/context-menu/ContextMenu.d.ts +27 -0
  96. package/dist/components/context-menu/ContextMenu.stories.d.ts +10 -0
  97. package/dist/components/context-menu/index.d.ts +1 -0
  98. package/dist/components/context-menu.d.ts +2 -0
  99. package/dist/components/context-menu.js +2675 -0
  100. package/dist/components/context-menu.js.map +1 -0
  101. package/dist/components/counter.js.map +1 -1
  102. package/dist/components/dialog.js +3 -3
  103. package/dist/components/dialog.js.map +1 -1
  104. package/dist/components/divider.js.map +1 -1
  105. package/dist/components/drawer.js +3 -3
  106. package/dist/components/drawer.js.map +1 -1
  107. package/dist/components/dropdown.js +26 -25
  108. package/dist/components/dropdown.js.map +1 -1
  109. package/dist/components/error-state.js.map +1 -1
  110. package/dist/components/field/Field.d.ts +4 -0
  111. package/dist/components/field/Field.stories.d.ts +1 -0
  112. package/dist/components/field.js +1 -1
  113. package/dist/components/file-upload.js +2 -2
  114. package/dist/components/file-upload.js.map +1 -1
  115. package/dist/components/form.js +3 -3
  116. package/dist/components/form.js.map +1 -1
  117. package/dist/components/glass-toolbar.js.map +1 -1
  118. package/dist/components/icon-tooltip.js +1 -1
  119. package/dist/components/image-placeholder.js.map +1 -1
  120. package/dist/components/image-preview.js.map +1 -1
  121. package/dist/components/image-uploader.js.map +1 -1
  122. package/dist/components/input.js.map +1 -1
  123. package/dist/components/label.js +1 -1
  124. package/dist/components/menu-item.js.map +1 -1
  125. package/dist/components/overflow-tooltip.js +1 -1
  126. package/dist/components/page-state.js.map +1 -1
  127. package/dist/components/popover.js +1 -1
  128. package/dist/components/portal-container.js +2 -2
  129. package/dist/components/portal-container.js.map +1 -1
  130. package/dist/components/progress-circle.js.map +1 -1
  131. package/dist/components/progress.js.map +1 -1
  132. package/dist/components/prose.js.map +1 -1
  133. package/dist/components/radio-group.js +63 -72
  134. package/dist/components/radio-group.js.map +1 -1
  135. package/dist/components/resizable.js.map +1 -1
  136. package/dist/components/scheduler.js +1 -1
  137. package/dist/components/scheduler.js.map +1 -1
  138. package/dist/components/search-select.js +4 -4
  139. package/dist/components/search-select.js.map +1 -1
  140. package/dist/components/select.js +1 -1
  141. package/dist/components/sheet.js +1 -1
  142. package/dist/components/sidebar.js +206 -212
  143. package/dist/components/sidebar.js.map +1 -1
  144. package/dist/components/slider.js.map +1 -1
  145. package/dist/components/stepper.js.map +1 -1
  146. package/dist/components/switch/Switch.d.ts +1 -1
  147. package/dist/components/switch.js +5 -2
  148. package/dist/components/switch.js.map +1 -1
  149. package/dist/components/system-state.js +1 -1
  150. package/dist/components/system-state.js.map +1 -1
  151. package/dist/components/table/Table.d.ts +109 -5
  152. package/dist/components/table/Table.stories.d.ts +285 -9
  153. package/dist/components/table/column-reorder/index.d.ts +1 -0
  154. package/dist/components/table/column-reorder/useColumnReorder.d.ts +82 -0
  155. package/dist/components/table/column-reorder.d.ts +2 -0
  156. package/dist/components/table/column-reorder.js +6 -0
  157. package/dist/components/table/column-reorder.js.map +1 -0
  158. package/dist/components/table/column-resize/columnAutoFit.d.ts +21 -0
  159. package/dist/components/table/column-resize/columnResizeSession.d.ts +9 -0
  160. package/dist/components/table/column-resize/index.d.ts +3 -0
  161. package/dist/components/table/column-resize/useColumnResize.d.ts +52 -0
  162. package/dist/components/table/column-resize.d.ts +2 -0
  163. package/dist/components/table/column-resize.js +7 -0
  164. package/dist/components/table/column-resize.js.map +1 -0
  165. package/dist/components/table/editable/TableFillHandle.d.ts +23 -0
  166. package/dist/components/table/editable/cellRange.d.ts +83 -0
  167. package/dist/components/table/editable/editableCell.d.ts +90 -0
  168. package/dist/components/table/editable/index.d.ts +3 -0
  169. package/dist/components/table/editable.d.ts +2 -0
  170. package/dist/components/table/editable.js +12 -0
  171. package/dist/components/table/editable.js.map +1 -0
  172. package/dist/components/table/index.d.ts +8 -1
  173. package/dist/components/table/opaqueCell.d.ts +47 -0
  174. package/dist/components/table/rowTint.d.ts +60 -0
  175. package/dist/components/table/sticky/index.d.ts +1 -0
  176. package/dist/components/table/sticky/stickyCell.d.ts +105 -0
  177. package/dist/components/table/sticky.d.ts +2 -0
  178. package/dist/components/table/sticky.js +22 -0
  179. package/dist/components/table/sticky.js.map +1 -0
  180. package/dist/components/table/tableStoryData.d.ts +84 -0
  181. package/dist/components/table/tableStoryParts.d.ts +72 -0
  182. package/dist/components/table/tree/TableTree.d.ts +106 -0
  183. package/dist/components/table/tree/index.d.ts +3 -0
  184. package/dist/components/table/tree/treeGeometry.d.ts +86 -0
  185. package/dist/components/table/tree/treeModel.d.ts +87 -0
  186. package/dist/components/table/tree.d.ts +2 -0
  187. package/dist/components/table/tree.js +19 -0
  188. package/dist/components/table/tree.js.map +1 -0
  189. package/dist/components/table.js +52 -79
  190. package/dist/components/table.js.map +1 -1
  191. package/dist/components/tabs.js.map +1 -1
  192. package/dist/components/tag-input.js +2 -2
  193. package/dist/components/tag-input.js.map +1 -1
  194. package/dist/components/textarea.js.map +1 -1
  195. package/dist/components/timer.js.map +1 -1
  196. package/dist/components/toast.js.map +1 -1
  197. package/dist/components/toggle-group.js.map +1 -1
  198. package/dist/components/toolbar.js +1 -2
  199. package/dist/components/toolbar.js.map +1 -1
  200. package/dist/components/tooltip.js +1 -1
  201. package/dist/floating-ui.react-dom-BwDfy92G.js +1309 -0
  202. package/dist/floating-ui.react-dom-BwDfy92G.js.map +1 -0
  203. package/dist/formatBytes-C4QXq5lC.js.map +1 -1
  204. package/dist/hooks.js +1 -1
  205. package/dist/index-0ioNhtNM.js.map +1 -1
  206. package/dist/index-1SnkxfPR.js +230 -0
  207. package/dist/index-1SnkxfPR.js.map +1 -0
  208. package/dist/index-437EL2iq.js.map +1 -1
  209. package/dist/index-BDrapWDv.js.map +1 -1
  210. package/dist/index-BGQepRFJ.js.map +1 -1
  211. package/dist/index-BVqs-uqP.js.map +1 -1
  212. package/dist/index-BZPx6jYI.js.map +1 -1
  213. package/dist/index-Bb23HztA.js.map +1 -1
  214. package/dist/index-BjtNfqNq.js +333 -0
  215. package/dist/index-BjtNfqNq.js.map +1 -0
  216. package/dist/index-BpWB3aFK.js.map +1 -1
  217. package/dist/index-ByaXH_ih.js.map +1 -1
  218. package/dist/index-CCKe-Mpx.js.map +1 -1
  219. package/dist/index-CFaU3UXv.js.map +1 -1
  220. package/dist/index-CLuiUUQ8.js.map +1 -1
  221. package/dist/{index-CQD-Njgt.js → index-CMxHunQ4.js} +26 -25
  222. package/dist/index-CMxHunQ4.js.map +1 -0
  223. package/dist/index-CmBeyp2d.js.map +1 -1
  224. package/dist/index-DFZozV_h.js.map +1 -1
  225. package/dist/index-DHsfW5Rj.js.map +1 -1
  226. package/dist/index-DHyZ_0Ut.js.map +1 -1
  227. package/dist/index-DLcqcWxM.js.map +1 -1
  228. package/dist/index-DnnQs07z.js.map +1 -1
  229. package/dist/index-Uiy0Xwy2.js.map +1 -1
  230. package/dist/index-_ITz1IyW.js.map +1 -1
  231. package/dist/index.js.map +1 -1
  232. package/dist/inputBaseStyles-DbzD_jvq.js.map +1 -1
  233. package/dist/lib/utils/dom.d.ts +72 -0
  234. package/dist/lib/utils/styles.d.ts +1 -0
  235. package/dist/lib/utils.js.map +1 -1
  236. package/dist/opaqueCell-SGaiyL54.js +31 -0
  237. package/dist/opaqueCell-SGaiyL54.js.map +1 -0
  238. package/dist/plus-BpxYPnAG.js +15 -0
  239. package/dist/plus-BpxYPnAG.js.map +1 -0
  240. package/dist/styles-scoped.css +6684 -6413
  241. package/dist/styles.css +6423 -6152
  242. package/dist/theme.css +364 -362
  243. package/dist/treeModel-BlPWVj4W.js +319 -0
  244. package/dist/treeModel-BlPWVj4W.js.map +1 -0
  245. package/dist/types/css.d.ts +4 -4
  246. package/dist/useBreakpoints-DHvp74UL.js +31 -0
  247. package/dist/useBreakpoints-DHvp74UL.js.map +1 -0
  248. package/dist/useColumnReorder-BxVZQ_Y5.js +119 -0
  249. package/dist/useColumnReorder-BxVZQ_Y5.js.map +1 -0
  250. package/dist/useColumnResize-wjfEyBBg.js +130 -0
  251. package/dist/useColumnResize-wjfEyBBg.js.map +1 -0
  252. package/dist/useDebounce-BRah78CF.js.map +1 -1
  253. package/dist/useFileUpload-Bnl3P8mP.js.map +1 -1
  254. package/dist/useItemsKeyboardNavigation-CmeOR30y.js.map +1 -1
  255. package/dist/useMergeRefs-qoKniYqT.js.map +1 -1
  256. package/dist/usePortalContainer-BAIp0kSF.js +44 -0
  257. package/dist/usePortalContainer-BAIp0kSF.js.map +1 -0
  258. package/dist/vendors/date-fns/index.d.ts +7 -14
  259. package/dist/vendors/date-fns/locale/en-US/index.d.ts +4 -0
  260. package/dist/vendors/date-fns/locale/ru/index.d.ts +4 -0
  261. package/dist/vendors/react-day-picker/index.d.ts +8 -17
  262. package/dist/vendors/react-hook-form/index.d.ts +8 -15
  263. package/dist/vendors/tanstack/react-table/index.d.ts +12 -0
  264. package/dist/vendors/tanstack/react-table.js.map +1 -1
  265. package/dist/vendors/zod/index.d.ts +8 -9
  266. package/dist/zod-BMNoK3aM.js.map +1 -1
  267. package/package.json +207 -205
  268. package/tailwind.preset.js +452 -448
  269. package/dist/AlertIcon-5B6AgZpe.js.map +0 -1
  270. package/dist/CheckboxField-cX09-eBX.js.map +0 -1
  271. package/dist/Command-ClIm4U7r.js.map +0 -1
  272. package/dist/Dialog-Bs1B5Iu8.js.map +0 -1
  273. package/dist/Field-BiIWtq9o.js +0 -86
  274. package/dist/Field-BiIWtq9o.js.map +0 -1
  275. package/dist/FieldLabel-QJ4rJFOi.js.map +0 -1
  276. package/dist/FormFooterTemplate-DPB6Dkxn.js.map +0 -1
  277. package/dist/FormStack-DO15vBgd.js.map +0 -1
  278. package/dist/IconTooltip-CKJKGHbk.js.map +0 -1
  279. package/dist/Popover-CY_d3Ggn.js.map +0 -1
  280. package/dist/SearchSelectTag-DFCX9zT1.js.map +0 -1
  281. package/dist/Select-B2WcoFf5.js.map +0 -1
  282. package/dist/Sheet-zTMuP7C8.js.map +0 -1
  283. package/dist/TextOverflowTooltip-DlUgic5y.js.map +0 -1
  284. package/dist/Tooltip-C4rVuWr4.js.map +0 -1
  285. package/dist/components/data-table/DataTable.stories.d.ts +0 -8
  286. package/dist/design-tokens.source.json +0 -1
  287. package/dist/index-BzCriPiK.js +0 -671
  288. package/dist/index-BzCriPiK.js.map +0 -1
  289. package/dist/index-CQD-Njgt.js.map +0 -1
  290. package/dist/index-DRo26PBK.js +0 -1525
  291. package/dist/index-DRo26PBK.js.map +0 -1
  292. package/dist/useBreakpoints-D8wKOvil.js +0 -103
  293. package/dist/useBreakpoints-D8wKOvil.js.map +0 -1
  294. package/dist/usePortalContainer-ae6EzS08.js +0 -39
  295. package/dist/usePortalContainer-ae6EzS08.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { PointerEvent as ReactPointerEvent } from 'react';
2
+ /** Атрибут, по которому хук находит в DOM все ячейки одной колонки. */
3
+ export declare const COLUMN_KEY_ATTRIBUTE = "data-column-key";
4
+ export interface UseColumnReorderOptions<K extends string> {
5
+ /** Полный видимый порядок колонок — включая те, что двигать нельзя. */
6
+ columns: K[];
7
+ /** Ширины колонок: из них считаются границы слотов. Обычно это `widths` из `useColumnResize`. */
8
+ widths: Record<K, number>;
9
+ /** Новый порядок. Хук ничего не хранит — состояние остаётся у вызывающей стороны. */
10
+ onReorder: (next: K[]) => void;
11
+ /**
12
+ * Колонки, которые нельзя ни таскать, ни занимать: например колонка иерархии,
13
+ * которая обязана оставаться первой. Свой индекс они сохраняют при любой перестановке.
14
+ */
15
+ locked?: K[];
16
+ }
17
+ export interface UseColumnReorderResult<K extends string> {
18
+ /** Колонка, которую тащат прямо сейчас. Годится для подсветки грипа. */
19
+ dragKey: K | null;
20
+ /** Пропы для ручки-грипа. Драг начинается только с неё. */
21
+ getGripProps: (key: K) => {
22
+ onPointerDown: (event: ReactPointerEvent) => void;
23
+ style: {
24
+ touchAction: "none";
25
+ };
26
+ };
27
+ /** Пропы для каждой ячейки колонки — и в шапке, и в теле. Без них колонка не поедет. */
28
+ getColumnProps: (key: K) => Record<string, string>;
29
+ }
30
+ /**
31
+ * Перетаскивание колонок таблицы: колонка едет за курсором, соседи разъезжаются, отпускание
32
+ * укладывает её в новый слот.
33
+ *
34
+ * **Почему не библиотека.** Универсальные DnD-библиотеки (dnd-kit и подобные) существуют ради
35
+ * произвольной геометрии: они измеряют узлы, ищут коллизии, держат подписку на каждый
36
+ * перетаскиваемый элемент. Здесь ничего этого не нужно — колонки лежат в один ряд, а их ширины
37
+ * уже известны из `useColumnResize`, так что смещение слота это префиксная сумма, а выбор цели —
38
+ * ближайший центр. Ровно то же самое делает `closestCenter`, только без обхода DOM.
39
+ *
40
+ * Вторая причина — цена на большой таблице. Библиотечный подход требует хука на **каждую**
41
+ * ячейку, включая ячейки тела, иначе колонка не поедет целиком: на таблице 7×34 это больше
42
+ * двухсот подписок и столько же ререндеров на каждое движение мыши. Здесь во время драга
43
+ * React не участвует вовсе: трансформации пишутся прямо в DOM, а состояние меняется один раз,
44
+ * когда кнопку отпустили. Тот же приём и по той же причине используется в `useColumnResize`.
45
+ *
46
+ * **Оговорка про инлайновые стили.** На время драга хук пишет ячейкам `transform`,
47
+ * `transition`, `position`, `z-index` и `box-shadow` — последний рисует левый край, которого
48
+ * у плывущей колонки нет (см. `setColumnSeparator`). Свои значения этих свойств ячейка
49
+ * получает обратно после отпускания: хук снимает их при первом касании и возвращает
50
+ * в конце. Классы при этом не трогаются вовсе, поэтому оформление классами живёт своей
51
+ * жизнью, а тень от хука просто лежит поверх на время перетаскивания.
52
+ *
53
+ * **Оговорка про фон.** Плывущая колонка на время перетаскивания получает классы
54
+ * `opaqueCellStyles`: строка прозрачна, и без непрозрачного фона колонка едет поверх соседей
55
+ * вместе с их текстом, наложенным на свой. Тот же рецепт, что у закреплённой колонки, — и по
56
+ * той же причине. Подсветку строки он сохраняет, поэтому наведение и `selected` под колонкой
57
+ * не пропадают.
58
+ *
59
+ * **Чего нет.** Перетаскивания с клавиатуры: правильный клавиатурный аналог — пункты меню
60
+ * «сдвинуть влево / вправо», а не имитация драга. Автопрокрутки контейнера у края тоже нет —
61
+ * при перетаскивании за пределы видимой области колонка просто упрётся в край.
62
+ *
63
+ * **Как подключается.** `getGripProps` — на ручку, `getColumnProps` — на `TableHead`
64
+ * и на каждую `TableCell` этой колонки. Драг начинается только с ручки: `pointerdown`
65
+ * по всей ячейке конфликтовал бы с ресайзером, который начинается так же.
66
+ *
67
+ * @example
68
+ * const [order, setOrder] = useState(["tree", "client", "sum"]);
69
+ *
70
+ * const { getGripProps, getColumnProps } = useColumnReorder({
71
+ * columns: order,
72
+ * widths, // из useColumnResize
73
+ * onReorder: setOrder,
74
+ * locked: ["tree"]
75
+ * });
76
+ *
77
+ * <TableHead {...getColumnProps(key)}>
78
+ * <span {...getGripProps(key)}>⠿</span>
79
+ * </TableHead>
80
+ * <TableCell {...getColumnProps(key)}>…</TableCell>
81
+ */
82
+ export declare function useColumnReorder<K extends string>({ columns, widths, onReorder, locked }: UseColumnReorderOptions<K>): UseColumnReorderResult<K>;
@@ -0,0 +1,2 @@
1
+ export * from './column-reorder/index'
2
+ export {}
@@ -0,0 +1,6 @@
1
+ import { C as r, u as s } from "../../useColumnReorder-BxVZQ_Y5.js";
2
+ export {
3
+ r as COLUMN_KEY_ATTRIBUTE,
4
+ s as useColumnReorder
5
+ };
6
+ //# sourceMappingURL=column-reorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-reorder.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Автофит колонки по содержимому (двойной клик по ручке ресайза).
3
+ *
4
+ * Меряет «естественную» ширину контента колонки: клонирует заголовок и видимые ячейки
5
+ * тела в скрытую sandbox-таблицу с `table-layout: auto` / `width: max-content` и берёт
6
+ * итоговую ширину. `cloneCell` переносит на клон вычисленные шрифтовые стили, иначе
7
+ * замер вне исходного каскада получился бы неверным.
8
+ */
9
+ export interface ColumnAutoFitOptions {
10
+ minWidth: number;
11
+ maxWidth: number;
12
+ }
13
+ /**
14
+ * Ширина колонки по её содержимому, в пикселях. `undefined` — если замерить не удалось
15
+ * (заголовок вне таблицы). Результат зажат между `minWidth` и `maxWidth`.
16
+ *
17
+ * @example
18
+ * const width = getColumnAutoFitWidth(headerElement, { minWidth: 60, maxWidth: 500 });
19
+ * if (width) setWidths((current) => ({ ...current, name: width }));
20
+ */
21
+ export declare function getColumnAutoFitWidth(header: HTMLTableCellElement, options: ColumnAutoFitOptions): number | undefined;
@@ -0,0 +1,9 @@
1
+ export declare class ColumnResizeSession {
2
+ private minWidth;
3
+ private state?;
4
+ constructor(minWidth: number);
5
+ start(columnKey: string, startWidth: number, startX: number): void;
6
+ getWidth(currentX: number): number | undefined;
7
+ getColumnKey(): string | undefined;
8
+ end(): void;
9
+ }
@@ -0,0 +1,3 @@
1
+ export { ColumnResizeSession } from './columnResizeSession';
2
+ export { getColumnAutoFitWidth, type ColumnAutoFitOptions } from './columnAutoFit';
3
+ export { useColumnResize, type ResizableColumn, type UseColumnResizeOptions, type UseColumnResizeResult } from './useColumnResize';
@@ -0,0 +1,52 @@
1
+ import { MouseEvent as ReactMouseEvent, RefObject } from 'react';
2
+ export interface ResizableColumn<K extends string = string> {
3
+ key: K;
4
+ defaultWidth: number;
5
+ minWidth: number;
6
+ maxWidth?: number;
7
+ }
8
+ export interface UseColumnResizeOptions {
9
+ /** Глобальный минимум-подстраховка для драга. */
10
+ minWidth?: number;
11
+ /** Дефолтный максимум для колонок без своего `maxWidth` (используется в драге и автофите). */
12
+ maxWidth?: number;
13
+ }
14
+ export interface UseColumnResizeResult<K extends string> {
15
+ /**
16
+ * Ref на саму таблицу — вешается на `<Table ref>`.
17
+ *
18
+ * Именно `RefObject<HTMLTableElement>`, а не `RefObject<HTMLTableElement | null>`: это то,
19
+ * что возвращает `useRef` в типах React 18, и то, что принимает проп `ref` у `forwardRef`.
20
+ * Аннотация с `| null` пришла из React 19 и делала результат хука непередаваемым в `ref`.
21
+ */
22
+ tableRef: RefObject<HTMLTableElement>;
23
+ widths: Record<K, number>;
24
+ totalWidth: number;
25
+ getHeaderRef: (key: K) => (el: HTMLTableCellElement | null) => void;
26
+ getResizeHandleProps: (key: K) => {
27
+ onMouseDown: (event: ReactMouseEvent) => void;
28
+ onDoubleClick: (event: ReactMouseEvent) => void;
29
+ };
30
+ reset: () => void;
31
+ }
32
+ /**
33
+ * Ресайз и автофит колонок обычной HTML-таблицы, без table-библиотек.
34
+ *
35
+ * Во время `mousemove` ширина мутируется напрямую в DOM (`th.style.width`, `table.style.width`)
36
+ * через рефы — без React state на каждый пиксель. На `mouseup` — один коммит в state.
37
+ *
38
+ * `columns` должен быть стабильной ссылкой (модульная константа или `useMemo` вызывающей
39
+ * стороны) — из неё один раз считаются дефолтные ширины.
40
+ *
41
+ * @example
42
+ * const COLUMNS = [{ key: "name", defaultWidth: 240, minWidth: 120 }];
43
+ *
44
+ * const { tableRef, widths, totalWidth, getHeaderRef, getResizeHandleProps } = useColumnResize(COLUMNS);
45
+ *
46
+ * <Table ref={tableRef} style={{ width: totalWidth, tableLayout: "fixed" }}>
47
+ * <TableHead ref={getHeaderRef("name")} className="relative" style={{ width: widths.name }}>
48
+ * Контрагент
49
+ * <TableResizeHandle {...getResizeHandleProps("name")} />
50
+ * </TableHead>
51
+ */
52
+ export declare function useColumnResize<K extends string>(columns: ResizableColumn<K>[], options?: UseColumnResizeOptions): UseColumnResizeResult<K>;
@@ -0,0 +1,2 @@
1
+ export * from './column-resize/index'
2
+ export {}
@@ -0,0 +1,7 @@
1
+ import { C as o, g as u, u as i } from "../../useColumnResize-wjfEyBBg.js";
2
+ export {
3
+ o as ColumnResizeSession,
4
+ u as getColumnAutoFitWidth,
5
+ i as useColumnResize
6
+ };
7
+ //# sourceMappingURL=column-resize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-resize.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ export type TableFillHandleProps = React.HTMLAttributes<HTMLSpanElement>;
3
+ /**
4
+ * Ручка автозаполнения — точка на нижнем правом углу выделения, за которую тянут значения.
5
+ *
6
+ * Рисуется внутри угловой ячейки диапазона и позиционируется от неё, поэтому ячейке нужен
7
+ * `position: relative` — он уже есть в `cellStateStyles`.
8
+ *
9
+ * По макету ручка круглая (`border radius/full`, 10px), хотя в Excel это квадрат — оставлено
10
+ * как в макете.
11
+ *
12
+ * Кит даёт только вид и попадание курсором: что протянется, куда и как далеко — решает
13
+ * прикладной код по `onMouseDown` и движению мыши.
14
+ *
15
+ * **Почему `span`, а не `button`.** Ручка работает только протягиванием мыши, клавиатурного
16
+ * аналога у неё нет. Настоящая кнопка встала бы в порядок обхода табом и по Enter не делала
17
+ * бы ничего — остановка фокуса, которая ничем не отвечает, хуже её отсутствия. Роль и подпись
18
+ * при этом остаются: скринридер ручку видит и называет.
19
+ *
20
+ * @example
21
+ * {isCorner && <TableFillHandle onMouseDown={() => setFillFrom(rowIndex)} />}
22
+ */
23
+ export declare const TableFillHandle: React.ForwardRefExoticComponent<TableFillHandleProps & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,83 @@
1
+ import { CSSProperties } from 'react';
2
+ /** Адрес ячейки в сетке: индекс видимой строки и индекс видимой колонки. */
3
+ export type CellRef = {
4
+ row: number;
5
+ col: number;
6
+ };
7
+ /** Прямоугольный диапазон ячеек. Границы включительно, поэтому одна ячейка — тоже диапазон. */
8
+ export type CellRange = {
9
+ top: number;
10
+ bottom: number;
11
+ left: number;
12
+ right: number;
13
+ };
14
+ /**
15
+ * Диапазон по двум углам — якорю выделения и текущей ячейке.
16
+ *
17
+ * Порядок углов не важен: тянут выделение в любую сторону, поэтому границы нормализуются.
18
+ * Это геометрия, а не поведение: где стоит якорь, когда он переставляется и что вообще
19
+ * считается выделением — знание прикладного кода.
20
+ *
21
+ * @example
22
+ * cellRange({ row: 4, col: 1 }, { row: 2, col: 3 }); // { top: 2, bottom: 4, left: 1, right: 3 }
23
+ */
24
+ export declare const cellRange: (anchor: CellRef, focus: CellRef) => CellRange;
25
+ /** Попадает ли ячейка в диапазон. Отсутствие диапазона — не попадает, проверять отдельно не нужно. */
26
+ export declare const inCellRange: (range: CellRange | null | undefined, cell: CellRef) => boolean;
27
+ /** Как выглядит грань диапазона: цвет и толщина линии. */
28
+ export type CellRangeEdge = {
29
+ color: string;
30
+ width: number;
31
+ };
32
+ /**
33
+ * Готовые рамки диапазонов: `selection` — то, что выделено, `preview` — то, что получится,
34
+ * если отпустить сейчас (протягивание значений, перенос).
35
+ *
36
+ * Предпросмотр намеренно тоньше и бледнее выделения: две одинаковые рамки на экране
37
+ * невозможно различить, а они означают разное — состоявшееся и предполагаемое.
38
+ *
39
+ * Список открытый: своя рамка — это `{ color, width }` с любым CSS-цветом.
40
+ */
41
+ export declare const CELL_RANGE_EDGE: {
42
+ readonly selection: {
43
+ readonly color: "hsl(var(--primary-accent))";
44
+ readonly width: 2;
45
+ };
46
+ readonly preview: {
47
+ readonly color: "hsl(var(--primary-border) / 0.75)";
48
+ readonly width: 1;
49
+ };
50
+ };
51
+ /**
52
+ * Грани диапазона, проходящие через эту ячейку, — готовая строка для `box-shadow`.
53
+ *
54
+ * Рамка обводит диапазон целиком, а не каждую его ячейку: грань достаётся только тем ячейкам,
55
+ * что стоят по краю, поэтому внутри диапазона линий нет. Ячейка вне диапазона (и отсутствие
56
+ * диапазона) даёт пустую строку — проверять попадание перед вызовом не нужно.
57
+ *
58
+ * **Почему тень, а не рамка.** `border` входит в бокс ячейки и раздвинул бы колонки на
59
+ * ширину линии, `outline` обвёл бы каждую ячейку целиком. `inset`-тень рисуется внутри
60
+ * ячейки и ничего не двигает.
61
+ *
62
+ * Значения считаются на ходу и потому уезжают в инлайновый стиль, но цвет всё равно берётся
63
+ * из токена, а не хардкодом.
64
+ *
65
+ * @example
66
+ * cellRangeEdges(selection, { row: 2, col: 0 }); // "inset 0 2px 0 0 …, inset 2px 0 0 0 …"
67
+ */
68
+ export declare const cellRangeEdges: (range: CellRange | null | undefined, cell: CellRef, edge?: CellRangeEdge) => string;
69
+ /**
70
+ * Рамки нескольких диапазонов в одном `style` ячейки. Первый аргумент — верхняя тень.
71
+ *
72
+ * Ложные и пустые значения отбрасываются, поэтому условия пишутся прямо в аргументах,
73
+ * а ячейка без единой грани не получает инлайнового стиля вовсе.
74
+ *
75
+ * @example
76
+ * <TableCell
77
+ * style={cellRangeStyle(
78
+ * cellRangeEdges(selection, cell),
79
+ * cellRangeEdges(fillPreview, cell, CELL_RANGE_EDGE.preview)
80
+ * )}
81
+ * >
82
+ */
83
+ export declare const cellRangeStyle: (...shadows: (string | false | null | undefined)[]) => CSSProperties;
@@ -0,0 +1,90 @@
1
+ import { VariantProps, TVReturnType } from 'tailwind-variants';
2
+ /**
3
+ * Ячейка редактируемой таблицы: скелет сетки и заливка по состоянию.
4
+ *
5
+ * Скелет один на все состояния. `relative` — контекст позиционирования для ручки
6
+ * автозаполнения (`TableFillHandle`), `cursor-cell` — курсор сетки вместо стрелки,
7
+ * `select-none` — чтобы протягивание выделения мышью не выделяло текст.
8
+ *
9
+ * **Состояние — одна ось, а не набор флагов.** Все состояния красят одно и то же —
10
+ * `background-color`, поэтому одновременно видно ровно одно. Будь это булевы пропы,
11
+ * у ячейки «изменена и нередактируема» победил бы не тот класс, который передали последним,
12
+ * а тот, что стоит ниже в стилях: порядок в атрибуте `class` браузер не учитывает.
13
+ * С одним `state` выбор делается явно — и делает его прикладной код, потому что приоритет
14
+ * состояний зависит от задачи: где-то важнее показать правку, где-то — запрет на неё.
15
+ *
16
+ * Что означают состояния и когда их включать, кит не знает: «изменена» — это правка,
17
+ * не отправленная на сервер, или отличие от прошлой версии? Ячейка только красится.
18
+ *
19
+ * | Состояние | Смысл |
20
+ * | ------------ | ------------------------------------------------------------ |
21
+ * | `readonly` | правка запрещена — приглушённый текст на серой заливке |
22
+ * | `modified` | значение изменено |
23
+ * | `editing` | открыт редактор — та же заливка плюс кольцо фокуса |
24
+ * | `fillSource` | ячейка, из которой тянут значения |
25
+ *
26
+ * @example
27
+ * <TableCell
28
+ * className={cellStateStyles({
29
+ * state: isEditing ? "editing" : isModified ? "modified" : readonly ? "readonly" : undefined,
30
+ * className: column.numeric ? "text-right tabular-nums" : undefined
31
+ * })}
32
+ * >
33
+ */
34
+ export declare const cellStateStyles: TVReturnType<{
35
+ state: {
36
+ readonly: string;
37
+ fillSource: string;
38
+ modified: string;
39
+ editing: string;
40
+ };
41
+ }, undefined, "relative cursor-cell select-none", {
42
+ state: {
43
+ readonly: string;
44
+ fillSource: string;
45
+ modified: string;
46
+ editing: string;
47
+ };
48
+ }, undefined, TVReturnType<{
49
+ state: {
50
+ readonly: string;
51
+ fillSource: string;
52
+ modified: string;
53
+ editing: string;
54
+ };
55
+ }, undefined, "relative cursor-cell select-none", unknown, unknown, undefined>>;
56
+ /**
57
+ * Поле правки внутри ячейки — `input`, `textarea` или редактируемый `div`.
58
+ *
59
+ * Прозрачный фон обязателен: заливку ячейка уже нарисовала своим состоянием, и собственный
60
+ * фон поля закрыл бы её. Снятый `outline` — по той же причине: рамку правки рисует ячейка
61
+ * (`state: "editing"`), а вторая обводка внутри первой выглядит браком.
62
+ *
63
+ * `multiline` возвращает выделение текста, снятое у ячейки ради протягивания мышью, и учит
64
+ * поле переносам: без `whitespace-pre-wrap` переносы в значении схлопнутся в пробелы,
65
+ * без `break-words` длинное слово растянет колонку.
66
+ *
67
+ * @example
68
+ * <input className={cellEditorStyles({ className: column.numeric ? "text-right" : undefined })} />
69
+ * <div contentEditable className={cellEditorStyles({ multiline: true })} />
70
+ */
71
+ export declare const cellEditorStyles: TVReturnType<{
72
+ multiline: {
73
+ true: string;
74
+ };
75
+ }, undefined, "w-full bg-transparent outline-none", {
76
+ multiline: {
77
+ true: string;
78
+ };
79
+ }, undefined, TVReturnType<{
80
+ multiline: {
81
+ true: string;
82
+ };
83
+ }, undefined, "w-full bg-transparent outline-none", unknown, unknown, undefined>>;
84
+ /**
85
+ * Состояние ячейки — то, что она означает прямо сейчас.
86
+ *
87
+ * Выведено из самого `cellStateStyles`, поэтому список состояний в типе и в стилях
88
+ * не разъезжается.
89
+ */
90
+ export type CellState = NonNullable<VariantProps<typeof cellStateStyles>["state"]>;
@@ -0,0 +1,3 @@
1
+ export { cellStateStyles, cellEditorStyles, type CellState } from './editableCell';
2
+ export { cellRange, inCellRange, cellRangeEdges, cellRangeStyle, CELL_RANGE_EDGE, type CellRef, type CellRange, type CellRangeEdge } from './cellRange';
3
+ export { TableFillHandle, type TableFillHandleProps } from './TableFillHandle';
@@ -0,0 +1,2 @@
1
+ export * from './editable/index'
2
+ export {}
@@ -0,0 +1,12 @@
1
+ import { C as a, T as s, a as t, b as c, d as n, e as E, c as g, i as R } from "../../TableFillHandle-C_yvCTSl.js";
2
+ export {
3
+ a as CELL_RANGE_EDGE,
4
+ s as TableFillHandle,
5
+ t as cellEditorStyles,
6
+ c as cellRange,
7
+ n as cellRangeEdges,
8
+ E as cellRangeStyle,
9
+ g as cellStateStyles,
10
+ R as inCellRange
11
+ };
12
+ //# sourceMappingURL=editable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editable.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +1,8 @@
1
- export { Table, TableHeader, TableBody, TableBodyContainer, TableFooter, TableHead, TableRow, TableCell, TableCaption } from './Table';
1
+ export { Table, TableHeader, TableBody, TableBodyContainer, TableFooter, TableHead, TableRow, TableCell, TableCaption, TableResizeHandle, type TableProps, type TableHeaderProps, type TableFooterProps, type TableHeadProps, type TableRowProps, type TableResizeHandleProps } from './Table';
2
+ export { useColumnResize, getColumnAutoFitWidth, ColumnResizeSession, type ResizableColumn, type UseColumnResizeOptions, type UseColumnResizeResult, type ColumnAutoFitOptions } from './column-resize';
3
+ export { useColumnReorder, COLUMN_KEY_ATTRIBUTE, type UseColumnReorderOptions, type UseColumnReorderResult } from './column-reorder';
4
+ export { opaqueCellStyles } from './opaqueCell';
5
+ export { tableRowTints, TABLE_ROW_TINT, TABLE_ROW_TINT_LAYERS, TABLE_ROW_TINT_LAYERS_AFTER } from './rowTint';
6
+ export * from './tree';
7
+ export * from './editable';
8
+ export * from './sticky';
@@ -0,0 +1,47 @@
1
+ import { TVReturnType } from 'tailwind-variants';
2
+ /**
3
+ * Ячейка с непрозрачным фоном, сохраняющая подсветку строки.
4
+ *
5
+ * Нужна везде, где ячейка выезжает из потока и под ней оказывается чужое содержимое:
6
+ * закреплённая колонка (`stickyCellStyles`) и колонка, которую перетаскивают
7
+ * (`useColumnReorder`). Обе задачи одинаковые, поэтому рецепт один.
8
+ *
9
+ * **Почему фон нельзя просто задать.** Строка прозрачна — красит подложка секции
10
+ * (`TableBody`, `TableHeader`), и такой ячейке нужен свой непрозрачный фон. Но подменять
11
+ * им подсветку строки нельзя: `hover:bg-*` положил бы поверх полупрозрачный цвет, и чужое
12
+ * содержимое снова стало бы просвечивать. Поэтому подсветку рисует слой `::after` теми же
13
+ * переменными, что и сама строка, — заливкой (`--table-row-bg`, `--table-row-bg-hover`)
14
+ * и списком слоёв (`--table-row-tints`). Переменные наследуются от `tr` к ячейке сами,
15
+ * связывать их не нужно.
16
+ *
17
+ * Повторяются обе части: если рисовать только заливку, у закреплённой колонки пропадёт любая
18
+ * подкраска — и выделение, и деактивация, и что там ещё собрал потребитель.
19
+ *
20
+ * `transition-colors` совпадает с переходом у `TableRow`, поэтому строка подсвечивается
21
+ * целиком, а не двумя рывками. Разделители слой не задевает: `inset-0` у абсолютного
22
+ * потомка отсчитывается от padding-box, а границы лежат снаружи него.
23
+ *
24
+ * **Требует контекста позиционирования** — `sticky` у закреплённой ячейки, `relative`
25
+ * у перетаскиваемой: иначе `::after` растянется не по ячейке, а по ближайшему
26
+ * позиционированному предку.
27
+ *
28
+ * @example
29
+ * <TableCell className={opaqueCellStyles({ className: "relative" })}>…</TableCell>
30
+ * <TableHead className={opaqueCellStyles({ part: "head", className: "relative" })}>…</TableHead>
31
+ */
32
+ export declare const opaqueCellStyles: TVReturnType<{
33
+ part: {
34
+ cell: string;
35
+ head: string;
36
+ };
37
+ }, undefined, string[], {
38
+ part: {
39
+ cell: string;
40
+ head: string;
41
+ };
42
+ }, undefined, TVReturnType<{
43
+ part: {
44
+ cell: string;
45
+ head: string;
46
+ };
47
+ }, undefined, string[], unknown, unknown, undefined>>;
@@ -0,0 +1,60 @@
1
+ import { CSSProperties } from 'react';
2
+ /**
3
+ * Подкраска строки таблицы — стопка полупрозрачных слоёв поверх её заливки.
4
+ *
5
+ * **Когда нужно.** Когда состояний у строки больше одного. Заливка у строки одна
6
+ * (`background-color`), и второе состояние вытеснило бы первое: выделенная деактивированная
7
+ * строка выглядела бы просто выделенной. Слои же складываются альфами — и между собой,
8
+ * и с заливкой, какой бы она ни была, включая заданную вами `className="bg-…"`.
9
+ *
10
+ * **Почему это не пропсы строки.** `TableRow` не знает ни про «выделено», ни про «отключено»:
11
+ * что означает подсветка и когда её включать — знание прикладного кода. Кит даёт механизм
12
+ * (слои), готовые цвета (`TABLE_ROW_TINT`) и рисующие их классы; собирает их потребитель.
13
+ *
14
+ * @example
15
+ * <TableRow style={tableRowTints(isSelected && TABLE_ROW_TINT.selected, isInactive && TABLE_ROW_TINT.inactive)}>
16
+ */
17
+ /**
18
+ * Готовые цвета подкрасок: `selected` — выделенная строка, `inactive` — деактивированная.
19
+ *
20
+ * Оба полупрозрачные, поэтому сочетаются и друг с другом, и с наведением: наведение красит
21
+ * заливку под слоями, и выделенная строка под курсором темнеет.
22
+ *
23
+ * Список открытый: свои состояния задавайте своими значениями, слоем годится любой
24
+ * полупрозрачный CSS-цвет.
25
+ */
26
+ export declare const TABLE_ROW_TINT: {
27
+ readonly selected: "hsl(var(--alpha-high-05))";
28
+ readonly inactive: "hsl(var(--status-error) / 5%)";
29
+ };
30
+ /**
31
+ * Слои подкраски для `style` строки. Первый аргумент — верхний слой, каждый следующий
32
+ * ложится под ним, под всеми — заливка строки.
33
+ *
34
+ * **Цвета должны быть полупрозрачными**, и следит за этим вызывающий код: значения уходят
35
+ * в `background-image` как есть. Непрозрачный цвет закроет всё, что под ним, — остальные
36
+ * слои и заливку вместе с наведением.
37
+ *
38
+ * Ложные значения отбрасываются, поэтому условия пишутся прямо в аргументах:
39
+ * `tableRowTints(isSelected && TABLE_ROW_TINT.selected)`. Без единого слоя строка красится
40
+ * одной заливкой.
41
+ *
42
+ * Результат — инлайновый стиль с CSS-переменной; она наследуется от `tr` к ячейкам, поэтому
43
+ * закреплённые и перетаскиваемые колонки подхватывают подкраску сами.
44
+ *
45
+ * @example
46
+ * <TableRow
47
+ * style={tableRowTints(
48
+ * isSelected && TABLE_ROW_TINT.selected,
49
+ * isOverdue && "hsl(var(--status-warning) / 12%)"
50
+ * )}
51
+ * >
52
+ */
53
+ export declare const tableRowTints: (...tints: (string | false | null | undefined)[]) => CSSProperties;
54
+ /**
55
+ * Класс, рисующий слои подкраски на строке. Уже применён к `TableRow` — нужен, только если
56
+ * вы рисуете строку своим элементом.
57
+ */
58
+ export declare const TABLE_ROW_TINT_LAYERS = "bg-[image:var(--table-row-tints,none)]";
59
+ /** То же самое для слоя `::after` непрозрачной ячейки — см. `opaqueCellStyles`. */
60
+ export declare const TABLE_ROW_TINT_LAYERS_AFTER = "after:bg-[image:var(--table-row-tints,none)]";
@@ -0,0 +1 @@
1
+ export { stickyCellStyles, stickyOffset, STICKY_HEADER, STICKY_FOOTER } from './stickyCell';