@multiplatform.one/frappe-ui 7.46.0 → 7.47.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 (463) hide show
  1. package/dist/cjs/FileBrowser/index.cjs +1 -1
  2. package/dist/cjs/FileBrowser/index.native.js +1 -1
  3. package/dist/cjs/FileBrowser/index.native.js.map +1 -1
  4. package/dist/cjs/FrappeCalendar.cjs +2 -2
  5. package/dist/cjs/FrappeCalendar.native.js +2 -2
  6. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  7. package/dist/cjs/FrappeConnectionIndicator.cjs +2 -1
  8. package/dist/cjs/FrappeConnectionIndicator.native.js +2 -1
  9. package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
  10. package/dist/cjs/FrappeDashboard.cjs +1 -1
  11. package/dist/cjs/FrappeDashboard.native.js +1 -1
  12. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  13. package/dist/cjs/FrappeForm.cjs +54 -29
  14. package/dist/cjs/FrappeForm.native.js +56 -28
  15. package/dist/cjs/FrappeForm.native.js.map +1 -1
  16. package/dist/cjs/FrappeFormActions.cjs +121 -0
  17. package/dist/cjs/FrappeFormActions.native.js +123 -0
  18. package/dist/cjs/FrappeFormActions.native.js.map +1 -1
  19. package/dist/cjs/FrappeInsights.cjs +4 -1
  20. package/dist/cjs/FrappeInsights.native.js +4 -6
  21. package/dist/cjs/FrappeInsights.native.js.map +1 -1
  22. package/dist/cjs/FrappeKanban.cjs +1 -1
  23. package/dist/cjs/FrappeKanban.native.js +1 -1
  24. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  25. package/dist/cjs/FrappeListView.cjs +1 -1
  26. package/dist/cjs/FrappeListView.native.js +4 -7
  27. package/dist/cjs/FrappeListView.native.js.map +1 -1
  28. package/dist/cjs/FrappeReconnectIndicator.cjs +2 -1
  29. package/dist/cjs/FrappeReconnectIndicator.native.js +2 -1
  30. package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
  31. package/dist/cjs/SyncErrorNotice.cjs +1 -1
  32. package/dist/cjs/SyncErrorNotice.native.js +1 -1
  33. package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
  34. package/dist/cjs/desk/DeskFormPage.cjs +28 -42
  35. package/dist/cjs/desk/DeskFormPage.native.js +42 -58
  36. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  37. package/dist/cjs/desk/DeskShell.cjs +1 -1
  38. package/dist/cjs/desk/DeskShell.native.js +1 -1
  39. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  40. package/dist/cjs/desk/awesomebar.cjs +1 -1
  41. package/dist/cjs/desk/awesomebar.native.js +1 -1
  42. package/dist/cjs/desk/awesomebar.native.js.map +1 -1
  43. package/dist/cjs/fields/CodeEditor/index.cjs +1 -1
  44. package/dist/cjs/fields/CodeEditor/index.native.js +1 -1
  45. package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
  46. package/dist/cjs/fields/Date/index.native.js +5 -4
  47. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  48. package/dist/cjs/fields/FileUpload.cjs +10 -8
  49. package/dist/cjs/fields/FileUpload.native.js +10 -8
  50. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  51. package/dist/cjs/fields/FileUploadField/index.cjs +50 -4
  52. package/dist/cjs/fields/FileUploadField/index.native.js +54 -5
  53. package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
  54. package/dist/cjs/fields/Heading/index.cjs +1 -1
  55. package/dist/cjs/fields/Heading/index.native.js +1 -1
  56. package/dist/cjs/fields/Heading/index.native.js.map +1 -1
  57. package/dist/cjs/fields/MarkdownEditor/index.native.js +3 -2
  58. package/dist/cjs/fields/MarkdownEditor/index.native.js.map +1 -1
  59. package/dist/cjs/fields/Numeric/index.cjs +3 -2
  60. package/dist/cjs/fields/Numeric/index.native.js +3 -2
  61. package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
  62. package/dist/cjs/fields/Password/index.cjs +18 -62
  63. package/dist/cjs/fields/Password/index.native.js +18 -65
  64. package/dist/cjs/fields/Password/index.native.js.map +1 -1
  65. package/dist/cjs/fields/ReadOnly/index.cjs +2 -1
  66. package/dist/cjs/fields/ReadOnly/index.native.js +2 -1
  67. package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
  68. package/dist/cjs/index.cjs +2 -0
  69. package/dist/cjs/index.native.js +2 -0
  70. package/dist/cjs/index.native.js.map +1 -1
  71. package/dist/cjs/insights/InsightsLeaders.cjs +2 -2
  72. package/dist/cjs/insights/InsightsLeaders.native.js +2 -2
  73. package/dist/cjs/insights/InsightsLeaders.native.js.map +1 -1
  74. package/dist/cjs/insights/InsightsRecords.cjs +2 -2
  75. package/dist/cjs/insights/InsightsRecords.native.js +2 -2
  76. package/dist/cjs/insights/InsightsRecords.native.js.map +1 -1
  77. package/dist/cjs/list/FacetBadge.cjs +4 -3
  78. package/dist/cjs/list/FacetBadge.native.js +4 -3
  79. package/dist/cjs/list/FacetBadge.native.js.map +1 -1
  80. package/dist/cjs/list/ImageWell.cjs +6 -18
  81. package/dist/cjs/list/ImageWell.native.js +7 -19
  82. package/dist/cjs/list/ImageWell.native.js.map +1 -1
  83. package/dist/cjs/list/RecordCard.cjs +2 -2
  84. package/dist/cjs/list/RecordCard.native.js +2 -2
  85. package/dist/cjs/list/RecordCard.native.js.map +1 -1
  86. package/dist/cjs/list/facetBadgeSteps.cjs +32 -0
  87. package/dist/cjs/list/facetBadgeSteps.native.js +35 -0
  88. package/dist/cjs/list/facetBadgeSteps.native.js.map +1 -0
  89. package/dist/cjs/record/RecordHero.cjs +4 -15
  90. package/dist/cjs/record/RecordHero.native.js +4 -15
  91. package/dist/cjs/record/RecordHero.native.js.map +1 -1
  92. package/dist/cjs/record/RecordPage.cjs +4 -4
  93. package/dist/cjs/record/RecordPage.native.js +7 -10
  94. package/dist/cjs/record/RecordPage.native.js.map +1 -1
  95. package/dist/cjs/report/ReportGrid.cjs +6 -6
  96. package/dist/cjs/report/ReportGrid.native.js +11 -7
  97. package/dist/cjs/report/ReportGrid.native.js.map +1 -1
  98. package/dist/cjs/schemaForm/index.cjs +3 -3
  99. package/dist/cjs/schemaForm/index.native.js +3 -3
  100. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  101. package/dist/esm/FileBrowser/index.mjs +8 -8
  102. package/dist/esm/FileBrowser/index.mjs.map +1 -1
  103. package/dist/esm/FileBrowser/index.native.js +8 -8
  104. package/dist/esm/FileBrowser/index.native.js.map +1 -1
  105. package/dist/esm/FrappeCalendar.mjs +6 -6
  106. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  107. package/dist/esm/FrappeCalendar.native.js +6 -6
  108. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  109. package/dist/esm/FrappeConnectionIndicator.mjs +2 -1
  110. package/dist/esm/FrappeConnectionIndicator.mjs.map +1 -1
  111. package/dist/esm/FrappeConnectionIndicator.native.js +2 -1
  112. package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
  113. package/dist/esm/FrappeDashboard.mjs +6 -6
  114. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  115. package/dist/esm/FrappeDashboard.native.js +6 -6
  116. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  117. package/dist/esm/FrappeForm.mjs +52 -27
  118. package/dist/esm/FrappeForm.mjs.map +1 -1
  119. package/dist/esm/FrappeForm.native.js +56 -28
  120. package/dist/esm/FrappeForm.native.js.map +1 -1
  121. package/dist/esm/FrappeFormActions.mjs +122 -2
  122. package/dist/esm/FrappeFormActions.mjs.map +1 -1
  123. package/dist/esm/FrappeFormActions.native.js +124 -2
  124. package/dist/esm/FrappeFormActions.native.js.map +1 -1
  125. package/dist/esm/FrappeInsights.mjs +4 -1
  126. package/dist/esm/FrappeInsights.mjs.map +1 -1
  127. package/dist/esm/FrappeInsights.native.js +4 -6
  128. package/dist/esm/FrappeInsights.native.js.map +1 -1
  129. package/dist/esm/FrappeKanban.mjs +5 -5
  130. package/dist/esm/FrappeKanban.mjs.map +1 -1
  131. package/dist/esm/FrappeKanban.native.js +5 -5
  132. package/dist/esm/FrappeKanban.native.js.map +1 -1
  133. package/dist/esm/FrappeListView.mjs +1 -1
  134. package/dist/esm/FrappeListView.mjs.map +1 -1
  135. package/dist/esm/FrappeListView.native.js +4 -7
  136. package/dist/esm/FrappeListView.native.js.map +1 -1
  137. package/dist/esm/FrappeReconnectIndicator.mjs +2 -1
  138. package/dist/esm/FrappeReconnectIndicator.mjs.map +1 -1
  139. package/dist/esm/FrappeReconnectIndicator.native.js +2 -1
  140. package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
  141. package/dist/esm/SyncErrorNotice.mjs +2 -2
  142. package/dist/esm/SyncErrorNotice.mjs.map +1 -1
  143. package/dist/esm/SyncErrorNotice.native.js +2 -2
  144. package/dist/esm/SyncErrorNotice.native.js.map +1 -1
  145. package/dist/esm/desk/DeskFormPage.mjs +29 -43
  146. package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
  147. package/dist/esm/desk/DeskFormPage.native.js +43 -59
  148. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  149. package/dist/esm/desk/DeskShell.mjs +1 -1
  150. package/dist/esm/desk/DeskShell.mjs.map +1 -1
  151. package/dist/esm/desk/DeskShell.native.js +1 -1
  152. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  153. package/dist/esm/desk/awesomebar.mjs +1 -1
  154. package/dist/esm/desk/awesomebar.mjs.map +1 -1
  155. package/dist/esm/desk/awesomebar.native.js +1 -1
  156. package/dist/esm/desk/awesomebar.native.js.map +1 -1
  157. package/dist/esm/fields/CodeEditor/index.mjs +3 -3
  158. package/dist/esm/fields/CodeEditor/index.mjs.map +1 -1
  159. package/dist/esm/fields/CodeEditor/index.native.js +3 -3
  160. package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
  161. package/dist/esm/fields/Date/index.native.js +2 -1
  162. package/dist/esm/fields/Date/index.native.js.map +1 -1
  163. package/dist/esm/fields/FileUpload.mjs +5 -3
  164. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  165. package/dist/esm/fields/FileUpload.native.js +5 -3
  166. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  167. package/dist/esm/fields/FileUploadField/index.mjs +52 -6
  168. package/dist/esm/fields/FileUploadField/index.mjs.map +1 -1
  169. package/dist/esm/fields/FileUploadField/index.native.js +56 -7
  170. package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
  171. package/dist/esm/fields/Heading/index.mjs +3 -3
  172. package/dist/esm/fields/Heading/index.mjs.map +1 -1
  173. package/dist/esm/fields/Heading/index.native.js +3 -3
  174. package/dist/esm/fields/Heading/index.native.js.map +1 -1
  175. package/dist/esm/fields/MarkdownEditor/index.native.js +2 -1
  176. package/dist/esm/fields/MarkdownEditor/index.native.js.map +1 -1
  177. package/dist/esm/fields/Numeric/index.mjs +2 -1
  178. package/dist/esm/fields/Numeric/index.mjs.map +1 -1
  179. package/dist/esm/fields/Numeric/index.native.js +2 -1
  180. package/dist/esm/fields/Numeric/index.native.js.map +1 -1
  181. package/dist/esm/fields/Password/index.mjs +16 -60
  182. package/dist/esm/fields/Password/index.mjs.map +1 -1
  183. package/dist/esm/fields/Password/index.native.js +16 -63
  184. package/dist/esm/fields/Password/index.native.js.map +1 -1
  185. package/dist/esm/fields/ReadOnly/index.mjs +7 -6
  186. package/dist/esm/fields/ReadOnly/index.mjs.map +1 -1
  187. package/dist/esm/fields/ReadOnly/index.native.js +7 -6
  188. package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
  189. package/dist/esm/index.mjs +2 -1
  190. package/dist/esm/index.mjs.map +1 -1
  191. package/dist/esm/index.native.js +2 -1
  192. package/dist/esm/index.native.js.map +1 -1
  193. package/dist/esm/insights/InsightsLeaders.mjs +2 -2
  194. package/dist/esm/insights/InsightsLeaders.mjs.map +1 -1
  195. package/dist/esm/insights/InsightsLeaders.native.js +2 -2
  196. package/dist/esm/insights/InsightsLeaders.native.js.map +1 -1
  197. package/dist/esm/insights/InsightsRecords.mjs +2 -2
  198. package/dist/esm/insights/InsightsRecords.mjs.map +1 -1
  199. package/dist/esm/insights/InsightsRecords.native.js +2 -2
  200. package/dist/esm/insights/InsightsRecords.native.js.map +1 -1
  201. package/dist/esm/list/FacetBadge.mjs +4 -3
  202. package/dist/esm/list/FacetBadge.mjs.map +1 -1
  203. package/dist/esm/list/FacetBadge.native.js +4 -3
  204. package/dist/esm/list/FacetBadge.native.js.map +1 -1
  205. package/dist/esm/list/ImageWell.mjs +8 -20
  206. package/dist/esm/list/ImageWell.mjs.map +1 -1
  207. package/dist/esm/list/ImageWell.native.js +9 -21
  208. package/dist/esm/list/ImageWell.native.js.map +1 -1
  209. package/dist/esm/list/RecordCard.mjs +2 -2
  210. package/dist/esm/list/RecordCard.mjs.map +1 -1
  211. package/dist/esm/list/RecordCard.native.js +2 -2
  212. package/dist/esm/list/RecordCard.native.js.map +1 -1
  213. package/dist/esm/list/facetBadgeSteps.mjs +7 -0
  214. package/dist/esm/list/facetBadgeSteps.mjs.map +1 -0
  215. package/dist/esm/list/facetBadgeSteps.native.js +7 -0
  216. package/dist/esm/list/facetBadgeSteps.native.js.map +1 -0
  217. package/dist/esm/record/RecordHero.mjs +4 -15
  218. package/dist/esm/record/RecordHero.mjs.map +1 -1
  219. package/dist/esm/record/RecordHero.native.js +4 -15
  220. package/dist/esm/record/RecordHero.native.js.map +1 -1
  221. package/dist/esm/record/RecordPage.mjs +4 -4
  222. package/dist/esm/record/RecordPage.mjs.map +1 -1
  223. package/dist/esm/record/RecordPage.native.js +7 -10
  224. package/dist/esm/record/RecordPage.native.js.map +1 -1
  225. package/dist/esm/report/ReportGrid.mjs +7 -7
  226. package/dist/esm/report/ReportGrid.mjs.map +1 -1
  227. package/dist/esm/report/ReportGrid.native.js +12 -8
  228. package/dist/esm/report/ReportGrid.native.js.map +1 -1
  229. package/dist/esm/schemaForm/index.mjs +4 -4
  230. package/dist/esm/schemaForm/index.mjs.map +1 -1
  231. package/dist/esm/schemaForm/index.native.js +4 -4
  232. package/dist/esm/schemaForm/index.native.js.map +1 -1
  233. package/dist/jsx/FileBrowser/index.mjs +8 -8
  234. package/dist/jsx/FileBrowser/index.mjs.map +1 -1
  235. package/dist/jsx/FileBrowser/index.native.js +1 -1
  236. package/dist/jsx/FileBrowser/index.native.js.map +1 -1
  237. package/dist/jsx/FrappeCalendar.mjs +6 -6
  238. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  239. package/dist/jsx/FrappeCalendar.native.js +2 -2
  240. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  241. package/dist/jsx/FrappeConnectionIndicator.mjs +2 -1
  242. package/dist/jsx/FrappeConnectionIndicator.mjs.map +1 -1
  243. package/dist/jsx/FrappeConnectionIndicator.native.js +2 -1
  244. package/dist/jsx/FrappeConnectionIndicator.native.js.map +1 -1
  245. package/dist/jsx/FrappeDashboard.mjs +6 -6
  246. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  247. package/dist/jsx/FrappeDashboard.native.js +1 -1
  248. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  249. package/dist/jsx/FrappeForm.mjs +52 -27
  250. package/dist/jsx/FrappeForm.mjs.map +1 -1
  251. package/dist/jsx/FrappeForm.native.js +56 -28
  252. package/dist/jsx/FrappeForm.native.js.map +1 -1
  253. package/dist/jsx/FrappeFormActions.mjs +122 -2
  254. package/dist/jsx/FrappeFormActions.mjs.map +1 -1
  255. package/dist/jsx/FrappeFormActions.native.js +123 -0
  256. package/dist/jsx/FrappeFormActions.native.js.map +1 -1
  257. package/dist/jsx/FrappeInsights.mjs +4 -1
  258. package/dist/jsx/FrappeInsights.mjs.map +1 -1
  259. package/dist/jsx/FrappeInsights.native.js +4 -6
  260. package/dist/jsx/FrappeInsights.native.js.map +1 -1
  261. package/dist/jsx/FrappeKanban.mjs +5 -5
  262. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  263. package/dist/jsx/FrappeKanban.native.js +1 -1
  264. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  265. package/dist/jsx/FrappeListView.mjs +1 -1
  266. package/dist/jsx/FrappeListView.mjs.map +1 -1
  267. package/dist/jsx/FrappeListView.native.js +4 -7
  268. package/dist/jsx/FrappeListView.native.js.map +1 -1
  269. package/dist/jsx/FrappeReconnectIndicator.mjs +2 -1
  270. package/dist/jsx/FrappeReconnectIndicator.mjs.map +1 -1
  271. package/dist/jsx/FrappeReconnectIndicator.native.js +2 -1
  272. package/dist/jsx/FrappeReconnectIndicator.native.js.map +1 -1
  273. package/dist/jsx/SyncErrorNotice.mjs +2 -2
  274. package/dist/jsx/SyncErrorNotice.mjs.map +1 -1
  275. package/dist/jsx/SyncErrorNotice.native.js +1 -1
  276. package/dist/jsx/SyncErrorNotice.native.js.map +1 -1
  277. package/dist/jsx/desk/DeskFormPage.mjs +29 -43
  278. package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
  279. package/dist/jsx/desk/DeskFormPage.native.js +42 -58
  280. package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
  281. package/dist/jsx/desk/DeskShell.mjs +1 -1
  282. package/dist/jsx/desk/DeskShell.mjs.map +1 -1
  283. package/dist/jsx/desk/DeskShell.native.js +1 -1
  284. package/dist/jsx/desk/DeskShell.native.js.map +1 -1
  285. package/dist/jsx/desk/awesomebar.mjs +1 -1
  286. package/dist/jsx/desk/awesomebar.mjs.map +1 -1
  287. package/dist/jsx/desk/awesomebar.native.js +1 -1
  288. package/dist/jsx/desk/awesomebar.native.js.map +1 -1
  289. package/dist/jsx/fields/CodeEditor/index.mjs +3 -3
  290. package/dist/jsx/fields/CodeEditor/index.mjs.map +1 -1
  291. package/dist/jsx/fields/CodeEditor/index.native.js +1 -1
  292. package/dist/jsx/fields/CodeEditor/index.native.js.map +1 -1
  293. package/dist/jsx/fields/Date/index.native.js +5 -4
  294. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  295. package/dist/jsx/fields/FileUpload.mjs +5 -3
  296. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  297. package/dist/jsx/fields/FileUpload.native.js +10 -8
  298. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  299. package/dist/jsx/fields/FileUploadField/index.mjs +52 -6
  300. package/dist/jsx/fields/FileUploadField/index.mjs.map +1 -1
  301. package/dist/jsx/fields/FileUploadField/index.native.js +54 -5
  302. package/dist/jsx/fields/FileUploadField/index.native.js.map +1 -1
  303. package/dist/jsx/fields/Heading/index.mjs +3 -3
  304. package/dist/jsx/fields/Heading/index.mjs.map +1 -1
  305. package/dist/jsx/fields/Heading/index.native.js +1 -1
  306. package/dist/jsx/fields/Heading/index.native.js.map +1 -1
  307. package/dist/jsx/fields/MarkdownEditor/index.native.js +3 -2
  308. package/dist/jsx/fields/MarkdownEditor/index.native.js.map +1 -1
  309. package/dist/jsx/fields/Numeric/index.mjs +2 -1
  310. package/dist/jsx/fields/Numeric/index.mjs.map +1 -1
  311. package/dist/jsx/fields/Numeric/index.native.js +3 -2
  312. package/dist/jsx/fields/Numeric/index.native.js.map +1 -1
  313. package/dist/jsx/fields/Password/index.mjs +16 -60
  314. package/dist/jsx/fields/Password/index.mjs.map +1 -1
  315. package/dist/jsx/fields/Password/index.native.js +18 -65
  316. package/dist/jsx/fields/Password/index.native.js.map +1 -1
  317. package/dist/jsx/fields/ReadOnly/index.mjs +7 -6
  318. package/dist/jsx/fields/ReadOnly/index.mjs.map +1 -1
  319. package/dist/jsx/fields/ReadOnly/index.native.js +2 -1
  320. package/dist/jsx/fields/ReadOnly/index.native.js.map +1 -1
  321. package/dist/jsx/index.js +2 -1
  322. package/dist/jsx/index.js.map +1 -1
  323. package/dist/jsx/index.mjs +2 -1
  324. package/dist/jsx/index.mjs.map +1 -1
  325. package/dist/jsx/index.native.js +2 -0
  326. package/dist/jsx/index.native.js.map +1 -1
  327. package/dist/jsx/insights/InsightsLeaders.mjs +2 -2
  328. package/dist/jsx/insights/InsightsLeaders.mjs.map +1 -1
  329. package/dist/jsx/insights/InsightsLeaders.native.js +2 -2
  330. package/dist/jsx/insights/InsightsLeaders.native.js.map +1 -1
  331. package/dist/jsx/insights/InsightsRecords.mjs +2 -2
  332. package/dist/jsx/insights/InsightsRecords.mjs.map +1 -1
  333. package/dist/jsx/insights/InsightsRecords.native.js +2 -2
  334. package/dist/jsx/insights/InsightsRecords.native.js.map +1 -1
  335. package/dist/jsx/list/FacetBadge.mjs +4 -3
  336. package/dist/jsx/list/FacetBadge.mjs.map +1 -1
  337. package/dist/jsx/list/FacetBadge.native.js +4 -3
  338. package/dist/jsx/list/FacetBadge.native.js.map +1 -1
  339. package/dist/jsx/list/ImageWell.mjs +8 -20
  340. package/dist/jsx/list/ImageWell.mjs.map +1 -1
  341. package/dist/jsx/list/ImageWell.native.js +7 -19
  342. package/dist/jsx/list/ImageWell.native.js.map +1 -1
  343. package/dist/jsx/list/RecordCard.mjs +2 -2
  344. package/dist/jsx/list/RecordCard.mjs.map +1 -1
  345. package/dist/jsx/list/RecordCard.native.js +2 -2
  346. package/dist/jsx/list/RecordCard.native.js.map +1 -1
  347. package/dist/jsx/list/facetBadgeSteps.mjs +7 -0
  348. package/dist/jsx/list/facetBadgeSteps.mjs.map +1 -0
  349. package/dist/jsx/list/facetBadgeSteps.native.js +35 -0
  350. package/dist/jsx/list/facetBadgeSteps.native.js.map +1 -0
  351. package/dist/jsx/record/RecordHero.mjs +4 -15
  352. package/dist/jsx/record/RecordHero.mjs.map +1 -1
  353. package/dist/jsx/record/RecordHero.native.js +4 -15
  354. package/dist/jsx/record/RecordHero.native.js.map +1 -1
  355. package/dist/jsx/record/RecordPage.mjs +4 -4
  356. package/dist/jsx/record/RecordPage.mjs.map +1 -1
  357. package/dist/jsx/record/RecordPage.native.js +7 -10
  358. package/dist/jsx/record/RecordPage.native.js.map +1 -1
  359. package/dist/jsx/report/ReportGrid.mjs +7 -7
  360. package/dist/jsx/report/ReportGrid.mjs.map +1 -1
  361. package/dist/jsx/report/ReportGrid.native.js +11 -7
  362. package/dist/jsx/report/ReportGrid.native.js.map +1 -1
  363. package/dist/jsx/schemaForm/index.mjs +4 -4
  364. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  365. package/dist/jsx/schemaForm/index.native.js +3 -3
  366. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  367. package/package.json +16 -16
  368. package/src/FileBrowser/index.tsx +14 -13
  369. package/src/FormSidebar.stories.tsx +2 -1
  370. package/src/FrappeCalendar.stories.tsx +1 -1
  371. package/src/FrappeCalendar.tsx +10 -9
  372. package/src/FrappeConnectionIndicator.stories.tsx +2 -1
  373. package/src/FrappeConnectionIndicator.tsx +2 -1
  374. package/src/FrappeDashboard.stories.tsx +2 -2
  375. package/src/FrappeDashboard.tsx +10 -10
  376. package/src/FrappeForm.lifecycle.spec.tsx +3 -1
  377. package/src/FrappeForm.tsx +106 -38
  378. package/src/FrappeFormActions.tsx +160 -1
  379. package/src/FrappeInsights.spec.tsx +1 -1
  380. package/src/FrappeInsights.tsx +4 -1
  381. package/src/FrappeKanban.stories.tsx +2 -1
  382. package/src/FrappeKanban.tsx +8 -7
  383. package/src/FrappeList.stories.tsx +11 -10
  384. package/src/FrappeListView.card.spec.tsx +1 -1
  385. package/src/FrappeListView.sidebar.spec.tsx +1 -1
  386. package/src/FrappeListView.tsx +1 -1
  387. package/src/FrappeProvider.stories.tsx +2 -1
  388. package/src/FrappeReconnectIndicator.stories.tsx +2 -1
  389. package/src/FrappeReconnectIndicator.tsx +2 -1
  390. package/src/SyncErrorNotice.tsx +2 -2
  391. package/src/desk/DeskFormPage.tsx +42 -62
  392. package/src/desk/DeskFormSidebar.stories.tsx +4 -2
  393. package/src/desk/DeskShell.tsx +1 -1
  394. package/src/desk/awesomebar.tsx +1 -1
  395. package/src/fields/CodeEditor/index.tsx +4 -4
  396. package/src/fields/Date/index.native.tsx +2 -1
  397. package/src/fields/FileUpload.tsx +8 -4
  398. package/src/fields/FileUploadField/FileUploadField.spec.tsx +86 -1
  399. package/src/fields/FileUploadField/FileUploadField.stories.tsx +9 -0
  400. package/src/fields/FileUploadField/index.tsx +67 -6
  401. package/src/fields/Heading/index.tsx +4 -4
  402. package/src/fields/MarkdownEditor/index.native.tsx +2 -1
  403. package/src/fields/Numeric/index.tsx +2 -1
  404. package/src/fields/Password/index.tsx +14 -70
  405. package/src/fields/ReadOnly/index.tsx +12 -11
  406. package/src/fields/TextEditor/TextEditor.stories.tsx +2 -1
  407. package/src/frappeRemainder.designLaw.spec.ts +3 -2
  408. package/src/frappeRoutes.spec.tsx +20 -6
  409. package/src/index.ts +7 -1
  410. package/src/insights/InsightsLeaders.tsx +2 -2
  411. package/src/insights/InsightsRecords.tsx +2 -2
  412. package/src/insights/insightsRecord.ts +2 -2
  413. package/src/list/FacetBadge.tsx +5 -4
  414. package/src/list/ImageWell.spec.tsx +47 -0
  415. package/src/list/ImageWell.tsx +8 -21
  416. package/src/list/RecordCard.native.tsx +2 -2
  417. package/src/list/RecordCard.spec.tsx +1 -1
  418. package/src/list/RecordCard.tsx +4 -4
  419. package/src/list/facetBadgeSteps.ts +2 -0
  420. package/src/record/RecordHero.tsx +4 -11
  421. package/src/record/RecordPage.tsx +4 -4
  422. package/src/report/ReportGrid.native.spec.tsx +152 -0
  423. package/src/report/ReportGrid.tsx +20 -9
  424. package/src/schemaForm/SchemaForm.stories.tsx +2 -1
  425. package/src/schemaForm/index.tsx +6 -6
  426. package/types/FileBrowser/index.d.ts.map +1 -1
  427. package/types/FrappeCalendar.d.ts.map +1 -1
  428. package/types/FrappeConnectionIndicator.d.ts.map +1 -1
  429. package/types/FrappeDashboard.d.ts.map +1 -1
  430. package/types/FrappeForm.d.ts +19 -0
  431. package/types/FrappeForm.d.ts.map +1 -1
  432. package/types/FrappeFormActions.d.ts +7 -0
  433. package/types/FrappeFormActions.d.ts.map +1 -1
  434. package/types/FrappeInsights.d.ts.map +1 -1
  435. package/types/FrappeKanban.d.ts.map +1 -1
  436. package/types/FrappeReconnectIndicator.d.ts.map +1 -1
  437. package/types/desk/DeskFormPage.d.ts +6 -6
  438. package/types/desk/DeskFormPage.d.ts.map +1 -1
  439. package/types/fields/Date/index.native.d.ts.map +1 -1
  440. package/types/fields/FileUpload.d.ts.map +1 -1
  441. package/types/fields/FileUploadField/index.d.ts.map +1 -1
  442. package/types/fields/MarkdownEditor/index.native.d.ts.map +1 -1
  443. package/types/fields/Numeric/index.d.ts.map +1 -1
  444. package/types/fields/Password/index.d.ts +13 -0
  445. package/types/fields/Password/index.d.ts.map +1 -1
  446. package/types/fields/ReadOnly/index.d.ts.map +1 -1
  447. package/types/index.d.ts +2 -1
  448. package/types/index.d.ts.map +1 -1
  449. package/types/insights/insightsRecord.d.ts +2 -2
  450. package/types/insights/insightsRecord.d.ts.map +1 -1
  451. package/types/list/FacetBadge.d.ts +1 -1
  452. package/types/list/FacetBadge.d.ts.map +1 -1
  453. package/types/list/ImageWell.d.ts +5 -4
  454. package/types/list/ImageWell.d.ts.map +1 -1
  455. package/types/list/RecordCard.d.ts +3 -3
  456. package/types/list/RecordCard.d.ts.map +1 -1
  457. package/types/list/RecordCard.native.d.ts +1 -1
  458. package/types/list/RecordCard.native.d.ts.map +1 -1
  459. package/types/list/facetBadgeSteps.d.ts +7 -0
  460. package/types/list/facetBadgeSteps.d.ts.map +1 -0
  461. package/types/record/RecordHero.d.ts +3 -3
  462. package/types/record/RecordHero.d.ts.map +1 -1
  463. package/types/report/ReportGrid.d.ts.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/frappe-ui",
