@keboola/design 15.1.0 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/AGENTS.md +6 -5
  2. package/CHANGELOG.md +69 -0
  3. package/COMPONENT-API.md +62 -61
  4. package/dist/{AIKit-BR6jfsdI.js → AIKit-Cf5plya2.js} +328 -210
  5. package/dist/AIKit-Cf5plya2.js.map +1 -0
  6. package/dist/{Alert-Chz6KZ7e.js → Alert-DziS8n1H.js} +12 -19
  7. package/dist/{Alert-Chz6KZ7e.js.map → Alert-DziS8n1H.js.map} +1 -1
  8. package/dist/{AlertModal-DMsn62JJ.js → AlertModal-De04fFoy.js} +14 -24
  9. package/dist/{AlertModal-DMsn62JJ.js.map → AlertModal-De04fFoy.js.map} +1 -1
  10. package/dist/{AppShell-C8V1KRr_.js → AppShell-BUa3U7-e.js} +6 -9
  11. package/dist/{AppShell-C8V1KRr_.js.map → AppShell-BUa3U7-e.js.map} +1 -1
  12. package/dist/{AutoSaveTextarea-BbMhC5Aq.js → AutoSaveTextarea-CXHOQSun.js} +4 -5
  13. package/dist/{AutoSaveTextarea-BbMhC5Aq.js.map → AutoSaveTextarea-CXHOQSun.js.map} +1 -1
  14. package/dist/{Badge-CqlOE5A2.js → Badge-CFRhducL.js} +9 -14
  15. package/dist/{Badge-CqlOE5A2.js.map → Badge-CFRhducL.js.map} +1 -1
  16. package/dist/{BrandEditor-D61pzWRq.js → BrandEditor-hiLBX7az.js} +16 -23
  17. package/dist/{BrandEditor-D61pzWRq.js.map → BrandEditor-hiLBX7az.js.map} +1 -1
  18. package/dist/{BrandLogo-DkESE19K.js → BrandLogo-Dn7hhp2c.js} +4 -5
  19. package/dist/{BrandLogo-DkESE19K.js.map → BrandLogo-Dn7hhp2c.js.map} +1 -1
  20. package/dist/{Breadcrumb-DbqvDnYl.js → Breadcrumb-uGFEIjFF.js} +17 -28
  21. package/dist/{Breadcrumb-DbqvDnYl.js.map → Breadcrumb-uGFEIjFF.js.map} +1 -1
  22. package/dist/{Button-BNkyYU8u.js → Button-DbvGzEDb.js} +24 -20
  23. package/dist/Button-DbvGzEDb.js.map +1 -0
  24. package/dist/{Calendar-BnKi1kPu.js → Calendar-lJBTETbk.js} +752 -905
  25. package/dist/Calendar-lJBTETbk.js.map +1 -0
  26. package/dist/{Card-DxjGiqH8.js → Card-VIPfOVW5.js} +8 -14
  27. package/dist/{Card-DxjGiqH8.js.map → Card-VIPfOVW5.js.map} +1 -1
  28. package/dist/{Checkbox-CHDDJyAA.js → Checkbox-B2jLlyaO.js} +6 -8
  29. package/dist/{Checkbox-CHDDJyAA.js.map → Checkbox-B2jLlyaO.js.map} +1 -1
  30. package/dist/{Clipboard-DlwVZS1P.js → Clipboard-fAkDdpEu.js} +4 -5
  31. package/dist/{Clipboard-DlwVZS1P.js.map → Clipboard-fAkDdpEu.js.map} +1 -1
  32. package/dist/{ClipboardButton-B1Hr_n_Z.js → ClipboardButton-71Ugbl8c.js} +6 -8
  33. package/dist/{ClipboardButton-B1Hr_n_Z.js.map → ClipboardButton-71Ugbl8c.js.map} +1 -1
  34. package/dist/{CodeEditor-DVSPdfdo.js → CodeEditor-D_b-ZCng.js} +19 -31
  35. package/dist/{CodeEditor-DVSPdfdo.js.map → CodeEditor-D_b-ZCng.js.map} +1 -1
  36. package/dist/{Collapsible-DD4xTL75.js → Collapsible-zsXk4Vpp.js} +5 -8
  37. package/dist/{Collapsible-DD4xTL75.js.map → Collapsible-zsXk4Vpp.js.map} +1 -1
  38. package/dist/{ColorInput-B_eZIu39.js → ColorInput-Cjr1jkvy.js} +9 -12
  39. package/dist/{ColorInput-B_eZIu39.js.map → ColorInput-Cjr1jkvy.js.map} +1 -1
  40. package/dist/{ColorModeSwitch-BlrH8jAi.js → ColorModeSwitch-CuPYnJ2V.js} +5 -6
  41. package/dist/{ColorModeSwitch-BlrH8jAi.js.map → ColorModeSwitch-CuPYnJ2V.js.map} +1 -1
  42. package/dist/{Combobox-BLqX-Tdh.js → Combobox-DYjvYgl3.js} +37 -66
  43. package/dist/{Combobox-BLqX-Tdh.js.map → Combobox-DYjvYgl3.js.map} +1 -1
  44. package/dist/{Command-DhXmqFLT.js → Command-BcTb6GsR.js} +14 -24
  45. package/dist/{Command-DhXmqFLT.js.map → Command-BcTb6GsR.js.map} +1 -1
  46. package/dist/{CopyField-D0Pg4Z0R.js → CopyField-CnwAvQz9.js} +16 -28
  47. package/dist/{CopyField-D0Pg4Z0R.js.map → CopyField-CnwAvQz9.js.map} +1 -1
  48. package/dist/{DateInput-duinbI9_.js → DateInput-DJNX7Vdx.js} +8 -10
  49. package/dist/{DateInput-duinbI9_.js.map → DateInput-DJNX7Vdx.js.map} +1 -1
  50. package/dist/{DatePicker-Cg_aG_N4.js → DatePicker-CI59gF3S.js} +4 -5
  51. package/dist/{DatePicker-Cg_aG_N4.js.map → DatePicker-CI59gF3S.js.map} +1 -1
  52. package/dist/{DateRangeInput-BYVHf9zo.js → DateRangeInput-B3g8cyS0.js} +8 -10
  53. package/dist/{DateRangeInput-BYVHf9zo.js.map → DateRangeInput-B3g8cyS0.js.map} +1 -1
  54. package/dist/{DateRangePicker-m47cSV1r.js → DateRangePicker-48yOB2qV.js} +9 -10
  55. package/dist/{DateRangePicker-m47cSV1r.js.map → DateRangePicker-48yOB2qV.js.map} +1 -1
  56. package/dist/{DiffView-Dy4z-n-1.js → DiffView-DITZdVbh.js} +7 -12
  57. package/dist/{DiffView-Dy4z-n-1.js.map → DiffView-DITZdVbh.js.map} +1 -1
  58. package/dist/{DropdownMenu-Bum99mVf.js → DropdownMenu-Ba9atqDa.js} +20 -36
  59. package/dist/{DropdownMenu-Bum99mVf.js.map → DropdownMenu-Ba9atqDa.js.map} +1 -1
  60. package/dist/{FieldBox-BrxLkY9C.js → FieldBox-DdSdJ3ZN.js} +6 -10
  61. package/dist/{FieldBox-BrxLkY9C.js.map → FieldBox-DdSdJ3ZN.js.map} +1 -1
  62. package/dist/{FieldItem-BHUqgSO1.js → FieldItem-D7eCMfMB.js} +6 -8
  63. package/dist/{FieldItem-BHUqgSO1.js.map → FieldItem-D7eCMfMB.js.map} +1 -1
  64. package/dist/{FieldItem-CPN1xjN5.d.ts → FieldItem-fqm3CNR8.d.ts} +7 -6
  65. package/dist/{FileUpload-BYFONpEl.js → FileUpload-DskvxhAr.js} +25 -45
  66. package/dist/{FileUpload-BYFONpEl.js.map → FileUpload-DskvxhAr.js.map} +1 -1
  67. package/dist/{Form-Dqbt_tIs.js → Form-BUNW7nlt.js} +24 -38
  68. package/dist/{Form-Dqbt_tIs.js.map → Form-BUNW7nlt.js.map} +1 -1
  69. package/dist/{FormGroup-V5kIgQRN.js → FormGroup-QJB21LKp.js} +12 -20
  70. package/dist/{FormGroup-V5kIgQRN.js.map → FormGroup-QJB21LKp.js.map} +1 -1
  71. package/dist/{FullScreenModal-DAvvlGOz.js → FullScreenModal-RzY5XxiG.js} +8 -12
  72. package/dist/{FullScreenModal-DAvvlGOz.js.map → FullScreenModal-RzY5XxiG.js.map} +1 -1
  73. package/dist/{HoverCard-Cf9iYyaW.js → HoverCard-OGWKRXJ7.js} +4 -6
  74. package/dist/{HoverCard-Cf9iYyaW.js.map → HoverCard-OGWKRXJ7.js.map} +1 -1
  75. package/dist/{InlineEdit-D4P0SvCB.js → InlineEdit-CXL0ZslO.js} +7 -8
  76. package/dist/{InlineEdit-D4P0SvCB.js.map → InlineEdit-CXL0ZslO.js.map} +1 -1
  77. package/dist/{InputGroup-CZv_7QlM.js → InputGroup-BWeanEo7.js} +9 -15
  78. package/dist/{InputGroup-CZv_7QlM.js.map → InputGroup-BWeanEo7.js.map} +1 -1
  79. package/dist/{Kbd-CflKthfu.js → Kbd-BprYCICe.js} +8 -13
  80. package/dist/{Kbd-CflKthfu.js.map → Kbd-BprYCICe.js.map} +1 -1
  81. package/dist/{MarkedText-DlmlJO0u.js → MarkedText-BrganZ_V.js} +4 -6
  82. package/dist/{MarkedText-DlmlJO0u.js.map → MarkedText-BrganZ_V.js.map} +1 -1
  83. package/dist/{MermaidDiagram-2-EuNu1i.js → MermaidDiagram-E3azndPk.js} +9 -11
  84. package/dist/{MermaidDiagram-2-EuNu1i.js.map → MermaidDiagram-E3azndPk.js.map} +1 -1
  85. package/dist/{Modal-DwuvuiUx.js → Modal-Cf_kPEBW.js} +13 -21
  86. package/dist/{Modal-DwuvuiUx.js.map → Modal-Cf_kPEBW.js.map} +1 -1
  87. package/dist/{ModalTitle-RGWwIMU6.js → ModalTitle-7vgpfc6B.js} +5 -8
  88. package/dist/{ModalTitle-RGWwIMU6.js.map → ModalTitle-7vgpfc6B.js.map} +1 -1
  89. package/dist/{MultiActionButtonGroup-Dzig87s1.js → MultiActionButtonGroup-8WQwL4UQ.js} +6 -8
  90. package/dist/{MultiActionButtonGroup-Dzig87s1.js.map → MultiActionButtonGroup-8WQwL4UQ.js.map} +1 -1
  91. package/dist/{Navbar-DHUS7XiU.js → Navbar-CRjxVboE.js} +13 -22
  92. package/dist/{Navbar-DHUS7XiU.js.map → Navbar-CRjxVboE.js.map} +1 -1
  93. package/dist/{OtpInput-CY8yCaJk.js → OtpInput-C5plPzGU.js} +7 -11
  94. package/dist/{OtpInput-CY8yCaJk.js.map → OtpInput-C5plPzGU.js.map} +1 -1
  95. package/dist/{PageHeader-CL1A6jFM.js → PageHeader-DosMyar2.js} +6 -10
  96. package/dist/{PageHeader-CL1A6jFM.js.map → PageHeader-DosMyar2.js.map} +1 -1
  97. package/dist/{PageLayout-C9aXTpqV.js → PageLayout-LcvJccOW.js} +5 -8
  98. package/dist/{PageLayout-C9aXTpqV.js.map → PageLayout-LcvJccOW.js.map} +1 -1
  99. package/dist/{PageToolbar-LKP6PiP_.js → PageToolbar-By2HznxO.js} +8 -10
  100. package/dist/{PageToolbar-LKP6PiP_.js.map → PageToolbar-By2HznxO.js.map} +1 -1
  101. package/dist/{Pagination-D27x5KmH.js → Pagination-DrXTrvfD.js} +11 -18
  102. package/dist/{Pagination-D27x5KmH.js.map → Pagination-DrXTrvfD.js.map} +1 -1
  103. package/dist/{Popconfirm-p72DiagN.js → Popconfirm-BJuDOHdv.js} +46 -25
  104. package/dist/Popconfirm-BJuDOHdv.js.map +1 -0
  105. package/dist/{Popover-DnBw5Uay.js → Popover-DhOPlWgF.js} +4 -6
  106. package/dist/{Popover-DnBw5Uay.js.map → Popover-DhOPlWgF.js.map} +1 -1
  107. package/dist/{RadioGroup-B0TwHjBb.js → RadioGroup-B9oC8P15.js} +12 -18
  108. package/dist/{RadioGroup-B0TwHjBb.js.map → RadioGroup-B9oC8P15.js.map} +1 -1
  109. package/dist/{Resizable-D8zs0kcq.js → Resizable-Co-L3qg7.js} +4 -6
  110. package/dist/{Resizable-D8zs0kcq.js.map → Resizable-Co-L3qg7.js.map} +1 -1
  111. package/dist/{Search-vyZwGKMU.js → Search-OgaNjqQM.js} +26 -21
  112. package/dist/Search-OgaNjqQM.js.map +1 -0
  113. package/dist/{SearchInput-DyYXyw3u.js → SearchInput-eLS-uvOn.js} +18 -29
  114. package/dist/SearchInput-eLS-uvOn.js.map +1 -0
  115. package/dist/{SectionNav-6hcIpZLO.js → SectionNav-L81iJBo3.js} +11 -14
  116. package/dist/{SectionNav-6hcIpZLO.js.map → SectionNav-L81iJBo3.js.map} +1 -1
  117. package/dist/{Select-C6zKeip5.js → Select-DRdkdzBp.js} +28 -25
  118. package/dist/{Select-C6zKeip5.js.map → Select-DRdkdzBp.js.map} +1 -1
  119. package/dist/{Sheet-DKG20J7W.js → Sheet-DVb4XoJ5.js} +12 -19
  120. package/dist/{Sheet-DKG20J7W.js.map → Sheet-DVb4XoJ5.js.map} +1 -1
  121. package/dist/{Sidebar-BlYqasnX.js → Sidebar-DYvodJWN.js} +43 -75
  122. package/dist/{Sidebar-BlYqasnX.js.map → Sidebar-DYvodJWN.js.map} +1 -1
  123. package/dist/{Slider-DrcsM8_G.js → Slider-B9IskDxf.js} +8 -12
  124. package/dist/{Slider-DrcsM8_G.js.map → Slider-B9IskDxf.js.map} +1 -1
  125. package/dist/{Stepper-CQrUPVFL.js → Stepper-D7VspVEt.js} +11 -19
  126. package/dist/{Stepper-CQrUPVFL.js.map → Stepper-D7VspVEt.js.map} +1 -1
  127. package/dist/{Switch-DccpSpzC.js → Switch-DONWW7ju.js} +4 -6
  128. package/dist/{Switch-DccpSpzC.js.map → Switch-DONWW7ju.js.map} +1 -1
  129. package/dist/{Table-CilEvpMq.js → Table-BwgBm3hJ.js} +12 -21
  130. package/dist/{Table-CilEvpMq.js.map → Table-BwgBm3hJ.js.map} +1 -1
  131. package/dist/{Tabs-Ck4uWf8U.js → Tabs-DmJB4l_N.js} +9 -14
  132. package/dist/{Tabs-Ck4uWf8U.js.map → Tabs-DmJB4l_N.js.map} +1 -1
  133. package/dist/{TextInput-CR0_USaY.js → TextInput--1CfZybC.js} +8 -10
  134. package/dist/TextInput--1CfZybC.js.map +1 -0
  135. package/dist/{ThemeProvider-BTK7AL-T.js → ThemeProvider-BCHllN7d.js} +8 -13
  136. package/dist/{ThemeProvider-BTK7AL-T.js.map → ThemeProvider-BCHllN7d.js.map} +1 -1
  137. package/dist/{TimePicker-lk3NGqeK.js → TimePicker-CCV3SOw5.js} +4 -6
  138. package/dist/{TimePicker-lk3NGqeK.js.map → TimePicker-CCV3SOw5.js.map} +1 -1
  139. package/dist/{Timeline-DUXgByUE.js → Timeline-EMOpTLAT.js} +8 -13
  140. package/dist/{Timeline-DUXgByUE.js.map → Timeline-EMOpTLAT.js.map} +1 -1
  141. package/dist/{Toast-937n7n8i.js → Toast-BOTINeTX.js} +4 -6
  142. package/dist/{Toast-937n7n8i.js.map → Toast-BOTINeTX.js.map} +1 -1
  143. package/dist/{ToggleAllTooltip-DEjbWFoj.js → ToggleAllTooltip-BFmA6TXf.js} +4 -6
  144. package/dist/{ToggleAllTooltip-DEjbWFoj.js.map → ToggleAllTooltip-BFmA6TXf.js.map} +1 -1
  145. package/dist/{ToggleGroup-BOz1yyz6.js → ToggleGroup-DsDS7k70.js} +3 -4
  146. package/dist/{ToggleGroup-BOz1yyz6.js.map → ToggleGroup-DsDS7k70.js.map} +1 -1
  147. package/dist/{Workbench-CxgNCs3I.js → Workbench-4s0xP6XU.js} +18 -32
  148. package/dist/{Workbench-CxgNCs3I.js.map → Workbench-4s0xP6XU.js.map} +1 -1
  149. package/dist/{ZoomableSvg-CxXKanUR.js → ZoomableSvg-BRPGgaWJ.js} +8 -10
  150. package/dist/{ZoomableSvg-CxXKanUR.js.map → ZoomableSvg-BRPGgaWJ.js.map} +1 -1
  151. package/dist/charts.d.ts +0 -16
  152. package/dist/charts.js +10 -19
  153. package/dist/charts.js.map +1 -1
  154. package/dist/{classNames-DcGnTh2N.js → classNames-DkX30VJU.js} +2 -3
  155. package/dist/{classNames-DcGnTh2N.js.map → classNames-DkX30VJU.js.map} +1 -1
  156. package/dist/editors.d.ts +2 -16
  157. package/dist/editors.js +16 -26
  158. package/dist/editors.js.map +1 -1
  159. package/dist/{findLiteralMatches-DgGLzyG0.js → findLiteralMatches-BaLZTPtx.js} +2 -3
  160. package/dist/{findLiteralMatches-DgGLzyG0.js.map → findLiteralMatches-BaLZTPtx.js.map} +1 -1
  161. package/dist/flint.d.ts +0 -2
  162. package/dist/flint.js +10 -14
  163. package/dist/flint.js.map +1 -1
  164. package/dist/{highlightCode-D354tCXO.js → highlightCode-2spZP7ZA.js} +2 -3
  165. package/dist/{highlightCode-D354tCXO.js.map → highlightCode-2spZP7ZA.js.map} +1 -1
  166. package/dist/{icons-ZIeZXXS7.js → icons-DDR9dFSr.js} +21 -40
  167. package/dist/{icons-ZIeZXXS7.js.map → icons-DDR9dFSr.js.map} +1 -1
  168. package/dist/icons.d.ts +1 -1
  169. package/dist/icons.js +1 -2
  170. package/dist/{index-D-itZ3VP.d.ts → index-BljYaTWL.d.ts} +1 -39
  171. package/dist/index.d.ts +418 -1296
  172. package/dist/index.js +75 -74
  173. package/dist/internal/blocks/AIKit.js +1 -2
  174. package/dist/internal/blocks/AppShell.js +1 -2
  175. package/dist/internal/blocks/AuthLayout.js +3 -4
  176. package/dist/internal/blocks/AutoSaveTextarea.js +1 -2
  177. package/dist/internal/blocks/BrandEditor.js +1 -2
  178. package/dist/internal/blocks/ChartPanel.js +3 -4
  179. package/dist/internal/blocks/ChipEditor.js +6 -7
  180. package/dist/internal/blocks/ClipboardButton.js +1 -2
  181. package/dist/internal/blocks/ColorInput.js +1 -2
  182. package/dist/internal/blocks/ColorModeSwitch.js +1 -2
  183. package/dist/internal/blocks/Command.js +1 -2
  184. package/dist/internal/blocks/CopyField.js +1 -2
  185. package/dist/internal/blocks/DashboardHero.js +2 -3
  186. package/dist/internal/blocks/DateInput.js +1 -2
  187. package/dist/internal/blocks/DateRangeInput.js +1 -2
  188. package/dist/internal/blocks/DiagramShared/DiagramSkeleton.js +1 -2
  189. package/dist/internal/blocks/EmptyConfigurationActionCard.js +2 -3
  190. package/dist/internal/blocks/EmptyState.js +1 -2
  191. package/dist/internal/blocks/ErrorState.js +1 -2
  192. package/dist/internal/blocks/ExportMenu.js +5 -6
  193. package/dist/internal/blocks/FacebookButton.js +3 -4
  194. package/dist/internal/blocks/Form/connectors/ComboboxField.js +3 -4
  195. package/dist/internal/blocks/Form/connectors/MultiComboboxField.js +2 -3
  196. package/dist/internal/blocks/Form.js +3 -2
  197. package/dist/internal/blocks/FormGroup.js +1 -2
  198. package/dist/internal/blocks/GoogleButton.js +3 -4
  199. package/dist/internal/blocks/InlineEdit.js +1 -2
  200. package/dist/internal/blocks/MicrosoftButton.js +3 -4
  201. package/dist/internal/blocks/MultiActionButtonGroup.js +1 -2
  202. package/dist/internal/blocks/MultiCombobox.js +7 -8
  203. package/dist/internal/blocks/NumberInput.js +2 -3
  204. package/dist/internal/blocks/OtpInput.js +1 -2
  205. package/dist/internal/blocks/PageHeader.js +1 -2
  206. package/dist/internal/blocks/PageLayout.js +1 -2
  207. package/dist/internal/blocks/PageToolbar.js +1 -2
  208. package/dist/internal/blocks/PasswordInput.js +5 -6
  209. package/dist/internal/blocks/SearchInput.js +1 -2
  210. package/dist/internal/blocks/SearchInputWithNavigation.js +6 -7
  211. package/dist/internal/blocks/SectionNav.js +1 -2
  212. package/dist/internal/blocks/SplitButton.js +4 -5
  213. package/dist/internal/blocks/StatCard.js +4 -6
  214. package/dist/internal/blocks/StatCard.js.map +1 -1
  215. package/dist/internal/blocks/TextInput.js +1 -2
  216. package/dist/internal/blocks/Textarea.js +3 -4
  217. package/dist/internal/blocks/TimeInput.js +6 -7
  218. package/dist/internal/components/Alert.js +1 -2
  219. package/dist/internal/components/AlertModal.js +1 -2
  220. package/dist/internal/components/Avatar.js +3 -4
  221. package/dist/internal/components/Badge.js +1 -2
  222. package/dist/internal/components/BrandLogo.js +1 -2
  223. package/dist/internal/components/Breadcrumb.js +1 -2
  224. package/dist/internal/components/Button.js +1 -2
  225. package/dist/internal/components/ButtonGroup.js +2 -3
  226. package/dist/internal/components/Calendar.js +1 -2
  227. package/dist/internal/components/Card.js +1 -2
  228. package/dist/internal/components/Checkbox.js +1 -2
  229. package/dist/internal/components/Clipboard.js +1 -2
  230. package/dist/internal/components/Collapsible.js +1 -2
  231. package/dist/internal/components/CollapsiblePanel.js +5 -6
  232. package/dist/internal/components/Combobox.js +1 -2
  233. package/dist/internal/components/DatePicker.js +1 -2
  234. package/dist/internal/components/DateRangePicker.js +1 -2
  235. package/dist/internal/components/DiffView.js +1 -2
  236. package/dist/internal/components/DotsLoader.js +2 -3
  237. package/dist/internal/components/DropdownMenu.js +1 -2
  238. package/dist/internal/components/EmptySearchContent.js +1 -2
  239. package/dist/internal/components/FileUpload.js +1 -2
  240. package/dist/internal/components/FullScreenModal.js +1 -2
  241. package/dist/internal/components/HelpBlock.js +1 -2
  242. package/dist/internal/components/HoverCard.js +1 -2
  243. package/dist/internal/components/InputGroup.js +1 -2
  244. package/dist/internal/components/Kbd.js +1 -2
  245. package/dist/internal/components/Label.js +2 -3
  246. package/dist/internal/components/Link.js +2 -3
  247. package/dist/internal/components/MarkedText.js +1 -2
  248. package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +3 -4
  249. package/dist/internal/components/MergeEditor/PaneHeader.js +1 -2
  250. package/dist/internal/components/MergeEditor/constants.js +1 -2
  251. package/dist/internal/components/MergeEditor/useMergeDiff.js +1 -2
  252. package/dist/internal/components/Modal.js +1 -2
  253. package/dist/internal/components/Navbar.js +1 -2
  254. package/dist/internal/components/Pagination.js +1 -2
  255. package/dist/internal/components/PanelWithDetails.js +4 -5
  256. package/dist/internal/components/Popconfirm.js +1 -2
  257. package/dist/internal/components/Popover.js +1 -2
  258. package/dist/internal/components/Progress.js +2 -3
  259. package/dist/internal/components/RadioGroup.js +1 -2
  260. package/dist/internal/components/Resizable.js +1 -2
  261. package/dist/internal/components/ScrollArea.js +3 -5
  262. package/dist/internal/components/ScrollArea.js.map +1 -1
  263. package/dist/internal/components/Search.js +1 -2
  264. package/dist/internal/components/Select.js +1 -2
  265. package/dist/internal/components/Separator.js +2 -3
  266. package/dist/internal/components/Sheet.js +1 -2
  267. package/dist/internal/components/Sidebar.js +1 -2
  268. package/dist/internal/components/Skeleton/Skeleton.js +2 -3
  269. package/dist/internal/components/Skeleton/SkeletonList.js +2 -3
  270. package/dist/internal/components/Slider.js +1 -2
  271. package/dist/internal/components/SpotlightBackdrop.js +3 -5
  272. package/dist/internal/components/SpotlightBackdrop.js.map +1 -1
  273. package/dist/internal/components/Stepper.js +1 -2
  274. package/dist/internal/components/Switch.js +1 -2
  275. package/dist/internal/components/Table.js +1 -2
  276. package/dist/internal/components/Tabs.js +1 -2
  277. package/dist/internal/components/ThemeProvider.js +2 -2
  278. package/dist/internal/components/TimePicker.js +1 -2
  279. package/dist/internal/components/Timeline.js +1 -2
  280. package/dist/internal/components/Toast.js +2 -2
  281. package/dist/internal/components/Toggle.js +2 -3
  282. package/dist/internal/components/ToggleGroup.js +1 -2
  283. package/dist/internal/components/Tooltip.js +1 -2
  284. package/dist/internal/components/Truncated.js +3 -4
  285. package/dist/internal/components/Workbench.js +1 -2
  286. package/dist/internal/components/ZoomableSvg.js +1 -2
  287. package/dist/internal/hooks/useAltDigitHotkey.js +1 -2
  288. package/dist/internal/hooks/useAutosizeInput.js +1 -2
  289. package/dist/internal/hooks/useScrollbarPosition.js +2 -3
  290. package/dist/internal/hooks/useStableCallback.js +1 -2
  291. package/dist/internal/hooks/useTimeout.js +1 -2
  292. package/dist/internal/utils/accessibleName.js +1 -2
  293. package/dist/internal/utils/mergeRefs.js +1 -2
  294. package/dist/internal/utils.js +3 -3
  295. package/dist/markdown-editor.d.ts +0 -4
  296. package/dist/markdown-editor.js +30 -49
  297. package/dist/markdown-editor.js.map +1 -1
  298. package/dist/mermaid.d.ts +0 -2
  299. package/dist/mermaid.js +1 -2
  300. package/dist/rjsf.d.ts +0 -8
  301. package/dist/rjsf.js +47 -78
  302. package/dist/rjsf.js.map +1 -1
  303. package/dist/{rolldown-runtime-Bdc48AWt.js → rolldown-runtime-BrwM56v-.js} +2 -3
  304. package/dist/{styles-T8xwr0sR.js → styles-BXXXosW_.js} +2 -3
  305. package/dist/{styles-T8xwr0sR.js.map → styles-BXXXosW_.js.map} +1 -1
  306. package/dist/{styles-DxazJ8Mz.js → styles-nwtCRF7y.js} +2 -3
  307. package/dist/{styles-DxazJ8Mz.js.map → styles-nwtCRF7y.js.map} +1 -1
  308. package/dist/styles.css +1 -1
  309. package/dist/{svgCache-Dhmbe-7i.js → svgCache-BzvN_fgr.js} +2 -3
  310. package/dist/{svgCache-Dhmbe-7i.js.map → svgCache-BzvN_fgr.js.map} +1 -1
  311. package/dist/{svgTransforms-Hnvev3Vs.js → svgTransforms-BBxxO9T6.js} +4 -6
  312. package/dist/{svgTransforms-Hnvev3Vs.js.map → svgTransforms-BBxxO9T6.js.map} +1 -1
  313. package/dist/testing.d.ts +0 -2
  314. package/dist/testing.js +2 -3
  315. package/dist/{themeScopeContext-CEVXbYvZ.js → themeScopeContext-BZGPdyG8.js} +6 -11
  316. package/dist/{themeScopeContext-CEVXbYvZ.js.map → themeScopeContext-BZGPdyG8.js.map} +1 -1
  317. package/dist/{themeTokens-DCeb62ap.js → themeTokens-B60cQtAY.js} +4 -6
  318. package/dist/{themeTokens-DCeb62ap.js.map → themeTokens-B60cQtAY.js.map} +1 -1
  319. package/dist/{toast-Y3cTMBW8.js → toast-Dzj1EFOb.js} +10 -17
  320. package/dist/{toast-Y3cTMBW8.js.map → toast-Dzj1EFOb.js.map} +1 -1
  321. package/dist/{types-BPcAjMG0.d.ts → types-CsZuwfxc.d.ts} +1 -3
  322. package/dist/{useControllableState-CUYXMsfz.js → useControllableState-BCvUOC6G.js} +2 -3
  323. package/dist/{useControllableState-CUYXMsfz.js.map → useControllableState-BCvUOC6G.js.map} +1 -1
  324. package/dist/{useElement-D-RjrGa4.js → useElement-Dcoo9Jlr.js} +2 -3
  325. package/dist/{useElement-D-RjrGa4.js.map → useElement-Dcoo9Jlr.js.map} +1 -1
  326. package/dist/{useMergeDiff-CvowEXJ1.js → useMergeDiff-DFIATaTw.js} +3 -5
  327. package/dist/{useMergeDiff-CvowEXJ1.js.map → useMergeDiff-DFIATaTw.js.map} +1 -1
  328. package/dist/{utils-DwC9u0tM.js → utils-DjFceY3H.js} +18 -34
  329. package/dist/{utils-DwC9u0tM.js.map → utils-DjFceY3H.js.map} +1 -1
  330. package/dist/vega.d.ts +1 -5
  331. package/dist/vega.js +3 -4
  332. package/dist/{vegaTheme-ISwGXvof.js → vegaTheme-BcTNRmVS.js} +3 -4
  333. package/dist/{vegaTheme-ISwGXvof.js.map → vegaTheme-BcTNRmVS.js.map} +1 -1
  334. package/dist/{vegaTokens-DCkvpIVE.js → vegaTokens-DnCcy7JY.js} +3 -4
  335. package/dist/{vegaTokens-DCkvpIVE.js.map → vegaTokens-DnCcy7JY.js.map} +1 -1
  336. package/package.json +40 -40
  337. package/src/styles.css +70 -4
  338. package/src/theme.css +113 -11
  339. package/dist/AIKit-BR6jfsdI.js.map +0 -1
  340. package/dist/Button-BNkyYU8u.js.map +0 -1
  341. package/dist/Calendar-BnKi1kPu.js.map +0 -1
  342. package/dist/Popconfirm-p72DiagN.js.map +0 -1
  343. package/dist/Search-vyZwGKMU.js.map +0 -1
  344. package/dist/SearchInput-DyYXyw3u.js.map +0 -1
  345. package/dist/TextInput-CR0_USaY.js.map +0 -1
