@multiplatform.one/frappe-ui 7.66.0 → 7.68.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 (470) hide show
  1. package/dist/cjs/FileBrowser/index.cjs +15 -25
  2. package/dist/cjs/FileBrowser/index.native.js +15 -25
  3. package/dist/cjs/FileBrowser/index.native.js.map +1 -1
  4. package/dist/cjs/FormSidebar.cjs +107 -194
  5. package/dist/cjs/FormSidebar.native.js +120 -216
  6. package/dist/cjs/FormSidebar.native.js.map +1 -1
  7. package/dist/cjs/FrappeAssignment.cjs +0 -3
  8. package/dist/cjs/FrappeAssignment.native.js +0 -3
  9. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  10. package/dist/cjs/FrappeConnectionIndicator.cjs +5 -24
  11. package/dist/cjs/FrappeConnectionIndicator.native.js +5 -24
  12. package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
  13. package/dist/cjs/FrappeDashboard.cjs +0 -2
  14. package/dist/cjs/FrappeDashboard.native.js +0 -2
  15. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  16. package/dist/cjs/FrappeForm.cjs +6 -5
  17. package/dist/cjs/FrappeForm.native.js +6 -5
  18. package/dist/cjs/FrappeForm.native.js.map +1 -1
  19. package/dist/cjs/FrappeFormActions.cjs +20 -30
  20. package/dist/cjs/FrappeFormActions.native.js +23 -31
  21. package/dist/cjs/FrappeFormActions.native.js.map +1 -1
  22. package/dist/cjs/FrappeImageView.cjs +46 -65
  23. package/dist/cjs/FrappeImageView.native.js +46 -68
  24. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  25. package/dist/cjs/FrappeKanban.cjs +0 -1
  26. package/dist/cjs/FrappeKanban.native.js +0 -1
  27. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  28. package/dist/cjs/FrappeLikedBy.cjs +1 -1
  29. package/dist/cjs/FrappeLikedBy.native.js +1 -1
  30. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  31. package/dist/cjs/FrappeListView.cjs +24 -68
  32. package/dist/cjs/FrappeListView.native.js +25 -72
  33. package/dist/cjs/FrappeListView.native.js.map +1 -1
  34. package/dist/cjs/FrappeRecordView.cjs +4 -0
  35. package/dist/cjs/FrappeRecordView.native.js +4 -0
  36. package/dist/cjs/FrappeRecordView.native.js.map +1 -1
  37. package/dist/cjs/FrappeReportBuilder.cjs +21 -18
  38. package/dist/cjs/FrappeReportBuilder.native.js +21 -18
  39. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  40. package/dist/cjs/FrappeReportView.cjs +2 -4
  41. package/dist/cjs/FrappeReportView.native.js +2 -4
  42. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  43. package/dist/cjs/SyncErrorNotice.cjs +8 -36
  44. package/dist/cjs/SyncErrorNotice.native.js +8 -36
  45. package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
  46. package/dist/cjs/desk/DeskFormSidebar.cjs +1 -6
  47. package/dist/cjs/desk/DeskFormSidebar.native.js +1 -6
  48. package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
  49. package/dist/cjs/desk/DeskShell.cjs +0 -1
  50. package/dist/cjs/desk/DeskShell.native.js +0 -1
  51. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  52. package/dist/cjs/fields/Date/catalog.native.js +0 -1
  53. package/dist/cjs/fields/Date/catalog.native.js.map +1 -1
  54. package/dist/cjs/fields/Date/index.native.js +4 -363
  55. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  56. package/dist/cjs/fields/FileUpload.cjs +50 -58
  57. package/dist/cjs/fields/FileUpload.native.js +50 -56
  58. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  59. package/dist/cjs/insights/InsightsFacetTags.cjs +16 -92
  60. package/dist/cjs/insights/InsightsFacetTags.native.js +15 -97
  61. package/dist/cjs/insights/InsightsFacetTags.native.js.map +1 -1
  62. package/dist/cjs/list/FacetBadge.cjs +4 -28
  63. package/dist/cjs/list/FacetBadge.native.js +4 -28
  64. package/dist/cjs/list/FacetBadge.native.js.map +1 -1
  65. package/dist/cjs/list/FacetRail.cjs +37 -128
  66. package/dist/cjs/list/FacetRail.native.js +32 -130
  67. package/dist/cjs/list/FacetRail.native.js.map +1 -1
  68. package/dist/cjs/list/ListControls.cjs +1 -3
  69. package/dist/cjs/list/ListControls.native.js +1 -3
  70. package/dist/cjs/list/ListControls.native.js.map +1 -1
  71. package/dist/cjs/list/ListControlsSheet.cjs +5 -15
  72. package/dist/cjs/list/ListControlsSheet.native.js +7 -17
  73. package/dist/cjs/list/ListControlsSheet.native.js.map +1 -1
  74. package/dist/cjs/list/ListSidebarToolbar.cjs +5 -20
  75. package/dist/cjs/list/ListSidebarToolbar.native.js +7 -22
  76. package/dist/cjs/list/ListSidebarToolbar.native.js.map +1 -1
  77. package/dist/cjs/list/RecordCard.cjs +95 -127
  78. package/dist/cjs/list/RecordCard.native.js +78 -96
  79. package/dist/cjs/list/RecordCard.native.js.map +1 -1
  80. package/dist/cjs/list/ShufflePanel.cjs +55 -36
  81. package/dist/cjs/list/ShufflePanel.native.js +62 -39
  82. package/dist/cjs/list/ShufflePanel.native.js.map +1 -1
  83. package/dist/cjs/list/listColumns.cjs +1 -1
  84. package/dist/cjs/list/listColumns.native.js +1 -1
  85. package/dist/cjs/list/listColumns.native.js.map +1 -1
  86. package/dist/cjs/record/RecordHero.cjs +7 -85
  87. package/dist/cjs/record/RecordHero.native.js +7 -85
  88. package/dist/cjs/record/RecordHero.native.js.map +1 -1
  89. package/dist/cjs/record/RecordPage.cjs +5 -10
  90. package/dist/cjs/record/RecordPage.native.js +5 -10
  91. package/dist/cjs/record/RecordPage.native.js.map +1 -1
  92. package/dist/cjs/report/ReportViewToolbar.cjs +76 -47
  93. package/dist/cjs/report/ReportViewToolbar.native.js +79 -48
  94. package/dist/cjs/report/ReportViewToolbar.native.js.map +1 -1
  95. package/dist/esm/FileBrowser/index.mjs +16 -26
  96. package/dist/esm/FileBrowser/index.mjs.map +1 -1
  97. package/dist/esm/FileBrowser/index.native.js +16 -26
  98. package/dist/esm/FileBrowser/index.native.js.map +1 -1
  99. package/dist/esm/FormSidebar.mjs +110 -197
  100. package/dist/esm/FormSidebar.mjs.map +1 -1
  101. package/dist/esm/FormSidebar.native.js +123 -219
  102. package/dist/esm/FormSidebar.native.js.map +1 -1
  103. package/dist/esm/FrappeAssignment.mjs +0 -3
  104. package/dist/esm/FrappeAssignment.mjs.map +1 -1
  105. package/dist/esm/FrappeAssignment.native.js +0 -3
  106. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  107. package/dist/esm/FrappeConnectionIndicator.mjs +7 -26
  108. package/dist/esm/FrappeConnectionIndicator.mjs.map +1 -1
  109. package/dist/esm/FrappeConnectionIndicator.native.js +7 -26
  110. package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
  111. package/dist/esm/FrappeDashboard.mjs +0 -2
  112. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  113. package/dist/esm/FrappeDashboard.native.js +0 -2
  114. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  115. package/dist/esm/FrappeForm.mjs +7 -6
  116. package/dist/esm/FrappeForm.mjs.map +1 -1
  117. package/dist/esm/FrappeForm.native.js +7 -6
  118. package/dist/esm/FrappeForm.native.js.map +1 -1
  119. package/dist/esm/FrappeFormActions.mjs +22 -32
  120. package/dist/esm/FrappeFormActions.mjs.map +1 -1
  121. package/dist/esm/FrappeFormActions.native.js +25 -33
  122. package/dist/esm/FrappeFormActions.native.js.map +1 -1
  123. package/dist/esm/FrappeImageView.mjs +48 -67
  124. package/dist/esm/FrappeImageView.mjs.map +1 -1
  125. package/dist/esm/FrappeImageView.native.js +48 -70
  126. package/dist/esm/FrappeImageView.native.js.map +1 -1
  127. package/dist/esm/FrappeKanban.mjs +0 -1
  128. package/dist/esm/FrappeKanban.mjs.map +1 -1
  129. package/dist/esm/FrappeKanban.native.js +0 -1
  130. package/dist/esm/FrappeKanban.native.js.map +1 -1
  131. package/dist/esm/FrappeLikedBy.mjs +1 -1
  132. package/dist/esm/FrappeLikedBy.mjs.map +1 -1
  133. package/dist/esm/FrappeLikedBy.native.js +1 -1
  134. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  135. package/dist/esm/FrappeListView.mjs +25 -69
  136. package/dist/esm/FrappeListView.mjs.map +1 -1
  137. package/dist/esm/FrappeListView.native.js +26 -73
  138. package/dist/esm/FrappeListView.native.js.map +1 -1
  139. package/dist/esm/FrappeRecordView.mjs +4 -0
  140. package/dist/esm/FrappeRecordView.mjs.map +1 -1
  141. package/dist/esm/FrappeRecordView.native.js +4 -0
  142. package/dist/esm/FrappeRecordView.native.js.map +1 -1
  143. package/dist/esm/FrappeReportBuilder.mjs +21 -18
  144. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  145. package/dist/esm/FrappeReportBuilder.native.js +21 -18
  146. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  147. package/dist/esm/FrappeReportView.mjs +3 -5
  148. package/dist/esm/FrappeReportView.mjs.map +1 -1
  149. package/dist/esm/FrappeReportView.native.js +3 -5
  150. package/dist/esm/FrappeReportView.native.js.map +1 -1
  151. package/dist/esm/SyncErrorNotice.mjs +10 -38
  152. package/dist/esm/SyncErrorNotice.mjs.map +1 -1
  153. package/dist/esm/SyncErrorNotice.native.js +10 -38
  154. package/dist/esm/SyncErrorNotice.native.js.map +1 -1
  155. package/dist/esm/desk/DeskFormSidebar.mjs +1 -6
  156. package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
  157. package/dist/esm/desk/DeskFormSidebar.native.js +1 -6
  158. package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
  159. package/dist/esm/desk/DeskShell.mjs +0 -1
  160. package/dist/esm/desk/DeskShell.mjs.map +1 -1
  161. package/dist/esm/desk/DeskShell.native.js +0 -1
  162. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  163. package/dist/esm/fields/Date/catalog.mjs.map +1 -1
  164. package/dist/esm/fields/Date/catalog.native.js +0 -1
  165. package/dist/esm/fields/Date/catalog.native.js.map +1 -1
  166. package/dist/esm/fields/Date/index.native.js +2 -361
  167. package/dist/esm/fields/Date/index.native.js.map +1 -1
  168. package/dist/esm/fields/FileUpload.mjs +53 -61
  169. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  170. package/dist/esm/fields/FileUpload.native.js +53 -59
  171. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  172. package/dist/esm/insights/InsightsFacetTags.mjs +18 -94
  173. package/dist/esm/insights/InsightsFacetTags.mjs.map +1 -1
  174. package/dist/esm/insights/InsightsFacetTags.native.js +17 -99
  175. package/dist/esm/insights/InsightsFacetTags.native.js.map +1 -1
  176. package/dist/esm/list/FacetBadge.mjs +5 -29
  177. package/dist/esm/list/FacetBadge.mjs.map +1 -1
  178. package/dist/esm/list/FacetBadge.native.js +5 -29
  179. package/dist/esm/list/FacetBadge.native.js.map +1 -1
  180. package/dist/esm/list/FacetRail.mjs +40 -131
  181. package/dist/esm/list/FacetRail.mjs.map +1 -1
  182. package/dist/esm/list/FacetRail.native.js +35 -133
  183. package/dist/esm/list/FacetRail.native.js.map +1 -1
  184. package/dist/esm/list/ListControls.mjs +1 -3
  185. package/dist/esm/list/ListControls.mjs.map +1 -1
  186. package/dist/esm/list/ListControls.native.js +1 -3
  187. package/dist/esm/list/ListControls.native.js.map +1 -1
  188. package/dist/esm/list/ListControlsSheet.mjs +6 -16
  189. package/dist/esm/list/ListControlsSheet.mjs.map +1 -1
  190. package/dist/esm/list/ListControlsSheet.native.js +8 -18
  191. package/dist/esm/list/ListControlsSheet.native.js.map +1 -1
  192. package/dist/esm/list/ListSidebarToolbar.mjs +6 -21
  193. package/dist/esm/list/ListSidebarToolbar.mjs.map +1 -1
  194. package/dist/esm/list/ListSidebarToolbar.native.js +8 -23
  195. package/dist/esm/list/ListSidebarToolbar.native.js.map +1 -1
  196. package/dist/esm/list/RecordCard.mjs +95 -127
  197. package/dist/esm/list/RecordCard.mjs.map +1 -1
  198. package/dist/esm/list/RecordCard.native.js +78 -96
  199. package/dist/esm/list/RecordCard.native.js.map +1 -1
  200. package/dist/esm/list/ShufflePanel.mjs +57 -38
  201. package/dist/esm/list/ShufflePanel.mjs.map +1 -1
  202. package/dist/esm/list/ShufflePanel.native.js +64 -41
  203. package/dist/esm/list/ShufflePanel.native.js.map +1 -1
  204. package/dist/esm/list/listColumns.mjs +1 -1
  205. package/dist/esm/list/listColumns.mjs.map +1 -1
  206. package/dist/esm/list/listColumns.native.js +1 -1
  207. package/dist/esm/list/listColumns.native.js.map +1 -1
  208. package/dist/esm/record/RecordHero.mjs +8 -86
  209. package/dist/esm/record/RecordHero.mjs.map +1 -1
  210. package/dist/esm/record/RecordHero.native.js +8 -86
  211. package/dist/esm/record/RecordHero.native.js.map +1 -1
  212. package/dist/esm/record/RecordPage.mjs +6 -11
  213. package/dist/esm/record/RecordPage.mjs.map +1 -1
  214. package/dist/esm/record/RecordPage.native.js +6 -11
  215. package/dist/esm/record/RecordPage.native.js.map +1 -1
  216. package/dist/esm/report/ReportViewToolbar.mjs +78 -49
  217. package/dist/esm/report/ReportViewToolbar.mjs.map +1 -1
  218. package/dist/esm/report/ReportViewToolbar.native.js +81 -50
  219. package/dist/esm/report/ReportViewToolbar.native.js.map +1 -1
  220. package/dist/jsx/FileBrowser/index.mjs +16 -26
  221. package/dist/jsx/FileBrowser/index.mjs.map +1 -1
  222. package/dist/jsx/FileBrowser/index.native.js +15 -25
  223. package/dist/jsx/FileBrowser/index.native.js.map +1 -1
  224. package/dist/jsx/FormSidebar.mjs +110 -197
  225. package/dist/jsx/FormSidebar.mjs.map +1 -1
  226. package/dist/jsx/FormSidebar.native.js +120 -216
  227. package/dist/jsx/FormSidebar.native.js.map +1 -1
  228. package/dist/jsx/FrappeAssignment.mjs +0 -3
  229. package/dist/jsx/FrappeAssignment.mjs.map +1 -1
  230. package/dist/jsx/FrappeAssignment.native.js +0 -3
  231. package/dist/jsx/FrappeAssignment.native.js.map +1 -1
  232. package/dist/jsx/FrappeConnectionIndicator.mjs +7 -26
  233. package/dist/jsx/FrappeConnectionIndicator.mjs.map +1 -1
  234. package/dist/jsx/FrappeConnectionIndicator.native.js +5 -24
  235. package/dist/jsx/FrappeConnectionIndicator.native.js.map +1 -1
  236. package/dist/jsx/FrappeDashboard.mjs +0 -2
  237. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  238. package/dist/jsx/FrappeDashboard.native.js +0 -2
  239. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  240. package/dist/jsx/FrappeForm.mjs +7 -6
  241. package/dist/jsx/FrappeForm.mjs.map +1 -1
  242. package/dist/jsx/FrappeForm.native.js +6 -5
  243. package/dist/jsx/FrappeForm.native.js.map +1 -1
  244. package/dist/jsx/FrappeFormActions.mjs +22 -32
  245. package/dist/jsx/FrappeFormActions.mjs.map +1 -1
  246. package/dist/jsx/FrappeFormActions.native.js +23 -31
  247. package/dist/jsx/FrappeFormActions.native.js.map +1 -1
  248. package/dist/jsx/FrappeImageView.mjs +48 -67
  249. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  250. package/dist/jsx/FrappeImageView.native.js +46 -68
  251. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  252. package/dist/jsx/FrappeKanban.mjs +0 -1
  253. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  254. package/dist/jsx/FrappeKanban.native.js +0 -1
  255. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  256. package/dist/jsx/FrappeLikedBy.mjs +1 -1
  257. package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
  258. package/dist/jsx/FrappeLikedBy.native.js +1 -1
  259. package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
  260. package/dist/jsx/FrappeListView.mjs +25 -69
  261. package/dist/jsx/FrappeListView.mjs.map +1 -1
  262. package/dist/jsx/FrappeListView.native.js +25 -72
  263. package/dist/jsx/FrappeListView.native.js.map +1 -1
  264. package/dist/jsx/FrappeRecordView.mjs +4 -0
  265. package/dist/jsx/FrappeRecordView.mjs.map +1 -1
  266. package/dist/jsx/FrappeRecordView.native.js +4 -0
  267. package/dist/jsx/FrappeRecordView.native.js.map +1 -1
  268. package/dist/jsx/FrappeReportBuilder.mjs +21 -18
  269. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  270. package/dist/jsx/FrappeReportBuilder.native.js +21 -18
  271. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  272. package/dist/jsx/FrappeReportView.mjs +3 -5
  273. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  274. package/dist/jsx/FrappeReportView.native.js +2 -4
  275. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  276. package/dist/jsx/SyncErrorNotice.mjs +10 -38
  277. package/dist/jsx/SyncErrorNotice.mjs.map +1 -1
  278. package/dist/jsx/SyncErrorNotice.native.js +8 -36
  279. package/dist/jsx/SyncErrorNotice.native.js.map +1 -1
  280. package/dist/jsx/desk/DeskFormSidebar.mjs +1 -6
  281. package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
  282. package/dist/jsx/desk/DeskFormSidebar.native.js +1 -6
  283. package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
  284. package/dist/jsx/desk/DeskShell.mjs +0 -1
  285. package/dist/jsx/desk/DeskShell.mjs.map +1 -1
  286. package/dist/jsx/desk/DeskShell.native.js +0 -1
  287. package/dist/jsx/desk/DeskShell.native.js.map +1 -1
  288. package/dist/jsx/fields/Date/catalog.mjs.map +1 -1
  289. package/dist/jsx/fields/Date/catalog.native.js +0 -1
  290. package/dist/jsx/fields/Date/catalog.native.js.map +1 -1
  291. package/dist/jsx/fields/Date/index.native.js +4 -363
  292. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  293. package/dist/jsx/fields/FileUpload.mjs +53 -61
  294. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  295. package/dist/jsx/fields/FileUpload.native.js +50 -56
  296. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  297. package/dist/jsx/insights/InsightsFacetTags.mjs +18 -94
  298. package/dist/jsx/insights/InsightsFacetTags.mjs.map +1 -1
  299. package/dist/jsx/insights/InsightsFacetTags.native.js +15 -97
  300. package/dist/jsx/insights/InsightsFacetTags.native.js.map +1 -1
  301. package/dist/jsx/list/FacetBadge.mjs +5 -29
  302. package/dist/jsx/list/FacetBadge.mjs.map +1 -1
  303. package/dist/jsx/list/FacetBadge.native.js +4 -28
  304. package/dist/jsx/list/FacetBadge.native.js.map +1 -1
  305. package/dist/jsx/list/FacetRail.mjs +40 -131
  306. package/dist/jsx/list/FacetRail.mjs.map +1 -1
  307. package/dist/jsx/list/FacetRail.native.js +32 -130
  308. package/dist/jsx/list/FacetRail.native.js.map +1 -1
  309. package/dist/jsx/list/ListControls.mjs +1 -3
  310. package/dist/jsx/list/ListControls.mjs.map +1 -1
  311. package/dist/jsx/list/ListControls.native.js +1 -3
  312. package/dist/jsx/list/ListControls.native.js.map +1 -1
  313. package/dist/jsx/list/ListControlsSheet.mjs +6 -16
  314. package/dist/jsx/list/ListControlsSheet.mjs.map +1 -1
  315. package/dist/jsx/list/ListControlsSheet.native.js +7 -17
  316. package/dist/jsx/list/ListControlsSheet.native.js.map +1 -1
  317. package/dist/jsx/list/ListSidebarToolbar.mjs +6 -21
  318. package/dist/jsx/list/ListSidebarToolbar.mjs.map +1 -1
  319. package/dist/jsx/list/ListSidebarToolbar.native.js +7 -22
  320. package/dist/jsx/list/ListSidebarToolbar.native.js.map +1 -1
  321. package/dist/jsx/list/RecordCard.mjs +95 -127
  322. package/dist/jsx/list/RecordCard.mjs.map +1 -1
  323. package/dist/jsx/list/RecordCard.native.js +78 -96
  324. package/dist/jsx/list/RecordCard.native.js.map +1 -1
  325. package/dist/jsx/list/ShufflePanel.mjs +57 -38
  326. package/dist/jsx/list/ShufflePanel.mjs.map +1 -1
  327. package/dist/jsx/list/ShufflePanel.native.js +62 -39
  328. package/dist/jsx/list/ShufflePanel.native.js.map +1 -1
  329. package/dist/jsx/list/listColumns.mjs +1 -1
  330. package/dist/jsx/list/listColumns.mjs.map +1 -1
  331. package/dist/jsx/list/listColumns.native.js +1 -1
  332. package/dist/jsx/list/listColumns.native.js.map +1 -1
  333. package/dist/jsx/record/RecordHero.mjs +8 -86
  334. package/dist/jsx/record/RecordHero.mjs.map +1 -1
  335. package/dist/jsx/record/RecordHero.native.js +7 -85
  336. package/dist/jsx/record/RecordHero.native.js.map +1 -1
  337. package/dist/jsx/record/RecordPage.mjs +6 -11
  338. package/dist/jsx/record/RecordPage.mjs.map +1 -1
  339. package/dist/jsx/record/RecordPage.native.js +5 -10
  340. package/dist/jsx/record/RecordPage.native.js.map +1 -1
  341. package/dist/jsx/report/ReportViewToolbar.mjs +78 -49
  342. package/dist/jsx/report/ReportViewToolbar.mjs.map +1 -1
  343. package/dist/jsx/report/ReportViewToolbar.native.js +79 -48
  344. package/dist/jsx/report/ReportViewToolbar.native.js.map +1 -1
  345. package/package.json +16 -16
  346. package/src/FileBrowser/index.tsx +11 -15
  347. package/src/FormSidebar.stories.tsx +1 -1
  348. package/src/FormSidebar.tsx +146 -251
  349. package/src/FrappeAssignment.tsx +0 -3
  350. package/src/FrappeConnectionIndicator.tsx +6 -28
  351. package/src/FrappeDashboard.spec.tsx +7 -3
  352. package/src/FrappeDashboard.tsx +0 -2
  353. package/src/FrappeForm.connections.spec.tsx +2 -2
  354. package/src/FrappeForm.deskSemantics.spec.tsx +2 -2
  355. package/src/FrappeForm.lifecycle.spec.tsx +27 -27
  356. package/src/FrappeForm.tsx +11 -7
  357. package/src/FrappeFormActions.tsx +24 -38
  358. package/src/FrappeImageView.stories.tsx +1 -6
  359. package/src/FrappeImageView.tsx +52 -66
  360. package/src/FrappeKanban.tsx +0 -1
  361. package/src/FrappeLikedBy.tsx +1 -1
  362. package/src/FrappeListView.controls.spec.tsx +3 -2
  363. package/src/FrappeListView.spec.tsx +7 -3
  364. package/src/FrappeListView.tsx +23 -56
  365. package/src/FrappeRecordView.tsx +16 -3
  366. package/src/FrappeReportBuilder.tsx +21 -19
  367. package/src/FrappeReportView.tsx +3 -6
  368. package/src/SyncErrorNotice.spec.tsx +7 -12
  369. package/src/SyncErrorNotice.stories.tsx +2 -4
  370. package/src/SyncErrorNotice.tsx +13 -41
  371. package/src/desk/DeskFormSidebar.tsx +1 -2
  372. package/src/desk/DeskShell.tsx +1 -1
  373. package/src/desk/deskDocumentRoutes.spec.tsx +7 -4
  374. package/src/fields/Date/catalog.tsx +6 -7
  375. package/src/fields/Date/nativeIsCatalog.spec.tsx +26 -0
  376. package/src/fields/Date/typeParity.spec.tsx +26 -102
  377. package/src/fields/FileUpload.spec.tsx +18 -3
  378. package/src/fields/FileUpload.tsx +64 -68
  379. package/src/frappeRemainder.designLaw.spec.ts +8 -7
  380. package/src/insights/InsightsFacetTags.tsx +21 -102
  381. package/src/list/FacetBadge.tsx +7 -29
  382. package/src/list/FacetRail.spec.tsx +11 -10
  383. package/src/list/FacetRail.tsx +49 -161
  384. package/src/list/ListControls.tsx +1 -3
  385. package/src/list/ListControlsSheet.tsx +10 -12
  386. package/src/list/ListSidebarToolbar.tsx +7 -18
  387. package/src/list/RecordCard.native.tsx +65 -71
  388. package/src/list/RecordCard.spec.tsx +8 -5
  389. package/src/list/RecordCard.tsx +110 -129
  390. package/src/list/ShufflePanel.tsx +63 -38
  391. package/src/list/listColumns.tsx +1 -1
  392. package/src/record/RecordHero.tsx +11 -51
  393. package/src/record/RecordPage.tsx +8 -11
  394. package/src/report/ReportViewToolbar.spec.tsx +45 -3
  395. package/src/report/ReportViewToolbar.tsx +113 -62
  396. package/src/useFrappeForm.spec.tsx +1 -1
  397. package/types/FileBrowser/index.d.ts.map +1 -1
  398. package/types/FormSidebar.d.ts +13 -3
  399. package/types/FormSidebar.d.ts.map +1 -1
  400. package/types/FrappeAssignment.d.ts.map +1 -1
  401. package/types/FrappeConnectionIndicator.d.ts +2 -1
  402. package/types/FrappeConnectionIndicator.d.ts.map +1 -1
  403. package/types/FrappeDashboard.d.ts.map +1 -1
  404. package/types/FrappeFormActions.d.ts.map +1 -1
  405. package/types/FrappeImageView.d.ts.map +1 -1
  406. package/types/FrappeKanban.d.ts.map +1 -1
  407. package/types/FrappeListView.d.ts.map +1 -1
  408. package/types/FrappeRecordView.d.ts.map +1 -1
  409. package/types/FrappeReportBuilder.d.ts.map +1 -1
  410. package/types/FrappeReportView.d.ts.map +1 -1
  411. package/types/SyncErrorNotice.d.ts +4 -6
  412. package/types/SyncErrorNotice.d.ts.map +1 -1
  413. package/types/desk/DeskFormSidebar.d.ts.map +1 -1
  414. package/types/desk/DeskShell.d.ts.map +1 -1
  415. package/types/fields/Date/catalog.d.ts +5 -4
  416. package/types/fields/Date/catalog.d.ts.map +1 -1
  417. package/types/fields/FileUpload.d.ts.map +1 -1
  418. package/types/insights/InsightsFacetTags.d.ts +4 -1
  419. package/types/insights/InsightsFacetTags.d.ts.map +1 -1
  420. package/types/list/FacetBadge.d.ts +3 -3
  421. package/types/list/FacetBadge.d.ts.map +1 -1
  422. package/types/list/FacetRail.d.ts +7 -5
  423. package/types/list/FacetRail.d.ts.map +1 -1
  424. package/types/list/ListControls.d.ts.map +1 -1
  425. package/types/list/ListControlsSheet.d.ts.map +1 -1
  426. package/types/list/ListSidebarToolbar.d.ts.map +1 -1
  427. package/types/list/RecordCard.d.ts +6 -6
  428. package/types/list/RecordCard.d.ts.map +1 -1
  429. package/types/list/RecordCard.native.d.ts +4 -3
  430. package/types/list/RecordCard.native.d.ts.map +1 -1
  431. package/types/list/ShufflePanel.d.ts +8 -3
  432. package/types/list/ShufflePanel.d.ts.map +1 -1
  433. package/types/record/RecordHero.d.ts +5 -1
  434. package/types/record/RecordHero.d.ts.map +1 -1
  435. package/types/record/RecordPage.d.ts.map +1 -1
  436. package/types/report/ReportViewToolbar.d.ts.map +1 -1
  437. package/dist/cjs/fields/Date/dateTimePickerLoader.cjs +0 -38
  438. package/dist/cjs/fields/Date/dateTimePickerLoader.native.js +0 -42
  439. package/dist/cjs/fields/Date/dateTimePickerLoader.native.js.map +0 -1
  440. package/dist/cjs/fields/Date/sheetKeyboard.cjs +0 -54
  441. package/dist/cjs/fields/Date/sheetKeyboard.native.js +0 -57
  442. package/dist/cjs/fields/Date/sheetKeyboard.native.js.map +0 -1
  443. package/dist/esm/fields/Date/dateTimePickerLoader.mjs +0 -13
  444. package/dist/esm/fields/Date/dateTimePickerLoader.mjs.map +0 -1
  445. package/dist/esm/fields/Date/dateTimePickerLoader.native.js +0 -14
  446. package/dist/esm/fields/Date/dateTimePickerLoader.native.js.map +0 -1
  447. package/dist/esm/fields/Date/sheetKeyboard.mjs +0 -21
  448. package/dist/esm/fields/Date/sheetKeyboard.mjs.map +0 -1
  449. package/dist/esm/fields/Date/sheetKeyboard.native.js +0 -21
  450. package/dist/esm/fields/Date/sheetKeyboard.native.js.map +0 -1
  451. package/dist/jsx/fields/Date/dateTimePickerLoader.mjs +0 -13
  452. package/dist/jsx/fields/Date/dateTimePickerLoader.mjs.map +0 -1
  453. package/dist/jsx/fields/Date/dateTimePickerLoader.native.js +0 -42
  454. package/dist/jsx/fields/Date/dateTimePickerLoader.native.js.map +0 -1
  455. package/dist/jsx/fields/Date/sheetKeyboard.mjs +0 -21
  456. package/dist/jsx/fields/Date/sheetKeyboard.mjs.map +0 -1
  457. package/dist/jsx/fields/Date/sheetKeyboard.native.js +0 -57
  458. package/dist/jsx/fields/Date/sheetKeyboard.native.js.map +0 -1
  459. package/src/fields/Date/dateTimePickerLoader.ts +0 -25
  460. package/src/fields/Date/index.native.tsx +0 -445
  461. package/src/fields/Date/nativeFallback.spec.tsx +0 -21
  462. package/src/fields/Date/nativePresentation.spec.tsx +0 -278
  463. package/src/fields/Date/sheetKeyboard.spec.ts +0 -60
  464. package/src/fields/Date/sheetKeyboard.ts +0 -45
  465. package/types/fields/Date/dateTimePickerLoader.d.ts +0 -11
  466. package/types/fields/Date/dateTimePickerLoader.d.ts.map +0 -1
  467. package/types/fields/Date/index.native.d.ts +0 -14
  468. package/types/fields/Date/index.native.d.ts.map +0 -1
  469. package/types/fields/Date/sheetKeyboard.d.ts +0 -20
  470. package/types/fields/Date/sheetKeyboard.d.ts.map +0 -1