3
- "version": "7.46.0",
3
+ "version": "7.47.0",
4
4
  "description": "Pre-wired Tamagui components for Frappe doctypes with live data",
5
5
  "keywords": [
6
6
  "cross-platform",
@@ -72,18 +72,18 @@
72
72
  "access": "public"
73
73
  },
74
74
  "dependencies": {
75
- "@multiplatform.one/components": "^7.46.0",
76
- "@multiplatform.one/desktop": "^7.46.0",
77
- "@multiplatform.one/forms": "^7.46.0",
78
- "@multiplatform.one/frappe": "^7.46.0",
79
- "@multiplatform.one/i18n": "^7.46.0",
80
- "@multiplatform.one/markdown": "^7.46.0",
81
- "@multiplatform.one/platform": "^7.46.0",
82
- "@multiplatform.one/rich-text": "^7.46.0",
83
- "@multiplatform.one/router": "^7.46.0",
84
- "@multiplatform.one/store": "^7.46.0",
85
- "@multiplatform.one/table": "^7.46.0",
86
- "@multiplatform.one/theme": "^7.46.0",
75
+ "@multiplatform.one/components": "^7.47.0",
76
+ "@multiplatform.one/desktop": "^7.47.0",
77
+ "@multiplatform.one/forms": "^7.47.0",
78
+ "@multiplatform.one/frappe": "^7.47.0",
79
+ "@multiplatform.one/i18n": "^7.47.0",
80
+ "@multiplatform.one/markdown": "^7.47.0",
81
+ "@multiplatform.one/platform": "^7.47.0",
82
+ "@multiplatform.one/rich-text": "^7.47.0",
83
+ "@multiplatform.one/router": "^7.47.0",
84
+ "@multiplatform.one/store": "^7.47.0",
85
+ "@multiplatform.one/table": "^7.47.0",
86
+ "@multiplatform.one/theme": "^7.47.0",
87
87
  "@phosphor-icons/react": "^2.1.10",
88
88
  "@tamagui/colors": "2.7.6",
89
89
  "@tanstack/db": "0.8.0",
@@ -100,9 +100,9 @@
100
100
  "tamagui": "2.7.6"
101
101
  },
