@multiplatform.one/frappe-ui 7.4.1 → 7.6.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 +690 -0
  8. package/dist/cjs/FileBrowser/index.native.js +781 -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 +64 -3
  74. package/dist/cjs/fieldRegistry.native.js +69 -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 +186 -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 +665 -0
  151. package/dist/esm/FileBrowser/index.mjs.map +1 -0
  152. package/dist/esm/FileBrowser/index.native.js +753 -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 +65 -4
  239. package/dist/esm/fieldRegistry.mjs.map +1 -1
  240. package/dist/esm/fieldRegistry.native.js +70 -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 +188 -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 +665 -0
  341. package/dist/jsx/FileBrowser/index.mjs.map +1 -0
  342. package/dist/jsx/FileBrowser/index.native.js +781 -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 +65 -4
  429. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  430. package/dist/jsx/fieldRegistry.native.js +69 -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 +186 -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 +273 -0
  527. package/src/FileBrowser/FileBrowser.stories.tsx +97 -0
  528. package/src/FileBrowser/folderTree.ts +62 -0
  529. package/src/FileBrowser/index.tsx +765 -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 +131 -1
  569. package/src/fieldRegistry.ts +100 -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 +234 -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
@@ -1,9 +1,12 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { action } from "@multiplatform.one/storybook";
3
+ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
4
  import type { ReactNode } from "react";
4
5
  import { useState } from "react";
5
6
  import { YStack } from "tamagui";
7
+ import { fieldtypeToTableField } from "../fieldRegistry";
6
8
  import { FrappeProvider } from "../FrappeProvider";
9
+ import { FrappeStoryProvider } from "../frappeStoryTarget";
7
10
  import { FileUpload, type FileUploadProps } from "./FileUpload";
8
11
 
9
12
  // 1x1 transparent PNG
@@ -105,3 +108,32 @@ export const States = (args: StoryProps) =>
105
108
  </YStack>,
106
109
  );
107
110
  States.args = {} as Partial<StoryProps>;
111
+
112
+ type FileUploadRow = { id: string; label: string; value: string };
113
+
114
+ export const InTable = {
115
+ name: "In table",
116
+ render: function InTableRender() {
117
+ const [data, setData] = useState<FileUploadRow[]>([
118
+ { id: "1", label: "Alpha", value: tinyPng },
119
+ { id: "2", label: "Beta", value: "report.pdf" },
120
+ { id: "3", label: "Gamma", value: "" },
121
+ ]);
122
+ const columns: DataTableColumn<FileUploadRow>[] = [
123
+ { accessorKey: "label", header: "Row" },
124
+ { accessorKey: "value", header: "File", ...fieldtypeToTableField("Attach") },
125
+ ];
126
+ return (
127
+ <FrappeStoryProvider fixtures={fixtures}>
128
+ <YStack width="100%" height={320}>
129
+ <DataTable
130
+ data={data}
131
+ columns={columns}
132
+ enablePagination={false}
133
+ onDataChange={setData}
134
+ />
135
+ </YStack>
136
+ </FrappeStoryProvider>
137
+ );
138
+ },
139
+ };
@@ -1,6 +1,9 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
+ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
2
3
  import { useState } from "react";
3
4
  import { YStack } from "tamagui";
5
+ import { fieldtypeToTableField } from "../../fieldRegistry";
6
+ import { FrappeStoryProvider } from "../../frappeStoryTarget";
4
7
  import { Geolocation, type GeolocationProps } from ".";
5
8
 
