@rio-cloud/uikit-mcp 1.1.9 → 1.1.11

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 (211) hide show
  1. package/README.md +2 -1
  2. package/dist/doc-metadata.json +334 -94
  3. package/dist/docs/components/accentBar.md +110 -116
  4. package/dist/docs/components/activity.md +1 -1
  5. package/dist/docs/components/analyticsAnalysisOverlay.md +630 -0
  6. package/dist/docs/components/animatedNumber.md +2 -2
  7. package/dist/docs/components/animatedTextReveal.md +53 -55
  8. package/dist/docs/components/animations.md +21 -21
  9. package/dist/docs/components/appHeader.md +27 -38
  10. package/dist/docs/components/appLayout.md +23 -77
  11. package/dist/docs/components/appNavigationBar.md +1 -1
  12. package/dist/docs/components/areaCharts.md +57 -61
  13. package/dist/docs/components/aspectRatioPlaceholder.md +1 -1
  14. package/dist/docs/components/assetTree.md +429 -342
  15. package/dist/docs/components/autosuggests.md +1 -1
  16. package/dist/docs/components/avatar.md +1 -1
  17. package/dist/docs/components/banner.md +2 -2
  18. package/dist/docs/components/barCharts.md +530 -414
  19. package/dist/docs/components/barList.md +10 -10
  20. package/dist/docs/components/basicMap.md +104 -39
  21. package/dist/docs/components/bottomSheet.md +2 -2
  22. package/dist/docs/components/button.md +8 -2
  23. package/dist/docs/components/buttonToolbar.md +1 -1
  24. package/dist/docs/components/calendarStripe.md +59 -63
  25. package/dist/docs/components/card.md +1 -1
  26. package/dist/docs/components/carousel.md +1 -1
  27. package/dist/docs/components/chartColors.md +1 -1
  28. package/dist/docs/components/chartsGettingStarted.md +1 -1
  29. package/dist/docs/components/chat.md +2 -2
  30. package/dist/docs/components/checkbox.md +15 -10
  31. package/dist/docs/components/circularProgress.md +6 -6
  32. package/dist/docs/components/clearableInput.md +1 -1
  33. package/dist/docs/components/collapse.md +2 -2
  34. package/dist/docs/components/composedCharts.md +63 -51
  35. package/dist/docs/components/contentLoader.md +1 -1
  36. package/dist/docs/components/dataTabs.md +33 -33
  37. package/dist/docs/components/datepickers.md +693 -685
  38. package/dist/docs/components/dayPicker.md +5624 -0
  39. package/dist/docs/components/dayPickerCalendar.md +5289 -0
  40. package/dist/docs/components/dialogs.md +17 -19
  41. package/dist/docs/components/divider.md +1 -1
  42. package/dist/docs/components/dropdowns.md +3264 -3276
  43. package/dist/docs/components/editableContent.md +91 -91
  44. package/dist/docs/components/expander.md +4 -1
  45. package/dist/docs/components/fade.md +1 -1
  46. package/dist/docs/components/fadeExpander.md +1 -1
  47. package/dist/docs/components/fadeUp.md +32 -36
  48. package/dist/docs/components/feedback.md +1 -1
  49. package/dist/docs/components/filePickers.md +1 -1
  50. package/dist/docs/components/formLabel.md +29 -31
  51. package/dist/docs/components/groupedItemList.md +3 -7
  52. package/dist/docs/components/htmlTable.md +5074 -0
  53. package/dist/docs/components/iconList.md +4 -4
  54. package/dist/docs/components/imagePreloader.md +1 -1
  55. package/dist/docs/components/labeledElement.md +1 -1
  56. package/dist/docs/components/licensePlate.md +1 -1
  57. package/dist/docs/components/lineCharts.md +172 -170
  58. package/dist/docs/components/listMenu.md +15 -12
  59. package/dist/docs/components/loadMore.md +4 -2
  60. package/dist/docs/components/mainNavigation.md +1 -1
  61. package/dist/docs/components/mapCircle.md +10 -1
  62. package/dist/docs/components/mapCluster.md +25 -1
  63. package/dist/docs/components/mapContext.md +12 -4
  64. package/dist/docs/components/mapDraggableMarker.md +12 -1
  65. package/dist/docs/components/mapGettingStarted.md +39 -1
  66. package/dist/docs/components/mapInfoBubble.md +129 -2
  67. package/dist/docs/components/mapLayerGroup.md +10 -1
  68. package/dist/docs/components/mapMarker.md +10 -1
  69. package/dist/docs/components/mapPolygon.md +288 -85
  70. package/dist/docs/components/mapRoute.md +262 -172
  71. package/dist/docs/components/mapSettings.md +28 -1
  72. package/dist/docs/components/mapUtils.md +1 -1
  73. package/dist/docs/components/mapViewportHistory.md +287 -0
  74. package/dist/docs/components/multiselects.md +217 -18
  75. package/dist/docs/components/noData.md +1 -1
  76. package/dist/docs/components/notifications.md +2 -2
  77. package/dist/docs/components/numbercontrol.md +15 -15
  78. package/dist/docs/components/onboarding.md +1 -1
  79. package/dist/docs/components/page.md +1 -1
  80. package/dist/docs/components/pager.md +1 -1
  81. package/dist/docs/components/pieCharts.md +237 -211
  82. package/dist/docs/components/popover.md +1 -1
  83. package/dist/docs/components/position.md +1 -1
  84. package/dist/docs/components/radialBarCharts.md +446 -398
  85. package/dist/docs/components/radioCardGroup.md +1 -1
  86. package/dist/docs/components/radiobutton.md +98 -98
  87. package/dist/docs/components/releaseNotes.md +1 -1
  88. package/dist/docs/components/resizer.md +1 -1
  89. package/dist/docs/components/responsiveColumnStripe.md +1 -1
  90. package/dist/docs/components/responsiveVideo.md +1 -1
  91. package/dist/docs/components/rioglyph.md +1 -1
  92. package/dist/docs/components/rules.md +41 -47
  93. package/dist/docs/components/saveableInput.md +252 -252
  94. package/dist/docs/components/selects.md +332 -161
  95. package/dist/docs/components/sidebar.md +1 -1
  96. package/dist/docs/components/sliders.md +1 -1
  97. package/dist/docs/components/smoothScrollbars.md +19 -13
  98. package/dist/docs/components/spinners.md +1 -1
  99. package/dist/docs/components/states.md +15 -1
  100. package/dist/docs/components/statsWidgets.md +1 -1
  101. package/dist/docs/components/statusBar.md +3 -1
  102. package/dist/docs/components/stepButton.md +1 -1
  103. package/dist/docs/components/steppedProgressBars.md +9 -11
  104. package/dist/docs/components/subNavigation.md +1 -1
  105. package/dist/docs/components/supportMarker.md +1 -1
  106. package/dist/docs/components/svgImage.md +1 -1
  107. package/dist/docs/components/switch.md +5 -1
  108. package/dist/docs/components/table.md +21361 -0
  109. package/dist/docs/components/tableControls.md +982 -0
  110. package/dist/docs/components/tagManager.md +1 -1
  111. package/dist/docs/components/tags.md +1 -1
  112. package/dist/docs/components/teaser.md +1 -1
  113. package/dist/docs/components/textTruncateMiddle.md +1 -1
  114. package/dist/docs/components/timeline.md +1 -1
  115. package/dist/docs/components/timepicker.md +3 -1
  116. package/dist/docs/components/toggleButton.md +3 -1
  117. package/dist/docs/components/tooltip.md +8 -2
  118. package/dist/docs/components/tracker.md +1 -1
  119. package/dist/docs/components/virtualList.md +60 -60
  120. package/dist/docs/foundations.md +761 -3077
  121. package/dist/docs/start/changelog.md +73 -3
  122. package/dist/docs/start/goodtoknow.md +5 -1
  123. package/dist/docs/start/guidelines/color-combinations.md +5 -1
  124. package/dist/docs/start/guidelines/custom-css.md +26 -2
  125. package/dist/docs/start/guidelines/custom-rioglyph.md +20 -2
  126. package/dist/docs/start/guidelines/formatting.md +2254 -249
  127. package/dist/docs/start/guidelines/iframe.md +53 -19
  128. package/dist/docs/start/guidelines/obfuscate-data.md +24 -2
  129. package/dist/docs/start/guidelines/print-css.md +16 -2
  130. package/dist/docs/start/guidelines/spinner.md +1 -1
  131. package/dist/docs/start/guidelines/state-in-url.md +1138 -11
  132. package/dist/docs/start/guidelines/supported-browsers.md +9 -2
  133. package/dist/docs/start/guidelines/writing.md +228 -2
  134. package/dist/docs/start/howto.md +155 -13
  135. package/dist/docs/start/intro.md +40 -2
  136. package/dist/docs/start/responsiveness.md +27 -1
  137. package/dist/docs/templates/ai-assistant.md +311 -0
  138. package/dist/docs/templates/common-table.md +814 -0
  139. package/dist/docs/templates/detail-views.md +846 -0
  140. package/dist/docs/templates/expandable-details.md +214 -0
  141. package/dist/docs/templates/feature-cards.md +479 -0
  142. package/dist/docs/templates/form-summary.md +179 -0
  143. package/dist/docs/templates/form-toggle.md +329 -0
  144. package/dist/docs/templates/list-blocks.md +872 -0
  145. package/dist/docs/templates/loading-progress.md +100 -0
  146. package/dist/docs/templates/options-panel.md +132 -0
  147. package/dist/docs/templates/panel-variants.md +137 -0
  148. package/dist/docs/templates/progress-cards.md +541 -0
  149. package/dist/docs/templates/progress-success.md +125 -0
  150. package/dist/docs/templates/settings-form.md +401 -0
  151. package/dist/docs/templates/stats-blocks.md +1245 -0
  152. package/dist/docs/templates/table-panel.md +310 -0
  153. package/dist/docs/templates/usage-cards.md +199 -0
  154. package/dist/docs/utilities/classNames.md +89 -1
  155. package/dist/docs/utilities/deviceUtils.md +2 -2
  156. package/dist/docs/utilities/featureToggles.md +182 -2
  157. package/dist/docs/utilities/fuelTypeUtils.md +27 -29
  158. package/dist/docs/utilities/getTrackingAttributes.md +322 -0
  159. package/dist/docs/utilities/routeUtils.md +211 -3
  160. package/dist/docs/utilities/useAfterMount.md +1 -1
  161. package/dist/docs/utilities/useAutoAnimate.md +1 -1
  162. package/dist/docs/utilities/useAverage.md +1 -1
  163. package/dist/docs/utilities/useClickOutside.md +1 -1
  164. package/dist/docs/utilities/useClipboard.md +2 -2
  165. package/dist/docs/utilities/useCookies.md +1 -1
  166. package/dist/docs/utilities/useCount.md +1 -1
  167. package/dist/docs/utilities/useDarkMode.md +5 -4
  168. package/dist/docs/utilities/useDebugInfo.md +3 -3
  169. package/dist/docs/utilities/useDraggableElement.md +281 -0
  170. package/dist/docs/utilities/useEffectOnce.md +1 -1
  171. package/dist/docs/utilities/useElapsedTime.md +1 -1
  172. package/dist/docs/utilities/useElementSize.md +1 -1
  173. package/dist/docs/utilities/useEsc.md +1 -1
  174. package/dist/docs/utilities/useEvent.md +1 -1
  175. package/dist/docs/utilities/useFocusTrap.md +1 -1
  176. package/dist/docs/utilities/useFullscreen.md +1 -1
  177. package/dist/docs/utilities/useHover.md +1 -1
  178. package/dist/docs/utilities/useIncomingPostMessages.md +1 -1
  179. package/dist/docs/utilities/useInterval.md +1 -1
  180. package/dist/docs/utilities/useIsFocusWithin.md +1 -1
  181. package/dist/docs/utilities/useKey.md +8 -10
  182. package/dist/docs/utilities/useLocalStorage.md +1 -1
  183. package/dist/docs/utilities/useLocationSuggestions.md +1 -1
  184. package/dist/docs/utilities/useMax.md +1 -1
  185. package/dist/docs/utilities/useMin.md +1 -1
  186. package/dist/docs/utilities/useMutationObserver.md +1 -1
  187. package/dist/docs/utilities/useOnScreen.md +1 -1
  188. package/dist/docs/utilities/useOnlineStatus.md +1 -1
  189. package/dist/docs/utilities/usePostMessage.md +2 -2
  190. package/dist/docs/utilities/usePostMessageSender.md +1 -1
  191. package/dist/docs/utilities/usePrevious.md +110 -2
  192. package/dist/docs/utilities/useResizeObserver.md +35 -15
  193. package/dist/docs/utilities/useRioCookieConsent.md +1 -1
  194. package/dist/docs/utilities/useScrollPosition.md +3 -6
  195. package/dist/docs/utilities/useSearch.md +1 -3
  196. package/dist/docs/utilities/useSearchHighlight.md +1 -1
  197. package/dist/docs/utilities/useSorting.md +370 -239
  198. package/dist/docs/utilities/useStateWithValidation.md +1 -1
  199. package/dist/docs/utilities/useSum.md +1 -1
  200. package/dist/docs/utilities/useTableExport.md +364 -288
  201. package/dist/docs/utilities/useTableSelection.md +88 -92
  202. package/dist/docs/utilities/useTimeout.md +1 -1
  203. package/dist/docs/utilities/useToggle.md +1 -1
  204. package/dist/docs/utilities/useUrlState.md +1 -1
  205. package/dist/docs/utilities/useWindowResize.md +1 -1
  206. package/dist/index.mjs +173 -69
  207. package/dist/search-synonyms.json +214 -76
  208. package/dist/version.json +2 -2
  209. package/package.json +4 -5
  210. package/dist/docs/components/mapRouteGenerator.md +0 -6
  211. package/dist/docs/components/tables.md +0 -8
