@multiplatform.one/frappe-ui 7.46.0 → 7.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -1,4 +1,10 @@
1
- import { Chip, type ChipColor } from "@multiplatform.one/components";
1
+ import {
2
+ Chip,
3
+ DropdownMenu,
4
+ PageMenuButton,
5
+ type ChipColor,
6
+ type DropdownMenuEntry,
7
+ } from "@multiplatform.one/components";
2
8
  import { Button, zIndex } from "@multiplatform.one/forms";
3
9
  import { useResolvedKnobs } from "@multiplatform.one/theme";
4
10
  import {
@@ -235,6 +241,159 @@ export function FrappeFormActions({
235
241
  );
236
242
  }
237
243
 
244
+ /**
245
+ * The record's actions in the page's top bar (LC-123, LC-145): the one
246
+ * lifecycle action the document's state offers as the bar's button, and
247
+ * everything else (Delete, Cancel Document, the leave action) in the "…"
248
+ * menu at the trailing edge, so back, the action and "…" share one row.
249
+ */
250
+ export function FrappeFormHeaderActions({
251
+ action,
252
+ busy,
253
+ disabled,
254
+ onSave,
255
+ onSubmit,
256
+ onCancelDocument,
257
+ onAmend,
258
+ amendedAs,
259
+ onDelete,
260
+ onEdit,
261
+ onClose,
262
+ closeDisabled,
263
+ }: Omit<FrappeFormActionsProps, "indicator" | "placement">) {
264
+ const { t } = useTranslation();
265
+ const { knobProps } = useResolvedKnobs();
266
+ const iconSize = Number(knobProps.controlIcon?.width) || 16;
267
+ const readOnlyReason = t("Form is read-only");
268
+ const blocked = disabled ? { disabledReason: readOnlyReason } : {};
269
+
270
+ const primary =
271
+ action === "save" || action === "update" ? (
272
+ <Button
273
+ accent
274
+ loading={busy}
275
+ disabled={disabled}
276
+ disabledReason={disabled ? readOnlyReason : undefined}
277
+ disabledReasonPlacement="inline"
278
+ onPress={onSave}
279
+ testID="frappe-form-save"
280
+ >
281
+ {busy ? t("Saving...") : action === "update" ? t("Update") : t("Save")}
282
+ </Button>
283
+ ) : action === "submit" ? (
284
+ <Button
285
+ accent
286
+ loading={busy}
287
+ disabled={disabled}
288
+ disabledReason={disabled ? readOnlyReason : undefined}
289
+ disabledReasonPlacement="inline"
290
+ onPress={onSubmit}
291
+ testID="frappe-form-submit"
292
+ >
293
+ {t("Submit")}
294
+ </Button>
295
+ ) : action === "amend" && onAmend ? (
296
+ <Button
297
+ accent={!amendedAs}
298
+ outlined={Boolean(amendedAs)}
299
+ loading={busy}
300
+ disabled={disabled || Boolean(amendedAs)}
301
+ disabledReason={
302
+ amendedAs
303
+ ? t("Already amended as {{name}}", { name: amendedAs })
304
+ : disabled
305
+ ? readOnlyReason
306
+ : undefined
307
+ }
308
+ disabledReasonPlacement="inline"
309
+ onPress={onAmend}
310
+ testID="frappe-form-amend"
311
+ >
312
+ {t("Amend")}
313
+ </Button>
314
+ ) : onEdit ? (
315
+ <Button
316
+ accent
317
+ disabled={disabled}
318
+ disabledReason={disabled ? readOnlyReason : undefined}
319
+ disabledReasonPlacement="inline"
320
+ onPress={onEdit}
321
+ testID="frappe-form-edit"
322
+ >
323
+ {t("Edit")}
324
+ </Button>
325
+ ) : null;
326
+
327
+ const lifecyclePrimary =
328
+ action === "save" ||
329
+ action === "update" ||
330
+ action === "submit" ||
331
+ (action === "amend" && Boolean(onAmend));
332
+ const entries: DropdownMenuEntry[] = [
333
+ ...(onEdit && lifecyclePrimary
334
+ ? [
335
+ {
336
+ key: "edit",
337
+ label: t("Edit"),
338
+ icon: <PencilSimpleIcon size={iconSize} />,
339
+ disabled,
340
+ ...blocked,
341
+ onSelect: onEdit,
342
+ },
343
+ ]
344
+ : []),
345
+ ...(action === "cancel"
346
+ ? [
347
+ {
348
+ key: "cancel-document",
349
+ label: t("Cancel Document"),
350
+ icon: <ProhibitIcon size={iconSize} />,
351
+ destructive: true,
352
+ disabled: disabled || busy,
353
+ ...blocked,
354
+ onSelect: onCancelDocument,
355
+ },
356
+ ]
357
+ : []),
358
+ ...(onClose
359
+ ? [
360
+ {
361
+ key: "close",
362
+ label: action === "cancel" ? t("Close") : t("Cancel"),
363
+ icon: <XIcon size={iconSize} />,
364
+ disabled: closeDisabled,
365
+ ...(closeDisabled ? { disabledReason: readOnlyReason } : {}),
366
+ onSelect: onClose,
367
+ },
368
+ ]
369
+ : []),
370
+ ...(onDelete
371
+ ? [
372
+ {
373
+ key: "delete",
374
+ label: t("Delete"),
375
+ icon: <TrashIcon size={iconSize} />,
376
+ destructive: true,
377
+ disabled: disabled || busy,
378
+ ...blocked,
379
+ onSelect: onDelete,
380
+ },
381
+ ]
382
+ : []),
383
+ ];
384
+
385
+ return (
386
+ <XStack {...knobProps.gap} alignItems="center" testID="frappe-form-actions">
387
+ {primary}
388
+ {entries.length > 0 ? (
389
+ <DropdownMenu items={entries} placement="bottom-end">
390
+ <PageMenuButton edge="end" testID="frappe-form-menu" />
391
+ </DropdownMenu>
392
+ ) : null}
393
+ </XStack>
394
+ );
395
+ }
396
+
238
397
  /**
239
398
  * Holds the action bar. Sticky, it pins to the bottom of the scrolling page
240
399
  * on a page surface with a top hairline, so Save stays in reach on a long
@@ -66,7 +66,7 @@ const insights: FrappeInsightsProps<RosterPokemon> = {
66
66
  orderBy: "slot",
67
67
  label: "Type",
68
68
  options: ["grass", "poison", "fire", "water", "electric", "ghost", "normal"],
69
- tint: (type) => (type === "fire" ? "tomato" : undefined),
69
+ tint: (type) => (type === "fire" ? "orange" : undefined),
70
70
  },
71
71
  facetPlural: "Types",
72
72
  metrics: [
@@ -176,7 +176,10 @@ export function FrappeInsights<TDoc extends { name: string; doctype: string }>({
176
176
  code: (doc) => latest.current.look?.code?.(doc) || undefined,
177
177
  images: (doc) => latest.current.look?.images?.(doc, baseURL) ?? [],
178
178
  values: (doc) => values.get(doc.name) ?? [],
179
- tints: (doc) => (values.get(doc.name) ?? []).map((value) => facet?.tint?.(value)),
179
+ tint: (doc) => {
180
+ const primary = values.get(doc.name)?.[0];
181
+ return primary === undefined ? undefined : facet?.tint?.(primary);
182
+ },
180
183
  valueLabel: (value) => facet?.optionLabel?.(value) ?? value,
181
184
  valueTint: (value) => facet?.tint?.(value),
182
185
  open: (doc) =>
@@ -1,9 +1,10 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { action } from "@multiplatform.one/storybook";
3
- import { Text, YStack } from "tamagui";
3
+ import { YStack } from "tamagui";
4
4
  import { FrappeKanban, type KanbanColumn } from "./FrappeKanban";
5
5
  import { FrappeProvider } from "./FrappeProvider";
6
6
  import { FrappeStoryProvider } from "./frappeStoryTarget";
7
+ import { Text } from "@multiplatform.one/components";
7
8
 
8
9
  // hex-escape: Frappe sends column, event and series colours as hex: fixture data, not paint
9
10
 
@@ -3,12 +3,13 @@ import {
3
3
  componentColors,
4
4
  type KanbanColumn as GenericKanbanColumn,
5
5
  type KanbanProps,
6
+ Text,
6
7
  } from "@multiplatform.one/components";
7
8
  import { Button, formCommonColors } from "@multiplatform.one/forms";
8
9
  import { PlusIcon } from "@phosphor-icons/react";
9
10
  import React, { useMemo, useCallback, useState } from "react";
10
11
  import { useTranslation } from "react-i18next";
11
- import { Text, XStack, YStack } from "tamagui";
12
+ import { Text as TamaguiText, XStack, YStack } from "tamagui";
12
13
 
13
14
  import { useResolvedKnobs } from "@multiplatform.one/theme";
14
15
  import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
@@ -204,13 +205,13 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
204
205
  : undefined;
205
206
  return (
206
207
  <YStack {...knobProps.panelPadding} {...knobProps.gap}>
207
- <Text {...knobProps.label} {...knobProps.textWeight}>
208
+ <TamaguiText {...knobProps.label} {...knobProps.textWeight}>
208
209
  {(title as React.ReactNode) || item.name}
209
- </Text>
210
+ </TamaguiText>
210
211
  {desc != null && desc !== "" && (
211
- <Text color={formCommonColors.muted} {...knobProps.body}>
212
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
212
213
  {String(desc)}
213
- </Text>
214
+ </TamaguiText>
214
215
  )}
215
216
  </YStack>
216
217
  );
@@ -316,9 +317,9 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
316
317
  borderWidth={1}
317
318
  >
318
319
  <Text color={formCommonColors.error}>{t("Action failed")}</Text>
319
- <Text color={formCommonColors.muted} {...knobProps.body}>
320
+ <TamaguiText color={formCommonColors.muted} {...knobProps.body}>
320
321
  {actionError.message}
321
- </Text>
322
+ </TamaguiText>
322
323
  </YStack>
323
324
  )}
324
325
  <Kanban
@@ -1,9 +1,10 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { action } from "@multiplatform.one/storybook";
3
- import { Text, XStack, YStack } from "tamagui";
3
+ import { XStack, YStack } from "tamagui";
4
4
  import { FrappeList } from "./FrappeList";
5
5
  import { FrappeProvider } from "./FrappeProvider";
6
6
  import { FrappeStoryProvider } from "./frappeStoryTarget";
7
+ import { Text } from "@multiplatform.one/components";
7
8
 
8
9
  export default {
9
10
  title: "FrappeUI/FrappeList",
@@ -124,13 +125,13 @@ export const Default = () => (
124
125
  renderItem={(doc) => (
125
126
  <YStack gap="$0.5" paddingVertical="$2" paddingHorizontal="$3">
126
127
  <XStack gap="$2" alignItems="center">
127
- <Text fontSize="$2" color="$color10" minWidth={80}>
128
+ <Text fontSize="$2" color="$color10" minWidth="$8">
128
129
  Task:
129
130
  </Text>
130
131
  <Text fontSize="$3">{doc.description || "-"}</Text>
131
132
  </XStack>
132
133
  <XStack gap="$2" alignItems="center">
133
- <Text fontSize="$2" color="$color10" minWidth={80}>
134
+ <Text fontSize="$2" color="$color10" minWidth="$8">
134
135
  Status:
135
136
  </Text>
136
137
  <Text fontSize="$3">{doc.status || "-"}</Text>
@@ -160,13 +161,13 @@ export const WithCustomFieldRenderer = () => (
160
161
  renderItem={(doc) => (
161
162
  <YStack gap="$0.5" paddingVertical="$2" paddingHorizontal="$3">
162
163
  <XStack gap="$2" alignItems="center">
163
- <Text fontSize="$2" color="$color10" minWidth={80}>
164
+ <Text fontSize="$2" color="$color10" minWidth="$8">
164
165
  Task:
165
166
  </Text>
166
167
  <Text fontSize="$3">{doc.description || "-"}</Text>
167
168
  </XStack>
168
169
  <XStack gap="$2" alignItems="center">
169
- <Text fontSize="$2" color="$color10" minWidth={80}>
170
+ <Text fontSize="$2" color="$color10" minWidth="$8">
170
171
  Status:
171
172
  </Text>
172
173
  <Text
@@ -186,7 +187,7 @@ export const WithCustomFieldRenderer = () => (
186
187
  </Text>
187
188
  </XStack>
188
189
  <XStack gap="$2" alignItems="center">
189
- <Text fontSize="$2" color="$color10" minWidth={80}>
190
+ <Text fontSize="$2" color="$color10" minWidth="$8">
190
191
  Priority:
191
192
  </Text>
192
193
  <Text fontSize="$3">{doc.priority || "-"}</Text>
@@ -324,25 +325,25 @@ export const VirtualScrolling = () => (
324
325
  renderItem={(doc) => (
325
326
  <YStack gap="$0.5" paddingVertical="$2" paddingHorizontal="$3">
326
327
  <XStack gap="$2" alignItems="center">
327
- <Text fontSize="$2" color="$color10" minWidth={80}>
328
+ <Text fontSize="$2" color="$color10" minWidth="$8">
328
329
  ID:
329
330
  </Text>
330
331
  <Text fontSize="$3">{doc.name || "-"}</Text>
331
332
  </XStack>
332
333
  <XStack gap="$2" alignItems="center">
333
- <Text fontSize="$2" color="$color10" minWidth={80}>
334
+ <Text fontSize="$2" color="$color10" minWidth="$8">
334
335
  Task:
335
336
  </Text>
336
337
  <Text fontSize="$3">{doc.description || "-"}</Text>
337
338
  </XStack>
338
339
  <XStack gap="$2" alignItems="center">
339
- <Text fontSize="$2" color="$color10" minWidth={80}>
340
+ <Text fontSize="$2" color="$color10" minWidth="$8">
340
341
  Status:
341
342
  </Text>
342
343
  <Text fontSize="$3">{doc.status || "-"}</Text>
343
344
  </XStack>
344
345
  <XStack gap="$2" alignItems="center">
345
- <Text fontSize="$2" color="$color10" minWidth={80}>
346
+ <Text fontSize="$2" color="$color10" minWidth="$8">
346
347
  Priority:
347
348
  </Text>
348
349
  <Text fontSize="$3">{doc.priority || "-"}</Text>
@@ -84,7 +84,7 @@ function renderList(navigate = vi.fn()) {
84
84
  label: "Type",
85
85
  options: ["grass", "poison", "fire", "water", "electric", "ghost", "normal"],
86
86
  optionLabel: (value) => `type:${value}`,
87
- tint: (value) => (value === "grass" ? "grass" : "purple"),
87
+ tint: (value) => (value === "grass" ? "green" : "purple"),
88
88
  },
89
89
  ]}
90
90
  />
@@ -95,7 +95,7 @@ function renderList(navigate = vi.fn()) {
95
95
  orderBy: "slot",
96
96
  label: "Type",
97
97
  options: ["grass", "poison", "fire", "water", "electric", "ghost", "normal"],
98
- tint: (value) => (value === "grass" ? "grass" : "purple"),
98
+ tint: (value) => (value === "grass" ? "green" : "purple"),
99
99
  },
100
100
  ]}
101
101
  bands={[
@@ -820,7 +820,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
820
820
  subtitle={look?.subtitle?.(doc)}
821
821
  code={look?.code?.(doc)}
822
822
  images={look?.images?.(doc, finalBaseURL) ?? []}
823
- tints={values.slice(0, 2).map((value) => tintFacet?.tint?.(value))}
823
+ tint={values[0] === undefined ? undefined : tintFacet?.tint?.(values[0])}
824
824
  badges={values.map((value) => ({
825
825
  value,
826
826
  label: tintFacet?.optionLabel?.(value) ?? value,
@@ -1,6 +1,7 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
- import { Text, YStack } from "tamagui";
2
+ import { YStack } from "tamagui";
3
3
  import { FrappeProvider, useFrappeConfig } from "./FrappeProvider";
4
+ import { Text } from "@multiplatform.one/components";
4
5
 
5
6
  export default {
6
7
  title: "FrappeUI/FrappeProvider",
@@ -1,8 +1,9 @@
1
- import { Text, YStack } from "tamagui";
1
+ import { YStack } from "tamagui";
2
2
  import {
3
3
  FrappeReconnectIndicator,
4
4
  type FrappeReconnectIndicatorProps,
5
5
  } from "./FrappeReconnectIndicator";
6
+ import { Text } from "@multiplatform.one/components";
6
7
 
7
8
  export default {
8
9
  title: "FrappeUI/FrappeReconnectIndicator",
@@ -6,7 +6,8 @@ import {
6
6
  import { useResolvedKnobs } from "@multiplatform.one/theme";
7
7
  import { WifiSlashIcon } from "@phosphor-icons/react";
8
8
  import { useTranslation } from "react-i18next";
9
- import { Text, XStack } from "tamagui";
9
+ import { XStack } from "tamagui";
10
+ import { Text } from "@multiplatform.one/components";
10
11
 
11
12
  export interface FrappeReconnectIndicatorProps {
12
13
  /** The connection config the component's live queries sync through. */
@@ -1,8 +1,8 @@
1
- import { Button } from "@multiplatform.one/components";
1
+ import { Button, Text } from "@multiplatform.one/components";
2
2
  import { useResolvedKnobs } from "@multiplatform.one/theme";
3
3
  import React from "react";
4
4
  import { useTranslation } from "react-i18next";
5
- import { Text, XStack } from "tamagui";
5
+ import { XStack } from "tamagui";
6
6
 
7
7
  export interface SyncErrorNoticeProps {
8
8
  /** Human-readable failure message (already localized by the caller). */
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * DeskFormPage - Page component for Frappe Desk form views.
3
3
  *
4
- * Composes the canonical `DetailPageLayout` page template (LC-29
5
- * PAGE-TEMPLATE) inside DeskShell: back toolbar, PageHeader (the page's
6
- * single h1, DG-A11Y-02), the schema-driven FrappeForm as the primary
7
- * content, and the live document sidebar in the template's `aside` slot —
8
- * side-by-side (⅔ / ⅓) from `expanded` up, stacked below the form on
9
- * compact/medium, never hidden.
4
+ * Renders FrappeForm in its page mode inside DeskShell: the canonical
5
+ * `DetailPageLayout` template (LC-29 PAGE-TEMPLATE) with back, the record's
6
+ * actions and "…" in one top bar (LC-145), the page's single h1
7
+ * (DG-A11Y-02), the schema-driven form as the primary content, and the live
8
+ * document sidebar in the template's `aside` slot — side-by-side (⅔ / ⅓)
9
+ * from `expanded` up, stacked below the form on compact/medium, never hidden.
10
10
  *
11
11
  * Supports both create mode (no name / name === "new") and edit mode.
12
12
  * Accepts `doctype` and `name` as props (route files read params and pass them).
@@ -18,15 +18,14 @@
18
18
 
19
19
  import React, { useEffect } from "react";
20
20
  import { useTranslation } from "react-i18next";
21
- import { Button, formCommonColors } from "@multiplatform.one/forms";
21
+ import { formCommonColors } from "@multiplatform.one/forms";
22
22
  import { Text, YStack } from "tamagui";
23
23
  import { useResolvedKnobs } from "@multiplatform.one/theme";
24
- import { ArrowLeftIcon } from "@phosphor-icons/react";
25
24
  import { DeskShell } from "./DeskShell";
26
25
  import { DeskFormSidebar } from "./DeskFormSidebar";
27
26
  import { FrappeForm } from "../FrappeForm";
28
27
  import { addToRecent } from "./DeskSidebar";
29
- import { DetailPageLayout, PageHeader, type BreadcrumbItem } from "@multiplatform.one/components";
28
+ import type { BreadcrumbItem } from "@multiplatform.one/components";
30
29
 
31
30
  // ---------------------------------------------------------------------------
32
31
  // Types
@@ -106,59 +105,40 @@ export function DeskFormPage({ doctype, name, onNavigate }: DeskFormPageProps) {
106
105
  onNavigate={handleNavigate}
107
106
  activePath={`/desk/${doctype}/${encodeURIComponent(name || "new")}`}
108
107
  >
109
- {/* LC-29 PAGE-TEMPLATE: the canonical detail-page scaffold owns scroll,
110
- max-width, toolbar/header regions, and the supporting-pane aside.
111
- flexBasis auto reaches Screen's content stack (ScreenProps rest):
112
- with react-native-web's min-height:0 reset, the default 0% basis
113
- would cap the scroll page at viewport height and crush the form. */}
114
- <DetailPageLayout
115
- flexBasis="auto"
116
- toolbarLeading={
117
- <Button
118
- size="$3"
119
- chromeless
120
- icon={ArrowLeftIcon}
121
- onPress={() => handleNavigate(`/desk/${doctype}`)}
122
- aria-label={t("Back to {{doctype}} list", { doctype: displayName })}
123
- data-testid="desk-form-back"
124
- >
125
- {displayName}
126
- </Button>
127
- }
128
- header={
129
- // DG-A11Y-02: the document name (or "New <DocType>") is the page's
130
- // single h1; schema-form section headings step to h2 below it.
131
- // Same t("New") key as the breadcrumb leaf above.
132
- <PageHeader
133
- title={isCreate ? `${t("New")} ${displayName}` : (name ?? displayName)}
134
- divider={false}
135
- />
136
- }
137
- // Edit mode: the live document sidebar rides the aside slot; the
138
- // template stacks it below the form on compact/medium (LC-29 — a
139
- // hidden aside is a VIOLATION). Create mode has no doc to describe.
140
- aside={
141
- !isCreate && name ? <DeskFormSidebar doctype={displayName} name={name} /> : undefined
142
- }
143
- >
144
- <FrappeForm
145
- doctype={displayName}
146
- name={isCreate ? undefined : name}
147
- showToolbar
148
- // The desk page owns sidebar placement via the template aside above;
149
- // FrappeForm's inline rail stays off so the sidebar renders once.
150
- showSidebar={false}
151
- showTimeline
152
- onSave={(doc) => {
153
- if (isCreate && doc.name) {
154
- handleNavigate(`/desk/${doctype}/${encodeURIComponent(doc.name)}`);
155
- }
156
- }}
157
- onCancel={() => handleNavigate(`/desk/${doctype}`)}
158
- onDelete={() => handleNavigate(`/desk/${doctype}`)}
159
- onAmend={() => handleNavigate(`/desk/${doctype}/new`)}
160
- />
161
- </DetailPageLayout>
108
+ {/* LC-29 PAGE-TEMPLATE through FrappeForm's page mode: back, the
109
+ record's actions and "…" share the top bar (LC-145), the document
110
+ name (or "New <DocType>") is the page's single h1 (DG-A11Y-02), and
111
+ the live document sidebar rides the aside slot, stacked below the
112
+ form on compact/medium, never hidden. Create mode has no doc to
113
+ describe. */}
114
+ <FrappeForm
115
+ doctype={displayName}
116
+ name={isCreate ? undefined : name}
117
+ page={{
118
+ back: {
119
+ label: displayName,
120
+ onPress: () => handleNavigate(`/desk/${doctype}`),
121
+ "aria-label": t("Back to {{doctype}} list", { doctype: displayName }),
122
+ testID: "desk-form-back",
123
+ },
124
+ title: isCreate ? `${t("New")} ${displayName}` : (name ?? displayName),
125
+ aside:
126
+ !isCreate && name ? <DeskFormSidebar doctype={displayName} name={name} /> : undefined,
127
+ }}
128
+ showToolbar
129
+ // The desk page owns sidebar placement via the page aside above;
130
+ // FrappeForm's inline rail stays off so the sidebar renders once.
131
+ showSidebar={false}
132
+ showTimeline
133
+ onSave={(doc) => {
134
+ if (isCreate && doc.name) {
135
+ handleNavigate(`/desk/${doctype}/${encodeURIComponent(doc.name)}`);
136
+ }
137
+ }}
138
+ onCancel={() => handleNavigate(`/desk/${doctype}`)}
139
+ onDelete={() => handleNavigate(`/desk/${doctype}`)}
140
+ onAmend={() => handleNavigate(`/desk/${doctype}/new`)}
141
+ />
162
142
  </DeskShell>
163
143
  );
164
144
  }
@@ -29,13 +29,15 @@ const MOCK_HOST = "https://deskformsidebar.mock.test";
29
29
  * real — the story's window.fetch shim only intercepts fetch(), never an
30
30
  * image load — and the story prints ERR_TUNNEL_CONNECTION_FAILED. A data: URI
31
31
  * goes through resolveFileUrl untouched and paints without a request, which
32
- * is what G-15 story honesty asks for (MPO-197).
32
+ * is what G-15 story honesty asks for (MPO-197). The square fills to its
33
+ * edges: corners baked into the picture would hide the frame's knob radius
34
+ * behind transparent pixels (FZ-7742).
33
35
  */
34
36
  const storyImage =
35
37
  "data:image/svg+xml;utf8," +
36
38
  encodeURIComponent(
37
39
  '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="240" viewBox="0 0 24 24">' +
38
- '<rect width="24" height="24" rx="3" fill="#4c6ef5"/>' +
40
+ '<rect width="24" height="24" fill="#4c6ef5"/>' +
39
41
  '<path d="M6 12.5l3.5 3.5L18 8" fill="none" stroke="#fff" stroke-width="2" ' +
40
42
  'stroke-linecap="round" stroke-linejoin="round"/></svg>',
41
43
  );
@@ -133,7 +133,7 @@ export function DeskShell({
133
133
  return;
134
134
  }
135
135
  if (typeof document === "undefined") return;
136
- if (document.activeElement instanceof HTMLElement) {
136
+ if (typeof HTMLElement !== "undefined" && document.activeElement instanceof HTMLElement) {
137
137
  document.activeElement.blur();
138
138
  }
139
139
  },
@@ -345,7 +345,7 @@ export function Awesomebar({ onNavigate, basePath = "/desk", ...stackProps }: Aw
345
345
  {...knobProps.control}
346
346
  {...knobProps.inputSurface}
347
347
  {...knobProps.borderRadius}
348
- borderColor={open ? "$borderColorFocus" : "$borderColor"}
348
+ borderColor={open ? "$borderColorFocus" : knobProps.borderRadius.borderColor}
349
349
  hoverStyle={{
350
350
  borderColor: "$borderColorHover",
351
351
  ...control.hoverKnobProps,
@@ -15,7 +15,7 @@
15
15
  * order, chromeless inside table cells (useIsInTableCell).
16
16
  */
17
17
 
18
- import { HighlightedCode, useShikiTokens } from "@multiplatform.one/components";
18
+ import { HighlightedCode, useShikiTokens, Paragraph } from "@multiplatform.one/components";
19
19
  import {
20
20
  Field,
21
21
  FieldLayout,
@@ -33,7 +33,7 @@ import { sizeRecipeForToken, useResolvedKnobs, sizeTokenStep } from "@multiplatf
33
33
  import { useEffect, useState, type ReactNode } from "react";
34
34
  import { useTranslation } from "react-i18next";
35
35
  import type { FontSizeTokens, LabelProps, SizeTokens } from "tamagui";
36
- import { Paragraph, YStack } from "tamagui";
36
+ import { Paragraph as TamaguiParagraph, YStack } from "tamagui";
37
37
  import { EditorPreviewPanes, PreviewSurface } from "../shared/EditorPreviewPanes";
38
38
 
39
39
  // ---------------------------------------------------------------------------
@@ -93,9 +93,9 @@ function CodePreview({ value, language }: CodePreviewProps) {
93
93
  ) : (
94
94
  <HighlightedCode tokens={tokens} showLineNumbers={lineCount > 10}>
95
95
  {/* Plain-text fallback while shiki loads (or if unavailable). */}
96
- <Paragraph size={textSize} fontFamily="$mono" whiteSpace="pre">
96
+ <TamaguiParagraph size={textSize} fontFamily="$mono" whiteSpace="pre">
97
97
  {value}
98
- </Paragraph>
98
+ </TamaguiParagraph>
99
99
  </HighlightedCode>
100
100
  )}
101
101
  </PreviewSurface>
@@ -25,7 +25,7 @@ import {
25
25
  } from "react-native";
26
26
  import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
27
27
  import { platform } from "@multiplatform.one/platform";
28
- import { Text, View, XStack, YStack, useProps, useTheme, useThemeName } from "tamagui";
28
+ import { View, XStack, YStack, useProps, useTheme, useThemeName } from "tamagui";
29
29
  import { useKeyboardInset } from "../../shared/useKeyboardInset";
30
30
  import { Date as CatalogDate } from "./catalog";
31
31
  import {
@@ -36,6 +36,7 @@ import {
36
36
  import { datePickerHeight, dateSheetBottomPadding, dateSheetMaxHeight } from "./sheetKeyboard";
37
37
  import type { DateProps } from "./types";
38
38
  import { fromFrappeDateValue, toFrappeDateValue } from "./wire";
39
+ import { Text } from "@multiplatform.one/components";
39
40
 
40
41
  /**
41
42
  * Design-law: trigger and sheet actions are house Button. The OS picker stays