@@ -206,7 +206,6 @@ function LiveDashboardContent<TDoc extends { name: string; doctype: string }>({
206
206
  `loading` (not bare `disabled`) is the derived busy state. */}
207
207
  <Button
208
208
  size="$2"
209
- circular
210
209
  icon={ArrowsClockwiseIcon}
211
210
  onPress={onRefresh}
212
211
  loading={isRefreshing || isLiveLoading}
@@ -328,7 +327,6 @@ export function FrappeDashboard<TDoc extends { name: string; doctype: string }>(
328
327
  {/* LC-54: house Button, own-box floor (see the live-path refresh). */}
329
328
  <Button
330
329
  size="$2"
331
- circular
332
330
  icon={ArrowsClockwiseIcon}
333
331
  onPress={bumpRefresh}
334
332
  loading={isRefreshing}
@@ -128,13 +128,13 @@ describe("FrappeForm connections, schema mode", () => {
128
128
 
129
129
  it("a new record has no connections yet", async () => {
130
130
  renderForm({});
131
- await waitFor(() => expect(screen.getByText("Save")).toBeTruthy());
131
+ await waitFor(() => expect(screen.getByLabelText("Save")).toBeTruthy());
132
132
  expect(screen.queryByText("Connections")).toBeNull();
133
133
  });
134
134
 
135
135
  it("showConnections={false} leaves the tab out", async () => {
136
136
  renderForm({ name: "bulbasaur", showConnections: false });
137
- await waitFor(() => expect(screen.getByText("Save")).toBeTruthy());
137
+ await waitFor(() => expect(screen.getByLabelText("Save")).toBeTruthy());
138
138
  expect(screen.queryByText("Connections")).toBeNull();
139
139
  });
140
140
  });
@@ -192,7 +192,7 @@ describe("FrappeForm resolves a doctype through the desk form engine", () => {
192
192
  it("save refuses an empty field that mandatory_depends_on made required", async () => {
193
193
  renderForm({ name: "LOAN-APPROVED", roles: ["Loan Officer"] });
194
194
  await expectProbe("status", "val=Approved");
195
- fireEvent.click(screen.getByText("Save"));
195
+ fireEvent.click(screen.getByLabelText("Save"));
196
196
  await expectProbe("reason", "err=Reason is required");
197
197
  });
198
198
 
@@ -276,7 +276,7 @@ describe("FrappeForm resolves a doctype through the desk form engine", () => {
276
276
  renderForm();
277
277
  await screen.findByTestId("probe-status");
278
278
  expect(screen.getByText("Name")).toBeTruthy();
279
- fireEvent.click(screen.getByText("Save"));
279
+ fireEvent.click(screen.getByLabelText("Save"));
280
280
  await waitFor(() => {
281
281
  expect(screen.getByText("Name is required")).toBeTruthy();
282
282
  });
@@ -132,7 +132,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
132
132
  renderForm(fixtures, { name: "LOAN-DRAFT" });
133
133
  await expectProbe("employee_name", "val=Ada Lovelace");
134
134
  await expectStatus("draft");
135
- expect(screen.queryByText("Save")).toBeNull();
135
+ expect(screen.queryByLabelText("Save")).toBeNull();
136
136
 
137
137
  fireEvent.click(screen.getByText("Submit"));
138
138
  await waitFor(() => expect(confirm).toHaveBeenCalledWith("Permanently Submit LOAN-DRAFT?"));
@@ -172,7 +172,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
172
172
 
173
173
  fireEvent.click(screen.getByTestId("set-remarks"));
174
174
  await expectStatus("notSaved");
175
- expect(screen.getByText("Save")).toBeTruthy();
175
+ expect(screen.getByLabelText("Save")).toBeTruthy();
176
176
  expect(screen.queryByText("Submit")).toBeNull();
177
177
  });
178
178
 
@@ -185,8 +185,8 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
185
185
  onAmend: vi.fn(),
186
186
  });
187
187
  await expectStatus("submitted");
188
- expect(screen.queryByText("Delete")).toBeNull();
189
- expect(screen.getByText("Close")).toBeTruthy();
188
+ expect(screen.queryByLabelText("Delete")).toBeNull();
189
+ expect(screen.getByLabelText("Close")).toBeTruthy();
190
190
  expect(screen.getByTestId("frappe-form-cancel-document").textContent).toContain(
191
191
  "Cancel Document",
192
192
  );
@@ -196,7 +196,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
196
196
  await expectStatus("cancelled");
197
197
  await waitFor(async () => expect(await docstatusOf(fixtures, "LOAN-SUBMITTED")).toBe(2));
198
198
  expect(screen.getByText("Amend")).toBeTruthy();
199
- expect(screen.getByText("Delete")).toBeTruthy();
199
+ expect(screen.getByLabelText("Delete")).toBeTruthy();
200
200
  });
