@everfur/sdk 0.12.1 → 0.14.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.
- package/CHANGELOG.md +292 -0
- package/README.md +12 -10
- package/dist/{Chat-CgYQdfqi.d.ts → Chat.d-aycmX1CA.d.cts} +178 -8
- package/dist/{Chat-CbyZ1vAX.d.cts → Chat.d-puminpyi.d.ts} +178 -8
- package/dist/{DepthViews-CCz4ig0u.d.ts → DepthViews.d-BdvFZgPs.d.cts} +1 -1
- package/dist/{DepthViews-CaQUyCHK.d.ts → DepthViews.d-DIvxzLDf.d.ts} +1 -1
- package/dist/{DepthViews-iGZi4_WK.d.cts → DepthViews.d-Dy0Zl-s-.d.ts} +1 -1
- package/dist/{DepthViews-D3OiIK_x.d.cts → DepthViews.d-wLNkzk9f.d.cts} +1 -1
- package/dist/{ErrorPolicyPort-10s3HJCt.d.cts → ErrorPolicyPort.d-68yrE3BE.d.ts} +1 -1
- package/dist/{ErrorPolicyPort-C3nNSS_j.d.ts → ErrorPolicyPort.d-DirW9hgO.d.cts} +1 -1
- package/dist/{EverfurError-DeBqRpQV.d.cts → EverfurError.d-8NHtlgzA.d.cts} +11 -1
- package/dist/{EverfurError-DeBqRpQV.d.ts → EverfurError.d-8NHtlgzA.d.ts} +11 -1
- package/dist/{EverfurResult-ClPTS0P2.d.ts → EverfurResult.d-BFH-3s6E.d.cts} +1 -1
- package/dist/{EverfurResult-COlXj1wq.d.cts → EverfurResult.d-D_-254ZY.d.ts} +1 -1
- package/dist/{IntakeMedia-BH0fYDT2.d.cts → IntakeMedia.d-4a89XrP7.d.ts} +1 -1
- package/dist/{IntakeMedia-B-_vA9ZB.d.cts → IntakeMedia.d-DGxrhgIW.d.ts} +1 -1
- package/dist/{IntakeMedia-CIoTXAWs.d.ts → IntakeMedia.d-DUPR4lVM.d.cts} +1 -1
- package/dist/{IntakeMedia-Bavl7E4Z.d.ts → IntakeMedia.d-JJCUvQu7.d.cts} +1 -1
- package/dist/LifecyclePort.d-Cr1p33a7.d.cts +23 -0
- package/dist/LifecyclePort.d-Cr1p33a7.d.ts +23 -0
- package/dist/{PhotoController-vzY5bfY_.d.ts → PhotoController.d-BzCJOE7e.d.cts} +2 -2
- package/dist/{PhotoController-3l7MT9jA.d.cts → PhotoController.d-D0XiUUOl.d.ts} +2 -2
- package/dist/RecordsPage.d-9Ank15PT.d.ts +93 -0
- package/dist/RecordsPage.d-DMKU0IKc.d.cts +93 -0
- package/dist/animations/index.cjs +4 -1
- package/dist/animations/index.d.cts +24 -24
- package/dist/animations/index.d.ts +24 -24
- package/dist/animations/index.js +4 -1
- package/dist/{attachments-CTJK0jQ4.d.ts → attachments.d--sIsfk6e.d.ts} +4 -4
- package/dist/{attachments-DkMrKCIU.d.ts → attachments.d-DNUCiyy5.d.cts} +10 -32
- package/dist/{attachments-DXBETOrV.d.cts → attachments.d-ZEpTUeWN.d.cts} +4 -4
- package/dist/{attachments-BOk3hEAM.d.cts → attachments.d-rp3xs-Q3.d.ts} +10 -32
- package/dist/{bookingCopy-C_a45T4-.d.ts → bookingCopy.d-D0uIIFAJ.d.ts} +24 -9
- package/dist/{bookingCopy-CHYGYHe0.d.cts → bookingCopy.d-DUrmVcLs.d.cts} +24 -9
- package/dist/{branding-DJf4h12Q.d.ts → branding.d-CTXTUg_8.d.cts} +9 -2
- package/dist/{branding-BCfwLj0h.d.cts → branding.d-DxJSoFce.d.ts} +9 -2
- package/dist/{callRoom-BhIdadyV.d.cts → callRoom.d-B1DoYdJe.d.cts} +1 -1
- package/dist/{callRoom-B92eH_ij.d.ts → callRoom.d-Dqm1rUqT.d.ts} +1 -1
- package/dist/{casesRepository-C8KJmlxE.d.cts → casesRepository.d-DCnix2pT.d.cts} +3 -3
- package/dist/{casesRepository-iAi5qWnx.d.ts → casesRepository.d-DbirgbyH.d.ts} +3 -3
- package/dist/chat/index.cjs +139 -63
- package/dist/chat/index.d.cts +34 -19
- package/dist/chat/index.d.ts +34 -19
- package/dist/chat/index.js +139 -63
- package/dist/client/index.cjs +14 -10
- package/dist/client/index.d.cts +19 -18
- package/dist/client/index.d.ts +19 -18
- package/dist/client/index.js +14 -10
- package/dist/clinicBatch.d-Ccmrngcu.d.cts +71 -0
- package/dist/clinicBatch.d-D9Ci7IpP.d.ts +71 -0
- package/dist/clinicModels.d-BXgKZqDb.d.cts +68 -0
- package/dist/clinicModels.d-CaS64-P-.d.ts +68 -0
- package/dist/clinicRequestProps.d-1dCtouGA.d.cts +65 -0
- package/dist/clinicRequestProps.d-CjsMg_OD.d.ts +65 -0
- package/dist/{config-C9zhanL-.d.cts → config.d-DJ4mvf_w.d.cts} +3 -3
- package/dist/{config-C5iPNKDj.d.ts → config.d-MX7IKP2f.d.ts} +3 -3
- package/dist/consent/index.cjs +4 -1
- package/dist/consent/index.d.cts +10 -10
- package/dist/consent/index.d.ts +10 -10
- package/dist/consent/index.js +4 -1
- package/dist/{context-D_bcpHDA.d.cts → context.d-BdnBe8Oe.d.ts} +15 -15
- package/dist/{context-BUIrC20Z.d.ts → context.d-C6MJsMpN.d.cts} +15 -15
- package/dist/{copy-KbCU9fen.d.ts → copy.d-BIfQOoDB.d.ts} +6 -6
- package/dist/{copy-BE31T2jR.d.cts → copy.d-C_u7shha.d.cts} +6 -6
- package/dist/core/index.cjs +16 -13
- package/dist/core/index.d.cts +35 -29
- package/dist/core/index.d.ts +35 -29
- package/dist/core/index.js +16 -13
- package/dist/{depth-DDKGfFaB.d.ts → depth.d-COFxYWLU.d.ts} +9 -242
- package/dist/{depth-DNxDieoO.d.cts → depth.d-D2e5WZuE.d.cts} +9 -242
- package/dist/{entitlementRepository-C1_wXIE3.d.cts → entitlementRepository.d-BP15dFbe.d.cts} +10 -5
- package/dist/{entitlementRepository-CYtdIGfH.d.ts → entitlementRepository.d-DLuxnGi5.d.ts} +10 -5
- package/dist/features.d-DrQxTw3-.d.cts +108 -0
- package/dist/features.d-DrQxTw3-.d.ts +108 -0
- package/dist/focus.d-C0Tr0oVJ.d.ts +939 -0
- package/dist/focus.d-jQWp0hdK.d.cts +939 -0
- package/dist/health-plan/index.cjs +384 -0
- package/dist/health-plan/index.d.cts +293 -0
- package/dist/health-plan/index.d.ts +293 -0
- package/dist/health-plan/index.js +384 -0
- package/dist/idempotency.d-DXb1BN2A.d.ts +1055 -0
- package/dist/idempotency.d-HF6fyRt2.d.cts +1055 -0
- package/dist/{identity-gjurBi7m.d.cts → identity.d-BePPZ7Uv.d.ts} +3 -3
- package/dist/{identity-BqeaN8An.d.ts → identity.d-CJfnWOdH.d.cts} +3 -3
- package/dist/index.cjs +148 -72
- package/dist/index.d.cts +32 -29
- package/dist/index.d.ts +32 -29
- package/dist/index.js +148 -72
- package/dist/introEvents.d-BkGDT_kG.d.cts +175 -0
- package/dist/introEvents.d-DHlMvmC7.d.ts +175 -0
- package/dist/introEvents.d-dS3fJCH1.d.cts +5 -0
- package/dist/introEvents.d-dS3fJCH1.d.ts +5 -0
- package/dist/{models-CnXY5LuO.d.ts → models.d-BSqvbTE1.d.cts} +15 -3
- package/dist/{models-A4A5S7AG.d.cts → models.d-DOwnr8fi.d.ts} +15 -3
- package/dist/notifications/index.cjs +4 -1
- package/dist/notifications/index.d.cts +9 -9
- package/dist/notifications/index.d.ts +9 -9
- package/dist/notifications/index.js +4 -1
- package/dist/optInView.d-0iI5JoAf.d.cts +441 -0
- package/dist/optInView.d-s-w4aGN3.d.ts +441 -0
- package/dist/parse.d-COt1qVA6.d.ts +210 -0
- package/dist/parse.d-EmsgOUMQ.d.cts +210 -0
- package/dist/{pets-CfutxNs9.d.cts → pets.d-BFT_b53y.d.ts} +3 -3
- package/dist/{pets-LIGadUtr.d.ts → pets.d-nNAVnw7f.d.cts} +3 -3
- package/dist/{petsRepository-CoRa3C_U.d.ts → petsRepository.d-B2TpRE7r.d.cts} +4 -4
- package/dist/{petsRepository-Cqpd3hLU.d.cts → petsRepository.d-RGwSZcYl.d.ts} +4 -4
- package/dist/photo/index.cjs +5 -2
- package/dist/photo/index.d.cts +9 -9
- package/dist/photo/index.d.ts +9 -9
- package/dist/photo/index.js +5 -2
- package/dist/planSignals.d-BDbp2e-k.d.cts +126 -0
- package/dist/planSignals.d-DSnxKoWe.d.ts +126 -0
- package/dist/{ports-BN6RHF9W.d.cts → ports.d-BX4f4UsB.d.cts} +14 -1
- package/dist/{ports-BN6RHF9W.d.ts → ports.d-BX4f4UsB.d.ts} +14 -1
- package/dist/{ports-CVi3n0re.d.ts → ports.d-D2n4HRUy.d.ts} +16 -10
- package/dist/{ports-gJ3faaWz.d.cts → ports.d-DBA_gsq5.d.cts} +16 -10
- package/dist/presentation.d-vy8kTGfR.d.cts +96 -0
- package/dist/presentation.d-vy8kTGfR.d.ts +96 -0
- package/dist/quickPrompts.d-NM_81Jc1.d.cts +19 -0
- package/dist/quickPrompts.d-NM_81Jc1.d.ts +19 -0
- package/dist/records/depth/index.cjs +10 -7
- package/dist/records/depth/index.d.cts +18 -12
- package/dist/records/depth/index.d.ts +18 -12
- package/dist/records/depth/index.js +10 -7
- package/dist/records/index.cjs +350 -74
- package/dist/records/index.d.cts +225 -21
- package/dist/records/index.d.ts +225 -21
- package/dist/records/index.js +351 -75
- package/dist/recordsAsk.d-C5CGSi3j.d.cts +14 -0
- package/dist/recordsAsk.d-C5CGSi3j.d.ts +14 -0
- package/dist/{requestFunnel-BYzlyaC0.d.ts → requestFunnel.d-D9edIEjZ.d.ts} +5 -5
- package/dist/{requestFunnel-DLZpiFD3.d.cts → requestFunnel.d-RZex94XX.d.cts} +5 -5
- package/dist/{resolve-D4Ywz5OS.d.ts → resolve.d-CoQWUy1Y.d.cts} +2 -2
- package/dist/{resolve-D4Ywz5OS.d.cts → resolve.d-CoQWUy1Y.d.ts} +2 -2
- package/dist/{runtimeTypes-BxxCKMn8.d.cts → runtimeTypes.d-BYq38b17.d.ts} +20 -13
- package/dist/{runtimeTypes-Doa_xxSa.d.ts → runtimeTypes.d-LkwZaF7z.d.cts} +20 -13
- package/dist/screenProps.d-BVzRzowC.d.ts +159 -0
- package/dist/screenProps.d-CQ0qZJkr.d.cts +159 -0
- package/dist/server/events/index.cjs +6 -3
- package/dist/server/events/index.d.cts +51 -9
- package/dist/server/events/index.d.ts +51 -9
- package/dist/server/events/index.js +6 -3
- package/dist/server/index.cjs +11 -6
- package/dist/server/index.d.cts +152 -8
- package/dist/server/index.d.ts +152 -8
- package/dist/server/index.js +11 -6
- package/dist/sheetCopy.d-CAhLOxjc.d.cts +4 -0
- package/dist/sheetCopy.d-CAhLOxjc.d.ts +4 -0
- package/dist/sheetSeam.d-B09jf4YC.d.ts +49 -0
- package/dist/sheetSeam.d-BBuEIVsa.d.cts +49 -0
- package/dist/shop/index.cjs +428 -0
- package/dist/shop/index.d.cts +211 -0
- package/dist/shop/index.d.ts +211 -0
- package/dist/shop/index.js +428 -0
- package/dist/tabs/index.cjs +195 -0
- package/dist/tabs/index.d.cts +174 -0
- package/dist/tabs/index.d.ts +174 -0
- package/dist/tabs/index.js +195 -0
- package/dist/tabsModel.d-BfIQg6yS.d.cts +31 -0
- package/dist/tabsModel.d-BfIQg6yS.d.ts +31 -0
- package/dist/televet/booking/index.cjs +15 -12
- package/dist/televet/booking/index.d.cts +36 -22
- package/dist/televet/booking/index.d.ts +36 -22
- package/dist/televet/booking/index.js +15 -12
- package/dist/televet/call/index.d.cts +5 -5
- package/dist/televet/call/index.d.ts +5 -5
- package/dist/televet/index.cjs +6 -3
- package/dist/televet/index.d.cts +12 -12
- package/dist/televet/index.d.ts +12 -12
- package/dist/televet/index.js +6 -3
- package/dist/{televetGlobal-C5dTUACe.d.cts → televetGlobal.d-CC-DrqkQ.d.ts} +7 -2
- package/dist/{televetGlobal-CnjrfhT4.d.ts → televetGlobal.d-CKwDCbmN.d.cts} +7 -2
- package/dist/testing/index.cjs +6 -3
- package/dist/testing/index.d.cts +3 -3
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +6 -3
- package/dist/testing/rn/index.cjs +5 -2
- package/dist/testing/rn/index.d.cts +23 -22
- package/dist/testing/rn/index.d.ts +23 -22
- package/dist/testing/rn/index.js +5 -2
- package/dist/testing/web/index.cjs +4 -1
- package/dist/testing/web/index.d.cts +23 -22
- package/dist/testing/web/index.d.ts +23 -22
- package/dist/testing/web/index.js +4 -1
- package/dist/texting/index.cjs +193 -0
- package/dist/texting/index.d.cts +69 -0
- package/dist/texting/index.d.ts +69 -0
- package/dist/texting/index.js +193 -0
- package/dist/threadOptions.d-9r4Csa7k.d.cts +458 -0
- package/dist/threadOptions.d-B6GA09aM.d.ts +458 -0
- package/dist/{timelineRows-Beun96e2.d.cts → timelineRows.d-Bes8ip2v.d.ts} +1 -1
- package/dist/{timelineRows-CGOlC_Q9.d.ts → timelineRows.d-BvM2A7_G.d.cts} +1 -1
- package/dist/{tokens-DLj8OnLH.d.cts → tokens.d-DarDaV39.d.cts} +10 -2
- package/dist/{tokens-DLj8OnLH.d.ts → tokens.d-DarDaV39.d.ts} +10 -2
- package/dist/{typeStyle-DJedEu14.d.cts → typeStyle.d-Co5KF0up.d.ts} +2 -2
- package/dist/{typeStyle-BxVyF71R.d.ts → typeStyle.d-xIZj02Ru.d.cts} +2 -2
- package/dist/{uploadTransport-C6kGP1Kd.d.ts → uploadTransport.d-CWL7CdWP.d.cts} +1 -1
- package/dist/{uploadTransport-BM_pnEWj.d.cts → uploadTransport.d-EGoUl7gX.d.ts} +1 -1
- package/dist/useIntroSeen.d-CTWFUthO.d.cts +35 -0
- package/dist/useIntroSeen.d-CTWFUthO.d.ts +35 -0
- package/dist/usePresentation.d-BGz32Vlm.d.ts +285 -0
- package/dist/usePresentation.d-DYTF_ZGf.d.cts +285 -0
- package/dist/useRecords.d-BYNX01El.d.cts +121 -0
- package/dist/useRecords.d-DWk61a4c.d.ts +121 -0
- package/dist/useRecordsDepth.d--LLA_4ga.d.cts +32 -0
- package/dist/useRecordsDepth.d-BQRL0Hez.d.ts +32 -0
- package/dist/{useVetVisit-DmWa7lt1.d.ts → useVetVisit.d-BtdwhmgD.d.cts} +15 -4
- package/dist/{useVetVisit-PtBjNwZr.d.cts → useVetVisit.d-DoYQimyt.d.ts} +15 -4
- package/dist/video/index.cjs +5 -2
- package/dist/video/index.d.cts +7 -7
- package/dist/video/index.d.ts +7 -7
- package/dist/video/index.js +5 -2
- package/dist/{view-VvLEdXP4.d.cts → view.d-0yBjLTV3.d.cts} +12 -122
- package/dist/{view-C_B5U04g.d.ts → view.d-DqbCADFa.d.ts} +12 -122
- package/dist/web/consent/index.cjs +4 -1
- package/dist/web/consent/index.d.cts +10 -10
- package/dist/web/consent/index.d.ts +10 -10
- package/dist/web/consent/index.js +4 -1
- package/dist/web/health-plan/index.cjs +421 -0
- package/dist/web/health-plan/index.d.cts +189 -0
- package/dist/web/health-plan/index.d.ts +189 -0
- package/dist/web/health-plan/index.js +421 -0
- package/dist/web/index.cjs +170 -87
- package/dist/web/index.d.cts +292 -38
- package/dist/web/index.d.ts +292 -38
- package/dist/web/index.js +170 -87
- package/dist/web/intro/index.cjs +167 -0
- package/dist/web/intro/index.d.cts +79 -0
- package/dist/web/intro/index.d.ts +79 -0
- package/dist/web/intro/index.js +167 -0
- package/dist/web/notifications/index.cjs +15 -3
- package/dist/web/notifications/index.d.cts +39 -209
- package/dist/web/notifications/index.d.ts +39 -209
- package/dist/web/notifications/index.js +15 -3
- package/dist/web/records/depth/index.cjs +10 -7
- package/dist/web/records/depth/index.d.cts +18 -12
- package/dist/web/records/depth/index.d.ts +18 -12
- package/dist/web/records/depth/index.js +10 -7
- package/dist/web/records/index.cjs +94 -68
- package/dist/web/records/index.d.cts +39 -55
- package/dist/web/records/index.d.ts +39 -55
- package/dist/web/records/index.js +94 -68
- package/dist/web/records/upload/index.d.cts +2 -2
- package/dist/web/records/upload/index.d.ts +2 -2
- package/dist/web/records-sheet/index.cjs +332 -0
- package/dist/web/records-sheet/index.d.cts +104 -0
- package/dist/web/records-sheet/index.d.ts +104 -0
- package/dist/web/records-sheet/index.js +332 -0
- package/dist/web/shop/index.cjs +416 -0
- package/dist/web/shop/index.d.cts +59 -0
- package/dist/web/shop/index.d.ts +59 -0
- package/dist/web/shop/index.js +416 -0
- package/dist/web/televet/booking/index.cjs +15 -12
- package/dist/web/televet/booking/index.d.cts +37 -23
- package/dist/web/televet/booking/index.d.ts +37 -23
- package/dist/web/televet/booking/index.js +15 -12
- package/dist/web/televet/call/index.d.cts +4 -4
- package/dist/web/televet/call/index.d.ts +4 -4
- package/dist/web/televet/index.cjs +6 -3
- package/dist/web/televet/index.d.cts +12 -12
- package/dist/web/televet/index.d.ts +12 -12
- package/dist/web/televet/index.js +6 -3
- package/dist/web/texting/index.cjs +188 -0
- package/dist/web/texting/index.d.cts +69 -0
- package/dist/web/texting/index.d.ts +69 -0
- package/dist/web/texting/index.js +188 -0
- package/health-plan/package.json +8 -0
- package/package.json +138 -5
- package/shop/package.json +8 -0
- package/tabs/package.json +8 -0
- package/texting/package.json +8 -0
- package/web/health-plan/native-blocked.cjs +12 -0
- package/web/health-plan/package.json +8 -0
- package/web/intro/native-blocked.cjs +12 -0
- package/web/intro/package.json +8 -0
- package/web/records-sheet/native-blocked.cjs +12 -0
- package/web/records-sheet/package.json +8 -0
- package/web/shop/native-blocked.cjs +12 -0
- package/web/shop/package.json +8 -0
- package/web/texting/native-blocked.cjs +12 -0
- package/web/texting/package.json +8 -0
- package/dist/useRecordsDepth-DRrJntjt.d.cts +0 -257
- package/dist/useRecordsDepth-hR94debv.d.ts +0 -257
- /package/dist/{CameraPort-Cv31Pz7g.d.cts → CameraPort.d-Cv31Pz7g.d.cts} +0 -0
- /package/dist/{CameraPort-Cv31Pz7g.d.ts → CameraPort.d-Cv31Pz7g.d.ts} +0 -0
- /package/dist/{TelemetryPort-BDNr00hu.d.cts → TelemetryPort.d-BDNr00hu.d.cts} +0 -0
- /package/dist/{TelemetryPort-BDNr00hu.d.ts → TelemetryPort.d-BDNr00hu.d.ts} +0 -0
- /package/dist/{cacheEpoch-DknKn3S0.d.cts → cacheEpoch.d-DknKn3S0.d.cts} +0 -0
- /package/dist/{cacheEpoch-DknKn3S0.d.ts → cacheEpoch.d-DknKn3S0.d.ts} +0 -0
- /package/dist/{callCopy-Bw6oZT54.d.cts → callCopy.d-Bw6oZT54.d.cts} +0 -0
- /package/dist/{callCopy-Bw6oZT54.d.ts → callCopy.d-Bw6oZT54.d.ts} +0 -0
- /package/dist/{ids-B2GAAifq.d.cts → ids.d-B2GAAifq.d.cts} +0 -0
- /package/dist/{ids-B2GAAifq.d.ts → ids.d-B2GAAifq.d.ts} +0 -0
- /package/dist/{optionalModule-DbJmsq5f.d.cts → optionalModule.d-DbJmsq5f.d.cts} +0 -0
- /package/dist/{optionalModule-DbJmsq5f.d.ts → optionalModule.d-DbJmsq5f.d.ts} +0 -0
- /package/dist/{profile-CSs1wlXT.d.cts → profile.d-CSs1wlXT.d.cts} +0 -0
- /package/dist/{profile-CSs1wlXT.d.ts → profile.d-CSs1wlXT.d.ts} +0 -0
- /package/dist/{projection-CeIUsbSk.d.cts → projection.d-CeIUsbSk.d.cts} +0 -0
- /package/dist/{projection-CeIUsbSk.d.ts → projection.d-CeIUsbSk.d.ts} +0 -0
- /package/dist/{species-BXAIMh7I.d.cts → species.d-BXAIMh7I.d.cts} +0 -0
- /package/dist/{species-BXAIMh7I.d.ts → species.d-BXAIMh7I.d.ts} +0 -0
- /package/dist/{visitIntent-D7_yVp1I.d.cts → visitIntent.d-D7_yVp1I.d.cts} +0 -0
- /package/dist/{visitIntent-D7_yVp1I.d.ts → visitIntent.d-D7_yVp1I.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,298 @@ changes that has not been earned by any production integration yet.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.14.0] - 2026-10-22
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Three tabs with a first-open intro (web).** New `EverfurTabs` (`@everfur/sdk/web`): Ask, Health Plan and Records
|
|
18
|
+
as WAI-ARIA tabs over panes that stay mounted, with `EverfurChat`, `EverfurHealthPlan` and `EverfurRecordsPage`
|
|
19
|
+
inside (their own props pass through `chat`, `plan` and `records`). The host says how the member got here with
|
|
20
|
+
`opened`: a plain open lands on Health Plan (Ask when the pet has no plan, whose tab then hides), a link opens the
|
|
21
|
+
tab it names and can ask a question. On a phone-narrow page the first plain open plays the intro over Ask once per
|
|
22
|
+
member: the tabs, the records ask with the clinic search, the consent and the request, and Sent. "Seen" lives on the
|
|
23
|
+
account (`GET` / `PUT /widget/v1/me/intro`), this device keeps a copy once it closes, and a failed read never plays
|
|
24
|
+
it. The intro is its own lazily loaded entry, `@everfur/sdk/web/intro`. Also exported: `useEverfurTabs` and the
|
|
25
|
+
`tabsRef` prop (`open`, `ask`, `requestRecords`), `EVERFUR_TABS_COPY`, and the `everfur:records-requested` /
|
|
26
|
+
`everfur:records-landed` window events with `onRecordsRequested` / `onRecordsLanded` (the window's requested event
|
|
27
|
+
leaves out `clinicName`, which any script on the page would hear; the callback carries it).
|
|
28
|
+
- **Ask home (web).** The compact composer sits 14px in from each side and 10px off the bar's foot, as Raph's
|
|
29
|
+
`.ph-askbar`; the Chats count is drawn only when there is at least one chat.
|
|
30
|
+
- **Three tabs with a first-open intro (React Native).** New subpath `@everfur/sdk/tabs`, the web shell's twin:
|
|
31
|
+
`EverfurTabs` over `EverfurChat`, `EverfurHealthPlan` and `EverfurRecords` (reached through their own subpaths, not
|
|
32
|
+
bundled), the same `opened` rule, panes that stay mounted, `tabsRef` / `useEverfurTabs` (`open`, `ask`,
|
|
33
|
+
`requestRecords`), `onTabChange`, `onRecordsRequested`, `onRecordsLanded` and `onToast`. The intro plays once per
|
|
34
|
+
member on the first plain open on a phone-sized window (`intro.maxWidth`, default 600), in a modal sheet whose
|
|
35
|
+
title takes the screen reader's focus; reduced motion fades it over 150ms. "Seen" is the same account read and
|
|
36
|
+
device copy as the web, and a failed read never plays it. Records' "Request from her clinic" opens the intro's
|
|
37
|
+
records sheet (`requestRecords`), the SDK consent screen kept between Request and Sent. Also exported:
|
|
38
|
+
`EverfurIntro`, `EverfurRecordsLandedBanner`, `useEverfurIntroSeen`, `EVERFUR_TABS_COPY`, `EVERFUR_INTRO_COPY` and
|
|
39
|
+
the intro's pure text helpers. The React Native compact Ask composer takes Raph's `.ph-askbar` insets (10, 14, 10).
|
|
40
|
+
- **Ask (React Native).** `EverfurChat` takes `header={false}`, the web prop's twin, for a screen that already has a
|
|
41
|
+
header over chat (the tab shell's host passes it). Inside `EverfurTabs` the chat takes no status-bar inset of its own.
|
|
42
|
+
Fixed: a staggered fade (the starter chips) could stay invisible when the OS reduced-motion setting arrived after
|
|
43
|
+
mount; it now comes to rest.
|
|
44
|
+
- **Ask home inside the tabs (React Native).** Inside `EverfurTabs` the chat draws Raph's round 5 Ask home from
|
|
45
|
+
generated rules (`scripts/gen-ask-home-rn.mjs`): his Chats row, focus card, and centred start with a balanced title
|
|
46
|
+
(his `16ch` measure, measured by layout) and chips. There, presentation `safetyDisclaimerPlacement: "answer_footer"`
|
|
47
|
+
moves the safety footnote to the foot of the thread, as on the web. The look rides in the tabs entry; a standalone
|
|
48
|
+
`EverfurChat` keeps its look and its size. New `EverfurPoweredBy` and `useHostPoweredBy` (`@everfur/sdk/chat`), the
|
|
49
|
+
web's twins: a host that shows "powered by everfur" in its own header wraps that lockup, and the chat leaves out its
|
|
50
|
+
own line. The tab shell passes the records sheet `onRequestFromClinic({ petRef })` and `noVet`.
|
|
51
|
+
|
|
52
|
+
- **The texting ask, in chat and as a pop-up (web and React Native).** `EverfurChat` now asks a member to turn on
|
|
53
|
+
texting by itself: after a completed answer (never a failed or stopped turn, a check-in or an urgent answer),
|
|
54
|
+
with nothing streaming, one Everfur line in the answer look with "Turn on SMS
|
|
55
|
+
Chat" / "Not now". Accepting turns the composer into the opt-in's number, consent and code steps, and a verified
|
|
56
|
+
number shows a closing line. New presentation field `chat_texting_ask` (`chatTextingAsk`, boolean, default `true`)
|
|
57
|
+
turns it off. New `EverfurTextingPrompt` (`@everfur/sdk/web/texting`, `@everfur/sdk/texting`) is the same ask as a
|
|
58
|
+
sheet for app open; whether to mount it is the partner's call. Both share one schedule, kept per member in the
|
|
59
|
+
provider's `storage`: at most three asks two days apart, never again once the member has an identity, and at most
|
|
60
|
+
one ask per session. Unreadable storage shows nothing, so a React Native host with no `storage` is never asked.
|
|
61
|
+
Also exported: `useTextingAsk`, `resolveTextingAskDue`, `textingAskThreadReady`, `isTextingAskEligible` and the
|
|
62
|
+
`TEXTING_ASK_*` constants. On the web the chat loads `@everfur/sdk/web/texting` lazily, only when the ask can show.
|
|
63
|
+
The hosted frame has no texting, so its chat never asks.
|
|
64
|
+
- **`EverfurTextingPrompt` is a centred card, and closing it hands the ask to the chat.** The pop-up now sits in the
|
|
65
|
+
middle of the screen with every corner rounded (it fades in on React Native), clear of a host's bottom navigation,
|
|
66
|
+
instead of a sheet from the bottom edge. Closing it ("Not now", Escape, the back gesture or a press outside) still
|
|
67
|
+
counts one ask, and the chat then shows its line once after the member's next completed answer in that session, as
|
|
68
|
+
the same ask. The chat's "Not now" restarts the two days without counting another ask.
|
|
69
|
+
|
|
70
|
+
- **Health Plan, Raph's round 5 (web and React Native).** The vet is one setting, drawn from the plan page's byline.
|
|
71
|
+
A plan that is missing records shows her three blanks card with its records facts, then "Asked" once the records
|
|
72
|
+
request is out and a one-time flash when they land. The tabs share two plan signals across entries
|
|
73
|
+
(`setHealthPlanNoVet` / `onHealthPlanNoVet`, `notifyHealthPlanRecordsLanded` / `onHealthPlanRecordsLanded`), so the
|
|
74
|
+
intro's no-vet choice and a landed request reach the plan. A pick whose pet has no weight yet keeps an empty dose
|
|
75
|
+
blank from the page's new `doseLabel`. The Manage sheet links to her orders. React Native draws Raph's plan icons
|
|
76
|
+
from a generated set (`RAPH_RN_PLAN_ICONS`), which the shop reuses.
|
|
77
|
+
- **Records follow our health tab (web and React Native).** On the web the records sheet follows our web app's health
|
|
78
|
+
tab at every width, phone and tablet tiers included: none, requested, processing and full, with the care rows, the
|
|
79
|
+
timeline count, the weight model and the sample peek. On React Native the sheet draws as our mobile app's Health
|
|
80
|
+
tab (`HubSections`): the pet hero and stage line, the request prompt and on-the-way tracker, weight, upcoming care,
|
|
81
|
+
record tiles and add-records card. A partial read failure shows a retry card, and the labs tile reads "--" while it
|
|
82
|
+
loads or fails. `RecordForwardItem` gains `careItemKey` and `dueDateSource`.
|
|
83
|
+
- **One first-open pop-up at a time.** While the tabs read "seen" and while the intro is up, `EverfurTextingPrompt`
|
|
84
|
+
waits; it may show after the intro closes.
|
|
85
|
+
- **`onRequestFromClinic` and `noVet` on the records surfaces.** New `EverfurRecordsPage` props (web) and
|
|
86
|
+
`EverfurRecordsSheetOptions` fields (React Native): `onRequestFromClinic` runs your own clinic request in place of
|
|
87
|
+
the records flow's clinic picker (on React Native it is told `{ petRef }`; a rejected promise is not reported), and
|
|
88
|
+
`noVet` gives the no-records title its no-vet words. `EverfurRecordsSheetOptions.active` (React Native, default
|
|
89
|
+
true) is for a host that keeps the sheet mounted while hidden: while false it takes no Android back. The tab shells
|
|
90
|
+
pass all three.
|
|
91
|
+
|
|
92
|
+
### Changed
|
|
93
|
+
|
|
94
|
+
- The React Native records sheet's `copy` option is deprecated and ignored: its one field, `undatedPill`, is no longer
|
|
95
|
+
drawn.
|
|
96
|
+
- `HealthPlanFocusCopy` (web and React Native) gained required members for round 5 (`builtWith`, `fromVet`,
|
|
97
|
+
`callAVet`, `callYourVet`, `saveForCheckup`, `savedForCheckup`, `recordsLanded`, `noPick`, `signalsFit`,
|
|
98
|
+
`signalsValue`, `waitVetTips`, `blankEmpty` and the `blanks*` lines). A type-level change only for a host that
|
|
99
|
+
builds a whole `HealthPlanFocusCopy` object; a `Partial` override, as `copy` takes it, is unaffected.
|
|
100
|
+
- Default-on looks: `EverfurRecordsPage` (web) draws the sheet as our web app's health tab, and `EverfurRecords`
|
|
101
|
+
(React Native) as our mobile app's Health tab, with no new prop; the compact `EverfurChat` composer takes Raph's
|
|
102
|
+
`.ph-askbar` insets on both hosts. `sheet={false}` keeps the classic records page.
|
|
103
|
+
- The intro's "Upload a PDF or a photo instead" closes the intro and then runs the upload; inside the tabs with no
|
|
104
|
+
host upload it opens Records.
|
|
105
|
+
- Health Plan sheets close on Escape one layer at a time and move focus to their title; pushed screens (cart,
|
|
106
|
+
orders, order, placed) focus their own section on open.
|
|
107
|
+
- Bundle budgets: `@everfur/sdk/records` 145,900, `@everfur/sdk/health-plan` 72,200, `@everfur/sdk/shop` 79,800,
|
|
108
|
+
`@everfur/sdk/tabs` 47,200; web `index.js` 121,400, `web/records-sheet` 63,100, `web/health-plan` 69,800,
|
|
109
|
+
`web/intro` 33,500; `dist-cdn/records-frame.js` 257,300 bytes.
|
|
110
|
+
|
|
111
|
+
### Fixed
|
|
112
|
+
|
|
113
|
+
- The texting pop-up also waits while the host is still reading who is signed in or its pets (at most 5 seconds,
|
|
114
|
+
phone-sized pages only), and one that opened before the intro steps aside while the intro plays.
|
|
115
|
+
- Records landing by any path, including `notifyHealthPlanRecordsLanded` from the host, clear the pet's no-vet state.
|
|
116
|
+
- Health Plan styles (web) are kept under React StrictMode: nodes mounted after the simulated unmount were unstyled.
|
|
117
|
+
- The intro (web) no longer mixes a `transition` shorthand with its longhands, which made React warn on close.
|
|
118
|
+
- The tabs (web and React Native) no longer hold the first-open pop-up for ever: a failed plan read, a probe or intro
|
|
119
|
+
chunk that does not load, or reads that take more than 5 seconds let the intro go for that open. On the web, when
|
|
120
|
+
the intro's chunk does not load, Records' "Request from her clinic" runs the records page's own clinic flow.
|
|
121
|
+
- No vet yet is set only when the member closes the intro from its no-vet frame, is kept per pet, and clears once a
|
|
122
|
+
clinic request is sent or her records are in.
|
|
123
|
+
- The intro (web) gives focus back once it is down: to the tab it closed onto inside `EverfurTabs`, else to where it
|
|
124
|
+
was.
|
|
125
|
+
- A Health Plan or records pane chunk that fails to download (web tabs) draws an empty pane instead of throwing up
|
|
126
|
+
the host's tree; while loading it is marked busy for assistive tech.
|
|
127
|
+
- A hidden Records tab (React Native) no longer takes the Android back from the screen the member is on.
|
|
128
|
+
- The records sheet (web and React Native) and the plan's three blanks catch their clock up when shown again and
|
|
129
|
+
hourly, instead of keeping the time of their first render.
|
|
130
|
+
- The tabs' toast (web) is announced: one live region stays mounted and the toast's words are written into it.
|
|
131
|
+
- A clinic picked again after Back in the intro reuses its idempotency key, so a send still on its way is not made
|
|
132
|
+
twice.
|
|
133
|
+
- The plan and intro signals shared on `globalThis` are checked for their shape and replaced when another script left
|
|
134
|
+
something else under the key.
|
|
135
|
+
- Health Plan: a vet-reviewed page whose backend sends no byline keeps 0.13.0's byline (web); a host passing
|
|
136
|
+
`recordsMissing` or `recordsBlanks` again reads no records, 0.13.0's rule (web and React Native); the vet's note
|
|
137
|
+
keeps a `kicker` from the wire for older hosts.
|
|
138
|
+
|
|
139
|
+
## [0.13.0] - 2026-10-21
|
|
140
|
+
|
|
141
|
+
### BREAKING
|
|
142
|
+
|
|
143
|
+
Measured against 0.12.1 and `origin/main` with the api-extractor reports: no export was removed or renamed. These
|
|
144
|
+
are the changes a 0.12 integration can notice, with one migration line each.
|
|
145
|
+
|
|
146
|
+
- **The v3 look is the default (presentation).** A partner that set nothing now gets the chat cards, the history
|
|
147
|
+
sheet, the focus card, the Health Plan focus layout and the records sheet. Migration: set the older value per field
|
|
148
|
+
(`chatAnswerStyle: 'bubbles'`, `chatHistoryStyle: 'drawer'`, `chatTopCard: 'none'`,
|
|
149
|
+
`healthPlanLayout: 'standard'`, `recordsTopRiskLine: false`) in the console or in `presentation`.
|
|
150
|
+
- **`EverfurRecordsPage` draws the records sheet by default (web).** Migration: pass `sheet={false}` to keep the
|
|
151
|
+
classic page; pass `sheet={recordsSheet(options)}` from `@everfur/sdk/web/records-sheet` to configure it.
|
|
152
|
+
- **Records sheet types live on `@everfur/sdk/web/records-sheet`.** `EverfurRecordsSheetOptions`,
|
|
153
|
+
`EverfurRecordsLabDetail` and the sheet's style exports (prerelease builds only; never in a published version).
|
|
154
|
+
Migration: import them from `@everfur/sdk/web/records-sheet`, and pass the built sheet, not the options, to `sheet`.
|
|
155
|
+
- **`HealthPlanFocusIcon` has more names** (`box`, `cart`, `minus`, `plus`, `chev`, `pulse`, `file`, `kit`, `dna`,
|
|
156
|
+
`heart` and others). Migration: a `renderIcon` that switches over every name needs a `default` branch that
|
|
157
|
+
returns an icon of yours (null draws none).
|
|
158
|
+
- **`HealthPlanFocusOverlay` has more screens** (`cart`, `cartCheckout`, `placed`, `orders`, `order`, `weight`).
|
|
159
|
+
Migration: an `onOverlayChange` that switches over every value needs a `default` branch (use `controls.title` and
|
|
160
|
+
`controls.back` for the header).
|
|
161
|
+
- **`HealthPlanFocusPart` has more parts.** Migration: a `Record<HealthPlanFocusPart, string>` of your own becomes
|
|
162
|
+
`Partial<Record<HealthPlanFocusPart, string>>` (as `HealthPlanFocusClassNames` already is).
|
|
163
|
+
- **The shop is on with Everfur checkout.** With `checkout: "everfur_stripe"` Buy becomes Add to cart. Migration:
|
|
164
|
+
`focus.shop: false` keeps Buy and Subscribe going straight to Stripe Checkout. On React Native the shop and the
|
|
165
|
+
Stripe trip also need a valid https `focus.checkoutReturnUrl`; without one Buy keeps your `onBuy` / `onCheckout`.
|
|
166
|
+
- **`HEALTH_PLAN_COPY.emptyTitle` / `emptyBody` are empty strings** (were `[copy needed: ...]` markers), with a new
|
|
167
|
+
`emptyAsk`. Migration: pass your own words through `emptyCopy`, or hide your tab on `onAvailability(false)`.
|
|
168
|
+
|
|
169
|
+
### Changed
|
|
170
|
+
|
|
171
|
+
- **Everfur's v3 design is the default look for every partner (presentation defaults).** With nothing set, the chat
|
|
172
|
+
draws answers as cards, past chats in a bottom sheet, the compact composer with the pet's name in the placeholder,
|
|
173
|
+
the past-chats bar scrolling with the thread and the focus card over an empty chat; the Health Plan uses the focus
|
|
174
|
+
layout; Records shows the top risk line and the clear-results filter. Nothing extra draws without its data (no
|
|
175
|
+
focus, no card; no pet name, the generic placeholder). Set the older value per field to keep the older look
|
|
176
|
+
(`bubbles`, `drawer`, `none`, `standard`, `generic`, `pinned`, `false`).
|
|
177
|
+
- **Focus card look (web).** The chat's top card draws Raph's v3 card inline (CSP safe) with the partner's primary,
|
|
178
|
+
link ink and brand wash (`v3Palette`), and Everfur's neutrals and risk colours; on a dark theme the theme's own
|
|
179
|
+
neutrals. A host class on a part still replaces that part's style. `healthPlanTopCard` keeps the close control when
|
|
180
|
+
the pet has neither a sex nor a name (named "Close"), and reads the sex in any case.
|
|
181
|
+
- **Daily message cap.** A 429 `ThrottlingException` that carries `daily_limit` (the backend's daily cap) is now
|
|
182
|
+
`quotaExceeded` (not retried, "You have used today's messages") instead of `rateLimited`.
|
|
183
|
+
- **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;
|
|
184
|
+
the chips without a species word stay.
|
|
185
|
+
- **The v3 records sheet is `EverfurRecordsPage`'s default look (web).** Without a `sheet` prop the page loads
|
|
186
|
+
`@everfur/sdk/web/records-sheet` on first mount (its loading state meanwhile, the classic page if the entry
|
|
187
|
+
cannot load); `sheet={false}` keeps the classic page. The records frame bundles the sheet. The sheet paints in
|
|
188
|
+
the partner's `primary` and `accent` (new option `palette`, `'raph'` keeps Raph's colours), takes the pronoun
|
|
189
|
+
from the pet's sex, says "your pet" for a pet with no name, shows a species-aware sample, the medications taken
|
|
190
|
+
now, the Health Plan top risk line (`topRiskLine`, `onOpenPlan`), lines for missing labs, visits and a single
|
|
191
|
+
weight, and a failed request's status. New page props `weightUnit` (`'lb'` default, `'kg'`) and `onOpenPlan`.
|
|
192
|
+
- The vendored platform contract and error registry are regenerated from EFBackend main (contract-public digest
|
|
193
|
+
242b9d30).
|
|
194
|
+
- Bundle budgets: `dist-cdn/frame.js` 178,400 and `dist-cdn/records-frame.js` 208,100 bytes; `@everfur/sdk/shop`
|
|
195
|
+
54,600 bytes gzip.
|
|
196
|
+
|
|
197
|
+
### Added
|
|
198
|
+
|
|
199
|
+
- **The Care shop over the Everfur OMS (`@everfur/sdk/web/shop` and `@everfur/sdk/shop`), two new subpaths.**
|
|
200
|
+
`EverfurShop` renders the package, shop, product, Rx product, plan, orders and tracking screens, plus minimal
|
|
201
|
+
address, card, buy and consent steps whose copy is still placeholder keys (`SHOP_COPY_PLACEHOLDERS`). The shop stays
|
|
202
|
+
hidden until shop-config answers 200; a 404 or a signed-out host renders nothing and calls `onUnavailable`. Also
|
|
203
|
+
exported: `createOmsClient` (consumer auth via `getToken` per request, idempotency keys kept across
|
|
204
|
+
network/timeout/5xx retries), `newIdempotencyKey`, `isOmsRefusal`, `isOmsRetryable`, `isOmsUnavailable`,
|
|
205
|
+
`createOmsPackageSource`, `UNAVAILABLE_PACKAGE_SOURCE`, `SHOP_COPY` and `shopCopy`. The web entry adds
|
|
206
|
+
`createStripeJsPayments` and the `EverfurShopProps.cardHandoff` (`ShopCardHandoff | null`) and
|
|
207
|
+
`EverfurShopProps.cardReturn` (`ShopCardReturn | null`, `{ step: 'card' | 'cardAction', outcome: 'done' |
|
|
208
|
+
'closed' | 'failed' }`) props, so the card setup and 3-D Secure steps can leave the page and come back. The React
|
|
209
|
+
Native entry adds `shopBackRoute`, `ShopSwitchCard`, `createInAppBrowserCardSetup`, `createInAppBrowserPayments`
|
|
210
|
+
and `createInAppBrowserCard` (EFBackend's hosted card pages in the host's in-app browser, https only, no secret in
|
|
211
|
+
the URL, no native dependency) through the new `payments` prop. Closing the browser settles as `{ ok: false,
|
|
212
|
+
closed: true }` (`payerActionClosed`), not a failure. A confirm or approval that returns an order goes to that
|
|
213
|
+
order's page, where Pay resumes the same order; it never drafts a second checkout.
|
|
214
|
+
- **Texting opt-in (`@everfur/sdk/texting`, `@everfur/sdk/web/texting`), new subpaths.** `EverfurTextingOptIn`,
|
|
215
|
+
`TextingController`, the phone helpers (`isE164`, `toTextingE164`, `parseTextingProfile`, `formatTextingPhone`)
|
|
216
|
+
and `copy` / `brandCopy` overrides over `TEXTING_COPY` and `TEXTING_BRAND_COPY`.
|
|
217
|
+
- **Health Plan (`@everfur/sdk/health-plan`, `@everfur/sdk/web/health-plan`), new subpaths.** `EverfurHealthPlan`,
|
|
218
|
+
`HealthPlanItemCard`, `HealthPlanCartBar`, `HealthPlanController`, the cart dock (`HealthPlanCartScope`,
|
|
219
|
+
`useHealthPlanCartDock`) and the `cartBar`, `planCard` and `planReasonLabel` slots, with slot keys matched to the
|
|
220
|
+
backend paint keys. Generic styling hooks; defaults unchanged.
|
|
221
|
+
- **Server helpers on `@everfur/sdk/server`:** `sendMemberText`, `replaceCatalog` (opt-in `confirmEmpty` and
|
|
222
|
+
`confirmShrink`) and `mergeCatalog`. The catalog replace's `catalog_empty_refused` and `catalog_shrink_refused` 409s fold to
|
|
223
|
+
`validationFailed`.
|
|
224
|
+
- Chat starter prompts, header and empty header slots; records page upcoming care and history tiles;
|
|
225
|
+
`useUpcomingTelevetVisit`. The `linked_account_read_only` 409 folds to `conflict`.
|
|
226
|
+
- `EverfurChat` `initialAskKey` lets an initial ask repeat and survive a chat that is not ready yet. The televet frame
|
|
227
|
+
protocol carries optional `petName` and `ownerName`.
|
|
228
|
+
- **Records sheet on its own entry (`@everfur/sdk/web/records-sheet`).** `recordsSheet(options)` builds the v3
|
|
229
|
+
records sheet and its lab result screen for `EverfurRecordsPage`'s `sheet` prop. The sheet code left
|
|
230
|
+
`@everfur/sdk/web/records`, so a records page without the sheet downloads none of it. The `sheet` prop now takes
|
|
231
|
+
the built sheet (`EverfurRecordsSheet`) instead of the options; `EverfurRecordsSheetOptions`,
|
|
232
|
+
`EverfurRecordsLabDetail` and the sheet's style exports moved to the new entry.
|
|
233
|
+
- **Health Plan cart, quantities and order tracking (`@everfur/sdk/web/health-plan`).** With Everfur checkout the
|
|
234
|
+
shop's cart checks several products and boxes out in one session (`startCartCheckout`, items[] with quantity),
|
|
235
|
+
falls back to one product per checkout on `409 cart_disabled` (`healthPlanCheckoutRefusal`), and keeps a
|
|
236
|
+
subscription for its own checkout. The return lists every order (`HealthPlanCheckoutState.orders`, each with
|
|
237
|
+
`quantity` and `total`). Orders draw the partner's tracking (`HealthPlanOneBoxOrder.tracking`) and page through
|
|
238
|
+
`listOneBoxOrderPage`. New copy keys `cartSubscriptionApart`, `placedArrives`, `moreOrders`, `trackLink`.
|
|
239
|
+
- **Chat send button (`chat_send_button` presentation field, web).** `always_dark` (the default) draws Send dark
|
|
240
|
+
even while the box is empty; `dim_when_empty` keeps the earlier dim look.
|
|
241
|
+
- **Health Plan focus layout shows the whole plan (`@everfur/sdk/web/health-plan`).** After the pick, the pet's other
|
|
242
|
+
plan items follow in plan order as product cards, each with its own Buy one box: the partner's handoff (`onBuy`, else
|
|
243
|
+
`onCheckout([item])`), or a one-box Stripe Checkout for that item when the plan page says
|
|
244
|
+
`checkout: "everfur_stripe"`; each press sends `health_plan.checkout_started`. New `HealthPlanFocusProps.others`
|
|
245
|
+
and the `others` and `other` parts in `HealthPlanFocusClassNames`; the cards reuse the pick's parts. A host
|
|
246
|
+
`design` with a pick shows the others too.
|
|
247
|
+
- **Health Plan page and Everfur checkout (`@everfur/sdk/web/health-plan`), opt-in.** `EverfurHealthPlan` with
|
|
248
|
+
`focus` options and no `design` reads the pet's plan page (`GET .../plan/page`) and draws the focus layout from it;
|
|
249
|
+
`focus`, `routine` and `signs` are now optional in `HealthPlanFocusDesign`. When the page says
|
|
250
|
+
`checkout: "everfur_stripe"`, Buy one box and Subscribe redirect to Stripe Checkout and the return polls the
|
|
251
|
+
checkout into the started screen. New `focus.copy`, `focus.navigate`, `focus.pageRepository`,
|
|
252
|
+
`useHealthPlanPage`, `createHealthPlanPageRepository` and the page wire mappers (also on
|
|
253
|
+
`@everfur/sdk/health-plan`). A host `design` and `checkout: "partner"` behave as before.
|
|
254
|
+
- **Health Plan subscriptions on the web (`@everfur/sdk/web/health-plan`), all opt-in.** `EverfurHealthPlan`
|
|
255
|
+
takes a `focus` design (one recommended product, the host's words) and, with `subscriptions`, reads the quote:
|
|
256
|
+
every 60, 90 or 120 days, first box vs regular price, buy one box, a confirm sheet with the renewal terms, and
|
|
257
|
+
manage (change interval, skip, cancel, restart). A 404 quote hides all of it and keeps the one-time checkout
|
|
258
|
+
handoff. Writes carry an Idempotency-Key per tap. Follows EFBackend PR #2131 (switch
|
|
259
|
+
`partner.shop_subscriptions_enabled`, off by default).
|
|
260
|
+
- **Layout settings from the console (`render_hints.branding.presentation`), all opt-in.** Eleven fields (answer
|
|
261
|
+
style, history style, top card, follow-up count and televet exclusion, composer mic and upload, disclaimer
|
|
262
|
+
placement, Health Plan layout, two records options) resolved per field: an explicit prop wins, a field locked as
|
|
263
|
+
`presentation` or `presentation.<field>` stays with the console. Absent means today's behavior. New
|
|
264
|
+
`EverfurChat` props `presentation`, `answerCards` (answer cards with sources and feedback), `topCard` and
|
|
265
|
+
`historySheet` (a bottom sheet with previews), `EverfurHealthPlan` `presentation`, and
|
|
266
|
+
`useEverfurPresentation`. The `focus` design now draws only while `health_plan_layout` is `focus_plan`.
|
|
267
|
+
- Layout settings, round 2 (EFBackend #2132): `chatComposerStyle` (`compact`), `chatComposerPlaceholder`
|
|
268
|
+
(`pet_name`), `chatHistoryBar` (`scroll`) and `chatGeneralBanner` (`false` hides only the general banner), same
|
|
269
|
+
precedence and defaults (no change unless set). An answer card can carry `render` (the host card slot).
|
|
270
|
+
- `ChatConversation.preview` (the conversation list's last answer, up to 140 characters) when the server sends it.
|
|
271
|
+
- `HealthPlanTopRisk` and `NotificationStack` (web) for a host's own risk card and push list.
|
|
272
|
+
- `EverfurChat` `renderEmptyHeader`, `emptyState` (title and part classNames for the empty start), `followUpPolicy`, `historyBar` and `initialAskCard`.
|
|
273
|
+
- Server events: `health_plan.box_due` and `health_plan.one_box_ordered`, webhook only, with typed payloads.
|
|
274
|
+
- **Health Plan funnel events on your `telemetry` port.** `health_plan.opened`, `health_plan.product_clicked` and
|
|
275
|
+
`health_plan.checkout_started`, with pet and product ids, counts and the cart total only. Nothing is sent without
|
|
276
|
+
a `telemetry` sink. Documented in chapter 18.
|
|
277
|
+
|
|
278
|
+
### Fixed
|
|
279
|
+
|
|
280
|
+
- A `409 records_consent_required` on the request documents read no longer shows the generic conflict line with a
|
|
281
|
+
retry; the list renders nothing, as when empty.
|
|
282
|
+
- The Health Plan kicker and price line no longer read "Ships every 0 days" without a subscription quote; they use the
|
|
283
|
+
existing ships-once copy.
|
|
284
|
+
- The Health Plan focus layout's buy button sends `health_plan.checkout_started`.
|
|
285
|
+
- Partner tabs audit fixes: cards-mode chat answers keep line breaks and lists; the web thread refreshes on return
|
|
286
|
+
under the default browser lifecycle; the history bar count waits for the full list; the televet follow-up filter
|
|
287
|
+
matches only visit phrases; the records consent grant has a busy state and shows errors; documents sort newest
|
|
288
|
+
first; the marker carousel puts the featured marker first; the texting resend keeps the code step; the Health Plan
|
|
289
|
+
revalidates quietly on return.
|
|
290
|
+
- **A Health Plan partner with no plan page keeps its plan.** In the focus layout, a plan with products whose plan
|
|
291
|
+
page is missing (404), null or refused draws the standard product list with its cart and the host's `onCheckout`
|
|
292
|
+
(web and React Native), and says available. Only a plan with no products is no plan.
|
|
293
|
+
- **One plan page read per pet.** The chat's focus card, the records sheet and the Health Plan share one in-flight
|
|
294
|
+
`GET .../plan/page` and its answer for 5 seconds; a retry or a re-read after a write is fresh. The chat (web and
|
|
295
|
+
React Native) and the React Native records sheet read it only with the `healthPlan` capability.
|
|
296
|
+
- **React Native Everfur checkout without a return URL.** Buy keeps the partner's handoff instead of drawing nothing.
|
|
297
|
+
- **v3 colours on any partner palette.** The link ink, the badge ink and the labels on primary and accent read at
|
|
298
|
+
4.5:1 on Raph's card, paper and tile for every partner palette; Everfur's own values are unchanged.
|
|
299
|
+
- **Consent required is no longer a dead end on `EverfurRecordsPage` and `EverfurRecordsDashboard`.** The grant
|
|
300
|
+
gates reading record content only, so with the read answering consent required the page keeps its header
|
|
301
|
+
(`Request records`, the upload action) and its requests section with the upload prompt, and the dashboard keeps
|
|
302
|
+
the first-record prompt or the in-progress card with their ways to add records. `Allow` with the consent text is
|
|
303
|
+
drawn under them only when a `consentVersion` was passed. Before, both drew only "Consent required".
|
|
304
|
+
|
|
13
305
|
## [0.12.1] - 2026-10-08
|
|
14
306
|
|
|
15
307
|
### Changed
|
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.
|
|
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. -->
|
|
@@ -59,11 +59,11 @@ shipping the minter to a device. Import it from your server only.
|
|
|
59
59
|
### On the web
|
|
60
60
|
|
|
61
61
|
Two ways, one wire contract, documented in
|
|
62
|
-
[docs/partner-integration/13-WEB-INTEGRATION.md](https://
|
|
62
|
+
[docs/partner-integration/13-WEB-INTEGRATION.md](https://docs.everfur.com/web/):
|
|
63
63
|
|
|
64
64
|
- **In-page**, for a page whose React tree you own: `import { EverfurProvider, EverfurChat } from
|
|
65
65
|
'@everfur/sdk/web'` (peers: `react`, `react-dom`). The copy-paste shape is
|
|
66
|
-
[`examples/minimal-web.tsx`](https://
|
|
66
|
+
[`examples/minimal-web.tsx`](https://docs.everfur.com/web/#web--1-in-page-everfur-sdk-web). Take the `/web` entry, not the package root: the
|
|
67
67
|
root is the React Native entry and imports `react-native` and `react-native-safe-area-context`, so in a
|
|
68
68
|
browser project it fails to resolve them rather than rendering. The `/web` entries need `react`,
|
|
69
69
|
`react/jsx-runtime` and `zod` and nothing native, which `npm run verify:pack` proves on every CI run by
|
|
@@ -71,7 +71,7 @@ Two ways, one wire contract, documented in
|
|
|
71
71
|
- **Frame mode**, for a page you do not fully control (a storefront theme, a CMS page): one `<script
|
|
72
72
|
src="https://sdk.everfur.com/v1/everfur.js">` puts the surface in an iframe on `sdk.everfur.com`, and
|
|
73
73
|
the frame refuses to initialise on any page origin your tenant has not registered. The copy-paste shape
|
|
74
|
-
is [`examples/frame-embed.html`](https://
|
|
74
|
+
is [`examples/frame-embed.html`](https://docs.everfur.com/web/#web--the-snippet).
|
|
75
75
|
|
|
76
76
|
Chat and records are the web surfaces (records on its own subpath and its own frame document, available
|
|
77
77
|
when Everfur enables records for your account); photo and video remain React Native for now. Vet visits (available when Everfur enables them for your
|
|
@@ -83,7 +83,7 @@ and the call (`@everfur/sdk/televet/call`, `@everfur/sdk/web/televet/call`) are
|
|
|
83
83
|
are loaded on demand, so a page where nobody opens a visit downloads neither and a page where nobody joins takes
|
|
84
84
|
no WebRTC dependency; on React Native both are static imports in the same bundle (the WebRTC stack is the native
|
|
85
85
|
module your app registers with `registerEverfurDaily`).
|
|
86
|
-
[docs/partner-integration/16-TELEVET-VISITS.md](https://
|
|
86
|
+
[docs/partner-integration/16-TELEVET-VISITS.md](https://docs.everfur.com/vet-visits/).
|
|
87
87
|
|
|
88
88
|
## Quickstart
|
|
89
89
|
|
|
@@ -197,15 +197,17 @@ off-state, never a blank region.
|
|
|
197
197
|
| --- | --- |
|
|
198
198
|
| `@everfur/sdk` | `EverfurProvider`, `CapabilityGate`, `EverfurChat`, `useEverfurChat`, `CapabilityName`, error/result types, branded id helpers (`petRef`, `userRef`, `conversationId`) |
|
|
199
199
|
| `@everfur/sdk/records` | `EverfurRecords` (the Everfur app's records flow), the named screens (`EverfurRecordsUpload`, `EverfurRecordsRequests`, `EverfurRecordsRequest`, `EverfurRecordDetail`, ...), `EverfurClinicRequest`, `EverfurClinicRequestBatch`, `SignaturePad`, records hooks + types |
|
|
200
|
-
| `@everfur/sdk/records/depth`, `@everfur/sdk/web/records/depth` | record depth (the timeline, the withheld record sections, per-document contributions) on their own entries, dark until Everfur enables it per deployment; see [chapter 9](https://
|
|
200
|
+
| `@everfur/sdk/records/depth`, `@everfur/sdk/web/records/depth` | record depth (the timeline, the withheld record sections, per-document contributions) on their own entries, dark until Everfur enables it per deployment; see [chapter 9](https://docs.everfur.com/records/#records--record-depth-behind-a-separate-switch) |
|
|
201
201
|
| `@everfur/sdk/video` | gait / live-scan surface |
|
|
202
202
|
| `@everfur/sdk/photo` | photo checkup surface |
|
|
203
203
|
| `@everfur/sdk/animations` | server-driven pet-state media surface |
|
|
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
|
-
| `@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://
|
|
204
|
+
| `@everfur/sdk/web` | the browser entry: `EverfurProvider`, `CapabilityGate`, `EverfurChat`, `useEverfurChat`, `EverfurTabs` (Ask, Health Plan and Records in one shell, with the first-open intro), the theme hook, rendered with `react-dom`; withheld from React Native bundles the way `./server` is |
|
|
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://docs.everfur.com/web/#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://docs.everfur.com/web/#web--records-everfur-sdk-web-records) |
|
|
207
|
+
| `@everfur/sdk/web/intro` | the first-open intro `EverfurTabs` plays on a phone-narrow page (`EverfurIntro`, its clinic request frames, `EverfurRecordsLandedBanner`, `useEverfurIntroSeen`), downloaded only when it plays; withheld from React Native like `./web`; see [chapter 13](https://docs.everfur.com/web/#web--three-tabs-everfurtabs) |
|
|
206
208
|
| `@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
209
|
| `@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
|
-
| `@everfur/sdk/server/events` | **server-only, Node only** partner events (preview): `constructEvent` to verify webhooks, `sendPartnerEvent`; see [chapter 15](https://
|
|
210
|
+
| `@everfur/sdk/server/events` | **server-only, Node only** partner events (preview): `constructEvent` to verify webhooks, `sendPartnerEvent`; see [chapter 15](https://docs.everfur.com/webhooks/) |
|
|
209
211
|
| `@everfur/sdk/testing`, `@everfur/sdk/testing/rn`, `@everfur/sdk/testing/web` | test seams (`MockTransport`, `useEverfurTestEntitlements`, ...) for your own tests |
|
|
210
212
|
|
|
211
213
|
`@everfur/sdk/client` and `@everfur/sdk/core` expose the framework-free layers for advanced integrators;
|
|
@@ -214,7 +216,7 @@ most apps only need the root entry plus the capability subpaths.
|
|
|
214
216
|
## Reference app
|
|
215
217
|
|
|
216
218
|
A full, runnable integration (a fictional "Pawtrail" app plus a minimal mint backend that holds the secret)
|
|
217
|
-
lives at [`examples/minimal-integration.tsx`](https://
|
|
219
|
+
lives at [`examples/minimal-integration.tsx`](https://docs.everfur.com/quickstart/) in this repository; it is
|
|
218
220
|
type-checked by `npm run docs:check`, so it cannot rot. It shows anonymous mode, the two-credential session
|
|
219
221
|
mint, pet registration and sign-out. (A separate `everfur-integration-example-rn` app exists internally but
|
|
220
222
|
is not published anywhere a partner can reach, so do not rely on references to it.) It gates every
|
|
@@ -1,16 +1,143 @@
|
|
|
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.
|
|
4
|
-
import {
|
|
5
|
-
import { a as ChatCheckinTarget } from './ports-
|
|
6
|
-
import { W as WidgetPet, P as PetProfileInput } from './petsRepository-
|
|
7
|
-
import {
|
|
3
|
+
import { P as PetRef, C as ConversationId } from './ids.d-B2GAAifq.cjs';
|
|
4
|
+
import { i as EverfurPresentationInput } from './presentation.d-vy8kTGfR.cjs';
|
|
5
|
+
import { a as ChatCheckinTarget } from './ports.d-DBA_gsq5.cjs';
|
|
6
|
+
import { W as WidgetPet, P as PetProfileInput } from './petsRepository.d-B2TpRE7r.cjs';
|
|
7
|
+
import { E as EverfurStarterPrompt } from './quickPrompts.d-NM_81Jc1.cjs';
|
|
8
|
+
import { L as LifecyclePort } from './LifecyclePort.d-Cr1p33a7.cjs';
|
|
9
|
+
import { U as UrgencyDisplayLevel, E as EverfurChatDraftStore } from './attachments.d-DNUCiyy5.cjs';
|
|
10
|
+
import { F as FileHandle } from './ports.d-BX4f4UsB.cjs';
|
|
8
11
|
|
|
9
12
|
/** Where a picked image comes from: the host's photo library, or its camera. */
|
|
10
13
|
type AttachmentSource = 'photo' | 'camera';
|
|
11
14
|
|
|
12
|
-
/**
|
|
13
|
-
|
|
15
|
+
/**
|
|
16
|
+
* The history bar: a "Chats" control with the member's thread count that opens the history, and a "New chat"
|
|
17
|
+
* control. For a surface that hides the SDK header and still wants the member's past chats.
|
|
18
|
+
*/
|
|
19
|
+
interface EverfurChatHistoryBar {
|
|
20
|
+
/** The history control's words ("Chats"). */
|
|
21
|
+
readonly chats: string;
|
|
22
|
+
/** The new-chat control's words ("New chat"). */
|
|
23
|
+
readonly newChat: string;
|
|
24
|
+
/** Draw the two icons your way. */
|
|
25
|
+
readonly renderIcon?: (icon: 'history' | 'edit') => ReactNode;
|
|
26
|
+
/** Your own control after "Chats". Absent, nothing is drawn. */
|
|
27
|
+
readonly extra?: ReactNode;
|
|
28
|
+
}
|
|
29
|
+
/** The empty thread's own title and chip fills. Absent, the empty state is Everfur's own. */
|
|
30
|
+
interface EverfurChatEmptyState {
|
|
31
|
+
/** The title over the starter chips, in place of "What can we help {pet} with today?". */
|
|
32
|
+
readonly title?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Fills for the chips that bring none of their own, taken in turn (the first chip the first fill, and round
|
|
35
|
+
* again). Each is a fill and its ink. Absent, Raph's v3 cycle on a light theme; empty, the theme's paint.
|
|
36
|
+
*/
|
|
37
|
+
readonly chipTints?: readonly {
|
|
38
|
+
readonly tint: string;
|
|
39
|
+
readonly ink?: string;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
/** One card under an answer in the cards answer style: a record, a stat, or a link to one of your screens. */
|
|
43
|
+
interface EverfurChatAnswerCard {
|
|
44
|
+
/** Stable key within the answer. */
|
|
45
|
+
readonly key: string;
|
|
46
|
+
readonly title: string;
|
|
47
|
+
/** The small line under the title. */
|
|
48
|
+
readonly meta?: string;
|
|
49
|
+
/** A status pill. */
|
|
50
|
+
readonly pill?: {
|
|
51
|
+
readonly label: string;
|
|
52
|
+
readonly tone?: string;
|
|
53
|
+
};
|
|
54
|
+
/** A stat card's value: drawn in place of the pill and the chevron. */
|
|
55
|
+
readonly value?: {
|
|
56
|
+
readonly amount: string;
|
|
57
|
+
readonly unit?: string;
|
|
58
|
+
};
|
|
59
|
+
/** The tile at the start: an icon of yours, or an https image. */
|
|
60
|
+
readonly tile?: {
|
|
61
|
+
readonly icon?: ReactNode;
|
|
62
|
+
readonly imageUrl?: string;
|
|
63
|
+
readonly tone?: string;
|
|
64
|
+
};
|
|
65
|
+
readonly variant?: string;
|
|
66
|
+
/** Given, the card is a button that calls this. Absent, a static card. */
|
|
67
|
+
readonly onPress?: () => void;
|
|
68
|
+
/** A card of your own, drawn in the card's place. If it throws, the slot draws nothing. */
|
|
69
|
+
readonly render?: () => ReactNode;
|
|
70
|
+
}
|
|
71
|
+
/** What `answerCards.cards` receives: the settled answer's text and the question it answered. */
|
|
72
|
+
interface EverfurChatAnswerContext {
|
|
73
|
+
readonly answer: string;
|
|
74
|
+
readonly question: string | null;
|
|
75
|
+
/** The answer's message id, stable for the life of the thread. */
|
|
76
|
+
readonly messageId: string;
|
|
77
|
+
}
|
|
78
|
+
/** The cards answer style's content (used while presentation `chatAnswerStyle` is `cards`). The words are yours. */
|
|
79
|
+
interface EverfurChatAnswerCards {
|
|
80
|
+
/** The line over each answer (an icon and your words). Absent, the assistant's name line. */
|
|
81
|
+
readonly byline?: {
|
|
82
|
+
readonly label: string;
|
|
83
|
+
readonly icon?: ReactNode;
|
|
84
|
+
};
|
|
85
|
+
/** Your cards under a settled answer. A throw draws none. */
|
|
86
|
+
readonly cards?: (context: EverfurChatAnswerContext) => readonly EverfurChatAnswerCard[];
|
|
87
|
+
/** Two feedback chips in place of the footer's thumbs, mapped to thumbs up and thumbs down. */
|
|
88
|
+
readonly feedback?: {
|
|
89
|
+
readonly helpful: string;
|
|
90
|
+
readonly notHelpful: string;
|
|
91
|
+
};
|
|
92
|
+
/** Your own rows at the top of the follow-ups, for the answer it receives. */
|
|
93
|
+
readonly followUpActions?: (context: EverfurChatAnswerContext) => readonly EverfurChatFollowUpAction[];
|
|
94
|
+
/** Draw the chevron your way. Absent, Everfur's glyph. */
|
|
95
|
+
readonly renderIcon?: (icon: 'chevron') => ReactNode;
|
|
96
|
+
}
|
|
97
|
+
/** A row of yours at the top of the follow-ups under an answer. */
|
|
98
|
+
interface EverfurChatFollowUpAction {
|
|
99
|
+
readonly key: string;
|
|
100
|
+
readonly label: string;
|
|
101
|
+
readonly icon?: ReactNode;
|
|
102
|
+
readonly onPress: () => void;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The card at the top of the empty thread (presentation `chatTopCard: "focus"`): one finding, in your words, with
|
|
106
|
+
* an action of yours and a question it can ask in the thread. Its close control folds it into a pill.
|
|
107
|
+
*/
|
|
108
|
+
interface EverfurChatTopCard {
|
|
109
|
+
/** The small heading ("Her focus"). */
|
|
110
|
+
readonly kicker: string;
|
|
111
|
+
/** A source badge ("<your brand> results"). */
|
|
112
|
+
readonly badge?: string;
|
|
113
|
+
readonly title: string;
|
|
114
|
+
/** The finding: a bold lead and the rest of the sentence. */
|
|
115
|
+
readonly lead?: string;
|
|
116
|
+
readonly body?: string;
|
|
117
|
+
/** Your action ("See her Health Plan"). */
|
|
118
|
+
readonly action?: {
|
|
119
|
+
readonly label: string;
|
|
120
|
+
readonly onPress: () => void;
|
|
121
|
+
};
|
|
122
|
+
/** A question the card asks in this thread. */
|
|
123
|
+
readonly ask?: {
|
|
124
|
+
readonly label: string;
|
|
125
|
+
readonly prompt: string;
|
|
126
|
+
};
|
|
127
|
+
/** The close control's accessible name. Absent, the shared `Close`. */
|
|
128
|
+
readonly closeLabel?: string;
|
|
129
|
+
/** The pill's words while the card is closed (defaults to `kicker`). */
|
|
130
|
+
readonly pill?: string;
|
|
131
|
+
/** Draw the close glyph your way. */
|
|
132
|
+
readonly renderIcon?: (icon: 'close') => ReactNode;
|
|
133
|
+
}
|
|
134
|
+
/** The history bottom sheet (presentation `chatHistoryStyle: "sheet"`). */
|
|
135
|
+
interface EverfurChatHistorySheet {
|
|
136
|
+
/** The sheet's small title ("Chats with Ask <your brand>"). Absent, Everfur's history heading. */
|
|
137
|
+
readonly title?: string;
|
|
138
|
+
/** Draw the icons your way. */
|
|
139
|
+
readonly renderIcon?: (icon: 'close' | 'chat' | 'edit') => ReactNode;
|
|
140
|
+
}
|
|
14
141
|
|
|
15
142
|
/**
|
|
16
143
|
* The host's image picker for chat attachments. The SDK depends on no picker or camera module: open your own
|
|
@@ -30,6 +157,10 @@ interface EverfurChatAttachments {
|
|
|
30
157
|
/** Images per message; default 1 (the app's composer), at most 5 (the server's cap). */
|
|
31
158
|
readonly maxPerMessage?: number;
|
|
32
159
|
}
|
|
160
|
+
|
|
161
|
+
/** The host's own action for the two vet-care tiers, in place of Everfur's pill. */
|
|
162
|
+
type RenderVetAction = (level: UrgencyDisplayLevel) => ReactNode;
|
|
163
|
+
|
|
33
164
|
interface EverfurChatProps {
|
|
34
165
|
readonly petRef?: PetRef;
|
|
35
166
|
readonly conversationId?: ConversationId;
|
|
@@ -88,6 +219,12 @@ interface EverfurChatProps {
|
|
|
88
219
|
* conversation. Pass `composerSeed` instead when the user should decide whether to send it.
|
|
89
220
|
*/
|
|
90
221
|
readonly initialAsk?: string;
|
|
222
|
+
/**
|
|
223
|
+
* The identity of this `initialAsk`, when the same words can be asked again: your own id for each tap of an
|
|
224
|
+
* "Ask Everfur" pill or each push opened. A new key asks again even with the same words. Absent, the
|
|
225
|
+
* question's own words are the key, so the same question twice in a row is asked once.
|
|
226
|
+
*/
|
|
227
|
+
readonly initialAskKey?: string | number;
|
|
91
228
|
/**
|
|
92
229
|
* Text to put in the composer on arrival. It is never sent for the user: they edit it, send it or clear
|
|
93
230
|
* it. Only an empty composer is seeded, so nothing they typed is ever replaced.
|
|
@@ -149,6 +286,39 @@ interface EverfurChatProps {
|
|
|
149
286
|
* mount is about 15 pt short. Pass the hook's value from every render, never a copy taken at mount.
|
|
150
287
|
*/
|
|
151
288
|
readonly keyboardVerticalOffset?: number;
|
|
289
|
+
/**
|
|
290
|
+
* The layout settings (Raph v3): the answer style, the history style, the top card, the composer style and
|
|
291
|
+
* placeholder, the history bar's place, the general banner, the send button, the follow-up count and the upload
|
|
292
|
+
* control. Each also comes from your console (render_hints.branding.presentation); a field you set here wins
|
|
293
|
+
* unless the console locks it. `attachments` counts as your explicit `chatComposerUpload: true`. The microphone
|
|
294
|
+
* setting (`chatComposerMic`) has no control on this surface. `topCard`, `answerCards` and `historySheet` are
|
|
295
|
+
* content only and never switch a layout on by themselves.
|
|
296
|
+
*/
|
|
297
|
+
readonly presentation?: EverfurPresentationInput;
|
|
298
|
+
/**
|
|
299
|
+
* The focus card's content (drawn while `chatTopCard` resolves to `focus`). Absent, the card is built from the
|
|
300
|
+
* pet's Health Plan page focus; no page, no focus, a refused read or a page still loading draws no card.
|
|
301
|
+
*/
|
|
302
|
+
readonly topCard?: EverfurChatTopCard;
|
|
303
|
+
/** Opens the pet's Health Plan (your tab or screen): the plan-built focus card's `See her Health Plan` button. */
|
|
304
|
+
readonly onOpenHealthPlan?: () => void;
|
|
305
|
+
/** The cards answer style's content (used while `chatAnswerStyle` resolves to `cards`). */
|
|
306
|
+
readonly answerCards?: EverfurChatAnswerCards;
|
|
307
|
+
/** The history sheet's title and icons (used while `chatHistoryStyle` resolves to `sheet`). */
|
|
308
|
+
readonly historySheet?: EverfurChatHistorySheet;
|
|
309
|
+
/** The history bar ("Chats" and "New chat"); `chatHistoryBar: "scroll"` puts it at the top of the thread. */
|
|
310
|
+
readonly historyBar?: EverfurChatHistoryBar;
|
|
311
|
+
/** Your own starter chips, in place of the built-in four. */
|
|
312
|
+
readonly starterPrompts?: readonly EverfurStarterPrompt[];
|
|
313
|
+
/** The empty thread's title and chip fills. */
|
|
314
|
+
readonly emptyState?: EverfurChatEmptyState;
|
|
315
|
+
/**
|
|
316
|
+
* Whether the surface draws its own header bar (the history control, the pet and its switcher, the vet entry).
|
|
317
|
+
* Default `true`. Pass `false` when your own screen already has a header over chat (the web surface's `header`):
|
|
318
|
+
* the thread, the urgency banner and the composer are unchanged. Without the header, the history bar
|
|
319
|
+
* (`historyBar`) is the way into past chats.
|
|
320
|
+
*/
|
|
321
|
+
readonly header?: boolean;
|
|
152
322
|
}
|
|
153
323
|
/**
|
|
154
324
|
* Entitlement-gated, four-state chat surface. Entitlement-OFF renders the CapabilityGate OffState;
|
|
@@ -156,4 +326,4 @@ interface EverfurChatProps {
|
|
|
156
326
|
*/
|
|
157
327
|
declare function EverfurChat(props: EverfurChatProps): ReactNode;
|
|
158
328
|
|
|
159
|
-
export { type AttachmentSource as A, EverfurChat as E, type RenderVetAction as R, type
|
|
329
|
+
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 };
|