@everfur/sdk 0.6.0 → 0.7.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 +213 -0
- package/dist/{BookedScreen-BJPbXLCG.d.ts → BookedScreen-DFJcgf1e.d.ts} +12 -2
- package/dist/{BookedScreen-Cnld-jB_.d.cts → BookedScreen-R5X_Zrlh.d.cts} +12 -2
- package/dist/{Chat-CHqcgMyw.d.ts → Chat-DZpYH8Uh.d.ts} +4 -4
- package/dist/{Chat-BoAvCWhI.d.cts → Chat-bATY4atj.d.cts} +4 -4
- package/dist/{DepthViews-7Y8Ur058.d.ts → DepthViews-BpHUbjSY.d.cts} +1 -1
- package/dist/{DepthViews-B0g83e_N.d.cts → DepthViews-C4DC4Kom.d.cts} +1 -1
- package/dist/{DepthViews-Dg2bIon_.d.ts → DepthViews-dLTizxjr.d.ts} +1 -1
- package/dist/{DepthViews-CT5mQld9.d.cts → DepthViews-qBIoA48w.d.ts} +1 -1
- package/dist/animations/index.cjs +1 -1
- package/dist/animations/index.d.cts +3 -3
- package/dist/animations/index.d.ts +3 -3
- package/dist/animations/index.js +1 -1
- package/dist/{attachments-CfxsVg7W.d.ts → attachments-CPRFfoHT.d.ts} +2 -2
- package/dist/{attachments-rkox0ewd.d.cts → attachments-CUOGILir.d.cts} +5 -5
- package/dist/{attachments-CThFsH4b.d.ts → attachments-CXAnZcEg.d.ts} +5 -5
- package/dist/{attachments-C3HJNYQ7.d.cts → attachments-Ce06TWqe.d.cts} +2 -2
- package/dist/{bookingCopy-Do3zMeXb.d.cts → bookingCopy-BwVopcoV.d.cts} +451 -50
- package/dist/{bookingCopy-Y3OGdoMT.d.ts → bookingCopy-DFTv9w6J.d.ts} +451 -50
- package/dist/{bookingTypes-DCs8mmBb.d.cts → bookingTypes-D4pD3tHs.d.cts} +13 -1
- package/dist/{bookingTypes-DCs8mmBb.d.ts → bookingTypes-D4pD3tHs.d.ts} +13 -1
- package/dist/{branding-DYWma2il.d.ts → branding-Bio5MM6g.d.cts} +3 -3
- package/dist/{branding-ChXm8gxI.d.cts → branding-ytH4jJq1.d.ts} +3 -3
- package/dist/{callCopy-CPe9mbwG.d.cts → callCopy-DHjem0R-.d.cts} +12 -1
- package/dist/{callCopy-CPe9mbwG.d.ts → callCopy-DHjem0R-.d.ts} +12 -1
- package/dist/{casesRepository-Jj6t60AY.d.cts → casesRepository-CJchNp3x.d.cts} +1 -1
- package/dist/{casesRepository-BbgXYPxa.d.ts → casesRepository-DAVcY3jC.d.ts} +1 -1
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.d.cts +9 -9
- package/dist/chat/index.d.ts +9 -9
- package/dist/chat/index.js +1 -1
- package/dist/client/index.cjs +2 -2
- package/dist/client/index.d.cts +10 -10
- package/dist/client/index.d.ts +10 -10
- package/dist/client/index.js +2 -2
- package/dist/{config-Dfbj5mlx.d.ts → config-ZxwCylac.d.ts} +1 -1
- package/dist/{config-BZX97FmW.d.cts → config-h5h6TsHL.d.cts} +1 -1
- package/dist/consent/index.cjs +1 -1
- package/dist/consent/index.d.cts +5 -5
- package/dist/consent/index.d.ts +5 -5
- package/dist/consent/index.js +1 -1
- package/dist/{context-DJXnZ1Mx.d.cts → context-CtsAgJnc.d.cts} +7 -7
- package/dist/{context-Cbe0zYym.d.ts → context-DtPIshVA.d.ts} +7 -7
- package/dist/{copy-dKK5KoAQ.d.cts → copy-CaWaplQc.d.cts} +2 -2
- package/dist/{copy-DHekqSKE.d.ts → copy-Cg89Qoal.d.ts} +2 -2
- package/dist/core/index.cjs +7 -7
- package/dist/core/index.d.cts +21 -21
- package/dist/core/index.d.ts +21 -21
- package/dist/core/index.js +7 -7
- package/dist/{depth-CrpRjWGB.d.ts → depth-Bo4bAwcn.d.ts} +132 -38
- package/dist/{depth-NmWSbvfi.d.cts → depth-EXZYEO70.d.cts} +132 -38
- package/dist/{entitlementRepository-iL-9vS1i.d.cts → entitlementRepository-BYtVb1oU.d.cts} +3 -3
- package/dist/{entitlementRepository-tVNazi8R.d.ts → entitlementRepository-DcbIx8yV.d.ts} +3 -3
- package/dist/{identity-B8rp0L9G.d.ts → identity-EC5-apbY.d.ts} +1 -1
- package/dist/{identity-D7PO5s9m.d.cts → identity-b5Vp32Vp.d.cts} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.d.cts +17 -17
- package/dist/index.d.ts +17 -17
- package/dist/index.js +6 -6
- package/dist/notifications/index.d.cts +2 -2
- package/dist/notifications/index.d.ts +2 -2
- package/dist/{pets-BQbXmICf.d.ts → pets-B_27_agU.d.ts} +1 -1
- package/dist/{pets-BWx9BKea.d.cts → pets-DM8QvKLo.d.cts} +1 -1
- package/dist/{petsRepository-SqIvEMiT.d.cts → petsRepository-BJsJ4cju.d.cts} +1 -1
- package/dist/{petsRepository-0oBVydl6.d.ts → petsRepository-CuYZZaI5.d.ts} +1 -1
- package/dist/photo/index.cjs +1 -1
- package/dist/photo/index.js +1 -1
- package/dist/{ports-ChnzSy4E.d.cts → ports-ZmJYgd5I.d.cts} +10 -9
- package/dist/{ports-iXPWd7Vt.d.ts → ports-nXHf50_X.d.ts} +10 -9
- package/dist/records/depth/index.cjs +2 -2
- package/dist/records/depth/index.d.cts +7 -7
- package/dist/records/depth/index.d.ts +7 -7
- package/dist/records/depth/index.js +2 -2
- package/dist/records/index.cjs +3 -3
- package/dist/records/index.d.cts +19 -10
- package/dist/records/index.d.ts +19 -10
- package/dist/records/index.js +3 -3
- package/dist/{requestFunnel-DAwb7haa.d.cts → requestFunnel-C_cZXhIA.d.cts} +2 -2
- package/dist/{requestFunnel-CQzz2DIW.d.ts → requestFunnel-Ve9BshTB.d.ts} +2 -2
- package/dist/{runtimeTypes-BNOxfmfg.d.ts → runtimeTypes-ByKsp8hm.d.ts} +5 -5
- package/dist/{runtimeTypes-DB9-kigO.d.cts → runtimeTypes-D155OlBW.d.cts} +5 -5
- package/dist/server/events/index.cjs +1 -1
- package/dist/server/events/index.d.cts +2 -2
- package/dist/server/events/index.d.ts +2 -2
- package/dist/server/events/index.js +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +1 -1
- package/dist/televet/booking/index.cjs +4 -1
- package/dist/televet/booking/index.d.cts +116 -29
- package/dist/televet/booking/index.d.ts +116 -29
- package/dist/televet/booking/index.js +4 -1
- package/dist/televet/call/index.cjs +1 -1
- package/dist/televet/call/index.d.cts +1 -1
- package/dist/televet/call/index.d.ts +1 -1
- package/dist/televet/call/index.js +1 -1
- package/dist/televet/index.cjs +1 -1
- package/dist/televet/index.js +1 -1
- package/dist/testing/index.cjs +3 -3
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +3 -3
- package/dist/testing/rn/index.cjs +1 -1
- package/dist/testing/rn/index.d.cts +14 -12
- package/dist/testing/rn/index.d.ts +14 -12
- package/dist/testing/rn/index.js +1 -1
- package/dist/testing/web/index.d.cts +9 -9
- package/dist/testing/web/index.d.ts +9 -9
- package/dist/{timelineRows-BuNhzDbH.d.cts → timelineRows-BNF43SXK.d.cts} +1 -1
- package/dist/{timelineRows-Dll2IGFg.d.ts → timelineRows-DXpjECfA.d.ts} +1 -1
- package/dist/{tokens-ARWZtMOU.d.cts → tokens-BYtbKwFh.d.cts} +6 -3
- package/dist/{tokens-ARWZtMOU.d.ts → tokens-BYtbKwFh.d.ts} +6 -3
- package/dist/{typeStyle-YCS8dt19.d.cts → typeStyle-BqfwxZH4.d.cts} +2 -2
- package/dist/{typeStyle-8iEqQmP_.d.ts → typeStyle-DKz02DGU.d.ts} +2 -2
- package/dist/{uploadTransport-C1p8FuG8.d.cts → uploadTransport-BM_pnEWj.d.cts} +5 -0
- package/dist/{uploadTransport-bZIKBTyK.d.ts → uploadTransport-C6kGP1Kd.d.ts} +5 -0
- package/dist/{useRecordsDepth-CNEHZJtj.d.cts → useRecordsDepth-CARTuHKh.d.cts} +1 -1
- package/dist/{useRecordsDepth-CuNdne6E.d.ts → useRecordsDepth-fPSv-GXU.d.ts} +1 -1
- package/dist/video/index.cjs +1 -1
- package/dist/video/index.js +1 -1
- package/dist/{view-BhqWlYrZ.d.cts → view-DGPaVno8.d.cts} +47 -5
- package/dist/{view-DFy8EDwf.d.ts → view-Dc-JlFkf.d.ts} +47 -5
- package/dist/web/consent/index.cjs +1 -1
- package/dist/web/consent/index.d.cts +5 -5
- package/dist/web/consent/index.d.ts +5 -5
- package/dist/web/consent/index.js +1 -1
- package/dist/web/index.cjs +7 -7
- package/dist/web/index.d.cts +23 -22
- package/dist/web/index.d.ts +23 -22
- package/dist/web/index.js +7 -7
- package/dist/web/notifications/index.d.cts +3 -3
- package/dist/web/notifications/index.d.ts +3 -3
- package/dist/web/records/depth/index.cjs +2 -2
- package/dist/web/records/depth/index.d.cts +7 -7
- package/dist/web/records/depth/index.d.ts +7 -7
- package/dist/web/records/depth/index.js +2 -2
- package/dist/web/records/index.cjs +3 -3
- package/dist/web/records/index.d.cts +28 -17
- package/dist/web/records/index.d.ts +28 -17
- package/dist/web/records/index.js +3 -3
- package/dist/web/televet/booking/index.cjs +4 -2
- package/dist/web/televet/booking/index.d.cts +228 -90
- package/dist/web/televet/booking/index.d.ts +228 -90
- package/dist/web/televet/booking/index.js +4 -2
- package/dist/web/televet/call/index.cjs +1 -1
- package/dist/web/televet/call/index.d.cts +1 -1
- package/dist/web/televet/call/index.d.ts +1 -1
- package/dist/web/televet/call/index.js +1 -1
- package/dist/web/televet/index.cjs +3 -3
- package/dist/web/televet/index.d.cts +2 -2
- package/dist/web/televet/index.d.ts +2 -2
- package/dist/web/televet/index.js +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,219 @@ changes that has not been earned by any production integration yet.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.7.0] - 2026-10-01
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Records share: send a pet's record to a vet, groomer or kennel by email, and share it for an audience while
|
|
18
|
+
the server says so (web and React Native).** The share sheet gains the design's `Who it’s for` (`Vet` /
|
|
19
|
+
`Groomer` / `Boarding`), `Send to` (`vet@example.com…`) and `Send` / `Sending…`, over `POST
|
|
20
|
+
/widget/v1/records/pets/{pet_ref}/everfur_record/share/email`. The server mints the link and emails it; the
|
|
21
|
+
link is NEVER returned, so it never reaches `onOpenUrl`, the clipboard or the screen, and the new row under
|
|
22
|
+
`Active links` has no URL. The sheet says `Sent to {email}. The link works for 7 days.` (and `Add an email to
|
|
23
|
+
send {pet}’s record.` for an empty field). This works with EFBackend's `partner.records_share_audience_enabled`
|
|
24
|
+
off (default), where the pick only chooses the email's wording. ONLY while it is on, `GET
|
|
25
|
+
/widget/v1/records/features` serves `share_audiences` (parsed fail closed: malformed is no audiences, never
|
|
26
|
+
the upload types), the copy-link mint sends `{audience}`, and the sheet draws the lead (`Pick who it’s for; we
|
|
27
|
+
include the right pages.`, the web's `Share a snapshot of what {pet}’s vets recorded. ...`) and a `What’s
|
|
28
|
+
included` list derived from the served scope with the SDK's own section labels (a boarding list never
|
|
29
|
+
mentions a phone number). With it off neither is drawn, because the content is the same for everyone. New:
|
|
30
|
+
`RecordsDepthClient.emailShare`, `readFeatures?()`, `createShare(petRef, { audience })`,
|
|
31
|
+
`RecordsFeatures.shareAudiences`, `mapShareAudiences`, `mapRecordShareEmailReceipt`, `isShareRecipientEmail`,
|
|
32
|
+
`RecordShareAudience` and friends, `audience` on `RecordShare` and `RecordShareLink`, and `shareAudiences`,
|
|
33
|
+
`features`, `sending`, `sendEmail` on `useRecordShares`. The nameless `Add an email to send the record.` and
|
|
34
|
+
the mail failure `Could not send the email. Please try again.` are owner-approved (2026-10-01).
|
|
35
|
+
- **Vet messages and the visit summary, in your app (preview, dark until Everfur turns it on).** The Everfur app's
|
|
36
|
+
vet thread and visit summary on both platforms, over the five partner routes of EFBackend #1809
|
|
37
|
+
(`/widget/v1/televet/messages/threads`, one pet's thread and its send, the read receipt, and
|
|
38
|
+
`/consults/{consult_id}/summary`), which sit behind `partner.televet_messages_enabled` (default OFF). While the
|
|
39
|
+
switch is off the thread list answers 404 and nothing below is drawn. While it is on: the visits screen gains the
|
|
40
|
+
design's "Messages" card (one row per pet, the newest message, "New" / web "New reply" while unread), the visit
|
|
41
|
+
before the call gains "Running late? Message {vet}", a finished visit opens its approved summary ("What {vet} saw",
|
|
42
|
+
"{pet}’s plan" word for word, "From this visit", the vet card, "Book a follow-up"), and the thread screen reads and
|
|
43
|
+
sends text with the design's composer and note. New exports from `@everfur/sdk/televet/booking` and
|
|
44
|
+
`@everfur/sdk/web/televet/booking`: `TelevetVetThreadScreen`, `TelevetVisitSummaryScreen`, `useVetThreads`,
|
|
45
|
+
`useVetThread`, `useVisitSummary`, `vetThreadPetRef`, `VET_MESSAGES_COPY`, the wire types (`VetThread`,
|
|
46
|
+
`VetMessage`, `VisitSummary`, ...), the path builders and `isVetMessagesDark` / `isVetThreadVetFirst`.
|
|
47
|
+
`TelevetBookingController` gains five optional methods (`listVetThreads`, `listVetMessages`, `sendVetMessage`,
|
|
48
|
+
`markVetThreadRead`, `visitSummary`); an injected controller without them gets no Messages card, as a dark tenant
|
|
49
|
+
does. `TelevetScreen` gains `thread` and `summary`. The 409 line (`Your vet will write first. You can reply once
|
|
50
|
+
they do.`) and a message's attachment count (`{n} attached`) are owner-approved (2026-10-01).
|
|
51
|
+
|
|
52
|
+
- **Records: a photo of a paper record uploads, while Everfur says so (web and React Native).** The SDK now reads
|
|
53
|
+
`GET /widget/v1/records/features` (zod-parsed, fail closed: a failed or malformed answer is PDF only). While the
|
|
54
|
+
answer carries `upload_content_types` (EFBackend `partner.records_image_upload_enabled`, off by default), the
|
|
55
|
+
upload accepts JPEG, PNG and HEIC/HEIF as well as PDF: the controller's gate admits them and initiate declares
|
|
56
|
+
the photo's own type; the web picker names a photo from its first bytes, never `File.type`. The upload card
|
|
57
|
+
then reads the design's photo lines (`A PDF, or a photo of a paper record. Add them all; we sort them by date.`,
|
|
58
|
+
`Have more?` over `PDFs and photos of paper records both work. ...`, the web refusal `We can’t read this kind of
|
|
59
|
+
file. Upload a PDF or a photo of the record.`), and the dashboard's upload way carries `A PDF, or a photo of a
|
|
60
|
+
paper record.`. React Native adds `Take a photo` (`of a paper record`) when the host sets `camera` on the config
|
|
61
|
+
and `Choose from photos` when it passes the new `onPickPhotos` (on `EverfurRecords`, `EverfurRecordsUpload` and
|
|
62
|
+
`EverfurRecordsRequest`), with `Choose a file` over `PDF`. With the switch off, or with no photo path wired on
|
|
63
|
+
React Native, every surface is exactly as before. New API: `RecordsController.readFeatures?()`,
|
|
64
|
+
`useEverfurRecords({ readUploadFeatures })` and `uploadContentTypes` on its state, `acceptsPhotos`,
|
|
65
|
+
`RecordsFeatures`, `RecordsUploadContentType`, `RecordsPhotoContentType`, and on web `recordsDocumentAccept` plus
|
|
66
|
+
an optional `types` argument on `fileToHandle`, `isUploadableHandle` and `pickDocument`.
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **The vet booking asks the emergency question itself, straight after Describe (web and React Native).** With no
|
|
71
|
+
`onTriageReason` seam, `EverfurTelevetBooking` now asks `TelevetBookingController.triage`, a new optional method
|
|
72
|
+
that posts the member's words to `POST /widget/v1/televet/consults/triage` (served dark on the partner plane
|
|
73
|
+
behind `partner.televet_early_triage_enabled`, the booking's own classifier). An emergency or fallback verdict
|
|
74
|
+
opens the existing approved emergency warning before the vet picker, instead of only at Confirm. Every failure
|
|
75
|
+
of the read (the dark 404, 403, 429, 5xx, an unreadable body) answers `null` and the flow goes on exactly as
|
|
76
|
+
before; one attempt, no retry. A host seam still wins. `TelevetTriageVerdict` now lives in the core booking
|
|
77
|
+
types and is re-exported unchanged; `KNOWN_PARTNER_ROUTES` gains the route and `KNOWN_ABSENT_ROUTES` loses it.
|
|
78
|
+
- **Televet booking: photos, videos and documents reach the vet when the partner plane serves them.** A pick
|
|
79
|
+
from the host's `onPickMedia` is presigned when picked through the new `POST
|
|
80
|
+
/widget/v1/televet/attachments/initiate` (EFBackend #1806, dark behind `partner.televet_booking_media_enabled`)
|
|
81
|
+
and sent at Confirm, one at a time, through the chat attachment transport (the S3 POST, no bytes before Confirm);
|
|
82
|
+
its `s3_key` goes in `media_refs`. What did not go is counted into the existing attachment notice: a failed post
|
|
83
|
+
or presign, the server's own `FILE_TOO_LARGE` / `INVALID_CONTENT_TYPE`, the local type and size rules (the
|
|
84
|
+
server's list: JPEG, PNG, WebP, HEIC/HEIF, PDF, CSV, MP4, MOV; 25 MB, video 200 MB), and any key the booking
|
|
85
|
+
did not keep. DARK (the presign's 404, or an injected controller with no `initiateAttachment`), nothing is sent,
|
|
86
|
+
`media_refs` is `[]` and every pick is reported unsent, exactly as before. Two approved design lines render only
|
|
87
|
+
when true: `Optional. A close-up in good light helps.` under the row once the presign has answered, and `{pet}’s
|
|
88
|
+
records, your notes and the photo go to {vet} ahead of the call.` on the confirmation when the records were
|
|
89
|
+
shared and exactly one photo went and the consult kept it. New: `TelevetBookingController.initiateAttachment`,
|
|
90
|
+
`TelevetIntakeMedia`'s `meta` and `TelevetBookedScreen`'s `sentPhoto`. On the web the bytes are read back from
|
|
91
|
+
the host's `blob:` URL, so a host page's CSP needs `connect-src` for `blob:` and the upload bucket, and a web
|
|
92
|
+
upload in production also needs the televet media bucket's CORS for the partner origin (EFBackend #1825).
|
|
93
|
+
- **Televet cancel: "What changed?" is optional on both platforms.** The question is marked `Optional`, as the
|
|
94
|
+
approved design marks it (web `cancel`, mobile `vet-cancel`, 30 Sep 2026). The web no longer refuses a cancel
|
|
95
|
+
with no answer picked (`Tell us why you are cancelling.` is gone); like React Native it sends the reviewed fixed
|
|
96
|
+
reason (`Cancelled by the pet parent in the app.`) instead, and a picked answer can be taken back. A picked
|
|
97
|
+
answer still sends its own words. The wire always carries a `reason` (never a `reason_code`), so the cancel is
|
|
98
|
+
valid whether or not the server's optional-reason flag is on.
|
|
99
|
+
- **Records: clinic search results show their distance in miles.** The clinic picker draws `3.2 mi` (and says `3.2
|
|
100
|
+
miles away`) as the design does, converted locally from the wire's `distance_km`; it drew kilometres. Web and React
|
|
101
|
+
Native.
|
|
102
|
+
- **Records: a source document reads its page count.** A row under `Sources on file` now reads `{n} pages · {date}`
|
|
103
|
+
(the design's `3 pages · Aug 14`; one page reads `1 page`) when the record wire counts the document's pages.
|
|
104
|
+
EFBackend serves `documents[].page_count` only while its `partner.records_document_page_count_enabled` switch is
|
|
105
|
+
armed (default off); until then, and for a document the record worker has not counted, the row keeps its date alone.
|
|
106
|
+
Web and React Native.
|
|
107
|
+
- **Visual and copy change: chat reads and looks like the Everfur app design (web and React Native).** By owner
|
|
108
|
+
decision (30 Sep 2026) the design artifacts count as approved, so chat carries their wording verbatim (the web
|
|
109
|
+
surface the web design's, React Native the mobile design's where they differ) and their layout on the theme's
|
|
110
|
+
derived tokens, so partner palettes still apply. Copy: the composer asks `Ask anything about {pet}…` (web: `Ask a
|
|
111
|
+
follow-up…` once a reply is on screen, `Tell us what’s happening…` under an emergency banner) and is named
|
|
112
|
+
`Message`; the reply is headed `Everfur` (not drawn for a `hide_powered_by` tenant); the waiting line is `Reading
|
|
113
|
+
{pet}’s records…` and a settled reply is announced as `Everfur answered.` rather than read out; the emergency tier
|
|
114
|
+
is `Call a vet now`, with the ASPCA Animal Poison Control call (owner-approved) and `Nearest emergency vet` when
|
|
115
|
+
the host's `onFindVet` is the route; the history is `Chats` (`Search chats…`, `Chats and vet messages · {n}` once
|
|
116
|
+
every row is loaded, `New reply · {date}` on an unread row, `No chats match that.`); the pet sheet is `Your pets`
|
|
117
|
+
with `Add a pet`; the switch control is `{pet}. Switch pet`; the web vet-prep chip is `Book a video visit` and
|
|
118
|
+
the React Native one drops its full stop. The fixed clinical disclaimer band is replaced on chat by the design's
|
|
119
|
+
one-line footnote under the composer (compiled and frozen in the chat copy module; records keep the band).
|
|
120
|
+
Layout: 20 px bubbles with a 6 px tail (a vet's at the top left, still pink), the body size on every box, the
|
|
121
|
+
sender's name over a reply, a left-aligned hello with edge-less starter chips, the web's outline follow-up chips
|
|
122
|
+
and the mobile design's headed follow-up rows, a Dark Green send disc on the web composer, a white history panel
|
|
123
|
+
(the web rail was brand green), and the emergency banner painted from the theme's alert red. New bubbles pop from
|
|
124
|
+
their corner and starter chips rise, both off under reduced motion. The quick prompts stay the compiled templates:
|
|
125
|
+
the design's chips name one sample pet's records, and the SDK has no served source of record-personalised prompts.
|
|
126
|
+
The web chat's geometry guard now pins the design and records where it departs from the shipped web app.
|
|
127
|
+
`TypingIndicator` (`@everfur/sdk/testing/rn`) takes an optional `petName` for the reading line; called with no
|
|
128
|
+
props it reads `your pet`, as before it drew with none.
|
|
129
|
+
|
|
130
|
+
- **Visual and copy change: the records surfaces read and look like the Everfur app designs (web and React Native,
|
|
131
|
+
medical records only).** By owner decision (30 Sep 2026) the records screens port the owner-approved design
|
|
132
|
+
artifacts' wording and layout. The clinical disclaimer band under every records screen is replaced by the
|
|
133
|
+
artifacts' one-line footnote, `Everfur summarizes what your vet recorded. It is informational, not
|
|
134
|
+
diagnostic.` (compiled, not overridable, `RECORDS_FOOTNOTE`); chat and televet keep the band. Titles follow the
|
|
135
|
+
pet (`Rex's Records` on the web, the pet's name on React Native, `Request Rex's records`, `Send Rex's record`,
|
|
136
|
+
`Rex's health record`; the nameless forms are unchanged), the full record is `Visits & records`, the clinic
|
|
137
|
+
release is `Check and send` with the artifact's checkbox wording around the drawn signature (kept), `What we ask
|
|
138
|
+
for`, `What happens next` and `Send request`, the clinic picker gains its lead and `How it works`, the request
|
|
139
|
+
screen gains `Request sent`, `Where it stands` and `Request details`, a clinic request's tracker reads `Request
|
|
140
|
+
sent`, `Clinic notified`, `Waiting for records…` with a `Now` pill, and the in-flight dashboard reads `Rex's
|
|
141
|
+
records are on the way` with `Another clinic` and `Upload a document` beside it. Cards take the artifacts'
|
|
142
|
+
radius 20 and neutral edge, buttons are 52 tall and press to 0.97, status pills are the artifacts' mono capitals,
|
|
143
|
+
sections rise in on the web, and the record tiles' tints are derived from the theme. Every motion rests under
|
|
144
|
+
reduced motion. Lines whose promise the partner wire cannot keep yet are held back and the truthful line stays:
|
|
145
|
+
photo upload, send-by-email and audiences, "We'll text you",
|
|
146
|
+
reminders, a follow-up date, clinic search by phone or fax, and the birth-date line of the release.
|
|
147
|
+
The share sheet states the link's terms (`Sent as a secure link that works for 7 days. You can stop sharing it
|
|
148
|
+
any time.`; by owner decision a new link lives 7 days) and, on React Native, `Link copied. It works for 7 days.`
|
|
149
|
+
and `Couldn't copy. The link is {url}`. The vendored platform contract is re-synced to EFBackend main (digests
|
|
150
|
+
only). `buildRequestTimeline` (a hook-based UI's rail) now reads the same words for a clinic request and takes an
|
|
151
|
+
optional `{ petName }` for its last step (`Added to Rex's records`); no other export changes.
|
|
152
|
+
|
|
153
|
+
- **Visual and copy change: the vet visit surfaces follow the owner-approved Everfur app designs of 30 Sep 2026
|
|
154
|
+
(web and React Native).** The booking is the designs' eight steps, "Step n of 8": who, where the pet will be
|
|
155
|
+
during the visit (new, asked on every booking and seeded with `usState`; what each place permits is read from
|
|
156
|
+
the served state policy), what's going on (now on React Native too, with the designs' twelve issues for every
|
|
157
|
+
pet), the description, an explicit emergency check (new: seven signs and a yes or no; "Yes" shows the exits and
|
|
158
|
+
holds the flow until "I’ve handled this, continue booking", which sends `emergency_acknowledged: true`), your
|
|
159
|
+
vet, the time (grouped Morning, Afternoon, Evening) and the review ("Book the visit", the attestation "{pet} and I
|
|
160
|
+
will be in {state} during the visit.", a Change on When; on the web a press with a box unticked says "Check both
|
|
161
|
+
boxes to book the visit."). The flow bar, option cards, chips, day and time chips, review rows, confirmation,
|
|
162
|
+
visits page ("Video visits", "Next video visit", "Past video visits", the vet footnote), cancel ("What changed?"
|
|
163
|
+
with four answers, sent as the reason) and reschedule (a "Move to ..." button; picking no longer moves the visit)
|
|
164
|
+
are restyled from theme tokens only, and the waiting room words follow ("Waiting room", "Before {vet} joins",
|
|
165
|
+
"15 minutes"). The ASPCA Animal Poison Control row is now drawn on both platforms (owner approval). The
|
|
166
|
+
`VetVisitButton` default label is "Vet" (was "Talk to a vet"). Not ported, because this plane cannot keep the
|
|
167
|
+
promise yet: text-message reminders, a photo reaching the vet, an optional cancel reason, vet messages, the visit
|
|
168
|
+
summary, the device checks and "joins in about 3 minutes". Public API: `TelevetBookingStep` and
|
|
169
|
+
`TELEVET_BOOKING_STEPS` gain `where` and `emergency`; `TELEVET_BOOKING_COPY` gains keys and changes values;
|
|
170
|
+
`televetIssueChips` no longer filters by species; the web `TelevetBookingChrome` takes `showBack`, the RN one
|
|
171
|
+
`triageOpen`; `TelevetBookedScreen` takes `sharedRecords`; `TelevetSlotPicker` takes `periodLabels`.
|
|
172
|
+
|
|
173
|
+
- **Visual change: the default theme adopts the Everfur design tokens of 26 Sep 2026 (web and React Native).** By
|
|
174
|
+
owner decision (30 Sep 2026) the compiled light default follows the design tokens ahead of the Everfur apps. Body
|
|
175
|
+
text is solid black (`text.primary`, `onBubbleVet` `#111111` -> `#000000`). Off-White is retired: the card,
|
|
176
|
+
composer and popover grounds are white (`surfaceCream`, `composerFill` `#FDFBF8` -> `#FFFFFF`), so
|
|
177
|
+
`surface_style: 'cream'` now paints white on the light palette. The warm greys become the design tokens' neutral
|
|
178
|
+
ones: `text.muted` `#6E6660` -> `#6B6B6B`, `borderRingCream` `#D8D2C8` -> `#E4E4E4`, `surfaceSubtle`
|
|
179
|
+
`#EFE9E3` -> `#F1F5F2` (mist), `skeleton` -> `#E9F1E9`, `badgeBgNeutral` follows the new grey. The reds are the
|
|
180
|
+
one alert red: `danger` `#B91C1C` and `errorRed` `#CC1600` -> `#C03410`, `badgeBgCritical` -> that red at 6%.
|
|
181
|
+
The type scale moves to the design tokens': `caption` 12 -> 13, `bodyTight` 13 -> 15, `body` 14 -> 17,
|
|
182
|
+
`subtitle` 16 -> 20, `heading` 18 -> 22 (`nano` to `tiny` and `verdict` are unchanged), and the React Native chat
|
|
183
|
+
bubble and field line heights follow the body size. Every ink still passes the contrast guards on both palettes.
|
|
184
|
+
The dark palette's `text.muted` is the neutral `#9A9A9A` (was `#9A938C`); the rest of the dark palette, the vet
|
|
185
|
+
bubble's pink and the motion curves are unchanged. No font is bundled: the design tokens' Azeret reaches a surface
|
|
186
|
+
only when a branding supplies it (`fonts`, or `font_urls` on the web). Partner branding resolves exactly as before
|
|
187
|
+
(lock > partner code > console > this default); only the default moved. A partner `font_size_base` still sets the
|
|
188
|
+
body size, and the other sizes now scale from the new 17 px body rather than 14.
|
|
189
|
+
|
|
190
|
+
### Fixed
|
|
191
|
+
|
|
192
|
+
- **Televet booking: the step counter counts the steps the owner sees (web and React Native).** A one-pet household
|
|
193
|
+
never sees the pet step, but the bar still counted it, so the flow opened on `Step 2 of 8` and never showed a
|
|
194
|
+
first step (partner smoke test of 0.6.0). It now reads `Step 1 of 7` ... `Step 7 of 7` there (seven segments on
|
|
195
|
+
React Native) and keeps the design's eight for a household with a pet to choose. New optional
|
|
196
|
+
`TelevetBookingChromeProps.stepContext` (the reducer's `TelevetBookingContext`) for a host driving the chrome
|
|
197
|
+
itself; absent, the bar counts eight as before.
|
|
198
|
+
- **Records: no empty heading on the upload screen (web and React Native).** Its header row passed an empty title
|
|
199
|
+
and still drew an `<h2>` (a Text with the header role on React Native) that a screen reader lists and reads as
|
|
200
|
+
nothing (partner smoke test of 0.6.0). The header row now draws a spacer for an empty title, and on the web the
|
|
201
|
+
screen's own title (`Upload a document`) is the heading focus moves to when the member arrives.
|
|
202
|
+
- **Records: a date in the record's Identity section reads as a date.** The server sends identity values raw, so the
|
|
203
|
+
date of birth showed as `2022-07-27`; a bare calendar date now uses the records date format (`Jul 27, 2022`) on
|
|
204
|
+
web and React Native. Species and sex still show as sent (`dog`, `female`): the SDK has no vocabulary for them,
|
|
205
|
+
so display labels for those are a server item.
|
|
206
|
+
- **Records clinic request forms (`EverfurClinicRequest`, `EverfurClinicRequestBatch`, web and React Native): search
|
|
207
|
+
results no longer fill the page.** The forms asked for 100 clinics and drew every one inline (about 6,750 px on
|
|
208
|
+
the partner smoke test of 0.6.0). They now ask for one page of 25 (the clinic picker's page size), draw the first
|
|
209
|
+
five, and add five more per `Load more` (the SDK's existing label); a member who still has not found the clinic
|
|
210
|
+
refines the search.
|
|
211
|
+
- **"Please add your signature before submitting." no longer greets a form just opened.** It was an alert from the
|
|
212
|
+
first render. It now appears only once everything else is filled in, when the missing signature is what keeps
|
|
213
|
+
Send closed.
|
|
214
|
+
- **The signature pad's `Draw your signature in the box above.` is gone in typed mode (web),** where there is
|
|
215
|
+
nothing to draw. No typed-mode hint exists in the consumer apps or the designs, so the line stays empty.
|
|
216
|
+
- **Chat: opening chat no longer creates an empty conversation (web and React Native).** The bootstrap prime
|
|
217
|
+
POSTed `/widget/v1/conversations` on every mount (twice under React StrictMode's double mount), so the member's
|
|
218
|
+
history filled with empty `New conversation` rows (partner smoke test of 0.6.0). The prime still reads the head
|
|
219
|
+
of the list (resuming a thread with an unread reply, which is also what delivers an owed check-in) and prefetches
|
|
220
|
+
the suggested prompts; the conversation is now created by the first send, which pays that one round trip before
|
|
221
|
+
it streams. `runtime.prepare()` no longer creates one either. `ChatController.primeConversation()` now settles to
|
|
222
|
+
`ConversationId | null` (null: no thread opened yet), and a failed head read is the prime's reported failure
|
|
223
|
+
(except a 403, since a key without history read can still chat). The web `Everfur answered.` announcement now
|
|
224
|
+
also fires for the first reply of a new thread, as it already did on React Native.
|
|
225
|
+
|
|
13
226
|
## [0.6.0] - 2026-09-29
|
|
14
227
|
|
|
15
228
|
### Added
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { T as TelevetConsult } from './bookingTypes-
|
|
2
|
+
import { T as TelevetConsult } from './bookingTypes-D4pD3tHs.js';
|
|
3
3
|
|
|
4
4
|
/** The calendar entry a booked visit asks the host to write. */
|
|
5
5
|
interface TelevetCalendarEvent {
|
|
@@ -48,7 +48,17 @@ interface TelevetBookedScreenProps {
|
|
|
48
48
|
* length row uses for a slot that does not say. The prebuilt flow always passes the slot's length.
|
|
49
49
|
*/
|
|
50
50
|
readonly lengthMinutes?: number | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Did the owner share the pet's records with the vet on the review? Only then may step 02 say the records go
|
|
53
|
+
* to the vet ahead of the call; otherwise it keeps the deck's own summary line.
|
|
54
|
+
*/
|
|
55
|
+
readonly sharedRecords?: boolean | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Did exactly one PHOTO go with this booking, and did the consult keep it? Only then may step 02 say the photo
|
|
58
|
+
* goes to the vet (the artifact's photo form). Defaults to false.
|
|
59
|
+
*/
|
|
60
|
+
readonly sentPhoto?: boolean | undefined;
|
|
51
61
|
}
|
|
52
|
-
declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, lengthMinutes, }: TelevetBookedScreenProps): ReactNode;
|
|
62
|
+
declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, lengthMinutes, sharedRecords, sentPhoto, }: TelevetBookedScreenProps): ReactNode;
|
|
53
63
|
|
|
54
64
|
export { type TelevetCalendarWriter as T, type TelevetCalendarEvent as a, TelevetBookedScreen as b, type TelevetBookedScreenProps as c, televetConsultCalendarKey as t };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
|
-
import { T as TelevetConsult } from './bookingTypes-
|
|
2
|
+
import { T as TelevetConsult } from './bookingTypes-D4pD3tHs.cjs';
|
|
3
3
|
|
|
4
4
|
/** The calendar entry a booked visit asks the host to write. */
|
|
5
5
|
interface TelevetCalendarEvent {
|
|
@@ -48,7 +48,17 @@ interface TelevetBookedScreenProps {
|
|
|
48
48
|
* length row uses for a slot that does not say. The prebuilt flow always passes the slot's length.
|
|
49
49
|
*/
|
|
50
50
|
readonly lengthMinutes?: number | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Did the owner share the pet's records with the vet on the review? Only then may step 02 say the records go
|
|
53
|
+
* to the vet ahead of the call; otherwise it keeps the deck's own summary line.
|
|
54
|
+
*/
|
|
55
|
+
readonly sharedRecords?: boolean | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Did exactly one PHOTO go with this booking, and did the consult keep it? Only then may step 02 say the photo
|
|
58
|
+
* goes to the vet (the artifact's photo form). Defaults to false.
|
|
59
|
+
*/
|
|
60
|
+
readonly sentPhoto?: boolean | undefined;
|
|
51
61
|
}
|
|
52
|
-
declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, lengthMinutes, }: TelevetBookedScreenProps): ReactNode;
|
|
62
|
+
declare function TelevetBookedScreen({ consult, petName, onDone, onAddToCalendar, canJoinInApp, lengthMinutes, sharedRecords, sentPhoto, }: TelevetBookedScreenProps): ReactNode;
|
|
53
63
|
|
|
54
64
|
export { type TelevetCalendarWriter as T, type TelevetCalendarEvent as a, TelevetBookedScreen as b, type TelevetBookedScreenProps as c, televetConsultCalendarKey as t };
|
|
@@ -2,9 +2,9 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
3
3
|
import { P as PetRef, C as ConversationId } from './ids-B2GAAifq.js';
|
|
4
4
|
import { F as FileHandle } from './ports-BN6RHF9W.js';
|
|
5
|
-
import { a as ChatCheckinTarget } from './ports-
|
|
6
|
-
import { W as WidgetPet, P as PetProfileInput } from './petsRepository-
|
|
7
|
-
import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-
|
|
5
|
+
import { a as ChatCheckinTarget } from './ports-nXHf50_X.js';
|
|
6
|
+
import { W as WidgetPet, P as PetProfileInput } from './petsRepository-CuYZZaI5.js';
|
|
7
|
+
import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-CXAnZcEg.js';
|
|
8
8
|
|
|
9
9
|
/** Where a picked image comes from: the host's photo library, or its camera. */
|
|
10
10
|
type AttachmentSource = 'photo' | 'camera';
|
|
@@ -48,7 +48,7 @@ interface EverfurChatProps {
|
|
|
48
48
|
/** Called after the user picked another pet in the header switcher and the provider re-scoped to it. */
|
|
49
49
|
readonly onPetChange?: (petRef: PetRef) => void;
|
|
50
50
|
/**
|
|
51
|
-
* Your vet-visit preparation screen. Given, the empty thread's `Help me prep for {pet}
|
|
51
|
+
* Your vet-visit preparation screen. Given, the empty thread's `Help me prep for {pet}’s vet visit` chip
|
|
52
52
|
* routes to it with the pet; absent, that chip is the Everfur vet visit entry inside Chat, shown only
|
|
53
53
|
* while Everfur has it switched on for your tenant, else not shown at all.
|
|
54
54
|
*/
|
|
@@ -2,9 +2,9 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
3
3
|
import { P as PetRef, C as ConversationId } from './ids-B2GAAifq.cjs';
|
|
4
4
|
import { F as FileHandle } from './ports-BN6RHF9W.cjs';
|
|
5
|
-
import { a as ChatCheckinTarget } from './ports-
|
|
6
|
-
import { W as WidgetPet, P as PetProfileInput } from './petsRepository-
|
|
7
|
-
import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-
|
|
5
|
+
import { a as ChatCheckinTarget } from './ports-ZmJYgd5I.cjs';
|
|
6
|
+
import { W as WidgetPet, P as PetProfileInput } from './petsRepository-BJsJ4cju.cjs';
|
|
7
|
+
import { U as UrgencyDisplayLevel, L as LifecyclePort, E as EverfurChatDraftStore } from './attachments-CUOGILir.cjs';
|
|
8
8
|
|
|
9
9
|
/** Where a picked image comes from: the host's photo library, or its camera. */
|
|
10
10
|
type AttachmentSource = 'photo' | 'camera';
|
|
@@ -48,7 +48,7 @@ interface EverfurChatProps {
|
|
|
48
48
|
/** Called after the user picked another pet in the header switcher and the provider re-scoped to it. */
|
|
49
49
|
readonly onPetChange?: (petRef: PetRef) => void;
|
|
50
50
|
/**
|
|
51
|
-
* Your vet-visit preparation screen. Given, the empty thread's `Help me prep for {pet}
|
|
51
|
+
* Your vet-visit preparation screen. Given, the empty thread's `Help me prep for {pet}’s vet visit` chip
|
|
52
52
|
* routes to it with the pet; absent, that chip is the Everfur vet visit entry inside Chat, shown only
|
|
53
53
|
* while Everfur has it switched on for your tenant, else not shown at all.
|
|
54
54
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSSProperties, ReactNode } from 'react';
|
|
2
|
-
import { f as RecordsScreenBaseProps } from './useRecordsDepth-
|
|
2
|
+
import { f as RecordsScreenBaseProps } from './useRecordsDepth-CARTuHKh.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-
|
|
3
|
+
import { f as RecordsScreenBaseProps } from './useRecordsDepth-CARTuHKh.cjs';
|
|
4
4
|
|
|
5
5
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
6
6
|
readonly style?: StyleProp<ViewStyle>;
|
|
@@ -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-
|
|
3
|
+
import { f as RecordsScreenBaseProps } from './useRecordsDepth-fPSv-GXU.js';
|
|
4
4
|
|
|
5
5
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
6
6
|
readonly style?: StyleProp<ViewStyle>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CSSProperties, ReactNode } from 'react';
|
|
2
|
-
import { f as RecordsScreenBaseProps } from './useRecordsDepth-
|
|
2
|
+
import { f as RecordsScreenBaseProps } from './useRecordsDepth-fPSv-GXU.js';
|
|
3
3
|
|
|
4
4
|
interface EverfurRecordsDepthProps extends Pick<RecordsScreenBaseProps, 'petRef' | 'petName' | 'onNavigate' | 'onBack'> {
|
|
5
5
|
readonly style?: CSSProperties;
|