@rio-cloud/uikit-mcp 1.0.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 (198) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +91 -0
  3. package/bin/uikit-mcp.mjs +23 -0
  4. package/data/pages/Components/components/accentbar.json +207 -0
  5. package/data/pages/Components/components/activity.json +87 -0
  6. package/data/pages/Components/components/animatednumber.json +99 -0
  7. package/data/pages/Components/components/animations.json +87 -0
  8. package/data/pages/Components/components/appheader.json +291 -0
  9. package/data/pages/Components/components/applayout.json +1198 -0
  10. package/data/pages/Components/components/appnavigationbar.json +327 -0
  11. package/data/pages/Components/components/areacharts.json +563 -0
  12. package/data/pages/Components/components/aspectratioplaceholder.json +75 -0
  13. package/data/pages/Components/components/assettree.json +3080 -0
  14. package/data/pages/Components/components/autosuggests.json +710 -0
  15. package/data/pages/Components/components/avatar.json +157 -0
  16. package/data/pages/Components/components/banner.json +599 -0
  17. package/data/pages/Components/components/barcharts.json +1507 -0
  18. package/data/pages/Components/components/barlist.json +223 -0
  19. package/data/pages/Components/components/basicmap.json +68 -0
  20. package/data/pages/Components/components/bottomsheet.json +601 -0
  21. package/data/pages/Components/components/button.json +583 -0
  22. package/data/pages/Components/components/buttontoolbar.json +63 -0
  23. package/data/pages/Components/components/calendarstripe.json +235 -0
  24. package/data/pages/Components/components/card.json +69 -0
  25. package/data/pages/Components/components/carousel.json +39 -0
  26. package/data/pages/Components/components/chartcolors.json +34 -0
  27. package/data/pages/Components/components/chartsgettingstarted.json +32 -0
  28. package/data/pages/Components/components/chat.json +39 -0
  29. package/data/pages/Components/components/checkbox.json +847 -0
  30. package/data/pages/Components/components/clearableinput.json +789 -0
  31. package/data/pages/Components/components/collapse.json +175 -0
  32. package/data/pages/Components/components/composedcharts.json +159 -0
  33. package/data/pages/Components/components/contentloader.json +233 -0
  34. package/data/pages/Components/components/datatabs.json +680 -0
  35. package/data/pages/Components/components/datepickers.json +287 -0
  36. package/data/pages/Components/components/dialogs.json +1492 -0
  37. package/data/pages/Components/components/divider.json +93 -0
  38. package/data/pages/Components/components/dropdowns.json +936 -0
  39. package/data/pages/Components/components/editablecontent.json +1117 -0
  40. package/data/pages/Components/components/expander.json +377 -0
  41. package/data/pages/Components/components/fade.json +403 -0
  42. package/data/pages/Components/components/fadeexpander.json +75 -0
  43. package/data/pages/Components/components/fadeup.json +127 -0
  44. package/data/pages/Components/components/feedback.json +269 -0
  45. package/data/pages/Components/components/filepickers.json +269 -0
  46. package/data/pages/Components/components/formlabel.json +115 -0
  47. package/data/pages/Components/components/fullscreenmap.json +22 -0
  48. package/data/pages/Components/components/groupeditemlist.json +323 -0
  49. package/data/pages/Components/components/iconlist.json +45 -0
  50. package/data/pages/Components/components/imagepreloader.json +81 -0
  51. package/data/pages/Components/components/labeledelement.json +75 -0
  52. package/data/pages/Components/components/licenseplate.json +69 -0
  53. package/data/pages/Components/components/linecharts.json +987 -0
  54. package/data/pages/Components/components/listmenu.json +313 -0
  55. package/data/pages/Components/components/loadmore.json +175 -0
  56. package/data/pages/Components/components/mainnavigation.json +39 -0
  57. package/data/pages/Components/components/mapcircle.json +34 -0
  58. package/data/pages/Components/components/mapcluster.json +51 -0
  59. package/data/pages/Components/components/mapcontext.json +105 -0
  60. package/data/pages/Components/components/mapdraggablemarker.json +34 -0
  61. package/data/pages/Components/components/mapgettingstarted.json +27 -0
  62. package/data/pages/Components/components/mapgroup.json +1198 -0
  63. package/data/pages/Components/components/mapinfobubble.json +34 -0
  64. package/data/pages/Components/components/maplayergroup.json +34 -0
  65. package/data/pages/Components/components/mapmarker.json +700 -0
  66. package/data/pages/Components/components/mappolygon.json +45 -0
  67. package/data/pages/Components/components/maproute.json +623 -0
  68. package/data/pages/Components/components/maproutegenerator.json +16 -0
  69. package/data/pages/Components/components/mapsettings.json +51 -0
  70. package/data/pages/Components/components/maputils.json +34 -0
  71. package/data/pages/Components/components/multiselects.json +1451 -0
  72. package/data/pages/Components/components/nodata.json +139 -0
  73. package/data/pages/Components/components/notifications.json +65 -0
  74. package/data/pages/Components/components/numbercontrol.json +301 -0
  75. package/data/pages/Components/components/onboarding.json +302 -0
  76. package/data/pages/Components/components/page.json +197 -0
  77. package/data/pages/Components/components/pager.json +93 -0
  78. package/data/pages/Components/components/piecharts.json +731 -0
  79. package/data/pages/Components/components/popover.json +251 -0
  80. package/data/pages/Components/components/position.json +69 -0
  81. package/data/pages/Components/components/radialbarcharts.json +1304 -0
  82. package/data/pages/Components/components/radiobutton.json +1105 -0
  83. package/data/pages/Components/components/releasenotes.json +44 -0
  84. package/data/pages/Components/components/resizer.json +93 -0
  85. package/data/pages/Components/components/responsivecolumnstripe.json +123 -0
  86. package/data/pages/Components/components/responsivevideo.json +75 -0
  87. package/data/pages/Components/components/rioglyph.json +93 -0
  88. package/data/pages/Components/components/rules.json +410 -0
  89. package/data/pages/Components/components/saveableinput.json +703 -0
  90. package/data/pages/Components/components/selects.json +701 -0
  91. package/data/pages/Components/components/sidebar.json +243 -0
  92. package/data/pages/Components/components/sliders.json +235 -0
  93. package/data/pages/Components/components/smoothscrollbars.json +335 -0
  94. package/data/pages/Components/components/spinners.json +343 -0
  95. package/data/pages/Components/components/states.json +1705 -0
  96. package/data/pages/Components/components/statswidgets.json +314 -0
  97. package/data/pages/Components/components/statusbar.json +177 -0
  98. package/data/pages/Components/components/stepbutton.json +57 -0
  99. package/data/pages/Components/components/steppedprogressbars.json +417 -0
  100. package/data/pages/Components/components/subnavigation.json +107 -0
  101. package/data/pages/Components/components/supportmarker.json +45 -0
  102. package/data/pages/Components/components/svgimage.json +81 -0
  103. package/data/pages/Components/components/switch.json +111 -0
  104. package/data/pages/Components/components/tables.json +144 -0
  105. package/data/pages/Components/components/tagmanager.json +86 -0
  106. package/data/pages/Components/components/tags.json +146 -0
  107. package/data/pages/Components/components/teaser.json +188 -0
  108. package/data/pages/Components/components/timeline.json +45 -0
  109. package/data/pages/Components/components/timepicker.json +163 -0
  110. package/data/pages/Components/components/togglebutton.json +247 -0
  111. package/data/pages/Components/components/tooltip.json +270 -0
  112. package/data/pages/Components/components/virtuallist.json +175 -0
  113. package/data/pages/Foundations/foundations.json +2475 -0
  114. package/data/pages/Getting-started/start/changelog.json +22 -0
  115. package/data/pages/Getting-started/start/goodtoknow.json +32 -0
  116. package/data/pages/Getting-started/start/guidelines/color-combinations.json +58 -0
  117. package/data/pages/Getting-started/start/guidelines/custom-css.json +27 -0
  118. package/data/pages/Getting-started/start/guidelines/custom-rioglyph.json +22 -0
  119. package/data/pages/Getting-started/start/guidelines/formatting.json +97 -0
  120. package/data/pages/Getting-started/start/guidelines/iframe.json +93 -0
  121. package/data/pages/Getting-started/start/guidelines/obfuscate-data.json +22 -0
  122. package/data/pages/Getting-started/start/guidelines/print-css.json +37 -0
  123. package/data/pages/Getting-started/start/guidelines/spinner.json +144 -0
  124. package/data/pages/Getting-started/start/guidelines/supported-browsers.json +22 -0
  125. package/data/pages/Getting-started/start/guidelines/writing.json +242 -0
  126. package/data/pages/Getting-started/start/howto.json +72 -0
  127. package/data/pages/Getting-started/start/intro.json +37 -0
  128. package/data/pages/Getting-started/start/responsiveness.json +52 -0
  129. package/data/pages/Templates/templates/common-table.json +39 -0
  130. package/data/pages/Templates/templates/detail-views.json +71 -0
  131. package/data/pages/Templates/templates/expandable-details.json +39 -0
  132. package/data/pages/Templates/templates/feature-cards.json +103 -0
  133. package/data/pages/Templates/templates/form-summary.json +39 -0
  134. package/data/pages/Templates/templates/form-toggle.json +39 -0
  135. package/data/pages/Templates/templates/list-blocks.json +119 -0
  136. package/data/pages/Templates/templates/loading-progress.json +39 -0
  137. package/data/pages/Templates/templates/options-panel.json +39 -0
  138. package/data/pages/Templates/templates/panel-variants.json +39 -0
  139. package/data/pages/Templates/templates/progress-cards.json +71 -0
  140. package/data/pages/Templates/templates/progress-success.json +39 -0
  141. package/data/pages/Templates/templates/settings-form.json +39 -0
  142. package/data/pages/Templates/templates/stats-blocks.json +135 -0
  143. package/data/pages/Templates/templates/table-panel.json +39 -0
  144. package/data/pages/Templates/templates/table-row-animation.json +39 -0
  145. package/data/pages/Templates/templates/usage-cards.json +39 -0
  146. package/data/pages/Utilities/utilities/deviceutils.json +39 -0
  147. package/data/pages/Utilities/utilities/featuretoggles.json +42 -0
  148. package/data/pages/Utilities/utilities/fueltypeutils.json +118 -0
  149. package/data/pages/Utilities/utilities/routeutils.json +34 -0
  150. package/data/pages/Utilities/utilities/useaftermount.json +63 -0
  151. package/data/pages/Utilities/utilities/useaverage.json +86 -0
  152. package/data/pages/Utilities/utilities/useclickoutside.json +69 -0
  153. package/data/pages/Utilities/utilities/useclipboard.json +57 -0
  154. package/data/pages/Utilities/utilities/usecount.json +92 -0
  155. package/data/pages/Utilities/utilities/usedarkmode.json +50 -0
  156. package/data/pages/Utilities/utilities/usedebuginfo.json +63 -0
  157. package/data/pages/Utilities/utilities/useeffectonce.json +57 -0
  158. package/data/pages/Utilities/utilities/useelapsedtime.json +57 -0
  159. package/data/pages/Utilities/utilities/useelementsize.json +63 -0
  160. package/data/pages/Utilities/utilities/useesc.json +57 -0
  161. package/data/pages/Utilities/utilities/useevent.json +75 -0
  162. package/data/pages/Utilities/utilities/usefocustrap.json +57 -0
  163. package/data/pages/Utilities/utilities/usefullscreen.json +197 -0
  164. package/data/pages/Utilities/utilities/usehover.json +57 -0
  165. package/data/pages/Utilities/utilities/useinterval.json +63 -0
  166. package/data/pages/Utilities/utilities/useisfocuswithin.json +75 -0
  167. package/data/pages/Utilities/utilities/usekey.json +75 -0
  168. package/data/pages/Utilities/utilities/uselocalstorage.json +69 -0
  169. package/data/pages/Utilities/utilities/uselocationsuggestions.json +110 -0
  170. package/data/pages/Utilities/utilities/usemax.json +86 -0
  171. package/data/pages/Utilities/utilities/usemin.json +86 -0
  172. package/data/pages/Utilities/utilities/usemutationobserver.json +69 -0
  173. package/data/pages/Utilities/utilities/useonlinestatus.json +39 -0
  174. package/data/pages/Utilities/utilities/useonscreen.json +63 -0
  175. package/data/pages/Utilities/utilities/usepostmessage.json +80 -0
  176. package/data/pages/Utilities/utilities/useprevious.json +63 -0
  177. package/data/pages/Utilities/utilities/useresizeobserver.json +65 -0
  178. package/data/pages/Utilities/utilities/usescrollposition.json +103 -0
  179. package/data/pages/Utilities/utilities/usesearch.json +197 -0
  180. package/data/pages/Utilities/utilities/usesorting.json +139 -0
  181. package/data/pages/Utilities/utilities/usestatewithvalidation.json +69 -0
  182. package/data/pages/Utilities/utilities/usesum.json +86 -0
  183. package/data/pages/Utilities/utilities/usetableexport.json +87 -0
  184. package/data/pages/Utilities/utilities/usetableselection.json +311 -0
  185. package/data/pages/Utilities/utilities/usetimeout.json +63 -0
  186. package/data/pages/Utilities/utilities/usetoggle.json +75 -0
  187. package/data/pages/Utilities/utilities/usewindowresize.json +63 -0
  188. package/data/version.json +4 -0
  189. package/docs/content-schema.md +147 -0
  190. package/docs/navigation-inventory.json +1310 -0
  191. package/docs/search-synonyms.json +43 -0
  192. package/package.json +38 -0
  193. package/server/index.mjs +268 -0
  194. package/server/lib/load-docs.mjs +48 -0
  195. package/server/lib/normalise-doc.mjs +220 -0
  196. package/server/lib/render-markdown.mjs +82 -0
  197. package/server/lib/search-index.mjs +49 -0
  198. package/server/lib/types.js +99 -0
