@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.
Files changed (388) hide show
  1. package/README.md +75 -39
  2. package/dist/doc-metadata.json +1872 -0
  3. package/dist/docs/components/accentBar.md +582 -0
  4. package/dist/docs/components/activity.md +330 -0
  5. package/dist/docs/components/animatedNumber.md +88 -0
  6. package/dist/docs/components/animatedTextReveal.md +381 -0
  7. package/dist/docs/components/animations.md +459 -0
  8. package/dist/docs/components/appHeader.md +737 -0
  9. package/dist/docs/components/appLayout.md +2033 -0
  10. package/dist/docs/components/appNavigationBar.md +274 -0
  11. package/dist/docs/components/areaCharts.md +828 -0
  12. package/dist/docs/components/aspectRatioPlaceholder.md +106 -0
  13. package/dist/docs/components/assetTree.md +3132 -0
  14. package/dist/docs/components/autosuggests.md +1177 -0
  15. package/dist/docs/components/avatar.md +206 -0
  16. package/dist/docs/components/banner.md +668 -0
  17. package/dist/docs/components/barCharts.md +2765 -0
  18. package/dist/docs/components/barList.md +517 -0
  19. package/dist/docs/components/basicMap.md +167 -0
  20. package/dist/docs/components/bottomSheet.md +721 -0
  21. package/dist/docs/components/button.md +775 -0
  22. package/dist/docs/components/buttonToolbar.md +134 -0
  23. package/dist/docs/components/calendarStripe.md +533 -0
  24. package/dist/docs/components/card.md +86 -0
  25. package/dist/docs/components/carousel.md +128 -0
  26. package/dist/docs/components/chartColors.md +716 -0
  27. package/dist/docs/components/chartsGettingStarted.md +28 -0
  28. package/dist/docs/components/chat.md +935 -0
  29. package/dist/docs/components/checkbox.md +996 -0
  30. package/dist/docs/components/clearableInput.md +806 -0
  31. package/dist/docs/components/collapse.md +189 -0
  32. package/dist/docs/components/composedCharts.md +424 -0
  33. package/dist/docs/components/contentLoader.md +674 -0
  34. package/dist/docs/components/dataTabs.md +1251 -0
  35. package/dist/docs/components/datepickers.md +2543 -0
  36. package/dist/docs/components/dialogs.md +2244 -0
  37. package/dist/docs/components/divider.md +219 -0
  38. package/dist/docs/components/dropdowns.md +17538 -0
  39. package/dist/docs/components/editableContent.md +1127 -0
  40. package/dist/docs/components/expander.md +970 -0
  41. package/dist/docs/components/fade.md +836 -0
  42. package/dist/docs/components/fadeExpander.md +180 -0
  43. package/dist/docs/components/fadeUp.md +396 -0
  44. package/dist/docs/components/feedback.md +758 -0
  45. package/dist/docs/components/filePickers.md +370 -0
  46. package/dist/docs/components/formLabel.md +251 -0
  47. package/dist/docs/components/fullscreenMap.md +10 -0
  48. package/dist/docs/components/groupedItemList.md +1001 -0
  49. package/dist/docs/components/iconList.md +306 -0
  50. package/dist/docs/components/imagePreloader.md +167 -0
  51. package/dist/docs/components/labeledElement.md +115 -0
  52. package/dist/docs/components/licensePlate.md +412 -0
  53. package/dist/docs/components/lineCharts.md +2014 -0
  54. package/dist/docs/components/listMenu.md +392 -0
  55. package/dist/docs/components/loadMore.md +219 -0
  56. package/dist/docs/components/mainNavigation.md +129 -0
  57. package/dist/docs/components/mapCircle.md +93 -0
  58. package/dist/docs/components/mapCluster.md +337 -0
  59. package/dist/docs/components/mapContext.md +284 -0
  60. package/dist/docs/components/mapDraggableMarker.md +150 -0
  61. package/dist/docs/components/mapGettingStarted.md +39 -0
  62. package/dist/docs/components/mapInfoBubble.md +135 -0
  63. package/dist/docs/components/mapLayerGroup.md +94 -0
  64. package/dist/docs/components/mapMarker.md +1814 -0
  65. package/dist/docs/components/mapPolygon.md +959 -0
  66. package/dist/docs/components/mapRoute.md +3816 -0
  67. package/dist/docs/components/mapRouteGenerator.md +6 -0
  68. package/dist/docs/components/mapSettings.md +1040 -0
  69. package/dist/docs/components/mapUtils.md +132 -0
  70. package/dist/docs/components/multiselects.md +1921 -0
  71. package/dist/docs/components/noData.md +210 -0
  72. package/dist/docs/components/notifications.md +314 -0
  73. package/dist/docs/components/numbercontrol.md +706 -0
  74. package/dist/docs/components/onboarding.md +297 -0
  75. package/dist/docs/components/page.md +241 -0
  76. package/dist/docs/components/pager.md +133 -0
  77. package/dist/docs/components/pieCharts.md +1284 -0
  78. package/dist/docs/components/popover.md +222 -0
  79. package/dist/docs/components/position.md +50 -0
  80. package/dist/docs/components/radialBarCharts.md +3663 -0
  81. package/dist/docs/components/radiobutton.md +1271 -0
  82. package/dist/docs/components/releaseNotes.md +135 -0
  83. package/dist/docs/components/resizer.md +162 -0
  84. package/dist/docs/components/responsiveColumnStripe.md +435 -0
  85. package/dist/docs/components/responsiveVideo.md +71 -0
  86. package/dist/docs/components/rioglyph.md +331 -0
  87. package/dist/docs/components/rules.md +965 -0
  88. package/dist/docs/components/saveableInput.md +1721 -0
  89. package/dist/docs/components/selects.md +1993 -0
  90. package/dist/docs/components/sidebar.md +332 -0
  91. package/dist/docs/components/sliders.md +376 -0
  92. package/dist/docs/components/smoothScrollbars.md +1180 -0
  93. package/dist/docs/components/spinners.md +506 -0
  94. package/dist/docs/components/states.md +1176 -0
  95. package/dist/docs/components/statsWidgets.md +636 -0
  96. package/dist/docs/components/statusBar.md +644 -0
  97. package/dist/docs/components/stepButton.md +61 -0
  98. package/dist/docs/components/steppedProgressBars.md +1064 -0
  99. package/dist/docs/components/subNavigation.md +470 -0
  100. package/dist/docs/components/supportMarker.md +115 -0
  101. package/dist/docs/components/svgImage.md +248 -0
  102. package/dist/docs/components/switch.md +554 -0
  103. package/dist/docs/components/tables.md +8 -0
  104. package/dist/docs/components/tagManager.md +476 -0
  105. package/dist/docs/components/tags.md +785 -0
  106. package/dist/docs/components/teaser.md +925 -0
  107. package/dist/docs/components/timeline.md +514 -0
  108. package/dist/docs/components/timepicker.md +262 -0
  109. package/dist/docs/components/toggleButton.md +178 -0
  110. package/dist/docs/components/tooltip.md +454 -0
  111. package/dist/docs/components/virtualList.md +486 -0
  112. package/dist/docs/foundations.md +20901 -0
  113. package/dist/docs/start/changelog.md +714 -0
  114. package/dist/docs/start/goodtoknow.md +14 -0
  115. package/dist/docs/start/guidelines/color-combinations.md +678 -0
  116. package/dist/docs/start/guidelines/custom-css.md +42 -0
  117. package/dist/docs/start/guidelines/custom-rioglyph.md +35 -0
  118. package/dist/docs/start/guidelines/formatting.md +587 -0
  119. package/dist/docs/start/guidelines/iframe.md +323 -0
  120. package/dist/docs/start/guidelines/obfuscate-data.md +30 -0
  121. package/dist/docs/start/guidelines/print-css.md +36 -0
  122. package/dist/docs/start/guidelines/spinner.md +710 -0
  123. package/dist/docs/start/guidelines/supported-browsers.md +10 -0
  124. package/dist/docs/start/guidelines/writing.md +635 -0
  125. package/dist/docs/start/howto.md +187 -0
  126. package/dist/docs/start/intro.md +43 -0
  127. package/dist/docs/start/responsiveness.md +98 -0
  128. package/dist/docs/templates/common-table.md +1111 -0
  129. package/dist/docs/templates/detail-views.md +942 -0
  130. package/dist/docs/templates/expandable-details.md +228 -0
  131. package/dist/docs/templates/feature-cards.md +549 -0
  132. package/dist/docs/templates/form-summary.md +199 -0
  133. package/dist/docs/templates/form-toggle.md +367 -0
  134. package/dist/docs/templates/list-blocks.md +1021 -0
  135. package/dist/docs/templates/loading-progress.md +109 -0
  136. package/dist/docs/templates/options-panel.md +152 -0
  137. package/dist/docs/templates/panel-variants.md +164 -0
  138. package/dist/docs/templates/progress-cards.md +607 -0
  139. package/dist/docs/templates/progress-success.md +142 -0
  140. package/dist/docs/templates/settings-form.md +434 -0
  141. package/dist/docs/templates/stats-blocks.md +1381 -0
  142. package/dist/docs/templates/table-panel.md +184 -0
  143. package/dist/docs/templates/table-row-animation.md +317 -0
  144. package/dist/docs/templates/usage-cards.md +227 -0
  145. package/dist/docs/utilities/deviceUtils.md +123 -0
  146. package/dist/docs/utilities/featureToggles.md +90 -0
  147. package/dist/docs/utilities/fuelTypeUtils.md +186 -0
  148. package/dist/docs/utilities/routeUtils.md +138 -0
  149. package/dist/docs/utilities/useAfterMount.md +66 -0
  150. package/dist/docs/utilities/useAutoAnimate.md +193 -0
  151. package/dist/docs/utilities/useAverage.md +95 -0
  152. package/dist/docs/utilities/useClickOutside.md +61 -0
  153. package/dist/docs/utilities/useClipboard.md +93 -0
  154. package/dist/docs/utilities/useCount.md +178 -0
  155. package/dist/docs/utilities/useDarkMode.md +49 -0
  156. package/dist/docs/utilities/useDebugInfo.md +126 -0
  157. package/dist/docs/utilities/useEffectOnce.md +58 -0
  158. package/dist/docs/utilities/useElapsedTime.md +58 -0
  159. package/dist/docs/utilities/useElementSize.md +71 -0
  160. package/dist/docs/utilities/useEsc.md +58 -0
  161. package/dist/docs/utilities/useEvent.md +64 -0
  162. package/dist/docs/utilities/useFocusTrap.md +85 -0
  163. package/dist/docs/utilities/useFullscreen.md +198 -0
  164. package/dist/docs/utilities/useHover.md +55 -0
  165. package/dist/docs/utilities/useIncomingPostMessages.md +237 -0
  166. package/dist/docs/utilities/useInterval.md +85 -0
  167. package/dist/docs/utilities/useIsFocusWithin.md +114 -0
  168. package/dist/docs/utilities/useKey.md +151 -0
  169. package/dist/docs/utilities/useLocalStorage.md +91 -0
  170. package/dist/docs/utilities/useLocationSuggestions.md +114 -0
  171. package/dist/docs/utilities/useMax.md +62 -0
  172. package/dist/docs/utilities/useMin.md +78 -0
  173. package/dist/docs/utilities/useMutationObserver.md +113 -0
  174. package/dist/docs/utilities/useOnScreen.md +138 -0
  175. package/dist/docs/utilities/useOnlineStatus.md +49 -0
  176. package/dist/docs/utilities/usePostMessage.md +117 -0
  177. package/dist/docs/utilities/usePostMessageSender.md +257 -0
  178. package/dist/docs/utilities/usePrevious.md +101 -0
  179. package/dist/docs/utilities/useResizeObserver.md +151 -0
  180. package/dist/docs/utilities/useScrollPosition.md +252 -0
  181. package/dist/docs/utilities/useSearch.md +228 -0
  182. package/dist/docs/utilities/useSorting.md +389 -0
  183. package/dist/docs/utilities/useStateWithValidation.md +83 -0
  184. package/dist/docs/utilities/useSum.md +155 -0
  185. package/dist/docs/utilities/useTableExport.md +404 -0
  186. package/dist/docs/utilities/useTableSelection.md +1120 -0
  187. package/dist/docs/utilities/useTimeout.md +55 -0
  188. package/dist/docs/utilities/useToggle.md +115 -0
  189. package/dist/docs/utilities/useWindowResize.md +70 -0
  190. package/dist/index.mjs +271 -0
  191. package/dist/search-synonyms.json +134 -0
  192. package/dist/version.json +4 -0
  193. package/package.json +23 -19
  194. package/bin/uikit-mcp.mjs +0 -23
  195. package/data/pages/Components/components/accentbar.json +0 -207
  196. package/data/pages/Components/components/activity.json +0 -87
  197. package/data/pages/Components/components/animatednumber.json +0 -99
  198. package/data/pages/Components/components/animations.json +0 -87
  199. package/data/pages/Components/components/appheader.json +0 -291
  200. package/data/pages/Components/components/applayout.json +0 -1198
  201. package/data/pages/Components/components/appnavigationbar.json +0 -327
  202. package/data/pages/Components/components/areacharts.json +0 -563
  203. package/data/pages/Components/components/aspectratioplaceholder.json +0 -75
  204. package/data/pages/Components/components/assettree.json +0 -3080
  205. package/data/pages/Components/components/autosuggests.json +0 -710
  206. package/data/pages/Components/components/avatar.json +0 -157
  207. package/data/pages/Components/components/banner.json +0 -599
  208. package/data/pages/Components/components/barcharts.json +0 -1507
  209. package/data/pages/Components/components/barlist.json +0 -223
  210. package/data/pages/Components/components/basicmap.json +0 -68
  211. package/data/pages/Components/components/bottomsheet.json +0 -601
  212. package/data/pages/Components/components/button.json +0 -583
  213. package/data/pages/Components/components/buttontoolbar.json +0 -63
  214. package/data/pages/Components/components/calendarstripe.json +0 -235
  215. package/data/pages/Components/components/card.json +0 -69
  216. package/data/pages/Components/components/carousel.json +0 -39
  217. package/data/pages/Components/components/chartcolors.json +0 -34
  218. package/data/pages/Components/components/chartsgettingstarted.json +0 -32
  219. package/data/pages/Components/components/chat.json +0 -39
  220. package/data/pages/Components/components/checkbox.json +0 -847
  221. package/data/pages/Components/components/clearableinput.json +0 -789
  222. package/data/pages/Components/components/collapse.json +0 -175
  223. package/data/pages/Components/components/composedcharts.json +0 -159
  224. package/data/pages/Components/components/contentloader.json +0 -233
  225. package/data/pages/Components/components/datatabs.json +0 -680
  226. package/data/pages/Components/components/datepickers.json +0 -287
  227. package/data/pages/Components/components/dialogs.json +0 -1492
  228. package/data/pages/Components/components/divider.json +0 -93
  229. package/data/pages/Components/components/dropdowns.json +0 -936
  230. package/data/pages/Components/components/editablecontent.json +0 -1117
  231. package/data/pages/Components/components/expander.json +0 -377
  232. package/data/pages/Components/components/fade.json +0 -403
  233. package/data/pages/Components/components/fadeexpander.json +0 -75
  234. package/data/pages/Components/components/fadeup.json +0 -127
  235. package/data/pages/Components/components/feedback.json +0 -269
  236. package/data/pages/Components/components/filepickers.json +0 -269
  237. package/data/pages/Components/components/formlabel.json +0 -115
  238. package/data/pages/Components/components/fullscreenmap.json +0 -22
  239. package/data/pages/Components/components/groupeditemlist.json +0 -323
  240. package/data/pages/Components/components/iconlist.json +0 -45
  241. package/data/pages/Components/components/imagepreloader.json +0 -81
  242. package/data/pages/Components/components/labeledelement.json +0 -75
  243. package/data/pages/Components/components/licenseplate.json +0 -69
  244. package/data/pages/Components/components/linecharts.json +0 -987
  245. package/data/pages/Components/components/listmenu.json +0 -313
  246. package/data/pages/Components/components/loadmore.json +0 -175
  247. package/data/pages/Components/components/mainnavigation.json +0 -39
  248. package/data/pages/Components/components/mapcircle.json +0 -34
  249. package/data/pages/Components/components/mapcluster.json +0 -51
  250. package/data/pages/Components/components/mapcontext.json +0 -105
  251. package/data/pages/Components/components/mapdraggablemarker.json +0 -34
  252. package/data/pages/Components/components/mapgettingstarted.json +0 -27
  253. package/data/pages/Components/components/mapgroup.json +0 -1198
  254. package/data/pages/Components/components/mapinfobubble.json +0 -34
  255. package/data/pages/Components/components/maplayergroup.json +0 -34
  256. package/data/pages/Components/components/mapmarker.json +0 -700
  257. package/data/pages/Components/components/mappolygon.json +0 -45
  258. package/data/pages/Components/components/maproute.json +0 -623
  259. package/data/pages/Components/components/maproutegenerator.json +0 -16
  260. package/data/pages/Components/components/mapsettings.json +0 -51
  261. package/data/pages/Components/components/maputils.json +0 -34
  262. package/data/pages/Components/components/multiselects.json +0 -1451
  263. package/data/pages/Components/components/nodata.json +0 -139
  264. package/data/pages/Components/components/notifications.json +0 -65
  265. package/data/pages/Components/components/numbercontrol.json +0 -301
  266. package/data/pages/Components/components/onboarding.json +0 -302
  267. package/data/pages/Components/components/page.json +0 -197
  268. package/data/pages/Components/components/pager.json +0 -93
  269. package/data/pages/Components/components/piecharts.json +0 -731
  270. package/data/pages/Components/components/popover.json +0 -251
  271. package/data/pages/Components/components/position.json +0 -69
  272. package/data/pages/Components/components/radialbarcharts.json +0 -1304
  273. package/data/pages/Components/components/radiobutton.json +0 -1105
  274. package/data/pages/Components/components/releasenotes.json +0 -44
  275. package/data/pages/Components/components/resizer.json +0 -93
  276. package/data/pages/Components/components/responsivecolumnstripe.json +0 -123
  277. package/data/pages/Components/components/responsivevideo.json +0 -75
  278. package/data/pages/Components/components/rioglyph.json +0 -93
  279. package/data/pages/Components/components/rules.json +0 -410
  280. package/data/pages/Components/components/saveableinput.json +0 -703
  281. package/data/pages/Components/components/selects.json +0 -701
  282. package/data/pages/Components/components/sidebar.json +0 -243
  283. package/data/pages/Components/components/sliders.json +0 -235
  284. package/data/pages/Components/components/smoothscrollbars.json +0 -335
  285. package/data/pages/Components/components/spinners.json +0 -343
  286. package/data/pages/Components/components/states.json +0 -1705
  287. package/data/pages/Components/components/statswidgets.json +0 -314
  288. package/data/pages/Components/components/statusbar.json +0 -177
  289. package/data/pages/Components/components/stepbutton.json +0 -57
  290. package/data/pages/Components/components/steppedprogressbars.json +0 -417
  291. package/data/pages/Components/components/subnavigation.json +0 -107
  292. package/data/pages/Components/components/supportmarker.json +0 -45
  293. package/data/pages/Components/components/svgimage.json +0 -81
  294. package/data/pages/Components/components/switch.json +0 -111
  295. package/data/pages/Components/components/tables.json +0 -144
  296. package/data/pages/Components/components/tagmanager.json +0 -86
  297. package/data/pages/Components/components/tags.json +0 -146
  298. package/data/pages/Components/components/teaser.json +0 -188
  299. package/data/pages/Components/components/timeline.json +0 -45
  300. package/data/pages/Components/components/timepicker.json +0 -163
  301. package/data/pages/Components/components/togglebutton.json +0 -247
  302. package/data/pages/Components/components/tooltip.json +0 -270
  303. package/data/pages/Components/components/virtuallist.json +0 -175
  304. package/data/pages/Foundations/foundations.json +0 -2475
  305. package/data/pages/Getting-started/start/changelog.json +0 -22
  306. package/data/pages/Getting-started/start/goodtoknow.json +0 -32
  307. package/data/pages/Getting-started/start/guidelines/color-combinations.json +0 -58
  308. package/data/pages/Getting-started/start/guidelines/custom-css.json +0 -27
  309. package/data/pages/Getting-started/start/guidelines/custom-rioglyph.json +0 -22
  310. package/data/pages/Getting-started/start/guidelines/formatting.json +0 -97
  311. package/data/pages/Getting-started/start/guidelines/iframe.json +0 -93
  312. package/data/pages/Getting-started/start/guidelines/obfuscate-data.json +0 -22
  313. package/data/pages/Getting-started/start/guidelines/print-css.json +0 -37
  314. package/data/pages/Getting-started/start/guidelines/spinner.json +0 -144
  315. package/data/pages/Getting-started/start/guidelines/supported-browsers.json +0 -22
  316. package/data/pages/Getting-started/start/guidelines/writing.json +0 -242
  317. package/data/pages/Getting-started/start/howto.json +0 -72
  318. package/data/pages/Getting-started/start/intro.json +0 -37
  319. package/data/pages/Getting-started/start/responsiveness.json +0 -52
  320. package/data/pages/Templates/templates/common-table.json +0 -39
  321. package/data/pages/Templates/templates/detail-views.json +0 -71
  322. package/data/pages/Templates/templates/expandable-details.json +0 -39
  323. package/data/pages/Templates/templates/feature-cards.json +0 -103
  324. package/data/pages/Templates/templates/form-summary.json +0 -39
  325. package/data/pages/Templates/templates/form-toggle.json +0 -39
  326. package/data/pages/Templates/templates/list-blocks.json +0 -119
  327. package/data/pages/Templates/templates/loading-progress.json +0 -39
  328. package/data/pages/Templates/templates/options-panel.json +0 -39
  329. package/data/pages/Templates/templates/panel-variants.json +0 -39
  330. package/data/pages/Templates/templates/progress-cards.json +0 -71
  331. package/data/pages/Templates/templates/progress-success.json +0 -39
  332. package/data/pages/Templates/templates/settings-form.json +0 -39
  333. package/data/pages/Templates/templates/stats-blocks.json +0 -135
  334. package/data/pages/Templates/templates/table-panel.json +0 -39
  335. package/data/pages/Templates/templates/table-row-animation.json +0 -39
  336. package/data/pages/Templates/templates/usage-cards.json +0 -39
  337. package/data/pages/Utilities/utilities/deviceutils.json +0 -39
  338. package/data/pages/Utilities/utilities/featuretoggles.json +0 -42
  339. package/data/pages/Utilities/utilities/fueltypeutils.json +0 -118
  340. package/data/pages/Utilities/utilities/routeutils.json +0 -34
  341. package/data/pages/Utilities/utilities/useaftermount.json +0 -63
  342. package/data/pages/Utilities/utilities/useaverage.json +0 -86
  343. package/data/pages/Utilities/utilities/useclickoutside.json +0 -69
  344. package/data/pages/Utilities/utilities/useclipboard.json +0 -57
  345. package/data/pages/Utilities/utilities/usecount.json +0 -92
  346. package/data/pages/Utilities/utilities/usedarkmode.json +0 -50
  347. package/data/pages/Utilities/utilities/usedebuginfo.json +0 -63
  348. package/data/pages/Utilities/utilities/useeffectonce.json +0 -57
  349. package/data/pages/Utilities/utilities/useelapsedtime.json +0 -57
  350. package/data/pages/Utilities/utilities/useelementsize.json +0 -63
  351. package/data/pages/Utilities/utilities/useesc.json +0 -57
  352. package/data/pages/Utilities/utilities/useevent.json +0 -75
  353. package/data/pages/Utilities/utilities/usefocustrap.json +0 -57
  354. package/data/pages/Utilities/utilities/usefullscreen.json +0 -197
  355. package/data/pages/Utilities/utilities/usehover.json +0 -57
  356. package/data/pages/Utilities/utilities/useinterval.json +0 -63
  357. package/data/pages/Utilities/utilities/useisfocuswithin.json +0 -75
  358. package/data/pages/Utilities/utilities/usekey.json +0 -75
  359. package/data/pages/Utilities/utilities/uselocalstorage.json +0 -69
  360. package/data/pages/Utilities/utilities/uselocationsuggestions.json +0 -110
  361. package/data/pages/Utilities/utilities/usemax.json +0 -86
  362. package/data/pages/Utilities/utilities/usemin.json +0 -86
  363. package/data/pages/Utilities/utilities/usemutationobserver.json +0 -69
  364. package/data/pages/Utilities/utilities/useonlinestatus.json +0 -39
  365. package/data/pages/Utilities/utilities/useonscreen.json +0 -63
  366. package/data/pages/Utilities/utilities/usepostmessage.json +0 -80
  367. package/data/pages/Utilities/utilities/useprevious.json +0 -63
  368. package/data/pages/Utilities/utilities/useresizeobserver.json +0 -65
  369. package/data/pages/Utilities/utilities/usescrollposition.json +0 -103
  370. package/data/pages/Utilities/utilities/usesearch.json +0 -197
  371. package/data/pages/Utilities/utilities/usesorting.json +0 -139
  372. package/data/pages/Utilities/utilities/usestatewithvalidation.json +0 -69
  373. package/data/pages/Utilities/utilities/usesum.json +0 -86
  374. package/data/pages/Utilities/utilities/usetableexport.json +0 -87
  375. package/data/pages/Utilities/utilities/usetableselection.json +0 -311
  376. package/data/pages/Utilities/utilities/usetimeout.json +0 -63
  377. package/data/pages/Utilities/utilities/usetoggle.json +0 -75
  378. package/data/pages/Utilities/utilities/usewindowresize.json +0 -63
  379. package/data/version.json +0 -4
  380. package/docs/content-schema.md +0 -147
  381. package/docs/navigation-inventory.json +0 -1310
  382. package/docs/search-synonyms.json +0 -43
  383. package/server/index.mjs +0 -268
  384. package/server/lib/load-docs.mjs +0 -48
  385. package/server/lib/normalise-doc.mjs +0 -220
  386. package/server/lib/render-markdown.mjs +0 -82
  387. package/server/lib/search-index.mjs +0 -49
  388. package/server/lib/types.js +0 -99