201
201
 
202
202
  it("an allow_on_submit edit turns Cancel into Update, which keeps the document submitted", async () => {
@@ -205,10 +205,10 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
205
205
  await expectStatus("submitted");
206
206
 
207
207
  fireEvent.click(screen.getByTestId("set-remarks"));
208
- await waitFor(() => expect(screen.getByText("Update")).toBeTruthy());
208
+ await waitFor(() => expect(screen.getByLabelText("Update")).toBeTruthy());
209
209
  expect(screen.queryByTestId("frappe-form-cancel-document")).toBeNull();
210
210
 
211
- fireEvent.click(screen.getByText("Update"));
211
+ fireEvent.click(screen.getByLabelText("Update"));
212
212
  await waitFor(async () =>
213
213
  expect((await fixtures.getDoc("Asset Loan", "LOAN-SUBMITTED"))?.remarks).toBe("edited"),
214
214
  );
@@ -255,7 +255,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
255
255
  await expectStatus("notSaved");
256
256
  await expectProbe("employee_name", "val=Katherine Johnson");
257
257
  await expectProbe("serial_no", "ro=false");
258
- fireEvent.click(screen.getByText("Save"));
258
+ fireEvent.click(screen.getByLabelText("Save"));
259
259
  await waitFor(async () => {
260
260
  const amendments = await fixtures.getList("Asset Loan", {
261
261
  filters: { amended_from: "LOAN-CANCELLED" },
@@ -279,7 +279,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
279
279
  renderForm(corpus(), { name: "LOAN-SUBMITTED", roles: ["Loan Officer"], onCancel: vi.fn() });
280
280
  await expectStatus("submitted");
281
281
  expect(screen.queryByTestId("frappe-form-cancel-document")).toBeNull();
282
- expect(screen.getByText("Cancel")).toBeTruthy();
282
+ expect(screen.getByLabelText("Cancel")).toBeTruthy();
283
283
  cleanup();
284
284
 
285
285
  renderForm(corpus(), { name: "LOAN-CANCELLED", roles: ["Loan Officer"], onAmend: vi.fn() });
@@ -289,7 +289,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
289
289
 
290
290
  renderForm(corpus(), { name: "LOAN-DRAFT", roles: ["Loan Clerk"] });
291
291
  await expectStatus("draft");
292
- expect(screen.getByText("Save")).toBeTruthy();
292
+ expect(screen.getByLabelText("Save")).toBeTruthy();
293
293
  expect(screen.queryByText("Submit")).toBeNull();
294
294
  });
295
295
 
@@ -305,7 +305,7 @@ describe("FrappeForm runs the desk docstatus lifecycle", () => {
305
305
  renderForm(corpus(), { name: "LOAN-SUBMITTED", roles: ["Auditor"], onCancel: vi.fn() });
306
306
  await expectStatus("submitted");
307
307
  expect(screen.queryByTestId("frappe-form-cancel-document")).toBeNull();
308
- expect(screen.getByText("Cancel")).toBeTruthy();
308
+ expect(screen.getByLabelText("Cancel")).toBeTruthy();
309
309
  cleanup();
310
310
 
311
311
  renderForm(corpus(), { name: "LOAN-CANCELLED", roles: ["Auditor"], onAmend: vi.fn() });
@@ -326,11 +326,11 @@ describe("a read-only record view keeps desk's lifecycle beside Edit", () => {
326
326
  const onEdit = vi.fn();
327
327
  renderForm(fixtures, { name: "LOAN-DRAFT", onEdit, onCancel: vi.fn(), onDelete: vi.fn() });
328
328
  await expectStatus("draft");
329
- expect(screen.queryByText("Save")).toBeNull();
330
- expect(screen.queryByText("Cancel")).toBeNull();
331
- expect(screen.getByText("Delete")).toBeTruthy();
329
+ expect(screen.queryByLabelText("Save")).toBeNull();
330
+ expect(screen.queryByLabelText("Cancel")).toBeNull();
331
+ expect(screen.getByLabelText("Delete")).toBeTruthy();
332
332
 
333
- fireEvent.click(screen.getByText("Edit"));
333
+ fireEvent.click(screen.getByLabelText("Edit"));
334
334
  expect(onEdit).toHaveBeenCalledTimes(1);
335
335
 
336
336
  fireEvent.click(screen.getByText("Submit"));
@@ -338,30 +338,30 @@ describe("a read-only record view keeps desk's lifecycle beside Edit", () => {
338
338
  await waitFor(async () => expect(await docstatusOf(fixtures, "LOAN-DRAFT")).toBe(1));
339
339
  await expectStatus("submitted");
340
340
  expect(screen.getByText("Cancel Document")).toBeTruthy();
341
- expect(screen.getByText("Edit")).toBeTruthy();
342
- expect(screen.queryByText("Delete")).toBeNull();
341
+ expect(screen.getByLabelText("Edit")).toBeTruthy();
342
+ expect(screen.queryByLabelText("Delete")).toBeNull();
343
343
  });
344
344
 
345
345
  it("a submitted document offers Cancel Document, and its allow_on_submit field keeps Edit", async () => {
346
346
  const fixtures = corpus();
347
347
  renderForm(fixtures, { name: "LOAN-SUBMITTED", onEdit: vi.fn(), onCancel: vi.fn() });
348
348
  await expectStatus("submitted");
349
- expect(screen.getByText("Edit")).toBeTruthy();
350
- expect(screen.queryByText("Cancel")).toBeNull();
351
- expect(screen.queryByText("Close")).toBeNull();
349
+ expect(screen.getByLabelText("Edit")).toBeTruthy();
350
+ expect(screen.queryByLabelText("Cancel")).toBeNull();
351
+ expect(screen.queryByLabelText("Close")).toBeNull();
352
352
 
353
353
  fireEvent.click(screen.getByText("Cancel Document"));
354
354
  await waitFor(() => expect(confirm).toHaveBeenCalledWith("Permanently Cancel LOAN-SUBMITTED?"));
355
355
  await waitFor(async () => expect(await docstatusOf(fixtures, "LOAN-SUBMITTED")).toBe(2));
356
356
  await expectStatus("cancelled");
357
- expect(screen.queryByText("Edit")).toBeNull();
357
+ expect(screen.queryByLabelText("Edit")).toBeNull();
358
358
  });
359
359
 
360
360
  it("a cancelled document offers Amend and no Edit", async () => {
361
361
  const onAmend = vi.fn();
362
362
  renderForm(corpus(), { name: "LOAN-CANCELLED", onEdit: vi.fn(), onAmend });
363
363
  await expectStatus("cancelled");
364
- expect(screen.queryByText("Edit")).toBeNull();
364
+ expect(screen.queryByLabelText("Edit")).toBeNull();
365
365
 
366
366
  fireEvent.click(screen.getByText("Amend"));
367
367
  await waitFor(() => expect(onAmend).toHaveBeenCalled());
@@ -374,7 +374,7 @@ describe("a submittable doctype's routed pages", () => {
374
374
  const pushed = renderPage(corpus(), "/loans/LOAN-DRAFT");
375
375
  await expectStatus("draft");
376
376
  expect(screen.getByText("Submit")).toBeTruthy();
377
- expect(screen.queryByText("Save")).toBeNull();
377
+ expect(screen.queryByLabelText("Save")).toBeNull();
378
378
 
379
379
  // LC-145: Submit is the bar's one action, so Edit rides the "…" menu.
380
380
  fireEvent.click(screen.getByTestId("frappe-form-menu"));
@@ -386,14 +386,14 @@ describe("a submittable doctype's routed pages", () => {
386
386
  const pushed = renderPage(corpus(), "/loans/LOAN-DRAFT/edit");
387
387
  await expectStatus("draft");
388
388
  expect(screen.getByText("Submit")).toBeTruthy();
389
- expect(screen.queryByText("Edit")).toBeNull();
389
+ expect(screen.queryByLabelText("Edit")).toBeNull();
390
390
 
391
391
  fireEvent.click(screen.getByTestId("set-remarks"));
392
392
  await expectStatus("notSaved");
393
- expect(screen.getByText("Save")).toBeTruthy();
393
+ expect(screen.getByLabelText("Save")).toBeTruthy();
394
394
  expect(screen.queryByText("Submit")).toBeNull();
395
395
 
396
- fireEvent.click(screen.getAllByText("Cancel")[0]);
396
+ fireEvent.click(screen.getAllByLabelText(/^(Cancel|Back to .+ list)$/)[0]!);
397
397
  expect(pushed).toEqual(["/loans/LOAN-DRAFT"]);
398
398
  });
399
399
 
@@ -449,7 +449,7 @@ describe("the leave button stays live while a write is in flight (LC-30)", () =>
449
449
  const onCancel = vi.fn();
450
450
  renderForm(fixtures, { name: "LOAN-SUBMITTED", onCancel });
451
451
  await expectStatus("submitted");
452
- expect(screen.getByTestId("frappe-form-close").textContent).toContain("Close");
452
+ expect(screen.getByTestId("frappe-form-close").getAttribute("aria-label")).toBe("Close");
453
453
 
454
454
  fireEvent.click(screen.getByTestId("frappe-form-cancel-document"));
455
455
  await waitFor(() =>
@@ -23,7 +23,7 @@ import type React from "react";
23
23
  import { useEffect, useMemo, useState } from "react";
24
24
  import type { TFunction } from "i18next";
25
25
  import { useTranslation } from "react-i18next";
26
- import { Button, Input, formCommonColors } from "@multiplatform.one/forms";
26
+ import { IconButton, Input, formCommonColors, standardActions } from "@multiplatform.one/forms";
27
27
  import { Text as TamaguiText, XStack, YStack } from "tamagui";
28
28
  import { hairlineWidth, useResolvedKnobs } from "@multiplatform.one/theme";
29
29
  import { useFrappeConfig } from "./FrappeProvider";
@@ -677,13 +677,17 @@ function FrappeFormView<TDoc extends { name: string; doctype: string }>({
677
677
  <YStack flex={1} backgroundColor="$background" testID="frappe-form-route-editor">
678
678
  <XStack alignItems="center" gap="$2" paddingHorizontal="$2" paddingVertical="$1">
679
679
  <XStack flex={1} flexBasis={0} justifyContent="flex-start">
680
- <Button
681
- chromeless
680
+ <IconButton
681
+ icon={standardActions.cancel.icon}
682
+ edge="start"
683
+ data-mp-action="cancel"
682
684
  onPress={onCancel ? handleCancel : routePage.onBack}
683
- aria-label={onCancel ? undefined : t("Back to {{doctype}} list", { doctype })}
684
- >
685
- {t("Cancel")}
686
- </Button>
685
+ aria-label={
686
+ onCancel
687
+ ? t(standardActions.cancel.label)
688
+ : t("Back to {{doctype}} list", { doctype })
689
+ }
690
+ />
687
691
  </XStack>
688
692
  <Text
689
693
  flexShrink={1}
@@ -1,4 +1,5 @@
1
1
  import {
2
+ ActionButton,
2
3
  Chip,
3
4
  DropdownMenu,
4
5
  PageMenuButton,
@@ -10,7 +11,6 @@ import { useResolvedKnobs } from "@multiplatform.one/theme";
10
11
  import {
11
12
  ArrowCounterClockwiseIcon,
12
13
  CheckCircleIcon,
13
- FloppyDiskIcon,
14
14
  PencilSimpleIcon,
15
15
  ProhibitIcon,
16
16
  TrashIcon,
@@ -122,33 +122,27 @@ export function FrappeFormActions({
122
122
  )}
123
123
 
124
124
  {onDelete && (
125
- <Button
126
- outlined
125
+ <ActionButton
126
+ kind="delete"
127
127
  error
128
- icon={TrashIcon}
129
128
  loading={busy}
130
129
  disabled={disabled}
131
130
  disabledReason={disabled ? readOnlyReason : undefined}
132
131
  disabledReasonPlacement="inline"
133
132
  onPress={onDelete}
134
- >
135
- {t("Delete")}
136
- </Button>
133
+ />
137
134
  )}
138
135
 
139
136
  {onClose && (
140
- <Button
141
- outlined={!footer}
142
- icon={footer ? undefined : XIcon}
137
+ <ActionButton
138
+ // A submitted document's own Cancel sits beside this button.
139
+ kind={action === "cancel" ? "close" : "cancel"}
143
140
  disabled={closeDisabled}
144
141
  disabledReason={closeDisabled ? readOnlyReason : undefined}
145
142
  disabledReasonPlacement="inline"
146
143
  onPress={onClose}
147
144
  testID="frappe-form-close"
148
- >
149
- {/* A submitted document's own Cancel sits beside this button. */}
150
- {action === "cancel" ? t("Close") : t("Cancel")}
151
- </Button>
145
+ />
152
146
  )}
153
147
 
154
148
  {action === "cancel" && (
@@ -169,18 +163,14 @@ export function FrappeFormActions({
169
163
  )}
170
164
 
171
165
  {onEdit && (
172
- <Button
173
- accent={action !== "submit"}
174
- outlined={action === "submit"}
175
- icon={PencilSimpleIcon}
166
+ <ActionButton
167
+ kind="edit"
176
168
  disabled={disabled}
177
169
  disabledReason={disabled ? readOnlyReason : undefined}
178
170
  disabledReasonPlacement="inline"
179
171
  onPress={onEdit}
180
172
  testID="frappe-form-edit"
181
- >
182
- {t("Edit")}
183
- </Button>
173
+ />
184
174
  )}
185
175
 
186
176
  {action === "amend" && onAmend && (
@@ -208,6 +198,7 @@ export function FrappeFormActions({
208
198
 
209
199
  {action === "submit" && (
210
200
  <Button
201
+ // action-word-escape: Frappe's docstatus Submit, a lifecycle step a check would hide
211
202
  accent
212
203
  icon={CheckCircleIcon}
213
204
  flex={footer ? 1 : undefined}
@@ -223,19 +214,16 @@ export function FrappeFormActions({
223
214
  )}
224
215
 
225
216
  {(action === "save" || action === "update") && (
226
- <Button
227
- accent
228
- icon={footer ? undefined : FloppyDiskIcon}
229
- flex={footer ? 1 : undefined}
217
+ <ActionButton
218
+ kind="save"
219
+ label={action === "update" ? t("Update") : undefined}
230
220
  loading={busy}
231
221
  disabled={disabled}
232
222
  disabledReason={disabled ? readOnlyReason : undefined}
233
223
  disabledReasonPlacement="inline"
234
224
  onPress={onSave}
235
225
  testID="frappe-form-save"
236
- >
237
- {busy ? t("Saving...") : action === "update" ? t("Update") : t("Save")}
238
- </Button>
226
+ />
239
227
  )}
240
228
  </XStack>
241
229
  );
@@ -269,19 +257,19 @@ export function FrappeFormHeaderActions({
269
257
 
270
258
  const primary =
271
259
  action === "save" || action === "update" ? (
272
- <Button
273
- accent
260
+ <ActionButton
261
+ kind="save"
262
+ label={action === "update" ? t("Update") : undefined}
274
263
  loading={busy}
275
264
  disabled={disabled}
276
265
  disabledReason={disabled ? readOnlyReason : undefined}
277
266
  disabledReasonPlacement="inline"
278
267
  onPress={onSave}
279
268
  testID="frappe-form-save"
280
- >
281
- {busy ? t("Saving...") : action === "update" ? t("Update") : t("Save")}
282
- </Button>
269
+ />
283
270
  ) : action === "submit" ? (
284
271
  <Button
272
+ // action-word-escape: Frappe's docstatus Submit, a lifecycle step a check would hide
285
273
  accent
286
274
  loading={busy}
287
275
  disabled={disabled}
@@ -312,16 +300,14 @@ export function FrappeFormHeaderActions({
312
300
  {t("Amend")}
313
301
  </Button>
314
302
  ) : onEdit ? (
315
- <Button
316
- accent
303
+ <ActionButton
304
+ kind="edit"
317
305
  disabled={disabled}
318
306
  disabledReason={disabled ? readOnlyReason : undefined}
319
307
  disabledReasonPlacement="inline"
320
308
  onPress={onEdit}
321
309
  testID="frappe-form-edit"
322
- >
323
- {t("Edit")}
324
- </Button>
310
+ />
325
311
  ) : null;
326
312
 
327
313
  const lifecyclePrimary =
@@ -20,7 +20,7 @@ export default {
20
20
  },
21
21
  },
22
22
  argTypes: {
23
- columns: { control: { type: "number", min: 1, max: 6 } },
23
+ columns: { control: { type: "number", min: 1, max: 8 } },
24
24
  searchText: { control: "text" },
25
25
  },
26
26
  };
@@ -104,7 +104,6 @@ export const Main = (args: Record<string, unknown>) => (
104
104
  />
105
105
  </FrappeProvider>
106
106
  );
107
- Main.args = { columns: 3 };
108
107
  Main.storyName = "Main";
109
108
 
110
109
  /** Zero documents: the grid's empty message must show. */
@@ -139,7 +138,6 @@ export const BrokenImages = () => (
139
138
  doctype="QaGalleryBroken"
140
139
  imageField="picture"
141
140
  titleField="title"
142
- columns={3}
143
141
  onItemClick={action("onItemClick")}
144
142
  />
145
143
  </FrappeProvider>
@@ -177,7 +175,6 @@ export const LongMetadata = () => (
177
175
  imageField="picture"
178
176
  titleField="title"
179
177
  subtitleField="subtitle"
180
- columns={3}
181
178
  />
182
179
  </FrappeProvider>
183
180
  );
@@ -199,7 +196,6 @@ export const Live = (args: { doctype?: string; imageField?: string; titleField?:
199
196
  doctype={args.doctype || "Contact"}
200
197
  imageField={args.imageField || "image"}
201
198
  titleField={args.titleField || "first_name"}
202
- columns={3}
203
199
  onItemClick={action("onItemClick")}
204
200
  />
205
201
  </FrappeStoryProvider>
@@ -232,7 +228,6 @@ export const Filtered = () => (
232
228
  imageField="picture"
233
229
  titleField="title"
234
230
  searchText="Item 1"
235
- columns={3}
236
231
  />
237
232
  </FrappeProvider>
238
233
  );
@@ -1,10 +1,10 @@
1
1
  import { useDocTypeMeta } from "@multiplatform.one/frappe";
2
- import { AsyncSkeleton, Card, ImageGrid } from "@multiplatform.one/components";
2
+ import { AsyncSkeleton, Image, ImageGrid } from "@multiplatform.one/components";
3
3
  import { ImageSquareIcon } from "@phosphor-icons/react";
4
4
  import React, { useMemo } from "react";
5
5
  import { useTranslation } from "react-i18next";
6
6
  import { Spinner, formCommonColors } from "@multiplatform.one/forms";
7
- import { Image, Text, YStack, useTheme, type YStackProps } from "tamagui";
7
+ import { Text, YStack, useTheme, type YStackProps } from "tamagui";
8
8
  import { isServer } from "@multiplatform.one/platform";
9
9
  import { useResolvedKnobs } from "@multiplatform.one/theme";
10
10
  import { useFrappeConfig } from "./FrappeProvider";
@@ -105,6 +105,7 @@ export function FrappeImageView<TDoc extends { name: string; doctype: string }>(
105
105
  if (ssrItems && ssrItems.length > 0 && imageField && baseURL) {
106
106
  return (
107
107
  <ImageGrid
108
+ variant="photos"
108
109
  items={ssrItems}
109
110
  columns={columns}
110
111
  onItemClick={onItemClick}
@@ -112,14 +113,13 @@ export function FrappeImageView<TDoc extends { name: string; doctype: string }>(
112
113
  testID={`${doctype.toLowerCase()}-list`}
113
114
  {...(stackProps as any)}
114
115
  renderItem={(doc) => (
115
- <FrappeImageCard
116
+ <FrappePhoto
116
117
  doc={doc as Record<string, unknown>}
117
118
  doctype={doctype}
118
119
  imageField={imageField}
119
120
  titleField={titleField}
120
121
  subtitleField={subtitleField}
121
122
  baseURL={baseURL}
122
- onItemClick={onItemClick as ((doc: Partial<unknown>) => void) | undefined}
123
123
  knobProps={knobProps}
124
124
  />
125
125
  )}
@@ -283,6 +283,7 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
283
283
  <>
284
284
  <FrappeReconnectIndicator config={appConfig} />
285
285
  <ImageGrid
286
+ variant="photos"
286
287
  items={items}
287
288
  columns={columns}
288
289
  onItemClick={onItemClick}
@@ -290,14 +291,13 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
290
291
  testID={`${doctype.toLowerCase()}-list`}
291
292
  {...(stackProps as any)}
292
293
  renderItem={(doc) => (
293
- <FrappeImageCard
294
+ <FrappePhoto
294
295
  doc={doc as Record<string, unknown>}
295
296
  doctype={doctype}
296
297
  imageField={effectiveImageField}
297
298
  titleField={effectiveTitleField}
298
299
  subtitleField={subtitleField}
299
300
  baseURL={finalBaseURL}
300
- onItemClick={onItemClick as ((doc: Partial<unknown>) => void) | undefined}
301
301
  knobProps={knobProps}
302
302
  />
303
303
  )}
@@ -307,18 +307,18 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
307
307
  }
308
308
 
309
309
  /**
310
- * Card renderer shared between SSR and client paths so they produce
311
- * matching markup (avoiding hydration mismatches) and the look stays
312
- * defined in one place.
310
+ * One photo in the Photos grid (LC-264), shared between SSR and client paths so they
311
+ * produce matching markup: the image fills a square edge to edge with no card
312
+ * chrome. The title is its accessible name; it shows as a caption only when
313
+ * there is no picture to look at (no URL, or the image failed to load).
313
314
  */
314
- function FrappeImageCard({
315
+ function FrappePhoto({
315
316
  doc,
316
317
  doctype,
317
318
  imageField,
318
319
  titleField,
319
320
  subtitleField,
320
321
  baseURL,
321
- onItemClick,
322
322
  knobProps,
323
323
  }: {
324
324
  doc: Record<string, unknown>;
@@ -327,74 +327,60 @@ function FrappeImageCard({
327
327
  titleField: string;
328
328
  subtitleField?: string;
329
329
  baseURL: string;
330
- onItemClick?: (doc: Partial<unknown>) => void;
331
330
  knobProps: ReturnType<typeof useResolvedKnobs>["knobProps"];
332
331
  }) {
333
- const theme = useTheme();
334
332
  const imageUrl = getImageUrl(doc[imageField], baseURL);
335
- const title = doc[titleField] || doc.name;
333
+ const title = String(doc[titleField] || doc.name);
336
334
  const subtitle = subtitleField ? doc[subtitleField] : undefined;
337
- const iconSize = Number(knobProps.controlIcon?.width) || 16;
338
-
339
- return (
340
- // Catalog Card owns cardSurface (no cherry-picked radius). Inner media
341
- // radius stays UNCLAMPED (R11). No status pip on the tile.
342
- <Card
343
- testID={`${doctype.toLowerCase()}-card-${doc.name}`}
344
- cursor="pointer"
345
- hoverStyle={{ scale: 1.02 }}
346
- pressStyle={{ scale: 0.98 }}
347
- onPress={(e) => {
348
- // Bind click directly to `doc` so the correct item is used even
349
- // if the ImageGrid wrapper's closure captured a stale/recycled item.
350
- (e as unknown as { stopPropagation?: () => void })?.stopPropagation?.();
351
- onItemClick?.(doc as Partial<unknown>);
352
- }}
335
+ const slug = doctype.toLowerCase();
336
+ const caption = (
337
+ <YStack
338
+ width="100%"
339
+ aspectRatio={1}
340
+ alignItems="center"
341
+ justifyContent="center"
342
+ backgroundColor="$color3"
343
+ padding="$2"
344
+ gap="$1"
353
345
  >
346
+ <Text
347
+ testID={`${slug}-name-${doc.name}`}
348
+ {...knobProps.label}
349
+ color={knobProps.textAccentColor}
350
+ textAlign="center"
351
+ numberOfLines={2}
352
+ >
353
+ {title}
354
+ </Text>
355
+ {subtitle != null ? (
356
+ <Text
357
+ testID={`${slug}-subtitle-${doc.name}`}
358
+ {...knobProps.label}
359
+ color={formCommonColors.muted}
360
+ textAlign="center"
361
+ numberOfLines={1}
362
+ >
363
+ {String(subtitle)}
364
+ </Text>
365
+ ) : null}
366
+ </YStack>
367
+ );
368
+ return (
369
+ <YStack testID={`${slug}-card-${doc.name}`} aria-label={title} width="100%">
354
370
  {imageUrl ? (
355
371
  <Image
356
372
  src={imageUrl}
357
- alt={String(title)}
373
+ alt={title}
358
374
  width="100%"
359
375
  aspectRatio={1}
360
376
  objectFit="cover"
361
- backgroundColor="$color2"
362
- {...knobProps.borderRadius}
377
+ borderRadius={0}
378
+ backgroundColor="$color3"
379
+ fallback={caption}
363
380
  />
364
381
  ) : (
365
- <YStack
366
- width="100%"
367
- aspectRatio={1}
368
- backgroundColor="$color2"
369
- {...knobProps.borderRadius}
370
- alignItems="center"
371
- justifyContent="center"
372
- >
373
- <ImageSquareIcon size={iconSize * 2} color={theme.color11?.val ?? "currentColor"} />
374
- </YStack>
382
+ caption
375
383
  )}
376
- <Card.Footer>
377
- <YStack {...knobProps.gap}>
378
- <Text
379
- testID={`${doctype.toLowerCase()}-name-${doc.name}`}
380
- {...knobProps.heading}
381
- fontWeight="400"
382
- numberOfLines={1}
383
- >
384
- {String(title)}
385
- </Text>
386
- {subtitle != null ? (
387
- <Text
388
- testID={`${doctype.toLowerCase()}-subtitle-${doc.name}`}
389
- color={formCommonColors.muted}
390
- {...knobProps.label}
391
- numberOfLines={1}
392
- >
393
- {String(subtitle)}
394
- </Text>
395
- ) : null}
396
- </YStack>
397
- </Card.Footer>
398
- </Card>
384
+ </YStack>
399
385
  );
400
386
  }
@@ -266,7 +266,6 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
266
266
  {canQuickAdd && column.id !== "__unassigned__" && (
267
267
  <Button
268
268
  size="$2"
269
- circular
270
269
  chromeless
271
270
  icon={PlusIcon}
272
271
  aria-label={t("Add card to {{column}}", { column: column.title })}