@@ -3,7 +3,7 @@
3
3
  *Category:* Utilities
4
4
  *Section:* Table & data hooks
5
5
  *Source:* https://uikit.developers.rio.cloud/#/utilities/useSorting
6
- *Captured:* 2026-03-06T10:41:58.331Z
6
+ *Captured:* 2026-04-27T14:59:48.464Z
7
7
 
8
8
  The useSorting hook provides an easy way to sort any list by a specified key using natural sort order. It offers flexible control over sorting direction and key selection, making it ideal for dynamic sorting use cases.
9
9
 
@@ -11,19 +11,38 @@ The useSorting hook provides an easy way to sort any list by a specified key usi
11
11
 
12
12
  ### Example: Example 1
13
13
 
14
- Name Quantity
14
+ Name
15
15
 
16
- Box 20
17
- Container 1
18
- Crate 15
19
- Drum 12
20
- Pallet 10
21
- Parcel 8
16
+ Quantity
17
+
18
+ Box
19
+
20
+ 20
21
+
22
+ Container
23
+
24
+ 1
25
+
26
+ Crate
27
+
28
+ 15
29
+
30
+ Drum
31
+
32
+ 12
33
+
34
+ Pallet
35
+
36
+ 10
37
+
38
+ Parcel
39
+
40
+ 8
22
41
 