package/dist/rjsf.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rjsf.js","names":["resolveByPath"],"sources":["../src/blocks/RjsfSchemaEditor/fieldHelpers.ts","../src/blocks/RjsfSchemaEditor/markdownContext.ts","../src/blocks/RjsfSchemaEditor/widgets/CodeEditorWidget.tsx","../src/blocks/RjsfSchemaEditor/fields/CodeEditorField.tsx","../src/blocks/RjsfSchemaEditor/SchemaDescription.tsx","../src/blocks/RjsfSchemaEditor/fields/GridObjectField.tsx","../src/blocks/RjsfSchemaEditor/fields/InfoField.tsx","../src/blocks/RjsfSchemaEditor/TooltipIcon.tsx","../src/blocks/RjsfSchemaEditor/fields/TableArrayField.tsx","../src/blocks/RjsfSchemaEditor/fields/TabsObjectField.tsx","../src/blocks/RjsfSchemaEditor/templates/ArrayFieldItemTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ArrayFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/DescriptionFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ErrorListTemplate.tsx","../src/blocks/RjsfSchemaEditor/RootFormDataContext.ts","../src/blocks/RjsfSchemaEditor/templates/FieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ObjectFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/widgets/CheckboxesWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/CheckboxWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/DateWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/DynamicSelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/MultiSelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/NumberWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/PasswordWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/RadioWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/SelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TemplateWatchWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TextareaWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TextWidget.tsx","../src/blocks/RjsfSchemaEditor/registry.ts","../src/blocks/RjsfSchemaEditor/schemaUtils.ts","../src/blocks/RjsfSchemaEditor/RjsfSchemaEditor.tsx"],"sourcesContent":["/**\n * Shared helpers for RJSF custom fields, templates and widgets.\n */\nimport type { Field, Registry, UiSchema } from '@rjsf/utils';\n\n/** No-op function reused as onBlur/onFocus stub in custom fields. */\nconst noop = () => {};\n\nconst NullField: Field = () => null;\n\n/** RJSF always registers SchemaField; the fallback only satisfies the indexed-access type. */\nexport const getSchemaField = (registry: Registry): Field =>\n registry.fields.SchemaField ?? NullField;\n\n/** Stub props shared by all custom SchemaField call-sites (onBlur, onFocus, errorSchema). */\nexport const SCHEMA_FIELD_STUBS = {\n onBlur: noop,\n onFocus: noop,\n errorSchema: {} satisfies Record<string, never>,\n};\n\n/** Whether a value is a keyed namespace — an object that is neither `null` nor an array. */\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\n/**\n * Resolves a dot-path against an object (e.g. \"_metadata_.table.columns\").\n *\n * json-editor watch paths may be prefixed with the schema `id` (e.g.\n * \"rootschema.endpoints.contact\"). The prefix is not a real data key — it\n * identifies the schema root. When the first segment doesn't exist in `data`\n * we retry without it so components using this convention still resolve.\n */\nexport const resolveByPath = (path: string, data: Record<string, unknown>): unknown => {\n const parts = path.split('.');\n const walk = (segments: string[]): unknown => {\n let current: unknown = data;\n for (const part of segments) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n };\n const result = walk(parts);\n const [first] = parts;\n if (result !== undefined || first === undefined || parts.length <= 1) return result;\n // First segment may be a schema id prefix — retry without it.\n if (!(first in data)) return walk(parts.slice(1));\n return result;\n};\n\n/**\n * Extracts a property name from a simple Mustache-like template.\n * e.g. \"{{item.field_name}}\" → \"field_name\"\n */\nexport const extractProperty = (template: string): string => {\n const match = /\\{\\{item\\.(\\w+)\\}\\}/.exec(template);\n return match?.[1] ?? '';\n};\n\n/**\n * Builds select options from watched form data and enumSource config.\n *\n * Supports two json-editor enumSource formats:\n * 1. String: `enumSource: \"varName\"` — use the watched array directly as string values\n * 2. Array: `enumSource: [{ source, value, title }]` — map items through templates\n */\nexport const buildDynamicOptions = (\n watch: Record<string, string>,\n enumSource: unknown,\n rootFormData: Record<string, unknown>,\n): { value: string; label: string }[] => {\n if (typeof enumSource === 'string') {\n const watchPath = watch[enumSource];\n if (!watchPath) return [];\n const sourceData = resolveByPath(watchPath, rootFormData);\n if (!Array.isArray(sourceData)) return [];\n return sourceData.map((item) => {\n const val = String(item ?? '');\n return { value: val, label: val };\n });\n }\n\n if (Array.isArray(enumSource) && enumSource.length > 0) {\n if (enumSource.length > 1) {\n console.warn('[RJSF] Multiple enumSource entries are not supported, only the first is used.');\n }\n const source = enumSource[0] as { source: string; value: string; title: string };\n const watchPath = watch[source.source];\n if (!watchPath) return [];\n const sourceData = resolveByPath(watchPath, rootFormData);\n if (!Array.isArray(sourceData)) return [];\n\n const valueProp = extractProperty(source.value);\n const titleProp = extractProperty(source.title);\n\n return sourceData\n .filter((item): item is Record<string, unknown> => item != null && typeof item === 'object')\n .map((item) => ({\n value: String(item[valueProp] ?? ''),\n label: String(item[titleProp] ?? item[valueProp] ?? ''),\n }));\n }\n\n return [];\n};\n\n/**\n * Builds a child `fieldPathId` for a nested SchemaField.\n * Joins segments with \"_\" for the $id and appends them to the path array.\n */\nexport const childFieldPathId = (\n parentFieldPathId: { $id?: string; path?: (string | number)[] } | undefined,\n ...segments: (string | number)[]\n) => ({\n $id: [parentFieldPathId?.$id ?? 'root', ...segments].join('_'),\n path: [...(parentFieldPathId?.path ?? []), ...segments],\n});\n\n/**\n * Sorts object entries by `propertyOrder`, falling back to MAX_SAFE_INTEGER\n * for properties without an explicit order.\n */\nexport const sortByPropertyOrder = (\n properties: Record<string, { propertyOrder?: number }>,\n): string[] =>\n Object.entries(properties)\n .sort(\n ([, a], [, b]) =>\n (a.propertyOrder ?? Number.MAX_SAFE_INTEGER) - (b.propertyOrder ?? Number.MAX_SAFE_INTEGER),\n )\n .map(([key]) => key);\n\n/**\n * Whether the schema asked for this field to be hidden.\n *\n * - `ui:widget: 'hidden'` is what RJSF itself reads, but any widget branch in\n * `generateUiSchema` that runs later claims the slot and erases it.\n * - `ui:options.hidden` is the copy written last, so it survives all of them.\n */\nexport const isHiddenField = (fieldUiSchema: UiSchema | undefined): boolean =>\n fieldUiSchema?.['ui:widget'] === 'hidden' || !!fieldUiSchema?.['ui:options']?.hidden;\n\n/** The part of a schema node `isContainerSchema` reads. */\nexport type ContainerCandidate = {\n type?: string | string[];\n properties?: unknown;\n additionalProperties?: unknown;\n patternProperties?: unknown;\n items?: unknown;\n};\n\n/**\n * Whether a schema node holds children.\n *\n * - `properties`, `additionalProperties`, `patternProperties` or `items` alone qualify —\n * json-editor infers the container type from them and omits `type`.\n * - `type` may be a union (`['object', 'null']`).\n */\nexport const isContainerSchema = (schema: ContainerCandidate | undefined): boolean => {\n if (!schema) return false;\n if (schema.properties || schema.additionalProperties || schema.patternProperties) return true;\n if (schema.items) return true;\n if (Array.isArray(schema.type))\n return schema.type.includes('object') || schema.type.includes('array');\n return schema.type === 'object' || schema.type === 'array';\n};\n\n/**\n * Whether a hidden field's whole subtree should leave the form.\n *\n * - Hidden containers mount nothing. RJSF recurses into objects and arrays regardless of\n * hiddenness, so a `_metadata_` subtree costs hundreds of fields for no visible output.\n * - Hidden leaves are kept, wrapped in `tw:hidden`: their mount-phase onChange writes the\n * schema default that sibling `options.dependencies` resolve against.\n */\nexport const isHiddenContainer = (\n fieldUiSchema: UiSchema | undefined,\n schema: ContainerCandidate | undefined,\n): boolean => isHiddenField(fieldUiSchema) && isContainerSchema(schema);\n","import { createContext, use } from 'react';\nimport type { ReactNode } from 'react';\n\nexport type RenderMarkdown = (source: string) => ReactNode;\n\n/** Falls back to plain text when the host app doesn't provide a markdown renderer. */\nconst RenderMarkdownContext = createContext<RenderMarkdown>((source) => source);\n\nexport const RenderMarkdownProvider = RenderMarkdownContext;\n\nexport const useRenderMarkdown = (): RenderMarkdown => use(RenderMarkdownContext);\n","import { useEffect, useState } from 'react';\n\nimport { CodeEditor } from '../../../components/CodeEditor';\n// Deliberately not the barrel: CodeEditorWidget.test.tsx stubs the whole\n// `components/CodeEditor` module to avoid mounting a real editor, so anything\n// imported from there is a stub. The mode guard has to be the real one.\nimport { isLanguageMode, type LANGUAGE_MODE } from '../../../components/CodeEditor/helpers';\n\ntype CodeEditorWidgetProps = {\n id: string;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled?: boolean;\n readonly?: boolean;\n options: Record<string, unknown>;\n};\n\nconst isValidJson = (raw: string): boolean => {\n try {\n const parsed: unknown = JSON.parse(raw);\n return Boolean(parsed && typeof parsed === 'object');\n } catch {\n return false;\n }\n};\n\nconst sanitize = (val: unknown): string => {\n if (typeof val === 'object' && val !== null) return JSON.stringify(val, null, ' ');\n return String(val ?? '');\n};\n\nexport const CodeEditorWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n options,\n}: CodeEditorWidgetProps) => {\n const editorOptions = (options.editor ?? {}) as Record<string, unknown>;\n const rawMode = (editorOptions.mode as string) ?? 'application/json';\n const mode: LANGUAGE_MODE = isLanguageMode(rawMode) ? rawMode : 'application/json';\n const isJsonMode = mode === 'application/json';\n const isReadOnly = disabled || readonly || !!(editorOptions.readOnly as boolean);\n\n // The editor owns its text so the user's formatting is preserved while typing;\n // external value changes sync in below only when the parsed data actually differs.\n const [text, setText] = useState(() => sanitize(value));\n\n useEffect(() => {\n setText((currentText) => {\n const sanitized = sanitize(value);\n if (currentText === sanitized) return currentText;\n\n // For JSON, compare parsed data to avoid unnecessary reformatting\n if (isJsonMode && isValidJson(currentText)) {\n try {\n if (\n JSON.stringify(JSON.parse(currentText)) ===\n JSON.stringify(typeof value === 'object' ? value : JSON.parse(sanitized))\n ) {\n return currentText; // same data, different formatting — keep editor's format\n }\n } catch {\n // parse failed — fall through to replace the text\n }\n }\n\n return sanitized;\n });\n }, [value, isJsonMode]);\n\n const handleChange = (raw: string) => {\n setText(raw);\n if (isJsonMode && isValidJson(raw)) {\n onChange(JSON.parse(raw));\n } else {\n onChange(raw);\n }\n };\n\n const help =\n isJsonMode && !isReadOnly && options.encryptionHint !== false ? (\n <>\n Properties prefixed with <code>#</code> sign will be encrypted on save. Already encrypted\n strings will persist.\n </>\n ) : null;\n\n return (\n <div id={id}>\n {isReadOnly ? (\n <CodeEditor\n variant=\"field\"\n value={text}\n mode={mode}\n readOnly\n withCopyButton\n withLineNumbers={editorOptions.lineNumbers !== false}\n />\n ) : (\n <CodeEditor\n variant=\"field\"\n value={text}\n mode={mode}\n onChange={handleChange}\n withCopyButton\n withLineNumbers={editorOptions.lineNumbers !== false}\n help={help}\n />\n )}\n </div>\n );\n};\n","import type { FieldProps } from '@rjsf/utils';\n\nimport { CodeEditorWidget } from '../widgets/CodeEditorWidget';\n\n/**\n * Field wrapper for CodeEditorWidget when used with type: \"object\".\n * RJSF only applies ui:widget to primitive types, so object-typed\n * code editors need a custom field that delegates to the widget.\n */\nexport const CodeEditorField = ({\n fieldPathId,\n formData,\n onChange,\n disabled,\n readonly,\n uiSchema,\n}: FieldProps) => {\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n\n return (\n <CodeEditorWidget\n id={fieldPathId.$id}\n value={formData}\n onChange={(val: unknown) => onChange(val, fieldPathId.path)}\n disabled={!!disabled}\n readonly={!!readonly}\n options={uiOptions ?? {}}\n />\n );\n};\n","import type { ReactNode } from 'react';\nimport DOMPurify from 'dompurify';\n\n/** Renders a schema description with sanitized HTML support (links, formatting, etc.). */\nexport const SchemaDescription = ({ description }: { description?: string }): ReactNode => {\n if (!description) return null;\n\n return (\n <p\n className=\"tw:text-xs tw:text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(description) }}\n />\n );\n};\n","import { useCallback, useRef } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport {\n childFieldPathId,\n type ContainerCandidate,\n getSchemaField,\n isHiddenContainer,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\n\ntype PropertyDef = ContainerCandidate & {\n title?: string;\n propertyOrder?: number;\n options?: { grid_columns?: number; grid_break?: boolean };\n};\n\n/**\n * Custom field that renders an object's properties in a responsive grid layout.\n * Used for schema objects with `format: \"grid\"` or `\"grid-strict\"`.\n * json-editor uses a 12-column grid; each property can specify `options.grid_columns`.\n * Supports `options.collapsed` for collapsible sections.\n */\nexport const GridObjectField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const properties = (schema.properties ?? {}) as Record<string, PropertyDef>;\n const data = (formData ?? {}) as Record<string, unknown>;\n const SchemaField = getSchemaField(registry);\n\n // Use a ref to always have the latest data in the onChange handler\n // without recreating callbacks on every render.\n const dataRef = useRef(data);\n dataRef.current = data;\n\n // Per-property onChange that merges the property value into the full object.\n // Without this, child SchemaFields would replace the entire object with just\n // the property value. We pass fieldPathId.path (this field's own path) so\n // RJSF's Form._set correctly places the full object at the right location.\n // Using the child's path would cause a mismatch: the full grid object would\n // be set at the leaf path, corrupting data (e.g. [object Object] in selects).\n const fieldPath = fieldPathId?.path;\n const onPropertyChange = useCallback(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (key: string) => (value: any, _childPath: any, errorSchema?: any, id?: string) => {\n onChange({ ...dataRef.current, [key]: value } as any, fieldPath, errorSchema, id);\n },\n [onChange, fieldPath],\n );\n\n const uiOptions = uiSchema['ui:options'] as Record<string, unknown> | undefined;\n const hasCollapsed = uiOptions?.collapsed !== undefined;\n const collapsed = !!uiOptions?.collapsed;\n const disableCollapse = !!uiOptions?.disableCollapse;\n\n // Hidden containers leave the tree; hidden leaves keep their mount.\n const mountedKeys = sortByPropertyOrder(properties).filter(\n (key) => !isHiddenContainer(uiSchema[key], properties[key]),\n );\n\n if (mountedKeys.length === 0) return null;\n\n const gridContent = (\n <div className=\"tw:grid tw:grid-cols-12 tw:gap-4 tw:[&>div:empty]:hidden\">\n {mountedKeys.map((key) => {\n const gridCols = properties[key]?.options?.grid_columns ?? 12;\n const gridBreak = !!properties[key]?.options?.grid_break;\n return (\n <div\n key={key}\n // The cell is a grid item even when its content is display:none, so a hidden\n // leaf's cell carries the class itself.\n className={isHiddenField(uiSchema[key]) ? 'tw:hidden' : undefined}\n style={{\n gridColumn: gridBreak ? '1 / -1' : `span ${Math.min(gridCols, 12)}`,\n }}\n >\n <SchemaField\n name={key}\n schema={schema.properties![key] as RJSFSchema}\n uiSchema={(uiSchema[key] ?? {}) as UiSchema}\n formData={data[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, key)}\n registry={registry}\n onChange={onPropertyChange(key)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </div>\n );\n })}\n </div>\n );\n\n // Collapsible grid section\n if (hasCollapsed && !disableCollapse) {\n const hasValues = Object.values(data).some(\n (v) => v !== undefined && v !== null && v !== '' && v !== false,\n );\n const defaultExpanded = hasValues ? !collapsed : true;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n header={schema.title || 'Settings'}\n defaultExpanded={defaultExpanded}\n headerClassName=\"tw:rounded-lg\"\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4\"\n >\n <SchemaDescription description={schema.description} />\n {gridContent}\n </CollapsiblePanel>\n );\n }\n\n // Grid objects with a title get a bordered card to visually separate sections.\n if (schema.title) {\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:p-4\">\n <h3 className=\"tw:mb-3 tw:text-base tw:font-medium tw:text-foreground\">{schema.title}</h3>\n <SchemaDescription description={schema.description} />\n {gridContent}\n </div>\n );\n }\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n <SchemaDescription description={schema.description} />\n {gridContent}\n </div>\n );\n};\n","import type { FieldProps } from '@rjsf/utils';\n\nimport { Alert } from '../../../components/Alert';\n\nconst VALID_ALERT_TYPES = new Set(['info', 'warning', 'error', 'success']);\n\ntype AlertVariant = 'info' | 'warning' | 'error' | 'success';\n\n/**\n * Custom field that renders static informational text.\n * Used for schema properties with `format: \"info\"`.\n * Displays title and description as a read-only alert.\n * Supports `options.alert_type` to control the alert variant\n * (`\"info\"` (default), `\"warning\"`, `\"error\"`, `\"success\"`).\n */\nexport const InfoField = ({ schema, uiSchema }: FieldProps) => {\n if (!schema.title && !schema.description) return null;\n\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const alertType = String(uiOptions?.alertType ?? 'info');\n const variant: AlertVariant = VALID_ALERT_TYPES.has(alertType)\n ? (alertType as AlertVariant)\n : 'info';\n\n return (\n <div className=\"tw:my-3\">\n <Alert variant={variant} title={schema.title}>\n {schema.description}\n </Alert>\n </div>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { Tooltip } from '../../components/Tooltip';\nimport { Info } from '../../icons';\n\nimport { useRenderMarkdown } from './markdownContext';\n\nexport const TooltipIcon = ({ rawHelp }: { rawHelp: string }): ReactNode => {\n const renderMarkdown = useRenderMarkdown();\n\n return (\n <Tooltip placement=\"top\" variant=\"explanatory\" tooltip={renderMarkdown(rawHelp)} triggerAsChild>\n <span className=\"tw:cursor-help tw:text-muted-foreground\">\n <Info className=\"tw:size-4\" />\n </span>\n </Tooltip>\n );\n};\n","import { useRef } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { Trash2 } from '../../../icons';\nimport {\n childFieldPathId,\n getSchemaField,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\nimport { TooltipIcon } from '../TooltipIcon';\n\ntype PropertyDef = {\n title?: string;\n type?: string;\n enum?: string[];\n propertyOrder?: number;\n default?: unknown;\n};\n\n/** Default value for a freshly added cell/item, honouring the schema default. */\nconst defaultValueFor = (prop: { type?: string; default?: unknown }): unknown => {\n if (prop.default !== undefined) return prop.default;\n if (prop.type === 'boolean') return false;\n if (prop.type === 'string') return '';\n return undefined;\n};\n\n/**\n * Custom field that renders an array as a table.\n * Used for schema arrays with `format: \"table\"`.\n *\n * - Array of objects: each item is a row, each property a column.\n * - Array of primitives (e.g. `items: { type: 'string' }`): each item is a\n * single-column row holding the value itself.\n *\n * Cells are rendered via RJSF's SchemaField so all registered widgets are used.\n */\nexport const TableArrayField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const items = (formData ?? []) as unknown[];\n const itemSchema = schema.items as Record<string, unknown> | undefined;\n const properties = (itemSchema?.properties ?? {}) as Record<string, PropertyDef>;\n const itemUiSchema = (uiSchema.items ?? {}) as UiSchema;\n\n const SchemaField = getSchemaField(registry);\n\n // Unfiltered: a table whose every column is hidden is still an array of objects, and a\n // new row seeds defaults for the hidden columns too.\n const allKeys = sortByPropertyOrder(properties);\n\n // A column the schema hides gets no header and no cells — a table cell has no sibling\n // dependencies to feed, so there is nothing to keep mounted.\n const columnKeys = allKeys.filter((key) => !isHiddenField(itemUiSchema[key]));\n\n // Arrays of primitives (strings, numbers, …) have no object properties, so\n // there are no columns to derive — render the item value in a single column.\n const isPrimitiveItems = allKeys.length === 0 && itemSchema != null;\n\n const isReadOnly = disabled || readonly;\n\n const fieldPath = fieldPathId?.path ?? [];\n\n // Keep a ref to items so onChange closures always read the latest data\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const handleCellChange = (rowIndex: number, key: string, value: unknown) => {\n const newItems = [...itemsRef.current];\n newItems[rowIndex] = { ...(newItems[rowIndex] as Record<string, unknown>), [key]: value };\n onChange(newItems, fieldPath);\n };\n\n const handleItemChange = (rowIndex: number, value: unknown) => {\n const newItems = [...itemsRef.current];\n newItems[rowIndex] = value;\n onChange(newItems, fieldPath);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n onChange(\n itemsRef.current.filter((_, i) => i !== rowIndex),\n fieldPath,\n );\n };\n\n const handleAddRow = () => {\n if (isPrimitiveItems) {\n onChange(\n [\n ...itemsRef.current,\n defaultValueFor({\n type: itemSchema?.type as string | undefined,\n default: itemSchema?.default,\n }),\n ],\n fieldPath,\n );\n return;\n }\n const newItem: Record<string, unknown> = {};\n for (const key of allKeys) {\n newItem[key] = defaultValueFor(properties[key] ?? {});\n }\n onChange([...itemsRef.current, newItem], fieldPath);\n };\n\n const withHiddenLabel = (base: UiSchema): UiSchema => ({\n ...base,\n 'ui:options': {\n ...base['ui:options'],\n label: false,\n },\n });\n\n const getCellUiSchema = (key: string): UiSchema =>\n withHiddenLabel((itemUiSchema[key] ?? {}) as UiSchema);\n\n const table = items.length > 0 && (\n <table className=\"tw:w-full tw:table-fixed tw:border-collapse tw:text-sm\">\n <thead>\n <tr>\n {isPrimitiveItems ? (\n <th className=\"tw:border-b tw:border-border tw:p-2 tw:text-left tw:text-xs tw:font-medium tw:text-muted-foreground\">\n {(itemSchema?.title as string) ?? ''}\n </th>\n ) : (\n columnKeys.map((key) => (\n <th\n key={key}\n className=\"tw:border-b tw:border-border tw:p-2 tw:text-left tw:text-xs tw:font-medium tw:text-muted-foreground\"\n >\n {properties[key]?.title ?? key}\n </th>\n ))\n )}\n {!isReadOnly && <th className=\"tw:w-20\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, rowIndex) => (\n <tr key={rowIndex} className=\"tw:border-b tw:border-border\">\n {isPrimitiveItems ? (\n <td className=\"tw:px-2 tw:py-1.5 tw:[&>div]:mb-0\">\n <SchemaField\n name={String(rowIndex)}\n schema={itemSchema as RJSFSchema}\n uiSchema={withHiddenLabel(itemUiSchema)}\n formData={item}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, rowIndex)}\n registry={registry}\n onChange={(val: unknown) => handleItemChange(rowIndex, val)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </td>\n ) : (\n columnKeys.map((key) => (\n <td key={key} className=\"tw:px-2 tw:py-1.5 tw:[&>div]:mb-0\">\n <SchemaField\n name={key}\n schema={properties[key] as unknown as RJSFSchema}\n uiSchema={getCellUiSchema(key)}\n formData={(item as Record<string, unknown>)[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, rowIndex, key)}\n registry={registry}\n onChange={(val: unknown) => handleCellChange(rowIndex, key, val)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </td>\n ))\n )}\n {!isReadOnly && (\n <td className=\"tw:px-2 tw:py-1.5 tw:text-right\">\n <Button\n variant=\"invisible\"\n size=\"icon\"\n onClick={() => handleRemoveRow(rowIndex)}\n aria-label=\"Remove row\"\n >\n <Trash2 className=\"tw:size-4\" />\n </Button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n\n const addButton = !isReadOnly && (\n <Button variant=\"outline\" onClick={handleAddRow}>\n Add {(itemSchema?.title as string) || 'Item'}\n </Button>\n );\n\n // Wrap in CollapsiblePanel when the table has a title\n if (schema.title) {\n const tooltip = uiSchema['ui:help'];\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={\n <span className=\"tw:inline-flex tw:items-center tw:gap-1\">\n {schema.title}\n {tooltip && <TooltipIcon rawHelp={tooltip} />}\n </span>\n }\n defaultExpanded\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4\"\n >\n <SchemaDescription description={schema.description} />\n {table}\n {addButton}\n </CollapsiblePanel>\n );\n }\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n <SchemaDescription description={schema.description} />\n {table}\n {addButton}\n </div>\n );\n};\n","import { useCallback, useRef, useState } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { Tabs, TabsContent } from '../../../components/Tabs';\nimport {\n childFieldPathId,\n type ContainerCandidate,\n getSchemaField,\n isHiddenContainer,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\n\ntype PropertyDef = ContainerCandidate & { title?: string; propertyOrder?: number };\n\n/**\n * Custom field that renders an object's properties as tabs.\n * Used for schema objects with `format: \"tabs\"`, `\"tabs-top\"`, or `\"categories\"`.\n * Each property becomes a tab panel.\n */\nexport const TabsObjectField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const properties = (schema.properties ?? {}) as Record<string, PropertyDef>;\n const data = (formData ?? {}) as Record<string, unknown>;\n const SchemaField = getSchemaField(registry);\n\n const dataRef = useRef(data);\n dataRef.current = data;\n\n const onPropertyChange = useCallback(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (key: string) => (value: any, path: any, errorSchema?: any, id?: string) => {\n onChange({ ...dataRef.current, [key]: value } as any, path, errorSchema, id);\n },\n [onChange],\n );\n\n // Hidden containers leave the tree; hidden leaves keep their mount. A hidden leaf gets no\n // tab of its own and renders below the strip, where `FieldTemplate` hides its wrapper.\n const mountedKeys = sortByPropertyOrder(properties).filter(\n (key) => !isHiddenContainer(uiSchema[key], properties[key]),\n );\n const tabKeys = mountedKeys.filter((key) => !isHiddenField(uiSchema[key]));\n const hiddenLeafKeys = mountedKeys.filter((key) => isHiddenField(uiSchema[key]));\n\n const [activeTab, setActiveTab] = useState(tabKeys[0] ?? '');\n\n if (mountedKeys.length === 0) return null;\n\n const triggers = tabKeys.map((key) => ({\n value: key,\n title: properties[key]?.title ?? key,\n }));\n\n const renderField = (key: string) => (\n <SchemaField\n key={key}\n name={key}\n schema={schema.properties![key] as RJSFSchema}\n uiSchema={(uiSchema[key] ?? {}) as UiSchema}\n formData={data[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, key)}\n registry={registry}\n onChange={onPropertyChange(key)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n );\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n {schema.title && (\n <h3 className=\"tw:text-base tw:font-medium tw:text-foreground\">{schema.title}</h3>\n )}\n <SchemaDescription description={schema.description} />\n {tabKeys.length > 0 && (\n <Tabs triggers={triggers} value={activeTab} onValueChange={setActiveTab} compact>\n {tabKeys.map((key) => (\n <TabsContent key={key} value={key}>\n {renderField(key)}\n </TabsContent>\n ))}\n </Tabs>\n )}\n {hiddenLeafKeys.map(renderField)}\n </div>\n );\n};\n","import type { ArrayFieldItemTemplateProps } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { Trash2 } from '../../../icons';\n\nexport const ArrayFieldItemTemplate = ({\n children,\n index,\n totalItems,\n schema,\n hasToolbar,\n disabled,\n readonly,\n buttonsProps,\n}: ArrayFieldItemTemplateProps) => {\n const isObject = schema.type === 'object';\n const canRemove = hasToolbar && buttonsProps.hasRemove && !disabled && !readonly;\n\n // Object array items use CollapsiblePanel for meaningful collapsing\n if (isObject) {\n const itemTitle = `${schema.title || 'Item'} ${index + 1}`;\n // Single item starts expanded; multiple items start collapsed to keep the page compact\n const defaultExpanded = totalItems <= 1;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={\n <div className=\"tw:flex tw:w-full tw:items-center tw:justify-between\">\n <span>{itemTitle}</span>\n {canRemove && (\n <div\n role=\"presentation\"\n onClick={(e) => e.stopPropagation()}\n onKeyUp={(e) => e.stopPropagation()}\n >\n <Button\n variant=\"invisible\"\n size=\"icon\"\n aria-label={`Remove ${itemTitle}`}\n onClick={buttonsProps.onRemoveItem}\n >\n <Trash2 className=\"tw:size-4\" />\n </Button>\n </div>\n )}\n </div>\n }\n defaultExpanded={defaultExpanded}\n >\n <div className=\"tw:flex tw:flex-col tw:gap-4\">{children}</div>\n </CollapsiblePanel>\n );\n }\n\n // Simple items use a card layout\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-4\">\n <div className=\"tw:flex tw:items-start tw:gap-3\">\n <div className=\"tw:flex tw:flex-1 tw:flex-col tw:gap-4\">{children}</div>\n {canRemove && (\n <Button\n variant=\"outline\"\n size=\"small\"\n className=\"tw:mt-5 tw:shrink-0\"\n onClick={buttonsProps.onRemoveItem}\n >\n Delete\n </Button>\n )}\n </div>\n </div>\n );\n};\n","import type { ArrayFieldTemplateProps } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\n\nexport const ArrayFieldTemplate = ({\n items,\n canAdd,\n onAddClick,\n title,\n schema,\n disabled,\n readonly,\n}: ArrayFieldTemplateProps) => {\n const isReadOnly = disabled || readonly;\n\n const itemLabel =\n typeof schema.items === 'object' && schema.items !== null && !Array.isArray(schema.items)\n ? (schema.items as { title?: string }).title || 'Item'\n : 'Item';\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n {(title || schema.description) && (\n <div>\n {title && <h3 className=\"tw:text-base tw:font-medium tw:text-foreground\">{title}</h3>}\n {schema.description && (\n <p className=\"tw:mt-1 tw:text-xs tw:text-muted-foreground\">{schema.description}</p>\n )}\n </div>\n )}\n {items}\n {canAdd && !isReadOnly && (\n <Button variant=\"outline\" onClick={onAddClick}>\n Add {itemLabel}\n </Button>\n )}\n </div>\n );\n};\n","import { isValidElement } from 'react';\nimport type { DescriptionFieldProps } from '@rjsf/utils';\nimport DOMPurify from 'dompurify';\n\n/**\n * Custom description template that renders HTML in schema descriptions.\n * Uses DOMPurify to sanitize the HTML before rendering.\n * Schema descriptions are authored by component developers and may contain\n * links (<a>), formatting (<strong>, <code>, <br>), etc.\n */\nexport const DescriptionFieldTemplate = ({ description, id }: DescriptionFieldProps) => {\n if (!description) return null;\n\n if (isValidElement(description)) {\n return <div id={id}>{description}</div>;\n }\n\n return (\n <p\n id={id}\n className=\"tw:text-xs tw:text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(String(description)) }}\n />\n );\n};\n","import type { ErrorListProps } from '@rjsf/utils';\n\nexport const ErrorListTemplate = ({ errors }: ErrorListProps) => {\n if (!errors.length) return null;\n\n return (\n <div className=\"tw:mb-4\">\n {errors.map((error) => (\n <p key={`${error.property}:${error.message}`} className=\"tw:text-xs tw:text-error-500\">\n {error.message}\n </p>\n ))}\n </div>\n );\n};\n","import { createContext, use } from 'react';\n\ntype RootFormDataValue = {\n /** Root form data with `rootContext` merged one level deep. */\n data: Record<string, unknown>;\n /** Read-only entries the form data does not own. */\n context: Record<string, Record<string, unknown>>;\n};\n\nconst RootFormDataContext = createContext<RootFormDataValue>({ data: {}, context: {} });\n\nexport const RootFormDataProvider = RootFormDataContext;\n\nexport const useRootFormData = (): Record<string, unknown> => use(RootFormDataContext).data;\n\nexport const useRootContext = (): Record<string, Record<string, unknown>> =>\n use(RootFormDataContext).context;\n","import type { ReactNode } from 'react';\nimport type { FieldTemplateProps } from '@rjsf/utils';\nimport DOMPurify from 'dompurify';\n\nimport { Label } from '../../../components/Label';\nimport { Link } from '../../../components/Link';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { BookOpen } from '../../../icons';\nimport { FormGroup } from '../../FormGroup';\nimport { isHiddenField } from '../fieldHelpers';\nimport { useRootFormData } from '../RootFormDataContext';\nimport { TooltipIcon } from '../TooltipIcon';\n\nconst resolveByPath = (parts: string[], data: Record<string, unknown>): unknown => {\n let current: unknown = data;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n};\n\n/**\n * Resolves a dependency path against form data.\n *\n * 1. `root.`-prefixed → from the root.\n * 2. Otherwise a sibling in the parent object, falling back to the root.\n */\nconst resolveDependencyValue = (\n path: string,\n formData: Record<string, unknown>,\n parentPath: (string | number)[],\n): unknown => {\n if (path.startsWith('root.')) {\n return resolveByPath(path.replace(/^root\\./, '').split('.'), formData);\n }\n const parent = resolveByPath(parentPath.map(String), formData);\n if (parent && typeof parent === 'object') {\n const sibling = resolveByPath(path.split('.'), parent as Record<string, unknown>);\n if (sibling !== undefined) return sibling;\n }\n return resolveByPath(path.split('.'), formData);\n};\n\n/**\n * Whether json-editor `options.dependencies` show the field; every entry must match.\n * - `\"value\"` — the field equals it\n * - `[\"a\", \"b\"]` — the field is one of them\n * - `\"\"` — the field is empty\n */\nconst evaluateDependencies = (\n dependencies: Record<string, unknown>,\n formData: Record<string, unknown>,\n parentPath: (string | number)[],\n): boolean => {\n for (const [path, expected] of Object.entries(dependencies)) {\n const actual = resolveDependencyValue(path, formData, parentPath);\n\n if (Array.isArray(expected)) {\n if (!expected.includes(actual)) return false;\n } else if (expected === '') {\n if (actual !== '' && actual !== undefined && actual !== null) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n};\n\nconst DocumentationLinkIcon = ({\n documentation,\n}: {\n documentation: { link: string; tooltip?: string };\n}): ReactNode => (\n <Tooltip\n placement=\"top\"\n variant=\"explanatory\"\n tooltip={documentation.tooltip ?? 'Open documentation'}\n triggerAsChild\n >\n <Link href={documentation.link}>\n <span className=\"tw:cursor-pointer tw:text-muted-foreground tw:hover:text-foreground\">\n <BookOpen className=\"tw:size-4\" />\n </span>\n </Link>\n </Tooltip>\n);\n\n/**\n * FormGroup wrapper with label, help and errors.\n * - Does not subscribe to RootFormDataContext, so it skips form-state re-renders.\n */\nconst FieldTemplateBody = ({\n id,\n label,\n rawHelp,\n rawDescription,\n rawErrors,\n children,\n schema,\n uiSchema,\n displayLabel,\n}: FieldTemplateProps) => {\n // Button pseudo-fields render bare\n const widget = uiSchema?.['ui:widget'];\n if (widget === 'test-connection' || widget === 'sync-action') {\n return <>{children}</>;\n }\n\n // Objects/arrays have their own templates, except an array with a widget (multi-select).\n if (schema.type === 'object') {\n return <>{children}</>;\n }\n if (schema.type === 'array' && !uiSchema?.['ui:widget']) {\n return <>{children}</>;\n }\n\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const documentation = uiOptions?.documentation as { link: string; tooltip?: string } | undefined;\n\n const hasErrors = rawErrors && rawErrors.length > 0;\n // Checkboxes label themselves; help icons sit outside that label so a click doesn't toggle.\n // Booleans rendered as select keep the FormGroup label.\n const isCheckbox = schema.type === 'boolean' && uiSchema?.['ui:widget'] !== 'select';\n const showLabel = displayLabel && label && !isCheckbox;\n\n const hasHelpIcons = Boolean(rawHelp || documentation);\n const helpIcons = (\n <>\n {rawHelp && <TooltipIcon rawHelp={rawHelp} />}\n {documentation && <DocumentationLinkIcon documentation={documentation} />}\n </>\n );\n\n return (\n <FormGroup state={hasErrors ? 'error' : 'default'}>\n {showLabel && (\n <Label htmlFor={id}>\n <span className=\"tw:inline-flex tw:items-center tw:gap-1\">\n {label}\n {helpIcons}\n </span>\n </Label>\n )}\n {!showLabel && !isCheckbox && hasHelpIcons && (\n <div className=\"tw:flex tw:items-center tw:gap-1\">{helpIcons}</div>\n )}\n {isCheckbox && hasHelpIcons ? (\n <div className=\"tw:flex tw:items-center tw:gap-1\">\n {children}\n {helpIcons}\n </div>\n ) : (\n children\n )}\n {rawDescription && (\n <FormGroup.Help>\n <span dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(rawDescription) }} />\n </FormGroup.Help>\n )}\n {hasErrors && <FormGroup.Help>{rawErrors.join('. ')}</FormGroup.Help>}\n </FormGroup>\n );\n};\n\n/**\n * FieldTemplateBody gated by `options.dependencies`.\n * - Only these fields subscribe to root form data, so the rest skip per-keystroke re-renders.\n */\nconst FieldTemplateWithDependencies = ({\n dependencies,\n keepMounted,\n ...props\n}: FieldTemplateProps & { dependencies: Record<string, unknown>; keepMounted: boolean }) => {\n const rootFormData = useRootFormData();\n // Not `id` split on \"_\" — that breaks snake_case keys.\n const parentPath = props.fieldPathId.path.slice(0, -1);\n if (!evaluateDependencies(dependencies, rootFormData, parentPath)) {\n // A computed field keeps its wrapper so the widget stays mounted and its value tracks the\n // watched paths; unmounting would freeze the value until the dependency lets it back in.\n return keepMounted ? <div className=\"tw:hidden\">{props.children}</div> : null;\n }\n return <FieldTemplateBody {...props} />;\n};\n\nexport const FieldTemplate = (props: FieldTemplateProps) => {\n // A hidden field keeps its widget mounted and loses only the FormGroup/Label wrapper.\n if (isHiddenField(props.uiSchema)) {\n return <div className=\"tw:hidden\">{props.children}</div>;\n }\n\n const uiOptions = props.uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const dependencies = uiOptions?.dependencies as Record<string, unknown> | undefined;\n\n if (dependencies) {\n return (\n <FieldTemplateWithDependencies\n dependencies={dependencies}\n keepMounted={props.uiSchema?.['ui:widget'] === 'template-watch'}\n {...props}\n />\n );\n }\n\n return <FieldTemplateBody {...props} />;\n};\n","import type { ObjectFieldTemplateProps } from '@rjsf/utils';\n\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { type ContainerCandidate, isHiddenContainer, isHiddenField } from '../fieldHelpers';\n\nexport const ObjectFieldTemplate = ({\n title,\n description,\n properties,\n formData,\n uiSchema,\n schema,\n fieldPathId,\n}: ObjectFieldTemplateProps) => {\n const isRoot = !fieldPathId?.path?.length;\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const hasCollapsed = uiOptions?.collapsed !== undefined;\n const collapsed = !!uiOptions?.collapsed;\n const disableCollapse = !!uiOptions?.disableCollapse;\n\n // Detect if this object is a direct child of an array (array item)\n // In that case, ArrayFieldItemTemplate already provides the card/panel wrapper\n const lastPathSegment = fieldPathId?.path?.at(-1);\n const isArrayItem = typeof lastPathSegment === 'number';\n\n // Hidden containers leave the tree; hidden leaves keep their mount.\n // The wrapper of a kept-but-hidden field carries `tw:hidden` itself — a display:none\n // wrapper is not a flex item, so tw:gap-4 spaces only the visible children.\n const childSchemas = (schema as { properties?: Record<string, ContainerCandidate> }).properties;\n const visibleProperties = properties.filter(\n (prop) => !isHiddenContainer(uiSchema?.[prop.name], childSchemas?.[prop.name]),\n );\n\n const renderChildren = (props: typeof visibleProperties) =>\n props.map((prop) => (\n <div\n key={prop.name}\n className={isHiddenField(uiSchema?.[prop.name]) ? 'tw:hidden' : undefined}\n >\n {prop.content}\n </div>\n ));\n\n if (isRoot) {\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">\n {renderChildren(visibleProperties)}\n </div>\n );\n }\n\n const childrenContent = renderChildren(visibleProperties);\n\n // Collapsible nested object when options.collapsed is explicitly set\n if (hasCollapsed && !disableCollapse) {\n const data = (formData ?? {}) as Record<string, unknown>;\n const hasValues = Object.values(data).some(\n (v) => v !== undefined && v !== null && v !== '' && v !== false,\n );\n const defaultExpanded = hasValues ? !collapsed : true;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={title || 'Settings'}\n defaultExpanded={defaultExpanded}\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\"\n >\n {description}\n {childrenContent}\n </CollapsiblePanel>\n );\n }\n\n // Array items render flat — the parent ArrayFieldItemTemplate provides the wrapper\n if (isArrayItem) {\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">{childrenContent}</div>\n );\n }\n\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-4\">\n {title && <h3 className=\"tw:mb-2 tw:text-base tw:font-medium tw:text-foreground\">{title}</h3>}\n {description && <p className=\"tw:mb-3 tw:text-xs tw:text-muted-foreground\">{description}</p>}\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">{childrenContent}</div>\n </div>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\nimport {\n enumOptionsDeselectValue,\n enumOptionsIsSelected,\n enumOptionsSelectValue,\n optionId,\n} from '@rjsf/utils';\n\nimport { Checkbox } from '../../../components/Checkbox';\nimport { cn } from '../../../utils';\n\n/**\n * A group of checkboxes for an array of enum values (`format: 'checkbox'`).\n *\n * - `options.inline` lays the options out in a wrapping row instead of a column.\n * - An option listed in `options.enumDisabled` is disabled on its own.\n */\nexport const CheckboxesWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n options,\n}: WidgetProps) => {\n const { enumOptions = [], enumDisabled, inline } = options;\n const selected = Array.isArray(value) ? value : [value];\n\n return (\n <div\n id={id}\n className={cn('tw:flex tw:gap-2', inline ? 'tw:flex-wrap tw:gap-x-4' : 'tw:flex-col')}\n >\n {enumOptions.map((option, index) => (\n <Checkbox\n key={index}\n id={optionId(id, index)}\n checked={enumOptionsIsSelected(option.value, selected)}\n disabled={\n disabled ||\n readonly ||\n (Array.isArray(enumDisabled) && enumDisabled.includes(option.value))\n }\n onCheckedChange={(checked) =>\n onChange(\n checked\n ? enumOptionsSelectValue(index, selected, enumOptions)\n : enumOptionsDeselectValue(index, selected, enumOptions),\n )\n }\n >\n {option.label}\n </Checkbox>\n ))}\n </div>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Checkbox } from '../../../components/Checkbox';\n\nexport const CheckboxWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n label,\n hideLabel,\n}: WidgetProps) => {\n const checked = !!value;\n\n return (\n <Checkbox id={id} checked={checked} onCheckedChange={onChange} disabled={disabled || readonly}>\n {hideLabel ? undefined : label}\n </Checkbox>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { DateInput } from '../../DateInput';\n\nexport const DateWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n // Parse YYYY-MM-DD as a local date to avoid UTC-offset day shift\n const dateValue = (() => {\n if (!value) return null;\n const parts = (value as string).split('-').map(Number);\n const [year, month, day] = parts;\n if (parts.length !== 3 || parts.some(Number.isNaN)) return null;\n if (year === undefined || month === undefined || day === undefined) return null;\n return new Date(year, month - 1, day);\n })();\n const isValid = dateValue && !Number.isNaN(dateValue.getTime());\n\n return (\n <DateInput\n id={id}\n value={isValid ? dateValue : null}\n onValueChange={(date) => {\n if (!date) {\n onChange(undefined);\n return;\n }\n // Store as ISO date string (YYYY-MM-DD)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n onChange(`${year}-${month}-${day}`);\n }}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder || 'Select a date'}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Combobox } from '../../../components/Combobox';\nimport type { LabeledItem } from '../../../components/Combobox/types';\nimport { buildDynamicOptions } from '../fieldHelpers';\nimport { useRootFormData } from '../RootFormDataContext';\n\n/**\n * Widget for fields using json-editor's enumSource/watch pattern.\n * Reads options dynamically from the root form data based on watched paths.\n */\nexport const DynamicSelectWidget = ({\n id,\n value,\n onChange,\n onBlur,\n disabled,\n readonly,\n options: widgetOptions,\n required,\n rawErrors,\n}: WidgetProps) => {\n const data = useRootFormData();\n\n const watch = widgetOptions.watch as Record<string, string> | undefined;\n const enumSource = widgetOptions.enumSource;\n\n const dynamicItems: LabeledItem[] = watch ? buildDynamicOptions(watch, enumSource, data) : [];\n\n // Ensure the current value is always in the options list (e.g. stored config value while the watched source is not loaded yet)\n const stringValue = value == null ? '' : String(value);\n const matched = dynamicItems.find((item) => item.value === stringValue);\n const fallbackItem =\n !matched && stringValue !== '' ? { value: stringValue, label: stringValue } : null;\n const selectedItem = matched ?? fallbackItem;\n const items = fallbackItem ? [fallbackItem, ...dynamicItems] : dynamicItems;\n\n return (\n <Combobox\n id={id}\n items={items}\n value={selectedItem}\n // A schema-required field must not offer a one-click route to a value the schema rejects.\n allowClear={!required}\n disabled={disabled || readonly}\n onBlur={() => onBlur(id, value)}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n onValueChange={(selected) => onChange(selected?.value ?? '')}\n />\n );\n};\n","import { useMemo } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { enumOptionsIsSelected, useDeepCompareMemo } from '@rjsf/utils';\n\nimport type { LabeledItem } from '../../../components/Combobox/types';\nimport { MultiCombobox } from '../../MultiCombobox';\n\n/**\n * A `MultiCombobox` over the `items.enum` options of a multi-value array.\n *\n * - Default for `async-multi-select`; it ignores `async`, `creatable` and `enumSource`, which a\n * host's replacement handles.\n * - A stored value outside `items.enum` stays a chip labelled by the value, so an edit keeps it.\n * - An option listed in `options.enumDisabled` cannot be picked.\n */\nexport const MultiSelectWidget = ({\n id,\n value,\n onChange,\n onBlur,\n disabled,\n readonly,\n options,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n // RJSF rebuilds these on every form change; stable `items` keep the list from re-filtering.\n const enumOptions = useDeepCompareMemo(options.enumOptions ?? []);\n const enumDisabled = useDeepCompareMemo(options.enumDisabled);\n const values = useDeepCompareMemo<unknown[]>(Array.isArray(value) ? value : []);\n\n // Keyed by index, so the typed value (a number, say) survives the round trip.\n const { items, selected, valueOf } = useMemo(() => {\n const entries = enumOptions.map((option, index) => ({\n value: option.value,\n item: {\n value: String(index),\n label: option.label,\n disabled: Array.isArray(enumDisabled) && enumDisabled.includes(option.value),\n },\n }));\n const all: { value: unknown; item: LabeledItem }[] = [...entries];\n // In stored order, so an added chip goes last and the rest stay where they were.\n const selected = values.map((stored, index) => {\n const known = entries.find((entry) => enumOptionsIsSelected(entry.value, [stored]));\n if (known) return known.item;\n const unknown = { value: stored, item: { value: `unknown-${index}`, label: String(stored) } };\n all.push(unknown);\n return unknown.item;\n });\n\n return {\n items: all.map((entry) => entry.item),\n selected,\n valueOf: new Map(all.map((entry) => [entry.item, entry.value])),\n };\n }, [enumOptions, enumDisabled, values]);\n\n return (\n <MultiCombobox<LabeledItem>\n id={id}\n items={items}\n value={selected}\n disabled={disabled || readonly}\n placeholder={placeholder}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n onBlur={() => onBlur(id, value)}\n onValueChange={(next) => onChange(next.map((item) => valueOf.get(item)))}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { NumberInput } from '../../../blocks/NumberInput';\n\nexport const NumberWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n schema,\n rawErrors,\n}: WidgetProps) => {\n return (\n <NumberInput\n id={id}\n value={value ?? null}\n onValueChange={(num) => onChange(num ?? undefined)}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n min={schema.minimum}\n max={schema.maximum}\n step={schema.multipleOf}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { PasswordInput } from '../../../blocks/PasswordInput';\n\nexport const PasswordWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n const stringValue = value == null ? '' : String(value);\n\n return (\n <PasswordInput\n id={id}\n value={stringValue}\n onValueChange={onChange}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n allowPasswordToggle\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { RadioGroup } from '../../../components/RadioGroup';\n\nexport const RadioWidget = ({ id, value, onChange, disabled, readonly, options }: WidgetProps) => {\n const enumOptions = (options.enumOptions ?? []) as { value: string; label: string }[];\n\n return (\n <RadioGroup\n id={id}\n value={value ?? ''}\n onValueChange={onChange}\n disabled={disabled || readonly}\n orientation=\"vertical\"\n >\n {enumOptions.map((opt) => (\n <RadioGroup.Item key={opt.value} value={opt.value}>\n {opt.label}\n </RadioGroup.Item>\n ))}\n </RadioGroup>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Combobox } from '../../../components/Combobox';\nimport type { LabeledItem } from '../../../components/Combobox/types';\n\nexport const SelectWidget = ({\n id,\n value,\n schema,\n onChange,\n onBlur,\n disabled,\n readonly,\n options,\n placeholder,\n required,\n rawErrors,\n}: WidgetProps) => {\n const enumOptions = (options.enumOptions ?? []) as { value: unknown; label: string }[];\n const isBoolean = schema.type === 'boolean';\n\n // Map values (including booleans) to string keys so the Combobox can match them\n const items: LabeledItem[] = enumOptions.map((o) => ({\n value: String(o.value ?? ''),\n label: o.label,\n }));\n\n const selectedItem = items.find((item) => item.value === (value == null ? '' : String(value)));\n\n return (\n <Combobox\n id={id}\n items={items}\n value={selectedItem ?? null}\n // A schema-required field must not offer a one-click route to a value the schema rejects.\n allowClear={!required}\n disabled={disabled || readonly}\n onBlur={() => onBlur(id, value)}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n placeholder={placeholder}\n onValueChange={(selected) => {\n const selectedValue = selected?.value ?? '';\n if (isBoolean) {\n onChange(selectedValue === 'true');\n return;\n }\n onChange(selectedValue);\n }}\n />\n );\n};\n","import { useEffect, useRef } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\nimport { TextInput } from '../../TextInput';\nimport { isRecord, resolveByPath } from '../fieldHelpers';\nimport { useRootContext, useRootFormData } from '../RootFormDataContext';\n\nconst stringify = (value: unknown): string => {\n if (value == null) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n};\n\n/** Replaces each `{{var}}` in a json-editor template with the form value at `watch[var]`. */\nconst resolveTemplate = (\n template: string,\n watch: Record<string, string>,\n rootFormData: Record<string, unknown>,\n): string => {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, varName: string) => {\n const watchPath = watch[varName];\n if (!watchPath) return '';\n return stringify(resolveByPath(watchPath, rootFormData));\n });\n};\n\n/**\n * Whether `rootContext` declares the value a path reads.\n *\n * - The entry key alone does not settle it: sync actions write form keys under the same key.\n * - Entry and segment must be own properties, not prototype members like `toString`.\n * - A path naming only an entry reads the whole namespace.\n */\nconst declaresPath = (\n segments: string[],\n rootContext: Record<string, Record<string, unknown>>,\n): boolean => {\n const [entryKey = '', key] = segments;\n const entry = rootContext[entryKey];\n return isRecord(entry) && (key === undefined || Object.hasOwn(entry, key));\n};\n\n/** Whether every watched path reads a value `rootContext` declares; false with none. */\nconst readsOnlyContext = (\n watch: Record<string, string>,\n rootContext: Record<string, Record<string, unknown>>,\n): boolean => {\n const paths = Object.values(watch);\n return (\n paths.length > 0 &&\n paths.every((path) => {\n const segments = path.split('.');\n // The first segment may be a schema id prefix — retry without it, as `resolveByPath` does.\n return declaresPath(segments, rootContext) || declaresPath(segments.slice(1), rootContext);\n })\n );\n};\n\n/**\n * json-editor `template`/`watch` (no `enumSource`): writes the computed value into form data.\n *\n * - `options.hidden`: renders nothing and always writes — feeds cross-object dependencies.\n * - Otherwise a read-only input that stops writing when every watched path reads\n * `rootContext`, which the configuration does not own.\n */\nexport const TemplateWatchWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors,\n options: widgetOptions,\n}: WidgetProps) => {\n const data = useRootFormData();\n const rootContext = useRootContext();\n\n const watch = widgetOptions.watch as Record<string, string> | undefined;\n const template = widgetOptions.template as string | undefined;\n const isContextView = !widgetOptions.hidden && !!watch && readsOnlyContext(watch, rootContext);\n\n const computed = watch && template ? resolveTemplate(template, watch, data) : stringify(value);\n\n const lastSetRef = useRef<string>(stringify(value));\n\n useEffect(() => {\n if (isContextView) return;\n if (computed !== lastSetRef.current) {\n lastSetRef.current = computed;\n onChange(computed);\n }\n }, [computed, onChange, isContextView]);\n\n if (widgetOptions.hidden) {\n return null;\n }\n\n return (\n <TextInput\n id={id}\n value={computed}\n readOnly\n disabled={disabled || readonly}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Textarea } from '../../../blocks/Textarea';\n\nexport const TextareaWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n options,\n rawErrors,\n}: WidgetProps) => {\n const rows = (options.rows as number) ?? 5;\n const stringValue = value == null ? '' : String(value);\n\n return (\n <Textarea\n id={id}\n value={stringValue}\n onValueChange={onChange}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n minRows={rows}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { ChangeEvent } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\nimport { TextInput } from '../../TextInput';\n\nexport const TextWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n schema,\n options,\n rawErrors,\n}: WidgetProps) => {\n const stringValue = value == null ? '' : typeof value === 'object' ? '' : String(value);\n const shouldTrim = !!options.trim;\n\n return (\n <TextInput\n id={id}\n value={stringValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n onChange(shouldTrim ? v.trim() : v);\n }}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n type={schema.format === 'email' ? 'email' : 'text'}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","/**\n * Default RJSF registry: design system widgets, custom fields, and templates.\n * Host-coupled entries (sync actions, SSH form) default to no-op stubs — the\n * host app injects its implementations via the RjsfSchemaEditor `widgets` and\n * `fields` props under the same registry keys.\n */\nimport type { RegistryFieldsType, RegistryWidgetsType, TemplatesType } from '@rjsf/utils';\n\nimport { CodeEditorField } from './fields/CodeEditorField';\nimport { GridObjectField } from './fields/GridObjectField';\nimport { InfoField } from './fields/InfoField';\nimport { TableArrayField } from './fields/TableArrayField';\nimport { TabsObjectField } from './fields/TabsObjectField';\nimport { ArrayFieldItemTemplate } from './templates/ArrayFieldItemTemplate';\nimport { ArrayFieldTemplate } from './templates/ArrayFieldTemplate';\nimport { DescriptionFieldTemplate } from './templates/DescriptionFieldTemplate';\nimport { ErrorListTemplate } from './templates/ErrorListTemplate';\nimport { FieldTemplate } from './templates/FieldTemplate';\nimport { ObjectFieldTemplate } from './templates/ObjectFieldTemplate';\nimport { CheckboxesWidget } from './widgets/CheckboxesWidget';\nimport { CheckboxWidget } from './widgets/CheckboxWidget';\nimport { CodeEditorWidget } from './widgets/CodeEditorWidget';\nimport { DateWidget } from './widgets/DateWidget';\nimport { DynamicSelectWidget } from './widgets/DynamicSelectWidget';\nimport { MultiSelectWidget } from './widgets/MultiSelectWidget';\nimport { NumberWidget } from './widgets/NumberWidget';\nimport { PasswordWidget } from './widgets/PasswordWidget';\nimport { RadioWidget } from './widgets/RadioWidget';\nimport { SelectWidget } from './widgets/SelectWidget';\nimport { TemplateWatchWidget } from './widgets/TemplateWatchWidget';\nimport { TextareaWidget } from './widgets/TextareaWidget';\nimport { TextWidget } from './widgets/TextWidget';\n\n// Rendered for host-coupled entries when the host app doesn't inject an implementation\nconst StubWidget = () => null;\nconst StubField = () => null;\n\nexport const defaultFields: RegistryFieldsType = {\n tableArray: TableArrayField,\n tabsObject: TabsObjectField,\n gridObject: GridObjectField,\n codeEditor: CodeEditorField,\n info: InfoField,\n sshForm: StubField,\n};\n\nexport const defaultWidgets: RegistryWidgetsType = {\n // Override RJSF defaults with design system components\n TextWidget,\n UpDownWidget: NumberWidget,\n TextareaWidget,\n PasswordWidget,\n SelectWidget,\n CheckboxWidget,\n CheckboxesWidget,\n RadioWidget,\n // RJSF maps standard formats to dedicated widgets\n EmailWidget: TextWidget,\n URLWidget: TextWidget,\n DateWidget,\n DateTimeWidget: TextWidget,\n // Custom widgets mapped via uiSchema\n 'code-editor': CodeEditorWidget,\n 'dynamic-select': DynamicSelectWidget,\n 'template-watch': TemplateWatchWidget,\n // Static enum options; the host's version adds async loading and creatable values\n 'async-multi-select': MultiSelectWidget,\n // Host-coupled widgets — injected by the host app\n 'test-connection': StubWidget,\n 'sync-action': StubWidget,\n 'async-select': StubWidget,\n};\n\nexport const defaultTemplates: Partial<TemplatesType> = {\n FieldTemplate,\n ObjectFieldTemplate,\n DescriptionFieldTemplate,\n ArrayFieldTemplate,\n ArrayFieldItemTemplate,\n ErrorListTemplate,\n};\n","import type { UiSchema } from '@rjsf/utils';\n\nimport { isContainerSchema } from './fieldHelpers';\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype JsonSchema = Record<string, any>;\n\n/** Resolves `$ref` against definitions; sibling keys (title, options) override the result. */\nconst resolveRef = (\n propSchema: JsonSchema,\n definitions: Record<string, JsonSchema> | undefined,\n): JsonSchema => {\n if (!propSchema.$ref || !definitions) return propSchema;\n const refPath = String(propSchema.$ref).replace('#/definitions/', '');\n const resolved = definitions[refPath];\n if (!resolved) return propSchema;\n // oxlint-disable-next-line no-unused-vars\n const { $ref, ...overrides } = propSchema;\n return { ...resolved, ...overrides };\n};\n\n/** Generates an RJSF uiSchema from json-editor `format` and `options` conventions. */\nexport const generateUiSchema = (\n schema: JsonSchema,\n readOnly = false,\n definitions?: Record<string, JsonSchema>,\n globalConfig?: Record<string, unknown>,\n /** When true, password fields render as plain text inputs (protected default branch). */\n hasProtectedDefaultBranch = false,\n): UiSchema => {\n const uiSchema: UiSchema = {};\n const defs = definitions ?? (schema.definitions as Record<string, JsonSchema> | undefined);\n\n if (readOnly) {\n uiSchema['ui:disabled'] = true;\n }\n\n const properties = schema.properties as Record<string, JsonSchema> | undefined;\n if (!properties) {\n // No direct properties — combiners and if/then/else below may still define some.\n } else {\n for (const [key, rawPropSchema] of Object.entries(properties)) {\n const propSchema = resolveRef(rawPropSchema, defs);\n const format = propSchema.format as string | undefined;\n const type = (propSchema.type ?? (propSchema.properties ? 'object' : undefined)) as\n | string\n | undefined;\n const options = propSchema.options as Record<string, unknown> | undefined;\n\n const fieldUi: UiSchema = {};\n\n // Default only: a hidden field no branch below claims renders RJSF's cheap hidden input.\n const isHidden = !!options?.hidden;\n if (isHidden) {\n fieldUi['ui:widget'] = 'hidden';\n }\n\n if (type === 'array' && format === 'table') {\n fieldUi['ui:field'] = 'tableArray';\n }\n\n if (type === 'array' && format === 'checkbox') {\n fieldUi['ui:widget'] = 'checkboxes';\n }\n\n if (format === 'radio' && propSchema.enum) {\n fieldUi['ui:widget'] = 'radio';\n }\n\n if (\n type === 'object' &&\n (format === 'tabs' || format === 'tabs-top' || format === 'categories')\n ) {\n fieldUi['ui:field'] = 'tabsObject';\n }\n\n if (type === 'object' && (format === 'grid' || format === 'grid-strict')) {\n fieldUi['ui:field'] = 'gridObject';\n }\n\n if (format === 'info') {\n fieldUi['ui:field'] = 'info';\n if (options?.alert_type) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n alertType: options.alert_type as string,\n };\n }\n }\n\n if (type === 'button' && format === 'test-connection') {\n fieldUi['ui:widget'] = 'test-connection';\n fieldUi['ui:options'] = (options ?? {}) as UiSchema['ui:options'];\n } else if (type === 'button' && format === 'sync-action') {\n fieldUi['ui:widget'] = 'sync-action';\n fieldUi['ui:options'] = (options ?? {}) as UiSchema['ui:options'];\n } else if ((type === 'string' || type === 'object') && format === 'editor') {\n // RJSF ignores ui:widget on objects\n if (type === 'object') {\n fieldUi['ui:field'] = 'codeEditor';\n } else {\n fieldUi['ui:widget'] = 'code-editor';\n }\n fieldUi['ui:options'] = {\n editor: (options?.editor ?? {}) as Record<string, unknown>,\n // `#` keys get encrypted; `encryption_hint: false` opts out JSON that is not\n // Keboola configuration, where ciphertext would be unusable.\n encryptionHint: options?.encryption_hint !== false,\n };\n } else if (type === 'object' && format === 'ssh-editor') {\n fieldUi['ui:field'] = 'sshForm';\n fieldUi['ui:options'] = { only_keys: !!options?.only_keys };\n } else if (type === 'string' && format === 'password') {\n if (!hasProtectedDefaultBranch) {\n fieldUi['ui:widget'] = 'password';\n }\n } else if (type === 'string' && format === 'textarea') {\n fieldUi['ui:widget'] = 'textarea';\n if (options?.input_height) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n rows: parseInputHeightToRows(String(options.input_height)),\n };\n }\n } else if (type === 'string' && format === 'trim') {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n trim: true,\n };\n } else if (isDynamicSelectSchema(propSchema)) {\n fieldUi['ui:widget'] = 'dynamic-select';\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n watch: propSchema.watch as Record<string, string>,\n enumSource: propSchema.enumSource as unknown[],\n tags: !!options?.tags,\n };\n } else if (isMultiSelectSchema(propSchema)) {\n // Must precede async-select: arrays with options.async also match isAsyncSelectSchema.\n const items = propSchema.items as JsonSchema | undefined;\n const itemsOptions = items?.options as Record<string, unknown> | undefined;\n fieldUi['ui:widget'] = 'async-multi-select';\n fieldUi['ui:options'] = {\n async: options?.async ?? itemsOptions?.async ?? null,\n creatable: !!options?.creatable || !!options?.tags,\n placeholder: String(\n (options?.inputAttributes as Record<string, string>)?.placeholder ?? '',\n ),\n ...(items?.watch && { watch: items.watch as Record<string, string> }),\n ...(items?.enumSource && { enumSource: items.enumSource }),\n };\n } else if (isAsyncSelectSchema(propSchema)) {\n fieldUi['ui:widget'] = 'async-select';\n fieldUi['ui:options'] = {\n async: options?.async ?? null,\n creatable: !!options?.creatable,\n placeholder: String(\n (options?.inputAttributes as Record<string, string>)?.placeholder ?? '',\n ),\n };\n }\n\n // Template/watch (no enumSource) → computed field.\n // - Hidden: an invisible helper that keeps its value in sync.\n // - Visible: read-only, as the schemas written for json-editor expect.\n // - Objects/arrays are always hidden — RJSF ignores `ui:widget` on them.\n if (isTemplateWatchSchema(propSchema)) {\n fieldUi['ui:widget'] = 'template-watch';\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n watch: propSchema.watch as Record<string, string>,\n template: propSchema.template as string,\n ...(isContainerSchema(propSchema) && { hidden: true }),\n };\n }\n\n if (type === 'boolean' && options?.enum_titles) {\n fieldUi['ui:widget'] = 'select';\n }\n\n // `collapsed: false` = collapsible, expanded by default\n if (options?.collapsed !== undefined) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n collapsed: !!options.collapsed,\n };\n }\n\n if (options?.disable_collapse) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n disableCollapse: true,\n };\n }\n\n // Conditional visibility\n if (options?.dependencies) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n dependencies: options.dependencies as Record<string, unknown>,\n };\n }\n\n // Forces a new row in grid layouts\n if (options?.grid_break) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n gridBreak: true,\n };\n }\n\n if (options?.enabled === false) {\n fieldUi['ui:disabled'] = true;\n }\n\n // Leaf values pre-filled from image_parameters disable the field; objects recurse below.\n const globalValue = globalConfig?.[key];\n if (globalValue !== undefined) {\n if (typeof globalValue !== 'object' || globalValue === null || Array.isArray(globalValue)) {\n fieldUi['ui:disabled'] = true;\n }\n }\n\n if (options?.tooltip) {\n fieldUi['ui:help'] = String(options.tooltip);\n }\n\n if ((options?.documentation as Record<string, unknown>)?.link) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n documentation: options?.documentation as { link: string; tooltip?: string },\n };\n }\n\n if (\n (options?.inputAttributes as Record<string, string>)?.placeholder &&\n !fieldUi['ui:widget']\n ) {\n fieldUi['ui:placeholder'] = String(\n (options?.inputAttributes as Record<string, string>)?.placeholder,\n );\n }\n\n if (options?.enum_titles && propSchema.enum) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n enumNames: options.enum_titles as string[],\n };\n }\n\n if (type === 'array') {\n const arrayOpts: Record<string, boolean> = {};\n if (options?.disable_array_add) arrayOpts.addable = false;\n if (options?.disable_array_delete) arrayOpts.removable = false;\n if (options?.disable_array_reorder) arrayOpts.orderable = false;\n if (Object.keys(arrayOpts).length > 0) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n ...arrayOpts,\n };\n }\n\n // optionsList pairs item-level enum_titles with items.enum for multiselect widgets\n const itemsEnumTitles = (propSchema.items?.options as Record<string, unknown> | undefined)\n ?.enum_titles;\n if (Array.isArray(itemsEnumTitles)) {\n fieldUi.items = { 'ui:options': { enumNames: itemsEnumTitles as string[] } };\n }\n }\n\n if (type === 'object' && propSchema.properties) {\n const nestedGlobal =\n globalValue && typeof globalValue === 'object' && !Array.isArray(globalValue)\n ? (globalValue as Record<string, unknown>)\n : undefined;\n const nested = generateUiSchema(\n propSchema,\n readOnly,\n defs,\n nestedGlobal,\n hasProtectedDefaultBranch,\n );\n Object.assign(fieldUi, nested);\n }\n\n if (type === 'array' && propSchema.items?.properties) {\n const itemsUi = generateUiSchema(\n propSchema.items as JsonSchema,\n readOnly,\n defs,\n undefined,\n hasProtectedDefaultBranch,\n );\n if (Object.keys(itemsUi).length > 0) {\n fieldUi.items = itemsUi;\n }\n }\n\n if ((propSchema.enumSource || propSchema.watch) && !fieldUi['ui:widget']) {\n console.warn(\n `[RJSF] Property \"${key}\" uses enumSource/watch which is not yet supported. It will render as a plain input.`,\n );\n }\n\n // After every widget branch: templates read `hidden` here, whatever took the widget slot.\n if (isHidden) {\n fieldUi['ui:options'] = { ...fieldUi['ui:options'], hidden: true };\n }\n\n if (Object.keys(fieldUi).length > 0) {\n uiSchema[key] = fieldUi;\n }\n }\n\n const orderedEntries = Object.entries(properties)\n .filter(([, prop]) => prop.propertyOrder !== undefined)\n .sort(\n ([, a], [, b]) =>\n (a.propertyOrder ?? Number.MAX_SAFE_INTEGER) -\n (b.propertyOrder ?? Number.MAX_SAFE_INTEGER),\n );\n\n if (orderedEntries.length > 0) {\n uiSchema['ui:order'] = [...orderedEntries.map(([key]) => key), '*'];\n }\n }\n\n for (const combiner of ['allOf', 'anyOf', 'oneOf'] as const) {\n const schemas = schema[combiner] as JsonSchema[] | undefined;\n if (schemas) {\n for (const subSchema of schemas) {\n const subUi = generateUiSchema(\n subSchema,\n readOnly,\n undefined,\n undefined,\n hasProtectedDefaultBranch,\n );\n Object.assign(uiSchema, subUi);\n }\n }\n }\n\n for (const branch of ['if', 'then', 'else'] as const) {\n const branchSchema = schema[branch] as JsonSchema | undefined;\n if (branchSchema?.properties) {\n const branchUi = generateUiSchema(\n branchSchema,\n readOnly,\n undefined,\n undefined,\n hasProtectedDefaultBranch,\n );\n Object.assign(uiSchema, branchUi);\n }\n }\n\n return uiSchema;\n};\n\nconst isDynamicSelectSchema = (schema: JsonSchema): boolean => {\n return !!(schema.enumSource && schema.watch && schema.type === 'string');\n};\n\nconst isTemplateWatchSchema = (schema: JsonSchema): boolean => {\n return !!(schema.template && schema.watch && !schema.enumSource);\n};\n\nconst isAsyncSelectSchema = (schema: JsonSchema): boolean => {\n return !!(schema.options?.async || schema.options?.creatable);\n};\n\nconst isMultiSelectSchema = (schema: JsonSchema): boolean => {\n const items = schema.items as JsonSchema | undefined;\n return !!(\n items &&\n schema.uniqueItems &&\n schema.type === 'array' &&\n schema.format !== 'checkbox' &&\n !Array.isArray(items) &&\n ['string', 'number', 'integer'].includes(items.type as string) &&\n (items.enum || items.enumSource || (schema.options as Record<string, unknown>)?.tags)\n );\n};\n\n/** CSS height like \"100px\" → approximate textarea rows. */\nconst parseInputHeightToRows = (height: string): number => {\n const px = parseInt(height, 10);\n if (Number.isNaN(px) || px <= 0) return 5;\n return Math.max(2, Math.round(px / 20));\n};\n\nconst CUSTOM_FORMATS = [\n 'table',\n 'editor',\n 'ssh-editor',\n 'trim',\n 'textarea',\n 'grid',\n 'grid-strict',\n 'tabs',\n 'tabs-top',\n 'categories',\n 'info',\n 'select',\n 'checkbox',\n 'json',\n 'button',\n 'radio',\n];\n\n/** Strips json-editor extensions (format: 'button', options, …) that RJSF/AJV reject. */\nexport const sanitizeSchema = (\n schema: JsonSchema,\n definitions?: Record<string, JsonSchema>,\n /** Skips additionalProperties:false, which breaks if/then/else branch semantics. */\n isConditionalBranch = false,\n): JsonSchema => {\n const cleaned = { ...schema };\n const defs = definitions ?? (cleaned.definitions as Record<string, JsonSchema> | undefined);\n\n // Empty enums are sync-action placeholders; AJV rejects every value against enum:[].\n if (Array.isArray(cleaned.enum) && cleaned.enum.length === 0) {\n delete cleaned.enum;\n }\n\n if (\n Array.isArray(cleaned.enum) &&\n cleaned.enum.length > 0 &&\n (cleaned.type === 'string' || cleaned.type === 'integer' || cleaned.type === 'number')\n ) {\n if (cleaned.default === undefined) {\n // Pre-select the first value, as json-editor did.\n cleaned.default = cleaned.enum[0];\n } else if (!cleaned.enum.includes(cleaned.default)) {\n // RJSF writes defaults into missing fields, so an out-of-enum one would be saved;\n // absent, the component's runtime default applies.\n delete cleaned.default;\n }\n }\n\n if (cleaned.properties && !cleaned.type) {\n cleaned.type = 'object';\n }\n\n // json-editor `required: true`; the parent loop already promoted it to its `required` array.\n if (cleaned.required === true) {\n delete cleaned.required;\n }\n\n // AJV rejects unknown formats\n if (CUSTOM_FORMATS.includes(cleaned.format as string)) {\n delete cleaned.format;\n }\n\n const properties = cleaned.properties as Record<string, JsonSchema> | undefined;\n if (properties) {\n const sanitizedProps: Record<string, JsonSchema> = {};\n const required = (cleaned.required as string[]) ?? [];\n const sanitizedRequired: string[] = [];\n\n for (const [key, rawPropSchema] of Object.entries(properties)) {\n const propSchema = resolveRef(rawPropSchema, defs);\n\n if (propSchema.type === 'button') {\n // A string RJSF accepts; the uiSchema maps it to its widget.\n sanitizedProps[key] = {\n type: 'string',\n title: propSchema.title,\n ...(propSchema.propertyOrder !== undefined && {\n propertyOrder: propSchema.propertyOrder,\n }),\n ...(propSchema.description !== undefined && { description: propSchema.description }),\n };\n continue;\n }\n\n // oneOf gives the select the enum_titles; titles[i] pairs with enum[i], else [true, false].\n if (propSchema.type === 'boolean' && propSchema.options?.enum_titles) {\n const titles = propSchema.options.enum_titles as string[];\n const sanitized = sanitizeSchema(propSchema, defs);\n const enumValues = (propSchema.enum as boolean[] | undefined) ?? [true, false];\n sanitized.oneOf = enumValues.map((value, index) => ({\n const: value,\n title: titles[index] ?? (value ? 'Yes' : 'No'),\n }));\n sanitizedProps[key] = sanitized;\n if (required.includes(key) || propSchema.required === true) {\n if (!sanitizedRequired.includes(key)) sanitizedRequired.push(key);\n }\n continue;\n }\n\n sanitizedProps[key] = sanitizeSchema(propSchema, defs);\n\n if (required.includes(key) || propSchema.required === true) {\n if (!sanitizedRequired.includes(key)) sanitizedRequired.push(key);\n }\n }\n\n cleaned.properties = sanitizedProps;\n if (sanitizedRequired.length > 0) {\n cleaned.required = sanitizedRequired;\n }\n\n // Hides RJSF's \"additional properties\" UI for stored keys the schema lacks. Skipped for:\n // - if/then/else branches, where it breaks JSON Schema semantics\n // - schemas with `if`, whose branches may add properties\n if (!isConditionalBranch && cleaned.additionalProperties === undefined && !cleaned.if) {\n cleaned.additionalProperties = false;\n }\n }\n\n for (const combiner of ['allOf', 'anyOf', 'oneOf'] as const) {\n const schemas = cleaned[combiner] as JsonSchema[] | undefined;\n if (schemas) {\n cleaned[combiner] = schemas.map((s) => sanitizeSchema(s, defs));\n }\n }\n\n // No additionalProperties:false in branches:\n // - on `if` it changes the condition\n // - on `then`/`else` it rejects properties the branch does not redefine\n for (const branch of ['if', 'then', 'else'] as const) {\n const branchSchema = cleaned[branch] as JsonSchema | undefined;\n if (branchSchema) {\n cleaned[branch] = sanitizeSchema(branchSchema, defs, true);\n }\n }\n\n if (cleaned.items && typeof cleaned.items === 'object' && !Array.isArray(cleaned.items)) {\n cleaned.items = sanitizeSchema(cleaned.items as JsonSchema, defs);\n }\n\n return cleaned;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { IChangeEvent } from '@rjsf/core';\nimport Form from '@rjsf/core';\nimport type { RegistryFieldsType, RegistryWidgetsType } from '@rjsf/utils';\nimport validator from '@rjsf/validator-ajv8';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { debounce } from '../../utils/debounce';\n\nimport { isRecord } from './fieldHelpers';\nimport type { RenderMarkdown } from './markdownContext';\nimport { RenderMarkdownProvider } from './markdownContext';\nimport { defaultFields, defaultTemplates, defaultWidgets } from './registry';\nimport { RootFormDataProvider } from './RootFormDataContext';\nimport { generateUiSchema, sanitizeSchema } from './schemaUtils';\n\nconst defaultRenderMarkdown: RenderMarkdown = (source) => source;\n\n/** JSON with keys sorted at every level, so key order never makes two equal objects differ. */\nconst stableStringify = (obj: unknown): string =>\n JSON.stringify(obj, (_key, val) => {\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(val).sort()) {\n sorted[key] = val[key];\n }\n return sorted;\n }\n return val;\n });\n\nexport const RjsfSchemaEditor = ({\n schema,\n value,\n onChange,\n readOnly,\n inForm,\n globalConfig,\n rootContext,\n onRegisterValidate,\n widgets,\n fields,\n renderMarkdown,\n hasProtectedDefaultBranch = false,\n}: {\n schema: Record<string, unknown>;\n value: Record<string, unknown>;\n onChange: (value: Record<string, unknown>) => void;\n readOnly: boolean;\n inForm?: boolean;\n /** Values from image_parameters.global_config; matching fields are disabled. */\n globalConfig?: Record<string, unknown> | null;\n /** Read-only `watch` entries merged one level deep over form data; never in `value` or validation.\n * Keep the key set stable: a key that comes and goes flips a computed field between view and save. */\n rootContext?: Record<string, Record<string, unknown>>;\n /** Receives a validate function that shows errors inline and returns validity. */\n onRegisterValidate?: (validate: () => boolean) => void;\n /** Host widgets (e.g. sync-action, async-select), merged over the built-in registry. */\n widgets?: RegistryWidgetsType;\n /** Host fields (e.g. sshForm), merged over the built-in registry. */\n fields?: RegistryFieldsType;\n /** Defaults to plain text. */\n renderMarkdown?: RenderMarkdown;\n /** Password fields render as plain text inputs. */\n hasProtectedDefaultBranch?: boolean;\n}) => {\n const schemaJs = useMemo(() => sanitizeSchema(schema), [schema]);\n const uiSchema = useMemo(\n () =>\n generateUiSchema(\n schema,\n readOnly,\n undefined,\n globalConfig ?? undefined,\n hasProtectedDefaultBranch,\n ),\n [schema, readOnly, globalConfig, hasProtectedDefaultBranch],\n );\n\n const mergedWidgets = useMemo(() => ({ ...defaultWidgets, ...widgets }), [widgets]);\n const mergedFields = useMemo(() => ({ ...defaultFields, ...fields }), [fields]);\n\n // Uncontrolled: `initialFormData`, not `formData`, so re-renders and store echoes never reset RJSF.\n const initialDataRef = useRef<Record<string, unknown>>(value);\n const formDataRef = useRef<Record<string, unknown>>(initialDataRef.current);\n const [formKey, setFormKey] = useState(0);\n\n // No validation until the host asks (onRegisterValidate), else old configs open covered in errors.\n // After that, revalidate on blur, not change: a full AJV pass per keystroke is too costly.\n const [hasValidated, setHasValidated] = useState(false);\n\n // Via context, widgets read the latest root data, incl. hidden objects RJSF may drop (_metadata_).\n const [rootFormData, setRootFormData] = useState<Record<string, unknown>>(initialDataRef.current);\n\n // Form data after RJSF filled schema defaults on mount; data equal to it is not \"unsaved changes\".\n const mountedFormDataJsonRef = useRef<string | null>(null);\n\n // Skips mount-phase onChange; re-arms when formKey remounts the Form.\n const isInitialMountRef = useRef(true);\n useEffect(() => {\n isInitialMountRef.current = false;\n }, [formKey]);\n\n // Stable, so a fresh parent `onChange` never recreates the debounced writer or `formContext`.\n const handleValueChange = useStableCallback(onChange);\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Last value sent to the store, to tell our own echo from an external change.\n const lastSentJsonRef = useRef<string | null>(null);\n\n const debouncedOnChange = useMemo(\n () =>\n debounce((data: Record<string, unknown>) => {\n const dataJson = stableStringify(data);\n const storeJson = stableStringify(valueRef.current);\n if (dataJson !== storeJson) {\n // Catches late mount-phase onChange that slips past isInitialMountRef.\n // First propagation only: after a real edit, reverting to the mount state must propagate.\n if (\n lastSentJsonRef.current === null &&\n mountedFormDataJsonRef.current &&\n dataJson === mountedFormDataJsonRef.current\n ) {\n return;\n }\n lastSentJsonRef.current = dataJson;\n handleValueChange(data);\n }\n }, 100),\n [handleValueChange],\n );\n\n useEffect(() => () => debouncedOnChange.cancel(), [debouncedOnChange]);\n\n // During render, not in an effect, to avoid a flash of stale data.\n const [prevValue, setPrevValue] = useState(value);\n if (value !== prevValue) {\n setPrevValue(value);\n const incomingJson = stableStringify(value);\n if (incomingJson !== stableStringify(prevValue)) {\n if (lastSentJsonRef.current && lastSentJsonRef.current === incomingJson) {\n // Our own echo from the store.\n lastSentJsonRef.current = null;\n } else {\n // External change wins and remounts Form; a pending write would desync store and form.\n debouncedOnChange.cancel();\n lastSentJsonRef.current = null;\n initialDataRef.current = value;\n formDataRef.current = value;\n isInitialMountRef.current = true;\n mountedFormDataJsonRef.current = null;\n setFormKey((k) => k + 1);\n }\n }\n }\n\n const handleChange = useCallback(\n (e: IChangeEvent) => {\n if (!e.formData) return;\n formDataRef.current = e.formData as Record<string, unknown>;\n setRootFormData(e.formData as Record<string, unknown>);\n\n if (isInitialMountRef.current) {\n mountedFormDataJsonRef.current = stableStringify(e.formData);\n return;\n }\n\n debouncedOnChange(e.formData as Record<string, unknown>);\n },\n [debouncedOnChange],\n );\n\n // One identity for the editor's life: a fresh object makes RJSF reset on every re-render.\n // Every dependency is stable, so the memo never recomputes — keep it that way.\n const formContext = useMemo(\n () => ({\n setFormData: (data: unknown) => {\n // Shallow merge: properties absent from `data` are preserved.\n const merged = { ...formDataRef.current, ...(data as Record<string, unknown>) };\n initialDataRef.current = merged;\n formDataRef.current = merged;\n setRootFormData(merged);\n debouncedOnChange.cancel();\n lastSentJsonRef.current = stableStringify(merged);\n handleValueChange(merged);\n isInitialMountRef.current = true;\n mountedFormDataJsonRef.current = null;\n setFormKey((k) => k + 1);\n },\n getFormData: () => formDataRef.current,\n }),\n [debouncedOnChange, handleValueChange],\n );\n\n const formRef = useRef<InstanceType<typeof Form>>(null);\n useEffect(() => {\n if (onRegisterValidate) {\n onRegisterValidate(() => {\n setHasValidated(true);\n return formRef.current?.validateForm() ?? true;\n });\n }\n }, [onRegisterValidate, formKey]);\n\n const rootFormDataValue = useMemo(() => {\n const context = rootContext ?? {};\n const merged = { ...rootFormData };\n for (const [key, entry] of Object.entries(context)) {\n const existing = merged[key];\n merged[key] = isRecord(existing) ? { ...existing, ...entry } : entry;\n }\n return { data: merged, context };\n }, [rootFormData, rootContext]);\n\n return (\n <div className=\"json-editor\">\n <RenderMarkdownProvider value={renderMarkdown ?? defaultRenderMarkdown}>\n <RootFormDataProvider value={rootFormDataValue}>\n <Form\n ref={formRef}\n schema={schemaJs}\n key={formKey}\n initialFormData={initialDataRef.current}\n uiSchema={uiSchema}\n validator={validator}\n onChange={handleChange}\n widgets={mergedWidgets}\n fields={mergedFields}\n templates={defaultTemplates}\n formContext={formContext}\n disabled={readOnly}\n liveValidate={hasValidated ? 'onBlur' : undefined}\n showErrorList={false}\n noHtml5Validate\n tagName={inForm ? 'div' : 'form'}\n >\n {/* Hides the default submit button */}\n <></>\n </Form>\n </RootFormDataProvider>\n </RenderMarkdownProvider>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"rjsf.js","names":["resolveByPath"],"sources":["../src/blocks/RjsfSchemaEditor/fieldHelpers.ts","../src/blocks/RjsfSchemaEditor/markdownContext.ts","../src/blocks/RjsfSchemaEditor/widgets/CodeEditorWidget.tsx","../src/blocks/RjsfSchemaEditor/fields/CodeEditorField.tsx","../src/blocks/RjsfSchemaEditor/SchemaDescription.tsx","../src/blocks/RjsfSchemaEditor/fields/GridObjectField.tsx","../src/blocks/RjsfSchemaEditor/fields/InfoField.tsx","../src/blocks/RjsfSchemaEditor/TooltipIcon.tsx","../src/blocks/RjsfSchemaEditor/fields/TableArrayField.tsx","../src/blocks/RjsfSchemaEditor/fields/TabsObjectField.tsx","../src/blocks/RjsfSchemaEditor/templates/ArrayFieldItemTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ArrayFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/DescriptionFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ErrorListTemplate.tsx","../src/blocks/RjsfSchemaEditor/RootFormDataContext.ts","../src/blocks/RjsfSchemaEditor/templates/FieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/templates/ObjectFieldTemplate.tsx","../src/blocks/RjsfSchemaEditor/widgets/CheckboxesWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/CheckboxWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/DateWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/DynamicSelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/MultiSelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/NumberWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/PasswordWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/RadioWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/SelectWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TemplateWatchWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TextareaWidget.tsx","../src/blocks/RjsfSchemaEditor/widgets/TextWidget.tsx","../src/blocks/RjsfSchemaEditor/registry.ts","../src/blocks/RjsfSchemaEditor/schemaUtils.ts","../src/blocks/RjsfSchemaEditor/RjsfSchemaEditor.tsx"],"sourcesContent":["/**\n * Shared helpers for RJSF custom fields, templates and widgets.\n */\nimport type { Field, Registry, UiSchema } from '@rjsf/utils';\n\n/** No-op function reused as onBlur/onFocus stub in custom fields. */\nconst noop = () => {};\n\nconst NullField: Field = () => null;\n\n/** RJSF always registers SchemaField; the fallback only satisfies the indexed-access type. */\nexport const getSchemaField = (registry: Registry): Field =>\n registry.fields.SchemaField ?? NullField;\n\n/** Stub props shared by all custom SchemaField call-sites (onBlur, onFocus, errorSchema). */\nexport const SCHEMA_FIELD_STUBS = {\n onBlur: noop,\n onFocus: noop,\n errorSchema: {} satisfies Record<string, never>,\n};\n\n/** Whether a value is a keyed namespace — an object that is neither `null` nor an array. */\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\n/**\n * Resolves a dot-path against an object (e.g. \"_metadata_.table.columns\").\n *\n * json-editor watch paths may be prefixed with the schema `id` (e.g.\n * \"rootschema.endpoints.contact\"). The prefix is not a real data key — it\n * identifies the schema root. When the first segment doesn't exist in `data`\n * we retry without it so components using this convention still resolve.\n */\nexport const resolveByPath = (path: string, data: Record<string, unknown>): unknown => {\n const parts = path.split('.');\n const walk = (segments: string[]): unknown => {\n let current: unknown = data;\n for (const part of segments) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n };\n const result = walk(parts);\n const [first] = parts;\n if (result !== undefined || first === undefined || parts.length <= 1) return result;\n // First segment may be a schema id prefix — retry without it.\n if (!(first in data)) return walk(parts.slice(1));\n return result;\n};\n\n/**\n * Extracts a property name from a simple Mustache-like template.\n * e.g. \"{{item.field_name}}\" → \"field_name\"\n */\nexport const extractProperty = (template: string): string => {\n const match = /\\{\\{item\\.(\\w+)\\}\\}/.exec(template);\n return match?.[1] ?? '';\n};\n\n/**\n * Builds select options from watched form data and enumSource config.\n *\n * Supports two json-editor enumSource formats:\n * 1. String: `enumSource: \"varName\"` — use the watched array directly as string values\n * 2. Array: `enumSource: [{ source, value, title }]` — map items through templates\n */\nexport const buildDynamicOptions = (\n watch: Record<string, string>,\n enumSource: unknown,\n rootFormData: Record<string, unknown>,\n): { value: string; label: string }[] => {\n if (typeof enumSource === 'string') {\n const watchPath = watch[enumSource];\n if (!watchPath) return [];\n const sourceData = resolveByPath(watchPath, rootFormData);\n if (!Array.isArray(sourceData)) return [];\n return sourceData.map((item) => {\n const val = String(item ?? '');\n return { value: val, label: val };\n });\n }\n\n if (Array.isArray(enumSource) && enumSource.length > 0) {\n if (enumSource.length > 1) {\n console.warn('[RJSF] Multiple enumSource entries are not supported, only the first is used.');\n }\n const source = enumSource[0] as { source: string; value: string; title: string };\n const watchPath = watch[source.source];\n if (!watchPath) return [];\n const sourceData = resolveByPath(watchPath, rootFormData);\n if (!Array.isArray(sourceData)) return [];\n\n const valueProp = extractProperty(source.value);\n const titleProp = extractProperty(source.title);\n\n return sourceData\n .filter((item): item is Record<string, unknown> => item != null && typeof item === 'object')\n .map((item) => ({\n value: String(item[valueProp] ?? ''),\n label: String(item[titleProp] ?? item[valueProp] ?? ''),\n }));\n }\n\n return [];\n};\n\n/**\n * Builds a child `fieldPathId` for a nested SchemaField.\n * Joins segments with \"_\" for the $id and appends them to the path array.\n */\nexport const childFieldPathId = (\n parentFieldPathId: { $id?: string; path?: (string | number)[] } | undefined,\n ...segments: (string | number)[]\n) => ({\n $id: [parentFieldPathId?.$id ?? 'root', ...segments].join('_'),\n path: [...(parentFieldPathId?.path ?? []), ...segments],\n});\n\n/**\n * Sorts object entries by `propertyOrder`, falling back to MAX_SAFE_INTEGER\n * for properties without an explicit order.\n */\nexport const sortByPropertyOrder = (\n properties: Record<string, { propertyOrder?: number }>,\n): string[] =>\n Object.entries(properties)\n .sort(\n ([, a], [, b]) =>\n (a.propertyOrder ?? Number.MAX_SAFE_INTEGER) - (b.propertyOrder ?? Number.MAX_SAFE_INTEGER),\n )\n .map(([key]) => key);\n\n/**\n * Whether the schema asked for this field to be hidden.\n *\n * - `ui:widget: 'hidden'` is what RJSF itself reads, but any widget branch in\n * `generateUiSchema` that runs later claims the slot and erases it.\n * - `ui:options.hidden` is the copy written last, so it survives all of them.\n */\nexport const isHiddenField = (fieldUiSchema: UiSchema | undefined): boolean =>\n fieldUiSchema?.['ui:widget'] === 'hidden' || !!fieldUiSchema?.['ui:options']?.hidden;\n\n/** The part of a schema node `isContainerSchema` reads. */\nexport type ContainerCandidate = {\n type?: string | string[];\n properties?: unknown;\n additionalProperties?: unknown;\n patternProperties?: unknown;\n items?: unknown;\n};\n\n/**\n * Whether a schema node holds children.\n *\n * - `properties`, `additionalProperties`, `patternProperties` or `items` alone qualify —\n * json-editor infers the container type from them and omits `type`.\n * - `type` may be a union (`['object', 'null']`).\n */\nexport const isContainerSchema = (schema: ContainerCandidate | undefined): boolean => {\n if (!schema) return false;\n if (schema.properties || schema.additionalProperties || schema.patternProperties) return true;\n if (schema.items) return true;\n if (Array.isArray(schema.type))\n return schema.type.includes('object') || schema.type.includes('array');\n return schema.type === 'object' || schema.type === 'array';\n};\n\n/**\n * Whether a hidden field's whole subtree should leave the form.\n *\n * - Hidden containers mount nothing. RJSF recurses into objects and arrays regardless of\n * hiddenness, so a `_metadata_` subtree costs hundreds of fields for no visible output.\n * - Hidden leaves are kept, wrapped in `tw:hidden`: their mount-phase onChange writes the\n * schema default that sibling `options.dependencies` resolve against.\n */\nexport const isHiddenContainer = (\n fieldUiSchema: UiSchema | undefined,\n schema: ContainerCandidate | undefined,\n): boolean => isHiddenField(fieldUiSchema) && isContainerSchema(schema);\n","import { createContext, use } from 'react';\nimport type { ReactNode } from 'react';\n\nexport type RenderMarkdown = (source: string) => ReactNode;\n\n/** Falls back to plain text when the host app doesn't provide a markdown renderer. */\nconst RenderMarkdownContext = createContext<RenderMarkdown>((source) => source);\n\nexport const RenderMarkdownProvider = RenderMarkdownContext;\n\nexport const useRenderMarkdown = (): RenderMarkdown => use(RenderMarkdownContext);\n","import { useEffect, useState } from 'react';\n\nimport { CodeEditor } from '../../../components/CodeEditor';\n// Deliberately not the barrel: CodeEditorWidget.test.tsx stubs the whole\n// `components/CodeEditor` module to avoid mounting a real editor, so anything\n// imported from there is a stub. The mode guard has to be the real one.\nimport { isLanguageMode, type LANGUAGE_MODE } from '../../../components/CodeEditor/helpers';\n\ntype CodeEditorWidgetProps = {\n id: string;\n value: unknown;\n onChange: (value: unknown) => void;\n disabled?: boolean;\n readonly?: boolean;\n options: Record<string, unknown>;\n};\n\nconst isValidJson = (raw: string): boolean => {\n try {\n const parsed: unknown = JSON.parse(raw);\n return Boolean(parsed && typeof parsed === 'object');\n } catch {\n return false;\n }\n};\n\nconst sanitize = (val: unknown): string => {\n if (typeof val === 'object' && val !== null) return JSON.stringify(val, null, ' ');\n return String(val ?? '');\n};\n\nexport const CodeEditorWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n options,\n}: CodeEditorWidgetProps) => {\n const editorOptions = (options.editor ?? {}) as Record<string, unknown>;\n const rawMode = (editorOptions.mode as string) ?? 'application/json';\n const mode: LANGUAGE_MODE = isLanguageMode(rawMode) ? rawMode : 'application/json';\n const isJsonMode = mode === 'application/json';\n const isReadOnly = disabled || readonly || !!(editorOptions.readOnly as boolean);\n\n // The editor owns its text so the user's formatting is preserved while typing;\n // external value changes sync in below only when the parsed data actually differs.\n const [text, setText] = useState(() => sanitize(value));\n\n useEffect(() => {\n setText((currentText) => {\n const sanitized = sanitize(value);\n if (currentText === sanitized) return currentText;\n\n // For JSON, compare parsed data to avoid unnecessary reformatting\n if (isJsonMode && isValidJson(currentText)) {\n try {\n if (\n JSON.stringify(JSON.parse(currentText)) ===\n JSON.stringify(typeof value === 'object' ? value : JSON.parse(sanitized))\n ) {\n return currentText; // same data, different formatting — keep editor's format\n }\n } catch {\n // parse failed — fall through to replace the text\n }\n }\n\n return sanitized;\n });\n }, [value, isJsonMode]);\n\n const handleChange = (raw: string) => {\n setText(raw);\n if (isJsonMode && isValidJson(raw)) {\n onChange(JSON.parse(raw));\n } else {\n onChange(raw);\n }\n };\n\n const help =\n isJsonMode && !isReadOnly && options.encryptionHint !== false ? (\n <>\n Properties prefixed with <code>#</code> sign will be encrypted on save. Already encrypted\n strings will persist.\n </>\n ) : null;\n\n return (\n <div id={id}>\n {isReadOnly ? (\n <CodeEditor\n variant=\"field\"\n value={text}\n mode={mode}\n readOnly\n withCopyButton\n withLineNumbers={editorOptions.lineNumbers !== false}\n />\n ) : (\n <CodeEditor\n variant=\"field\"\n value={text}\n mode={mode}\n onChange={handleChange}\n withCopyButton\n withLineNumbers={editorOptions.lineNumbers !== false}\n help={help}\n />\n )}\n </div>\n );\n};\n","import type { FieldProps } from '@rjsf/utils';\n\nimport { CodeEditorWidget } from '../widgets/CodeEditorWidget';\n\n/**\n * Field wrapper for CodeEditorWidget when used with type: \"object\".\n * RJSF only applies ui:widget to primitive types, so object-typed\n * code editors need a custom field that delegates to the widget.\n */\nexport const CodeEditorField = ({\n fieldPathId,\n formData,\n onChange,\n disabled,\n readonly,\n uiSchema,\n}: FieldProps) => {\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n\n return (\n <CodeEditorWidget\n id={fieldPathId.$id}\n value={formData}\n onChange={(val: unknown) => onChange(val, fieldPathId.path)}\n disabled={!!disabled}\n readonly={!!readonly}\n options={uiOptions ?? {}}\n />\n );\n};\n","import type { ReactNode } from 'react';\nimport DOMPurify from 'dompurify';\n\n/** Renders a schema description with sanitized HTML support (links, formatting, etc.). */\nexport const SchemaDescription = ({ description }: { description?: string }): ReactNode => {\n if (!description) return null;\n\n return (\n <p\n className=\"tw:text-xs tw:text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(description) }}\n />\n );\n};\n","import { useCallback, useRef } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport {\n childFieldPathId,\n type ContainerCandidate,\n getSchemaField,\n isHiddenContainer,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\n\ntype PropertyDef = ContainerCandidate & {\n title?: string;\n propertyOrder?: number;\n options?: { grid_columns?: number; grid_break?: boolean };\n};\n\n/**\n * Custom field that renders an object's properties in a responsive grid layout.\n * Used for schema objects with `format: \"grid\"` or `\"grid-strict\"`.\n * json-editor uses a 12-column grid; each property can specify `options.grid_columns`.\n * Supports `options.collapsed` for collapsible sections.\n */\nexport const GridObjectField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const properties = (schema.properties ?? {}) as Record<string, PropertyDef>;\n const data = (formData ?? {}) as Record<string, unknown>;\n const SchemaField = getSchemaField(registry);\n\n // Use a ref to always have the latest data in the onChange handler\n // without recreating callbacks on every render.\n const dataRef = useRef(data);\n dataRef.current = data;\n\n // Per-property onChange that merges the property value into the full object.\n // Without this, child SchemaFields would replace the entire object with just\n // the property value. We pass fieldPathId.path (this field's own path) so\n // RJSF's Form._set correctly places the full object at the right location.\n // Using the child's path would cause a mismatch: the full grid object would\n // be set at the leaf path, corrupting data (e.g. [object Object] in selects).\n const fieldPath = fieldPathId?.path;\n const onPropertyChange = useCallback(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (key: string) => (value: any, _childPath: any, errorSchema?: any, id?: string) => {\n onChange({ ...dataRef.current, [key]: value } as any, fieldPath, errorSchema, id);\n },\n [onChange, fieldPath],\n );\n\n const uiOptions = uiSchema['ui:options'] as Record<string, unknown> | undefined;\n const hasCollapsed = uiOptions?.collapsed !== undefined;\n const collapsed = !!uiOptions?.collapsed;\n const disableCollapse = !!uiOptions?.disableCollapse;\n\n // Hidden containers leave the tree; hidden leaves keep their mount.\n const mountedKeys = sortByPropertyOrder(properties).filter(\n (key) => !isHiddenContainer(uiSchema[key], properties[key]),\n );\n\n if (mountedKeys.length === 0) return null;\n\n const gridContent = (\n <div className=\"tw:grid tw:grid-cols-12 tw:gap-4 tw:[&>div:empty]:hidden\">\n {mountedKeys.map((key) => {\n const gridCols = properties[key]?.options?.grid_columns ?? 12;\n const gridBreak = !!properties[key]?.options?.grid_break;\n return (\n <div\n key={key}\n // The cell is a grid item even when its content is display:none, so a hidden\n // leaf's cell carries the class itself.\n className={isHiddenField(uiSchema[key]) ? 'tw:hidden' : undefined}\n style={{\n gridColumn: gridBreak ? '1 / -1' : `span ${Math.min(gridCols, 12)}`,\n }}\n >\n <SchemaField\n name={key}\n schema={schema.properties![key] as RJSFSchema}\n uiSchema={(uiSchema[key] ?? {}) as UiSchema}\n formData={data[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, key)}\n registry={registry}\n onChange={onPropertyChange(key)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </div>\n );\n })}\n </div>\n );\n\n // Collapsible grid section\n if (hasCollapsed && !disableCollapse) {\n const hasValues = Object.values(data).some(\n (v) => v !== undefined && v !== null && v !== '' && v !== false,\n );\n const defaultExpanded = hasValues ? !collapsed : true;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n header={schema.title || 'Settings'}\n defaultExpanded={defaultExpanded}\n headerClassName=\"tw:rounded-lg\"\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4\"\n >\n <SchemaDescription description={schema.description} />\n {gridContent}\n </CollapsiblePanel>\n );\n }\n\n // Grid objects with a title get a bordered card to visually separate sections.\n if (schema.title) {\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:p-4\">\n <h3 className=\"tw:mb-3 tw:text-base tw:font-medium tw:text-foreground\">{schema.title}</h3>\n <SchemaDescription description={schema.description} />\n {gridContent}\n </div>\n );\n }\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n <SchemaDescription description={schema.description} />\n {gridContent}\n </div>\n );\n};\n","import type { FieldProps } from '@rjsf/utils';\n\nimport { Alert } from '../../../components/Alert';\n\nconst VALID_ALERT_TYPES = new Set(['info', 'warning', 'error', 'success']);\n\ntype AlertVariant = 'info' | 'warning' | 'error' | 'success';\n\n/**\n * Custom field that renders static informational text.\n * Used for schema properties with `format: \"info\"`.\n * Displays title and description as a read-only alert.\n * Supports `options.alert_type` to control the alert variant\n * (`\"info\"` (default), `\"warning\"`, `\"error\"`, `\"success\"`).\n */\nexport const InfoField = ({ schema, uiSchema }: FieldProps) => {\n if (!schema.title && !schema.description) return null;\n\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const alertType = String(uiOptions?.alertType ?? 'info');\n const variant: AlertVariant = VALID_ALERT_TYPES.has(alertType)\n ? (alertType as AlertVariant)\n : 'info';\n\n return (\n <div className=\"tw:my-3\">\n <Alert variant={variant} title={schema.title}>\n {schema.description}\n </Alert>\n </div>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { Tooltip } from '../../components/Tooltip';\nimport { Info } from '../../icons';\n\nimport { useRenderMarkdown } from './markdownContext';\n\nexport const TooltipIcon = ({ rawHelp }: { rawHelp: string }): ReactNode => {\n const renderMarkdown = useRenderMarkdown();\n\n return (\n <Tooltip placement=\"top\" variant=\"explanatory\" tooltip={renderMarkdown(rawHelp)} triggerAsChild>\n <span className=\"tw:cursor-help tw:text-muted-foreground\">\n <Info className=\"tw:size-4\" />\n </span>\n </Tooltip>\n );\n};\n","import { useRef } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { Trash2 } from '../../../icons';\nimport {\n childFieldPathId,\n getSchemaField,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\nimport { TooltipIcon } from '../TooltipIcon';\n\ntype PropertyDef = {\n title?: string;\n type?: string;\n enum?: string[];\n propertyOrder?: number;\n default?: unknown;\n};\n\n/** Default value for a freshly added cell/item, honouring the schema default. */\nconst defaultValueFor = (prop: { type?: string; default?: unknown }): unknown => {\n if (prop.default !== undefined) return prop.default;\n if (prop.type === 'boolean') return false;\n if (prop.type === 'string') return '';\n return undefined;\n};\n\n/**\n * Custom field that renders an array as a table.\n * Used for schema arrays with `format: \"table\"`.\n *\n * - Array of objects: each item is a row, each property a column.\n * - Array of primitives (e.g. `items: { type: 'string' }`): each item is a\n * single-column row holding the value itself.\n *\n * Cells are rendered via RJSF's SchemaField so all registered widgets are used.\n */\nexport const TableArrayField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const items = (formData ?? []) as unknown[];\n const itemSchema = schema.items as Record<string, unknown> | undefined;\n const properties = (itemSchema?.properties ?? {}) as Record<string, PropertyDef>;\n const itemUiSchema = (uiSchema.items ?? {}) as UiSchema;\n\n const SchemaField = getSchemaField(registry);\n\n // Unfiltered: a table whose every column is hidden is still an array of objects, and a\n // new row seeds defaults for the hidden columns too.\n const allKeys = sortByPropertyOrder(properties);\n\n // A column the schema hides gets no header and no cells — a table cell has no sibling\n // dependencies to feed, so there is nothing to keep mounted.\n const columnKeys = allKeys.filter((key) => !isHiddenField(itemUiSchema[key]));\n\n // Arrays of primitives (strings, numbers, …) have no object properties, so\n // there are no columns to derive — render the item value in a single column.\n const isPrimitiveItems = allKeys.length === 0 && itemSchema != null;\n\n const isReadOnly = disabled || readonly;\n\n const fieldPath = fieldPathId?.path ?? [];\n\n // Keep a ref to items so onChange closures always read the latest data\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const handleCellChange = (rowIndex: number, key: string, value: unknown) => {\n const newItems = [...itemsRef.current];\n newItems[rowIndex] = { ...(newItems[rowIndex] as Record<string, unknown>), [key]: value };\n onChange(newItems, fieldPath);\n };\n\n const handleItemChange = (rowIndex: number, value: unknown) => {\n const newItems = [...itemsRef.current];\n newItems[rowIndex] = value;\n onChange(newItems, fieldPath);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n onChange(\n itemsRef.current.filter((_, i) => i !== rowIndex),\n fieldPath,\n );\n };\n\n const handleAddRow = () => {\n if (isPrimitiveItems) {\n onChange(\n [\n ...itemsRef.current,\n defaultValueFor({\n type: itemSchema?.type as string | undefined,\n default: itemSchema?.default,\n }),\n ],\n fieldPath,\n );\n return;\n }\n const newItem: Record<string, unknown> = {};\n for (const key of allKeys) {\n newItem[key] = defaultValueFor(properties[key] ?? {});\n }\n onChange([...itemsRef.current, newItem], fieldPath);\n };\n\n const withHiddenLabel = (base: UiSchema): UiSchema => ({\n ...base,\n 'ui:options': {\n ...base['ui:options'],\n label: false,\n },\n });\n\n const getCellUiSchema = (key: string): UiSchema =>\n withHiddenLabel((itemUiSchema[key] ?? {}) as UiSchema);\n\n const table = items.length > 0 && (\n <table className=\"tw:w-full tw:table-fixed tw:border-collapse tw:text-sm\">\n <thead>\n <tr>\n {isPrimitiveItems ? (\n <th className=\"tw:border-b tw:border-border tw:p-2 tw:text-left tw:text-xs tw:font-medium tw:text-muted-foreground\">\n {(itemSchema?.title as string) ?? ''}\n </th>\n ) : (\n columnKeys.map((key) => (\n <th\n key={key}\n className=\"tw:border-b tw:border-border tw:p-2 tw:text-left tw:text-xs tw:font-medium tw:text-muted-foreground\"\n >\n {properties[key]?.title ?? key}\n </th>\n ))\n )}\n {!isReadOnly && <th className=\"tw:w-20\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, rowIndex) => (\n <tr key={rowIndex} className=\"tw:border-b tw:border-border\">\n {isPrimitiveItems ? (\n <td className=\"tw:px-2 tw:py-1.5 tw:[&>div]:mb-0\">\n <SchemaField\n name={String(rowIndex)}\n schema={itemSchema as RJSFSchema}\n uiSchema={withHiddenLabel(itemUiSchema)}\n formData={item}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, rowIndex)}\n registry={registry}\n onChange={(val: unknown) => handleItemChange(rowIndex, val)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </td>\n ) : (\n columnKeys.map((key) => (\n <td key={key} className=\"tw:px-2 tw:py-1.5 tw:[&>div]:mb-0\">\n <SchemaField\n name={key}\n schema={properties[key] as unknown as RJSFSchema}\n uiSchema={getCellUiSchema(key)}\n formData={(item as Record<string, unknown>)[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, rowIndex, key)}\n registry={registry}\n onChange={(val: unknown) => handleCellChange(rowIndex, key, val)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n </td>\n ))\n )}\n {!isReadOnly && (\n <td className=\"tw:px-2 tw:py-1.5 tw:text-right\">\n <Button\n variant=\"invisible\"\n size=\"icon\"\n onClick={() => handleRemoveRow(rowIndex)}\n aria-label=\"Remove row\"\n >\n <Trash2 className=\"tw:size-4\" />\n </Button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n\n const addButton = !isReadOnly && (\n <Button variant=\"outline\" onClick={handleAddRow}>\n Add {(itemSchema?.title as string) || 'Item'}\n </Button>\n );\n\n // Wrap in CollapsiblePanel when the table has a title\n if (schema.title) {\n const tooltip = uiSchema['ui:help'];\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={\n <span className=\"tw:inline-flex tw:items-center tw:gap-1\">\n {schema.title}\n {tooltip && <TooltipIcon rawHelp={tooltip} />}\n </span>\n }\n defaultExpanded\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4\"\n >\n <SchemaDescription description={schema.description} />\n {table}\n {addButton}\n </CollapsiblePanel>\n );\n }\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n <SchemaDescription description={schema.description} />\n {table}\n {addButton}\n </div>\n );\n};\n","import { useCallback, useRef, useState } from 'react';\nimport type { FieldProps, RJSFSchema, UiSchema } from '@rjsf/utils';\n\nimport { Tabs, TabsContent } from '../../../components/Tabs';\nimport {\n childFieldPathId,\n type ContainerCandidate,\n getSchemaField,\n isHiddenContainer,\n isHiddenField,\n SCHEMA_FIELD_STUBS,\n sortByPropertyOrder,\n} from '../fieldHelpers';\nimport { SchemaDescription } from '../SchemaDescription';\n\ntype PropertyDef = ContainerCandidate & { title?: string; propertyOrder?: number };\n\n/**\n * Custom field that renders an object's properties as tabs.\n * Used for schema objects with `format: \"tabs\"`, `\"tabs-top\"`, or `\"categories\"`.\n * Each property becomes a tab panel.\n */\nexport const TabsObjectField = ({\n schema,\n uiSchema = {},\n formData,\n onChange,\n disabled,\n readonly,\n registry,\n fieldPathId,\n}: FieldProps) => {\n const properties = (schema.properties ?? {}) as Record<string, PropertyDef>;\n const data = (formData ?? {}) as Record<string, unknown>;\n const SchemaField = getSchemaField(registry);\n\n const dataRef = useRef(data);\n dataRef.current = data;\n\n const onPropertyChange = useCallback(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (key: string) => (value: any, path: any, errorSchema?: any, id?: string) => {\n onChange({ ...dataRef.current, [key]: value } as any, path, errorSchema, id);\n },\n [onChange],\n );\n\n // Hidden containers leave the tree; hidden leaves keep their mount. A hidden leaf gets no\n // tab of its own and renders below the strip, where `FieldTemplate` hides its wrapper.\n const mountedKeys = sortByPropertyOrder(properties).filter(\n (key) => !isHiddenContainer(uiSchema[key], properties[key]),\n );\n const tabKeys = mountedKeys.filter((key) => !isHiddenField(uiSchema[key]));\n const hiddenLeafKeys = mountedKeys.filter((key) => isHiddenField(uiSchema[key]));\n\n const [activeTab, setActiveTab] = useState(tabKeys[0] ?? '');\n\n if (mountedKeys.length === 0) return null;\n\n const triggers = tabKeys.map((key) => ({\n value: key,\n title: properties[key]?.title ?? key,\n }));\n\n const renderField = (key: string) => (\n <SchemaField\n key={key}\n name={key}\n schema={schema.properties![key] as RJSFSchema}\n uiSchema={(uiSchema[key] ?? {}) as UiSchema}\n formData={data[key]}\n {...SCHEMA_FIELD_STUBS}\n fieldPathId={childFieldPathId(fieldPathId, key)}\n registry={registry}\n onChange={onPropertyChange(key)}\n disabled={!!disabled}\n readonly={!!readonly}\n />\n );\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n {schema.title && (\n <h3 className=\"tw:text-base tw:font-medium tw:text-foreground\">{schema.title}</h3>\n )}\n <SchemaDescription description={schema.description} />\n {tabKeys.length > 0 && (\n <Tabs triggers={triggers} value={activeTab} onValueChange={setActiveTab} compact>\n {tabKeys.map((key) => (\n <TabsContent key={key} value={key}>\n {renderField(key)}\n </TabsContent>\n ))}\n </Tabs>\n )}\n {hiddenLeafKeys.map(renderField)}\n </div>\n );\n};\n","import type { ArrayFieldItemTemplateProps } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { Trash2 } from '../../../icons';\n\nexport const ArrayFieldItemTemplate = ({\n children,\n index,\n totalItems,\n schema,\n hasToolbar,\n disabled,\n readonly,\n buttonsProps,\n}: ArrayFieldItemTemplateProps) => {\n const isObject = schema.type === 'object';\n const canRemove = hasToolbar && buttonsProps.hasRemove && !disabled && !readonly;\n\n // Object array items use CollapsiblePanel for meaningful collapsing\n if (isObject) {\n const itemTitle = `${schema.title || 'Item'} ${index + 1}`;\n // Single item starts expanded; multiple items start collapsed to keep the page compact\n const defaultExpanded = totalItems <= 1;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={\n <div className=\"tw:flex tw:w-full tw:items-center tw:justify-between\">\n <span>{itemTitle}</span>\n {canRemove && (\n <div\n role=\"presentation\"\n onClick={(e) => e.stopPropagation()}\n onKeyUp={(e) => e.stopPropagation()}\n >\n <Button\n variant=\"invisible\"\n size=\"icon\"\n aria-label={`Remove ${itemTitle}`}\n onClick={buttonsProps.onRemoveItem}\n >\n <Trash2 className=\"tw:size-4\" />\n </Button>\n </div>\n )}\n </div>\n }\n defaultExpanded={defaultExpanded}\n >\n <div className=\"tw:flex tw:flex-col tw:gap-4\">{children}</div>\n </CollapsiblePanel>\n );\n }\n\n // Simple items use a card layout\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-4\">\n <div className=\"tw:flex tw:items-start tw:gap-3\">\n <div className=\"tw:flex tw:flex-1 tw:flex-col tw:gap-4\">{children}</div>\n {canRemove && (\n <Button\n variant=\"outline\"\n size=\"small\"\n className=\"tw:mt-5 tw:shrink-0\"\n onClick={buttonsProps.onRemoveItem}\n >\n Delete\n </Button>\n )}\n </div>\n </div>\n );\n};\n","import type { ArrayFieldTemplateProps } from '@rjsf/utils';\n\nimport { Button } from '../../../components/Button';\n\nexport const ArrayFieldTemplate = ({\n items,\n canAdd,\n onAddClick,\n title,\n schema,\n disabled,\n readonly,\n}: ArrayFieldTemplateProps) => {\n const isReadOnly = disabled || readonly;\n\n const itemLabel =\n typeof schema.items === 'object' && schema.items !== null && !Array.isArray(schema.items)\n ? (schema.items as { title?: string }).title || 'Item'\n : 'Item';\n\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4\">\n {(title || schema.description) && (\n <div>\n {title && <h3 className=\"tw:text-base tw:font-medium tw:text-foreground\">{title}</h3>}\n {schema.description && (\n <p className=\"tw:mt-1 tw:text-xs tw:text-muted-foreground\">{schema.description}</p>\n )}\n </div>\n )}\n {items}\n {canAdd && !isReadOnly && (\n <Button variant=\"outline\" onClick={onAddClick}>\n Add {itemLabel}\n </Button>\n )}\n </div>\n );\n};\n","import { isValidElement } from 'react';\nimport type { DescriptionFieldProps } from '@rjsf/utils';\nimport DOMPurify from 'dompurify';\n\n/**\n * Custom description template that renders HTML in schema descriptions.\n * Uses DOMPurify to sanitize the HTML before rendering.\n * Schema descriptions are authored by component developers and may contain\n * links (<a>), formatting (<strong>, <code>, <br>), etc.\n */\nexport const DescriptionFieldTemplate = ({ description, id }: DescriptionFieldProps) => {\n if (!description) return null;\n\n if (isValidElement(description)) {\n return <div id={id}>{description}</div>;\n }\n\n return (\n <p\n id={id}\n className=\"tw:text-xs tw:text-muted-foreground\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(String(description)) }}\n />\n );\n};\n","import type { ErrorListProps } from '@rjsf/utils';\n\nexport const ErrorListTemplate = ({ errors }: ErrorListProps) => {\n if (!errors.length) return null;\n\n return (\n <div className=\"tw:mb-4\">\n {errors.map((error) => (\n <p key={`${error.property}:${error.message}`} className=\"tw:text-xs tw:text-error-500\">\n {error.message}\n </p>\n ))}\n </div>\n );\n};\n","import { createContext, use } from 'react';\n\ntype RootFormDataValue = {\n /** Root form data with `rootContext` merged one level deep. */\n data: Record<string, unknown>;\n /** Read-only entries the form data does not own. */\n context: Record<string, Record<string, unknown>>;\n};\n\nconst RootFormDataContext = createContext<RootFormDataValue>({ data: {}, context: {} });\n\nexport const RootFormDataProvider = RootFormDataContext;\n\nexport const useRootFormData = (): Record<string, unknown> => use(RootFormDataContext).data;\n\nexport const useRootContext = (): Record<string, Record<string, unknown>> =>\n use(RootFormDataContext).context;\n","import type { ReactNode } from 'react';\nimport type { FieldTemplateProps } from '@rjsf/utils';\nimport DOMPurify from 'dompurify';\n\nimport { Label } from '../../../components/Label';\nimport { Link } from '../../../components/Link';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { BookOpen } from '../../../icons';\nimport { FormGroup } from '../../FormGroup';\nimport { isHiddenField } from '../fieldHelpers';\nimport { useRootFormData } from '../RootFormDataContext';\nimport { TooltipIcon } from '../TooltipIcon';\n\nconst resolveByPath = (parts: string[], data: Record<string, unknown>): unknown => {\n let current: unknown = data;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n};\n\n/**\n * Resolves a dependency path against form data.\n *\n * 1. `root.`-prefixed → from the root.\n * 2. Otherwise a sibling in the parent object, falling back to the root.\n */\nconst resolveDependencyValue = (\n path: string,\n formData: Record<string, unknown>,\n parentPath: (string | number)[],\n): unknown => {\n if (path.startsWith('root.')) {\n return resolveByPath(path.replace(/^root\\./, '').split('.'), formData);\n }\n const parent = resolveByPath(parentPath.map(String), formData);\n if (parent && typeof parent === 'object') {\n const sibling = resolveByPath(path.split('.'), parent as Record<string, unknown>);\n if (sibling !== undefined) return sibling;\n }\n return resolveByPath(path.split('.'), formData);\n};\n\n/**\n * Whether json-editor `options.dependencies` show the field; every entry must match.\n * - `\"value\"` — the field equals it\n * - `[\"a\", \"b\"]` — the field is one of them\n * - `\"\"` — the field is empty\n */\nconst evaluateDependencies = (\n dependencies: Record<string, unknown>,\n formData: Record<string, unknown>,\n parentPath: (string | number)[],\n): boolean => {\n for (const [path, expected] of Object.entries(dependencies)) {\n const actual = resolveDependencyValue(path, formData, parentPath);\n\n if (Array.isArray(expected)) {\n if (!expected.includes(actual)) return false;\n } else if (expected === '') {\n if (actual !== '' && actual !== undefined && actual !== null) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n};\n\nconst DocumentationLinkIcon = ({\n documentation,\n}: {\n documentation: { link: string; tooltip?: string };\n}): ReactNode => (\n <Tooltip\n placement=\"top\"\n variant=\"explanatory\"\n tooltip={documentation.tooltip ?? 'Open documentation'}\n triggerAsChild\n >\n <Link href={documentation.link}>\n <span className=\"tw:cursor-pointer tw:text-muted-foreground tw:hover:text-foreground\">\n <BookOpen className=\"tw:size-4\" />\n </span>\n </Link>\n </Tooltip>\n);\n\n/**\n * FormGroup wrapper with label, help and errors.\n * - Does not subscribe to RootFormDataContext, so it skips form-state re-renders.\n */\nconst FieldTemplateBody = ({\n id,\n label,\n rawHelp,\n rawDescription,\n rawErrors,\n children,\n schema,\n uiSchema,\n displayLabel,\n}: FieldTemplateProps) => {\n // Button pseudo-fields render bare\n const widget = uiSchema?.['ui:widget'];\n if (widget === 'test-connection' || widget === 'sync-action') {\n return <>{children}</>;\n }\n\n // Objects/arrays have their own templates, except an array with a widget (multi-select).\n if (schema.type === 'object') {\n return <>{children}</>;\n }\n if (schema.type === 'array' && !uiSchema?.['ui:widget']) {\n return <>{children}</>;\n }\n\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const documentation = uiOptions?.documentation as { link: string; tooltip?: string } | undefined;\n\n const hasErrors = rawErrors && rawErrors.length > 0;\n // Checkboxes label themselves; help icons sit outside that label so a click doesn't toggle.\n // Booleans rendered as select keep the FormGroup label.\n const isCheckbox = schema.type === 'boolean' && uiSchema?.['ui:widget'] !== 'select';\n const showLabel = displayLabel && label && !isCheckbox;\n\n const hasHelpIcons = Boolean(rawHelp || documentation);\n const helpIcons = (\n <>\n {rawHelp && <TooltipIcon rawHelp={rawHelp} />}\n {documentation && <DocumentationLinkIcon documentation={documentation} />}\n </>\n );\n\n return (\n <FormGroup state={hasErrors ? 'error' : 'default'}>\n {showLabel && (\n <Label htmlFor={id}>\n <span className=\"tw:inline-flex tw:items-center tw:gap-1\">\n {label}\n {helpIcons}\n </span>\n </Label>\n )}\n {!showLabel && !isCheckbox && hasHelpIcons && (\n <div className=\"tw:flex tw:items-center tw:gap-1\">{helpIcons}</div>\n )}\n {isCheckbox && hasHelpIcons ? (\n <div className=\"tw:flex tw:items-center tw:gap-1\">\n {children}\n {helpIcons}\n </div>\n ) : (\n children\n )}\n {rawDescription && (\n <FormGroup.Help>\n <span dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(rawDescription) }} />\n </FormGroup.Help>\n )}\n {hasErrors && <FormGroup.Help>{rawErrors.join('. ')}</FormGroup.Help>}\n </FormGroup>\n );\n};\n\n/**\n * FieldTemplateBody gated by `options.dependencies`.\n * - Only these fields subscribe to root form data, so the rest skip per-keystroke re-renders.\n */\nconst FieldTemplateWithDependencies = ({\n dependencies,\n keepMounted,\n ...props\n}: FieldTemplateProps & { dependencies: Record<string, unknown>; keepMounted: boolean }) => {\n const rootFormData = useRootFormData();\n // Not `id` split on \"_\" — that breaks snake_case keys.\n const parentPath = props.fieldPathId.path.slice(0, -1);\n if (!evaluateDependencies(dependencies, rootFormData, parentPath)) {\n // A computed field keeps its wrapper so the widget stays mounted and its value tracks the\n // watched paths; unmounting would freeze the value until the dependency lets it back in.\n return keepMounted ? <div className=\"tw:hidden\">{props.children}</div> : null;\n }\n return <FieldTemplateBody {...props} />;\n};\n\nexport const FieldTemplate = (props: FieldTemplateProps) => {\n // A hidden field keeps its widget mounted and loses only the FormGroup/Label wrapper.\n if (isHiddenField(props.uiSchema)) {\n return <div className=\"tw:hidden\">{props.children}</div>;\n }\n\n const uiOptions = props.uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const dependencies = uiOptions?.dependencies as Record<string, unknown> | undefined;\n\n if (dependencies) {\n return (\n <FieldTemplateWithDependencies\n dependencies={dependencies}\n keepMounted={props.uiSchema?.['ui:widget'] === 'template-watch'}\n {...props}\n />\n );\n }\n\n return <FieldTemplateBody {...props} />;\n};\n","import type { ObjectFieldTemplateProps } from '@rjsf/utils';\n\nimport { CollapsiblePanel } from '../../../components/CollapsiblePanel';\nimport { type ContainerCandidate, isHiddenContainer, isHiddenField } from '../fieldHelpers';\n\nexport const ObjectFieldTemplate = ({\n title,\n description,\n properties,\n formData,\n uiSchema,\n schema,\n fieldPathId,\n}: ObjectFieldTemplateProps) => {\n const isRoot = !fieldPathId?.path?.length;\n const uiOptions = uiSchema?.['ui:options'] as Record<string, unknown> | undefined;\n const hasCollapsed = uiOptions?.collapsed !== undefined;\n const collapsed = !!uiOptions?.collapsed;\n const disableCollapse = !!uiOptions?.disableCollapse;\n\n // Detect if this object is a direct child of an array (array item)\n // In that case, ArrayFieldItemTemplate already provides the card/panel wrapper\n const lastPathSegment = fieldPathId?.path?.at(-1);\n const isArrayItem = typeof lastPathSegment === 'number';\n\n // Hidden containers leave the tree; hidden leaves keep their mount.\n // The wrapper of a kept-but-hidden field carries `tw:hidden` itself — a display:none\n // wrapper is not a flex item, so tw:gap-4 spaces only the visible children.\n const childSchemas = (schema as { properties?: Record<string, ContainerCandidate> }).properties;\n const visibleProperties = properties.filter(\n (prop) => !isHiddenContainer(uiSchema?.[prop.name], childSchemas?.[prop.name]),\n );\n\n const renderChildren = (props: typeof visibleProperties) =>\n props.map((prop) => (\n <div\n key={prop.name}\n className={isHiddenField(uiSchema?.[prop.name]) ? 'tw:hidden' : undefined}\n >\n {prop.content}\n </div>\n ));\n\n if (isRoot) {\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">\n {renderChildren(visibleProperties)}\n </div>\n );\n }\n\n const childrenContent = renderChildren(visibleProperties);\n\n // Collapsible nested object when options.collapsed is explicitly set\n if (hasCollapsed && !disableCollapse) {\n const data = (formData ?? {}) as Record<string, unknown>;\n const hasValues = Object.values(data).some(\n (v) => v !== undefined && v !== null && v !== '' && v !== false,\n );\n const defaultExpanded = hasValues ? !collapsed : true;\n\n return (\n <CollapsiblePanel\n className=\"tw:rounded-lg\"\n headerClassName=\"tw:rounded-lg\"\n header={title || 'Settings'}\n defaultExpanded={defaultExpanded}\n bodyClassName=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\"\n >\n {description}\n {childrenContent}\n </CollapsiblePanel>\n );\n }\n\n // Array items render flat — the parent ArrayFieldItemTemplate provides the wrapper\n if (isArrayItem) {\n return (\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">{childrenContent}</div>\n );\n }\n\n return (\n <div className=\"tw:rounded-lg tw:border tw:border-solid tw:border-border tw:bg-card tw:p-4\">\n {title && <h3 className=\"tw:mb-2 tw:text-base tw:font-medium tw:text-foreground\">{title}</h3>}\n {description && <p className=\"tw:mb-3 tw:text-xs tw:text-muted-foreground\">{description}</p>}\n <div className=\"tw:flex tw:flex-col tw:gap-4 tw:[&>div:empty]:hidden\">{childrenContent}</div>\n </div>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\nimport {\n enumOptionsDeselectValue,\n enumOptionsIsSelected,\n enumOptionsSelectValue,\n optionId,\n} from '@rjsf/utils';\n\nimport { Checkbox } from '../../../components/Checkbox';\nimport { cn } from '../../../utils';\n\n/**\n * A group of checkboxes for an array of enum values (`format: 'checkbox'`).\n *\n * - `options.inline` lays the options out in a wrapping row instead of a column.\n * - An option listed in `options.enumDisabled` is disabled on its own.\n */\nexport const CheckboxesWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n options,\n}: WidgetProps) => {\n const { enumOptions = [], enumDisabled, inline } = options;\n const selected = Array.isArray(value) ? value : [value];\n\n return (\n <div\n id={id}\n className={cn('tw:flex tw:gap-2', inline ? 'tw:flex-wrap tw:gap-x-4' : 'tw:flex-col')}\n >\n {enumOptions.map((option, index) => (\n <Checkbox\n key={index}\n id={optionId(id, index)}\n checked={enumOptionsIsSelected(option.value, selected)}\n disabled={\n disabled ||\n readonly ||\n (Array.isArray(enumDisabled) && enumDisabled.includes(option.value))\n }\n onCheckedChange={(checked) =>\n onChange(\n checked\n ? enumOptionsSelectValue(index, selected, enumOptions)\n : enumOptionsDeselectValue(index, selected, enumOptions),\n )\n }\n >\n {option.label}\n </Checkbox>\n ))}\n </div>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Checkbox } from '../../../components/Checkbox';\n\nexport const CheckboxWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n label,\n hideLabel,\n}: WidgetProps) => {\n const checked = !!value;\n\n return (\n <Checkbox id={id} checked={checked} onCheckedChange={onChange} disabled={disabled || readonly}>\n {hideLabel ? undefined : label}\n </Checkbox>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { DateInput } from '../../DateInput';\n\nexport const DateWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n // Parse YYYY-MM-DD as a local date to avoid UTC-offset day shift\n const dateValue = (() => {\n if (!value) return null;\n const parts = (value as string).split('-').map(Number);\n const [year, month, day] = parts;\n if (parts.length !== 3 || parts.some(Number.isNaN)) return null;\n if (year === undefined || month === undefined || day === undefined) return null;\n return new Date(year, month - 1, day);\n })();\n const isValid = dateValue && !Number.isNaN(dateValue.getTime());\n\n return (\n <DateInput\n id={id}\n value={isValid ? dateValue : null}\n onValueChange={(date) => {\n if (!date) {\n onChange(undefined);\n return;\n }\n // Store as ISO date string (YYYY-MM-DD)\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n onChange(`${year}-${month}-${day}`);\n }}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder || 'Select a date'}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Combobox } from '../../../components/Combobox';\nimport type { LabeledItem } from '../../../components/Combobox/types';\nimport { buildDynamicOptions } from '../fieldHelpers';\nimport { useRootFormData } from '../RootFormDataContext';\n\n/**\n * Widget for fields using json-editor's enumSource/watch pattern.\n * Reads options dynamically from the root form data based on watched paths.\n */\nexport const DynamicSelectWidget = ({\n id,\n value,\n onChange,\n onBlur,\n disabled,\n readonly,\n options: widgetOptions,\n required,\n rawErrors,\n}: WidgetProps) => {\n const data = useRootFormData();\n\n const watch = widgetOptions.watch as Record<string, string> | undefined;\n const enumSource = widgetOptions.enumSource;\n\n const dynamicItems: LabeledItem[] = watch ? buildDynamicOptions(watch, enumSource, data) : [];\n\n // Ensure the current value is always in the options list (e.g. stored config value while the watched source is not loaded yet)\n const stringValue = value == null ? '' : String(value);\n const matched = dynamicItems.find((item) => item.value === stringValue);\n const fallbackItem =\n !matched && stringValue !== '' ? { value: stringValue, label: stringValue } : null;\n const selectedItem = matched ?? fallbackItem;\n const items = fallbackItem ? [fallbackItem, ...dynamicItems] : dynamicItems;\n\n return (\n <Combobox\n id={id}\n items={items}\n value={selectedItem}\n // A schema-required field must not offer a one-click route to a value the schema rejects.\n allowClear={!required}\n disabled={disabled || readonly}\n onBlur={() => onBlur(id, value)}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n onValueChange={(selected) => onChange(selected?.value ?? '')}\n />\n );\n};\n","import { useMemo } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { enumOptionsIsSelected, useDeepCompareMemo } from '@rjsf/utils';\n\nimport type { LabeledItem } from '../../../components/Combobox/types';\nimport { MultiCombobox } from '../../MultiCombobox';\n\n/**\n * A `MultiCombobox` over the `items.enum` options of a multi-value array.\n *\n * - Default for `async-multi-select`; it ignores `async`, `creatable` and `enumSource`, which a\n * host's replacement handles.\n * - A stored value outside `items.enum` stays a chip labelled by the value, so an edit keeps it.\n * - An option listed in `options.enumDisabled` cannot be picked.\n */\nexport const MultiSelectWidget = ({\n id,\n value,\n onChange,\n onBlur,\n disabled,\n readonly,\n options,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n // RJSF rebuilds these on every form change; stable `items` keep the list from re-filtering.\n const enumOptions = useDeepCompareMemo(options.enumOptions ?? []);\n const enumDisabled = useDeepCompareMemo(options.enumDisabled);\n const values = useDeepCompareMemo<unknown[]>(Array.isArray(value) ? value : []);\n\n // Keyed by index, so the typed value (a number, say) survives the round trip.\n const { items, selected, valueOf } = useMemo(() => {\n const entries = enumOptions.map((option, index) => ({\n value: option.value,\n item: {\n value: String(index),\n label: option.label,\n disabled: Array.isArray(enumDisabled) && enumDisabled.includes(option.value),\n },\n }));\n const all: { value: unknown; item: LabeledItem }[] = [...entries];\n // In stored order, so an added chip goes last and the rest stay where they were.\n const selected = values.map((stored, index) => {\n const known = entries.find((entry) => enumOptionsIsSelected(entry.value, [stored]));\n if (known) return known.item;\n const unknown = { value: stored, item: { value: `unknown-${index}`, label: String(stored) } };\n all.push(unknown);\n return unknown.item;\n });\n\n return {\n items: all.map((entry) => entry.item),\n selected,\n valueOf: new Map(all.map((entry) => [entry.item, entry.value])),\n };\n }, [enumOptions, enumDisabled, values]);\n\n return (\n <MultiCombobox<LabeledItem>\n id={id}\n items={items}\n value={selected}\n disabled={disabled || readonly}\n placeholder={placeholder}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n onBlur={() => onBlur(id, value)}\n onValueChange={(next) => onChange(next.map((item) => valueOf.get(item)))}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { NumberInput } from '../../../blocks/NumberInput';\n\nexport const NumberWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n schema,\n rawErrors,\n}: WidgetProps) => {\n return (\n <NumberInput\n id={id}\n value={value ?? null}\n onValueChange={(num) => onChange(num ?? undefined)}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n min={schema.minimum}\n max={schema.maximum}\n step={schema.multipleOf}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { PasswordInput } from '../../../blocks/PasswordInput';\n\nexport const PasswordWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n rawErrors,\n}: WidgetProps) => {\n const stringValue = value == null ? '' : String(value);\n\n return (\n <PasswordInput\n id={id}\n value={stringValue}\n onValueChange={onChange}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n allowPasswordToggle\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { RadioGroup } from '../../../components/RadioGroup';\n\nexport const RadioWidget = ({ id, value, onChange, disabled, readonly, options }: WidgetProps) => {\n const enumOptions = (options.enumOptions ?? []) as { value: string; label: string }[];\n\n return (\n <RadioGroup\n id={id}\n value={value ?? ''}\n onValueChange={onChange}\n disabled={disabled || readonly}\n orientation=\"vertical\"\n >\n {enumOptions.map((opt) => (\n <RadioGroup.Item key={opt.value} value={opt.value}>\n {opt.label}\n </RadioGroup.Item>\n ))}\n </RadioGroup>\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Combobox } from '../../../components/Combobox';\nimport type { LabeledItem } from '../../../components/Combobox/types';\n\nexport const SelectWidget = ({\n id,\n value,\n schema,\n onChange,\n onBlur,\n disabled,\n readonly,\n options,\n placeholder,\n required,\n rawErrors,\n}: WidgetProps) => {\n const enumOptions = (options.enumOptions ?? []) as { value: unknown; label: string }[];\n const isBoolean = schema.type === 'boolean';\n\n // Map values (including booleans) to string keys so the Combobox can match them\n const items: LabeledItem[] = enumOptions.map((o) => ({\n value: String(o.value ?? ''),\n label: o.label,\n }));\n\n const selectedItem = items.find((item) => item.value === (value == null ? '' : String(value)));\n\n return (\n <Combobox\n id={id}\n items={items}\n value={selectedItem ?? null}\n // A schema-required field must not offer a one-click route to a value the schema rejects.\n allowClear={!required}\n disabled={disabled || readonly}\n onBlur={() => onBlur(id, value)}\n aria-invalid={rawErrors?.length ? true : undefined}\n state={rawErrors?.length ? 'error' : 'default'}\n placeholder={placeholder}\n onValueChange={(selected) => {\n const selectedValue = selected?.value ?? '';\n if (isBoolean) {\n onChange(selectedValue === 'true');\n return;\n }\n onChange(selectedValue);\n }}\n />\n );\n};\n","import { useEffect, useRef } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\nimport { TextInput } from '../../TextInput';\nimport { isRecord, resolveByPath } from '../fieldHelpers';\nimport { useRootContext, useRootFormData } from '../RootFormDataContext';\n\nconst stringify = (value: unknown): string => {\n if (value == null) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n};\n\n/** Replaces each `{{var}}` in a json-editor template with the form value at `watch[var]`. */\nconst resolveTemplate = (\n template: string,\n watch: Record<string, string>,\n rootFormData: Record<string, unknown>,\n): string => {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, varName: string) => {\n const watchPath = watch[varName];\n if (!watchPath) return '';\n return stringify(resolveByPath(watchPath, rootFormData));\n });\n};\n\n/**\n * Whether `rootContext` declares the value a path reads.\n *\n * - The entry key alone does not settle it: sync actions write form keys under the same key.\n * - Entry and segment must be own properties, not prototype members like `toString`.\n * - A path naming only an entry reads the whole namespace.\n */\nconst declaresPath = (\n segments: string[],\n rootContext: Record<string, Record<string, unknown>>,\n): boolean => {\n const [entryKey = '', key] = segments;\n const entry = rootContext[entryKey];\n return isRecord(entry) && (key === undefined || Object.hasOwn(entry, key));\n};\n\n/** Whether every watched path reads a value `rootContext` declares; false with none. */\nconst readsOnlyContext = (\n watch: Record<string, string>,\n rootContext: Record<string, Record<string, unknown>>,\n): boolean => {\n const paths = Object.values(watch);\n return (\n paths.length > 0 &&\n paths.every((path) => {\n const segments = path.split('.');\n // The first segment may be a schema id prefix — retry without it, as `resolveByPath` does.\n return declaresPath(segments, rootContext) || declaresPath(segments.slice(1), rootContext);\n })\n );\n};\n\n/**\n * json-editor `template`/`watch` (no `enumSource`): writes the computed value into form data.\n *\n * - `options.hidden`: renders nothing and always writes — feeds cross-object dependencies.\n * - Otherwise a read-only input that stops writing when every watched path reads\n * `rootContext`, which the configuration does not own.\n */\nexport const TemplateWatchWidget = ({\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors,\n options: widgetOptions,\n}: WidgetProps) => {\n const data = useRootFormData();\n const rootContext = useRootContext();\n\n const watch = widgetOptions.watch as Record<string, string> | undefined;\n const template = widgetOptions.template as string | undefined;\n const isContextView = !widgetOptions.hidden && !!watch && readsOnlyContext(watch, rootContext);\n\n const computed = watch && template ? resolveTemplate(template, watch, data) : stringify(value);\n\n const lastSetRef = useRef<string>(stringify(value));\n\n useEffect(() => {\n if (isContextView) return;\n if (computed !== lastSetRef.current) {\n lastSetRef.current = computed;\n onChange(computed);\n }\n }, [computed, onChange, isContextView]);\n\n if (widgetOptions.hidden) {\n return null;\n }\n\n return (\n <TextInput\n id={id}\n value={computed}\n readOnly\n disabled={disabled || readonly}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { WidgetProps } from '@rjsf/utils';\n\nimport { Textarea } from '../../../blocks/Textarea';\n\nexport const TextareaWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n options,\n rawErrors,\n}: WidgetProps) => {\n const rows = (options.rows as number) ?? 5;\n const stringValue = value == null ? '' : String(value);\n\n return (\n <Textarea\n id={id}\n value={stringValue}\n onValueChange={onChange}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n minRows={rows}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","import type { ChangeEvent } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\nimport { TextInput } from '../../TextInput';\n\nexport const TextWidget = ({\n id,\n value,\n onChange,\n onBlur,\n onFocus,\n disabled,\n readonly,\n placeholder,\n schema,\n options,\n rawErrors,\n}: WidgetProps) => {\n const stringValue = value == null ? '' : typeof value === 'object' ? '' : String(value);\n const shouldTrim = !!options.trim;\n\n return (\n <TextInput\n id={id}\n value={stringValue}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n onChange(shouldTrim ? v.trim() : v);\n }}\n onBlur={() => onBlur(id, value)}\n onFocus={() => onFocus(id, value)}\n disabled={disabled || readonly}\n placeholder={placeholder}\n type={schema.format === 'email' ? 'email' : 'text'}\n state={rawErrors?.length ? 'error' : 'default'}\n />\n );\n};\n","/**\n * Default RJSF registry: design system widgets, custom fields, and templates.\n * Host-coupled entries (sync actions, SSH form) default to no-op stubs — the\n * host app injects its implementations via the RjsfSchemaEditor `widgets` and\n * `fields` props under the same registry keys.\n */\nimport type { RegistryFieldsType, RegistryWidgetsType, TemplatesType } from '@rjsf/utils';\n\nimport { CodeEditorField } from './fields/CodeEditorField';\nimport { GridObjectField } from './fields/GridObjectField';\nimport { InfoField } from './fields/InfoField';\nimport { TableArrayField } from './fields/TableArrayField';\nimport { TabsObjectField } from './fields/TabsObjectField';\nimport { ArrayFieldItemTemplate } from './templates/ArrayFieldItemTemplate';\nimport { ArrayFieldTemplate } from './templates/ArrayFieldTemplate';\nimport { DescriptionFieldTemplate } from './templates/DescriptionFieldTemplate';\nimport { ErrorListTemplate } from './templates/ErrorListTemplate';\nimport { FieldTemplate } from './templates/FieldTemplate';\nimport { ObjectFieldTemplate } from './templates/ObjectFieldTemplate';\nimport { CheckboxesWidget } from './widgets/CheckboxesWidget';\nimport { CheckboxWidget } from './widgets/CheckboxWidget';\nimport { CodeEditorWidget } from './widgets/CodeEditorWidget';\nimport { DateWidget } from './widgets/DateWidget';\nimport { DynamicSelectWidget } from './widgets/DynamicSelectWidget';\nimport { MultiSelectWidget } from './widgets/MultiSelectWidget';\nimport { NumberWidget } from './widgets/NumberWidget';\nimport { PasswordWidget } from './widgets/PasswordWidget';\nimport { RadioWidget } from './widgets/RadioWidget';\nimport { SelectWidget } from './widgets/SelectWidget';\nimport { TemplateWatchWidget } from './widgets/TemplateWatchWidget';\nimport { TextareaWidget } from './widgets/TextareaWidget';\nimport { TextWidget } from './widgets/TextWidget';\n\n// Rendered for host-coupled entries when the host app doesn't inject an implementation\nconst StubWidget = () => null;\nconst StubField = () => null;\n\nexport const defaultFields: RegistryFieldsType = {\n tableArray: TableArrayField,\n tabsObject: TabsObjectField,\n gridObject: GridObjectField,\n codeEditor: CodeEditorField,\n info: InfoField,\n sshForm: StubField,\n};\n\nexport const defaultWidgets: RegistryWidgetsType = {\n // Override RJSF defaults with design system components\n TextWidget,\n UpDownWidget: NumberWidget,\n TextareaWidget,\n PasswordWidget,\n SelectWidget,\n CheckboxWidget,\n CheckboxesWidget,\n RadioWidget,\n // RJSF maps standard formats to dedicated widgets\n EmailWidget: TextWidget,\n URLWidget: TextWidget,\n DateWidget,\n DateTimeWidget: TextWidget,\n // Custom widgets mapped via uiSchema\n 'code-editor': CodeEditorWidget,\n 'dynamic-select': DynamicSelectWidget,\n 'template-watch': TemplateWatchWidget,\n // Static enum options; the host's version adds async loading and creatable values\n 'async-multi-select': MultiSelectWidget,\n // Host-coupled widgets — injected by the host app\n 'test-connection': StubWidget,\n 'sync-action': StubWidget,\n 'async-select': StubWidget,\n};\n\nexport const defaultTemplates: Partial<TemplatesType> = {\n FieldTemplate,\n ObjectFieldTemplate,\n DescriptionFieldTemplate,\n ArrayFieldTemplate,\n ArrayFieldItemTemplate,\n ErrorListTemplate,\n};\n","import type { UiSchema } from '@rjsf/utils';\n\nimport { isContainerSchema } from './fieldHelpers';\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype JsonSchema = Record<string, any>;\n\n/** Resolves `$ref` against definitions; sibling keys (title, options) override the result. */\nconst resolveRef = (\n propSchema: JsonSchema,\n definitions: Record<string, JsonSchema> | undefined,\n): JsonSchema => {\n if (!propSchema.$ref || !definitions) return propSchema;\n const refPath = String(propSchema.$ref).replace('#/definitions/', '');\n const resolved = definitions[refPath];\n if (!resolved) return propSchema;\n // oxlint-disable-next-line no-unused-vars\n const { $ref, ...overrides } = propSchema;\n return { ...resolved, ...overrides };\n};\n\n/** Generates an RJSF uiSchema from json-editor `format` and `options` conventions. */\nexport const generateUiSchema = (\n schema: JsonSchema,\n readOnly = false,\n definitions?: Record<string, JsonSchema>,\n globalConfig?: Record<string, unknown>,\n /** When true, password fields render as plain text inputs (protected default branch). */\n hasProtectedDefaultBranch = false,\n): UiSchema => {\n const uiSchema: UiSchema = {};\n const defs = definitions ?? (schema.definitions as Record<string, JsonSchema> | undefined);\n\n if (readOnly) {\n uiSchema['ui:disabled'] = true;\n }\n\n const properties = schema.properties as Record<string, JsonSchema> | undefined;\n if (!properties) {\n // No direct properties — combiners and if/then/else below may still define some.\n } else {\n for (const [key, rawPropSchema] of Object.entries(properties)) {\n const propSchema = resolveRef(rawPropSchema, defs);\n const format = propSchema.format as string | undefined;\n const type = (propSchema.type ?? (propSchema.properties ? 'object' : undefined)) as\n | string\n | undefined;\n const options = propSchema.options as Record<string, unknown> | undefined;\n\n const fieldUi: UiSchema = {};\n\n // Default only: a hidden field no branch below claims renders RJSF's cheap hidden input.\n const isHidden = !!options?.hidden;\n if (isHidden) {\n fieldUi['ui:widget'] = 'hidden';\n }\n\n if (type === 'array' && format === 'table') {\n fieldUi['ui:field'] = 'tableArray';\n }\n\n if (type === 'array' && format === 'checkbox') {\n fieldUi['ui:widget'] = 'checkboxes';\n }\n\n if (format === 'radio' && propSchema.enum) {\n fieldUi['ui:widget'] = 'radio';\n }\n\n if (\n type === 'object' &&\n (format === 'tabs' || format === 'tabs-top' || format === 'categories')\n ) {\n fieldUi['ui:field'] = 'tabsObject';\n }\n\n if (type === 'object' && (format === 'grid' || format === 'grid-strict')) {\n fieldUi['ui:field'] = 'gridObject';\n }\n\n if (format === 'info') {\n fieldUi['ui:field'] = 'info';\n if (options?.alert_type) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n alertType: options.alert_type as string,\n };\n }\n }\n\n if (type === 'button' && format === 'test-connection') {\n fieldUi['ui:widget'] = 'test-connection';\n fieldUi['ui:options'] = (options ?? {}) as UiSchema['ui:options'];\n } else if (type === 'button' && format === 'sync-action') {\n fieldUi['ui:widget'] = 'sync-action';\n fieldUi['ui:options'] = (options ?? {}) as UiSchema['ui:options'];\n } else if ((type === 'string' || type === 'object') && format === 'editor') {\n // RJSF ignores ui:widget on objects\n if (type === 'object') {\n fieldUi['ui:field'] = 'codeEditor';\n } else {\n fieldUi['ui:widget'] = 'code-editor';\n }\n fieldUi['ui:options'] = {\n editor: (options?.editor ?? {}) as Record<string, unknown>,\n // `#` keys get encrypted; `encryption_hint: false` opts out JSON that is not\n // Keboola configuration, where ciphertext would be unusable.\n encryptionHint: options?.encryption_hint !== false,\n };\n } else if (type === 'object' && format === 'ssh-editor') {\n fieldUi['ui:field'] = 'sshForm';\n fieldUi['ui:options'] = { only_keys: !!options?.only_keys };\n } else if (type === 'string' && format === 'password') {\n if (!hasProtectedDefaultBranch) {\n fieldUi['ui:widget'] = 'password';\n }\n } else if (type === 'string' && format === 'textarea') {\n fieldUi['ui:widget'] = 'textarea';\n if (options?.input_height) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n rows: parseInputHeightToRows(String(options.input_height)),\n };\n }\n } else if (type === 'string' && format === 'trim') {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n trim: true,\n };\n } else if (isDynamicSelectSchema(propSchema)) {\n fieldUi['ui:widget'] = 'dynamic-select';\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n watch: propSchema.watch as Record<string, string>,\n enumSource: propSchema.enumSource as unknown[],\n tags: !!options?.tags,\n };\n } else if (isMultiSelectSchema(propSchema)) {\n // Must precede async-select: arrays with options.async also match isAsyncSelectSchema.\n const items = propSchema.items as JsonSchema | undefined;\n const itemsOptions = items?.options as Record<string, unknown> | undefined;\n fieldUi['ui:widget'] = 'async-multi-select';\n fieldUi['ui:options'] = {\n async: options?.async ?? itemsOptions?.async ?? null,\n creatable: !!options?.creatable || !!options?.tags,\n placeholder: String(\n (options?.inputAttributes as Record<string, string>)?.placeholder ?? '',\n ),\n ...(items?.watch && { watch: items.watch as Record<string, string> }),\n ...(items?.enumSource && { enumSource: items.enumSource }),\n };\n } else if (isAsyncSelectSchema(propSchema)) {\n fieldUi['ui:widget'] = 'async-select';\n fieldUi['ui:options'] = {\n async: options?.async ?? null,\n creatable: !!options?.creatable,\n placeholder: String(\n (options?.inputAttributes as Record<string, string>)?.placeholder ?? '',\n ),\n };\n }\n\n // Template/watch (no enumSource) → computed field.\n // - Hidden: an invisible helper that keeps its value in sync.\n // - Visible: read-only, as the schemas written for json-editor expect.\n // - Objects/arrays are always hidden — RJSF ignores `ui:widget` on them.\n if (isTemplateWatchSchema(propSchema)) {\n fieldUi['ui:widget'] = 'template-watch';\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n watch: propSchema.watch as Record<string, string>,\n template: propSchema.template as string,\n ...(isContainerSchema(propSchema) && { hidden: true }),\n };\n }\n\n if (type === 'boolean' && options?.enum_titles) {\n fieldUi['ui:widget'] = 'select';\n }\n\n // `collapsed: false` = collapsible, expanded by default\n if (options?.collapsed !== undefined) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n collapsed: !!options.collapsed,\n };\n }\n\n if (options?.disable_collapse) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n disableCollapse: true,\n };\n }\n\n // Conditional visibility\n if (options?.dependencies) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n dependencies: options.dependencies as Record<string, unknown>,\n };\n }\n\n // Forces a new row in grid layouts\n if (options?.grid_break) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n gridBreak: true,\n };\n }\n\n if (options?.enabled === false) {\n fieldUi['ui:disabled'] = true;\n }\n\n // Leaf values pre-filled from image_parameters disable the field; objects recurse below.\n const globalValue = globalConfig?.[key];\n if (globalValue !== undefined) {\n if (typeof globalValue !== 'object' || globalValue === null || Array.isArray(globalValue)) {\n fieldUi['ui:disabled'] = true;\n }\n }\n\n if (options?.tooltip) {\n fieldUi['ui:help'] = String(options.tooltip);\n }\n\n if ((options?.documentation as Record<string, unknown>)?.link) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n documentation: options?.documentation as { link: string; tooltip?: string },\n };\n }\n\n if (\n (options?.inputAttributes as Record<string, string>)?.placeholder &&\n !fieldUi['ui:widget']\n ) {\n fieldUi['ui:placeholder'] = String(\n (options?.inputAttributes as Record<string, string>)?.placeholder,\n );\n }\n\n if (options?.enum_titles && propSchema.enum) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n enumNames: options.enum_titles as string[],\n };\n }\n\n if (type === 'array') {\n const arrayOpts: Record<string, boolean> = {};\n if (options?.disable_array_add) arrayOpts.addable = false;\n if (options?.disable_array_delete) arrayOpts.removable = false;\n if (options?.disable_array_reorder) arrayOpts.orderable = false;\n if (Object.keys(arrayOpts).length > 0) {\n fieldUi['ui:options'] = {\n ...fieldUi['ui:options'],\n ...arrayOpts,\n };\n }\n\n // optionsList pairs item-level enum_titles with items.enum for multiselect widgets\n const itemsEnumTitles = (propSchema.items?.options as Record<string, unknown> | undefined)\n ?.enum_titles;\n if (Array.isArray(itemsEnumTitles)) {\n fieldUi.items = { 'ui:options': { enumNames: itemsEnumTitles as string[] } };\n }\n }\n\n if (type === 'object' && propSchema.properties) {\n const nestedGlobal =\n globalValue && typeof globalValue === 'object' && !Array.isArray(globalValue)\n ? (globalValue as Record<string, unknown>)\n : undefined;\n const nested = generateUiSchema(\n propSchema,\n readOnly,\n defs,\n nestedGlobal,\n hasProtectedDefaultBranch,\n );\n Object.assign(fieldUi, nested);\n }\n\n if (type === 'array' && propSchema.items?.properties) {\n const itemsUi = generateUiSchema(\n propSchema.items as JsonSchema,\n readOnly,\n defs,\n undefined,\n hasProtectedDefaultBranch,\n );\n if (Object.keys(itemsUi).length > 0) {\n fieldUi.items = itemsUi;\n }\n }\n\n if ((propSchema.enumSource || propSchema.watch) && !fieldUi['ui:widget']) {\n console.warn(\n `[RJSF] Property \"${key}\" uses enumSource/watch which is not yet supported. It will render as a plain input.`,\n );\n }\n\n // After every widget branch: templates read `hidden` here, whatever took the widget slot.\n if (isHidden) {\n fieldUi['ui:options'] = { ...fieldUi['ui:options'], hidden: true };\n }\n\n if (Object.keys(fieldUi).length > 0) {\n uiSchema[key] = fieldUi;\n }\n }\n\n const orderedEntries = Object.entries(properties)\n .filter(([, prop]) => prop.propertyOrder !== undefined)\n .sort(\n ([, a], [, b]) =>\n (a.propertyOrder ?? Number.MAX_SAFE_INTEGER) -\n (b.propertyOrder ?? Number.MAX_SAFE_INTEGER),\n );\n\n if (orderedEntries.length > 0) {\n uiSchema['ui:order'] = [...orderedEntries.map(([key]) => key), '*'];\n }\n }\n\n for (const combiner of ['allOf', 'anyOf', 'oneOf'] as const) {\n const schemas = schema[combiner] as JsonSchema[] | undefined;\n if (schemas) {\n for (const subSchema of schemas) {\n const subUi = generateUiSchema(\n subSchema,\n readOnly,\n undefined,\n undefined,\n hasProtectedDefaultBranch,\n );\n Object.assign(uiSchema, subUi);\n }\n }\n }\n\n for (const branch of ['if', 'then', 'else'] as const) {\n const branchSchema = schema[branch] as JsonSchema | undefined;\n if (branchSchema?.properties) {\n const branchUi = generateUiSchema(\n branchSchema,\n readOnly,\n undefined,\n undefined,\n hasProtectedDefaultBranch,\n );\n Object.assign(uiSchema, branchUi);\n }\n }\n\n return uiSchema;\n};\n\nconst isDynamicSelectSchema = (schema: JsonSchema): boolean => {\n return !!(schema.enumSource && schema.watch && schema.type === 'string');\n};\n\nconst isTemplateWatchSchema = (schema: JsonSchema): boolean => {\n return !!(schema.template && schema.watch && !schema.enumSource);\n};\n\nconst isAsyncSelectSchema = (schema: JsonSchema): boolean => {\n return !!(schema.options?.async || schema.options?.creatable);\n};\n\nconst isMultiSelectSchema = (schema: JsonSchema): boolean => {\n const items = schema.items as JsonSchema | undefined;\n return !!(\n items &&\n schema.uniqueItems &&\n schema.type === 'array' &&\n schema.format !== 'checkbox' &&\n !Array.isArray(items) &&\n ['string', 'number', 'integer'].includes(items.type as string) &&\n (items.enum || items.enumSource || (schema.options as Record<string, unknown>)?.tags)\n );\n};\n\n/** CSS height like \"100px\" → approximate textarea rows. */\nconst parseInputHeightToRows = (height: string): number => {\n const px = parseInt(height, 10);\n if (Number.isNaN(px) || px <= 0) return 5;\n return Math.max(2, Math.round(px / 20));\n};\n\nconst CUSTOM_FORMATS = [\n 'table',\n 'editor',\n 'ssh-editor',\n 'trim',\n 'textarea',\n 'grid',\n 'grid-strict',\n 'tabs',\n 'tabs-top',\n 'categories',\n 'info',\n 'select',\n 'checkbox',\n 'json',\n 'button',\n 'radio',\n];\n\n/** Strips json-editor extensions (format: 'button', options, …) that RJSF/AJV reject. */\nexport const sanitizeSchema = (\n schema: JsonSchema,\n definitions?: Record<string, JsonSchema>,\n /** Skips additionalProperties:false, which breaks if/then/else branch semantics. */\n isConditionalBranch = false,\n): JsonSchema => {\n const cleaned = { ...schema };\n const defs = definitions ?? (cleaned.definitions as Record<string, JsonSchema> | undefined);\n\n // Empty enums are sync-action placeholders; AJV rejects every value against enum:[].\n if (Array.isArray(cleaned.enum) && cleaned.enum.length === 0) {\n delete cleaned.enum;\n }\n\n if (\n Array.isArray(cleaned.enum) &&\n cleaned.enum.length > 0 &&\n (cleaned.type === 'string' || cleaned.type === 'integer' || cleaned.type === 'number')\n ) {\n if (cleaned.default === undefined) {\n // Pre-select the first value, as json-editor did.\n cleaned.default = cleaned.enum[0];\n } else if (!cleaned.enum.includes(cleaned.default)) {\n // RJSF writes defaults into missing fields, so an out-of-enum one would be saved;\n // absent, the component's runtime default applies.\n delete cleaned.default;\n }\n }\n\n if (cleaned.properties && !cleaned.type) {\n cleaned.type = 'object';\n }\n\n // json-editor `required: true`; the parent loop already promoted it to its `required` array.\n if (cleaned.required === true) {\n delete cleaned.required;\n }\n\n // AJV rejects unknown formats\n if (CUSTOM_FORMATS.includes(cleaned.format as string)) {\n delete cleaned.format;\n }\n\n const properties = cleaned.properties as Record<string, JsonSchema> | undefined;\n if (properties) {\n const sanitizedProps: Record<string, JsonSchema> = {};\n const required = (cleaned.required as string[]) ?? [];\n const sanitizedRequired: string[] = [];\n\n for (const [key, rawPropSchema] of Object.entries(properties)) {\n const propSchema = resolveRef(rawPropSchema, defs);\n\n if (propSchema.type === 'button') {\n // A string RJSF accepts; the uiSchema maps it to its widget.\n sanitizedProps[key] = {\n type: 'string',\n title: propSchema.title,\n ...(propSchema.propertyOrder !== undefined && {\n propertyOrder: propSchema.propertyOrder,\n }),\n ...(propSchema.description !== undefined && { description: propSchema.description }),\n };\n continue;\n }\n\n // oneOf gives the select the enum_titles; titles[i] pairs with enum[i], else [true, false].\n if (propSchema.type === 'boolean' && propSchema.options?.enum_titles) {\n const titles = propSchema.options.enum_titles as string[];\n const sanitized = sanitizeSchema(propSchema, defs);\n const enumValues = (propSchema.enum as boolean[] | undefined) ?? [true, false];\n sanitized.oneOf = enumValues.map((value, index) => ({\n const: value,\n title: titles[index] ?? (value ? 'Yes' : 'No'),\n }));\n sanitizedProps[key] = sanitized;\n if (required.includes(key) || propSchema.required === true) {\n if (!sanitizedRequired.includes(key)) sanitizedRequired.push(key);\n }\n continue;\n }\n\n sanitizedProps[key] = sanitizeSchema(propSchema, defs);\n\n if (required.includes(key) || propSchema.required === true) {\n if (!sanitizedRequired.includes(key)) sanitizedRequired.push(key);\n }\n }\n\n cleaned.properties = sanitizedProps;\n if (sanitizedRequired.length > 0) {\n cleaned.required = sanitizedRequired;\n }\n\n // Hides RJSF's \"additional properties\" UI for stored keys the schema lacks. Skipped for:\n // - if/then/else branches, where it breaks JSON Schema semantics\n // - schemas with `if`, whose branches may add properties\n if (!isConditionalBranch && cleaned.additionalProperties === undefined && !cleaned.if) {\n cleaned.additionalProperties = false;\n }\n }\n\n for (const combiner of ['allOf', 'anyOf', 'oneOf'] as const) {\n const schemas = cleaned[combiner] as JsonSchema[] | undefined;\n if (schemas) {\n cleaned[combiner] = schemas.map((s) => sanitizeSchema(s, defs));\n }\n }\n\n // No additionalProperties:false in branches:\n // - on `if` it changes the condition\n // - on `then`/`else` it rejects properties the branch does not redefine\n for (const branch of ['if', 'then', 'else'] as const) {\n const branchSchema = cleaned[branch] as JsonSchema | undefined;\n if (branchSchema) {\n cleaned[branch] = sanitizeSchema(branchSchema, defs, true);\n }\n }\n\n if (cleaned.items && typeof cleaned.items === 'object' && !Array.isArray(cleaned.items)) {\n cleaned.items = sanitizeSchema(cleaned.items as JsonSchema, defs);\n }\n\n return cleaned;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { IChangeEvent } from '@rjsf/core';\nimport Form from '@rjsf/core';\nimport type { RegistryFieldsType, RegistryWidgetsType } from '@rjsf/utils';\nimport validator from '@rjsf/validator-ajv8';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { debounce } from '../../utils/debounce';\n\nimport { isRecord } from './fieldHelpers';\nimport type { RenderMarkdown } from './markdownContext';\nimport { RenderMarkdownProvider } from './markdownContext';\nimport { defaultFields, defaultTemplates, defaultWidgets } from './registry';\nimport { RootFormDataProvider } from './RootFormDataContext';\nimport { generateUiSchema, sanitizeSchema } from './schemaUtils';\n\nconst defaultRenderMarkdown: RenderMarkdown = (source) => source;\n\n/** JSON with keys sorted at every level, so key order never makes two equal objects differ. */\nconst stableStringify = (obj: unknown): string =>\n JSON.stringify(obj, (_key, val) => {\n if (val && typeof val === 'object' && !Array.isArray(val)) {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(val).sort()) {\n sorted[key] = val[key];\n }\n return sorted;\n }\n return val;\n });\n\nexport const RjsfSchemaEditor = ({\n schema,\n value,\n onChange,\n readOnly,\n inForm,\n globalConfig,\n rootContext,\n onRegisterValidate,\n widgets,\n fields,\n renderMarkdown,\n hasProtectedDefaultBranch = false,\n}: {\n schema: Record<string, unknown>;\n value: Record<string, unknown>;\n onChange: (value: Record<string, unknown>) => void;\n readOnly: boolean;\n inForm?: boolean;\n /** Values from image_parameters.global_config; matching fields are disabled. */\n globalConfig?: Record<string, unknown> | null;\n /** Read-only `watch` entries merged one level deep over form data; never in `value` or validation.\n * Keep the key set stable: a key that comes and goes flips a computed field between view and save. */\n rootContext?: Record<string, Record<string, unknown>>;\n /** Receives a validate function that shows errors inline and returns validity. */\n onRegisterValidate?: (validate: () => boolean) => void;\n /** Host widgets (e.g. sync-action, async-select), merged over the built-in registry. */\n widgets?: RegistryWidgetsType;\n /** Host fields (e.g. sshForm), merged over the built-in registry. */\n fields?: RegistryFieldsType;\n /** Defaults to plain text. */\n renderMarkdown?: RenderMarkdown;\n /** Password fields render as plain text inputs. */\n hasProtectedDefaultBranch?: boolean;\n}) => {\n const schemaJs = useMemo(() => sanitizeSchema(schema), [schema]);\n const uiSchema = useMemo(\n () =>\n generateUiSchema(\n schema,\n readOnly,\n undefined,\n globalConfig ?? undefined,\n hasProtectedDefaultBranch,\n ),\n [schema, readOnly, globalConfig, hasProtectedDefaultBranch],\n );\n\n const mergedWidgets = useMemo(() => ({ ...defaultWidgets, ...widgets }), [widgets]);\n const mergedFields = useMemo(() => ({ ...defaultFields, ...fields }), [fields]);\n\n // Uncontrolled: `initialFormData`, not `formData`, so re-renders and store echoes never reset RJSF.\n const initialDataRef = useRef<Record<string, unknown>>(value);\n const formDataRef = useRef<Record<string, unknown>>(initialDataRef.current);\n const [formKey, setFormKey] = useState(0);\n\n // No validation until the host asks (onRegisterValidate), else old configs open covered in errors.\n // After that, revalidate on blur, not change: a full AJV pass per keystroke is too costly.\n const [hasValidated, setHasValidated] = useState(false);\n\n // Via context, widgets read the latest root data, incl. hidden objects RJSF may drop (_metadata_).\n const [rootFormData, setRootFormData] = useState<Record<string, unknown>>(initialDataRef.current);\n\n // Form data after RJSF filled schema defaults on mount; data equal to it is not \"unsaved changes\".\n const mountedFormDataJsonRef = useRef<string | null>(null);\n\n // Skips mount-phase onChange; re-arms when formKey remounts the Form.\n const isInitialMountRef = useRef(true);\n useEffect(() => {\n isInitialMountRef.current = false;\n }, [formKey]);\n\n // Stable, so a fresh parent `onChange` never recreates the debounced writer or `formContext`.\n const handleValueChange = useStableCallback(onChange);\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Last value sent to the store, to tell our own echo from an external change.\n const lastSentJsonRef = useRef<string | null>(null);\n\n const debouncedOnChange = useMemo(\n () =>\n debounce((data: Record<string, unknown>) => {\n const dataJson = stableStringify(data);\n const storeJson = stableStringify(valueRef.current);\n if (dataJson !== storeJson) {\n // Catches late mount-phase onChange that slips past isInitialMountRef.\n // Cleared by the first propagation, so a later revert to the mount state still propagates.\n if (mountedFormDataJsonRef.current && dataJson === mountedFormDataJsonRef.current) {\n return;\n }\n mountedFormDataJsonRef.current = null;\n lastSentJsonRef.current = dataJson;\n handleValueChange(data);\n }\n }, 100),\n [handleValueChange],\n );\n\n useEffect(() => () => debouncedOnChange.cancel(), [debouncedOnChange]);\n\n // During render, not in an effect, to avoid a flash of stale data.\n const [prevValue, setPrevValue] = useState(value);\n if (value !== prevValue) {\n setPrevValue(value);\n const incomingJson = stableStringify(value);\n if (incomingJson !== stableStringify(prevValue)) {\n if (lastSentJsonRef.current && lastSentJsonRef.current === incomingJson) {\n // Our own echo from the store.\n lastSentJsonRef.current = null;\n } else {\n // External change wins and remounts Form; a pending write would desync store and form.\n debouncedOnChange.cancel();\n lastSentJsonRef.current = null;\n initialDataRef.current = value;\n formDataRef.current = value;\n isInitialMountRef.current = true;\n mountedFormDataJsonRef.current = null;\n setFormKey((k) => k + 1);\n }\n }\n }\n\n const handleChange = useCallback(\n (e: IChangeEvent) => {\n if (!e.formData) return;\n formDataRef.current = e.formData as Record<string, unknown>;\n setRootFormData(e.formData as Record<string, unknown>);\n\n if (isInitialMountRef.current) {\n mountedFormDataJsonRef.current = stableStringify(e.formData);\n return;\n }\n\n debouncedOnChange(e.formData as Record<string, unknown>);\n },\n [debouncedOnChange],\n );\n\n // One identity for the editor's life: a fresh object makes RJSF reset on every re-render.\n // Every dependency is stable, so the memo never recomputes — keep it that way.\n const formContext = useMemo(\n () => ({\n setFormData: (data: unknown) => {\n // Shallow merge: properties absent from `data` are preserved.\n const merged = { ...formDataRef.current, ...(data as Record<string, unknown>) };\n initialDataRef.current = merged;\n formDataRef.current = merged;\n setRootFormData(merged);\n debouncedOnChange.cancel();\n lastSentJsonRef.current = stableStringify(merged);\n handleValueChange(merged);\n isInitialMountRef.current = true;\n mountedFormDataJsonRef.current = null;\n setFormKey((k) => k + 1);\n },\n getFormData: () => formDataRef.current,\n }),\n [debouncedOnChange, handleValueChange],\n );\n\n const formRef = useRef<InstanceType<typeof Form>>(null);\n useEffect(() => {\n if (onRegisterValidate) {\n onRegisterValidate(() => {\n setHasValidated(true);\n return formRef.current?.validateForm() ?? true;\n });\n }\n }, [onRegisterValidate, formKey]);\n\n const rootFormDataValue = useMemo(() => {\n const context = rootContext ?? {};\n const merged = { ...rootFormData };\n for (const [key, entry] of Object.entries(context)) {\n const existing = merged[key];\n merged[key] = isRecord(existing) ? { ...existing, ...entry } : entry;\n }\n return { data: merged, context };\n }, [rootFormData, rootContext]);\n\n return (\n <div className=\"json-editor\">\n <RenderMarkdownProvider value={renderMarkdown ?? defaultRenderMarkdown}>\n <RootFormDataProvider value={rootFormDataValue}>\n <Form\n ref={formRef}\n schema={schemaJs}\n key={formKey}\n initialFormData={initialDataRef.current}\n uiSchema={uiSchema}\n validator={validator}\n onChange={handleChange}\n widgets={mergedWidgets}\n fields={mergedFields}\n templates={defaultTemplates}\n formContext={formContext}\n disabled={readOnly}\n liveValidate={hasValidated ? 'onBlur' : undefined}\n showErrorList={false}\n noHtml5Validate\n tagName={inForm ? 'div' : 'form'}\n >\n {/* Hides the default submit button */}\n <></>\n </Form>\n </RootFormDataProvider>\n </RenderMarkdownProvider>\n </div>\n );\n};\n"],"mappings":"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"}