@cube-dev/ui-kit 0.155.0 → 0.157.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 (652) hide show
  1. package/dist/CHANGELOG.md +284 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.d.ts +10 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +4 -3
  25. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -1
  39. package/dist/components/actions/index.js +1 -1
  40. package/dist/components/actions/use-action.js +1 -1
  41. package/dist/components/actions/use-anchored-menu.js +1 -1
  42. package/dist/components/actions/use-context-menu.js +42 -44
  43. package/dist/components/actions/use-context-menu.js.map +1 -1
  44. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  45. package/dist/components/content/Alert/Alert.js +1 -1
  46. package/dist/components/content/Alert/use-alert.js +1 -1
  47. package/dist/components/content/Avatar/Avatar.js +1 -1
  48. package/dist/components/content/Badge/Badge.js +1 -1
  49. package/dist/components/content/Card/Card.js +1 -1
  50. package/dist/components/content/Content.js +1 -1
  51. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  52. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  53. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  54. package/dist/components/content/Divider.js +1 -1
  55. package/dist/components/content/Footer.js +1 -1
  56. package/dist/components/content/Header.js +1 -1
  57. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  58. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  59. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  60. package/dist/components/content/Item/Item.js +1 -1
  61. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  62. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  63. package/dist/components/content/Layout/GridLayout.js +1 -1
  64. package/dist/components/content/Layout/Layout.js +1 -1
  65. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  66. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  67. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  68. package/dist/components/content/Layout/LayoutContent.js +1 -1
  69. package/dist/components/content/Layout/LayoutContext.js +1 -1
  70. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  71. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  72. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  73. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutPane.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  76. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  78. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  79. package/dist/components/content/Layout/index.js +1 -1
  80. package/dist/components/content/Layout/utils.js +1 -1
  81. package/dist/components/content/Paragraph.js +1 -1
  82. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  83. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  84. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  85. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  86. package/dist/components/content/Result/Result.js +1 -1
  87. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  88. package/dist/components/content/Tag/Tag.js +2 -2
  89. package/dist/components/content/Tag/Tag.js.map +1 -1
  90. package/dist/components/content/Text.d.ts +14 -14
  91. package/dist/components/content/Text.js +1 -1
  92. package/dist/components/content/TextItem/TextItem.js +1 -1
  93. package/dist/components/content/Title.js +1 -1
  94. package/dist/components/content/Tree/Tree.js +1 -1
  95. package/dist/components/content/Tree/TreeNode.js +1 -1
  96. package/dist/components/content/Tree/styled.js +1 -1
  97. package/dist/components/content/Tree/tree-index.js +1 -1
  98. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  99. package/dist/components/content/Tree/use-load-data.js +1 -1
  100. package/dist/components/content/highlightText.js +1 -1
  101. package/dist/components/content/use-auto-tooltip.js +1 -1
  102. package/dist/components/data/DataTable/DataTable.d.ts +13 -0
  103. package/dist/components/data/DataTable/DataTable.js +246 -0
  104. package/dist/components/data/DataTable/DataTable.js.map +1 -0
  105. package/dist/components/data/DataTable/index.d.ts +3 -0
  106. package/dist/components/data/DataTable/types.d.ts +145 -0
  107. package/dist/components/data/ItemTable/ItemTable.d.ts +19 -0
  108. package/dist/components/data/ItemTable/ItemTable.js +350 -0
  109. package/dist/components/data/ItemTable/ItemTable.js.map +1 -0
  110. package/dist/components/data/ItemTable/ItemTableBulkBar.d.ts +23 -0
  111. package/dist/components/data/ItemTable/ItemTableBulkBar.js +131 -0
  112. package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +1 -0
  113. package/dist/components/data/ItemTable/ItemTableDragPreview.js +46 -0
  114. package/dist/components/data/ItemTable/ItemTableDragPreview.js.map +1 -0
  115. package/dist/components/data/ItemTable/ItemTableFooter.js +79 -0
  116. package/dist/components/data/ItemTable/ItemTableFooter.js.map +1 -0
  117. package/dist/components/data/ItemTable/ItemTableToolbar.d.ts +34 -0
  118. package/dist/components/data/ItemTable/ItemTableToolbar.js +91 -0
  119. package/dist/components/data/ItemTable/ItemTableToolbar.js.map +1 -0
  120. package/dist/components/data/ItemTable/index.d.ts +4 -0
  121. package/dist/components/data/ItemTable/types.d.ts +327 -0
  122. package/dist/components/data/TableBase/ColumnResizer.js +70 -0
  123. package/dist/components/data/TableBase/ColumnResizer.js.map +1 -0
  124. package/dist/components/data/TableBase/RowCollection.js +99 -0
  125. package/dist/components/data/TableBase/RowCollection.js.map +1 -0
  126. package/dist/components/data/TableBase/TableRow.js +89 -0
  127. package/dist/components/data/TableBase/TableRow.js.map +1 -0
  128. package/dist/components/data/TableBase/TableView.d.ts +22 -0
  129. package/dist/components/data/TableBase/TableView.js +921 -0
  130. package/dist/components/data/TableBase/TableView.js.map +1 -0
  131. package/dist/components/data/TableBase/index.d.ts +5 -0
  132. package/dist/components/data/TableBase/row-menu.js +40 -0
  133. package/dist/components/data/TableBase/row-menu.js.map +1 -0
  134. package/dist/components/data/TableBase/styled.d.ts +5 -0
  135. package/dist/components/data/TableBase/styled.js +532 -0
  136. package/dist/components/data/TableBase/styled.js.map +1 -0
  137. package/dist/components/data/TableBase/types.d.ts +160 -0
  138. package/dist/components/data/TableBase/types.js +31 -0
  139. package/dist/components/data/TableBase/types.js.map +1 -0
  140. package/dist/components/data/TableBase/use-cell-selection.d.ts +3 -0
  141. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  142. package/dist/components/data/TableBase/use-cell-selection.js.map +1 -0
  143. package/dist/components/data/TableBase/use-container-width.js +35 -0
  144. package/dist/components/data/TableBase/use-container-width.js.map +1 -0
  145. package/dist/components/data/TableBase/use-row-move-animation.js +90 -0
  146. package/dist/components/data/TableBase/use-row-move-animation.js.map +1 -0
  147. package/dist/components/data/TableBase/use-scrollability.js +49 -0
  148. package/dist/components/data/TableBase/use-scrollability.js.map +1 -0
  149. package/dist/components/data/TableBase/use-table-columns.d.ts +2 -0
  150. package/dist/components/data/TableBase/use-table-columns.js +166 -0
  151. package/dist/components/data/TableBase/use-table-columns.js.map +1 -0
  152. package/dist/components/data/TableBase/use-table-search.js +64 -0
  153. package/dist/components/data/TableBase/use-table-search.js.map +1 -0
  154. package/dist/components/data/TableBase/use-table-selection.d.ts +4 -0
  155. package/dist/components/data/TableBase/use-table-selection.js +233 -0
  156. package/dist/components/data/TableBase/use-table-selection.js.map +1 -0
  157. package/dist/components/data/TableBase/use-table-sort.js +91 -0
  158. package/dist/components/data/TableBase/use-table-sort.js.map +1 -0
  159. package/dist/components/data/TableBase/use-table-sorts.js +97 -0
  160. package/dist/components/data/TableBase/use-table-sorts.js.map +1 -0
  161. package/dist/components/data/TableBase/use-table-storage.d.ts +8 -0
  162. package/dist/components/data/TableBase/use-table-storage.js +58 -0
  163. package/dist/components/data/TableBase/use-table-storage.js.map +1 -0
  164. package/dist/components/data/index.d.ts +10 -0
  165. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  166. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  167. package/dist/components/fields/Checkbox/context.js +1 -1
  168. package/dist/components/fields/ColorInput/ColorInput.d.ts +67 -0
  169. package/dist/components/fields/ColorInput/ColorInput.js +230 -0
  170. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -0
  171. package/dist/components/fields/ColorInput/index.d.ts +2 -0
  172. package/dist/components/fields/ColorPicker/ColorPicker.d.ts +64 -0
  173. package/dist/components/fields/ColorPicker/ColorPicker.js +189 -0
  174. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -0
  175. package/dist/components/fields/ColorPicker/index.d.ts +2 -0
  176. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.d.ts +50 -0
  177. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +269 -0
  178. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -0
  179. package/dist/components/fields/ColorSwatchGroup/index.d.ts +2 -0
  180. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  181. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  182. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  183. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  184. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  185. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  186. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  187. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  188. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  189. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  190. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  191. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  192. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  193. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  194. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  195. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  196. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  197. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  198. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  199. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  200. package/dist/components/fields/DatePicker/period.js +1 -1
  201. package/dist/components/fields/DatePicker/props.js +1 -1
  202. package/dist/components/fields/DatePicker/utils.js +1 -1
  203. package/dist/components/fields/FileInput/FileInput.js +1 -1
  204. package/dist/components/fields/FilterListBox/FilterListBox.d.ts +3 -3
  205. package/dist/components/fields/FilterListBox/FilterListBox.js +8 -6
  206. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  207. package/dist/components/fields/FilterPicker/FilterPicker.js +6 -1
  208. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  209. package/dist/components/fields/Input/Input.js +2 -2
  210. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  211. package/dist/components/fields/ListBox/ListBox.d.ts +7 -0
  212. package/dist/components/fields/ListBox/ListBox.js +4 -3
  213. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  214. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  215. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  216. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  217. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  218. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  219. package/dist/components/fields/PasswordInput/PasswordInput.d.ts +2 -2
  220. package/dist/components/fields/PasswordInput/PasswordInput.js +12 -2
  221. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  222. package/dist/components/fields/Picker/Picker.js +6 -1
  223. package/dist/components/fields/Picker/Picker.js.map +1 -1
  224. package/dist/components/fields/RadioGroup/Radio.d.ts +2 -2
  225. package/dist/components/fields/RadioGroup/Radio.js +4 -4
  226. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  227. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  228. package/dist/components/fields/RadioGroup/context.js +1 -1
  229. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  230. package/dist/components/fields/SearchInput/SearchInput.d.ts +2 -2
  231. package/dist/components/fields/SearchInput/SearchInput.js +17 -4
  232. package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
  233. package/dist/components/fields/Select/Select.js +1 -1
  234. package/dist/components/fields/Slider/Gradation.js +1 -1
  235. package/dist/components/fields/Slider/HueSlider.js +1 -1
  236. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  237. package/dist/components/fields/Slider/Slider.js +1 -1
  238. package/dist/components/fields/Slider/SliderBase.js +1 -1
  239. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  240. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  241. package/dist/components/fields/Slider/elements.js +1 -1
  242. package/dist/components/fields/Slider/index.js +1 -1
  243. package/dist/components/fields/Switch/Switch.js +1 -1
  244. package/dist/components/fields/TextArea/TextArea.d.ts +2 -2
  245. package/dist/components/fields/TextArea/TextArea.js +12 -5
  246. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  247. package/dist/components/fields/TextInput/TextInput.d.ts +2 -2
  248. package/dist/components/fields/TextInput/TextInput.js +15 -3
  249. package/dist/components/fields/TextInput/TextInput.js.map +1 -1
  250. package/dist/components/fields/TextInput/TextInputBase.d.ts +17 -1
  251. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  252. package/dist/components/fields/TextInput/TextInputBase.js.map +1 -1
  253. package/dist/components/fields/TextInput/index.d.ts +1 -1
  254. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  255. package/dist/components/fields/color/ColorPanel.js +152 -0
  256. package/dist/components/fields/color/ColorPanel.js.map +1 -0
  257. package/dist/components/fields/color/ColorSwatch.d.ts +22 -0
  258. package/dist/components/fields/color/ColorSwatch.js +58 -0
  259. package/dist/components/fields/color/ColorSwatch.js.map +1 -0
  260. package/dist/components/fields/color/channels.d.ts +13 -0
  261. package/dist/components/fields/color/channels.js +194 -0
  262. package/dist/components/fields/color/channels.js.map +1 -0
  263. package/dist/components/fields/color/color.d.ts +21 -0
  264. package/dist/components/fields/color/color.js +282 -0
  265. package/dist/components/fields/color/color.js.map +1 -0
  266. package/dist/components/fields/color/context.js +20 -0
  267. package/dist/components/fields/color/context.js.map +1 -0
  268. package/dist/components/fields/color/index.d.ts +4 -0
  269. package/dist/components/fields/index.d.ts +11 -1
  270. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  271. package/dist/components/form/Form/Field.js +1 -1
  272. package/dist/components/form/Form/Form.js +1 -1
  273. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  274. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  275. package/dist/components/form/Form/SubmitError.js +1 -1
  276. package/dist/components/form/Form/index.js +1 -1
  277. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  278. package/dist/components/form/Form/use-field/use-field.js +1 -1
  279. package/dist/components/form/Form/use-form.js +1 -1
  280. package/dist/components/form/Form/validation.js +1 -1
  281. package/dist/components/form/Label.js +1 -1
  282. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  283. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  284. package/dist/components/form/validation/use-validation-props.js +1 -1
  285. package/dist/components/form/wrapper.js +1 -1
  286. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  287. package/dist/components/helpers/IconSwitch/IconSwitch.d.ts +26 -0
  288. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  289. package/dist/components/layout/Board/Board.d.ts +55 -1
  290. package/dist/components/layout/Board/Board.js +278 -75
  291. package/dist/components/layout/Board/Board.js.map +1 -1
  292. package/dist/components/layout/Board/BoardProvider.js +1 -1
  293. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  294. package/dist/components/layout/Board/Widget.d.ts +16 -0
  295. package/dist/components/layout/Board/Widget.js +6 -3
  296. package/dist/components/layout/Board/Widget.js.map +1 -1
  297. package/dist/components/layout/Board/WidgetHost.js +81 -14
  298. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  299. package/dist/components/layout/Board/board-context.js +1 -1
  300. package/dist/components/layout/Board/board-context.js.map +1 -1
  301. package/dist/components/layout/Board/board-store.js +2 -2
  302. package/dist/components/layout/Board/board-store.js.map +1 -1
  303. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  304. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  305. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  306. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  307. package/dist/components/layout/Board/grid-core/group-move.js +132 -0
  308. package/dist/components/layout/Board/grid-core/group-move.js.map +1 -0
  309. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  310. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  311. package/dist/components/layout/Board/index.d.ts +2 -1
  312. package/dist/components/layout/Board/index.js +2 -2
  313. package/dist/components/layout/Board/index.js.map +1 -1
  314. package/dist/components/layout/Board/responsive-utils.js +1 -1
  315. package/dist/components/layout/Board/use-board-layout.js +17 -12
  316. package/dist/components/layout/Board/use-board-layout.js.map +1 -1
  317. package/dist/components/layout/Board/use-board-registry.js +139 -20
  318. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  319. package/dist/components/layout/Board/use-board-select-modifier-key.js +24 -0
  320. package/dist/components/layout/Board/use-board-select-modifier-key.js.map +1 -0
  321. package/dist/components/layout/Board/use-board-selection.d.ts +8 -0
  322. package/dist/components/layout/Board/use-board-selection.js +113 -0
  323. package/dist/components/layout/Board/use-board-selection.js.map +1 -0
  324. package/dist/components/layout/Flex.js +1 -1
  325. package/dist/components/layout/Flow.js +1 -1
  326. package/dist/components/layout/Grid.js +1 -1
  327. package/dist/components/layout/Panel.js +1 -1
  328. package/dist/components/layout/Prefix.js +1 -1
  329. package/dist/components/layout/ResizablePanel.js +1 -1
  330. package/dist/components/layout/Space.js +1 -1
  331. package/dist/components/layout/Suffix.js +1 -1
  332. package/dist/components/navigation/Pagination/Pagination.d.ts +9 -0
  333. package/dist/components/navigation/Pagination/Pagination.js +258 -0
  334. package/dist/components/navigation/Pagination/Pagination.js.map +1 -0
  335. package/dist/components/navigation/Pagination/index.d.ts +4 -0
  336. package/dist/components/navigation/Pagination/types.d.ts +81 -0
  337. package/dist/components/navigation/Pagination/use-pagination.d.ts +52 -0
  338. package/dist/components/navigation/Pagination/use-pagination.js +83 -0
  339. package/dist/components/navigation/Pagination/use-pagination.js.map +1 -0
  340. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  341. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  342. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  343. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  344. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  345. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  346. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  347. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  348. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  349. package/dist/components/navigation/Tabs/styled.js +1 -1
  350. package/dist/components/navigation/Tabs/types.js +1 -1
  351. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  352. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  353. package/dist/components/navigation/index.d.ts +5 -1
  354. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  355. package/dist/components/other/Calendar/Calendar.js +1 -1
  356. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  357. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  358. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  359. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  360. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  361. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  362. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  363. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  364. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  365. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  366. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  367. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  368. package/dist/components/overlays/Dialog/context.js +1 -1
  369. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  370. package/dist/components/overlays/Modal/Modal.js +1 -1
  371. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  372. package/dist/components/overlays/Modal/Overlay.js +1 -1
  373. package/dist/components/overlays/Modal/Popover.js +1 -1
  374. package/dist/components/overlays/Modal/Tray.js +1 -1
  375. package/dist/components/overlays/Modal/Underlay.js +1 -1
  376. package/dist/components/overlays/Notifications/Notification.js +1 -1
  377. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  378. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  379. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  380. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  381. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  382. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  383. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  384. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  385. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  386. package/dist/components/overlays/Notifications/index.js +1 -1
  387. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  388. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  389. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  390. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  391. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  392. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  393. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  394. package/dist/components/overlays/Toast/index.js +1 -1
  395. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  396. package/dist/components/overlays/Toast/useToast.js +1 -1
  397. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  398. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  399. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  400. package/dist/components/overlays/Tooltip/context.js +1 -1
  401. package/dist/components/portal/Portal.js +1 -1
  402. package/dist/components/portal/PortalProvider.js +1 -1
  403. package/dist/components/portal/usePortal.js +1 -1
  404. package/dist/components/shared/DraggableCollection.js +24 -8
  405. package/dist/components/shared/DraggableCollection.js.map +1 -1
  406. package/dist/components/shared/InvalidIcon.js +1 -1
  407. package/dist/components/shared/ValidIcon.js +1 -1
  408. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  409. package/dist/components/status/Spin/Cube.js +1 -1
  410. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  411. package/dist/components/status/Spin/Spin.js +1 -1
  412. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  413. package/dist/data/item-themes.js +1 -1
  414. package/dist/data/themes.js +1 -1
  415. package/dist/eslint-plugin/defaults.generated.js +227 -5
  416. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  417. package/dist/eslint-plugin/index.js +1 -1
  418. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  419. package/dist/i18n/I18nProvider.js +1 -1
  420. package/dist/i18n/createFormatter.js +1 -1
  421. package/dist/i18n/index.js +1 -1
  422. package/dist/i18n/instance.js +1 -1
  423. package/dist/i18n/locales/de-DE/uikit.js +44 -1
  424. package/dist/i18n/locales/en-US/uikit.js +44 -1
  425. package/dist/i18n/locales/en-US/uikit.json.d.ts +49 -1
  426. package/dist/i18n/locales/es-ES/uikit.js +44 -1
  427. package/dist/i18n/locales/es-MX/uikit.js +44 -1
  428. package/dist/i18n/locales/fr-FR/uikit.js +44 -1
  429. package/dist/i18n/locales/it-IT/uikit.js +44 -1
  430. package/dist/i18n/locales/ja-JP/uikit.js +44 -1
  431. package/dist/i18n/locales/nb-NO/uikit.js +44 -1
  432. package/dist/i18n/locales/pt-BR/uikit.js +44 -1
  433. package/dist/i18n/locales/pt-PT/uikit.js +44 -1
  434. package/dist/i18n/locales/sv-SE/uikit.js +44 -1
  435. package/dist/i18n/locales/vi-VN/uikit.js +44 -1
  436. package/dist/i18n/locales.js +1 -1
  437. package/dist/i18n/useFormatter.js +1 -1
  438. package/dist/i18n/useI18n.js +1 -1
  439. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  440. package/dist/icons/AdjustmentsIcon.js +1 -1
  441. package/dist/icons/AiIcon.js +1 -1
  442. package/dist/icons/AreaChartIcon.js +1 -1
  443. package/dist/icons/BackwardIcon.js +1 -1
  444. package/dist/icons/BarChartIcon.js +1 -1
  445. package/dist/icons/BellFilledIcon.js +1 -1
  446. package/dist/icons/BellIcon.js +1 -1
  447. package/dist/icons/BooleanIcon.js +1 -1
  448. package/dist/icons/CalendarEditIcon.js +1 -1
  449. package/dist/icons/CalendarIcon.js +1 -1
  450. package/dist/icons/CaretDownIcon.js +1 -1
  451. package/dist/icons/CaretUpIcon.js +1 -1
  452. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  453. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  454. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  455. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  456. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  457. package/dist/icons/ChartBarLineIcon.js +1 -1
  458. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  459. package/dist/icons/ChartBarStackedIcon.js +1 -1
  460. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  461. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  462. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  463. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  464. package/dist/icons/ChartBubbleIcon.js +1 -1
  465. package/dist/icons/ChartDonut2Icon.js +1 -1
  466. package/dist/icons/ChartFunnelIcon.js +1 -1
  467. package/dist/icons/ChartHeatmapIcon.js +1 -1
  468. package/dist/icons/ChartKPIIcon.js +1 -1
  469. package/dist/icons/ChartPie2Icon.js +1 -1
  470. package/dist/icons/ChartScatterIcon.js +1 -1
  471. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  472. package/dist/icons/CheckCircleIcon.js +1 -1
  473. package/dist/icons/CheckIcon.js +1 -1
  474. package/dist/icons/CircleFilledIcon.js +1 -1
  475. package/dist/icons/ClearIcon.js +1 -1
  476. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  477. package/dist/icons/CloseCircleIcon.js +1 -1
  478. package/dist/icons/CloseIcon.js +1 -1
  479. package/dist/icons/CodeIcon.js +1 -1
  480. package/dist/icons/ColumnTotalIcon.js +1 -1
  481. package/dist/icons/CopyIcon.js +1 -1
  482. package/dist/icons/CountIcon.js +1 -1
  483. package/dist/icons/CubeIcon.js +1 -1
  484. package/dist/icons/CubePauseIcon.js +1 -1
  485. package/dist/icons/CubePlayIcon.js +1 -1
  486. package/dist/icons/CurrencyDollarIcon.js +1 -1
  487. package/dist/icons/DangerIcon.js +1 -1
  488. package/dist/icons/DashboardIcon.js +1 -1
  489. package/dist/icons/DatabaseIcon.js +1 -1
  490. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  491. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  492. package/dist/icons/DirectionIcon.js +1 -1
  493. package/dist/icons/DonutIcon.js +1 -1
  494. package/dist/icons/DownIcon.js +1 -1
  495. package/dist/icons/EditIcon.js +1 -1
  496. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  497. package/dist/icons/ExclamationCircleIcon.js +1 -1
  498. package/dist/icons/ExclamationIcon.js +1 -1
  499. package/dist/icons/EyeIcon.js +1 -1
  500. package/dist/icons/EyeInvisibleIcon.js +1 -1
  501. package/dist/icons/FilterIcon.js +1 -1
  502. package/dist/icons/FolderFilledIcon.js +1 -1
  503. package/dist/icons/FolderIcon.js +1 -1
  504. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  505. package/dist/icons/FolderOpenIcon.js +1 -1
  506. package/dist/icons/ForwardIcon.js +1 -1
  507. package/dist/icons/GripVerticalIcon.js +1 -1
  508. package/dist/icons/HierarchyIcon.js +1 -1
  509. package/dist/icons/HierarchyOpenIcon.js +1 -1
  510. package/dist/icons/Icon.js +1 -1
  511. package/dist/icons/InfoCircleIcon.js +1 -1
  512. package/dist/icons/InfoIcon.js +1 -1
  513. package/dist/icons/KeyIcon.js +1 -1
  514. package/dist/icons/LeftIcon.js +1 -1
  515. package/dist/icons/LineChartIcon.js +1 -1
  516. package/dist/icons/LoadingIcon.js +1 -1
  517. package/dist/icons/LockFilledIcon.js +1 -1
  518. package/dist/icons/LockIcon.js +1 -1
  519. package/dist/icons/MoreIcon.js +1 -1
  520. package/dist/icons/NotAllowedIcon.js +1 -1
  521. package/dist/icons/Number123Icon.js +1 -1
  522. package/dist/icons/NumberIcon.js +1 -1
  523. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  524. package/dist/icons/PauseCircleIcon.js +1 -1
  525. package/dist/icons/PauseIcon.js +1 -1
  526. package/dist/icons/PercentageIcon.js +1 -1
  527. package/dist/icons/PieChartIcon.js +1 -1
  528. package/dist/icons/PipetteIcon.d.ts +12 -0
  529. package/dist/icons/PipetteIcon.js +11 -0
  530. package/dist/icons/PipetteIcon.js.map +1 -0
  531. package/dist/icons/PlayCircleIcon.js +1 -1
  532. package/dist/icons/PlayIcon.js +1 -1
  533. package/dist/icons/PlusIcon.js +1 -1
  534. package/dist/icons/ProgressBarIcon.js +1 -1
  535. package/dist/icons/ReloadIcon.js +1 -1
  536. package/dist/icons/ReportIcon.js +1 -1
  537. package/dist/icons/ReturnIcon.js +1 -1
  538. package/dist/icons/RightIcon.js +1 -1
  539. package/dist/icons/RowTotalsIcon.js +1 -1
  540. package/dist/icons/SchemeIcon.js +1 -1
  541. package/dist/icons/SearchIcon.js +1 -1
  542. package/dist/icons/SemanticQueryIcon.js +1 -1
  543. package/dist/icons/SettingsIcon.js +1 -1
  544. package/dist/icons/ShieldFilledIcon.js +1 -1
  545. package/dist/icons/ShieldIcon.js +1 -1
  546. package/dist/icons/SlashIcon.js +1 -1
  547. package/dist/icons/SparklesIcon.js +1 -1
  548. package/dist/icons/SqlIcon.js +1 -1
  549. package/dist/icons/StatsIcon.js +1 -1
  550. package/dist/icons/StopIcon.js +1 -1
  551. package/dist/icons/StringIcon.js +1 -1
  552. package/dist/icons/SubtotalsIcon.js +1 -1
  553. package/dist/icons/SwitchIcon.js +1 -1
  554. package/dist/icons/TableIcon.js +1 -1
  555. package/dist/icons/ThumbsDownIcon.js +1 -1
  556. package/dist/icons/ThumbsUpIcon.js +1 -1
  557. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  558. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  559. package/dist/icons/ThunderboltIcon.js +1 -1
  560. package/dist/icons/TimeIcon.js +1 -1
  561. package/dist/icons/TrashIcon.js +1 -1
  562. package/dist/icons/UnlockIcon.js +1 -1
  563. package/dist/icons/UpIcon.js +1 -1
  564. package/dist/icons/UserGroupIcon.js +1 -1
  565. package/dist/icons/UserIcon.js +1 -1
  566. package/dist/icons/UserLockIcon.js +1 -1
  567. package/dist/icons/ViewIcon.js +1 -1
  568. package/dist/icons/WarningFilledIcon.js +1 -1
  569. package/dist/icons/WarningIcon.js +1 -1
  570. package/dist/icons/index.d.ts +1 -0
  571. package/dist/icons/wrap-icon.js +1 -1
  572. package/dist/index.d.ts +31 -12
  573. package/dist/index.js +24 -11
  574. package/dist/index.js.map +1 -1
  575. package/dist/provider.js +1 -1
  576. package/dist/providers/TrackingProvider.js +1 -1
  577. package/dist/providers/navigationAdapter.default.js +1 -1
  578. package/dist/tokens/base.js +1 -1
  579. package/dist/tokens/colors.js +1 -1
  580. package/dist/tokens/index.js +1 -1
  581. package/dist/tokens/layout.js +1 -1
  582. package/dist/tokens/lazy-styles.js +1 -1
  583. package/dist/tokens/palette-config.js +1 -1
  584. package/dist/tokens/palette.js +1 -1
  585. package/dist/tokens/shadows.js +1 -1
  586. package/dist/tokens/sizes.js +1 -1
  587. package/dist/tokens/spacing.js +1 -1
  588. package/dist/tokens/typography.d.ts +1 -1
  589. package/dist/tokens/typography.js +11 -2
  590. package/dist/tokens/typography.js.map +1 -1
  591. package/dist/utils/ResizeSensor.js +1 -1
  592. package/dist/utils/index.d.ts +1 -0
  593. package/dist/utils/is-dev-env.js +1 -1
  594. package/dist/utils/modules.js +1 -1
  595. package/dist/utils/promise.js +1 -1
  596. package/dist/utils/raf.js +1 -1
  597. package/dist/utils/random.js +1 -1
  598. package/dist/utils/range.js +1 -1
  599. package/dist/utils/react/RenderCache.js +1 -1
  600. package/dist/utils/react/Slots.js +1 -1
  601. package/dist/utils/react/chain.js +1 -1
  602. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  603. package/dist/utils/react/index.d.ts +1 -0
  604. package/dist/utils/react/index.js +2 -1
  605. package/dist/utils/react/interactions.js +1 -1
  606. package/dist/utils/react/isTextOnly.js +1 -1
  607. package/dist/utils/react/mapProps.js +1 -1
  608. package/dist/utils/react/mergeProps.js +1 -1
  609. package/dist/utils/react/nullableValue.js +1 -1
  610. package/dist/utils/react/resolveIcon.js +1 -1
  611. package/dist/utils/react/sharedStore.js +1 -1
  612. package/dist/utils/react/useBufferedValue.d.ts +56 -0
  613. package/dist/utils/react/useBufferedValue.js +86 -0
  614. package/dist/utils/react/useBufferedValue.js.map +1 -0
  615. package/dist/utils/react/useCombinedRefs.js +1 -1
  616. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  617. package/dist/utils/react/useEventBus.js +1 -1
  618. package/dist/utils/react/useId.js +1 -1
  619. package/dist/utils/react/useIsDarwin.js +1 -1
  620. package/dist/utils/react/useKeySymbols.js +1 -1
  621. package/dist/utils/react/useLayoutEffect.js +1 -1
  622. package/dist/utils/react/useLocalStorage.js +1 -1
  623. package/dist/utils/react/useMergeStyles.js +1 -1
  624. package/dist/utils/react/usePopoverSync.js +1 -1
  625. package/dist/utils/react/useQaProps.js +1 -1
  626. package/dist/utils/react/useViewportSize.js +1 -1
  627. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  628. package/dist/utils/selection.js +1 -1
  629. package/dist/utils/styles.js +1 -1
  630. package/dist/utils/tree.js +1 -1
  631. package/dist/utils/warnings.js +1 -1
  632. package/dist/version.js +2 -2
  633. package/docs/components/actions/ButtonGroup.md +1 -1
  634. package/docs/components/data/DataTable.md +298 -0
  635. package/docs/components/data/ItemTable.md +984 -0
  636. package/docs/components/fields/ColorInput.md +284 -0
  637. package/docs/components/fields/ColorPicker.md +212 -0
  638. package/docs/components/fields/ColorSwatchGroup.md +206 -0
  639. package/docs/components/fields/FilterPicker.md +1 -1
  640. package/docs/components/fields/ListBox.md +4 -0
  641. package/docs/components/fields/PasswordInput.md +1 -0
  642. package/docs/components/fields/Picker.md +1 -1
  643. package/docs/components/fields/SearchInput.md +1 -0
  644. package/docs/components/fields/TextArea.md +1 -0
  645. package/docs/components/fields/TextInput.md +1 -0
  646. package/docs/components/layout/Board.md +154 -6
  647. package/docs/components/navigation/Pagination.md +245 -0
  648. package/package.json +8 -3
  649. package/dist/components/organisms/FileTabs/FileTabs.d.ts +0 -54
  650. package/dist/components/organisms/FileTabs/FileTabs.js +0 -282
  651. package/dist/components/organisms/FileTabs/FileTabs.js.map +0 -1
  652. package/docs/components/organisms/FileTabs.md +0 -51
