@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
@@ -1,11 +1,11 @@
1
1
  import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { chipFrameGeometry, chipTextSize } from "@multiplatform.one/components";
2
3
  import {
3
4
  applyThemeScale,
4
5
  createDefaultThemeConfig,
5
6
  DEFAULT_SCALE_ID,
6
7
  densePreset,
7
8
  Surface,
8
- sizeRecipeForToken,
9
9
  sizeKeyBelow,
10
10
  } from "@multiplatform.one/theme";
11
11
  import { cleanup, fireEvent } from "@testing-library/react";
@@ -22,26 +22,25 @@ const options = [
22
22
  { value: "fire", label: "Fire", count: 2 },
23
23
  ];
24
24
 
25
- describe("FacetRail chip recipes", () => {
25
+ describe("FacetRail chips are MPO Chips (LC-175)", () => {
26
26
  for (const scaleId of [DEFAULT_SCALE_ID, "dense"]) {
27
27
  for (const size of ["$true", "$3", "$5"] as const) {
28
- it(`${scaleId} at ${size} paints one full step below its controls`, () => {
28
+ it(`${scaleId} at ${size} paints the MPO chip one full step below its controls`, () => {
29
29
  applyThemeScale(config.scales![scaleId]);
30
30
  const token = sizeKeyBelow(size);
31
- const recipe = sizeRecipeForToken(token, { family: "chip" });
32
- const count = sizeRecipeForToken(sizeKeyBelow(token), { family: "chip" });
31
+ const geometry = chipFrameGeometry(token);
32
+ const font = chipTextSize(token as "$2");
33
33
  const result = renderWithProviders(
34
34
  <Surface size={size}>
35
35
  <FacetRail label="Type" value="" options={options} onChange={() => {}} />
36
36
  </Surface>,
37
37
  );
38
38
  const frame = result.getByRole("radio", { name: "Fire 2" });
39
+ expect(frame.hasAttribute("data-chip")).toBe(true);
39
40
  const style = getComputedStyle(frame);
40
- expect(style.height).toBe(`${recipe.height}px`);
41
- expect(style.paddingLeft).toBe(`${recipe.paddingHorizontal}px`);
42
- expect(style.gap).toBe(`${recipe.gap}px`);
43
- expect(getComputedStyle(result.getByText("Fire")).fontSize).toBe(`${recipe.fontSize}px`);
44
- expect(getComputedStyle(result.getByText("2")).fontSize).toBe(`${count.fontSize}px`);
41
+ expect(style.paddingLeft).toBe(`${geometry.paddingHorizontal}px`);
42
+ expect(getComputedStyle(result.getByText("Fire")).fontSize).toBe(`${font}px`);
43
+ expect(getComputedStyle(result.getByText("2")).fontSize).toBe(`${font}px`);
45
44
  });
46
45
  }
47
46
  }
@@ -53,6 +52,8 @@ describe("FacetRail chip recipes", () => {
53
52
  );
54
53
  const fire = result.getByRole("radio", { name: "Fire 2" });
55
54
  expect(fire.getAttribute("aria-checked")).toBe("true");
55
+ expect(fire.getAttribute("tabindex")).toBe("0");
56
+ expect(result.getByRole("radio", { name: "All 6" }).getAttribute("tabindex")).toBe("-1");
56
57
  fireEvent.click(fire);
57
58
  expect(onChange).toHaveBeenLastCalledWith("");
58
59
  fireEvent.keyDown(fire, { key: "ArrowLeft" });
@@ -1,13 +1,8 @@
1
- import { ScrollView, Text, XStack, isWeb } from "@multiplatform.one/components";
1
+ import { Chip, ScrollView, XStack, isWeb, type ChipSize } from "@multiplatform.one/components";
2
2
  import {
3
3
  ensureKeyboardModalityTracking,
4
- keyboardFocusRingProps,
5
- pressTargetHitSlop,
6
4
  sizeKeyBelow,
7
- sizeRecipeForToken,
8
- transitionProps,
9
5
  useResolvedKnobs,
10
- wasKeyboardFocus,
11
6
  } from "@multiplatform.one/theme";
12
7
  import { useRef, useState } from "react";
13
8
 
@@ -30,147 +25,25 @@ export interface FacetRailProps {
30
25
  testID?: string;
31
26
  }
32
27
 
33
- interface RailChipProps {
34
- option: FacetRailOption;
35
- selected: boolean;
36
- tabStop: boolean;
37
- onPress: () => void;
38
- onFocusChip: () => void;
39
- onBlurChip: () => void;
40
- onMove: (direction: -1 | 1 | "home" | "end") => void;
41
- testID?: string;
42
- register: (node: { focus?: () => void } | null) => void;
43
- }
44
-
45
- // Chips paint one full step under the toolbar controls; hitSlop restores the
46
- // 44px press target (DG-LAY-04, ViewSwitcher precedent).
47
- const pipSize = "$1";
48
-
49
- /**
50
- * One chip. Neutral until active; the active chip fills from its tint ramp
51
- * (DF-04 pairing: tint fill, step-12 text), so selected is fill, never a
52
- * sibling border (LC-71). An unselected tinted chip carries a hue pip.
53
- */
54
- function RailChip({
55
- option,
56
- selected,
57
- tabStop,
58
- onPress,
59
- onFocusChip,
60
- onBlurChip,
61
- onMove,
62
- testID,
63
- register,
64
- }: RailChipProps) {
65
- const { knobProps } = useResolvedKnobs();
66
- const chipToken = sizeKeyBelow(knobProps.sizeToken);
67
- const chip = sizeRecipeForToken(chipToken, { family: "chip" });
68
- const count = sizeRecipeForToken(sizeKeyBelow(chipToken), { family: "chip" });
69
- const [kbFocus, setKbFocus] = useState(false);
70
- if (isWeb) ensureKeyboardModalityTracking();
71
- const hue = option.tint;
72
- const fill = selected ? (hue ? `$${hue}5` : "$color5") : hue ? `$${hue}3` : "$color3";
73
- const hoverFill = selected ? fill : hue ? `$${hue}4` : "$color4";
74
- const textColor = selected ? (hue ? `$${hue}12` : "$color12") : hue ? `$${hue}11` : "$color11";
75
- const keys: Record<string, -1 | 1 | "home" | "end"> = {
76
- ArrowRight: 1,
77
- ArrowLeft: -1,
78
- Home: "home",
79
- End: "end",
80
- };
81
-
82
- return (
83
- <XStack
84
- ref={register}
85
- {...knobProps.borderRadius}
86
- backgroundColor={fill as never}
87
- borderWidth={0}
88
- paddingHorizontal={chip.paddingHorizontal}
89
- height={chip.height}
90
- hitSlop={pressTargetHitSlop(chip.height)}
91
- alignItems="center"
92
- gap={chip.gap}
93
- cursor="pointer"
94
- role="radio"
95
- aria-checked={selected}
96
- {...(isWeb ? { tabIndex: tabStop ? 0 : -1 } : undefined)}
97
- {...transitionProps(knobProps.motion.control)}
98
- hoverStyle={{ backgroundColor: hoverFill as never }}
99
- pressStyle={{ backgroundColor: fill as never }}
100
- outlineWidth={0}
101
- focusStyle={{ outlineWidth: 0, backgroundColor: fill as never }}
102
- focusVisibleStyle={{ outlineWidth: 0 }}
103
- {...(isWeb
104
- ? {
105
- onFocus: () => {
106
- onFocusChip();
107
- if (wasKeyboardFocus()) setKbFocus(true);
108
- },
109
- onBlur: () => {
110
- onBlurChip();
111
- setKbFocus(false);
112
- },
113
- onKeyDown: (event: { key?: string; preventDefault?: () => void }) => {
114
- const direction = event.key ? keys[event.key] : undefined;
115
- if (direction !== undefined) {
116
- event.preventDefault?.();
117
- onMove(direction);
118
- return;
119
- }
120
- if (event.key === "Enter" || event.key === " ") {
121
- event.preventDefault?.();
122
- onPress();
123
- }
124
- },
125
- }
126
- : undefined)}
127
- {...(kbFocus ? keyboardFocusRingProps : undefined)}
128
- onPress={onPress}
129
- testID={testID}
130
- >
131
- {hue ? (
132
- <XStack
133
- width={pipSize}
134
- height={pipSize}
135
- borderRadius={1000}
136
- backgroundColor={`$${hue}9` as never}
137
- flexShrink={0}
138
- />
139
- ) : null}
140
- <Text
141
- {...knobProps.label}
142
- fontSize={chip.fontSize}
143
- fontWeight={selected ? "700" : "500"}
144
- color={textColor as never}
145
- textTransform="capitalize"
146
- userSelect="none"
147
- >
148
- {option.label}
149
- </Text>
150
- {typeof option.count === "number" ? (
151
- <Text
152
- {...knobProps.label}
153
- fontSize={count.fontSize}
154
- fontWeight="700"
155
- color={textColor as never}
156
- opacity={0.7}
157
- userSelect="none"
158
- >
159
- {option.count}
160
- </Text>
161
- ) : null}
162
- </XStack>
163
- );
164
- }
28
+ const moves: Record<string, -1 | 1 | "home" | "end"> = {
29
+ ArrowRight: 1,
30
+ ArrowLeft: -1,
31
+ Home: "home",
32
+ End: "end",
33
+ };
165
34
 
166
35
  /**
167
- * A single-select facet as a horizontally scrolling chip rail. One tap
168
- * narrows, a second tap on the active chip clears. One tab stop (LC-49):
169
- * arrows, Home and End move and select like a radiogroup, and the focused
170
- * chip paints the only ring (LC-71). Scrolls on narrow viewports instead of
171
- * wrapping into a wall of chips.
36
+ * A single-select facet as a horizontally scrolling rail of MPO `Chip`s, one
37
+ * step under the toolbar controls (LC-175). One tap narrows, a second tap on
38
+ * the active chip clears. One tab stop (LC-49): arrows, Home and End move and
39
+ * select like a radiogroup, and the focused chip paints the only ring
40
+ * (LC-71). Scrolls on narrow viewports instead of wrapping into a wall of
41
+ * chips. A tinted value paints from its ramp; the active chip takes the
42
+ * theme's selected look (LC-131).
172
43
  */
173
44
  export function FacetRail({ label, value, options, onChange, testID }: FacetRailProps) {
45
+ const { knobProps } = useResolvedKnobs();
46
+ const chipSize = sizeKeyBelow(knobProps.sizeToken) as ChipSize;
174
47
  const itemRefs = useRef<Record<string, { focus?: () => void } | null>>({});
175
48
  const [focusValue, setFocusValue] = useState<string | null>(null);
176
49
  if (isWeb) ensureKeyboardModalityTracking();
@@ -215,24 +88,39 @@ export function FacetRail({ label, value, options, onChange, testID }: FacetRail
215
88
  paddingVertical="$1"
216
89
  testID={testID}
217
90
  >
218
- {options.map((option) => (
219
- <RailChip
220
- key={option.value || "__all"}
221
- option={option}
222
- selected={option.value === value}
223
- tabStop={option.value === anchor}
224
- onPress={() =>
225
- onChange(option.value === value && option.value !== "" ? "" : option.value)
226
- }
227
- onFocusChip={() => setFocusValue(option.value)}
228
- onBlurChip={() => setFocusValue((prev) => (prev === option.value ? null : prev))}
229
- onMove={(direction) => moveFrom(option.value, direction)}
230
- testID={testID ? `${testID}-${option.value || "all"}` : undefined}
231
- register={(node) => {
232
- itemRefs.current[option.value] = node;
233
- }}
234
- />
235
- ))}
91
+ {options.map((option) => {
92
+ const selected = option.value === value;
93
+ return (
94
+ <Chip
95
+ key={option.value || "__all"}
96
+ ref={(node: unknown) => {
97
+ itemRefs.current[option.value] = node as { focus?: () => void } | null;
98
+ }}
99
+ role="radio"
100
+ selected={selected}
101
+ tabIndex={option.value === anchor ? 0 : -1}
102
+ size={chipSize}
103
+ color={option.tint}
104
+ swatch={option.tint && !selected ? (`$${option.tint}9` as never) : undefined}
105
+ count={option.count}
106
+ aria-label={
107
+ typeof option.count === "number" ? `${option.label} ${option.count}` : option.label
108
+ }
109
+ onPress={() => onChange(selected && option.value !== "" ? "" : option.value)}
110
+ onFocus={() => setFocusValue(option.value)}
111
+ onBlur={() => setFocusValue((prev) => (prev === option.value ? null : prev))}
112
+ onKeyDown={(event) => {
113
+ const direction = moves[event.key];
114
+ if (direction === undefined) return;
115
+ event.preventDefault();
116
+ moveFrom(option.value, direction);
117
+ }}
118
+ testID={testID ? `${testID}-${option.value || "all"}` : undefined}
119
+ >
120
+ {option.label}
121
+ </Chip>
122
+ );
123
+ })}
236
124
  </XStack>
237
125
  </ScrollView>
238
126
  );
@@ -208,9 +208,7 @@ export function ListControls({
208
208
  {shuffle ? (
209
209
  <Tooltip content={t("Open a random record")}>
210
210
  <Button
211
- outlined={!shuffle.open}
212
- theme={shuffle.open ? "accent" : undefined}
213
- circular
211
+ selected={shuffle.open}
214
212
  onPress={shuffle.toggle}
215
213
  icon={<DiceFiveIcon size={16} />}
216
214
  aria-label={t("Surprise me")}
@@ -7,6 +7,7 @@ import {
7
7
  XStack,
8
8
  YStack,
9
9
  isWeb,
10
+ OverlayHeader,
10
11
  } from "@multiplatform.one/components";
11
12
  import { Button, SearchInput, Select, Switch } from "@multiplatform.one/forms";
12
13
  import {
@@ -180,7 +181,6 @@ export function ListControlsSheet({
180
181
  <XStack gap="$2" alignItems="center" flexShrink={0}>
181
182
  {shuffle ? (
182
183
  <Button
183
- circular
184
184
  chromeless
185
185
  onPress={shuffle.toggle}
186
186
  icon={DiceFiveIcon}
@@ -212,17 +212,15 @@ export function ListControlsSheet({
212
212
  onOpenChange={setOpen}
213
213
  scrollable
214
214
  header={
215
- <XStack alignItems="center" gap="$2">
216
- <Text fontSize="$6" fontWeight="700" color="$color12">
217
- {t("Filters", "Filters")}
218
- </Text>
219
- <Button chromeless onPress={reset} testID={`${testID}-reset`}>
220
- {t("Reset")}
221
- </Button>
222
- <Button chromeless onPress={() => setOpen(false)}>
223
- {t("Done")}
224
- </Button>
225
- </XStack>
215
+ <OverlayHeader
216
+ title={t("Filters", "Filters")}
217
+ actions={
218
+ <Button chromeless onPress={reset} testID={`${testID}-reset`}>
219
+ {t("Reset")}
220
+ </Button>
221
+ }
222
+ onConfirm={() => setOpen(false)}
223
+ />
226
224
  }
227
225
  >
228
226
  <YStack gap="$5" paddingBottom="$4" testID={`${testID}-filters-sheet`}>
@@ -2,11 +2,11 @@ import {
2
2
  Badge,
3
3
  DropdownMenu,
4
4
  SheetModal,
5
- Text,
6
5
  Tooltip,
7
6
  XStack,
8
7
  YStack,
9
8
  type DropdownMenuEntry,
9
+ OverlayHeader,
10
10
  } from "@multiplatform.one/components";
11
11
  import { Button, SearchInput, Select } from "@multiplatform.one/forms";
12
12
  import { useResolvedKnobs } from "@multiplatform.one/theme";
@@ -107,9 +107,7 @@ export function ListSidebarToolbar({
107
107
  >
108
108
  <Tooltip content={t("Open a random record")}>
109
109
  <Button
110
- outlined={!shuffle.open}
111
- theme={shuffle.open ? "accent" : undefined}
112
- circular
110
+ selected={shuffle.open}
113
111
  onPress={shuffle.toggle}
114
112
  icon={<DiceFiveIcon size={16} />}
115
113
  aria-label={t("Surprise me")}
@@ -145,8 +143,6 @@ export function ListSidebarToolbar({
145
143
  {menuItems.length > 0 ? (
146
144
  <DropdownMenu items={[...menuItems]} placement="bottom-end">
147
145
  <Button
148
- outlined
149
- circular
150
146
  icon={<DotsThreeIcon size={20} weight="bold" />}
151
147
  aria-label={t("More actions")}
152
148
  testID={`${testID}-more`}
@@ -162,18 +158,11 @@ export function ListSidebarToolbar({
162
158
  scrollable
163
159
  snapPoint={85}
164
160
  header={
165
- <XStack alignItems="center" {...knobProps.gap}>
166
- <Text {...knobProps.heading} fontWeight="700" role="heading" aria-level={2}>
167
- {t("Filters")}
168
- </Text>
169
- <Button
170
- theme="accent"
171
- onPress={() => setSheetOpen(false)}
172
- testID={`${testID}-filters-done`}
173
- >
174
- {t("Done")}
175
- </Button>
176
- </XStack>
161
+ <OverlayHeader
162
+ title={t("Filters")}
163
+ onConfirm={() => setSheetOpen(false)}
164
+ testID={`${testID}-filters`}
165
+ />
177
166
  }
178
167
  >
179
168
  {sheetOpen ? (
@@ -3,6 +3,7 @@ import { Button } from "@multiplatform.one/forms";
3
3
  import { transitionProps, useResolvedKnobs } from "@multiplatform.one/theme";
4
4
  import { HeartIcon } from "@phosphor-icons/react";
5
5
  import { useTranslation } from "react-i18next";
6
+ import { useTheme } from "tamagui";
6
7
  import { FacetBadge } from "./FacetBadge";
7
8
  import { ImageWell } from "./ImageWell";
8
9
  import type { RecordCardProps } from "./RecordCard";
@@ -10,9 +11,10 @@ import type { RecordCardProps } from "./RecordCard";
10
11
  export type { RecordCardBadge, RecordCardProps } from "./RecordCard";
11
12
 
12
13
  /**
13
- * Native twin of RecordCard. On React Native an Anchor is a Text node whose
14
- * press the Card (a View with its own responder) claims, so the card's
15
- * press sits on the Card itself and the heart stops it from bubbling there.
14
+ * Native twin of RecordCard, the same MPO media `Card`. On React Native an
15
+ * Anchor is a Text node whose press the Card (a View with its own responder)
16
+ * claims, so the card's press sits on the Card itself and the heart stops it
17
+ * from bubbling there.
16
18
  */
17
19
  export function RecordCard({
18
20
  title,
@@ -28,6 +30,7 @@ export function RecordCard({
28
30
  }: RecordCardProps) {
29
31
  const { t } = useTranslation();
30
32
  const { knobProps, elevation: elevationState } = useResolvedKnobs({ component: "Card" });
33
+ const theme = useTheme();
31
34
 
32
35
  const handleToggleFavorite = (event?: { stopPropagation?: () => void }) => {
33
36
  event?.stopPropagation?.();
@@ -37,28 +40,7 @@ export function RecordCard({
37
40
  return (
38
41
  <Card
39
42
  testID={testID}
40
- {...knobProps.cardSurface}
41
- // Full-bleed media: the card has no inset of its own and its radius
42
- // clips the image well; the body below carries the inset.
43
- padding={0}
44
- gap={0}
45
- overflow="hidden"
46
- data-record-card-bleed=""
47
- elevation={knobProps.elevation}
48
- {...transitionProps(knobProps.motion.control, [
49
- "boxShadow",
50
- "shadowColor",
51
- "shadowOffset",
52
- "shadowOpacity",
53
- "shadowRadius",
54
- "elevation",
55
- ])}
56
- pressStyle={{ scale: 0.98, ...elevationState.pressKnobProps }}
57
- role="button"
58
- aria-label={title}
59
- onPress={() => onPress?.()}
60
- >
61
- <YStack gap={0}>
43
+ media={
62
44
  <YStack position="relative">
63
45
  <ImageWell
64
46
  sources={images}
@@ -71,16 +53,17 @@ export function RecordCard({
71
53
  {favorite ? (
72
54
  <XStack position="absolute" top="$1" right="$1" zIndex={2}>
73
55
  <Button
74
- circular
75
- chromeless
76
- minWidth={knobProps.sizeToken}
77
- minHeight={knobProps.sizeToken}
78
- {...transitionProps(knobProps.motion.control)}
79
- backgroundColor="$background08"
80
- pressStyle={{ backgroundColor: "$background", scale: 0.92 }}
56
+ plate="media"
57
+ selected={false}
81
58
  onPress={handleToggleFavorite}
82
59
  col={(favorite.active ? "$red9" : "$color11") as never}
83
- icon={<HeartIcon size={20} weight={favorite.active ? "fill" : "regular"} />}
60
+ icon={
61
+ <HeartIcon
62
+ size={20}
63
+ weight={favorite.active ? "fill" : "regular"}
64
+ color={(favorite.active ? theme.red9 : theme.color11)?.val as string}
65
+ />
66
+ }
84
67
  aria-label={
85
68
  favorite.active
86
69
  ? t("Remove {{name}} from favorites", { name: title })
@@ -92,44 +75,55 @@ export function RecordCard({
92
75
  </XStack>
93
76
  ) : null}
94
77
  </YStack>
95
- <YStack {...knobProps.panelPadding} gap="$1.5">
96
- <XStack gap="$2" alignItems="baseline">
97
- <Text
98
- {...knobProps.heading}
99
- fontWeight="700"
100
- fontSize="$4"
101
- numberOfLines={1}
102
- color="$color12"
103
- flexShrink={1}
104
- >
105
- {title}
106
- </Text>
107
- {code ? (
108
- <Text
109
- fontSize="$2"
110
- fontWeight="700"
111
- color="$color10"
112
- flexShrink={0}
113
- {...({ "data-record-card-code": "" } as Record<string, unknown>)}
114
- >
115
- {code}
116
- </Text>
117
- ) : null}
118
- </XStack>
119
- {subtitle ? (
120
- <Text {...knobProps.body} fontSize="$2" color="$color10" numberOfLines={1}>
121
- {subtitle}
122
- </Text>
123
- ) : null}
124
- {badges.length > 0 ? (
125
- <XStack gap="$1.5" flexWrap="wrap">
126
- {badges.map((badge) => (
127
- <FacetBadge key={badge.value} label={badge.label} tint={badge.tint} size="$3" />
128
- ))}
129
- </XStack>
130
- ) : null}
131
- </YStack>
132
- </YStack>
78
+ }
79
+ {...transitionProps(knobProps.motion.control, [
80
+ "boxShadow",
81
+ "shadowColor",
82
+ "shadowOffset",
83
+ "shadowOpacity",
84
+ "shadowRadius",
85
+ "elevation",
86
+ ])}
87
+ pressStyle={{ scale: 0.98, ...elevationState.pressKnobProps }}
88
+ role="button"
89
+ aria-label={title}
90
+ onPress={() => onPress?.()}
91
+ >
92
+ <XStack gap="$2" alignItems="baseline">
93
+ <Text
94
+ {...knobProps.heading}
95
+ fontWeight="700"
96
+ fontSize="$4"
97
+ numberOfLines={1}
98
+ color="$color12"
99
+ flexShrink={1}
100
+ >
101
+ {title}
102
+ </Text>
103
+ {code ? (
104
+ <Text
105
+ fontSize="$2"
106
+ fontWeight="700"
107
+ color="$color10"
108
+ flexShrink={0}
109
+ {...({ "data-record-card-code": "" } as Record<string, unknown>)}
110
+ >
111
+ {code}
112
+ </Text>
113
+ ) : null}
114
+ </XStack>
115
+ {subtitle ? (
116
+ <Text {...knobProps.body} fontSize="$2" color="$color10" numberOfLines={1}>
117
+ {subtitle}
118
+ </Text>
119
+ ) : null}
120
+ {badges.length > 0 ? (
121
+ <XStack gap="$1.5" flexWrap="wrap">
122
+ {badges.map((badge) => (
123
+ <FacetBadge key={badge.value} label={badge.label} tint={badge.tint} size="$3" />
124
+ ))}
125
+ </XStack>
126
+ ) : null}
133
127
  </Card>
134
128
  );
135
129
  }
@@ -1,6 +1,7 @@
1
- // A record card is full-bleed media over a padded body: the image well runs
2
- // to the card's edges (the card clips it to its radius) and the name, the
3
- // code and the facet pills sit in the body under it, not stickered on the art.
1
+ // A record card is the MPO media Card (LC-175): the image well runs to the
2
+ // card's edges (the card clips it to its radius) and the name, the code and
3
+ // the facet chips sit in the card's inset body under it, not stickered on the
4
+ // art.
4
5
  import { renderWithProviders } from "@multiplatform.one/test-utils";
5
6
  import { cleanup, screen } from "@testing-library/react";
6
7
  import { afterEach, describe, expect, it } from "vitest";
@@ -24,10 +25,12 @@ function renderCard() {
24
25
  }
25
26
 
26
27
  describe("RecordCard full-bleed media", () => {
27
- it("drops the card's inset and clips its media to the radius", () => {
28
+ it("is an MPO media Card: no inset on the frame, media clipped to the radius", () => {
28
29
  renderCard();
29
30
  const card = screen.getByTestId("card");
30
- expect(card.hasAttribute("data-record-card-bleed")).toBe(true);
31
+ expect(card.hasAttribute("data-card-media")).toBe(true);
32
+ expect(card.querySelector("[data-card-media-slot] [data-record-card-media]")).not.toBeNull();
33
+ expect(card.querySelector("[data-card-body]")?.textContent).toContain("Pikachu");
31
34
  expect(card.className).toMatch(/_ox-hidden/);
32
35
  expect(card.className).toMatch(/_oy-hidden/);
33
36
  expect(card.className).toMatch(/_pt-0px/);