@@ -0,0 +1,311 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:49.715Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useTableSelection",
5
+ "category": "Utilities",
6
+ "section": "Table & data hooks",
7
+ "slug": "utilities/usetableselection",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "1299fe5b6b0726e98180eafc5b7a8598bf80cbc07902dacb37a433cea912e289"
11
+ },
12
+ "title": "useTableSelection",
13
+ "lead": "The useTableSelection hook simplifies the implementation of selection behavior in tables for single selection and multi-selection use cases. It’s especially useful for large datasets, as it optimizes performance by preventing unnecessary re-renders of all rows.",
14
+ "content": [
15
+ {
16
+ "heading": "useTableSelection",
17
+ "body": "Note, when using a checkbox column for multi-selection and a column for some action buttons, make sure to apply the classes \"table-checkbox\" and \"table-action\" to the respective row \"td\" elements. The latter class automatically stops event propagation, preventing the row from being selected when an action button is clicked.",
18
+ "examples": [
19
+ {
20
+ "caption": "Active row",
21
+ "rendered_html": "<div class=\"playground-content bg-lighter padding-20 padding-bottom-25\" style=\"width: 100%;\"><div><div class=\"bg-white rounded border shadow-none padding-15 margin-bottom-15 display-flex justify-content-between\"><div><div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Active row</div><div>-</div></div><div class=\"align-self-center\"></div></div><div class=\"table-responsive\"><table class=\"table table-layout-fixed table-column-overflow-hidden table-bordered table-sticky table-hover table-head-filled\"><colgroup><col class=\"\" style=\"min-width: 100px; width: 100px;\"><col class=\"\" style=\"min-width: 200px; width: 200px;\"><col class=\"\"><col class=\"\"></colgroup><thead><tr><th class=\"user-select-none sort-column\" data-field=\"driverId\" data-sortby=\"driverId\" title=\"Id\"><span><span class=\"sort-arrows sort-asc\"></span><span>Id</span></span></th><th class=\"user-select-none sort-column\" data-field=\"firstName\" data-sortby=\"firstName\" title=\"First name\"><span><span class=\"sort-arrows \"></span><span>First name</span></span></th><th class=\"user-select-none sort-column\" data-field=\"lastName\" data-sortby=\"lastName\" title=\"Last name\"><span><span class=\"sort-arrows \"></span><span>Last name</span></span></th><th class=\"user-select-none sort-column\" data-field=\"email\" data-sortby=\"email\" title=\"E-mail\"><span><span class=\"sort-arrows \"></span><span>E-mail</span></span></th></tr></thead><tbody><tr data-id=\"1\" class=\"cursor-pointer\"><td data-field=\"Id\"><span>1</span></td><td data-field=\"First name\"><span>Yadira</span></td><td data-field=\"Last name\"><span>Heathcote</span></td><td data-field=\"E-mail\"><span>Brady4@hotmail.com</span></td></tr><tr data-id=\"2\" class=\"cursor-pointer\"><td data-field=\"Id\"><span>2</span></td><td data-field=\"First name\"><span>Judd</span></td><td data-field=\"Last name\"><span>Mann</span></td><td data-field=\"E-mail\"><span>Lavina_Effertz@yahoo.com</span></td></tr><tr data-id=\"3\" class=\"cursor-pointer\"><td data-field=\"Id\"><span>3</span></td><td data-field=\"First name\"><span>Alessandro</span></td><td data-field=\"Last name\"><span>Schoen</span></td><td data-field=\"E-mail\"><span>Tyreek.Altenwerth69@yahoo.com</span></td></tr><tr data-id=\"4\" class=\"cursor-pointer\"><td data-field=\"Id\"><span>4</span></td><td data-field=\"First name\"><span>Matteo</span></td><td data-field=\"Last name\"><span>Paucek</span></td><td data-field=\"E-mail\"><span>Elian.Koch49@gmail.com</span></td></tr><tr data-id=\"5\" class=\"cursor-pointer\"><td data-field=\"Id\"><span>5</span></td><td data-field=\"First name\"><span>Abel</span></td><td data-field=\"Last name\"><span>Harris</span></td><td data-field=\"E-mail\"><span>Berniece35@gmail.com</span></td></tr></tbody></table></div></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import React from 'react';\nimport classNames from 'classnames';\nimport faker from 'faker';\n\nimport TableHead from '@rio-cloud/rio-uikit/TableHead';\nimport TableCol, { type ColumnDetailsMap } from '@rio-cloud/rio-uikit/TableCol';\nimport useTableSelection from '@rio-cloud/rio-uikit/useTableSelection';\nimport useSorting from '@rio-cloud/rio-uikit/useSorting';\nimport FormLabel from '@rio-cloud/rio-uikit/FormLabel';\nimport Card from '@rio-cloud/rio-uikit/Card';\nimport Button from '@rio-cloud/rio-uikit/Button';\n\ntype Driver = {\n driverId: string;\n firstName: string;\n lastName: string;\n email: string;\n};\n\ntype ColumnLabel = { [key in keyof Driver]: string };\n\nconst columnLabels: ColumnLabel = {\n driverId: 'Id',\n firstName: 'First name',\n lastName: 'Last name',\n email: 'E-mail',\n};\n\nconst defaultColumnOrder = ['driverId', 'firstName', 'lastName', 'email'];\n\nconst demoColumnsDetails: ColumnDetailsMap = {\n driverId: {\n width: 100,\n defaultWidth: 200,\n maxWidth: 300,\n },\n firstName: {\n width: 200,\n defaultWidth: 200,\n maxWidth: 200,\n },\n lastName: {\n width: 0, // Note: 0 means auto width\n defaultWidth: 0,\n maxWidth: 350,\n },\n};\n\n// Function to generate random entries to work with.\n// Increase length to generate more items.\nconst driverList: Driver[] = Array.from({ length: 5 }, (_, index) => ({\n driverId: `${index + 1}`,\n firstName: faker.name.firstName(),\n lastName: faker.name.lastName(),\n email: faker.internet.email(),\n}));\n\nexport default () => {\n const { sortedItems, sortKey, sortDirection, setSortKey, toggleDirection } = useSorting(driverList, 'driverId');\n\n // Use the headless table selection hook\n const { tableRef, onActiveRowChange, activeRowId, setActiveRowId } = useTableSelection<Driver>({\n tableData: driverList,\n idKey: 'driverId' as keyof Driver, // Specify the unique identifier key\n // dataAttributeName: 'data-id', // Specify the \"data-id\" key where the idKey is stored on a table row\n });\n\n const handleSortChange = (event: React.MouseEvent<HTMLTableCellElement>) => {\n const newSortBy = event.currentTarget.getAttribute('data-sortby');\n if (newSortBy) {\n setSortKey(newSortBy as keyof Driver);\n }\n if (newSortBy === sortKey) {\n toggleDirection();\n }\n };\n\n const tableClassNames = classNames(\n 'table',\n 'table-layout-fixed',\n 'table-column-overflow-hidden',\n 'table-bordered',\n 'table-sticky',\n 'table-hover',\n 'table-head-filled'\n );\n\n return (\n <div>\n <Card className='margin-bottom-15 display-flex justify-content-between' shadow='none'>\n <div>\n <FormLabel>Active row</FormLabel>\n <div>{activeRowId || '-'}</div>\n </div>\n <div className='align-self-center'>\n {activeRowId && <Button onClick={() => setActiveRowId(undefined)}>Clear active row</Button>}\n </div>\n </Card>\n\n <div className='table-responsive'>\n <table ref={tableRef} className={tableClassNames}>\n <colgroup>\n {defaultColumnOrder.map(column => (\n <TableCol key={column} columnDetails={demoColumnsDetails[column]} />\n ))}\n </colgroup>\n <thead>\n <tr>\n {defaultColumnOrder.map(column => (\n <TableHead\n key={column}\n column={column}\n label={columnLabels[column as keyof ColumnLabel]}\n sortBy={sortKey as string}\n sortDir={sortDirection}\n onClick={handleSortChange}\n />\n ))}\n </tr>\n </thead>\n <tbody>\n {sortedItems.map(row => (\n <TableRow\n key={row.driverId}\n row={row}\n columns={defaultColumnOrder}\n colLabels={columnLabels}\n onRowClick={onActiveRowChange}\n />\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n\ntype TableRowProps = {\n row: Driver;\n columns: string[];\n colLabels: ColumnLabel;\n onRowClick: (event: React.MouseEvent<HTMLTableRowElement>) => void;\n};\n\n// A custom table row component used to prevent re-rendering the individual row.\n// Usually, this would be placed into it's own file but for demo purposes it's listed here.\nconst TableRow = React.memo(\n (props: TableRowProps) => {\n const { row, columns, colLabels, onRowClick } = props;\n\n // Make sure to store the unique \"idKey\" as data attribute as specified for the useTableMultiSelection hook\n // In this example the driverId is used as identifier stored as \"data-id\".\n return (\n <tr key={row.driverId} data-id={row.driverId} onClick={onRowClick} className='cursor-pointer'>\n {columns.map(col => (\n <td key={col} data-field={colLabels[col as keyof Driver]}>\n <span>{row[col as keyof Driver]}</span>\n </td>\n ))}\n </tr>\n );\n },\n (prevProps, nextProps) => {\n return JSON.stringify(prevProps) === JSON.stringify(nextProps);\n }\n);"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<div>\n <div class=\"bg-white rounded border shadow-none padding-15 margin-bottom-15 display-flex justify-content-between\">\n <div>\n <div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Active row</div>\n <div>-</div>\n </div>\n <div class=\"align-self-center\">\n </div>\n </div>\n <div class=\"table-responsive\">\n <table class=\"table table-layout-fixed table-column-overflow-hidden table-bordered table-sticky table-hover table-head-filled\">\n <colgroup>\n <col class=\"\" style=\"min-width: 100px; width: 100px;\">\n <col class=\"\" style=\"min-width: 200px; width: 200px;\">\n <col class=\"\">\n <col class=\"\">\n </colgroup>\n <thead>\n <tr>\n <th class=\"user-select-none sort-column\" data-field=\"driverId\" data-sortby=\"driverId\" title=\"Id\">\n <span>\n <span class=\"sort-arrows sort-asc\">\n </span>\n <span>Id</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"firstName\" data-sortby=\"firstName\" title=\"First name\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>First name</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"lastName\" data-sortby=\"lastName\" title=\"Last name\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>Last name</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"email\" data-sortby=\"email\" title=\"E-mail\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>E-mail</span>\n </span>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr data-id=\"1\" class=\"cursor-pointer\">\n <td data-field=\"Id\">\n <span>1</span>\n </td>\n <td data-field=\"First name\">\n <span>Yadira</span>\n </td>\n <td data-field=\"Last name\">\n <span>Heathcote</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Brady4@hotmail.com</span>\n </td>\n </tr>\n <tr data-id=\"2\" class=\"cursor-pointer\">\n <td data-field=\"Id\">\n <span>2</span>\n </td>\n <td data-field=\"First name\">\n <span>Judd</span>\n </td>\n <td data-field=\"Last name\">\n <span>Mann</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Lavina_Effertz@yahoo.com</span>\n </td>\n </tr>\n <tr data-id=\"3\" class=\"cursor-pointer\">\n <td data-field=\"Id\">\n <span>3</span>\n </td>\n <td data-field=\"First name\">\n <span>Alessandro</span>\n </td>\n <td data-field=\"Last name\">\n <span>Schoen</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Tyreek.Altenwerth69@yahoo.com</span>\n </td>\n </tr>\n <tr data-id=\"4\" class=\"cursor-pointer\">\n <td data-field=\"Id\">\n <span>4</span>\n </td>\n <td data-field=\"First name\">\n <span>Matteo</span>\n </td>\n <td data-field=\"Last name\">\n <span>Paucek</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Elian.Koch49@gmail.com</span>\n </td>\n </tr>\n <tr data-id=\"5\" class=\"cursor-pointer\">\n <td data-field=\"Id\">\n <span>5</span>\n </td>\n <td data-field=\"First name\">\n <span>Abel</span>\n </td>\n <td data-field=\"Last name\">\n <span>Harris</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Berniece35@gmail.com</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": null,
37
+ "props": [
38
+ {
39
+ "heading": "Options for the `useTableSelection` hook",
40
+ "rows": [
41
+ {
42
+ "name": "tableData",
43
+ "type": "TData[]",
44
+ "default": "",
45
+ "description": "The array of data items to be displayed in the table. The hook uses this to determine all possible row IDs for \"select all\" functionality."
46
+ },
47
+ {
48
+ "name": "idKey",
49
+ "type": "keyof TData",
50
+ "default": "",
51
+ "description": "The key in `TData` objects that serves as the unique identifier for each row."
52
+ },
53
+ {
54
+ "name": "initialSelectedRowIds",
55
+ "type": "string[]",
56
+ "default": "",
57
+ "description": "Optional array of row IDs that should be initially selected."
58
+ },
59
+ {
60
+ "name": "initialActiveRowId",
61
+ "type": "string",
62
+ "default": "",
63
+ "description": "Optional ID of the row that should be initially marked as active."
64
+ },
65
+ {
66
+ "name": "checkboxQuerySelector",
67
+ "type": "string",
68
+ "default": "'.table-checkbox input[type=\"checkbox\"]'",
69
+ "description": "Optional CSS query selector to find the checkbox input element within each table row."
70
+ },
71
+ {
72
+ "name": "dataAttributeName",
73
+ "type": "string",
74
+ "default": "data-id",
75
+ "description": "Optional name of the HTML data attribute on `<tr>` elements that holds the unique row ID."
76
+ },
77
+ {
78
+ "name": "ref",
79
+ "type": "RefObject<HTMLTableElement>",
80
+ "default": "",
81
+ "description": "Optional external ref for the table element. If not provided, the hook creates its own. Useful if the parent component needs direct access to the table DOM element for other purposes."
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ "heading": "Return value of the `useTableSelection` hook",
87
+ "rows": [
88
+ {
89
+ "name": "tableRef",
90
+ "type": "RefObject<HTMLTableElement>",
91
+ "default": "",
92
+ "description": "React ref attached to the `<table>` HTML element. Ensure this ref is assigned to your table element to enable DOM manipulations."
93
+ },
94
+ {
95
+ "name": "selectedRowIds",
96
+ "type": "string[]",
97
+ "default": "",
98
+ "description": "An array of strings, where each string is the ID of a currently selected row."
99
+ },
100
+ {
101
+ "name": "setSelectedRowIds",
102
+ "type": "(rowIds: string[]) => void",
103
+ "default": "",
104
+ "description": "Setter function to change selected rows from the outside in a controlled manner."
105
+ },
106
+ {
107
+ "name": "activeRowId",
108
+ "type": "string",
109
+ "default": "",
110
+ "description": "The ID of the currently active row. An empty string signifies no row is active."
111
+ },
112
+ {
113
+ "name": "setActiveRowId",
114
+ "type": "(activeRowId: string | undefined) => void",
115
+ "default": "",
116
+ "description": "Setter function to change the active row from the outside in a controlled manner. Use this to deselect an active row."
117
+ },
118
+ {
119
+ "name": "onSelection",
120
+ "type": "(event: React.MouseEvent<HTMLElement>) => void",
121
+ "default": "",
122
+ "description": "Callback handler to be attached to the click/change event of individual row selection UI elements (e.g., checkboxes). It expects the clicked element to be within a `<tr>` that has the specified `dataAttributeName`. Manages the selection state of a single row."
123
+ },
124
+ {
125
+ "name": "onActiveRowChange",
126
+ "type": "(event: React.MouseEvent<HTMLTableRowElement>) => void",
127
+ "default": "",
128
+ "description": "Callback handler to be attached to the click event of table row (`<tr>`) elements.Manages the active row state."
129
+ },
130
+ {
131
+ "name": "onToggleAll",
132
+ "type": "(shouldSelect: boolean) => void",
133
+ "default": "",
134
+ "description": "Callback handler to select or deselect all rows. If \"shouldSelect\" is set to true, all rows in `tableData` will be selected; otherwise, all selections will be cleared."
135
+ },
136
+ {
137
+ "name": "updateRowSelection",
138
+ "type": "() => void",
139
+ "default": "",
140
+ "description": "Function to update row selection and active highlighting. This is useful when the row data changes due to a search value or any other filter."
141
+ },
142
+ {
143
+ "name": "hasSelection",
144
+ "type": "boolean",
145
+ "default": "",
146
+ "description": "A boolean indicating whether at least one row is currently selected."
147
+ },
148
+ {
149
+ "name": "isAllSelected",
150
+ "type": "boolean",
151
+ "default": "",
152
+ "description": "A boolean indicating whether all rows in the current `tableData` are selected."
153
+ }
154
+ ]
155
+ }
156
+ ]
157
+ }
158
+ ]
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "heading": "Multi-selection",
164
+ "body": "",
165
+ "examples": [
166
+ {
167
+ "caption": "Active row",
168
+ "rendered_html": "<div class=\"playground-content bg-lighter padding-20 padding-bottom-25\" style=\"width: 100%;\"><div><div class=\"bg-white rounded border shadow-none padding-15 margin-bottom-15 display-flex justify-content-between\"><div class=\"display-flex gap-25\"><div><div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Active row</div><div>-</div></div><div><div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Selected rows</div><div>4</div></div></div><div class=\"align-self-center btn-toolbar\"><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Deselect all Items</button><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Select some rows</button></div></div><div class=\"table-responsive\"><table class=\"table table-layout-fixed table-column-overflow-hidden table-bordered table-sticky table-hover table-head-filled\"><colgroup><col class=\"\"><col class=\"\" style=\"min-width: 100px; width: 100px;\"><col class=\"\" style=\"min-width: 200px; width: 200px;\"><col class=\"\"><col class=\"\"><col class=\"\"></colgroup><thead><tr><th class=\"user-select-none sort-column table-checkbox\" title=\"\"><div class=\"dropdown btn-group\"><button type=\"button\" id=\"qya2fvaxt4\" class=\"btn btn-default btn-outline btn-sm btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-checkboxes\"></span></button></div></th><th class=\"user-select-none sort-column\" data-field=\"driverId\" data-sortby=\"driverId\" title=\"Id\"><span><span class=\"sort-arrows sort-asc\"></span><span>Id</span></span></th><th class=\"user-select-none sort-column\" data-field=\"firstName\" data-sortby=\"firstName\" title=\"First name\"><span><span class=\"sort-arrows \"></span><span>First name</span></span></th><th class=\"user-select-none sort-column\" data-field=\"lastName\" data-sortby=\"lastName\" title=\"Last name\"><span><span class=\"sort-arrows \"></span><span>Last name</span></span></th><th class=\"user-select-none sort-column\" data-field=\"email\" data-sortby=\"email\" title=\"E-mail\"><span><span class=\"sort-arrows \"></span><span>E-mail</span></span></th><th class=\"user-select-none sort-column table-action\" title=\"\"></th></tr></thead><tbody><tr data-id=\"1\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>1</span></td><td data-field=\"First name\"><span>Hellen</span></td><td data-field=\"Last name\"><span>Dooley</span></td><td data-field=\"E-mail\"><span>Kathryn.Larson30@hotmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"4328goteuzw\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"2\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>2</span></td><td data-field=\"First name\"><span>Alisa</span></td><td data-field=\"Last name\"><span>Ernser</span></td><td data-field=\"E-mail\"><span>Raven.Wehner87@hotmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"ehz0jbkuq2m\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"3\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>3</span></td><td data-field=\"First name\"><span>Rupert</span></td><td data-field=\"Last name\"><span>Gorczany</span></td><td data-field=\"E-mail\"><span>Wilson_Rice@hotmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"znapjdgiqj\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"4\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>4</span></td><td data-field=\"First name\"><span>Bernadette</span></td><td data-field=\"Last name\"><span>Strosin</span></td><td data-field=\"E-mail\"><span>Jerald.Mitchell@yahoo.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"m5tm7fednd\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"5\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>5</span></td><td data-field=\"First name\"><span>Ernie</span></td><td data-field=\"Last name\"><span>Mraz</span></td><td data-field=\"E-mail\"><span>Erling.Stamm18@hotmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"on4xbctze5\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"6\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>6</span></td><td data-field=\"First name\"><span>Asia</span></td><td data-field=\"Last name\"><span>Murray</span></td><td data-field=\"E-mail\"><span>Effie.Sporer55@gmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"i6ikgqhqor\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"7\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>7</span></td><td data-field=\"First name\"><span>Nicholas</span></td><td data-field=\"Last name\"><span>Marquardt</span></td><td data-field=\"E-mail\"><span>Waylon.Pacocha99@gmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"xtcn7kkxgr9\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"8\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>8</span></td><td data-field=\"First name\"><span>Estelle</span></td><td data-field=\"Last name\"><span>Abernathy</span></td><td data-field=\"E-mail\"><span>Marlene_Swaniawski@gmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"zin2qik5z8p\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"9\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>9</span></td><td data-field=\"First name\"><span>Fermin</span></td><td data-field=\"Last name\"><span>Heller</span></td><td data-field=\"E-mail\"><span>Irving.Connelly65@gmail.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"pdsd1xlmmp9\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr><tr data-id=\"10\" class=\"cursor-pointer\"><td class=\"table-checkbox\"><label class=\"checkbox\" tabindex=\"0\"><input type=\"checkbox\" class=\"\"><span class=\"checkbox-text\"></span></label></td><td data-field=\"Id\"><span>10</span></td><td data-field=\"First name\"><span>Wellington</span></td><td data-field=\"Last name\"><span>Koepp</span></td><td data-field=\"E-mail\"><span>Gino97@yahoo.com</span></td><td class=\"table-action\"><span><div class=\"dropdown btn-group\"><button type=\"button\" id=\"pn7xhusznoe\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\"><span class=\"rioglyph rioglyph-option-vertical\"></span></button></div></span></td></tr></tbody></table></div></div></div>",
169
+ "tabs": [
170
+ {
171
+ "label": "React",
172
+ "language": "tsx",
173
+ "code": "import React from 'react';\nimport classNames from 'classnames';\nimport faker from 'faker';\nimport isEmpty from 'lodash/fp/isEmpty';\n\nimport TableHead from '@rio-cloud/rio-uikit/TableHead';\nimport TableCol, { type ColumnDetailsMap } from '@rio-cloud/rio-uikit/TableCol';\nimport ButtonDropdown from '@rio-cloud/rio-uikit/ButtonDropdown';\nimport Checkbox from '@rio-cloud/rio-uikit/Checkbox';\nimport useTableSelection from '@rio-cloud/rio-uikit/useTableSelection';\nimport useSorting from '@rio-cloud/rio-uikit/useSorting';\nimport FormLabel from '@rio-cloud/rio-uikit/FormLabel';\nimport Card from '@rio-cloud/rio-uikit/Card';\nimport ButtonToolbar from '@rio-cloud/rio-uikit/ButtonToolbar';\nimport Button from '@rio-cloud/rio-uikit/Button';\n\ntype Driver = {\n driverId: string;\n firstName: string;\n lastName: string;\n email: string;\n};\n\ntype ColumnLabel = { [key in keyof Driver]: string };\n\nconst defaultColumnOrder = ['driverId', 'firstName', 'lastName', 'email'];\n\nconst columnLabels: ColumnLabel = {\n driverId: 'Id',\n firstName: 'First name',\n lastName: 'Last name',\n email: 'E-mail',\n};\n\nconst demoColumnsDetails: ColumnDetailsMap = {\n driverId: {\n width: 100,\n defaultWidth: 200,\n maxWidth: 300,\n },\n firstName: {\n width: 200,\n defaultWidth: 200,\n maxWidth: 200,\n },\n lastName: {\n width: 0, // Note: 0 means auto width\n defaultWidth: 0,\n maxWidth: 350,\n },\n};\n\n// Function to generate random entries to work with.\n// Increase length to generate more items.\nconst driverList: Driver[] = Array.from({ length: 10 }, (_, index) => ({\n driverId: `${index + 1}`,\n firstName: faker.name.firstName(),\n lastName: faker.name.lastName(),\n email: faker.internet.email(),\n}));\n\nexport default () => {\n const { sortedItems, sortKey, sortDirection, setSortKey, toggleDirection } = useSorting(driverList, 'driverId');\n\n // Use the headless table selection hook\n const {\n tableRef,\n onSelection,\n onActiveRowChange,\n onToggleAll,\n activeRowId,\n setActiveRowId,\n selectedRowIds,\n setSelectedRowIds,\n hasSelection,\n isAllSelected,\n } = useTableSelection<Driver>({\n tableData: driverList,\n idKey: 'driverId' as keyof Driver, // Specify the unique identifier key\n initialSelectedRowIds: [`${driverList[3]?.driverId}`].filter(Boolean),\n initialActiveRowId: '',\n // dataAttributeName: 'data-id', // Specify the \"data-id\" key where the idKey is stored on a table row\n });\n\n const handleSortChange = (event: React.MouseEvent<HTMLTableCellElement>) => {\n const newSortBy = event.currentTarget.getAttribute('data-sortby');\n if (newSortBy) {\n setSortKey(newSortBy as keyof Driver);\n }\n if (newSortBy === sortKey) {\n toggleDirection();\n }\n };\n\n const tableClassNames = classNames(\n 'table',\n 'table-layout-fixed',\n 'table-column-overflow-hidden',\n 'table-bordered',\n 'table-sticky',\n 'table-hover',\n 'table-head-filled'\n );\n\n const batchButton = (\n <ButtonDropdown\n title={<span className='rioglyph rioglyph-checkboxes' />}\n variant='outline'\n bsSize='sm'\n iconOnly\n items={[\n {\n value: (\n <div>\n <span>Select all Items</span>\n </div>\n ),\n onSelect: () => onToggleAll(true),\n },\n {\n value: (\n <div>\n <span>Deselect all Items</span>\n </div>\n ),\n onSelect: () => onToggleAll(false),\n },\n ]}\n />\n );\n\n return (\n <div>\n <Card className='margin-bottom-15 display-flex justify-content-between' shadow='none'>\n <div className='display-flex gap-25'>\n <div>\n <FormLabel>Active row</FormLabel>\n <div>{activeRowId || '-'}</div>\n </div>\n <div>\n <FormLabel>Selected rows</FormLabel>\n <div>{selectedRowIds.join(', ')}</div>\n </div>\n </div>\n <ButtonToolbar className='align-self-center'>\n {activeRowId && <Button onClick={() => setActiveRowId(undefined)}>Clear active row</Button>}\n {!isEmpty(selectedRowIds) && <Button onClick={() => onToggleAll(false)}>Deselect all Items</Button>}\n <Button\n onClick={() => setSelectedRowIds([`${driverList[2]?.driverId}`, `${driverList[5]?.driverId}`])}\n >\n Select some rows\n </Button>\n </ButtonToolbar>\n </Card>\n <div className='table-responsive'>\n <table ref={tableRef} className={tableClassNames}>\n {/* Colgroups are required to work with column widths */}\n <colgroup>\n <TableCol />\n {defaultColumnOrder.map(column => (\n <TableCol key={column} columnDetails={demoColumnsDetails[column]} />\n ))}\n <TableCol />\n </colgroup>\n <thead>\n <tr>\n <TableHead className='table-checkbox'>{batchButton}</TableHead>\n {defaultColumnOrder.map(column => (\n <TableHead\n key={column}\n column={column}\n label={columnLabels[column as keyof ColumnLabel]}\n sortBy={sortKey as string}\n sortDir={sortDirection}\n onClick={handleSortChange}\n />\n ))}\n <TableHead className='table-action' />\n </tr>\n </thead>\n <tbody>\n {sortedItems.map(row => (\n <TableRow\n key={row.driverId}\n row={row}\n columns={defaultColumnOrder}\n colLabels={columnLabels}\n onRowClick={onActiveRowChange}\n onSelectCheckbox={onSelection}\n />\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n\ntype TableRowProps = {\n row: Driver;\n columns: string[];\n colLabels: ColumnLabel;\n onRowClick: (event: React.MouseEvent<HTMLTableRowElement>) => void;\n onSelectCheckbox: (event: React.MouseEvent<HTMLElement>) => void;\n};\n\n// A custom table row component used to prevent re-rendering the individual row.\n// Usually, this would be placed into it's own file but for demo purposes it's listed here.\nconst TableRow = React.memo(\n (props: TableRowProps) => {\n const { row, columns, colLabels, onRowClick, onSelectCheckbox } = props;\n\n // Make sure to store the unique \"idKey\" as data attribute as specified for the useTableMultiSelection hook\n // In this example the driverId is used as identifier stored as \"data-id\".\n return (\n <tr key={row.driverId} data-id={row.driverId} onClick={onRowClick} className='cursor-pointer'>\n <td className='table-checkbox' onClick={onSelectCheckbox}>\n <Checkbox />\n </td>\n {columns.map(col => (\n <td key={col} data-field={colLabels[col as keyof Driver]}>\n <span>{row[col as keyof Driver]}</span>\n </td>\n ))}\n <td className='table-action'>\n <span>\n <ButtonDropdown\n title={<span className='rioglyph rioglyph-option-vertical' />}\n variant='link'\n iconOnly\n items={[\n {\n value: (\n <div className='display-flex align-items-center gap-10'>\n <span className='rioglyph rioglyph-pencil' />\n <span>Edit Me</span>\n </div>\n ),\n },\n {\n value: (\n <div className='display-flex align-items-center gap-10'>\n <span className='rioglyph rioglyph-trash' />\n <span>Delete me</span>\n </div>\n ),\n },\n ]}\n />\n </span>\n </td>\n </tr>\n );\n },\n (prevProps, nextProps) => {\n return JSON.stringify(prevProps) === JSON.stringify(nextProps);\n }\n);"
174
+ },
175
+ {
176
+ "label": "HTML",
177
+ "language": "html",
178
+ "code": "<div>\n <div class=\"bg-white rounded border shadow-none padding-15 margin-bottom-15 display-flex justify-content-between\">\n <div class=\"display-flex gap-25\">\n <div>\n <div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Active row</div>\n <div>-</div>\n </div>\n <div>\n <div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Selected rows</div>\n <div>4</div>\n </div>\n </div>\n <div class=\"align-self-center btn-toolbar\">\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Deselect all Items</button>\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Select some rows</button>\n </div>\n </div>\n <div class=\"table-responsive\">\n <table class=\"table table-layout-fixed table-column-overflow-hidden table-bordered table-sticky table-hover table-head-filled\">\n <colgroup>\n <col class=\"\">\n <col class=\"\" style=\"min-width: 100px; width: 100px;\">\n <col class=\"\" style=\"min-width: 200px; width: 200px;\">\n <col class=\"\">\n <col class=\"\">\n <col class=\"\">\n </colgroup>\n <thead>\n <tr>\n <th class=\"user-select-none sort-column table-checkbox\" title=\"\">\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"qya2fvaxt4\" class=\"btn btn-default btn-outline btn-sm btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-checkboxes\">\n </span>\n </button>\n </div>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"driverId\" data-sortby=\"driverId\" title=\"Id\">\n <span>\n <span class=\"sort-arrows sort-asc\">\n </span>\n <span>Id</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"firstName\" data-sortby=\"firstName\" title=\"First name\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>First name</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"lastName\" data-sortby=\"lastName\" title=\"Last name\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>Last name</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column\" data-field=\"email\" data-sortby=\"email\" title=\"E-mail\">\n <span>\n <span class=\"sort-arrows \">\n </span>\n <span>E-mail</span>\n </span>\n </th>\n <th class=\"user-select-none sort-column table-action\" title=\"\">\n </th>\n </tr>\n </thead>\n <tbody>\n <tr data-id=\"1\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>1</span>\n </td>\n <td data-field=\"First name\">\n <span>Hellen</span>\n </td>\n <td data-field=\"Last name\">\n <span>Dooley</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Kathryn.Larson30@hotmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"4328goteuzw\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"2\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>2</span>\n </td>\n <td data-field=\"First name\">\n <span>Alisa</span>\n </td>\n <td data-field=\"Last name\">\n <span>Ernser</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Raven.Wehner87@hotmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"ehz0jbkuq2m\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"3\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>3</span>\n </td>\n <td data-field=\"First name\">\n <span>Rupert</span>\n </td>\n <td data-field=\"Last name\">\n <span>Gorczany</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Wilson_Rice@hotmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"znapjdgiqj\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"4\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>4</span>\n </td>\n <td data-field=\"First name\">\n <span>Bernadette</span>\n </td>\n <td data-field=\"Last name\">\n <span>Strosin</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Jerald.Mitchell@yahoo.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"m5tm7fednd\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"5\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>5</span>\n </td>\n <td data-field=\"First name\">\n <span>Ernie</span>\n </td>\n <td data-field=\"Last name\">\n <span>Mraz</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Erling.Stamm18@hotmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"on4xbctze5\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"6\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>6</span>\n </td>\n <td data-field=\"First name\">\n <span>Asia</span>\n </td>\n <td data-field=\"Last name\">\n <span>Murray</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Effie.Sporer55@gmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"i6ikgqhqor\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"7\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>7</span>\n </td>\n <td data-field=\"First name\">\n <span>Nicholas</span>\n </td>\n <td data-field=\"Last name\">\n <span>Marquardt</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Waylon.Pacocha99@gmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"xtcn7kkxgr9\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"8\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>8</span>\n </td>\n <td data-field=\"First name\">\n <span>Estelle</span>\n </td>\n <td data-field=\"Last name\">\n <span>Abernathy</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Marlene_Swaniawski@gmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"zin2qik5z8p\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"9\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>9</span>\n </td>\n <td data-field=\"First name\">\n <span>Fermin</span>\n </td>\n <td data-field=\"Last name\">\n <span>Heller</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Irving.Connelly65@gmail.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"pdsd1xlmmp9\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n <tr data-id=\"10\" class=\"cursor-pointer\">\n <td class=\"table-checkbox\">\n <label class=\"checkbox\" tabindex=\"0\">\n <input type=\"checkbox\" class=\"\">\n <span class=\"checkbox-text\">\n </span>\n </label>\n </td>\n <td data-field=\"Id\">\n <span>10</span>\n </td>\n <td data-field=\"First name\">\n <span>Wellington</span>\n </td>\n <td data-field=\"Last name\">\n <span>Koepp</span>\n </td>\n <td data-field=\"E-mail\">\n <span>Gino97@yahoo.com</span>\n </td>\n <td class=\"table-action\">\n <span>\n <div class=\"dropdown btn-group\">\n <button type=\"button\" id=\"pn7xhusznoe\" class=\"btn btn-default btn-link btn-md btn-icon-only btn-component dropdown-toggle\" tabindex=\"0\">\n <span class=\"rioglyph rioglyph-option-vertical\">\n </span>\n </button>\n </div>\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n</div>"
179
+ },
180
+ {
181
+ "label": "Props",
182
+ "language": "json",
183
+ "code": null,
184
+ "props": [
185
+ {
186
+ "heading": "Options for the `useTableSelection` hook",
187
+ "rows": [
188
+ {
189
+ "name": "tableData",
190
+ "type": "TData[]",
191
+ "default": "",
192
+ "description": "The array of data items to be displayed in the table. The hook uses this to determine all possible row IDs for \"select all\" functionality."
193
+ },
194
+ {
195
+ "name": "idKey",
196
+ "type": "keyof TData",
197
+ "default": "",
198
+ "description": "The key in `TData` objects that serves as the unique identifier for each row."
199
+ },
200
+ {
201
+ "name": "initialSelectedRowIds",
202
+ "type": "string[]",
203
+ "default": "",
204
+ "description": "Optional array of row IDs that should be initially selected."
205
+ },
206
+ {
207
+ "name": "initialActiveRowId",
208
+ "type": "string",
209
+ "default": "",
210
+ "description": "Optional ID of the row that should be initially marked as active."
211
+ },
212
+ {
213
+ "name": "checkboxQuerySelector",
214
+ "type": "string",
215
+ "default": "'.table-checkbox input[type=\"checkbox\"]'",
216
+ "description": "Optional CSS query selector to find the checkbox input element within each table row."
217
+ },
218
+ {
219
+ "name": "dataAttributeName",
220
+ "type": "string",
221
+ "default": "data-id",
222
+ "description": "Optional name of the HTML data attribute on `<tr>` elements that holds the unique row ID."
223
+ },
224
+ {
225
+ "name": "ref",
226
+ "type": "RefObject<HTMLTableElement>",
227
+ "default": "",
228
+ "description": "Optional external ref for the table element. If not provided, the hook creates its own. Useful if the parent component needs direct access to the table DOM element for other purposes."
229
+ }
230
+ ]
231
+ },
232
+ {
233
+ "heading": "Return value of the `useTableSelection` hook",
234
+ "rows": [
235
+ {
236
+ "name": "tableRef",
237
+ "type": "RefObject<HTMLTableElement>",
238
+ "default": "",
239
+ "description": "React ref attached to the `<table>` HTML element. Ensure this ref is assigned to your table element to enable DOM manipulations."
240
+ },
241
+ {
242
+ "name": "selectedRowIds",
243
+ "type": "string[]",
244
+ "default": "",
245
+ "description": "An array of strings, where each string is the ID of a currently selected row."
246
+ },
247
+ {
248
+ "name": "setSelectedRowIds",
249
+ "type": "(rowIds: string[]) => void",
250
+ "default": "",
251
+ "description": "Setter function to change selected rows from the outside in a controlled manner."
252
+ },
253
+ {
254
+ "name": "activeRowId",
255
+ "type": "string",
256
+ "default": "",
257
+ "description": "The ID of the currently active row. An empty string signifies no row is active."
258
+ },
259
+ {
260
+ "name": "setActiveRowId",
261
+ "type": "(activeRowId: string | undefined) => void",
262
+ "default": "",
263
+ "description": "Setter function to change the active row from the outside in a controlled manner. Use this to deselect an active row."
264
+ },
265
+ {
266
+ "name": "onSelection",
267
+ "type": "(event: React.MouseEvent<HTMLElement>) => void",
268
+ "default": "",
269
+ "description": "Callback handler to be attached to the click/change event of individual row selection UI elements (e.g., checkboxes). It expects the clicked element to be within a `<tr>` that has the specified `dataAttributeName`. Manages the selection state of a single row."
270
+ },
271
+ {
272
+ "name": "onActiveRowChange",
273
+ "type": "(event: React.MouseEvent<HTMLTableRowElement>) => void",
274
+ "default": "",
275
+ "description": "Callback handler to be attached to the click event of table row (`<tr>`) elements.Manages the active row state."
276
+ },
277
+ {
278
+ "name": "onToggleAll",
279
+ "type": "(shouldSelect: boolean) => void",
280
+ "default": "",
281
+ "description": "Callback handler to select or deselect all rows. If \"shouldSelect\" is set to true, all rows in `tableData` will be selected; otherwise, all selections will be cleared."
282
+ },
283
+ {
284
+ "name": "updateRowSelection",
285
+ "type": "() => void",
286
+ "default": "",
287
+ "description": "Function to update row selection and active highlighting. This is useful when the row data changes due to a search value or any other filter."
288
+ },
289
+ {
290
+ "name": "hasSelection",
291
+ "type": "boolean",
292
+ "default": "",
293
+ "description": "A boolean indicating whether at least one row is currently selected."
294
+ },
295
+ {
296
+ "name": "isAllSelected",
297
+ "type": "boolean",
298
+ "default": "",
299
+ "description": "A boolean indicating whether all rows in the current `tableData` are selected."
300
+ }
301
+ ]
302
+ }
303
+ ]
304
+ }
305
+ ]
306
+ }
307
+ ]
308
+ }
309
+ ],
310
+ "see_also": []
311
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:37.487Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useTimeout",
5
+ "category": "Utilities",
6
+ "section": "Lifecycle & execution hooks",
7
+ "slug": "utilities/usetimeout",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "378a234187aa4c26ec75c1127937c1fb6f10d707bdbdc89ecdf2c663580f8607"
11
+ },
12
+ "title": "useTimeout",
13
+ "lead": "The useTimeout hook allows for executing some code after a specified amount of time.",
14
+ "content": [
15
+ {
16
+ "heading": "useTimeout",
17
+ "body": "",
18
+ "examples": [
19
+ {
20
+ "caption": "Example 1",
21
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><div class=\"display-flex flex-column justify-content-center align-items-center height-50\"><label>Message:</label><div>...</div></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import React, { useState } from 'react';\n\nimport useTimeout from '@rio-cloud/rio-uikit/useTimeout';\n\nexport default () => {\n const [message, setMessage] = useState('...');\n\n useTimeout(() => setMessage('Callback invoked'), 2000);\n\n return (\n <div className='display-flex flex-column justify-content-center align-items-center height-50'>\n <label>Message:</label>\n <div>{message}</div>\n </div>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<div class=\"display-flex flex-column justify-content-center align-items-center height-50\">\n <label>Message:</label>\n <div>...</div>\n</div>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": null,
37
+ "props": [
38
+ {
39
+ "heading": null,
40
+ "rows": [
41
+ {
42
+ "name": "callback",
43
+ "type": "Function",
44
+ "default": "",
45
+ "description": "The callback function to be triggered."
46
+ },
47
+ {
48
+ "name": "delay",
49
+ "type": "Number",
50
+ "default": "",
51
+ "description": "The time to wait until the callback function gets invoked."
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "see_also": []
63
+ }
@@ -0,0 +1,75 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:37.469Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useToggle",
5
+ "category": "Utilities",
6
+ "section": "Lifecycle & execution hooks",
7
+ "slug": "utilities/usetoggle",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "b8605fbaf4f8186908f40e1040a8fc15a9874aa3348e2f13e9859c024e62262a"
11
+ },
12
+ "title": "useToggle",
13
+ "lead": "The useToggle hook is a custom React hook for managing a boolean state. It provides an intuitive API to toggle, enable, or disable the value. You can optionally initialize it with a default state. Use it to handle toggle-based logic like switches, modals, or content visibility in your React components.",
14
+ "content": [
15
+ {
16
+ "heading": "useToggle",
17
+ "body": "",
18
+ "examples": [
19
+ {
20
+ "caption": "Example 1",
21
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><div><label>Usage on buttons</label><p>Toggle is OFF</p><div class=\"btn-toolbar\"><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Toggle</button><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Enable</button><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Disable</button></div><hr><label>Usage on a Switch component</label><div class=\"uikit-switch\"><label class=\"switch-label\"><input type=\"checkbox\" class=\"switch-input\" checked=\"\"><div class=\"switch-content\" style=\"color: var(--brand-primary); min-width: 40px;\"><div class=\"switch-handle\"></div></div></label></div><hr><label>Usage for hiding content</label><div><button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Hide content</button><div style=\"opacity: 1; transform: none;\">\nLorem ipsum dolor sit amet, consectetur adipiscing elit. In pharetra dui eget massa efficitur aliquam condimentum in felis. Integer eget metus vel nunc efficitur iaculis. Vivamus elementum ante et est sagittis semper. Ut consectetur enim nec tortor scelerisque tincidunt. Fusce ac ligula bibendum, rutrum libero quis, viverra sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis ut hendrerit massa, in molestie elit. Sed vitae orci ac purus volutpat posuere ac ut neque. Mauris ante orci, semper finibus lorem in, fringilla pretium velit.</div></div></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import Button from '@rio-cloud/rio-uikit/Button';\nimport useToggle from '@rio-cloud/rio-uikit/useToggle';\nimport Switch from '@rio-cloud/rio-uikit/Switch';\nimport Fade from '@rio-cloud/rio-uikit/Fade';\nimport { dummyText } from '../../../utils/data';\n\nexport default () => {\n const { isToggled, toggle, enable, disable } = useToggle();\n\n const { isToggled: isSwitchToggled, toggle: toggleSwitch } = useToggle(true);\n\n const { isToggled: isContentShown, toggle: toggleContent } = useToggle(true);\n\n const handleToggleButton = () => {\n toggle(newValue => {\n console.log(`Toggle changed to: ${newValue}`);\n // Add some tracking here\n });\n };\n\n return (\n <div>\n <label>Usage on buttons</label>\n <p>Toggle is {isToggled ? 'ON' : 'OFF'}</p>\n <div className='btn-toolbar'>\n <Button onClick={handleToggleButton}>Toggle</Button>\n <Button onClick={enable}>Enable</Button>\n <Button onClick={disable}>Disable</Button>\n </div>\n <hr />\n <label>Usage on a Switch component</label>\n <Switch checked={isSwitchToggled} onChange={() => toggleSwitch()} />\n <hr />\n <label>Usage for hiding content</label>\n <div>\n <Button onClick={toggleContent}>{isContentShown ? 'Hide content' : 'Show content'}</Button>\n <Fade show={isContentShown}>{dummyText}</Fade>\n </div>\n </div>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<div>\n <label>Usage on buttons</label>\n <p>Toggle is OFF</p>\n <div class=\"btn-toolbar\">\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Toggle</button>\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Enable</button>\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Disable</button>\n </div>\n <hr>\n <label>Usage on a Switch component</label>\n <div class=\"uikit-switch\">\n <label class=\"switch-label\">\n <input type=\"checkbox\" class=\"switch-input\" checked=\"\">\n <div class=\"switch-content\" style=\"color: var(--brand-primary); min-width: 40px;\">\n <div class=\"switch-handle\">\n </div>\n </div>\n </label>\n </div>\n <hr>\n <label>Usage for hiding content</label>\n <div>\n <button type=\"button\" class=\"btn btn-default btn-component\" tabindex=\"0\">Hide content</button>\n <div style=\"opacity: 1; transform: none;\">\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. In pharetra dui eget massa efficitur aliquam condimentum in felis. Integer eget metus vel nunc efficitur iaculis. Vivamus elementum ante et est sagittis semper. Ut consectetur enim nec tortor scelerisque tincidunt. Fusce ac ligula bibendum, rutrum libero quis, viverra sem. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis ut hendrerit massa, in molestie elit. Sed vitae orci ac purus volutpat posuere ac ut neque. Mauris ante orci, semper finibus lorem in, fringilla pretium velit.</div>\n </div>\n</div>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": null,
37
+ "props": [
38
+ {
39
+ "heading": null,
40
+ "rows": [
41
+ {
42
+ "name": "initialValue",
43
+ "type": "Boolean",
44
+ "default": "",
45
+ "description": "The initial state of the toggle. Defaults to false."
46
+ },
47
+ {
48
+ "name": "toggle",
49
+ "type": "Function",
50
+ "default": "",
51
+ "description": "Toggles the current state between true and false. Accepts an optional callback function that executes after the state changes, receiving the new state as an argument."
52
+ },
53
+ {
54
+ "name": "enable",
55
+ "type": "Function",
56
+ "default": "",
57
+ "description": "Sets the toggle state to true."
58
+ },
59
+ {
60
+ "name": "disable",
61
+ "type": "Function",
62
+ "default": "",
63
+ "description": "Sets the toggle state to false."
64
+ }
65
+ ]
66
+ }
67
+ ]
68
+ }
69
+ ]
70
+ }
71
+ ]
72
+ }
73
+ ],
74
+ "see_also": []
75
+ }