@everfur/sdk 0.12.0 → 0.13.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 (268) hide show
  1. package/CHANGELOG.md +174 -0
  2. package/README.md +2 -1
  3. package/dist/{Chat-BOG0SXKV.d.cts → Chat.d-DUNTfzqC.d.ts} +170 -8
  4. package/dist/{Chat-CIolBgjJ.d.ts → Chat.d-Dts8u_1a.d.cts} +170 -8
  5. package/dist/{DepthViews-BR6VQ3Ta.d.cts → DepthViews.d-BIp599lz.d.cts} +1 -1
  6. package/dist/{DepthViews-280t3BcQ.d.ts → DepthViews.d-BMU2jFPw.d.cts} +1 -1
  7. package/dist/{DepthViews-DlBuFsgN.d.ts → DepthViews.d-Ce2Zhnrb.d.ts} +1 -1
  8. package/dist/{DepthViews-BTbF_DJY.d.cts → DepthViews.d-CubkMPbU.d.ts} +1 -1
  9. package/dist/{ErrorPolicyPort-10s3HJCt.d.cts → ErrorPolicyPort.d-68yrE3BE.d.ts} +1 -1
  10. package/dist/{ErrorPolicyPort-C3nNSS_j.d.ts → ErrorPolicyPort.d-DirW9hgO.d.cts} +1 -1
  11. package/dist/{EverfurError-DeBqRpQV.d.cts → EverfurError.d-8NHtlgzA.d.cts} +11 -1
  12. package/dist/{EverfurError-DeBqRpQV.d.ts → EverfurError.d-8NHtlgzA.d.ts} +11 -1
  13. package/dist/{EverfurResult-ClPTS0P2.d.ts → EverfurResult.d-BFH-3s6E.d.cts} +1 -1
  14. package/dist/{EverfurResult-COlXj1wq.d.cts → EverfurResult.d-D_-254ZY.d.ts} +1 -1
  15. package/dist/{IntakeMedia-BH0fYDT2.d.cts → IntakeMedia.d-4a89XrP7.d.ts} +1 -1
  16. package/dist/{IntakeMedia-B-_vA9ZB.d.cts → IntakeMedia.d-DGxrhgIW.d.ts} +1 -1
  17. package/dist/{IntakeMedia-CIoTXAWs.d.ts → IntakeMedia.d-DUPR4lVM.d.cts} +1 -1
  18. package/dist/{IntakeMedia-Bavl7E4Z.d.ts → IntakeMedia.d-JJCUvQu7.d.cts} +1 -1
  19. package/dist/LifecyclePort.d-Cr1p33a7.d.cts +23 -0
  20. package/dist/LifecyclePort.d-Cr1p33a7.d.ts +23 -0
  21. package/dist/{PhotoController-vzY5bfY_.d.ts → PhotoController.d-BzCJOE7e.d.cts} +2 -2
  22. package/dist/{PhotoController-3l7MT9jA.d.cts → PhotoController.d-D0XiUUOl.d.ts} +2 -2
  23. package/dist/animations/index.cjs +5 -1
  24. package/dist/animations/index.d.cts +24 -24
  25. package/dist/animations/index.d.ts +24 -24
  26. package/dist/animations/index.js +5 -1
  27. package/dist/{attachments-CGxvnYu4.d.ts → attachments.d-Bp2qbHxn.d.cts} +22 -26
  28. package/dist/{attachments-CWNj1ZkM.d.ts → attachments.d-D1yhJjcZ.d.ts} +4 -4
  29. package/dist/{attachments-waXcJWCp.d.cts → attachments.d-DisnvB9R.d.cts} +4 -4
  30. package/dist/{attachments-B6h4cJU-.d.cts → attachments.d-Djy9z_0Z.d.ts} +22 -26
  31. package/dist/{bookingCopy-CjPKeg75.d.ts → bookingCopy.d-BJF6gd1A.d.ts} +24 -9
  32. package/dist/{bookingCopy-8aEU6ZmR.d.cts → bookingCopy.d-BlBmhAJc.d.cts} +24 -9
  33. package/dist/{branding-DJf4h12Q.d.ts → branding.d-DI8S400y.d.cts} +9 -2
  34. package/dist/{branding-BCfwLj0h.d.cts → branding.d-OIGLbQeM.d.ts} +9 -2
  35. package/dist/{callRoom-BhIdadyV.d.cts → callRoom.d-B1DoYdJe.d.cts} +1 -1
  36. package/dist/{callRoom-B92eH_ij.d.ts → callRoom.d-Dqm1rUqT.d.ts} +1 -1
  37. package/dist/{casesRepository-CGdhvzTu.d.cts → casesRepository.d-CT2LTicS.d.cts} +3 -3
  38. package/dist/{casesRepository-ZG9Sg0e4.d.ts → casesRepository.d-UsWOz9bv.d.ts} +3 -3
  39. package/dist/chat/index.cjs +132 -57
  40. package/dist/chat/index.d.cts +18 -16
  41. package/dist/chat/index.d.ts +18 -16
  42. package/dist/chat/index.js +133 -58
  43. package/dist/client/index.cjs +15 -10
  44. package/dist/client/index.d.cts +19 -18
  45. package/dist/client/index.d.ts +19 -18
  46. package/dist/client/index.js +15 -10
  47. package/dist/{config-B0p6Lygh.d.cts → config.d-BR3DT9ho.d.cts} +3 -3
  48. package/dist/{config-DmFAZJOx.d.ts → config.d-Dy6igYlH.d.ts} +3 -3
  49. package/dist/consent/index.cjs +5 -1
  50. package/dist/consent/index.d.cts +10 -10
  51. package/dist/consent/index.d.ts +10 -10
  52. package/dist/consent/index.js +5 -1
  53. package/dist/{context-BNreNLtL.d.ts → context.d-Cwks0p3C.d.cts} +15 -15
  54. package/dist/{context-BgS2a57J.d.cts → context.d-QcCgguzA.d.ts} +15 -15
  55. package/dist/{copy-DLJriGQS.d.ts → copy.d-CiMn2IIt.d.ts} +6 -6
  56. package/dist/{copy-lWp-Lkv5.d.cts → copy.d-DLJTyRfT.d.cts} +6 -6
  57. package/dist/core/index.cjs +17 -13
  58. package/dist/core/index.d.cts +33 -29
  59. package/dist/core/index.d.ts +33 -29
  60. package/dist/core/index.js +17 -13
  61. package/dist/{depth-BYb3RXoA.d.cts → depth.d-CjPGVPDL.d.cts} +9 -115
  62. package/dist/{depth-COz-sSG5.d.ts → depth.d-OSALbYM7.d.ts} +9 -115
  63. package/dist/{entitlementRepository-D-Lse67w.d.cts → entitlementRepository.d-CVQa1DA1.d.cts} +10 -5
  64. package/dist/{entitlementRepository-CrTOP_-o.d.ts → entitlementRepository.d-Cf3LbTwD.d.ts} +10 -5
  65. package/dist/features.d-fNsGcg0R.d.cts +108 -0
  66. package/dist/features.d-fNsGcg0R.d.ts +108 -0
  67. package/dist/focus.d-DMg2ngHI.d.ts +1178 -0
  68. package/dist/focus.d-az9cqUz3.d.cts +1178 -0
  69. package/dist/health-plan/index.cjs +370 -0
  70. package/dist/health-plan/index.d.cts +251 -0
  71. package/dist/health-plan/index.d.ts +251 -0
  72. package/dist/health-plan/index.js +370 -0
  73. package/dist/idempotency.d-D461_DPD.d.cts +910 -0
  74. package/dist/idempotency.d-WpXx9zQo.d.ts +910 -0
  75. package/dist/{identity-Cw07BKZp.d.ts → identity.d-60LeJt_s.d.cts} +3 -3
  76. package/dist/{identity-DFVGYn1o.d.cts → identity.d-DzTijonw.d.ts} +3 -3
  77. package/dist/index.cjs +141 -66
  78. package/dist/index.d.cts +31 -29
  79. package/dist/index.d.ts +31 -29
  80. package/dist/index.js +142 -67
  81. package/dist/{models-A4A5S7AG.d.cts → models.d-BagXhafD.d.ts} +8 -3
  82. package/dist/{models-CnXY5LuO.d.ts → models.d-BnLm3VAA.d.cts} +8 -3
  83. package/dist/notifications/index.cjs +5 -1
  84. package/dist/notifications/index.d.cts +9 -9
  85. package/dist/notifications/index.d.ts +9 -9
  86. package/dist/notifications/index.js +5 -1
  87. package/dist/optInView.d-CEyHR6PK.d.cts +325 -0
  88. package/dist/optInView.d-acKpV8V2.d.ts +325 -0
  89. package/dist/parse.d-C8CXyS58.d.ts +210 -0
  90. package/dist/parse.d-tEzufgJX.d.cts +210 -0
  91. package/dist/{pets-BYALZTSu.d.ts → pets.d-C_53_fzo.d.ts} +3 -3
  92. package/dist/{pets-CcyPQS-H.d.cts → pets.d-NbJvP_kh.d.cts} +3 -3
  93. package/dist/{petsRepository-B_Q1gFkE.d.cts → petsRepository.d-BuGHymNx.d.ts} +4 -4
  94. package/dist/{petsRepository-518QkPxH.d.ts → petsRepository.d-lp1BHRqM.d.cts} +4 -4
  95. package/dist/photo/index.cjs +6 -2
  96. package/dist/photo/index.d.cts +9 -9
  97. package/dist/photo/index.d.ts +9 -9
  98. package/dist/photo/index.js +6 -2
  99. package/dist/{ports-BN6RHF9W.d.ts → ports.d-BX4f4UsB.d.cts} +14 -1
  100. package/dist/{ports-BN6RHF9W.d.cts → ports.d-BX4f4UsB.d.ts} +14 -1
  101. package/dist/{ports-RuNJmBA-.d.cts → ports.d-CEROoqnA.d.cts} +16 -10
  102. package/dist/{ports-DmQeMArX.d.ts → ports.d-COIyN624.d.ts} +16 -10
  103. package/dist/presentation.d-DMbdad7G.d.cts +90 -0
  104. package/dist/presentation.d-DMbdad7G.d.ts +90 -0
  105. package/dist/records/depth/index.cjs +11 -7
  106. package/dist/records/depth/index.d.cts +14 -12
  107. package/dist/records/depth/index.d.ts +14 -12
  108. package/dist/records/depth/index.js +11 -7
  109. package/dist/records/index.cjs +225 -62
  110. package/dist/records/index.d.cts +159 -20
  111. package/dist/records/index.d.ts +159 -20
  112. package/dist/records/index.js +225 -62
  113. package/dist/recordsAsk.d-C5CGSi3j.d.cts +14 -0
  114. package/dist/recordsAsk.d-C5CGSi3j.d.ts +14 -0
  115. package/dist/{requestFunnel-B9fdXMi5.d.ts → requestFunnel.d-CXUMPw1K.d.ts} +5 -5
  116. package/dist/{requestFunnel-BBjNNwc9.d.cts → requestFunnel.d-DWQQpjFR.d.cts} +5 -5
  117. package/dist/{resolve-D4Ywz5OS.d.ts → resolve.d-jI8FmBj3.d.cts} +3 -3
  118. package/dist/{resolve-D4Ywz5OS.d.cts → resolve.d-jI8FmBj3.d.ts} +3 -3
  119. package/dist/{runtimeTypes-CstDBX8w.d.cts → runtimeTypes.d-4yFNNuYR.d.ts} +20 -13
  120. package/dist/{runtimeTypes-N_K4BVZB.d.ts → runtimeTypes.d-D6N_fhxx.d.cts} +20 -13
  121. package/dist/server/events/index.cjs +7 -3
  122. package/dist/server/events/index.d.cts +51 -9
  123. package/dist/server/events/index.d.ts +51 -9
  124. package/dist/server/events/index.js +7 -3
  125. package/dist/server/index.cjs +12 -6
  126. package/dist/server/index.d.cts +152 -8
  127. package/dist/server/index.d.ts +152 -8
  128. package/dist/server/index.js +12 -6
  129. package/dist/sheetCopy.d-CAhLOxjc.d.cts +4 -0
  130. package/dist/sheetCopy.d-CAhLOxjc.d.ts +4 -0
  131. package/dist/sheetSeam.d-Cviqk89n.d.ts +45 -0
  132. package/dist/sheetSeam.d-DCS3LW8g.d.cts +45 -0
  133. package/dist/shop/index.cjs +262 -0
  134. package/dist/shop/index.d.cts +193 -0
  135. package/dist/shop/index.d.ts +193 -0
  136. package/dist/shop/index.js +262 -0
  137. package/dist/televet/booking/index.cjs +16 -12
  138. package/dist/televet/booking/index.d.cts +36 -22
  139. package/dist/televet/booking/index.d.ts +36 -22
  140. package/dist/televet/booking/index.js +16 -12
  141. package/dist/televet/call/index.d.cts +5 -5
  142. package/dist/televet/call/index.d.ts +5 -5
  143. package/dist/televet/index.cjs +7 -3
  144. package/dist/televet/index.d.cts +12 -12
  145. package/dist/televet/index.d.ts +12 -12
  146. package/dist/televet/index.js +7 -3
  147. package/dist/{televetGlobal-C5dTUACe.d.cts → televetGlobal.d-CC-DrqkQ.d.ts} +7 -2
  148. package/dist/{televetGlobal-CnjrfhT4.d.ts → televetGlobal.d-CKwDCbmN.d.cts} +7 -2
  149. package/dist/testing/index.cjs +7 -3
  150. package/dist/testing/index.d.cts +3 -3
  151. package/dist/testing/index.d.ts +3 -3
  152. package/dist/testing/index.js +7 -3
  153. package/dist/testing/rn/index.cjs +5 -1
  154. package/dist/testing/rn/index.d.cts +23 -22
  155. package/dist/testing/rn/index.d.ts +23 -22
  156. package/dist/testing/rn/index.js +5 -1
  157. package/dist/testing/web/index.cjs +5 -1
  158. package/dist/testing/web/index.d.cts +23 -22
  159. package/dist/testing/web/index.d.ts +23 -22
  160. package/dist/testing/web/index.js +5 -1
  161. package/dist/texting/index.cjs +158 -0
  162. package/dist/texting/index.d.cts +36 -0
  163. package/dist/texting/index.d.ts +36 -0
  164. package/dist/texting/index.js +158 -0
  165. package/dist/threadOptions.d-B1pTMmDF.d.cts +260 -0
  166. package/dist/threadOptions.d-B1pTMmDF.d.ts +260 -0
  167. package/dist/{timelineRows-7yjHyh8i.d.ts → timelineRows.d-BNxgzYRW.d.cts} +1 -1
  168. package/dist/{timelineRows-WvnL-Lds.d.cts → timelineRows.d-CU5GvvLk.d.ts} +1 -1
  169. package/dist/{tokens-DLj8OnLH.d.cts → tokens.d-DarDaV39.d.cts} +10 -2
  170. package/dist/{tokens-DLj8OnLH.d.ts → tokens.d-DarDaV39.d.ts} +10 -2
  171. package/dist/{typeStyle-BxVyF71R.d.ts → typeStyle.d-Bl8pzbBy.d.cts} +2 -2
  172. package/dist/{typeStyle-DJedEu14.d.cts → typeStyle.d-C1HBRAI3.d.ts} +2 -2
  173. package/dist/{uploadTransport-BM_pnEWj.d.cts → uploadTransport.d-CWL7CdWP.d.cts} +1 -1
  174. package/dist/{uploadTransport-C6kGP1Kd.d.ts → uploadTransport.d-EGoUl7gX.d.ts} +1 -1
  175. package/dist/usePresentation.d-D6qsFzBz.d.cts +9 -0
  176. package/dist/usePresentation.d-DuGQe_Do.d.ts +9 -0
  177. package/dist/useRecords.d-Cb-36SF5.d.cts +121 -0
  178. package/dist/useRecords.d-aQTzQZoV.d.ts +121 -0
  179. package/dist/{useRecordsDepth-Bp6L4M5P.d.ts → useRecordsDepth.d-DFcCfiXm.d.ts} +8 -20
  180. package/dist/{useRecordsDepth-DPdAK_81.d.cts → useRecordsDepth.d-sAq2Qkhr.d.cts} +8 -20
  181. package/dist/{useVetVisit-DmWa7lt1.d.ts → useVetVisit.d-BtdwhmgD.d.cts} +15 -4
  182. package/dist/{useVetVisit-PtBjNwZr.d.cts → useVetVisit.d-DoYQimyt.d.ts} +15 -4
  183. package/dist/video/index.cjs +6 -2
  184. package/dist/video/index.d.cts +7 -7
  185. package/dist/video/index.d.ts +7 -7
  186. package/dist/video/index.js +6 -2
  187. package/dist/{view-C6go2uUt.d.ts → view.d-C-SNpDJX.d.ts} +10 -122
  188. package/dist/{view-CiF_HVFQ.d.cts → view.d-Dps5C8-s.d.cts} +10 -122
  189. package/dist/web/consent/index.cjs +5 -1
  190. package/dist/web/consent/index.d.cts +10 -10
  191. package/dist/web/consent/index.d.ts +10 -10
  192. package/dist/web/consent/index.js +5 -1
  193. package/dist/web/health-plan/index.cjs +414 -0
  194. package/dist/web/health-plan/index.d.cts +335 -0
  195. package/dist/web/health-plan/index.d.ts +335 -0
  196. package/dist/web/health-plan/index.js +414 -0
  197. package/dist/web/index.cjs +150 -82
  198. package/dist/web/index.d.cts +152 -38
  199. package/dist/web/index.d.ts +152 -38
  200. package/dist/web/index.js +150 -82
  201. package/dist/web/notifications/index.cjs +16 -3
  202. package/dist/web/notifications/index.d.cts +39 -209
  203. package/dist/web/notifications/index.d.ts +39 -209
  204. package/dist/web/notifications/index.js +16 -3
  205. package/dist/web/records/depth/index.cjs +11 -7
  206. package/dist/web/records/depth/index.d.cts +14 -12
  207. package/dist/web/records/depth/index.d.ts +14 -12
  208. package/dist/web/records/depth/index.js +11 -7
  209. package/dist/web/records/index.cjs +95 -68
  210. package/dist/web/records/index.d.cts +66 -21
  211. package/dist/web/records/index.d.ts +66 -21
  212. package/dist/web/records/index.js +95 -68
  213. package/dist/web/records/upload/index.d.cts +2 -2
  214. package/dist/web/records/upload/index.d.ts +2 -2
  215. package/dist/web/records-sheet/index.cjs +278 -0
  216. package/dist/web/records-sheet/index.d.cts +102 -0
  217. package/dist/web/records-sheet/index.d.ts +102 -0
  218. package/dist/web/records-sheet/index.js +278 -0
  219. package/dist/web/shop/index.cjs +301 -0
  220. package/dist/web/shop/index.d.cts +42 -0
  221. package/dist/web/shop/index.d.ts +42 -0
  222. package/dist/web/shop/index.js +301 -0
  223. package/dist/web/televet/booking/index.cjs +16 -12
  224. package/dist/web/televet/booking/index.d.cts +37 -23
  225. package/dist/web/televet/booking/index.d.ts +37 -23
  226. package/dist/web/televet/booking/index.js +16 -12
  227. package/dist/web/televet/call/index.d.cts +4 -4
  228. package/dist/web/televet/call/index.d.ts +4 -4
  229. package/dist/web/televet/index.cjs +7 -3
  230. package/dist/web/televet/index.d.cts +12 -12
  231. package/dist/web/televet/index.d.ts +12 -12
  232. package/dist/web/televet/index.js +7 -3
  233. package/dist/web/texting/index.cjs +157 -0
  234. package/dist/web/texting/index.d.cts +36 -0
  235. package/dist/web/texting/index.d.ts +36 -0
  236. package/dist/web/texting/index.js +157 -0
  237. package/health-plan/package.json +8 -0
  238. package/package.json +106 -4
  239. package/shop/package.json +8 -0
  240. package/texting/package.json +8 -0
  241. package/web/health-plan/native-blocked.cjs +12 -0
  242. package/web/health-plan/package.json +8 -0
  243. package/web/records-sheet/native-blocked.cjs +12 -0
  244. package/web/records-sheet/package.json +8 -0
  245. package/web/shop/native-blocked.cjs +12 -0
  246. package/web/shop/package.json +8 -0
  247. package/web/texting/native-blocked.cjs +12 -0
  248. package/web/texting/package.json +8 -0
  249. /package/dist/{CameraPort-Cv31Pz7g.d.cts → CameraPort.d-Cv31Pz7g.d.cts} +0 -0
  250. /package/dist/{CameraPort-Cv31Pz7g.d.ts → CameraPort.d-Cv31Pz7g.d.ts} +0 -0
  251. /package/dist/{TelemetryPort-BDNr00hu.d.cts → TelemetryPort.d-BDNr00hu.d.cts} +0 -0
  252. /package/dist/{TelemetryPort-BDNr00hu.d.ts → TelemetryPort.d-BDNr00hu.d.ts} +0 -0
  253. /package/dist/{cacheEpoch-DknKn3S0.d.cts → cacheEpoch.d-DknKn3S0.d.cts} +0 -0
  254. /package/dist/{cacheEpoch-DknKn3S0.d.ts → cacheEpoch.d-DknKn3S0.d.ts} +0 -0
  255. /package/dist/{callCopy-Bw6oZT54.d.cts → callCopy.d-Bw6oZT54.d.cts} +0 -0
  256. /package/dist/{callCopy-Bw6oZT54.d.ts → callCopy.d-Bw6oZT54.d.ts} +0 -0
  257. /package/dist/{ids-B2GAAifq.d.cts → ids.d-B2GAAifq.d.cts} +0 -0
  258. /package/dist/{ids-B2GAAifq.d.ts → ids.d-B2GAAifq.d.ts} +0 -0
  259. /package/dist/{optionalModule-DbJmsq5f.d.cts → optionalModule.d-DbJmsq5f.d.cts} +0 -0
  260. /package/dist/{optionalModule-DbJmsq5f.d.ts → optionalModule.d-DbJmsq5f.d.ts} +0 -0
  261. /package/dist/{profile-CSs1wlXT.d.cts → profile.d-CSs1wlXT.d.cts} +0 -0
  262. /package/dist/{profile-CSs1wlXT.d.ts → profile.d-CSs1wlXT.d.ts} +0 -0
  263. /package/dist/{projection-CeIUsbSk.d.cts → projection.d-CeIUsbSk.d.cts} +0 -0
  264. /package/dist/{projection-CeIUsbSk.d.ts → projection.d-CeIUsbSk.d.ts} +0 -0
  265. /package/dist/{species-BXAIMh7I.d.cts → species.d-BXAIMh7I.d.cts} +0 -0
  266. /package/dist/{species-BXAIMh7I.d.ts → species.d-BXAIMh7I.d.ts} +0 -0
  267. /package/dist/{visitIntent-D7_yVp1I.d.cts → visitIntent.d-D7_yVp1I.d.cts} +0 -0
  268. /package/dist/{visitIntent-D7_yVp1I.d.ts → visitIntent.d-D7_yVp1I.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,180 @@ changes that has not been earned by any production integration yet.
10
10
 
11
11
  ## [Unreleased]
12
12
 
13
+ ## [0.13.0] - 2026-10-21
14
+
15
+ ### BREAKING
16
+
17
+ Measured against 0.12.1 and `origin/main` with the api-extractor reports: no export was removed or renamed. These
18
+ are the changes a 0.12 integration can notice, with one migration line each.
19
+
20
+ - **The v3 look is the default (presentation).** A partner that set nothing now gets the chat cards, the history
21
+ sheet, the focus card, the Health Plan focus layout and the records sheet. Migration: set the older value per field
22
+ (`chatAnswerStyle: 'bubbles'`, `chatHistoryStyle: 'drawer'`, `chatTopCard: 'none'`,
23
+ `healthPlanLayout: 'standard'`, `recordsTopRiskLine: false`) in the console or in `presentation`.
24
+ - **`EverfurRecordsPage` draws the records sheet by default (web).** Migration: pass `sheet={false}` to keep the
25
+ classic page; pass `sheet={recordsSheet(options)}` from `@everfur/sdk/web/records-sheet` to configure it.
26
+ - **Records sheet types live on `@everfur/sdk/web/records-sheet`.** `EverfurRecordsSheetOptions`,
27
+ `EverfurRecordsLabDetail` and the sheet's style exports (prerelease builds only; never in a published version).
28
+ Migration: import them from `@everfur/sdk/web/records-sheet`, and pass the built sheet, not the options, to `sheet`.
29
+ - **`HealthPlanFocusIcon` has more names** (`box`, `cart`, `minus`, `plus`, `chev`, `pulse`, `file`, `kit`, `dna`,
30
+ `heart` and others). Migration: a `renderIcon` that switches over every name needs a `default` branch that
31
+ returns an icon of yours (null draws none).
32
+ - **`HealthPlanFocusOverlay` has more screens** (`cart`, `cartCheckout`, `placed`, `orders`, `order`, `weight`).
33
+ Migration: an `onOverlayChange` that switches over every value needs a `default` branch (use `controls.title` and
34
+ `controls.back` for the header).
35
+ - **`HealthPlanFocusPart` has more parts.** Migration: a `Record<HealthPlanFocusPart, string>` of your own becomes
36
+ `Partial<Record<HealthPlanFocusPart, string>>` (as `HealthPlanFocusClassNames` already is).
37
+ - **The shop is on with Everfur checkout.** With `checkout: "everfur_stripe"` Buy becomes Add to cart. Migration:
38
+ `focus.shop: false` keeps Buy and Subscribe going straight to Stripe Checkout. On React Native the shop and the
39
+ Stripe trip also need a valid https `focus.checkoutReturnUrl`; without one Buy keeps your `onBuy` / `onCheckout`.
40
+ - **`HEALTH_PLAN_COPY.emptyTitle` / `emptyBody` are empty strings** (were `[copy needed: ...]` markers), with a new
41
+ `emptyAsk`. Migration: pass your own words through `emptyCopy`, or hide your tab on `onAvailability(false)`.
42
+
43
+ ### Changed
44
+
45
+ - **Everfur's v3 design is the default look for every partner (presentation defaults).** With nothing set, the chat
46
+ draws answers as cards, past chats in a bottom sheet, the compact composer with the pet's name in the placeholder,
47
+ the past-chats bar scrolling with the thread and the focus card over an empty chat; the Health Plan uses the focus
48
+ layout; Records shows the top risk line and the clear-results filter. Nothing extra draws without its data (no
49
+ focus, no card; no pet name, the generic placeholder). Set the older value per field to keep the older look
50
+ (`bubbles`, `drawer`, `none`, `standard`, `generic`, `pinned`, `false`).
51
+ - **Focus card look (web).** The chat's top card draws Raph's v3 card inline (CSP safe) with the partner's primary,
52
+ link ink and brand wash (`v3Palette`), and Everfur's neutrals and risk colours; on a dark theme the theme's own
53
+ neutrals. A host class on a part still replaces that part's style. `healthPlanTopCard` keeps the close control when
54
+ the pet has neither a sex nor a name (named "Close"), and reads the sex in any case.
55
+ - **Daily message cap.** A 429 `ThrottlingException` that carries `daily_limit` (the backend's daily cap) is now
56
+ `quotaExceeded` (not retried, "You have used today's messages") instead of `rateLimited`.
57
+ - **Starter chips for other species.** A pet that is neither a dog nor a cat no longer gets a chip that calls it a dog;
58
+ the chips without a species word stay.
59
+ - **The v3 records sheet is `EverfurRecordsPage`'s default look (web).** Without a `sheet` prop the page loads
60
+ `@everfur/sdk/web/records-sheet` on first mount (its loading state meanwhile, the classic page if the entry
61
+ cannot load); `sheet={false}` keeps the classic page. The records frame bundles the sheet. The sheet paints in
62
+ the partner's `primary` and `accent` (new option `palette`, `'raph'` keeps Raph's colours), takes the pronoun
63
+ from the pet's sex, says "your pet" for a pet with no name, shows a species-aware sample, the medications taken
64
+ now, the Health Plan top risk line (`topRiskLine`, `onOpenPlan`), lines for missing labs, visits and a single
65
+ weight, and a failed request's status. New page props `weightUnit` (`'lb'` default, `'kg'`) and `onOpenPlan`.
66
+ - The vendored platform contract and error registry are regenerated from EFBackend main (contract-public digest
67
+ 242b9d30).
68
+ - Bundle budgets: `dist-cdn/frame.js` 178,400 and `dist-cdn/records-frame.js` 208,100 bytes; `@everfur/sdk/shop`
69
+ 54,600 bytes gzip.
70
+
71
+ ### Added
72
+
73
+ - **The Care shop over the Everfur OMS (`@everfur/sdk/web/shop` and `@everfur/sdk/shop`), two new subpaths.**
74
+ `EverfurShop` renders the package, shop, product, Rx product, plan, orders and tracking screens, plus minimal
75
+ address, card, buy and consent steps whose copy is still placeholder keys (`SHOP_COPY_PLACEHOLDERS`). The shop stays
76
+ hidden until shop-config answers 200; a 404 or a signed-out host renders nothing and calls `onUnavailable`. Also
77
+ exported: `createOmsClient` (consumer auth via `getToken` per request, idempotency keys kept across
78
+ network/timeout/5xx retries), `newIdempotencyKey`, `isOmsRefusal`, `isOmsRetryable`, `isOmsUnavailable`,
79
+ `createOmsPackageSource`, `UNAVAILABLE_PACKAGE_SOURCE`, `SHOP_COPY` and `shopCopy`. The web entry adds
80
+ `createStripeJsPayments` and the `EverfurShopProps.cardHandoff` (`ShopCardHandoff | null`) and
81
+ `EverfurShopProps.cardReturn` (`ShopCardReturn | null`, `{ step: 'card' | 'cardAction', outcome: 'done' |
82
+ 'closed' | 'failed' }`) props, so the card setup and 3-D Secure steps can leave the page and come back. The React
83
+ Native entry adds `shopBackRoute`, `ShopSwitchCard`, `createInAppBrowserCardSetup`, `createInAppBrowserPayments`
84
+ and `createInAppBrowserCard` (EFBackend's hosted card pages in the host's in-app browser, https only, no secret in
85
+ the URL, no native dependency) through the new `payments` prop. Closing the browser settles as `{ ok: false,
86
+ closed: true }` (`payerActionClosed`), not a failure. A confirm or approval that returns an order goes to that
87
+ order's page, where Pay resumes the same order; it never drafts a second checkout.
88
+ - **Texting opt-in (`@everfur/sdk/texting`, `@everfur/sdk/web/texting`), new subpaths.** `EverfurTextingOptIn`,
89
+ `TextingController`, the phone helpers (`isE164`, `toTextingE164`, `parseTextingProfile`, `formatTextingPhone`)
90
+ and `copy` / `brandCopy` overrides over `TEXTING_COPY` and `TEXTING_BRAND_COPY`.
91
+ - **Health Plan (`@everfur/sdk/health-plan`, `@everfur/sdk/web/health-plan`), new subpaths.** `EverfurHealthPlan`,
92
+ `HealthPlanItemCard`, `HealthPlanCartBar`, `HealthPlanController`, the cart dock (`HealthPlanCartScope`,
93
+ `useHealthPlanCartDock`) and the `cartBar`, `planCard` and `planReasonLabel` slots, with slot keys matched to the
94
+ backend paint keys. Generic styling hooks; defaults unchanged.
95
+ - **Server helpers on `@everfur/sdk/server`:** `sendMemberText`, `replaceCatalog` (opt-in `confirmEmpty` and
96
+ `confirmShrink`) and `mergeCatalog`. The catalog replace's `catalog_empty_refused` and `catalog_shrink_refused` 409s fold to
97
+ `validationFailed`.
98
+ - Chat starter prompts, header and empty header slots; records page upcoming care and history tiles;
99
+ `useUpcomingTelevetVisit`. The `linked_account_read_only` 409 folds to `conflict`.
100
+ - `EverfurChat` `initialAskKey` lets an initial ask repeat and survive a chat that is not ready yet. The televet frame
101
+ protocol carries optional `petName` and `ownerName`.
102
+ - **Records sheet on its own entry (`@everfur/sdk/web/records-sheet`).** `recordsSheet(options)` builds the v3
103
+ records sheet and its lab result screen for `EverfurRecordsPage`'s `sheet` prop. The sheet code left
104
+ `@everfur/sdk/web/records`, so a records page without the sheet downloads none of it. The `sheet` prop now takes
105
+ the built sheet (`EverfurRecordsSheet`) instead of the options; `EverfurRecordsSheetOptions`,
106
+ `EverfurRecordsLabDetail` and the sheet's style exports moved to the new entry.
107
+ - **Health Plan cart, quantities and order tracking (`@everfur/sdk/web/health-plan`).** With Everfur checkout the
108
+ shop's cart checks several products and boxes out in one session (`startCartCheckout`, items[] with quantity),
109
+ falls back to one product per checkout on `409 cart_disabled` (`healthPlanCheckoutRefusal`), and keeps a
110
+ subscription for its own checkout. The return lists every order (`HealthPlanCheckoutState.orders`, each with
111
+ `quantity` and `total`). Orders draw the partner's tracking (`HealthPlanOneBoxOrder.tracking`) and page through
112
+ `listOneBoxOrderPage`. New copy keys `cartSubscriptionApart`, `placedArrives`, `moreOrders`, `trackLink`.
113
+ - **Chat send button (`chat_send_button` presentation field, web).** `always_dark` (the default) draws Send dark
114
+ even while the box is empty; `dim_when_empty` keeps the earlier dim look.
115
+ - **Health Plan focus layout shows the whole plan (`@everfur/sdk/web/health-plan`).** After the pick, the pet's other
116
+ plan items follow in plan order as product cards, each with its own Buy one box: the partner's handoff (`onBuy`, else
117
+ `onCheckout([item])`), or a one-box Stripe Checkout for that item when the plan page says
118
+ `checkout: "everfur_stripe"`; each press sends `health_plan.checkout_started`. New `HealthPlanFocusProps.others`
119
+ and the `others` and `other` parts in `HealthPlanFocusClassNames`; the cards reuse the pick's parts. A host
120
+ `design` with a pick shows the others too.
121
+ - **Health Plan page and Everfur checkout (`@everfur/sdk/web/health-plan`), opt-in.** `EverfurHealthPlan` with
122
+ `focus` options and no `design` reads the pet's plan page (`GET .../plan/page`) and draws the focus layout from it;
123
+ `focus`, `routine` and `signs` are now optional in `HealthPlanFocusDesign`. When the page says
124
+ `checkout: "everfur_stripe"`, Buy one box and Subscribe redirect to Stripe Checkout and the return polls the
125
+ checkout into the started screen. New `focus.copy`, `focus.navigate`, `focus.pageRepository`,
126
+ `useHealthPlanPage`, `createHealthPlanPageRepository` and the page wire mappers (also on
127
+ `@everfur/sdk/health-plan`). A host `design` and `checkout: "partner"` behave as before.
128
+ - **Health Plan subscriptions on the web (`@everfur/sdk/web/health-plan`), all opt-in.** `EverfurHealthPlan`
129
+ takes a `focus` design (one recommended product, the host's words) and, with `subscriptions`, reads the quote:
130
+ every 60, 90 or 120 days, first box vs regular price, buy one box, a confirm sheet with the renewal terms, and
131
+ manage (change interval, skip, cancel, restart). A 404 quote hides all of it and keeps the one-time checkout
132
+ handoff. Writes carry an Idempotency-Key per tap. Follows EFBackend PR #2131 (switch
133
+ `partner.shop_subscriptions_enabled`, off by default).
134
+ - **Layout settings from the console (`render_hints.branding.presentation`), all opt-in.** Eleven fields (answer
135
+ style, history style, top card, follow-up count and televet exclusion, composer mic and upload, disclaimer
136
+ placement, Health Plan layout, two records options) resolved per field: an explicit prop wins, a field locked as
137
+ `presentation` or `presentation.<field>` stays with the console. Absent means today's behavior. New
138
+ `EverfurChat` props `presentation`, `answerCards` (answer cards with sources and feedback), `topCard` and
139
+ `historySheet` (a bottom sheet with previews), `EverfurHealthPlan` `presentation`, and
140
+ `useEverfurPresentation`. The `focus` design now draws only while `health_plan_layout` is `focus_plan`.
141
+ - Layout settings, round 2 (EFBackend #2132): `chatComposerStyle` (`compact`), `chatComposerPlaceholder`
142
+ (`pet_name`), `chatHistoryBar` (`scroll`) and `chatGeneralBanner` (`false` hides only the general banner), same
143
+ precedence and defaults (no change unless set). An answer card can carry `render` (the host card slot).
144
+ - `ChatConversation.preview` (the conversation list's last answer, up to 140 characters) when the server sends it.
145
+ - `HealthPlanTopRisk` and `NotificationStack` (web) for a host's own risk card and push list.
146
+ - `EverfurChat` `renderEmptyHeader`, `emptyState` (title and part classNames for the empty start), `followUpPolicy`, `historyBar` and `initialAskCard`.
147
+ - Server events: `health_plan.box_due` and `health_plan.one_box_ordered`, webhook only, with typed payloads.
148
+ - **Health Plan funnel events on your `telemetry` port.** `health_plan.opened`, `health_plan.product_clicked` and
149
+ `health_plan.checkout_started`, with pet and product ids, counts and the cart total only. Nothing is sent without
150
+ a `telemetry` sink. Documented in chapter 18.
151
+
152
+ ### Fixed
153
+
154
+ - A `409 records_consent_required` on the request documents read no longer shows the generic conflict line with a
155
+ retry; the list renders nothing, as when empty.
156
+ - The Health Plan kicker and price line no longer read "Ships every 0 days" without a subscription quote; they use the
157
+ existing ships-once copy.
158
+ - The Health Plan focus layout's buy button sends `health_plan.checkout_started`.
159
+ - Partner tabs audit fixes: cards-mode chat answers keep line breaks and lists; the web thread refreshes on return
160
+ under the default browser lifecycle; the history bar count waits for the full list; the televet follow-up filter
161
+ matches only visit phrases; the records consent grant has a busy state and shows errors; documents sort newest
162
+ first; the marker carousel puts the featured marker first; the texting resend keeps the code step; the Health Plan
163
+ revalidates quietly on return.
164
+ - **A Health Plan partner with no plan page keeps its plan.** In the focus layout, a plan with products whose plan
165
+ page is missing (404), null or refused draws the standard product list with its cart and the host's `onCheckout`
166
+ (web and React Native), and says available. Only a plan with no products is no plan.
167
+ - **One plan page read per pet.** The chat's focus card, the records sheet and the Health Plan share one in-flight
168
+ `GET .../plan/page` and its answer for 5 seconds; a retry or a re-read after a write is fresh. The chat (web and
169
+ React Native) and the React Native records sheet read it only with the `healthPlan` capability.
170
+ - **React Native Everfur checkout without a return URL.** Buy keeps the partner's handoff instead of drawing nothing.
171
+ - **v3 colours on any partner palette.** The link ink, the badge ink and the labels on primary and accent read at
172
+ 4.5:1 on Raph's card, paper and tile for every partner palette; Everfur's own values are unchanged.
173
+ - **Consent required is no longer a dead end on `EverfurRecordsPage` and `EverfurRecordsDashboard`.** The grant
174
+ gates reading record content only, so with the read answering consent required the page keeps its header
175
+ (`Request records`, the upload action) and its requests section with the upload prompt, and the dashboard keeps
176
+ the first-record prompt or the in-progress card with their ways to add records. `Allow` with the consent text is
177
+ drawn under them only when a `consentVersion` was passed. Before, both drew only "Consent required".
178
+
179
+ ## [0.12.1] - 2026-10-08
180
+
181
+ ### Changed
182
+
183
+ - **The hosted frame calls `https://api-edge.everfur.com` by default.** The same API behind CloudFront: responses,
184
+ auth, CORS and error codes are unchanged, and the frame's `connect-src` follows the base. Pages that load the frame
185
+ from `sdk.everfur.com/v1/` need no change.
186
+
13
187
  ## [0.12.0] - 2026-10-08
14
188
 
15
189
  ### Added
package/README.md CHANGED
@@ -10,7 +10,7 @@ features without shipping an app update.
10
10
  a blank screen, and cannot be force-enabled client-side.
11
11
  - The app never holds a secret. See [The security model](#the-security-model).
12
12
 
13
- > `0.12.0`, MIT licensed, public on npm. Requires React Native `>=0.74` (or React `>=18` with `react-dom`
13
+ > `0.13.0`, MIT licensed, public on npm. Requires React Native `>=0.74` (or React `>=18` with `react-dom`
14
14
  > for the web entry), and Node `>=18` on the backend that mints sessions.
15
15
 
16
16
  <!-- DRAFT COPY slot PD1-2 (owner): the README's invitation to get started (self-serve sandbox sign-up), in the owner's words. The factual paragraph below stands without it. -->
@@ -203,6 +203,7 @@ off-state, never a blank region.
203
203
  | `@everfur/sdk/animations` | server-driven pet-state media surface |
204
204
  | `@everfur/sdk/web` | the browser entry: `EverfurProvider`, `CapabilityGate`, `EverfurChat`, `useEverfurChat`, the theme hook, rendered with `react-dom`; withheld from React Native bundles the way `./server` is |
205
205
  | `@everfur/sdk/web/records` | records for a browser host: `EverfurRecordsPage` (the Everfur web app's records page, complete on its own: request from a clinic, upload, request status, the full record with vaccinations, all inside your page), the named screens, `EverfurRecords` (the React Native-shaped flow), `useEverfurRecords`, `createWebRecordsUploadTransport`, `fileToHandle`; its own entry, withheld from React Native like `./web`; available when Everfur enables records for the account. Frame mode serves it with `surface: 'records'` (see [chapter 13](https://sdk.everfur.com/v1/docs/index.html#web--2-frame-mode-the-loader-and-the-frame)) |
206
+ | `@everfur/sdk/web/records-sheet` | `recordsSheet()`: the v3 records sheet and its lab result screen, `EverfurRecordsPage`'s default look (loaded on first mount; `sheet={false}` keeps the classic page, which downloads none of it), or built with options and passed to its `sheet` prop; withheld from React Native like `./web`; see [chapter 13](https://sdk.everfur.com/v1/docs/index.html#web--records-everfur-sdk-web-records) |
206
207
  | `@everfur/sdk/web/records/upload` | `createWebRecordsUploadTransport` alone, for the `uploadTransport` on the provider config at your app root; the same function `@everfur/sdk/web/records` exports, without the records entry |
207
208
  | `@everfur/sdk/server` | **server-only** `mintPartnerSession`, `revokePartnerMemberSessions` (end one member's sessions now) and the partner pet helpers (no React Native resolution; never bundled on-device) |
208
209
  | `@everfur/sdk/server/events` | **server-only, Node only** partner events (preview): `constructEvent` to verify webhooks, `sendPartnerEvent`; see [chapter 15](https://sdk.everfur.com/v1/docs/index.html#sec-events) |
@@ -1,16 +1,142 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { StyleProp, ViewStyle } from 'react-native';
3
- import { P as PetRef, C as ConversationId } from './ids-B2GAAifq.cjs';
4
- import { F as FileHandle } from './ports-BN6RHF9W.cjs';
5
- import { a as ChatCheckinTarget } from './ports-RuNJmBA-.cjs';
6
- import { W as WidgetPet, P as PetProfileInput } from './petsRepository-B_Q1gFkE.cjs';
7
- import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-B6h4cJU-.cjs';
3
+ import { P as PetRef, C as ConversationId } from './ids.d-B2GAAifq.js';
4
+ import { i as EverfurPresentationInput } from './presentation.d-DMbdad7G.js';
5
+ import { a as ChatCheckinTarget } from './ports.d-COIyN624.js';
6
+ import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-BuGHymNx.js';
7
+ import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore, c as EverfurStarterPrompt } from './attachments.d-Djy9z_0Z.js';
8
+ import { L as LifecyclePort } from './LifecyclePort.d-Cr1p33a7.js';
9
+ import { F as FileHandle } from './ports.d-BX4f4UsB.js';
8
10
 
9
11
  /** Where a picked image comes from: the host's photo library, or its camera. */
10
12
  type AttachmentSource = 'photo' | 'camera';
11
13
 
12
- /** The host's own action for the two vet-care tiers, in place of Everfur's pill. */
13
- type RenderVetAction = (level: UrgencyDisplayLevel) => ReactNode;
14
+ /**
15
+ * The history bar: a "Chats" control with the member's thread count that opens the history, and a "New chat"
16
+ * control. For a surface that hides the SDK header and still wants the member's past chats.
17
+ */
18
+ interface EverfurChatHistoryBar {
19
+ /** The history control's words ("Chats"). */
20
+ readonly chats: string;
21
+ /** The new-chat control's words ("New chat"). */
22
+ readonly newChat: string;
23
+ /** Draw the two icons your way. */
24
+ readonly renderIcon?: (icon: 'history' | 'edit') => ReactNode;
25
+ /** Your own control after "Chats". Absent, nothing is drawn. */
26
+ readonly extra?: ReactNode;
27
+ }
28
+ /** The empty thread's own title and chip fills. Absent, the empty state is Everfur's own. */
29
+ interface EverfurChatEmptyState {
30
+ /** The title over the starter chips, in place of "What can we help {pet} with today?". */
31
+ readonly title?: string;
32
+ /**
33
+ * Fills for the chips that bring none of their own, taken in turn (the first chip the first fill, and round
34
+ * again). Each is a fill and its ink. Absent, Raph's v3 cycle on a light theme; empty, the theme's paint.
35
+ */
36
+ readonly chipTints?: readonly {
37
+ readonly tint: string;
38
+ readonly ink?: string;
39
+ }[];
40
+ }
41
+ /** One card under an answer in the cards answer style: a record, a stat, or a link to one of your screens. */
42
+ interface EverfurChatAnswerCard {
43
+ /** Stable key within the answer. */
44
+ readonly key: string;
45
+ readonly title: string;
46
+ /** The small line under the title. */
47
+ readonly meta?: string;
48
+ /** A status pill. */
49
+ readonly pill?: {
50
+ readonly label: string;
51
+ readonly tone?: string;
52
+ };
53
+ /** A stat card's value: drawn in place of the pill and the chevron. */
54
+ readonly value?: {
55
+ readonly amount: string;
56
+ readonly unit?: string;
57
+ };
58
+ /** The tile at the start: an icon of yours, or an https image. */
59
+ readonly tile?: {
60
+ readonly icon?: ReactNode;
61
+ readonly imageUrl?: string;
62
+ readonly tone?: string;
63
+ };
64
+ readonly variant?: string;
65
+ /** Given, the card is a button that calls this. Absent, a static card. */
66
+ readonly onPress?: () => void;
67
+ /** A card of your own, drawn in the card's place. If it throws, the slot draws nothing. */
68
+ readonly render?: () => ReactNode;
69
+ }
70
+ /** What `answerCards.cards` receives: the settled answer's text and the question it answered. */
71
+ interface EverfurChatAnswerContext {
72
+ readonly answer: string;
73
+ readonly question: string | null;
74
+ /** The answer's message id, stable for the life of the thread. */
75
+ readonly messageId: string;
76
+ }
77
+ /** The cards answer style's content (used while presentation `chatAnswerStyle` is `cards`). The words are yours. */
78
+ interface EverfurChatAnswerCards {
79
+ /** The line over each answer (an icon and your words). Absent, the assistant's name line. */
80
+ readonly byline?: {
81
+ readonly label: string;
82
+ readonly icon?: ReactNode;
83
+ };
84
+ /** Your cards under a settled answer. A throw draws none. */
85
+ readonly cards?: (context: EverfurChatAnswerContext) => readonly EverfurChatAnswerCard[];
86
+ /** Two feedback chips in place of the footer's thumbs, mapped to thumbs up and thumbs down. */
87
+ readonly feedback?: {
88
+ readonly helpful: string;
89
+ readonly notHelpful: string;
90
+ };
91
+ /** Your own rows at the top of the follow-ups, for the answer it receives. */
92
+ readonly followUpActions?: (context: EverfurChatAnswerContext) => readonly EverfurChatFollowUpAction[];
93
+ /** Draw the chevron your way. Absent, Everfur's glyph. */
94
+ readonly renderIcon?: (icon: 'chevron') => ReactNode;
95
+ }
96
+ /** A row of yours at the top of the follow-ups under an answer. */
97
+ interface EverfurChatFollowUpAction {
98
+ readonly key: string;
99
+ readonly label: string;
100
+ readonly icon?: ReactNode;
101
+ readonly onPress: () => void;
102
+ }
103
+ /**
104
+ * The card at the top of the empty thread (presentation `chatTopCard: "focus"`): one finding, in your words, with
105
+ * an action of yours and a question it can ask in the thread. Its close control folds it into a pill.
106
+ */
107
+ interface EverfurChatTopCard {
108
+ /** The small heading ("Her focus"). */
109
+ readonly kicker: string;
110
+ /** A source badge ("<your brand> results"). */
111
+ readonly badge?: string;
112
+ readonly title: string;
113
+ /** The finding: a bold lead and the rest of the sentence. */
114
+ readonly lead?: string;
115
+ readonly body?: string;
116
+ /** Your action ("See her Health Plan"). */
117
+ readonly action?: {
118
+ readonly label: string;
119
+ readonly onPress: () => void;
120
+ };
121
+ /** A question the card asks in this thread. */
122
+ readonly ask?: {
123
+ readonly label: string;
124
+ readonly prompt: string;
125
+ };
126
+ /** The close control's accessible name. Absent, the shared `Close`. */
127
+ readonly closeLabel?: string;
128
+ /** The pill's words while the card is closed (defaults to `kicker`). */
129
+ readonly pill?: string;
130
+ /** Draw the close glyph your way. */
131
+ readonly renderIcon?: (icon: 'close') => ReactNode;
132
+ }
133
+ /** The history bottom sheet (presentation `chatHistoryStyle: "sheet"`). */
134
+ interface EverfurChatHistorySheet {
135
+ /** The sheet's small title ("Chats with Ask <your brand>"). Absent, Everfur's history heading. */
136
+ readonly title?: string;
137
+ /** Draw the icons your way. */
138
+ readonly renderIcon?: (icon: 'close' | 'chat' | 'edit') => ReactNode;
139
+ }
14
140
 
15
141
  /**
16
142
  * The host's image picker for chat attachments. The SDK depends on no picker or camera module: open your own
@@ -30,6 +156,10 @@ interface EverfurChatAttachments {
30
156
  /** Images per message; default 1 (the app's composer), at most 5 (the server's cap). */
31
157
  readonly maxPerMessage?: number;
32
158
  }
159
+
160
+ /** The host's own action for the two vet-care tiers, in place of Everfur's pill. */
161
+ type RenderVetAction = (level: UrgencyDisplayLevel) => ReactNode;
162
+
33
163
  interface EverfurChatProps {
34
164
  readonly petRef?: PetRef;
35
165
  readonly conversationId?: ConversationId;
@@ -88,6 +218,12 @@ interface EverfurChatProps {
88
218
  * conversation. Pass `composerSeed` instead when the user should decide whether to send it.
89
219
  */
90
220
  readonly initialAsk?: string;
221
+ /**
222
+ * The identity of this `initialAsk`, when the same words can be asked again: your own id for each tap of an
223
+ * "Ask Everfur" pill or each push opened. A new key asks again even with the same words. Absent, the
224
+ * question's own words are the key, so the same question twice in a row is asked once.
225
+ */
226
+ readonly initialAskKey?: string | number;
91
227
  /**
92
228
  * Text to put in the composer on arrival. It is never sent for the user: they edit it, send it or clear
93
229
  * it. Only an empty composer is seeded, so nothing they typed is ever replaced.
@@ -149,6 +285,32 @@ interface EverfurChatProps {
149
285
  * mount is about 15 pt short. Pass the hook's value from every render, never a copy taken at mount.
150
286
  */
151
287
  readonly keyboardVerticalOffset?: number;
288
+ /**
289
+ * The layout settings (Raph v3): the answer style, the history style, the top card, the composer style and
290
+ * placeholder, the history bar's place, the general banner, the send button, the follow-up count and the upload
291
+ * control. Each also comes from your console (render_hints.branding.presentation); a field you set here wins
292
+ * unless the console locks it. `attachments` counts as your explicit `chatComposerUpload: true`. The microphone
293
+ * setting (`chatComposerMic`) has no control on this surface. `topCard`, `answerCards` and `historySheet` are
294
+ * content only and never switch a layout on by themselves.
295
+ */
296
+ readonly presentation?: EverfurPresentationInput;
297
+ /**
298
+ * The focus card's content (drawn while `chatTopCard` resolves to `focus`). Absent, the card is built from the
299
+ * pet's Health Plan page focus; no page, no focus, a refused read or a page still loading draws no card.
300
+ */
301
+ readonly topCard?: EverfurChatTopCard;
302
+ /** Opens the pet's Health Plan (your tab or screen): the plan-built focus card's `See her Health Plan` button. */
303
+ readonly onOpenHealthPlan?: () => void;
304
+ /** The cards answer style's content (used while `chatAnswerStyle` resolves to `cards`). */
305
+ readonly answerCards?: EverfurChatAnswerCards;
306
+ /** The history sheet's title and icons (used while `chatHistoryStyle` resolves to `sheet`). */
307
+ readonly historySheet?: EverfurChatHistorySheet;
308
+ /** The history bar ("Chats" and "New chat"); `chatHistoryBar: "scroll"` puts it at the top of the thread. */
309
+ readonly historyBar?: EverfurChatHistoryBar;
310
+ /** Your own starter chips, in place of the built-in four. */
311
+ readonly starterPrompts?: readonly EverfurStarterPrompt[];
312
+ /** The empty thread's title and chip fills. */
313
+ readonly emptyState?: EverfurChatEmptyState;
152
314
  }
153
315
  /**
154
316
  * Entitlement-gated, four-state chat surface. Entitlement-OFF renders the CapabilityGate OffState;
@@ -156,4 +318,4 @@ interface EverfurChatProps {
156
318
  */
157
319
  declare function EverfurChat(props: EverfurChatProps): ReactNode;
158
320
 
159
- export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAttachments as a, type EverfurChatProps as b };
321
+ export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAnswerCard as a, type EverfurChatAnswerCards as b, type EverfurChatAnswerContext as c, type EverfurChatAttachments as d, type EverfurChatEmptyState as e, type EverfurChatFollowUpAction as f, type EverfurChatHistoryBar as g, type EverfurChatHistorySheet as h, type EverfurChatProps as i, type EverfurChatTopCard as j };
@@ -1,16 +1,142 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { StyleProp, ViewStyle } from 'react-native';
3
- import { P as PetRef, C as ConversationId } from './ids-B2GAAifq.js';
4
- import { F as FileHandle } from './ports-BN6RHF9W.js';
5
- import { a as ChatCheckinTarget } from './ports-DmQeMArX.js';
6
- import { W as WidgetPet, P as PetProfileInput } from './petsRepository-518QkPxH.js';
7
- import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-CGxvnYu4.js';
3
+ import { P as PetRef, C as ConversationId } from './ids.d-B2GAAifq.cjs';
4
+ import { i as EverfurPresentationInput } from './presentation.d-DMbdad7G.cjs';
5
+ import { a as ChatCheckinTarget } from './ports.d-CEROoqnA.cjs';
6
+ import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-lp1BHRqM.cjs';
7
+ import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore, c as EverfurStarterPrompt } from './attachments.d-Bp2qbHxn.cjs';
8
+ import { L as LifecyclePort } from './LifecyclePort.d-Cr1p33a7.cjs';
9
+ import { F as FileHandle } from './ports.d-BX4f4UsB.cjs';
8
10
 
9
11
  /** Where a picked image comes from: the host's photo library, or its camera. */
10
12
  type AttachmentSource = 'photo' | 'camera';
11
13
 
12
- /** The host's own action for the two vet-care tiers, in place of Everfur's pill. */
13
- type RenderVetAction = (level: UrgencyDisplayLevel) => ReactNode;
14
+ /**
15
+ * The history bar: a "Chats" control with the member's thread count that opens the history, and a "New chat"
16
+ * control. For a surface that hides the SDK header and still wants the member's past chats.
17
+ */
18
+ interface EverfurChatHistoryBar {
19
+ /** The history control's words ("Chats"). */
20
+ readonly chats: string;
21
+ /** The new-chat control's words ("New chat"). */
22
+ readonly newChat: string;
23
+ /** Draw the two icons your way. */
24
+ readonly renderIcon?: (icon: 'history' | 'edit') => ReactNode;
25
+ /** Your own control after "Chats". Absent, nothing is drawn. */
26
+ readonly extra?: ReactNode;
27
+ }
28
+ /** The empty thread's own title and chip fills. Absent, the empty state is Everfur's own. */
29
+ interface EverfurChatEmptyState {
30
+ /** The title over the starter chips, in place of "What can we help {pet} with today?". */
31
+ readonly title?: string;
32
+ /**
33
+ * Fills for the chips that bring none of their own, taken in turn (the first chip the first fill, and round
34
+ * again). Each is a fill and its ink. Absent, Raph's v3 cycle on a light theme; empty, the theme's paint.
35
+ */
36
+ readonly chipTints?: readonly {
37
+ readonly tint: string;
38
+ readonly ink?: string;
39
+ }[];
40
+ }
41
+ /** One card under an answer in the cards answer style: a record, a stat, or a link to one of your screens. */
42
+ interface EverfurChatAnswerCard {
43
+ /** Stable key within the answer. */
44
+ readonly key: string;
45
+ readonly title: string;
46
+ /** The small line under the title. */
47
+ readonly meta?: string;
48
+ /** A status pill. */
49
+ readonly pill?: {
50
+ readonly label: string;
51
+ readonly tone?: string;
52
+ };
53
+ /** A stat card's value: drawn in place of the pill and the chevron. */
54
+ readonly value?: {
55
+ readonly amount: string;
56
+ readonly unit?: string;
57
+ };
58
+ /** The tile at the start: an icon of yours, or an https image. */
59
+ readonly tile?: {
60
+ readonly icon?: ReactNode;
61
+ readonly imageUrl?: string;
62
+ readonly tone?: string;
63
+ };
64
+ readonly variant?: string;
65
+ /** Given, the card is a button that calls this. Absent, a static card. */
66
+ readonly onPress?: () => void;
67
+ /** A card of your own, drawn in the card's place. If it throws, the slot draws nothing. */
68
+ readonly render?: () => ReactNode;
69
+ }
70
+ /** What `answerCards.cards` receives: the settled answer's text and the question it answered. */
71
+ interface EverfurChatAnswerContext {
72
+ readonly answer: string;
73
+ readonly question: string | null;
74
+ /** The answer's message id, stable for the life of the thread. */
75
+ readonly messageId: string;
76
+ }
77
+ /** The cards answer style's content (used while presentation `chatAnswerStyle` is `cards`). The words are yours. */
78
+ interface EverfurChatAnswerCards {
79
+ /** The line over each answer (an icon and your words). Absent, the assistant's name line. */
80
+ readonly byline?: {
81
+ readonly label: string;
82
+ readonly icon?: ReactNode;
83
+ };
84
+ /** Your cards under a settled answer. A throw draws none. */
85
+ readonly cards?: (context: EverfurChatAnswerContext) => readonly EverfurChatAnswerCard[];
86
+ /** Two feedback chips in place of the footer's thumbs, mapped to thumbs up and thumbs down. */
87
+ readonly feedback?: {
88
+ readonly helpful: string;
89
+ readonly notHelpful: string;
90
+ };
91
+ /** Your own rows at the top of the follow-ups, for the answer it receives. */
92
+ readonly followUpActions?: (context: EverfurChatAnswerContext) => readonly EverfurChatFollowUpAction[];
93
+ /** Draw the chevron your way. Absent, Everfur's glyph. */
94
+ readonly renderIcon?: (icon: 'chevron') => ReactNode;
95
+ }
96
+ /** A row of yours at the top of the follow-ups under an answer. */
97
+ interface EverfurChatFollowUpAction {
98
+ readonly key: string;
99
+ readonly label: string;
100
+ readonly icon?: ReactNode;
101
+ readonly onPress: () => void;
102
+ }
103
+ /**
104
+ * The card at the top of the empty thread (presentation `chatTopCard: "focus"`): one finding, in your words, with
105
+ * an action of yours and a question it can ask in the thread. Its close control folds it into a pill.
106
+ */
107
+ interface EverfurChatTopCard {
108
+ /** The small heading ("Her focus"). */
109
+ readonly kicker: string;
110
+ /** A source badge ("<your brand> results"). */
111
+ readonly badge?: string;
112
+ readonly title: string;
113
+ /** The finding: a bold lead and the rest of the sentence. */
114
+ readonly lead?: string;
115
+ readonly body?: string;
116
+ /** Your action ("See her Health Plan"). */
117
+ readonly action?: {
118
+ readonly label: string;
119
+ readonly onPress: () => void;
120
+ };
121
+ /** A question the card asks in this thread. */
122
+ readonly ask?: {
123
+ readonly label: string;
124
+ readonly prompt: string;
125
+ };
126
+ /** The close control's accessible name. Absent, the shared `Close`. */
127
+ readonly closeLabel?: string;
128
+ /** The pill's words while the card is closed (defaults to `kicker`). */
129
+ readonly pill?: string;
130
+ /** Draw the close glyph your way. */
131
+ readonly renderIcon?: (icon: 'close') => ReactNode;
132
+ }
133
+ /** The history bottom sheet (presentation `chatHistoryStyle: "sheet"`). */
134
+ interface EverfurChatHistorySheet {
135
+ /** The sheet's small title ("Chats with Ask <your brand>"). Absent, Everfur's history heading. */
136
+ readonly title?: string;
137
+ /** Draw the icons your way. */
138
+ readonly renderIcon?: (icon: 'close' | 'chat' | 'edit') => ReactNode;
139
+ }
14
140
 
15
141
  /**
16
142
  * The host's image picker for chat attachments. The SDK depends on no picker or camera module: open your own
@@ -30,6 +156,10 @@ interface EverfurChatAttachments {
30
156
  /** Images per message; default 1 (the app's composer), at most 5 (the server's cap). */
31
157
  readonly maxPerMessage?: number;
32
158
  }
159
+
160
+ /** The host's own action for the two vet-care tiers, in place of Everfur's pill. */
161
+ type RenderVetAction = (level: UrgencyDisplayLevel) => ReactNode;
162
+
33
163
  interface EverfurChatProps {
34
164
  readonly petRef?: PetRef;
35
165
  readonly conversationId?: ConversationId;
@@ -88,6 +218,12 @@ interface EverfurChatProps {
88
218
  * conversation. Pass `composerSeed` instead when the user should decide whether to send it.
89
219
  */
90
220
  readonly initialAsk?: string;
221
+ /**
222
+ * The identity of this `initialAsk`, when the same words can be asked again: your own id for each tap of an
223
+ * "Ask Everfur" pill or each push opened. A new key asks again even with the same words. Absent, the
224
+ * question's own words are the key, so the same question twice in a row is asked once.
225
+ */
226
+ readonly initialAskKey?: string | number;
91
227
  /**
92
228
  * Text to put in the composer on arrival. It is never sent for the user: they edit it, send it or clear
93
229
  * it. Only an empty composer is seeded, so nothing they typed is ever replaced.
@@ -149,6 +285,32 @@ interface EverfurChatProps {
149
285
  * mount is about 15 pt short. Pass the hook's value from every render, never a copy taken at mount.
150
286
  */
151
287
  readonly keyboardVerticalOffset?: number;
288
+ /**
289
+ * The layout settings (Raph v3): the answer style, the history style, the top card, the composer style and
290
+ * placeholder, the history bar's place, the general banner, the send button, the follow-up count and the upload
291
+ * control. Each also comes from your console (render_hints.branding.presentation); a field you set here wins
292
+ * unless the console locks it. `attachments` counts as your explicit `chatComposerUpload: true`. The microphone
293
+ * setting (`chatComposerMic`) has no control on this surface. `topCard`, `answerCards` and `historySheet` are
294
+ * content only and never switch a layout on by themselves.
295
+ */
296
+ readonly presentation?: EverfurPresentationInput;
297
+ /**
298
+ * The focus card's content (drawn while `chatTopCard` resolves to `focus`). Absent, the card is built from the
299
+ * pet's Health Plan page focus; no page, no focus, a refused read or a page still loading draws no card.
300
+ */
301
+ readonly topCard?: EverfurChatTopCard;
302
+ /** Opens the pet's Health Plan (your tab or screen): the plan-built focus card's `See her Health Plan` button. */
303
+ readonly onOpenHealthPlan?: () => void;
304
+ /** The cards answer style's content (used while `chatAnswerStyle` resolves to `cards`). */
305
+ readonly answerCards?: EverfurChatAnswerCards;
306
+ /** The history sheet's title and icons (used while `chatHistoryStyle` resolves to `sheet`). */
307
+ readonly historySheet?: EverfurChatHistorySheet;
308
+ /** The history bar ("Chats" and "New chat"); `chatHistoryBar: "scroll"` puts it at the top of the thread. */
309
+ readonly historyBar?: EverfurChatHistoryBar;
310
+ /** Your own starter chips, in place of the built-in four. */
311
+ readonly starterPrompts?: readonly EverfurStarterPrompt[];
312
+ /** The empty thread's title and chip fills. */
313
+ readonly emptyState?: EverfurChatEmptyState;
152
314
  }
153
315
  /**
154
316
  * Entitlement-gated, four-state chat surface. Entitlement-OFF renders the CapabilityGate OffState;
@@ -156,4 +318,4 @@ interface EverfurChatProps {
156
318
  */
157
319
  declare function EverfurChat(props: EverfurChatProps): ReactNode;
158
320
 
159
- export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAttachments as a, type EverfurChatProps as b };
321
+ export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type EverfurChatAnswerCard as a, type EverfurChatAnswerCards as b, type EverfurChatAnswerContext as c, type EverfurChatAttachments as d, type EverfurChatEmptyState as e, type EverfurChatFollowUpAction as f, type EverfurChatHistoryBar as g, type EverfurChatHistorySheet as h, type EverfurChatProps as i, type EverfurChatTopCard as j };
@@ -1,5 +1,5 @@
1
1
  import { CSSProperties, ReactNode } from 'react';
2
- import { f as RecordsScreenBaseProps } from './useRecordsDepth-DPdAK_81.cjs';
2
+ import { d as RecordsScreenBaseProps } from './useRecordsDepth.d-sAq2Qkhr.cjs';
3
3
 
4
4
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
5
5
  readonly style?: CSSProperties;
@@ -1,6 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { StyleProp, ViewStyle } from 'react-native';
3
- import { f as RecordsScreenBaseProps } from './useRecordsDepth-Bp6L4M5P.js';
3
+ import { d as RecordsScreenBaseProps } from './useRecordsDepth.d-sAq2Qkhr.cjs';
4
4
 
5
5
  interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
6
6
  readonly style?: StyleProp<ViewStyle>;