@multiplatform.one/frappe-ui 7.46.0 → 7.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/dist/cjs/FileBrowser/index.cjs +1 -1
  2. package/dist/cjs/FileBrowser/index.native.js +1 -1
  3. package/dist/cjs/FileBrowser/index.native.js.map +1 -1
  4. package/dist/cjs/FrappeCalendar.cjs +2 -2
  5. package/dist/cjs/FrappeCalendar.native.js +2 -2
  6. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  7. package/dist/cjs/FrappeConnectionIndicator.cjs +2 -1
  8. package/dist/cjs/FrappeConnectionIndicator.native.js +2 -1
  9. package/dist/cjs/FrappeConnectionIndicator.native.js.map +1 -1
  10. package/dist/cjs/FrappeDashboard.cjs +1 -1
  11. package/dist/cjs/FrappeDashboard.native.js +1 -1
  12. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  13. package/dist/cjs/FrappeForm.cjs +54 -29
  14. package/dist/cjs/FrappeForm.native.js +56 -28
  15. package/dist/cjs/FrappeForm.native.js.map +1 -1
  16. package/dist/cjs/FrappeFormActions.cjs +121 -0
  17. package/dist/cjs/FrappeFormActions.native.js +123 -0
  18. package/dist/cjs/FrappeFormActions.native.js.map +1 -1
  19. package/dist/cjs/FrappeInsights.cjs +4 -1
  20. package/dist/cjs/FrappeInsights.native.js +4 -6
  21. package/dist/cjs/FrappeInsights.native.js.map +1 -1
  22. package/dist/cjs/FrappeKanban.cjs +1 -1
  23. package/dist/cjs/FrappeKanban.native.js +1 -1
  24. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  25. package/dist/cjs/FrappeListView.cjs +1 -1
  26. package/dist/cjs/FrappeListView.native.js +4 -7
  27. package/dist/cjs/FrappeListView.native.js.map +1 -1
  28. package/dist/cjs/FrappeReconnectIndicator.cjs +2 -1
  29. package/dist/cjs/FrappeReconnectIndicator.native.js +2 -1
  30. package/dist/cjs/FrappeReconnectIndicator.native.js.map +1 -1
  31. package/dist/cjs/SyncErrorNotice.cjs +1 -1
  32. package/dist/cjs/SyncErrorNotice.native.js +1 -1
  33. package/dist/cjs/SyncErrorNotice.native.js.map +1 -1
  34. package/dist/cjs/desk/DeskFormPage.cjs +28 -42
  35. package/dist/cjs/desk/DeskFormPage.native.js +42 -58
  36. package/dist/cjs/desk/DeskFormPage.native.js.map +1 -1
  37. package/dist/cjs/desk/DeskShell.cjs +1 -1
  38. package/dist/cjs/desk/DeskShell.native.js +1 -1
  39. package/dist/cjs/desk/DeskShell.native.js.map +1 -1
  40. package/dist/cjs/desk/awesomebar.cjs +1 -1
  41. package/dist/cjs/desk/awesomebar.native.js +1 -1
  42. package/dist/cjs/desk/awesomebar.native.js.map +1 -1
  43. package/dist/cjs/fields/CodeEditor/index.cjs +1 -1
  44. package/dist/cjs/fields/CodeEditor/index.native.js +1 -1
  45. package/dist/cjs/fields/CodeEditor/index.native.js.map +1 -1
  46. package/dist/cjs/fields/Date/index.native.js +5 -4
  47. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  48. package/dist/cjs/fields/FileUpload.cjs +10 -8
  49. package/dist/cjs/fields/FileUpload.native.js +10 -8
  50. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  51. package/dist/cjs/fields/FileUploadField/index.cjs +50 -4
  52. package/dist/cjs/fields/FileUploadField/index.native.js +54 -5
  53. package/dist/cjs/fields/FileUploadField/index.native.js.map +1 -1
  54. package/dist/cjs/fields/Heading/index.cjs +1 -1
  55. package/dist/cjs/fields/Heading/index.native.js +1 -1
  56. package/dist/cjs/fields/Heading/index.native.js.map +1 -1
  57. package/dist/cjs/fields/MarkdownEditor/index.native.js +3 -2
  58. package/dist/cjs/fields/MarkdownEditor/index.native.js.map +1 -1
  59. package/dist/cjs/fields/Numeric/index.cjs +3 -2
  60. package/dist/cjs/fields/Numeric/index.native.js +3 -2
  61. package/dist/cjs/fields/Numeric/index.native.js.map +1 -1
  62. package/dist/cjs/fields/Password/index.cjs +18 -62
  63. package/dist/cjs/fields/Password/index.native.js +18 -65
  64. package/dist/cjs/fields/Password/index.native.js.map +1 -1
  65. package/dist/cjs/fields/ReadOnly/index.cjs +2 -1
  66. package/dist/cjs/fields/ReadOnly/index.native.js +2 -1
  67. package/dist/cjs/fields/ReadOnly/index.native.js.map +1 -1
  68. package/dist/cjs/index.cjs +2 -0
  69. package/dist/cjs/index.native.js +2 -0
  70. package/dist/cjs/index.native.js.map +1 -1
  71. package/dist/cjs/insights/InsightsLeaders.cjs +2 -2
  72. package/dist/cjs/insights/InsightsLeaders.native.js +2 -2
  73. package/dist/cjs/insights/InsightsLeaders.native.js.map +1 -1
  74. package/dist/cjs/insights/InsightsRecords.cjs +2 -2
  75. package/dist/cjs/insights/InsightsRecords.native.js +2 -2
  76. package/dist/cjs/insights/InsightsRecords.native.js.map +1 -1
  77. package/dist/cjs/list/FacetBadge.cjs +4 -3
  78. package/dist/cjs/list/FacetBadge.native.js +4 -3
  79. package/dist/cjs/list/FacetBadge.native.js.map +1 -1
  80. package/dist/cjs/list/ImageWell.cjs +6 -18
  81. package/dist/cjs/list/ImageWell.native.js +7 -19
  82. package/dist/cjs/list/ImageWell.native.js.map +1 -1
  83. package/dist/cjs/list/RecordCard.cjs +2 -2
  84. package/dist/cjs/list/RecordCard.native.js +2 -2
  85. package/dist/cjs/list/RecordCard.native.js.map +1 -1
  86. package/dist/cjs/list/facetBadgeSteps.cjs +32 -0
  87. package/dist/cjs/list/facetBadgeSteps.native.js +35 -0
  88. package/dist/cjs/list/facetBadgeSteps.native.js.map +1 -0
  89. package/dist/cjs/record/RecordHero.cjs +4 -15
  90. package/dist/cjs/record/RecordHero.native.js +4 -15
  91. package/dist/cjs/record/RecordHero.native.js.map +1 -1
  92. package/dist/cjs/record/RecordPage.cjs +4 -4
  93. package/dist/cjs/record/RecordPage.native.js +7 -10
  94. package/dist/cjs/record/RecordPage.native.js.map +1 -1
  95. package/dist/cjs/report/ReportGrid.cjs +6 -6
  96. package/dist/cjs/report/ReportGrid.native.js +11 -7
  97. package/dist/cjs/report/ReportGrid.native.js.map +1 -1
  98. package/dist/cjs/schemaForm/index.cjs +3 -3
  99. package/dist/cjs/schemaForm/index.native.js +3 -3
  100. package/dist/cjs/schemaForm/index.native.js.map +1 -1
  101. package/dist/esm/FileBrowser/index.mjs +8 -8
  102. package/dist/esm/FileBrowser/index.mjs.map +1 -1
  103. package/dist/esm/FileBrowser/index.native.js +8 -8
  104. package/dist/esm/FileBrowser/index.native.js.map +1 -1
  105. package/dist/esm/FrappeCalendar.mjs +6 -6
  106. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  107. package/dist/esm/FrappeCalendar.native.js +6 -6
  108. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  109. package/dist/esm/FrappeConnectionIndicator.mjs +2 -1
  110. package/dist/esm/FrappeConnectionIndicator.mjs.map +1 -1
  111. package/dist/esm/FrappeConnectionIndicator.native.js +2 -1
  112. package/dist/esm/FrappeConnectionIndicator.native.js.map +1 -1
  113. package/dist/esm/FrappeDashboard.mjs +6 -6
  114. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  115. package/dist/esm/FrappeDashboard.native.js +6 -6
  116. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  117. package/dist/esm/FrappeForm.mjs +52 -27
  118. package/dist/esm/FrappeForm.mjs.map +1 -1
  119. package/dist/esm/FrappeForm.native.js +56 -28
  120. package/dist/esm/FrappeForm.native.js.map +1 -1
  121. package/dist/esm/FrappeFormActions.mjs +122 -2
  122. package/dist/esm/FrappeFormActions.mjs.map +1 -1
  123. package/dist/esm/FrappeFormActions.native.js +124 -2
  124. package/dist/esm/FrappeFormActions.native.js.map +1 -1
  125. package/dist/esm/FrappeInsights.mjs +4 -1
  126. package/dist/esm/FrappeInsights.mjs.map +1 -1
  127. package/dist/esm/FrappeInsights.native.js +4 -6
  128. package/dist/esm/FrappeInsights.native.js.map +1 -1
  129. package/dist/esm/FrappeKanban.mjs +5 -5
  130. package/dist/esm/FrappeKanban.mjs.map +1 -1
  131. package/dist/esm/FrappeKanban.native.js +5 -5
  132. package/dist/esm/FrappeKanban.native.js.map +1 -1
  133. package/dist/esm/FrappeListView.mjs +1 -1
  134. package/dist/esm/FrappeListView.mjs.map +1 -1
  135. package/dist/esm/FrappeListView.native.js +4 -7
  136. package/dist/esm/FrappeListView.native.js.map +1 -1
  137. package/dist/esm/FrappeReconnectIndicator.mjs +2 -1
  138. package/dist/esm/FrappeReconnectIndicator.mjs.map +1 -1
  139. package/dist/esm/FrappeReconnectIndicator.native.js +2 -1
  140. package/dist/esm/FrappeReconnectIndicator.native.js.map +1 -1
  141. package/dist/esm/SyncErrorNotice.mjs +2 -2
  142. package/dist/esm/SyncErrorNotice.mjs.map +1 -1
  143. package/dist/esm/SyncErrorNotice.native.js +2 -2
  144. package/dist/esm/SyncErrorNotice.native.js.map +1 -1
  145. package/dist/esm/desk/DeskFormPage.mjs +29 -43
  146. package/dist/esm/desk/DeskFormPage.mjs.map +1 -1
  147. package/dist/esm/desk/DeskFormPage.native.js +43 -59
  148. package/dist/esm/desk/DeskFormPage.native.js.map +1 -1
  149. package/dist/esm/desk/DeskShell.mjs +1 -1
  150. package/dist/esm/desk/DeskShell.mjs.map +1 -1
  151. package/dist/esm/desk/DeskShell.native.js +1 -1
  152. package/dist/esm/desk/DeskShell.native.js.map +1 -1
  153. package/dist/esm/desk/awesomebar.mjs +1 -1
  154. package/dist/esm/desk/awesomebar.mjs.map +1 -1
  155. package/dist/esm/desk/awesomebar.native.js +1 -1
  156. package/dist/esm/desk/awesomebar.native.js.map +1 -1
  157. package/dist/esm/fields/CodeEditor/index.mjs +3 -3
  158. package/dist/esm/fields/CodeEditor/index.mjs.map +1 -1
  159. package/dist/esm/fields/CodeEditor/index.native.js +3 -3
  160. package/dist/esm/fields/CodeEditor/index.native.js.map +1 -1
  161. package/dist/esm/fields/Date/index.native.js +2 -1
  162. package/dist/esm/fields/Date/index.native.js.map +1 -1
  163. package/dist/esm/fields/FileUpload.mjs +5 -3
  164. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  165. package/dist/esm/fields/FileUpload.native.js +5 -3
  166. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  167. package/dist/esm/fields/FileUploadField/index.mjs +52 -6
  168. package/dist/esm/fields/FileUploadField/index.mjs.map +1 -1
  169. package/dist/esm/fields/FileUploadField/index.native.js +56 -7
  170. package/dist/esm/fields/FileUploadField/index.native.js.map +1 -1
  171. package/dist/esm/fields/Heading/index.mjs +3 -3
  172. package/dist/esm/fields/Heading/index.mjs.map +1 -1
  173. package/dist/esm/fields/Heading/index.native.js +3 -3
  174. package/dist/esm/fields/Heading/index.native.js.map +1 -1
  175. package/dist/esm/fields/MarkdownEditor/index.native.js +2 -1
  176. package/dist/esm/fields/MarkdownEditor/index.native.js.map +1 -1
  177. package/dist/esm/fields/Numeric/index.mjs +2 -1
  178. package/dist/esm/fields/Numeric/index.mjs.map +1 -1
  179. package/dist/esm/fields/Numeric/index.native.js +2 -1
  180. package/dist/esm/fields/Numeric/index.native.js.map +1 -1
  181. package/dist/esm/fields/Password/index.mjs +16 -60
  182. package/dist/esm/fields/Password/index.mjs.map +1 -1
  183. package/dist/esm/fields/Password/index.native.js +16 -63
  184. package/dist/esm/fields/Password/index.native.js.map +1 -1
  185. package/dist/esm/fields/ReadOnly/index.mjs +7 -6
  186. package/dist/esm/fields/ReadOnly/index.mjs.map +1 -1
  187. package/dist/esm/fields/ReadOnly/index.native.js +7 -6
  188. package/dist/esm/fields/ReadOnly/index.native.js.map +1 -1
  189. package/dist/esm/index.mjs +2 -1
  190. package/dist/esm/index.mjs.map +1 -1
  191. package/dist/esm/index.native.js +2 -1
  192. package/dist/esm/index.native.js.map +1 -1
  193. package/dist/esm/insights/InsightsLeaders.mjs +2 -2
  194. package/dist/esm/insights/InsightsLeaders.mjs.map +1 -1
  195. package/dist/esm/insights/InsightsLeaders.native.js +2 -2
  196. package/dist/esm/insights/InsightsLeaders.native.js.map +1 -1
  197. package/dist/esm/insights/InsightsRecords.mjs +2 -2
  198. package/dist/esm/insights/InsightsRecords.mjs.map +1 -1
  199. package/dist/esm/insights/InsightsRecords.native.js +2 -2
  200. package/dist/esm/insights/InsightsRecords.native.js.map +1 -1
  201. package/dist/esm/list/FacetBadge.mjs +4 -3
  202. package/dist/esm/list/FacetBadge.mjs.map +1 -1
  203. package/dist/esm/list/FacetBadge.native.js +4 -3
  204. package/dist/esm/list/FacetBadge.native.js.map +1 -1
  205. package/dist/esm/list/ImageWell.mjs +8 -20
  206. package/dist/esm/list/ImageWell.mjs.map +1 -1
  207. package/dist/esm/list/ImageWell.native.js +9 -21
  208. package/dist/esm/list/ImageWell.native.js.map +1 -1
  209. package/dist/esm/list/RecordCard.mjs +2 -2
  210. package/dist/esm/list/RecordCard.mjs.map +1 -1
  211. package/dist/esm/list/RecordCard.native.js +2 -2
  212. package/dist/esm/list/RecordCard.native.js.map +1 -1
  213. package/dist/esm/list/facetBadgeSteps.mjs +7 -0
  214. package/dist/esm/list/facetBadgeSteps.mjs.map +1 -0
  215. package/dist/esm/list/facetBadgeSteps.native.js +7 -0
  216. package/dist/esm/list/facetBadgeSteps.native.js.map +1 -0
  217. package/dist/esm/record/RecordHero.mjs +4 -15
  218. package/dist/esm/record/RecordHero.mjs.map +1 -1
  219. package/dist/esm/record/RecordHero.native.js +4 -15
  220. package/dist/esm/record/RecordHero.native.js.map +1 -1
  221. package/dist/esm/record/RecordPage.mjs +4 -4
  222. package/dist/esm/record/RecordPage.mjs.map +1 -1
  223. package/dist/esm/record/RecordPage.native.js +7 -10
  224. package/dist/esm/record/RecordPage.native.js.map +1 -1
  225. package/dist/esm/report/ReportGrid.mjs +7 -7
  226. package/dist/esm/report/ReportGrid.mjs.map +1 -1
  227. package/dist/esm/report/ReportGrid.native.js +12 -8
  228. package/dist/esm/report/ReportGrid.native.js.map +1 -1
  229. package/dist/esm/schemaForm/index.mjs +4 -4
  230. package/dist/esm/schemaForm/index.mjs.map +1 -1
  231. package/dist/esm/schemaForm/index.native.js +4 -4
  232. package/dist/esm/schemaForm/index.native.js.map +1 -1
  233. package/dist/jsx/FileBrowser/index.mjs +8 -8
  234. package/dist/jsx/FileBrowser/index.mjs.map +1 -1
  235. package/dist/jsx/FileBrowser/index.native.js +1 -1
  236. package/dist/jsx/FileBrowser/index.native.js.map +1 -1
  237. package/dist/jsx/FrappeCalendar.mjs +6 -6
  238. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  239. package/dist/jsx/FrappeCalendar.native.js +2 -2
  240. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  241. package/dist/jsx/FrappeConnectionIndicator.mjs +2 -1
  242. package/dist/jsx/FrappeConnectionIndicator.mjs.map +1 -1
  243. package/dist/jsx/FrappeConnectionIndicator.native.js +2 -1
  244. package/dist/jsx/FrappeConnectionIndicator.native.js.map +1 -1
  245. package/dist/jsx/FrappeDashboard.mjs +6 -6
  246. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  247. package/dist/jsx/FrappeDashboard.native.js +1 -1
  248. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  249. package/dist/jsx/FrappeForm.mjs +52 -27
  250. package/dist/jsx/FrappeForm.mjs.map +1 -1
  251. package/dist/jsx/FrappeForm.native.js +56 -28
  252. package/dist/jsx/FrappeForm.native.js.map +1 -1
  253. package/dist/jsx/FrappeFormActions.mjs +122 -2
  254. package/dist/jsx/FrappeFormActions.mjs.map +1 -1
  255. package/dist/jsx/FrappeFormActions.native.js +123 -0
  256. package/dist/jsx/FrappeFormActions.native.js.map +1 -1
  257. package/dist/jsx/FrappeInsights.mjs +4 -1
  258. package/dist/jsx/FrappeInsights.mjs.map +1 -1
  259. package/dist/jsx/FrappeInsights.native.js +4 -6
  260. package/dist/jsx/FrappeInsights.native.js.map +1 -1
  261. package/dist/jsx/FrappeKanban.mjs +5 -5
  262. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  263. package/dist/jsx/FrappeKanban.native.js +1 -1
  264. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  265. package/dist/jsx/FrappeListView.mjs +1 -1
  266. package/dist/jsx/FrappeListView.mjs.map +1 -1
  267. package/dist/jsx/FrappeListView.native.js +4 -7
  268. package/dist/jsx/FrappeListView.native.js.map +1 -1
  269. package/dist/jsx/FrappeReconnectIndicator.mjs +2 -1
  270. package/dist/jsx/FrappeReconnectIndicator.mjs.map +1 -1
  271. package/dist/jsx/FrappeReconnectIndicator.native.js +2 -1
  272. package/dist/jsx/FrappeReconnectIndicator.native.js.map +1 -1
  273. package/dist/jsx/SyncErrorNotice.mjs +2 -2
  274. package/dist/jsx/SyncErrorNotice.mjs.map +1 -1
  275. package/dist/jsx/SyncErrorNotice.native.js +1 -1
  276. package/dist/jsx/SyncErrorNotice.native.js.map +1 -1
  277. package/dist/jsx/desk/DeskFormPage.mjs +29 -43
  278. package/dist/jsx/desk/DeskFormPage.mjs.map +1 -1
  279. package/dist/jsx/desk/DeskFormPage.native.js +42 -58
  280. package/dist/jsx/desk/DeskFormPage.native.js.map +1 -1
  281. package/dist/jsx/desk/DeskShell.mjs +1 -1
  282. package/dist/jsx/desk/DeskShell.mjs.map +1 -1
  283. package/dist/jsx/desk/DeskShell.native.js +1 -1
  284. package/dist/jsx/desk/DeskShell.native.js.map +1 -1
  285. package/dist/jsx/desk/awesomebar.mjs +1 -1
  286. package/dist/jsx/desk/awesomebar.mjs.map +1 -1
  287. package/dist/jsx/desk/awesomebar.native.js +1 -1
  288. package/dist/jsx/desk/awesomebar.native.js.map +1 -1
  289. package/dist/jsx/fields/CodeEditor/index.mjs +3 -3
  290. package/dist/jsx/fields/CodeEditor/index.mjs.map +1 -1
  291. package/dist/jsx/fields/CodeEditor/index.native.js +1 -1
  292. package/dist/jsx/fields/CodeEditor/index.native.js.map +1 -1
  293. package/dist/jsx/fields/Date/index.native.js +5 -4
  294. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  295. package/dist/jsx/fields/FileUpload.mjs +5 -3
  296. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  297. package/dist/jsx/fields/FileUpload.native.js +10 -8
  298. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  299. package/dist/jsx/fields/FileUploadField/index.mjs +52 -6
  300. package/dist/jsx/fields/FileUploadField/index.mjs.map +1 -1
  301. package/dist/jsx/fields/FileUploadField/index.native.js +54 -5
  302. package/dist/jsx/fields/FileUploadField/index.native.js.map +1 -1
  303. package/dist/jsx/fields/Heading/index.mjs +3 -3
  304. package/dist/jsx/fields/Heading/index.mjs.map +1 -1
  305. package/dist/jsx/fields/Heading/index.native.js +1 -1
  306. package/dist/jsx/fields/Heading/index.native.js.map +1 -1
  307. package/dist/jsx/fields/MarkdownEditor/index.native.js +3 -2
  308. package/dist/jsx/fields/MarkdownEditor/index.native.js.map +1 -1
  309. package/dist/jsx/fields/Numeric/index.mjs +2 -1
  310. package/dist/jsx/fields/Numeric/index.mjs.map +1 -1
  311. package/dist/jsx/fields/Numeric/index.native.js +3 -2
  312. package/dist/jsx/fields/Numeric/index.native.js.map +1 -1
  313. package/dist/jsx/fields/Password/index.mjs +16 -60
  314. package/dist/jsx/fields/Password/index.mjs.map +1 -1
  315. package/dist/jsx/fields/Password/index.native.js +18 -65
  316. package/dist/jsx/fields/Password/index.native.js.map +1 -1
  317. package/dist/jsx/fields/ReadOnly/index.mjs +7 -6
  318. package/dist/jsx/fields/ReadOnly/index.mjs.map +1 -1
  319. package/dist/jsx/fields/ReadOnly/index.native.js +2 -1
  320. package/dist/jsx/fields/ReadOnly/index.native.js.map +1 -1
  321. package/dist/jsx/index.js +2 -1
  322. package/dist/jsx/index.js.map +1 -1
  323. package/dist/jsx/index.mjs +2 -1
  324. package/dist/jsx/index.mjs.map +1 -1
  325. package/dist/jsx/index.native.js +2 -0
  326. package/dist/jsx/index.native.js.map +1 -1
  327. package/dist/jsx/insights/InsightsLeaders.mjs +2 -2
  328. package/dist/jsx/insights/InsightsLeaders.mjs.map +1 -1
  329. package/dist/jsx/insights/InsightsLeaders.native.js +2 -2
  330. package/dist/jsx/insights/InsightsLeaders.native.js.map +1 -1
  331. package/dist/jsx/insights/InsightsRecords.mjs +2 -2
  332. package/dist/jsx/insights/InsightsRecords.mjs.map +1 -1
  333. package/dist/jsx/insights/InsightsRecords.native.js +2 -2
  334. package/dist/jsx/insights/InsightsRecords.native.js.map +1 -1
  335. package/dist/jsx/list/FacetBadge.mjs +4 -3
  336. package/dist/jsx/list/FacetBadge.mjs.map +1 -1
  337. package/dist/jsx/list/FacetBadge.native.js +4 -3
  338. package/dist/jsx/list/FacetBadge.native.js.map +1 -1
  339. package/dist/jsx/list/ImageWell.mjs +8 -20
  340. package/dist/jsx/list/ImageWell.mjs.map +1 -1
  341. package/dist/jsx/list/ImageWell.native.js +7 -19
  342. package/dist/jsx/list/ImageWell.native.js.map +1 -1
  343. package/dist/jsx/list/RecordCard.mjs +2 -2
  344. package/dist/jsx/list/RecordCard.mjs.map +1 -1
  345. package/dist/jsx/list/RecordCard.native.js +2 -2
  346. package/dist/jsx/list/RecordCard.native.js.map +1 -1
  347. package/dist/jsx/list/facetBadgeSteps.mjs +7 -0
  348. package/dist/jsx/list/facetBadgeSteps.mjs.map +1 -0
  349. package/dist/jsx/list/facetBadgeSteps.native.js +35 -0
  350. package/dist/jsx/list/facetBadgeSteps.native.js.map +1 -0
  351. package/dist/jsx/record/RecordHero.mjs +4 -15
  352. package/dist/jsx/record/RecordHero.mjs.map +1 -1
  353. package/dist/jsx/record/RecordHero.native.js +4 -15
  354. package/dist/jsx/record/RecordHero.native.js.map +1 -1
  355. package/dist/jsx/record/RecordPage.mjs +4 -4
  356. package/dist/jsx/record/RecordPage.mjs.map +1 -1
  357. package/dist/jsx/record/RecordPage.native.js +7 -10
  358. package/dist/jsx/record/RecordPage.native.js.map +1 -1
  359. package/dist/jsx/report/ReportGrid.mjs +7 -7
  360. package/dist/jsx/report/ReportGrid.mjs.map +1 -1
  361. package/dist/jsx/report/ReportGrid.native.js +11 -7
  362. package/dist/jsx/report/ReportGrid.native.js.map +1 -1
  363. package/dist/jsx/schemaForm/index.mjs +4 -4
  364. package/dist/jsx/schemaForm/index.mjs.map +1 -1
  365. package/dist/jsx/schemaForm/index.native.js +3 -3
  366. package/dist/jsx/schemaForm/index.native.js.map +1 -1
  367. package/package.json +16 -16
  368. package/src/FileBrowser/index.tsx +14 -13
  369. package/src/FormSidebar.stories.tsx +2 -1
  370. package/src/FrappeCalendar.stories.tsx +1 -1
  371. package/src/FrappeCalendar.tsx +10 -9
  372. package/src/FrappeConnectionIndicator.stories.tsx +2 -1
  373. package/src/FrappeConnectionIndicator.tsx +2 -1
  374. package/src/FrappeDashboard.stories.tsx +2 -2
  375. package/src/FrappeDashboard.tsx +10 -10
  376. package/src/FrappeForm.lifecycle.spec.tsx +3 -1
  377. package/src/FrappeForm.tsx +106 -38
  378. package/src/FrappeFormActions.tsx +160 -1
  379. package/src/FrappeInsights.spec.tsx +1 -1
  380. package/src/FrappeInsights.tsx +4 -1
  381. package/src/FrappeKanban.stories.tsx +2 -1
  382. package/src/FrappeKanban.tsx +8 -7
  383. package/src/FrappeList.stories.tsx +11 -10
  384. package/src/FrappeListView.card.spec.tsx +1 -1
  385. package/src/FrappeListView.sidebar.spec.tsx +1 -1
  386. package/src/FrappeListView.tsx +1 -1
  387. package/src/FrappeProvider.stories.tsx +2 -1
  388. package/src/FrappeReconnectIndicator.stories.tsx +2 -1
  389. package/src/FrappeReconnectIndicator.tsx +2 -1
  390. package/src/SyncErrorNotice.tsx +2 -2
  391. package/src/desk/DeskFormPage.tsx +42 -62
  392. package/src/desk/DeskFormSidebar.stories.tsx +4 -2
  393. package/src/desk/DeskShell.tsx +1 -1
  394. package/src/desk/awesomebar.tsx +1 -1
  395. package/src/fields/CodeEditor/index.tsx +4 -4
  396. package/src/fields/Date/index.native.tsx +2 -1
  397. package/src/fields/FileUpload.tsx +8 -4
  398. package/src/fields/FileUploadField/FileUploadField.spec.tsx +86 -1
  399. package/src/fields/FileUploadField/FileUploadField.stories.tsx +9 -0
  400. package/src/fields/FileUploadField/index.tsx +67 -6
  401. package/src/fields/Heading/index.tsx +4 -4
  402. package/src/fields/MarkdownEditor/index.native.tsx +2 -1
  403. package/src/fields/Numeric/index.tsx +2 -1
  404. package/src/fields/Password/index.tsx +14 -70
  405. package/src/fields/ReadOnly/index.tsx +12 -11
  406. package/src/fields/TextEditor/TextEditor.stories.tsx +2 -1
  407. package/src/frappeRemainder.designLaw.spec.ts +3 -2
  408. package/src/frappeRoutes.spec.tsx +20 -6
  409. package/src/index.ts +7 -1
  410. package/src/insights/InsightsLeaders.tsx +2 -2
  411. package/src/insights/InsightsRecords.tsx +2 -2
  412. package/src/insights/insightsRecord.ts +2 -2
  413. package/src/list/FacetBadge.tsx +5 -4
  414. package/src/list/ImageWell.spec.tsx +47 -0
  415. package/src/list/ImageWell.tsx +8 -21
  416. package/src/list/RecordCard.native.tsx +2 -2
  417. package/src/list/RecordCard.spec.tsx +1 -1
  418. package/src/list/RecordCard.tsx +4 -4
  419. package/src/list/facetBadgeSteps.ts +2 -0
  420. package/src/record/RecordHero.tsx +4 -11
  421. package/src/record/RecordPage.tsx +4 -4
  422. package/src/report/ReportGrid.native.spec.tsx +152 -0
  423. package/src/report/ReportGrid.tsx +20 -9
  424. package/src/schemaForm/SchemaForm.stories.tsx +2 -1
  425. package/src/schemaForm/index.tsx +6 -6
  426. package/types/FileBrowser/index.d.ts.map +1 -1
  427. package/types/FrappeCalendar.d.ts.map +1 -1
  428. package/types/FrappeConnectionIndicator.d.ts.map +1 -1
  429. package/types/FrappeDashboard.d.ts.map +1 -1
  430. package/types/FrappeForm.d.ts +19 -0
  431. package/types/FrappeForm.d.ts.map +1 -1
  432. package/types/FrappeFormActions.d.ts +7 -0
  433. package/types/FrappeFormActions.d.ts.map +1 -1
  434. package/types/FrappeInsights.d.ts.map +1 -1
  435. package/types/FrappeKanban.d.ts.map +1 -1
  436. package/types/FrappeReconnectIndicator.d.ts.map +1 -1
  437. package/types/desk/DeskFormPage.d.ts +6 -6
  438. package/types/desk/DeskFormPage.d.ts.map +1 -1
  439. package/types/fields/Date/index.native.d.ts.map +1 -1
  440. package/types/fields/FileUpload.d.ts.map +1 -1
  441. package/types/fields/FileUploadField/index.d.ts.map +1 -1
  442. package/types/fields/MarkdownEditor/index.native.d.ts.map +1 -1
  443. package/types/fields/Numeric/index.d.ts.map +1 -1
  444. package/types/fields/Password/index.d.ts +13 -0
  445. package/types/fields/Password/index.d.ts.map +1 -1
  446. package/types/fields/ReadOnly/index.d.ts.map +1 -1
  447. package/types/index.d.ts +2 -1
  448. package/types/index.d.ts.map +1 -1
  449. package/types/insights/insightsRecord.d.ts +2 -2
  450. package/types/insights/insightsRecord.d.ts.map +1 -1
  451. package/types/list/FacetBadge.d.ts +1 -1
  452. package/types/list/FacetBadge.d.ts.map +1 -1
  453. package/types/list/ImageWell.d.ts +5 -4
  454. package/types/list/ImageWell.d.ts.map +1 -1
  455. package/types/list/RecordCard.d.ts +3 -3
  456. package/types/list/RecordCard.d.ts.map +1 -1
  457. package/types/list/RecordCard.native.d.ts +1 -1
  458. package/types/list/RecordCard.native.d.ts.map +1 -1
  459. package/types/list/facetBadgeSteps.d.ts +7 -0
  460. package/types/list/facetBadgeSteps.d.ts.map +1 -0
  461. package/types/record/RecordHero.d.ts +3 -3
  462. package/types/record/RecordHero.d.ts.map +1 -1
  463. package/types/report/ReportGrid.d.ts.map +1 -1