@@ -0,0 +1,113 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
3
+ import { useI18n } from "../../../i18n/useI18n.js";
4
+ import { useEffect, useMemo, useRef, useState } from "react";
5
+
6
+ //#region src/components/layout/Board/use-board-selection.ts
7
+ const EMPTY_KEYS = [];
8
+ /** Zero-width space. See `announce` below. */
9
+ const ANNOUNCEMENT_NUDGE = "​";
10
+ /**
11
+ * Headless selection state for a single board.
12
+ *
13
+ * Deliberately shaped like `useBoardLayout`: controlled (`selectedKeys`) or
14
+ * uncontrolled (`defaultSelectedKeys`), with a synchronous ref mirror for the
15
+ * drag engine and a single commit path so every entry point — click, keyboard,
16
+ * marquee, pruning — produces exactly one `onSelectionChange` and one
17
+ * announcement.
18
+ */
19
+ function useBoardSelection(options) {
20
+ const { selectionMode, selectedKeys: controlledKeys, defaultSelectedKeys, onSelectionChange, layout, getLabel } = options;
21
+ const { t } = useI18n();
22
+ const isControlled = controlledKeys !== void 0;
23
+ const isEnabled = selectionMode !== "none";
24
+ const [uncontrolledKeys, setUncontrolledKeys] = useState(() => defaultSelectedKeys ?? EMPTY_KEYS);
25
+ const orderedIds = useMemo(() => layout.map((it) => it.i), [layout]);
26
+ const selectedKeys = useMemo(() => {
27
+ if (!isEnabled) return EMPTY_KEYS;
28
+ const requested = new Set(controlledKeys ?? uncontrolledKeys);
29
+ return orderedIds.filter((id) => requested.has(id));
30
+ }, [
31
+ isEnabled,
32
+ controlledKeys,
33
+ uncontrolledKeys,
34
+ orderedIds
35
+ ]);
36
+ const selectedKeySet = useMemo(() => new Set(selectedKeys), [selectedKeys]);
37
+ const selectedKeysRef = useRef(selectedKeySet);
38
+ selectedKeysRef.current = selectedKeySet;
39
+ const onSelectionChangeEvent = useEvent((next) => onSelectionChange?.(next));
40
+ const [announcement, setAnnouncement] = useState("");
41
+ const announcementParityRef = useRef(false);
42
+ const announce = useEvent((keys, hadSelection) => {
43
+ let message;
44
+ if (keys.length === 0) {
45
+ if (!hadSelection) return;
46
+ message = t("board.selectionCleared", "Selection cleared");
47
+ } else if (keys.length === 1) message = t("board.widgetSelected", "{{name}} selected", { name: getLabel(keys[0]) });
48
+ else message = t("board.widgetsSelected", "{{count}} widgets selected", { count: keys.length });
49
+ announcementParityRef.current = !announcementParityRef.current;
50
+ setAnnouncement(announcementParityRef.current ? message : `${message}${ANNOUNCEMENT_NUDGE}`);
51
+ });
52
+ const commit = useEvent((nextKeys) => {
53
+ const requested = new Set(nextKeys);
54
+ const next = orderedIds.filter((id) => requested.has(id));
55
+ const current = selectedKeysRef.current;
56
+ if (next.length === current.size && next.every((id) => current.has(id))) return;
57
+ selectedKeysRef.current = new Set(next);
58
+ if (!isControlled) setUncontrolledKeys(next);
59
+ announce(next, current.size > 0);
60
+ onSelectionChangeEvent(next);
61
+ });
62
+ useEffect(() => {
63
+ if (isControlled || !isEnabled || uncontrolledKeys.length === 0) return;
64
+ const live = new Set(orderedIds);
65
+ const pruned = uncontrolledKeys.filter((key) => live.has(key));
66
+ if (pruned.length !== uncontrolledKeys.length) {
67
+ selectedKeysRef.current = new Set(pruned);
68
+ setUncontrolledKeys(pruned);
69
+ onSelectionChangeEvent(pruned);
70
+ }
71
+ }, [
72
+ isControlled,
73
+ isEnabled,
74
+ uncontrolledKeys,
75
+ orderedIds,
76
+ onSelectionChangeEvent
77
+ ]);
78
+ return {
79
+ selectedKeySet,
80
+ selectedKeysRef,
81
+ setSelection: useEvent((keys) => {
82
+ if (!isEnabled) return;
83
+ commit(selectionMode === "single" ? firstOf(keys) : keys);
84
+ }),
85
+ select: useEvent((key, additive) => {
86
+ if (!isEnabled) return;
87
+ if (selectionMode === "single") {
88
+ commit(additive && selectedKeysRef.current.has(key) ? [] : [key]);
89
+ return;
90
+ }
91
+ if (!additive) {
92
+ commit([key]);
93
+ return;
94
+ }
95
+ const next = new Set(selectedKeysRef.current);
96
+ if (!next.delete(key)) next.add(key);
97
+ commit(next);
98
+ }),
99
+ clearSelection: useEvent(() => {
100
+ if (!isEnabled) return;
101
+ commit([]);
102
+ }),
103
+ announcement
104
+ };
105
+ }
106
+ function firstOf(keys) {
107
+ for (const key of keys) return [key];
108
+ return [];
109
+ }
110
+
111
+ //#endregion
112
+ export { useBoardSelection };
113
+ //# sourceMappingURL=use-board-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-board-selection.js","names":[],"sources":["../../../../src/components/layout/Board/use-board-selection.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useI18n } from '../../../i18n';\n\nimport type { MutableRefObject } from 'react';\nimport type { LayoutItem } from './grid-core';\n\nexport type BoardSelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface UseBoardSelectionOptions {\n selectionMode: BoardSelectionMode;\n /** Controlled selection. */\n selectedKeys?: string[];\n /** Initial selection for uncontrolled usage. */\n defaultSelectedKeys?: string[];\n onSelectionChange?: (keys: string[]) => void;\n /** Live layout — supplies both the key order and the set of valid keys. */\n layout: LayoutItem[];\n /** Accessible name of a widget, for the single-selection announcement. */\n getLabel: (key: string) => string;\n}\n\nexport interface UseBoardSelectionResult {\n /** The effective selection: provided keys ∩ live layout, in layout order. */\n selectedKeySet: ReadonlySet<string>;\n /**\n * Synchronously-updated mirror of `selectedKeySet`. Handlers that run before\n * React re-renders — notably `useMove`'s `onMoveStart`, which has to decide\n * single-drag vs. group-drag on the spot — must read this rather than the\n * state, which would be one render stale.\n */\n selectedKeysRef: MutableRefObject<ReadonlySet<string>>;\n /** Replace the selection wholesale (marquee, programmatic). */\n setSelection: (keys: Iterable<string>) => void;\n /**\n * Apply a single-key gesture.\n *\n * `additive` (a modifier-held click, or any keyboard toggle) flips the key's\n * membership. A plain gesture replaces the selection with just this key — it\n * never clears, because a widget is a large surface the user also clicks to\n * work with, and having the second click silently deselect reads as a bug.\n * Deselecting is <kbd>Escape</kbd>, or an additive gesture.\n */\n select: (key: string, additive: boolean) => void;\n clearSelection: () => void;\n /** Live-region text. Only changes when the selection commits. */\n announcement: string;\n}\n\nconst EMPTY_KEYS: readonly string[] = [];\n\n/** Zero-width space. See `announce` below. */\nconst ANNOUNCEMENT_NUDGE = '\\u200B';\n\n/**\n * Headless selection state for a single board.\n *\n * Deliberately shaped like `useBoardLayout`: controlled (`selectedKeys`) or\n * uncontrolled (`defaultSelectedKeys`), with a synchronous ref mirror for the\n * drag engine and a single commit path so every entry point — click, keyboard,\n * marquee, pruning — produces exactly one `onSelectionChange` and one\n * announcement.\n */\nexport function useBoardSelection(\n options: UseBoardSelectionOptions,\n): UseBoardSelectionResult {\n const {\n selectionMode,\n selectedKeys: controlledKeys,\n defaultSelectedKeys,\n onSelectionChange,\n layout,\n getLabel,\n } = options;\n\n const { t } = useI18n();\n const isControlled = controlledKeys !== undefined;\n const isEnabled = selectionMode !== 'none';\n\n const [uncontrolledKeys, setUncontrolledKeys] = useState<readonly string[]>(\n () => defaultSelectedKeys ?? EMPTY_KEYS,\n );\n\n // Layout order, not click order: a marquee has no meaningful click order, and\n // a stable order makes group operations reproducible for consumers.\n const orderedIds = useMemo(() => layout.map((it) => it.i), [layout]);\n\n const selectedKeys = useMemo(() => {\n if (!isEnabled) {\n return EMPTY_KEYS as string[];\n }\n\n const requested = new Set(controlledKeys ?? uncontrolledKeys);\n\n // Intersecting with the live layout on every render is what makes a stale\n // key harmless: it simply highlights nothing. No effect, no flash, and no\n // need for the consumer to clean up after removing a widget.\n return orderedIds.filter((id) => requested.has(id));\n }, [isEnabled, controlledKeys, uncontrolledKeys, orderedIds]);\n\n const selectedKeySet = useMemo(() => new Set(selectedKeys), [selectedKeys]);\n\n const selectedKeysRef = useRef<ReadonlySet<string>>(selectedKeySet);\n selectedKeysRef.current = selectedKeySet;\n\n const onSelectionChangeEvent = useEvent((next: string[]) =>\n onSelectionChange?.(next),\n );\n\n // ---- Announcements --------------------------------------------------------\n\n const [announcement, setAnnouncement] = useState('');\n // Screen readers skip a live-region update whose text is identical to the\n // previous one, which would silently drop the very common select → deselect →\n // reselect sequence. Alternating an invisible suffix keeps every update\n // distinct without changing what is spoken.\n const announcementParityRef = useRef(false);\n\n const announce = useEvent((keys: string[], hadSelection: boolean) => {\n let message: string;\n\n if (keys.length === 0) {\n if (!hadSelection) {\n return;\n }\n message = t('board.selectionCleared', 'Selection cleared');\n } else if (keys.length === 1) {\n message = t('board.widgetSelected', '{{name}} selected', {\n name: getLabel(keys[0]!),\n });\n } else {\n message = t('board.widgetsSelected', '{{count}} widgets selected', {\n count: keys.length,\n });\n }\n\n announcementParityRef.current = !announcementParityRef.current;\n setAnnouncement(\n announcementParityRef.current\n ? message\n : `${message}${ANNOUNCEMENT_NUDGE}`,\n );\n });\n\n // ---- Commit ---------------------------------------------------------------\n\n const commit = useEvent((nextKeys: Iterable<string>) => {\n const requested = new Set(nextKeys);\n const next = orderedIds.filter((id) => requested.has(id));\n const current = selectedKeysRef.current;\n\n if (next.length === current.size && next.every((id) => current.has(id))) {\n return;\n }\n\n // Keep the ref in step *before* the state lands, so a gesture that reads it\n // later in the same tick sees the new selection.\n selectedKeysRef.current = new Set(next);\n\n if (!isControlled) {\n setUncontrolledKeys(next);\n }\n\n announce(next, current.size > 0);\n onSelectionChangeEvent(next);\n });\n\n // ---- Pruning --------------------------------------------------------------\n\n // Uncontrolled state is the only copy of the selection, so a removed widget\n // has to be dropped from it and the change reported. In controlled mode the\n // consumer removed the widget and owns its own state — emitting here would\n // fight the controlled contract and can loop.\n useEffect(() => {\n if (isControlled || !isEnabled || uncontrolledKeys.length === 0) {\n return;\n }\n\n const live = new Set(orderedIds);\n const pruned = uncontrolledKeys.filter((key) => live.has(key));\n\n if (pruned.length !== uncontrolledKeys.length) {\n selectedKeysRef.current = new Set(pruned);\n setUncontrolledKeys(pruned);\n onSelectionChangeEvent(pruned);\n }\n }, [\n isControlled,\n isEnabled,\n uncontrolledKeys,\n orderedIds,\n onSelectionChangeEvent,\n ]);\n\n // ---- Gestures -------------------------------------------------------------\n\n const setSelection = useEvent((keys: Iterable<string>) => {\n if (!isEnabled) {\n return;\n }\n commit(selectionMode === 'single' ? firstOf(keys) : keys);\n });\n\n const select = useEvent((key: string, additive: boolean) => {\n if (!isEnabled) {\n return;\n }\n\n if (selectionMode === 'single') {\n // A modifier can still toggle the one selected widget off; a plain\n // gesture always lands on the widget the user aimed at.\n commit(additive && selectedKeysRef.current.has(key) ? [] : [key]);\n\n return;\n }\n\n if (!additive) {\n commit([key]);\n\n return;\n }\n\n const next = new Set(selectedKeysRef.current);\n if (!next.delete(key)) {\n next.add(key);\n }\n commit(next);\n });\n\n const clearSelection = useEvent(() => {\n if (!isEnabled) {\n return;\n }\n commit([]);\n });\n\n return {\n selectedKeySet,\n selectedKeysRef,\n setSelection,\n select,\n clearSelection,\n announcement,\n };\n}\n\nfunction firstOf(keys: Iterable<string>): string[] {\n for (const key of keys) {\n return [key];\n }\n\n return [];\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { BASE_STYLES, BLOCK_STYLES, COLOR_STYLES, DIMENSION_STYLES, OUTER_STYLES, tasty } from "@tenphi/tasty";
3
3
  import { forwardRef, useMemo } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useLayoutEffect as useLayoutEffect$1 } from "../../utils/react/useLayoutEffect.js";
