@everfur/sdk 0.15.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/{DepthViews.d-BuEWI6Ln.d.ts → DepthViews.d-A7S-XYiI.d.ts} +1 -1
  3. package/dist/{DepthViews.d--1daZblh.d.cts → DepthViews.d-C4TIZDfz.d.cts} +1 -1
  4. package/dist/{DepthViews.d-CKTnEeUo.d.ts → DepthViews.d-CNjaHLAS.d.ts} +1 -1
  5. package/dist/{DepthViews.d-PuBGdAYk.d.cts → DepthViews.d-DapfRz1S.d.cts} +1 -1
  6. package/dist/{RecordsPage.d-CBB8sfoY.d.ts → RecordsPage.d-6WMbieaV.d.ts} +1 -1
  7. package/dist/{RecordsPage.d-Dq5gpQG0.d.cts → RecordsPage.d-B2gLf8RH.d.cts} +1 -1
  8. package/dist/animations/index.d.cts +5 -5
  9. package/dist/animations/index.d.ts +5 -5
  10. package/dist/{Chat.d-BlsnQwCQ.d.ts → appStateLifecycle.d-B7L427MF.d.ts} +64 -141
  11. package/dist/{Chat.d-BO5iJsR2.d.cts → appStateLifecycle.d-CWedOJq4.d.cts} +64 -141
  12. package/dist/{attachments.d-DRHsJkni.d.cts → attachments.d-BARh-PrJ.d.cts} +24 -6
  13. package/dist/{attachments.d-DFP9yvz9.d.ts → attachments.d-CB0R1_vK.d.ts} +24 -6
  14. package/dist/{attachments.d-C2nkIyDB.d.ts → attachments.d-CPgp4_W-.d.ts} +2 -2
  15. package/dist/{attachments.d-DRUC35Ti.d.cts → attachments.d-DeoaCEMD.d.cts} +2 -2
  16. package/dist/{bookingCopy.d-CFL-1Be2.d.ts → bookingCopy.d-BakTjvWw.d.ts} +2 -2
  17. package/dist/{bookingCopy.d-bF_QknDC.d.cts → bookingCopy.d-CVmpuk9C.d.cts} +2 -2
  18. package/dist/{casesRepository.d-C__BnffJ.d.ts → casesRepository.d-CuokarTU.d.ts} +1 -1
  19. package/dist/{casesRepository.d-BMOnT1fg.d.cts → casesRepository.d-DKRLtYb8.d.cts} +1 -1
  20. package/dist/chat/index.cjs +227 -213
  21. package/dist/chat/index.d.cts +11 -9
  22. package/dist/chat/index.d.ts +11 -9
  23. package/dist/chat/index.js +228 -214
  24. package/dist/client/index.cjs +1 -1
  25. package/dist/client/index.d.cts +6 -6
  26. package/dist/client/index.d.ts +6 -6
  27. package/dist/client/index.js +1 -1
  28. package/dist/{clinicBatch.d-D68RYvc3.d.ts → clinicBatch.d-BP_Rpvcy.d.ts} +2 -2
  29. package/dist/{clinicBatch.d-C5deJ4xY.d.cts → clinicBatch.d-BTDdhMQ2.d.cts} +2 -2
  30. package/dist/{config.d-BQgrIDdu.d.cts → config.d-84fNJFv9.d.cts} +1 -1
  31. package/dist/{config.d-XSMThgVj.d.ts → config.d-B4-Mrwq2.d.ts} +1 -1
  32. package/dist/consent/index.d.cts +5 -5
  33. package/dist/consent/index.d.ts +5 -5
  34. package/dist/{context.d-Ba8YyJpk.d.cts → context.d-87MMrNm6.d.cts} +5 -5
  35. package/dist/{context.d-xoh5vmxS.d.ts → context.d-rNGMZH8T.d.ts} +5 -5
  36. package/dist/{copy.d-Cq-s-UUv.d.cts → copy.d-CJOLhJac.d.cts} +2 -2
  37. package/dist/{copy.d-HV9fU5kh.d.ts → copy.d-DbwWriBp.d.ts} +2 -2
  38. package/dist/core/index.cjs +1 -1
  39. package/dist/core/index.d.cts +13 -13
  40. package/dist/core/index.d.ts +13 -13
  41. package/dist/core/index.js +1 -1
  42. package/dist/{depth.d-DYnkz8Re.d.cts → depth.d-CXpPxNSK.d.cts} +2 -2
  43. package/dist/{depth.d-D7kKiYl7.d.ts → depth.d-Dca1T_RH.d.ts} +2 -2
  44. package/dist/{entitlementRepository.d-DmnUZLl_.d.ts → entitlementRepository.d-BBRYTUlp.d.ts} +2 -2
  45. package/dist/{entitlementRepository.d-B_kEPLhz.d.cts → entitlementRepository.d-DBhzBQjZ.d.cts} +2 -2
  46. package/dist/{focus.d-BHm_QtQ9.d.cts → focus.d-BQnOVAql.d.cts} +3 -3
  47. package/dist/{focus.d-CjL6Cj0m.d.ts → focus.d-BZ2sEpbU.d.ts} +3 -3
  48. package/dist/health-plan/index.cjs +134 -131
  49. package/dist/health-plan/index.d.cts +77 -24
  50. package/dist/health-plan/index.d.ts +77 -24
  51. package/dist/health-plan/index.js +134 -131
  52. package/dist/{idempotency.d-BSRK8od4.d.cts → idempotency.d-9wNNohIA.d.cts} +1 -1
  53. package/dist/{idempotency.d-CFc4CCc9.d.ts → idempotency.d-BdB17veP.d.ts} +1 -1
  54. package/dist/{identity.d-Be2Es9Td.d.ts → identity.d-DxNvhj3a.d.ts} +1 -1
  55. package/dist/{identity.d-HbwYQ4-z.d.cts → identity.d-nRZBzkG2.d.cts} +1 -1
  56. package/dist/index.cjs +232 -218
  57. package/dist/index.d.cts +14 -12
  58. package/dist/index.d.ts +14 -12
  59. package/dist/index.js +233 -219
  60. package/dist/{introEvents.d-Dr34KIaD.d.cts → introEvents.d-CQeiUeLn.d.cts} +1 -1
  61. package/dist/{introEvents.d-DflJ6J9H.d.ts → introEvents.d-bkIxpIKr.d.ts} +1 -1
  62. package/dist/notifications/index.d.cts +4 -4
  63. package/dist/notifications/index.d.ts +4 -4
  64. package/dist/{optInView.d-D23o1gtT.d.cts → optInView.d-BbVUUeoG.d.cts} +2 -2
  65. package/dist/{optInView.d-3mbj1mR6.d.ts → optInView.d-DVJcB4Gp.d.ts} +2 -2
  66. package/dist/{parse.d-BERabxHw.d.ts → parse.d-CGeJrcAC.d.ts} +1 -1
  67. package/dist/{parse.d-4lUXdmvY.d.cts → parse.d-Dk0BasyK.d.cts} +1 -1
  68. package/dist/{pets.d-D_ayuqjp.d.ts → pets.d-DBopbeRe.d.ts} +1 -1
  69. package/dist/{pets.d-CHU0UbXt.d.cts → pets.d-DVptPgi0.d.cts} +1 -1
  70. package/dist/{petsRepository.d-DUaAWoTv.d.ts → petsRepository.d-BtuooSOW.d.ts} +1 -1
  71. package/dist/{petsRepository.d-Bwfe8yuR.d.cts → petsRepository.d-Daef7u0o.d.cts} +1 -1
  72. package/dist/{ports.d-DzEJMVRs.d.ts → ports.d-BxCVSbSi.d.ts} +4 -4
  73. package/dist/{ports.d-ClbPRUtx.d.cts → ports.d-CAT70bVD.d.cts} +4 -4
  74. package/dist/records/depth/index.cjs +1 -1
  75. package/dist/records/depth/index.d.cts +9 -9
  76. package/dist/records/depth/index.d.ts +9 -9
  77. package/dist/records/depth/index.js +1 -1
  78. package/dist/records/index.cjs +242 -200
  79. package/dist/records/index.d.cts +169 -73
  80. package/dist/records/index.d.ts +169 -73
  81. package/dist/records/index.js +243 -201
  82. package/dist/{requestFunnel.d-YabU6G-Z.d.ts → requestFunnel.d-Cxt0JqYx.d.ts} +2 -2
  83. package/dist/{requestFunnel.d-JoqddYSx.d.cts → requestFunnel.d-mEu6B-n8.d.cts} +2 -2
  84. package/dist/{runtimeTypes.d-DQTBJAbk.d.ts → runtimeTypes.d-Bkcj_XQy.d.ts} +4 -4
  85. package/dist/{runtimeTypes.d-Cv38YuzP.d.cts → runtimeTypes.d-D_qHJROH.d.cts} +4 -4
  86. package/dist/{screenProps.d-C-AuHoyF.d.cts → screenProps.d-CR1lrpzR.d.cts} +2 -2
  87. package/dist/{screenProps.d-BuJLzFkN.d.ts → screenProps.d-D9n-ancr.d.ts} +2 -2
  88. package/dist/server/events/index.cjs +1 -1
  89. package/dist/server/events/index.d.cts +2 -2
  90. package/dist/server/events/index.d.ts +2 -2
  91. package/dist/server/events/index.js +1 -1
  92. package/dist/server/index.cjs +1 -1
  93. package/dist/server/index.d.cts +3 -3
  94. package/dist/server/index.d.ts +3 -3
  95. package/dist/server/index.js +1 -1
  96. package/dist/shop/index.cjs +16 -16
  97. package/dist/shop/index.d.cts +12 -3
  98. package/dist/shop/index.d.ts +12 -3
  99. package/dist/shop/index.js +16 -16
  100. package/dist/tabs/index.cjs +4 -4
  101. package/dist/tabs/index.d.cts +34 -15
  102. package/dist/tabs/index.d.ts +34 -15
  103. package/dist/tabs/index.js +5 -5
  104. package/dist/{tabsModel.d-BfIQg6yS.d.ts → tabsModel.d-B7QMug1u.d.cts} +1 -17
  105. package/dist/{tabsModel.d-BfIQg6yS.d.cts → tabsModel.d-B7QMug1u.d.ts} +1 -17
  106. package/dist/televet/booking/index.d.cts +6 -6
  107. package/dist/televet/booking/index.d.ts +6 -6
  108. package/dist/testing/index.d.cts +1 -1
  109. package/dist/testing/index.d.ts +1 -1
  110. package/dist/testing/rn/index.cjs +1 -1
  111. package/dist/testing/rn/index.d.cts +7 -7
  112. package/dist/testing/rn/index.d.ts +7 -7
  113. package/dist/testing/rn/index.js +1 -1
  114. package/dist/testing/web/index.d.cts +7 -7
  115. package/dist/testing/web/index.d.ts +7 -7
  116. package/dist/texting/index.cjs +21 -16
  117. package/dist/texting/index.d.cts +5 -5
  118. package/dist/texting/index.d.ts +5 -5
  119. package/dist/texting/index.js +22 -17
  120. package/dist/threadOptions.d-6hfQS1x7.d.cts +55 -0
  121. package/dist/threadOptions.d-6hfQS1x7.d.ts +55 -0
  122. package/dist/threadOptions.d-BEG-LZrC.d.cts +147 -0
  123. package/dist/threadOptions.d-BerQM1Ql.d.ts +147 -0
  124. package/dist/{threadOptions.d-8x_1evAr.d.ts → threadOptions.d-BgBvSIw8.d.ts} +6 -40
  125. package/dist/{threadOptions.d-DBrmOwmb.d.cts → threadOptions.d-P9v7I7va.d.cts} +6 -40
  126. package/dist/{timelineRows.d-B6lLC8Ud.d.cts → timelineRows.d-C04lp_Vj.d.cts} +1 -1
  127. package/dist/{timelineRows.d-Brlkti-G.d.ts → timelineRows.d-_7JemrY-.d.ts} +1 -1
  128. package/dist/{planSignals.d-CON9gTvJ.d.ts → useHealthPlanSubscription.d-CUbHE6eK.d.ts} +81 -3
  129. package/dist/{planSignals.d-Dha2CMDF.d.cts → useHealthPlanSubscription.d-OhLZpn-n.d.cts} +81 -3
  130. package/dist/{usePresentation.d-Bne14SlX.d.ts → usePresentation.d-CBtBx38t.d.ts} +40 -40
  131. package/dist/{usePresentation.d-BcdCIuEU.d.cts → usePresentation.d-YkJeq9mf.d.cts} +40 -40
  132. package/dist/{useRecordsDepth.d-DAa169VY.d.cts → useRecordsDepth.d-FTImzp6T.d.cts} +1 -1
  133. package/dist/{useRecordsDepth.d-Cd6J03o5.d.ts → useRecordsDepth.d-_rqDIvoq.d.ts} +1 -1
  134. package/dist/{view.d-3d5_O7Xk.d.cts → view.d-Dd6AfMvG.d.cts} +3 -3
  135. package/dist/{view.d-DkGM8GNA.d.ts → view.d-gmYinlac.d.ts} +3 -3
  136. package/dist/web/consent/index.d.cts +5 -5
  137. package/dist/web/consent/index.d.ts +5 -5
  138. package/dist/web/health-plan/index.cjs +1 -1
  139. package/dist/web/health-plan/index.d.cts +15 -69
  140. package/dist/web/health-plan/index.d.ts +15 -69
  141. package/dist/web/health-plan/index.js +1 -1
  142. package/dist/web/index.cjs +5 -5
  143. package/dist/web/index.d.cts +26 -43
  144. package/dist/web/index.d.ts +26 -43
  145. package/dist/web/index.js +5 -5
  146. package/dist/web/intro/index.d.cts +6 -6
  147. package/dist/web/intro/index.d.ts +6 -6
  148. package/dist/web/notifications/index.d.cts +3 -3
  149. package/dist/web/notifications/index.d.ts +3 -3
  150. package/dist/web/records/depth/index.d.cts +9 -9
  151. package/dist/web/records/depth/index.d.ts +9 -9
  152. package/dist/web/records/index.d.cts +11 -11
  153. package/dist/web/records/index.d.ts +11 -11
  154. package/dist/web/records-sheet/index.cjs +10 -10
  155. package/dist/web/records-sheet/index.js +10 -10
  156. package/dist/web/shop/index.cjs +11 -11
  157. package/dist/web/shop/index.d.cts +3 -3
  158. package/dist/web/shop/index.d.ts +3 -3
  159. package/dist/web/shop/index.js +11 -11
  160. package/dist/web/televet/booking/index.d.cts +6 -6
  161. package/dist/web/televet/booking/index.d.ts +6 -6
  162. package/dist/web/texting/index.d.cts +5 -5
  163. package/dist/web/texting/index.d.ts +5 -5
  164. package/package.json +6 -2
@@ -1,7 +1,7 @@
1
1
  /*! @everfur/sdk. Copyright (c) 2026 Strand Health Inc. dba Everfur. All rights reserved. Use is subject to the Everfur SDK License: https://docs.everfur.com/license */
2
2
  "use client";