23
42
  #### React (tsx)
24
43
 
25
44
  ```tsx
26
- import SortArrows from '@rio-cloud/rio-uikit/SortArrows';
45
+ import Table, { TableBody, TableColumn, TableHeader, TableHeaderColumn, TableRow } from '@rio-cloud/rio-uikit/Table';
27
46
  import useSorting from '@rio-cloud/rio-uikit/useSorting';
28
47
 
29
48
  type Item = {
@@ -40,99 +59,123 @@ const items: Item[] = [
40
59
  { name: 'Box', quantity: 20 },
41
60
  ];
42
61
 
43
- export default () => {
44
- const { sortedItems, sortKey, sortDirection, setSortKey, toggleDirection } = useSorting(items, 'name');
62
+ const UseSortingExample = () => {
63
+ const { sortedItems, sortKey, sortDirection, setSortKey, setSortDirection } = useSorting(items, 'name');
45
64
 
46
- const handleSortByColumn = (column: keyof Item) => {
47
- setSortKey(column);
48
- if (column === sortKey) {
49
- toggleDirection();
50
- }
65
+ const handleSortChange = (columnKey: string, direction: 'asc' | 'desc') => {
66
+ setSortKey(columnKey as keyof Item);
67
+ setSortDirection(direction);
51
68
  };
52
69
 
53
70
  return (
54
- <div className='table-responsive'>
55
- <table className='table table-head-filled'>
56
- <thead>
57
- <tr>
58
- <th className='user-select-none sort-column' onClick={() => handleSortByColumn('name')}>
59
- <span>
60
- {sortKey === 'name' ? <SortArrows direction={sortDirection} /> : <SortArrows />}
61
- <span>Name</span>
62
- </span>
63
- </th>
64
- <th className='user-select-none sort-column' onClick={() => handleSortByColumn('quantity')}>
65
- <span>
66
- {sortKey === 'quantity' ? <SortArrows direction={sortDirection} /> : <SortArrows />}
67
- <span>Quantity</span>
68
- </span>
69
- </th>
70
- </tr>
71
- </thead>
72
- <tbody>
73
- {sortedItems.map(({ name, quantity }) => (
74
- <tr key={name}>
75
- <td key={name}>{name}</td>
76
- <td key={quantity}>{quantity}</td>
77
- </tr>
78
- ))}
79
- </tbody>
80
- </table>
81
- </div>
71
+ <Table rowKey='name' sortBy={String(sortKey)} sortDirection={sortDirection} onSortChange={handleSortChange}>
72
+ <TableHeader>
73
+ <TableHeaderColumn columnKey='name' sortable>
74
+ Name
75
+ </TableHeaderColumn>
76
+ <TableHeaderColumn columnKey='quantity' sortable>
77
+ Quantity
78
+ </TableHeaderColumn>
79
+ </TableHeader>
80
+ <TableBody>
81
+ {sortedItems.map(({ name, quantity }) => (
82
+ <TableRow key={name} id={name}>
83
+ <TableColumn columnKey='name'>{name}</TableColumn>
84
+ <TableColumn columnKey='quantity'>{quantity}</TableColumn>
85
+ </TableRow>
86
+ ))}
87
+ </TableBody>
88
+ </Table>
82
89
  );
83
90
  };
91
+
92
+ export default UseSortingExample;
84
93
  ```