6
9
  export default {
@@ -88,3 +91,33 @@ ContractProbe.args = {
88
91
  label: "Location",
89
92
  value: '{"lat": 30.2672, "lng": -97.7431}',
90
93
  } as Partial<StoryProps>;
94
+
95
+ type GeoValue = { lat: number; lng: number } | null;
96
+ type GeoRow = { id: string; label: string; value: GeoValue };
97
+
98
+ export const InTable = {
99
+ name: "In table",
100
+ render: function InTableRender() {
101
+ const [data, setData] = useState<GeoRow[]>([
102
+ { id: "1", label: "Alpha", value: { lat: 30.2672, lng: -97.7431 } },
103
+ { id: "2", label: "Beta", value: { lat: 12.9716, lng: 77.5946 } },
104
+ { id: "3", label: "Gamma", value: null },
105
+ ]);
106
+ const columns: DataTableColumn<GeoRow>[] = [
107
+ { accessorKey: "label", header: "Row" },
108
+ { accessorKey: "value", header: "Site", ...fieldtypeToTableField("Geolocation") },
109
+ ];
110
+ return (
111
+ <FrappeStoryProvider>
112
+ <YStack width="100%" height={320}>
113
+ <DataTable
114
+ data={data}
115
+ columns={columns}
116
+ enablePagination={false}
117
+ onDataChange={setData}
118
+ />
119
+ </YStack>
120
+ </FrappeStoryProvider>
121
+ );
122
+ },
123
+ };
@@ -1,4 +1,7 @@
1
+ import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
1
2
  import { YStack } from "tamagui";
3
+ import { fieldtypeToTableField } from "../../fieldRegistry";
4
+ import { FrappeStoryProvider } from "../../frappeStoryTarget";
2
5
  import { Html, type HtmlProps } from ".";
3
6
 
4
7
  export default {
@@ -69,3 +72,59 @@ export const ContractProbe = (args: StoryProps) => (
69
72
  </YStack>
70
73
  );
71
74
  ContractProbe.args = { value: "<p>Probe content</p>" } as Partial<StoryProps>;
75
+
76
+ interface HtmlCellRow {
77
+ id: string;
78
+ label: string;
79
+ value: string;
80
+ }
81
+
82
+ const htmlCellRows: HtmlCellRow[] = [
83
+ { id: "1", label: "Alpha", value: "<p><strong>In stock</strong></p>" },
84
+ { id: "2", label: "Beta", value: "<p>Backorder — <em>ETA Friday</em></p>" },
85
+ { id: "3", label: "Gamma", value: "" },
86
+ ];
87
+
88
+ const htmlMapped = fieldtypeToTableField("HTML");
89
+
90
+ const htmlCellColumns: DataTableColumn<HtmlCellRow>[] = [
91
+ { accessorKey: "label", header: "Row" },
92
+ {
93
+ accessorKey: "value",
94
+ header: "HTML",
95
+ ...htmlMapped,
96
+ } as DataTableColumn<HtmlCellRow>,
97
+ ];
98
+
99
+ function InTableStory() {
100
+ return (
101
+ <YStack width="100%" height={280}>
102
+ <DataTable
103
+ data={htmlCellRows}
104
+ columns={htmlCellColumns as DataTableColumn<Record<string, any>>[]}
105
+ enablePagination={false}
106
+ readOnly
107
+ aria-label="HTML read-only cell table"
108
+ />
109
+ </YStack>
110
+ );
111
+ }
112
+
113
+ /**
114
+ * HTML is TABLE_LAYOUT — never an editable child-table column. fieldtypeToTableField
115
+ * falls through to a read-only input; the table is mounted readOnly.
116
+ */
117
+ export const InTable = () => (
118
+ <FrappeStoryProvider>
119
+ <InTableStory />
120
+ </FrappeStoryProvider>
121
+ );
122
+ InTable.storyName = "In table";
123
+ InTable.parameters = {
124
+ docs: {
125
+ description: {
126
+ story:
127
+ 'HTML is a layout-only fieldtype (TABLE_LAYOUT_TYPES). This story shows a 3-row read-only column from fieldtypeToTableField("HTML") — not an editable cell.',
128
+ },
129
+ },
130
+ };
@@ -1,7 +1,11 @@
1
- import { Skeleton } from "@multiplatform.one/forms";
1
+ /**
2
+ * Frappe HTML field — sanitised read-only HTML in FieldLayout + cardSurface.
3
+ * Design-law: compose FieldLayout; inherit body metrics (no 14px / 1px fork).
4
+ */
5
+ import { FieldLayout, Skeleton, formCommonColors } from "@multiplatform.one/forms";
2
6
  import { useResolvedKnobs } from "@multiplatform.one/theme";
3
7
  import { useMemo } from "react";
4
- import { Label, Text, View, YStack, type YStackProps } from "tamagui";
8
+ import { Text, View, YStack, type YStackProps } from "tamagui";
5
9
 
6
10
  export interface HtmlProps extends Omit<YStackProps, "children"> {
7
11
  label?: string;
@@ -106,10 +110,9 @@ export function sanitizeHtml(html: string): string {
106
110
  }
107
111
 
108
112
  function HtmlContent({ html }: { html: string }) {
109
- // Sanitized HTML only — see sanitizeHtml(). View renders as div on web.
113
+ // Sanitized HTML only — inherit body metrics/color from the card (no 14px).
110
114
  const webProps = {
111
115
  dangerouslySetInnerHTML: { __html: html },
112
- style: { lineHeight: 1.5, fontSize: 14, color: "var(--color)" },
113
116
  };
114
117
  return <View {...(webProps as Record<string, unknown>)} />;
115
118
  }
@@ -128,53 +131,41 @@ export function Html({
128
131
  }: HtmlProps) {
129
132
  const { knobProps } = useResolvedKnobs();
130
133
  const sanitizedHtml = useMemo(() => sanitizeHtml(value), [value]);
131
- const minHeight = compact ? 40 : 60;
132
134
 
133
135
  if (skeleton) {
134
136
  return (
135
- <YStack {...knobProps.gap} {...stackProps}>
136
- {label && <Skeleton variant="text" width="30%" height={14} />}
137
- <Skeleton variant="rounded" width="100%" height={minHeight} />
137
+ <YStack {...stackProps}>
138
+ <FieldLayout label={label} required={required}>
139
+ <Skeleton variant="rounded" width="100%" height={compact ? 40 : 60} />
140
+ </FieldLayout>
138
141
  </YStack>
139
142
  );
140
143
  }
141
144
 
142
145
  return (
143
- <YStack {...knobProps.gap} {...stackProps} opacity={disabled ? 0.6 : 1}>
144
- {label && (
145
- <Label>
146
- {label}
147
- {required && <Text color="$red10"> *</Text>}
148
- </Label>
149
- )}
146
+ <YStack {...stackProps}>
147
+ <FieldLayout
148
+ label={label}
149
+ error={error}
150
+ helperText={helperText}
151
+ required={required}
152
+ disabled={disabled}
153
+ >
150
154
  <YStack
151
- {...knobProps.borderRadius}
152
- borderWidth={1}
153
- borderColor={error ? "$red8" : "$borderColor"}
154
- backgroundColor="$backgroundHover"
155
- {...knobProps.panelPadding}
156
- minHeight={minHeight}
155
+ {...knobProps.cardSurface}
156
+ {...knobProps.body}
157
+ opacity={disabled ? 0.6 : 1}
158
+ minHeight={compact ? 40 : 60}
157
159
  >
158
160
  {sanitizedHtml ? (
159
161
  <HtmlContent html={sanitizedHtml} />
160
162
  ) : (
161
- <Text color="$color10" fontSize="$2">
163
+ <Text color={formCommonColors.muted} {...knobProps.body}>
162
164
  No content
163
165
  </Text>
164
166
  )}
165
167
  </YStack>
166
- {helperText && !error && (
167
- <Text color="$color11" fontSize="$2">
168
- {helperText}
169
- </Text>
170
- )}
171
- {error && (
172
- // $red11 is the house error-text role — $red10 measured 4.37:1 on
173
- // light color1, under the AA floor (fix-contrast-aa-floors §4.3).
174
- <Text color="$red11" fontSize="$2">
175
- {error}
176
- </Text>
177
- )}
168
+ </FieldLayout>
178
169
  </YStack>
179
170
  );
180
171
  }
@@ -1,9 +1,12 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
+ import { useState } from "react";
2
3
  import { Text, YStack } from "tamagui";
4
+ import type { FieldSchema } from "../../fieldRegistry";
5
+ import { FrappeStoryProvider } from "../../frappeStoryTarget";
6
+ import { SchemaForm, type FormSchema } from "../../schemaForm";
3
7
  import { Heading, type HeadingProps } from ".";
4
- import { Data } from "../Data";
5
8
  import { Check } from "../Check";
6
- import { useState } from "react";
9
+ import { Data } from "../Data";
7
10
 
8
11
  export default {
9
12
  title: "FrappeUI/Heading",
@@ -110,3 +113,61 @@ FormWithSections.parameters = {
110
113
  },
111
114
  },
112
115
  };
116
+
117
+ const headingInTableFields: FieldSchema[] = [
118
+ { type: "Heading", name: "identity_break", label: "Identity" },
119
+ { type: "Data", name: "title", label: "Title" },
120
+ { type: "Heading", name: "notes_break", label: "Notes" },
121
+ { type: "Data", name: "notes", label: "Notes" },
122
+ ];
123
+
124
+ const headingInTableSchema: FormSchema = {
125
+ fields: headingInTableFields,
126
+ sections: [
127
+ {
128
+ label: "General Information",
129
+ description:
130
+ "Heading is TABLE_LAYOUT — it is never a child-table column. Shown here as SchemaForm section chrome plus Heading fieldtypes.",
131
+ columns: [{ fields: headingInTableFields }],
132
+ },
133
+ ],
134
+ };
135
+
136
+ function InTableStory() {
137
+ const [doc, setDoc] = useState<Record<string, unknown>>({
138
+ title: "Alpha widget",
139
+ notes: "Follow up after the site visit.",
140
+ });
141
+ return (
142
+ <YStack width="100%" maxWidth={520}>
143
+ <SchemaForm
144
+ schema={headingInTableSchema}
145
+ doc={doc}
146
+ setValue={(field, value) => {
147
+ action("setValue")(field, value);
148
+ setDoc((prev) => ({ ...prev, [field]: value }));
149
+ }}
150
+ />
151
+ </YStack>
152
+ );
153
+ }
154
+
155
+ /**
156
+ * Heading is TABLE_LAYOUT — skip the editable DataTable cell. SchemaForm mock
157
+ * with Heading fieldtypes + section chrome (fieldtypeToTableField falls through
158
+ * to a read-only input and is not used as a column).
159
+ */
160
+ export const InTable = () => (
161
+ <FrappeStoryProvider>
162
+ <InTableStory />
163
+ </FrappeStoryProvider>
164
+ );
165
+ InTable.storyName = "In table";
166
+ InTable.parameters = {
167
+ docs: {
168
+ description: {
169
+ story:
170
+ 'Heading is TABLE_LAYOUT_TYPES, so there is no editable LiveCell. This story mounts a SchemaForm mock section with Heading fieldtypes instead. fieldtypeToTableField("Heading") is the unmapped read-only fallback and is not used as a column.',
171
+ },
172
+ },
173
+ };
@@ -0,0 +1,90 @@
1
+ import type { FormFieldProps, FieldComponentProps } from "@multiplatform.one/forms";
2
+ import { Icon as FormsIcon } from "@multiplatform.one/forms";
3
+ import type { DeepKeys } from "@tanstack/form-core";
4
+ import { useProps } from "tamagui";
5
+
6
+ export type IconProps<
7
+ TData extends Record<string, unknown> = Record<string, unknown>,
8
+ TName extends string = string,
9
+ > = Omit<
10
+ FormFieldProps<
11
+ TData,
12
+ TName extends DeepKeys<TData> ? TName : DeepKeys<TData>,
13
+ unknown,
14
+ unknown,
15
+ string
16
+ >,
17
+ "children" | "field" | "onChange"
18
+ > &
19
+ Partial<
20
+ Omit<
21
+ FieldComponentProps<
22
+ TData,
23
+ TName extends DeepKeys<TData> ? TName : DeepKeys<TData>,
24
+ unknown,
25
+ unknown,
26
+ string
27
+ >,
28
+ "children"
29
+ >
30
+ > & {
31
+ value?: string;
32
+ onChange?: (value: string) => void;
33
+ placeholder?: string;
34
+ disabled?: boolean;
35
+ readOnly?: boolean;
36
+ skeleton?: boolean;
37
+ compact?: boolean;
38
+ icons?: readonly string[];
39
+ options?: string;
40
+ };
41
+
42
+ export function Icon<
43
+ TData extends Record<string, unknown> = Record<string, unknown>,
44
+ TName extends string = string,
45
+ >(props: IconProps<TData, TName>) {
46
+ const {
47
+ defaultValue,
48
+ form,
49
+ mode,
50
+ name,
51
+ onBlur,
52
+ onChange,
53
+ preserveValue,
54
+ validators,
55
+ disabled,
56
+ value,
57
+ placeholder,
58
+ icons,
59
+ options,
60
+ ...fieldProps
61
+ } = useProps(props) as IconProps<TData, TName> & Record<string, unknown>;
62
+
63
+ return (
64
+ <FormsIcon
65
+ name={name}
66
+ form={form}
67
+ validators={validators}
68
+ value={value as string | undefined}
69
+ onChange={onChange as ((v: string) => void) | undefined}
70
+ defaultValue={defaultValue as string}
71
+ label={fieldProps.label}
72
+ labelProps={fieldProps.labelProps}
73
+ error={fieldProps.error}
74
+ helperText={fieldProps.helperText}
75
+ readOnly={fieldProps.readOnly}
76
+ skeleton={fieldProps.skeleton}
77
+ compact={fieldProps.compact}
78
+ required={fieldProps.required}
79
+ id={fieldProps.id}
80
+ size={fieldProps.size}
81
+ disabled={disabled}
82
+ placeholder={placeholder}
83
+ icons={icons}
84
+ options={options}
85
+ onBlur={onBlur}
86
+ mode={mode}
87
+ preserveValue={preserveValue}
88
+ />
89
+ );
90
+ }
@@ -14,6 +14,7 @@ import { Link } from "./Link";
14
14
 
15
15
  const mockUseLinkSearch = vi.fn();
16
16
  const mockUseLinkTitle = vi.fn();
17
+ const mockUseDocTypeMeta = vi.fn();
17
18
 
18
19
  vi.mock("@multiplatform.one/frappe", async (importOriginal) => {
19
20
  const actual = await importOriginal<Record<string, unknown>>();
@@ -21,6 +22,7 @@ vi.mock("@multiplatform.one/frappe", async (importOriginal) => {
21
22
  ...actual,
22
23
  useLinkSearch: (...args: unknown[]) => mockUseLinkSearch(...args),
23
24
  useLinkTitle: (...args: unknown[]) => mockUseLinkTitle(...args),
25
+ useDocTypeMeta: (...args: unknown[]) => mockUseDocTypeMeta(...args),
24
26
  };
25
27
  });
26
28
 
@@ -48,6 +50,7 @@ beforeEach(() => {
48
50
  vi.clearAllMocks();
49
51
  mockUseLinkSearch.mockReturnValue({ results: [], isLoading: false, error: null });
50
52
  mockUseLinkTitle.mockReturnValue({ title: undefined, isLoading: false });
53
+ mockUseDocTypeMeta.mockReturnValue({ meta: undefined, isLoading: false, error: null });
51
54
  });
52
55
 
53
56
  afterEach(cleanup);
@@ -166,3 +169,10 @@ describe("Link result and error presentation", () => {
166
169
  expect(screen.getByText("Assigned To")).toBeTruthy();
167
170
  });
168
171
  });
172
+
173
+ describe("Link design-law — compose forms Combobox", () => {
174
+ it("renders the house Combobox trigger (no forked Select chrome)", () => {
175
+ const result = renderLink();
176
+ expect(result.container.querySelector('[data-testid="combobox-trigger"]')).toBeTruthy();
177
+ });
178
+ });
@@ -1,3 +1,4 @@
1
+ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
1
2
  import { action } from "@multiplatform.one/storybook";
2
3
  import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
3
4
  import type { ReactNode } from "react";
@@ -17,7 +18,7 @@ export default {
17
18
  docs: {
18
19
  description: {
19
20
  component:
20
- "Frappe Link field: a backend-searching combobox over a target doctype. Every (debounced) keystroke calls frappe.desk.search.search_link on the server ranked value/description results, link filters and permissions enforced server-side; an existing value resolves its display title on mount (get_link_title). Live stories run against the dev bench through the Storybook proxy; when the bench is down they degrade to an honest in-dropdown search error (the raw search path has no fixture layer).",
21
+ "Frappe Link field: a backend-searching combobox over a target doctype. Fixture stories are network-hermetic (G-15/D-05): documents come from InMemoryFixtureProvider and search_link / get_link_title / getdoctype from an in-story fetch mock, so nothing leaves the machine. Live stories run against the dev bench through the Storybook proxy; when the bench is down they degrade to an honest in-dropdown search error.",
21
22
  },
22
23
  },
23
24
  },
@@ -33,6 +34,118 @@ export default {
33
34
  },
34
35
  };