3
3
  import{createContext,useId,createElement,useMemo,useContext,useState,useRef,useCallback,useEffect,Component,useSyncExternalStore,useLayoutEffect}from"react";import{z}from"zod";import{jsx,jsxs,Fragment}from"react/jsx-runtime";var RECORD_SHARE_AUDIENCES=/* @__PURE__ */Object.freeze(["vet","groomer","boarding"]),https=/* @__PURE__ */z.string().min(1).refine(value=>value.startsWith("https://")),str=/* @__PURE__ */z.string().nullish(),audienceField=/* @__PURE__ */z.unknown().optional(),linkSchema=/* @__PURE__ */z.object({share_id:/* @__PURE__ */z.string().min(1),share_url:/* @__PURE__ */z.string().min(1),expires_at:str,audience:audienceField}),listSchema=/* @__PURE__ */z.object({shares:/* @__PURE__ */z.array(/* @__PURE__ */z.object({share_id:/* @__PURE__ */z.string().min(1),expires_at:str,created_at:str,view_count:/* @__PURE__ */z.number().int().nonnegative().nullish(),last_viewed_at:str,audience:audienceField})).optional()}),pdfSchema=/* @__PURE__ */z.object({download_url:https,expires_at:str}),emailSchema=/* @__PURE__ */z.object({share_id:/* @__PURE__ */z.string().min(1),expires_at:str,audience:audienceField}),scopeSchema=/* @__PURE__ */z.object({audience:/* @__PURE__ */z.string().min(1),sections:/* @__PURE__ */z.array(/* @__PURE__ */z.string()),entity_types:/* @__PURE__ */z.array(/* @__PURE__ */z.string()).nullable()}),SHARE_RECIPIENT_EMAIL_MAX=254;function isShareRecipientEmail(value){let trimmed=value.trim();return trimmed.length>0&&trimmed.length<=SHARE_RECIPIENT_EMAIL_MAX&&/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(trimmed)}var isAudience=value=>typeof value=="string"&&RECORD_SHARE_AUDIENCES.includes(value);function audienceOf(value){return isAudience(value)?value:null}function mapShareAudiences(wire){let parsed=z.array(scopeSchema).safeParse(wire);if(!parsed.success)/* @__PURE__ */return Object.freeze([]);let seen=/* @__PURE__ */new Set,scopes=[];for(let scope of parsed.data)!isAudience(scope.audience)||seen.has(scope.audience)||(seen.add(scope.audience),scopes.push(/* @__PURE__ */Object.freeze({audience:scope.audience,sections:/* @__PURE__ */Object.freeze([...scope.sections]),entityTypes:scope.entity_types===null?null:/* @__PURE__ */Object.freeze([...scope.entity_types])}))/* @__PURE__ */);return Object.freeze(scopes)}function resolveShareUrl(shareUrl,apiBaseUrl){let trimmed=shareUrl.trim();if(trimmed.length===0)return null;try{let absolute=/^[a-z][a-z0-9+.-]*:/i.test(trimmed)?new URL(trimmed):apiBaseUrl!==void 0?new URL(trimmed,apiBaseUrl):null;return absolute===null||absolute.protocol!=="https:"?null:absolute.toString()}catch{return null}}function mapRecordShareLink(wire,apiBaseUrl){let parsed=linkSchema.safeParse(wire);if(!parsed.success)return null;let shareUrl=resolveShareUrl(parsed.data.share_url,apiBaseUrl);return shareUrl===null?null:/* @__PURE__ */Object.freeze({shareId:parsed.data.share_id,shareUrl:shareUrl,expiresAt:parsed.data.expires_at??null,audience:audienceOf(parsed.data.audience)})}function mapRecordShareList(wire){let parsed=listSchema.safeParse(wire);return parsed.success?/* @__PURE__ */Object.freeze((parsed.data.shares??[]).map(share=>/* @__PURE__ */Object.freeze({shareId:share.share_id,expiresAt:share.expires_at??null,createdAt:share.created_at??null,viewCount:share.view_count??0,lastViewedAt:share.last_viewed_at??null,audience:audienceOf(share.audience)}))):null}function mapRecordShareEmailReceipt(wire){let parsed=emailSchema.safeParse(wire);return parsed.success?/* @__PURE__ */Object.freeze({shareId:parsed.data.share_id,expiresAt:parsed.data.expires_at??null,audience:audienceOf(parsed.data.audience)}):null}function mapRecordPdfLink(wire){let parsed=pdfSchema.safeParse(wire);return parsed.success?/* @__PURE__ */Object.freeze({downloadUrl:parsed.data.download_url,expiresAt:parsed.data.expires_at??null}):null}var RECORDS_PDF_CONTENT_TYPE="application/pdf",RECORDS_PHOTO_CONTENT_TYPES=/* @__PURE__ */Object.freeze(["image/jpeg","image/png","image/heic","image/heif"]),isPhotoType=value=>RECORDS_PHOTO_CONTENT_TYPES.includes(value);var RECORDS_FEATURES_PDF_ONLY=/* @__PURE__ */Object.freeze({features:/* @__PURE__ */Object.freeze({}),uploadContentTypes:/* @__PURE__ */Object.freeze([RECORDS_PDF_CONTENT_TYPE]),shareAudiences:/* @__PURE__ */Object.freeze([])}),featuresSchema=/* @__PURE__ */z.object({features:/* @__PURE__ */z.record(/* @__PURE__ */z.boolean()),upload_content_types:/* @__PURE__ */z.array(/* @__PURE__ */z.string()).nullish(),share_audiences:/* @__PURE__ */z.unknown().optional()});function mapRecordsFeatures(wire){let parsed=featuresSchema.safeParse(wire);if(!parsed.success)return RECORDS_FEATURES_PDF_ONLY;let listed=parsed.data.upload_content_types??[],photos=RECORDS_PHOTO_CONTENT_TYPES.filter(type=>listed.includes(type));/* @__PURE__ */
4
- return Object.freeze({features:/* @__PURE__ */Object.freeze({...parsed.data.features}),uploadContentTypes:/* @__PURE__ */Object.freeze([RECORDS_PDF_CONTENT_TYPE,...photos]),shareAudiences:mapShareAudiences(parsed.data.share_audiences)})}function acceptsPhotos(types){return types!==void 0&&types.some(isPhotoType)}var HostRenderBoundary=class extends Component{constructor(){super(...arguments);this.state={failed:false,key:this.props.resetKey}}static getDerivedStateFromError(){return{failed:true}}static getDerivedStateFromProps(props,state){return Object.is(props.resetKey,state.key)?null:{failed:false,key:props.resetKey}}render(){return this.state.failed?this.props.fallback:this.props.children}};function RenderHost({render:render}){return render()}function HostRender({render:render,fallback:fallback,resetKey:resetKey}){return createElement(HostRenderBoundary,{fallback:fallback,resetKey:resetKey,children:createElement(RenderHost,{render:render})})}var CONTRACT_RETRYABILITY=/* @__PURE__ */Object.freeze([
4
+ return Object.freeze({features:/* @__PURE__ */Object.freeze({...parsed.data.features}),uploadContentTypes:/* @__PURE__ */Object.freeze([RECORDS_PDF_CONTENT_TYPE,...photos]),shareAudiences:mapShareAudiences(parsed.data.share_audiences)})}function acceptsPhotos(types){return types!==void 0&&types.some(isPhotoType)}var HostRenderBoundary=class extends Component{constructor(){super(...arguments);this.state={failed:false,key:this.props.resetKey}}static getDerivedStateFromError(){return{failed:true}}static getDerivedStateFromProps(props,state){return Object.is(props.resetKey,state.key)?null:{failed:false,key:props.resetKey}}render(){return this.state.failed?this.props.fallback:this.props.children}};function RenderHost({render:render}){return render()}function HostRender({render:render,fallback:fallback,resetKey:resetKey}){return createElement(HostRenderBoundary,{fallback:fallback,resetKey:resetKey,children:createElement(RenderHost,{render:render})})}var NAMELESS_PET="your pet";var capital=text2=>text2.charAt(0).toUpperCase()+text2.slice(1);function pronounForSex(sex){let s=sex?.trim().toLowerCase();return s==="female"?"her":s==="male"?"his":null}function sheetPetWords(name,pronoun){let trimmed=name.trim(),shown=trimmed.length>0?trimmed:NAMELESS_PET,Name=capital(shown);return pronoun==="her"?{name:shown,Name:Name,poss:"her",Poss:"Her",subj:"she"}:pronoun==="his"?{name:shown,Name:Name,poss:"his",Poss:"His",subj:"he"}:{name:shown,Name:Name,poss:`${shown}'s`,Poss:`${Name}'s`,subj:shown}}var SHEET_COPY=/* @__PURE__ */Object.freeze({vitalsFrom:(w,visit,date2)=>`Vitals from ${w.poss} ${visit}, ${date2}`,vitalsSource:w=>`Where ${w.name}'s vitals come from`,temperature:"Temperature",heartRate:"Heart rate",breathing:"Breathing",upcomingCare:"Upcoming care",overdueBy:date2=>`Overdue · due by ${date2}`,dueSoon:"Due soon",later:"Later",noDate:"No date",dueIn:(date2,days)=>`Due ${date2} · in ${days} ${days===1?"day":"days"}`,dueToday:date2=>`Due ${date2} · today`,overdueByDays:(date2,days)=>`Overdue by ${days} ${days===1?"day":"days"} · due ${date2}`,recordsHistory:"Records & history",labs:"Labs & bloodwork",results:"results",screenings:"Screenings",screeningsClear:"All clear",screeningsToReview:n=>`${n} to review`,noScreenings:"No screenings yet",visits:"Visits & records",timeline:"Timeline",events:n=>`${n} ${n===1?"event":"events"}`,weight:"Weight",vetVisits:n=>`${n} vet ${n===1?"visit":"visits"}`,history:"History",theirClinic:w=>`${w.Poss} clinic`,bloodPanel:"Blood panel",aboveRange:"above range",belowRange:"below range",othersInRange:"Other values in range.",addRecords:w=>`Add ${w.name}'s records`,moreThanOneClinic:"Records can come from more than one clinic over a lifetime.",visitsCount:n=>`${n} ${n===1?"visit":"visits"}`,panelsCount:n=>`${n} blood ${n===1?"panel":"panels"}`,requestFromClinic:"Request from a clinic",uploadDocument:"Upload a document",onFileNow:"On file now",firstRecord:w=>`Add ${w.name}'s first record`,firstLead:w=>`Records can come from more than one clinic over a lifetime. Start with the one ${w.subj} sees most, and this page fills in from there.`,requestFromTheirClinic:w=>`Request from ${w.poss} clinic`,requestDetail:"We send a secure request and read every page they send back.",uploadDetail:"A PDF, or a photo of a paper record.",findClinic:w=>`Find ${w.name}'s clinic`,chooseFile:"Choose a file",sayBeats:/* @__PURE__ */Object.freeze(["Hmmm","I wonder","what I may be","hiding"]),sayStill:"I wonder what I may be hiding",sample:"Sample",peekLead:w=>`A sneak peek at how ${w.name}'s records will read. Every number links back to the page it came from.`,sampleNote:w=>`Sample data until ${w.poss} records arrive.`,onTheWay:w=>`${w.Name}'s records are on the way`,clinicsTake:"Clinics usually take 2 to 5 days.",anotherClinic:"Another clinic",anotherClinicDetail:"Seen more than one vet? We ask each one.",noDueDate:"No due date on file",noLabs:w=>`No lab results on file for ${w.name} yet. They show up here when a record includes a blood or urine panel.`,noVisits:w=>`No visits in ${w.name}'s records yet. They show up here when a record includes one.`,oneReading:"One reading so far: we'll plot a trend as more come in.",takingNow:"Taking now",noCurrentMeds:"No current medications on file.",noVetTitle:w=>`When ${w.name} has a vet, start here.`,requestedFrom:clinic=>`Requested from ${clinic}. Clinics usually take 2 to 5 days.`,onTheWayFrom:(w,clinic)=>`${w.Name}'s records from ${clinic} are on the way.`,readingUpload:"We're reading the document you uploaded.",seeWhereItStands:"See where it stands",topRisk:w=>`${w.Poss} top risk`,seePlan:w=>`See ${w.poss} Health Plan`,panelOn:date2=>`${date2} blood panel`,latestReading:"Latest reading",rangeLine:(low,high,unit)=>`range ${low} to ${high}${unit?` ${unit}`:""}`,noRange:"No range on the report",above:"Above",inRange:"In range",below:"Below",high:"High",belowRangePill:"Below range",changeUp:(delta,unit)=>`Up ${delta}${unit?` ${unit}`:""}`,changeDown:(delta,unit)=>`Down ${delta}${unit?` ${unit}`:""}`,changeSince:(date2,pct)=>` since ${date2}, about ${pct}%.`,whatIs:name=>`What ${name} is`,otherValues:panel=>`Other ${panel} values`,panelTitle:(panel,date2)=>`${panel} · ${date2}`,askAboutThis:"Ask about this"});function sheetSampleKind(species){let s=species?.trim().toLowerCase()??"";return/^(dog|canine|k9|puppy)\b/.test(s)?"dog":/^(cat|feline|kitten)\b/.test(s)?"cat":"other"}var RECORDS_TERMINAL=/* @__PURE__ */Object.freeze(["published","failed","revoked"]);function isTerminalStatus(status){return RECORDS_TERMINAL.includes(status)}var DAY_MS=864e5,DUE_SOON_DAYS=30,LB_PER_KG=2.20462,MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function dayMs(value){if(value==null||value.length===0)return null;let ms=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(value)?`${value}T00:00:00Z`:value);return Number.isNaN(ms)?null:ms}function shortDate(ms){let d=new Date(ms);return`${MONTHS[d.getUTCMonth()]??""} ${d.getUTCDate()}`}function longDate(ms){return`${shortDate(ms)}, ${new Date(ms).getUTCFullYear()}`}function monthTick(ms){let d=new Date(ms);return`${d.getUTCMonth()+1}/${String(d.getUTCFullYear()%100).padStart(2,"0")}`}var dayKey=ms=>new Date(ms).toISOString().slice(0,10);function num(value){return String(Math.round(value*100)/100)}var lb=kg=>Math.round(kg*LB_PER_KG*10)/10;function midSentence(text2){let t=text2.trim();return t.length<2||t[1]===t[1]?.toUpperCase()?t:t.charAt(0).toLowerCase()+t.slice(1)}function vitalKind(text2){return/temp/i.test(text2)?"temp":/heart|pulse/i.test(text2)?"heart":/resp|breath/i.test(text2)?"breath":null}var VITAL_ORDER=["temp","heart","breath"],VITAL_LABEL={temp:SHEET_COPY.temperature,heart:SHEET_COPY.heartRate,breath:SHEET_COPY.breathing};function sheetVitals(record){if(record===null||record.withheld)return{vitals:[],observedMs:null};let best=/* @__PURE__ */new Map;for(let e of record.entities){if(e.category!=="vital"||e.value===null||e.value.trim().length===0)continue;let kind=vitalKind(`${e.canonicalKey??""} ${e.key} ${e.label}`);if(kind===null)continue;let ms=dayMs(e.observedAt)??0,prev=best.get(kind);(prev===void 0||ms>prev.ms)&&best.set(kind,{value:e.value.trim(),unit:e.unit,ms:ms})}let vitals=VITAL_ORDER.flatMap(kind=>{let v=best.get(kind);return v===void 0?[]:[{kind:kind,value:v.value,unit:v.unit,label:VITAL_LABEL[kind]}]}),observed=[...best.values()].map(v=>v.ms).filter(ms=>ms>0);return{vitals:vitals,observedMs:observed.length>0?Math.max(...observed):null}}function encounterOn(encounters,ms){let key=dayKey(ms);return encounters.find(e=>{let at=dayMs(e.date);return at!==null&&dayKey(at)===key})??null}function dueIcon(title){return/vaccin|rabies|dhpp|booster|bordetella|lepto|lyme|parvo|distemper/i.test(title)?"efi-shield":/\b(alt|alp|lab|labs|blood|panel|bloodwork|urinalysis|chemistry|cbc)\b/i.test(title)?"efi-flask-sm":"efi-calendar"}function sheetDue(items,nowMs){return items.map(item=>{let due=dayMs(item.dueAt),icon=dueIcon(item.title);if(due!==null&&due<nowMs-DAY_MS+1)return{item:item,title:item.title,when:SHEET_COPY.overdueBy(shortDate(due)),tone:"alert",pill:null,icon:icon};let when=item.detail??(due===null?SHEET_COPY.noDueDate:longDate(due));if(due===null)return{item:item,title:item.title,when:when,tone:"none",pill:null,icon:icon};let soon=due-nowMs<=DUE_SOON_DAYS*DAY_MS;return{item:item,title:item.title,when:when,tone:soon?"watch":"later",pill:soon?SHEET_COPY.dueSoon:SHEET_COPY.later,icon:icon}})}function pointFlag(status){return status==null?null:/above|high/i.test(status)?"above":/below|low/i.test(status)?"below":/in_range|normal|in range/i.test(status)?"in":null}var kgShown=kg=>Math.round(kg*10)/10;function weightText(kg,unit){let pounds=`${num(lb(kg))} lb`,kilos=`${num(kgShown(kg))} kg`;return unit==="kg"?{main:kilos,other:pounds}:{main:pounds,other:kilos}}function weightModel(timeline,unit){if(timeline===null||timeline.withheld)return null;let readings=timeline.weights.flatMap(w=>{let ms=dayMs(w.observedOn);return ms===null||w.weightKg===null?[]:[{ms:ms,kg:w.weightKg}]}).sort((a,b)=>a.ms-b.ms),last=readings[readings.length-1];if(last===void 0)return null;let lbs=readings.map(r=>lb(r.kg)),lo=Math.min(...lbs),hi=Math.max(...lbs),t0=readings[0]?.ms??last.ms,span=last.ms-t0,points=readings.map((r,i)=>({x:span>0?Math.round((3.55+93.45*(r.ms-t0)/span)*100)/100:50,y:hi>lo?Math.round((75-50*((lbs[i]??lo)-lo)/(hi-lo))*10)/10:50,lb:lbs[i]??0,value:unit==="kg"?kgShown(r.kg):lbs[i]??0,ms:r.ms})),tickPoints=points.length<=4?points:[points[0],points[points.length-1]].filter(p=>p!==void 0),text2=weightText(last.kg,unit);return{latest:text2.main,sub:`${text2.other} · ${shortDate(last.ms)}`,single:points.length===1,points:points,ticks:tickPoints.map(p=>({x:p.x,label:monthTick(p.ms)})),vetCount:points.length}}function labDays(markers){let days=/* @__PURE__ */new Map;if(markers===null||markers.withheld)return days;for(let marker of markers.markers)for(let point of marker.points){let ms=dayMs(point.at);if(ms===null)continue;let key=dayKey(ms),day=days.get(key)??{ms:ms,flagged:[],total:0,inRange:0,clinics:/* @__PURE__ */new Set};day.total+=1;let flag=pointFlag(point.status);flag==="in"&&(day.inRange+=1),(flag==="above"||flag==="below")&&day.flagged.push({marker:marker,point:point,ms:ms,flag:flag}),point.sourceClinic&&day.clinics.add(point.sourceClinic),days.set(key,day)}return days}function historyModel(inputs,days){let items=[];for(let[key,day]of days)day.flagged.forEach((f,i)=>{let value=f.point.value===null?f.point.qualitativeResult??"":num(f.point.value),unit=f.point.unit??f.marker.unit,others=day.flagged.length===1&&day.inRange===day.total-1&&day.total>1;items.push({key:`lab-${key}-${f.marker.markerId}-${i}`,ms:day.ms,date:`${shortDate(day.ms)} · ${SHEET_COPY.bloodPanel}`,title:`${f.marker.name} ${value}${unit?` ${unit}`:""}, ${f.flag==="above"?SHEET_COPY.aboveRange:SHEET_COPY.belowRange}`,text:others?SHEET_COPY.othersInRange:null,alert:true,markerId:f.marker.markerId,order:0})});let encounters=inputs.depth?.withheld===false?inputs.depth.encounters:[],visits=inputs.timeline?.withheld===false?inputs.timeline.visits:[],usedVisits=/* @__PURE__ */new Set;encounters.forEach((e,i)=>{let ms=dayMs(e.date);if(ms===null)return;let visit=visits.find(v=>e.docId!==null&&v.docId===e.docId||dayMs(v.visitDate)!==null&&dayKey(dayMs(v.visitDate)??0)===dayKey(ms))??null;visit!==null&&usedVisits.add(visit.visitId);let summary=visit?.summary?.trim()||null,type=e.type?.trim()||null,title=summary??type;title!==null&&items.push({key:`enc-${e.encounterId}-${i}`,ms:ms,date:summary!==null&&type!==null?`${shortDate(ms)} · ${type}`:shortDate(ms),title:title,text:null,alert:false,markerId:null,order:1})});for(let v of visits){let ms=dayMs(v.visitDate),summary=v.summary?.trim()||null;usedVisits.has(v.visitId)||ms===null||summary===null||items.push({key:`visit-${v.visitId}`,ms:ms,date:shortDate(ms),title:summary,text:null,alert:false,markerId:null,order:1})}items.sort((a,b)=>b.ms-a.ms||a.order-b.order);let years=[];for(let entry of items){let item={key:entry.key,ms:entry.ms,date:entry.date,title:entry.title,text:entry.text,alert:entry.alert,markerId:entry.markerId},year=String(new Date(item.ms).getUTCFullYear()),last=years[years.length-1];last!==void 0&&last.year===year?last.items.push(item):years.push({year:year,items:[item]})}return{years:years,count:items.length}}function sourcesModel(inputs,days){let encounters=inputs.depth?.withheld===false?inputs.depth.encounters:[],clinicLabel=name=>name?.trim()||SHEET_COPY.theirClinic(inputs.words),visits=/* @__PURE__ */new Map;for(let e of encounters)visits.set(clinicLabel(e.clinicName),(visits.get(clinicLabel(e.clinicName))??0)+1);let panels=/* @__PURE__ */new Map,onlyClinic=visits.size===1?[...visits.keys()][0]:void 0;for(let day of days.values()){let names=day.clinics.size>0?[...day.clinics].map(clinicLabel):[onlyClinic??SHEET_COPY.theirClinic(inputs.words)];for(let n of names)panels.set(n,(panels.get(n)??0)+1)}return[.../* @__PURE__ */new Set([...visits.keys(),...panels.keys()])].map(label=>({label:label,detail:[(visits.get(label)??0)>0?SHEET_COPY.visitsCount(visits.get(label)??0):null,(panels.get(label)??0)>0?SHEET_COPY.panelsCount(panels.get(label)??0):null].filter(p=>p!==null).join(" · ")}))}var PULL_PCT={requested:15,awaiting_clinic:35,awaiting_upload:35,received:60,parsing:75,in_review:90};function sheetPull(requests){let open=requests.filter(r=>!isTerminalStatus(r.status)).sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0))[0];if(open===void 0)return null;let step=(open.waitingExpectation?.trim()||open.statusLabel).trim();return step.length===0?null:{step:step,pct:PULL_PCT[open.status]??15}}var newestFirst=requests=>[...requests].sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0)),sentence=label=>/[.!?]$/.test(label)?label:`${label}.`;function sheetOnTheWay(words2,requests){let active=newestFirst(requests).filter(r=>!isTerminalStatus(r.status)),waiting=active.filter(r=>r.status==="awaiting_upload"),moving=active.filter(r=>r.status!=="awaiting_upload"),lines=[],clinics=/* @__PURE__ */new Map;for(let r of moving){let clinic=r.clinicName?.trim()??"";r.source!=="clinic_request"||clinic===""||clinics.has(clinic)||clinics.set(clinic,r)}for(let[clinic,newest]of clinics)lines.push({key:`clinic-${clinic}`,text:SHEET_COPY.onTheWayFrom(words2,clinic),requestId:newest.id});let upload=moving.find(r=>r.source==="owner_provided");upload!==void 0&&lines.push({key:"upload",text:SHEET_COPY.readingUpload,requestId:upload.id});let wait=waiting[0],label=wait?.statusLabel.trim()??"";return wait!==void 0&&label!==""&&lines.push({key:"awaiting-upload",text:sentence(label),requestId:wait.id}),lines}function sheetRequestedClinic(requests){return newestFirst(requests).find(r=>!isTerminalStatus(r.status)&&r.status!=="awaiting_upload"&&r.source==="clinic_request"&&(r.clinicName?.trim()??"")!=="")?.clinicName?.trim()??null}function sheetMedications(timeline){if(timeline===null||timeline.withheld)return null;let named=timeline.medications.filter(m=>(m.drugName?.trim()??"")!=="");return named.length===0?null:{current:named.filter(m=>(m.stoppedOn?.trim()??"")==="").map(m=>{let parts=[m.dose,m.frequency,m.route].map(p=>p?.trim()??"").filter(p=>p!==""),detail=m.sig?.trim()||(parts.length>0?parts.join(" · "):null);return{key:m.medicationId,name:(m.drugName??"").trim(),detail:detail}})}}function sheetFailedRequest(requests){if(requests.some(r=>!isTerminalStatus(r.status)))return null;let newest=[...requests].sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0))[0];if(newest===void 0||newest.status!=="failed")return null;let words2=newest.statusLabel.trim();return words2.length>0?words2:null}function sheetHasRecord(record,markers,depth){return record!==null&&!record.withheld&&!record.isEmpty||markers!==null&&!markers.withheld&&markers.markers.length>0?true:depth!==null&&!depth.withheld&&depth.encounters.length>0}function sheetAge(ageYears){if(typeof ageYears!="number"||!Number.isFinite(ageYears)||ageYears<=0)return null;let totalMonths=Math.floor(ageYears*12+1e-9),years=Math.floor(totalMonths/12),months=totalMonths%12;return years<=0?`${months}M`:months>0?`${years}Y ${months}M`:`${years}Y`}function buildRecordsSheetModel(inputs){let{record:record,depth:depth,markers:markers,nowMs:nowMs}=inputs,has=sheetHasRecord(record,markers,depth),pull=sheetPull(inputs.requests),days=labDays(markers),{vitals:vitals,observedMs:observedMs}=sheetVitals(record),encounters=depth?.withheld===false?depth.encounters:[],visitAt=observedMs===null?null:encounterOn(encounters,observedMs),vitalsFrom=observedMs!==null&&visitAt?.type?SHEET_COPY.vitalsFrom(inputs.words,midSentence(visitAt.type),shortDate(observedMs)):null,unit=inputs.weightUnit??"lb",weight=weightModel(inputs.timeline,unit),latestKg=weight!==null?null:inputs.petWeightKg,meta=[inputs.breed?.trim()||null,sheetAge(inputs.petAgeYears),weight?.latest??(latestKg!==null?weightText(latestKg,unit).main:null)].filter(p=>p!==null),timelineVisits=inputs.timeline?.withheld===false?inputs.timeline.visits.length:0,history=historyModel(inputs,days),encounterDays=encounters.map(e=>dayMs(e.date)).filter(ms=>ms!==null),markerList=markers?.withheld===false?markers.markers:[],featured=markers?.featuredMarkerId??markerList.find(m=>pointFlag(m.latest?.status)==="above"||pointFlag(m.latest?.status)==="below")?.markerId??markerList[0]?.markerId??null;return{state:has?"full":pull!==null?"onTheWay":"none",meta:meta.length>0?meta.join(" · "):null,vitals:vitals,vitalsFrom:vitalsFrom,due:record!==null&&!record.withheld?sheetDue(record.forwardLooking,nowMs):[],labsCount:markers?.withheld===false?markers.summary?.totalMarkers??markers.markers.length:0,featuredMarkerId:featured,latestVisit:encounterDays.length>0?longDate(Math.max(...encounterDays)):null,weight:weight,history:history.years,historyCount:history.count,sources:sourcesModel(inputs,days),pull:pull,hasVisits:encounters.length>0||timelineVisits>0,medications:sheetMedications(inputs.timeline),failedRequest:pull===null?sheetFailedRequest(inputs.requests):null,inFlight:sheetOnTheWay(inputs.words,inputs.requests),requestedClinic:sheetRequestedClinic(inputs.requests)}}function lastPoint(marker){let dated=marker.points.filter(p=>p.value!==null);return dated[dated.length-1]??marker.points[marker.points.length-1]??null}function rangeOf(point){return point===null||point.refLow===null||point.refHigh===null||!Number.isFinite(point.refLow)||!Number.isFinite(point.refHigh)||point.refHigh<=point.refLow?null:{low:point.refLow,high:point.refHigh}}function markerRow(marker,point=lastPoint(marker)){let range=rangeOf(point),unit=point?.unit??marker.unit,value=point?.value??null;return{markerId:marker.markerId,name:marker.name,value:value===null?point?.qualitativeResult??"":num(value),unit:unit,range:range===null?null:`${num(range.low)} to ${num(range.high)}${unit?` ${unit}`:""}`,at:range===null||value===null?null:Math.round(Math.min(100,Math.max(0,20+60*(value-range.low)/(range.high-range.low)))),flag:pointFlag(point?.status??marker.latest?.status??null)}}function flagPill(flag){return flag==="above"?SHEET_COPY.high:flag==="below"?SHEET_COPY.belowRangePill:flag==="in"?SHEET_COPY.inRange:null}var panelWord=panel=>{let name=panel.replace(/\s+panel$/i,"").trim()||panel;return name.length>1&&name[1]===name[1]?.toUpperCase()?name:name.charAt(0).toLowerCase()+name.slice(1)};function buildSheetLabModel(markers,markerId){let marker=markers.markers.find(m=>m.markerId===markerId);if(marker===void 0)return null;let last=lastPoint(marker),row=markerRow(marker,last),lastMs=dayMs(last?.at??marker.latest?.at??null),range=rangeOf(last),latestSub=[lastMs===null?null:shortDate(lastMs),range===null?SHEET_COPY.noRange:SHEET_COPY.rangeLine(num(range.low),num(range.high),row.unit)].filter(p=>p!==null).join(" · "),numeric=marker.points.flatMap(p=>{let ms=dayMs(p.at);return p.value===null||ms===null?[]:[{p:p,ms:ms,v:p.value}]}),chart=[];if(numeric.length>0){let values=numeric.map(n=>n.v),lo=range?.low??Math.min(...values),hi=range?.high??Math.max(...values);chart=numeric.map((n,i)=>({x:numeric.length===1?50:Math.round((18+64*i/(numeric.length-1))*100)/100,y:hi>lo?Math.min(98,Math.max(2,Math.round((75-50*(n.v-lo)/(hi-lo))*10)/10)):50,label:num(n.v),out:pointFlag(n.p.status)==="above"||pointFlag(n.p.status)==="below",tick:shortDate(n.ms)}))}let first=numeric[0],final=numeric[numeric.length-1],change=null;if(first!==void 0&&final!==void 0&&numeric.length>=2&&final.v!==first.v){let delta=Math.abs(final.v-first.v),pct=first.v!==0?Math.round(delta/Math.abs(first.v)*100):null,lead2=final.v>first.v?SHEET_COPY.changeUp(num(delta),row.unit):SHEET_COPY.changeDown(num(delta),row.unit);change=pct===null?null:{lead:lead2,rest:SHEET_COPY.changeSince(shortDate(first.ms),pct)}}let groups=[],lastKey=lastMs===null?null:dayKey(lastMs),others=markers.markers.filter(m=>m.markerId!==marker.markerId),samePanel=others.filter(m=>m.panel!==null&&m.panel===marker.panel);if(samePanel.length>0&&marker.panel!==null){let rows=samePanel.map(m=>markerRow(m));groups.push({title:SHEET_COPY.otherValues(panelWord(marker.panel)),allInRange:rows.every(r=>r.flag==="in"),rows:rows})}if(lastKey!==null&&lastMs!==null){let byPanel=/* @__PURE__ */new Map;for(let m of others){if(m.panel===null||m.panel===marker.panel)continue;let p=[...m.points].reverse().find(pt=>{let ms=dayMs(pt.at);return ms!==null&&dayKey(ms)===lastKey});p!==void 0&&byPanel.set(m.panel,[...byPanel.get(m.panel)??[],markerRow(m,p)])}for(let[panel,rows]of byPanel)groups.push({title:SHEET_COPY.panelTitle(panel,shortDate(lastMs)),allInRange:rows.every(r=>r.flag==="in"),rows:rows})}return{markerId:marker.markerId,name:marker.name,meta:lastMs===null?null:SHEET_COPY.panelOn(longDate(lastMs)),pill:flagPill(row.flag),flagged:row.flag==="above"||row.flag==="below",latest:`${row.value}${row.unit?` ${row.unit}`:""}`,latestSub:latestSub,hasRange:range!==null,chart:chart,change:change,meaning:(marker.meaning??"").split(/\n\s*\n/).map(p=>p.trim()).filter(p=>p.length>0),groups:groups}}var HEALTH_TAB_SHARED_COPY=/* @__PURE__ */Object.freeze({vitalsFromLabel:pet=>`Where ${pet}’s vitals come from`,vitalsFrom:(vet,date2)=>`From ${vet}’s exam, ${date2}. `,examNotes:"Exam notes",onTheWayFrom:(pet,clinic)=>`${pet}’s records from ${clinic} are on the way.`,readingUpload:"We’re reading the document you uploaded.",uploadFormatHint:"Upload PDF records you already have, up to 25 MB each. You can pick several at once. We'll read them and add the results to your records.",uploadLimitHint:"PDFs up to 25 MB each. You can pick several at once.",results:n=>n===1?"result":"results",noScreenings:"No screenings yet",screeningsToReview:n=>`${n} to review`,screeningsClear:"All clear",noVisits:"No visits yet",oneReading:"One reading so far: we’ll plot a trend as more come in.",uploadedDocument:"Uploaded document"}),MONTHS_SHORT=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function healthTabDate(ms){let d=new Date(ms);return`${MONTHS_SHORT[d.getUTCMonth()]??""} ${d.getUTCDate()}, ${d.getUTCFullYear()}`}function healthTabScreenings(markers){let W=HEALTH_TAB_SHARED_COPY,screenings=markers.filter(m=>(m.latest?.qualitativeResult??"").trim().length>0);if(screenings.length===0)return null;let flagged=screenings.filter(m=>screeningIsFlagged(m.latest?.status??null,m.latest?.qualitativeResult??"")),first=flagged[0]??screenings[0];return flagged.length>0?{label:W.screeningsToReview(flagged.length),flagged:true,markerId:first.markerId}:{label:W.screeningsClear,flagged:false,markerId:first.markerId}}function screeningIsFlagged(status,resultText){return status==="in_range"?false:status==="above"||status==="below"?true:/negative|not detected|clear|none/i.test(resultText)?false:/positive|detected|present|reactive/i.test(resultText)}function documentClassLabel(value){let spaced=value.replace(/_/g," ").trim();return spaced.length>0?spaced.charAt(0).toUpperCase()+spaced.slice(1):value}function healthTabSources(record,depth){if(record===null||record.withheld)return[];let clinics=/* @__PURE__ */new Map;if(depth!==null&&!depth.withheld)for(let e of depth.encounters){let name=e.clinicName?.trim();e.docId!==null&&name&&clinics.set(e.docId,name)}return Object.values(record.documents).sort((a,b)=>(dayMs(b.receivedAt)??0)-(dayMs(a.receivedAt)??0)).slice(0,4).reverse().map(doc=>{let received=dayMs(doc.receivedAt);return{key:doc.docId,name:clinics.get(doc.docId)??HEALTH_TAB_SHARED_COPY.uploadedDocument,meta:[doc.documentClass?documentClassLabel(doc.documentClass):null,received!==null?healthTabDate(received):null].filter(p=>p!==null).join(" · ")}})}var MONTHS_LONG=["January","February","March","April","May","June","July","August","September","October","November","December"];function examDate(ms){let d=new Date(ms);return`${MONTHS_LONG[d.getUTCMonth()]??""} ${d.getUTCDate()}`}function vitalsExam(depth,observedMs){if(observedMs===null||depth===null||depth.withheld)return null;let day=new Date(observedMs).toISOString().slice(0,10),encounter=depth.encounters.find(e=>{let ms2=dayMs(e.date);return ms2!==null&&new Date(ms2).toISOString().slice(0,10)===day}),vet=encounter?.veterinarian?.trim(),ms=dayMs(encounter?.date);return vet&&ms!==null?{vet:vet,date:examDate(ms)}:null}function healthTabOnTheWay(petName,requests){let W=HEALTH_TAB_SHARED_COPY;return sheetOnTheWay(sheetPetWords(petName,null),requests).map(line=>line.key==="upload"?{...line,text:W.readingUpload}:line.key.startsWith("clinic-")?{...line,text:W.onTheWayFrom(petName,line.key.slice(7))}:line)}var CONTRACT_RETRYABILITY=/* @__PURE__ */Object.freeze([
5
5
  /* @__PURE__ */Object.freeze({wireCode:"AccessDeniedException",envelope:"http_envelope",httpStatus:403,retryable:false}),
6
6
  /* @__PURE__ */Object.freeze({wireCode:"AuthorizationException",envelope:"http_envelope",httpStatus:401,retryable:false}),
7
7
  /* @__PURE__ */Object.freeze({wireCode:"ConflictException",envelope:"http_envelope",httpStatus:409,retryable:true}),
@@ -97,17 +97,17 @@ return Object.freeze({features:/* @__PURE__ */Object.freeze({...parsed.data.feat
97
97
  /* @__PURE__ */Object.freeze({wireCode:"webhook_url_rejected",envelope:"http_envelope",httpStatus:400,retryable:false})]);/* @__PURE__ */Object.freeze(CONTRACT_RETRYABILITY.map(row=>row.wireCode));var NORMALIZED_FOLD=/* @__PURE__ */Object.freeze({ValidationException:"validationFailed",AuthorizationException:"authRejected",PaymentRequiredException:"paymentRequired",AccessDeniedException:"accessDenied",ResourceNotFoundException:"resourceNotFound",ConflictException:"conflict",ThrottlingException:"rateLimited",InternalFailureException:"internalError",NotImplementedException:"notImplemented",ServiceUnavailableException:"serviceUnavailable",MethodNotAllowedException:"validationFailed",authExpired:"authExpired",unavailable:"serviceUnavailable",session_required:"sessionRequired",session_revoked:"authExpired",accessDenied:"accessDenied",invalidRequest:"sdkUpdateRequired",authRejected:"authRejected",rateLimited:"rateLimited",insufficientCapability:"accessDenied",unrestrictedKeyRequired:"accessDenied",user_ref_invalid:"validationFailed",event_cursor_invalid:"validationFailed",event_filter_invalid:"validationFailed",event_payload_invalid:"validationFailed",event_type_unknown:"validationFailed",idempotency_key_invalid:"validationFailed",idempotency_key_required:"validationFailed",idempotency_key_reused:"idempotencyConflict",payload_too_large:"validationFailed",webhook_url_rejected:"validationFailed",webhook_endpoint_update_empty:"validationFailed",webhook_endpoint_update_invalid:"validationFailed",event_type_not_available:"conflict",record_subject_not_found:"resourceNotFound",records_consent_required:"conflict",record_species_unsupported:"validationFailed",record_upload_invalid:"validationFailed",FILE_TOO_LARGE:"validationFailed",INVALID_CONTENT_TYPE:"validationFailed",attachment_unreadable:"validationFailed",provider_unsupported:"validationFailed",token_invalid:"validationFailed",device_cipher_unavailable:"serviceUnavailable",email_invalid:"validationFailed",consent_required:"validationFailed",consent_invalid:"validationFailed",consent_scope_wrong_route:"validationFailed",IDEMPOTENCY_KEY_IN_FLIGHT:"idempotencyInFlight",IDEMPOTENCY_KEY_REUSED_DIFFERENT_REQUEST:"idempotencyConflict",DAILY_QUOTA_EXCEEDED:"quotaExceeded",TIER_UPGRADE_REQUIRED:"paymentRequired",not_found:"conversationNotFound",timeout:"streamTimeout",internal_error:"internalError",invalid_request:"validationFailed",invalid_client:"authRejected",invalid_grant:"authRejected",unsupported_grant_type:"validationFailed",invalid_scope:"validationFailed",invalid_target:"validationFailed",invalid_redirect_uri:"validationFailed",invalid_client_metadata:"validationFailed",unsupported_response_type:"validationFailed",access_denied:"accessDenied",slow_down:"rateLimited",mcp_request_not_found:"resourceNotFound",mcp_request_gone:"resourceNotFound",mcp_connection_not_found:"resourceNotFound",mcp_request_conflict:"conflict",sandbox_only:"accessDenied",tenant_has_no_capabilities:"conflict",verify_mint_refused:"accessDenied",verify_mint_rate_limited:"rateLimited",verify_mint_unavailable:"serviceUnavailable",verify_user_ref_invalid:"validationFailed",insufficient_scope:"accessDenied",tenant_filter_invalid:"validationFailed",tenant_resource_not_found:"resourceNotFound",tenant_surface_not_enabled:"conflict",pet_health_species_unsupported:"validationFailed",pet_health_list_removals_unconfirmed:"validationFailed",petRefInUse:"conflict",share_limit_reached:"conflict",pet_not_registered:"resourceNotFound",species_unsupported:"validationFailed",partner_visit_owner_only:"accessDenied",partner_visit_link_conflict:"conflict",partner_visit_pet_already_mapped:"conflict",linked_account_read_only:"conflict",catalog_empty_refused:"conflict",catalog_shrink_refused:"conflict"}),CONTRACT_ERROR_ROWS=/* @__PURE__ */Object.freeze(CONTRACT_RETRYABILITY.map(generated=>/* @__PURE__ */Object.freeze({wireCode:generated.wireCode,envelope:generated.envelope,retryable:generated.retryable,normalized:NORMALIZED_FOLD[generated.wireCode]}))),BY_KEY=new Map(CONTRACT_ERROR_ROWS.map(r=>[r.envelope+r.wireCode.toUpperCase(),r])),ENVELOPE_LOOKUP_ORDER=/* @__PURE__ */Object.freeze(["http_envelope",...[...new Set(CONTRACT_ERROR_ROWS.map(r=>r.envelope))].filter(e=>e!=="http_envelope").sort()]);function contractErrorFor(wireCode,envelope){if(typeof wireCode!="string")return;let key=wireCode.trim().toUpperCase();if(key.length!==0)for(let candidate of[envelope??"http_envelope",...ENVELOPE_LOOKUP_ORDER]){let row=BY_KEY.get(candidate+key);if(row)return row}}var CATEGORY_OF=/* @__PURE__ */Object.freeze({authExpired:"authentication",authRejected:"authentication",sessionRequired:"authentication",identitySignatureRequired:"authentication",accessDenied:"authorization",paymentRequired:"entitlement",quotaExceeded:"rateLimit",rateLimited:"rateLimit",validationFailed:"invalidRequest",sdkUpdateRequired:"invalidRequest",runtimeDisposed:"invalidRequest",conversationNotFound:"notFound",petNotFound:"notFound",resourceNotFound:"notFound",conflict:"conflict",idempotencyConflict:"conflict",idempotencyInFlight:"conflict",streamTimeout:"connection",streamIncomplete:"connection",upstreamLlmTimeout:"connection",serviceUnavailable:"connection",internalError:"server",notImplemented:"server",mediaUploadFailed:"media",moderationBlocked:"policy",unknown:"unknown"});function categoryFor(code){return CATEGORY_OF[code]}function fromWire(wire){let contractRow=contractErrorFor(wire);if(contractRow)return contractRow.normalized;let upper=(wire??"").trim().toUpperCase(),canonical=upper.replace(/[^A-Z0-9]/g,"");if(canonical==="AUTHREJECTED")return"authRejected";if(upper.startsWith("AUTH"))return"authExpired";switch(canonical){case"DAILYQUOTAEXCEEDED":case"QUOTAEXCEEDED":return"quotaExceeded";case"RATELIMITED":case"TOOMANYREQUESTS":case"TELEVETRATELIMITED":return"rateLimited";case"IDEMPOTENCYKEYCONFLICT":case"IDEMPOTENCYCONFLICT":return"idempotencyConflict";case"ACCESSDENIED":case"FORBIDDEN":return"accessDenied";case"IDENTITYSIGNATUREREQUIRED":return"identitySignatureRequired";case"RUNTIMEDISPOSED":return"runtimeDisposed";case"NOTFOUND":case"CONVERSATIONNOTFOUND":return"conversationNotFound";case"PETNOTFOUND":return"petNotFound";case"TIMEOUT":case"STREAMTIMEOUT":return"streamTimeout";case"MEDIAUPLOADFAILED":case"UNRECOGNIZEDVIDEOFORMAT":case"FILETOOSMALL":return"mediaUploadFailed";case"MODERATIONBLOCKED":return"moderationBlocked";case"UPSTREAMLLMTIMEOUT":return"upstreamLlmTimeout";case"INTERNALERROR":case"INTERNALSERVERERROR":return"internalError";case"STREAMINCOMPLETE":case"CHATSTREAMINCOMPLETE":return"streamIncomplete";case"INVALIDANALYSISTYPE":case"INVALIDUPLOADPURPOSE":return"unknown";default:return"unknown"}}var AUTO_RETRYABLE_CODES=/* @__PURE__ */new Set(["streamTimeout","rateLimited","internalError","upstreamLlmTimeout","streamIncomplete"]);function isAutoRetryable(code){return AUTO_RETRYABLE_CODES.has(code)}var RETRYABLE_CONTRACT_CODES=/* @__PURE__ */new Set(["serviceUnavailable","conflict","idempotencyInFlight"]);function isRetryableCode(code){return isAutoRetryable(code)||RETRYABLE_CONTRACT_CODES.has(code)}var BACKOFF_BASE_MS=500,BACKOFF_CAP_MS=8e3,MAX_RETRY_ATTEMPTS=4;function backoffDelayMs(attempt,rng=Math.random){let bounded=Math.max(0,attempt),ceiling=Math.min(BACKOFF_BASE_MS*2**bounded,BACKOFF_CAP_MS);return Math.floor(rng()*ceiling)}var ACCESS_DENIED_COPY="This feature isn't available on your account right now.",VALIDATION_FAILED_COPY="Something in that request was not right. Check the details and try again.",USER_FACING_COPY=/* @__PURE__ */Object.freeze({authExpired:"Please sign in again to continue.",authRejected:"Please sign in again to continue.",sessionRequired:"This app needs to be updated to keep using Everfur.",accessDenied:ACCESS_DENIED_COPY,paymentRequired:"This is part of a paid plan.",quotaExceeded:"You have used today's messages. This resets tomorrow.",rateLimited:"You are sending messages quickly. Try again in a few seconds.",validationFailed:VALIDATION_FAILED_COPY,sdkUpdateRequired:"This app needs to be updated to keep using Everfur.",conflict:"That is already running. Wait for it to finish, then try again.",idempotencyConflict:"That message was already delivered.",idempotencyInFlight:"That is still processing. Give it a moment.",conversationNotFound:"This conversation is no longer available.",petNotFound:"We could not find that pet. Please pick a pet and try again.",resourceNotFound:"We could not find that.",streamTimeout:"The response timed out. Tap retry to try again.",mediaUploadFailed:"We could not upload that photo. Please attach it again.",moderationBlocked:"This request cannot be answered here.",upstreamLlmTimeout:"The response timed out. Tap retry to try again.",internalError:"We hit a snag on our end. Please try again.",notImplemented:"That is not available yet.",serviceUnavailable:"That service is briefly unavailable. Try again shortly.",streamIncomplete:"The connection dropped mid-answer. Tap retry to continue.",identitySignatureRequired:ACCESS_DENIED_COPY,runtimeDisposed:VALIDATION_FAILED_COPY,unknown:"Something went wrong. Please try again."}),SESSION_REVOKED_COPY="This session has ended. Please sign in again.",LINKED_ACCOUNT_READ_ONLY="linked_account_read_only";function displayFor(code,wireCode,reasonCode){return code==="conflict"&&reasonCode===LINKED_ACCOUNT_READ_ONLY?ACCESS_DENIED_COPY:(code==="authRejected"||code==="authExpired")&&typeof wireCode=="string"&&wireCode.trim().toLowerCase()==="session_revoked"?SESSION_REVOKED_COPY:userFacingError(code)}function userFacingError(code){return USER_FACING_COPY[code]}function defineHidden(target,key,value){Object.defineProperty(target,key,{value:value,enumerable:false,writable:false,configurable:false})}var REASON_CODE_SHAPE=/^[a-z][a-z0-9_]{0,63}$/;function makeEverfurError(code,opts){let row=contractErrorFor(opts?.wireCode,opts?.wireEnvelope),linkedReadOnly=code==="conflict"&&opts?.reasonCode===LINKED_ACCOUNT_READ_ONLY,error={code:code,category:categoryFor(code),retryable:opts?.retryable??(linkedReadOnly?false:isRetryableCode(code)),displayMessage:displayFor(code,opts?.wireCode,linkedReadOnly?LINKED_ACCOUNT_READ_ONLY:null)};opts?.httpStatus!==void 0&&(error.httpStatus=opts.httpStatus),opts?.requestId&&(error.requestId=opts.requestId),typeof opts?.reasonCode=="string"&&REASON_CODE_SHAPE.test(opts.reasonCode)&&(error.reasonCode=opts.reasonCode);let wait=opts?.retryAfterSeconds;if(typeof wait=="number"&&Number.isFinite(wait)&&wait>=0&&(error.retryAfterSeconds=Math.round(wait)),row);return opts?.wireMessage&&defineHidden(error,"wireMessage",opts.wireMessage),opts?.raw!==void 0&&opts.raw!==null&&defineHidden(error,"raw",opts.raw),/* @__PURE__ */Object.freeze(error)}function ok(value,warning){/* @__PURE__ */
98
98
  return Object.freeze({ok:true,value:value})}function err(error){/* @__PURE__ */
99
99
  return Object.freeze({ok:false,error:error})}var EverfurConfigError=class _EverfurConfigError extends Error{constructor(kind,message){super(message),this.name="EverfurConfigError",this.kind=kind,Object.setPrototypeOf(this,_EverfurConfigError.prototype)}};function errorFrame(fields){/* @__PURE__ */
100
- return Object.freeze({kind:"error",terminal:true,code:fields.code,retryable:fields.retryable,wireMessage:fields.wireMessage,synthesized:fields.synthesized,lastEventId:fields.lastEventId,serverRequestId:null})}function mintFailedError(cause,refusal){let message=cause instanceof Error?cause.message:typeof cause=="string"?cause:null;return makeEverfurError("authRejected",{retryable:false,...refusal?.wireCode?{wireCode:refusal.wireCode}:{},...refusal?.requestId?{requestId:refusal.requestId}:{},...message?{wireMessage:message}:{},...cause!=null?{raw:cause}:{}})}function authHeaders(auth){let headers={};return auth.mode==="personalized"?headers.authorization=`Bearer ${auth.token}`:headers["x-everfur-partner-key"]=auth.publishableKey,auth.userRef&&(headers["x-everfur-user-ref"]=auth.userRef),auth.sessionId&&(headers["x-everfur-session-id"]=auth.sessionId),headers}function withAuthHeaders(req,auth){return{...req,headers:{...stripAuthHeaders(req.headers),...authHeaders(auth)}}}function stripAuthHeaders(headers){if(!headers)return{};let out={};for(let[key,value]of Object.entries(headers)){let lower=key.toLowerCase();lower==="authorization"||lower==="x-everfur-partner-key"||(out[key]=value)}return out}async function authedSend(req,ctx){if(ctx.mode==="anonymous")return ctx.transport.request(withAuthHeaders(req,{mode:"anonymous",publishableKey:ctx.publishableKey,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));let token;try{token=await ctx.identity.currentToken()}catch(cause){return ctx.identity.reportRejected?.(),err(mintFailedError(cause))}let first=await ctx.transport.request(withAuthHeaders(req,{mode:"personalized",token:token,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));if(first.ok||first.error.httpStatus!==401)return first;let refreshed;try{refreshed=await ctx.identity.currentToken({forceRefresh:!0})}catch(cause){return ctx.identity.reportRejected?.(),err(mintFailedError(cause,{wireCode:wireCodeOf(first.error.raw),requestId:first.error.requestId}))}let retry=await ctx.transport.request(withAuthHeaders(req,{mode:"personalized",token:refreshed,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));return!retry.ok&&retry.error.httpStatus===401?(ctx.identity.reportRejected?.(),err(refusedAfterRemintError(retry.error))):retry}function refusedAfterRemintError(refusal){let raw=refusal.raw,wireCode=wireCodeOf(raw);return makeEverfurError("authRejected",{retryable:false,...refusal.httpStatus!==void 0?{httpStatus:refusal.httpStatus}:{},...refusal.requestId?{requestId:refusal.requestId}:{},...wireCode?{wireCode:wireCode}:{},...refusal.reasonCode?{reasonCode:refusal.reasonCode}:{},...refusal.wireMessage?{wireMessage:refusal.wireMessage}:{},...raw!=null?{raw:raw}:{}})}function wireCodeOf(body){if(typeof body!="object"||body===null)return null;let b=body,code=(typeof b.error=="object"&&b.error!==null?b.error.code:void 0)??b.code;return typeof code=="string"&&code.length>0?code:null}var SDK_VERSION="0.15.1";function networkError(cause){return makeEverfurError("internalError",{retryable:true,wireMessage:describeCause(cause)})}function describeCause(cause){return cause instanceof Error?cause.message:typeof cause=="string"?cause:"network request failed"}var FUNNEL_UNARY_TIMEOUT_MS=3e4,RETRY_OVERRIDE_MAX_MS=BACKOFF_CAP_MS*2,IDEMPOTENCY_HEADER="idempotency-key",MUTATING_METHODS=/* @__PURE__ */new Set(["POST","PUT","PATCH","DELETE"]),NOOP_OBSERVER=/* @__PURE__ */Object.freeze({onEvent(){}}),defaultFunnelTimers=/* @__PURE__ */Object.freeze({setTimeout:(handler,ms)=>setTimeout(handler,ms),clearTimeout:handle=>clearTimeout(handle),now:()=>Date.now()});function seededIdempotencyKey(seed){let safe=seed.trim().replace(/[^A-Za-z0-9_.:-]/g,"-");return safe.length===0?null:`efs_${safe}`.slice(0,128)}function createRequestFunnel(deps){let observer=deps.observer??NOOP_OBSERVER,timers=deps.timers??defaultFunnelTimers,rng=deps.rng??Math.random,sleep=deps.sleep??((ms,signal)=>delayAbortable(ms,timers,signal)),ceiling=deps.maxAttempts??MAX_RETRY_ATTEMPTS,timeoutMs=deps.unaryTimeoutMs??FUNNEL_UNARY_TIMEOUT_MS,mintKey=deps.newIdempotencyKey??defaultIdempotencyKeyFactory(),emit=event=>{try{observer.onEvent(event)}catch{}};async function send(call,req,opts){let perCallMaxAttempts=opts?.maxAttempts,maxAttempts=Math.max(1,perCallMaxAttempts??ceiling),idempotent=opts?.idempotent??MUTATING_METHODS.has(req.method),seeded=opts?.idempotencyKey===void 0?null:seededIdempotencyKey(opts.idempotencyKey),idempotencyKey=idempotent?seeded??mintKey():null,base2=assembleHeaders(req,idempotencyKey),attempt=0;for(;;){let stamp=extra=>/* @__PURE__ */Object.freeze({call:call,method:req.method,path:req.path,attempt:attempt,...idempotencyKey?{idempotencyKey:idempotencyKey}:{},...extra});emit(stamp({phase:"attempt"}));let deadline=boundedSignal(timeoutMs,timers),merged=mergeSignals(deadline.signal,req.signal),settled;try{settled=await authedSend({...base2,signal:merged.signal},deps.auth)}catch(cause){settled=err(networkError(cause))}finally{merged.dispose(),deadline.cancel()}if(settled.ok)return emit(stamp({phase:"settled",ok:true,reason:"ok"})),settled;let error=settled.error,decision=decideRetry(error,attempt,{maxAttempts:maxAttempts,rng:rng,now:timers.now(),aborted:req.signal?.aborted===true,...perCallMaxAttempts!==void 0?{perCallMaxAttempts:perCallMaxAttempts}:{},...deps.errorPolicy!==void 0?{policy:deps.errorPolicy}:{}}),settledEvent={ok:false,code:error.code,reason:decision.reason,...error.httpStatus!==void 0?{httpStatus:error.httpStatus}:{},...error.requestId!==void 0?{requestId:error.requestId}:{}};if(!decision.retry)return emit(stamp({phase:"settled",...settledEvent})),err(error);if(emit(stamp({phase:"retry",...settledEvent,delayMs:decision.delayMs})),await sleep(decision.delayMs,req.signal),req.signal?.aborted===true)return emit(stamp({phase:"settled",...settledEvent,reason:"aborted"})),err(error);attempt+=1}}async function authorize(req){return withAuthHeaders(req,await resolveDeviceAuth(deps.auth))}async function*stream(call,req,signal){emit(
100
+ return Object.freeze({kind:"error",terminal:true,code:fields.code,retryable:fields.retryable,wireMessage:fields.wireMessage,synthesized:fields.synthesized,lastEventId:fields.lastEventId,serverRequestId:null})}function mintFailedError(cause,refusal){let message=cause instanceof Error?cause.message:typeof cause=="string"?cause:null;return makeEverfurError("authRejected",{retryable:false,...refusal?.wireCode?{wireCode:refusal.wireCode}:{},...refusal?.requestId?{requestId:refusal.requestId}:{},...message?{wireMessage:message}:{},...cause!=null?{raw:cause}:{}})}function authHeaders(auth){let headers={};return auth.mode==="personalized"?headers.authorization=`Bearer ${auth.token}`:headers["x-everfur-partner-key"]=auth.publishableKey,auth.userRef&&(headers["x-everfur-user-ref"]=auth.userRef),auth.sessionId&&(headers["x-everfur-session-id"]=auth.sessionId),headers}function withAuthHeaders(req,auth){return{...req,headers:{...stripAuthHeaders(req.headers),...authHeaders(auth)}}}function stripAuthHeaders(headers){if(!headers)return{};let out={};for(let[key,value]of Object.entries(headers)){let lower=key.toLowerCase();lower==="authorization"||lower==="x-everfur-partner-key"||(out[key]=value)}return out}async function authedSend(req,ctx){if(ctx.mode==="anonymous")return ctx.transport.request(withAuthHeaders(req,{mode:"anonymous",publishableKey:ctx.publishableKey,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));let token;try{token=await ctx.identity.currentToken()}catch(cause){return ctx.identity.reportRejected?.(),err(mintFailedError(cause))}let first=await ctx.transport.request(withAuthHeaders(req,{mode:"personalized",token:token,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));if(first.ok||first.error.httpStatus!==401)return first;let refreshed;try{refreshed=await ctx.identity.currentToken({forceRefresh:!0})}catch(cause){return ctx.identity.reportRejected?.(),err(mintFailedError(cause,{wireCode:wireCodeOf(first.error.raw),requestId:first.error.requestId}))}let retry=await ctx.transport.request(withAuthHeaders(req,{mode:"personalized",token:refreshed,userRef:ctx.userRef,...ctx.sessionId?{sessionId:ctx.sessionId}:{}}));return!retry.ok&&retry.error.httpStatus===401?(ctx.identity.reportRejected?.(),err(refusedAfterRemintError(retry.error))):retry}function refusedAfterRemintError(refusal){let raw=refusal.raw,wireCode=wireCodeOf(raw);return makeEverfurError("authRejected",{retryable:false,...refusal.httpStatus!==void 0?{httpStatus:refusal.httpStatus}:{},...refusal.requestId?{requestId:refusal.requestId}:{},...wireCode?{wireCode:wireCode}:{},...refusal.reasonCode?{reasonCode:refusal.reasonCode}:{},...refusal.wireMessage?{wireMessage:refusal.wireMessage}:{},...raw!=null?{raw:raw}:{}})}function wireCodeOf(body){if(typeof body!="object"||body===null)return null;let b=body,code=(typeof b.error=="object"&&b.error!==null?b.error.code:void 0)??b.code;return typeof code=="string"&&code.length>0?code:null}var SDK_VERSION="0.16.0";function networkError(cause){return makeEverfurError("internalError",{retryable:true,wireMessage:describeCause(cause)})}function describeCause(cause){return cause instanceof Error?cause.message:typeof cause=="string"?cause:"network request failed"}var FUNNEL_UNARY_TIMEOUT_MS=3e4,RETRY_OVERRIDE_MAX_MS=BACKOFF_CAP_MS*2,IDEMPOTENCY_HEADER="idempotency-key",MUTATING_METHODS=/* @__PURE__ */new Set(["POST","PUT","PATCH","DELETE"]),NOOP_OBSERVER=/* @__PURE__ */Object.freeze({onEvent(){}}),defaultFunnelTimers=/* @__PURE__ */Object.freeze({setTimeout:(handler,ms)=>setTimeout(handler,ms),clearTimeout:handle=>clearTimeout(handle),now:()=>Date.now()});function seededIdempotencyKey(seed){let safe=seed.trim().replace(/[^A-Za-z0-9_.:-]/g,"-");return safe.length===0?null:`efs_${safe}`.slice(0,128)}function createRequestFunnel(deps){let observer=deps.observer??NOOP_OBSERVER,timers=deps.timers??defaultFunnelTimers,rng=deps.rng??Math.random,sleep=deps.sleep??((ms,signal)=>delayAbortable(ms,timers,signal)),ceiling=deps.maxAttempts??MAX_RETRY_ATTEMPTS,timeoutMs=deps.unaryTimeoutMs??FUNNEL_UNARY_TIMEOUT_MS,mintKey=deps.newIdempotencyKey??defaultIdempotencyKeyFactory(),emit=event=>{try{observer.onEvent(event)}catch{}};async function send(call,req,opts){let perCallMaxAttempts=opts?.maxAttempts,maxAttempts=Math.max(1,perCallMaxAttempts??ceiling),idempotent=opts?.idempotent??MUTATING_METHODS.has(req.method),seeded=opts?.idempotencyKey===void 0?null:seededIdempotencyKey(opts.idempotencyKey),idempotencyKey=idempotent?seeded??mintKey():null,base2=assembleHeaders(req,idempotencyKey),attempt=0;for(;;){let stamp=extra=>/* @__PURE__ */Object.freeze({call:call,method:req.method,path:req.path,attempt:attempt,...idempotencyKey?{idempotencyKey:idempotencyKey}:{},...extra});emit(stamp({phase:"attempt"}));let deadline=boundedSignal(timeoutMs,timers),merged=mergeSignals(deadline.signal,req.signal),settled;try{settled=await authedSend({...base2,signal:merged.signal},deps.auth)}catch(cause){settled=err(networkError(cause))}finally{merged.dispose(),deadline.cancel()}if(settled.ok)return emit(stamp({phase:"settled",ok:true,reason:"ok"})),settled;let error=settled.error,decision=decideRetry(error,attempt,{maxAttempts:maxAttempts,rng:rng,now:timers.now(),aborted:req.signal?.aborted===true,...perCallMaxAttempts!==void 0?{perCallMaxAttempts:perCallMaxAttempts}:{},...deps.errorPolicy!==void 0?{policy:deps.errorPolicy}:{}}),settledEvent={ok:false,code:error.code,reason:decision.reason,...error.httpStatus!==void 0?{httpStatus:error.httpStatus}:{},...error.requestId!==void 0?{requestId:error.requestId}:{}};if(!decision.retry)return emit(stamp({phase:"settled",...settledEvent})),err(error);if(emit(stamp({phase:"retry",...settledEvent,delayMs:decision.delayMs})),await sleep(decision.delayMs,req.signal),req.signal?.aborted===true)return emit(stamp({phase:"settled",...settledEvent,reason:"aborted"})),err(error);attempt+=1}}async function authorize(req){return withAuthHeaders(req,await resolveDeviceAuth(deps.auth))}async function*stream(call,req,signal){emit(
101
101
  /* @__PURE__ */Object.freeze({call:call,phase:"stream.open",method:req.method,path:req.path,attempt:0}));try{yield*deps.auth.transport.stream(req,signal)}catch{yield errorFrame({code:"internal_error",retryable:true,wireMessage:null,synthesized:true,lastEventId:null})}}/* @__PURE__ */
102
102
  return Object.freeze({send:send,authorize:authorize,stream:stream})}function assembleHeaders(req,idempotencyKey){let headers={};for(let[key,value]of Object.entries(req.headers??{}))key.toLowerCase()!==IDEMPOTENCY_HEADER&&(headers[key]=value);return idempotencyKey!==null&&(headers["Idempotency-Key"]=idempotencyKey),{...req,headers:headers}}function defaultIdempotencyKeyFactory(){let counter=0;return()=>`efk_${Date.now().toString(36)}_${(counter++).toString(36)}_${Math.random().toString(36).slice(2,12)}`}var POLICY_MAX_ATTEMPTS_CAP=10;function decideRetry(error,attempt,ctx){if(ctx.aborted)return{retry:false,reason:"aborted"};let throttle=throttleKind(error);if(throttle==="quota")return{retry:false,reason:"daily-quota-exhausted"};if(throttle!=="burst"&&!isAutoRetryable(error.code))return{retry:false,reason:"terminal-code"};let reason=throttle==="burst"?"burst-throttle":"retryable-code";if((()=>{if(ctx.policy===void 0)return false;try{return!ctx.policy.shouldRetry(error.code,attempt)}catch{return false}})())return{retry:false,reason:"terminal-code"};let policyCeiling=()=>{if(ctx.policy===void 0)return null;let raw;try{raw=ctx.policy.maxAttempts(error.code)}catch{return null}return typeof raw!="number"||!Number.isFinite(raw)?null:Math.max(1,Math.min(POLICY_MAX_ATTEMPTS_CAP,Math.floor(raw)))},ceiling=ctx.perCallMaxAttempts??policyCeiling()??ctx.maxAttempts;if(attempt+1>=ceiling)return{retry:false,reason:"attempts-exhausted"};let override=retryOverrideMs(error,ctx.now);return override!==null?override>RETRY_OVERRIDE_MAX_MS?{retry:false,reason:"server-reset-beyond-budget"}:{retry:true,reason:reason,delayMs:override}:{retry:true,reason:reason,delayMs:backoffDelayMs(attempt,ctx.rng)}}function throttleKind(error){let code=error.code==="unknown"?fromWire(rawWireCode(error.raw)):error.code;return code==="quotaExceeded"?"quota":code==="rateLimited"||error.httpStatus===429?"burst":null}function retryOverrideMs(error,now){let at=findResetsAt(error.raw);if(at!==null){let delta=at-now;return delta>0?delta:0}let wait=findRetryAfterSeconds(error.raw);return wait===null?null:Math.round(wait*1e3)}function findRetryAfterSeconds(raw){for(let scope of candidateScopes(raw)){let value=scope.retry_after_seconds;if(typeof value=="number"&&Number.isFinite(value)&&value>=0)return value}return null}function findResetsAt(raw){for(let scope of candidateScopes(raw)){let value=scope.resets_at,parsed=parseInstantMs(value);if(parsed!==null)return parsed}return null}function candidateScopes(raw){if(!isRecord(raw))return[];let out=[raw];for(let nested of["error","detail"]){let value=raw[nested];isRecord(value)&&out.push(value)}return out}function parseInstantMs(value){if(typeof value=="number"&&Number.isFinite(value))return value<1e11?Math.round(value*1e3):Math.round(value);if(typeof value=="string"&&value.trim().length>0){let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}return null}function rawWireCode(raw){for(let scope of candidateScopes(raw)){let code=scope.code;if(typeof code=="string"&&code.length>0)return code}return null}function isRecord(value){return typeof value=="object"&&value!==null}async function resolveDeviceAuth(auth){return auth.mode==="anonymous"?{mode:"anonymous",publishableKey:auth.publishableKey,userRef:auth.userRef,...auth.sessionId?{sessionId:auth.sessionId}:{}}:{mode:"personalized",token:await auth.identity.currentToken(),userRef:auth.userRef,...auth.sessionId?{sessionId:auth.sessionId}:{}}}function boundedSignal(ms,timers){let ctrl=new AbortController,handle=timers.setTimeout(()=>ctrl.abort(),ms);return{signal:ctrl.signal,cancel:()=>timers.clearTimeout(handle)}}function mergeSignals(deadline,caller){let noop=()=>{};if(!caller)return{signal:deadline,dispose:noop};let ctrl=new AbortController;if(deadline.aborted||caller.aborted)return ctrl.abort(),{signal:ctrl.signal,dispose:noop};let onAbort=()=>ctrl.abort();return deadline.addEventListener("abort",onAbort,{once:true}),caller.addEventListener("abort",onAbort,{once:true}),{signal:ctrl.signal,dispose:()=>{deadline.removeEventListener("abort",onAbort),caller.removeEventListener("abort",onAbort)}}}function delayAbortable(ms,timers,signal){return ms<=0||signal?.aborted===true?Promise.resolve():new Promise(resolve=>{let handle=timers.setTimeout(()=>{signal?.removeEventListener("abort",onAbort),resolve()},ms),onAbort=()=>{timers.clearTimeout(handle),resolve()};signal?.addEventListener("abort",onAbort,{once:true})})}function isNotFoundError(error){return error!=null&&(error.httpStatus===404||error.category==="notFound")}function plainNotFound(error){return error.code!=="conversationNotFound"?error:makeEverfurError("resourceNotFound",{retryable:false,...error.httpStatus===void 0?{}:{httpStatus:error.httpStatus},...error.requestId===void 0?{}:{requestId:error.requestId},...error.reasonCode===void 0?{}:{reasonCode:error.reasonCode},...error.wireMessage===void 0?{}:{wireMessage:error.wireMessage},...error.raw===void 0?{}:{raw:error.raw}})}function plainResult(res){return res.ok?res:err(plainNotFound(res.error))}function withPlainNotFound(funnel){return{send:async(...args)=>plainResult(await funnel.send(...args)),authorize:req=>funnel.authorize(req),stream:(call,req,signal)=>funnel.stream(call,req,signal)}}var REF_MAX=128;var ICONS=/* @__PURE__ */new Set(["shield","arrow","check","star","truck","refresh","card","alert","x","chat","repeat","calendar","flame","box","cart","minus","plus","chev","pulse","file","kit","dna","heart","bottle","harness","ramp"]),TONES=/* @__PURE__ */new Set(["y","c","g","r"]),TRACK_STATES=/* @__PURE__ */new Set(["done","now","next"]),obj=value=>value!==null&&typeof value=="object"&&!Array.isArray(value)?value:null,str2=(value,max=1e3)=>typeof value=="string"&&value.trim().length>0&&value.length<=max?value.trim():null,kindOf=value=>typeof value=="string"&&/^[A-Za-z0-9_-]{1,40}$/.test(value)?value:null,iconOf=value=>typeof value=="string"&&ICONS.has(value)?value:null;function imageOf(value){let s=str2(value,2048);return s===null||/\s/.test(s)?null:/^https:\/\/[^/]/i.test(s)||/^\/(?![/\\])/.test(s)?s:null}var idOf=value=>typeof value=="number"&&Number.isInteger(value)?String(value):str2(value,REF_MAX);function weightOf(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:null}function clean(fields){/* @__PURE__ */
103
103
  return Object.freeze(Object.fromEntries(Object.entries(fields).filter(([,v])=>v!=null)))}function listOf(value,each,max=20){if(!Array.isArray(value))return null;let out=[];for(let row of value){if(out.length>=max)break;let mapped=each(row);mapped!==null&&out.push(mapped)}return out.length===0?null:/* @__PURE__ */Object.freeze(out)}var words=(value,max=12,len=300)=>listOf(value,v=>str2(v,len),max);function focusOf(value){let o=obj(value),kicker=str2(o?.kicker,120),title=str2(o?.title,300);if(o===null||kicker===null||title===null)return null;let risk=obj(o.risk),odds=obj(o.odds),quote=obj(o.quote),jump=obj(o.jump);return clean({kicker:kicker,title:title,sources:listOf(o.sources,r=>{let label=str2(obj(r)?.label,60);return label===null?null:clean({label:label,kind:kindOf(obj(r)?.kind)})},6),risk:str2(risk?.lead,300)===null?null:clean({lead:str2(risk?.lead,300),body:str2(risk?.body),kind:kindOf(risk?.kind)}),odds:str2(odds?.label,120)===null||str2(odds?.from,20)===null||str2(odds?.to,20)===null?null:clean({label:str2(odds?.label,120),tag:str2(odds?.tag,40),from:str2(odds?.from,20),to:str2(odds?.to,20),toLabel:str2(odds?.toLabel,120)}),quote:str2(quote?.text)===null?null:clean({kicker:str2(quote?.kicker,120),tag:str2(quote?.tag,40),text:str2(quote?.text)}),jump:str2(jump?.title,300)===null||str2(jump?.go,60)===null?null:clean({title:str2(jump?.title,300),go:str2(jump?.go,60)})})}function routineOf(value){let o=obj(value),title=str2(o?.title,300),steps=listOf(o?.steps,r=>{let s=obj(r),t=str2(s?.title,300),tone=s?.tone;return t===null?null:clean({title:t,body:str2(s?.body),source:str2(s?.source,200),tone:typeof tone=="string"&&TONES.has(tone)?tone:null,icon:iconOf(s?.icon),fromVet:s?.fromVet===true?true:null})});return title===null||steps===null?null:clean({title:title,label:str2(o?.label,60),steps:steps})}function pickOf(value){let o=obj(value),title=str2(o?.title,300);if(o===null||title===null)return null;let rating=obj(o.rating),reviews=obj(o.reviews),why=obj(o.why),score=obj(why?.score),dose=obj(o.dose),ingredients=obj(o.ingredients),reviewItems=listOf(reviews?.items,r=>{let v=obj(r),stars=v?.stars,text2=str2(v?.text),by=str2(v?.by,80);return typeof stars!="number"||!Number.isFinite(stars)||stars<1||stars>5||text2===null||by===null?null:clean({stars:Math.round(stars),text:text2,by:by})},5),whyRows=listOf(why?.rows,r=>{let v=obj(r),chip=str2(v?.chip,40),t=str2(v?.title,300);return chip===null||t===null?null:clean({chip:chip,kind:kindOf(v?.kind),title:t,body:str2(v?.body)})}),stats=listOf(dose?.stats,r=>{let v=obj(r),val=str2(v?.value,40),label=str2(v?.label,120),kind=v?.kind;return val===null||label===null?null:clean({value:val,label:label,kind:kind==="weight"||kind==="dose"||kind==="days"?kind:null})},6),ingredientItems=words(ingredients?.items,12,80);return clean({title:title,none:o.none===true?true:null,hidden:o.none===true&&o.hidden===true?true:null,productId:idOf(o.productId),partnerSku:str2(o.partnerSku,200),rating:str2(rating?.value,20)===null?null:clean({value:str2(rating?.value,20),label:str2(rating?.label,120)}),line:str2(o.line),reviews:str2(reviews?.label,200)===null||reviewItems===null?null:clean({label:str2(reviews?.label,200),items:reviewItems}),checkoutLine:str2(o.checkoutLine,300),why:str2(why?.title,200)===null||whyRows===null?null:clean({title:str2(why?.title,200),rows:whyRows,score:str2(score?.text,200)===null||str2(score?.value,20)===null?null:clean({text:str2(score?.text,200),value:str2(score?.value,20)})}),dose:str2(dose?.title,200)===null||stats===null?null:clean({title:str2(dose?.title,200),stats:stats,note:str2(dose?.note)}),doseLabel:str2(o.doseLabel,120),ingredients:ingredientItems===null?null:clean({label:str2(ingredients?.label,200),items:ingredientItems}),proof:str2(o.proof,300),trust:listOf(o.trust,r=>{let v=obj(r),icon=iconOf(v?.icon),label=str2(v?.label,120);return icon===null||label===null?null:clean({icon:icon,label:label})},6),more:str2(o.more,120),fine:str2(o.fine),checkin:str2(o.checkin,200)})}function signsOf(value){let o=obj(value),title=str2(o?.title,200),items=listOf(o?.items,r=>{let v=obj(r),t=str2(v?.title,300),body=str2(v?.body);return t===null||body===null?null:clean({title:t,body:body,urgent:v?.urgent===true?true:null,callVet:v?.callVet===true?true:null})});return title===null||items===null?null:clean({title:title,items:items})}function checkupOf(value){let o=obj(value),title=str2(o?.title,200),questions=words(o?.questions,12,300),add=str2(o?.add,80),added=str2(o?.added,80);return title===null||questions===null||add===null||added===null?null:clean({title:title,questions:questions,add:add,added:added})}function extrasOf(value){let o=obj(value),title=str2(o?.title,200),items=listOf(o?.items,r=>{let v=obj(r),key=str2(v?.key,REF_MAX),t=str2(v?.title,300),action=str2(v?.action,80),productId=idOf(v?.productId),added=str2(v?.added,80)??(productId!==null?action:null);return key===null||t===null||action===null||added===null?null:clean({key:key,productId:productId,title:t,body:str2(v?.body),price:str2(v?.price,40),was:str2(v?.was,40),tag:str2(v?.tag,40),imageUrl:imageOf(v?.imageUrl),icon:iconOf(v?.icon),kind:kindOf(v?.kind),action:action,added:added,owned:v?.owned===true?true:null})},6);return title===null||items===null?null:clean({title:title,items:items})}function waitOf(value){let o=obj(value),kicker=str2(o?.kicker,120),title=str2(o?.title,120);return o===null||kicker===null||title===null?null:clean({kicker:kicker,title:title,icon:iconOf(o.icon),track:listOf(o.track,r=>{let v=obj(r),t=str2(v?.title,120),state=v?.state;return t===null?null:clean({title:t,detail:str2(v?.detail,120),state:typeof state=="string"&&TRACK_STATES.has(state)?state:null,tag:str2(v?.tag,40)})},6),heading:str2(o.heading,200),rows:listOf(o.rows,r=>{let v=obj(r),icon=iconOf(v?.icon),label=str2(v?.label,120);if(icon===null||label===null)return null;if(v?.fromVet===true)return clean({icon:icon,label:label,text:"",fromVet:true});let text2=str2(v?.text,300);return text2===null?null:clean({icon:icon,label:label,text:text2})},6),note:str2(o.note,300),action:str2(o.action,80)})}function healthPlanFocusDesignFromWire(raw){let o=obj(raw),title=str2(o?.title,300),pick2=pickOf(o?.pick);if(o===null||title===null||pick2===null)return null;let byline=obj(o.byline);return clean({eyebrow:str2(o.eyebrow,120),title:title,subtitle:str2(o.subtitle,300),subtitleNoRecords:str2(o.subtitleNoRecords,300),headImageUrl:imageOf(o.headImageUrl),byline:str2(byline?.name,120)===null?null:clean({name:str2(byline?.name,120),role:str2(byline?.role,120),imageUrl:imageOf(byline?.imageUrl),shortName:str2(byline?.shortName,60)}),focus:focusOf(o.focus),routine:routineOf(o.routine),pick:pick2,signs:signsOf(o.signs),checkup:checkupOf(o.checkup),extras:extrasOf(o.extras),wait:waitOf(o.wait),fine:str2(o.fine),checkoutRows:listOf(o.checkoutRows,r=>{let v=obj(r),icon=iconOf(v?.icon),label=str2(v?.label,60),val=str2(v?.value,200);return icon===null||label===null||val===null?null:clean({icon:icon,label:label,value:val})},6)})}function healthPlanPageFromWire(raw,petRef){let o=obj(raw);if(o===null||!("page"in o))return null;let pet=obj(o.pet),sex=pet?.sex;/* @__PURE__ */
104
104
  return Object.freeze({petRef:str2(o.pet_ref,REF_MAX)??petRef,pet:/* @__PURE__ */Object.freeze({name:str2(pet?.name,120),species:str2(pet?.species,60),sex:sex==="female"||sex==="male"?sex:null,breed:str2(pet?.breed,120),weightKg:weightOf(pet?.weight_kg),weightLb:weightOf(pet?.weight_lb)}),checkout:o.checkout==="everfur_stripe"?"everfur_stripe":"partner",page:healthPlanFocusDesignFromWire(o.page),vetReviewed:o.vet_reviewed===true,trackingTextsEnabled:o.tracking_texts_enabled===true})}function invalid(wireMessage){return makeEverfurError("validationFailed",{retryable:false,wireMessage:wireMessage})}function malformed(call){return makeEverfurError("internalError",{retryable:false,httpStatus:502,wireMessage:`${call}: the response was not the expected shape`})}function disposed(verb){return makeEverfurError("runtimeDisposed",{retryable:false,wireMessage:`the Everfur runtime is disposed; ${verb} was called after unmount`})}var validRef=value=>typeof value=="string"&&value.length>0&&value.length<=REF_MAX;function base(petRef){return`/widget/v1/pets/${encodeURIComponent(petRef)}/plan`}async function readPage(funnel,petRef,opts){if(!validRef(petRef))return err(invalid("petRef must be 1..128 characters"));let res=await funnel.send("healthPlan.page.read",{method:"GET",path:`${base(petRef)}/page`,...opts?.signal?{signal:opts.signal}:{}});if(!res.ok)return err(res.error);let page=healthPlanPageFromWire(res.value,petRef);return page===null?err(malformed("healthPlan.page.read")):ok(page)}var readers=/* @__PURE__ */new WeakMap;function createHealthPlanPageReader(runtime){let known=readers.get(runtime);if(known!==void 0)return known;let reader=makeHealthPlanPageReader(runtime);return readers.set(runtime,reader),reader}function makeHealthPlanPageReader(runtime){return{getPage:(petRef,opts)=>{if(runtime.isDisposed)return Promise.resolve(err(disposed("getPage")));let{services:services}=runtime.registry,funnel=withPlainNotFound(createRequestFunnel({auth:services.authFor(null),...services.errorPolicy?{errorPolicy:services.errorPolicy}:{}}));return readPage(funnel,petRef,opts)}}}var EVERFUR_CONTEXT_SYMBOL=/* @__PURE__ */Symbol.for("@everfur/sdk#EverfurContext@v1"),globalContextHost=globalThis,EverfurContext=globalContextHost[EVERFUR_CONTEXT_SYMBOL]??(globalContextHost[EVERFUR_CONTEXT_SYMBOL]=createContext(null));EverfurContext.displayName??="EverfurContext";function useEverfurContext(){let ctx=useContext(EverfurContext);if(ctx===null)throw new EverfurConfigError("not-initialized","Everfur hooks must be called inside <EverfurProvider>. Wrap your tree once, high.");return ctx}function reportHostFailure(error){let globalConsole=globalThis.console;try{globalConsole?.error?.("[everfur] A host callback threw; the SDK ignored it.",error)}catch{}}function isThenable(value){return(typeof value=="object"||typeof value=="function")&&value!==null&&typeof value.then=="function"}function callHost(fn,...args){if(typeof fn=="function")try{let result=fn(...args);return isThenable(result)&&Promise.resolve(result).then(void 0,reportHostFailure),result}catch(error){reportHostFailure(error);return}}var HEALTH_PLAN_STALE_MS=6e4;function useHealthPlanRevalidation({lifecycle:lifecycle,refreshKey:refreshKey,readyAt:readyAt,revalidate:revalidate,refresh:refresh,now:now=Date.now}){let latest=useRef({readyAt:readyAt,revalidate:revalidate,refresh:refresh??revalidate,now:now});latest.current={readyAt:readyAt,revalidate:revalidate,refresh:refresh??revalidate,now:now},useEffect(()=>{if(lifecycle==null)return;let stop=callHost(()=>lifecycle.onForeground(()=>{let{readyAt:at,revalidate:run,now:clock}=latest.current;at!==null&&clock()-at>=HEALTH_PLAN_STALE_MS&&run()}));return()=>{typeof stop=="function"&&callHost(stop)}},[lifecycle]);let seenKey=useRef(refreshKey);useEffect(()=>{Object.is(seenKey.current,refreshKey)||(seenKey.current=refreshKey,latest.current.refresh())},[refreshKey])}var HEALTH_PLAN_PAGE_SHARE_MS=HEALTH_PLAN_STALE_MS,SHARED_READS_SYMBOL=/* @__PURE__ */Symbol.for("@everfur/sdk#HealthPlanPageReads@v1");function sharedReads(){let host=globalThis,stored=host[SHARED_READS_SYMBOL];if(stored instanceof WeakMap)return stored;let made=/* @__PURE__ */new WeakMap;return host[SHARED_READS_SYMBOL]=made,made}function readShared(reader,runtime,userRef,petRef,fresh){let all=sharedReads(),reads=all.get(runtime);reads===void 0&&(reads=/* @__PURE__ */new Map,all.set(runtime,reads));let map=reads,key=`${userRef}\0${petRef}`,hit=map.get(key);if(!fresh&&hit!==void 0&&(hit.at===null||Date.now()-hit.at<HEALTH_PLAN_PAGE_SHARE_MS))return hit.promise;let entry={at:null,promise:reader.getPage(petRef).then(res=>(map.get(key)===entry&&(res.ok||isNotFoundError(res.error)?entry.at=Date.now():map.delete(key)),res))};return map.set(key,entry),entry.promise}function useHealthPlanPage(options){let{userRef:userRef,runtime:runtime}=useEverfurContext(),own=useMemo(()=>createHealthPlanPageReader(runtime),[runtime]),hostRepository=options.repository,repository=hostRepository??own,getPage=useCallback((pet,fresh)=>hostRepository!==void 0||userRef==null?repository.getPage(pet):readShared(own,runtime,userRef,pet,fresh),[hostRepository,repository,own,runtime,userRef]),{petRef:petRef}=options,enabled=options.enabled!==false&&userRef!=null&&petRef!==null,[state,setState]=useState({phase:"idle",petRef:null,page:null,error:null}),epoch=useRef(0),quiet=useRef(0),read=useCallback(async fresh=>{let mine=++epoch.current;if(!enabled||petRef===null){setState(prev=>prev.phase==="idle"&&prev.petRef===null?prev:{phase:"idle",petRef:null,page:null,error:null});return}setState(prev=>({phase:"loading",petRef:petRef,page:prev.petRef===petRef?prev.page:null,error:null}));let res=await getPage(petRef,fresh);mine===epoch.current&&(res.ok?setState({phase:"ready",petRef:petRef,page:res.value,error:null,readyAt:Date.now()}):isNotFoundError(res.error)?setState({phase:"ready",petRef:petRef,page:null,error:null,missing:true,readyAt:Date.now()}):setState({phase:"failed",petRef:petRef,page:null,error:res.error}))},[enabled,petRef,getPage]),load=useCallback(()=>read(true),[read]),ready=state.phase==="ready"&&state.petRef===petRef,revalidate=useCallback(async()=>{if(!enabled||petRef===null||!ready)return;let mine=epoch.current,seq=++quiet.current,res=await getPage(petRef,true);mine!==epoch.current||seq!==quiet.current||!res.ok||setState(prev=>prev.phase==="ready"&&prev.petRef===petRef?{phase:"ready",petRef:petRef,page:res.value,error:null,readyAt:Date.now()}:prev)},[enabled,petRef,ready,getPage]);useHealthPlanRevalidation({lifecycle:options.lifecycle,refreshKey:options.refreshKey,readyAt:ready?state.readyAt??null:null,revalidate:()=>{revalidate()},refresh:()=>{ready?revalidate():load()}}),useEffect(()=>(read(false),()=>{epoch.current+=1}),[read]);let stale=enabled&&state.petRef!==petRef;return useMemo(()=>({phase:stale?"loading":state.phase,page:stale?null:state.page,error:stale?null:state.error,missing:!stale&&state.missing===true,refresh:load}),[stale,state,load])}function hasLoneSurrogate(value){for(let i=0;i<value.length;i+=1){let code=value.charCodeAt(i);if(code>=55296&&code<=56319){let low=value.charCodeAt(i+1);if(!(low>=56320&&low<=57343))return true;i+=1}else if(code>=56320&&code<=57343)return true}return false}function serverLength(value){return[...value].length}var SPECIES_ALIASES=/* @__PURE__ */Object.freeze({dog:"dog",canine:"dog",k9:"dog",puppy:"dog",cat:"cat",feline:"cat",kitten:"cat"});function canonicalPetSpecies(raw){if(typeof raw!="string")return null;let key=raw.trim().toLowerCase();return Object.prototype.hasOwnProperty.call(SPECIES_ALIASES,key)?SPECIES_ALIASES[key]:null}var LIST_MAX=50,REF_MAX2=128,NAME_MAX=120,SHORT_MAX=120,NOTES_MAX=2e3,FOOD_MAX=120,MICROCHIP_MAX=80,SEXES=/* @__PURE__ */new Set(["male","female","unknown"]),PRECISIONS=/* @__PURE__ */new Set(["day","month","year"]),ACTIVITY=/* @__PURE__ */new Set(["low","medium","high","athletic"]),INDOOR_OUTDOOR=/* @__PURE__ */new Set(["indoor","outdoor","both"]),SEVERITIES=/* @__PURE__ */new Set(["mild","moderate","severe"]),ISO_DATE=/^(\d{4})-(\d{2})-(\d{2})$/,SCALAR_WIRE=[["sex","sex"],["spayedNeutered","spayed_neutered"],["birthDate","birth_date"],["birthDatePrecision","birth_date_precision"],["activityLevel","activity_level"],["indoorOutdoor","indoor_outdoor"],["foodBrand","food_brand"],["foodType","food_type"],["microchipId","microchip_id"]],LIST_WIRE=[["allergies","allergies"],["medications","medications"],["supplements","supplements"],["conditions","conditions"]];/* @__PURE__ */Object.freeze([...SCALAR_WIRE,...LIST_WIRE].map(([key])=>key));function isRealDate(value){let match=ISO_DATE.exec(value);if(match===null)return false;let[year,month,day]=[Number(match[1]),Number(match[2]),Number(match[3])],date2=new Date(Date.UTC(year,month-1,day));return date2.getUTCFullYear()===year&&date2.getUTCMonth()===month-1&&date2.getUTCDate()===day}var oneOf=allowed=>(field,value)=>typeof value=="string"&&allowed.has(value)?null:`${field} must be one of ${[...allowed].join(", ")}`,boolean=(field,value)=>typeof value=="boolean"?null:`${field} must be true or false`,date=(field,value)=>typeof value=="string"&&isRealDate(value)?null:`${field} must be a real date written YYYY-MM-DD`,text=(max,opts={})=>(field,value)=>{if(typeof value!="string")return`${field} must be a string`;if(hasLoneSurrogate(value))return`${field} contains an unpaired surrogate and cannot be encoded`;let measured=opts.trimmed?value.trim():value;if(opts.required&&measured.length===0)return`${field} is required and must not be blank`;let length=serverLength(measured);return length<=max?null:`${field} is ${length} characters; the server accepts at most ${max}`},SCALAR_CHECKS={sex:oneOf(SEXES),spayedNeutered:boolean,birthDate:date,birthDatePrecision:oneOf(PRECISIONS),activityLevel:oneOf(ACTIVITY),indoorOutdoor:oneOf(INDOOR_OUTDOOR),foodBrand:text(FOOD_MAX),foodType:text(FOOD_MAX),microchipId:text(MICROCHIP_MAX)},REF_FIELD=["ref","ref",false,text(REF_MAX2,{required:true,trimmed:true})],NOTES_FIELD=["notes","notes",false,text(NOTES_MAX,{trimmed:true})],MEDICATION_FIELDS=[REF_FIELD,["name","name",true,text(NAME_MAX,{required:true,trimmed:true})],["dose","dose",false,text(SHORT_MAX,{trimmed:true})],["frequency","frequency",false,text(SHORT_MAX,{trimmed:true})],["startDate","start_date",false,date],["endDate","end_date",false,date],NOTES_FIELD],ITEM_FIELDS={allergies:[REF_FIELD,["allergen","allergen",true,text(NAME_MAX,{required:true,trimmed:true})],["severity","severity",false,oneOf(SEVERITIES)],NOTES_FIELD],medications:MEDICATION_FIELDS,supplements:MEDICATION_FIELDS,conditions:[REF_FIELD,["conditionName","condition_name",true,text(NAME_MAX,{required:true,trimmed:true})],["diagnosedDate","diagnosed_date",false,date],NOTES_FIELD]};function itemToWire(list,index,raw){let at=`${list}[${index}]`;if(typeof raw!="object"||raw===null||Array.isArray(raw))return{error:`${at} must be an object`};let source=raw,item={};for(let[key,wire,isRequired,check]of ITEM_FIELDS[list]){let value=source[key];if(value==null){if(isRequired)return{error:`${at}.${key} is required`};value===null&&(item[wire]=null);continue}let bad=check(`${at}.${key}`,value);if(bad!==null)return{error:bad};item[wire]=value}let start=item.start_date,end=item.end_date;return typeof start=="string"&&typeof end=="string"&&end<start?{error:`${at}.endDate must not be before startDate`}:{item:item}}function listToWire(list,raw){if(!Array.isArray(raw))return{error:`${list} must be an array (send [] to clear it)`};if(raw.length>LIST_MAX)return{error:`${list} has ${raw.length} items; the server accepts at most ${LIST_MAX}`};let items=[],refs=/* @__PURE__ */new Set;for(let index=0;index<raw.length;index+=1){let mapped=itemToWire(list,index,raw[index]);if("error"in mapped)return mapped;let ref=mapped.item.ref;if(typeof ref=="string"){let key=ref.trim();if(refs.has(key))return{error:`${list}: ref ${JSON.stringify(key)} is used twice; a ref names one item`};refs.add(key)}items.push(mapped.item)}return{items:items}}function petHealthToWire(input,species){let source=input,body={};for(let[key,wire]of SCALAR_WIRE){let value=source[key];if(value!==void 0){if(value!==null){let bad=SCALAR_CHECKS[key](key,value);if(bad!==null)return{error:bad}}body[wire]=value}}let dateSent=source.birthDate!==void 0,precisionSent=source.birthDatePrecision!==void 0;if(dateSent!==precisionSent||dateSent&&source.birthDate===null!=(source.birthDatePrecision===null))return{error:"birthDate and birthDatePrecision must be sent together, both set or both null"};for(let[key,wire]of LIST_WIRE){let value=source[key];if(value===void 0)continue;let mapped=listToWire(key,value);if("error"in mapped)return mapped;body[wire]=mapped.items}return Object.keys(body).length>0&&species!==void 0&&canonicalPetSpecies(species)===null?{error:"health fields need a pet Everfur reads as a dog or a cat (dog, canine, k9, puppy, cat, feline, kitten)"}:{body:body}}var str3=value=>typeof value=="string"?value:null,pick=(allowed,value)=>typeof value=="string"&&allowed.has(value)?value:null,bool=value=>typeof value=="boolean"?value:null;function itemsFromWire(raw,map){return Array.isArray(raw)?/* @__PURE__ */Object.freeze(raw.flatMap(row=>{if(typeof row!="object"||row===null||Array.isArray(row))return[];let item=map(row);return item===null?[]:[item]})):/* @__PURE__ */Object.freeze([])}function medicationFromWire(o){let name=str3(o.name);return name===null||name.length===0?null:/* @__PURE__ */Object.freeze({ref:str3(o.ref),name:name,dose:str3(o.dose),frequency:str3(o.frequency),startDate:str3(o.start_date),endDate:str3(o.end_date),notes:str3(o.notes)})}function petHealthFromWire(o){let version=o.profile_version;/* @__PURE__ */
105
- return Object.freeze({profileVersion:typeof version=="number"&&Number.isInteger(version)&&version>=0?version:0,sex:pick(SEXES,o.sex),spayedNeutered:bool(o.spayed_neutered),birthDate:str3(o.birth_date),birthDatePrecision:pick(PRECISIONS,o.birth_date_precision),activityLevel:pick(ACTIVITY,o.activity_level),indoorOutdoor:pick(INDOOR_OUTDOOR,o.indoor_outdoor),foodBrand:str3(o.food_brand),foodType:str3(o.food_type),microchipId:str3(o.microchip_id),allergies:itemsFromWire(o.allergies,row=>{let allergen=str3(row.allergen);return allergen===null||allergen.length===0?null:/* @__PURE__ */Object.freeze({ref:str3(row.ref),allergen:allergen,severity:pick(SEVERITIES,row.severity),notes:str3(row.notes)})}),medications:itemsFromWire(o.medications,medicationFromWire),supplements:itemsFromWire(o.supplements,medicationFromWire),conditions:itemsFromWire(o.conditions,row=>{let conditionName=str3(row.condition_name);return conditionName===null||conditionName.length===0?null:/* @__PURE__ */Object.freeze({ref:str3(row.ref),conditionName:conditionName,diagnosedDate:str3(row.diagnosed_date),notes:str3(row.notes)})})})}var PET_NAME_MAX=100,PET_SPECIES_MAX=50,PET_BREED_MAX=100,PET_AGE_YEARS_MAX=50,PET_WEIGHT_KG_MAX=500,PET_REF_MAX=128,ERASE_USER_DATA_TIMEOUT_MS=6e4;function invalid2(wireMessage){return makeEverfurError("validationFailed",{retryable:false,wireMessage:wireMessage})}function checkString(field,value,max){if(typeof value!="string")return invalid2(`${field} must be a string`);let length=serverLength(value);return length<=max?null:invalid2(`${field} is ${length} characters; the server accepts at most ${max}`)}function outOfRange(field,value,max){return typeof value=="number"&&Number.isFinite(value)&&value>=0&&value<=max?null:invalid2(`${field} must be a finite number between 0 and ${max}`)}function validate(petRef,profile){if(typeof petRef!="string")return invalid2("pet_ref must be a string");if(petRef.trim().length===0)return invalid2("pet_ref must not be blank");if(hasLoneSurrogate(petRef))return invalid2("pet_ref contains an unpaired surrogate and cannot be encoded");if(profile!=null&&typeof profile!="object")return invalid2("profile must be an object");let checks=[checkString("pet_ref",petRef,PET_REF_MAX)];return profile?.name!==void 0&&checks.push(checkString("name",profile.name,PET_NAME_MAX)),profile?.species!==void 0&&checks.push(checkString("species",profile.species,PET_SPECIES_MAX)),profile?.breed!==void 0&&checks.push(checkString("breed",profile.breed,PET_BREED_MAX)),profile?.ageYears!==void 0&&checks.push(outOfRange("age_years",profile.ageYears,PET_AGE_YEARS_MAX)),profile?.weightKg!==void 0&&checks.push(outOfRange("weight_kg",profile.weightKg,PET_WEIGHT_KG_MAX)),checks.find(c=>c!==null)??null}function healthToWire(source,species){let health=petHealthToWire(source,species);return"error"in health?{error:invalid2(health.error)}:health}function patchToWire(patch){if(typeof patch!="object"||patch===null)return{error:invalid2("patch must be an object")};let p=patch,fields=[["name","name",v=>checkString("name",v,PET_NAME_MAX)],["species","species",v=>checkString("species",v,PET_SPECIES_MAX)],["breed","breed",v=>checkString("breed",v,PET_BREED_MAX)],["ageYears","age_years",v=>outOfRange("age_years",v,PET_AGE_YEARS_MAX)],["weightKg","weight_kg",v=>outOfRange("weight_kg",v,PET_WEIGHT_KG_MAX)]],body={};for(let[key,wire,check]of fields){let value=p[key];if(value!==void 0){if(value!==null){let bad=check(value);if(bad!==null)return{error:bad}}body[wire]=value}}let health=healthToWire(p,p.species);return"error"in health?health:(Object.assign(body,health.body),Object.keys(body).length===0?{error:invalid2("patch must change at least one field")}:{body:body})}function toWire(profile){if(profile==null)return{body:{}};let health=healthToWire(profile,profile.species);return"error"in health?health:{body:{...profile.name!==void 0?{name:profile.name}:{},...profile.species!==void 0?{species:profile.species}:{},...profile.breed!==void 0?{breed:profile.breed}:{},...profile.ageYears!==void 0?{age_years:profile.ageYears}:{},...profile.weightKg!==void 0?{weight_kg:profile.weightKg}:{},...health.body}}}var str4=v=>typeof v=="string"?v:null,num=v=>typeof v=="number"&&Number.isFinite(v)?v:null;function fromWire2(raw,petRef){let o=typeof raw=="object"&&raw!==null?raw:{};/* @__PURE__ */
106
- return Object.freeze({petRef:str4(o.pet_ref)??petRef,name:str4(o.name),species:str4(o.species),breed:str4(o.breed),ageYears:num(o.age_years),weightKg:num(o.weight_kg)})}function widgetPetFromWire(raw){if(typeof raw!="object"||raw===null)return null;let o=raw,petRef=str4(o.pet_ref);return petRef===null||petRef.length===0?null:/* @__PURE__ */Object.freeze({petId:str4(o.pet_id),petRef:petRef,name:str4(o.name),species:str4(o.species),breed:str4(o.breed),ageYears:num(o.age_years),weightKg:num(o.weight_kg),updatedAt:str4(o.updated_at)})}function widgetPetProfileFromWire(raw){let pet=widgetPetFromWire(raw);return pet===null?null:/* @__PURE__ */Object.freeze({...pet,...petHealthFromWire(raw)})}function petListFromWire(raw){let rows=Array.isArray(raw)?raw:typeof raw=="object"&&raw!==null&&Array.isArray(raw.pets)?raw.pets:[];/* @__PURE__ */
105
+ return Object.freeze({profileVersion:typeof version=="number"&&Number.isInteger(version)&&version>=0?version:0,sex:pick(SEXES,o.sex),spayedNeutered:bool(o.spayed_neutered),birthDate:str3(o.birth_date),birthDatePrecision:pick(PRECISIONS,o.birth_date_precision),activityLevel:pick(ACTIVITY,o.activity_level),indoorOutdoor:pick(INDOOR_OUTDOOR,o.indoor_outdoor),foodBrand:str3(o.food_brand),foodType:str3(o.food_type),microchipId:str3(o.microchip_id),allergies:itemsFromWire(o.allergies,row=>{let allergen=str3(row.allergen);return allergen===null||allergen.length===0?null:/* @__PURE__ */Object.freeze({ref:str3(row.ref),allergen:allergen,severity:pick(SEVERITIES,row.severity),notes:str3(row.notes)})}),medications:itemsFromWire(o.medications,medicationFromWire),supplements:itemsFromWire(o.supplements,medicationFromWire),conditions:itemsFromWire(o.conditions,row=>{let conditionName=str3(row.condition_name);return conditionName===null||conditionName.length===0?null:/* @__PURE__ */Object.freeze({ref:str3(row.ref),conditionName:conditionName,diagnosedDate:str3(row.diagnosed_date),notes:str3(row.notes)})})})}var PET_NAME_MAX=100,PET_SPECIES_MAX=50,PET_BREED_MAX=100,PET_AGE_YEARS_MAX=50,PET_WEIGHT_KG_MAX=500,PET_REF_MAX=128,ERASE_USER_DATA_TIMEOUT_MS=6e4;function invalid2(wireMessage){return makeEverfurError("validationFailed",{retryable:false,wireMessage:wireMessage})}function checkString(field,value,max){if(typeof value!="string")return invalid2(`${field} must be a string`);let length=serverLength(value);return length<=max?null:invalid2(`${field} is ${length} characters; the server accepts at most ${max}`)}function outOfRange(field,value,max){return typeof value=="number"&&Number.isFinite(value)&&value>=0&&value<=max?null:invalid2(`${field} must be a finite number between 0 and ${max}`)}function validate(petRef,profile){if(typeof petRef!="string")return invalid2("pet_ref must be a string");if(petRef.trim().length===0)return invalid2("pet_ref must not be blank");if(hasLoneSurrogate(petRef))return invalid2("pet_ref contains an unpaired surrogate and cannot be encoded");if(profile!=null&&typeof profile!="object")return invalid2("profile must be an object");let checks=[checkString("pet_ref",petRef,PET_REF_MAX)];return profile?.name!==void 0&&checks.push(checkString("name",profile.name,PET_NAME_MAX)),profile?.species!==void 0&&checks.push(checkString("species",profile.species,PET_SPECIES_MAX)),profile?.breed!==void 0&&checks.push(checkString("breed",profile.breed,PET_BREED_MAX)),profile?.ageYears!==void 0&&checks.push(outOfRange("age_years",profile.ageYears,PET_AGE_YEARS_MAX)),profile?.weightKg!==void 0&&checks.push(outOfRange("weight_kg",profile.weightKg,PET_WEIGHT_KG_MAX)),checks.find(c=>c!==null)??null}function healthToWire(source,species){let health=petHealthToWire(source,species);return"error"in health?{error:invalid2(health.error)}:health}function patchToWire(patch){if(typeof patch!="object"||patch===null)return{error:invalid2("patch must be an object")};let p=patch,fields=[["name","name",v=>checkString("name",v,PET_NAME_MAX)],["species","species",v=>checkString("species",v,PET_SPECIES_MAX)],["breed","breed",v=>checkString("breed",v,PET_BREED_MAX)],["ageYears","age_years",v=>outOfRange("age_years",v,PET_AGE_YEARS_MAX)],["weightKg","weight_kg",v=>outOfRange("weight_kg",v,PET_WEIGHT_KG_MAX)]],body={};for(let[key,wire,check]of fields){let value=p[key];if(value!==void 0){if(value!==null){let bad=check(value);if(bad!==null)return{error:bad}}body[wire]=value}}let health=healthToWire(p,p.species);return"error"in health?health:(Object.assign(body,health.body),Object.keys(body).length===0?{error:invalid2("patch must change at least one field")}:{body:body})}function toWire(profile){if(profile==null)return{body:{}};let health=healthToWire(profile,profile.species);return"error"in health?health:{body:{...profile.name!==void 0?{name:profile.name}:{},...profile.species!==void 0?{species:profile.species}:{},...profile.breed!==void 0?{breed:profile.breed}:{},...profile.ageYears!==void 0?{age_years:profile.ageYears}:{},...profile.weightKg!==void 0?{weight_kg:profile.weightKg}:{},...health.body}}}var str4=v=>typeof v=="string"?v:null,num2=v=>typeof v=="number"&&Number.isFinite(v)?v:null;function fromWire2(raw,petRef){let o=typeof raw=="object"&&raw!==null?raw:{};/* @__PURE__ */
106
+ return Object.freeze({petRef:str4(o.pet_ref)??petRef,name:str4(o.name),species:str4(o.species),breed:str4(o.breed),ageYears:num2(o.age_years),weightKg:num2(o.weight_kg)})}function widgetPetFromWire(raw){if(typeof raw!="object"||raw===null)return null;let o=raw,petRef=str4(o.pet_ref);return petRef===null||petRef.length===0?null:/* @__PURE__ */Object.freeze({petId:str4(o.pet_id),petRef:petRef,name:str4(o.name),species:str4(o.species),breed:str4(o.breed),ageYears:num2(o.age_years),weightKg:num2(o.weight_kg),updatedAt:str4(o.updated_at)})}function widgetPetProfileFromWire(raw){let pet=widgetPetFromWire(raw);return pet===null?null:/* @__PURE__ */Object.freeze({...pet,...petHealthFromWire(raw)})}function petListFromWire(raw){let rows=Array.isArray(raw)?raw:typeof raw=="object"&&raw!==null&&Array.isArray(raw.pets)?raw.pets:[];/* @__PURE__ */
107
107
  return Object.freeze(rows.flatMap(row=>{let pet=widgetPetFromWire(row);return pet===null?[]:[pet]}))}function createPetsRepository(auth){return createPetsRepositoryOver(createRequestFunnel({auth:auth}),createRequestFunnel({auth:auth,unaryTimeoutMs:ERASE_USER_DATA_TIMEOUT_MS}))}function createPetsRepositoryOver(funnel,eraseFunnel=funnel){let withSignal=(req,signal)=>signal?{...req,signal:signal}:req,petPath=petRef=>validate(petRef,void 0)??`/widget/v1/pets/${encodeURIComponent(petRef)}`;return{async list(opts){let res=await funnel.send("pets.list",withSignal({method:"GET",path:"/widget/v1/pets"},opts?.signal));return res.ok?ok(petListFromWire(res.value)):err(res.error)},async registerPet(petRef,profile,opts){let invalid4=validate(petRef,profile);if(invalid4!==null)return err(invalid4);let wire=toWire(profile);if("error"in wire)return err(wire.error);let base2={method:"POST",path:`/widget/v1/pets/${encodeURIComponent(petRef)}`,body:wire.body},res=await funnel.send("pets.registerPet",opts?.signal?{...base2,signal:opts.signal}:base2);return res.ok?ok(fromWire2(res.value,petRef)):err(res.error)},async updatePet(petRef,patch,opts){let path=petPath(petRef);if(typeof path!="string")return err(path);let wire=patchToWire(patch);if("error"in wire)return err(wire.error);let res=await funnel.send("pets.updatePet",withSignal({method:"PATCH",path:path,body:wire.body},opts?.signal));return res.ok?ok(fromWire2(res.value,petRef)):err(res.error)},async getPetProfile(petRef,opts){let path=petPath(petRef);if(typeof path!="string")return err(path);let res=await funnel.send("pets.getPetProfile",withSignal({method:"GET",path:`${path}/profile`},opts?.signal));if(!res.ok)return err(res.error);let profile=widgetPetProfileFromWire(res.value);return profile===null?err(makeEverfurError("internalError",{retryable:false,httpStatus:502,wireMessage:"the pet profile response carried no pet_ref"})):ok(profile)},async deletePet(petRef,opts){let path=petPath(petRef);if(typeof path!="string")return err(path);let res=await funnel.send("pets.deletePet",withSignal({method:"DELETE",path:path},opts?.signal));return res.ok?ok(void 0):err(res.error)},async eraseUserData(opts){let res=await eraseFunnel.send("pets.eraseUserData",withSignal({method:"DELETE",path:"/widget/v1/me"},opts?.signal),{maxAttempts:1});return res.ok?ok(void 0):err(res.error)}}}function useEverfurPetProfile(petRef){let{runtime:runtime,userRef:userRef,scopeEpoch:scopeEpoch}=useEverfurContext(),repository=useMemo(()=>createPetsRepository(runtime.registry.services.authFor(userRef)),[runtime,userRef,scopeEpoch]),key=useMemo(()=>({repository:repository,petRef:petRef}),[repository,petRef]),[state,setState]=useState({key:key,profile:null,loading:petRef!==null,error:null}),current=state.key===key?state:{profile:null,loading:petRef!==null,error:null},generation=useRef(0),load=useCallback(async()=>{let request=++generation.current;if(key.petRef===null){setState({key:key,profile:null,loading:false,error:null});return}setState(previous=>({key:key,profile:previous.key===key?previous.profile:null,loading:true,error:null}));let result=await key.repository.getPetProfile(key.petRef);request===generation.current&&setState(result.ok?{key:key,profile:result.value,loading:false,error:null}:{key:key,profile:null,loading:false,error:result.error})},[key]);return useEffect(()=>(load(),()=>{generation.current+=1}),[load]),useMemo(()=>({profile:current.profile,loading:current.loading,error:current.error,refresh:load}),[current.profile,current.loading,current.error,load])}var listeners=/* @__PURE__ */new WeakMap;function subscribePetsChanged(runtime,listener){let set=listeners.get(runtime);return set===void 0&&(set=/* @__PURE__ */new Set,listeners.set(runtime,set)),set.add(listener),()=>{set?.delete(listener)}}function useEverfurPets(){let{runtime:runtime,userRef:userRef,activePet:activePetRef,scopeEpoch:scopeEpoch}=useEverfurContext(),repository=useMemo(()=>createPetsRepository(runtime.registry.services.authFor(userRef)),[runtime,userRef,scopeEpoch]),[state,setState]=useState({repository:repository,pets:[],loading:true,error:null}),current=state.repository===repository?state:{pets:[],loading:true,error:null},generation=useRef(0),load=useCallback(async()=>{let request=++generation.current;setState(previous=>({...previous,repository:repository,loading:true,error:null,pets:previous.repository===repository?previous.pets:[]}));let result=await repository.list();request===generation.current&&setState(result.ok?{repository:repository,pets:result.value,loading:false,error:null}:previous=>({repository:repository,pets:previous.repository===repository?previous.pets:[],loading:false,error:result.error}))},[repository]);useEffect(()=>(load(),()=>{generation.current+=1}),[load]),useEffect(()=>subscribePetsChanged(runtime,()=>{load()}),[runtime,load]);let activePet=useMemo(()=>activePetRef===null?null:current.pets.find(pet=>pet.petRef===activePetRef)??null,[activePetRef,current.pets]);return useMemo(()=>({pets:current.pets,activePet:activePet,loading:current.loading,error:current.error,refresh:load}),[current.pets,current.loading,current.error,activePet,load])}var DEFAULT_PRESENTATION=/* @__PURE__ */Object.freeze({chatAnswerStyle:"cards",chatHistoryStyle:"sheet",chatTopCard:"focus",chatFollowUpCount:3,chatFollowUpsExcludeTelevet:false,chatComposerMic:true,chatComposerUpload:true,safetyDisclaimerPlacement:"composer",healthPlanLayout:"focus_plan",recordsTopRiskLine:true,recordsClearResultsFilter:true,chatComposerStyle:"compact",chatComposerPlaceholder:"pet_name",chatHistoryBar:"scroll",chatGeneralBanner:true,chatSendButton:"always_dark",chatTextingAsk:true}),PRESENTATION_WIRE_NAMES=/* @__PURE__ */Object.freeze({chatAnswerStyle:"chat_answer_style",chatHistoryStyle:"chat_history_style",chatTopCard:"chat_top_card",chatFollowUpCount:"chat_follow_up_count",chatFollowUpsExcludeTelevet:"chat_follow_ups_exclude_televet",chatComposerMic:"chat_composer_mic",chatComposerUpload:"chat_composer_upload",safetyDisclaimerPlacement:"safety_disclaimer_placement",healthPlanLayout:"health_plan_layout",recordsTopRiskLine:"records_top_risk_line",recordsClearResultsFilter:"records_clear_results_filter",chatComposerStyle:"chat_composer_style",chatComposerPlaceholder:"chat_composer_placeholder",chatHistoryBar:"chat_history_bar",chatGeneralBanner:"chat_general_banner",chatSendButton:"chat_send_button",chatTextingAsk:"chat_texting_ask"}),FIELDS=Object.keys(PRESENTATION_WIRE_NAMES),PRESENTATION_LOCK="presentation",PRESENTATION_LOCK_PREFIX="presentation.";var ENUMS={chatAnswerStyle:["bubbles","cards"],chatHistoryStyle:["drawer","sheet"],chatTopCard:["none","focus"],safetyDisclaimerPlacement:["composer","answer_footer"],healthPlanLayout:["standard","focus_plan"],chatComposerStyle:["standard","compact"],chatComposerPlaceholder:["generic","pet_name"],chatHistoryBar:["pinned","scroll"],chatSendButton:["always_dark","dim_when_empty"]},BOOLS=/* @__PURE__ */new Set(["chatFollowUpsExcludeTelevet","chatComposerMic","chatComposerUpload","recordsTopRiskLine","recordsClearResultsFilter","chatGeneralBanner","chatTextingAsk"]);function parseField(field,value){if(value==null)return;let allowed=ENUMS[field];return allowed!==void 0?typeof value=="string"&&allowed.includes(value)?value:void 0:BOOLS.has(field)?typeof value=="boolean"?value:void 0:typeof value=="number"&&Number.isInteger(value)&&value>=0&&value<=3?value:void 0}function parsePresentation(raw){if(raw===null||typeof raw!="object"||Array.isArray(raw))return null;let source=raw,out={};for(let field of FIELDS){let wire=PRESENTATION_WIRE_NAMES[field],value=Object.prototype.hasOwnProperty.call(source,wire)?source[wire]:source[field],parsed=parseField(field,value);parsed!==void 0&&(out[field]=parsed)}return Object.keys(out).length===0?null:/* @__PURE__ */Object.freeze(out)}function isPresentationFieldLocked(field,locked){if(locked==null)return false;let one=`${PRESENTATION_LOCK_PREFIX}${PRESENTATION_WIRE_NAMES[field]}`;for(let name of locked)if(name===PRESENTATION_LOCK||name===one)return true;return false}function resolvePresentation(input){let server=parsePresentation(input?.server??null)??{},client=parsePresentation(input?.client??null)??{},locked=input?.locked?[...input.locked]:null,out={};for(let field of FIELDS){let fromServer=server[field],fromClient=isPresentationFieldLocked(field,locked)?void 0:client[field];out[field]=fromClient??fromServer??DEFAULT_PRESENTATION[field]}/* @__PURE__ */
108
108
  return Object.freeze(out)}var NO_SNAPSHOT=/* @__PURE__ */Object.freeze({branding:null}),NO_STORE=/* @__PURE__ */Object.freeze({subscribe:()=>()=>{},getSnapshot:()=>NO_SNAPSHOT});function keyOf(input){return input?Object.keys(input).sort().map(k=>`${k}=${String(input[k])}`).join("&"):""}function useEverfurPresentation(client){return useEverfurPresentationState(client).presentation}function useEverfurPresentationState(client){let{runtime:runtime}=useEverfurContext(),store=runtime?.entitlements??NO_STORE,readBranding=useCallback(()=>store.getSnapshot()?.branding??null,[store]),branding=useSyncExternalStore(store.subscribe,readBranding,readBranding),clientKey=keyOf(client);return useMemo(()=>{let locked=branding?.lockedFields??null;return{presentation:resolvePresentation({server:branding?.presentation??null,locked:locked,client:client??null}),isLocked:field=>isPresentationFieldLocked(field,locked)}},[branding,clientKey])}var REQUIRES=/* @__PURE__ */Object.freeze({chat:/* @__PURE__ */Object.freeze(["chat.message.create"]),records:/* @__PURE__ */Object.freeze(["records.upload.create","records.record.read"]),recordsClinic:/* @__PURE__ */Object.freeze(["records.clinic.create"]),video:/* @__PURE__ */Object.freeze(["video.gait.execute"]),photo:/* @__PURE__ */Object.freeze(["photo.checkup.execute"]),animations:/* @__PURE__ */Object.freeze(["animations.state.read"]),televet:/* @__PURE__ */Object.freeze(["televet.visit.create"]),texting:/* @__PURE__ */Object.freeze(["sms.identity.read","sms.identity.update"]),healthPlan:/* @__PURE__ */Object.freeze(["shop.plan.read","shop.plan.update"])});function requires(name){return REQUIRES[name]}function decideCapability(name,decisions,opts){let keys=requires(name),byResource=/* @__PURE__ */new Map;for(let decision of decisions)byResource.set(decision.resource,decision);if(opts?.isPending===true&&keys.some(key=>!byResource.has(key)))return freezeDecision({name:name,enabled:false,isPending:true,limits:{}});let limits=mergeLimits(keys,byResource);return keys.filter(key=>byResource.get(key)?.granted!==true).length===0?freezeDecision({name:name,enabled:true,isPending:false,limits:limits}):freezeDecision({name:name,enabled:false,isPending:false,limits:limits,disabled:disabledFor(keys,byResource)})}function mergeLimits(keys,byResource){let out={};for(let key of keys){let decisionLimits=byResource.get(key)?.limits;if(decisionLimits)for(let[limitKey,limitValue]of Object.entries(decisionLimits)){let existing=out[limitKey];out[limitKey]=existing===void 0?limitValue:Math.min(existing,limitValue)}}return out}function disabledFor(keys,byResource){for(let key of keys){let explicit=byResource.get(key)?.disabled;if(explicit)/* @__PURE__ */
109
109
  return Object.freeze({reason:explicit.reason,level:explicit.level,recoverable:explicit.recoverable})}/* @__PURE__ */
110
- return Object.freeze({reason:userFacingError("accessDenied"),level:"user_entitlement",recoverable:false})}function freezeDecision(d){let base2={name:d.name,enabled:d.enabled,isPending:d.isPending,limits:/* @__PURE__ */Object.freeze({...d.limits})};return d.disabled!==void 0&&(base2.disabled=d.disabled),/* @__PURE__ */Object.freeze(base2)}function useCapability(name){let{runtime:runtime}=useEverfurContext(),store=runtime.entitlements,snapshot=useSyncExternalStore(store.subscribe,store.getSnapshot,store.getSnapshot);return useMemo(()=>decideCapability(name,snapshot.decisions,{isPending:snapshot.isPending}),[name,snapshot])}var COARSE_NOW_TICK_MS=3600*1e3;function useCoarseNow(fixed,shown=true){let[now,setNow]=useState(()=>fixed??Date.now()),first=useRef(true);return useEffect(()=>{if(first.current){first.current=false;return}fixed===void 0&&shown&&setNow(Date.now())},[fixed,shown]),useEffect(()=>{if(fixed!==void 0||!shown)return;let tick=setInterval(()=>setNow(Date.now()),COARSE_NOW_TICK_MS),onVisible=()=>{document.visibilityState==="visible"&&setNow(Date.now())},doc=typeof document<"u"&&typeof document.addEventListener=="function"?document:null;return doc?.addEventListener("visibilitychange",onVisible),()=>{clearInterval(tick),doc?.removeEventListener("visibilitychange",onVisible)}},[fixed,shown]),fixed??now}var RECORDS_TERMINAL=/* @__PURE__ */Object.freeze(["published","failed","revoked"]);function isTerminalStatus(status){return RECORDS_TERMINAL.includes(status)}var NAMELESS_PET="your pet";var capital=text2=>text2.charAt(0).toUpperCase()+text2.slice(1);function pronounForSex(sex){let s=sex?.trim().toLowerCase();return s==="female"?"her":s==="male"?"his":null}function sheetPetWords(name,pronoun){let trimmed=name.trim(),shown=trimmed.length>0?trimmed:NAMELESS_PET,Name=capital(shown);return pronoun==="her"?{name:shown,Name:Name,poss:"her",Poss:"Her",subj:"she"}:pronoun==="his"?{name:shown,Name:Name,poss:"his",Poss:"His",subj:"he"}:{name:shown,Name:Name,poss:`${shown}'s`,Poss:`${Name}'s`,subj:shown}}var SHEET_COPY=/* @__PURE__ */Object.freeze({vitalsFrom:(w,visit,date2)=>`Vitals from ${w.poss} ${visit}, ${date2}`,vitalsSource:w=>`Where ${w.name}'s vitals come from`,temperature:"Temperature",heartRate:"Heart rate",breathing:"Breathing",upcomingCare:"Upcoming care",overdueBy:date2=>`Overdue · due by ${date2}`,dueSoon:"Due soon",later:"Later",noDate:"No date",dueIn:(date2,days)=>`Due ${date2} · in ${days} ${days===1?"day":"days"}`,dueToday:date2=>`Due ${date2} · today`,overdueByDays:(date2,days)=>`Overdue by ${days} ${days===1?"day":"days"} · due ${date2}`,recordsHistory:"Records & history",labs:"Labs & bloodwork",results:"results",screenings:"Screenings",screeningsClear:"All clear",screeningsToReview:n=>`${n} to review`,noScreenings:"No screenings yet",visits:"Visits & records",timeline:"Timeline",events:n=>`${n} ${n===1?"event":"events"}`,weight:"Weight",vetVisits:n=>`${n} vet ${n===1?"visit":"visits"}`,history:"History",theirClinic:w=>`${w.Poss} clinic`,bloodPanel:"Blood panel",aboveRange:"above range",belowRange:"below range",othersInRange:"Other values in range.",addRecords:w=>`Add ${w.name}'s records`,moreThanOneClinic:"Records can come from more than one clinic over a lifetime.",visitsCount:n=>`${n} ${n===1?"visit":"visits"}`,panelsCount:n=>`${n} blood ${n===1?"panel":"panels"}`,requestFromClinic:"Request from a clinic",uploadDocument:"Upload a document",onFileNow:"On file now",firstRecord:w=>`Add ${w.name}'s first record`,firstLead:w=>`Records can come from more than one clinic over a lifetime. Start with the one ${w.subj} sees most, and this page fills in from there.`,requestFromTheirClinic:w=>`Request from ${w.poss} clinic`,requestDetail:"We send a secure request and read every page they send back.",uploadDetail:"A PDF, or a photo of a paper record.",findClinic:w=>`Find ${w.name}'s clinic`,chooseFile:"Choose a file",sayBeats:/* @__PURE__ */Object.freeze(["Hmmm","I wonder","what I may be","hiding"]),sayStill:"I wonder what I may be hiding",sample:"Sample",peekLead:w=>`A sneak peek at how ${w.name}'s records will read. Every number links back to the page it came from.`,sampleNote:w=>`Sample data until ${w.poss} records arrive.`,onTheWay:w=>`${w.Name}'s records are on the way`,clinicsTake:"Clinics usually take 2 to 5 days.",anotherClinic:"Another clinic",anotherClinicDetail:"Seen more than one vet? We ask each one.",noDueDate:"No due date on file",noLabs:w=>`No lab results on file for ${w.name} yet. They show up here when a record includes a blood or urine panel.`,noVisits:w=>`No visits in ${w.name}'s records yet. They show up here when a record includes one.`,oneReading:"One reading so far: we'll plot a trend as more come in.",takingNow:"Taking now",noCurrentMeds:"No current medications on file.",noVetTitle:w=>`When ${w.name} has a vet, start here.`,requestedFrom:clinic=>`Requested from ${clinic}. Clinics usually take 2 to 5 days.`,onTheWayFrom:(w,clinic)=>`${w.Name}'s records from ${clinic} are on the way.`,readingUpload:"We're reading the document you uploaded.",seeWhereItStands:"See where it stands",topRisk:w=>`${w.Poss} top risk`,seePlan:w=>`See ${w.poss} Health Plan`,panelOn:date2=>`${date2} blood panel`,latestReading:"Latest reading",rangeLine:(low,high,unit)=>`range ${low} to ${high}${unit?` ${unit}`:""}`,noRange:"No range on the report",above:"Above",inRange:"In range",below:"Below",high:"High",belowRangePill:"Below range",changeUp:(delta,unit)=>`Up ${delta}${unit?` ${unit}`:""}`,changeDown:(delta,unit)=>`Down ${delta}${unit?` ${unit}`:""}`,changeSince:(date2,pct)=>` since ${date2}, about ${pct}%.`,whatIs:name=>`What ${name} is`,otherValues:panel=>`Other ${panel} values`,panelTitle:(panel,date2)=>`${panel} · ${date2}`,askAboutThis:"Ask about this"});function sheetSampleKind(species){let s=species?.trim().toLowerCase()??"";return/^(dog|canine|k9|puppy)\b/.test(s)?"dog":/^(cat|feline|kitten)\b/.test(s)?"cat":"other"}var DAY_MS=864e5,DUE_SOON_DAYS=30,LB_PER_KG=2.20462,MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function dayMs(value){if(value==null||value.length===0)return null;let ms=Date.parse(/^\d{4}-\d{2}-\d{2}$/.test(value)?`${value}T00:00:00Z`:value);return Number.isNaN(ms)?null:ms}function shortDate(ms){let d=new Date(ms);return`${MONTHS[d.getUTCMonth()]??""} ${d.getUTCDate()}`}function longDate(ms){return`${shortDate(ms)}, ${new Date(ms).getUTCFullYear()}`}function monthTick(ms){let d=new Date(ms);return`${d.getUTCMonth()+1}/${String(d.getUTCFullYear()%100).padStart(2,"0")}`}var dayKey=ms=>new Date(ms).toISOString().slice(0,10);function num2(value){return String(Math.round(value*100)/100)}var lb=kg=>Math.round(kg*LB_PER_KG*10)/10;function midSentence(text2){let t=text2.trim();return t.length<2||t[1]===t[1]?.toUpperCase()?t:t.charAt(0).toLowerCase()+t.slice(1)}function vitalKind(text2){return/temp/i.test(text2)?"temp":/heart|pulse/i.test(text2)?"heart":/resp|breath/i.test(text2)?"breath":null}var VITAL_ORDER=["temp","heart","breath"],VITAL_LABEL={temp:SHEET_COPY.temperature,heart:SHEET_COPY.heartRate,breath:SHEET_COPY.breathing};function sheetVitals(record){if(record===null||record.withheld)return{vitals:[],observedMs:null};let best=/* @__PURE__ */new Map;for(let e of record.entities){if(e.category!=="vital"||e.value===null||e.value.trim().length===0)continue;let kind=vitalKind(`${e.canonicalKey??""} ${e.key} ${e.label}`);if(kind===null)continue;let ms=dayMs(e.observedAt)??0,prev=best.get(kind);(prev===void 0||ms>prev.ms)&&best.set(kind,{value:e.value.trim(),unit:e.unit,ms:ms})}let vitals=VITAL_ORDER.flatMap(kind=>{let v=best.get(kind);return v===void 0?[]:[{kind:kind,value:v.value,unit:v.unit,label:VITAL_LABEL[kind]}]}),observed=[...best.values()].map(v=>v.ms).filter(ms=>ms>0);return{vitals:vitals,observedMs:observed.length>0?Math.max(...observed):null}}function encounterOn(encounters,ms){let key=dayKey(ms);return encounters.find(e=>{let at=dayMs(e.date);return at!==null&&dayKey(at)===key})??null}function dueIcon(title){return/vaccin|rabies|dhpp|booster|bordetella|lepto|lyme|parvo|distemper/i.test(title)?"efi-shield":/\b(alt|alp|lab|labs|blood|panel|bloodwork|urinalysis|chemistry|cbc)\b/i.test(title)?"efi-flask-sm":"efi-calendar"}function sheetDue(items,nowMs){return items.map(item=>{let due=dayMs(item.dueAt),icon=dueIcon(item.title);if(due!==null&&due<nowMs-DAY_MS+1)return{item:item,title:item.title,when:SHEET_COPY.overdueBy(shortDate(due)),tone:"alert",pill:null,icon:icon};let when=item.detail??(due===null?SHEET_COPY.noDueDate:longDate(due));if(due===null)return{item:item,title:item.title,when:when,tone:"none",pill:null,icon:icon};let soon=due-nowMs<=DUE_SOON_DAYS*DAY_MS;return{item:item,title:item.title,when:when,tone:soon?"watch":"later",pill:soon?SHEET_COPY.dueSoon:SHEET_COPY.later,icon:icon}})}function pointFlag(status){return status==null?null:/above|high/i.test(status)?"above":/below|low/i.test(status)?"below":/in_range|normal|in range/i.test(status)?"in":null}var kgShown=kg=>Math.round(kg*10)/10;function weightText(kg,unit){let pounds=`${num2(lb(kg))} lb`,kilos=`${num2(kgShown(kg))} kg`;return unit==="kg"?{main:kilos,other:pounds}:{main:pounds,other:kilos}}function weightModel(timeline,unit){if(timeline===null||timeline.withheld)return null;let readings=timeline.weights.flatMap(w=>{let ms=dayMs(w.observedOn);return ms===null||w.weightKg===null?[]:[{ms:ms,kg:w.weightKg}]}).sort((a,b)=>a.ms-b.ms),last=readings[readings.length-1];if(last===void 0)return null;let lbs=readings.map(r=>lb(r.kg)),lo=Math.min(...lbs),hi=Math.max(...lbs),t0=readings[0]?.ms??last.ms,span=last.ms-t0,points=readings.map((r,i)=>({x:span>0?Math.round((3.55+93.45*(r.ms-t0)/span)*100)/100:50,y:hi>lo?Math.round((75-50*((lbs[i]??lo)-lo)/(hi-lo))*10)/10:50,lb:lbs[i]??0,value:unit==="kg"?kgShown(r.kg):lbs[i]??0,ms:r.ms})),tickPoints=points.length<=4?points:[points[0],points[points.length-1]].filter(p=>p!==void 0),text2=weightText(last.kg,unit);return{latest:text2.main,sub:`${text2.other} · ${shortDate(last.ms)}`,single:points.length===1,points:points,ticks:tickPoints.map(p=>({x:p.x,label:monthTick(p.ms)})),vetCount:points.length}}function labDays(markers){let days=/* @__PURE__ */new Map;if(markers===null||markers.withheld)return days;for(let marker of markers.markers)for(let point of marker.points){let ms=dayMs(point.at);if(ms===null)continue;let key=dayKey(ms),day=days.get(key)??{ms:ms,flagged:[],total:0,inRange:0,clinics:/* @__PURE__ */new Set};day.total+=1;let flag=pointFlag(point.status);flag==="in"&&(day.inRange+=1),(flag==="above"||flag==="below")&&day.flagged.push({marker:marker,point:point,ms:ms,flag:flag}),point.sourceClinic&&day.clinics.add(point.sourceClinic),days.set(key,day)}return days}function historyModel(inputs,days){let items=[];for(let[key,day]of days)day.flagged.forEach((f,i)=>{let value=f.point.value===null?f.point.qualitativeResult??"":num2(f.point.value),unit=f.point.unit??f.marker.unit,others=day.flagged.length===1&&day.inRange===day.total-1&&day.total>1;items.push({key:`lab-${key}-${f.marker.markerId}-${i}`,ms:day.ms,date:`${shortDate(day.ms)} · ${SHEET_COPY.bloodPanel}`,title:`${f.marker.name} ${value}${unit?` ${unit}`:""}, ${f.flag==="above"?SHEET_COPY.aboveRange:SHEET_COPY.belowRange}`,text:others?SHEET_COPY.othersInRange:null,alert:true,markerId:f.marker.markerId,order:0})});let encounters=inputs.depth?.withheld===false?inputs.depth.encounters:[],visits=inputs.timeline?.withheld===false?inputs.timeline.visits:[],usedVisits=/* @__PURE__ */new Set;encounters.forEach((e,i)=>{let ms=dayMs(e.date);if(ms===null)return;let visit=visits.find(v=>e.docId!==null&&v.docId===e.docId||dayMs(v.visitDate)!==null&&dayKey(dayMs(v.visitDate)??0)===dayKey(ms))??null;visit!==null&&usedVisits.add(visit.visitId);let summary=visit?.summary?.trim()||null,type=e.type?.trim()||null,title=summary??type;title!==null&&items.push({key:`enc-${e.encounterId}-${i}`,ms:ms,date:summary!==null&&type!==null?`${shortDate(ms)} · ${type}`:shortDate(ms),title:title,text:null,alert:false,markerId:null,order:1})});for(let v of visits){let ms=dayMs(v.visitDate),summary=v.summary?.trim()||null;usedVisits.has(v.visitId)||ms===null||summary===null||items.push({key:`visit-${v.visitId}`,ms:ms,date:shortDate(ms),title:summary,text:null,alert:false,markerId:null,order:1})}items.sort((a,b)=>b.ms-a.ms||a.order-b.order);let years=[];for(let entry of items){let item={key:entry.key,ms:entry.ms,date:entry.date,title:entry.title,text:entry.text,alert:entry.alert,markerId:entry.markerId},year=String(new Date(item.ms).getUTCFullYear()),last=years[years.length-1];last!==void 0&&last.year===year?last.items.push(item):years.push({year:year,items:[item]})}return{years:years,count:items.length}}function sourcesModel(inputs,days){let encounters=inputs.depth?.withheld===false?inputs.depth.encounters:[],clinicLabel=name=>name?.trim()||SHEET_COPY.theirClinic(inputs.words),visits=/* @__PURE__ */new Map;for(let e of encounters)visits.set(clinicLabel(e.clinicName),(visits.get(clinicLabel(e.clinicName))??0)+1);let panels=/* @__PURE__ */new Map,onlyClinic=visits.size===1?[...visits.keys()][0]:void 0;for(let day of days.values()){let names=day.clinics.size>0?[...day.clinics].map(clinicLabel):[onlyClinic??SHEET_COPY.theirClinic(inputs.words)];for(let n of names)panels.set(n,(panels.get(n)??0)+1)}return[.../* @__PURE__ */new Set([...visits.keys(),...panels.keys()])].map(label=>({label:label,detail:[(visits.get(label)??0)>0?SHEET_COPY.visitsCount(visits.get(label)??0):null,(panels.get(label)??0)>0?SHEET_COPY.panelsCount(panels.get(label)??0):null].filter(p=>p!==null).join(" · ")}))}var PULL_PCT={requested:15,awaiting_clinic:35,awaiting_upload:35,received:60,parsing:75,in_review:90};function sheetPull(requests){let open=requests.filter(r=>!isTerminalStatus(r.status)).sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0))[0];if(open===void 0)return null;let step=(open.waitingExpectation?.trim()||open.statusLabel).trim();return step.length===0?null:{step:step,pct:PULL_PCT[open.status]??15}}var newestFirst=requests=>[...requests].sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0)),sentence=label=>/[.!?]$/.test(label)?label:`${label}.`;function sheetOnTheWay(words2,requests){let active=newestFirst(requests).filter(r=>!isTerminalStatus(r.status)),waiting=active.filter(r=>r.status==="awaiting_upload"),moving=active.filter(r=>r.status!=="awaiting_upload"),lines=[],clinics=/* @__PURE__ */new Map;for(let r of moving){let clinic=r.clinicName?.trim()??"";r.source!=="clinic_request"||clinic===""||clinics.has(clinic)||clinics.set(clinic,r)}for(let[clinic,newest]of clinics)lines.push({key:`clinic-${clinic}`,text:SHEET_COPY.onTheWayFrom(words2,clinic),requestId:newest.id});let upload=moving.find(r=>r.source==="owner_provided");upload!==void 0&&lines.push({key:"upload",text:SHEET_COPY.readingUpload,requestId:upload.id});let wait=waiting[0],label=wait?.statusLabel.trim()??"";return wait!==void 0&&label!==""&&lines.push({key:"awaiting-upload",text:sentence(label),requestId:wait.id}),lines}function sheetRequestedClinic(requests){return newestFirst(requests).find(r=>!isTerminalStatus(r.status)&&r.status!=="awaiting_upload"&&r.source==="clinic_request"&&(r.clinicName?.trim()??"")!=="")?.clinicName?.trim()??null}function sheetMedications(timeline){if(timeline===null||timeline.withheld)return null;let named=timeline.medications.filter(m=>(m.drugName?.trim()??"")!=="");return named.length===0?null:{current:named.filter(m=>(m.stoppedOn?.trim()??"")==="").map(m=>{let parts=[m.dose,m.frequency,m.route].map(p=>p?.trim()??"").filter(p=>p!==""),detail=m.sig?.trim()||(parts.length>0?parts.join(" · "):null);return{key:m.medicationId,name:(m.drugName??"").trim(),detail:detail}})}}function sheetFailedRequest(requests){if(requests.some(r=>!isTerminalStatus(r.status)))return null;let newest=[...requests].sort((a,b)=>(dayMs(b.updatedAt)??0)-(dayMs(a.updatedAt)??0))[0];if(newest===void 0||newest.status!=="failed")return null;let words2=newest.statusLabel.trim();return words2.length>0?words2:null}function sheetHasRecord(record,markers,depth){return record!==null&&!record.withheld&&!record.isEmpty||markers!==null&&!markers.withheld&&markers.markers.length>0?true:depth!==null&&!depth.withheld&&depth.encounters.length>0}function sheetAge(ageYears){if(typeof ageYears!="number"||!Number.isFinite(ageYears)||ageYears<=0)return null;let totalMonths=Math.floor(ageYears*12+1e-9),years=Math.floor(totalMonths/12),months=totalMonths%12;return years<=0?`${months}M`:months>0?`${years}Y ${months}M`:`${years}Y`}function buildRecordsSheetModel(inputs){let{record:record,depth:depth,markers:markers,nowMs:nowMs}=inputs,has=sheetHasRecord(record,markers,depth),pull=sheetPull(inputs.requests),days=labDays(markers),{vitals:vitals,observedMs:observedMs}=sheetVitals(record),encounters=depth?.withheld===false?depth.encounters:[],visitAt=observedMs===null?null:encounterOn(encounters,observedMs),vitalsFrom=observedMs!==null&&visitAt?.type?SHEET_COPY.vitalsFrom(inputs.words,midSentence(visitAt.type),shortDate(observedMs)):null,unit=inputs.weightUnit??"lb",weight=weightModel(inputs.timeline,unit),latestKg=weight!==null?null:inputs.petWeightKg,meta=[inputs.breed?.trim()||null,sheetAge(inputs.petAgeYears),weight?.latest??(latestKg!==null?weightText(latestKg,unit).main:null)].filter(p=>p!==null),timelineVisits=inputs.timeline?.withheld===false?inputs.timeline.visits.length:0,history=historyModel(inputs,days),encounterDays=encounters.map(e=>dayMs(e.date)).filter(ms=>ms!==null),markerList=markers?.withheld===false?markers.markers:[],featured=markers?.featuredMarkerId??markerList.find(m=>pointFlag(m.latest?.status)==="above"||pointFlag(m.latest?.status)==="below")?.markerId??markerList[0]?.markerId??null;return{state:has?"full":pull!==null?"onTheWay":"none",meta:meta.length>0?meta.join(" · "):null,vitals:vitals,vitalsFrom:vitalsFrom,due:record!==null&&!record.withheld?sheetDue(record.forwardLooking,nowMs):[],labsCount:markers?.withheld===false?markers.summary?.totalMarkers??markers.markers.length:0,featuredMarkerId:featured,latestVisit:encounterDays.length>0?longDate(Math.max(...encounterDays)):null,weight:weight,history:history.years,historyCount:history.count,sources:sourcesModel(inputs,days),pull:pull,hasVisits:encounters.length>0||timelineVisits>0,medications:sheetMedications(inputs.timeline),failedRequest:pull===null?sheetFailedRequest(inputs.requests):null,inFlight:sheetOnTheWay(inputs.words,inputs.requests),requestedClinic:sheetRequestedClinic(inputs.requests)}}function lastPoint(marker){let dated=marker.points.filter(p=>p.value!==null);return dated[dated.length-1]??marker.points[marker.points.length-1]??null}function rangeOf(point){return point===null||point.refLow===null||point.refHigh===null||!Number.isFinite(point.refLow)||!Number.isFinite(point.refHigh)||point.refHigh<=point.refLow?null:{low:point.refLow,high:point.refHigh}}function markerRow(marker,point=lastPoint(marker)){let range=rangeOf(point),unit=point?.unit??marker.unit,value=point?.value??null;return{markerId:marker.markerId,name:marker.name,value:value===null?point?.qualitativeResult??"":num2(value),unit:unit,range:range===null?null:`${num2(range.low)} to ${num2(range.high)}${unit?` ${unit}`:""}`,at:range===null||value===null?null:Math.round(Math.min(100,Math.max(0,20+60*(value-range.low)/(range.high-range.low)))),flag:pointFlag(point?.status??marker.latest?.status??null)}}function flagPill(flag){return flag==="above"?SHEET_COPY.high:flag==="below"?SHEET_COPY.belowRangePill:flag==="in"?SHEET_COPY.inRange:null}var panelWord=panel=>{let name=panel.replace(/\s+panel$/i,"").trim()||panel;return name.length>1&&name[1]===name[1]?.toUpperCase()?name:name.charAt(0).toLowerCase()+name.slice(1)};function buildSheetLabModel(markers,markerId){let marker=markers.markers.find(m=>m.markerId===markerId);if(marker===void 0)return null;let last=lastPoint(marker),row=markerRow(marker,last),lastMs=dayMs(last?.at??marker.latest?.at??null),range=rangeOf(last),latestSub=[lastMs===null?null:shortDate(lastMs),range===null?SHEET_COPY.noRange:SHEET_COPY.rangeLine(num2(range.low),num2(range.high),row.unit)].filter(p=>p!==null).join(" · "),numeric=marker.points.flatMap(p=>{let ms=dayMs(p.at);return p.value===null||ms===null?[]:[{p:p,ms:ms,v:p.value}]}),chart=[];if(numeric.length>0){let values=numeric.map(n=>n.v),lo=range?.low??Math.min(...values),hi=range?.high??Math.max(...values);chart=numeric.map((n,i)=>({x:numeric.length===1?50:Math.round((18+64*i/(numeric.length-1))*100)/100,y:hi>lo?Math.min(98,Math.max(2,Math.round((75-50*(n.v-lo)/(hi-lo))*10)/10)):50,label:num2(n.v),out:pointFlag(n.p.status)==="above"||pointFlag(n.p.status)==="below",tick:shortDate(n.ms)}))}let first=numeric[0],final=numeric[numeric.length-1],change=null;if(first!==void 0&&final!==void 0&&numeric.length>=2&&final.v!==first.v){let delta=Math.abs(final.v-first.v),pct=first.v!==0?Math.round(delta/Math.abs(first.v)*100):null,lead2=final.v>first.v?SHEET_COPY.changeUp(num2(delta),row.unit):SHEET_COPY.changeDown(num2(delta),row.unit);change=pct===null?null:{lead:lead2,rest:SHEET_COPY.changeSince(shortDate(first.ms),pct)}}let groups=[],lastKey=lastMs===null?null:dayKey(lastMs),others=markers.markers.filter(m=>m.markerId!==marker.markerId),samePanel=others.filter(m=>m.panel!==null&&m.panel===marker.panel);if(samePanel.length>0&&marker.panel!==null){let rows=samePanel.map(m=>markerRow(m));groups.push({title:SHEET_COPY.otherValues(panelWord(marker.panel)),allInRange:rows.every(r=>r.flag==="in"),rows:rows})}if(lastKey!==null&&lastMs!==null){let byPanel=/* @__PURE__ */new Map;for(let m of others){if(m.panel===null||m.panel===marker.panel)continue;let p=[...m.points].reverse().find(pt=>{let ms=dayMs(pt.at);return ms!==null&&dayKey(ms)===lastKey});p!==void 0&&byPanel.set(m.panel,[...byPanel.get(m.panel)??[],markerRow(m,p)])}for(let[panel,rows]of byPanel)groups.push({title:SHEET_COPY.panelTitle(panel,shortDate(lastMs)),allInRange:rows.every(r=>r.flag==="in"),rows:rows})}return{markerId:marker.markerId,name:marker.name,meta:lastMs===null?null:SHEET_COPY.panelOn(longDate(lastMs)),pill:flagPill(row.flag),flagged:row.flag==="above"||row.flag==="below",latest:`${row.value}${row.unit?` ${row.unit}`:""}`,latestSub:latestSub,hasRange:range!==null,chart:chart,change:change,meaning:(marker.meaning??"").split(/\n\s*\n/).map(p=>p.trim()).filter(p=>p.length>0),groups:groups}}var FACT_ENTITY_TYPE_MAX=64,FACT_CANONICAL_KEY_MAX=512;function normalizeOrigin(raw){return raw==="owner_reported"||raw==="clinic_document"?raw:null}var entitySchema=/* @__PURE__ */z.object({key:/* @__PURE__ */z.string(),category:/* @__PURE__ */z.string().optional(),label:/* @__PURE__ */z.string().optional(),value:/* @__PURE__ */z.string().nullish(),unit:/* @__PURE__ */z.string().nullish(),observed_at:/* @__PURE__ */z.string().nullish(),status:/* @__PURE__ */z.string().nullish(),origin:/* @__PURE__ */z.string().nullish(),canonical_key:/* @__PURE__ */z.string().nullish()});var documentSchema=/* @__PURE__ */z.object({doc_id:/* @__PURE__ */z.string(),title:/* @__PURE__ */z.string().nullish(),document_class:/* @__PURE__ */z.string().nullish(),page_count:/* @__PURE__ */z.number().nullish(),received_at:/* @__PURE__ */z.string().nullish()});function mapEntityRow(e){/* @__PURE__ */
110
+ return Object.freeze({reason:userFacingError("accessDenied"),level:"user_entitlement",recoverable:false})}function freezeDecision(d){let base2={name:d.name,enabled:d.enabled,isPending:d.isPending,limits:/* @__PURE__ */Object.freeze({...d.limits})};return d.disabled!==void 0&&(base2.disabled=d.disabled),/* @__PURE__ */Object.freeze(base2)}function useCapability(name){let{runtime:runtime}=useEverfurContext(),store=runtime.entitlements,snapshot=useSyncExternalStore(store.subscribe,store.getSnapshot,store.getSnapshot);return useMemo(()=>decideCapability(name,snapshot.decisions,{isPending:snapshot.isPending}),[name,snapshot])}var COARSE_NOW_TICK_MS=3600*1e3;function useCoarseNow(fixed,shown=true){let[now,setNow]=useState(()=>fixed??Date.now()),first=useRef(true);return useEffect(()=>{if(first.current){first.current=false;return}fixed===void 0&&shown&&setNow(Date.now())},[fixed,shown]),useEffect(()=>{if(fixed!==void 0||!shown)return;let tick=setInterval(()=>setNow(Date.now()),COARSE_NOW_TICK_MS),onVisible=()=>{document.visibilityState==="visible"&&setNow(Date.now())},doc=typeof document<"u"&&typeof document.addEventListener=="function"?document:null;return doc?.addEventListener("visibilitychange",onVisible),()=>{clearInterval(tick),doc?.removeEventListener("visibilitychange",onVisible)}},[fixed,shown]),fixed??now}var FACT_ENTITY_TYPE_MAX=64,FACT_CANONICAL_KEY_MAX=512;function normalizeOrigin(raw){return raw==="owner_reported"||raw==="clinic_document"?raw:null}var entitySchema=/* @__PURE__ */z.object({key:/* @__PURE__ */z.string(),category:/* @__PURE__ */z.string().optional(),label:/* @__PURE__ */z.string().optional(),value:/* @__PURE__ */z.string().nullish(),unit:/* @__PURE__ */z.string().nullish(),observed_at:/* @__PURE__ */z.string().nullish(),status:/* @__PURE__ */z.string().nullish(),origin:/* @__PURE__ */z.string().nullish(),canonical_key:/* @__PURE__ */z.string().nullish()});var documentSchema=/* @__PURE__ */z.object({doc_id:/* @__PURE__ */z.string(),title:/* @__PURE__ */z.string().nullish(),document_class:/* @__PURE__ */z.string().nullish(),page_count:/* @__PURE__ */z.number().nullish(),received_at:/* @__PURE__ */z.string().nullish()});function mapEntityRow(e){/* @__PURE__ */
111
111
  return Object.freeze({key:e.key,category:e.category??"",label:e.label??e.key,value:e.value??null,unit:e.unit??null,observedAt:e.observed_at??null,status:e.status??null,origin:normalizeOrigin(e.origin),canonicalKey:e.canonical_key??null})}function mapDocumentRow(d){/* @__PURE__ */
112
112
  return Object.freeze({docId:d.doc_id,title:d.title??null,documentClass:d.document_class??null,pageCount:d.page_count??null,receivedAt:d.received_at??null})}var str5=/* @__PURE__ */z.string().nullish(),num3=/* @__PURE__ */z.number().nullish(),pointSchema=/* @__PURE__ */z.object({collected_at:str5,at:str5,value:num3,unit:str5,qualitative_result:str5,ref_low:num3,ref_high:num3,status:str5,source_clinic:str5,source_doc_id:str5,doc_id:str5,reviewed:/* @__PURE__ */z.boolean().nullish()}),latestSchema=/* @__PURE__ */z.object({collected_at:str5,at:str5,value:num3,unit:str5,qualitative_result:str5,status:str5}),markerSchema=/* @__PURE__ */z.object({marker_id:/* @__PURE__ */z.string().min(1),canonical_name:str5,name:str5,loinc_code:str5,canonical_unit:str5,unit:str5,panel_name:str5,panel:str5,meaning_text:str5,meaning:str5,latest:/* @__PURE__ */latestSchema.nullish(),trajectory:str5,points:/* @__PURE__ */z.array(pointSchema).optional()}),summarySchema=/* @__PURE__ */z.object({total_markers:/* @__PURE__ */z.number().int().nonnegative(),in_range_count:/* @__PURE__ */z.number().int().nonnegative(),out_of_range_count:/* @__PURE__ */z.number().int().nonnegative(),unknown_count:/* @__PURE__ */z.number().int().nonnegative()}),markersSchema=/* @__PURE__ */z.object({markers:/* @__PURE__ */z.array(markerSchema).optional(),summary:/* @__PURE__ */summarySchema.nullish(),disclaimer:/* @__PURE__ */z.string().optional(),featured_marker_id:str5});function isObject(v){return typeof v=="object"&&v!==null&&!Array.isArray(v)}function withheldMarkers(pet){/* @__PURE__ */
113
113
  return Object.freeze({petRef:pet,withheld:true,markers:/* @__PURE__ */Object.freeze([]),summary:null,disclaimer:"",featuredMarkerId:null})}function mapRecordMarkers(petRef,wire){let w=isObject(wire)?wire:{},pet=typeof w.pet_ref=="string"&&w.pet_ref.length>0?w.pet_ref:petRef;if(w.withheld===true)return withheldMarkers(pet);let parsed=markersSchema.safeParse(w);if(!parsed.success)return withheldMarkers(pet);let m=parsed.data,point=p=>/* @__PURE__ */Object.freeze({at:p.collected_at??p.at??null,value:p.value??null,unit:p.unit??null,qualitativeResult:p.qualitative_result??null,refLow:p.ref_low??null,refHigh:p.ref_high??null,status:p.status??null,sourceClinic:p.source_clinic??null,docId:p.source_doc_id??p.doc_id??null,reviewed:p.reviewed===true}),markers=(m.markers??[]).map(marker=>/* @__PURE__ */Object.freeze({markerId:marker.marker_id,name:marker.canonical_name??marker.name??marker.marker_id,loincCode:marker.loinc_code??null,unit:marker.canonical_unit??marker.unit??null,panel:marker.panel_name??marker.panel??null,meaning:marker.meaning_text??marker.meaning??null,latest:marker.latest?/* @__PURE__ */Object.freeze({at:marker.latest.collected_at??marker.latest.at??null,value:marker.latest.value??null,unit:marker.latest.unit??null,qualitativeResult:marker.latest.qualitative_result??null,status:marker.latest.status??null}):null,trajectory:marker.trajectory??null,points:/* @__PURE__ */Object.freeze((marker.points??[]).map(point))}));/* @__PURE__ */
@@ -125,16 +125,16 @@ return jsx("span",{style:{position:"relative",display:"block",width:"100%",heigh
125
125
  return jsxs("svg",{viewBox:"0 0 48 48",preserveAspectRatio:"xMidYMid meet","aria-hidden":"true",focusable:"false",style:{display:"block",width:"100%",height:"100%"},"data-testid":"everfur-records-sheet-pet-monogram",children:[
126
126
  /* @__PURE__ */jsx("circle",{cx:"24",cy:"24",r:"23.5",vectorEffect:"non-scaling-stroke",fill:tint,stroke:line}),letters?/* @__PURE__ */jsx("text",{x:"24",y:"24",textAnchor:"middle",dominantBaseline:"central",fontSize:letters.length>1?20:26,fontWeight:"700",fill:ink,children:letters}):null]})}var PULSE_EASE="cubic-bezier(0.4, 0, 0.6, 1)",PULSE=[{opacity:1,offset:0,easing:PULSE_EASE},{opacity:.5,offset:.5,easing:PULSE_EASE},{opacity:1,offset:1}];function PetArt({art:art,onError:onError,name:name,skeleton:skeleton,reduced:reduced,monogram:monogram,testID:testID}){let renderKey=art.status==="art"?art.key:null,[loadedKey,setLoadedKey]=useState(null),artVisible=renderKey!==null&&loadedKey===renderKey,artPending=renderKey!==null&&!artVisible,holding=skeleton&&(renderKey!==null||art.status==="loading"),under=useRef(null),breathing=artPending&&!holding&&!reduced;useEffect(()=>{let el=under.current;if(!breathing||el===null||typeof el.animate!="function")return;let run=null;try{run=el.animate(PULSE,{duration:2e3,iterations:1/0,easing:"linear"})}catch{}return()=>run?.cancel()},[breathing]);let painted=node=>{node!==null&&renderKey!==null&&node.complete&&node.naturalWidth>0&&loadedKey!==renderKey&&setLoadedKey(renderKey)},fade=reduced?"none":"opacity 200ms ease-out";/* @__PURE__ */
127
127
  return jsxs("span",{style:{position:"relative",display:"block",width:"100%",height:"100%",overflow:"hidden"},"data-testid":testID,"data-art":art.status,children:[
128
- /* @__PURE__ */jsx("span",{ref:under,"aria-hidden":"true",style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"none",opacity:artVisible?0:1,transition:artVisible?fade:"none"},children:holding?/* @__PURE__ */jsx(PetDrawingSkeleton,{sweep:!reduced&&!artVisible}):/* @__PURE__ */jsx(PetMonogram,{name:name,...monogram})}),art.status==="art"?/* @__PURE__ */jsx("img",{ref:painted,src:art.url,width:720,height:1119,alt:"","aria-hidden":"true",draggable:false,decoding:"async",onLoad:()=>setLoadedKey(art.key),onError:onError,style:{position:"absolute",inset:0,display:"block",width:"100%",height:"100%",maxWidth:"none",objectFit:"contain",opacity:artVisible?1:0,transition:fade},"data-testid":"everfur-records-sheet-pet-art"},art.key):null]})}function usePageVisible(){let[visible,setVisible]=useState(()=>typeof document>"u"||document.visibilityState!=="hidden");return useEffect(()=>{if(typeof document>"u")return;let read=()=>setVisible(document.visibilityState!=="hidden");return read(),document.addEventListener("visibilitychange",read),()=>document.removeEventListener("visibilitychange",read)},[]),visible}var SheetFontsContext=createContext(RAPH_RECORDS_FONTS);var SheetRulesContext=createContext(RAPH_RECORDS_RULES),BASE2=/* @__PURE__ */Object.freeze({h:{boxSizing:"border-box",margin:0,color:"inherit",fontWeight:700,lineHeight:1.15,fontSize:"inherit"},p:{boxSizing:"border-box",margin:0},list:{boxSizing:"border-box",margin:0,padding:0,listStyle:"none"},button:{boxSizing:"border-box",font:"inherit",color:"inherit",background:"none",border:0,padding:0,cursor:"pointer",textAlign:"inherit",WebkitTapHighlightColor:"transparent",touchAction:"manipulation"},block:{boxSizing:"border-box"},media:{display:"block",boxSizing:"border-box"},root:{boxSizing:"border-box",letterSpacing:"normal",wordSpacing:"normal",textTransform:"none",textIndent:0,textAlign:"start",fontStyle:"normal"}}),LONGHANDS=/* @__PURE__ */Object.freeze({margin:["marginTop","marginRight","marginBottom","marginLeft","marginBlock","marginInline","marginBlockStart","marginBlockEnd","marginInlineStart","marginInlineEnd"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft","paddingBlock","paddingInline","paddingBlockStart","paddingBlockEnd","paddingInlineStart","paddingInlineEnd"],inset:["top","right","bottom","left"],gap:["rowGap","columnGap"],font:["fontFamily","fontSize","fontWeight","fontStyle","fontVariant","lineHeight"],background:["backgroundColor","backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundClip","backgroundOrigin"],border:["borderWidth","borderStyle","borderColor","borderTop","borderRight","borderBottom","borderLeft"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],flex:["flexGrow","flexShrink","flexBasis"],overflow:["overflowX","overflowY"],listStyle:["listStyleType","listStylePosition","listStyleImage"],gridTemplate:["gridTemplateColumns","gridTemplateRows","gridTemplateAreas"],gridColumn:["gridColumnStart","gridColumnEnd"],gridRow:["gridRowStart","gridRowEnd"],transition:["transitionProperty","transitionDuration","transitionTimingFunction","transitionDelay"],outline:["outlineWidth","outlineStyle","outlineColor"],textDecoration:["textDecorationLine","textDecorationColor","textDecorationStyle"]});function put(out,k,v){for(let l of LONGHANDS[k]??[])delete out[l];delete out[k],out[k]=v}function fill(value,fonts){return value.replace(/\$(font|mono|hand|sans)\b/g,(_,k)=>fonts[k])}function sx(fonts,base2,...selectors){return sxIn(RAPH_RECORDS_RULES,fonts,base2,...selectors)}function sxIn(rules,fonts,base2,...selectors){let out=base2===null?{}:{...BASE2[base2]};for(let s of selectors){if(!s)continue;let rule=rules[s];if(rule!==void 0)for(let[k,v]of Object.entries(rule))k!=="content"&&put(out,k,fill(v,fonts))}return out}function useSx(){let fonts=useContext(SheetFontsContext),rules=useContext(SheetRulesContext);return(base2,...selectors)=>sxIn(rules,fonts,base2,...selectors)}var SheetWebRulesContext=createContext(WEB_HEALTH_RULES),SHEET_TIER_WIDTHS=/* @__PURE__ */Object.freeze({max1279:952,hero1:630,max559:504,tabletColumn:476,sideBarViewport:768}),PHONE_TIERS=/* @__PURE__ */Object.freeze([".efw-max1279",".efw-hero1",".efw-max559"]);function sheetTiers(width,viewport){let out=[];width<SHEET_TIER_WIDTHS.max1279&&out.push(".efw-max1279"),width<SHEET_TIER_WIDTHS.hero1&&out.push(".efw-hero1");let sideBar=viewport!==void 0&&viewport>=SHEET_TIER_WIDTHS.sideBarViewport;return width<(sideBar?SHEET_TIER_WIDTHS.tabletColumn:SHEET_TIER_WIDTHS.max559)&&out.push(".efw-max559"),out}var SheetTiersContext=createContext(PHONE_TIERS);function wxIn(rules,fonts,tiers,base2,...selectors){let hits=[];for(let s of selectors)if(s){for(let entry of rules[s]??[])hits.push(entry);for(let t of tiers)for(let entry of rules[`${t} ${s}`]??[])hits.push(entry)}hits.sort((a,b)=>a[0]-b[0]);let out=base2===null?{}:{...BASE2[base2]};for(let[,rule]of hits)for(let[k,v]of Object.entries(rule))k!=="content"&&put(out,k,fill(v,fonts));return out}function useWx(){let fonts=useContext(SheetFontsContext),rules=useContext(SheetWebRulesContext),tiers=useContext(SheetTiersContext);return(base2,...selectors)=>wxIn(rules,fonts,tiers,base2,...selectors)}function iconNodes(nodes,prefix){return nodes.map(([tag,attrs,children],i)=>createElement(tag,{key:`${prefix}${i}`,...attrs},...iconNodes(children,`${prefix}${i}.`)))}function SheetIcon({id:id,style:style,iconRef:iconRef}){let icon=RAPH_RECORDS_ICONS[id];return icon===void 0?null:createElement("svg",{viewBox:icon.viewBox,style:style,"aria-hidden":true,focusable:"false",ref:iconRef},...iconNodes(icon.nodes,""))}function forHostSpread(style){let rest={...style};return delete rest.font,{fontFamily:"inherit",fontStyle:"inherit",fontVariant:"inherit",...rest}}var RECORDS_SHEET_ROW_BUTTON_STYLE=/* @__PURE__ */Object.freeze(forHostSpread(sx(RAPH_RECORDS_FONTS,"button",".efh-btn",".efh-btn--ink",".efh-btn--row")));var pluralize=(n,one,many=`${one}s`)=>n===1?one:many,WEB_HEALTH_COPY=/* @__PURE__ */Object.freeze({vitalsLabel:pet=>`Vitals at ${pet}’s last exam`,vitalsFromLabel:pet=>`Where ${pet}’s vitals come from`,vitalsFrom:(vet,date2)=>`From ${vet}’s exam, ${date2}. `,examNotes:"Exam notes",upcomingCare:"Upcoming Care",viewAll:"View all →",nothingDue:pet=>`Nothing due for ${pet} right now.`,overdue:"Overdue",dueSoon:"Due soon",later:"Later",noDate:"No date",overdueBy:days=>`Overdue by ${days} ${pluralize(days,"day")}`,dueTodayRelative:"Due today",dueInRelative:days=>`Due in ${days} ${pluralize(days,"day")}`,noDueDate:"No due date on file",overdueWhen:(relative,date2)=>`${relative} · due ${date2}`,dueToday:date2=>`Due ${date2} · today`,dueIn:(date2,days)=>`Due ${date2} · in ${days} ${pluralize(days,"day")}`,recordsHistory:"Records & History",labs:"Labs & bloodwork",screenings:"Screenings",visits:"Visits & records",timeline:"Timeline",results:n=>pluralize(n,"result"),noScreenings:"No screenings yet",noVisits:"No visits yet",events:n=>` ${pluralize(n,"event")}`,screeningsToReview:n=>`${n} to review`,screeningsClear:"All clear",weight:"Weight",noWeights:pet=>`No weights on file yet. They show up here from ${pet}’s vet visits.`,weightTrend:(n,latest,unit,direction)=>`${n} readings, latest ${latest} ${unit}, trend ${direction}.`,weightRange:(low,high,unit)=>` Estimated range ${low} to ${high} ${unit}.`,rangeOver:["Over","weight"],rangeIn:"Stable",rangeUnder:["Under","weight"],estimatedRange:"Estimated Optimal Adult Range",oneReading:"One reading so far: we’ll plot a trend as more come in.",addRecords:pet=>`Add ${pet}’s records`,moreThanOneClinic:"Records can come from more than one clinic over a lifetime.",onFileNow:"On file now",requestFromClinic:"Request from a clinic",uploadDocument:"Upload a document",seeWhereItStands:"See where it stands",uploadedDocument:"Uploaded document",onTheWayFrom:(pet,clinic)=>`${pet}’s records from ${clinic} are on the way.`,readingUpload:"We’re reading the document you uploaded.",uploadFormatHint:"Upload PDF records you already have, up to 25 MB each. You can pick several at once. We'll read them and add the results to your records.",uploadLimitHint:"PDFs up to 25 MB each. You can pick several at once.",firstRecord:pet=>`Add ${pet}’s first record`,firstLead:pet=>`Records can come from more than one clinic over a lifetime. Start with the one ${pet} sees most, and this page fills in from there.`,findClinic:pet=>`Find ${pet}’s clinic`,chooseFile:"Choose a file",sayBeats:/* @__PURE__ */Object.freeze(["Hmmm","I wonder","what I may be","hiding"]),sayStill:"I wonder what I may be hiding",demo:"Demo",peekLead:pet=>`A sneak peek at how ${pet}’s records will read. Every number links back to the page it came from.`,markerGroups:"Marker groups",previousGroup:"Previous group",nextGroup:"Next group",sampleMarkers:"Sample markers by group",slideLabel:(title,n,of)=>`${title}, ${n} of ${of}`,sampleNotTheirs:pet=>`This is a sample, not ${pet}’s result.`,sampleNoteRest:pet=>` Add ${pet}’s records to see ${pet}’s own numbers. Anything outside the range gets flagged like this, with what it measures and what to ask ${pet}’s vet.`,readFrom:page=>`Read from the lab report, page ${page}`,pageOf:(page,of)=>`p. ${page} of ${of}`,tableHead:/* @__PURE__ */Object.freeze(["Test","Result","Unit","Range"]),high:"High"});var DAY_MS2=864e5,DUE_SOON_WINDOW_DAYS=30,LB_PER_KG2=2.2046226,MONTHS2=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],MONTHS_LONG=["January","February","March","April","May","June","July","August","September","October","November","December"];function careDueDate(ms){let d=new Date(ms);return`${MONTHS2[d.getUTCMonth()]??""} ${d.getUTCDate()}`}function recordsDate(ms){let d=new Date(ms);return`${MONTHS2[d.getUTCMonth()]??""} ${d.getUTCDate()}, ${d.getUTCFullYear()}`}function examDate(ms){let d=new Date(ms);return`${MONTHS_LONG[d.getUTCMonth()]??""} ${d.getUTCDate()}`}function careIcon(key){let k=key.toLowerCase();return["vacc","booster","rabies","dhpp"].some(part=>k.includes(part))?"efi-syringe":["test","screen","fecal","heartworm","worm","dental","tooth"].some(part=>k.includes(part))?"efi-flask-sm":"efi-calendar"}function webCareRows(items,nowMs){let byKey=/* @__PURE__ */new Map;for(let item of items){let key=item.title,incumbent=byKey.get(key),cMs=dayMs(item.dueAt),iMs=incumbent===void 0?null:dayMs(incumbent.dueAt);(incumbent===void 0||cMs!==null&&(iMs===null||cMs<iMs))&&byKey.set(key,item)}let rows=[...byKey.values()].map(item=>{let ms=dayMs(item.dueAt),icon=careIcon(item.title);if(ms===null)return{key:item.title,item:item,title:item.title,when:WEB_HEALTH_COPY.noDueDate,tone:"upcoming",pill:{className:".efw-pill--later",text:WEB_HEALTH_COPY.noDate},icon:icon,ms:ms};let diffDays=Math.round((ms-nowMs)/DAY_MS2),tone=diffDays<0?"overdue":diffDays<=DUE_SOON_WINDOW_DAYS?"dueSoon":"upcoming",relative=diffDays<0?WEB_HEALTH_COPY.overdueBy(-diffDays):diffDays===0?WEB_HEALTH_COPY.dueTodayRelative:WEB_HEALTH_COPY.dueInRelative(diffDays),date2=careDueDate(ms),when=tone==="overdue"?WEB_HEALTH_COPY.overdueWhen(relative,date2):diffDays<=0?WEB_HEALTH_COPY.dueToday(date2):WEB_HEALTH_COPY.dueIn(date2,diffDays),pill=tone==="overdue"?{className:".efw-pill--overdue",text:WEB_HEALTH_COPY.overdue}:tone==="dueSoon"?{className:".efw-pill--soon",text:WEB_HEALTH_COPY.dueSoon}:{className:".efw-pill--later",text:WEB_HEALTH_COPY.later};return{key:item.title,item:item,title:item.title,when:when,tone:tone,pill:pill,icon:icon,ms:ms}});return rows.sort((a,b)=>a.ms===null&&b.ms===null?0:a.ms===null?1:b.ms===null?-1:a.ms-b.ms),rows.map(row=>({key:row.key,item:row.item,title:row.title,when:row.when,tone:row.tone,pill:row.pill,icon:row.icon}))}function latestVisitLabel(timeline){if(timeline===null||timeline.withheld)return null;let best=null;for(let visit of timeline.visits){if(!visit.visitDate)continue;let ms=Date.parse(visit.visitDate);Number.isNaN(ms)||(best===null||ms>best)&&(best=ms)}if(best===null)return null;let d=new Date(best);return`${String(d.getUTCMonth()+1).padStart(2,"0")}.${String(d.getUTCDate()).padStart(2,"0")}.${d.getUTCFullYear()}`}function timelineCount(timeline){if(timeline===null||timeline.withheld)return null;let count=timeline.visits.length+timeline.vaccines.length+timeline.weights.length+timeline.medications.length;return count>0?count:null}var STABLE_BAND_FRACTION=.1,MIN_READINGS_FOR_BAND=2;function deriveWeightBand(values){let finite=values.filter(v=>v!==null&&Number.isFinite(v)).sort((a,b)=>a-b);if(finite.length<MIN_READINGS_FOR_BAND)return null;let mid=Math.floor(finite.length/2),center=finite.length%2===1?finite[mid]:(finite[mid-1]+finite[mid])/2;if(!(center>0))return null;let half=center*STABLE_BAND_FRACTION;return{low:center-half,high:center+half}}function weightPointStatus(value,band){return value>band.high?"over":value<band.low?"under":"in"}var round1=value=>Math.round(value*10)/10;function weightValue(value){if(!Number.isFinite(value))return"";let rounded=round1(value);return Number.isInteger(rounded)?String(rounded):rounded.toFixed(1)}function webWeightPlot(points,band=null){let n=points.length;if(n<2)return[];let values=points.map(p=>p.value),low=band!==null?band.low:Math.min(...values),high=band!==null?band.high:Math.max(...values),span=high-low||Math.max(Math.abs(high)*.1,1),axisAt=/* @__PURE__ */new Set;if(n<=6)for(let i=0;i<n;i+=1)axisAt.add(i);else for(let i=0;i<6;i+=1)axisAt.add(Math.round(i*(n-1)/5));return points.map((p,i)=>{let y=round1(Math.min(94,Math.max(6,75-(p.value-low)/span*50))),outside=band!==null&&weightPointStatus(p.value,band)!=="in";return{x:round1(8+i/(n-1)*84),y:y,label:weightValue(p.value),axis:axisAt.has(i)?monthTick(p.ms):null,below:y>=60,outside:outside}})}function webWeight(timeline,unit){if(timeline===null||timeline.withheld)return null;let readings=timeline.weights.flatMap(w=>{let ms=dayMs(w.observedOn);return ms===null||w.weightKg===null||!Number.isFinite(w.weightKg)?[]:[{ms:ms,kg:w.weightKg,iso:w.observedOn??""}]}).sort((a,b)=>a.ms-b.ms),last=readings[readings.length-1];if(last===void 0)return null;let inUnit=kg=>unit==="lb"?kg*LB_PER_KG2:kg,other=unit==="lb"?"kg":"lb",values=readings.map(r=>inUnit(r.kg)),latest=values[values.length-1]??0,first=values[0]??latest,bandKg=deriveWeightBand(readings.map(r=>r.kg)),band=bandKg!==null?{low:inUnit(bandKg.low),high:inUnit(bandKg.high)}:null,plot=webWeightPlot(readings.map((r,i)=>({value:values[i]??0,ms:r.ms})),band),range=plot.length>0&&band!==null?WEB_HEALTH_COPY.weightRange(weightValue(band.low),weightValue(band.high),unit):"";return{primary:`${weightValue(latest)} ${unit}`,secondary:`${weightValue(unit==="lb"?last.kg:last.kg*LB_PER_KG2)} ${other}`,count:readings.length,date:readings.length===1?{iso:last.iso,text:recordsDate(last.ms)}:null,plot:plot,band:plot.length>0?band:null,label:plot.length>0?WEB_HEALTH_COPY.weightTrend(values.length,weightValue(latest),unit,latest>first?"rising":latest<first?"falling":"steady")+range:null}}function vitalsExam(depth,observedMs){if(observedMs===null||depth===null||depth.withheld)return null;let day=new Date(observedMs).toISOString().slice(0,10),encounter=depth.encounters.find(e=>{let ms2=dayMs(e.date);return ms2!==null&&new Date(ms2).toISOString().slice(0,10)===day}),vet=encounter?.veterinarian?.trim(),ms=dayMs(encounter?.date);return vet&&ms!==null?{vet:vet,date:examDate(ms)}:null}function documentClassLabel(value){let spaced=value.replace(/_/g," ").trim();return spaced.length>0?spaced.charAt(0).toUpperCase()+spaced.slice(1):value}function webSources(record,depth){if(record===null||record.withheld)return[];let clinics=/* @__PURE__ */new Map;if(depth!==null&&!depth.withheld)for(let e of depth.encounters){let name=e.clinicName?.trim();e.docId!==null&&name&&clinics.set(e.docId,name)}return Object.values(record.documents).sort((a,b)=>(dayMs(b.receivedAt)??0)-(dayMs(a.receivedAt)??0)).slice(0,4).reverse().map(doc=>{let received=dayMs(doc.receivedAt);return{key:doc.docId,name:clinics.get(doc.docId)??WEB_HEALTH_COPY.uploadedDocument,meta:[doc.documentClass?documentClassLabel(doc.documentClass):null,received!==null?recordsDate(received):null].filter(p=>p!==null).join(" · ")}})}function webOnTheWay(petName,requests){return sheetOnTheWay(sheetPetWords(petName,null),requests).map(line=>line.key==="upload"?{...line,text:WEB_HEALTH_COPY.readingUpload}:line.key.startsWith("clinic-")?{...line,text:WEB_HEALTH_COPY.onTheWayFrom(petName,line.key.slice(7))}:line)}var SAMPLE_GROUPS=[{title:"Liver",lead:"What the liver makes and clears.",markers:[{line:"alt",name:"ALT",what:"An enzyme found mostly in liver cells.",at:92,value:"118",unit:"U/L",high:true},{line:"alp",name:"ALP",what:"An enzyme from the liver and bones.",at:33,value:"64",unit:"U/L"},{line:"ggt",name:"GGT",what:"An enzyme tied to the liver’s bile ducts.",at:36,value:"3",unit:"U/L"},{line:"tbil",name:"Total bilirubin",what:"A yellow pigment the liver clears.",at:33,value:"0.2",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{test:"ALB",result:"3.2",unit:"g/dL",range:"2.3-4.0"},{line:"alp",test:"ALP",result:"64",unit:"U/L",range:"23-212"},{line:"alt",test:"ALT",result:"118 H",unit:"U/L",range:"10-100"},{test:"BUN",result:"18",unit:"mg/dL",range:"7-27"},{line:"ggt",test:"GGT",result:"3",unit:"U/L",range:"0-11"},{line:"tbil",test:"T. BILI",result:"0.2",unit:"mg/dL",range:"0.0-0.9"}]},{title:"Kidney",lead:"What the kidneys filter out and keep in balance.",markers:[{line:"bun",name:"BUN",what:"Protein waste the kidneys filter out.",at:53,value:"18",unit:"mg/dL"},{line:"crea",name:"Creatinine",what:"Muscle waste the kidneys filter out.",at:48,value:"1.1",unit:"mg/dL"},{line:"sdma",name:"SDMA",what:"Another measure of kidney filtering.",at:59,value:"9",unit:"µg/dL"},{line:"phos",name:"Phosphorus",what:"A mineral the kidneys keep in balance.",at:42,value:"4.1",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{test:"ALT",result:"45",unit:"U/L",range:"10-100"},{line:"bun",test:"BUN",result:"18",unit:"mg/dL",range:"7-27"},{test:"CA",result:"10.1",unit:"mg/dL",range:"7.9-12.0"},{line:"crea",test:"CREA",result:"1.1",unit:"mg/dL",range:"0.5-1.8"},{line:"phos",test:"PHOS",result:"4.1",unit:"mg/dL",range:"2.5-6.8"},{line:"sdma",test:"SDMA",result:"9",unit:"µg/dL",range:"0-14"}]},{title:"Blood cells",lead:"The cells that carry oxygen, fight infection and help blood clot.",markers:[{line:"rbc",name:"Red blood cells",what:"Cells that carry oxygen around the body.",at:43,value:"6.9",unit:"M/µL"},{line:"hgb",name:"Hemoglobin",what:"The part of red cells that holds oxygen.",at:42,value:"15.8",unit:"g/dL"},{line:"wbc",name:"White blood cells",what:"Cells that fight infection.",at:44,value:"9.8",unit:"K/µL"},{line:"plt",name:"Platelets",what:"Cell fragments that help blood clot.",at:41,value:"265",unit:"K/µL"}],page:3,panel:"Complete blood count",rows:[{test:"HCT",result:"46",unit:"%",range:"37.3-61.7"},{line:"hgb",test:"HGB",result:"15.8",unit:"g/dL",range:"13.1-20.5"},{test:"NEUT",result:"6.1",unit:"K/µL",range:"2.95-11.64"},{line:"plt",test:"PLT",result:"265",unit:"K/µL",range:"148-484"},{line:"rbc",test:"RBC",result:"6.9",unit:"M/µL",range:"5.65-8.87"},{line:"wbc",test:"WBC",result:"9.8",unit:"K/µL",range:"5.05-16.76"}]},{title:"Sugar and salts",lead:"Fuel, and the salts that keep fluids, nerves and muscles steady.",markers:[{line:"glu",name:"Glucose",what:"Blood sugar, the body’s main fuel.",at:41,value:"96",unit:"mg/dL"},{line:"na",name:"Sodium",what:"A salt that keeps fluids in balance.",at:31,value:"147",unit:"mmol/L"},{line:"k",name:"Potassium",what:"A salt that helps nerves and muscles work.",at:49,value:"4.6",unit:"mmol/L"},{line:"ca",name:"Calcium",what:"A mineral for bones, muscles and nerves.",at:52,value:"10.1",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{line:"ca",test:"CA",result:"10.1",unit:"mg/dL",range:"7.9-12.0"},{test:"CL",result:"112",unit:"mmol/L",range:"109-122"},{line:"glu",test:"GLU",result:"96",unit:"mg/dL",range:"70-143"},{line:"k",test:"K",result:"4.6",unit:"mmol/L",range:"3.5-5.8"},{line:"na",test:"NA",result:"147",unit:"mmol/L",range:"144-160"},{test:"PHOS",result:"4.1",unit:"mg/dL",range:"2.5-6.8"}]}],SAMPLE_REPORT_PAGES=12,SAMPLE_MORE=[{tone:"pink",icon:"efi-shield",title:"Screenings",lead:()=>"Tests that look for common problems early, and what came back.",rows:[{label:"Heartworm test",pill:{tone:"clear",text:"Negative"}},{label:"Tick panel (4Dx)",pill:{tone:"clear",text:"Negative"}},{label:"Fecal exam",pill:{tone:"clear",text:"Negative"}}]},{tone:"blue",icon:"efi-folder",title:"Visits & records",lead:()=>"Every visit, with the vet’s notes and the pages they came from.",rows:[{label:"Wellness exam",when:"38 pages"},{label:"Skin and allergy visit",when:"6 pages"},{label:"Everfur video visit",when:"3 pages"}]},{tone:"yellow",icon:"efi-clock",title:"Timeline",lead:petName=>`${petName}’s whole history in order, with what’s due next.`,rows:[{label:"Rabies vaccine",pill:{tone:"soon",text:"Due soon"}},{label:"Wellness exam",when:"Jun 12"},{label:"Heartworm test",when:"Apr 18"}]}];var readDepth=(client,petRef)=>client.getRecordDepth(petRef),depthEmpty=value=>!value.available,readTimeline=(client,petRef)=>client.getTimeline(petRef),timelineEmpty=value=>value.isEmpty;function useSheetFonts(fonts){return useMemo(()=>({...RAPH_RECORDS_FONTS,...fonts??{}}),[fonts])}function useSheetRules(palette){let theme=useEverfurTheme();return useMemo(()=>recordsSheetRules(theme,palette),[theme,palette])}function useSheetWebRules(palette){let theme=useEverfurTheme();return useMemo(()=>recordsSheetWebRules(theme,palette),[theme,palette])}function RecordsSheet(props){let fonts=useSheetFonts(props.options.fonts),rules=useSheetRules(props.options.palette),webRules=useSheetWebRules(props.options.palette);/* @__PURE__ */
129
- return jsx(SheetFontsContext.Provider,{value:fonts,children:/* @__PURE__ */jsx(SheetRulesContext.Provider,{value:rules,children:/* @__PURE__ */jsx(SheetWebRulesContext.Provider,{value:webRules,children:/* @__PURE__ */jsx(RecordsSheetBody,{...props})})})})}function useSheetPetFacts(petRef,hostName,options){let{pets:pets}=useEverfurPets(),pet=pets.find(p=>p.petRef===petRef)??null,planCapability=useCapability("healthPlan"),plan=useHealthPlanPage({petRef:petRef,enabled:planCapability.enabled}),planPet=plan.page?.pet??null,planSettled=!planCapability.enabled||plan.phase==="ready"||plan.phase==="failed",planSex=pronounForSex(planPet?.sex),askProfile=options.pronoun===void 0&&planSettled&&planSex===null,{profile:profile}=useEverfurPetProfile(askProfile?petRef:null),name=hostName.trim()||pet?.name?.trim()||planPet?.name?.trim()||"",focus=plan.page?.page?.focus??null;return{name:name,pronoun:options.pronoun??planSex??pronounForSex(profile?.sex),species:sheetSampleKind(pet?.species??planPet?.species??profile?.species),breed:pet?.breed??null,weightKg:pet?.weightKg??null,ageYears:pet?.ageYears??null,focus:focus!==null&&focus.title.trim()!==""?focus:null}}var useIsomorphicLayoutEffect=typeof document>"u"?useEffect:useLayoutEffect;function useSheetTiers(root){let[tiers,setTiers]=useState(PHONE_TIERS);return useIsomorphicLayoutEffect(()=>{let node=root.current;if(node===null||typeof ResizeObserver>"u")return;let read=()=>{let cs=getComputedStyle(node),width=node.clientWidth-(parseFloat(cs.paddingLeft)||0)-(parseFloat(cs.paddingRight)||0),next=sheetTiers(width,typeof window>"u"?void 0:window.innerWidth);setTiers(was=>was.length===next.length&&was.every((t,i)=>t===next[i])?was:next)};read();let observer=new ResizeObserver(read);return observer.observe(node),()=>observer.disconnect()},[root]),tiers}var SheetStageContext=createContext({host:void 0,art:{status:"none"},onError:()=>{},reduced:true}),kitVar=(name,value)=>({[`--efw-${name}`]:value});function RecordsSheetBody({petRef:petRef,petName:petName,options:options,records:records,readable:readable,consentControl:consentControl,canRequestFromClinic:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,onOpenRecord:onOpenRecord,onOpenMarker:onOpenMarker,onOpenScreenings:onOpenScreenings,renderUpcomingCareAction:renderUpcomingCareAction,weightUnit:pageUnit,onOpenPlan:pageOpenPlan,noVet:noVet,onOpenRequest:onOpenRequest,nowMs:nowMs}){let facts=useSheetPetFacts(petRef,petName,options),words2=sheetPetWords(facts.name,facts.pronoun),weightUnit=options.weightUnit??pageUnit??"lb",onOpenPlan=options.onOpenPlan??pageOpenPlan,topRiskOn=useEverfurPresentation(options.topRiskLine===void 0?void 0:{recordsTopRiskLine:options.topRiskLine}).recordsTopRiskLine,markers=useRecordsMarkers(petRef),depth=useRecordsDepthRead(petRef,readDepth,depthEmpty),timeline=useRecordsDepthRead(petRef,readTimeline,timelineEmpty),at=useCoarseNow(nowMs),model=useMemo(()=>buildRecordsSheetModel({words:words2,record:records.record,depth:depth.value,markers:markers.markers,timeline:timeline.value,requests:records.requests,breed:facts.breed,petWeightKg:facts.weightKg,petAgeYears:facts.ageYears,nowMs:at,weightUnit:weightUnit}),[facts.name,facts.pronoun,facts.breed,facts.weightKg,facts.ageYears,records.record,records.requests,depth.value,markers.markers,timeline.value,at,weightUnit]),weight=useMemo(()=>webWeight(timeline.value,weightUnit),[timeline.value,weightUnit]),inFlight=useMemo(()=>webOnTheWay(facts.name,records.requests),[facts.name,records.requests]),photos=acceptsPhotos(records.uploadContentTypes),historyRef=useRef(null),heroRef=useRef(null),rootRef=useRef(null),tiers=useSheetTiers(rootRef),reduced=useEverfurTheme().motion.reducedMotion,pageVisible=usePageVisible(),petArt=useRecordsPetArt(options.stage===void 0?petRef:null,{reducedMotion:reduced,isFocused:pageVisible}),stageArt=useMemo(()=>({host:options.stage,art:petArt.art,onError:petArt.onError,reduced:reduced}),[options.stage,petArt.art,petArt.onError,reduced]),name=words2.name,top=topRiskOn&&facts.focus!==null?/* @__PURE__ */jsx(TopRisk,{words:words2,focus:facts.focus,onOpenPlan:onOpenPlan}):null,openHistory=model.history.length>0||model.failedRequest!==null?()=>historyRef.current?.scrollIntoView({block:"start"}):onOpenRecord,body;return readable?model.state!=="full"?body=/* @__PURE__ */jsxs(Page,{kind:"empty",children:[top,
128
+ /* @__PURE__ */jsx("span",{ref:under,"aria-hidden":"true",style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"none",opacity:artVisible?0:1,transition:artVisible?fade:"none"},children:holding?/* @__PURE__ */jsx(PetDrawingSkeleton,{sweep:!reduced&&!artVisible}):/* @__PURE__ */jsx(PetMonogram,{name:name,...monogram})}),art.status==="art"?/* @__PURE__ */jsx("img",{ref:painted,src:art.url,width:720,height:1119,alt:"","aria-hidden":"true",draggable:false,decoding:"async",onLoad:()=>setLoadedKey(art.key),onError:onError,style:{position:"absolute",inset:0,display:"block",width:"100%",height:"100%",maxWidth:"none",objectFit:"contain",opacity:artVisible?1:0,transition:fade},"data-testid":"everfur-records-sheet-pet-art"},art.key):null]})}function usePageVisible(){let[visible,setVisible]=useState(()=>typeof document>"u"||document.visibilityState!=="hidden");return useEffect(()=>{if(typeof document>"u")return;let read=()=>setVisible(document.visibilityState!=="hidden");return read(),document.addEventListener("visibilitychange",read),()=>document.removeEventListener("visibilitychange",read)},[]),visible}var SheetFontsContext=createContext(RAPH_RECORDS_FONTS);var SheetRulesContext=createContext(RAPH_RECORDS_RULES),BASE2=/* @__PURE__ */Object.freeze({h:{boxSizing:"border-box",margin:0,color:"inherit",fontWeight:700,lineHeight:1.15,fontSize:"inherit"},p:{boxSizing:"border-box",margin:0},list:{boxSizing:"border-box",margin:0,padding:0,listStyle:"none"},button:{boxSizing:"border-box",font:"inherit",color:"inherit",background:"none",border:0,padding:0,cursor:"pointer",textAlign:"inherit",WebkitTapHighlightColor:"transparent",touchAction:"manipulation"},block:{boxSizing:"border-box"},media:{display:"block",boxSizing:"border-box"},root:{boxSizing:"border-box",letterSpacing:"normal",wordSpacing:"normal",textTransform:"none",textIndent:0,textAlign:"start",fontStyle:"normal"}}),LONGHANDS=/* @__PURE__ */Object.freeze({margin:["marginTop","marginRight","marginBottom","marginLeft","marginBlock","marginInline","marginBlockStart","marginBlockEnd","marginInlineStart","marginInlineEnd"],padding:["paddingTop","paddingRight","paddingBottom","paddingLeft","paddingBlock","paddingInline","paddingBlockStart","paddingBlockEnd","paddingInlineStart","paddingInlineEnd"],inset:["top","right","bottom","left"],gap:["rowGap","columnGap"],font:["fontFamily","fontSize","fontWeight","fontStyle","fontVariant","lineHeight"],background:["backgroundColor","backgroundImage","backgroundPosition","backgroundSize","backgroundRepeat","backgroundClip","backgroundOrigin"],border:["borderWidth","borderStyle","borderColor","borderTop","borderRight","borderBottom","borderLeft"],borderRadius:["borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius"],flex:["flexGrow","flexShrink","flexBasis"],overflow:["overflowX","overflowY"],listStyle:["listStyleType","listStylePosition","listStyleImage"],gridTemplate:["gridTemplateColumns","gridTemplateRows","gridTemplateAreas"],gridColumn:["gridColumnStart","gridColumnEnd"],gridRow:["gridRowStart","gridRowEnd"],transition:["transitionProperty","transitionDuration","transitionTimingFunction","transitionDelay"],outline:["outlineWidth","outlineStyle","outlineColor"],textDecoration:["textDecorationLine","textDecorationColor","textDecorationStyle"]});function put(out,k,v){for(let l of LONGHANDS[k]??[])delete out[l];delete out[k],out[k]=v}function fill(value,fonts){return value.replace(/\$(font|mono|hand|sans)\b/g,(_,k)=>fonts[k])}function sx(fonts,base2,...selectors){return sxIn(RAPH_RECORDS_RULES,fonts,base2,...selectors)}function sxIn(rules,fonts,base2,...selectors){let out=base2===null?{}:{...BASE2[base2]};for(let s of selectors){if(!s)continue;let rule=rules[s];if(rule!==void 0)for(let[k,v]of Object.entries(rule))k!=="content"&&put(out,k,fill(v,fonts))}return out}function useSx(){let fonts=useContext(SheetFontsContext),rules=useContext(SheetRulesContext);return(base2,...selectors)=>sxIn(rules,fonts,base2,...selectors)}var SheetWebRulesContext=createContext(WEB_HEALTH_RULES),SHEET_TIER_WIDTHS=/* @__PURE__ */Object.freeze({max1279:952,hero1:630,max559:504,tabletColumn:476,sideBarViewport:768}),PHONE_TIERS=/* @__PURE__ */Object.freeze([".efw-max1279",".efw-hero1",".efw-max559"]);function sheetTiers(width,viewport){let out=[];width<SHEET_TIER_WIDTHS.max1279&&out.push(".efw-max1279"),width<SHEET_TIER_WIDTHS.hero1&&out.push(".efw-hero1");let sideBar=viewport!==void 0&&viewport>=SHEET_TIER_WIDTHS.sideBarViewport;return width<(sideBar?SHEET_TIER_WIDTHS.tabletColumn:SHEET_TIER_WIDTHS.max559)&&out.push(".efw-max559"),out}var SheetTiersContext=createContext(PHONE_TIERS);function wxIn(rules,fonts,tiers,base2,...selectors){let hits=[];for(let s of selectors)if(s){for(let entry of rules[s]??[])hits.push(entry);for(let t of tiers)for(let entry of rules[`${t} ${s}`]??[])hits.push(entry)}hits.sort((a,b)=>a[0]-b[0]);let out=base2===null?{}:{...BASE2[base2]};for(let[,rule]of hits)for(let[k,v]of Object.entries(rule))k!=="content"&&put(out,k,fill(v,fonts));return out}function useWx(){let fonts=useContext(SheetFontsContext),rules=useContext(SheetWebRulesContext),tiers=useContext(SheetTiersContext);return(base2,...selectors)=>wxIn(rules,fonts,tiers,base2,...selectors)}function iconNodes(nodes,prefix){return nodes.map(([tag,attrs,children],i)=>createElement(tag,{key:`${prefix}${i}`,...attrs},...iconNodes(children,`${prefix}${i}.`)))}function SheetIcon({id:id,style:style,iconRef:iconRef}){let icon=RAPH_RECORDS_ICONS[id];return icon===void 0?null:createElement("svg",{viewBox:icon.viewBox,style:style,"aria-hidden":true,focusable:"false",ref:iconRef},...iconNodes(icon.nodes,""))}function forHostSpread(style){let rest={...style};return delete rest.font,{fontFamily:"inherit",fontStyle:"inherit",fontVariant:"inherit",...rest}}var RECORDS_SHEET_ROW_BUTTON_STYLE=/* @__PURE__ */Object.freeze(forHostSpread(sx(RAPH_RECORDS_FONTS,"button",".efh-btn",".efh-btn--ink",".efh-btn--row")));var pluralize=(n,one,many=`${one}s`)=>n===1?one:many,WEB_HEALTH_COPY=/* @__PURE__ */Object.freeze({vitalsLabel:pet=>`Vitals at ${pet}’s last exam`,vitalsFromLabel:HEALTH_TAB_SHARED_COPY.vitalsFromLabel,vitalsFrom:HEALTH_TAB_SHARED_COPY.vitalsFrom,examNotes:HEALTH_TAB_SHARED_COPY.examNotes,upcomingCare:"Upcoming Care",viewAll:"View all →",nothingDue:pet=>`Nothing due for ${pet} right now.`,overdue:"Overdue",dueSoon:"Due soon",later:"Later",noDate:"No date",overdueBy:days=>`Overdue by ${days} ${pluralize(days,"day")}`,dueTodayRelative:"Due today",dueInRelative:days=>`Due in ${days} ${pluralize(days,"day")}`,noDueDate:"No due date on file",overdueWhen:(relative,date2)=>`${relative} · due ${date2}`,dueToday:date2=>`Due ${date2} · today`,dueIn:(date2,days)=>`Due ${date2} · in ${days} ${pluralize(days,"day")}`,recordsHistory:"Records & History",labs:"Labs & bloodwork",screenings:"Screenings",visits:"Visits & records",timeline:"Timeline",results:HEALTH_TAB_SHARED_COPY.results,noScreenings:HEALTH_TAB_SHARED_COPY.noScreenings,noVisits:HEALTH_TAB_SHARED_COPY.noVisits,events:n=>` ${pluralize(n,"event")}`,screeningsToReview:HEALTH_TAB_SHARED_COPY.screeningsToReview,screeningsClear:HEALTH_TAB_SHARED_COPY.screeningsClear,weight:"Weight",noWeights:pet=>`No weights on file yet. They show up here from ${pet}’s vet visits.`,weightTrend:(n,latest,unit,direction)=>`${n} readings, latest ${latest} ${unit}, trend ${direction}.`,weightRange:(low,high,unit)=>` Estimated range ${low} to ${high} ${unit}.`,rangeOver:["Over","weight"],rangeIn:"Stable",rangeUnder:["Under","weight"],estimatedRange:"Estimated Optimal Adult Range",oneReading:HEALTH_TAB_SHARED_COPY.oneReading,addRecords:pet=>`Add ${pet}’s records`,moreThanOneClinic:"Records can come from more than one clinic over a lifetime.",onFileNow:"On file now",requestFromClinic:"Request from a clinic",uploadDocument:"Upload a document",seeWhereItStands:"See where it stands",uploadedDocument:HEALTH_TAB_SHARED_COPY.uploadedDocument,onTheWayFrom:HEALTH_TAB_SHARED_COPY.onTheWayFrom,readingUpload:HEALTH_TAB_SHARED_COPY.readingUpload,uploadFormatHint:HEALTH_TAB_SHARED_COPY.uploadFormatHint,uploadLimitHint:HEALTH_TAB_SHARED_COPY.uploadLimitHint,firstRecord:pet=>`Add ${pet}’s first record`,firstLead:pet=>`Records can come from more than one clinic over a lifetime. Start with the one ${pet} sees most, and this page fills in from there.`,findClinic:pet=>`Find ${pet}’s clinic`,chooseFile:"Choose a file",sayBeats:/* @__PURE__ */Object.freeze(["Hmmm","I wonder","what I may be","hiding"]),sayStill:"I wonder what I may be hiding",demo:"Demo",peekLead:pet=>`A sneak peek at how ${pet}’s records will read. Every number links back to the page it came from.`,markerGroups:"Marker groups",previousGroup:"Previous group",nextGroup:"Next group",sampleMarkers:"Sample markers by group",slideLabel:(title,n,of)=>`${title}, ${n} of ${of}`,sampleNotTheirs:pet=>`This is a sample, not ${pet}’s result.`,sampleNoteRest:pet=>` Add ${pet}’s records to see ${pet}’s own numbers. Anything outside the range gets flagged like this, with what it measures and what to ask ${pet}’s vet.`,readFrom:page=>`Read from the lab report, page ${page}`,pageOf:(page,of)=>`p. ${page} of ${of}`,tableHead:/* @__PURE__ */Object.freeze(["Test","Result","Unit","Range"]),high:"High"});var DAY_MS2=864e5,DUE_SOON_WINDOW_DAYS=30,LB_PER_KG2=2.2046226,MONTHS2=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function careDueDate(ms){let d=new Date(ms);return`${MONTHS2[d.getUTCMonth()]??""} ${d.getUTCDate()}`}var recordsDate=healthTabDate;function careIcon(key){let k=key.toLowerCase();return["vacc","booster","rabies","dhpp"].some(part=>k.includes(part))?"efi-syringe":["test","screen","fecal","heartworm","worm","dental","tooth"].some(part=>k.includes(part))?"efi-flask-sm":"efi-calendar"}function webCareRows(items,nowMs){let byKey=/* @__PURE__ */new Map;for(let item of items){let key=item.title,incumbent=byKey.get(key),cMs=dayMs(item.dueAt),iMs=incumbent===void 0?null:dayMs(incumbent.dueAt);(incumbent===void 0||cMs!==null&&(iMs===null||cMs<iMs))&&byKey.set(key,item)}let rows=[...byKey.values()].map(item=>{let ms=dayMs(item.dueAt),icon=careIcon(item.title);if(ms===null)return{key:item.title,item:item,title:item.title,when:WEB_HEALTH_COPY.noDueDate,tone:"upcoming",pill:{className:".efw-pill--later",text:WEB_HEALTH_COPY.noDate},icon:icon,ms:ms};let diffDays=Math.round((ms-nowMs)/DAY_MS2),tone=diffDays<0?"overdue":diffDays<=DUE_SOON_WINDOW_DAYS?"dueSoon":"upcoming",relative=diffDays<0?WEB_HEALTH_COPY.overdueBy(-diffDays):diffDays===0?WEB_HEALTH_COPY.dueTodayRelative:WEB_HEALTH_COPY.dueInRelative(diffDays),date2=careDueDate(ms),when=tone==="overdue"?WEB_HEALTH_COPY.overdueWhen(relative,date2):diffDays<=0?WEB_HEALTH_COPY.dueToday(date2):WEB_HEALTH_COPY.dueIn(date2,diffDays),pill=tone==="overdue"?{className:".efw-pill--overdue",text:WEB_HEALTH_COPY.overdue}:tone==="dueSoon"?{className:".efw-pill--soon",text:WEB_HEALTH_COPY.dueSoon}:{className:".efw-pill--later",text:WEB_HEALTH_COPY.later};return{key:item.title,item:item,title:item.title,when:when,tone:tone,pill:pill,icon:icon,ms:ms}});return rows.sort((a,b)=>a.ms===null&&b.ms===null?0:a.ms===null?1:b.ms===null?-1:a.ms-b.ms),rows.map(row=>({key:row.key,item:row.item,title:row.title,when:row.when,tone:row.tone,pill:row.pill,icon:row.icon}))}function latestVisitLabel(timeline){if(timeline===null||timeline.withheld)return null;let best=null;for(let visit of timeline.visits){if(!visit.visitDate)continue;let ms=Date.parse(visit.visitDate);Number.isNaN(ms)||(best===null||ms>best)&&(best=ms)}if(best===null)return null;let d=new Date(best);return`${String(d.getUTCMonth()+1).padStart(2,"0")}.${String(d.getUTCDate()).padStart(2,"0")}.${d.getUTCFullYear()}`}function timelineCount(timeline){if(timeline===null||timeline.withheld)return null;let count=timeline.visits.length+timeline.vaccines.length+timeline.weights.length+timeline.medications.length;return count>0?count:null}var STABLE_BAND_FRACTION=.1,MIN_READINGS_FOR_BAND=2;function deriveWeightBand(values){let finite=values.filter(v=>v!==null&&Number.isFinite(v)).sort((a,b)=>a-b);if(finite.length<MIN_READINGS_FOR_BAND)return null;let mid=Math.floor(finite.length/2),center=finite.length%2===1?finite[mid]:(finite[mid-1]+finite[mid])/2;if(!(center>0))return null;let half=center*STABLE_BAND_FRACTION;return{low:center-half,high:center+half}}function weightPointStatus(value,band){return value>band.high?"over":value<band.low?"under":"in"}var round1=value=>Math.round(value*10)/10;function weightValue(value){if(!Number.isFinite(value))return"";let rounded=round1(value);return Number.isInteger(rounded)?String(rounded):rounded.toFixed(1)}function webWeightPlot(points,band=null){let n=points.length;if(n<2)return[];let values=points.map(p=>p.value),low=band!==null?band.low:Math.min(...values),high=band!==null?band.high:Math.max(...values),span=high-low||Math.max(Math.abs(high)*.1,1),axisAt=/* @__PURE__ */new Set;if(n<=6)for(let i=0;i<n;i+=1)axisAt.add(i);else for(let i=0;i<6;i+=1)axisAt.add(Math.round(i*(n-1)/5));return points.map((p,i)=>{let y=round1(Math.min(94,Math.max(6,75-(p.value-low)/span*50))),outside=band!==null&&weightPointStatus(p.value,band)!=="in";return{x:round1(8+i/(n-1)*84),y:y,label:weightValue(p.value),axis:axisAt.has(i)?monthTick(p.ms):null,below:y>=60,outside:outside}})}function webWeight(timeline,unit){if(timeline===null||timeline.withheld)return null;let readings=timeline.weights.flatMap(w=>{let ms=dayMs(w.observedOn);return ms===null||w.weightKg===null||!Number.isFinite(w.weightKg)?[]:[{ms:ms,kg:w.weightKg,iso:w.observedOn??""}]}).sort((a,b)=>a.ms-b.ms),last=readings[readings.length-1];if(last===void 0)return null;let inUnit=kg=>unit==="lb"?kg*LB_PER_KG2:kg,other=unit==="lb"?"kg":"lb",values=readings.map(r=>inUnit(r.kg)),latest=values[values.length-1]??0,first=values[0]??latest,bandKg=deriveWeightBand(readings.map(r=>r.kg)),band=bandKg!==null?{low:inUnit(bandKg.low),high:inUnit(bandKg.high)}:null,plot=webWeightPlot(readings.map((r,i)=>({value:values[i]??0,ms:r.ms})),band),range=plot.length>0&&band!==null?WEB_HEALTH_COPY.weightRange(weightValue(band.low),weightValue(band.high),unit):"";return{primary:`${weightValue(latest)} ${unit}`,secondary:`${weightValue(unit==="lb"?last.kg:last.kg*LB_PER_KG2)} ${other}`,count:readings.length,date:readings.length===1?{iso:last.iso,text:recordsDate(last.ms)}:null,plot:plot,band:plot.length>0?band:null,label:plot.length>0?WEB_HEALTH_COPY.weightTrend(values.length,weightValue(latest),unit,latest>first?"rising":latest<first?"falling":"steady")+range:null}}var SAMPLE_GROUPS=[{title:"Liver",lead:"What the liver makes and clears.",markers:[{line:"alt",name:"ALT",what:"An enzyme found mostly in liver cells.",at:92,value:"118",unit:"U/L",high:true},{line:"alp",name:"ALP",what:"An enzyme from the liver and bones.",at:33,value:"64",unit:"U/L"},{line:"ggt",name:"GGT",what:"An enzyme tied to the liver’s bile ducts.",at:36,value:"3",unit:"U/L"},{line:"tbil",name:"Total bilirubin",what:"A yellow pigment the liver clears.",at:33,value:"0.2",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{test:"ALB",result:"3.2",unit:"g/dL",range:"2.3-4.0"},{line:"alp",test:"ALP",result:"64",unit:"U/L",range:"23-212"},{line:"alt",test:"ALT",result:"118 H",unit:"U/L",range:"10-100"},{test:"BUN",result:"18",unit:"mg/dL",range:"7-27"},{line:"ggt",test:"GGT",result:"3",unit:"U/L",range:"0-11"},{line:"tbil",test:"T. BILI",result:"0.2",unit:"mg/dL",range:"0.0-0.9"}]},{title:"Kidney",lead:"What the kidneys filter out and keep in balance.",markers:[{line:"bun",name:"BUN",what:"Protein waste the kidneys filter out.",at:53,value:"18",unit:"mg/dL"},{line:"crea",name:"Creatinine",what:"Muscle waste the kidneys filter out.",at:48,value:"1.1",unit:"mg/dL"},{line:"sdma",name:"SDMA",what:"Another measure of kidney filtering.",at:59,value:"9",unit:"µg/dL"},{line:"phos",name:"Phosphorus",what:"A mineral the kidneys keep in balance.",at:42,value:"4.1",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{test:"ALT",result:"45",unit:"U/L",range:"10-100"},{line:"bun",test:"BUN",result:"18",unit:"mg/dL",range:"7-27"},{test:"CA",result:"10.1",unit:"mg/dL",range:"7.9-12.0"},{line:"crea",test:"CREA",result:"1.1",unit:"mg/dL",range:"0.5-1.8"},{line:"phos",test:"PHOS",result:"4.1",unit:"mg/dL",range:"2.5-6.8"},{line:"sdma",test:"SDMA",result:"9",unit:"µg/dL",range:"0-14"}]},{title:"Blood cells",lead:"The cells that carry oxygen, fight infection and help blood clot.",markers:[{line:"rbc",name:"Red blood cells",what:"Cells that carry oxygen around the body.",at:43,value:"6.9",unit:"M/µL"},{line:"hgb",name:"Hemoglobin",what:"The part of red cells that holds oxygen.",at:42,value:"15.8",unit:"g/dL"},{line:"wbc",name:"White blood cells",what:"Cells that fight infection.",at:44,value:"9.8",unit:"K/µL"},{line:"plt",name:"Platelets",what:"Cell fragments that help blood clot.",at:41,value:"265",unit:"K/µL"}],page:3,panel:"Complete blood count",rows:[{test:"HCT",result:"46",unit:"%",range:"37.3-61.7"},{line:"hgb",test:"HGB",result:"15.8",unit:"g/dL",range:"13.1-20.5"},{test:"NEUT",result:"6.1",unit:"K/µL",range:"2.95-11.64"},{line:"plt",test:"PLT",result:"265",unit:"K/µL",range:"148-484"},{line:"rbc",test:"RBC",result:"6.9",unit:"M/µL",range:"5.65-8.87"},{line:"wbc",test:"WBC",result:"9.8",unit:"K/µL",range:"5.05-16.76"}]},{title:"Sugar and salts",lead:"Fuel, and the salts that keep fluids, nerves and muscles steady.",markers:[{line:"glu",name:"Glucose",what:"Blood sugar, the body’s main fuel.",at:41,value:"96",unit:"mg/dL"},{line:"na",name:"Sodium",what:"A salt that keeps fluids in balance.",at:31,value:"147",unit:"mmol/L"},{line:"k",name:"Potassium",what:"A salt that helps nerves and muscles work.",at:49,value:"4.6",unit:"mmol/L"},{line:"ca",name:"Calcium",what:"A mineral for bones, muscles and nerves.",at:52,value:"10.1",unit:"mg/dL"}],page:2,panel:"Chemistry panel",rows:[{line:"ca",test:"CA",result:"10.1",unit:"mg/dL",range:"7.9-12.0"},{test:"CL",result:"112",unit:"mmol/L",range:"109-122"},{line:"glu",test:"GLU",result:"96",unit:"mg/dL",range:"70-143"},{line:"k",test:"K",result:"4.6",unit:"mmol/L",range:"3.5-5.8"},{line:"na",test:"NA",result:"147",unit:"mmol/L",range:"144-160"},{test:"PHOS",result:"4.1",unit:"mg/dL",range:"2.5-6.8"}]}],SAMPLE_REPORT_PAGES=12,SAMPLE_MORE=[{tone:"pink",icon:"efi-shield",title:"Screenings",lead:()=>"Tests that look for common problems early, and what came back.",rows:[{label:"Heartworm test",pill:{tone:"clear",text:"Negative"}},{label:"Tick panel (4Dx)",pill:{tone:"clear",text:"Negative"}},{label:"Fecal exam",pill:{tone:"clear",text:"Negative"}}]},{tone:"blue",icon:"efi-folder",title:"Visits & records",lead:()=>"Every visit, with the vet’s notes and the pages they came from.",rows:[{label:"Wellness exam",when:"38 pages"},{label:"Skin and allergy visit",when:"6 pages"},{label:"Everfur video visit",when:"3 pages"}]},{tone:"yellow",icon:"efi-clock",title:"Timeline",lead:petName=>`${petName}’s whole history in order, with what’s due next.`,rows:[{label:"Rabies vaccine",pill:{tone:"soon",text:"Due soon"}},{label:"Wellness exam",when:"Jun 12"},{label:"Heartworm test",when:"Apr 18"}]}];var readDepth=(client,petRef)=>client.getRecordDepth(petRef),depthEmpty=value=>!value.available,readTimeline=(client,petRef)=>client.getTimeline(petRef),timelineEmpty=value=>value.isEmpty;function useSheetFonts(fonts){return useMemo(()=>({...RAPH_RECORDS_FONTS,...fonts??{}}),[fonts])}function useSheetRules(palette){let theme=useEverfurTheme();return useMemo(()=>recordsSheetRules(theme,palette),[theme,palette])}function useSheetWebRules(palette){let theme=useEverfurTheme();return useMemo(()=>recordsSheetWebRules(theme,palette),[theme,palette])}function RecordsSheet(props){let fonts=useSheetFonts(props.options.fonts),rules=useSheetRules(props.options.palette),webRules=useSheetWebRules(props.options.palette);/* @__PURE__ */
129
+ return jsx(SheetFontsContext.Provider,{value:fonts,children:/* @__PURE__ */jsx(SheetRulesContext.Provider,{value:rules,children:/* @__PURE__ */jsx(SheetWebRulesContext.Provider,{value:webRules,children:/* @__PURE__ */jsx(RecordsSheetBody,{...props})})})})}function useSheetPetFacts(petRef,hostName,options){let{pets:pets}=useEverfurPets(),pet=pets.find(p=>p.petRef===petRef)??null,planCapability=useCapability("healthPlan"),plan=useHealthPlanPage({petRef:petRef,enabled:planCapability.enabled}),planPet=plan.page?.pet??null,planSettled=!planCapability.enabled||plan.phase==="ready"||plan.phase==="failed",planSex=pronounForSex(planPet?.sex),askProfile=options.pronoun===void 0&&planSettled&&planSex===null,{profile:profile}=useEverfurPetProfile(askProfile?petRef:null),name=hostName.trim()||pet?.name?.trim()||planPet?.name?.trim()||"",focus=plan.page?.page?.focus??null;return{name:name,pronoun:options.pronoun??planSex??pronounForSex(profile?.sex),species:sheetSampleKind(pet?.species??planPet?.species??profile?.species),breed:pet?.breed??null,weightKg:pet?.weightKg??null,ageYears:pet?.ageYears??null,focus:focus!==null&&focus.title.trim()!==""?focus:null}}var useIsomorphicLayoutEffect=typeof document>"u"?useEffect:useLayoutEffect;function useSheetTiers(root){let[tiers,setTiers]=useState(PHONE_TIERS);return useIsomorphicLayoutEffect(()=>{let node=root.current;if(node===null||typeof ResizeObserver>"u")return;let read=()=>{let cs=getComputedStyle(node),width=node.clientWidth-(parseFloat(cs.paddingLeft)||0)-(parseFloat(cs.paddingRight)||0),next=sheetTiers(width,typeof window>"u"?void 0:window.innerWidth);setTiers(was=>was.length===next.length&&was.every((t,i)=>t===next[i])?was:next)};read();let observer=new ResizeObserver(read);return observer.observe(node),()=>observer.disconnect()},[root]),tiers}var SheetStageContext=createContext({host:void 0,art:{status:"none"},onError:()=>{},reduced:true}),kitVar=(name,value)=>({[`--efw-${name}`]:value});function RecordsSheetBody({petRef:petRef,petName:petName,options:options,records:records,readable:readable,consentControl:consentControl,canRequestFromClinic:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,onOpenRecord:onOpenRecord,onOpenMarker:onOpenMarker,onOpenScreenings:onOpenScreenings,renderUpcomingCareAction:renderUpcomingCareAction,weightUnit:pageUnit,onOpenPlan:pageOpenPlan,noVet:noVet,onOpenRequest:onOpenRequest,nowMs:nowMs}){let facts=useSheetPetFacts(petRef,petName,options),words2=sheetPetWords(facts.name,facts.pronoun),weightUnit=options.weightUnit??pageUnit??"lb",onOpenPlan=options.onOpenPlan??pageOpenPlan,topRiskOn=useEverfurPresentation(options.topRiskLine===void 0?void 0:{recordsTopRiskLine:options.topRiskLine}).recordsTopRiskLine,markers=useRecordsMarkers(petRef),depth=useRecordsDepthRead(petRef,readDepth,depthEmpty),timeline=useRecordsDepthRead(petRef,readTimeline,timelineEmpty),at=useCoarseNow(nowMs),model=useMemo(()=>buildRecordsSheetModel({words:words2,record:records.record,depth:depth.value,markers:markers.markers,timeline:timeline.value,requests:records.requests,breed:facts.breed,petWeightKg:facts.weightKg,petAgeYears:facts.ageYears,nowMs:at,weightUnit:weightUnit}),[facts.name,facts.pronoun,facts.breed,facts.weightKg,facts.ageYears,records.record,records.requests,depth.value,markers.markers,timeline.value,at,weightUnit]),weight=useMemo(()=>webWeight(timeline.value,weightUnit),[timeline.value,weightUnit]),inFlight=useMemo(()=>healthTabOnTheWay(facts.name,records.requests),[facts.name,records.requests]),photos=acceptsPhotos(records.uploadContentTypes),historyRef=useRef(null),heroRef=useRef(null),rootRef=useRef(null),tiers=useSheetTiers(rootRef),reduced=useEverfurTheme().motion.reducedMotion,pageVisible=usePageVisible(),petArt=useRecordsPetArt(options.stage===void 0?petRef:null,{reducedMotion:reduced,isFocused:pageVisible}),stageArt=useMemo(()=>({host:options.stage,art:petArt.art,onError:petArt.onError,reduced:reduced}),[options.stage,petArt.art,petArt.onError,reduced]),name=words2.name,top=topRiskOn&&facts.focus!==null?/* @__PURE__ */jsx(TopRisk,{words:words2,focus:facts.focus,onOpenPlan:onOpenPlan}):null,openHistory=model.history.length>0||model.failedRequest!==null?()=>historyRef.current?.scrollIntoView({block:"start"}):onOpenRecord,body;return readable?model.state!=="full"?body=/* @__PURE__ */jsxs(Page,{kind:"empty",children:[top,
130
130
  /* @__PURE__ */jsx(Hero,{heroRef:heroRef,name:name,model:model,inFlight:inFlight,noVet:noVet===true,canRequest:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,onOpenRequest:onOpenRequest,photos:photos}),weight!==null?/* @__PURE__ */jsx("div",{style:{marginTop:24},children:/* @__PURE__ */jsx(WeightCard,{name:name,weight:weight})}):null,
131
131
  /* @__PURE__ */jsx(SamplePeek,{name:name,kind:facts.species,onAdd:()=>heroRef.current?.scrollIntoView({block:"start"})})]}):body=/* @__PURE__ */jsxs(Page,{kind:"health",children:[top,
132
132
  /* @__PURE__ */jsxs(Grid,{children:[
133
133
  /* @__PURE__ */jsx(PetCard,{name:name,title:words2.Name,model:model,depth:depth.value,records:records,onOpenRecord:onOpenRecord}),
134
134
  /* @__PURE__ */jsx(DueCard,{name:name,rows:webCareRows(records.record!==null&&!records.record.withheld?records.record.forwardLooking:[],at),renderAction:renderUpcomingCareAction,onViewAll:openHistory}),
135
- /* @__PURE__ */jsx(FilesBlock,{model:model,timeline:timeline.value,screenings:sheetScreenings(markers.markers?.markers??[]),onOpenMarker:onOpenMarker,onOpenScreenings:onOpenScreenings,onOpenRecord:onOpenRecord,onOpenTimeline:openHistory}),
135
+ /* @__PURE__ */jsx(FilesBlock,{model:model,timeline:timeline.value,screenings:healthTabScreenings(markers.markers?.markers??[]),onOpenMarker:onOpenMarker,onOpenScreenings:onOpenScreenings,onOpenRecord:onOpenRecord,onOpenTimeline:openHistory}),
136
136
  /* @__PURE__ */jsx(WeightCard,{name:name,weight:weight}),
137
- /* @__PURE__ */jsx(AddCard,{name:name,sources:webSources(records.record,depth.value),inFlight:inFlight,canRequest:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,onOpenRequest:onOpenRequest,photos:photos})]}),
137
+ /* @__PURE__ */jsx(AddCard,{name:name,sources:healthTabSources(records.record,depth.value),inFlight:inFlight,canRequest:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,onOpenRequest:onOpenRequest,photos:photos})]}),
138
138
  /* @__PURE__ */jsx(Medications,{model:model}),
139
139
  /* @__PURE__ */jsx(History,{words:words2,model:model,onOpenMarker:onOpenMarker,sectionRef:historyRef})]}):body=/* @__PURE__ */jsxs(Page,{kind:"health",children:[top,consentControl,
140
140
  /* @__PURE__ */jsx("div",{style:{marginTop:32},children:/* @__PURE__ */jsx(AddCard,{name:name,sources:[],inFlight:[],canRequest:canRequestFromClinic,onRequest:onRequest,onUpload:onUpload,photos:photos})})]}),/* @__PURE__ */jsx(SheetTiersContext.Provider,{value:tiers,children:/* @__PURE__ */jsx(SheetStageContext.Provider,{value:stageArt,children:/* @__PURE__ */jsx(Root,{rootRef:rootRef,style:options.style,state:readable?model.state:"consent",tiers:tiers,children:body})})})}function Root({rootRef:rootRef,style:style,state:state,tiers:tiers,children:children}){let wx=useWx();/* @__PURE__ */
@@ -168,7 +168,7 @@ return jsxs("li",{style:{...wx("block",".efw-due li",alert&&".efw-due li.efw-is-
168
168
  /* @__PURE__ */jsxs("div",{style:wx("block",".efw-due__text"),children:[
169
169
  /* @__PURE__ */jsx("h3",{style:wx("h",".efw-root h3",".efw-due__title",alert&&".efw-is-alert .efw-due__title"),children:row.title}),
170
170
  /* @__PURE__ */jsx("p",{style:wx("p",".efw-root p",".efw-due__when",alert&&".efw-is-alert .efw-due__when"),children:row.when})]}),alert&&renderAction!==void 0?/* @__PURE__ */jsx(HostRender,{render:()=>renderAction(row.item),fallback:/* @__PURE__ */jsx(DuePill,{row:row}),resetKey:row.item}):/* @__PURE__ */jsx(DuePill,{row:row})]},row.key)})})]})}function DuePill({row:row}){let wx=useWx();/* @__PURE__ */
171
- return jsx("span",{style:wx("block",".efw-pill",row.pill.className),children:row.pill.text})}function sheetScreenings(markers){let screenings=markers.filter(m=>(m.latest?.qualitativeResult??"").trim().length>0);if(screenings.length===0)return null;let flagged=screenings.filter(m=>screeningIsFlagged(m.latest?.status??null,m.latest?.qualitativeResult??"")),first=flagged[0]??screenings[0];return flagged.length>0?{label:WEB_HEALTH_COPY.screeningsToReview(flagged.length),flagged:true,markerId:first.markerId}:{label:WEB_HEALTH_COPY.screeningsClear,flagged:false,markerId:first.markerId}}function screeningIsFlagged(status,resultText){return status==="in_range"?false:status==="above"||status==="below"?true:/negative|not detected|clear|none/i.test(resultText)?false:/positive|detected|present|reactive/i.test(resultText)}function Tile({tone:tone,icon:icon,title:title,foot:foot,onOpen:onOpen,testID:testID,enter:enter}){let wx=useWx(),tileStyle=wx("button",".efw-root a",".efw-tile",`.efw-tile--${tone}`),hover=useTileHover(String(tileStyle.color??"#10462E"),useContext(SheetStageContext).reduced);/* @__PURE__ */
171
+ return jsx("span",{style:wx("block",".efw-pill",row.pill.className),children:row.pill.text})}function Tile({tone:tone,icon:icon,title:title,foot:foot,onOpen:onOpen,testID:testID,enter:enter}){let wx=useWx(),tileStyle=wx("button",".efw-root a",".efw-tile",`.efw-tile--${tone}`),hover=useTileHover(String(tileStyle.color??"#10462E"),useContext(SheetStageContext).reduced);/* @__PURE__ */
172
172
  return jsx("li",{style:enter,children:/* @__PURE__ */jsxs("button",{type:"button",onClick:onOpen,...hover.handlers,style:{...tileStyle,...hover.tile,width:"100%"},"data-testid":testID,children:[
173
173
  /* @__PURE__ */jsxs("span",{style:wx("block",".efw-tile__top"),children:[
174
174
  /* @__PURE__ */jsx(SheetIcon,{id:icon,style:wx("media",".efw-ico",".efw-tile__top .efw-ico")}),