@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
@@ -281,10 +281,10 @@ function FrappeLikedByBody({
281
281
  <XStack alignItems="center" gap="$2">
282
282
  <Button
283
283
  size="$2"
284
- circular
285
284
  chromeless
286
285
  disabled={!canToggle}
287
286
  aria-pressed={liked}
287
+ selected={false}
288
288
  aria-label={liked ? t("Unlike") : t("Like")}
289
289
  onPress={handleToggle}
290
290
  icon={
@@ -165,7 +165,8 @@ describe("FrappeListView controls write their state back", () => {
165
165
  renderList({}, {}, navigationAt({}, setParams));
166
166
  await waitFor(() => expect(shownCards().length).toBe(6), { timeout: 5000 });
167
167
  const chip = await screen.findByTestId("pokemon-type-fire");
168
- expect(getComputedStyle(chip).height).toBe("32px");
168
+ expect(chip.hasAttribute("data-chip")).toBe(true);
169
+ expect(chip.getAttribute("role")).toBe("radio");
169
170
  fireEvent.click(chip);
170
171
  await expectCards(["charmander"]);
171
172
  expect(setParams).toHaveBeenCalledWith({ type: "fire" });
@@ -228,7 +229,7 @@ describe("FrappeListView routed page with its toolbar off", () => {
228
229
  fireEvent.click(screen.getByTestId("insights"));
229
230
  expect(navigate).toHaveBeenCalledWith("/pokemon/insights");
230
231
  expect(screen.getByText("Skip to results")).toBeTruthy();
231
- fireEvent.click(await screen.findByText("Add Pokemon"));
232
+ fireEvent.click(await screen.findByRole("button", { name: "Add Pokemon" }));
232
233
  expect(navigate).toHaveBeenCalledWith("/pokemon/new");
233
234
  });
234
235
  });
@@ -130,10 +130,14 @@ describe("FrappeListView refresh press floor (LC-54 amendment)", () => {
130
130
  expect(refresh.className).not.toMatch(negativeMarginAtom);
131
131
  const token = refresh.getAttribute("data-size-token") as SizeTokens;
132
132
  const px = Number(getVariableValue(getSize(token)));
133
- expect(refresh.className).toContain(`_mih-${px}px`);
134
- expect(refresh.className).toContain(`_miw-${px}px`);
133
+ // LC-176: the bare glyph sits in a square box at its control height, inside
134
+ // the token box, and slop restores the 44pt press floor.
135
+ const box = Number(/(?:^| )_mih-(\d+)px/.exec(refresh.className)?.[1]);
136
+ expect(refresh.className).toContain(`_miw-${box}px`);
137
+ expect(box).toBeGreaterThan(0);
138
+ expect(box).toBeLessThanOrEqual(px);
135
139
  const slop = Number(refresh.getAttribute("data-mp-press-slop") ?? 0);
136
- expect(px + slop * 2).toBeGreaterThanOrEqual(44);
140
+ expect(box + slop * 2).toBeGreaterThanOrEqual(44);
137
141
  });
138
142
 
139
143
  it("hover feedback rides the button's own in-slot box (house channel)", async () => {
@@ -22,6 +22,7 @@ import {
22
22
  EmptyState,
23
23
  ListPageLayout,
24
24
  ListRow,
25
+ PageBarButton,
25
26
  PageHeader,
26
27
  SkipLink,
27
28
  Tooltip,
@@ -922,7 +923,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
922
923
  : [];
923
924
  const headerActions =
924
925
  headerOwnsViews || (headerOwnsTools && onAdd) || headerAccessory || actions?.length ? (
925
- <XStack {...knobProps.gap} alignItems="center" flexWrap="wrap" flexShrink={1} minWidth={0}>
926
+ <XStack alignItems="center">
926
927
  {headerOwnsViews ? (
927
928
  <Tooltip content={t("Switch views")}>
928
929
  <XStack {...secondaryHidden}>
@@ -938,69 +939,35 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
938
939
  {actions?.map((action) => {
939
940
  const Icon = action.icon;
940
941
  const onPress = pressFor(action);
941
- if (sidebarFilters) {
942
- return (
943
- <XStack key={action.label} {...secondaryHidden}>
944
- <Tooltip content={action.hint ?? action.label}>
945
- <Button
946
- outlined
942
+ return (
943
+ <XStack key={action.label} {...secondaryHidden}>
944
+ <Tooltip content={action.hint ?? action.label}>
945
+ {Icon ? (
946
+ <PageBarButton
947
+ icon={Icon as never}
948
+ aria-label={action.label}
947
949
  onPress={onPress}
948
- icon={Icon ? <Icon size={16} /> : undefined}
949
950
  testID={action.testID}
950
- >
951
+ />
952
+ ) : (
953
+ <Button chromeless accentInk onPress={onPress} testID={action.testID}>
951
954
  {action.label}
952
955
  </Button>
953
- </Tooltip>
954
- </XStack>
955
- );
956
- }
957
- return (
958
- <React.Fragment key={action.label}>
959
- <Tooltip content={action.hint ?? action.label}>
960
- {/* responsive-parity: the circular icon twin below carries this action on phones */}
961
- <Button
962
- outlined
963
- onPress={onPress}
964
- icon={Icon ? <Icon size={16} /> : undefined}
965
- $max-sm={{ display: "none" }}
966
- testID={action.testID}
967
- >
968
- {action.label}
969
- </Button>
956
+ )}
970
957
  </Tooltip>
971
- <Button
972
- outlined
973
- circular
974
- onPress={onPress}
975
- icon={Icon ? <Icon size={16} /> : undefined}
976
- display="none"
977
- aria-label={action.label}
978
- $max-sm={{ display: "flex" }}
979
- />
980
- </React.Fragment>
958
+ </XStack>
981
959
  );
982
960
  })}
983
961
  {headerOwnsTools && onAdd ? (
984
- <>
985
- {/* responsive-parity: the short "Add" twin below carries this action on phones */}
986
- <Button
987
- theme="accent"
988
- onPress={onAdd}
989
- icon={<PlusIcon size={16} />}
990
- $max-sm={{ display: "none" }}
991
- >
992
- {t("Add {{doctype}}", { doctype })}
993
- </Button>
994
- <Button
995
- theme="accent"
962
+ <Tooltip content={t("Add {{doctype}}", { doctype })}>
963
+ <PageBarButton
964
+ icon={PlusIcon}
965
+ aria-label={t("Add {{doctype}}", { doctype })}
996
966
  onPress={onAdd}
997
- icon={<PlusIcon size={16} />}
998
- display="none"
999
- $max-sm={{ display: "flex" }}
1000
- >
1001
- {t("Add")}
1002
- </Button>
1003
- </>
967
+ edge="end"
968
+ testID={`${slug}-add`}
969
+ />
970
+ </Tooltip>
1004
971
  ) : null}
1005
972
  </XStack>
1006
973
  ) : undefined;
@@ -1013,6 +980,7 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
1013
980
  rows={shuffleRows}
1014
981
  itemLabel={shuffle.label}
1015
982
  renderPick={(doc) => drawCard(doc, 0)}
983
+ grid={gridProps}
1016
984
  onGo={(doc) => {
1017
985
  setShuffleOpen(false);
1018
986
  onItemClick?.(doc);
@@ -1234,7 +1202,6 @@ function FrappeListViewBody<TDoc extends { name: string; doctype: string }>({
1234
1202
  feedback stays inside its own layout slot. */}
1235
1203
  <Button
1236
1204
  size="$2"
1237
- circular
1238
1205
  chromeless
1239
1206
  icon={ArrowsClockwiseIcon}
1240
1207
  onPress={handleRefresh}
@@ -1,6 +1,7 @@
1
1
  import { EmptyState, Screen } from "@multiplatform.one/components";
2
2
  import { Button } from "@multiplatform.one/forms";
3
3
  import type { Order } from "@multiplatform.one/frappe";
4
+ import { DETAIL_READABLE_WIDTH } from "@multiplatform.one/theme";
4
5
  import { useMemo } from "react";
5
6
  import { useTranslation } from "react-i18next";
6
7
  import type { FrappeConnection } from "./frappeConnections";
@@ -141,12 +142,18 @@ export function FrappeRecordView<TDoc extends { name: string; doctype: string }>
141
142
  showSidebar={false}
142
143
  showTimeline={false}
143
144
  loadingFallback={
144
- <Screen noPadding gap={0} topBar={backButton}>
145
+ <Screen noPadding gap={0} maxWidth={DETAIL_READABLE_WIDTH} topBar={backButton}>
145
146
  <RecordSkeleton testID={`${slug}-detail-skeleton`} />
146
147
  </Screen>
147
148
  }
148
149
  notFoundFallback={
149
- <Screen scroll={false} noPadding gap={0} topBar={backButton}>
150
+ <Screen
151
+ scroll={false}
152
+ noPadding
153
+ gap={0}
154
+ maxWidth={DETAIL_READABLE_WIDTH}
155
+ topBar={backButton}
156
+ >
150
157
  <EmptyState
151
158
  title={t("{{doctype}} not found", { doctype })}
152
159
  description={t("No {{doctype}} is named {{name}}.", { doctype, name })}
@@ -159,7 +166,13 @@ export function FrappeRecordView<TDoc extends { name: string; doctype: string }>
159
166
  </Screen>
160
167
  }
161
168
  errorFallback={
162
- <Screen scroll={false} noPadding gap={0} topBar={backButton}>
169
+ <Screen
170
+ scroll={false}
171
+ noPadding
172
+ gap={0}
173
+ maxWidth={DETAIL_READABLE_WIDTH}
174
+ topBar={backButton}
175
+ >
163
176
  <EmptyState
164
177
  intent="error"
165
178
  title={t("Couldn't load this {{doctype}}", { doctype })}
@@ -870,25 +870,27 @@ function FrappeReportBuilderBody({
870
870
 
871
871
  const content = (
872
872
  <YStack flex={1} minWidth={0} minHeight={0} {...stackProps}>
873
- <ReportViewToolbar
874
- columns={allColumns}
875
- selected={selectedFieldnames}
876
- onToggleColumn={handleToggleColumn}
877
- onResetColumns={handleResetColumns}
878
- groupBy={groupBy}
879
- onGroupByChange={setGroupBy}
880
- baseFilters={baseFilters}
881
- onClearBaseFilters={baseFilters.length > 0 ? handleClearBaseFilters : undefined}
882
- columnFilterCount={columnTuples.length}
883
- onClearColumnFilters={handleClearColumnFilters}
884
- savedReports={savedReports.reports}
885
- currentReport={currentReport}
886
- onSelectReport={handleSelectReport}
887
- onSaveReport={readsWithoutMeta ? undefined : handleSaveReport}
888
- onDeleteReport={readsWithoutMeta ? undefined : handleDeleteReport}
889
- onExport={exportEnabled ? handleExport : undefined}
890
- exportDisabled={total === 0}
891
- />
873
+ <YStack paddingHorizontal="$3">
874
+ <ReportViewToolbar
875
+ columns={allColumns}
876
+ selected={selectedFieldnames}
877
+ onToggleColumn={handleToggleColumn}
878
+ onResetColumns={handleResetColumns}
879
+ groupBy={groupBy}
880
+ onGroupByChange={setGroupBy}
881
+ baseFilters={baseFilters}
882
+ onClearBaseFilters={baseFilters.length > 0 ? handleClearBaseFilters : undefined}
883
+ columnFilterCount={columnTuples.length}
884
+ onClearColumnFilters={handleClearColumnFilters}
885
+ savedReports={savedReports.reports}
886
+ currentReport={currentReport}
887
+ onSelectReport={handleSelectReport}
888
+ onSaveReport={readsWithoutMeta ? undefined : handleSaveReport}
889
+ onDeleteReport={readsWithoutMeta ? undefined : handleDeleteReport}
890
+ onExport={exportEnabled ? handleExport : undefined}
891
+ exportDisabled={total === 0}
892
+ />
893
+ </YStack>
892
894
  <ScrollView
893
895
  flex={1}
894
896
  minWidth={0}
@@ -40,7 +40,7 @@
40
40
  * hidden where the web download pipeline does not exist.
41
41
  */
42
42
  import { AsyncBoundary, EmptyState } from "@multiplatform.one/components";
43
- import { Button, DatePicker, Spinner, formCommonColors } from "@multiplatform.one/forms";
43
+ import { DatePicker, IconButton, Spinner, formCommonColors } from "@multiplatform.one/forms";
44
44
  import {
45
45
  DataTable,
46
46
  DataTableExport,
@@ -477,14 +477,11 @@ export function FrappeReportView({
477
477
  </XStack>
478
478
  )}
479
479
  {refreshShown && (
480
- <Button
481
- size="$2"
480
+ <IconButton
482
481
  icon={ArrowClockwiseIcon}
483
482
  onPress={refresh}
484
483
  aria-label={t("Refresh report")}
485
- >
486
- {t("Refresh")}
487
- </Button>
484
+ />
488
485
  )}
489
486
  {exportEnabled && rows.length > 0 && (
490
487
  <DataTableExport
@@ -1,5 +1,5 @@
1
1
  // SyncErrorNotice contract: the visible half of the rejected-write pattern —
2
- // role="alert" message, Retry re-issues, Dismiss clears, and each affordance
2
+ // role="alert" message, Retry re-issues, the close button clears, and each affordance
3
3
  // only renders when its handler is provided.
4
4
  import { renderWithProviders } from "@multiplatform.one/test-utils";
5
5
  import { cleanup, fireEvent, screen } from "@testing-library/react";
@@ -33,7 +33,9 @@ describe("SyncErrorNotice", () => {
33
33
  );
34
34
  fireEvent.click(await screen.findByText("Retry"));
35
35
  expect(onRetry).toHaveBeenCalledTimes(1);
36
- fireEvent.click(await screen.findByText("Dismiss"));
36
+ const close = await screen.findByRole("button", { name: "Dismiss" });
37
+ expect(close.textContent?.trim()).toBe("");
38
+ fireEvent.click(close);
37
39
  expect(onDismiss).toHaveBeenCalledTimes(1);
38
40
  });
39
41
 
@@ -41,20 +43,13 @@ describe("SyncErrorNotice", () => {
41
43
  renderWithProviders(<SyncErrorNotice message="No actions" />);
42
44
  await screen.findByRole("alert");
43
45
  expect(screen.queryByText("Retry")).toBeNull();
44
- expect(screen.queryByText("Dismiss")).toBeNull();
46
+ expect(screen.queryByRole("button", { name: "Dismiss" })).toBeNull();
45
47
  });
46
48
 
47
- it("honors custom labels", async () => {
49
+ it("honors a custom Retry label", async () => {
48
50
  renderWithProviders(
49
- <SyncErrorNotice
50
- message="Custom"
51
- onRetry={() => {}}
52
- onDismiss={() => {}}
53
- retryLabel="Try again"
54
- dismissLabel="Ignore"
55
- />,
51
+ <SyncErrorNotice message="Custom" onRetry={() => {}} retryLabel="Try again" />,
56
52
  );
57
53
  expect(await screen.findByText("Try again")).toBeTruthy();
58
- expect(await screen.findByText("Ignore")).toBeTruthy();
59
54
  });
60
55
  });
@@ -10,14 +10,13 @@ export default {
10
10
  docs: {
11
11
  description: {
12
12
  component:
13
- "Rejected-write notice: role=alert message with Retry (same mutation id) and Dismiss. Each affordance only renders when its handler is provided.",
13
+ "Rejected-write notice: role=alert message with Retry (same mutation id) and a close button. Each affordance only renders when its handler is provided.",
14
14
  },
15
15
  },
16
16
  },
17
17
  argTypes: {
18
18
  message: { control: "text" },
19
19
  retryLabel: { control: "text" },
20
- dismissLabel: { control: "text" },
21
20
  },
22
21
  };
23
22
 
@@ -40,11 +39,10 @@ export const AllStates = () => (
40
39
  <SyncErrorNotice message="Write rejected — retry only" onRetry={action("onRetry")} />
41
40
  <SyncErrorNotice message="No actions" />
42
41
  <SyncErrorNotice
43
- message="Custom labels"
42
+ message="Custom Retry label"
44
43
  onRetry={action("onRetry")}
45
44
  onDismiss={action("onDismiss")}
46
45
  retryLabel="Try again"
47
- dismissLabel="Ignore"
48
46
  />
49
47
  </YStack>
50
48
  );
@@ -1,8 +1,6 @@
1
- import { Button, Text } from "@multiplatform.one/components";
2
- import { useResolvedKnobs } from "@multiplatform.one/theme";
1
+ import { Alert } from "@multiplatform.one/components";
3
2
  import React from "react";
4
3
  import { useTranslation } from "react-i18next";
5
- import { XStack } from "tamagui";
6
4
 
7
5
  export interface SyncErrorNoticeProps {
8
6
  /** Human-readable failure message (already localized by the caller). */
@@ -12,20 +10,18 @@ export interface SyncErrorNoticeProps {
12
10
  * Omit to hide the Retry affordance.
13
11
  */
14
12
  onRetry?: () => void;
15
- /** Drops the failed entry without retrying. Omit to hide Dismiss. */
13
+ /** Drops the failed entry without retrying: the alert's close button. Omit to hide it. */
16
14
  onDismiss?: () => void;
17
15
  /** Override the Retry button label (defaults to a localized "Retry"). */
18
16
  retryLabel?: string;
19
- /** Override the Dismiss button label (defaults to a localized "Dismiss"). */
20
- dismissLabel?: string;
21
17
  }
22
18
 
23
19
  /**
24
20
  * The rejected-write notice — the visible half of the optimistic mutation
25
- * contract: when the server rejects a write, the optimistic state has
21
+ * contract, on the MPO error `Alert` (LC-175): when the server rejects a write, the optimistic state has
26
22
  * already been rolled back by the sync engine; this primitive surfaces the
27
23
  * error inline at the surface that initiated the write, with Retry
28
- * (re-issues the SAME mutation id) and Dismiss (clears the ledger entry).
24
+ * (re-issues the SAME mutation id) and a close button (clears the ledger entry).
29
25
  *
30
26
  * Pair with `useFrappePendingMutations` from `@multiplatform.one/frappe`:
31
27
  *
@@ -41,41 +37,17 @@ export interface SyncErrorNoticeProps {
41
37
  * ))}
42
38
  * ```
43
39
  */
44
- export function SyncErrorNotice({
45
- message,
46
- onRetry,
47
- onDismiss,
48
- retryLabel,
49
- dismissLabel,
50
- }: SyncErrorNoticeProps) {
40
+ export function SyncErrorNotice({ message, onRetry, onDismiss, retryLabel }: SyncErrorNoticeProps) {
51
41
  const { t } = useTranslation();
52
- const { knobProps } = useResolvedKnobs();
53
42
  return (
54
- <XStack
55
- role="alert"
56
- alignItems="center"
57
- flexWrap="wrap"
58
- gap="$2"
59
- paddingHorizontal="$3"
60
- paddingVertical="$2"
61
- {...knobProps.borderRadius}
62
- backgroundColor="$red3"
63
- borderColor="$red7"
64
- borderWidth={1}
43
+ <Alert
44
+ intent="error"
45
+ actionLabel={onRetry ? (retryLabel ?? t("Retry")) : undefined}
46
+ onAction={onRetry}
47
+ dismissible={Boolean(onDismiss)}
48
+ onDismiss={onDismiss}
65
49
  >
66
- <Text flex={1} fontSize="$2" color="$red11">
67
- {message}
68
- </Text>
69
- {onRetry && (
70
- <Button size="$2" theme="error" {...knobProps.borderRadius} onPress={onRetry}>
71
- {retryLabel ?? t("Retry")}
72
- </Button>
73
- )}
74
- {onDismiss && (
75
- <Button size="$2" chromeless {...knobProps.borderRadius} onPress={onDismiss}>
76
- {dismissLabel ?? t("Dismiss")}
77
- </Button>
78
- )}
79
- </XStack>
50
+ {message}
51
+ </Alert>
80
52
  );
81
53
  }
@@ -20,7 +20,6 @@ import { useDocTypeMeta, useFrappeCollection, useLiveQuery } from "@multiplatfor
20
20
  import { eq } from "@tanstack/db";
21
21
  import React, { useMemo } from "react";
22
22
  import { useTranslation } from "react-i18next";
23
- import { isWeb } from "tamagui";
24
23
  import {
25
24
  buildSidebarSections,
26
25
  mapDocToSidebarMetadata,
@@ -142,7 +141,7 @@ export function DeskFormSidebar({ doctype, name }: DeskFormSidebarProps) {
142
141
  // inline rail width, and drop the end rail — the pane gap separates the
143
142
  // sidebar from the form (stacked below on compact, the rail would float).
144
143
  width="100%"
145
- {...(isWeb ? { borderInlineEndWidth: 0 } : { borderEndWidth: 0 })}
144
+ divider={false}
146
145
  data-testid="desk-form-sidebar"
147
146
  />
148
147
  );
@@ -90,6 +90,7 @@ function useIsNarrowDesk(): boolean {
90
90
  // Component
91
91
  // ---------------------------------------------------------------------------
92
92
 
93
+ // mpo-role-escape: MPO has no app shell (top bar, nav rail, compact drawer) yet; FZ-7996 builds it and moves DeskShell onto it.
93
94
  export function DeskShell({
94
95
  children,
95
96
  breadcrumbs,
@@ -156,7 +157,6 @@ export function DeskShell({
156
157
  const toggleButton = showMobileToggle ? (
157
158
  <Button
158
159
  chromeless
159
- circular
160
160
  icon={mobileSidebarOpen ? XIcon : ListIcon}
161
161
  aria-label={t("Toggle sidebar")}
162
162
  aria-expanded={mobileSidebarOpen}
@@ -21,9 +21,12 @@ vi.mock("../FrappeListView", () => ({
21
21
  }));
22
22
  vi.mock("../FrappeForm", () => ({
23
23
  FrappeForm: ({ onSave, name }: { onSave: (doc: { name: string }) => void; name?: string }) => (
24
- <button onClick={() => onSave({ name: state.name })} data-testid="form" data-name={name}>
25
- Save
26
- </button>
24
+ <button
25
+ aria-label="Save"
26
+ onClick={() => onSave({ name: state.name })}
27
+ data-testid="form"
28
+ data-name={name}
29
+ />
27
30
  ),
28
31
  }));
29
32
  vi.mock("@multiplatform.one/components", () => ({
@@ -59,7 +62,7 @@ describe.each(["A/B", "A?B", "A#B", "A B", "Pokémon", "A%2FB"])("desk document
59
62
  state.name = name;
60
63
  const navigate = vi.fn();
61
64
  render(<DeskFormPage doctype="todo" onNavigate={navigate} />);
62
- fireEvent.click(screen.getByText("Save"));
65
+ fireEvent.click(screen.getByLabelText("Save"));
63
66
  expect(navigate).toHaveBeenCalledWith(path);
64
67
  });
65
68
  });
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Web `Date` field for the three Frappe date fieldtypes, and the native one
3
- * when the optional `@react-native-community/datetimepicker` peer is absent.
2
+ * The `Date` field for the three Frappe date fieldtypes, on web and native.
3
+ * On iOS and Android the forms pickers open the OS sheet themselves
4
+ * (`OsDateTimeSheet`), so this field has no native fork (FZ-8000).
4
5
  *
5
6
  * The field used to render ONE date-only calendar for all three types, with
6
7
  * only the placeholder varying — so a `Datetime` silently dropped its time
@@ -14,8 +15,8 @@
14
15
  * registry routes the Frappe `Time` fieldtype to, so a
15
16
  * `Date type="time"` and a `Time` field are one control
16
17
  *
17
- * This mirrors what the native half already does (calendar / wheel /
18
- * calendar-then-wheel), and every branch serializes through the one shared
18
+ * On native the same three pickers present the OS calendar, wheel, and
19
+ * calendar-then-wheel, and every branch serializes through the one shared
19
20
  * `wire.ts` body, so a web pick and a native pick of the same moment persist
20
21
  * byte-identical strings.
21
22
  */
@@ -50,8 +51,7 @@ function toPickerDate(value: string | undefined): Date | null {
50
51
  /**
51
52
  * `TimePicker` speaks `HH:mm`; Frappe stores `HH:mm:ss`. Round-tripping
52
53
  * through the shared wire body — rather than padding the string here — is
53
- * what keeps the two platform halves byte-identical, since the native half
54
- * serializes its wheel pick through exactly this call.
54
+ * what keeps a picked time in Frappe's wire shape on every platform.
55
55
  */
56
56
  function toTimeWireValue(picked: string): string {
57
57
  if (!picked) return "";
@@ -130,7 +130,6 @@ export function Date<
130
130
  // No `previousValue`: this picker owns both halves of the value and
131
131
  // preserves an existing time across a day change itself, so carrying
132
132
  // the old time part here would overwrite a time the user just set.
133
- // The native half passes nothing for the same reason.
134
133
  onChange={(date) => emit?.(date ? toFrappeDateValue(date, "datetime") : "")}
135
134
  defaultValue={defaultValue as string}
136
135
  label={fieldProps.label}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The Frappe `Date` field has no native fork (FZ-8000, LC-175): iOS and
3
+ * Android resolve the same catalog field the web does, and forms'
4
+ * `DatePicker`, `DatetimePicker` and `TimePicker` open the OS sheet
5
+ * themselves (`OsDateTimeSheet`, with the catalog overlay when the optional
6
+ * `@react-native-community/datetimepicker` peer is absent, FZ-7357).
7
+ */
8
+
9
+ import { existsSync } from "node:fs";
10
+ import { fileURLToPath } from "node:url";
11
+ import { describe, expect, it } from "vitest";
12
+ import * as catalog from "./catalog";
13
+ import * as entry from "./index";
14
+
15
+ const here = (file: string) => fileURLToPath(new URL(file, import.meta.url));
16
+
17
+ describe("native Date field", () => {
18
+ it("is not forked: no index.native.tsx sits beside the catalog field", () => {
19
+ expect(existsSync(here("./index.tsx"))).toBe(true);
20
+ expect(existsSync(here("./index.native.tsx"))).toBe(false);
21
+ });
22
+
23
+ it("is the catalog field on every platform", () => {
24
+ expect(entry.Date).toBe(catalog.Date);
25
+ });
26
+ });