85
94
 
86
95
  #### HTML (html)
87
96
 
88
97
  ```html
89
- <div class="table-responsive">
90
- <table class="table table-head-filled">
91
- <thead>
92
- <tr>
93
- <th class="user-select-none sort-column">
94
- <span>
95
- <span class="sort-arrows sort-asc">
96
- </span>
97
- <span>Name</span>
98
- </span>
99
- </th>
100
- <th class="user-select-none sort-column">
101
- <span>
102
- <span class="sort-arrows ">
103
- </span>
104
- <span>Quantity</span>
105
- </span>
106
- </th>
107
- </tr>
108
- </thead>
109
- <tbody>
110
- <tr>
111
- <td>Box</td>
112
- <td>20</td>
113
- </tr>
114
- <tr>
115
- <td>Container</td>
116
- <td>1</td>
117
- </tr>
118
- <tr>
119
- <td>Crate</td>
120
- <td>15</td>
121
- </tr>
122
- <tr>
123
- <td>Drum</td>
124
- <td>12</td>
125
- </tr>
126
- <tr>
127
- <td>Pallet</td>
128
- <td>10</td>
129
- </tr>
130
- <tr>
131
- <td>Parcel</td>
132
- <td>8</td>
133
- </tr>
134
- </tbody>
135
- </table>
98
+ <div class="table table-view-table border table-rounded table-has-head" role="table" style="--table-columns: minmax(50px, 1fr) minmax(50px, 1fr); --table-areas: &quot;table-col-1 table-col-2&quot;; --table-column-count: 2; --table-sticky-reference-top: var(--table-sticky-offset); --table-width: 908px;" aria-colcount="2">
99
+ <div class="table-head" role="rowgroup">
100
+ <div class="table-head-grid" role="row" style="grid-template-rows: repeat(1, auto);">
101
+ <div class="table-head-cell table-head-cell-sortable table-head-cell-has-column-divider table-align-left table-vertical-align-middle" data-column="name" role="columnheader" aria-colindex="1" aria-rowindex="1" aria-sort="ascending" style="grid-area: 1 / 1 / span 1 / span 1;">
102
+ <div class="table-head-cell-content">
103
+ <div class="table-head-cell-content-row">
104
+ <button type="button" class="table-head-button">
105
+ <span class="table-head-button-label">
106
+ <span class="sort-arrows sort-asc">
107
+ </span>
108
+ <span class="table-head-label">Name</span>
109
+ </span>
110
+ </button>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ <div class="table-head-cell table-head-cell-sortable table-align-left table-vertical-align-middle" data-column="quantity" role="columnheader" aria-colindex="2" aria-rowindex="1" aria-sort="none" style="grid-area: 1 / 2 / span 1 / span 1;">
115
+ <div class="table-head-cell-content">
116
+ <div class="table-head-cell-content-row">
117
+ <button type="button" class="table-head-button">
118
+ <span class="table-head-button-label">
119
+ <span class="sort-arrows ">
120
+ </span>
121
+ <span class="table-head-label">Quantity</span>
122
+ </span>
123
+ </button>
124
+ </div>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ <div class="table-body" role="rowgroup">
130
+ <div id="Box" class="table-row" data-index="0" data-row-id="0" role="row">
131
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
132
+ <div class="table-cell-content overflow-hidden">Box</div>
133
+ </div>
134
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
135
+ <div class="table-cell-content overflow-hidden">20</div>
136
+ </div>
137
+ </div>
138
+ <div id="Container" class="table-row" data-index="1" data-row-id="1" role="row">
139
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
140
+ <div class="table-cell-content overflow-hidden">Container</div>
141
+ </div>
142
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
143
+ <div class="table-cell-content overflow-hidden">1</div>
144
+ </div>
145
+ </div>
146
+ <div id="Crate" class="table-row" data-index="2" data-row-id="2" role="row">
147
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
148
+ <div class="table-cell-content overflow-hidden">Crate</div>
149
+ </div>
150
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
151
+ <div class="table-cell-content overflow-hidden">15</div>
152
+ </div>
153
+ </div>
154
+ <div id="Drum" class="table-row" data-index="3" data-row-id="3" role="row">
155
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
156
+ <div class="table-cell-content overflow-hidden">Drum</div>
157
+ </div>
158
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
159
+ <div class="table-cell-content overflow-hidden">12</div>
160
+ </div>
161
+ </div>
162
+ <div id="Pallet" class="table-row" data-index="4" data-row-id="4" role="row">
163
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
164
+ <div class="table-cell-content overflow-hidden">Pallet</div>
165
+ </div>
166
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
167
+ <div class="table-cell-content overflow-hidden">10</div>
168
+ </div>
169
+ </div>
170
+ <div id="Parcel" class="table-row" data-index="5" data-row-id="5" role="row">
171
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
172
+ <div class="table-cell-content overflow-hidden">Parcel</div>
173
+ </div>
174
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
175
+ <div class="table-cell-content overflow-hidden">8</div>
176
+ </div>
177
+ </div>
178
+ </div>
136
179
  </div>
137
180
  ```