35
36
 
37
+ // ---------------------------------------------------------------------------
38
+ // Hermetic story host (G-15 story honesty / D-05).
39
+ //
40
+ // Default stories previously pointed at https://demo.frappe.cloud. The fixture
41
+ // provider can serve documents, but Link still resolves titles and suggestions
42
+ // over HTTP — so those stories fired real cross-origin requests the browser
43
+ // rejected with CORS, poisoning Kitchen Sink / TestFlight. MOCK_HOST keeps the
44
+ // same code path (real fetch, real search_link / get_link_title / getdoctype
45
+ // shapes) without leaving the machine.
46
+ // ---------------------------------------------------------------------------
47
+
48
+ const MOCK_HOST = "https://frappelink.mock.test";
49
+
50
+ function contactMeta() {
51
+ return {
52
+ name: "Contact",
53
+ module: "Contacts",
54
+ title_field: "first_name",
55
+ fields: [
56
+ { fieldname: "first_name", fieldtype: "Data", label: "First Name", reqd: 1 },
57
+ { fieldname: "last_name", fieldtype: "Data", label: "Last Name" },
58
+ { fieldname: "email_id", fieldtype: "Data", label: "Email" },
59
+ ],
60
+ permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
61
+ };
62
+ }
63
+
64
+ interface Contact {
65
+ name: string;
66
+ doctype: string;
67
+ first_name: string;
68
+ last_name: string;
69
+ email_id: string;
70
+ }
71
+
72
+ const contactFixtures: Contact[] = [
73
+ {
74
+ name: "CONTACT-001",
75
+ doctype: "Contact",
76
+ first_name: "John",
77
+ last_name: "Doe",
78
+ email_id: "john@example.com",
79
+ },
80
+ {
81
+ name: "CONTACT-002",
82
+ doctype: "Contact",
83
+ first_name: "Jane",
84
+ last_name: "Smith",
85
+ email_id: "jane@example.com",
86
+ },
87
+ {
88
+ name: "CONTACT-003",
89
+ doctype: "Contact",
90
+ first_name: "Amit",
91
+ last_name: "Patel",
92
+ email_id: "amit@example.com",
93
+ },
94
+ ];
95
+
96
+ const contactLinks = contactFixtures.map((doc) => ({
97
+ value: doc.name,
98
+ label: `${doc.first_name} ${doc.last_name}`,
99
+ description: `${doc.first_name} ${doc.last_name}`,
100
+ }));
101
+
102
+ function jsonResponse(body: unknown, status = 200): Response {
103
+ return new Response(JSON.stringify(body), {
104
+ status,
105
+ headers: { "Content-Type": "application/json" },
106
+ });
107
+ }
108
+
109
+ (() => {
110
+ if (typeof window === "undefined") return;
111
+ const w = window as unknown as Record<string, unknown>;
112
+ if (w.__frappeLinkMockFetch) return;
113
+ w.__frappeLinkMockFetch = true;
114
+ const realFetch = window.fetch.bind(window);
115
+ window.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
116
+ const urlStr =
117
+ typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
118
+ if (urlStr.startsWith(MOCK_HOST)) {
119
+ const url = new URL(urlStr);
120
+ if (url.pathname.includes("frappe.desk.form.load.getdoctype")) {
121
+ return jsonResponse({ docs: [contactMeta()] });
122
+ }
123
+ if (url.pathname.includes("frappe.desk.search.search_link")) {
124
+ const txt = (url.searchParams.get("txt") ?? "").toLowerCase();
125
+ const message = contactLinks.filter(
126
+ (item) =>
127
+ !txt ||
128
+ item.value.toLowerCase().includes(txt) ||
129
+ item.description.toLowerCase().includes(txt),
130
+ );
131
+ return jsonResponse({ message });
132
+ }
133
+ if (url.pathname.includes("frappe.desk.search.get_link_title")) {
134
+ const docname = url.searchParams.get("docname") ?? "";
135
+ const hit = contactLinks.find((item) => item.value === docname);
136
+ return jsonResponse({ message: hit?.description ?? docname });
137
+ }
138
+ if (url.pathname.includes("frappe.sessions.get_csrf_token")) {
139
+ return jsonResponse({ message: "mock-csrf" });
140
+ }
141
+ const metaMatch = url.pathname.match(/^\/api\/resource\/DocType\/(.+)$/);
142
+ if (metaMatch) return jsonResponse({ data: contactMeta() });
143
+ return jsonResponse({ data: [], message: [] });
144
+ }
145
+ return realFetch(input as RequestInfo, init);
146
+ };
147
+ })();
148
+
36
149
  type StoryProps = LinkProps & Record<string, unknown>;