@@ -0,0 +1,1721 @@
1
+ # SaveableInput
2
+
3
+ *Category:* Components
4
+ *Section:* Interaction
5
+ *Source:* https://uikit.developers.rio.cloud/#components/saveableInput
6
+ *Captured:* 2025-12-12T14:20:22.845Z
7
+
8
+ ## SaveableInput
9
+
10
+ ### Example: SaveableInput
11
+
12
+ SaveableInput
13
+
14
+ SaveableInput with value
15
+
16
+ SaveableInput with previous value
17
+ Dolor sit amet
18
+
19
+ SaveableInput with fixed previous value
20
+ You shall not pass
21
+
22
+ SaveableInput with default button style
23
+
24
+ SaveableInput with unit and icon
25
+ Pcs
26
+
27
+ SaveableInput with feedback
28
+ Lab
29
+
30
+ This is an error message
31
+
32
+ Disabled SaveableInput
33
+
34
+ #### Summary
35
+
36
+ SaveableInput
37
+
38
+ SaveableInput with value
39
+
40
+ SaveableInput with previous value
41
+ Dolor sit amet
42
+
43
+ SaveableInput with fixed previous value
44
+ You shall not pass
45
+
46
+ SaveableInput with default button style
47
+
48
+ SaveableInput with unit and icon
49
+ Pcs
50
+
51
+ SaveableInput with feedback
52
+ Lab
53
+
54
+ This is an error message
55
+
56
+ Disabled SaveableInput
57
+
58
+ #### React (tsx)
59
+
60
+ ```tsx
61
+ import SaveableInput from '@rio-cloud/rio-uikit/SaveableInput';
62
+ import FormLabel from '@rio-cloud/rio-uikit/FormLabel';
63
+
64
+ export default () => (
65
+ <div>
66
+ <div className='display-grid grid-cols-3-md grid-cols-2-xs gap-20'>
67
+ <div>
68
+ <FormLabel>SaveableInput</FormLabel>
69
+ <SaveableInput placeholder='Some value comes here' />
70
+ </div>
71
+
72
+ <div>
73
+ <FormLabel>SaveableInput with value</FormLabel>
74
+ <SaveableInput value='Lorem ipsum' />
75
+ </div>
76
+
77
+ <div>
78
+ <FormLabel>SaveableInput with previous value</FormLabel>
79
+ <SaveableInput value='Lorem ipsum' previousValue='Dolor sit amet' />
80
+ </div>
81
+
82
+ <div>
83
+ <FormLabel>SaveableInput with fixed previous value</FormLabel>
84
+ <SaveableInput value='Lorem ipsum' fixedPreviousValue='You shall not pass' />
85
+ </div>
86
+
87
+ <div>
88
+ <FormLabel>SaveableInput with default button style</FormLabel>
89
+ <SaveableInput value='Lorem ipsum' buttonStyle='default' inputProps={{ id: 'some-id ' }} />
90
+ </div>
91
+
92
+ <div>
93
+ <FormLabel>SaveableInput with unit and icon</FormLabel>
94
+ <SaveableInput
95
+ value='145'
96
+ buttonStyle='default'
97
+ icon='rioglyph-parcel'
98
+ unit='Pcs'
99
+ className='max-width-150'
100
+ />
101
+ </div>
102
+
103
+ <div>
104
+ <FormLabel>SaveableInput with feedback</FormLabel>
105
+ <div className='form-group'>
106
+ <SaveableInput
107
+ value='Lorem ipsum'
108
+ icon='rioglyph-factory'
109
+ unit='Lab'
110
+ className='margin-0'
111
+ isValid={false}
112
+ errorMessage='This is an error message'
113
+ />
114
+ </div>
115
+ </div>
116
+
117
+ <div>
118
+ <FormLabel>Disabled SaveableInput</FormLabel>
119
+ <SaveableInput value='Lorem ipsum' disabled />
120
+ </div>
121
+ </div>
122
+ </div>
123
+ );
124
+ ```
125
+
126
+ #### HTML (html)
127
+
128
+ ```html
129
+ <div>
130
+ <div class="display-grid grid-cols-3-md grid-cols-2-xs gap-20">
131
+ <div>
132
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput</div>
133
+ <div class="form-group">
134
+ <div class="input-group">
135
+ <input type="text" placeholder="Some value comes here" class="form-control" disabled="" value="">
136
+ <div class="input-group-btn">
137
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
138
+ <span class="rioglyph rioglyph-pencil">
139
+ </span>
140
+ </button>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </div>
145
+ <div>
146
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with value</div>
147
+ <div class="form-group">
148
+ <div class="input-group">
149
+ <input type="text" class="form-control" disabled="" value="Lorem ipsum">
150
+ <div class="input-group-btn">
151
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
152
+ <span class="rioglyph rioglyph-pencil">
153
+ </span>
154
+ </button>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ <div>
160
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with previous value</div>
161
+ <div class="form-group">
162
+ <div class="input-group">
163
+ <input type="text" class="form-control padding-bottom-0 padding-top-10 text-size-12" disabled="" value="Lorem ipsum">
164
+ <div class="position-absolute top-2 left-10 margin-left-3 text-size-10 text-decoration-line-through" aria-label="previous value">Dolor sit amet</div>
165
+ <div class="input-group-btn">
166
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
167
+ <span class="rioglyph rioglyph-pencil">
168
+ </span>
169
+ </button>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ <div>
175
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with fixed previous value</div>
176
+ <div class="form-group">
177
+ <div class="input-group">
178
+ <input type="text" class="form-control padding-bottom-0 padding-top-10 text-size-12" disabled="" value="Lorem ipsum">
179
+ <div class="position-absolute top-2 left-10 margin-left-3 text-size-10 text-decoration-line-through" aria-label="previous value">You shall not pass</div>
180
+ <div class="input-group-btn">
181
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
182
+ <span class="rioglyph rioglyph-pencil">
183
+ </span>
184
+ </button>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ <div>
190
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with default button style</div>
191
+ <div class="form-group">
192
+ <div class="input-group">
193
+ <input type="text" class="form-control" disabled="" id="some-id " value="Lorem ipsum">
194
+ <div class="input-group-btn">
195
+ <button type="button" class="btn btn-default btn-icon-only btn-component" tabindex="0">
196
+ <span class="rioglyph rioglyph-pencil">
197
+ </span>
198
+ </button>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ <div>
204
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with unit and icon</div>
205
+ <div class="form-group max-width-150">
206
+ <div class="input-group">
207
+ <span class="input-group-addon">
208
+ <span class="rioglyph rioglyph-parcel" aria-hidden="true" aria-label="input icon">
209
+ </span>
210
+ </span>
211
+ <input type="text" class="form-control padding-right-50" disabled="" value="145">
212
+ <div class="position-absolute right-0 margin-right-50" aria-label="unit">Pcs</div>
213
+ <div class="input-group-btn">
214
+ <button type="button" class="btn btn-default btn-icon-only btn-component" tabindex="0">
215
+ <span class="rioglyph rioglyph-pencil">
216
+ </span>
217
+ </button>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ <div>
223
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableInput with feedback</div>
224
+ <div class="form-group">
225
+ <div class="form-group has-feedback has-error margin-0">
226
+ <div class="input-group">
227
+ <span class="input-group-addon">
228
+ <span class="rioglyph rioglyph-factory" aria-hidden="true" aria-label="input icon">
229
+ </span>
230
+ </span>
231
+ <input type="text" class="form-control padding-right-50" disabled="" value="Lorem ipsum">
232
+ <div class="position-absolute right-0 margin-right-50" aria-label="unit">Lab</div>
233
+ <div class="input-group-btn">
234
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
235
+ <span class="rioglyph rioglyph-pencil">
236
+ </span>
237
+ </button>
238
+ </div>
239
+ </div>
240
+ <span class="help-block z-index-max">
241
+ <span>This is an error message</span>
242
+ </span>
243
+ </div>
244
+ </div>
245
+ </div>
246
+ <div>
247
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Disabled SaveableInput</div>
248
+ <div class="form-group">
249
+ <div class="input-group">
250
+ <input type="text" class="form-control" disabled="" value="Lorem ipsum">
251
+ <div class="input-group-btn">
252
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" disabled="" tabindex="0">
253
+ <span class="rioglyph rioglyph-pencil">
254
+ </span>
255
+ </button>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ </div>
261
+ </div>
262
+ ```
263
+
264
+ #### Props
265
+
266
+ | Name | Type | Default | Description |
267
+ | --- | --- | --- | --- |
268
+ | placeholder | String | — | The input placeholder. |
269
+ | value | String | — | The actual input value. |
270
+ | previousValue | string | — | The previous or old value shown above the input value. This value changes when a new input value is accepted. |
271
+ | isValid | string | — | Used to control the save button from the outside to disable it in case the entered value is not valid. |
272
+ | errorMessage | string \| ReactNode | — | Uses the built-in error handling. This is the error message that is shown below the input. It will be shown when the "isValid" prop is set to false. |
273
+ | hideErrorIcon | boolean | false | Defines wether the error icon is shown or not. If enabled, it will be shown when the "isValid" prop is set to false. |
274
+ | fixedPreviousValue | string | — | The previous or old value shown above the input value. This value will not be changed for new input values. |
275
+ | buttonStyle | string | primary | Defines the button style: default or primary. |
276
+ | inputProps | Attributes | — | Additional HTML attributes to be set on the input element. |
277
+ | icon | string | — | Icon class name that shall be used. If defined, the input element is wrapped in an input-group and the icon will be set in an input-addon. Example: `rioglyph-search`. |
278
+ | unit | String \| ReactNode | — | Adds a given unit to the input. |
279
+ | disabled | boolean | false | Disables the component so the user cannot enter the edit mode. |
280
+ | onValueChanged | (value: string, previousValue: string) | — | Callback function triggered when the value changes. |
281
+ | onInputChange | (keyValue: string, inputValue: string) => void | — | Callback function that gets triggered on every input change. Use this to control the component or when implementing key validation. |
282
+ | onEsc | VoidFunction | — | Callback function that gets triggered when the user aborts the edit mode. Use this to control the component and handle the resetting of previous value on the outside. |
283
+ | onEnterEdit | VoidFunction | — | Callback function that gets triggered when the input is in edit mode. Use this to control the component dna to handle the previous value on the outside. |
284
+ | inputClassName | String | — | Additional classes to be set on the input itself. |
285
+ | className | String | — | Additional classes to be set on the wrapper element. |
286
+
287
+ ### Example: Example 2
288
+
289
+ With error feedback and disabled save button
290
+
291
+ #### Summary
292
+
293
+ With error feedback and disabled save button
294
+
295
+ #### React (tsx)
296
+
297
+ ```tsx
298
+ import { useState } from 'react';
299
+
300
+ import SaveableInput from '@rio-cloud/rio-uikit/SaveableInput';
301
+
302
+ export default () => {
303
+ const [previousValue, setPreviousValue] = useState('');
304
+ const [backupValue, setBackupValue] = useState('');
305
+ const [value, setValue] = useState('Remove this value');
306
+
307
+ // When the user "saves" the entered value, we update the current and the previous value
308
+ const handleValueChanged = (newValue: string, oldValue: string) => {
309
+ setPreviousValue(oldValue);
310
+ setValue(newValue);
311
+ };
312
+
313
+ // Used to do some custom validation here...
314
+ const handleInputChange = (keyValue: string, inputValue: string) => {
315
+ setValue(inputValue);
316
+ };
317
+
318
+ // As we control the current and previous value outside the component, whe need to keep
319
+ // the previous value around to restore it when the user aborts the edit with "esc", otherwise
320
+ // the previous value is already overwritten and changed
321
+ const handleEnterEditMode = () => {
322
+ setBackupValue(previousValue);
323
+ setPreviousValue(value);
324
+ };
325
+
326
+ // Restore the current and previous value when the user aborts the edit
327
+ const handleEsc = () => {
328
+ setValue(previousValue);
329
+ setPreviousValue(backupValue);
330
+ };
331
+
332
+ const hasValidInput = !!value;
333
+
334
+ return (
335
+ <div className='max-width-300'>
336
+ <label>With error feedback and disabled save button</label>
337
+ <div className='form-group'>
338
+ <SaveableInput
339
+ icon='rioglyph-factory'
340
+ value={value}
341
+ onValueChanged={handleValueChanged}
342
+ onInputChange={handleInputChange}
343
+ onEnterEdit={handleEnterEditMode}
344
+ onEsc={handleEsc}
345
+ isValid={hasValidInput}
346
+ className='margin-0'
347
+ errorMessage='Please enter something'
348
+ hideErrorIcon
349
+ />
350
+ </div>
351
+ </div>
352
+ );
353
+ };
354
+ ```
355
+
356
+ #### HTML (html)
357
+
358
+ ```html
359
+ <div class="max-width-300">
360
+ <label>With error feedback and disabled save button</label>
361
+ <div class="form-group">
362
+ <div class="form-group margin-0">
363
+ <div class="input-group">
364
+ <span class="input-group-addon">
365
+ <span class="rioglyph rioglyph-factory" aria-hidden="true" aria-label="input icon">
366
+ </span>
367
+ </span>
368
+ <input type="text" class="form-control" disabled="" value="Remove this value">
369
+ <div class="input-group-btn">
370
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
371
+ <span class="rioglyph rioglyph-pencil">
372
+ </span>
373
+ </button>
374
+ </div>
375
+ </div>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ ```
380
+
381
+ #### Props
382
+
383
+ | Name | Type | Default | Description |
384
+ | --- | --- | --- | --- |
385
+ | placeholder | String | — | The input placeholder. |
386
+ | value | String | — | The actual input value. |
387
+ | previousValue | string | — | The previous or old value shown above the input value. This value changes when a new input value is accepted. |
388
+ | isValid | string | — | Used to control the save button from the outside to disable it in case the entered value is not valid. |
389
+ | errorMessage | string \| ReactNode | — | Uses the built-in error handling. This is the error message that is shown below the input. It will be shown when the "isValid" prop is set to false. |
390
+ | hideErrorIcon | boolean | false | Defines wether the error icon is shown or not. If enabled, it will be shown when the "isValid" prop is set to false. |
391
+ | fixedPreviousValue | string | — | The previous or old value shown above the input value. This value will not be changed for new input values. |
392
+ | buttonStyle | string | primary | Defines the button style: default or primary. |
393
+ | inputProps | Attributes | — | Additional HTML attributes to be set on the input element. |
394
+ | icon | string | — | Icon class name that shall be used. If defined, the input element is wrapped in an input-group and the icon will be set in an input-addon. Example: `rioglyph-search`. |
395
+ | unit | String \| ReactNode | — | Adds a given unit to the input. |
396
+ | disabled | boolean | false | Disables the component so the user cannot enter the edit mode. |
397
+ | onValueChanged | (value: string, previousValue: string) | — | Callback function triggered when the value changes. |
398
+ | onInputChange | (keyValue: string, inputValue: string) => void | — | Callback function that gets triggered on every input change. Use this to control the component or when implementing key validation. |
399
+ | onEsc | VoidFunction | — | Callback function that gets triggered when the user aborts the edit mode. Use this to control the component and handle the resetting of previous value on the outside. |
400
+ | onEnterEdit | VoidFunction | — | Callback function that gets triggered when the input is in edit mode. Use this to control the component dna to handle the previous value on the outside. |
401
+ | inputClassName | String | — | Additional classes to be set on the input itself. |
402
+ | className | String | — | Additional classes to be set on the wrapper element. |
403
+
404
+ ### Example: Controlled SaveableInput
405
+
406
+ Controlled SaveableInput
407
+
408
+ Randomize valuesClear values
409
+
410
+ {
411
+ value: '',
412
+ previousValue: ''
413
+ }
414
+
415
+ #### Summary
416
+
417
+ Controlled SaveableInput
418
+
419
+ Randomize valuesClear values
420
+
421
+ {
422
+ value: '',
423
+ previousValue: ''
424
+ }
425
+
426
+ #### React (tsx)
427
+
428
+ ```tsx
429
+ import { useState } from 'react';
430
+
431
+ import SaveableInput from '@rio-cloud/rio-uikit/SaveableInput';
432
+ import Button from '@rio-cloud/rio-uikit/Button';
433
+ import FormLabel from '@rio-cloud/rio-uikit/FormLabel';
434
+
435
+ const getRandomString = () => (Math.random() + 1).toString(36).toUpperCase().substring(2);
436
+
437
+ export default () => {
438
+ const [previousValue, setPreviousValue] = useState('');
439
+ const [value, setValue] = useState('');
440
+
441
+ const handleValueChanged = (newValue: string) => {
442
+ setPreviousValue(value);
443
+ setValue(newValue);
444
+ };
445
+
446
+ return (
447
+ <div>
448
+ <div className='display-grid grid-cols-3-md grid-cols-2-xs gap-20'>
449
+ <div>
450
+ <FormLabel>Controlled SaveableInput</FormLabel>
451
+ <SaveableInput
452
+ placeholder='Some value comes here'
453
+ value={value}
454
+ previousValue={previousValue}
455
+ onValueChanged={handleValueChanged}
456
+ />
457
+ </div>
458
+ <div className='grid-colspan-2 margin-top-25 btn-toolbar'>
459
+ <Button
460
+ onClick={() => {
461
+ setPreviousValue(getRandomString());
462
+ setValue(getRandomString());
463
+ }}
464
+ >
465
+ Randomize values
466
+ </Button>
467
+
468
+ <Button
469
+ onClick={() => {
470
+ setPreviousValue('');
471
+ setValue('');
472
+ }}
473
+ >
474
+ Clear values
475
+ </Button>
476
+ </div>
477
+ </div>
478
+ <div className='margin-top-10 text-italic text-size-11'>
479
+ <pre>{`{
480
+ value: '${value}',
481
+ previousValue: '${previousValue}'
482
+ }`}</pre>
483
+ </div>
484
+ </div>
485
+ );
486
+ };
487
+ ```
488
+
489
+ #### HTML (html)
490
+
491
+ ```html
492
+ <div>
493
+ <div class="display-grid grid-cols-3-md grid-cols-2-xs gap-20">
494
+ <div>
495
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Controlled SaveableInput</div>
496
+ <div class="form-group">
497
+ <div class="input-group">
498
+ <input type="text" placeholder="Some value comes here" class="form-control" disabled="" value="">
499
+ <div class="input-group-btn">
500
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
501
+ <span class="rioglyph rioglyph-pencil">
502
+ </span>
503
+ </button>
504
+ </div>
505
+ </div>
506
+ </div>
507
+ </div>
508
+ <div class="grid-colspan-2 margin-top-25 btn-toolbar">
509
+ <button type="button" class="btn btn-default btn-component" tabindex="0">Randomize values</button>
510
+ <button type="button" class="btn btn-default btn-component" tabindex="0">Clear values</button>
511
+ </div>
512
+ </div>
513
+ <div class="margin-top-10 text-italic text-size-11">
514
+ <pre>{
515
+ value: '',
516
+ previousValue: ''
517
+ }</pre>
518
+ </div>
519
+ </div>
520
+ ```
521
+
522
+ #### Props
523
+
524
+ | Name | Type | Default | Description |
525
+ | --- | --- | --- | --- |
526
+ | placeholder | String | — | The input placeholder. |
527
+ | value | String | — | The actual input value. |
528
+ | previousValue | string | — | The previous or old value shown above the input value. This value changes when a new input value is accepted. |
529
+ | isValid | string | — | Used to control the save button from the outside to disable it in case the entered value is not valid. |
530
+ | errorMessage | string \| ReactNode | — | Uses the built-in error handling. This is the error message that is shown below the input. It will be shown when the "isValid" prop is set to false. |
531
+ | hideErrorIcon | boolean | false | Defines wether the error icon is shown or not. If enabled, it will be shown when the "isValid" prop is set to false. |
532
+ | fixedPreviousValue | string | — | The previous or old value shown above the input value. This value will not be changed for new input values. |
533
+ | buttonStyle | string | primary | Defines the button style: default or primary. |
534
+ | inputProps | Attributes | — | Additional HTML attributes to be set on the input element. |
535
+ | icon | string | — | Icon class name that shall be used. If defined, the input element is wrapped in an input-group and the icon will be set in an input-addon. Example: `rioglyph-search`. |
536
+ | unit | String \| ReactNode | — | Adds a given unit to the input. |
537
+ | disabled | boolean | false | Disables the component so the user cannot enter the edit mode. |
538
+ | onValueChanged | (value: string, previousValue: string) | — | Callback function triggered when the value changes. |
539
+ | onInputChange | (keyValue: string, inputValue: string) => void | — | Callback function that gets triggered on every input change. Use this to control the component or when implementing key validation. |
540
+ | onEsc | VoidFunction | — | Callback function that gets triggered when the user aborts the edit mode. Use this to control the component and handle the resetting of previous value on the outside. |
541
+ | onEnterEdit | VoidFunction | — | Callback function that gets triggered when the input is in edit mode. Use this to control the component dna to handle the previous value on the outside. |
542
+ | inputClassName | String | — | Additional classes to be set on the input itself. |
543
+ | className | String | — | Additional classes to be set on the wrapper element. |
544
+
545
+ ### Example: Controlled SaveableInput with key validation
546
+
547
+ Controlled SaveableInput with key validation
548
+ Pcs
549
+
550
+ {
551
+ value: '0',
552
+ previousValue: ''
553
+ }
554
+
555
+ #### Summary
556
+
557
+ Controlled SaveableInput with key validation
558
+ Pcs
559
+
560
+ {
561
+ value: '0',
562
+ previousValue: ''
563
+ }
564
+
565
+ #### React (tsx)
566
+
567
+ ```tsx
568
+ import { useState } from 'react';
569
+
570
+ import SaveableInput from '@rio-cloud/rio-uikit/SaveableInput';
571
+ import FormLabel from '@rio-cloud/rio-uikit/FormLabel';
572
+
573
+ export default () => {
574
+ const [previousValue, setPreviousValue] = useState('');
575
+ const [backupValue, setBackupValue] = useState('');
576
+ const [value, setValue] = useState('0');
577
+
578
+ // When the user "saves" the entered value, we update the current and the previous value
579
+ const handleValueChanged = (newValue: string, oldValue: string) => {
580
+ setPreviousValue(oldValue);
581
+ setValue(newValue);
582
+ };
583
+
584
+ // Used to do some custom validation here...
585
+ const handleInputChange = (keyValue: string, inputValue: string) => {
586
+ console.log({ keyValue, inputValue });
587
+
588
+ const parsedValue = Number.parseFloat(keyValue);
589
+ if (keyValue !== '' && Number.isNaN(parsedValue)) {
590
+ console.log('Not a valid number: ', keyValue);
591
+ } else {
592
+ console.log('Valid number entered:', parsedValue);
593
+ setValue(inputValue);
594
+ }
595
+ };
596
+
597
+ // As we control the current and previous value outside the component, whe need to keep
598
+ // the previous value around to restore it when the user aborts the edit with "esc", otherwise
599
+ // the previous value is already overwritten and changed
600
+ const handleEnterEditMode = () => {
601
+ setBackupValue(previousValue);
602
+ setPreviousValue(value);
603
+ };
604
+
605
+ // Restore the current and previous value when the user aborts the edit
606
+ const handleEsc = () => {
607
+ setValue(previousValue);
608
+ setPreviousValue(backupValue);
609
+ };
610
+
611
+ return (
612
+ <div>
613
+ <div className='display-grid grid-cols-3-md grid-cols-2-xs gap-20'>
614
+ <div>
615
+ <FormLabel>Controlled SaveableInput with key validation</FormLabel>
616
+ <SaveableInput
617
+ unit='Pcs'
618
+ value={value}
619
+ previousValue={previousValue}
620
+ onValueChanged={handleValueChanged}
621
+ onInputChange={handleInputChange}
622
+ onEsc={handleEsc}
623
+ onEnterEdit={handleEnterEditMode}
624
+ className='max-width-200'
625
+ />
626
+ </div>
627
+ </div>
628
+ <div className='margin-top-10 text-italic text-size-11'>
629
+ <pre>{`{
630
+ value: '${value}',
631
+ previousValue: '${previousValue}'
632
+ }`}</pre>
633
+ </div>
634
+ </div>
635
+ );
636
+ };
637
+ ```
638
+
639
+ #### HTML (html)
640
+
641
+ ```html
642
+ <div>
643
+ <div class="display-grid grid-cols-3-md grid-cols-2-xs gap-20">
644
+ <div>
645
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Controlled SaveableInput with key validation</div>
646
+ <div class="form-group max-width-200">
647
+ <div class="input-group">
648
+ <input type="text" class="form-control padding-right-50" disabled="" value="0">
649
+ <div class="position-absolute right-0 margin-right-50" aria-label="unit">Pcs</div>
650
+ <div class="input-group-btn">
651
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
652
+ <span class="rioglyph rioglyph-pencil">
653
+ </span>
654
+ </button>
655
+ </div>
656
+ </div>
657
+ </div>
658
+ </div>
659
+ </div>
660
+ <div class="margin-top-10 text-italic text-size-11">
661
+ <pre>{
662
+ value: '0',
663
+ previousValue: ''
664
+ }</pre>
665
+ </div>
666
+ </div>
667
+ ```
668
+
669
+ #### Props
670
+
671
+ | Name | Type | Default | Description |
672
+ | --- | --- | --- | --- |
673
+ | placeholder | String | — | The input placeholder. |
674
+ | value | String | — | The actual input value. |
675
+ | previousValue | string | — | The previous or old value shown above the input value. This value changes when a new input value is accepted. |
676
+ | isValid | string | — | Used to control the save button from the outside to disable it in case the entered value is not valid. |
677
+ | errorMessage | string \| ReactNode | — | Uses the built-in error handling. This is the error message that is shown below the input. It will be shown when the "isValid" prop is set to false. |
678
+ | hideErrorIcon | boolean | false | Defines wether the error icon is shown or not. If enabled, it will be shown when the "isValid" prop is set to false. |
679
+ | fixedPreviousValue | string | — | The previous or old value shown above the input value. This value will not be changed for new input values. |
680
+ | buttonStyle | string | primary | Defines the button style: default or primary. |
681
+ | inputProps | Attributes | — | Additional HTML attributes to be set on the input element. |
682
+ | icon | string | — | Icon class name that shall be used. If defined, the input element is wrapped in an input-group and the icon will be set in an input-addon. Example: `rioglyph-search`. |
683
+ | unit | String \| ReactNode | — | Adds a given unit to the input. |
684
+ | disabled | boolean | false | Disables the component so the user cannot enter the edit mode. |
685
+ | onValueChanged | (value: string, previousValue: string) | — | Callback function triggered when the value changes. |
686
+ | onInputChange | (keyValue: string, inputValue: string) => void | — | Callback function that gets triggered on every input change. Use this to control the component or when implementing key validation. |
687
+ | onEsc | VoidFunction | — | Callback function that gets triggered when the user aborts the edit mode. Use this to control the component and handle the resetting of previous value on the outside. |
688
+ | onEnterEdit | VoidFunction | — | Callback function that gets triggered when the input is in edit mode. Use this to control the component dna to handle the previous value on the outside. |
689
+ | inputClassName | String | — | Additional classes to be set on the input itself. |
690
+ | className | String | — | Additional classes to be set on the wrapper element. |
691
+
692
+ ## SaveableDateInput
693
+
694
+ ### Example: SaveableDateInput (uncontrolled)
695
+
696
+ SaveableDateInput (uncontrolled)
697
+
698
+ ‹December 2025›
699
+ SuMoTuWeThFrSa
700
+
701
+ 30123456
702
+ 78910111213
703
+ 14151617181920
704
+ 21222324252627
705
+ 28293031123
706
+ 45678910
707
+
708
+ Controlled - Stay open on invalid (default)
709
+
710
+ ‹December 2025›
711
+ SuMoTuWeThFrSa
712
+
713
+ 30123456
714
+ 78910111213
715
+ 14151617181920
716
+ 21222324252627
717
+ 28293031123
718
+ 45678910
719
+
720
+ 03:20
721
+
722
+ Saved value:
723
+
724
+ Controlled - With error
725
+
726
+ ‹December 2025›
727
+ SuMoTuWeThFrSa
728
+
729
+ 30123456
730
+ 78910111213
731
+ 14151617181920
732
+ 21222324252627
733
+ 28293031123
734
+ 45678910
735
+
736
+ 12:00
737
+
738
+ Required field
739
+
740
+ Saved value:
741
+
742
+ Controlled - Reset and close on invalid
743
+
744
+ ‹December 2025›
745
+ SuMoTuWeThFrSa
746
+
747
+ 30123456
748
+ 78910111213
749
+ 14151617181920
750
+ 21222324252627
751
+ 28293031123
752
+ 45678910
753
+
754
+ Saved value:
755
+
756
+ SaveableDateInput (only month)
757
+
758
+ ‹2025›
759
+
760
+ JanFebMarApr
761
+ MayJunJulAug
762
+ SepOctNovDec
763
+
764
+ SaveableDateInput (disabled)
765
+
766
+ ‹December 2025›
767
+ SuMoTuWeThFrSa
768
+
769
+ 30123456
770
+ 78910111213
771
+ 14151617181920
772
+ 21222324252627
773
+ 28293031123
774
+ 45678910
775
+
776
+ 3:20 PM
777
+
778
+ #### Summary
779
+
780
+ SaveableDateInput (uncontrolled)
781
+
782
+ ‹December 2025›
783
+ SuMoTuWeThFrSa
784
+
785
+ 30123456
786
+ 78910111213
787
+ 14151617181920
788
+ 21222324252627
789
+ 28293031123
790
+ 45678910
791
+
792
+ Controlled - Stay open on invalid (default)
793
+
794
+ ‹December 2025›
795
+ SuMoTuWeThFrSa
796
+
797
+ 30123456
798
+ 78910111213
799
+ 14151617181920
800
+ 21222324252627
801
+ 28293031123
802
+ 45678910
803
+
804
+ 03:20
805
+
806
+ Saved value:
807
+
808
+ Controlled - With error
809
+
810
+ ‹December 2025›
811
+ SuMoTuWeThFrSa
812
+
813
+ 30123456
814
+ 78910111213
815
+ 14151617181920
816
+ 21222324252627
817
+ 28293031123
818
+ 45678910
819
+
820
+ 12:00
821
+
822
+ Required field
823
+
824
+ Saved value:
825
+
826
+ Controlled - Reset and close on invalid
827
+
828
+ ‹December 2025›
829
+ SuMoTuWeThFrSa
830
+
831
+ 30123456
832
+ 78910111213
833
+ 14151617181920
834
+ 21222324252627
835
+ 28293031123
836
+ 45678910
837
+
838
+ Saved value:
839
+
840
+ SaveableDateInput (only month)
841
+
842
+ ‹2025›
843
+
844
+ JanFebMarApr
845
+ MayJunJulAug
846
+ SepOctNovDec
847
+
848
+ SaveableDateInput (disabled)
849
+
850
+ ‹December 2025›
851
+ SuMoTuWeThFrSa
852
+
853
+ 30123456
854
+ 78910111213
855
+ 14151617181920
856
+ 21222324252627
857
+ 28293031123
858
+ 45678910
859
+
860
+ 3:20 PM
861
+
862
+ #### React (tsx)
863
+
864
+ ```tsx
865
+ import SaveableDateInput from '@rio-cloud/rio-uikit/SaveableDateInput';
866
+ import FormLabel from '@rio-cloud/rio-uikit/FormLabel';
867
+ import { useState } from 'react';
868
+ import moment, { type Moment } from 'moment';
869
+
870
+ /**
871
+ * The Datepicker returns either a Moment object if date is valid or the input as string
872
+ * if it's not a valid date
873
+ */
874
+ const isValidDate = (input: Moment | string) => typeof input !== 'string';
875
+
876
+ export default () => {
877
+ // Controlled example with "stay-open" behavior (default)
878
+ const [savedValue1, setSavedValue1] = useState<Moment | string>('');
879
+ const [currentTransientInput1, setCurrentTransientInput1] = useState<Moment | string>(moment(new Date()));
880
+ const [isValid1, setIsValid1] = useState<boolean>(true);
881
+
882
+ const handleSaveValue1 = (newValue: string | Date | Moment, previousValue: string | Date | Moment) => {
883
+ console.log('Saving value:', newValue, 'Previous:', previousValue);
884
+ setSavedValue1(newValue as Moment);
885
+ setCurrentTransientInput1(newValue as Moment | string);
886
+ };
887
+
888
+ const handleTransientInputChange1 = (input: Moment | string, isValid: boolean) => {
889
+ console.log('Input changed:', input, 'Valid:', isValid);
890
+ setCurrentTransientInput1(input);
891
+ setIsValid1(isValid);
892
+ };
893
+
894
+ // Controlled example with "reset-and-close" behavior
895
+ const [savedValue2, setSavedValue2] = useState<Moment | string>('');
896
+ const [currentTransientInput2, setCurrentTransientInput2] = useState<Moment | string>();
897
+ const [isValid2, setIsValid2] = useState<boolean>(true);
898
+
899
+ const handleSaveValue2 = (newValue: string | Date | Moment, previousValue: string | Date | Moment) => {
900
+ console.log('Saving value 2:', newValue, 'Previous:', previousValue);
901
+ setSavedValue2(newValue as Moment);
902
+ setCurrentTransientInput2(newValue as Moment | string);
903
+ };
904
+
905
+ const handleTransientInputChange2 = (input: Moment | string, isValid: boolean) => {
906
+ console.log('Input changed 2:', input, 'Valid:', isValid);
907
+ setCurrentTransientInput2(input);
908
+
909
+ // Custom validation: date must be valid AND newer than last week
910
+ let customIsValid = isValid;
911
+ if (isValid && isValidDate(input)) {
912
+ const lastWeek = moment().subtract(7, 'days').startOf('day');
913
+ customIsValid = input.isAfter(lastWeek);
914
+ }
915
+
916
+ setIsValid2(customIsValid);
917
+ };
918
+
919
+ // Controlled example with "stay-open" behavior (default)
920
+ const [savedValue3, setSavedValue3] = useState<Moment | string>('');
921
+ const [currentTransientInput3, setCurrentTransientInput3] = useState<Moment | string>();
922
+ const [isValid3, setIsValid3] = useState<boolean>(true);
923
+
924
+ const handleSaveValue3 = (newValue: string | Date | Moment, previousValue: string | Date | Moment) => {
925
+ console.log('Saving value:', newValue, 'Previous:', previousValue);
926
+ setSavedValue3(newValue as Moment);
927
+ setCurrentTransientInput3(newValue as Moment | string);
928
+ };
929
+
930
+ const handleTransientInputChange3 = (input: Moment | string, isValid: boolean) => {
931
+ console.log('Input changed:', input, 'Valid:', isValid);
932
+ setCurrentTransientInput3(input);
933
+ setIsValid3(isValid);
934
+ };
935
+
936
+ const handleCancel1 = () => {
937
+ console.log('Edit cancelled - resetting to saved value');
938
+ setCurrentTransientInput1(savedValue1);
939
+ setIsValid1(true);
940
+ };
941
+
942
+ const handleCancel2 = () => {
943
+ console.log('Edit cancelled - resetting to saved value');
944
+ setCurrentTransientInput2(savedValue2);
945
+ setIsValid2(true);
946
+ };
947
+
948
+ const handleCancel3 = () => {
949
+ console.log('Edit cancelled - resetting to saved value');
950
+ setCurrentTransientInput3(savedValue2);
951
+ setIsValid3(true);
952
+ };
953
+
954
+ const handleExitEdit = (wasSaved: boolean) => {
955
+ console.log('Exited edit mode, was saved:', wasSaved);
956
+ };
957
+
958
+ return (
959
+ <div className='margin-bottom-50 display-flex flex-wrap flex-direction-column gap-25'>
960
+ <div className='width-300'>
961
+ <FormLabel>SaveableDateInput (uncontrolled)</FormLabel>
962
+ <SaveableDateInput
963
+ placeholder='Delivery date'
964
+ datePickerProps={{ dateFormat: 'YYYY-MM-DD', timeFormat: false }}
965
+ onValueChanged={(value, _) => console.log('Uncontrolled saved:', value)}
966
+ />
967
+ </div>
968
+
969
+ <div className='width-300'>
970
+ <div className='form-group'>
971
+ <FormLabel>Controlled - Stay open on invalid (default)</FormLabel>
972
+ <SaveableDateInput
973
+ value={currentTransientInput1}
974
+ isValid={isValid1}
975
+ onValueChanged={handleSaveValue1}
976
+ onInputChange={handleTransientInputChange1}
977
+ onCancel={handleCancel1}
978
+ onExitEdit={handleExitEdit}
979
+ className='margin-0'
980
+ placeholder='Enter valid date'
981
+ datePickerProps={{ dateFormat: 'YYYY-MM-DD', timeFormat: 'hh:mm' }}
982
+ invalidExitBehavior='stay-open'
983
+ inputProps={{ style: { padding: '0' } }}
984
+ errorMessage='Please enter a valid date'
985
+ />
986
+ </div>
987
+ <div className='margin-top-10'>
988
+ <small>
989
+ Saved value: {isValidDate(savedValue1) ? savedValue1.format('YYYY-MM-DD') : String(savedValue1)}
990
+ </small>
991
+ </div>
992
+ </div>
993
+
994
+ <div className='width-300'>
995
+ <div className='form-group'>
996
+ <FormLabel>Controlled - With error</FormLabel>
997
+ <SaveableDateInput
998
+ value={currentTransientInput3}
999
+ isValid={!!currentTransientInput3}
1000
+ onValueChanged={handleSaveValue3}
1001
+ onInputChange={handleTransientInputChange3}
1002
+ onCancel={handleCancel3}
1003
+ onExitEdit={handleExitEdit}
1004
+ className='margin-0'
1005
+ placeholder='Enter a date'
1006
+ datePickerProps={{ dateFormat: 'YYYY-MM-DD', timeFormat: 'hh:mm' }}
1007
+ invalidExitBehavior='stay-open'
1008
+ inputProps={{ style: { padding: '0' } }}
1009
+ errorMessage='Required field'
1010
+ hideErrorIcon
1011
+ />
1012
+ </div>
1013
+ <div className='margin-top-10'>
1014
+ <small>
1015
+ Saved value: {isValidDate(savedValue1) ? savedValue1.format('YYYY-MM-DD') : String(savedValue1)}
1016
+ </small>
1017
+ </div>
1018
+ </div>
1019
+
1020
+ <div className='width-300'>
1021
+ <div className='form-group'>
1022
+ <FormLabel>Controlled - Reset and close on invalid</FormLabel>
1023
+ <SaveableDateInput
1024
+ value={currentTransientInput2}
1025
+ isValid={isValid2}
1026
+ onValueChanged={handleSaveValue2}
1027
+ onInputChange={handleTransientInputChange2}
1028
+ onCancel={handleCancel2}
1029
+ onExitEdit={handleExitEdit}
1030
+ className='margin-0'
1031
+ placeholder='Enter date after last week'
1032
+ datePickerProps={{ dateFormat: 'YYYY-MM-DD', timeFormat: false }}
1033
+ invalidExitBehavior='reset-and-close'
1034
+ data-testid='demo-testid'
1035
+ errorMessage={
1036
+ <span>
1037
+ Please enter a valid date that is newer than{' '}
1038
+ {moment().subtract(7, 'days').format('YYYY-MM-DD')}
1039
+ </span>
1040
+ }
1041
+ />
1042
+ </div>
1043
+ <div className='margin-top-10'>
1044
+ <small>
1045
+ Saved value: {isValidDate(savedValue2) ? savedValue2.format('YYYY-MM-DD') : String(savedValue2)}
1046
+ </small>
1047
+ </div>
1048
+ </div>
1049
+
1050
+ <div className='width-300'>
1051
+ <FormLabel>SaveableDateInput (only month)</FormLabel>
1052
+ <SaveableDateInput
1053
+ placeholder='Target month'
1054
+ datePickerProps={{ dateFormat: 'YYYY-MM', timeFormat: false }}
1055
+ onValueChanged={(value, _) => console.log('Month saved:', value)}
1056
+ />
1057
+ </div>
1058
+
1059
+ <div className='width-300'>
1060
+ <FormLabel>SaveableDateInput (disabled)</FormLabel>
1061
+ <SaveableDateInput value={new Date()} disabled />
1062
+ </div>
1063
+ </div>
1064
+ );
1065
+ };
1066
+ ```
1067
+
1068
+ #### HTML (html)
1069
+
1070
+ ```html
1071
+ <div class="margin-bottom-50 display-flex flex-wrap flex-direction-column gap-25">
1072
+ <div class="width-300">
1073
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableDateInput (uncontrolled)</div>
1074
+ <div class="form-group">
1075
+ <div class="input-group">
1076
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1077
+ <div class="input-group">
1078
+ <span class="input-group-addon">
1079
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1080
+ </span>
1081
+ </span>
1082
+ <div class="ClearableInput input-group">
1083
+ <input type="text" class="form-control" placeholder="Delivery date" disabled="" value="" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px;">
1084
+ </div>
1085
+ </div>
1086
+ <div class="rdtPicker">
1087
+ <div class="rdtDays">
1088
+ <table>
1089
+ <thead>
1090
+ <tr>
1091
+ <th class="rdtPrev">
1092
+ <span>‹</span>
1093
+ </th>
1094
+ <th class="rdtSwitch" colspan="5" data-value="11">December 2025</th>
1095
+ <th class="rdtNext">
1096
+ <span>›</span>
1097
+ </th>
1098
+ </tr>
1099
+ <tr>
1100
+ <th class="dow">Su</th>
1101
+ <th class="dow">Mo</th>
1102
+ <th class="dow">Tu</th>
1103
+ <th class="dow">We</th>
1104
+ <th class="dow">Th</th>
1105
+ <th class="dow">Fr</th>
1106
+ <th class="dow">Sa</th>
1107
+ </tr>
1108
+ </thead>
1109
+ <tbody>
1110
+ <tr>
1111
+ <td data-value="30" data-month="10" data-year="2025" class="rdtDay rdtOld">30</td>
1112
+ <td data-value="1" data-month="11" data-year="2025" class="rdtDay">1</td>
1113
+ <td data-value="2" data-month="11" data-year="2025" class="rdtDay">2</td>
1114
+ <td data-value="3" data-month="11" data-year="2025" class="rdtDay">3</td>
1115
+ <td data-value="4" data-month="11" data-year="2025" class="rdtDay">4</td>
1116
+ <td data-value="5" data-month="11" data-year="2025" class="rdtDay">5</td>
1117
+ <td data-value="6" data-month="11" data-year="2025" class="rdtDay">6</td>
1118
+ </tr>
1119
+ <tr>
1120
+ <td data-value="7" data-month="11" data-year="2025" class="rdtDay">7</td>
1121
+ <td data-value="8" data-month="11" data-year="2025" class="rdtDay">8</td>
1122
+ <td data-value="9" data-month="11" data-year="2025" class="rdtDay">9</td>
1123
+ <td data-value="10" data-month="11" data-year="2025" class="rdtDay">10</td>
1124
+ <td data-value="11" data-month="11" data-year="2025" class="rdtDay">11</td>
1125
+ <td data-value="12" data-month="11" data-year="2025" class="rdtDay rdtToday">12</td>
1126
+ <td data-value="13" data-month="11" data-year="2025" class="rdtDay">13</td>
1127
+ </tr>
1128
+ <tr>
1129
+ <td data-value="14" data-month="11" data-year="2025" class="rdtDay">14</td>
1130
+ <td data-value="15" data-month="11" data-year="2025" class="rdtDay">15</td>
1131
+ <td data-value="16" data-month="11" data-year="2025" class="rdtDay">16</td>
1132
+ <td data-value="17" data-month="11" data-year="2025" class="rdtDay">17</td>
1133
+ <td data-value="18" data-month="11" data-year="2025" class="rdtDay">18</td>
1134
+ <td data-value="19" data-month="11" data-year="2025" class="rdtDay">19</td>
1135
+ <td data-value="20" data-month="11" data-year="2025" class="rdtDay">20</td>
1136
+ </tr>
1137
+ <tr>
1138
+ <td data-value="21" data-month="11" data-year="2025" class="rdtDay">21</td>
1139
+ <td data-value="22" data-month="11" data-year="2025" class="rdtDay">22</td>
1140
+ <td data-value="23" data-month="11" data-year="2025" class="rdtDay">23</td>
1141
+ <td data-value="24" data-month="11" data-year="2025" class="rdtDay">24</td>
1142
+ <td data-value="25" data-month="11" data-year="2025" class="rdtDay">25</td>
1143
+ <td data-value="26" data-month="11" data-year="2025" class="rdtDay">26</td>
1144
+ <td data-value="27" data-month="11" data-year="2025" class="rdtDay">27</td>
1145
+ </tr>
1146
+ <tr>
1147
+ <td data-value="28" data-month="11" data-year="2025" class="rdtDay">28</td>
1148
+ <td data-value="29" data-month="11" data-year="2025" class="rdtDay">29</td>
1149
+ <td data-value="30" data-month="11" data-year="2025" class="rdtDay">30</td>
1150
+ <td data-value="31" data-month="11" data-year="2025" class="rdtDay">31</td>
1151
+ <td data-value="1" data-month="0" data-year="2026" class="rdtDay rdtNew">1</td>
1152
+ <td data-value="2" data-month="0" data-year="2026" class="rdtDay rdtNew">2</td>
1153
+ <td data-value="3" data-month="0" data-year="2026" class="rdtDay rdtNew">3</td>
1154
+ </tr>
1155
+ <tr>
1156
+ <td data-value="4" data-month="0" data-year="2026" class="rdtDay rdtNew">4</td>
1157
+ <td data-value="5" data-month="0" data-year="2026" class="rdtDay rdtNew">5</td>
1158
+ <td data-value="6" data-month="0" data-year="2026" class="rdtDay rdtNew">6</td>
1159
+ <td data-value="7" data-month="0" data-year="2026" class="rdtDay rdtNew">7</td>
1160
+ <td data-value="8" data-month="0" data-year="2026" class="rdtDay rdtNew">8</td>
1161
+ <td data-value="9" data-month="0" data-year="2026" class="rdtDay rdtNew">9</td>
1162
+ <td data-value="10" data-month="0" data-year="2026" class="rdtDay rdtNew">10</td>
1163
+ </tr>
1164
+ </tbody>
1165
+ </table>
1166
+ </div>
1167
+ </div>
1168
+ </div>
1169
+ <div class="input-group-btn">
1170
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
1171
+ <span class="rioglyph rioglyph-pencil">
1172
+ </span>
1173
+ </button>
1174
+ </div>
1175
+ </div>
1176
+ </div>
1177
+ </div>
1178
+ <div class="width-300">
1179
+ <div class="form-group">
1180
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Controlled - Stay open on invalid (default)</div>
1181
+ <div class="form-group margin-0">
1182
+ <div class="input-group">
1183
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1184
+ <div class="input-group">
1185
+ <span class="input-group-addon">
1186
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1187
+ </span>
1188
+ </span>
1189
+ <div class="ClearableInput input-group">
1190
+ <input type="text" class="form-control" placeholder="Enter valid date" disabled="" value="2025-12-12 03:20" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px;">
1191
+ </div>
1192
+ </div>
1193
+ <div class="rdtPicker">
1194
+ <div class="rdtDays">
1195
+ <table>
1196
+ <thead>
1197
+ <tr>
1198
+ <th class="rdtPrev">
1199
+ <span>‹</span>
1200
+ </th>
1201
+ <th class="rdtSwitch" colspan="5" data-value="11">December 2025</th>
1202
+ <th class="rdtNext">
1203
+ <span>›</span>
1204
+ </th>
1205
+ </tr>
1206
+ <tr>
1207
+ <th class="dow">Su</th>
1208
+ <th class="dow">Mo</th>
1209
+ <th class="dow">Tu</th>
1210
+ <th class="dow">We</th>
1211
+ <th class="dow">Th</th>
1212
+ <th class="dow">Fr</th>
1213
+ <th class="dow">Sa</th>
1214
+ </tr>
1215
+ </thead>
1216
+ <tbody>
1217
+ <tr>
1218
+ <td data-value="30" data-month="10" data-year="2025" class="rdtDay rdtOld">30</td>
1219
+ <td data-value="1" data-month="11" data-year="2025" class="rdtDay">1</td>
1220
+ <td data-value="2" data-month="11" data-year="2025" class="rdtDay">2</td>
1221
+ <td data-value="3" data-month="11" data-year="2025" class="rdtDay">3</td>
1222
+ <td data-value="4" data-month="11" data-year="2025" class="rdtDay">4</td>
1223
+ <td data-value="5" data-month="11" data-year="2025" class="rdtDay">5</td>
1224
+ <td data-value="6" data-month="11" data-year="2025" class="rdtDay">6</td>
1225
+ </tr>
1226
+ <tr>
1227
+ <td data-value="7" data-month="11" data-year="2025" class="rdtDay">7</td>
1228
+ <td data-value="8" data-month="11" data-year="2025" class="rdtDay">8</td>
1229
+ <td data-value="9" data-month="11" data-year="2025" class="rdtDay">9</td>
1230
+ <td data-value="10" data-month="11" data-year="2025" class="rdtDay">10</td>
1231
+ <td data-value="11" data-month="11" data-year="2025" class="rdtDay">11</td>
1232
+ <td data-value="12" data-month="11" data-year="2025" class="rdtDay rdtActive rdtToday">12</td>
1233
+ <td data-value="13" data-month="11" data-year="2025" class="rdtDay">13</td>
1234
+ </tr>
1235
+ <tr>
1236
+ <td data-value="14" data-month="11" data-year="2025" class="rdtDay">14</td>
1237
+ <td data-value="15" data-month="11" data-year="2025" class="rdtDay">15</td>
1238
+ <td data-value="16" data-month="11" data-year="2025" class="rdtDay">16</td>
1239
+ <td data-value="17" data-month="11" data-year="2025" class="rdtDay">17</td>
1240
+ <td data-value="18" data-month="11" data-year="2025" class="rdtDay">18</td>
1241
+ <td data-value="19" data-month="11" data-year="2025" class="rdtDay">19</td>
1242
+ <td data-value="20" data-month="11" data-year="2025" class="rdtDay">20</td>
1243
+ </tr>
1244
+ <tr>
1245
+ <td data-value="21" data-month="11" data-year="2025" class="rdtDay">21</td>
1246
+ <td data-value="22" data-month="11" data-year="2025" class="rdtDay">22</td>
1247
+ <td data-value="23" data-month="11" data-year="2025" class="rdtDay">23</td>
1248
+ <td data-value="24" data-month="11" data-year="2025" class="rdtDay">24</td>
1249
+ <td data-value="25" data-month="11" data-year="2025" class="rdtDay">25</td>
1250
+ <td data-value="26" data-month="11" data-year="2025" class="rdtDay">26</td>
1251
+ <td data-value="27" data-month="11" data-year="2025" class="rdtDay">27</td>
1252
+ </tr>
1253
+ <tr>
1254
+ <td data-value="28" data-month="11" data-year="2025" class="rdtDay">28</td>
1255
+ <td data-value="29" data-month="11" data-year="2025" class="rdtDay">29</td>
1256
+ <td data-value="30" data-month="11" data-year="2025" class="rdtDay">30</td>
1257
+ <td data-value="31" data-month="11" data-year="2025" class="rdtDay">31</td>
1258
+ <td data-value="1" data-month="0" data-year="2026" class="rdtDay rdtNew">1</td>
1259
+ <td data-value="2" data-month="0" data-year="2026" class="rdtDay rdtNew">2</td>
1260
+ <td data-value="3" data-month="0" data-year="2026" class="rdtDay rdtNew">3</td>
1261
+ </tr>
1262
+ <tr>
1263
+ <td data-value="4" data-month="0" data-year="2026" class="rdtDay rdtNew">4</td>
1264
+ <td data-value="5" data-month="0" data-year="2026" class="rdtDay rdtNew">5</td>
1265
+ <td data-value="6" data-month="0" data-year="2026" class="rdtDay rdtNew">6</td>
1266
+ <td data-value="7" data-month="0" data-year="2026" class="rdtDay rdtNew">7</td>
1267
+ <td data-value="8" data-month="0" data-year="2026" class="rdtDay rdtNew">8</td>
1268
+ <td data-value="9" data-month="0" data-year="2026" class="rdtDay rdtNew">9</td>
1269
+ <td data-value="10" data-month="0" data-year="2026" class="rdtDay rdtNew">10</td>
1270
+ </tr>
1271
+ </tbody>
1272
+ <tfoot>
1273
+ <tr>
1274
+ <td colspan="7" class="rdtTimeToggle">03:20</td>
1275
+ </tr>
1276
+ </tfoot>
1277
+ </table>
1278
+ </div>
1279
+ </div>
1280
+ </div>
1281
+ <div class="input-group-btn">
1282
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
1283
+ <span class="rioglyph rioglyph-pencil">
1284
+ </span>
1285
+ </button>
1286
+ </div>
1287
+ </div>
1288
+ </div>
1289
+ </div>
1290
+ <div class="margin-top-10">
1291
+ <small>Saved value: </small>
1292
+ </div>
1293
+ </div>
1294
+ <div class="width-300">
1295
+ <div class="form-group">
1296
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Controlled - With error</div>
1297
+ <div class="form-group has-feedback has-error margin-0">
1298
+ <div class="input-group">
1299
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1300
+ <div class="input-group">
1301
+ <span class="input-group-addon">
1302
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1303
+ </span>
1304
+ </span>
1305
+ <div class="ClearableInput input-group">
1306
+ <input type="text" class="form-control" placeholder="Enter a date" disabled="" value="" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px; padding-right: 10px;">
1307
+ </div>
1308
+ </div>
1309
+ <div class="rdtPicker">
1310
+ <div class="rdtDays">
1311
+ <table>
1312
+ <thead>
1313
+ <tr>
1314
+ <th class="rdtPrev">
1315
+ <span>‹</span>
1316
+ </th>
1317
+ <th class="rdtSwitch" colspan="5" data-value="11">December 2025</th>
1318
+ <th class="rdtNext">
1319
+ <span>›</span>
1320
+ </th>
1321
+ </tr>
1322
+ <tr>
1323
+ <th class="dow">Su</th>
1324
+ <th class="dow">Mo</th>
1325
+ <th class="dow">Tu</th>
1326
+ <th class="dow">We</th>
1327
+ <th class="dow">Th</th>
1328
+ <th class="dow">Fr</th>
1329
+ <th class="dow">Sa</th>
1330
+ </tr>
1331
+ </thead>
1332
+ <tbody>
1333
+ <tr>
1334
+ <td data-value="30" data-month="10" data-year="2025" class="rdtDay rdtOld">30</td>
1335
+ <td data-value="1" data-month="11" data-year="2025" class="rdtDay">1</td>
1336
+ <td data-value="2" data-month="11" data-year="2025" class="rdtDay">2</td>
1337
+ <td data-value="3" data-month="11" data-year="2025" class="rdtDay">3</td>
1338
+ <td data-value="4" data-month="11" data-year="2025" class="rdtDay">4</td>
1339
+ <td data-value="5" data-month="11" data-year="2025" class="rdtDay">5</td>
1340
+ <td data-value="6" data-month="11" data-year="2025" class="rdtDay">6</td>
1341
+ </tr>
1342
+ <tr>
1343
+ <td data-value="7" data-month="11" data-year="2025" class="rdtDay">7</td>
1344
+ <td data-value="8" data-month="11" data-year="2025" class="rdtDay">8</td>
1345
+ <td data-value="9" data-month="11" data-year="2025" class="rdtDay">9</td>
1346
+ <td data-value="10" data-month="11" data-year="2025" class="rdtDay">10</td>
1347
+ <td data-value="11" data-month="11" data-year="2025" class="rdtDay">11</td>
1348
+ <td data-value="12" data-month="11" data-year="2025" class="rdtDay rdtToday">12</td>
1349
+ <td data-value="13" data-month="11" data-year="2025" class="rdtDay">13</td>
1350
+ </tr>
1351
+ <tr>
1352
+ <td data-value="14" data-month="11" data-year="2025" class="rdtDay">14</td>
1353
+ <td data-value="15" data-month="11" data-year="2025" class="rdtDay">15</td>
1354
+ <td data-value="16" data-month="11" data-year="2025" class="rdtDay">16</td>
1355
+ <td data-value="17" data-month="11" data-year="2025" class="rdtDay">17</td>
1356
+ <td data-value="18" data-month="11" data-year="2025" class="rdtDay">18</td>
1357
+ <td data-value="19" data-month="11" data-year="2025" class="rdtDay">19</td>
1358
+ <td data-value="20" data-month="11" data-year="2025" class="rdtDay">20</td>
1359
+ </tr>
1360
+ <tr>
1361
+ <td data-value="21" data-month="11" data-year="2025" class="rdtDay">21</td>
1362
+ <td data-value="22" data-month="11" data-year="2025" class="rdtDay">22</td>
1363
+ <td data-value="23" data-month="11" data-year="2025" class="rdtDay">23</td>
1364
+ <td data-value="24" data-month="11" data-year="2025" class="rdtDay">24</td>
1365
+ <td data-value="25" data-month="11" data-year="2025" class="rdtDay">25</td>
1366
+ <td data-value="26" data-month="11" data-year="2025" class="rdtDay">26</td>
1367
+ <td data-value="27" data-month="11" data-year="2025" class="rdtDay">27</td>
1368
+ </tr>
1369
+ <tr>
1370
+ <td data-value="28" data-month="11" data-year="2025" class="rdtDay">28</td>
1371
+ <td data-value="29" data-month="11" data-year="2025" class="rdtDay">29</td>
1372
+ <td data-value="30" data-month="11" data-year="2025" class="rdtDay">30</td>
1373
+ <td data-value="31" data-month="11" data-year="2025" class="rdtDay">31</td>
1374
+ <td data-value="1" data-month="0" data-year="2026" class="rdtDay rdtNew">1</td>
1375
+ <td data-value="2" data-month="0" data-year="2026" class="rdtDay rdtNew">2</td>
1376
+ <td data-value="3" data-month="0" data-year="2026" class="rdtDay rdtNew">3</td>
1377
+ </tr>
1378
+ <tr>
1379
+ <td data-value="4" data-month="0" data-year="2026" class="rdtDay rdtNew">4</td>
1380
+ <td data-value="5" data-month="0" data-year="2026" class="rdtDay rdtNew">5</td>
1381
+ <td data-value="6" data-month="0" data-year="2026" class="rdtDay rdtNew">6</td>
1382
+ <td data-value="7" data-month="0" data-year="2026" class="rdtDay rdtNew">7</td>
1383
+ <td data-value="8" data-month="0" data-year="2026" class="rdtDay rdtNew">8</td>
1384
+ <td data-value="9" data-month="0" data-year="2026" class="rdtDay rdtNew">9</td>
1385
+ <td data-value="10" data-month="0" data-year="2026" class="rdtDay rdtNew">10</td>
1386
+ </tr>
1387
+ </tbody>
1388
+ <tfoot>
1389
+ <tr>
1390
+ <td colspan="7" class="rdtTimeToggle">12:00</td>
1391
+ </tr>
1392
+ </tfoot>
1393
+ </table>
1394
+ </div>
1395
+ </div>
1396
+ </div>
1397
+ <div class="input-group-btn">
1398
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
1399
+ <span class="rioglyph rioglyph-pencil">
1400
+ </span>
1401
+ </button>
1402
+ </div>
1403
+ </div>
1404
+ <span class="help-block z-index-max">
1405
+ <span>Required field</span>
1406
+ </span>
1407
+ </div>
1408
+ </div>
1409
+ <div class="margin-top-10">
1410
+ <small>Saved value: </small>
1411
+ </div>
1412
+ </div>
1413
+ <div class="width-300">
1414
+ <div class="form-group">
1415
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">Controlled - Reset and close on invalid</div>
1416
+ <div data-testid="demo-testid" class="form-group margin-0">
1417
+ <div class="input-group">
1418
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1419
+ <div class="input-group">
1420
+ <span class="input-group-addon">
1421
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1422
+ </span>
1423
+ </span>
1424
+ <div class="ClearableInput input-group">
1425
+ <input type="text" class="form-control" placeholder="Enter date after last week" disabled="" value="" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px;">
1426
+ </div>
1427
+ </div>
1428
+ <div class="rdtPicker">
1429
+ <div class="rdtDays">
1430
+ <table>
1431
+ <thead>
1432
+ <tr>
1433
+ <th class="rdtPrev">
1434
+ <span>‹</span>
1435
+ </th>
1436
+ <th class="rdtSwitch" colspan="5" data-value="11">December 2025</th>
1437
+ <th class="rdtNext">
1438
+ <span>›</span>
1439
+ </th>
1440
+ </tr>
1441
+ <tr>
1442
+ <th class="dow">Su</th>
1443
+ <th class="dow">Mo</th>
1444
+ <th class="dow">Tu</th>
1445
+ <th class="dow">We</th>
1446
+ <th class="dow">Th</th>
1447
+ <th class="dow">Fr</th>
1448
+ <th class="dow">Sa</th>
1449
+ </tr>
1450
+ </thead>
1451
+ <tbody>
1452
+ <tr>
1453
+ <td data-value="30" data-month="10" data-year="2025" class="rdtDay rdtOld">30</td>
1454
+ <td data-value="1" data-month="11" data-year="2025" class="rdtDay">1</td>
1455
+ <td data-value="2" data-month="11" data-year="2025" class="rdtDay">2</td>
1456
+ <td data-value="3" data-month="11" data-year="2025" class="rdtDay">3</td>
1457
+ <td data-value="4" data-month="11" data-year="2025" class="rdtDay">4</td>
1458
+ <td data-value="5" data-month="11" data-year="2025" class="rdtDay">5</td>
1459
+ <td data-value="6" data-month="11" data-year="2025" class="rdtDay">6</td>
1460
+ </tr>
1461
+ <tr>
1462
+ <td data-value="7" data-month="11" data-year="2025" class="rdtDay">7</td>
1463
+ <td data-value="8" data-month="11" data-year="2025" class="rdtDay">8</td>
1464
+ <td data-value="9" data-month="11" data-year="2025" class="rdtDay">9</td>
1465
+ <td data-value="10" data-month="11" data-year="2025" class="rdtDay">10</td>
1466
+ <td data-value="11" data-month="11" data-year="2025" class="rdtDay">11</td>
1467
+ <td data-value="12" data-month="11" data-year="2025" class="rdtDay rdtToday">12</td>
1468
+ <td data-value="13" data-month="11" data-year="2025" class="rdtDay">13</td>
1469
+ </tr>
1470
+ <tr>
1471
+ <td data-value="14" data-month="11" data-year="2025" class="rdtDay">14</td>
1472
+ <td data-value="15" data-month="11" data-year="2025" class="rdtDay">15</td>
1473
+ <td data-value="16" data-month="11" data-year="2025" class="rdtDay">16</td>
1474
+ <td data-value="17" data-month="11" data-year="2025" class="rdtDay">17</td>
1475
+ <td data-value="18" data-month="11" data-year="2025" class="rdtDay">18</td>
1476
+ <td data-value="19" data-month="11" data-year="2025" class="rdtDay">19</td>
1477
+ <td data-value="20" data-month="11" data-year="2025" class="rdtDay">20</td>
1478
+ </tr>
1479
+ <tr>
1480
+ <td data-value="21" data-month="11" data-year="2025" class="rdtDay">21</td>
1481
+ <td data-value="22" data-month="11" data-year="2025" class="rdtDay">22</td>
1482
+ <td data-value="23" data-month="11" data-year="2025" class="rdtDay">23</td>
1483
+ <td data-value="24" data-month="11" data-year="2025" class="rdtDay">24</td>
1484
+ <td data-value="25" data-month="11" data-year="2025" class="rdtDay">25</td>
1485
+ <td data-value="26" data-month="11" data-year="2025" class="rdtDay">26</td>
1486
+ <td data-value="27" data-month="11" data-year="2025" class="rdtDay">27</td>
1487
+ </tr>
1488
+ <tr>
1489
+ <td data-value="28" data-month="11" data-year="2025" class="rdtDay">28</td>
1490
+ <td data-value="29" data-month="11" data-year="2025" class="rdtDay">29</td>
1491
+ <td data-value="30" data-month="11" data-year="2025" class="rdtDay">30</td>
1492
+ <td data-value="31" data-month="11" data-year="2025" class="rdtDay">31</td>
1493
+ <td data-value="1" data-month="0" data-year="2026" class="rdtDay rdtNew">1</td>
1494
+ <td data-value="2" data-month="0" data-year="2026" class="rdtDay rdtNew">2</td>
1495
+ <td data-value="3" data-month="0" data-year="2026" class="rdtDay rdtNew">3</td>
1496
+ </tr>
1497
+ <tr>
1498
+ <td data-value="4" data-month="0" data-year="2026" class="rdtDay rdtNew">4</td>
1499
+ <td data-value="5" data-month="0" data-year="2026" class="rdtDay rdtNew">5</td>
1500
+ <td data-value="6" data-month="0" data-year="2026" class="rdtDay rdtNew">6</td>
1501
+ <td data-value="7" data-month="0" data-year="2026" class="rdtDay rdtNew">7</td>
1502
+ <td data-value="8" data-month="0" data-year="2026" class="rdtDay rdtNew">8</td>
1503
+ <td data-value="9" data-month="0" data-year="2026" class="rdtDay rdtNew">9</td>
1504
+ <td data-value="10" data-month="0" data-year="2026" class="rdtDay rdtNew">10</td>
1505
+ </tr>
1506
+ </tbody>
1507
+ </table>
1508
+ </div>
1509
+ </div>
1510
+ </div>
1511
+ <div class="input-group-btn">
1512
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
1513
+ <span class="rioglyph rioglyph-pencil">
1514
+ </span>
1515
+ </button>
1516
+ </div>
1517
+ </div>
1518
+ </div>
1519
+ </div>
1520
+ <div class="margin-top-10">
1521
+ <small>Saved value: </small>
1522
+ </div>
1523
+ </div>
1524
+ <div class="width-300">
1525
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableDateInput (only month)</div>
1526
+ <div class="form-group">
1527
+ <div class="input-group">
1528
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1529
+ <div class="input-group">
1530
+ <span class="input-group-addon">
1531
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1532
+ </span>
1533
+ </span>
1534
+ <div class="ClearableInput input-group">
1535
+ <input type="text" class="form-control" placeholder="Target month" disabled="" value="" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px;">
1536
+ </div>
1537
+ </div>
1538
+ <div class="rdtPicker">
1539
+ <div class="rdtMonths">
1540
+ <table>
1541
+ <thead>
1542
+ <tr>
1543
+ <th class="rdtPrev">
1544
+ <span>‹</span>
1545
+ </th>
1546
+ <th class="rdtSwitch" colspan="2">2025</th>
1547
+ <th class="rdtNext">
1548
+ <span>›</span>
1549
+ </th>
1550
+ </tr>
1551
+ </thead>
1552
+ </table>
1553
+ <table>
1554
+ <tbody>
1555
+ <tr>
1556
+ <td class="rdtMonth" data-value="0">Jan</td>
1557
+ <td class="rdtMonth" data-value="1">Feb</td>
1558
+ <td class="rdtMonth" data-value="2">Mar</td>
1559
+ <td class="rdtMonth" data-value="3">Apr</td>
1560
+ </tr>
1561
+ <tr>
1562
+ <td class="rdtMonth" data-value="4">May</td>
1563
+ <td class="rdtMonth" data-value="5">Jun</td>
1564
+ <td class="rdtMonth" data-value="6">Jul</td>
1565
+ <td class="rdtMonth" data-value="7">Aug</td>
1566
+ </tr>
1567
+ <tr>
1568
+ <td class="rdtMonth" data-value="8">Sep</td>
1569
+ <td class="rdtMonth" data-value="9">Oct</td>
1570
+ <td class="rdtMonth" data-value="10">Nov</td>
1571
+ <td class="rdtMonth" data-value="11">Dec</td>
1572
+ </tr>
1573
+ </tbody>
1574
+ </table>
1575
+ </div>
1576
+ </div>
1577
+ </div>
1578
+ <div class="input-group-btn">
1579
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" tabindex="0">
1580
+ <span class="rioglyph rioglyph-pencil">
1581
+ </span>
1582
+ </button>
1583
+ </div>
1584
+ </div>
1585
+ </div>
1586
+ </div>
1587
+ <div class="width-300">
1588
+ <div class="text-color-dark max-width-100pct text-size-12 display-inline-block margin-bottom-5">SaveableDateInput (disabled)</div>
1589
+ <div class="form-group">
1590
+ <div class="input-group">
1591
+ <div class="rdt DatePicker form-group margin-0 width-100pct">
1592
+ <div class="input-group">
1593
+ <span class="input-group-addon">
1594
+ <span class="rioglyph rioglyph-calendar" aria-hidden="true">
1595
+ </span>
1596
+ </span>
1597
+ <div class="ClearableInput input-group">
1598
+ <input type="text" class="form-control" disabled="" value="12/12/2025 3:20 PM" style="border-top-right-radius: 0px; border-bottom-right-radius: 0px;">
1599
+ </div>
1600
+ </div>
1601
+ <div class="rdtPicker">
1602
+ <div class="rdtDays">
1603
+ <table>
1604
+ <thead>
1605
+ <tr>
1606
+ <th class="rdtPrev">
1607
+ <span>‹</span>
1608
+ </th>
1609
+ <th class="rdtSwitch" colspan="5" data-value="11">December 2025</th>
1610
+ <th class="rdtNext">
1611
+ <span>›</span>
1612
+ </th>
1613
+ </tr>
1614
+ <tr>
1615
+ <th class="dow">Su</th>
1616
+ <th class="dow">Mo</th>
1617
+ <th class="dow">Tu</th>
1618
+ <th class="dow">We</th>
1619
+ <th class="dow">Th</th>
1620
+ <th class="dow">Fr</th>
1621
+ <th class="dow">Sa</th>
1622
+ </tr>
1623
+ </thead>
1624
+ <tbody>
1625
+ <tr>
1626
+ <td data-value="30" data-month="10" data-year="2025" class="rdtDay rdtOld">30</td>
1627
+ <td data-value="1" data-month="11" data-year="2025" class="rdtDay">1</td>
1628
+ <td data-value="2" data-month="11" data-year="2025" class="rdtDay">2</td>
1629
+ <td data-value="3" data-month="11" data-year="2025" class="rdtDay">3</td>
1630
+ <td data-value="4" data-month="11" data-year="2025" class="rdtDay">4</td>
1631
+ <td data-value="5" data-month="11" data-year="2025" class="rdtDay">5</td>
1632
+ <td data-value="6" data-month="11" data-year="2025" class="rdtDay">6</td>
1633
+ </tr>
1634
+ <tr>
1635
+ <td data-value="7" data-month="11" data-year="2025" class="rdtDay">7</td>
1636
+ <td data-value="8" data-month="11" data-year="2025" class="rdtDay">8</td>
1637
+ <td data-value="9" data-month="11" data-year="2025" class="rdtDay">9</td>
1638
+ <td data-value="10" data-month="11" data-year="2025" class="rdtDay">10</td>
1639
+ <td data-value="11" data-month="11" data-year="2025" class="rdtDay">11</td>
1640
+ <td data-value="12" data-month="11" data-year="2025" class="rdtDay rdtActive rdtToday">12</td>
1641
+ <td data-value="13" data-month="11" data-year="2025" class="rdtDay">13</td>
1642
+ </tr>
1643
+ <tr>
1644
+ <td data-value="14" data-month="11" data-year="2025" class="rdtDay">14</td>
1645
+ <td data-value="15" data-month="11" data-year="2025" class="rdtDay">15</td>
1646
+ <td data-value="16" data-month="11" data-year="2025" class="rdtDay">16</td>
1647
+ <td data-value="17" data-month="11" data-year="2025" class="rdtDay">17</td>
1648
+ <td data-value="18" data-month="11" data-year="2025" class="rdtDay">18</td>
1649
+ <td data-value="19" data-month="11" data-year="2025" class="rdtDay">19</td>
1650
+ <td data-value="20" data-month="11" data-year="2025" class="rdtDay">20</td>
1651
+ </tr>
1652
+ <tr>
1653
+ <td data-value="21" data-month="11" data-year="2025" class="rdtDay">21</td>
1654
+ <td data-value="22" data-month="11" data-year="2025" class="rdtDay">22</td>
1655
+ <td data-value="23" data-month="11" data-year="2025" class="rdtDay">23</td>
1656
+ <td data-value="24" data-month="11" data-year="2025" class="rdtDay">24</td>
1657
+ <td data-value="25" data-month="11" data-year="2025" class="rdtDay">25</td>
1658
+ <td data-value="26" data-month="11" data-year="2025" class="rdtDay">26</td>
1659
+ <td data-value="27" data-month="11" data-year="2025" class="rdtDay">27</td>
1660
+ </tr>
1661
+ <tr>
1662
+ <td data-value="28" data-month="11" data-year="2025" class="rdtDay">28</td>
1663
+ <td data-value="29" data-month="11" data-year="2025" class="rdtDay">29</td>
1664
+ <td data-value="30" data-month="11" data-year="2025" class="rdtDay">30</td>
1665
+ <td data-value="31" data-month="11" data-year="2025" class="rdtDay">31</td>
1666
+ <td data-value="1" data-month="0" data-year="2026" class="rdtDay rdtNew">1</td>
1667
+ <td data-value="2" data-month="0" data-year="2026" class="rdtDay rdtNew">2</td>
1668
+ <td data-value="3" data-month="0" data-year="2026" class="rdtDay rdtNew">3</td>
1669
+ </tr>
1670
+ <tr>
1671
+ <td data-value="4" data-month="0" data-year="2026" class="rdtDay rdtNew">4</td>
1672
+ <td data-value="5" data-month="0" data-year="2026" class="rdtDay rdtNew">5</td>
1673
+ <td data-value="6" data-month="0" data-year="2026" class="rdtDay rdtNew">6</td>
1674
+ <td data-value="7" data-month="0" data-year="2026" class="rdtDay rdtNew">7</td>
1675
+ <td data-value="8" data-month="0" data-year="2026" class="rdtDay rdtNew">8</td>
1676
+ <td data-value="9" data-month="0" data-year="2026" class="rdtDay rdtNew">9</td>
1677
+ <td data-value="10" data-month="0" data-year="2026" class="rdtDay rdtNew">10</td>
1678
+ </tr>
1679
+ </tbody>
1680
+ <tfoot>
1681
+ <tr>
1682
+ <td colspan="7" class="rdtTimeToggle">3:20 PM</td>
1683
+ </tr>
1684
+ </tfoot>
1685
+ </table>
1686
+ </div>
1687
+ </div>
1688
+ </div>
1689
+ <div class="input-group-btn">
1690
+ <button type="button" class="btn btn-primary btn-icon-only btn-component" disabled="" tabindex="0">
1691
+ <span class="rioglyph rioglyph-pencil">
1692
+ </span>
1693
+ </button>
1694
+ </div>
1695
+ </div>
1696
+ </div>
1697
+ </div>
1698
+ </div>
1699
+ ```
1700
+
1701
+ #### Props
1702
+
1703
+ | Name | Type | Default | Description |
1704
+ | --- | --- | --- | --- |
1705
+ | placeholder | String | — | The input placeholder. |
1706
+ | value | Date \| Moment \| String | — | The actual input value. |
1707
+ | isValid | boolean | true | Used to control the save button from the outside to disable it in case the entered value is not valid. |
1708
+ | errorMessage | string \| ReactNode | — | Uses the built-in error handling. This is the error message that is shown below the input. It will be shown when the "isValid" prop is set to false. |
1709
+ | hideErrorIcon | boolean | false | Defines wether the error icon is shown or not. If enabled, it will be shown when the "isValid" prop is set to false. |
1710
+ | onValueChanged | (value: Moment \| string, previousValue: Moment \| string \| Date) => void | — | Callback function triggered when the value changes and is saved. |
1711
+ | onInputChange | (value: Moment \| string, isValid: boolean) => void | — | Callback function that gets triggered on every input change. Use this to control the component or when implementing key validation. |
1712
+ | onEnterEdit | VoidFunction | — | Callback function that gets triggered when the input is in edit mode. Use this to control the component and to handle the previous value on the outside. |
1713
+ | onExitEdit | (wasSaved: boolean) => void | — | Callback function that gets triggered when edit mode is exited (either saved or cancelled). |
1714
+ | onCancel | VoidFunction | — | Callback function that gets triggered when the user aborts the edit mode. Use this to control the component and handle the resetting of previous value on the outside. |
1715
+ | invalidExitBehavior | "stay-open" \| "reset-and-close" | "stay-open" | Behavior when trying to exit edit mode with invalid input: stay-open: Keep edit mode open until valid input is provided reset-and-close: Close edit mode and reset to initial value |
1716
+ | buttonStyle | "default" \| "primary" | — | Defines the button style: default or primary. |
1717
+ | inputProps | Attributes | — | Additional HTML attributes to be set on the input element. |
1718
+ | datePickerProps | DatePickerProps | — | Props passed directly to the date picker component. |
1719
+ | disabled | Boolean | false | Disables the component so the user cannot enter the edit mode. |
1720
+ | inputClassName | String | — | Additional classes to be set on the input itself. |
1721
+ | className | String | — | Additional classes to be set on the wrapper element. |