@multiplatform.one/frappe-ui 7.4.0 → 7.5.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 (722) hide show
  1. package/dist/cjs/FileBrowser/AttachLibrary.cjs +111 -0
  2. package/dist/cjs/FileBrowser/AttachLibrary.native.js +115 -0
  3. package/dist/cjs/FileBrowser/AttachLibrary.native.js.map +1 -0
  4. package/dist/cjs/FileBrowser/folderTree.cjs +84 -0
  5. package/dist/cjs/FileBrowser/folderTree.native.js +94 -0
  6. package/dist/cjs/FileBrowser/folderTree.native.js.map +1 -0
  7. package/dist/cjs/FileBrowser/index.cjs +661 -0
  8. package/dist/cjs/FileBrowser/index.native.js +735 -0
  9. package/dist/cjs/FileBrowser/index.native.js.map +1 -0
  10. package/dist/cjs/FileBrowser/types.cjs +18 -0
  11. package/dist/cjs/FileBrowser/types.native.js +21 -0
  12. package/dist/cjs/FileBrowser/types.native.js.map +1 -0
  13. package/dist/cjs/FileBrowser/viewPersistence.cjs +55 -0
  14. package/dist/cjs/FileBrowser/viewPersistence.native.js +60 -0
  15. package/dist/cjs/FileBrowser/viewPersistence.native.js.map +1 -0
  16. package/dist/cjs/FormSidebar.cjs +47 -47
  17. package/dist/cjs/FormSidebar.native.js +48 -50
  18. package/dist/cjs/FormSidebar.native.js.map +1 -1
  19. package/dist/cjs/FrappeAssignment.cjs +18 -13
  20. package/dist/cjs/FrappeAssignment.native.js +19 -13
  21. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  22. package/dist/cjs/FrappeCalendar.cjs +11 -10
  23. package/dist/cjs/FrappeCalendar.native.js +11 -10
  24. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  25. package/dist/cjs/FrappeChartCard.cjs +6 -15
  26. package/dist/cjs/FrappeChartCard.native.js +6 -15
  27. package/dist/cjs/FrappeChartCard.native.js.map +1 -1
  28. package/dist/cjs/FrappeDashboard.cjs +12 -9
  29. package/dist/cjs/FrappeDashboard.native.js +12 -9
  30. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  31. package/dist/cjs/FrappeForm.cjs +36 -25
  32. package/dist/cjs/FrappeForm.native.js +36 -25
  33. package/dist/cjs/FrappeForm.native.js.map +1 -1
  34. package/dist/cjs/FrappeGantt.cjs +7 -5
  35. package/dist/cjs/FrappeGantt.native.js +7 -5
  36. package/dist/cjs/FrappeGantt.native.js.map +1 -1
  37. package/dist/cjs/FrappeImageView.cjs +22 -22
  38. package/dist/cjs/FrappeImageView.native.js +24 -22
  39. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  40. package/dist/cjs/FrappeKPICard.cjs +7 -29
  41. package/dist/cjs/FrappeKPICard.native.js +7 -29
  42. package/dist/cjs/FrappeKPICard.native.js.map +1 -1
  43. package/dist/cjs/FrappeKanban.cjs +11 -13
  44. package/dist/cjs/FrappeKanban.native.js +11 -13
  45. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  46. package/dist/cjs/FrappeLikedBy.cjs +5 -5
  47. package/dist/cjs/FrappeLikedBy.native.js +6 -6
  48. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  49. package/dist/cjs/FrappeListView.cjs +32 -33
  50. package/dist/cjs/FrappeListView.native.js +37 -39
  51. package/dist/cjs/FrappeListView.native.js.map +1 -1
  52. package/dist/cjs/FrappeReportBuilder.cjs +30 -46
  53. package/dist/cjs/FrappeReportBuilder.native.js +30 -42
  54. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  55. package/dist/cjs/FrappeReportView.cjs +5 -5
  56. package/dist/cjs/FrappeReportView.native.js +5 -5
  57. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  58. package/dist/cjs/FrappeTreeView.cjs +9 -6
  59. package/dist/cjs/FrappeTreeView.native.js +10 -6
  60. package/dist/cjs/FrappeTreeView.native.js.map +1 -1
  61. package/dist/cjs/desk/DeskFormPage.cjs +3 -3
  62. package/dist/cjs/desk/DeskFormPage.native.js +3 -3
  63. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  64. package/dist/cjs/desk/DeskListPage.cjs +2 -2
  65. package/dist/cjs/desk/DeskListPage.native.js +2 -2
  66. package/dist/cjs/desk/DeskListPage.native.js.map +1 -1
  67. package/dist/cjs/desk/DeskShell.cjs +58 -38
  68. package/dist/cjs/desk/DeskShell.native.js +63 -44
  69. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  70. package/dist/cjs/desk/awesomebar.cjs +28 -16
  71. package/dist/cjs/desk/awesomebar.native.js +28 -16
  72. package/dist/cjs/desk/awesomebar.native.js.map +1 -1
  73. package/dist/cjs/fieldRegistry.cjs +15 -3
  74. package/dist/cjs/fieldRegistry.native.js +15 -3
  75. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  76. package/dist/cjs/fields/Check/index.cjs +1 -1
  77. package/dist/cjs/fields/Check/index.native.js +1 -1
  78. package/dist/cjs/fields/Check/index.native.js.map +1 -1
  79. package/dist/cjs/fields/Color/index.cjs +1 -1
  80. package/dist/cjs/fields/Color/index.native.js +1 -1
  81. package/dist/cjs/fields/Color/index.native.js.map +1 -1
  82. package/dist/cjs/fields/Data/index.native.js.map +1 -1
  83. package/dist/cjs/fields/Date/index.native.js +47 -34
  84. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  85. package/dist/cjs/fields/Date/sheetKeyboard.cjs +54 -0
  86. package/dist/cjs/fields/Date/sheetKeyboard.native.js +57 -0
  87. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +1 -0
  88. package/dist/cjs/fields/DynamicLink.cjs +37 -128
  89. package/dist/cjs/fields/DynamicLink.native.js +40 -138
  90. package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
  91. package/dist/cjs/fields/FileUpload.cjs +233 -50
  92. package/dist/cjs/fields/FileUpload.native.js +242 -51
  93. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  94. package/dist/cjs/fields/FileUploadField/index.cjs +53 -20
  95. package/dist/cjs/fields/FileUploadField/index.native.js +56 -20
  96. package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
  97. package/dist/cjs/fields/HTML/index.cjs +30 -51
  98. package/dist/cjs/fields/HTML/index.native.js +30 -51
  99. package/dist/cjs/fields/HTML/index.native.js.map +1 -1
  100. package/dist/cjs/fields/Icon/index.cjs +73 -0
  101. package/dist/cjs/fields/Icon/index.native.js +76 -0
  102. package/dist/cjs/fields/Icon/index.native.js.map +1 -0
  103. package/dist/cjs/fields/Link.cjs +34 -8
  104. package/dist/cjs/fields/Link.native.js +35 -9
  105. package/dist/cjs/fields/Link.native.js.map +1 -1
  106. package/dist/cjs/fields/LinkTree.cjs +114 -0
  107. package/dist/cjs/fields/LinkTree.native.js +125 -0
  108. package/dist/cjs/fields/LinkTree.native.js.map +1 -0
  109. package/dist/cjs/fields/LongText/index.cjs +6 -4
  110. package/dist/cjs/fields/LongText/index.native.js +6 -4
  111. package/dist/cjs/fields/LongText/index.native.js.map +1 -1
  112. package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
  113. package/dist/cjs/fields/Password/index.cjs +178 -16
  114. package/dist/cjs/fields/Password/index.native.js +197 -16
  115. package/dist/cjs/fields/Password/index.native.js.map +1 -1
  116. package/dist/cjs/fields/Phone/index.native.js.map +1 -1
  117. package/dist/cjs/fields/ReadOnly/index.cjs +34 -48
  118. package/dist/cjs/fields/ReadOnly/index.native.js +34 -46
  119. package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
  120. package/dist/cjs/fields/Select/index.cjs +1 -1
  121. package/dist/cjs/fields/Select/index.native.js +1 -1
  122. package/dist/cjs/fields/Select/index.native.js.map +1 -1
  123. package/dist/cjs/fields/SmallText/index.cjs +4 -3
  124. package/dist/cjs/fields/SmallText/index.native.js +4 -3
  125. package/dist/cjs/fields/SmallText/index.native.js.map +1 -1
  126. package/dist/cjs/fields/TableMultiSelect.cjs +39 -150
  127. package/dist/cjs/fields/TableMultiSelect.native.js +44 -171
  128. package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
  129. package/dist/cjs/fields/TextEditor/index.cjs +26 -293
  130. package/dist/cjs/index.cjs +9 -0
  131. package/dist/cjs/index.native.js +9 -0
  132. package/dist/cjs/index.native.js.map +1 -1
  133. package/dist/cjs/schemaForm/SchemaWizard.cjs +182 -0
  134. package/dist/cjs/schemaForm/SchemaWizard.native.js +232 -0
  135. package/dist/cjs/schemaForm/SchemaWizard.native.js.map +1 -0
  136. package/dist/cjs/schemaForm/index.cjs +1 -1
  137. package/dist/cjs/schemaForm/index.native.js +1 -1
  138. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  139. package/dist/cjs/shared/useKeyboardInset.cjs +48 -0
  140. package/dist/cjs/shared/useKeyboardInset.native.js +53 -0
  141. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -0
  142. package/dist/esm/FileBrowser/AttachLibrary.mjs +86 -0
  143. package/dist/esm/FileBrowser/AttachLibrary.mjs.map +1 -0
  144. package/dist/esm/FileBrowser/AttachLibrary.native.js +87 -0
  145. package/dist/esm/FileBrowser/AttachLibrary.native.js.map +1 -0
  146. package/dist/esm/FileBrowser/folderTree.mjs +52 -0
  147. package/dist/esm/FileBrowser/folderTree.mjs.map +1 -0
  148. package/dist/esm/FileBrowser/folderTree.native.js +59 -0
  149. package/dist/esm/FileBrowser/folderTree.native.js.map +1 -0
  150. package/dist/esm/FileBrowser/index.mjs +636 -0
  151. package/dist/esm/FileBrowser/index.mjs.map +1 -0
  152. package/dist/esm/FileBrowser/index.native.js +707 -0
  153. package/dist/esm/FileBrowser/index.native.js.map +1 -0
  154. package/dist/esm/FileBrowser/types.mjs +2 -0
  155. package/dist/esm/FileBrowser/types.mjs.map +1 -0
  156. package/dist/esm/FileBrowser/types.native.js +2 -0
  157. package/dist/esm/FileBrowser/types.native.js.map +1 -0
  158. package/dist/esm/FileBrowser/viewPersistence.mjs +29 -0
  159. package/dist/esm/FileBrowser/viewPersistence.mjs.map +1 -0
  160. package/dist/esm/FileBrowser/viewPersistence.native.js +31 -0
  161. package/dist/esm/FileBrowser/viewPersistence.native.js.map +1 -0
  162. package/dist/esm/FormSidebar.mjs +46 -46
  163. package/dist/esm/FormSidebar.mjs.map +1 -1
  164. package/dist/esm/FormSidebar.native.js +47 -49
  165. package/dist/esm/FormSidebar.native.js.map +1 -1
  166. package/dist/esm/FrappeAssignment.mjs +19 -14
  167. package/dist/esm/FrappeAssignment.mjs.map +1 -1
  168. package/dist/esm/FrappeAssignment.native.js +20 -14
  169. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  170. package/dist/esm/FrappeCalendar.mjs +12 -11
  171. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  172. package/dist/esm/FrappeCalendar.native.js +12 -11
  173. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  174. package/dist/esm/FrappeChartCard.mjs +7 -16
  175. package/dist/esm/FrappeChartCard.mjs.map +1 -1
  176. package/dist/esm/FrappeChartCard.native.js +7 -16
  177. package/dist/esm/FrappeChartCard.native.js.map +1 -1
  178. package/dist/esm/FrappeDashboard.mjs +12 -9
  179. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  180. package/dist/esm/FrappeDashboard.native.js +12 -9
  181. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  182. package/dist/esm/FrappeForm.mjs +35 -24
  183. package/dist/esm/FrappeForm.mjs.map +1 -1
  184. package/dist/esm/FrappeForm.native.js +35 -24
  185. package/dist/esm/FrappeForm.native.js.map +1 -1
  186. package/dist/esm/FrappeGantt.mjs +7 -5
  187. package/dist/esm/FrappeGantt.mjs.map +1 -1
  188. package/dist/esm/FrappeGantt.native.js +7 -5
  189. package/dist/esm/FrappeGantt.native.js.map +1 -1
  190. package/dist/esm/FrappeImageView.mjs +23 -23
  191. package/dist/esm/FrappeImageView.mjs.map +1 -1
  192. package/dist/esm/FrappeImageView.native.js +25 -23
  193. package/dist/esm/FrappeImageView.native.js.map +1 -1
  194. package/dist/esm/FrappeKPICard.mjs +7 -29
  195. package/dist/esm/FrappeKPICard.mjs.map +1 -1
  196. package/dist/esm/FrappeKPICard.native.js +7 -29
  197. package/dist/esm/FrappeKPICard.native.js.map +1 -1
  198. package/dist/esm/FrappeKanban.mjs +13 -15
  199. package/dist/esm/FrappeKanban.mjs.map +1 -1
  200. package/dist/esm/FrappeKanban.native.js +13 -15
  201. package/dist/esm/FrappeKanban.native.js.map +1 -1
  202. package/dist/esm/FrappeLikedBy.mjs +6 -6
  203. package/dist/esm/FrappeLikedBy.mjs.map +1 -1
  204. package/dist/esm/FrappeLikedBy.native.js +7 -7
  205. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  206. package/dist/esm/FrappeListView.mjs +33 -34
  207. package/dist/esm/FrappeListView.mjs.map +1 -1
  208. package/dist/esm/FrappeListView.native.js +38 -40
  209. package/dist/esm/FrappeListView.native.js.map +1 -1
  210. package/dist/esm/FrappeReportBuilder.mjs +27 -43
  211. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  212. package/dist/esm/FrappeReportBuilder.native.js +27 -39
  213. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  214. package/dist/esm/FrappeReportView.mjs +6 -6
  215. package/dist/esm/FrappeReportView.mjs.map +1 -1
  216. package/dist/esm/FrappeReportView.native.js +6 -6
  217. package/dist/esm/FrappeReportView.native.js.map +1 -1
  218. package/dist/esm/FrappeTreeView.mjs +9 -6
  219. package/dist/esm/FrappeTreeView.mjs.map +1 -1
  220. package/dist/esm/FrappeTreeView.native.js +10 -6
  221. package/dist/esm/FrappeTreeView.native.js.map +1 -1
  222. package/dist/esm/desk/DeskFormPage.mjs +3 -3
  223. package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
  224. package/dist/esm/desk/DeskFormPage.native.js +3 -3
  225. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  226. package/dist/esm/desk/DeskListPage.mjs +2 -2
  227. package/dist/esm/desk/DeskListPage.mjs.map +1 -1
  228. package/dist/esm/desk/DeskListPage.native.js +2 -2
  229. package/dist/esm/desk/DeskListPage.native.js.map +1 -1
  230. package/dist/esm/desk/DeskShell.mjs +48 -28
  231. package/dist/esm/desk/DeskShell.mjs.map +1 -1
  232. package/dist/esm/desk/DeskShell.native.js +52 -33
  233. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  234. package/dist/esm/desk/awesomebar.mjs +29 -17
  235. package/dist/esm/desk/awesomebar.mjs.map +1 -1
  236. package/dist/esm/desk/awesomebar.native.js +29 -17
  237. package/dist/esm/desk/awesomebar.native.js.map +1 -1
  238. package/dist/esm/fieldRegistry.mjs +16 -4
  239. package/dist/esm/fieldRegistry.mjs.map +1 -1
  240. package/dist/esm/fieldRegistry.native.js +16 -4
  241. package/dist/esm/fieldRegistry.native.js.map +1 -1
  242. package/dist/esm/fields/Check/index.mjs +1 -1
  243. package/dist/esm/fields/Check/index.mjs.map +1 -1
  244. package/dist/esm/fields/Check/index.native.js +1 -1
  245. package/dist/esm/fields/Check/index.native.js.map +1 -1
  246. package/dist/esm/fields/Color/index.mjs +1 -1
  247. package/dist/esm/fields/Color/index.mjs.map +1 -1
  248. package/dist/esm/fields/Color/index.native.js +1 -1
  249. package/dist/esm/fields/Color/index.native.js.map +1 -1
  250. package/dist/esm/fields/Data/index.mjs.map +1 -1
  251. package/dist/esm/fields/Data/index.native.js.map +1 -1
  252. package/dist/esm/fields/Date/index.native.js +46 -33
  253. package/dist/esm/fields/Date/index.native.js.map +1 -1
  254. package/dist/esm/fields/Date/sheetKeyboard.mjs +21 -0
  255. package/dist/esm/fields/Date/sheetKeyboard.mjs.map +1 -0
  256. package/dist/esm/fields/Date/sheetKeyboard.native.js +21 -0
  257. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +1 -0
  258. package/dist/esm/fields/DynamicLink.mjs +37 -128
  259. package/dist/esm/fields/DynamicLink.mjs.map +1 -1
  260. package/dist/esm/fields/DynamicLink.native.js +40 -138
  261. package/dist/esm/fields/DynamicLink.native.js.map +1 -1
  262. package/dist/esm/fields/FileUpload.mjs +234 -51
  263. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  264. package/dist/esm/fields/FileUpload.native.js +243 -52
  265. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  266. package/dist/esm/fields/FileUploadField/index.mjs +55 -22
  267. package/dist/esm/fields/FileUploadField/index.mjs.map +1 -1
  268. package/dist/esm/fields/FileUploadField/index.native.js +58 -22
  269. package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
  270. package/dist/esm/fields/HTML/index.mjs +33 -54
  271. package/dist/esm/fields/HTML/index.mjs.map +1 -1
  272. package/dist/esm/fields/HTML/index.native.js +33 -54
  273. package/dist/esm/fields/HTML/index.native.js.map +1 -1
  274. package/dist/esm/fields/Icon/index.mjs +48 -0
  275. package/dist/esm/fields/Icon/index.mjs.map +1 -0
  276. package/dist/esm/fields/Icon/index.native.js +48 -0
  277. package/dist/esm/fields/Icon/index.native.js.map +1 -0
  278. package/dist/esm/fields/Link.mjs +35 -9
  279. package/dist/esm/fields/Link.mjs.map +1 -1
  280. package/dist/esm/fields/Link.native.js +36 -10
  281. package/dist/esm/fields/Link.native.js.map +1 -1
  282. package/dist/esm/fields/LinkTree.mjs +89 -0
  283. package/dist/esm/fields/LinkTree.mjs.map +1 -0
  284. package/dist/esm/fields/LinkTree.native.js +97 -0
  285. package/dist/esm/fields/LinkTree.native.js.map +1 -0
  286. package/dist/esm/fields/LongText/index.mjs +7 -5
  287. package/dist/esm/fields/LongText/index.mjs.map +1 -1
  288. package/dist/esm/fields/LongText/index.native.js +7 -5
  289. package/dist/esm/fields/LongText/index.native.js.map +1 -1
  290. package/dist/esm/fields/Numeric/index.mjs.map +1 -1
  291. package/dist/esm/fields/Numeric/index.native.js.map +1 -1
  292. package/dist/esm/fields/Password/index.mjs +180 -18
  293. package/dist/esm/fields/Password/index.mjs.map +1 -1
  294. package/dist/esm/fields/Password/index.native.js +199 -18
  295. package/dist/esm/fields/Password/index.native.js.map +1 -1
  296. package/dist/esm/fields/Phone/index.mjs.map +1 -1
  297. package/dist/esm/fields/Phone/index.native.js.map +1 -1
  298. package/dist/esm/fields/ReadOnly/index.mjs +36 -50
  299. package/dist/esm/fields/ReadOnly/index.mjs.map +1 -1
  300. package/dist/esm/fields/ReadOnly/index.native.js +36 -48
  301. package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
  302. package/dist/esm/fields/Select/index.mjs +1 -1
  303. package/dist/esm/fields/Select/index.mjs.map +1 -1
  304. package/dist/esm/fields/Select/index.native.js +1 -1
  305. package/dist/esm/fields/Select/index.native.js.map +1 -1
  306. package/dist/esm/fields/SmallText/index.mjs +5 -4
  307. package/dist/esm/fields/SmallText/index.mjs.map +1 -1
  308. package/dist/esm/fields/SmallText/index.native.js +5 -4
  309. package/dist/esm/fields/SmallText/index.native.js.map +1 -1
  310. package/dist/esm/fields/TableMultiSelect.mjs +41 -152
  311. package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
  312. package/dist/esm/fields/TableMultiSelect.native.js +46 -173
  313. package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
  314. package/dist/esm/fields/TextEditor/index.mjs +28 -284
  315. package/dist/esm/fields/TextEditor/index.mjs.map +1 -1
  316. package/dist/esm/index.mjs +5 -1
  317. package/dist/esm/index.mjs.map +1 -1
  318. package/dist/esm/index.native.js +5 -1
  319. package/dist/esm/index.native.js.map +1 -1
  320. package/dist/esm/schemaForm/SchemaWizard.mjs +156 -0
  321. package/dist/esm/schemaForm/SchemaWizard.mjs.map +1 -0
  322. package/dist/esm/schemaForm/SchemaWizard.native.js +203 -0
  323. package/dist/esm/schemaForm/SchemaWizard.native.js.map +1 -0
  324. package/dist/esm/schemaForm/index.mjs +1 -1
  325. package/dist/esm/schemaForm/index.mjs.map +1 -1
  326. package/dist/esm/schemaForm/index.native.js +1 -1
  327. package/dist/esm/schemaForm/index.native.js.map +1 -1
  328. package/dist/esm/shared/useKeyboardInset.mjs +23 -0
  329. package/dist/esm/shared/useKeyboardInset.mjs.map +1 -0
  330. package/dist/esm/shared/useKeyboardInset.native.js +25 -0
  331. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -0
  332. package/dist/jsx/FileBrowser/AttachLibrary.mjs +86 -0
  333. package/dist/jsx/FileBrowser/AttachLibrary.mjs.map +1 -0
  334. package/dist/jsx/FileBrowser/AttachLibrary.native.js +115 -0
  335. package/dist/jsx/FileBrowser/AttachLibrary.native.js.map +1 -0
  336. package/dist/jsx/FileBrowser/folderTree.mjs +52 -0
  337. package/dist/jsx/FileBrowser/folderTree.mjs.map +1 -0
  338. package/dist/jsx/FileBrowser/folderTree.native.js +94 -0
  339. package/dist/jsx/FileBrowser/folderTree.native.js.map +1 -0
  340. package/dist/jsx/FileBrowser/index.mjs +636 -0
  341. package/dist/jsx/FileBrowser/index.mjs.map +1 -0
  342. package/dist/jsx/FileBrowser/index.native.js +735 -0
  343. package/dist/jsx/FileBrowser/index.native.js.map +1 -0
  344. package/dist/jsx/FileBrowser/types.mjs +2 -0
  345. package/dist/jsx/FileBrowser/types.mjs.map +1 -0
  346. package/dist/jsx/FileBrowser/types.native.js +21 -0
  347. package/dist/jsx/FileBrowser/types.native.js.map +1 -0
  348. package/dist/jsx/FileBrowser/viewPersistence.mjs +29 -0
  349. package/dist/jsx/FileBrowser/viewPersistence.mjs.map +1 -0
  350. package/dist/jsx/FileBrowser/viewPersistence.native.js +60 -0
  351. package/dist/jsx/FileBrowser/viewPersistence.native.js.map +1 -0
  352. package/dist/jsx/FormSidebar.mjs +46 -46
  353. package/dist/jsx/FormSidebar.mjs.map +1 -1
  354. package/dist/jsx/FormSidebar.native.js +48 -50
  355. package/dist/jsx/FormSidebar.native.js.map +1 -1
  356. package/dist/jsx/FrappeAssignment.mjs +19 -14
  357. package/dist/jsx/FrappeAssignment.mjs.map +1 -1
  358. package/dist/jsx/FrappeAssignment.native.js +19 -13
  359. package/dist/jsx/FrappeAssignment.native.js.map +1 -1
  360. package/dist/jsx/FrappeCalendar.mjs +12 -11
  361. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  362. package/dist/jsx/FrappeCalendar.native.js +11 -10
  363. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  364. package/dist/jsx/FrappeChartCard.mjs +7 -16
  365. package/dist/jsx/FrappeChartCard.mjs.map +1 -1
  366. package/dist/jsx/FrappeChartCard.native.js +6 -15
  367. package/dist/jsx/FrappeChartCard.native.js.map +1 -1
  368. package/dist/jsx/FrappeDashboard.mjs +12 -9
  369. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  370. package/dist/jsx/FrappeDashboard.native.js +12 -9
  371. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  372. package/dist/jsx/FrappeForm.mjs +35 -24
  373. package/dist/jsx/FrappeForm.mjs.map +1 -1
  374. package/dist/jsx/FrappeForm.native.js +36 -25
  375. package/dist/jsx/FrappeForm.native.js.map +1 -1
  376. package/dist/jsx/FrappeGantt.mjs +7 -5
  377. package/dist/jsx/FrappeGantt.mjs.map +1 -1
  378. package/dist/jsx/FrappeGantt.native.js +7 -5
  379. package/dist/jsx/FrappeGantt.native.js.map +1 -1
  380. package/dist/jsx/FrappeImageView.mjs +23 -23
  381. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  382. package/dist/jsx/FrappeImageView.native.js +24 -22
  383. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  384. package/dist/jsx/FrappeKPICard.mjs +7 -29
  385. package/dist/jsx/FrappeKPICard.mjs.map +1 -1
  386. package/dist/jsx/FrappeKPICard.native.js +7 -29
  387. package/dist/jsx/FrappeKPICard.native.js.map +1 -1
  388. package/dist/jsx/FrappeKanban.mjs +13 -15
  389. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  390. package/dist/jsx/FrappeKanban.native.js +11 -13
  391. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  392. package/dist/jsx/FrappeLikedBy.mjs +6 -6
  393. package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
  394. package/dist/jsx/FrappeLikedBy.native.js +6 -6
  395. package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
  396. package/dist/jsx/FrappeListView.mjs +33 -34
  397. package/dist/jsx/FrappeListView.mjs.map +1 -1
  398. package/dist/jsx/FrappeListView.native.js +37 -39
  399. package/dist/jsx/FrappeListView.native.js.map +1 -1
  400. package/dist/jsx/FrappeReportBuilder.mjs +27 -43
  401. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  402. package/dist/jsx/FrappeReportBuilder.native.js +30 -42
  403. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  404. package/dist/jsx/FrappeReportView.mjs +6 -6
  405. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  406. package/dist/jsx/FrappeReportView.native.js +5 -5
  407. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  408. package/dist/jsx/FrappeTreeView.mjs +9 -6
  409. package/dist/jsx/FrappeTreeView.mjs.map +1 -1
  410. package/dist/jsx/FrappeTreeView.native.js +10 -6
  411. package/dist/jsx/FrappeTreeView.native.js.map +1 -1
  412. package/dist/jsx/desk/DeskFormPage.mjs +3 -3
  413. package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
  414. package/dist/jsx/desk/DeskFormPage.native.js +3 -3
  415. package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
  416. package/dist/jsx/desk/DeskListPage.mjs +2 -2
  417. package/dist/jsx/desk/DeskListPage.mjs.map +1 -1
  418. package/dist/jsx/desk/DeskListPage.native.js +2 -2
  419. package/dist/jsx/desk/DeskListPage.native.js.map +1 -1
  420. package/dist/jsx/desk/DeskShell.mjs +48 -28
  421. package/dist/jsx/desk/DeskShell.mjs.map +1 -1
  422. package/dist/jsx/desk/DeskShell.native.js +63 -44
  423. package/dist/jsx/desk/DeskShell.native.js.map +1 -1
  424. package/dist/jsx/desk/awesomebar.mjs +29 -17
  425. package/dist/jsx/desk/awesomebar.mjs.map +1 -1
  426. package/dist/jsx/desk/awesomebar.native.js +28 -16
  427. package/dist/jsx/desk/awesomebar.native.js.map +1 -1
  428. package/dist/jsx/fieldRegistry.mjs +16 -4
  429. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  430. package/dist/jsx/fieldRegistry.native.js +15 -3
  431. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  432. package/dist/jsx/fields/Check/index.mjs +1 -1
  433. package/dist/jsx/fields/Check/index.mjs.map +1 -1
  434. package/dist/jsx/fields/Check/index.native.js +1 -1
  435. package/dist/jsx/fields/Check/index.native.js.map +1 -1
  436. package/dist/jsx/fields/Color/index.mjs +1 -1
  437. package/dist/jsx/fields/Color/index.mjs.map +1 -1
  438. package/dist/jsx/fields/Color/index.native.js +1 -1
  439. package/dist/jsx/fields/Color/index.native.js.map +1 -1
  440. package/dist/jsx/fields/Data/index.mjs.map +1 -1
  441. package/dist/jsx/fields/Data/index.native.js.map +1 -1
  442. package/dist/jsx/fields/Date/index.native.js +47 -34
  443. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  444. package/dist/jsx/fields/Date/sheetKeyboard.mjs +21 -0
  445. package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +1 -0
  446. package/dist/jsx/fields/Date/sheetKeyboard.native.js +57 -0
  447. package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +1 -0
  448. package/dist/jsx/fields/DynamicLink.mjs +37 -128
  449. package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
  450. package/dist/jsx/fields/DynamicLink.native.js +40 -138
  451. package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
  452. package/dist/jsx/fields/FileUpload.mjs +234 -51
  453. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  454. package/dist/jsx/fields/FileUpload.native.js +242 -51
  455. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  456. package/dist/jsx/fields/FileUploadField/index.mjs +55 -22
  457. package/dist/jsx/fields/FileUploadField/index.mjs.map +1 -1
  458. package/dist/jsx/fields/FileUploadField/index.native.js +56 -20
  459. package/dist/jsx/fields/FileUploadField/index.native.js.map +1 -1
  460. package/dist/jsx/fields/HTML/index.mjs +33 -54
  461. package/dist/jsx/fields/HTML/index.mjs.map +1 -1
  462. package/dist/jsx/fields/HTML/index.native.js +30 -51
  463. package/dist/jsx/fields/HTML/index.native.js.map +1 -1
  464. package/dist/jsx/fields/Icon/index.mjs +48 -0
  465. package/dist/jsx/fields/Icon/index.mjs.map +1 -0
  466. package/dist/jsx/fields/Icon/index.native.js +76 -0
  467. package/dist/jsx/fields/Icon/index.native.js.map +1 -0
  468. package/dist/jsx/fields/Link.mjs +35 -9
  469. package/dist/jsx/fields/Link.mjs.map +1 -1
  470. package/dist/jsx/fields/Link.native.js +35 -9
  471. package/dist/jsx/fields/Link.native.js.map +1 -1
  472. package/dist/jsx/fields/LinkTree.mjs +89 -0
  473. package/dist/jsx/fields/LinkTree.mjs.map +1 -0
  474. package/dist/jsx/fields/LinkTree.native.js +125 -0
  475. package/dist/jsx/fields/LinkTree.native.js.map +1 -0
  476. package/dist/jsx/fields/LongText/index.mjs +7 -5
  477. package/dist/jsx/fields/LongText/index.mjs.map +1 -1
  478. package/dist/jsx/fields/LongText/index.native.js +6 -4
  479. package/dist/jsx/fields/LongText/index.native.js.map +1 -1
  480. package/dist/jsx/fields/Numeric/index.mjs.map +1 -1
  481. package/dist/jsx/fields/Numeric/index.native.js.map +1 -1
  482. package/dist/jsx/fields/Password/index.mjs +180 -18
  483. package/dist/jsx/fields/Password/index.mjs.map +1 -1
  484. package/dist/jsx/fields/Password/index.native.js +197 -16
  485. package/dist/jsx/fields/Password/index.native.js.map +1 -1
  486. package/dist/jsx/fields/Phone/index.mjs.map +1 -1
  487. package/dist/jsx/fields/Phone/index.native.js.map +1 -1
  488. package/dist/jsx/fields/ReadOnly/index.mjs +36 -50
  489. package/dist/jsx/fields/ReadOnly/index.mjs.map +1 -1
  490. package/dist/jsx/fields/ReadOnly/index.native.js +34 -46
  491. package/dist/jsx/fields/ReadOnly/index.native.js.map +1 -1
  492. package/dist/jsx/fields/Select/index.mjs +1 -1
  493. package/dist/jsx/fields/Select/index.mjs.map +1 -1
  494. package/dist/jsx/fields/Select/index.native.js +1 -1
  495. package/dist/jsx/fields/Select/index.native.js.map +1 -1
  496. package/dist/jsx/fields/SmallText/index.mjs +5 -4
  497. package/dist/jsx/fields/SmallText/index.mjs.map +1 -1
  498. package/dist/jsx/fields/SmallText/index.native.js +4 -3
  499. package/dist/jsx/fields/SmallText/index.native.js.map +1 -1
  500. package/dist/jsx/fields/TableMultiSelect.mjs +41 -152
  501. package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
  502. package/dist/jsx/fields/TableMultiSelect.native.js +44 -171
  503. package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
  504. package/dist/jsx/fields/TextEditor/index.mjs +28 -284
  505. package/dist/jsx/fields/TextEditor/index.mjs.map +1 -1
  506. package/dist/jsx/index.js +5 -1
  507. package/dist/jsx/index.js.map +1 -1
  508. package/dist/jsx/index.mjs +5 -1
  509. package/dist/jsx/index.mjs.map +1 -1
  510. package/dist/jsx/index.native.js +9 -0
  511. package/dist/jsx/index.native.js.map +1 -1
  512. package/dist/jsx/schemaForm/SchemaWizard.mjs +156 -0
  513. package/dist/jsx/schemaForm/SchemaWizard.mjs.map +1 -0
  514. package/dist/jsx/schemaForm/SchemaWizard.native.js +232 -0
  515. package/dist/jsx/schemaForm/SchemaWizard.native.js.map +1 -0
  516. package/dist/jsx/schemaForm/index.mjs +1 -1
  517. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  518. package/dist/jsx/schemaForm/index.native.js +1 -1
  519. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  520. package/dist/jsx/shared/useKeyboardInset.mjs +23 -0
  521. package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -0
  522. package/dist/jsx/shared/useKeyboardInset.native.js +53 -0
  523. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -0
  524. package/package.json +16 -16
  525. package/src/FileBrowser/AttachLibrary.tsx +90 -0
  526. package/src/FileBrowser/FileBrowser.spec.tsx +268 -0
  527. package/src/FileBrowser/FileBrowser.stories.tsx +93 -0
  528. package/src/FileBrowser/folderTree.ts +62 -0
  529. package/src/FileBrowser/index.tsx +724 -0
  530. package/src/FileBrowser/types.ts +61 -0
  531. package/src/FileBrowser/viewPersistence.ts +37 -0
  532. package/src/FormSidebar.stories.tsx +82 -25
  533. package/src/FormSidebar.tsx +51 -37
  534. package/src/FrappeAssignment.stories.tsx +158 -12
  535. package/src/FrappeAssignment.tsx +11 -9
  536. package/src/FrappeCalendar.stories.tsx +85 -9
  537. package/src/FrappeCalendar.tsx +9 -9
  538. package/src/FrappeChartCard.stories.tsx +107 -14
  539. package/src/FrappeChartCard.tsx +5 -12
  540. package/src/FrappeDashboard.stories.tsx +79 -9
  541. package/src/FrappeDashboard.tsx +8 -8
  542. package/src/FrappeForm.tsx +36 -24
  543. package/src/FrappeGantt.stories.tsx +73 -4
  544. package/src/FrappeGantt.tsx +7 -4
  545. package/src/FrappeImageView.tsx +23 -22
  546. package/src/FrappeKPICard.stories.tsx +110 -10
  547. package/src/FrappeKPICard.tsx +6 -22
  548. package/src/FrappeKanban.stories.tsx +115 -9
  549. package/src/FrappeKanban.tsx +10 -9
  550. package/src/FrappeLikedBy.stories.tsx +82 -10
  551. package/src/FrappeLikedBy.tsx +6 -6
  552. package/src/FrappeList.stories.tsx +85 -8
  553. package/src/FrappeListView.spec.tsx +59 -0
  554. package/src/FrappeListView.tsx +27 -30
  555. package/src/FrappeProvider.stories.tsx +53 -2
  556. package/src/FrappeReportBuilder.tsx +21 -34
  557. package/src/FrappeReportView.tsx +4 -4
  558. package/src/FrappeTreeView.tsx +8 -4
  559. package/src/components/attachments.stories.tsx +79 -7
  560. package/src/components/tags.stories.tsx +131 -6
  561. package/src/components/timeline.stories.tsx +128 -7
  562. package/src/desk/Awesomebar.stories.tsx +3 -2
  563. package/src/desk/DeskFormPage.tsx +3 -2
  564. package/src/desk/DeskListPage.tsx +2 -1
  565. package/src/desk/DeskShell.stories.tsx +21 -2
  566. package/src/desk/DeskShell.tsx +56 -39
  567. package/src/desk/awesomebar.tsx +33 -22
  568. package/src/fieldRegistry.spec.tsx +17 -1
  569. package/src/fieldRegistry.ts +14 -4
  570. package/src/fields/Barcode/Barcode.stories.tsx +32 -0
  571. package/src/fields/Check/Check.spec.tsx +27 -0
  572. package/src/fields/Check/Check.stories.tsx +58 -0
  573. package/src/fields/Check/index.tsx +7 -1
  574. package/src/fields/CodeEditor/CodeEditor.stories.tsx +32 -0
  575. package/src/fields/Color/Color.spec.tsx +21 -0
  576. package/src/fields/Color/Color.stories.tsx +33 -0
  577. package/src/fields/Color/index.tsx +7 -1
  578. package/src/fields/Data/Data.spec.tsx +26 -0
  579. package/src/fields/Data/Data.stories.tsx +58 -0
  580. package/src/fields/Data/index.tsx +6 -0
  581. package/src/fields/Date/Date.stories.tsx +32 -0
  582. package/src/fields/Date/Datetime.stories.tsx +32 -0
  583. package/src/fields/Date/index.native.tsx +45 -33
  584. package/src/fields/Date/nativePresentation.spec.tsx +20 -0
  585. package/src/fields/Date/sheetKeyboard.spec.ts +51 -0
  586. package/src/fields/Date/sheetKeyboard.ts +37 -0
  587. package/src/fields/DateRange/DateRange.stories.tsx +41 -0
  588. package/src/fields/Duration/Duration.stories.tsx +32 -0
  589. package/src/fields/DynamicLink.stories.tsx +115 -14
  590. package/src/fields/DynamicLink.tsx +43 -125
  591. package/src/fields/FileUpload.tsx +273 -54
  592. package/src/fields/FileUploadField/FileUploadField.stories.tsx +87 -0
  593. package/src/fields/FileUploadField/index.tsx +73 -25
  594. package/src/fields/FrappeFileUpload.stories.tsx +32 -0
  595. package/src/fields/Geolocation/Geolocation.stories.tsx +33 -0
  596. package/src/fields/HTML/Html.stories.tsx +59 -0
  597. package/src/fields/HTML/index.tsx +25 -34
  598. package/src/fields/Heading/Heading.stories.tsx +63 -2
  599. package/src/fields/Icon/index.tsx +90 -0
  600. package/src/fields/Link.spec.tsx +10 -0
  601. package/src/fields/Link.stories.tsx +161 -2
  602. package/src/fields/Link.tree.spec.tsx +111 -0
  603. package/src/fields/Link.tsx +36 -19
  604. package/src/fields/LinkTree.tsx +102 -0
  605. package/src/fields/LongText/LongText.stories.tsx +66 -0
  606. package/src/fields/LongText/index.tsx +13 -5
  607. package/src/fields/MarkdownEditor/MarkdownEditor.stories.tsx +36 -0
  608. package/src/fields/MentionInput/MentionInput.stories.tsx +44 -0
  609. package/src/fields/Numeric/Numeric.spec.tsx +7 -0
  610. package/src/fields/Numeric/Numeric.stories.tsx +32 -0
  611. package/src/fields/Numeric/index.tsx +7 -0
  612. package/src/fields/OTPInput/OTPInput.stories.tsx +33 -0
  613. package/src/fields/Password/Password.spec.tsx +119 -0
  614. package/src/fields/Password/Password.stories.tsx +58 -0
  615. package/src/fields/Password/index.tsx +243 -23
  616. package/src/fields/Phone/Phone.stories.tsx +33 -0
  617. package/src/fields/Phone/index.tsx +4 -0
  618. package/src/fields/Progress/Progress.stories.tsx +32 -0
  619. package/src/fields/RadioGroup/RadioGroup.stories.tsx +37 -0
  620. package/src/fields/Rating/Rating.stories.tsx +33 -0
  621. package/src/fields/ReadOnly/ReadOnly.stories.tsx +54 -0
  622. package/src/fields/ReadOnly/index.tsx +41 -55
  623. package/src/fields/Select/Select.stories.tsx +43 -0
  624. package/src/fields/Select/index.tsx +5 -1
  625. package/src/fields/Signature/Signature.stories.tsx +32 -0
  626. package/src/fields/Slider/Slider.stories.tsx +32 -0
  627. package/src/fields/SmallText/SmallText.stories.tsx +58 -0
  628. package/src/fields/SmallText/index.tsx +9 -4
  629. package/src/fields/Switch/Switch.stories.tsx +33 -0
  630. package/src/fields/TableMultiSelect.spec.tsx +26 -5
  631. package/src/fields/TableMultiSelect.stories.tsx +90 -14
  632. package/src/fields/TableMultiSelect.tsx +55 -177
  633. package/src/fields/TextEditor/TextEditor.spec.tsx +5 -3
  634. package/src/fields/TextEditor/TextEditor.stories.tsx +66 -0
  635. package/src/fields/TextEditor/index.tsx +32 -299
  636. package/src/fields/TimePicker/TimePicker.stories.tsx +32 -0
  637. package/src/fields/ToggleGroup/ToggleGroup.stories.tsx +35 -0
  638. package/src/frappeRemainder.designLaw.spec.ts +176 -0
  639. package/src/frappeViews.designLaw.spec.ts +94 -0
  640. package/src/index.ts +18 -1
  641. package/src/schemaForm/SchemaForm.spec.tsx +154 -0
  642. package/src/schemaForm/SchemaForm.stories.tsx +27 -0
  643. package/src/schemaForm/SchemaWizard.spec.tsx +134 -0
  644. package/src/schemaForm/SchemaWizard.stories.tsx +94 -0
  645. package/src/schemaForm/SchemaWizard.tsx +192 -0
  646. package/src/schemaForm/index.tsx +3 -4
  647. package/src/shared/useKeyboardInset.ts +45 -0
  648. package/types/FileBrowser/AttachLibrary.d.ts +13 -0
  649. package/types/FileBrowser/AttachLibrary.d.ts.map +1 -0
  650. package/types/FileBrowser/folderTree.d.ts +15 -0
  651. package/types/FileBrowser/folderTree.d.ts.map +1 -0
  652. package/types/FileBrowser/index.d.ts +4 -0
  653. package/types/FileBrowser/index.d.ts.map +1 -0
  654. package/types/FileBrowser/types.d.ts +59 -0
  655. package/types/FileBrowser/types.d.ts.map +1 -0
  656. package/types/FileBrowser/viewPersistence.d.ts +4 -0
  657. package/types/FileBrowser/viewPersistence.d.ts.map +1 -0
  658. package/types/FormSidebar.d.ts.map +1 -1
  659. package/types/FrappeAssignment.d.ts.map +1 -1
  660. package/types/FrappeChartCard.d.ts.map +1 -1
  661. package/types/FrappeDashboard.d.ts.map +1 -1
  662. package/types/FrappeForm.d.ts.map +1 -1
  663. package/types/FrappeGantt.d.ts.map +1 -1
  664. package/types/FrappeImageView.d.ts.map +1 -1
  665. package/types/FrappeKPICard.d.ts.map +1 -1
  666. package/types/FrappeKanban.d.ts.map +1 -1
  667. package/types/FrappeListView.d.ts.map +1 -1
  668. package/types/FrappeReportBuilder.d.ts.map +1 -1
  669. package/types/FrappeReportView.d.ts.map +1 -1
  670. package/types/FrappeTreeView.d.ts.map +1 -1
  671. package/types/desk/DeskFormPage.d.ts.map +1 -1
  672. package/types/desk/DeskListPage.d.ts.map +1 -1
  673. package/types/desk/DeskShell.d.ts +4 -2
  674. package/types/desk/DeskShell.d.ts.map +1 -1
  675. package/types/desk/awesomebar.d.ts.map +1 -1
  676. package/types/fieldRegistry.d.ts.map +1 -1
  677. package/types/fields/Check/index.d.ts +6 -0
  678. package/types/fields/Check/index.d.ts.map +1 -1
  679. package/types/fields/Color/index.d.ts +6 -0
  680. package/types/fields/Color/index.d.ts.map +1 -1
  681. package/types/fields/Data/index.d.ts +6 -0
  682. package/types/fields/Data/index.d.ts.map +1 -1
  683. package/types/fields/Date/index.native.d.ts +5 -0
  684. package/types/fields/Date/index.native.d.ts.map +1 -1
  685. package/types/fields/Date/sheetKeyboard.d.ts +19 -0
  686. package/types/fields/Date/sheetKeyboard.d.ts.map +1 -0
  687. package/types/fields/DynamicLink.d.ts.map +1 -1
  688. package/types/fields/FileUpload.d.ts +11 -1
  689. package/types/fields/FileUpload.d.ts.map +1 -1
  690. package/types/fields/FileUploadField/index.d.ts +8 -1
  691. package/types/fields/FileUploadField/index.d.ts.map +1 -1
  692. package/types/fields/HTML/index.d.ts.map +1 -1
  693. package/types/fields/Icon/index.d.ts +15 -0
  694. package/types/fields/Icon/index.d.ts.map +1 -0
  695. package/types/fields/Link.d.ts +6 -1
  696. package/types/fields/Link.d.ts.map +1 -1
  697. package/types/fields/LinkTree.d.ts +3 -0
  698. package/types/fields/LinkTree.d.ts.map +1 -0
  699. package/types/fields/LongText/index.d.ts +4 -0
  700. package/types/fields/LongText/index.d.ts.map +1 -1
  701. package/types/fields/Numeric/index.d.ts +7 -0
  702. package/types/fields/Numeric/index.d.ts.map +1 -1
  703. package/types/fields/Password/index.d.ts +1 -0
  704. package/types/fields/Password/index.d.ts.map +1 -1
  705. package/types/fields/Phone/index.d.ts +4 -0
  706. package/types/fields/Phone/index.d.ts.map +1 -1
  707. package/types/fields/ReadOnly/index.d.ts.map +1 -1
  708. package/types/fields/Select/index.d.ts +4 -0
  709. package/types/fields/Select/index.d.ts.map +1 -1
  710. package/types/fields/SmallText/index.d.ts +4 -0
  711. package/types/fields/SmallText/index.d.ts.map +1 -1
  712. package/types/fields/TableMultiSelect.d.ts +2 -1
  713. package/types/fields/TableMultiSelect.d.ts.map +1 -1
  714. package/types/fields/TextEditor/index.d.ts +2 -3
  715. package/types/fields/TextEditor/index.d.ts.map +1 -1
  716. package/types/index.d.ts +7 -1
  717. package/types/index.d.ts.map +1 -1
  718. package/types/schemaForm/SchemaWizard.d.ts +20 -0
  719. package/types/schemaForm/SchemaWizard.d.ts.map +1 -0
  720. package/types/schemaForm/index.d.ts.map +1 -1
  721. package/types/shared/useKeyboardInset.d.ts +18 -0
  722. package/types/shared/useKeyboardInset.d.ts.map +1 -0
