@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/frappe-ui",
3
- "version": "7.66.0",
3
+ "version": "7.68.0",
4
4
  "description": "Pre-wired Tamagui components for Frappe doctypes with live data",
5
5
  "keywords": [
6
6
  "cross-platform",
@@ -72,18 +72,18 @@
72
72
  "access": "public"
73
73
  },
74
74
  "dependencies": {
75
- "@multiplatform.one/components": "^7.66.0",
76
- "@multiplatform.one/desktop": "^7.66.0",
77
- "@multiplatform.one/forms": "^7.66.0",
78
- "@multiplatform.one/frappe": "^7.66.0",
79
- "@multiplatform.one/i18n": "^7.66.0",
80
- "@multiplatform.one/markdown": "^7.66.0",
81
- "@multiplatform.one/platform": "^7.66.0",
82
- "@multiplatform.one/rich-text": "^7.66.0",
83
- "@multiplatform.one/router": "^7.66.0",
84
- "@multiplatform.one/store": "^7.66.0",
85
- "@multiplatform.one/table": "^7.66.0",
86
- "@multiplatform.one/theme": "^7.66.0",
75
+ "@multiplatform.one/components": "^7.68.0",
76
+ "@multiplatform.one/desktop": "^7.68.0",
77
+ "@multiplatform.one/forms": "^7.68.0",
78
+ "@multiplatform.one/frappe": "^7.68.0",
79
+ "@multiplatform.one/i18n": "^7.68.0",
80
+ "@multiplatform.one/markdown": "^7.68.0",
81
+ "@multiplatform.one/platform": "^7.68.0",
82
+ "@multiplatform.one/rich-text": "^7.68.0",
83
+ "@multiplatform.one/router": "^7.68.0",
84
+ "@multiplatform.one/store": "^7.68.0",
85
+ "@multiplatform.one/table": "^7.68.0",
86
+ "@multiplatform.one/theme": "^7.68.0",
87
87
  "@phosphor-icons/react": "^2.1.10",
88
88
  "@tamagui/colors": "2.7.6",
89
89
  "@tanstack/db": "0.8.0",
@@ -100,9 +100,9 @@
100
100
  "tamagui": "2.7.6"
101
101
  },