102
102
  "devDependencies": {
103
- "@multiplatform.one/config": "7.46.0",
104
- "@multiplatform.one/storybook": "7.46.0",
105
- "@multiplatform.one/test-utils": "7.46.0",
103
+ "@multiplatform.one/config": "7.47.0",
104
+ "@multiplatform.one/storybook": "7.47.0",
105
+ "@multiplatform.one/test-utils": "7.47.0",
106
106
  "@tamagui/build": "2.7.6",
107
107
  "@testing-library/jest-dom": "^7.0.1",
108
108
  "@testing-library/react": "^16.3.3",
@@ -7,6 +7,7 @@ import {
7
7
  TreeView,
8
8
  ViewSwitcher,
9
9
  type TreeNode,
10
+ Text,
10
11
  } from "@multiplatform.one/components";
11
12
  import { Button, Checkbox, FileUpload, Input } from "@multiplatform.one/forms";
12
13
  import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
@@ -34,7 +35,7 @@ import {
34
35
  } from "@phosphor-icons/react";
35
36
  import { useCallback, useMemo, useState, type ReactNode } from "react";
36
37
  import { useTranslation } from "react-i18next";
37
- import { Text, XStack, YStack, useWindowDimensions } from "tamagui";
38
+ import { Text as TamaguiText, XStack, YStack, useWindowDimensions } from "tamagui";
38
39
  import {
39
40
  ancestorFolderIds,
40
41
  breadcrumbItems,
@@ -366,14 +367,14 @@ export function FileBrowser({
366
367
  return (
367
368
  <XStack alignItems="center" gap="$2" minWidth={0} flex={1}>
368
369
  <KindIcon kind={fileKind(file)} />
369
- <Text
370
+ <TamaguiText
370
371
  fontSize="$3"
371
372
  flex={1}
372
373
  minWidth={0}
373
374
  {...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
374
375
  >
375
376
  {file.file_name}
376
- </Text>
377
+ </TamaguiText>
377
378
  {single && current ? (
378
379
  <CheckIcon size={14} data-filebrowser-current-check aria-hidden />
379
380
  ) : null}
@@ -389,9 +390,9 @@ export function FileBrowser({
389
390
  accessorKey: "file_size",
390
391
  header: t("Size"),
391
392
  cell: ({ row }) => (
392
- <Text fontSize="$3" fontFamily="$mono">
393
+ <TamaguiText fontSize="$3" fontFamily="$mono">
393
394
  {isFolder(row.original) ? "—" : formatSize(row.original.file_size)}
394
- </Text>
395
+ </TamaguiText>
395
396
  ),
396
397
  },
397
398
  ...(single
@@ -540,20 +541,20 @@ export function FileBrowser({
540
541
  </YStack>
541
542
  </YStack>
542
543
  <XStack alignItems="center" gap="$2">
543
- <Text
544
+ <TamaguiText
544
545
  fontSize="$3"
545
546
  flex={1}
546
547
  {...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
547
548
  >
548
549
  {file.file_name}
549
- </Text>
550
+ </TamaguiText>
550
551
  {single && current ? (
551
552
  <CheckIcon size={14} data-filebrowser-current-check aria-hidden />
552
553
  ) : null}
553
554
  </XStack>
554
- <Text fontSize="$2" fontFamily="$mono" color="$color10">
555
+ <TamaguiText fontSize="$2" fontFamily="$mono" color="$color10">
555
556
  {isFolder(file) ? "—" : formatSize(file.file_size)}
556
- </Text>
557
+ </TamaguiText>
557
558
  </YStack>
558
559
  );
559
560
  };
@@ -587,18 +588,18 @@ export function FileBrowser({
587
588
  renderItem={(file) => (
588
589
  <XStack alignItems="center" gap="$3" flex={1} minWidth={0} width="100%">
589
590
  <KindIcon kind={fileKind(file)} />
590
- <Text
591
+ <TamaguiText
591
592
  fontSize="$3"
592
593
  flex={1}
593
594
  minWidth={0}
594
595
  {...({ numberOfLines: 1, title: file.file_name } as Record<string, unknown>)}
595
596
  >
596
597
  {file.file_name}
597
- </Text>
598
+ </TamaguiText>
598
599
  {isFolder(file) ? null : (
599
- <Text fontSize="$2" fontFamily="$mono" color="$color10">
600
+ <TamaguiText fontSize="$2" fontFamily="$mono" color="$color10">
600
601
  {formatSize(file.file_size)}
601
- </Text>
602
+ </TamaguiText>
602
603
  )}
603
604
  </XStack>
604
605
  )}
@@ -3,6 +3,7 @@ import {
3
3
  Tags,
4
4
  type AttachmentItem,
5
5
  type TagItem,
6
+ Text,
6
7
  } from "@multiplatform.one/components";
7
8
  import { action } from "@multiplatform.one/storybook";
8
9
  import {
@@ -18,7 +19,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
18
19
  import React from "react";
19
20
  // Catalog Button (LC-56 story honesty): stories compose catalog controls, never raw tamagui ones.
20
21
  import { Button, Switch } from "@multiplatform.one/forms";
21
- import { Text, XStack, YStack } from "tamagui";
22
+ import { XStack, YStack } from "tamagui";
22
23
  import {
23
24
  FormSidebar,
24
25
  type SidebarMetadataEntry,
@@ -1,10 +1,10 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { action } from "@multiplatform.one/storybook";
3
3
  import { resolveChartPalette } from "@multiplatform.one/theme";
4
- import { Text } from "tamagui";
5
4
  import { FrappeCalendar } from "./FrappeCalendar";
6
5
  import { FrappeProvider } from "./FrappeProvider";
7
6
  import { FrappeStoryProvider } from "./frappeStoryTarget";
7
+ import { Text } from "@multiplatform.one/components";
8
8
 
9
9
  // hex-escape: Frappe sends column, event and series colours as hex: fixture data, not paint
10
10
 
@@ -3,10 +3,11 @@ import {
3
3
  eventChipTextColor,
4
4
  type CalendarEvent,
5
5
  type CalendarEventMoveRange,
6
+ Text,
6
7
  } from "@multiplatform.one/components";
7
8
  import { Spinner, formCommonColors } from "@multiplatform.one/forms";
8
9
  import React, { useMemo, useCallback, useState, type ReactNode } from "react";
9
- import { Text, YStack, type YStackProps } from "tamagui";
10
+ import { Text as TamaguiText, YStack, type YStackProps } from "tamagui";
10
11
  import { useTranslation } from "react-i18next";
11
12
  import {
12
13
  formatCalendarDate,
@@ -221,13 +222,13 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
221
222
  // was invisible on light fills and failed AA on mid-tone doc colors.
222
223
  const defaultEventContent = useCallback(
223
224
  (calEvent: CalendarEvent): ReactNode => (
224
- <Text
225
+ <TamaguiText
225
226
  numberOfLines={2}
226
227
  color={eventChipTextColor(calEvent.color, onIdentity)}
227
228
  {...knobProps.label}
228
229
  >
229
230
  {calEvent.title}
230
- </Text>
231
+ </TamaguiText>
231
232
  ),
232
233
  [knobProps.label, onIdentity],
233
234
  );
@@ -282,9 +283,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
282
283
  return (
283
284
  <YStack {...knobProps.panelPadding} alignItems="center" gap="$2" {...stackProps}>
284
285
  <Spinner size="large" />
285
- <Text color={formCommonColors.muted} {...knobProps.body}>
286
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
286
287
  {t("Loading {{doctype}}...", { doctype })}
287
- </Text>
288
+ </TamaguiText>
288
289
  </YStack>
289
290
  );
290
291
  }
@@ -294,9 +295,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
294
295
  return (
295
296
  <YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
296
297
  <Text color={formCommonColors.error}>{t("Error loading {{doctype}}", { doctype })}</Text>
297
- <Text color={formCommonColors.muted} {...knobProps.body}>
298
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
298
299
  {queryError.message}
299
- </Text>
300
+ </TamaguiText>
300
301
  </YStack>
301
302
  );
302
303
  }
@@ -313,9 +314,9 @@ export function FrappeCalendar<TDoc extends { name: string; doctype: string }>({
313
314
  borderWidth={1}
314
315
  >
315
316
  <Text color={formCommonColors.error}>{t("Action failed")}</Text>
316
- <Text color={formCommonColors.muted} {...knobProps.body}>
317
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
317
318
  {actionError.message}
318
- </Text>
319
+ </TamaguiText>
319
320
  </YStack>
320
321
  )}
321
322
  <Calendar
@@ -1,8 +1,9 @@
1
- import { Text, YStack } from "tamagui";
1
+ import { YStack } from "tamagui";
2
2
  import {
3
3
  FrappeConnectionIndicator,
4
4
  type FrappeConnectionIndicatorProps,
5
5
  } from "./FrappeConnectionIndicator";
6
+ import { Text } from "@multiplatform.one/components";
6
7
 
7
8
  export default {
8
9
  title: "FrappeUI/FrappeConnectionIndicator",
@@ -6,7 +6,8 @@ import {
6
6
  import { radiusClassProps, useResolvedKnobs } from "@multiplatform.one/theme";
7
7
  import React from "react";
8
8
  import { useTranslation } from "react-i18next";
9
- import { Text, XStack, YStack } from "tamagui";
9
+ import { XStack, YStack } from "tamagui";
10
+ import { Text } from "@multiplatform.one/components";
10
11
 
11
12
  export interface FrappeConnectionIndicatorProps {
12
13
  /** The same connection config the sibling collection hooks use. */
@@ -1,6 +1,6 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
- import { KPICard, ChartCard, type DashboardWidget } from "@multiplatform.one/components";
3
- import { Text, YStack } from "tamagui";
2
+ import { KPICard, ChartCard, type DashboardWidget, Text } from "@multiplatform.one/components";
3
+ import { YStack } from "tamagui";
4
4
  import { FrappeDashboard } from "./FrappeDashboard";
5
5
  import { FrappeProvider } from "./FrappeProvider";
6
6
  import { FrappeStoryProvider } from "./frappeStoryTarget";
@@ -1,10 +1,10 @@
1
1
  import { useFrappeDoctypeEvents } from "@multiplatform.one/frappe";
2
- import { Dashboard, type DashboardWidget } from "@multiplatform.one/components";
2
+ import { Dashboard, type DashboardWidget, Text } from "@multiplatform.one/components";
3
3
  import { Button, Spinner, formCommonColors } from "@multiplatform.one/forms";
4
4
  import { ArrowsClockwiseIcon } from "@phosphor-icons/react";
5
5
  import React, { useMemo, useCallback, useState, useEffect, useRef } from "react";
6
6
  import { useTranslation } from "react-i18next";
7
- import { Text, XStack, YStack, type YStackProps, H3 } from "tamagui";
7
+ import { Text as TamaguiText, XStack, YStack, type YStackProps, H3 } from "tamagui";
8
8
  import { formatTimeOfDay, useResolvedKnobs } from "@multiplatform.one/theme";
9
9
  import { useFrappeConfig } from "./FrappeProvider";
10
10
  import { useFrappeRows } from "./useFrappeRows";
@@ -160,9 +160,9 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
160
160
  return (
161
161
  <YStack {...knobProps.panelPadding} alignItems="center" gap="$2" {...stackProps}>
162
162
  <Spinner size="large" />
163
- <Text color={knobProps.textAccentColor} {...knobProps.body}>
163
+ <TamaguiText color={knobProps.textAccentColor} {...knobProps.body}>
164
164
  {t("Loading dashboard...")}
165
- </Text>
165
+ </TamaguiText>
166
166
  </YStack>
167
167
  );
168
168
  }
@@ -173,9 +173,9 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
173
173
  return (
174
174
  <YStack {...knobProps.panelPadding} alignItems="center" {...stackProps} {...knobProps.gap}>
175
175
  <Text color={formCommonColors.error}>{t("Failed to load dashboard")}</Text>
176
- <Text color={knobProps.textAccentColor} {...knobProps.body}>
176
+ <TamaguiText color={knobProps.textAccentColor} {...knobProps.body}>
177
177
  {err.message}
178
- </Text>
178
+ </TamaguiText>
179
179
  </YStack>
180
180
  );
181
181
  }
@@ -193,11 +193,11 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
193
193
  {showRefresh && (
194
194
  <XStack {...knobProps.gap} alignItems="center">
195
195
  {isLiveStale && <Spinner size="small" aria-label={t("Updating")} />}
196
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
196
+ <TamaguiText color={knobProps.textAccentColor} {...knobProps.label}>
197
197
  {t("Last updated: {{time}}", {
198
198
  time: formatTimeOfDay(dataUpdatedAt ?? lastRefresh),
199
199
  })}
200
- </Text>
200
+ </TamaguiText>
201
201
  {/* LC-54 (amendment 2026-08-13): house Button, own-box floor —
202
202
  the raw tamagui Button + grown transparent target painted
203
203
  its hover fill across the escaped 44px floor. `circular`
@@ -321,9 +321,9 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
321
321
  {title ? <H3 {...knobProps.heading}>{title}</H3> : <YStack flex={1} />}
322
322
  <XStack {...knobProps.gap} alignItems="center">
323
323
  {autoRefresh && (
324
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
324
+ <TamaguiText color={knobProps.textAccentColor} {...knobProps.label}>
325
325
  {t("Last updated: {{time}}", { time: formatTimeOfDay(lastRefresh) })}
326
- </Text>
326
+ </TamaguiText>
327
327
  )}
328
328
  {/* LC-54: house Button, own-box floor (see the live-path refresh). */}
329
329
  <Button
@@ -376,7 +376,9 @@ describe("a submittable doctype's routed pages", () => {
376
376
  expect(screen.getByText("Submit")).toBeTruthy();
377
377
  expect(screen.queryByText("Save")).toBeNull();
378
378
 
379
- fireEvent.click(screen.getByText("Edit"));
379
+ // LC-145: Submit is the bar's one action, so Edit rides the "…" menu.
380
+ fireEvent.click(screen.getByTestId("frappe-form-menu"));
381
+ fireEvent.click(await screen.findByRole("menuitem", { name: "Edit" }));
380
382
  expect(pushed).toEqual(["/loans/LOAN-DRAFT/edit"]);
381
383
  });
382
384
 
@@ -9,21 +9,22 @@ import {
9
9
  AsyncSkeleton,
10
10
  DetailPageLayout,
11
11
  EmptyState,
12
+ PageBackButton,
12
13
  PageHeader,
13
14
  ScrollView,
14
15
  Tabs,
15
16
  type TabsItem,
17
+ Text,
16
18
  } from "@multiplatform.one/components";
17
19
  import { SchemaForm, type FieldOverride, type SchemaFormProps } from "./schemaForm";
18
20
  import type { HeadingLevel } from "./fields/Heading";
19
21
  import { FormSidebar, type SidebarSection, type SidebarMetadataEntry } from "./FormSidebar";
20
- import { ArrowLeftIcon } from "@phosphor-icons/react";
21
22
  import type React from "react";
22
23
  import { useEffect, useMemo, useState } from "react";
23
24
  import type { TFunction } from "i18next";
24
25
  import { useTranslation } from "react-i18next";
25
26
  import { Button, Input, formCommonColors } from "@multiplatform.one/forms";
26
- import { Text, XStack, YStack } from "tamagui";
27
+ import { Text as TamaguiText, XStack, YStack } from "tamagui";
27
28
  import { hairlineWidth, useResolvedKnobs } from "@multiplatform.one/theme";
28
29
  import { useFrappeConfig } from "./FrappeProvider";
29
30
  import { FrappeReconnectIndicator } from "./FrappeReconnectIndicator";
@@ -37,7 +38,12 @@ import {
37
38
  resolveDocAction,
38
39
  resolveDocIndicator,
39
40
  } from "./formEngine/docLifecycle";
40
- import { FrappeFormActions, FrappeFormActionsBar, FrappeFormIndicator } from "./FrappeFormActions";
41
+ import {
42
+ FrappeFormActions,
43
+ FrappeFormActionsBar,
44
+ FrappeFormHeaderActions,
45
+ FrappeFormIndicator,
46
+ } from "./FrappeFormActions";
41
47
  import { connectionFields, connectionsFromMeta, type FrappeConnection } from "./frappeConnections";
42
48
  import { FrappeFormConnections } from "./FrappeFormConnections";
43
49
  import { FrappeNotConfigured } from "./FrappeNotConfigured";
@@ -185,6 +191,26 @@ export interface FrappeFormProps<TDoc extends { name: string; doctype: string }>
185
191
  * scrolls. Defaults to on for a routed page.
186
192
  */
187
193
  stickyActions?: boolean;
194
+ /**
195
+ * Renders the form as its own detail page (LC-29): back in the top bar's
196
+ * leading slot and the record's actions beside it on the same row
197
+ * (LC-145), the title directly under the bar with the state chip under
198
+ * it, and `aside` as the supporting pane.
199
+ */
200
+ page?: FrappeFormPage;
201
+ }
202
+
203
+ export interface FrappeFormPage {
204
+ back: {
205
+ /** Where back goes (the list's name), beside the caret. */
206
+ label: string;
207
+ onPress: () => void;
208
+ "aria-label"?: string;
209
+ testID?: string;
210
+ };
211
+ /** The page title. Defaults to the record's title field, else its name. */
212
+ title?: string;
213
+ aside?: React.ReactNode;
188
214
  }
189
215
 
190
216
  /**
@@ -466,6 +492,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
466
492
  notFoundFallback,
467
493
  errorFallback,
468
494
  routePage,
495
+ page,
469
496
  }: FrappeFormBodyProps<TDoc> & { form: FrappeFormController<TDoc> }) {
470
497
  const { knobProps } = useResolvedKnobs();
471
498
  const { t } = useTranslation();
@@ -625,10 +652,26 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
625
652
  const titleValue = titleField ? (localDoc as Record<string, unknown>)[titleField] : undefined;
626
653
  const pageTitle = isCreate ? t("New {{doctype}}", { doctype }) : String(titleValue || name);
627
654
  const editing = Boolean(routePage) && !onEdit;
655
+ const pageChrome: FrappeFormPage | undefined =
656
+ page ??
657
+ (routePage && !editing
658
+ ? {
659
+ back: {
660
+ label: doctype,
661
+ onPress: routePage.onBack,
662
+ "aria-label": t("Back to {{doctype}} list", { doctype }),
663
+ },
664
+ }
665
+ : undefined);
628
666
  const frame = (
629
667
  content: React.ReactNode,
630
668
  aside?: React.ReactNode,
631
- chrome?: { badge?: React.ReactNode; footer?: React.ReactNode },
669
+ chrome?: {
670
+ badge?: React.ReactNode;
671
+ footer?: React.ReactNode;
672
+ actions?: React.ReactNode;
673
+ status?: React.ReactNode;
674
+ },
632
675
  ) =>
633
676
  routePage && editing ? (
634
677
  <YStack flex={1} backgroundColor="$background" testID="frappe-form-route-editor">
@@ -681,24 +724,28 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
681
724
  </FrappeFormActionsBar>
682
725
  ) : null}
683
726
  </YStack>
684
- ) : routePage ? (
685
- // flexBasis auto: see DeskFormPage (react-native-web's min-height:0
686
- // reset would cap the scroll page at viewport height).
727
+ ) : pageChrome ? (
728
+ // flexBasis auto: react-native-web's min-height:0 reset would cap the
729
+ // scroll page at viewport height and crush the form.
687
730
  <DetailPageLayout
688
731
  flexBasis="auto"
689
732
  toolbarLeading={
690
- <Button
691
- size="$3"
692
- chromeless
693
- icon={ArrowLeftIcon}
694
- onPress={routePage.onBack}
695
- aria-label={t("Back to {{doctype}} list", { doctype })}
696
- >
697
- {doctype}
698
- </Button>
733
+ <PageBackButton
734
+ label={pageChrome.back.label}
735
+ onPress={pageChrome.back.onPress}
736
+ aria-label={pageChrome.back["aria-label"]}
737
+ testID={pageChrome.back.testID}
738
+ />
699
739
  }
700
- header={<PageHeader title={pageTitle} divider={false} />}
701
- aside={aside}
740
+ toolbarTrailing={chrome?.actions}
741
+ header={
742
+ <PageHeader
743
+ title={pageChrome.title ?? pageTitle}
744
+ status={chrome?.status}
745
+ divider={false}
746
+ />
747
+ }
748
+ aside={pageChrome.aside ?? aside}
702
749
  >
703
750
  {content}
704
751
  </DetailPageLayout>
@@ -786,12 +833,12 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
786
833
  if (notFoundFallback !== undefined) return frame(notFoundFallback);
787
834
  return frame(
788
835
  <YStack {...knobProps.panelPadding} alignItems="center" {...knobProps.gap}>
789
- <Text color={formCommonColors.error} {...knobProps.body}>
836
+ <TamaguiText color={formCommonColors.error} {...knobProps.body}>
790
837
  {t("{{doctype}} not found", { doctype })}
791
- </Text>
792
- <Text color={formCommonColors.muted} {...knobProps.body}>
838
+ </TamaguiText>
839
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
793
840
  {t("Document {{name}} does not exist or could not be loaded.", { name })}
794
- </Text>
841
+ </TamaguiText>
795
842
  </YStack>,
796
843
  );
797
844
  }
@@ -926,7 +973,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
926
973
  backgroundColor="$red3"
927
974
  testID="frappe-form-deleted-banner"
928
975
  >
929
- <Text color={formCommonColors.error} {...knobProps.body}>
976
+ <TamaguiText color={formCommonColors.error} {...knobProps.body}>
930
977
  {hasUnsavedChanges
931
978
  ? t(
932
979
  "This {{doctype}} was deleted on the server. Fields are read-only and your unsaved edits can no longer be saved.",
@@ -935,7 +982,7 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
935
982
  : t("This {{doctype}} was deleted on the server. Fields are read-only.", {
936
983
  doctype,
937
984
  })}
938
- </Text>
985
+ </TamaguiText>
939
986
  </XStack>
940
987
  )}
941
988
 
@@ -948,12 +995,12 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
948
995
  backgroundColor="$orange3"
949
996
  testID="frappe-form-conflict-banner"
950
997
  >
951
- <Text color="$orange11" {...knobProps.body}>
998
+ <TamaguiText color="$orange11" {...knobProps.body}>
952
999
  {t(
953
1000
  "Changed elsewhere while you were editing: {{fields}}. Your edits are kept — saving will overwrite the newer server values.",
954
1001
  { fields: conflictLabels },
955
1002
  )}
956
- </Text>
1003
+ </TamaguiText>
957
1004
  </XStack>
958
1005
  )}
959
1006
 
@@ -999,20 +1046,21 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
999
1046
  ) : (
1000
1047
  // Metadata unavailable (should be covered by metaError branch above)
1001
1048
  <YStack {...knobProps.panelPadding} alignItems="center">
1002
- <Text color={formCommonColors.muted} {...knobProps.body}>
1049
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
1003
1050
  {t("Form schema unavailable")}
1004
- </Text>
1051
+ </TamaguiText>
1005
1052
  </YStack>
1006
1053
  )}
1007
1054
 
1008
1055
  {errors.general && (
1009
- <Text color={formCommonColors.error} {...knobProps.body} role="alert">
1056
+ <TamaguiText color={formCommonColors.error} {...knobProps.body} role="alert">
1010
1057
  {errors.general}
1011
- </Text>
1058
+ </TamaguiText>
1012
1059
  )}
1013
1060
 
1014
- {/* A routed editor carries its actions in the page footer instead. */}
1015
- {toolbarShown && !editing && (
1061
+ {/* A routed editor carries its actions in the page footer, a
1062
+ detail page in its top bar. */}
1063
+ {toolbarShown && !editing && !pageChrome && (
1016
1064
  <FrappeFormActionsBar sticky={stickyActions}>
1017
1065
  <FrappeFormActions
1018
1066
  indicator={indicator}
@@ -1040,12 +1088,11 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
1040
1088
  )}
1041
1089
  </YStack>,
1042
1090
  routePage && !editing ? sidebar : undefined,
1043
- editing
1091
+ pageChrome && !editing
1044
1092
  ? {
1045
- badge: indicator ? <FrappeFormIndicator indicator={indicator} /> : null,
1046
- footer: toolbarShown ? (
1047
- <FrappeFormActions
1048
- placement="footer"
1093
+ status: indicator ? <FrappeFormIndicator indicator={indicator} /> : undefined,
1094
+ actions: toolbarShown ? (
1095
+ <FrappeFormHeaderActions
1049
1096
  action={docAction}
1050
1097
  busy={isSubmitting}
1051
1098
  disabled={effectiveDisabled}
@@ -1055,11 +1102,32 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
1055
1102
  onAmend={showAmend ? handleAmend : undefined}
1056
1103
  amendedAs={amendedAs}
1057
1104
  onDelete={showDelete ? handleDelete : undefined}
1105
+ onEdit={showEdit ? onEdit : undefined}
1058
1106
  onClose={showClose ? handleCancel : undefined}
1059
1107
  closeDisabled={disabled}
1060
1108
  />
1061
1109
  ) : null,
1062
1110
  }
1063
- : undefined,
1111
+ : editing
1112
+ ? {
1113
+ badge: indicator ? <FrappeFormIndicator indicator={indicator} /> : null,
1114
+ footer: toolbarShown ? (
1115
+ <FrappeFormActions
1116
+ placement="footer"
1117
+ action={docAction}
1118
+ busy={isSubmitting}
1119
+ disabled={effectiveDisabled}
1120
+ onSave={handleSave}
1121
+ onSubmit={handleSubmitDocument}
1122
+ onCancelDocument={handleCancelDocument}
1123
+ onAmend={showAmend ? handleAmend : undefined}
1124
+ amendedAs={amendedAs}
1125
+ onDelete={showDelete ? handleDelete : undefined}
1126
+ onClose={showClose ? handleCancel : undefined}
1127
+ closeDisabled={disabled}
1128
+ />
1129
+ ) : null,
1130
+ }
1131
+ : undefined,
1064
1132
  );
1065
1133
  }