@multiplatform.one/frappe-ui 6.7.0 → 7.1.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 (516) hide show
  1. package/dist/cjs/FrappeAssignment.cjs +2 -0
  2. package/dist/cjs/FrappeAssignment.native.js +2 -0
  3. package/dist/cjs/FrappeAssignment.native.js.map +1 -1
  4. package/dist/cjs/FrappeCalendar.cjs +5 -7
  5. package/dist/cjs/FrappeCalendar.native.js +5 -9
  6. package/dist/cjs/FrappeCalendar.native.js.map +1 -1
  7. package/dist/cjs/FrappeChartCard.cjs +2 -0
  8. package/dist/cjs/FrappeChartCard.native.js +2 -0
  9. package/dist/cjs/FrappeChartCard.native.js.map +1 -1
  10. package/dist/cjs/FrappeDashboard.cjs +11 -22
  11. package/dist/cjs/FrappeDashboard.native.js +20 -22
  12. package/dist/cjs/FrappeDashboard.native.js.map +1 -1
  13. package/dist/cjs/FrappeForm.cjs +3 -1
  14. package/dist/cjs/FrappeForm.native.js +3 -1
  15. package/dist/cjs/FrappeForm.native.js.map +1 -1
  16. package/dist/cjs/FrappeGantt.cjs +5 -7
  17. package/dist/cjs/FrappeGantt.native.js +5 -9
  18. package/dist/cjs/FrappeGantt.native.js.map +1 -1
  19. package/dist/cjs/FrappeImageView.cjs +3 -1
  20. package/dist/cjs/FrappeImageView.native.js +3 -1
  21. package/dist/cjs/FrappeImageView.native.js.map +1 -1
  22. package/dist/cjs/FrappeKPICard.cjs +2 -0
  23. package/dist/cjs/FrappeKPICard.native.js +2 -0
  24. package/dist/cjs/FrappeKPICard.native.js.map +1 -1
  25. package/dist/cjs/FrappeKanban.cjs +3 -1
  26. package/dist/cjs/FrappeKanban.native.js +3 -1
  27. package/dist/cjs/FrappeKanban.native.js.map +1 -1
  28. package/dist/cjs/FrappeLikedBy.cjs +2 -0
  29. package/dist/cjs/FrappeLikedBy.native.js +2 -0
  30. package/dist/cjs/FrappeLikedBy.native.js.map +1 -1
  31. package/dist/cjs/FrappeList.cjs +3 -1
  32. package/dist/cjs/FrappeList.native.js +3 -1
  33. package/dist/cjs/FrappeList.native.js.map +1 -1
  34. package/dist/cjs/FrappeListView.cjs +6 -12
  35. package/dist/cjs/FrappeListView.native.js +13 -12
  36. package/dist/cjs/FrappeListView.native.js.map +1 -1
  37. package/dist/cjs/FrappeProvider.cjs +5 -1
  38. package/dist/cjs/FrappeProvider.native.js +5 -1
  39. package/dist/cjs/FrappeProvider.native.js.map +1 -1
  40. package/dist/cjs/FrappeReportBuilder.cjs +2 -0
  41. package/dist/cjs/FrappeReportBuilder.native.js +2 -0
  42. package/dist/cjs/FrappeReportBuilder.native.js.map +1 -1
  43. package/dist/cjs/FrappeReportView.cjs +23 -45
  44. package/dist/cjs/FrappeReportView.native.js +35 -50
  45. package/dist/cjs/FrappeReportView.native.js.map +1 -1
  46. package/dist/cjs/FrappeTable.cjs +105 -31
  47. package/dist/cjs/FrappeTable.native.js +140 -42
  48. package/dist/cjs/FrappeTable.native.js.map +1 -1
  49. package/dist/cjs/FrappeTreeView.cjs +3 -1
  50. package/dist/cjs/FrappeTreeView.native.js +3 -1
  51. package/dist/cjs/FrappeTreeView.native.js.map +1 -1
  52. package/dist/cjs/SyncErrorNotice.cjs +76 -0
  53. package/dist/cjs/SyncErrorNotice.native.js +92 -0
  54. package/dist/cjs/SyncErrorNotice.native.js.map +1 -0
  55. package/dist/cjs/commentActions.cjs +120 -0
  56. package/dist/cjs/commentActions.native.js +129 -0
  57. package/dist/cjs/commentActions.native.js.map +1 -0
  58. package/dist/cjs/components/attachments.cjs +2 -0
  59. package/dist/cjs/components/attachments.native.js +2 -0
  60. package/dist/cjs/components/attachments.native.js.map +1 -1
  61. package/dist/cjs/components/tags.cjs +5 -0
  62. package/dist/cjs/components/tags.native.js +5 -0
  63. package/dist/cjs/components/tags.native.js.map +1 -1
  64. package/dist/cjs/components/timeline.cjs +29 -2
  65. package/dist/cjs/components/timeline.native.js +33 -2
  66. package/dist/cjs/components/timeline.native.js.map +1 -1
  67. package/dist/cjs/desk/DeskFormSidebar.cjs +2 -0
  68. package/dist/cjs/desk/DeskFormSidebar.native.js +2 -0
  69. package/dist/cjs/desk/DeskFormSidebar.native.js.map +1 -1
  70. package/dist/cjs/fieldRegistry.cjs +2 -0
  71. package/dist/cjs/fieldRegistry.native.js +2 -0
  72. package/dist/cjs/fieldRegistry.native.js.map +1 -1
  73. package/dist/cjs/fields/Date/index.cjs +71 -7
  74. package/dist/cjs/fields/Date/index.native.js +325 -37
  75. package/dist/cjs/fields/Date/index.native.js.map +1 -1
  76. package/dist/cjs/fields/Date/types.cjs +18 -0
  77. package/dist/cjs/fields/Date/types.native.js +21 -0
  78. package/dist/cjs/fields/Date/types.native.js.map +1 -0
  79. package/dist/cjs/fields/Date/wire.cjs +4 -8
  80. package/dist/cjs/fields/Date/wire.native.js +4 -11
  81. package/dist/cjs/fields/Date/wire.native.js.map +1 -1
  82. package/dist/cjs/fields/DynamicLink.cjs +2 -0
  83. package/dist/cjs/fields/DynamicLink.native.js +2 -0
  84. package/dist/cjs/fields/DynamicLink.native.js.map +1 -1
  85. package/dist/cjs/fields/FileUpload.cjs +2 -0
  86. package/dist/cjs/fields/FileUpload.native.js +2 -0
  87. package/dist/cjs/fields/FileUpload.native.js.map +1 -1
  88. package/dist/cjs/fields/TableMultiSelect.cjs +6 -1
  89. package/dist/cjs/fields/TableMultiSelect.native.js +6 -1
  90. package/dist/cjs/fields/TableMultiSelect.native.js.map +1 -1
  91. package/dist/cjs/frappeStoryTarget.cjs +88 -0
  92. package/dist/cjs/frappeStoryTarget.native.js +100 -0
  93. package/dist/cjs/frappeStoryTarget.native.js.map +1 -1
  94. package/dist/cjs/frappeUsers.cjs +2 -0
  95. package/dist/cjs/frappeUsers.native.js +2 -0
  96. package/dist/cjs/frappeUsers.native.js.map +1 -1
  97. package/dist/cjs/index.cjs +17 -4
  98. package/dist/cjs/index.native.js +17 -4
  99. package/dist/cjs/index.native.js.map +1 -1
  100. package/dist/cjs/liveErrors.cjs +5 -1
  101. package/dist/cjs/liveErrors.native.js +5 -1
  102. package/dist/cjs/liveErrors.native.js.map +1 -1
  103. package/dist/cjs/useFrappeAggregate.cjs +13 -1
  104. package/dist/cjs/useFrappeAggregate.native.js +14 -1
  105. package/dist/cjs/useFrappeAggregate.native.js.map +1 -1
  106. package/dist/cjs/useFrappeFacets.cjs +329 -0
  107. package/dist/cjs/useFrappeFacets.native.js +632 -0
  108. package/dist/cjs/useFrappeFacets.native.js.map +1 -0
  109. package/dist/esm/FrappeAssignment.mjs +2 -0
  110. package/dist/esm/FrappeAssignment.mjs.map +1 -1
  111. package/dist/esm/FrappeAssignment.native.js +2 -0
  112. package/dist/esm/FrappeAssignment.native.js.map +1 -1
  113. package/dist/esm/FrappeCalendar.mjs +6 -8
  114. package/dist/esm/FrappeCalendar.mjs.map +1 -1
  115. package/dist/esm/FrappeCalendar.native.js +6 -10
  116. package/dist/esm/FrappeCalendar.native.js.map +1 -1
  117. package/dist/esm/FrappeChartCard.mjs +2 -0
  118. package/dist/esm/FrappeChartCard.mjs.map +1 -1
  119. package/dist/esm/FrappeChartCard.native.js +2 -0
  120. package/dist/esm/FrappeChartCard.native.js.map +1 -1
  121. package/dist/esm/FrappeDashboard.mjs +12 -19
  122. package/dist/esm/FrappeDashboard.mjs.map +1 -1
  123. package/dist/esm/FrappeDashboard.native.js +23 -21
  124. package/dist/esm/FrappeDashboard.native.js.map +1 -1
  125. package/dist/esm/FrappeForm.mjs +3 -1
  126. package/dist/esm/FrappeForm.mjs.map +1 -1
  127. package/dist/esm/FrappeForm.native.js +3 -1
  128. package/dist/esm/FrappeForm.native.js.map +1 -1
  129. package/dist/esm/FrappeGantt.mjs +6 -8
  130. package/dist/esm/FrappeGantt.mjs.map +1 -1
  131. package/dist/esm/FrappeGantt.native.js +6 -10
  132. package/dist/esm/FrappeGantt.native.js.map +1 -1
  133. package/dist/esm/FrappeImageView.mjs +3 -1
  134. package/dist/esm/FrappeImageView.mjs.map +1 -1
  135. package/dist/esm/FrappeImageView.native.js +3 -1
  136. package/dist/esm/FrappeImageView.native.js.map +1 -1
  137. package/dist/esm/FrappeKPICard.mjs +2 -0
  138. package/dist/esm/FrappeKPICard.mjs.map +1 -1
  139. package/dist/esm/FrappeKPICard.native.js +2 -0
  140. package/dist/esm/FrappeKPICard.native.js.map +1 -1
  141. package/dist/esm/FrappeKanban.mjs +3 -1
  142. package/dist/esm/FrappeKanban.mjs.map +1 -1
  143. package/dist/esm/FrappeKanban.native.js +3 -1
  144. package/dist/esm/FrappeKanban.native.js.map +1 -1
  145. package/dist/esm/FrappeLikedBy.mjs +2 -0
  146. package/dist/esm/FrappeLikedBy.mjs.map +1 -1
  147. package/dist/esm/FrappeLikedBy.native.js +2 -0
  148. package/dist/esm/FrappeLikedBy.native.js.map +1 -1
  149. package/dist/esm/FrappeList.mjs +3 -1
  150. package/dist/esm/FrappeList.mjs.map +1 -1
  151. package/dist/esm/FrappeList.native.js +3 -1
  152. package/dist/esm/FrappeList.native.js.map +1 -1
  153. package/dist/esm/FrappeListView.mjs +7 -13
  154. package/dist/esm/FrappeListView.mjs.map +1 -1
  155. package/dist/esm/FrappeListView.native.js +15 -14
  156. package/dist/esm/FrappeListView.native.js.map +1 -1
  157. package/dist/esm/FrappeProvider.mjs +5 -1
  158. package/dist/esm/FrappeProvider.mjs.map +1 -1
  159. package/dist/esm/FrappeProvider.native.js +5 -1
  160. package/dist/esm/FrappeProvider.native.js.map +1 -1
  161. package/dist/esm/FrappeReportBuilder.mjs +2 -0
  162. package/dist/esm/FrappeReportBuilder.mjs.map +1 -1
  163. package/dist/esm/FrappeReportBuilder.native.js +2 -0
  164. package/dist/esm/FrappeReportBuilder.native.js.map +1 -1
  165. package/dist/esm/FrappeReportView.mjs +26 -49
  166. package/dist/esm/FrappeReportView.mjs.map +1 -1
  167. package/dist/esm/FrappeReportView.native.js +38 -54
  168. package/dist/esm/FrappeReportView.native.js.map +1 -1
  169. package/dist/esm/FrappeTable.mjs +107 -33
  170. package/dist/esm/FrappeTable.mjs.map +1 -1
  171. package/dist/esm/FrappeTable.native.js +142 -44
  172. package/dist/esm/FrappeTable.native.js.map +1 -1
  173. package/dist/esm/FrappeTreeView.mjs +3 -1
  174. package/dist/esm/FrappeTreeView.mjs.map +1 -1
  175. package/dist/esm/FrappeTreeView.native.js +3 -1
  176. package/dist/esm/FrappeTreeView.native.js.map +1 -1
  177. package/dist/esm/SyncErrorNotice.mjs +51 -0
  178. package/dist/esm/SyncErrorNotice.mjs.map +1 -0
  179. package/dist/esm/SyncErrorNotice.native.js +53 -0
  180. package/dist/esm/SyncErrorNotice.native.js.map +1 -0
  181. package/dist/esm/commentActions.mjs +95 -0
  182. package/dist/esm/commentActions.mjs.map +1 -0
  183. package/dist/esm/commentActions.native.js +101 -0
  184. package/dist/esm/commentActions.native.js.map +1 -0
  185. package/dist/esm/components/attachments.mjs +2 -0
  186. package/dist/esm/components/attachments.mjs.map +1 -1
  187. package/dist/esm/components/attachments.native.js +2 -0
  188. package/dist/esm/components/attachments.native.js.map +1 -1
  189. package/dist/esm/components/tags.mjs +5 -0
  190. package/dist/esm/components/tags.mjs.map +1 -1
  191. package/dist/esm/components/tags.native.js +5 -0
  192. package/dist/esm/components/tags.native.js.map +1 -1
  193. package/dist/esm/components/timeline.mjs +31 -4
  194. package/dist/esm/components/timeline.mjs.map +1 -1
  195. package/dist/esm/components/timeline.native.js +35 -4
  196. package/dist/esm/components/timeline.native.js.map +1 -1
  197. package/dist/esm/desk/DeskFormSidebar.mjs +2 -0
  198. package/dist/esm/desk/DeskFormSidebar.mjs.map +1 -1
  199. package/dist/esm/desk/DeskFormSidebar.native.js +2 -0
  200. package/dist/esm/desk/DeskFormSidebar.native.js.map +1 -1
  201. package/dist/esm/fieldRegistry.mjs +2 -0
  202. package/dist/esm/fieldRegistry.mjs.map +1 -1
  203. package/dist/esm/fieldRegistry.native.js +2 -0
  204. package/dist/esm/fieldRegistry.native.js.map +1 -1
  205. package/dist/esm/fields/Date/index.mjs +73 -9
  206. package/dist/esm/fields/Date/index.mjs.map +1 -1
  207. package/dist/esm/fields/Date/index.native.js +315 -38
  208. package/dist/esm/fields/Date/index.native.js.map +1 -1
  209. package/dist/esm/fields/Date/types.mjs +2 -0
  210. package/dist/esm/fields/Date/types.mjs.map +1 -0
  211. package/dist/esm/fields/Date/types.native.js +2 -0
  212. package/dist/esm/fields/Date/types.native.js.map +1 -0
  213. package/dist/esm/fields/Date/wire.mjs +4 -8
  214. package/dist/esm/fields/Date/wire.mjs.map +1 -1
  215. package/dist/esm/fields/Date/wire.native.js +4 -11
  216. package/dist/esm/fields/Date/wire.native.js.map +1 -1
  217. package/dist/esm/fields/DynamicLink.mjs +2 -0
  218. package/dist/esm/fields/DynamicLink.mjs.map +1 -1
  219. package/dist/esm/fields/DynamicLink.native.js +2 -0
  220. package/dist/esm/fields/DynamicLink.native.js.map +1 -1
  221. package/dist/esm/fields/FileUpload.mjs +2 -0
  222. package/dist/esm/fields/FileUpload.mjs.map +1 -1
  223. package/dist/esm/fields/FileUpload.native.js +2 -0
  224. package/dist/esm/fields/FileUpload.native.js.map +1 -1
  225. package/dist/esm/fields/TableMultiSelect.mjs +7 -2
  226. package/dist/esm/fields/TableMultiSelect.mjs.map +1 -1
  227. package/dist/esm/fields/TableMultiSelect.native.js +7 -2
  228. package/dist/esm/fields/TableMultiSelect.native.js.map +1 -1
  229. package/dist/esm/frappeStoryTarget.mjs +88 -2
  230. package/dist/esm/frappeStoryTarget.mjs.map +1 -1
  231. package/dist/esm/frappeStoryTarget.native.js +100 -2
  232. package/dist/esm/frappeStoryTarget.native.js.map +1 -1
  233. package/dist/esm/frappeUsers.mjs +2 -0
  234. package/dist/esm/frappeUsers.mjs.map +1 -1
  235. package/dist/esm/frappeUsers.native.js +2 -0
  236. package/dist/esm/frappeUsers.native.js.map +1 -1
  237. package/dist/esm/index.mjs +7 -3
  238. package/dist/esm/index.mjs.map +1 -1
  239. package/dist/esm/index.native.js +7 -3
  240. package/dist/esm/index.native.js.map +1 -1
  241. package/dist/esm/liveErrors.mjs +5 -1
  242. package/dist/esm/liveErrors.mjs.map +1 -1
  243. package/dist/esm/liveErrors.native.js +5 -1
  244. package/dist/esm/liveErrors.native.js.map +1 -1
  245. package/dist/esm/useFrappeAggregate.mjs +13 -1
  246. package/dist/esm/useFrappeAggregate.mjs.map +1 -1
  247. package/dist/esm/useFrappeAggregate.native.js +14 -1
  248. package/dist/esm/useFrappeAggregate.native.js.map +1 -1
  249. package/dist/esm/useFrappeFacets.mjs +299 -0
  250. package/dist/esm/useFrappeFacets.mjs.map +1 -0
  251. package/dist/esm/useFrappeFacets.native.js +599 -0
  252. package/dist/esm/useFrappeFacets.native.js.map +1 -0
  253. package/dist/jsx/FrappeAssignment.mjs +2 -0
  254. package/dist/jsx/FrappeAssignment.mjs.map +1 -1
  255. package/dist/jsx/FrappeAssignment.native.js +2 -0
  256. package/dist/jsx/FrappeAssignment.native.js.map +1 -1
  257. package/dist/jsx/FrappeCalendar.mjs +6 -8
  258. package/dist/jsx/FrappeCalendar.mjs.map +1 -1
  259. package/dist/jsx/FrappeCalendar.native.js +5 -9
  260. package/dist/jsx/FrappeCalendar.native.js.map +1 -1
  261. package/dist/jsx/FrappeChartCard.mjs +2 -0
  262. package/dist/jsx/FrappeChartCard.mjs.map +1 -1
  263. package/dist/jsx/FrappeChartCard.native.js +2 -0
  264. package/dist/jsx/FrappeChartCard.native.js.map +1 -1
  265. package/dist/jsx/FrappeDashboard.mjs +12 -19
  266. package/dist/jsx/FrappeDashboard.mjs.map +1 -1
  267. package/dist/jsx/FrappeDashboard.native.js +20 -22
  268. package/dist/jsx/FrappeDashboard.native.js.map +1 -1
  269. package/dist/jsx/FrappeForm.mjs +3 -1
  270. package/dist/jsx/FrappeForm.mjs.map +1 -1
  271. package/dist/jsx/FrappeForm.native.js +3 -1
  272. package/dist/jsx/FrappeForm.native.js.map +1 -1
  273. package/dist/jsx/FrappeGantt.mjs +6 -8
  274. package/dist/jsx/FrappeGantt.mjs.map +1 -1
  275. package/dist/jsx/FrappeGantt.native.js +5 -9
  276. package/dist/jsx/FrappeGantt.native.js.map +1 -1
  277. package/dist/jsx/FrappeImageView.mjs +3 -1
  278. package/dist/jsx/FrappeImageView.mjs.map +1 -1
  279. package/dist/jsx/FrappeImageView.native.js +3 -1
  280. package/dist/jsx/FrappeImageView.native.js.map +1 -1
  281. package/dist/jsx/FrappeKPICard.mjs +2 -0
  282. package/dist/jsx/FrappeKPICard.mjs.map +1 -1
  283. package/dist/jsx/FrappeKPICard.native.js +2 -0
  284. package/dist/jsx/FrappeKPICard.native.js.map +1 -1
  285. package/dist/jsx/FrappeKanban.mjs +3 -1
  286. package/dist/jsx/FrappeKanban.mjs.map +1 -1
  287. package/dist/jsx/FrappeKanban.native.js +3 -1
  288. package/dist/jsx/FrappeKanban.native.js.map +1 -1
  289. package/dist/jsx/FrappeLikedBy.mjs +2 -0
  290. package/dist/jsx/FrappeLikedBy.mjs.map +1 -1
  291. package/dist/jsx/FrappeLikedBy.native.js +2 -0
  292. package/dist/jsx/FrappeLikedBy.native.js.map +1 -1
  293. package/dist/jsx/FrappeList.mjs +3 -1
  294. package/dist/jsx/FrappeList.mjs.map +1 -1
  295. package/dist/jsx/FrappeList.native.js +3 -1
  296. package/dist/jsx/FrappeList.native.js.map +1 -1
  297. package/dist/jsx/FrappeListView.mjs +7 -13
  298. package/dist/jsx/FrappeListView.mjs.map +1 -1
  299. package/dist/jsx/FrappeListView.native.js +13 -12
  300. package/dist/jsx/FrappeListView.native.js.map +1 -1
  301. package/dist/jsx/FrappeProvider.mjs +5 -1
  302. package/dist/jsx/FrappeProvider.mjs.map +1 -1
  303. package/dist/jsx/FrappeProvider.native.js +5 -1
  304. package/dist/jsx/FrappeProvider.native.js.map +1 -1
  305. package/dist/jsx/FrappeReportBuilder.mjs +2 -0
  306. package/dist/jsx/FrappeReportBuilder.mjs.map +1 -1
  307. package/dist/jsx/FrappeReportBuilder.native.js +2 -0
  308. package/dist/jsx/FrappeReportBuilder.native.js.map +1 -1
  309. package/dist/jsx/FrappeReportView.mjs +26 -49
  310. package/dist/jsx/FrappeReportView.mjs.map +1 -1
  311. package/dist/jsx/FrappeReportView.native.js +35 -50
  312. package/dist/jsx/FrappeReportView.native.js.map +1 -1
  313. package/dist/jsx/FrappeTable.mjs +107 -33
  314. package/dist/jsx/FrappeTable.mjs.map +1 -1
  315. package/dist/jsx/FrappeTable.native.js +140 -42
  316. package/dist/jsx/FrappeTable.native.js.map +1 -1
  317. package/dist/jsx/FrappeTreeView.mjs +3 -1
  318. package/dist/jsx/FrappeTreeView.mjs.map +1 -1
  319. package/dist/jsx/FrappeTreeView.native.js +3 -1
  320. package/dist/jsx/FrappeTreeView.native.js.map +1 -1
  321. package/dist/jsx/SyncErrorNotice.mjs +51 -0
  322. package/dist/jsx/SyncErrorNotice.mjs.map +1 -0
  323. package/dist/jsx/SyncErrorNotice.native.js +92 -0
  324. package/dist/jsx/SyncErrorNotice.native.js.map +1 -0
  325. package/dist/jsx/commentActions.mjs +95 -0
  326. package/dist/jsx/commentActions.mjs.map +1 -0
  327. package/dist/jsx/commentActions.native.js +129 -0
  328. package/dist/jsx/commentActions.native.js.map +1 -0
  329. package/dist/jsx/components/attachments.mjs +2 -0
  330. package/dist/jsx/components/attachments.mjs.map +1 -1
  331. package/dist/jsx/components/attachments.native.js +2 -0
  332. package/dist/jsx/components/attachments.native.js.map +1 -1
  333. package/dist/jsx/components/tags.mjs +5 -0
  334. package/dist/jsx/components/tags.mjs.map +1 -1
  335. package/dist/jsx/components/tags.native.js +5 -0
  336. package/dist/jsx/components/tags.native.js.map +1 -1
  337. package/dist/jsx/components/timeline.mjs +31 -4
  338. package/dist/jsx/components/timeline.mjs.map +1 -1
  339. package/dist/jsx/components/timeline.native.js +33 -2
  340. package/dist/jsx/components/timeline.native.js.map +1 -1
  341. package/dist/jsx/desk/DeskFormSidebar.mjs +2 -0
  342. package/dist/jsx/desk/DeskFormSidebar.mjs.map +1 -1
  343. package/dist/jsx/desk/DeskFormSidebar.native.js +2 -0
  344. package/dist/jsx/desk/DeskFormSidebar.native.js.map +1 -1
  345. package/dist/jsx/fieldRegistry.mjs +2 -0
  346. package/dist/jsx/fieldRegistry.mjs.map +1 -1
  347. package/dist/jsx/fieldRegistry.native.js +2 -0
  348. package/dist/jsx/fieldRegistry.native.js.map +1 -1
  349. package/dist/jsx/fields/Date/index.mjs +73 -9
  350. package/dist/jsx/fields/Date/index.mjs.map +1 -1
  351. package/dist/jsx/fields/Date/index.native.js +325 -37
  352. package/dist/jsx/fields/Date/index.native.js.map +1 -1
  353. package/dist/jsx/fields/Date/types.mjs +2 -0
  354. package/dist/jsx/fields/Date/types.mjs.map +1 -0
  355. package/dist/jsx/fields/Date/types.native.js +21 -0
  356. package/dist/jsx/fields/Date/types.native.js.map +1 -0
  357. package/dist/jsx/fields/Date/wire.mjs +4 -8
  358. package/dist/jsx/fields/Date/wire.mjs.map +1 -1
  359. package/dist/jsx/fields/Date/wire.native.js +4 -11
  360. package/dist/jsx/fields/Date/wire.native.js.map +1 -1
  361. package/dist/jsx/fields/DynamicLink.mjs +2 -0
  362. package/dist/jsx/fields/DynamicLink.mjs.map +1 -1
  363. package/dist/jsx/fields/DynamicLink.native.js +2 -0
  364. package/dist/jsx/fields/DynamicLink.native.js.map +1 -1
  365. package/dist/jsx/fields/FileUpload.mjs +2 -0
  366. package/dist/jsx/fields/FileUpload.mjs.map +1 -1
  367. package/dist/jsx/fields/FileUpload.native.js +2 -0
  368. package/dist/jsx/fields/FileUpload.native.js.map +1 -1
  369. package/dist/jsx/fields/TableMultiSelect.mjs +7 -2
  370. package/dist/jsx/fields/TableMultiSelect.mjs.map +1 -1
  371. package/dist/jsx/fields/TableMultiSelect.native.js +6 -1
  372. package/dist/jsx/fields/TableMultiSelect.native.js.map +1 -1
  373. package/dist/jsx/frappeStoryTarget.mjs +88 -2
  374. package/dist/jsx/frappeStoryTarget.mjs.map +1 -1
  375. package/dist/jsx/frappeStoryTarget.native.js +100 -0
  376. package/dist/jsx/frappeStoryTarget.native.js.map +1 -1
  377. package/dist/jsx/frappeUsers.mjs +2 -0
  378. package/dist/jsx/frappeUsers.mjs.map +1 -1
  379. package/dist/jsx/frappeUsers.native.js +2 -0
  380. package/dist/jsx/frappeUsers.native.js.map +1 -1
  381. package/dist/jsx/index.js +7 -3
  382. package/dist/jsx/index.js.map +1 -1
  383. package/dist/jsx/index.mjs +7 -3
  384. package/dist/jsx/index.mjs.map +1 -1
  385. package/dist/jsx/index.native.js +17 -4
  386. package/dist/jsx/index.native.js.map +1 -1
  387. package/dist/jsx/liveErrors.mjs +5 -1
  388. package/dist/jsx/liveErrors.mjs.map +1 -1
  389. package/dist/jsx/liveErrors.native.js +5 -1
  390. package/dist/jsx/liveErrors.native.js.map +1 -1
  391. package/dist/jsx/useFrappeAggregate.mjs +13 -1
  392. package/dist/jsx/useFrappeAggregate.mjs.map +1 -1
  393. package/dist/jsx/useFrappeAggregate.native.js +14 -1
  394. package/dist/jsx/useFrappeAggregate.native.js.map +1 -1
  395. package/dist/jsx/useFrappeFacets.mjs +299 -0
  396. package/dist/jsx/useFrappeFacets.mjs.map +1 -0
  397. package/dist/jsx/useFrappeFacets.native.js +632 -0
  398. package/dist/jsx/useFrappeFacets.native.js.map +1 -0
  399. package/package.json +20 -20
  400. package/src/FormSidebar.stories.tsx +88 -10
  401. package/src/FrappeAssignment.tsx +2 -0
  402. package/src/FrappeCalendar.tsx +12 -7
  403. package/src/FrappeChartCard.tsx +9 -2
  404. package/src/FrappeDashboard.spec.tsx +95 -0
  405. package/src/FrappeDashboard.tsx +20 -41
  406. package/src/FrappeForm.stories.tsx +53 -46
  407. package/src/FrappeForm.tsx +11 -1
  408. package/src/FrappeGantt.tsx +12 -7
  409. package/src/FrappeImageView.tsx +11 -1
  410. package/src/FrappeKPICard.stories.tsx +4 -1
  411. package/src/FrappeKPICard.tsx +2 -0
  412. package/src/FrappeKanban.tsx +4 -0
  413. package/src/FrappeLikedBy.stories.tsx +26 -10
  414. package/src/FrappeLikedBy.tsx +2 -0
  415. package/src/FrappeList.tsx +11 -1
  416. package/src/FrappeListView.spec.tsx +144 -0
  417. package/src/FrappeListView.tsx +11 -23
  418. package/src/FrappeProvider.tsx +30 -2
  419. package/src/FrappeReportBuilder.tsx +2 -0
  420. package/src/FrappeReportView.spec.tsx +140 -16
  421. package/src/FrappeReportView.stories.tsx +12 -6
  422. package/src/FrappeReportView.tsx +62 -61
  423. package/src/FrappeTable.keepRows.spec.tsx +200 -0
  424. package/src/FrappeTable.retryStorm.spec.tsx +140 -0
  425. package/src/FrappeTable.spec.tsx +222 -0
  426. package/src/FrappeTable.tsx +211 -54
  427. package/src/FrappeTreeView.tsx +11 -1
  428. package/src/SyncErrorNotice.spec.tsx +60 -0
  429. package/src/SyncErrorNotice.tsx +81 -0
  430. package/src/commentActions.ts +157 -0
  431. package/src/components/attachments.tsx +2 -0
  432. package/src/components/tags.tsx +14 -1
  433. package/src/components/timeline.optimistic.spec.tsx +106 -0
  434. package/src/components/timeline.tsx +36 -4
  435. package/src/desk/DeskFormSidebar.tsx +2 -0
  436. package/src/fieldRegistry.ts +2 -0
  437. package/src/fields/Date/index.native.tsx +410 -0
  438. package/src/fields/Date/index.tsx +138 -57
  439. package/src/fields/Date/nativePresentation.spec.tsx +251 -0
  440. package/src/fields/Date/typeParity.spec.tsx +480 -0
  441. package/src/fields/Date/types.ts +53 -0
  442. package/src/fields/Date/wire.spec.ts +63 -1
  443. package/src/fields/Date/wire.ts +17 -17
  444. package/src/fields/DynamicLink.tsx +2 -0
  445. package/src/fields/FileUpload.tsx +2 -0
  446. package/src/fields/TableMultiSelect.tsx +6 -3
  447. package/src/frappeStoryTarget.tsx +104 -1
  448. package/src/frappeUsers.ts +2 -0
  449. package/src/index.spec.ts +62 -0
  450. package/src/index.ts +36 -2
  451. package/src/liveErrors.spec.ts +50 -0
  452. package/src/liveErrors.ts +11 -1
  453. package/src/useFrappeAggregate.ts +20 -1
  454. package/src/useFrappeFacets.spec.tsx +436 -0
  455. package/src/useFrappeFacets.ts +568 -0
  456. package/types/FrappeAssignment.d.ts.map +1 -1
  457. package/types/FrappeCalendar.d.ts.map +1 -1
  458. package/types/FrappeChartCard.d.ts +1 -2
  459. package/types/FrappeChartCard.d.ts.map +1 -1
  460. package/types/FrappeDashboard.d.ts +0 -1
  461. package/types/FrappeDashboard.d.ts.map +1 -1
  462. package/types/FrappeForm.d.ts.map +1 -1
  463. package/types/FrappeGantt.d.ts.map +1 -1
  464. package/types/FrappeKPICard.d.ts.map +1 -1
  465. package/types/FrappeKanban.d.ts.map +1 -1
  466. package/types/FrappeLikedBy.d.ts.map +1 -1
  467. package/types/FrappeList.d.ts.map +1 -1
  468. package/types/FrappeListView.d.ts.map +1 -1
  469. package/types/FrappeProvider.d.ts +18 -1
  470. package/types/FrappeProvider.d.ts.map +1 -1
  471. package/types/FrappeReportBuilder.d.ts.map +1 -1
  472. package/types/FrappeReportView.d.ts +22 -15
  473. package/types/FrappeReportView.d.ts.map +1 -1
  474. package/types/FrappeTable.d.ts +21 -2
  475. package/types/FrappeTable.d.ts.map +1 -1
  476. package/types/FrappeTreeView.d.ts.map +1 -1
  477. package/types/SyncErrorNotice.d.ts +38 -0
  478. package/types/SyncErrorNotice.d.ts.map +1 -0
  479. package/types/commentActions.d.ts +46 -0
  480. package/types/commentActions.d.ts.map +1 -0
  481. package/types/components/attachments.d.ts.map +1 -1
  482. package/types/components/tags.d.ts.map +1 -1
  483. package/types/components/timeline.d.ts.map +1 -1
  484. package/types/desk/DeskFormSidebar.d.ts.map +1 -1
  485. package/types/fieldRegistry.d.ts.map +1 -1
  486. package/types/fields/Date/index.d.ts +22 -12
  487. package/types/fields/Date/index.d.ts.map +1 -1
  488. package/types/fields/Date/index.native.d.ts +14 -0
  489. package/types/fields/Date/index.native.d.ts.map +1 -0
  490. package/types/fields/Date/types.d.ts +27 -0
  491. package/types/fields/Date/types.d.ts.map +1 -0
  492. package/types/fields/Date/wire.d.ts +13 -9
  493. package/types/fields/Date/wire.d.ts.map +1 -1
  494. package/types/fields/DynamicLink.d.ts.map +1 -1
  495. package/types/fields/FileUpload.d.ts.map +1 -1
  496. package/types/fields/TableMultiSelect.d.ts.map +1 -1
  497. package/types/frappeStoryTarget.d.ts +19 -1
  498. package/types/frappeStoryTarget.d.ts.map +1 -1
  499. package/types/frappeUsers.d.ts.map +1 -1
  500. package/types/index.d.ts +6 -2
  501. package/types/index.d.ts.map +1 -1
  502. package/types/liveErrors.d.ts +4 -0
  503. package/types/liveErrors.d.ts.map +1 -1
  504. package/types/useFrappeAggregate.d.ts +4 -0
  505. package/types/useFrappeAggregate.d.ts.map +1 -1
  506. package/types/useFrappeFacets.d.ts +143 -0
  507. package/types/useFrappeFacets.d.ts.map +1 -0
  508. package/dist/cjs/fields/Date/date.native.js +0 -277
  509. package/dist/cjs/fields/Date/date.native.js.map +0 -1
  510. package/dist/esm/fields/Date/date.native.js +0 -238
  511. package/dist/esm/fields/Date/date.native.js.map +0 -1
  512. package/dist/jsx/fields/Date/date.native.js +0 -277
  513. package/dist/jsx/fields/Date/date.native.js.map +0 -1
  514. package/src/fields/Date/date.native.tsx +0 -299
  515. package/types/fields/Date/date.native.d.ts +0 -19
  516. package/types/fields/Date/date.native.d.ts.map +0 -1