37
150
 
38
151
  function Controlled(props: Omit<StoryProps, "onChange">) {
@@ -49,8 +162,14 @@ function Controlled(props: Omit<StoryProps, "onChange">) {
49
162
  );
50
163
  }
51
164
 
165
+ const contactFixturesProvider = () =>
166
+ new InMemoryFixtureProvider({
167
+ Contact: contactFixtures,
168
+ DocType: [contactMeta()],
169
+ });
170
+
52
171
  const withProvider = (node: ReactNode) => (
53
- <FrappeProvider baseURL="https://demo.frappe.cloud">
172
+ <FrappeProvider baseURL={MOCK_HOST} fixtures={contactFixturesProvider()}>
54
173
  <YStack maxWidth={420}>{node}</YStack>
55
174
  </FrappeProvider>
56
175
  );
@@ -227,3 +346,43 @@ LiveCell.parameters = {
227
346
  },
228
347
  },
229
348
  };
349
+
350
+ // Fixture-backed twin of LiveCell — network-hermetic (MOCK_HOST, never demo.frappe.cloud).
351
+ const IN_TABLE_HOST = "https://frappe-intable.mock.test";
352
+ const userFixtures = new InMemoryFixtureProvider({
353
+ User: [
354
+ { name: "Administrator", doctype: "User", full_name: "Administrator" },
355
+ { name: "Guest", doctype: "User", full_name: "Guest" },
356
+ { name: "jane@example.com", doctype: "User", full_name: "Jane Example" },
357
+ ],
358
+ });
359
+
360
+ interface LinkInTableRow {
361
+ id: string;
362
+ label: string;
363
+ allocated_to: string;
364
+ }
365
+
366
+ export const InTable = () => {
367
+ const [data, setData] = useState<LinkInTableRow[]>([
368
+ { id: "1", label: "Alpha", allocated_to: "Administrator" },
369
+ { id: "2", label: "Beta", allocated_to: "jane@example.com" },
370
+ { id: "3", label: "Gamma", allocated_to: "" },
371
+ ]);
372
+ const columns: DataTableColumn<LinkInTableRow>[] = [
373
+ { accessorKey: "label", header: "Row" },
374
+ {
375
+ accessorKey: "allocated_to",
376
+ header: "Allocated To",
377
+ ...fieldtypeToTableField("Link", "User"),
378
+ },
379
+ ];
380
+ return (
381
+ <FrappeProvider baseURL={IN_TABLE_HOST} fixtures={userFixtures}>
382
+ <YStack width="100%" height={280}>
383
+ <DataTable data={data} columns={columns} enablePagination={false} onDataChange={setData} />
384
+ </YStack>
385
+ </FrappeProvider>
386
+ );
387
+ };
388
+ InTable.storyName = "In table";