102
102
  "devDependencies": {
103
- "@multiplatform.one/config": "7.66.0",
104
- "@multiplatform.one/storybook": "7.66.0",
105
- "@multiplatform.one/test-utils": "7.66.0",
103
+ "@multiplatform.one/config": "7.68.0",
104
+ "@multiplatform.one/storybook": "7.68.0",
105
+ "@multiplatform.one/test-utils": "7.68.0",
106
106
  "@tamagui/build": "2.7.6",
107
107
  "@testing-library/jest-dom": "^7.0.1",
108
108
  "@testing-library/react": "^16.3.3",
@@ -8,6 +8,8 @@ import {
8
8
  ViewSwitcher,
9
9
  type TreeNode,
10
10
  Text,
11
+ ActionButton,
12
+ IconButton,
11
13
  } from "@multiplatform.one/components";
12
14
  import { Button, Checkbox, FileUpload, Input } from "@multiplatform.one/forms";
13
15
  import { DataTable, type DataTableColumn } from "@multiplatform.one/table";
@@ -197,19 +199,11 @@ function BulkBar({
197
199
  marginBottom={placement === "bottom" ? "$3" : 0}
198
200
  >
199
201
  <Text fontSize="$3">{t("{{count}} selected", { count })}</Text>
200
- <Button size="$4" chromeless icon={DownloadSimpleIcon} onPress={onDownload}>
201
- {t("Download")}
202
- </Button>
203
- <Button size="$4" chromeless icon={UploadSimpleIcon} onPress={onMove}>
204
- {t("Move")}
205
- </Button>
206
- <Button size="$4" chromeless icon={TrashIcon} onPress={onDelete}>
207
- {t("Delete")}
208
- </Button>
202
+ <IconButton icon={DownloadSimpleIcon} aria-label={t("Download")} onPress={onDownload} />
203
+ <IconButton icon={UploadSimpleIcon} aria-label={t("Move")} onPress={onMove} />
204
+ <ActionButton kind="delete" onPress={onDelete} />
209
205
  <XStack flex={1} />
210
- <Button size="$4" chromeless icon={XIcon} onPress={onClear}>
211
- {t("Clear")}
212
- </Button>
206
+ <IconButton icon={XIcon} aria-label={t("Clear")} onPress={onClear} />
213
207
  </XStack>
214
208
  );
215
209
  }
@@ -471,9 +465,11 @@ export function FileBrowser({
471
465
  />
472
466
  </YStack>
473
467
  {onUpload ? (
474
- <Button size="$4" icon={UploadSimpleIcon} onPress={() => setUploadOpen(true)}>
475
- {t("Upload")}
476
- </Button>
468
+ <IconButton
469
+ icon={UploadSimpleIcon}
470
+ aria-label={t("Upload")}
471
+ onPress={() => setUploadOpen(true)}
472
+ />
477
473
  ) : null}
478
474
  </XStack>
479
475
  );
@@ -152,7 +152,7 @@ export const BrokenImage = () => (
152
152
  />
153
153
  );
154
154
 
155
- /** No image set + onImageAdd: renders the dashed "Add image" placeholder button. */
155
+ /** No image set + onImageAdd: renders the bare "Add image" icon button. */
156
156
  export const ImagePlaceholder = () => (
157
157
  <FormSidebar
158
158
  onImageAdd={action("onImageAdd")}
@@ -17,23 +17,20 @@
17
17
  * DeskParity story.
18
18
  */
19
19
 
20
- import { Avatar, componentColors, getInitials } from "@multiplatform.one/components";
20
+ import {
21
+ ActionButton,
22
+ Avatar,
23
+ Image,
24
+ Sidebar,
25
+ Text,
26
+ type SidebarSection as MpoSidebarSection,
27
+ } from "@multiplatform.one/components";
21
28
  import { Button } from "@multiplatform.one/forms";
22
29
  import { useResolvedKnobs } from "@multiplatform.one/theme";
23
- import { ImageSquareIcon, PlusIcon, UploadIcon, UserIcon, XIcon } from "@phosphor-icons/react";
30
+ import { ImageSquareIcon, PlusIcon, UserIcon, XIcon } from "@phosphor-icons/react";
24
31
  import React from "react";
25
32
  import { useTranslation } from "react-i18next";
26
- import {
27
- Image,
28
- ListItem,
29
- Separator,
30
- Text,
31
- XStack,
32
- YStack,
33
- isWeb,
34
- useTheme,
35
- type YStackProps,
36
- } from "tamagui";
33
+ import { XStack, YStack, useTheme } from "tamagui";
37
34
 
38
35
  // ---------------------------------------------------------------------------
39
36
  // Types
@@ -73,7 +70,7 @@ export interface SidebarMetadataEntry {
73
70
  icon?: React.ReactNode;
74
71
  }
75
72
 
76
- export interface FormSidebarProps extends Omit<YStackProps, "children"> {
73
+ export interface FormSidebarProps {
77
74
  /** Optional image URL to display at the top */
78
75
  imageUrl?: string;
79
76
  /** Accessible label for the image block (defaults to "Document image") */
@@ -87,30 +84,23 @@ export interface FormSidebarProps extends Omit<YStackProps, "children"> {
87
84
  sections?: SidebarSection[];
88
85
  /** Metadata lines shown at the bottom (e.g. created by / modified by) */
89
86
  metadata?: SidebarMetadataEntry[];
90
- }
91
-
92
- // ---------------------------------------------------------------------------
93
- // Helpers
94
- // ---------------------------------------------------------------------------
95
-
96
- // Initials come from the catalog Avatar helper (census #21) — the local copy
97
- // this file carried could drift from the one Timeline/Avatar consume.
98
-
99
- // R12 tint family (decorative, not semantic): orange / blue / purple / pink.
100
- const avatarColors = ["$orange4", "$blue4", "$purple4", "$pink4"];
101
- function avatarColor(index: number): string {
102
- return avatarColors[index % avatarColors.length];
103
- }
104
-
105
- const textColors = ["$orange11", "$blue11", "$purple11", "$pink11"];
106
- function textColor(index: number): string {
107
- return textColors[index % textColors.length];
87
+ /** Rail width (default 280); `"100%"` fills a supporting pane. */
88
+ width?: number | string;
89
+ /** The end-edge hairline (default on); off inside a pane whose seam divides it. */
90
+ divider?: boolean;
91
+ "data-testid"?: string;
108
92
  }
109
93
 
110
94
  // ---------------------------------------------------------------------------
111
95
  // Component
112
96
  // ---------------------------------------------------------------------------
113
97
 
98
+ /**
99
+ * The document rail on the MPO `Sidebar` in its complementary role (LC-175):
100
+ * the image block, the people sections, custom sections and the Info
101
+ * metadata are Sidebar sections, so the rail takes MPO's surface, caption,
102
+ * row and divider look.
103
+ */
114
104
  export function FormSidebar({
115
105
  imageUrl,
116
106
  imageLabel,
@@ -118,7 +108,9 @@ export function FormSidebar({
118
108
  onImageRemove,
119
109
  sections = [],
120
110
  metadata = [],
121
- ...stackProps
111
+ width = 280,
112
+ divider = true,
113
+ "data-testid": testID,
122
114
  }: FormSidebarProps) {
123
115
  const { t } = useTranslation();
124
116
  const { knobProps } = useResolvedKnobs();
@@ -133,237 +125,140 @@ export function FormSidebar({
133
125
  const [erroredUrl, setErroredUrl] = React.useState<string | undefined>();
134
126
  const imageBroken = Boolean(imageUrl) && erroredUrl === imageUrl;
135
127
 
136
- // Scale typography, avatars, icons and the image block with the size token
137
128
  const sz = knobProps.sizeToken;
138
- const avatarSize = sz === "$3" ? "$1" : sz === "$5" ? "$3" : "$2";
139
129
  const imageSize = sz === "$3" ? 160 : sz === "$5" ? 240 : 200;
140
130
 
141
131
  const resolvedImageLabel = imageLabel ?? t("Document image");
142
- const showImageBlock = Boolean(imageUrl) || Boolean(onImageAdd);
143
132
 
144
- return (
145
- <YStack
146
- // Radius-only fragment: the full borderRadius fragment carries
147
- // borderWidth and drew an unintended box border around the whole rail
148
- // (rtl-audit U6); the panel border is the logical end rail below.
149
- {...knobProps.containerRadius}
150
- {...knobProps.panelPadding}
151
- {...knobProps.gapLg}
152
- width={280}
153
- // Logical end edge so the rail mirrors in RTL; tamagui borderEndWidth
154
- // does not compile to working CSS on web (SB-M-1215)
155
- {...(isWeb
156
- ? {
157
- borderInlineEndWidth: 1,
158
- borderInlineEndStyle: "solid" as any,
159
- borderInlineEndColor: "$borderColor",
160
- }
161
- : { borderEndWidth: 1, borderEndColor: "$borderColor" })}
162
- {...stackProps}
163
- >
164
- {/* -- Image section -- */}
165
- {showImageBlock && (
166
- <>
167
- <YStack alignItems="center" gap="$2">
168
- {imageUrl && !imageBroken ? (
169
- <Image
170
- {...knobProps.containerRadius}
171
- // src (string), not source: the RN source object leaks onto
172
- // the DOM <img> as source="[object Object]" on web
173
- src={imageUrl}
174
- alt={resolvedImageLabel}
175
- width={imageSize}
176
- height={imageSize}
177
- objectFit="contain"
178
- onError={() => setErroredUrl(imageUrl)}
179
- />
180
- ) : imageUrl && imageBroken ? (
181
- <YStack
182
- {...knobProps.containerRadius}
183
- width={imageSize}
184
- height={imageSize}
185
- alignItems="center"
186
- justifyContent="center"
187
- gap="$2"
188
- borderWidth={1}
189
- borderStyle="dashed"
190
- borderColor="$borderColor"
191
- aria-label={resolvedImageLabel}
192
- >
193
- <ImageSquareIcon size={iconSize * 2} color={placeholderIconColor} />
194
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
195
- {t("Image failed to load")}
196
- </Text>
197
- </YStack>
198
- ) : (
199
- <YStack
200
- role="button"
201
- tabIndex={0}
133
+ // LC-260 ICONS-OVER-WORDS: Replace and Remove are their symbols, floating
134
+ // over the image on the LC-176 media plate.
135
+ const imageActions =
136
+ imageUrl && (onImageAdd || onImageRemove)
137
+ ? (overMedia: boolean) => (
138
+ <>
139
+ {onImageAdd ? (
140
+ <ActionButton
141
+ kind="replace"
142
+ label={t("Replace image")}
143
+ overMedia={overMedia}
202
144
  onPress={onImageAdd}
203
- aria-label={t("Add image")}
204
- width={imageSize}
205
- height={imageSize}
206
- alignItems="center"
207
- justifyContent="center"
208
- cursor="pointer"
145
+ />
146
+ ) : null}
147
+ {onImageRemove ? (
148
+ <ActionButton
149
+ kind="remove"
150
+ label={t("Remove image")}
151
+ overMedia={overMedia}
152
+ onPress={onImageRemove}
153
+ />
154
+ ) : null}
155
+ </>
156
+ )
157
+ : undefined;
158
+
159
+ const imageBlock =
160
+ imageUrl || onImageAdd ? (
161
+ <YStack alignItems="center" gap="$2">
162
+ {imageUrl ? (
163
+ <YStack position="relative">
164
+ <Image
165
+ {...knobProps.containerRadius}
166
+ src={imageBroken ? undefined : imageUrl}
167
+ alt={resolvedImageLabel}
168
+ width={imageSize}
169
+ height={imageSize}
170
+ objectFit="contain"
171
+ onError={() => setErroredUrl(imageUrl)}
172
+ />
173
+ {imageActions && !imageBroken ? (
174
+ <XStack
175
+ data-form-sidebar="image-actions"
176
+ position="absolute"
177
+ top="$2"
178
+ right="$2"
179
+ zIndex={1}
209
180
  gap="$2"
210
- {...knobProps.containerRadius}
211
- borderWidth={1}
212
- borderStyle="dashed"
213
- borderColor="$borderColor"
214
181
  >
215
- <ImageSquareIcon size={iconSize * 2} color={placeholderIconColor} />
216
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
217
- {t("Add image")}
218
- </Text>
219
- </YStack>
220
- )}
182
+ {imageActions(true)}
183
+ </XStack>
184
+ ) : null}
185
+ </YStack>
186
+ ) : (
187
+ <Button
188
+ chromeless
189
+ icon={ImageSquareIcon}
190
+ aria-label={t("Add image")}
191
+ onPress={onImageAdd}
192
+ />
193
+ )}
194
+ {imageBroken ? (
195
+ <Text color={knobProps.textAccentColor} {...knobProps.label}>
196
+ {t("Image failed to load")}
197
+ </Text>
198
+ ) : null}
199
+ {imageBroken && imageActions ? <XStack gap="$2">{imageActions(false)}</XStack> : null}
200
+ </YStack>
201
+ ) : null;
221
202
 
222
- {imageUrl && (onImageAdd || onImageRemove) && (
223
- <XStack gap="$2">
224
- {onImageAdd && (
225
- <Button
226
- size="$2"
227
- chromeless
228
- icon={UploadIcon}
229
- aria-label={t("Replace image")}
230
- onPress={onImageAdd}
231
- >
232
- {t("Replace")}
233
- </Button>
234
- )}
235
- {onImageRemove && (
203
+ const railSections: MpoSidebarSection[] = [
204
+ ...(imageBlock ? [{ items: [], content: imageBlock }] : []),
205
+ ...sections.map(
206
+ (section): MpoSidebarSection => ({
207
+ title: section.title,
208
+ icon: section.icon,
209
+ action: section.onAdd ? (
210
+ <Button
211
+ size="$2"
212
+ chromeless
213
+ icon={PlusIcon}
214
+ aria-label={t("Add {{section}}", { section: section.title })}
215
+ onPress={section.onAdd}
216
+ />
217
+ ) : undefined,
218
+ ...(section.render
219
+ ? { items: [], content: section.render() }
220
+ : {
221
+ items: (section.items ?? []).map((item) => ({
222
+ label: item.label,
223
+ value: item.id,
224
+ subTitle: item.sublabel,
225
+ icon: <Avatar name={item.label} nested />,
226
+ trailing: section.onRemoveItem ? (
236
227
  <Button
237
228
  size="$2"
238
229
  chromeless
239
230
  icon={XIcon}
240
- aria-label={t("Remove image")}
241
- onPress={onImageRemove}
242
- >
243
- {t("Remove")}
244
- </Button>
245
- )}
246
- </XStack>
247
- )}
248
- </YStack>
249
- <Separator />
250
- </>
251
- )}
252
-
253
- {/* -- Dynamic sections -- */}
254
- {sections.map((section, sectionIdx) => (
255
- <React.Fragment key={section.key}>
256
- <YStack {...knobProps.gap}>
257
- <XStack alignItems="center" justifyContent="space-between">
258
- <XStack alignItems="center" gap="$2">
259
- {section.icon}
260
- <Text color={knobProps.textAccentColor} {...knobProps.label} fontWeight="400">
261
- {section.title}
262
- </Text>
263
- </XStack>
264
- {section.onAdd && (
265
- <Button
266
- size="$2"
267
- circular
268
- chromeless
269
- icon={PlusIcon}
270
- aria-label={t("Add {{section}}", {
271
- section: section.title,
272
- })}
273
- onPress={section.onAdd}
274
- />
275
- )}
276
- </XStack>
277
-
278
- {section.render ? (
279
- section.render()
280
- ) : section.items && section.items.length > 0 ? (
281
- <YStack {...knobProps.gap}>
282
- {section.items.map((item) => (
283
- <XStack key={item.id} gap="$2" alignItems="center">
284
- <Avatar circular size={avatarSize} backgroundColor={avatarColor(sectionIdx)}>
285
- <Avatar.Fallback backgroundColor={avatarColor(sectionIdx)}>
286
- <Text color={textColor(sectionIdx)} {...knobProps.label} fontWeight="700">
287
- {getInitials(item.label)}
288
- </Text>
289
- </Avatar.Fallback>
290
- </Avatar>
291
- <YStack flex={1}>
292
- <Text
293
- color={componentColors.text.primary}
294
- numberOfLines={1}
295
- {...knobProps.label}
296
- >
297
- {item.label}
298
- </Text>
299
- {item.sublabel && (
300
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
301
- {item.sublabel}
302
- </Text>
303
- )}
304
- </YStack>
305
- {section.onRemoveItem && (
306
- <Button
307
- size="$2"
308
- circular
309
- chromeless
310
- icon={XIcon}
311
- aria-label={t("Remove {{name}}", { name: item.label })}
312
- onPress={() => section.onRemoveItem?.(item)}
313
- />
314
- )}
315
- </XStack>
316
- ))}
317
- </YStack>
318
- ) : (
319
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
320
- {section.emptyText ?? t("None")}
321
- </Text>
322
- )}
323
- </YStack>
324
-
325
- {sectionIdx < sections.length - 1 && <Separator />}
326
- </React.Fragment>
327
- ))}
328
-
329
- {/* -- Separator before metadata -- */}
330
- {metadata.length > 0 && sections.length > 0 && <Separator />}
331
-
332
- {/* -- Info / Metadata -- */}
333
- {metadata.length > 0 && (
334
- <YStack gap="$1">
335
- <Text
336
- color={knobProps.textAccentColor}
337
- paddingHorizontal="$2"
338
- {...knobProps.label}
339
- fontWeight="400"
340
- >
341
- {t("Info")}
342
- </Text>
343
- {metadata.map((entry) => (
344
- <ListItem
345
- key={entry.label}
346
- size={knobProps.sizeToken}
347
- icon={
348
- (entry.icon ?? (
349
- <UserIcon
350
- size={iconSize}
351
- color={placeholderIconColor}
352
- style={{ flexShrink: 0 }}
231
+ aria-label={t("Remove {{name}}", { name: item.label })}
232
+ onPress={() => section.onRemoveItem?.(item)}
353
233
  />
354
- )) as any
355
- }
356
- title={
357
- <Text color={knobProps.textAccentColor} {...knobProps.label}>
358
- {entry.label}
359
- </Text>
360
- }
361
- backgroundColor="transparent"
362
- paddingVertical="$1"
363
- />
364
- ))}
365
- </YStack>
366
- )}
367
- </YStack>
234
+ ) : undefined,
235
+ })),
236
+ emptyText: section.emptyText ?? t("None"),
237
+ }),
238
+ }),
239
+ ),
240
+ ...(metadata.length > 0
241
+ ? [
242
+ {
243
+ title: t("Info"),
244
+ items: metadata.map((entry) => ({
245
+ label: entry.label,
246
+ value: entry.label,
247
+ icon: entry.icon ?? <UserIcon size={iconSize} color={placeholderIconColor} />,
248
+ })),
249
+ },
250
+ ]
251
+ : []),
252
+ ];
253
+
254
+ return (
255
+ <Sidebar
256
+ role="complementary"
257
+ aria-label={t("Document details")}
258
+ width={width}
259
+ divider={divider}
260
+ sections={railSections}
261
+ testID={testID}
262
+ />
368
263
  );
369
264
  }
@@ -196,7 +196,6 @@ function AssignmentRow({
196
196
  {onComplete ? (
197
197
  <Button
198
198
  size="$2"
199
- circular
200
199
  chromeless
201
200
  disabled={disabled}
202
201
  aria-label={t("Mark assignment complete")}
@@ -207,7 +206,6 @@ function AssignmentRow({
207
206
  {onRemove ? (
208
207
  <Button
209
208
  size="$2"
210
- circular
211
209
  chromeless
212
210
  disabled={disabled}
213
211
  aria-label={t("Remove assignment")}
@@ -386,7 +384,6 @@ function FrappeAssignmentBody({
386
384
  {canMutate ? (
387
385
  <Button
388
386
  size="$2"
389
- circular
390
387
  chromeless
391
388
  aria-label={t("Add assignment")}
392
389
  onPress={() => setAddOpen((prev) => !prev)}
@@ -3,11 +3,10 @@ import {
3
3
  type FrappeConnectionState,
4
4
  type UseFrappeCollectionConfig,
5
5
  } from "@multiplatform.one/frappe";
6
- import { radiusClassProps, useResolvedKnobs } from "@multiplatform.one/theme";
6
+ import { StatusDot } from "@multiplatform.one/components";
7
7
  import React from "react";
8
8
  import { useTranslation } from "react-i18next";
9
- import { XStack, YStack } from "tamagui";
10
- import { Text } from "@multiplatform.one/components";
9
+ import { XStack } from "tamagui";
11
10
 
12
11
  export interface FrappeConnectionIndicatorProps {
13
12
  /** The same connection config the sibling collection hooks use. */
@@ -21,7 +20,8 @@ export interface FrappeConnectionIndicatorProps {
21
20
  }
22
21
 
23
22
  /**
24
- * Compact "Reconnecting" status pill for live Frappe views.
23
+ * Compact "Reconnecting" status for live Frappe views: the MPO `StatusDot`
24
+ * in the warning tone (LC-169, LC-175).
25
25
  *
26
26
  * Shows only while the realtime socket is down after having been up
27
27
  * (`everConnected && !connected`) — during that window updates arrive via
@@ -31,34 +31,12 @@ export interface FrappeConnectionIndicatorProps {
31
31
  */
32
32
  export function FrappeConnectionIndicator({ config, connection }: FrappeConnectionIndicatorProps) {
33
33
  const { t } = useTranslation();
34
- const { knobProps } = useResolvedKnobs();
35
34
  const hooked = useFrappeConnection(config);
36
35
  const { connected, everConnected } = connection ?? hooked;
37
36
  if (connected || !everConnected) return null;
38
37
  return (
39
- <XStack
40
- role="status"
41
- aria-live="polite"
42
- alignSelf="flex-start"
43
- alignItems="center"
44
- gap="$2"
45
- paddingHorizontal="$3"
46
- paddingVertical="$1.5"
47
- {...knobProps.borderRadius}
48
- backgroundColor="$yellow3"
49
- borderColor="$yellow7"
50
- borderWidth={1}
51
- >
52
- <YStack
53
- {...radiusClassProps("R-PILL", "connection status dot")}
54
- width={8}
55
- height={8}
56
- borderRadius={4}
57
- backgroundColor="$yellow10"
58
- />
59
- <Text fontSize="$2" color="$yellow11">
60
- {t("Reconnecting…")}
61
- </Text>
38
+ <XStack role="status" aria-live="polite" alignSelf="flex-start">
39
+ <StatusDot tone="warning">{t("Reconnecting…")}</StatusDot>
62
40
  </XStack>
63
41
  );
64
42
  }
@@ -78,10 +78,14 @@ describe("FrappeDashboard refresh press floor (LC-54 amendment)", () => {
78
78
  expect(refresh.className).not.toMatch(negativeMarginAtom);
79
79
  const token = refresh.getAttribute("data-size-token") as SizeTokens;
80
80
  const px = Number(getVariableValue(getSize(token)));
81
- expect(refresh.className).toContain(`_mih-${px}px`);
82
- expect(refresh.className).toContain(`_miw-${px}px`);
81
+ // LC-176: the bare glyph sits in a square box at its control height, inside
82
+ // the token box, and slop restores the 44pt press floor.
83
+ const box = Number(/(?:^| )_mih-(\d+)px/.exec(refresh.className)?.[1]);
84
+ expect(refresh.className).toContain(`_miw-${box}px`);
85
+ expect(box).toBeGreaterThan(0);
86
+ expect(box).toBeLessThanOrEqual(px);
83
87
  const slop = Number(refresh.getAttribute("data-mp-press-slop") ?? 0);
84
- expect(px + slop * 2).toBeGreaterThanOrEqual(44);
88
+ expect(box + slop * 2).toBeGreaterThanOrEqual(44);
85
89
  });
86
90
 
87
91
  it("hover feedback rides the button's own in-slot box (house channel)", () => {