@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,63 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:37.320Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/usePrevious",
5
+ "category": "Utilities",
6
+ "section": "Lifecycle & execution hooks",
7
+ "slug": "utilities/useprevious",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "06956f6b5c43a6d251786610518a02caa155319d9d4a9d217ac7fe55195919ef"
11
+ },
12
+ "title": "usePrevious",
13
+ "lead": "The usePrevious hook allows to easily access state from previous component render. Instead of using a React.ref and a useEffect, this hook uses a useState internally to keep track of the previous state value.",
14
+ "content": [
15
+ {
16
+ "heading": "usePrevious",
17
+ "body": "- If the value you need can be computed entirely from the current props or other state, remove that redundant state altogether. If you’re worried about recomputing too often, the useMemo Hook can help.\n- If you want to reset the entire component tree’s state, pass a different key to your component.\n- If you can, update all the relevant state in the event handlers.\n\n```jsx\nfunction List({ items }) {\n const [isReverse, setIsReverse] = useState(false);\n const [selection, setSelection] = useState(null);\n\n // Better: Adjust the state while rendering\n const [prevItems, setPrevItems] = useState(items);\n if (items !== prevItems) {\n setPrevItems(items);\n setSelection(null);\n }\n // ...\n}\n```\n\n> Note: If you want to use this to update the internal state due to a prop change, you might run into a loop. Therefore, use the following snippet suggested by the React team here: https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes",
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-wrap gap-20 align-items-center\"><div class=\"NumberControl margin-0 width-100\"><div class=\"input-group\"><div class=\"form-control-feedback-wrapper\"><input type=\"number\" step=\"1\" min=\"0\" max=\"1.7976931348623157e+308\" class=\"form-control no-controls\" aria-label=\"number-input\" value=\"1\"></div><div class=\"input-group-addon \"><div class=\"display-flex padding-left-10\"><div role=\"button\" aria-label=\"decrement-button\" class=\"decrementButton display-flex align-items-center text-color-gray hover-text-color-dark cursor-pointer\"><div class=\"rioglyph rioglyph-minus scale-90\"></div></div><div role=\"button\" aria-label=\"increment-button\" class=\"incrementButton display-flex align-items-center text-color-gray hover-text-color-dark cursor-pointer margin-left-5\"><div class=\"rioglyph rioglyph-plus scale-90\"></div></div></div></div></div></div><div class=\"text-italic text-color-darker\">{ count: 1, previousCount: 1 }</div></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import { useState } from 'react';\n\nimport usePrevious from '@rio-cloud/rio-uikit/usePrevious';\nimport NumberControl from '@rio-cloud/rio-uikit/NumberControl';\n\nexport default () => {\n const [count, setCount] = useState<number | undefined>(1);\n\n const previousCount = usePrevious(count);\n\n return (\n <div className='display-flex flex-wrap gap-20 align-items-center'>\n <NumberControl\n value={count}\n onChange={(value?: number) => setCount(value)}\n className='margin-0 width-100'\n />\n <div className='text-italic text-color-darker'>\n {`{ count: ${count}, previousCount: ${previousCount} }`}\n </div>\n </div>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<div class=\"display-flex flex-wrap gap-20 align-items-center\">\n <div class=\"NumberControl margin-0 width-100\">\n <div class=\"input-group\">\n <div class=\"form-control-feedback-wrapper\">\n <input type=\"number\" step=\"1\" min=\"0\" max=\"1.7976931348623157e+308\" class=\"form-control no-controls\" aria-label=\"number-input\" value=\"1\">\n </div>\n <div class=\"input-group-addon \">\n <div class=\"display-flex padding-left-10\">\n <div role=\"button\" aria-label=\"decrement-button\" class=\"decrementButton display-flex align-items-center text-color-gray hover-text-color-dark cursor-pointer\">\n <div class=\"rioglyph rioglyph-minus scale-90\">\n </div>\n </div>\n <div role=\"button\" aria-label=\"increment-button\" class=\"incrementButton display-flex align-items-center text-color-gray hover-text-color-dark cursor-pointer margin-left-5\">\n <div class=\"rioglyph rioglyph-plus scale-90\">\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-italic text-color-darker\">{ count: 1, previousCount: 1 }</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": "state",
43
+ "type": "any",
44
+ "default": "",
45
+ "description": "The value of the current state to keep track of."
46
+ },
47
+ {
48
+ "name": "",
49
+ "type": "any",
50
+ "default": "",
51
+ "description": "Returns the previous value of the state to keep track of."
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "see_also": []
63
+ }
@@ -0,0 +1,65 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:42.668Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useResizeObserver",
5
+ "category": "Utilities",
6
+ "section": "DOM behavior hooks",
7
+ "slug": "utilities/useresizeobserver",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "42e366f22c330b8b47ba5048ecca931604b8c8864bedbd21d38aad32f081aba7"
11
+ },
12
+ "title": "useResizeObserver",
13
+ "lead": "The useResizeObserver hook allows to react on resize changes of a given element.",
14
+ "content": [
15
+ {
16
+ "heading": "useResizeObserver",
17
+ "body": "Note that is important to consider the padding of the element to observe and to take it into consideration when working with its width and height. When using the contentRect from the observerEntry, keep in mind that this will not include the paddings.\n\nTo include the target elements padding, please use the borderBoxSize instead.",
18
+ "examples": [
19
+ {
20
+ "caption": "Example 1",
21
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><label>Box with padding</label><div class=\"height-50 bg-info position-relative display-flex align-items-center justify-content-center padding-5\" style=\"width: 200px;\"><div class=\"text-color-white text-medium\">200x50</div><div class=\"Resizer resize-horizontal resize-right\"><div class=\"width-5 height-100pct bg-light\"></div></div></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import { useState } from 'react';\n\nimport Resizer from '@rio-cloud/rio-uikit/Resizer';\nimport useResizeObserver from '@rio-cloud/rio-uikit/useResizeObserver';\n\nexport default () => {\n const [boxWidth, setBoxWidth] = useState(200);\n\n // To include target elements padding, use \"borderBoxSize\" or for convenience\n // purpose, use the dedicated return object already containing \"inlineSize\" and \"blockSize\".\n // const [ref, { borderBox }] = useResizeObserver();\n const [ref, _, { inlineSize, blockSize }] = useResizeObserver();\n\n const handleResizeHorizontal = (diff: number) => setBoxWidth(previousValue => previousValue - diff);\n\n return (\n <>\n <label>Box with padding</label>\n <div\n className={\n 'height-50 bg-info position-relative display-flex align-items-center ' +\n 'justify-content-center padding-5'\n }\n style={{ width: boxWidth }}\n ref={ref}\n >\n <div className='text-color-white text-medium'>\n {inlineSize}x{blockSize}\n </div>\n <Resizer onResize={handleResizeHorizontal}>\n <div className='width-5 height-100pct bg-light' />\n </Resizer>\n </div>\n </>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<label>Box with padding</label>\n<div class=\"height-50 bg-info position-relative display-flex align-items-center justify-content-center padding-5\" style=\"width: 200px;\">\n <div class=\"text-color-white text-medium\">200x50</div>\n <div class=\"Resizer resize-horizontal resize-right\">\n <div class=\"width-5 height-100pct bg-light\">\n </div>\n </div>\n</div>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": "ref"
37
+ }
38
+ ]
39
+ },
40
+ {
41
+ "caption": "Example 2",
42
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><label>Box without padding</label><div class=\"height-50 bg-info position-relative display-flex align-items-center justify-content-center\" style=\"width: 200px;\"><div class=\"text-color-white text-medium\">200x50</div><div class=\"Resizer resize-horizontal resize-right\"><div class=\"width-5 height-100pct bg-light\"></div></div></div></div>",
43
+ "tabs": [
44
+ {
45
+ "label": "React",
46
+ "language": "tsx",
47
+ "code": "import { useState, useCallback } from 'react';\n\nimport Resizer from '@rio-cloud/rio-uikit/Resizer';\nimport useResizeObserver from '@rio-cloud/rio-uikit/useResizeObserver';\n\nexport default () => {\n const [boxWidth, setBoxWidth] = useState(200);\n\n const [ref, observerEntry] = useResizeObserver();\n\n const contentRect = observerEntry?.contentRect;\n\n const getContentRect = useCallback(\n (key: keyof DOMRectReadOnly) => Math.round(contentRect?.[key] as number),\n [contentRect]\n );\n\n const handleResizeHorizontal = (diff: number) => setBoxWidth(previousValue => previousValue - diff);\n\n return (\n <>\n <label>Box without padding</label>\n <div\n className='height-50 bg-info position-relative display-flex align-items-center justify-content-center'\n style={{ width: boxWidth }}\n ref={ref}\n >\n <div className='text-color-white text-medium'>\n {getContentRect('width')}x{getContentRect('height')}\n </div>\n <Resizer onResize={handleResizeHorizontal}>\n <div className='width-5 height-100pct bg-light' />\n </Resizer>\n </div>\n </>\n );\n};"
48
+ },
49
+ {
50
+ "label": "HTML",
51
+ "language": "html",
52
+ "code": "<label>Box without padding</label>\n<div class=\"height-50 bg-info position-relative display-flex align-items-center justify-content-center\" style=\"width: 200px;\">\n <div class=\"text-color-white text-medium\">200x50</div>\n <div class=\"Resizer resize-horizontal resize-right\">\n <div class=\"width-5 height-100pct bg-light\">\n </div>\n </div>\n</div>"
53
+ },
54
+ {
55
+ "label": "Props",
56
+ "language": "json",
57
+ "code": "ref"
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ }
63
+ ],
64
+ "see_also": []
65
+ }
@@ -0,0 +1,103 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:42.551Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useScrollPosition",
5
+ "category": "Utilities",
6
+ "section": "DOM behavior hooks",
7
+ "slug": "utilities/usescrollposition",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "bbeff86c4843e890ab49b99caca4cbe929d61d4debd23cdede5c8a14b1a8c591"
11
+ },
12
+ "title": "useScrollPosition",
13
+ "lead": "The useScrollPosition hook allows to react on a desired scroll position of a given target. Use it when showing or hiding content based on the scroll position.",
14
+ "content": [
15
+ {
16
+ "heading": "useScrollPosition",
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%;\"><label>Default example for scroll position of the ApplicationBody module-content</label><div class=\"position-relative\"><div class=\"position-sticky top-0 well well-sm border shadow-default\">0 px</div><div class=\"display-flex flex-column align-items-center text-size-14\">\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.\n\nIn mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\nPraesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\nMauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\nNam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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.\n\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.\n\nIn mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\nPraesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\nMauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\nNam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import useScrollPosition from '@rio-cloud/rio-uikit/useScrollPosition';\n\nimport { dummyTextExtraLong } from '../../../utils/data';\n\nexport default () => {\n const scrollPosition = useScrollPosition();\n\n return (\n <>\n <label>Default example for scroll position of the ApplicationBody module-content</label>\n <div className='position-relative'>\n <div className='position-sticky top-0 well well-sm border shadow-default'>{`${scrollPosition} px`}</div>\n <div className='display-flex flex-column align-items-center text-size-14'>{dummyTextExtraLong}</div>\n </div>\n </>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<label>Default example for scroll position of the ApplicationBody module-content</label>\n<div class=\"position-relative\">\n <div class=\"position-sticky top-0 well well-sm border shadow-default\">0 px</div>\n <div class=\"display-flex flex-column align-items-center text-size-14\">\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.\n\n In mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\n Praesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\n Mauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\n Nam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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.\n\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.\n\n In mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\n Praesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\n Mauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\n Nam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": null,
37
+ "props": [
38
+ {
39
+ "heading": null,
40
+ "rows": [
41
+ {
42
+ "name": "target",
43
+ "type": "Window | HTMLBodyElement | React.ReactElement | React.MutableRefObject<object> | undefined",
44
+ "default": "",
45
+ "description": "The target element to get the scroll position for."
46
+ },
47
+ {
48
+ "name": "return",
49
+ "type": "Number",
50
+ "default": "",
51
+ "description": "The hook returns the scroll position as a number"
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ },
59
+ {
60
+ "caption": "Example 2",
61
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><label>Example for scroll position of a certain element</label><div class=\"height-200 position-relative overflow-auto height-200 position-relative overflow-auto\"><div class=\"position-sticky top-0 well well-sm border shadow-default\">0 px</div><div class=\"text-size-14\">\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.\n\nIn mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\nPraesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\nMauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\nNam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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.\n\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.\n\nIn mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\nPraesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\nMauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\nNam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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>",
62
+ "tabs": [
63
+ {
64
+ "label": "React",
65
+ "language": "tsx",
66
+ "code": "import { useRef } from 'react';\n\nimport useScrollPosition from '@rio-cloud/rio-uikit/useScrollPosition';\n\nimport { dummyTextExtraLong } from '../../../utils/data';\n\nexport default () => {\n const contentRef = useRef<HTMLDivElement>(null);\n const scrollPosition = useScrollPosition(contentRef);\n\n return (\n <>\n <label>Example for scroll position of a certain element</label>\n <div\n ref={contentRef}\n className='height-200 position-relative overflow-auto height-200 position-relative overflow-auto'\n >\n <div className='position-sticky top-0 well well-sm border shadow-default'>{`${scrollPosition} px`}</div>\n <div className='text-size-14'>{dummyTextExtraLong}</div>\n </div>\n </>\n );\n};"
67
+ },
68
+ {
69
+ "label": "HTML",
70
+ "language": "html",
71
+ "code": "<label>Example for scroll position of a certain element</label>\n<div class=\"height-200 position-relative overflow-auto height-200 position-relative overflow-auto\">\n <div class=\"position-sticky top-0 well well-sm border shadow-default\">0 px</div>\n <div class=\"text-size-14\">\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.\n\n In mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\n Praesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\n Mauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\n Nam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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.\n\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.\n\n In mattis massa a tellus laoreet volutpat. Integer placerat convallis tempor. Quisque id diam nec ex iaculis pulvinar. Nunc urna dui, varius at tempus sit amet, euismod id risus. Cras placerat imperdiet mattis. Etiam vehicula finibus magna. Nullam ornare diam at molestie faucibus. Aenean dictum magna a ipsum scelerisque, a vehicula massa vehicula. Suspendisse blandit tellus vulputate enim ullamcorper tincidunt. Vivamus enim justo, sollicitudin sit amet pulvinar vitae, vehicula sed leo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\n\n Praesent mattis purus et velit maximus hendrerit. Aenean vehicula tempus dapibus. Mauris convallis pharetra purus, non vulputate erat rutrum quis. Sed in tincidunt justo. Ut eu venenatis augue. Aliquam ullamcorper vitae tellus et egestas. Integer eget metus quis odio elementum auctor quis et ipsum. Duis lobortis eros lacinia sapien rutrum egestas. Phasellus ornare, elit non efficitur fringilla, arcu risus molestie enim, sit amet blandit lorem ex in lectus. Vestibulum quis tempor nisi, at pretium erat.\n\n Mauris sed blandit nisi. In tellus sem, auctor ut porttitor eget, dictum et eros. Integer in sem nec lacus hendrerit cursus. Nulla mattis nisi et tincidunt tincidunt. Fusce ullamcorper nunc in quam euismod mattis et dignissim nulla. Ut tincidunt sodales felis, id feugiat ligula suscipit vel. Suspendisse ullamcorper commodo maximus.\n\n Nam in dapibus eros, eget tristique enim. Vivamus non neque at elit cursus tempus vel vitae neque. Aenean pellentesque aliquet lorem, commodo ornare dolor tempus id. Curabitur efficitur nulla eu libero consectetur, at ultricies nisi condimentum. Nam imperdiet ac magna ut congue. Vivamus id aliquet turpis, quis suscipit nulla. Nunc placerat pulvinar neque. Donec ullamcorper vel ante ac iaculis. Phasellus eget dapibus turpis. Nam interdum enim at bibendum faucibus. Nunc ipsum urna, finibus ut hendrerit at, laoreet sit amet eros. Morbi ligula arcu, eleifend et dictum egestas, consequat vitae nunc.\n\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>"
72
+ },
73
+ {
74
+ "label": "Props",
75
+ "language": "json",
76
+ "code": null,
77
+ "props": [
78
+ {
79
+ "heading": null,
80
+ "rows": [
81
+ {
82
+ "name": "target",
83
+ "type": "Window | HTMLBodyElement | React.ReactElement | React.MutableRefObject<object> | undefined",
84
+ "default": "",
85
+ "description": "The target element to get the scroll position for."
86
+ },
87
+ {
88
+ "name": "return",
89
+ "type": "Number",
90
+ "default": "",
91
+ "description": "The hook returns the scroll position as a number"
92
+ }
93
+ ]
94
+ }
95
+ ]
96
+ }
97
+ ]
98
+ }
99
+ ]
100
+ }
101
+ ],
102
+ "see_also": []
103
+ }
@@ -0,0 +1,197 @@
1
+ {
2
+ "metadata": {
3
+ "captured_at": "2025-11-21T12:08:46.471Z",
4
+ "source": "https://uikit.developers.rio.cloud/#utilities/useSearch",
5
+ "category": "Utilities",
6
+ "section": "UI state & input hooks",
7
+ "slug": "utilities/usesearch",
8
+ "version": "v1.13.2",
9
+ "hash_algorithm": "sha256",
10
+ "hash": "c5a57996b1201d36c4bfff74b7df04bb43a48395f2938f93ee349d7e9986a3a9"
11
+ },
12
+ "title": "useSearch",
13
+ "lead": "The useSearch hook is a custom hook to filter a list of objects by a search value. Supports field-based filtering, custom filtering logic, debounce, and case sensitivity.",
14
+ "content": [
15
+ {
16
+ "heading": "useSearch",
17
+ "body": "",
18
+ "examples": [
19
+ {
20
+ "caption": "Search a list of objects",
21
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><div class=\"form-group max-width-300\"><div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Search a list of objects</div><div class=\"input-group\"><span class=\"input-group-addon\"><span class=\"rioglyph rioglyph-search\" aria-hidden=\"true\"></span></span><div class=\"ClearableInput input-group\"><input placeholder=\"Search for fruits\" class=\"form-control\" type=\"text\" tabindex=\"0\" value=\"\"><span class=\"clearButton hide\"><span class=\"clearButtonIcon rioglyph rioglyph-remove-sign\"></span></span></div></div></div><div class=\"display-flex gap-10\"><span>Apple</span><span>Banana</span><span>Fig</span><span>Pear</span><span>Mango</span></div></div>",
22
+ "tabs": [
23
+ {
24
+ "label": "React",
25
+ "language": "tsx",
26
+ "code": "import isEmpty from 'lodash/fp/isEmpty';\nimport useSearch from '@rio-cloud/rio-uikit/useSearch';\nimport ClearableInput from '@rio-cloud/rio-uikit/ClearableInput';\nimport FormLabel from '@rio-cloud/rio-uikit/FormLabel';\n\ntype ListType = { name: string };\n\nexport default () => {\n const items = [{ name: 'Apple' }, { name: 'Banana' }, { name: 'Fig' }, { name: 'Pear' }, { name: 'Mango' }];\n\n const { searchValue, setSearchValue, filteredList } = useSearch(items);\n\n return (\n <>\n <div className='form-group max-width-300'>\n <FormLabel>Search a list of objects</FormLabel>\n <div className='input-group'>\n <span className='input-group-addon'>\n <span className='rioglyph rioglyph-search' aria-hidden='true' />\n </span>\n <ClearableInput\n value={searchValue}\n onChange={(newValue: string) => setSearchValue(newValue)}\n onClear={() => setSearchValue('')}\n placeholder='Search for fruits'\n />\n </div>\n </div>\n <div className='display-flex gap-10'>\n {isEmpty(filteredList)\n ? 'Nothing found'\n : filteredList.map(listItem => <span key={listItem.name}>{listItem.name}</span>)}\n </div>\n </>\n );\n};"
27
+ },
28
+ {
29
+ "label": "HTML",
30
+ "language": "html",
31
+ "code": "<div class=\"form-group max-width-300\">\n <div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Search a list of objects</div>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <span class=\"rioglyph rioglyph-search\" aria-hidden=\"true\">\n </span>\n </span>\n <div class=\"ClearableInput input-group\">\n <input placeholder=\"Search for fruits\" class=\"form-control\" type=\"text\" tabindex=\"0\" value=\"\">\n <span class=\"clearButton hide\">\n <span class=\"clearButtonIcon rioglyph rioglyph-remove-sign\">\n </span>\n </span>\n </div>\n </div>\n</div>\n<div class=\"display-flex gap-10\">\n <span>Apple</span>\n <span>Banana</span>\n <span>Fig</span>\n <span>Pear</span>\n <span>Mango</span>\n</div>"
32
+ },
33
+ {
34
+ "label": "Props",
35
+ "language": "json",
36
+ "code": null,
37
+ "props": [
38
+ {
39
+ "heading": "Options for the `useSearch` hook",
40
+ "rows": [
41
+ {
42
+ "name": "list",
43
+ "type": "T[]",
44
+ "default": "",
45
+ "description": "The array of objects to search through."
46
+ },
47
+ {
48
+ "name": "options",
49
+ "type": "object",
50
+ "default": "",
51
+ "description": "Configuration options for the search behavior."
52
+ },
53
+ {
54
+ "name": "└fields",
55
+ "type": "(keyof T | string)[]",
56
+ "default": "",
57
+ "description": "Fields to search through. If omitted, all top-level string/number fields are used."
58
+ },
59
+ {
60
+ "name": "└customFilter",
61
+ "type": "(item: T, query: string) => boolean",
62
+ "default": "",
63
+ "description": "Optional custom filter function overriding field-based filtering."
64
+ },
65
+ {
66
+ "name": "└debounceMs",
67
+ "type": "number",
68
+ "default": "",
69
+ "description": "Debounce time in milliseconds. If omitted, debounce is disabled."
70
+ },
71
+ {
72
+ "name": "└caseSensitive",
73
+ "type": "boolean",
74
+ "default": "false",
75
+ "description": "Whether the search should be case-sensitive."
76
+ }
77
+ ]
78
+ },
79
+ {
80
+ "heading": "Return value of the `useSearch` hook",
81
+ "rows": [
82
+ {
83
+ "name": "searchValue",
84
+ "type": "string",
85
+ "default": "",
86
+ "description": "The current search input string."
87
+ },
88
+ {
89
+ "name": "setSearchValue",
90
+ "type": "Function",
91
+ "default": "",
92
+ "description": "A setter function to update the search query."
93
+ },
94
+ {
95
+ "name": "filteredList",
96
+ "type": "T[]",
97
+ "default": "",
98
+ "description": "The list of items matching the current search query."
99
+ }
100
+ ]
101
+ }
102
+ ]
103
+ }
104
+ ]
105
+ },
106
+ {
107
+ "caption": "Search a list of objects for multiple fields",
108
+ "rendered_html": "<div class=\"playground-content bg-white padding-20 padding-bottom-25\" style=\"width: 100%;\"><div class=\"form-group max-width-300\"><div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Search a list of objects for multiple fields</div><div class=\"input-group\"><span class=\"input-group-addon\"><span class=\"rioglyph rioglyph-search\" aria-hidden=\"true\"></span></span><div class=\"ClearableInput input-group\"><input placeholder=\"Search for users\" class=\"form-control\" type=\"text\" tabindex=\"0\" value=\"\"><span class=\"clearButton hide\"><span class=\"clearButtonIcon rioglyph rioglyph-remove-sign\"></span></span></div></div></div><div><div>Alice - 30 | Berlin</div><div>Bob - 25 | Munich</div><div>Charlie - 35 | </div></div></div>",
109
+ "tabs": [
110
+ {
111
+ "label": "React",
112
+ "language": "tsx",
113
+ "code": "import isEmpty from 'lodash/fp/isEmpty';\nimport useSearch from '@rio-cloud/rio-uikit/useSearch';\nimport ClearableInput from '@rio-cloud/rio-uikit/ClearableInput';\nimport FormLabel from '@rio-cloud/rio-uikit/FormLabel';\n\ntype ListType = { name: string; age: number; address?: { city: string } };\n\nexport default () => {\n const users = [\n { name: 'Alice', age: 30, address: { city: 'Berlin' } },\n { name: 'Bob', age: 25, address: { city: 'Munich' } },\n { name: 'Charlie', age: 35 },\n ];\n\n const { searchValue, setSearchValue, filteredList } = useSearch(users, { fields: ['name', 'age', 'address.city'] });\n\n return (\n <>\n <div className='form-group max-width-300'>\n <FormLabel>Search a list of objects for multiple fields</FormLabel>\n <div className='input-group'>\n <span className='input-group-addon'>\n <span className='rioglyph rioglyph-search' aria-hidden='true' />\n </span>\n <ClearableInput\n value={searchValue}\n onChange={(newValue: string) => setSearchValue(newValue)}\n onClear={() => setSearchValue('')}\n placeholder='Search for users'\n />\n </div>\n </div>\n <div>\n {isEmpty(filteredList)\n ? 'Nothing found'\n : filteredList.map(listItem => (\n <div key={listItem.name}>\n {listItem.name} - {listItem.age} | {listItem.address?.city}\n </div>\n ))}\n </div>\n </>\n );\n};"
114
+ },
115
+ {
116
+ "label": "HTML",
117
+ "language": "html",
118
+ "code": "<div class=\"form-group max-width-300\">\n <div class=\"text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5\">Search a list of objects for multiple fields</div>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">\n <span class=\"rioglyph rioglyph-search\" aria-hidden=\"true\">\n </span>\n </span>\n <div class=\"ClearableInput input-group\">\n <input placeholder=\"Search for users\" class=\"form-control\" type=\"text\" tabindex=\"0\" value=\"\">\n <span class=\"clearButton hide\">\n <span class=\"clearButtonIcon rioglyph rioglyph-remove-sign\">\n </span>\n </span>\n </div>\n </div>\n</div>\n<div>\n <div>Alice - 30 | Berlin</div>\n <div>Bob - 25 | Munich</div>\n <div>Charlie - 35 | </div>\n</div>"
119
+ },
120
+ {
121
+ "label": "Props",
122
+ "language": "json",
123
+ "code": null,
124
+ "props": [
125
+ {
126
+ "heading": "Options for the `useSearch` hook",
127
+ "rows": [
128
+ {
129
+ "name": "list",
130
+ "type": "T[]",
131
+ "default": "",
132
+ "description": "The array of objects to search through."
133
+ },
134
+ {
135
+ "name": "options",
136
+ "type": "object",
137
+ "default": "",
138
+ "description": "Configuration options for the search behavior."
139
+ },
140
+ {
141
+ "name": "└fields",
142
+ "type": "(keyof T | string)[]",
143
+ "default": "",
144
+ "description": "Fields to search through. If omitted, all top-level string/number fields are used."
145
+ },
146
+ {
147
+ "name": "└customFilter",
148
+ "type": "(item: T, query: string) => boolean",
149
+ "default": "",
150
+ "description": "Optional custom filter function overriding field-based filtering."
151
+ },
152
+ {
153
+ "name": "└debounceMs",
154
+ "type": "number",
155
+ "default": "",
156
+ "description": "Debounce time in milliseconds. If omitted, debounce is disabled."
157
+ },
158
+ {
159
+ "name": "└caseSensitive",
160
+ "type": "boolean",
161
+ "default": "false",
162
+ "description": "Whether the search should be case-sensitive."
163
+ }
164
+ ]
165
+ },
166
+ {
167
+ "heading": "Return value of the `useSearch` hook",
168
+ "rows": [
169
+ {
170
+ "name": "searchValue",
171
+ "type": "string",
172
+ "default": "",
173
+ "description": "The current search input string."
174
+ },
175
+ {
176
+ "name": "setSearchValue",
177
+ "type": "Function",
178
+ "default": "",
179
+ "description": "A setter function to update the search query."
180
+ },
181
+ {
182
+ "name": "filteredList",
183
+ "type": "T[]",
184
+ "default": "",
185
+ "description": "The list of items matching the current search query."
186
+ }
187
+ ]
188
+ }
189
+ ]
190
+ }
191
+ ]
192
+ }
193
+ ]
194
+ }
195
+ ],
196
+ "see_also": []
197
+ }