4
4
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../utils/react/mergeProps.js";
3
3
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../_internal/hooks/use-event.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.155.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
4
4
  import { CONTAINER_STYLES, filterBaseProps, parseStyle, tasty } from "@tenphi/tasty";
@@ -0,0 +1,9 @@
1
+
2
+ import { CubePaginationProps } from "./types.js";
3
+ import * as react from "react";
4
+
5
+ //#region src/components/navigation/Pagination/Pagination.d.ts
6
+ declare const _Pagination: react.ForwardRefExoticComponent<CubePaginationProps & react.RefAttributes<HTMLElement>>;
7
+ //#endregion
8
+ export { _Pagination };
9
+ //# sourceMappingURL=Pagination.d.ts.map
@@ -0,0 +1,258 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.157.0 | Cube Dev Team */
2
+ import { extractStyles } from "../../../utils/styles.js";
3
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
4
+ import { useI18n } from "../../../i18n/useI18n.js";
5
+ import { useFormatter } from "../../../i18n/useFormatter.js";
6
+ import { BackwardIcon } from "../../../icons/BackwardIcon.js";
7
+ import { ForwardIcon } from "../../../icons/ForwardIcon.js";
8
+ import { LeftIcon } from "../../../icons/LeftIcon.js";
9
+ import { RightIcon } from "../../../icons/RightIcon.js";
10
+ import { Button } from "../../actions/index.js";
11
+ import { __Select } from "../../fields/Select/Select.js";
12
+ import { clampPage, getPageInfo, getPaginationRange } from "./use-pagination.js";
13
+ import { OUTER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
14
+ import { forwardRef, useMemo } from "react";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ import { useControlledState } from "@react-stately/utils";
17
+
18
+ //#region src/components/navigation/Pagination/Pagination.tsx
19
+ const PaginationElement = tasty({
20
+ qa: "Pagination",
21
+ as: "nav",
22
+ styles: {
23
+ display: "flex",
24
+ flow: "row",
25
+ gap: "1x",
26
+ placeItems: "center",
27
+ placeContent: "start",
28
+ Summary: {
29
+ preset: {
30
+ "": "t3",
31
+ "size=xsmall": "t4"
32
+ },
33
+ color: "#dark-03",
34
+ whiteSpace: "nowrap"
35
+ },
36
+ Controls: {
37
+ display: "flex",
38
+ flow: "row",
39
+ gap: ".5x",
40
+ placeItems: "center"
41
+ },
42
+ Gap: {
43
+ display: "grid",
44
+ placeItems: "center",
45
+ width: "min $gap-size",
46
+ height: "$gap-size",
47
+ preset: "t3",
48
+ color: "#dark-04",
49
+ userSelect: "none"
50
+ },
51
+ Pages: {
52
+ display: "flex",
53
+ flow: "row",
54
+ gap: "1bw",
55
+ placeItems: "center"
56
+ },
57
+ "$gap-size": {
58
+ "": "$size-sm",
59
+ "size=xsmall": "$size-xs",
60
+ "size=medium": "$size-md"
61
+ }
62
+ },
63
+ styleProps: OUTER_STYLES
64
+ });
65
+ const NavButton = tasty(Button, {
66
+ type: "clear",
67
+ styles: { border: true }
68
+ });
69
+ const PageButton = tasty(Button, { type: "clear" });
70
+ function formatRange(info) {
71
+ return `${(info.page - 1) * info.pageSize + 1}–${info.total > 0 ? Math.min(info.page * info.pageSize, info.total) : info.page * info.pageSize}`;
72
+ }
73
+ function Pagination(props, ref) {
74
+ const { page: pageProp, defaultPage, onPageChange, totalPages: totalPagesProp, total, pageSize: pageSizeProp, defaultPageSize, pageSizeOptions, onPageSizeChange, type = "numbers", siblingCount = 1, boundaryCount = 1, size = "small", isDisabled, hasNextPage, isCompact = false, summary = false, labelFormatter, ariaLabel, pageSizeSelectStyles, qa, mods, ...rest } = props;
75
+ const { t } = useI18n();
76
+ const { formatNumber } = useFormatter();
77
+ const [pageSize, setPageSize] = useControlledState(pageSizeProp, defaultPageSize ?? 50, onPageSizeChange);
78
+ const [page, setPage] = useControlledState(pageProp, defaultPage ?? 1, onPageChange);
79
+ const isCountable = totalPagesProp != null || total != null;
80
+ const info = isCountable ? getPageInfo({
81
+ page,
82
+ pageSize,
83
+ total: total ?? 0,
84
+ totalPages: totalPagesProp
85
+ }) : {
86
+ page: clampPage(page, Number.MAX_SAFE_INTEGER),
87
+ pageSize,
88
+ totalPages: 0,
89
+ total: 0,
90
+ from: 0,
91
+ to: 0
92
+ };
93
+ const { totalPages } = info;
94
+ const goTo = useEvent((next) => {
95
+ const clamped = isCountable ? clampPage(next, totalPages) : Math.max(next, 1);
96
+ if (clamped !== info.page) setPage(clamped);
97
+ });
98
+ const onPageSizeSelectionChange = useEvent((value) => {
99
+ setPageSize(Number(value));
100
+ setPage(1);
101
+ });
102
+ const onPageSelectionChange = useEvent((value) => {
103
+ goTo(Number(value));
104
+ });
105
+ const pageItems = useMemo(() => type === "numbers" && isCountable ? getPaginationRange({
106
+ page: info.page,
107
+ totalPages,
108
+ siblingCount,
109
+ boundaryCount
110
+ }) : [], [
111
+ type,
112
+ isCountable,
113
+ info.page,
114
+ totalPages,
115
+ siblingCount,
116
+ boundaryCount
117
+ ]);
118
+ const selectEntries = useMemo(() => type === "select" && isCountable && totalPages <= 200 ? Array.from({ length: totalPages }, (_, i) => i + 1) : null, [
119
+ type,
120
+ isCountable,
121
+ totalPages
122
+ ]);
123
+ const isFirst = info.page <= 1;
124
+ const isLast = isCountable ? info.page >= totalPages : !hasNextPage;
125
+ const styles = extractStyles(props, OUTER_STYLES);
126
+ const summaryNode = summary === false ? null : typeof summary === "function" ? summary(info) : info.total > 0 ? t("pagination.summary", "{{from}}–{{to}} of {{total}}", {
127
+ from: formatNumber(info.from),
128
+ to: formatNumber(info.to),
129
+ total: formatNumber(info.total)
130
+ }) : null;
131
+ function renderPageControl() {
132
+ if (selectEntries) return /* @__PURE__ */ jsx(__Select, {
133
+ qa: "PaginationPageSelect",
134
+ size,
135
+ isDisabled,
136
+ "aria-label": t("pagination.selectPage", "Select page"),
137
+ selectedKey: String(info.page),
138
+ width: "min 15x",
139
+ styles: pageSizeSelectStyles,
140
+ onSelectionChange: onPageSelectionChange,
141
+ children: selectEntries.map((entry) => {
142
+ const entryInfo = {
143
+ ...info,
144
+ page: entry
145
+ };
146
+ const label = labelFormatter?.(entryInfo) ?? (info.total > 0 ? formatRange(entryInfo) : t("pagination.page", "Page {{page}}", { page: entry }));
147
+ return /* @__PURE__ */ jsx(__Select.Item, {
148
+ textValue: String(label),
149
+ children: label
150
+ }, entry);
151
+ })
152
+ });
153
+ if (type === "numbers" && pageItems.length > 0) return /* @__PURE__ */ jsx("div", {
154
+ "data-element": "Pages",
155
+ children: pageItems.map((entry, index) => entry === "gap" ? /* @__PURE__ */ jsx("div", {
156
+ "data-element": "Gap",
157
+ "aria-hidden": "true",
158
+ children: "…"
159
+ }, `gap-${index}`) : /* @__PURE__ */ jsx(PageButton, {
160
+ qa: `PaginationPage_${entry}`,
161
+ size,
162
+ type: entry === info.page ? "outline" : "clear",
163
+ isDisabled,
164
+ "aria-label": t("pagination.page", "Page {{page}}", { page: entry }),
165
+ "aria-current": entry === info.page ? "page" : void 0,
166
+ onPress: () => goTo(entry),
167
+ children: entry
168
+ }, entry))
169
+ });
170
+ if (!isCountable) return null;
171
+ return /* @__PURE__ */ jsx("div", {
172
+ "data-element": "Summary",
173
+ "data-qa": "PaginationPageLabel",
174
+ children: t("pagination.pageOf", "{{page}} of {{totalPages}}", {
175
+ page: info.page,
176
+ totalPages
177
+ })
178
+ });
179
+ }
180
+ const showEdgeButtons = !isCompact && isCountable;
181
+ return /* @__PURE__ */ jsxs(PaginationElement, {
182
+ ...filterBaseProps(rest, { eventProps: true }),
183
+ ref,
184
+ qa: qa || "Pagination",
185
+ styles,
186
+ mods: {
187
+ size,
188
+ ...mods
189
+ },
190
+ "aria-label": ariaLabel ?? t("pagination.ariaLabel", "Pagination"),
191
+ children: [
192
+ summaryNode ? /* @__PURE__ */ jsx("div", {
193
+ "data-element": "Summary",
194
+ children: summaryNode
195
+ }) : null,
196
+ pageSizeOptions && onPageSizeChange ? /* @__PURE__ */ jsx(__Select, {
197
+ qa: "PaginationPageSizeSelect",
198
+ size,
199
+ isDisabled,
200
+ "aria-label": t("pagination.itemsPerPage", "Items per page"),
201
+ selectedKey: String(pageSize),
202
+ styles: pageSizeSelectStyles,
203
+ onSelectionChange: onPageSizeSelectionChange,
204
+ children: pageSizeOptions.map((option) => {
205
+ const label = t("pagination.itemsPerPageOption", "{{size}} / page", { size: option });
206
+ return /* @__PURE__ */ jsx(__Select.Item, {
207
+ textValue: label,
208
+ children: label
209
+ }, option);
210
+ })
211
+ }) : null,
212
+ /* @__PURE__ */ jsxs("div", {
213
+ "data-element": "Controls",
214
+ children: [
215
+ showEdgeButtons ? /* @__PURE__ */ jsx(NavButton, {
216
+ qa: "PaginationFirstButton",
217
+ size,
218
+ icon: /* @__PURE__ */ jsx(BackwardIcon, {}),
219
+ isDisabled: isFirst || isDisabled,
220
+ "aria-label": t("pagination.firstPage", "First page"),
221
+ onPress: () => goTo(1)
222
+ }) : null,
223
+ /* @__PURE__ */ jsx(NavButton, {
224
+ qa: "PaginationPrevButton",
225
+ size,
226
+ icon: /* @__PURE__ */ jsx(LeftIcon, {}),
227
+ isDisabled: isFirst || isDisabled,
228
+ "aria-label": t("pagination.previousPage", "Previous page"),
229
+ onPress: () => goTo(info.page - 1)
230
+ }),
231
+ renderPageControl(),
232
+ /* @__PURE__ */ jsx(NavButton, {
233
+ qa: "PaginationNextButton",
234
+ size,
235
+ icon: /* @__PURE__ */ jsx(RightIcon, {}),
236
+ isDisabled: isLast || isDisabled,
237
+ "aria-label": t("pagination.nextPage", "Next page"),
238
+ onPress: () => goTo(info.page + 1)
239
+ }),
240
+ showEdgeButtons ? /* @__PURE__ */ jsx(NavButton, {
241
+ qa: "PaginationLastButton",
242
+ size,
243
+ icon: /* @__PURE__ */ jsx(ForwardIcon, {}),
244
+ isDisabled: isLast || isDisabled,
245
+ "aria-label": t("pagination.lastPage", "Last page"),
246
+ onPress: () => goTo(totalPages)
247
+ }) : null
248
+ ]
249
+ })
250
+ ]
251
+ });
252
+ }
253
+ const _Pagination = forwardRef(Pagination);
254
+ _Pagination.displayName = "Pagination";
255
+
256
+ //#endregion
257
+ export { _Pagination };
258
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.js","names":["Select"],"sources":["../../../../src/components/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { useControlledState } from '@react-stately/utils';\nimport { filterBaseProps, OUTER_STYLES, tasty } from '@tenphi/tasty';\nimport { forwardRef, useMemo } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useFormatter, useI18n } from '../../../i18n';\nimport { BackwardIcon, ForwardIcon, LeftIcon, RightIcon } from '../../../icons';\nimport { extractStyles } from '../../../utils/styles';\nimport { Button } from '../../actions';\nimport { Select } from '../../fields/Select';\n\nimport { clampPage, getPageInfo, getPaginationRange } from './use-pagination';\n\nimport type { ForwardedRef, ReactElement } from 'react';\nimport type { CubePaginationProps, CubeTablePageInfo } from './types';\n\nconst PaginationElement = tasty({\n qa: 'Pagination',\n as: 'nav',\n styles: {\n display: 'flex',\n flow: 'row',\n gap: '1x',\n placeItems: 'center',\n placeContent: 'start',\n\n Summary: {\n // Follows the control's size rather than being fixed, so the summary\n // matches whatever the buttons beside it are.\n preset: { '': 't3', 'size=xsmall': 't4' },\n color: '#dark-03',\n whiteSpace: 'nowrap',\n },\n\n Controls: {\n display: 'flex',\n flow: 'row',\n gap: '.5x',\n placeItems: 'center',\n },\n\n Gap: {\n display: 'grid',\n placeItems: 'center',\n width: 'min $gap-size',\n height: '$gap-size',\n preset: 't3',\n color: '#dark-04',\n userSelect: 'none',\n },\n\n /**\n * The page numbers sit tighter than the nav buttons around them: they read\n * as one run of pages, not as separate controls, and a hairline is enough\n * to keep the current page's outline off its neighbours.\n */\n Pages: {\n display: 'flex',\n flow: 'row',\n gap: '1bw',\n placeItems: 'center',\n },\n\n '$gap-size': {\n '': '$size-sm',\n 'size=xsmall': '$size-xs',\n 'size=medium': '$size-md',\n },\n },\n styleProps: OUTER_STYLES,\n});\n\nconst NavButton = tasty(Button, {\n type: 'clear',\n styles: { border: true },\n});\n\n// Page buttons are borderless so the current page — which renders as `outline`\n// and therefore draws its own border — is the only bordered one in the run.\nconst PageButton = tasty(Button, {\n type: 'clear',\n});\n\nfunction formatRange(info: CubeTablePageInfo): string {\n const start = (info.page - 1) * info.pageSize + 1;\n const end =\n info.total > 0\n ? Math.min(info.page * info.pageSize, info.total)\n : info.page * info.pageSize;\n\n return `${start}–${end}`;\n}\n\nfunction Pagination(\n props: CubePaginationProps,\n ref: ForwardedRef<HTMLElement>,\n): ReactElement {\n const {\n page: pageProp,\n defaultPage,\n onPageChange,\n totalPages: totalPagesProp,\n total,\n pageSize: pageSizeProp,\n defaultPageSize,\n pageSizeOptions,\n onPageSizeChange,\n type = 'numbers',\n siblingCount = 1,\n boundaryCount = 1,\n size = 'small',\n isDisabled,\n hasNextPage,\n isCompact = false,\n summary = false,\n labelFormatter,\n ariaLabel,\n pageSizeSelectStyles,\n qa,\n mods,\n ...rest\n } = props;\n\n const { t } = useI18n();\n const { formatNumber } = useFormatter();\n\n const [pageSize, setPageSize] = useControlledState<number>(\n pageSizeProp as number,\n defaultPageSize ?? 50,\n onPageSizeChange as (v: number) => void,\n );\n const [page, setPage] = useControlledState<number>(\n pageProp as number,\n defaultPage ?? 1,\n onPageChange as (v: number) => void,\n );\n\n // Unknown total: prev/next only, with `hasNextPage` driving the next button.\n // The page must NOT be clamped in that mode — there is nothing to clamp to.\n const isCountable = totalPagesProp != null || total != null;\n\n const info: CubeTablePageInfo = isCountable\n ? getPageInfo({\n page,\n pageSize,\n total: total ?? 0,\n totalPages: totalPagesProp,\n })\n : {\n page: clampPage(page, Number.MAX_SAFE_INTEGER),\n pageSize,\n totalPages: 0,\n total: 0,\n from: 0,\n to: 0,\n };\n\n const { totalPages } = info;\n\n const goTo = useEvent((next: number) => {\n const clamped = isCountable\n ? clampPage(next, totalPages)\n : Math.max(next, 1);\n\n if (clamped !== info.page) setPage(clamped);\n });\n\n const onPageSizeSelectionChange = useEvent((value: any) => {\n setPageSize(Number(value));\n setPage(1);\n });\n\n const onPageSelectionChange = useEvent((value: any) => {\n goTo(Number(value));\n });\n\n const pageItems = useMemo(\n () =>\n type === 'numbers' && isCountable\n ? getPaginationRange({\n page: info.page,\n totalPages,\n siblingCount,\n boundaryCount,\n })\n : [],\n [type, isCountable, info.page, totalPages, siblingCount, boundaryCount],\n );\n\n // `type=\"select\"` materializes one entry per page, so it is only safe for\n // small page counts. Above the cap we fall back to `compact`, which reads the\n // same but renders a single label.\n const selectEntries = useMemo(\n () =>\n type === 'select' && isCountable && totalPages <= 200\n ? Array.from({ length: totalPages }, (_, i) => i + 1)\n : null,\n [type, isCountable, totalPages],\n );\n\n const isFirst = info.page <= 1;\n const isLast = isCountable ? info.page >= totalPages : !hasNextPage;\n\n const styles = extractStyles(props, OUTER_STYLES);\n\n const summaryNode =\n summary === false\n ? null\n : typeof summary === 'function'\n ? summary(info)\n : info.total > 0\n ? // Numbers are formatted here rather than left to i18next, which\n // interpolates them raw (\"1204\", not \"1,204\").\n t('pagination.summary', '{{from}}–{{to}} of {{total}}', {\n from: formatNumber(info.from),\n to: formatNumber(info.to),\n total: formatNumber(info.total),\n })\n : null;\n\n function renderPageControl() {\n if (selectEntries) {\n return (\n <Select\n qa=\"PaginationPageSelect\"\n size={size}\n isDisabled={isDisabled}\n aria-label={t('pagination.selectPage', 'Select page')}\n selectedKey={String(info.page)}\n width=\"min 15x\"\n styles={pageSizeSelectStyles}\n onSelectionChange={onPageSelectionChange}\n >\n {selectEntries.map((entry) => {\n const entryInfo = { ...info, page: entry };\n const label =\n labelFormatter?.(entryInfo) ??\n (info.total > 0\n ? formatRange(entryInfo)\n : t('pagination.page', 'Page {{page}}', { page: entry }));\n\n return (\n <Select.Item key={entry} textValue={String(label)}>\n {label}\n </Select.Item>\n );\n })}\n </Select>\n );\n }\n\n if (type === 'numbers' && pageItems.length > 0) {\n return (\n <div data-element=\"Pages\">\n {pageItems.map((entry, index) =>\n entry === 'gap' ? (\n <div key={`gap-${index}`} data-element=\"Gap\" aria-hidden=\"true\">\n {'…'}\n </div>\n ) : (\n <PageButton\n key={entry}\n qa={`PaginationPage_${entry}`}\n size={size}\n type={entry === info.page ? 'outline' : 'clear'}\n isDisabled={isDisabled}\n aria-label={t('pagination.page', 'Page {{page}}', {\n page: entry,\n })}\n aria-current={entry === info.page ? 'page' : undefined}\n onPress={() => goTo(entry)}\n >\n {entry}\n </PageButton>\n ),\n )}\n </div>\n );\n }\n\n if (!isCountable) return null;\n\n return (\n <div data-element=\"Summary\" data-qa=\"PaginationPageLabel\">\n {t('pagination.pageOf', '{{page}} of {{totalPages}}', {\n page: info.page,\n totalPages,\n })}\n </div>\n );\n }\n\n const showEdgeButtons = !isCompact && isCountable;\n\n return (\n <PaginationElement\n {...filterBaseProps(rest, { eventProps: true })}\n ref={ref}\n qa={qa || 'Pagination'}\n styles={styles}\n mods={{ size, ...mods }}\n aria-label={ariaLabel ?? t('pagination.ariaLabel', 'Pagination')}\n >\n {summaryNode ? <div data-element=\"Summary\">{summaryNode}</div> : null}\n\n {pageSizeOptions && onPageSizeChange ? (\n <Select\n qa=\"PaginationPageSizeSelect\"\n size={size}\n isDisabled={isDisabled}\n aria-label={t('pagination.itemsPerPage', 'Items per page')}\n selectedKey={String(pageSize)}\n styles={pageSizeSelectStyles}\n onSelectionChange={onPageSizeSelectionChange}\n >\n {pageSizeOptions.map((option) => {\n const label = t(\n 'pagination.itemsPerPageOption',\n '{{size}} / page',\n {\n size: option,\n },\n );\n\n return (\n <Select.Item key={option} textValue={label}>\n {label}\n </Select.Item>\n );\n })}\n </Select>\n ) : null}\n\n <div data-element=\"Controls\">\n {showEdgeButtons ? (\n <NavButton\n qa=\"PaginationFirstButton\"\n size={size}\n icon={<BackwardIcon />}\n isDisabled={isFirst || isDisabled}\n aria-label={t('pagination.firstPage', 'First page')}\n onPress={() => goTo(1)}\n />\n ) : null}\n\n <NavButton\n qa=\"PaginationPrevButton\"\n size={size}\n icon={<LeftIcon />}\n isDisabled={isFirst || isDisabled}\n aria-label={t('pagination.previousPage', 'Previous page')}\n onPress={() => goTo(info.page - 1)}\n />\n\n {renderPageControl()}\n\n <NavButton\n qa=\"PaginationNextButton\"\n size={size}\n icon={<RightIcon />}\n isDisabled={isLast || isDisabled}\n aria-label={t('pagination.nextPage', 'Next page')}\n onPress={() => goTo(info.page + 1)}\n />\n\n {showEdgeButtons ? (\n <NavButton\n qa=\"PaginationLastButton\"\n size={size}\n icon={<ForwardIcon />}\n isDisabled={isLast || isDisabled}\n aria-label={t('pagination.lastPage', 'Last page')}\n onPress={() => goTo(totalPages)}\n />\n ) : null}\n </div>\n </PaginationElement>\n );\n}\n\nconst _Pagination = forwardRef(Pagination);\n\n_Pagination.displayName = 'Pagination';\n\nexport { _Pagination as Pagination };\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+
2
+ import { CubePaginationItem, CubePaginationProps, CubePaginationType, CubeTablePageInfo } from "./types.js";
3
+ import { _Pagination } from "./Pagination.js";
4
+ import { PaginationRangeOptions, UsePaginationOptions, UsePaginationResult, clampPage, getPageInfo, getPaginationRange, usePagination } from "./use-pagination.js";
@@ -0,0 +1,81 @@
1
+
2
+ import { BaseProps, OuterStyleProps, Styles } from "@tenphi/tasty";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/components/navigation/Pagination/types.d.ts
6
+ /**
7
+ * How the page control is rendered.
8
+ *
9
+ * - `numbers` — `1 2 3 … 42` buttons. Correct for large page counts because it
10
+ * never materializes one element per page.
11
+ * - `select` — a `Select` listing every page (or item range). Only viable when
12
+ * the page count is small.
13
+ * - `compact` — `‹ 3 of 42 ›`, no page buttons at all.
14
+ */
15
+ type CubePaginationType = 'numbers' | 'select' | 'compact';
16
+ /** Everything a summary or label renderer needs to describe the current page. */
17
+ interface CubeTablePageInfo {
18
+ /** 1-based. */
19
+ page: number;
20
+ pageSize: number;
21
+ totalPages: number;
22
+ /** Total items across all pages. `0` when unknown. */
23
+ total: number;
24
+ /** 1-based index of the first item on this page. */
25
+ from: number;
26
+ /** 1-based index of the last item on this page. */
27
+ to: number;
28
+ }
29
+ /**
30
+ * A `'gap'` entry stands for the ellipsis between two runs of page numbers.
31
+ * Exported because `Pagination` and its tests both need to reason about it.
32
+ */
33
+ type CubePaginationItem = number | 'gap';
34
+ interface CubePaginationProps extends BaseProps, OuterStyleProps {
35
+ /** Controlled current page. 1-based. */
36
+ page?: number;
37
+ /** Initial page for uncontrolled usage. @default 1 */
38
+ defaultPage?: number;
39
+ onPageChange?: (page: number) => void;
40
+ /**
41
+ * Total number of pages. Supply this, or `total` + `pageSize` and it is
42
+ * derived. When neither is available the control falls back to prev/next
43
+ * only, driven by `hasNextPage`.
44
+ */
45
+ totalPages?: number;
46
+ /** Total items across all pages. Preferred over `totalPages`. */
47
+ total?: number;
48
+ /** Controlled page size. */
49
+ pageSize?: number;
50
+ /** Initial page size for uncontrolled usage. @default 50 */
51
+ defaultPageSize?: number;
52
+ /** Supplying this together with `onPageSizeChange` renders the size selector. */
53
+ pageSizeOptions?: number[];
54
+ onPageSizeChange?: (pageSize: number) => void;
55
+ /** @default 'numbers' */
56
+ type?: CubePaginationType;
57
+ /** Page buttons rendered either side of the current page. @default 1 */
58
+ siblingCount?: number;
59
+ /** Page buttons pinned at each end. @default 1 */
60
+ boundaryCount?: number;
61
+ /** @default 'small' */
62
+ size?: 'xsmall' | 'small' | 'medium';
63
+ isDisabled?: boolean;
64
+ /**
65
+ * Cursor pagination with an unknown total: keeps "next" enabled while there
66
+ * is more to fetch. Ignored when `totalPages` is known.
67
+ */
68
+ hasNextPage?: boolean;
69
+ /** Hide the first/last jump buttons. @default false */
70
+ isCompact?: boolean;
71
+ /** `true` renders the localized "1–50 of 1,204". @default false */
72
+ summary?: boolean | ((info: CubeTablePageInfo) => ReactNode);
73
+ /** Labels the entries of `type="select"`. Defaults to item ranges. */
74
+ labelFormatter?: (info: CubeTablePageInfo) => ReactNode;
75
+ ariaLabel?: string;
76
+ styles?: Styles;
77
+ pageSizeSelectStyles?: Styles;
78
+ }
79
+ //#endregion
80
+ export { CubePaginationItem, CubePaginationProps, CubePaginationType, CubeTablePageInfo };
81
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,52 @@
1
+
2
+ import { CubePaginationItem, CubeTablePageInfo } from "./types.js";
3
+
4
+ //#region src/components/navigation/Pagination/use-pagination.d.ts
5
+ declare function clampPage(page: number, totalPages: number): number;
6
+ interface PaginationRangeOptions {
7
+ page: number;
8
+ totalPages: number;
9
+ /** Page buttons either side of the current page. @default 1 */
10
+ siblingCount?: number;
11
+ /** Page buttons pinned at each end. @default 1 */
12
+ boundaryCount?: number;
13
+ }
14
+ /**
15
+ * Page numbers to render, with `'gap'` marking an elided run. The output length
16
+ * is bounded by `boundaryCount * 2 + siblingCount * 2 + 3` regardless of
17
+ * `totalPages` — which is the whole point of `type="numbers"`: a 100k-row table
18
+ * at 100 per page renders ~7 buttons, not 1000 `Select` items.
19
+ */
20
+ declare function getPaginationRange({
21
+ page,
22
+ totalPages,
23
+ siblingCount,
24
+ boundaryCount
25
+ }: PaginationRangeOptions): CubePaginationItem[];
26
+ declare function getPageInfo(options: {
27
+ page: number;
28
+ pageSize: number;
29
+ total: number;
30
+ totalPages?: number;
31
+ }): CubeTablePageInfo;
32
+ interface UsePaginationOptions {
33
+ page?: number;
34
+ defaultPage?: number;
35
+ onPageChange?: (page: number) => void;
36
+ pageSize?: number;
37
+ defaultPageSize?: number;
38
+ onPageSizeChange?: (pageSize: number) => void;
39
+ }
40
+ type UsePaginationResult<T> = CubeTablePageInfo & {
41
+ /** The current page's slice of `items`. */pageItems: T[];
42
+ setPage: (page: number) => void; /** Also resets to page 1, since the old page index no longer means anything. */
43
+ setPageSize: (pageSize: number) => void;
44
+ };
45
+ /**
46
+ * Client-side pagination over an in-memory array. Standalone — `ItemTable` uses
47
+ * it internally, but it works on its own for any paged list.
48
+ */
49
+ declare function usePagination<T>(items: readonly T[], options?: UsePaginationOptions): UsePaginationResult<T>;
50
+ //#endregion
51
+ export { PaginationRangeOptions, UsePaginationOptions, UsePaginationResult, clampPage, getPageInfo, getPaginationRange, usePagination };
52
+ //# sourceMappingURL=use-pagination.d.ts.map