@@ -2,6 +2,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { XStack, YStack } from "tamagui";
3
3
  import { ChartCard } from "./FrappeDashboard";
4
4
  import { FrappeChartCard } from "./FrappeChartCard";
5
+ import { FrappeProvider } from "./FrappeProvider";
5
6
  import { FrappeStoryProvider } from "./frappeStoryTarget";
6
7
 
7
8
  export default {
@@ -13,12 +14,79 @@ export default {
13
14
  docs: {
14
15
  description: {
15
16
  component:
16
- "ChartCard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe ChartCard' bridge). Same component object as the components-package ChartCard; stories exercise chart modes and series edge cases.",
17
+ "ChartCard as re-exported by @multiplatform.one/frappe-ui (the 'Frappe ChartCard' bridge). Same component object as the components-package ChartCard; stories exercise chart modes and series edge cases. The dataSource story is network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm — it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise.",
17
18
  },
18
19
  },
19
20
  },
20
21
  };
21
22
 
23
+ // ---------------------------------------------------------------------------
24
+ // Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
25
+ //
26
+ // The FrappeChartCard dataSource path previously rode FrappeStoryProvider,
27
+ // whose offline fallback is https://demo.frappe.cloud. The fixture provider
28
+ // serves the *collection*, but DocType meta still resolves over HTTP — so
29
+ // native Storybook / Kitchen Sink fired a real cross-origin request the
30
+ // browser rejected with CORS. MOCK_HOST keeps the same code path (real
31
+ // fetch, real meta shape) without leaving the machine.
32
+ // ---------------------------------------------------------------------------
33
+
34
+ const MOCK_HOST = "https://frappechartcard.mock.test";
35
+
36
+ function todoMetaRaw(name: string) {
37
+ return {
38
+ name,
39
+ module: "Desk",
40
+ title_field: "description",
41
+ fields: [
42
+ { fieldname: "description", fieldtype: "Small Text", label: "Description", in_list_view: 1 },
43
+ {
44
+ fieldname: "status",
45
+ fieldtype: "Select",
46
+ label: "Status",
47
+ options: "Open\nClosed\nCancelled",
48
+ in_list_view: 1,
49
+ in_standard_filter: 1,
50
+ },
51
+ ],
52
+ permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
53
+ };
54
+ }
55
+
56
+ function jsonResponse(body: unknown, status = 200): Response {
57
+ return new Response(JSON.stringify(body), {
58
+ status,
59
+ headers: { "Content-Type": "application/json" },
60
+ });
61
+ }
62
+
63
+ (() => {
64
+ if (typeof window === "undefined") return;
65
+ const w = window as unknown as Record<string, unknown>;
66
+ if (w.__frappeChartCardMockFetch) return;
67
+ w.__frappeChartCardMockFetch = true;
68
+ const realFetch = window.fetch.bind(window);
69
+ window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
70
+ const urlStr =
71
+ typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
72
+ if (urlStr.startsWith(MOCK_HOST)) {
73
+ const url = new URL(urlStr);
74
+ if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
75
+ const doctype = url.searchParams.get("doctype") || "ToDo";
76
+ return jsonResponse({ docs: [todoMetaRaw(decodeURIComponent(doctype))] });
77
+ }
78
+ const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
79
+ if (metaMatch) return jsonResponse({ data: todoMetaRaw(decodeURIComponent(metaMatch[1])) });
80
+ if (url.pathname === "/api/resource/DocType") {
81
+ return jsonResponse({ data: [{ name: "ToDo", module: "Desk" }] });
82
+ }
83
+ // Everything else (guest field-peek, counts, group_by): empty, never the network.
84
+ return jsonResponse({ data: [] });
85
+ }
86
+ return realFetch(input as RequestInfo, init);
87
+ };
88
+ })();
89
+
22
90
  const monthly = [
23
91
  { label: "Jan", value: 12 },
24
92
  { label: "Feb", value: 19 },
@@ -97,10 +165,10 @@ export const CustomHeightAndColors = () => (
97
165
  );
98
166
 
99
167
  // ---------------------------------------------------------------------------
100
- // Live grouped aggregate (FrappeChartCard + dataSource): one data point per
101
- // group, computed server-side (get_list + group_by), refetched (debounced) on
102
- // realtime events. Bench when reachable, fixtures otherwise. Palette is left
103
- // to the canonical tokenized chart palette defaults (LC-27).
168
+ // Hermetic grouped aggregate (FrappeChartCard + dataSource): one data point
169
+ // per group, computed from fixtures. Native Storybook / Kitchen Sink show
170
+ // this path never demo.frappe.cloud. Palette is left to the canonical
171
+ // tokenized chart palette defaults (LC-27).
104
172
  // ---------------------------------------------------------------------------
105
173
 
106
174
  const liveTodoFixtures = [
@@ -109,21 +177,46 @@ const liveTodoFixtures = [
109
177
  { name: "TD-3", doctype: "ToDo", description: "Fixture todo C", status: "Closed" },
110
178
  ];
111
179
 
112
- export const LiveToDoByStatus = () => (
180
+ const todoByStatusChart = (
181
+ <YStack width={480} testID="live-todo-by-status">
182
+ <FrappeChartCard
183
+ config={{ id: "todo-by-status", title: "ToDos by Status", type: "bar", showLabels: true }}
184
+ dataSource={{ doctype: "ToDo", groupBy: "status" }}
185
+ />
186
+ </YStack>
187
+ );
188
+
189
+ export const ToDoByStatus = () => (
190
+ <FrappeProvider
191
+ baseURL={MOCK_HOST}
192
+ fixtures={new InMemoryFixtureProvider({ ToDo: liveTodoFixtures })}
193
+ >
194
+ {todoByStatusChart}
195
+ </FrappeProvider>
196
+ );
197
+ ToDoByStatus.parameters = {
198
+ docs: {
199
+ description: {
200
+ story:
201
+ "Hermetic bar chart: count of fixture ToDo documents grouped by status. MOCK_HOST plus the in-story fetch intercept serve DocType meta so native Storybook never hits demo.frappe.cloud.",
202
+ },
203
+ },
204
+ };
205
+
206
+ // ---------------------------------------------------------------------------
207
+ // Live grouped aggregate: bench when reachable, fixtures otherwise.
208
+ // ---------------------------------------------------------------------------
209
+
210
+ export const Live = () => (
113
211
  <FrappeStoryProvider fixtures={new InMemoryFixtureProvider({ ToDo: liveTodoFixtures })}>
114
- <YStack width={480} testID="live-todo-by-status">
115
- <FrappeChartCard
116
- config={{ id: "todo-by-status", title: "ToDos by Status", type: "bar", showLabels: true }}
117
- dataSource={{ doctype: "ToDo", groupBy: "status" }}
118
- />
119
- </YStack>
212
+ {todoByStatusChart}
120
213
  </FrappeStoryProvider>
121
214
  );
122
- LiveToDoByStatus.parameters = {
215
+ Live.parameters = {
123
216
  docs: {
124
217
  description: {
125
218
  story:
126
- "LIVE bar chart: count of ToDo documents grouped by status, aggregated server-side and refetched with a 300ms coalescing window on realtime list_update / doc_update / doc_deleted. Create/close/delete ToDos on the bench and the bars move in place — no reload.",
219
+ "LIVE bar chart: count of ToDo documents grouped by status, aggregated server-side and refetched with a 300ms coalescing window on realtime list_update / doc_update / doc_deleted. Create/close/delete ToDos on the bench and the bars move in place — no reload. Fixture fallback when the bench is unreachable.",
127
220
  },
128
221
  },
129
222
  };
@@ -18,13 +18,14 @@
18
18
  */
19
19
  import {
20
20
  AsyncBoundary,
21
+ Card,
21
22
  Skeleton,
22
23
  type ChartCardProps,
23
24
  type ChartConfig,
24
25
  } from "@multiplatform.one/components";
25
26
  import React, { useMemo } from "react";
26
27
  import { useTranslation } from "react-i18next";
27
- import { Card, YStack, type YStackProps } from "tamagui";
28
+ import { YStack, type YStackProps } from "tamagui";
28
29
  import { useResolvedKnobs } from "@multiplatform.one/theme";
29
30
  import { ChartCard } from "./FrappeDashboard";
30
31
  import { useFrappeConfig } from "./FrappeProvider";
@@ -73,17 +74,9 @@ function ChartCardSkeleton({
73
74
  const { t } = useTranslation();
74
75
  return (
75
76
  <YStack {...knobProps.gap} aria-busy aria-label={t("Loading")} {...stackProps}>
76
- <Skeleton width="40%" height={16} />
77
- <Card
78
- size={knobProps.sizeToken}
79
- borderRadius={knobProps.borderRadius.borderRadius}
80
- elevation={knobProps.elevation}
81
- borderWidth={1}
82
- borderColor="$borderColor"
83
- >
84
- <Card.Footer {...knobProps.panelPadding}>
85
- <Skeleton variant="rounded" width="100%" height={height} />
86
- </Card.Footer>
77
+ <Skeleton width="40%" />
78
+ <Card>
79
+ <Skeleton variant="rounded" width="100%" height={height} />
87
80
  </Card>
88
81
  </YStack>
89
82
  );
@@ -12,12 +12,85 @@ export default {
12
12
  status: { type: "stable" },
13
13
  docs: {
14
14
  description: {
15
- component: "A dashboard component with KPI cards and charts for visualizing Frappe data.",
15
+ component:
16
+ "A dashboard component with KPI cards and charts for visualizing Frappe data. Fixture stories are network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm — it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise.",
16
17
  },
17
18
  },
18
19
  },
19
20
  };
20
21
 
22
+ // ---------------------------------------------------------------------------
23
+ // Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
24
+ //
25
+ // Fixture-backed stories previously pointed at https://demo.frappe.cloud. The
26
+ // fixture provider serves the *collection*, but Frappe still resolves DocType
27
+ // meta over HTTP — so those stories fired a real cross-origin request that the
28
+ // browser rejected with a CORS error, poisoning the console for every
29
+ // automated probe. MOCK_HOST keeps the same code path (real fetch, real meta
30
+ // shape) without leaving the machine; ERR_HOST is the deliberate failure host
31
+ // for the error-state story.
32
+ // ---------------------------------------------------------------------------
33
+
34
+ const MOCK_HOST = "https://frappedashboard.mock.test";
35
+ const ERR_HOST = "https://forbidden.frappedashboard.mock.test";
36
+
37
+ function salesOrderMetaRaw(name: string) {
38
+ return {
39
+ name,
40
+ module: "Selling",
41
+ title_field: "name",
42
+ fields: [
43
+ { fieldname: "total", fieldtype: "Currency", label: "Total", in_list_view: 1 },
44
+ {
45
+ fieldname: "status",
46
+ fieldtype: "Select",
47
+ label: "Status",
48
+ options: "Completed\nPending",
49
+ in_list_view: 1,
50
+ in_standard_filter: 1,
51
+ },
52
+ { fieldname: "region", fieldtype: "Data", label: "Region", in_list_view: 1 },
53
+ ],
54
+ permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
55
+ };
56
+ }
57
+
58
+ function jsonResponse(body: unknown, status = 200): Response {
59
+ return new Response(JSON.stringify(body), {
60
+ status,
61
+ headers: { "Content-Type": "application/json" },
62
+ });
63
+ }
64
+
65
+ (() => {
66
+ if (typeof window === "undefined") return;
67
+ const w = window as unknown as Record<string, unknown>;
68
+ if (w.__frappeDashboardMockFetch) return;
69
+ w.__frappeDashboardMockFetch = true;
70
+ const realFetch = window.fetch.bind(window);
71
+ window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
72
+ const urlStr =
73
+ typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
74
+ if (urlStr.startsWith(ERR_HOST)) return jsonResponse({ message: "Not permitted" }, 403);
75
+ if (urlStr.startsWith(MOCK_HOST)) {
76
+ const url = new URL(urlStr);
77
+ if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
78
+ const doctype = url.searchParams.get("doctype") || "SalesOrder";
79
+ return jsonResponse({ docs: [salesOrderMetaRaw(doctype)] });
80
+ }
81
+ const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
82
+ if (metaMatch)
83
+ return jsonResponse({ data: salesOrderMetaRaw(decodeURIComponent(metaMatch[1])) });
84
+ if (url.pathname === "/api/resource/DocType") {
85
+ return jsonResponse({ data: [{ name: "SalesOrder", module: "Selling" }] });
86
+ }
87
+ // Everything else (guest field-peek, counts): empty, never the network.
88
+ return jsonResponse({ data: [] });
89
+ }
90
+ return realFetch(input as RequestInfo, init);
91
+ };
92
+ })();
93
+
21
94
  // KPI Card Stories
22
95
  export const KPICardDefault = () => (
23
96
  <KPICard
@@ -189,7 +262,7 @@ const widgets: DashboardWidget[] = [
189
262
 
190
263
  /** Static widgets only — does not exercise the live dataSource path. */
191
264
  export const StaticWidgets = () => (
192
- <FrappeProvider baseURL="https://demo.frappe.cloud">
265
+ <FrappeProvider baseURL={MOCK_HOST}>
193
266
  <FrappeDashboard title="Sales (static)" widgets={widgets} columns={4} />
194
267
  </FrappeProvider>
195
268
  );
@@ -209,7 +282,7 @@ StaticWidgets.parameters = {
209
282
  */
210
283
  export const SalesDashboard = () => (
211
284
  <FrappeProvider
212
- baseURL="https://demo.frappe.cloud"
285
+ baseURL={MOCK_HOST}
213
286
  fixtures={new InMemoryFixtureProvider({ SalesOrder: salesFixtures })}
214
287
  >
215
288
  <FrappeDashboard<SalesOrder>
@@ -336,7 +409,7 @@ class PendingFixtureProvider extends InMemoryFixtureProvider {
336
409
  * p-results/state-triplet-coverage.md.
337
410
  */
338
411
  export const Loading = () => (
339
- <FrappeProvider baseURL="https://demo.frappe.cloud" fixtures={new PendingFixtureProvider()}>
412
+ <FrappeProvider baseURL={MOCK_HOST} fixtures={new PendingFixtureProvider()}>
340
413
  <FrappeDashboard<SalesOrder>
341
414
  title="Sales"
342
415
  columns={4}
@@ -348,10 +421,7 @@ export const Loading = () => (
348
421
 
349
422
  /** Zero documents and no static widgets — the Dashboard's neutral empty state (empty ≠ error). */
350
423
  export const Empty = () => (
351
- <FrappeProvider
352
- baseURL="https://demo.frappe.cloud"
353
- fixtures={new InMemoryFixtureProvider({ SalesOrder: [] })}
354
- >
424
+ <FrappeProvider baseURL={MOCK_HOST} fixtures={new InMemoryFixtureProvider({ SalesOrder: [] })}>
355
425
  <FrappeDashboard<SalesOrder>
356
426
  title="Sales"
357
427
  columns={4}
@@ -363,7 +433,7 @@ export const Empty = () => (
363
433
 
364
434
  /** Live path with a broken host — exercises the error render prop (SB-M-806). */
365
435
  export const LoadError = () => (
366
- <FrappeProvider baseURL="https://frappe-dashboard-error.mock.test">
436
+ <FrappeProvider baseURL={ERR_HOST}>
367
437
  <FrappeDashboard<SalesOrder>
368
438
  title="Sales"
369
439
  columns={4}
@@ -10,10 +10,10 @@ import {
10
10
  type ChartDataPoint,
11
11
  type DashboardWidget,
12
12
  } from "@multiplatform.one/components";
13
+ import { Button, Spinner, formCommonColors } from "@multiplatform.one/forms";
13
14
  import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
14
15
  import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
15
16
  import { useTranslation } from "react-i18next";
16
- import { Button, Spinner } from "@multiplatform.one/forms";
17
17
  import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
18
18
  import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
19
19
  import { useFrappeConfig } from "./FrappeProvider";
@@ -168,7 +168,7 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
168
168
  return (
169
169
  <YStack {...knobProps.panelPadding} alignItems="center" {...stackProps}>
170
170
  <Spinner size="large" />
171
- <Text color="$color10" marginTop="$2">
171
+ <Text color={formCommonColors.muted} marginTop="$2" {...knobProps.body}>
172
172
  {t("Loading dashboard...")}
173
173
  </Text>
174
174
  </YStack>
@@ -180,8 +180,8 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
180
180
  if (error) return <>{error(err)}</>;
181
181
  return (
182
182
  <YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
183
- <Text color="$red11">{t("Failed to load dashboard")}</Text>
184
- <Text color="$color10" fontSize="$2">
183
+ <Text color={formCommonColors.error}>{t("Failed to load dashboard")}</Text>
184
+ <Text color={formCommonColors.muted} {...knobProps.body}>
185
185
  {err.message}
186
186
  </Text>
187
187
  </YStack>
@@ -197,11 +197,11 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
197
197
  alignItems="center"
198
198
  paddingBottom={0}
199
199
  >
200
- {title ? <H3>{title}</H3> : <YStack flex={1} />}
200
+ {title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
201
201
  {showRefresh && (
202
202
  <XStack {...knobProps.gap} alignItems="center">
203
203
  {isLiveStale && <Spinner size="small" aria-label={t("Updating")} />}
204
- <Text fontSize="$1" color="$color10">
204
+ <Text color={formCommonColors.muted} {...knobProps.label}>
205
205
  {t("Last updated: {{time}}", {
206
206
  time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
207
207
  })}
@@ -318,10 +318,10 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
318
318
  alignItems="center"
319
319
  paddingBottom={0}
320
320
  >
321
- {title ? <H3>{title}</H3> : <YStack flex={1} />}
321
+ {title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
322
322
  <XStack {...knobProps.gap} alignItems="center">
323
323
  {autoRefresh && (
324
- <Text fontSize="$1" color="$color10">
324
+ <Text color={formCommonColors.muted} {...knobProps.label}>
325
325
  {t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
326
326
  </Text>
327
327
  )}
@@ -24,8 +24,8 @@ import type React from "react";
24
24
  import { useEffect, useMemo, useRef, useState } from "react";
25
25
  import type { TFunction } from "i18next";
26
26
  import { useTranslation } from "react-i18next";
27
- import { Spinner } from "@multiplatform.one/forms";
28
- import { Button, Text, XStack, YStack } from "tamagui";
27
+ import { Button, formCommonColors } from "@multiplatform.one/forms";
28
+ import { Text, XStack, YStack } from "tamagui";
29
29
  import { useResolvedKnobs } from "@multiplatform.one/theme";
30
30
  import { useFrappeConfig } from "./FrappeProvider";
31
31
  import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator";
@@ -117,11 +117,9 @@ function mapMetaToFormSchema(meta: DocTypeMeta, sectionOverrides?: FormSection[]
117
117
  const genericSections: GenericFormSection[] = sections.map((section) => ({
118
118
  label: section.label,
119
119
  collapsible: section.collapsible,
120
- columns: section.columns.map(
121
- (col): GenericFormColumn => ({
122
- fields: col.fields.map(mapFieldToGenericSchema),
123
- }),
124
- ),
120
+ columns: section.columns.map((col): GenericFormColumn => ({
121
+ fields: col.fields.map(mapFieldToGenericSchema),
122
+ })),
125
123
  }));
126
124
 
127
125
  // Flat list of all fields for depends_on pre-compilation
@@ -633,8 +631,10 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
633
631
  if (!children && metaError && !meta) {
634
632
  return (
635
633
  <YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
636
- <Text color="$red11">{t("Failed to load {{doctype}} form", { doctype })}</Text>
637
- <Text color="$color10" fontSize="$2">
634
+ <Text color={formCommonColors.error} {...knobProps.body}>
635
+ {t("Failed to load {{doctype}} form", { doctype })}
636
+ </Text>
637
+ <Text color={formCommonColors.muted} {...knobProps.body}>
638
638
  {metaError.message}
639
639
  </Text>
640
640
  </YStack>
@@ -654,8 +654,10 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
654
654
  if (name && !liveDoc?.isLoading && !liveDoc?.data && !wasDeleted) {
655
655
  return (
656
656
  <YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
657
- <Text color="$red11">{t("{{doctype}} not found", { doctype })}</Text>
658
- <Text color="$color10" fontSize="$2">
657
+ <Text color={formCommonColors.error} {...knobProps.body}>
658
+ {t("{{doctype}} not found", { doctype })}
659
+ </Text>
660
+ <Text color={formCommonColors.muted} {...knobProps.body}>
659
661
  {t("Document {{name}} does not exist or could not be loaded.", { name })}
660
662
  </Text>
661
663
  </YStack>
@@ -691,7 +693,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
691
693
  backgroundColor="$red3"
692
694
  testID="frappe-form-deleted-banner"
693
695
  >
694
- <Text color="$red11" fontSize="$3">
696
+ <Text color={formCommonColors.error} {...knobProps.body}>
695
697
  {hasUnsavedChanges
696
698
  ? t(
697
699
  "This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.",
@@ -713,7 +715,7 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
713
715
  backgroundColor="$orange3"
714
716
  testID="frappe-form-conflict-banner"
715
717
  >
716
- <Text color="$orange11" fontSize="$3">
718
+ <Text color="$orange11" {...knobProps.body}>
717
719
  {t(
718
720
  "Changed elsewhere while you were editing: {{fields}}. Your edits are kept — saving will overwrite the newer server values.",
719
721
  { fields: conflictLabels },
@@ -767,12 +769,14 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
767
769
  ) : (
768
770
  // Metadata unavailable (should be covered by metaError branch above)
769
771
  <YStack {...knobProps.panelPadding} alignItems="center">
770
- <Text color="$color10">{t("Form schema unavailable")}</Text>
772
+ <Text color={formCommonColors.muted} {...knobProps.body}>
773
+ {t("Form schema unavailable")}
774
+ </Text>
771
775
  </YStack>
772
776
  )}
773
777
 
774
778
  {errors.general && (
775
- <Text color="$red11" fontSize="$2">
779
+ <Text color={formCommonColors.error} {...knobProps.body}>
776
780
  {errors.general}
777
781
  </Text>
778
782
  )}
@@ -785,17 +789,20 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
785
789
  paddingTop="$3"
786
790
  >
787
791
  {hasUnsavedChanges && (
788
- <Text color="$orange10" fontSize="$2" marginInlineEnd="auto">
792
+ <Text color="$orange11" marginInlineEnd="auto" {...knobProps.body}>
789
793
  {t("Not Saved")}
790
794
  </Text>
791
795
  )}
792
796
 
793
797
  {name && onDelete && !wasDeleted && (
794
798
  <Button
795
- theme="red"
796
- variant="outlined"
797
- icon={isSubmitting ? Spinner : TrashIcon}
798
- disabled={isSubmitting || effectiveDisabled}
799
+ outlined
800
+ error
801
+ icon={TrashIcon}
802
+ loading={isSubmitting}
803
+ disabled={effectiveDisabled}
804
+ disabledReason={t("Form is read-only")}
805
+ disabledReasonPlacement="inline"
799
806
  onPress={handleDelete}
800
807
  >
801
808
  {t("Delete")}
@@ -804,9 +811,11 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
804
811
 
805
812
  {onCancel && (
806
813
  <Button
807
- variant="outlined"
814
+ outlined
808
815
  icon={XIcon}
809
816
  disabled={isSubmitting || disabled}
817
+ disabledReason={t("Form is read-only")}
818
+ disabledReasonPlacement="inline"
810
819
  onPress={handleCancel}
811
820
  >
812
821
  {t("Cancel")}
@@ -814,9 +823,12 @@ export function FrappeForm<TDoc extends { name: string; doctype: string }>({
814
823
  )}
815
824
 
816
825
  <Button
817
- theme="active"
818
- icon={isSubmitting ? Spinner : FloppyDiskIcon}
819
- disabled={isSubmitting || effectiveDisabled}
826
+ accent
827
+ icon={FloppyDiskIcon}
828
+ loading={isSubmitting}
829
+ disabled={effectiveDisabled}
830
+ disabledReason={t("Form is read-only")}
831
+ disabledReasonPlacement="inline"
820
832
  onPress={handleSave}
821
833
  >
822
834
  {isSubmitting ? t("Saving...") : t("Save")}
@@ -14,12 +14,81 @@ export default {
14
14
  docs: {
15
15
  description: {
16
16
  component:
17
- "Gantt view over useFrappeCollection / useLiveQuery. Stories use InMemoryFixtureProvider so the live path runs against fixtures. Field mapping defaults to Frappe's Gantt settings (exp_start_date / exp_end_date / subject). Bars drag horizontally to reschedule (snapping to whole days): moves persist via collection.update on the date fields and then fire onItemMove(name, start, end). Set enableItemDrag={false} to opt out.",
17
+ "Gantt view over useFrappeCollection / useLiveQuery. Fixture stories are network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and DocType meta from an in-story fetch mock, so nothing leaves the machine. The separately-named Live story is the live-bench arm it targets STORYBOOK_FRAPPE_URL when reachable and falls back to fixtures otherwise. Field mapping defaults to Frappe's Gantt settings (exp_start_date / exp_end_date / subject). Bars drag horizontally to reschedule (snapping to whole days): moves persist via collection.update on the date fields and then fire onItemMove(name, start, end). Set enableItemDrag={false} to opt out.",
18
18
  },
19
19
  },
20
20
  },
21
21
  };
22
22
 
23
+ // ---------------------------------------------------------------------------
24
+ // Hermetic story host (G-15 story honesty / D-05, closes UX-P18).
25
+ //
26
+ // Fixture-backed stories previously pointed at https://demo.frappe.cloud. The
27
+ // fixture provider serves the *collection*, but DocType meta still resolves
28
+ // over HTTP — so those stories fired a real cross-origin request the browser
29
+ // rejected with CORS. MOCK_HOST keeps the same code path (real fetch, real
30
+ // meta shape) without leaving the machine.
31
+ // ---------------------------------------------------------------------------
32
+
33
+ const MOCK_HOST = "https://frappegantt.mock.test";
34
+
35
+ function taskMetaRaw(name: string) {
36
+ return {
37
+ name,
38
+ module: "Projects",
39
+ title_field: "subject",
40
+ fields: [
41
+ { fieldname: "subject", fieldtype: "Data", label: "Subject", in_list_view: 1 },
42
+ { fieldname: "exp_start_date", fieldtype: "Date", label: "Expected Start Date" },
43
+ { fieldname: "exp_end_date", fieldtype: "Date", label: "Expected End Date" },
44
+ {
45
+ fieldname: "status",
46
+ fieldtype: "Select",
47
+ label: "Status",
48
+ options: "Open\nWorking\nCompleted",
49
+ in_list_view: 1,
50
+ },
51
+ { fieldname: "color", fieldtype: "Color", label: "Color" },
52
+ ],
53
+ permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
54
+ };
55
+ }
56
+
57
+ function jsonResponse(body: unknown, status = 200): Response {
58
+ return new Response(JSON.stringify(body), {
59
+ status,
60
+ headers: { "Content-Type": "application/json" },
61
+ });
62
+ }
63
+
64
+ (() => {
65
+ if (typeof window === "undefined") return;
66
+ const w = window as unknown as Record<string, unknown>;
67
+ if (w.__frappeGanttMockFetch) return;
68
+ w.__frappeGanttMockFetch = true;
69
+ const realFetch = window.fetch.bind(window);
70
+ window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
71
+ const urlStr =
72
+ typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
73
+ if (urlStr.startsWith(MOCK_HOST)) {
74
+ const url = new URL(urlStr);
75
+ if (url.pathname === "/api/method/frappe.desk.form.load.getdoctype") {
76
+ const doctype = url.searchParams.get("doctype") || "Task";
77
+ return jsonResponse({ docs: [taskMetaRaw(doctype)] });
78
+ }
79
+ const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
80
+ if (metaMatch)
81
+ return jsonResponse({ data: taskMetaRaw(decodeURIComponent(metaMatch[1])) });
82
+ if (url.pathname === "/api/resource/DocType") {
83
+ return jsonResponse({ data: [{ name: "Task", module: "Projects" }] });
84
+ }
85
+ // Everything else (guest field-peek, counts): empty, never the network.
86
+ return jsonResponse({ data: [] });
87
+ }
88
+ return realFetch(input as RequestInfo, init);
89
+ };
90
+ })();
91
+
23
92
  interface ProjectTask {
24
93
  name: string;
25
94
  doctype: string;
@@ -94,7 +163,7 @@ const taskFixtures: ProjectTask[] = [
94
163
 
95
164
  export const Main = () => (
96
165
  <FrappeProvider
97
- baseURL="https://demo.frappe.cloud"
166
+ baseURL={MOCK_HOST}
98
167
  fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
99
168
  >
100
169
  <FrappeGantt<ProjectTask>
@@ -116,7 +185,7 @@ Main.parameters = {
116
185
 
117
186
  export const MonthZoom = () => (
118
187
  <FrappeProvider
119
- baseURL="https://demo.frappe.cloud"
188
+ baseURL={MOCK_HOST}
120
189
  fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
121
190
  >
122
191
  <FrappeGantt<ProjectTask>
@@ -138,7 +207,7 @@ MonthZoom.parameters = {
138
207
 
139
208
  export const WithItemMove = () => (
140
209
  <FrappeProvider
141
- baseURL="https://demo.frappe.cloud"
210
+ baseURL={MOCK_HOST}
142
211
  fixtures={new InMemoryFixtureProvider({ Task: taskFixtures })}
143
212
  >
144
213
  <FrappeGantt<ProjectTask>