@@ -30,7 +30,7 @@ export function InsightsRecords<TDoc>({ tiles, record, testID }: InsightsRecords
30
30
  {tiles.map((tile) => {
31
31
  const title = record.title(tile.doc);
32
32
  const code = record.code(tile.doc);
33
- const tints = record.tints(tile.doc);
33
+ const tint = record.tint(tile.doc);
34
34
  return (
35
35
  <XStack
36
36
  key={tile.id}
@@ -43,7 +43,7 @@ export function InsightsRecords<TDoc>({ tiles, record, testID }: InsightsRecords
43
43
  {...knobProps.gap}
44
44
  >
45
45
  <YStack width={wellPx} flexShrink={0} data-nested-px={knobProps.nestedControl.px}>
46
- <ImageWell sources={record.images(tile.doc)} alt={title} tints={tints} inset={0.04} />
46
+ <ImageWell sources={record.images(tile.doc)} alt={title} tint={tint} inset={0.04} />
47
47
  </YStack>
48
48
  <YStack gap="$1" flexShrink={1} minWidth={0}>
49
49
  <Text {...knobProps.label} color="$color10">
@@ -3,8 +3,8 @@ export interface InsightsRecordView<TDoc> {
3
3
  title: (doc: TDoc) => string;
4
4
  code: (doc: TDoc) => string | undefined;
5
5
  images: (doc: TDoc) => string[];
6
- /** The facet values' tints, first value first. */
7
- tints: (doc: TDoc) => (string | undefined)[];
6
+ /** The primary facet value's tint (LC-147: never split by a second value). */
7
+ tint: (doc: TDoc) => string | undefined;
8
8
  /** The record's facet values. */
9
9
  values: (doc: TDoc) => string[];
10
10
  valueLabel: (value: string) => string;
@@ -1,10 +1,11 @@
1
1
  import { Text, XStack } from "@multiplatform.one/components";
2
2
  import { hairlineWidth, sizeTokenStep, useResolvedKnobs } from "@multiplatform.one/theme";
3
3
  import type { SizeTokens } from "tamagui";
4
+ import { facetBadgeSteps } from "./facetBadgeSteps";
4
5
 
5
6
  export interface FacetBadgeProps {
6
7
  label: string;
7
- /** Theme hue (`"grass"`) painting the badge from its ramp. */
8
+ /** Theme ramp (`"green"`) painting the badge (LC-147). */
8
9
  tint?: string;
9
10
  /** Size token (Tamagui's own `size`); below `$true` the badge draws a step smaller. */
10
11
  size?: SizeTokens;
@@ -22,8 +23,8 @@ export function FacetBadge({ label, tint = "gray", size }: FacetBadgeProps) {
22
23
  {...knobProps.borderRadius}
23
24
  paddingHorizontal={small ? "$1.5" : "$2"}
24
25
  paddingVertical={small ? "$0.5" : "$1"}
25
- backgroundColor={`$${tint}4` as never}
26
- borderColor={`$${tint}7` as never}
26
+ backgroundColor={`$${tint}${facetBadgeSteps.fill}` as never}
27
+ borderColor={`$${tint}${facetBadgeSteps.border}` as never}
27
28
  borderWidth={hairlineWidth}
28
29
  alignItems="center"
29
30
  >
@@ -32,7 +33,7 @@ export function FacetBadge({ label, tint = "gray", size }: FacetBadgeProps) {
32
33
  {...knobProps.body}
33
34
  textTransform="capitalize"
34
35
  fontWeight="700"
35
- color={`$${tint}12` as never}
36
+ color={`$${tint}${facetBadgeSteps.ink}` as never}
36
37
  {...(small ? { fontSize: "$1" as const } : null)}
37
38
  letterSpacing={0.3}
38
39
  >
@@ -0,0 +1,47 @@
1
+ // LC-147 TYPE-COLOUR-RAMP: the art backdrop is a soft tint of the record's
2
+ // primary facet value only. A second value shows in its badge and never
3
+ // splits the well or the record stage.
4
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
5
+ import { cleanup, screen } from "@testing-library/react";
6
+ import { afterEach, describe, expect, it } from "vitest";
7
+ import { RecordHeroFrame } from "../record/RecordHero";
8
+ import { ImageWell } from "./ImageWell";
9
+
10
+ afterEach(cleanup);
11
+
12
+ describe("LC-147 one-tint art backdrop", () => {
13
+ it("fills the image well from the primary tint's ramp and holds only the image", () => {
14
+ renderWithProviders(
15
+ <ImageWell
16
+ sources={["https://art.spec.test/1.png"]}
17
+ alt="Bulbasaur"
18
+ tint="green"
19
+ testID="well"
20
+ />,
21
+ );
22
+ const well = screen.getByTestId("well");
23
+ expect(well.className).toMatch(/green5/);
24
+ expect(well.className).not.toMatch(/transparent/);
25
+ expect(well.children).toHaveLength(1);
26
+ expect(well.querySelectorAll("img")).toHaveLength(1);
27
+ });
28
+
29
+ it("falls back to the gray ramp when the record has no tinted value", () => {
30
+ renderWithProviders(
31
+ <ImageWell sources={["https://art.spec.test/4.png"]} alt="?" testID="well" />,
32
+ );
33
+ expect(screen.getByTestId("well").className).toMatch(/gray5/);
34
+ });
35
+
36
+ it("paints the record stage from the primary tint alone", () => {
37
+ renderWithProviders(
38
+ <RecordHeroFrame tint="green" testID="stage">
39
+ <span data-testid="art" />
40
+ </RecordHeroFrame>,
41
+ );
42
+ const stage = screen.getByTestId("stage");
43
+ expect(stage.className).toMatch(/green3/);
44
+ expect(stage.children).toHaveLength(1);
45
+ expect(stage.children[0].getAttribute("data-testid")).toBe("art");
46
+ });
47
+ });
@@ -1,11 +1,4 @@
1
- import {
2
- Image,
3
- Text,
4
- XStack,
5
- YStack,
6
- isWeb,
7
- type YStackProps,
8
- } from "@multiplatform.one/components";
1
+ import { Image, Text, YStack, isWeb, type YStackProps } from "@multiplatform.one/components";
9
2
  import { transitionProps, useResolvedKnobs } from "@multiplatform.one/theme";
10
3
  import { useEffect, useState } from "react";
11
4
 
@@ -14,10 +7,11 @@ export interface ImageWellProps extends Omit<YStackProps, "children"> {
14
7
  sources: readonly string[];
15
8
  alt: string;
16
9
  /**
17
- * Theme hues (`"grass"`) painting the well from their ramps: one fills it,
18
- * two split it down the middle.
10
+ * Theme ramp (`"green"`) the well is a soft tint of: the record's primary
11
+ * facet value. A second value never splits the well (LC-147); it shows in
12
+ * its badge.
19
13
  */
20
- tints?: readonly (string | undefined)[];
14
+ tint?: string;
21
15
  /** Nearest-neighbor upscaling, for pixel art. */
22
16
  pixelated?: boolean;
23
17
  /** Gap between the well's edge and the image, as a fraction of its width. */
@@ -34,7 +28,7 @@ export interface ImageWellProps extends Omit<YStackProps, "children"> {
34
28
  export function ImageWell({
35
29
  sources,
36
30
  alt,
37
- tints,
31
+ tint,
38
32
  pixelated = false,
39
33
  inset = 0.06,
40
34
  lazy = false,
@@ -43,8 +37,7 @@ export function ImageWell({
43
37
  const { knobProps } = useResolvedKnobs();
44
38
  const [sourceIndex, setSourceIndex] = useState(0);
45
39
  const [revealedSrc, setRevealedSrc] = useState<string | null>(null);
46
- const hue = tints?.[0] ?? "gray";
47
- const secondHue = tints?.[1];
40
+ const hue = tint ?? "gray";
48
41
 
49
42
  const sourceKey = sources.join("|");
50
43
  useEffect(() => {
@@ -67,7 +60,7 @@ export function ImageWell({
67
60
  <YStack
68
61
  {...knobProps.borderRadius}
69
62
  borderWidth={0}
70
- backgroundColor={secondHue ? "transparent" : (`$${hue}5` as never)}
63
+ backgroundColor={`$${hue}5` as never}
71
64
  aspectRatio={1}
72
65
  width="100%"
73
66
  alignItems="center"
@@ -76,12 +69,6 @@ export function ImageWell({
76
69
  position="relative"
77
70
  {...wellProps}
78
71
  >
79
- {secondHue ? (
80
- <XStack fullscreen zIndex={0} pointerEvents="none">
81
- <YStack flex={1} backgroundColor={`$${hue}5` as never} />
82
- <YStack flex={1} backgroundColor={`$${secondHue}5` as never} />
83
- </XStack>
84
- ) : null}
85
72
  {src ? (
86
73
  <Image
87
74
  key={src}
@@ -19,7 +19,7 @@ export function RecordCard({
19
19
  subtitle,
20
20
  code,
21
21
  images,
22
- tints,
22
+ tint,
23
23
  badges = [],
24
24
  onPress,
25
25
  favorite,
@@ -63,7 +63,7 @@ export function RecordCard({
63
63
  <ImageWell
64
64
  sources={images}
65
65
  alt={title}
66
- tints={tints}
66
+ tint={tint}
67
67
  inset={0.04}
68
68
  borderRadius={0}
69
69
  {...({ "data-record-card-media": "" } as Record<string, unknown>)}
@@ -15,7 +15,7 @@ function renderCard() {
15
15
  subtitle="Mouse Pokémon"
16
16
  code="#025"
17
17
  images={["https://art.spec.test/25.png"]}
18
- tints={["yellow"]}
18
+ tint="yellow"
19
19
  badges={[{ value: "electric", label: "Electric", tint: "yellow" }]}
20
20
  href="/pokemon/pikachu"
21
21
  testID="card"
@@ -27,8 +27,8 @@ export interface RecordCardProps {
27
27
  code?: string;
28
28
  /** Image candidates in order; a failed load moves to the next. */
29
29
  images: readonly string[];
30
- /** Theme hues painting the well: one fills it, two split it. */
31
- tints?: readonly (string | undefined)[];
30
+ /** Theme ramp the well is a soft tint of: the primary facet value (LC-147). */
31
+ tint?: string;
32
32
  /** Facet values stickered on the well. */
33
33
  badges?: readonly RecordCardBadge[];
34
34
  /** The record's page: the card becomes a real link (SSR, new tab). */
@@ -77,7 +77,7 @@ export function RecordCard({
77
77
  subtitle,
78
78
  code,
79
79
  images,
80
- tints,
80
+ tint,
81
81
  badges = [],
82
82
  href,
83
83
  onPress,
@@ -174,7 +174,7 @@ export function RecordCard({
174
174
  <ImageWell
175
175
  sources={images}
176
176
  alt={title}
177
- tints={tints}
177
+ tint={tint}
178
178
  inset={0.04}
179
179
  borderRadius={0}
180
180
  lazy={lazy}
@@ -0,0 +1,2 @@
1
+ /** The ramp steps a facet badge paints: AA ink on its fill in both schemes (LC-147). */
2
+ export const facetBadgeSteps = { fill: 4, border: 7, ink: 12 } as const;
@@ -18,32 +18,25 @@ export const recordHeroStageHeight = 250;
18
18
  export const recordHeroArtHeight = 220;
19
19
 
20
20
  export interface RecordHeroFrameProps extends YStackProps {
21
- /** Theme hues painting the stage from their ramps: one fills it, two split it. */
22
- tints?: readonly (string | undefined)[];
21
+ /** Theme ramp the stage is a soft tint of: the primary facet value, never split (LC-147). */
22
+ tint?: string;
23
23
  children: ReactNode;
24
24
  }
25
25
 
26
26
  /** The full-bleed stage under the art, tinted by the record's facet. */
27
- export function RecordHeroFrame({ tints = [], children, ...rest }: RecordHeroFrameProps) {
27
+ export function RecordHeroFrame({ tint, children, ...rest }: RecordHeroFrameProps) {
28
28
  const { knobProps } = useResolvedKnobs();
29
- const [first, second] = tints;
30
29
  return (
31
30
  <YStack
32
31
  width="100%"
33
32
  minHeight={sizeRecipeEscape(recordHeroStageHeight, "hero stage: the design's art band")}
34
33
  paddingTop={knobProps.gap.gap}
35
- backgroundColor={second ? "transparent" : ((first ? `$${first}3` : "$color3") as never)}
34
+ backgroundColor={(tint ? `$${tint}3` : "$color3") as never}
36
35
  overflow="hidden"
37
36
  position="relative"
38
37
  data-record-art-band=""
39
38
  {...rest}
40
39
  >
41
- {second ? (
42
- <XStack fullscreen pointerEvents="none">
43
- <YStack flex={1} backgroundColor={`$${first ?? "gray"}3` as never} />
44
- <YStack flex={1} backgroundColor={`$${second}3` as never} />
45
- </XStack>
46
- ) : null}
47
40
  {children}
48
41
  </YStack>
49
42
  );
@@ -151,7 +151,7 @@ export function RecordPage<TDoc extends { name: string; doctype: string }>({
151
151
  const title = recordTitle(doc, look, titleField);
152
152
  const code = look?.code?.(doc);
153
153
  const values = facet ? recordFacetValues(facet, row, linked) : [];
154
- const tints = values.slice(0, 2).map((value) => facet?.tint?.(value));
154
+ const tint = values[0] === undefined ? undefined : facet?.tint?.(values[0]);
155
155
  const images = look?.images?.(doc, baseURL) ?? [];
156
156
  const slides = (look?.gallery?.(doc, baseURL) ?? []).filter(
157
157
  (slide) => slide.src && slide.src !== images[0],
@@ -183,7 +183,7 @@ export function RecordPage<TDoc extends { name: string; doctype: string }>({
183
183
  key={`bars-${section.id}`}
184
184
  rows={tableRows}
185
185
  section={section}
186
- tint={tints[0]}
186
+ tint={tint}
187
187
  testID={`${slug}-${section.id}-chart`}
188
188
  />
189
189
  );
@@ -327,7 +327,7 @@ export function RecordPage<TDoc extends { name: string; doctype: string }>({
327
327
  trailing={trailing}
328
328
  />
329
329
 
330
- <RecordHeroFrame tints={tints} testID={`${slug}-detail-stage`}>
330
+ <RecordHeroFrame tint={tint} testID={`${slug}-detail-stage`}>
331
331
  <YStack testID={`${slug}-hero-art`}>
332
332
  <RecordGallery images={images} slides={slides} alt={title} />
333
333
  </YStack>
@@ -339,7 +339,7 @@ export function RecordPage<TDoc extends { name: string; doctype: string }>({
339
339
  <Text
340
340
  {...nested.label}
341
341
  fontWeight="700"
342
- color={(tints[0] ? `$${tints[0]}11` : "$color11") as never}
342
+ color={(tint ? `$${tint}11` : "$color11") as never}
343
343
  >
344
344
  {code}
345
345
  </Text>
@@ -0,0 +1,152 @@
1
+ /**
2
+ * FZ-7741: Kitchen Sink on iOS painted "Main failed to render: Expected
3
+ * transform functions but "r" found" for every report view. A fresh report
4
+ * sorts by `modified` descending, and the sorted header's caret carried
5
+ * style={{ transform: "rotate(180deg)" }}. On native a phosphor glyph is
6
+ * react-native-svg's Svg (Kitchen Sink's IconBase shim spreads the glyph's
7
+ * props into it), and Svg parses a style transform string with its SVG
8
+ * attribute grammar, which knows `rotate(180)` and throws on CSS's
9
+ * `rotate(180deg)` while rendering.
10
+ *
11
+ * Every glyph the grid draws, in every sort state, goes through that same
12
+ * parse here, and the descending caret still turns, on its wrapping View.
13
+ */
14
+ import { createRequire } from "node:module";
15
+ import { View } from "@multiplatform.one/components";
16
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
17
+ import { cleanup } from "@testing-library/react";
18
+ import { afterEach, describe, expect, it, vi } from "vitest";
19
+ import { ReportGrid } from "./ReportGrid";
20
+ import { buildGridRows, type ReportColumnDef, type ReportSortState } from "./reportViewModel";
21
+
22
+ const { glyphs } = vi.hoisted(() => ({
23
+ glyphs: [] as { name: string; props: Record<string, unknown> }[],
24
+ }));
25
+
26
+ vi.mock("@multiplatform.one/platform", async (importOriginal) => ({
27
+ ...(await importOriginal<typeof import("@multiplatform.one/platform")>()),
28
+ isWeb: false,
29
+ isNative: true,
30
+ }));
31
+
32
+ // Each phosphor glyph records the props the native shim would hand to Svg.
33
+ vi.mock("@phosphor-icons/react", async (importOriginal) => {
34
+ const actual = await importOriginal<Record<string, unknown>>();
35
+ return Object.fromEntries(
36
+ Object.entries(actual).map(([key, value]) => [
37
+ key,
38
+ key.endsWith("Icon")
39
+ ? (props: Record<string, unknown>) => {
40
+ glyphs.push({ name: key, props });
41
+ return null;
42
+ }
43
+ : value,
44
+ ]),
45
+ );
46
+ });
47
+
48
+ // Loaded past the suite's react-native-svg -> @tamagui/react-native-svg
49
+ // alias: this is the parse Svg.render runs on device.
50
+ const { extractTransformSvgView } = createRequire(import.meta.url)(
51
+ "react-native-svg/lib/commonjs/lib/extract/extractTransform.js",
52
+ ) as { extractTransformSvgView: (props: { transform: unknown }) => unknown };
53
+
54
+ /** Svg.render: a style transform wins over the prop, and a truthy one is parsed. */
55
+ function svgTransform(props: Record<string, unknown>): unknown {
56
+ const style = Object.assign({}, ...[props.style].flat(Number.POSITIVE_INFINITY).filter(Boolean));
57
+ const transform = style.transform ?? props.transform;
58
+ if (transform) extractTransformSvgView({ transform });
59
+ return transform;
60
+ }
61
+
62
+ const columns: ReportColumnDef[] = [
63
+ { fieldname: "name", label: "ID", fieldtype: "Data", kind: "text", width: 160, align: "left" },
64
+ {
65
+ fieldname: "modified",
66
+ label: "Last Updated On",
67
+ fieldtype: "Datetime",
68
+ kind: "date",
69
+ width: 160,
70
+ align: "left",
71
+ },
72
+ ];
73
+
74
+ function renderGrid(sort: ReportSortState) {
75
+ glyphs.length = 0;
76
+ return renderWithProviders(
77
+ <ReportGrid
78
+ columns={columns}
79
+ rows={buildGridRows(
80
+ [
81
+ { name: "TD-0001", modified: "2026-10-24 09:00:00" },
82
+ { name: "TD-0002", modified: "2026-10-23 09:00:00" },
83
+ ],
84
+ 0,
85
+ 20,
86
+ )}
87
+ sort={sort}
88
+ onSortChange={vi.fn()}
89
+ columnFilters={{}}
90
+ onColumnFilterChange={vi.fn()}
91
+ totals={[]}
92
+ />,
93
+ );
94
+ }
95
+
96
+ function transformOf(el: Element | null): string {
97
+ if (!el) throw new Error("no caret wrapper");
98
+ const value = getComputedStyle(el).transform;
99
+ return value === "none" ? "" : value;
100
+ }
101
+
102
+ afterEach(cleanup);
103
+
104
+ describe("ReportGrid sort carets on native (FZ-7741)", () => {
105
+ it("really is running with the native platform flags", async () => {
106
+ const platform = await import("@multiplatform.one/platform");
107
+ expect(platform.isWeb).toBe(false);
108
+ expect(platform.isNative).toBe(true);
109
+ });
110
+
111
+ it("the parse used here is the one that failed on device", () => {
112
+ expect(() => extractTransformSvgView({ transform: "rotate(180deg)" })).toThrow(
113
+ 'Expected transform functions but "r" found',
114
+ );
115
+ });
116
+
117
+ it.each([
118
+ ["the desk default, modified descending", { field: "modified", order: "desc" }],
119
+ ["ascending", { field: "modified", order: "asc" }],
120
+ ["a field that is not a column", { field: "creation", order: "desc" }],
121
+ ] as const)("every glyph survives Svg's transform parse: %s", (_, sort) => {
122
+ renderGrid(sort);
123
+ expect(glyphs.length).toBeGreaterThan(0);
124
+ for (const glyph of glyphs) {
125
+ expect(() => svgTransform(glyph.props), glyph.name).not.toThrow();
126
+ expect(typeof svgTransform(glyph.props), glyph.name).not.toBe("string");
127
+ }
128
+ });
129
+
130
+ it("paints every caret with a concrete theme ink, never a CSS variable (LC-84)", () => {
131
+ renderGrid({ field: "modified", order: "desc" });
132
+ for (const glyph of glyphs) {
133
+ expect(String(glyph.props.color), glyph.name).not.toMatch(/^var\(|^\$|^currentColor$/);
134
+ }
135
+ });
136
+
137
+ it("turns the descending caret on its wrapping View, and leaves ascending upright", () => {
138
+ const reference = renderWithProviders(<View testID="turned" rotate="180deg" />);
139
+ const turned = transformOf(reference.getByTestId("turned"));
140
+ expect(turned).toContain("180deg");
141
+ cleanup();
142
+
143
+ const caret = (container: HTMLElement, order: string) =>
144
+ container.querySelector(`[aria-sort="${order}"] [role="presentation"]`);
145
+ const desc = renderGrid({ field: "modified", order: "desc" });
146
+ expect(transformOf(caret(desc.container, "descending"))).toBe(turned);
147
+ cleanup();
148
+
149
+ const asc = renderGrid({ field: "modified", order: "asc" });
150
+ expect(transformOf(caret(asc.container, "ascending"))).toBe("");
151
+ });
152
+ });
@@ -26,6 +26,7 @@ import {
26
26
  formatCurrency,
27
27
  formatNumber,
28
28
  formatPercent,
29
+ useGlyphColor,
29
30
  } from "@multiplatform.one/theme";
30
31
  import { CaretDownIcon, CaretUpDownIcon } from "@phosphor-icons/react";
31
32
  import React, { useCallback, useState } from "react";
@@ -282,6 +283,8 @@ export function ReportGrid({
282
283
  fileUrl,
283
284
  }: ReportGridProps) {
284
285
  const { t } = useTranslation();
286
+ const sortedCaretInk = useGlyphColor("$color10");
287
+ const idleCaretInk = useGlyphColor("$color8");
285
288
  // A phone report fits its columns to the screen: no row numbers, no
286
289
  // per-column filter row (the filter bar above owns filtering there), the
287
290
  // title column takes the room the numbers leave (FZ-7684).
@@ -351,7 +354,11 @@ export function ReportGrid({
351
354
  },
352
355
  onBlur: (event: React.FocusEvent) => {
353
356
  const next = event.relatedTarget;
354
- if (!(next instanceof Element) || !next.closest('[data-report-row="true"]')) {
357
+ if (
358
+ typeof Element === "undefined" ||
359
+ !(next instanceof Element) ||
360
+ !next.closest('[data-report-row="true"]')
361
+ ) {
355
362
  setRowAnchor(0);
356
363
  }
357
364
  },
@@ -480,16 +487,20 @@ export function ReportGrid({
480
487
  {reportColumnUnit(column).label}
481
488
  </Text>
482
489
  {/* Caret orientation mirrors DataTable's headers:
483
- asc = caret-down, desc = rotated 180. */}
484
- <View aria-hidden role="presentation">
490
+ asc = caret-down, desc = rotated 180. The View
491
+ turns, never the glyph: on native a glyph is
492
+ react-native-svg's Svg, which reads a style
493
+ transform string as an SVG attribute and throws
494
+ on `rotate(180deg)` (FZ-7741). */}
495
+ <View
496
+ aria-hidden
497
+ role="presentation"
498
+ rotate={sorted === "desc" ? "180deg" : undefined}
499
+ >
485
500
  {sorted ? (
486
- <CaretDownIcon
487
- size={12}
488
- color="var(--color10)"
489
- style={sorted === "desc" ? { transform: "rotate(180deg)" } : undefined}
490
- />
501
+ <CaretDownIcon size={12} color={sortedCaretInk} />
491
502
  ) : (
492
- <CaretUpDownIcon size={12} color="var(--color8)" />
503
+ <CaretUpDownIcon size={12} color={idleCaretInk} />
493
504
  )}
494
505
  </View>
495
506
  </XStack>
@@ -1,8 +1,9 @@
1
1
  import { action } from "@multiplatform.one/storybook";
2
2
  import React, { useState } from "react";
3
- import { Text, YStack } from "tamagui";
3
+ import { YStack } from "tamagui";
4
4
  import type { FieldSchema } from "../fieldRegistry";
5
5
  import { SchemaForm, type FormSchema } from "./index";
6
+ import { Text } from "@multiplatform.one/components";
6
7
 
7
8
  export default {
8
9
  title: "FrappeUI/SchemaForm",
@@ -17,10 +17,10 @@ import {
17
17
  type RequiredMarkStrategy,
18
18
  } from "@multiplatform.one/forms";
19
19
  import { useResolvedKnobs } from "@multiplatform.one/theme";
20
- import { Card } from "@multiplatform.one/components";
20
+ import { Card, Text } from "@multiplatform.one/components";
21
21
  import React, { useMemo } from "react";
22
22
  import { useTranslation } from "react-i18next";
23
- import { Text, XStack, YStack } from "tamagui";
23
+ import { Text as TamaguiText, XStack, YStack } from "tamagui";
24
24
 
25
25
  import { compileDependsOn } from "../dependsOn";
26
26
  import { Heading, type HeadingLevel } from "../fields/Heading";
@@ -545,7 +545,7 @@ function CompactSectionLabel({
545
545
  const toggle = collapsible ? () => onCollapseChange(!collapsed) : undefined;
546
546
  return (
547
547
  <YStack gap="$1">
548
- <Text
548
+ <TamaguiText
549
549
  role="heading"
550
550
  aria-level={level}
551
551
  {...knobProps.label}
@@ -559,11 +559,11 @@ function CompactSectionLabel({
559
559
  data-mpo-schema-form-caps-label=""
560
560
  >
561
561
  {label}
562
- </Text>
562
+ </TamaguiText>
563
563
  {description && !collapsed ? (
564
- <Text {...knobProps.body} color="$color10">
564
+ <TamaguiText {...knobProps.body} color="$color10">
565
565
  {description}
566
- </Text>
566
+ </TamaguiText>
567
567
  ) : null}
568
568
  </YStack>
569
569
  );
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FileBrowser/index.tsx"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EACV,2BAA2B,EAC3B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,eAAe,EAChB,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,2BAA2B,EAC3B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,eAAe,GAChB,CAAC;AAoJF,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,IAAI,EAAE,QAAQ,EACd,WAAoB,EACpB,YAAY,EACZ,SAAS,EACT,aAAuB,EACvB,WAAW,EAAE,eAAe,EAC5B,mBAAmB,EACnB,YAAY,EACZ,MAAM,EACN,aAAa,EAAE,iBAAiB,EAChC,qBAAqB,EACrB,QAAe,EACf,WAAsB,EACtB,cAAuB,EACvB,gBAAwB,EACxB,UAAkB,EAClB,MAAM,EAAE,UAAU,EAClB,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,GACP,EAAE,gBAAgB,2CAwhBlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/FileBrowser/index.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EACV,2BAA2B,EAC3B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,eAAe,EAChB,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,2BAA2B,EAC3B,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,yBAAyB,EACzB,wBAAwB,EACxB,eAAe,GAChB,CAAC;AAoJF,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,IAAI,EAAE,QAAQ,EACd,WAAoB,EACpB,YAAY,EACZ,SAAS,EACT,aAAuB,EACvB,WAAW,EAAE,eAAe,EAC5B,mBAAmB,EACnB,YAAY,EACZ,MAAM,EACN,aAAa,EAAE,iBAAiB,EAChC,qBAAqB,EACrB,QAAe,EACf,WAAsB,EACtB,cAAuB,EACvB,gBAAwB,EACxB,UAAkB,EAClB,MAAM,EAAE,UAAU,EAClB,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,MAAM,GACP,EAAE,gBAAgB,2CAwhBlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrappeCalendar.d.ts","sourceRoot":"","sources":["../src/FrappeCalendar.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FrappeCalendar.d.ts","sourceRoot":"","sources":["../src/FrappeCalendar.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrappeConnectionIndicator.d.ts","sourceRoot":"","sources":["../src/FrappeConnectionIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC/B,MAAM,2BAA2B,CAAC;AAMnC,MAAM,WAAW,8BAA8B;IAC7C,mEAAmE;IACnE,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,8BAA8B,kDAgC/F"}
1
+ {"version":3,"file":"FrappeConnectionIndicator.d.ts","sourceRoot":"","sources":["../src/FrappeConnectionIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC/B,MAAM,2BAA2B,CAAC;AAOnC,MAAM,WAAW,8BAA8B;IAC7C,mEAAmE;IACnE,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,8BAA8B,kDAgC/F"}
@@ -1 +1 @@
1
- {"version":3,"file":"FrappeDashboard.d.ts","sourceRoot":"","sources":["../src/FrappeDashboard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhF,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAwB,KAAK,WAAW,EAAM,MAAM,SAAS,CAAC;AAKrE;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,IAAI;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,YAAY,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;QAC3B,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACnD,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;KAC/B,EAAE,CAAC;CACL;AAED,MAAM,WAAW,oBAAoB,CAAC,IAAI,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAE,SAAQ,IAAI,CAChG,WAAW,EACX,UAAU,CACX;IACC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChG,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;CAC3C;AA+LD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,EAC9E,OAAO,EACP,IAAI,EACJ,WAAW,EACX,KAAK,EACL,WAAW,EACX,OAAO,EAAE,aAAa,EACtB,UAAU,EACV,aAAa,EACb,OAAW,EACX,GAAQ,EACR,OAAY,EACZ,WAAmB,EACnB,eAAoB,EACpB,OAAO,EACP,KAAK,EACL,GAAG,UAAU,EACd,EAAE,oBAAoB,CAAC,IAAI,CAAC,2CAyH5B;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"FrappeDashboard.d.ts","sourceRoot":"","sources":["../src/FrappeDashboard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,eAAe,EAAQ,MAAM,+BAA+B,CAAC;AAGtF,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAuC,KAAK,WAAW,EAAM,MAAM,SAAS,CAAC;AAKpF;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,IAAI;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACpE,YAAY,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;QAC3B,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACnD,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC;KAC/B,EAAE,CAAC;CACL;AAED,MAAM,WAAW,oBAAoB,CAAC,IAAI,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAE,SAAQ,IAAI,CAChG,WAAW,EACX,UAAU,CACX;IACC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChG,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;CAC3C;AA+LD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,EAC9E,OAAO,EACP,IAAI,EACJ,WAAW,EACX,KAAK,EACL,WAAW,EACX,OAAO,EAAE,aAAa,EACtB,UAAU,EACV,aAAa,EACb,OAAW,EACX,GAAQ,EACR,OAAY,EACZ,WAAmB,EACnB,eAAoB,EACpB,OAAO,EACP,KAAK,EACL,GAAG,UAAU,EACd,EAAE,oBAAoB,CAAC,IAAI,CAAC,2CAyH5B;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -146,6 +146,25 @@ export interface FrappeFormProps<TDoc extends {
146
146
  * scrolls. Defaults to on for a routed page.
147
147
  */
148
148
  stickyActions?: boolean;
149
+ /**
150
+ * Renders the form as its own detail page (LC-29): back in the top bar's
151
+ * leading slot and the record's actions beside it on the same row
152
+ * (LC-145), the title directly under the bar with the state chip under
153
+ * it, and `aside` as the supporting pane.
154
+ */
155
+ page?: FrappeFormPage;
156
+ }
157
+ export interface FrappeFormPage {
158
+ back: {
159
+ /** Where back goes (the list's name), beside the caret. */
160
+ label: string;
161
+ onPress: () => void;
162
+ "aria-label"?: string;
163
+ testID?: string;
164
+ };
165
+ /** The page title. Defaults to the record's title field, else its name. */
166
+ title?: string;
167
+ aside?: React.ReactNode;
149
168
  }
150
169
  /** DocShare row shape used for the live "Shared With" sidebar section. */
151
170
  export interface DocShareRow {