138
181
 
@@ -149,21 +192,64 @@ export default () => {
149
192
  ### Example: Example 2
150
193
 
151
194
  Sort by a primary column. Hold shift key to sort by a secondary column
152
- Category Name Quantity
195
+ Category
196
+
197
+ Name
198
+
199
+ Quantity
200
+
201
+ Shipping
202
+
203
+ Parcel
204
+
205
+ 8
206
+
207
+ Shipping
208
+
209
+ Box
210
+
211
+ 20
212
+
213
+ Shipping
214
+
215
+ Envelope
216
+
217
+ 50
218
+
219
+ Shipping
220
+
221
+ Bag
222
+
223
+ 30
224
+
225
+ Storage
226
+
227
+ Pallet
228
+
229
+ 10
230
+
231
+ Storage
232
+
233
+ Container
234
+
235
+ 1
153
236
 
154
- Shipping Parcel 8
155
- Shipping Box 20
156
- Shipping Envelope 50
157
- Shipping Bag 30
158
- Storage Pallet 10
159
- Storage Container 1
160
- Storage Crate 15
161
- Storage Drum 12
237
+ Storage
238
+
239
+ Crate
240
+
241
+ 15
242
+
243
+ Storage
244
+
245
+ Drum
246
+
247
+ 12
162
248
 
163
249
  #### React (tsx)
164
250
 
165
251
  ```tsx
166
- import SortArrows from '@rio-cloud/rio-uikit/SortArrows';
252
+ import Table, { TableBody, TableColumn, TableHeader, TableHeaderColumn, TableRow } from '@rio-cloud/rio-uikit/Table';
167
253
  import useSorting from '@rio-cloud/rio-uikit/useSorting';
168
254
 
169
255
  type Item = {
@@ -183,42 +269,38 @@ const items: Item[] = [
183
269
  { name: 'Bag', category: 'Shipping', quantity: 30 },
184
270
  ];
185
271
 
186
- export default () => {
187
- const { sortedItems, sortKey, sortDirection, setSortKey, toggleDirection } = useSorting(items, 'category');
272
+ const UseSortingSecondaryExample = () => {
273
+ const { sortedItems, sortKey, sortDirection, setSortKey, setSortDirection, toggleDirection } = useSorting(
274
+ items,
275
+ 'category'
276
+ );
277
+
278
+ const handleSortChange = (
279
+ columnKey: string,
280
+ direction: 'asc' | 'desc',
281
+ event: React.MouseEvent<HTMLButtonElement>
282
+ ) => {
283
+ const column = columnKey as keyof Item;
188
284
 
189
- const handleSortByColumn = (column: keyof Item, event: React.MouseEvent) => {
190
285
  if (event.shiftKey) {
191
- // Secondary sort
192
286
  if (Array.isArray(sortKey) && sortKey[1] === column) {
193
- // If already secondary, toggle direction
194
287
  toggleDirection();
195
288
  } else if (Array.isArray(sortKey)) {
196
- // If already using secondary sort, update secondary key
197
289
  setSortKey([sortKey[0], column]);
290
+ setSortDirection(direction);
198
291
  } else {
199
- // If not using secondary sort, add secondary key
200
292
  setSortKey([sortKey, column]);
293
+ setSortDirection(direction);
201
294
  }
202
- } else {
203
- // Primary sort
204
- if (sortKey === column || (Array.isArray(sortKey) && sortKey[0] === column)) {
205
- // If already primary, toggle direction
206
- toggleDirection();
207
- } else {
208
- // Set new primary key
209
- setSortKey(column);
210
- }
211
- }
212
- };
213
295
 
214
- const renderSortArrows = (column: keyof Item) => {
215
- if (sortKey === column || (Array.isArray(sortKey) && sortKey[0] === column)) {
216
- return <SortArrows direction={sortDirection} />;
296
+ return;
217
297
  }
218
- if (Array.isArray(sortKey) && sortKey[1] === column) {
219
- return <SortArrows direction={sortDirection} />;
298
+
299
+ if (Array.isArray(sortKey) ? sortKey[0] !== column : sortKey !== column) {
300
+ setSortKey(column);
220
301
  }
221
- return <SortArrows />;
302
+
303
+ setSortDirection(direction);
222
304
  };
223
305
 
224
306
  return (
@@ -227,129 +309,178 @@ export default () => {
227
309
  Sort by a primary column. Hold <kbd className='text-normal'>shift</kbd> key to sort by a secondary
228
310
  column
229
311
  </p>
230
- <div className='table-responsive'>
231
- <table className='table table-head-filled'>
232
- <thead>
233
- <tr>
234
- <th
235
- className='user-select-none sort-column'
236
- onClick={event => handleSortByColumn('category', event)}
237
- >
238
- <span>
239
- {renderSortArrows('category')}
240
- <span>Category</span>
241
- </span>
242
- </th>
243
- <th
244
- className='user-select-none sort-column'
245
- onClick={event => handleSortByColumn('name', event)}
246
- >
247
- <span>
248
- {renderSortArrows('name')}
249
- <span>Name</span>
250
- </span>
251
- </th>
252
- <th
253
- className='user-select-none sort-column'
254
- onClick={event => handleSortByColumn('quantity', event)}
255
- >
256
- <span>
257
- {renderSortArrows('quantity')}
258
- <span>Quantity</span>
259
- </span>
260
- </th>
261
- </tr>
262
- </thead>
263
- <tbody>
264
- {sortedItems.map(item => (
265
- <tr key={item.name}>
266
- <td>{item.category}</td>
267
- <td>{item.name}</td>
268
- <td>{item.quantity}</td>
269
- </tr>
270
- ))}
271
- </tbody>
272
- </table>
273
- </div>
312
+ <Table
313
+ rowKey='name'
314
+ sortBy={Array.isArray(sortKey) ? sortKey.map(String) : String(sortKey)}
315
+ sortDirection={sortDirection}
316
+ onSortChange={handleSortChange}
317
+ >
318
+ <TableHeader>
319
+ <TableHeaderColumn columnKey='category' sortable>
320
+ Category
321
+ </TableHeaderColumn>
322
+ <TableHeaderColumn columnKey='name' sortable>
323
+ Name
324
+ </TableHeaderColumn>
325
+ <TableHeaderColumn columnKey='quantity' sortable>
326
+ Quantity
327
+ </TableHeaderColumn>
328
+ </TableHeader>
329
+ <TableBody>
330
+ {sortedItems.map(item => (
331
+ <TableRow key={item.name} id={item.name}>
332
+ <TableColumn columnKey='category'>{item.category}</TableColumn>
333
+ <TableColumn columnKey='name'>{item.name}</TableColumn>
334
+ <TableColumn columnKey='quantity'>{item.quantity}</TableColumn>
335
+ </TableRow>
336
+ ))}
337
+ </TableBody>
338
+ </Table>
274
339
  </>
275
340
  );
276
341
  };
342
+
343
+ export default UseSortingSecondaryExample;
277
344
  ```
278
345
 
279
346
  #### HTML (html)
280
347
 
281
348
  ```html
282
349
  <p>Sort by a primary column. Hold <kbd class="text-normal">shift</kbd> key to sort by a secondary column</p>
283
- <div class="table-responsive">
284
- <table class="table table-head-filled">
285
- <thead>
286
- <tr>
287
- <th class="user-select-none sort-column">
288
- <span>
289
- <span class="sort-arrows sort-asc">
290
- </span>
291
- <span>Category</span>
292
- </span>
293
- </th>
294
- <th class="user-select-none sort-column">
295
- <span>
296
- <span class="sort-arrows ">
297
- </span>
298
- <span>Name</span>
299
- </span>
300
- </th>
301
- <th class="user-select-none sort-column">
302
- <span>
303
- <span class="sort-arrows ">
304
- </span>
305
- <span>Quantity</span>
306
- </span>
307
- </th>
308
- </tr>
309
- </thead>
310
- <tbody>
311
- <tr>
312
- <td>Shipping</td>
313
- <td>Parcel</td>
314
- <td>8</td>
315
- </tr>
316
- <tr>
317
- <td>Shipping</td>
318
- <td>Box</td>
319
- <td>20</td>
320
- </tr>
321
- <tr>
322
- <td>Shipping</td>
323
- <td>Envelope</td>
324
- <td>50</td>
325
- </tr>
326
- <tr>
327
- <td>Shipping</td>
328
- <td>Bag</td>
329
- <td>30</td>
330
- </tr>
331
- <tr>
332
- <td>Storage</td>
333
- <td>Pallet</td>
334
- <td>10</td>
335
- </tr>
336
- <tr>
337
- <td>Storage</td>
338
- <td>Container</td>
339
- <td>1</td>
340
- </tr>
341
- <tr>
342
- <td>Storage</td>
343
- <td>Crate</td>
344
- <td>15</td>
345
- </tr>
346
- <tr>
347
- <td>Storage</td>
348
- <td>Drum</td>
349
- <td>12</td>
350
- </tr>
351
- </tbody>
352
- </table>
350
+ <div class="table table-view-table border table-rounded table-has-head" role="table" style="--table-columns: minmax(50px, 1fr) minmax(50px, 1fr) minmax(50px, 1fr); --table-areas: &quot;table-col-1 table-col-2 table-col-3&quot;; --table-column-count: 3; --table-sticky-reference-top: var(--table-sticky-offset); --table-width: 908px;" aria-colcount="3">
351
+ <div class="table-head" role="rowgroup">
352
+ <div class="table-head-grid" role="row" style="grid-template-rows: repeat(1, auto);">
353
+ <div class="table-head-cell table-head-cell-sortable table-head-cell-has-column-divider table-align-left table-vertical-align-middle" data-column="category" role="columnheader" aria-colindex="1" aria-rowindex="1" aria-sort="ascending" style="grid-area: 1 / 1 / span 1 / span 1;">
354
+ <div class="table-head-cell-content">
355
+ <div class="table-head-cell-content-row">
356
+ <button type="button" class="table-head-button">
357
+ <span class="table-head-button-label">
358
+ <span class="sort-arrows sort-asc">
359
+ </span>
360
+ <span class="table-head-label">Category</span>
361
+ </span>
362
+ </button>
363
+ </div>
364
+ </div>
365
+ </div>
366
+ <div class="table-head-cell table-head-cell-sortable table-head-cell-has-column-divider table-align-left table-vertical-align-middle" data-column="name" role="columnheader" aria-colindex="2" aria-rowindex="1" aria-sort="none" style="grid-area: 1 / 2 / span 1 / span 1;">
367
+ <div class="table-head-cell-content">
368
+ <div class="table-head-cell-content-row">
369
+ <button type="button" class="table-head-button">
370
+ <span class="table-head-button-label">
371
+ <span class="sort-arrows ">
372
+ </span>
373
+ <span class="table-head-label">Name</span>
374
+ </span>
375
+ </button>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ <div class="table-head-cell table-head-cell-sortable table-align-left table-vertical-align-middle" data-column="quantity" role="columnheader" aria-colindex="3" aria-rowindex="1" aria-sort="none" style="grid-area: 1 / 3 / span 1 / span 1;">
380
+ <div class="table-head-cell-content">
381
+ <div class="table-head-cell-content-row">
382
+ <button type="button" class="table-head-button">
383
+ <span class="table-head-button-label">
384
+ <span class="sort-arrows ">
385
+ </span>
386
+ <span class="table-head-label">Quantity</span>
387
+ </span>
388
+ </button>
389
+ </div>
390
+ </div>
391
+ </div>
392
+ </div>
393
+ </div>
394
+ <div class="table-body" role="rowgroup">
395
+ <div id="Parcel" class="table-row" data-index="0" data-row-id="0" role="row">
396
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
397
+ <div class="table-cell-content overflow-hidden">Shipping</div>
398
+ </div>
399
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
400
+ <div class="table-cell-content overflow-hidden">Parcel</div>
401
+ </div>
402
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
403
+ <div class="table-cell-content overflow-hidden">8</div>
404
+ </div>
405
+ </div>
406
+ <div id="Box" class="table-row" data-index="1" data-row-id="1" role="row">
407
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
408
+ <div class="table-cell-content overflow-hidden">Shipping</div>
409
+ </div>
410
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
411
+ <div class="table-cell-content overflow-hidden">Box</div>
412
+ </div>
413
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
414
+ <div class="table-cell-content overflow-hidden">20</div>
415
+ </div>
416
+ </div>
417
+ <div id="Envelope" class="table-row" data-index="2" data-row-id="2" role="row">
418
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
419
+ <div class="table-cell-content overflow-hidden">Shipping</div>
420
+ </div>
421
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
422
+ <div class="table-cell-content overflow-hidden">Envelope</div>
423
+ </div>
424
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
425
+ <div class="table-cell-content overflow-hidden">50</div>
426
+ </div>
427
+ </div>
428
+ <div id="Bag" class="table-row" data-index="3" data-row-id="3" role="row">
429
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
430
+ <div class="table-cell-content overflow-hidden">Shipping</div>
431
+ </div>
432
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
433
+ <div class="table-cell-content overflow-hidden">Bag</div>
434
+ </div>
435
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
436
+ <div class="table-cell-content overflow-hidden">30</div>
437
+ </div>
438
+ </div>
439
+ <div id="Pallet" class="table-row" data-index="4" data-row-id="4" role="row">
440
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
441
+ <div class="table-cell-content overflow-hidden">Storage</div>
442
+ </div>
443
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
444
+ <div class="table-cell-content overflow-hidden">Pallet</div>
445
+ </div>
446
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
447
+ <div class="table-cell-content overflow-hidden">10</div>
448
+ </div>
449
+ </div>
450
+ <div id="Container" class="table-row" data-index="5" data-row-id="5" role="row">
451
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
452
+ <div class="table-cell-content overflow-hidden">Storage</div>
453
+ </div>
454
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
455
+ <div class="table-cell-content overflow-hidden">Container</div>
456
+ </div>
457
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
458
+ <div class="table-cell-content overflow-hidden">1</div>
459
+ </div>
460
+ </div>
461
+ <div id="Crate" class="table-row" data-index="6" data-row-id="6" role="row">
462
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
463
+ <div class="table-cell-content overflow-hidden">Storage</div>
464
+ </div>
465
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
466
+ <div class="table-cell-content overflow-hidden">Crate</div>
467
+ </div>
468
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
469
+ <div class="table-cell-content overflow-hidden">15</div>
470
+ </div>
471
+ </div>
472
+ <div id="Drum" class="table-row" data-index="7" data-row-id="7" role="row">
473
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="category" role="cell" aria-colindex="1" style="grid-area: 1 / 1 / span 1 / span 1;">
474
+ <div class="table-cell-content overflow-hidden">Storage</div>
475
+ </div>
476
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="name" role="cell" aria-colindex="2" style="grid-area: 1 / 2 / span 1 / span 1;">
477
+ <div class="table-cell-content overflow-hidden">Drum</div>
478
+ </div>
479
+ <div class="table-cell table-align-left table-vertical-align-middle" data-column="quantity" role="cell" aria-colindex="3" style="grid-area: 1 / 3 / span 1 / span 1;">
480
+ <div class="table-cell-content overflow-hidden">12</div>
481
+ </div>
482
+ </div>
483
+ </div>
353
484
  </div>
354
485
  ```
355
486