@rio-cloud/uikit-mcp 1.0.1 → 1.1.1
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.
- package/README.md +75 -39
- package/dist/doc-metadata.json +1872 -0
- package/dist/docs/components/accentBar.md +582 -0
- package/dist/docs/components/activity.md +330 -0
- package/dist/docs/components/animatedNumber.md +88 -0
- package/dist/docs/components/animatedTextReveal.md +381 -0
- package/dist/docs/components/animations.md +459 -0
- package/dist/docs/components/appHeader.md +737 -0
- package/dist/docs/components/appLayout.md +2033 -0
- package/dist/docs/components/appNavigationBar.md +274 -0
- package/dist/docs/components/areaCharts.md +828 -0
- package/dist/docs/components/aspectRatioPlaceholder.md +106 -0
- package/dist/docs/components/assetTree.md +3132 -0
- package/dist/docs/components/autosuggests.md +1177 -0
- package/dist/docs/components/avatar.md +206 -0
- package/dist/docs/components/banner.md +668 -0
- package/dist/docs/components/barCharts.md +2765 -0
- package/dist/docs/components/barList.md +517 -0
- package/dist/docs/components/basicMap.md +167 -0
- package/dist/docs/components/bottomSheet.md +721 -0
- package/dist/docs/components/button.md +775 -0
- package/dist/docs/components/buttonToolbar.md +134 -0
- package/dist/docs/components/calendarStripe.md +533 -0
- package/dist/docs/components/card.md +86 -0
- package/dist/docs/components/carousel.md +128 -0
- package/dist/docs/components/chartColors.md +716 -0
- package/dist/docs/components/chartsGettingStarted.md +28 -0
- package/dist/docs/components/chat.md +935 -0
- package/dist/docs/components/checkbox.md +996 -0
- package/dist/docs/components/clearableInput.md +806 -0
- package/dist/docs/components/collapse.md +189 -0
- package/dist/docs/components/composedCharts.md +424 -0
- package/dist/docs/components/contentLoader.md +674 -0
- package/dist/docs/components/dataTabs.md +1251 -0
- package/dist/docs/components/datepickers.md +2543 -0
- package/dist/docs/components/dialogs.md +2244 -0
- package/dist/docs/components/divider.md +219 -0
- package/dist/docs/components/dropdowns.md +17538 -0
- package/dist/docs/components/editableContent.md +1127 -0
- package/dist/docs/components/expander.md +970 -0
- package/dist/docs/components/fade.md +836 -0
- package/dist/docs/components/fadeExpander.md +180 -0
- package/dist/docs/components/fadeUp.md +396 -0
- package/dist/docs/components/feedback.md +758 -0
- package/dist/docs/components/filePickers.md +370 -0
- package/dist/docs/components/formLabel.md +251 -0
- package/dist/docs/components/fullscreenMap.md +10 -0
- package/dist/docs/components/groupedItemList.md +1001 -0
- package/dist/docs/components/iconList.md +306 -0
- package/dist/docs/components/imagePreloader.md +167 -0
- package/dist/docs/components/labeledElement.md +115 -0
- package/dist/docs/components/licensePlate.md +412 -0
- package/dist/docs/components/lineCharts.md +2014 -0
- package/dist/docs/components/listMenu.md +392 -0
- package/dist/docs/components/loadMore.md +219 -0
- package/dist/docs/components/mainNavigation.md +129 -0
- package/dist/docs/components/mapCircle.md +93 -0
- package/dist/docs/components/mapCluster.md +337 -0
- package/dist/docs/components/mapContext.md +284 -0
- package/dist/docs/components/mapDraggableMarker.md +150 -0
- package/dist/docs/components/mapGettingStarted.md +39 -0
- package/dist/docs/components/mapInfoBubble.md +135 -0
- package/dist/docs/components/mapLayerGroup.md +94 -0
- package/dist/docs/components/mapMarker.md +1814 -0
- package/dist/docs/components/mapPolygon.md +959 -0
- package/dist/docs/components/mapRoute.md +3816 -0
- package/dist/docs/components/mapRouteGenerator.md +6 -0
- package/dist/docs/components/mapSettings.md +1040 -0
- package/dist/docs/components/mapUtils.md +132 -0
- package/dist/docs/components/multiselects.md +1921 -0
- package/dist/docs/components/noData.md +210 -0
- package/dist/docs/components/notifications.md +314 -0
- package/dist/docs/components/numbercontrol.md +706 -0
- package/dist/docs/components/onboarding.md +297 -0
- package/dist/docs/components/page.md +241 -0
- package/dist/docs/components/pager.md +133 -0
- package/dist/docs/components/pieCharts.md +1284 -0
- package/dist/docs/components/popover.md +222 -0
- package/dist/docs/components/position.md +50 -0
- package/dist/docs/components/radialBarCharts.md +3663 -0
- package/dist/docs/components/radiobutton.md +1271 -0
- package/dist/docs/components/releaseNotes.md +135 -0
- package/dist/docs/components/resizer.md +162 -0
- package/dist/docs/components/responsiveColumnStripe.md +435 -0
- package/dist/docs/components/responsiveVideo.md +71 -0
- package/dist/docs/components/rioglyph.md +331 -0
- package/dist/docs/components/rules.md +965 -0
- package/dist/docs/components/saveableInput.md +1721 -0
- package/dist/docs/components/selects.md +1993 -0
- package/dist/docs/components/sidebar.md +332 -0
- package/dist/docs/components/sliders.md +376 -0
- package/dist/docs/components/smoothScrollbars.md +1180 -0
- package/dist/docs/components/spinners.md +506 -0
- package/dist/docs/components/states.md +1176 -0
- package/dist/docs/components/statsWidgets.md +636 -0
- package/dist/docs/components/statusBar.md +644 -0
- package/dist/docs/components/stepButton.md +61 -0
- package/dist/docs/components/steppedProgressBars.md +1064 -0
- package/dist/docs/components/subNavigation.md +470 -0
- package/dist/docs/components/supportMarker.md +115 -0
- package/dist/docs/components/svgImage.md +248 -0
- package/dist/docs/components/switch.md +554 -0
- package/dist/docs/components/tables.md +8 -0
- package/dist/docs/components/tagManager.md +476 -0
- package/dist/docs/components/tags.md +785 -0
- package/dist/docs/components/teaser.md +925 -0
- package/dist/docs/components/timeline.md +514 -0
- package/dist/docs/components/timepicker.md +262 -0
- package/dist/docs/components/toggleButton.md +178 -0
- package/dist/docs/components/tooltip.md +454 -0
- package/dist/docs/components/virtualList.md +486 -0
- package/dist/docs/foundations.md +20901 -0
- package/dist/docs/start/changelog.md +714 -0
- package/dist/docs/start/goodtoknow.md +14 -0
- package/dist/docs/start/guidelines/color-combinations.md +678 -0
- package/dist/docs/start/guidelines/custom-css.md +42 -0
- package/dist/docs/start/guidelines/custom-rioglyph.md +35 -0
- package/dist/docs/start/guidelines/formatting.md +587 -0
- package/dist/docs/start/guidelines/iframe.md +323 -0
- package/dist/docs/start/guidelines/obfuscate-data.md +30 -0
- package/dist/docs/start/guidelines/print-css.md +36 -0
- package/dist/docs/start/guidelines/spinner.md +710 -0
- package/dist/docs/start/guidelines/supported-browsers.md +10 -0
- package/dist/docs/start/guidelines/writing.md +635 -0
- package/dist/docs/start/howto.md +187 -0
- package/dist/docs/start/intro.md +43 -0
- package/dist/docs/start/responsiveness.md +98 -0
- package/dist/docs/templates/common-table.md +1111 -0
- package/dist/docs/templates/detail-views.md +942 -0
- package/dist/docs/templates/expandable-details.md +228 -0
- package/dist/docs/templates/feature-cards.md +549 -0
- package/dist/docs/templates/form-summary.md +199 -0
- package/dist/docs/templates/form-toggle.md +367 -0
- package/dist/docs/templates/list-blocks.md +1021 -0
- package/dist/docs/templates/loading-progress.md +109 -0
- package/dist/docs/templates/options-panel.md +152 -0
- package/dist/docs/templates/panel-variants.md +164 -0
- package/dist/docs/templates/progress-cards.md +607 -0
- package/dist/docs/templates/progress-success.md +142 -0
- package/dist/docs/templates/settings-form.md +434 -0
- package/dist/docs/templates/stats-blocks.md +1381 -0
- package/dist/docs/templates/table-panel.md +184 -0
- package/dist/docs/templates/table-row-animation.md +317 -0
- package/dist/docs/templates/usage-cards.md +227 -0
- package/dist/docs/utilities/deviceUtils.md +123 -0
- package/dist/docs/utilities/featureToggles.md +90 -0
- package/dist/docs/utilities/fuelTypeUtils.md +186 -0
- package/dist/docs/utilities/routeUtils.md +138 -0
- package/dist/docs/utilities/useAfterMount.md +66 -0
- package/dist/docs/utilities/useAutoAnimate.md +193 -0
- package/dist/docs/utilities/useAverage.md +95 -0
- package/dist/docs/utilities/useClickOutside.md +61 -0
- package/dist/docs/utilities/useClipboard.md +93 -0
- package/dist/docs/utilities/useCount.md +178 -0
- package/dist/docs/utilities/useDarkMode.md +49 -0
- package/dist/docs/utilities/useDebugInfo.md +126 -0
- package/dist/docs/utilities/useEffectOnce.md +58 -0
- package/dist/docs/utilities/useElapsedTime.md +58 -0
- package/dist/docs/utilities/useElementSize.md +71 -0
- package/dist/docs/utilities/useEsc.md +58 -0
- package/dist/docs/utilities/useEvent.md +64 -0
- package/dist/docs/utilities/useFocusTrap.md +85 -0
- package/dist/docs/utilities/useFullscreen.md +198 -0
- package/dist/docs/utilities/useHover.md +55 -0
- package/dist/docs/utilities/useIncomingPostMessages.md +237 -0
- package/dist/docs/utilities/useInterval.md +85 -0
- package/dist/docs/utilities/useIsFocusWithin.md +114 -0
- package/dist/docs/utilities/useKey.md +151 -0
- package/dist/docs/utilities/useLocalStorage.md +91 -0
- package/dist/docs/utilities/useLocationSuggestions.md +114 -0
- package/dist/docs/utilities/useMax.md +62 -0
- package/dist/docs/utilities/useMin.md +78 -0
- package/dist/docs/utilities/useMutationObserver.md +113 -0
- package/dist/docs/utilities/useOnScreen.md +138 -0
- package/dist/docs/utilities/useOnlineStatus.md +49 -0
- package/dist/docs/utilities/usePostMessage.md +117 -0
- package/dist/docs/utilities/usePostMessageSender.md +257 -0
- package/dist/docs/utilities/usePrevious.md +101 -0
- package/dist/docs/utilities/useResizeObserver.md +151 -0
- package/dist/docs/utilities/useScrollPosition.md +252 -0
- package/dist/docs/utilities/useSearch.md +228 -0
- package/dist/docs/utilities/useSorting.md +389 -0
- package/dist/docs/utilities/useStateWithValidation.md +83 -0
- package/dist/docs/utilities/useSum.md +155 -0
- package/dist/docs/utilities/useTableExport.md +404 -0
- package/dist/docs/utilities/useTableSelection.md +1120 -0
- package/dist/docs/utilities/useTimeout.md +55 -0
- package/dist/docs/utilities/useToggle.md +115 -0
- package/dist/docs/utilities/useWindowResize.md +70 -0
- package/dist/index.mjs +271 -0
- package/dist/search-synonyms.json +134 -0
- package/dist/version.json +4 -0
- package/package.json +23 -19
- package/bin/uikit-mcp.mjs +0 -23
- package/data/pages/Components/components/accentbar.json +0 -207
- package/data/pages/Components/components/activity.json +0 -87
- package/data/pages/Components/components/animatednumber.json +0 -99
- package/data/pages/Components/components/animations.json +0 -87
- package/data/pages/Components/components/appheader.json +0 -291
- package/data/pages/Components/components/applayout.json +0 -1198
- package/data/pages/Components/components/appnavigationbar.json +0 -327
- package/data/pages/Components/components/areacharts.json +0 -563
- package/data/pages/Components/components/aspectratioplaceholder.json +0 -75
- package/data/pages/Components/components/assettree.json +0 -3080
- package/data/pages/Components/components/autosuggests.json +0 -710
- package/data/pages/Components/components/avatar.json +0 -157
- package/data/pages/Components/components/banner.json +0 -599
- package/data/pages/Components/components/barcharts.json +0 -1507
- package/data/pages/Components/components/barlist.json +0 -223
- package/data/pages/Components/components/basicmap.json +0 -68
- package/data/pages/Components/components/bottomsheet.json +0 -601
- package/data/pages/Components/components/button.json +0 -583
- package/data/pages/Components/components/buttontoolbar.json +0 -63
- package/data/pages/Components/components/calendarstripe.json +0 -235
- package/data/pages/Components/components/card.json +0 -69
- package/data/pages/Components/components/carousel.json +0 -39
- package/data/pages/Components/components/chartcolors.json +0 -34
- package/data/pages/Components/components/chartsgettingstarted.json +0 -32
- package/data/pages/Components/components/chat.json +0 -39
- package/data/pages/Components/components/checkbox.json +0 -847
- package/data/pages/Components/components/clearableinput.json +0 -789
- package/data/pages/Components/components/collapse.json +0 -175
- package/data/pages/Components/components/composedcharts.json +0 -159
- package/data/pages/Components/components/contentloader.json +0 -233
- package/data/pages/Components/components/datatabs.json +0 -680
- package/data/pages/Components/components/datepickers.json +0 -287
- package/data/pages/Components/components/dialogs.json +0 -1492
- package/data/pages/Components/components/divider.json +0 -93
- package/data/pages/Components/components/dropdowns.json +0 -936
- package/data/pages/Components/components/editablecontent.json +0 -1117
- package/data/pages/Components/components/expander.json +0 -377
- package/data/pages/Components/components/fade.json +0 -403
- package/data/pages/Components/components/fadeexpander.json +0 -75
- package/data/pages/Components/components/fadeup.json +0 -127
- package/data/pages/Components/components/feedback.json +0 -269
- package/data/pages/Components/components/filepickers.json +0 -269
- package/data/pages/Components/components/formlabel.json +0 -115
- package/data/pages/Components/components/fullscreenmap.json +0 -22
- package/data/pages/Components/components/groupeditemlist.json +0 -323
- package/data/pages/Components/components/iconlist.json +0 -45
- package/data/pages/Components/components/imagepreloader.json +0 -81
- package/data/pages/Components/components/labeledelement.json +0 -75
- package/data/pages/Components/components/licenseplate.json +0 -69
- package/data/pages/Components/components/linecharts.json +0 -987
- package/data/pages/Components/components/listmenu.json +0 -313
- package/data/pages/Components/components/loadmore.json +0 -175
- package/data/pages/Components/components/mainnavigation.json +0 -39
- package/data/pages/Components/components/mapcircle.json +0 -34
- package/data/pages/Components/components/mapcluster.json +0 -51
- package/data/pages/Components/components/mapcontext.json +0 -105
- package/data/pages/Components/components/mapdraggablemarker.json +0 -34
- package/data/pages/Components/components/mapgettingstarted.json +0 -27
- package/data/pages/Components/components/mapgroup.json +0 -1198
- package/data/pages/Components/components/mapinfobubble.json +0 -34
- package/data/pages/Components/components/maplayergroup.json +0 -34
- package/data/pages/Components/components/mapmarker.json +0 -700
- package/data/pages/Components/components/mappolygon.json +0 -45
- package/data/pages/Components/components/maproute.json +0 -623
- package/data/pages/Components/components/maproutegenerator.json +0 -16
- package/data/pages/Components/components/mapsettings.json +0 -51
- package/data/pages/Components/components/maputils.json +0 -34
- package/data/pages/Components/components/multiselects.json +0 -1451
- package/data/pages/Components/components/nodata.json +0 -139
- package/data/pages/Components/components/notifications.json +0 -65
- package/data/pages/Components/components/numbercontrol.json +0 -301
- package/data/pages/Components/components/onboarding.json +0 -302
- package/data/pages/Components/components/page.json +0 -197
- package/data/pages/Components/components/pager.json +0 -93
- package/data/pages/Components/components/piecharts.json +0 -731
- package/data/pages/Components/components/popover.json +0 -251
- package/data/pages/Components/components/position.json +0 -69
- package/data/pages/Components/components/radialbarcharts.json +0 -1304
- package/data/pages/Components/components/radiobutton.json +0 -1105
- package/data/pages/Components/components/releasenotes.json +0 -44
- package/data/pages/Components/components/resizer.json +0 -93
- package/data/pages/Components/components/responsivecolumnstripe.json +0 -123
- package/data/pages/Components/components/responsivevideo.json +0 -75
- package/data/pages/Components/components/rioglyph.json +0 -93
- package/data/pages/Components/components/rules.json +0 -410
- package/data/pages/Components/components/saveableinput.json +0 -703
- package/data/pages/Components/components/selects.json +0 -701
- package/data/pages/Components/components/sidebar.json +0 -243
- package/data/pages/Components/components/sliders.json +0 -235
- package/data/pages/Components/components/smoothscrollbars.json +0 -335
- package/data/pages/Components/components/spinners.json +0 -343
- package/data/pages/Components/components/states.json +0 -1705
- package/data/pages/Components/components/statswidgets.json +0 -314
- package/data/pages/Components/components/statusbar.json +0 -177
- package/data/pages/Components/components/stepbutton.json +0 -57
- package/data/pages/Components/components/steppedprogressbars.json +0 -417
- package/data/pages/Components/components/subnavigation.json +0 -107
- package/data/pages/Components/components/supportmarker.json +0 -45
- package/data/pages/Components/components/svgimage.json +0 -81
- package/data/pages/Components/components/switch.json +0 -111
- package/data/pages/Components/components/tables.json +0 -144
- package/data/pages/Components/components/tagmanager.json +0 -86
- package/data/pages/Components/components/tags.json +0 -146
- package/data/pages/Components/components/teaser.json +0 -188
- package/data/pages/Components/components/timeline.json +0 -45
- package/data/pages/Components/components/timepicker.json +0 -163
- package/data/pages/Components/components/togglebutton.json +0 -247
- package/data/pages/Components/components/tooltip.json +0 -270
- package/data/pages/Components/components/virtuallist.json +0 -175
- package/data/pages/Foundations/foundations.json +0 -2475
- package/data/pages/Getting-started/start/changelog.json +0 -22
- package/data/pages/Getting-started/start/goodtoknow.json +0 -32
- package/data/pages/Getting-started/start/guidelines/color-combinations.json +0 -58
- package/data/pages/Getting-started/start/guidelines/custom-css.json +0 -27
- package/data/pages/Getting-started/start/guidelines/custom-rioglyph.json +0 -22
- package/data/pages/Getting-started/start/guidelines/formatting.json +0 -97
- package/data/pages/Getting-started/start/guidelines/iframe.json +0 -93
- package/data/pages/Getting-started/start/guidelines/obfuscate-data.json +0 -22
- package/data/pages/Getting-started/start/guidelines/print-css.json +0 -37
- package/data/pages/Getting-started/start/guidelines/spinner.json +0 -144
- package/data/pages/Getting-started/start/guidelines/supported-browsers.json +0 -22
- package/data/pages/Getting-started/start/guidelines/writing.json +0 -242
- package/data/pages/Getting-started/start/howto.json +0 -72
- package/data/pages/Getting-started/start/intro.json +0 -37
- package/data/pages/Getting-started/start/responsiveness.json +0 -52
- package/data/pages/Templates/templates/common-table.json +0 -39
- package/data/pages/Templates/templates/detail-views.json +0 -71
- package/data/pages/Templates/templates/expandable-details.json +0 -39
- package/data/pages/Templates/templates/feature-cards.json +0 -103
- package/data/pages/Templates/templates/form-summary.json +0 -39
- package/data/pages/Templates/templates/form-toggle.json +0 -39
- package/data/pages/Templates/templates/list-blocks.json +0 -119
- package/data/pages/Templates/templates/loading-progress.json +0 -39
- package/data/pages/Templates/templates/options-panel.json +0 -39
- package/data/pages/Templates/templates/panel-variants.json +0 -39
- package/data/pages/Templates/templates/progress-cards.json +0 -71
- package/data/pages/Templates/templates/progress-success.json +0 -39
- package/data/pages/Templates/templates/settings-form.json +0 -39
- package/data/pages/Templates/templates/stats-blocks.json +0 -135
- package/data/pages/Templates/templates/table-panel.json +0 -39
- package/data/pages/Templates/templates/table-row-animation.json +0 -39
- package/data/pages/Templates/templates/usage-cards.json +0 -39
- package/data/pages/Utilities/utilities/deviceutils.json +0 -39
- package/data/pages/Utilities/utilities/featuretoggles.json +0 -42
- package/data/pages/Utilities/utilities/fueltypeutils.json +0 -118
- package/data/pages/Utilities/utilities/routeutils.json +0 -34
- package/data/pages/Utilities/utilities/useaftermount.json +0 -63
- package/data/pages/Utilities/utilities/useaverage.json +0 -86
- package/data/pages/Utilities/utilities/useclickoutside.json +0 -69
- package/data/pages/Utilities/utilities/useclipboard.json +0 -57
- package/data/pages/Utilities/utilities/usecount.json +0 -92
- package/data/pages/Utilities/utilities/usedarkmode.json +0 -50
- package/data/pages/Utilities/utilities/usedebuginfo.json +0 -63
- package/data/pages/Utilities/utilities/useeffectonce.json +0 -57
- package/data/pages/Utilities/utilities/useelapsedtime.json +0 -57
- package/data/pages/Utilities/utilities/useelementsize.json +0 -63
- package/data/pages/Utilities/utilities/useesc.json +0 -57
- package/data/pages/Utilities/utilities/useevent.json +0 -75
- package/data/pages/Utilities/utilities/usefocustrap.json +0 -57
- package/data/pages/Utilities/utilities/usefullscreen.json +0 -197
- package/data/pages/Utilities/utilities/usehover.json +0 -57
- package/data/pages/Utilities/utilities/useinterval.json +0 -63
- package/data/pages/Utilities/utilities/useisfocuswithin.json +0 -75
- package/data/pages/Utilities/utilities/usekey.json +0 -75
- package/data/pages/Utilities/utilities/uselocalstorage.json +0 -69
- package/data/pages/Utilities/utilities/uselocationsuggestions.json +0 -110
- package/data/pages/Utilities/utilities/usemax.json +0 -86
- package/data/pages/Utilities/utilities/usemin.json +0 -86
- package/data/pages/Utilities/utilities/usemutationobserver.json +0 -69
- package/data/pages/Utilities/utilities/useonlinestatus.json +0 -39
- package/data/pages/Utilities/utilities/useonscreen.json +0 -63
- package/data/pages/Utilities/utilities/usepostmessage.json +0 -80
- package/data/pages/Utilities/utilities/useprevious.json +0 -63
- package/data/pages/Utilities/utilities/useresizeobserver.json +0 -65
- package/data/pages/Utilities/utilities/usescrollposition.json +0 -103
- package/data/pages/Utilities/utilities/usesearch.json +0 -197
- package/data/pages/Utilities/utilities/usesorting.json +0 -139
- package/data/pages/Utilities/utilities/usestatewithvalidation.json +0 -69
- package/data/pages/Utilities/utilities/usesum.json +0 -86
- package/data/pages/Utilities/utilities/usetableexport.json +0 -87
- package/data/pages/Utilities/utilities/usetableselection.json +0 -311
- package/data/pages/Utilities/utilities/usetimeout.json +0 -63
- package/data/pages/Utilities/utilities/usetoggle.json +0 -75
- package/data/pages/Utilities/utilities/usewindowresize.json +0 -63
- package/data/version.json +0 -4
- package/docs/content-schema.md +0 -147
- package/docs/navigation-inventory.json +0 -1310
- package/docs/search-synonyms.json +0 -43
- package/server/index.mjs +0 -268
- package/server/lib/load-docs.mjs +0 -48
- package/server/lib/normalise-doc.mjs +0 -220
- package/server/lib/render-markdown.mjs +0 -82
- package/server/lib/search-index.mjs +0 -49
- package/server/lib/types.js +0 -99
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# useFocusTrap
|
|
2
|
+
|
|
3
|
+
*Category:* Utilities
|
|
4
|
+
*Section:* DOM behavior hooks
|
|
5
|
+
*Source:* https://uikit.developers.rio.cloud/#utilities/useFocusTrap
|
|
6
|
+
*Captured:* 2025-12-12T14:21:44.774Z
|
|
7
|
+
|
|
8
|
+
This custom hook allows to keep the focus inside a defined wrapper element. This might be a dialog or a custom overlay.
|
|
9
|
+
|
|
10
|
+
## useFocusTrap
|
|
11
|
+
|
|
12
|
+
- When you have a external component that will be re-rendered after the overlay opens, you can use the built-in ref. This ref will be returned from this hook and can be set on the respective wrapper element.
|
|
13
|
+
- When you have an element that does not re-render, use a local state setter function to be set as the ref. This element can then be passed as a parameter to this hook and it will be used instead of the built-in ref.const [focusTrapRef, setFocusTrapRef] = useState<HTMLDivElement | null>(null); useFocusTrap(focusTrapRef); <div ref={setFocusTrapRef}>...</div>
|
|
14
|
+
|
|
15
|
+
### Example: Example 1
|
|
16
|
+
|
|
17
|
+
Open Dialog
|
|
18
|
+
|
|
19
|
+
#### Summary
|
|
20
|
+
|
|
21
|
+
Open Dialog
|
|
22
|
+
|
|
23
|
+
#### React (tsx)
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { useEffect, useRef, useState } from 'react';
|
|
27
|
+
|
|
28
|
+
import Dialog from '@rio-cloud/rio-uikit/Dialog';
|
|
29
|
+
import Button from '@rio-cloud/rio-uikit/Button';
|
|
30
|
+
import useFocusTrap from '@rio-cloud/rio-uikit/useFocusTrap';
|
|
31
|
+
|
|
32
|
+
const DemoBody = () => {
|
|
33
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
34
|
+
|
|
35
|
+
const focusTrapRef = useFocusTrap();
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (inputRef.current) {
|
|
39
|
+
inputRef.current.focus();
|
|
40
|
+
}
|
|
41
|
+
}, [inputRef.current]);
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<div ref={focusTrapRef} className='form-group display-flex gap-10'>
|
|
45
|
+
<input ref={inputRef} className='form-control' />
|
|
46
|
+
<div className='btn-toolbar flex-nowrap'>
|
|
47
|
+
<Button>Button 1</Button>
|
|
48
|
+
<Button>Button 2</Button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export default () => {
|
|
55
|
+
const [showDialog, setShowDialog] = useState(false);
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<div>
|
|
59
|
+
<Dialog
|
|
60
|
+
show={showDialog}
|
|
61
|
+
onClose={() => setShowDialog(false)}
|
|
62
|
+
title='Demo Focus Trap'
|
|
63
|
+
showCloseButton
|
|
64
|
+
bsSize='sm'
|
|
65
|
+
body={<DemoBody />}
|
|
66
|
+
/>
|
|
67
|
+
<Button onClick={() => setShowDialog(true)}>Open Dialog</Button>
|
|
68
|
+
</div>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### HTML (html)
|
|
74
|
+
|
|
75
|
+
```html
|
|
76
|
+
<div>
|
|
77
|
+
<button type="button" class="btn btn-default btn-component" tabindex="0">Open Dialog</button>
|
|
78
|
+
</div>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### Props
|
|
82
|
+
|
|
83
|
+
| Name | Type | Default | Description |
|
|
84
|
+
| --- | --- | --- | --- |
|
|
85
|
+
| element | HTMLDivElement \| null | — | The wrapper element that traps the focus. Use this if your component does not rerender, otherwise use the internal ref that gets returned from the hook. |
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# useFullscreen
|
|
2
|
+
|
|
3
|
+
*Category:* Utilities
|
|
4
|
+
*Section:* DOM behavior hooks
|
|
5
|
+
*Source:* https://uikit.developers.rio.cloud/#utilities/useFullscreen
|
|
6
|
+
*Captured:* 2025-12-12T14:21:46.293Z
|
|
7
|
+
|
|
8
|
+
The cross-browser useFullscreen hook allows to easily switch to fullscreen mode for the document or a dedicated element like a map or a certain part of a service.
|
|
9
|
+
|
|
10
|
+
## useFullscreen
|
|
11
|
+
|
|
12
|
+
**Fullscreen on dedicated element**
|
|
13
|
+
|
|
14
|
+
### Example: Example 1
|
|
15
|
+
|
|
16
|
+
Fullscreen enabled: false
|
|
17
|
+
Is Fullscreen active: false
|
|
18
|
+
Request Fullscreen
|
|
19
|
+
Exit Fullscreen
|
|
20
|
+
Toggle Fullscreen
|
|
21
|
+
|
|
22
|
+
#### Summary
|
|
23
|
+
|
|
24
|
+
Fullscreen enabled: false
|
|
25
|
+
Is Fullscreen active: false
|
|
26
|
+
Request Fullscreen
|
|
27
|
+
Exit Fullscreen
|
|
28
|
+
Toggle Fullscreen
|
|
29
|
+
|
|
30
|
+
#### React (tsx)
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import useFullscreen from '@rio-cloud/rio-uikit/useFullscreen';
|
|
34
|
+
|
|
35
|
+
export default () => {
|
|
36
|
+
const handleChange = (event: Event) => console.log(event);
|
|
37
|
+
const handleError = (event: Event) => console.log(event);
|
|
38
|
+
|
|
39
|
+
const { exitFullscreen, isEnabled, isFullscreen, requestFullscreen, toggleFullscreen } = useFullscreen({
|
|
40
|
+
onChange: handleChange,
|
|
41
|
+
onError: handleError,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<div>
|
|
46
|
+
<div>
|
|
47
|
+
Fullscreen enabled: <span>{`${isEnabled}`}</span>
|
|
48
|
+
</div>
|
|
49
|
+
<hr />
|
|
50
|
+
<div>
|
|
51
|
+
Is Fullscreen active: <span>{`${isFullscreen}`}</span>
|
|
52
|
+
</div>
|
|
53
|
+
<hr />
|
|
54
|
+
<div className='btn-toolbar'>
|
|
55
|
+
<div className='btn btn-default' onClick={requestFullscreen}>
|
|
56
|
+
Request Fullscreen
|
|
57
|
+
</div>
|
|
58
|
+
<div className='btn btn-default' onClick={exitFullscreen}>
|
|
59
|
+
Exit Fullscreen
|
|
60
|
+
</div>
|
|
61
|
+
<div className='btn btn-default' onClick={toggleFullscreen}>
|
|
62
|
+
Toggle Fullscreen
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### HTML (html)
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<div>
|
|
74
|
+
<div>Fullscreen enabled: <span>false</span>
|
|
75
|
+
</div>
|
|
76
|
+
<hr>
|
|
77
|
+
<div>Is Fullscreen active: <span>false</span>
|
|
78
|
+
</div>
|
|
79
|
+
<hr>
|
|
80
|
+
<div class="btn-toolbar">
|
|
81
|
+
<div class="btn btn-default">Request Fullscreen</div>
|
|
82
|
+
<div class="btn btn-default">Exit Fullscreen</div>
|
|
83
|
+
<div class="btn btn-default">Toggle Fullscreen</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
#### Props
|
|
89
|
+
|
|
90
|
+
| Name | Type | Default | Description |
|
|
91
|
+
| --- | --- | --- | --- |
|
|
92
|
+
| element | HTMLElement | — | The target element other than document. Note, the element need to be existing in the DOM when initializing the hook. Otherwise pass the element as argument to the "requestFullscreen" function. |
|
|
93
|
+
| onChange | (callback: OnChangeEventCallback) => void | () => {} | Custom callback function for acting on the fullscreen change. |
|
|
94
|
+
| onError | (callback: EventCallback) => void | () => {} | Custom callback function for acting on an error when the fullscreen fails. |
|
|
95
|
+
| requestFullscreenOptions | { navigationUI?: string \| "auto" \| "hide" \| "show" } | {} | Define additional options for requesting the fullscreen. |
|
|
96
|
+
|
|
97
|
+
#### Props
|
|
98
|
+
|
|
99
|
+
| Name | Type | Default | Description |
|
|
100
|
+
| --- | --- | --- | --- |
|
|
101
|
+
| requestFullscreen | (targetElement: HTMLElement) => void | — | This function requests the fullscreen to the browser. It takes an optional argument to define the target element later than on init. |
|
|
102
|
+
| exitFullscreen | Function | — | This function exits the fullscreen. |
|
|
103
|
+
| toggleFullscreen | Function | — | This function requests or exists the fullscreen depending on the fullscreen state. |
|
|
104
|
+
| isFullscreen | Boolean | — | Defines whether the browser is in fullscreen mode. Note, the can only be on element in fullscreen at a time, either the document or a dedicated element. |
|
|
105
|
+
| isEnabled | Boolean | — | Tells you if the browser allows the fullscreen mode. |
|
|
106
|
+
|
|
107
|
+
### Example: Example 2
|
|
108
|
+
|
|
109
|
+
Example - click on expand icon to use fullscreen
|
|
110
|
+
|
|
111
|
+
Sample content.
|
|
112
|
+
Here you can have arbitrary content like a map or charts etc.
|
|
113
|
+
|
|
114
|
+
#### Summary
|
|
115
|
+
|
|
116
|
+
Example - click on expand icon to use fullscreen
|
|
117
|
+
|
|
118
|
+
Sample content.
|
|
119
|
+
Here you can have arbitrary content like a map or charts etc.
|
|
120
|
+
|
|
121
|
+
#### React (tsx)
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
import { useRef } from 'react';
|
|
125
|
+
|
|
126
|
+
import useFullscreen from '@rio-cloud/rio-uikit/useFullscreen';
|
|
127
|
+
|
|
128
|
+
import { dummyTextLong } from '../../../utils/data';
|
|
129
|
+
|
|
130
|
+
export default () => {
|
|
131
|
+
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
132
|
+
|
|
133
|
+
const { toggleFullscreen, isFullscreen } = useFullscreen();
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<div className='example-wrapper bg-lighter display-grid' ref={wrapperRef}>
|
|
137
|
+
<div className={`panel panel-default shadow-default ${isFullscreen ? 'margin-25' : ''}`}>
|
|
138
|
+
<div className='panel-heading display-flex justify-content-between align-items-center'>
|
|
139
|
+
<div className='text-medium text-color-darker'>
|
|
140
|
+
Example - click on expand icon to use fullscreen
|
|
141
|
+
</div>
|
|
142
|
+
<div
|
|
143
|
+
className='text-color-gray text-size-16 cursor-pointer'
|
|
144
|
+
onClick={() => toggleFullscreen(wrapperRef.current)}
|
|
145
|
+
>
|
|
146
|
+
<span className='rioglyph rioglyph-fullscreen' />
|
|
147
|
+
</div>
|
|
148
|
+
</div>
|
|
149
|
+
<div className='panel-body'>
|
|
150
|
+
<p>
|
|
151
|
+
Sample content. <br />
|
|
152
|
+
Here you can have arbitrary content like a map or charts etc.
|
|
153
|
+
</p>
|
|
154
|
+
{isFullscreen && <p>{dummyTextLong}</p>}
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
};
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
#### HTML (html)
|
|
163
|
+
|
|
164
|
+
```html
|
|
165
|
+
<div class="example-wrapper bg-lighter display-grid">
|
|
166
|
+
<div class="panel panel-default shadow-default ">
|
|
167
|
+
<div class="panel-heading display-flex justify-content-between align-items-center">
|
|
168
|
+
<div class="text-medium text-color-darker">Example - click on expand icon to use fullscreen</div>
|
|
169
|
+
<div class="text-color-gray text-size-16 cursor-pointer">
|
|
170
|
+
<span class="rioglyph rioglyph-fullscreen">
|
|
171
|
+
</span>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="panel-body">
|
|
175
|
+
<p>Sample content. <br>Here you can have arbitrary content like a map or charts etc.</p>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### Props
|
|
182
|
+
|
|
183
|
+
| Name | Type | Default | Description |
|
|
184
|
+
| --- | --- | --- | --- |
|
|
185
|
+
| element | HTMLElement | — | The target element other than document. Note, the element need to be existing in the DOM when initializing the hook. Otherwise pass the element as argument to the "requestFullscreen" function. |
|
|
186
|
+
| onChange | (callback: OnChangeEventCallback) => void | () => {} | Custom callback function for acting on the fullscreen change. |
|
|
187
|
+
| onError | (callback: EventCallback) => void | () => {} | Custom callback function for acting on an error when the fullscreen fails. |
|
|
188
|
+
| requestFullscreenOptions | { navigationUI?: string \| "auto" \| "hide" \| "show" } | {} | Define additional options for requesting the fullscreen. |
|
|
189
|
+
|
|
190
|
+
#### Props
|
|
191
|
+
|
|
192
|
+
| Name | Type | Default | Description |
|
|
193
|
+
| --- | --- | --- | --- |
|
|
194
|
+
| requestFullscreen | (targetElement: HTMLElement) => void | — | This function requests the fullscreen to the browser. It takes an optional argument to define the target element later than on init. |
|
|
195
|
+
| exitFullscreen | Function | — | This function exits the fullscreen. |
|
|
196
|
+
| toggleFullscreen | Function | — | This function requests or exists the fullscreen depending on the fullscreen state. |
|
|
197
|
+
| isFullscreen | Boolean | — | Defines whether the browser is in fullscreen mode. Note, the can only be on element in fullscreen at a time, either the document or a dedicated element. |
|
|
198
|
+
| isEnabled | Boolean | — | Tells you if the browser allows the fullscreen mode. |
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# useHover
|
|
2
|
+
|
|
3
|
+
*Category:* Utilities
|
|
4
|
+
*Section:* DOM behavior hooks
|
|
5
|
+
*Source:* https://uikit.developers.rio.cloud/#utilities/useHover
|
|
6
|
+
*Captured:* 2025-12-12T14:21:45.911Z
|
|
7
|
+
|
|
8
|
+
## useHover
|
|
9
|
+
|
|
10
|
+
### Example: Example 1
|
|
11
|
+
|
|
12
|
+
Lorem ipsum dolor sit amet
|
|
13
|
+
|
|
14
|
+
#### Summary
|
|
15
|
+
|
|
16
|
+
Lorem ipsum dolor sit amet
|
|
17
|
+
|
|
18
|
+
#### React (tsx)
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
/* eslint-disable max-len */
|
|
22
|
+
import { useRef } from 'react';
|
|
23
|
+
|
|
24
|
+
import useHover from '@rio-cloud/rio-uikit/useHover';
|
|
25
|
+
|
|
26
|
+
export default () => {
|
|
27
|
+
const ref = useRef<HTMLInputElement>(null);
|
|
28
|
+
|
|
29
|
+
const isHover = useHover(ref);
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div
|
|
33
|
+
ref={ref}
|
|
34
|
+
className='well display-flex gap-10 align-items-center border hover-border-color-primary max-width-300 cursor-pointer'
|
|
35
|
+
>
|
|
36
|
+
<span className='text-color-darker text-size-16 text-medium'>Lorem ipsum dolor sit amet</span>
|
|
37
|
+
{isHover && <span className='rioglyph rioglyph-antenna text-size-20 text-color-primary' />}
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### HTML (html)
|
|
44
|
+
|
|
45
|
+
```html
|
|
46
|
+
<div class="well display-flex gap-10 align-items-center border hover-border-color-primary max-width-300 cursor-pointer">
|
|
47
|
+
<span class="text-color-darker text-size-16 text-medium">Lorem ipsum dolor sit amet</span>
|
|
48
|
+
</div>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
#### Props
|
|
52
|
+
|
|
53
|
+
| Name | Type | Default | Description |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| ref | React.Ref | — | The reference to the element that shall be hovered. |
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# useIncomingPostMessages
|
|
2
|
+
|
|
3
|
+
*Category:* Utilities
|
|
4
|
+
*Section:* Browser & device hooks
|
|
5
|
+
*Source:* https://uikit.developers.rio.cloud/#utilities/useIncomingPostMessages
|
|
6
|
+
*Captured:* 2025-12-12T14:21:49.672Z
|
|
7
|
+
|
|
8
|
+
For handling postMessage events in React components.
|
|
9
|
+
|
|
10
|
+
## useIncomingPostMessages
|
|
11
|
+
|
|
12
|
+
You can either handle "vanilla" events yourself or declaratively listen to "action-style" events. The latter are inspired by Redux actions, as the event data is an object with a type property and an optional payload.
|
|
13
|
+
|
|
14
|
+
The payload does not have to be a simple string, but can be a complex object, as well.
|
|
15
|
+
|
|
16
|
+
### Example: Example 1
|
|
17
|
+
|
|
18
|
+
Send raw message ("hello, world")Send action: EVENT_WIDGET_READYSend action: EVENT_WIDGET_DATA
|
|
19
|
+
Note that in this simple example, we're not really sending messages across windows. The origin-filtering handlers are in place, though. You can experiment by opening this page in an iframe inside a page with a different origin and try sending the same events as in the example code.
|
|
20
|
+
Simple events
|
|
21
|
+
Shows every incoming postMessage as-is (no origin filter or type parsing). Useful for quick debugging of any messages your page receives.
|
|
22
|
+
|
|
23
|
+
Simple events with origin filter
|
|
24
|
+
Same raw view, but driven by the origin+handler object form (instead of a single callback) and only for messages whose origin matches this page.
|
|
25
|
+
|
|
26
|
+
Action events
|
|
27
|
+
Only shows action-style messages (objects with a `type` field) and extracts their payload. Handy when you control the sender and use message types to route logic.
|
|
28
|
+
|
|
29
|
+
Action events with origin filter
|
|
30
|
+
Action messages constrained by origin. Use this to route typed messages while still protecting against unexpected origins.
|
|
31
|
+
|
|
32
|
+
#### Summary
|
|
33
|
+
|
|
34
|
+
Send raw message ("hello, world")Send action: EVENT_WIDGET_READYSend action: EVENT_WIDGET_DATA
|
|
35
|
+
Note that in this simple example, we're not really sending messages across windows. The origin-filtering handlers are in place, though. You can experiment by opening this page in an iframe inside a page with a different origin and try sending the same events as in the example code.
|
|
36
|
+
Simple events
|
|
37
|
+
Shows every incoming postMessage as-is (no origin filter or type parsing). Useful for quick debugging of any messages your page receives.
|
|
38
|
+
|
|
39
|
+
Simple events with origin filter
|
|
40
|
+
Same raw view, but driven by the origin+handler object form (instead of a single callback) and only for messages whose origin matches this page.
|
|
41
|
+
|
|
42
|
+
Action events
|
|
43
|
+
Only shows action-style messages (objects with a `type` field) and extracts their payload. Handy when you control the sender and use message types to route logic.
|
|
44
|
+
|
|
45
|
+
Action events with origin filter
|
|
46
|
+
Action messages constrained by origin. Use this to route typed messages while still protecting against unexpected origins.
|
|
47
|
+
|
|
48
|
+
#### React (tsx)
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import { useEffect, useRef, useState } from 'react';
|
|
52
|
+
|
|
53
|
+
import ButtonToolbar from '@rio-cloud/rio-uikit/ButtonToolbar';
|
|
54
|
+
import Button from '@rio-cloud/rio-uikit/components/button/Button';
|
|
55
|
+
import useIncomingPostMessages from '@rio-cloud/rio-uikit/hooks/useIncomingPostMessages';
|
|
56
|
+
|
|
57
|
+
export default () => {
|
|
58
|
+
const [simpleEvents, setSimpleEvents] = useState<string[]>([]);
|
|
59
|
+
const [filteredSimpleEvents, setFilteredSimpleEvents] = useState<string[]>([]);
|
|
60
|
+
const [actionEvents, setActionEvents] = useState<string[]>([]);
|
|
61
|
+
const [filteredActionEvents, setFilteredActionEvents] = useState<string[]>([]);
|
|
62
|
+
|
|
63
|
+
useIncomingPostMessages(event => {
|
|
64
|
+
// We're getting ALL kinds of events here, so we need to implement appropriate filters ourselves!
|
|
65
|
+
if (isReactDevtoolsEvent(event)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
setSimpleEvents([...simpleEvents, JSON.stringify(event.data)]);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
useIncomingPostMessages({
|
|
73
|
+
// this will ignore all events not coming from a declared origin - in this simple example, we're just using the current page's origin itself
|
|
74
|
+
origin: window.origin,
|
|
75
|
+
handler: event => {
|
|
76
|
+
// We're getting ALL kinds of events here, so we need to implement appropriate filters ourselves!
|
|
77
|
+
if (isReactDevtoolsEvent(event)) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setFilteredSimpleEvents([...filteredSimpleEvents, JSON.stringify(event.data)]);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
useIncomingPostMessages({
|
|
86
|
+
handlers: {
|
|
87
|
+
EVENT_WIDGET_READY: (payload: string) => {
|
|
88
|
+
setActionEvents([...actionEvents, payload]);
|
|
89
|
+
},
|
|
90
|
+
EVENT_WIDGET_DATA: (payload: unknown) => {
|
|
91
|
+
const message = typeof payload === 'string' ? payload : JSON.stringify(payload);
|
|
92
|
+
setActionEvents([...actionEvents, message]);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
useIncomingPostMessages({
|
|
98
|
+
// this will ignore all events not coming from a declared origin - in this simple example, we're just using the current page's origin itself
|
|
99
|
+
origin: window.origin,
|
|
100
|
+
handlers: {
|
|
101
|
+
EVENT_WIDGET_READY: (payload: string) => {
|
|
102
|
+
setFilteredActionEvents([...filteredActionEvents, payload]);
|
|
103
|
+
},
|
|
104
|
+
EVENT_WIDGET_DATA: (payload: unknown) => {
|
|
105
|
+
const message = typeof payload === 'string' ? payload : JSON.stringify(payload);
|
|
106
|
+
setFilteredActionEvents([...filteredActionEvents, message]);
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const sendSimpleEvent = () => {
|
|
112
|
+
window.postMessage('hello, world');
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const sendActionEvent = (type: 'EVENT_WIDGET_READY' | 'EVENT_WIDGET_DATA') => {
|
|
116
|
+
const payload =
|
|
117
|
+
type === 'EVENT_WIDGET_READY'
|
|
118
|
+
? 'Widget is ready to receive data'
|
|
119
|
+
: {
|
|
120
|
+
widgetId: 'demo-widget',
|
|
121
|
+
user: 'Jane Doe',
|
|
122
|
+
shipment: { orderId: 'ORD-1001', status: 'ready', etaDays: 2 },
|
|
123
|
+
};
|
|
124
|
+
window.postMessage({ type, payload });
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<>
|
|
129
|
+
<ButtonToolbar>
|
|
130
|
+
<Button onClick={() => sendSimpleEvent()}>Send raw message ("hello, world")</Button>
|
|
131
|
+
<Button onClick={() => sendActionEvent('EVENT_WIDGET_READY')}>Send action: EVENT_WIDGET_READY</Button>
|
|
132
|
+
<Button onClick={() => sendActionEvent('EVENT_WIDGET_DATA')}>Send action: EVENT_WIDGET_DATA</Button>
|
|
133
|
+
</ButtonToolbar>
|
|
134
|
+
|
|
135
|
+
<p>
|
|
136
|
+
Note that in this simple example, we're not really sending messages across windows. The origin-filtering
|
|
137
|
+
handlers are in place, though. You can experiment by opening this page in an iframe inside a page with a
|
|
138
|
+
different origin and try sending the same events as in the example code.
|
|
139
|
+
</p>
|
|
140
|
+
|
|
141
|
+
<div className='display-grid grid-cols-1 grid-cols-2-md margin-y-20 gap-25'>
|
|
142
|
+
<div>
|
|
143
|
+
<h5>Simple events</h5>
|
|
144
|
+
<p className='text-color-darker margin-y-10'>
|
|
145
|
+
Shows every incoming postMessage as-is (no origin filter or type parsing). Useful for quick
|
|
146
|
+
debugging of any messages your page receives.
|
|
147
|
+
</p>
|
|
148
|
+
<EventTextarea events={simpleEvents} />
|
|
149
|
+
</div>
|
|
150
|
+
<div>
|
|
151
|
+
<h5>Simple events with origin filter</h5>
|
|
152
|
+
<p className='text-color-darker margin-y-10'>
|
|
153
|
+
Same raw view, but driven by the origin+handler object form (instead of a single callback) and
|
|
154
|
+
only for messages whose origin matches this page.
|
|
155
|
+
</p>
|
|
156
|
+
<EventTextarea events={filteredSimpleEvents} />
|
|
157
|
+
</div>
|
|
158
|
+
<div>
|
|
159
|
+
<h5>Action events</h5>
|
|
160
|
+
<p className='text-color-darker margin-y-10'>
|
|
161
|
+
Only shows action-style messages (objects with a `type` field) and extracts their payload. Handy
|
|
162
|
+
when you control the sender and use message types to route logic.
|
|
163
|
+
</p>
|
|
164
|
+
<EventTextarea events={actionEvents} />
|
|
165
|
+
</div>
|
|
166
|
+
<div>
|
|
167
|
+
<h5>Action events with origin filter</h5>
|
|
168
|
+
<p className='text-color-darker margin-y-10'>
|
|
169
|
+
Action messages constrained by origin. Use this to route typed messages while still protecting
|
|
170
|
+
against unexpected origins.
|
|
171
|
+
</p>
|
|
172
|
+
<EventTextarea events={filteredActionEvents} />
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
</>
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const EventTextarea = ({ events }: { events: string[] }) => {
|
|
180
|
+
const textareaRef = useRef<HTMLTextAreaElement>(null);
|
|
181
|
+
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
const element = textareaRef.current;
|
|
184
|
+
if (element) {
|
|
185
|
+
element.scrollTop = element.scrollHeight;
|
|
186
|
+
}
|
|
187
|
+
}, [events]);
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<div>
|
|
191
|
+
<textarea
|
|
192
|
+
ref={textareaRef}
|
|
193
|
+
readOnly
|
|
194
|
+
spellCheck={false}
|
|
195
|
+
value={events.join('\n')}
|
|
196
|
+
className='form-control width-100pct min-height-150 padding-15'
|
|
197
|
+
/>
|
|
198
|
+
</div>
|
|
199
|
+
);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const isReactDevtoolsEvent = (event: MessageEvent<unknown>) => {
|
|
203
|
+
if (typeof event.data === 'object' && event.data !== null) {
|
|
204
|
+
const source = (event.data as Record<string, unknown>).source;
|
|
205
|
+
return typeof source === 'string' && source.startsWith('react-devtools-');
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
};
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### Props: Simple event handler
|
|
212
|
+
|
|
213
|
+
### Simple event handler
|
|
214
|
+
|
|
215
|
+
| Name | Type | Default | Description |
|
|
216
|
+
| --- | --- | --- | --- |
|
|
217
|
+
| handler | (event: MessageEvent<unknown>) => void | — | A callback function triggered when a message is received. |
|
|
218
|
+
|
|
219
|
+
#### Props: Simple handler with origin filtering
|
|
220
|
+
|
|
221
|
+
### Simple handler with origin filtering
|
|
222
|
+
|
|
223
|
+
| Name | Type | Default | Description |
|
|
224
|
+
| --- | --- | --- | --- |
|
|
225
|
+
| options | object | — | An object holding the handler and the expected event origin. |
|
|
226
|
+
| └origin | string | — | The origin for which events are accepted. All other events are ignored. |
|
|
227
|
+
| └handler | (event: MessageEvent<unknown>) => void | — | A callback function triggered when a message is received. |
|
|
228
|
+
|
|
229
|
+
#### Props: Declarative, action-style handlers
|
|
230
|
+
|
|
231
|
+
### Declarative, action-style handlers
|
|
232
|
+
|
|
233
|
+
| Name | Type | Default | Description |
|
|
234
|
+
| --- | --- | --- | --- |
|
|
235
|
+
| options | object | — | An object holding the handlers and the expected event origin. |
|
|
236
|
+
| └origin | string | "*" | The origin for which events are accepted. All other events are ignored. Optional; defaults to "*". |
|
|
237
|
+
| └handlers | Record<string, (payload: unknown) => void> | — | Map of callbacks to be registered. Object keys describe the event action "type". The handler will be called with the payload. |
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# useInterval
|
|
2
|
+
|
|
3
|
+
*Category:* Utilities
|
|
4
|
+
*Section:* Lifecycle & execution hooks
|
|
5
|
+
*Source:* https://uikit.developers.rio.cloud/#utilities/useInterval
|
|
6
|
+
*Captured:* 2025-12-12T14:21:41.891Z
|
|
7
|
+
|
|
8
|
+
The useInterval hook allows for executing some code after a specified amount of time.
|
|
9
|
+
|
|
10
|
+
## useInterval
|
|
11
|
+
|
|
12
|
+
### Example: Example 1
|
|
13
|
+
|
|
14
|
+
Count:0
|
|
15
|
+
|
|
16
|
+
Stop
|
|
17
|
+
|
|
18
|
+
#### Summary
|
|
19
|
+
|
|
20
|
+
Count:0
|
|
21
|
+
|
|
22
|
+
Stop
|
|
23
|
+
|
|
24
|
+
#### React (tsx)
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { useState } from 'react';
|
|
28
|
+
|
|
29
|
+
import useInterval from '@rio-cloud/rio-uikit/useInterval';
|
|
30
|
+
|
|
31
|
+
export default () => {
|
|
32
|
+
const [count, setCount] = useState(0);
|
|
33
|
+
const [delay, setDelay] = useState(1000);
|
|
34
|
+
const [isRunning, setIsRunning] = useState(true);
|
|
35
|
+
|
|
36
|
+
useInterval(
|
|
37
|
+
() => {
|
|
38
|
+
// Your custom logic here
|
|
39
|
+
setCount(count + 1);
|
|
40
|
+
},
|
|
41
|
+
isRunning ? delay : null
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<div className='display-flex flex-column justify-content-center align-items-center'>
|
|
46
|
+
<div className='display-flex flex-column justify-content-center align-items-center margin-bottom-20'>
|
|
47
|
+
<label>Count:</label>
|
|
48
|
+
<div className='h2 margin-0'>{count}</div>
|
|
49
|
+
</div>
|
|
50
|
+
<div className='form-group display-flex gap-10'>
|
|
51
|
+
<input
|
|
52
|
+
className='form-control'
|
|
53
|
+
value={delay}
|
|
54
|
+
onChange={event => setDelay(Number(event.target.value))}
|
|
55
|
+
/>
|
|
56
|
+
<button className='btn btn-default' type='button' onClick={() => setIsRunning(!isRunning)}>
|
|
57
|
+
{isRunning ? 'Stop' : 'Start'}
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
#### HTML (html)
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<div class="display-flex flex-column justify-content-center align-items-center">
|
|
69
|
+
<div class="display-flex flex-column justify-content-center align-items-center margin-bottom-20">
|
|
70
|
+
<label>Count:</label>
|
|
71
|
+
<div class="h2 margin-0">0</div>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="form-group display-flex gap-10">
|
|
74
|
+
<input class="form-control" value="1000">
|
|
75
|
+
<button class="btn btn-default" type="button">Stop</button>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Props
|
|
81
|
+
|
|
82
|
+
| Name | Type | Default | Description |
|
|
83
|
+
| --- | --- | --- | --- |
|
|
84
|
+
| callback | Function | — | The callback function to be triggered. |
|
|
85
|
+
| delay | Number | — | The time to wait until the callback function gets invoked. |
|