@@ -8,7 +8,12 @@ import {
8
8
  import React, { useCallback, useMemo, useState, type ReactNode } from "react";
9
9
  import { Text, YStack, type YStackProps } from "tamagui";
10
10
  import { useTranslation } from "react-i18next";
11
- import { parseCalendarDate, useChartPalette, useResolvedKnobs } from "@multiplatform.one/theme";
11
+ import {
12
+ formatCalendarDate,
13
+ parseCalendarDate,
14
+ useChartPalette,
15
+ useResolvedKnobs,
16
+ } from "@multiplatform.one/theme";
12
17
  import { FrappeConnectionIndicator } from "./FrappeConnectionIndicator";
13
18
  import { useFrappeConfig } from "./FrappeProvider";
14
19
  import { describeSyncError } from "./syncError";
@@ -63,12 +68,8 @@ export interface FrappeGanttProps<TDoc extends { name: string; doctype: string }
63
68
  */
64
69
  function toFrappeFieldValue(original: unknown, next: Date): unknown {
65
70
  if (original instanceof Date) return next;
66
- const pad = (n: number) => String(n).padStart(2, "0");
67
- const datePart = `${next.getFullYear()}-${pad(next.getMonth() + 1)}-${pad(next.getDate())}`;
68
- if (typeof original === "string" && original.includes(":")) {
69
- return `${datePart} ${pad(next.getHours())}:${pad(next.getMinutes())}:${pad(next.getSeconds())}`;
70
- }
71
- return datePart;
71
+ const carriesTime = typeof original === "string" && original.includes(":");
72
+ return formatCalendarDate(next, carriesTime ? "datetime" : "date");
72
73
  }
73
74
 
74
75
  /**
@@ -139,6 +140,8 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
139
140
  () => ({
140
141
  baseURL: finalBaseURL,
141
142
  socketPort: config?.socketPort,
143
+ siteName: config?.siteName,
144
+ socketBaseURL: config?.socketBaseURL,
142
145
  auth: finalAuth,
143
146
  syncOptions: finalSyncOptions,
144
147
  socketOptions: config?.socketOptions,
@@ -147,6 +150,8 @@ export function FrappeGantt<TDoc extends { name: string; doctype: string }>({
147
150
  [
148
151
  finalBaseURL,
149
152
  config?.socketPort,
153
+ config?.siteName,
154
+ config?.socketBaseURL,
150
155
  finalAuth,
151
156
  finalSyncOptions,
152
157
  config?.socketOptions,
@@ -185,11 +185,21 @@ function FrappeImageViewClient<TDoc extends { name: string; doctype: string }>({
185
185
  () => ({
186
186
  baseURL: finalBaseURL,
187
187
  socketPort: config?.socketPort,
188
+ siteName: config?.siteName,
189
+ socketBaseURL: config?.socketBaseURL,
188
190
  auth: finalAuth,
189
191
  syncOptions: finalSyncOptions,
190
192
  fixtures: config?.fixtures,
191
193
  }),
192
- [finalBaseURL, config?.socketPort, finalAuth, finalSyncOptions, config?.fixtures],
194
+ [
195
+ finalBaseURL,
196
+ config?.socketPort,
197
+ config?.siteName,
198
+ config?.socketBaseURL,
199
+ finalAuth,
200
+ finalSyncOptions,
201
+ config?.fixtures,
202
+ ],
193
203
  );
194
204
 
195
205
  const { meta, isLoading: isMetaLoading } = useDocTypeMeta(appConfig, doctype);
@@ -1,8 +1,11 @@
1
1
  import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
+ // KPICard comes from the components catalog — the frappe-ui barrel
3
+ // re-exports it from there directly (./FrappeDashboard no longer bounces
4
+ // catalog names it does not define).
5
+ import { KPICard } from "@multiplatform.one/components";
2
6
  import { action } from "@multiplatform.one/storybook";
3
7
  import { CurrencyDollarIcon } from "@phosphor-icons/react";
4
8
  import { XStack } from "tamagui";
5
- import { KPICard } from "./FrappeDashboard";
6
9
  import { FrappeKPICard } from "./FrappeKPICard";
7
10
  import { FrappeStoryProvider } from "./frappeStoryTarget";
8
11
 
@@ -99,6 +99,8 @@ export function FrappeKPICard({
99
99
  ? {
100
100
  baseURL: finalBaseURL,
101
101
  socketPort: providerConfig?.socketPort,
102
+ siteName: providerConfig?.siteName,
103
+ socketBaseURL: providerConfig?.socketBaseURL,
102
104
  auth: auth ?? providerConfig?.auth,
103
105
  syncOptions: syncOptions ?? providerConfig?.syncOptions,
104
106
  fixtures: providerConfig?.fixtures,
@@ -117,6 +117,8 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
117
117
  () => ({
118
118
  baseURL: finalBaseURL,
119
119
  socketPort: config?.socketPort,
120
+ siteName: config?.siteName,
121
+ socketBaseURL: config?.socketBaseURL,
120
122
  auth: finalAuth,
121
123
  syncOptions: finalSyncOptions,
122
124
  socketOptions: config?.socketOptions,
@@ -125,6 +127,8 @@ export function FrappeKanban<TDoc extends { name: string; doctype: string }>({
125
127
  [
126
128
  finalBaseURL,
127
129
  config?.socketPort,
130
+ config?.siteName,
131
+ config?.socketBaseURL,
128
132
  finalAuth,
129
133
  finalSyncOptions,
130
134
  config?.socketOptions,
@@ -2,7 +2,7 @@ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
2
2
  import { action } from "@multiplatform.one/storybook";
3
3
  import { FrappeLikedBy } from "./FrappeLikedBy";
4
4
  import { FrappeProvider } from "./FrappeProvider";
5
- import { FrappeStoryProvider, frappeStoriesLive } from "./frappeStoryTarget";
5
+ import { FrappeStoryProvider, LiveToDoGate, frappeStoriesLive } from "./frappeStoryTarget";
6
6
  import type { FrappeUserDoc } from "./frappeUsers";
7
7
 
8
8
  export default {
@@ -51,6 +51,18 @@ const makeFixtures = () =>
51
51
  ]),
52
52
  },
53
53
  ],
54
+ // The live story's doctype. `Task` ships with ERPNext, not frappe, so a
55
+ // frappe-only bench answers `/api/resource/Task/TASK-001` with a 500
56
+ // ImportError instead of a document — the live arm has to name a doctype
57
+ // every bench actually has, and this fixture keeps its offline fallback
58
+ // rendering.
59
+ ToDo: [
60
+ {
61
+ name: "TODO-LIVE-001",
62
+ doctype: "ToDo",
63
+ _liked_by: JSON.stringify(["Administrator", "jane@example.com"]),
64
+ },
65
+ ],
54
66
  User: userFixtures,
55
67
  });
56
68
 
@@ -153,14 +165,18 @@ export const LoadError = () => (
153
165
  */
154
166
  export const Live = (args: { doctype?: string; docname?: string }) => (
155
167
  <FrappeStoryProvider fixtures={makeFixtures()}>
156
- <FrappeLikedBy
157
- doctype={args.doctype || "Task"}
158
- name={args.docname || "TASK-001"}
159
- // Live mode resolves the session user via get_logged_user; the fixture
160
- // fallback has no session, so pin one for interactivity.
161
- currentUser={frappeStoriesLive ? undefined : "Administrator"}
162
- onToggle={action("onToggle")}
163
- />
168
+ <LiveToDoGate name={args.docname}>
169
+ {(name) => (
170
+ <FrappeLikedBy
171
+ doctype={args.doctype || "ToDo"}
172
+ name={name}
173
+ // Live mode resolves the session user via get_logged_user; the fixture
174
+ // fallback has no session, so pin one for interactivity.
175
+ currentUser={frappeStoriesLive ? undefined : "Administrator"}
176
+ onToggle={action("onToggle")}
177
+ />
178
+ )}
179
+ </LiveToDoGate>
164
180
  </FrappeStoryProvider>
165
181
  );
166
182
  Live.args = { doctype: "", docname: "" };
@@ -169,7 +185,7 @@ Live.parameters = {
169
185
  docs: {
170
186
  description: {
171
187
  story:
172
- "Live like toggle over the real bench: optimistic flip, `toggle_like` POST, revert on failure; out-of-band likes stream in via the doc subscription. Fixture fallback (Task/TASK-001) when the bench is down.",
188
+ "Live like toggle over the real bench ToDo (not ERPNext Task — a frappe-only bench 500s ImportError on Task). Optimistic flip, `toggle_like` POST, revert on failure; out-of-band likes stream in via the doc subscription. Pass a real `docname` or let the story resolve/seed a readable ToDo. Fixture fallback (ToDo/TODO-LIVE-001) when the bench is down.",
173
189
  },
174
190
  },
175
191
  };
@@ -127,6 +127,8 @@ function FrappeLikedByBody({
127
127
  ? {
128
128
  baseURL: config.baseURL,
129
129
  socketPort: config.socketPort,
130
+ siteName: config.siteName,
131
+ socketBaseURL: config.socketBaseURL,
130
132
  auth: config.auth,
131
133
  syncOptions: config.syncOptions,
132
134
  fixtures: config.fixtures,
@@ -59,11 +59,21 @@ export function FrappeList<TDoc extends { name: string; doctype: string }>({
59
59
  () => ({
60
60
  baseURL: finalBaseURL,
61
61
  socketPort: config?.socketPort,
62
+ siteName: config?.siteName,
63
+ socketBaseURL: config?.socketBaseURL,
62
64
  auth: finalAuth,
63
65
  syncOptions: finalSyncOptions,
64
66
  fixtures: config?.fixtures,
65
67
  }),
66
- [finalBaseURL, config?.socketPort, finalAuth, finalSyncOptions, config?.fixtures],
68
+ [
69
+ finalBaseURL,
70
+ config?.socketPort,
71
+ config?.siteName,
72
+ config?.socketBaseURL,
73
+ finalAuth,
74
+ finalSyncOptions,
75
+ config?.fixtures,
76
+ ],
67
77
  );
68
78
 
69
79
  // Bridge VirtualPageManager pagination to generic onLoadMore/hasMore.
@@ -0,0 +1,144 @@
1
+ // FrappeListView toolbar refresh — LC-54 PRESS-FLOOR-CHANNEL (amendment
2
+ // 2026-08-13, "the grown box NEVER PAINTS"): the refresh affordance used to
3
+ // be a raw tamagui Button riding a grown transparent press target (negative
4
+ // outsets escaping the toolbar slot) whose default hover fill painted the
5
+ // whole escaped 44px floor. The fix migrates it to the house forms Button
6
+ // with `circular` — the painted box ITSELF is the 44×44 control, so feedback
7
+ // stays inside its own reserved layout slot (box-is-control mechanism).
8
+ // Same atom-based assertions as FrappeDashboard.spec.tsx (jsdom can't apply
9
+ // :hover; the positive control proving the detectors work lives there).
10
+ //
11
+ // DocType meta is served by a scoped fetch mock (same shape the stories
12
+ // use); documents come from InMemoryFixtureProvider.
13
+ import { InMemoryFixtureProvider } from "@multiplatform.one/frappe";
14
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
15
+ import { cleanup, fireEvent, waitFor } from "@testing-library/react";
16
+ import i18next from "i18next";
17
+ import { initReactI18next } from "react-i18next";
18
+ import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest";
19
+ import { FrappeListView } from "./FrappeListView";
20
+ import { FrappeProvider } from "./FrappeProvider";
21
+
22
+ const MOCK_HOST = "https://listview.spec.test";
23
+
24
+ const metaRaw = {
25
+ name: "QaTodo",
26
+ module: "QA",
27
+ title_field: "description",
28
+ fields: [
29
+ {
30
+ fieldname: "description",
31
+ fieldtype: "Data",
32
+ label: "Description",
33
+ in_list_view: 1,
34
+ reqd: 1,
35
+ },
36
+ {
37
+ fieldname: "status",
38
+ fieldtype: "Select",
39
+ label: "Status",
40
+ options: "Open\nWorking\nCompleted",
41
+ in_list_view: 1,
42
+ in_standard_filter: 1,
43
+ },
44
+ ],
45
+ permissions: [{ role: "All", read: 1, write: 1, create: 1 }],
46
+ };
47
+
48
+ const jsonResponse = (body: unknown, status = 200) =>
49
+ new Response(JSON.stringify(body), {
50
+ status,
51
+ headers: { "Content-Type": "application/json" },
52
+ });
53
+
54
+ const realFetch = globalThis.fetch;
55
+ beforeAll(async () => {
56
+ await i18next.use(initReactI18next).init({
57
+ lng: "en",
58
+ interpolation: { escapeValue: false },
59
+ resources: { en: { translation: {} } },
60
+ });
61
+ globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => {
62
+ const urlStr =
63
+ typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
64
+ if (urlStr.startsWith(MOCK_HOST)) {
65
+ const url = new URL(urlStr);
66
+ if (/^\/api\/resource\/DocType\/.+$/.test(url.pathname)) {
67
+ return jsonResponse({ data: metaRaw });
68
+ }
69
+ return jsonResponse({ data: [] });
70
+ }
71
+ return realFetch(input as RequestInfo, init);
72
+ }) as typeof fetch;
73
+ });
74
+
75
+ afterAll(() => {
76
+ globalThis.fetch = realFetch;
77
+ });
78
+
79
+ afterEach(cleanup);
80
+
81
+ const fixtures = new InMemoryFixtureProvider({
82
+ QaTodo: [
83
+ {
84
+ name: "QATODO-001",
85
+ doctype: "QaTodo",
86
+ description: "Review document",
87
+ status: "Open",
88
+ },
89
+ ],
90
+ });
91
+
92
+ // Grown-box escape mechanism: any negative margin atom on the press floor.
93
+ const negativeMarginAtom = /_m[trbl]--\d/;
94
+ // Painted state feedback: any non-transparent hover/press background atom.
95
+ const paintedStateAtom = /_bg-0(?:hover|active)-(?!transparent)/;
96
+
97
+ const renderListView = (props: Partial<Parameters<typeof FrappeListView>[0]> = {}) =>
98
+ renderWithProviders(
99
+ <FrappeProvider baseURL={MOCK_HOST} fixtures={fixtures}>
100
+ <FrappeListView doctype="QaTodo" {...props} />
101
+ </FrappeProvider>,
102
+ );
103
+
104
+ const refreshIn = async (container: HTMLElement) => {
105
+ await waitFor(() => {
106
+ expect(container.querySelector('[aria-label="Refresh"]')).not.toBeNull();
107
+ });
108
+ return container.querySelector('[aria-label="Refresh"]') as HTMLElement;
109
+ };
110
+
111
+ describe("FrappeListView refresh press floor (LC-54 amendment)", () => {
112
+ it("the refresh floor is its own box — no grown-target negative outset", async () => {
113
+ const { container } = renderListView();
114
+ const refresh = await refreshIn(container);
115
+ expect(refresh.getAttribute("role")).toBe("button");
116
+ // House circular Button: the 44px floor is REAL layout (box-is-control);
117
+ // the escape mechanism (negative margins pulling the grown box over the
118
+ // adjacent Add button) must be gone.
119
+ expect(refresh.className).not.toMatch(negativeMarginAtom);
120
+ expect(refresh.className).toMatch(/_mih-44px/);
121
+ expect(refresh.className).toMatch(/_miw-44px/);
122
+ });
123
+
124
+ it("hover feedback rides the button's own in-slot box (house channel)", async () => {
125
+ const { container } = renderListView();
126
+ const refresh = await refreshIn(container);
127
+ // Paint on the OWN box is the sanctioned own-size mechanism — the
128
+ // amendment bans paint on a box that escapes its slot (arm above).
129
+ expect(refresh.className).toMatch(paintedStateAtom);
130
+ expect(refresh.querySelector("svg")).not.toBeNull();
131
+ });
132
+
133
+ it("the migrated Add button still activates (house div[role=button])", async () => {
134
+ const onAdd = vi.fn();
135
+ const { container } = renderListView({ onAdd });
136
+ await refreshIn(container);
137
+ const add = Array.from(container.querySelectorAll('[role="button"]')).find((node) =>
138
+ node.textContent?.includes("Add QaTodo"),
139
+ ) as HTMLElement;
140
+ expect(add).not.toBeNull();
141
+ fireEvent.click(add);
142
+ expect(onAdd).toHaveBeenCalledTimes(1);
143
+ });
144
+ });
@@ -3,35 +3,16 @@ import type { DataTableColumn } from "@multiplatform.one/table";
3
3
  import { ArrowsClockwiseIcon, PlusIcon } from "@phosphor-icons/react";
4
4
  import React, { useState, useMemo, useCallback, useEffect } from "react";
5
5
  import { useTranslation } from "react-i18next";
6
- import { SearchInput, Spinner } from "@multiplatform.one/forms";
7
- import { Button, Text, View, XStack, YStack, isWeb, useTheme, type YStackProps } from "tamagui";
6
+ import { Button, SearchInput, Spinner } from "@multiplatform.one/forms";
7
+ import { Text, View, XStack, YStack, isWeb, useTheme, type YStackProps } from "tamagui";
8
8
  import { SavedFilterDropdown, useSavedFilters, type ParsedFilter } from "@multiplatform.one/table";
9
9
  import { Avatar, ViewSwitcher } from "@multiplatform.one/components";
10
- import {
11
- MIN_PRESS_TARGET,
12
- pressTargetHitSlop,
13
- pressTargetStyle,
14
- useResolvedKnobs,
15
- } from "@multiplatform.one/theme";
10
+ import { pressTargetStyle, useResolvedKnobs } from "@multiplatform.one/theme";
16
11
  import { storage } from "@multiplatform.one/store";
17
12
  import { useFrappeConfig } from "./FrappeProvider";
18
13
  import { FrappeList } from "./FrappeList";
19
14
  import { FrappeTable } from "./FrappeTable";
20
15
 
21
- // DG-LAY-04 / D-02 press-floor: the chromeless $2 refresh button paints
22
- // ~28×28; the press box is floored at 44 via the house pressTarget* channel
23
- // (grown transparent box + negative outset + hitSlop). The horizontal outset
24
- // (8px) stays under the toolbar gap, so the enlarged target never reaches the
25
- // adjacent Add button's box.
26
- const REFRESH_VISUAL = 28;
27
- const REFRESH_OUTSET = Math.ceil((MIN_PRESS_TARGET - REFRESH_VISUAL) / 2);
28
- const refreshPressFloorProps = {
29
- ...pressTargetStyle(),
30
- marginVertical: -REFRESH_OUTSET,
31
- marginHorizontal: -REFRESH_OUTSET,
32
- hitSlop: pressTargetHitSlop(REFRESH_VISUAL),
33
- } as const;
34
-
35
16
  interface ListFieldConfig {
36
17
  key: string;
37
18
  label?: string;
@@ -164,6 +145,8 @@ export function FrappeListView<TDoc extends { name: string; doctype: string }>({
164
145
  const connectionConfig = {
165
146
  baseURL: finalBaseURL,
166
147
  socketPort: config?.socketPort,
148
+ siteName: config?.siteName,
149
+ socketBaseURL: config?.socketBaseURL,
167
150
  auth: finalAuth,
168
151
  syncOptions: finalSyncOptions,
169
152
  fixtures: config?.fixtures,
@@ -482,13 +465,18 @@ export function FrappeListView<TDoc extends { name: string; doctype: string }>({
482
465
  </XStack>
483
466
 
484
467
  <XStack alignItems="center" {...knobProps.gap}>
468
+ {/* LC-54 (amendment 2026-08-13): house Button, own-box floor — the
469
+ raw tamagui Button + grown transparent target painted its hover
470
+ fill across the escaped 44px floor. `circular` makes the painted
471
+ box ITSELF the 44×44 control (box-is-control mechanism), so
472
+ feedback stays inside its own layout slot. */}
485
473
  <Button
486
474
  size="$2"
475
+ circular
487
476
  chromeless
488
477
  icon={ArrowsClockwiseIcon}
489
478
  onPress={handleRefresh}
490
479
  aria-label={t("Refresh")}
491
- {...refreshPressFloorProps}
492
480
  />
493
481
  {onAdd && (
494
482
  <Button
@@ -20,6 +20,19 @@ export interface FrappeConfig {
20
20
  * production reverse proxy that routes `/socket.io` to the SocketIO backend.
21
21
  */
22
22
  socketPort?: number;
23
+ /**
24
+ * Dial the realtime socket at this origin instead of deriving it from
25
+ * `baseURL` + `socketPort` — for dev servers that proxy `/socket.io` on
26
+ * their own origin, making the handshake same-origin (e.g. the page origin
27
+ * in web dev). Wins over `socketPort`. Omit in production.
28
+ */
29
+ socketBaseURL?: string;
30
+ /**
31
+ * Frappe site name — the Socket.IO namespace realtime must join. Set it
32
+ * whenever the `baseURL` hostname is not the bench site name (e.g. baseURL
33
+ * http://127.0.0.1:8000 serving site "localhost").
34
+ */
35
+ siteName?: string;
23
36
  /** Authentication configuration */
24
37
  auth?: {
25
38
  /** Whether to use token-based authentication */
@@ -55,6 +68,10 @@ export interface FrappeProviderProps {
55
68
  baseURL: string;
56
69
  /** Override port for Socket.IO realtime connection (e.g. 9000 in dev). */
57
70
  socketPort?: number;
71
+ /** Dial the realtime socket at this origin (same-origin dev proxy). */
72
+ socketBaseURL?: string;
73
+ /** Frappe site name — the Socket.IO namespace realtime must join. */
74
+ siteName?: string;
58
75
  /** Authentication configuration */
59
76
  auth?: {
60
77
  /** Whether to use token-based authentication */
@@ -99,14 +116,25 @@ export function FrappeProvider({
99
116
  children,
100
117
  baseURL,
101
118
  socketPort,
119
+ socketBaseURL,
120
+ siteName,
102
121
  auth,
103
122
  syncOptions,
104
123
  socketOptions,
105
124
  fixtures,
106
125
  }: FrappeProviderProps) {
107
126
  const value = React.useMemo(
108
- () => ({ baseURL, socketPort, auth, syncOptions, socketOptions, fixtures }),
109
- [baseURL, socketPort, auth, syncOptions, socketOptions, fixtures],
127
+ () => ({
128
+ baseURL,
129
+ socketPort,
130
+ socketBaseURL,
131
+ siteName,
132
+ auth,
133
+ syncOptions,
134
+ socketOptions,
135
+ fixtures,
136
+ }),
137
+ [baseURL, socketPort, socketBaseURL, siteName, auth, syncOptions, socketOptions, fixtures],
110
138
  );
111
139
 
112
140
  return <FrappeContext.Provider value={value}>{children}</FrappeContext.Provider>;
@@ -130,6 +130,8 @@ export function FrappeReportBuilder({
130
130
  const connectionConfig = {
131
131
  baseURL: finalBaseURL,
132
132
  socketPort: config?.socketPort,
133
+ siteName: config?.siteName,
134
+ socketBaseURL: config?.socketBaseURL,
133
135
  auth: finalAuth,
134
136
  syncOptions: finalSyncOptions,
135
137
  fixtures: config?.fixtures,