@alfadocs/ui-kit 0.71.0 → 0.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{accordion-DnIa7OHX.js → accordion-C11v9ouP.js} +2 -2
- package/dist/_chunks/{address-autocomplete-BEX9PXty.js → address-autocomplete-Bq-1n1UX.js} +2 -2
- package/dist/_chunks/{address-fields-CPbFJ8e8.js → address-fields-COyjgqxA.js} +8 -8
- package/dist/_chunks/{agenda-card-BQ-IKAru.js → agenda-card-BCGaQazD.js} +2 -2
- package/dist/_chunks/{agenda-tray-CGXRk58j.js → agenda-tray-loL2A3Cx.js} +4 -4
- package/dist/_chunks/{ai-consent-banner-Be-h9mRI.js → ai-consent-banner-Bke9m8VS.js} +2 -2
- package/dist/_chunks/{ai-prompt-input-V4DdOeqv.js → ai-prompt-input-TVI95hJD.js} +4 -4
- package/dist/_chunks/{alert-CHYZ96tR.js → alert-KJbsPYkI.js} +8 -8
- package/dist/_chunks/{alia-sidebar-DvIUzIX9.js → alia-sidebar-BV5lBSFR.js} +279 -223
- package/dist/_chunks/{anamnesis-card-DvYCa16e.js → anamnesis-card-CWO4Ui9c.js} +4 -4
- package/dist/_chunks/{antenatal-schedule-timeline-CwXrQRm1.js → antenatal-schedule-timeline-CY-VsLok.js} +3 -3
- package/dist/_chunks/{appointment-card-DVaeJNVB.js → appointment-card-Cy4FOkGP.js} +86 -69
- package/dist/_chunks/{appointment-timeline-PJgnrjFb.js → appointment-timeline-BWAPPk8F.js} +4 -4
- package/dist/_chunks/{appointment-tray-B16QPGbm.js → appointment-tray-D3mk04TT.js} +4 -4
- package/dist/_chunks/{ar-Cn5Fq48Z.js → ar-BOqyIfoY.js} +2 -2
- package/dist/_chunks/astroid-BN4f5VXU.js +20 -0
- package/dist/_chunks/{audio-recorder-DNDsOLqO.js → audio-recorder-BbjG55dP.js} +9 -9
- package/dist/_chunks/{bishop-score-Cym_TeQY.js → bishop-score-C6eoak_j.js} +4 -4
- package/dist/_chunks/{bmi-calculator-zjeY4E7J.js → bmi-calculator-BmQfoEGP.js} +5 -5
- package/dist/_chunks/{booking-C7do4vaR.js → booking-B62CMY5k.js} +205 -221
- package/dist/_chunks/{breadcrumb-CchdeG7d.js → breadcrumb-agut0PwN.js} +3 -3
- package/dist/_chunks/{calculator-dialog-BR5iU0kf.js → calculator-dialog-DuXMQSdm.js} +2 -2
- package/dist/_chunks/{calendar-CZUjL8SZ.js → calendar-DeAlFPsF.js} +15 -15
- package/dist/_chunks/{calendar-clock-CYkcqdwl.js → calendar-clock-hbObjfGY.js} +3 -3
- package/dist/_chunks/{calendar-days-C4BmpCZg.js → calendar-days-BGWklvE-.js} +3 -3
- package/dist/_chunks/{care-plan-card-DzPDYgtK.js → care-plan-card-DhXbfGzE.js} +6 -6
- package/dist/_chunks/{care-plan-entry-card-CEnQy7YP.js → care-plan-entry-card-D3YGD6rj.js} +6 -6
- package/dist/_chunks/{care-plan-header-DcXFXWit.js → care-plan-header-DtQxyfOb.js} +4 -4
- package/dist/_chunks/{carousel.agent-4v8Emr9E.js → carousel.agent-j7hWxJWr.js} +3 -3
- package/dist/_chunks/{chat-container-DWho5hPR.js → chat-container-BVCoN06N.js} +2 -2
- package/dist/_chunks/{chat-input-BcXTetgM.js → chat-input-Btq_uuMZ.js} +5 -5
- package/dist/_chunks/{chat-message-DzpcJR-q.js → chat-message-DXjjM8z9.js} +7 -7
- package/dist/_chunks/{check-DPdL_Sm7.js → check-DrFSN__t.js} +3 -3
- package/dist/_chunks/{checkbox-group-PqNmQ-cE.js → checkbox-group-CfqMv57d.js} +2 -2
- package/dist/_chunks/{chevron-down-BX_NP2Yh.js → chevron-down-DWE7GSq9.js} +3 -3
- package/dist/_chunks/{chevron-left-CX1jqD2M.js → chevron-left-B8cOyH-V.js} +3 -3
- package/dist/_chunks/{chevron-right-BrpYejk0.js → chevron-right-I9AeSxH2.js} +3 -3
- package/dist/_chunks/{chevron-up-zOEDrmBB.js → chevron-up-umRGgtJA.js} +3 -3
- package/dist/_chunks/{chevrons-right-d9MwesPG.js → chevrons-right-DIHg7Xqi.js} +4 -4
- package/dist/_chunks/{circle-alert-ChA9opNA.js → circle-alert-rGDZ73Wh.js} +3 -3
- package/dist/_chunks/{circle-check-9AeSgJD_.js → circle-check-BN6rz4NV.js} +3 -3
- package/dist/_chunks/{circle-BkqTgYmt.js → circle-j7oZoouK.js} +3 -3
- package/dist/_chunks/{circle-x-Du2CmjaU.js → circle-x-W8Enq3i4.js} +3 -3
- package/dist/_chunks/{city-input-Dkgaak7I.js → city-input-towzBenY.js} +2 -2
- package/dist/_chunks/{clinical-note-card-BUvNMNGL.js → clinical-note-card-C7F_24IC.js} +9 -9
- package/dist/_chunks/clipboard-check-BeAGxDVT.js +22 -0
- package/dist/_chunks/{clock-21AGPWJ5.js → clock-Drd4Wtis.js} +3 -3
- package/dist/_chunks/{code-block-BBWHhIc8.js → code-block-Cwi7e3HM.js} +3 -3
- package/dist/_chunks/{color-picker-C_fZl6sA.js → color-picker-D-tUwxxT.js} +3 -3
- package/dist/_chunks/{columns-2-BTOBZbep.js → columns-2-8lq4-b8e.js} +3 -3
- package/dist/_chunks/{combobox-DnqSF0IH.js → combobox-DiMLItyu.js} +3 -3
- package/dist/_chunks/{command-palette-CJzmc5pC.js → command-palette-DQl_SNEv.js} +2 -2
- package/dist/_chunks/{connection-status-CY1HV8Wg.js → connection-status-0HajXMXM.js} +2 -2
- package/dist/_chunks/{contact-card-Cf8Ktyt3.js → contact-card-0hnFJwrz.js} +3 -3
- package/dist/_chunks/{contact-profile-card-DDPwRFiP.js → contact-profile-card-IggiUVpN.js} +14 -14
- package/dist/_chunks/{control-room-rail-FAQZrGVL.js → control-room-rail-DaGcsdZ6.js} +3 -3
- package/dist/_chunks/{copy-field-Bjw9u2cV.js → copy-field-PAp0-Wr5.js} +3 -3
- package/dist/_chunks/{copy-B00HK7tj.js → copy-vRpqqHtY.js} +3 -3
- package/dist/_chunks/{country-select-BwUZQvTa.js → country-select-DYHDLEjG.js} +2 -2
- package/dist/_chunks/{createLucideIcon-CrFbzy84.js → createLucideIcon-DhHxpK9K.js} +8 -8
- package/dist/_chunks/{cycle-calculator-CCmPwcBl.js → cycle-calculator-BNILyVas.js} +10 -10
- package/dist/_chunks/{date-picker-Dl9RKxaV.js → date-picker-CVkD_lOi.js} +3 -3
- package/dist/_chunks/{date-picker-variants-DAcSLTua.js → date-picker-variants-DLg-ZrIo.js} +20 -20
- package/dist/_chunks/{date-range-picker-CTUeR6Bj.js → date-range-picker-Dw12DgV8.js} +4 -4
- package/dist/_chunks/{date-time-picker-BhoogS5Q.js → date-time-picker-Cd_OJtOy.js} +3 -3
- package/dist/_chunks/{de-CrJs4ZsX.js → de-DFLsUxeV.js} +2 -2
- package/dist/_chunks/{dependent-selector-DUV4thxX.js → dependent-selector-DyFpdzZV.js} +2 -2
- package/dist/_chunks/{description-list-gkNGWk5G.js → description-list-CmBVxIF5.js} +3 -3
- package/dist/_chunks/{dialog-ZNuboNmy.js → dialog-UbKJCi1X.js} +2 -2
- package/dist/_chunks/{document-scanner-C_AxLooF.js → document-scanner-B23j4w7X.js} +8 -8
- package/dist/_chunks/{download-CDF1sbL9.js → download-CfYKJO_j.js} +3 -3
- package/dist/_chunks/{dropdown-menu-qrxjymfw.js → dropdown-menu-DU-Hrf33.js} +3 -3
- package/dist/_chunks/{due-date-calculator-Brdj-euS.js → due-date-calculator-CmdAl_JO.js} +7 -7
- package/dist/_chunks/{editable-currency-cell-renderer-CGELrkIj.js → editable-currency-cell-renderer-z9fJFw6Z.js} +7 -7
- package/dist/_chunks/{editor-overlay-wYm22wZK.js → editor-overlay-BIOzr8v7.js} +2 -2
- package/dist/_chunks/{el-DHdMOIhL.js → el-OVjBKytp.js} +2 -2
- package/dist/_chunks/{ellipsis-rgGdiK_9.js → ellipsis-dRo9ouSU.js} +3 -3
- package/dist/_chunks/{email-input-DJ7EXklP.js → email-input-Dpe63k0K.js} +3 -3
- package/dist/_chunks/{entity-card-DmrgYSEX.js → entity-card-9_62gY7l.js} +4 -4
- package/dist/_chunks/{entity-summary-CaM1Y-xE.js → entity-summary-DpGziDv5.js} +104 -118
- package/dist/_chunks/{es-DCATCfqo.js → es-DKDNrHXG.js} +2 -2
- package/dist/_chunks/{external-link-C6F25E6k.js → external-link-CY6zAXXU.js} +3 -3
- package/dist/_chunks/{eye-LHlSU38h.js → eye-BjhN2nYf.js} +3 -3
- package/dist/_chunks/{eye-off-xEXDAh5z.js → eye-off-C_4xkbRP.js} +3 -3
- package/dist/_chunks/face-scheme-DOZO3M_c.js +1450 -0
- package/dist/_chunks/face_detection_yunet_2023mar-BnsRs4bD.js +5 -0
- package/dist/_chunks/{fetal-weight-DNCkyeVo.js → fetal-weight-CVAH8sJ3.js} +4 -4
- package/dist/_chunks/{field-array-siUZzfYe.js → field-array-CDzc3hTM.js} +3 -3
- package/dist/_chunks/{field-value-3jMM0uDx.js → field-value-Dj3i52H2.js} +13 -13
- package/dist/_chunks/{file-spreadsheet-zUkY8rJ2.js → file-spreadsheet-DmwyfV4O.js} +3 -3
- package/dist/_chunks/{file-text-DSNuv2B8.js → file-text-5yv6r2ls.js} +3 -3
- package/dist/_chunks/{file-upload-DwZcAK8D.js → file-upload-Kw1rdvFw.js} +13 -13
- package/dist/_chunks/{finished-terminal-VjZ_-eDD.js → finished-terminal-Di4gtZ50.js} +2 -2
- package/dist/_chunks/{fiscal-code-input-Cf-8O4Fj.js → fiscal-code-input-DKNXFXs3.js} +5 -5
- package/dist/_chunks/{form-field-BOm9hK35.js → form-field-M5UpX65Z.js} +2 -2
- package/dist/_chunks/{fr-BfGEMshF.js → fr-BfMvQh-v.js} +2 -2
- package/dist/_chunks/{freemium-paywall-WYlNO7yT.js → freemium-paywall-DFoeedwh.js} +4 -4
- package/dist/_chunks/{gestational-age-calculator-DKzEV5Qi.js → gestational-age-calculator-BwCBPAGX.js} +9 -9
- package/dist/_chunks/{globe-BkEFMNSg.js → globe-sHBW1JN5.js} +3 -3
- package/dist/_chunks/{grip-vertical-Dlg0_k5C.js → grip-vertical-onSb1JXO.js} +3 -3
- package/dist/_chunks/{hash-CysBBS_N.js → hash-CSQ9SChR.js} +3 -3
- package/dist/_chunks/{hcg-doubling-C7bmuaU3.js → hcg-doubling-CSsWxEJc.js} +5 -5
- package/dist/_chunks/{header-CNszv2WQ.js → header-DaXWDw0M.js} +2 -2
- package/dist/_chunks/{header-settings-DJqoAl5m.js → header-settings-B0G_u-wV.js} +6 -6
- package/dist/_chunks/{heart-C0faivFf.js → heart--qCA4ffe.js} +3 -3
- package/dist/_chunks/{heart-pulse-CvuyFKHB.js → heart-pulse-BCppJyN2.js} +3 -3
- package/dist/_chunks/{hi-CBFRXEIm.js → hi-C0GEMwlD.js} +2 -2
- package/dist/_chunks/{iban-input-B0TWzR1R.js → iban-input-DXIA8Ln_.js} +3 -3
- package/dist/_chunks/{icon-picker-0B7KhrF1.js → icon-picker-Di6uYDG-.js} +4 -4
- package/dist/_chunks/{image-C6RM5hfF.js → image-B_5MNK0x.js} +3 -3
- package/dist/_chunks/{image-cropper-D9jqJy19.js → image-cropper-CdmWFrMC.js} +2 -2
- package/dist/_chunks/{info-B9XNKn05.js → info-CGn22peZ.js} +3 -3
- package/dist/_chunks/{insert-result-njqBthzT.js → insert-result-C7xSDb8q.js} +5 -5
- package/dist/_chunks/{isSameWeek-I3DfXUp1.js → isSameWeek-HddDAyJG.js} +2 -2
- package/dist/_chunks/{it-nz6vAKwG.js → it-5f4hiT2e.js} +3 -3
- package/dist/_chunks/{ja-DQcqdAEJ.js → ja-U0_2inl_.js} +2 -2
- package/dist/_chunks/{key-value-pair-BrgbMfbF.js → key-value-pair-Byyyc_9J.js} +3 -3
- package/dist/_chunks/{languages-DsVf_WzT.js → languages-CGLX6Qpe.js} +3 -3
- package/dist/_chunks/{layers-pzGcbLPj.js → layers-DcAENmsZ.js} +3 -3
- package/dist/_chunks/{link-DrD_cRUg.js → link-CPb_pZPr.js} +2 -2
- package/dist/_chunks/{link-cell-renderer-De_SLjSq.js → link-cell-renderer-BCppbMec.js} +19 -19
- package/dist/_chunks/{locale-picker-ChYYSX2N.js → locale-picker-DzF7Q5Y8.js} +5 -5
- package/dist/_chunks/{lock-CKOIn0IK.js → lock-ClAFG1gy.js} +3 -3
- package/dist/_chunks/{log-out-616hnn2-.js → log-out-oDS6zO5d.js} +3 -3
- package/dist/_chunks/{mail-C8irm52s.js → mail-BqXVF2zH.js} +3 -3
- package/dist/_chunks/{map-pin-B8STOPMJ.js → map-pin-BaY37-Km.js} +3 -3
- package/dist/_chunks/{map-view-BkOoGoX2.js → map-view-ByPvWG_9.js} +3 -3
- package/dist/_chunks/{marketplace-app-shell-BGqkywsi.js → marketplace-app-shell-BCYiOvKZ.js} +9 -9
- package/dist/_chunks/{maximize-2-Cm9OUQ2m.js → maximize-2-BYd2Kti7.js} +3 -3
- package/dist/_chunks/{menu-XRhW3_99.js → menu-Op71AWIC.js} +3 -3
- package/dist/_chunks/{message-card-DsHFFiL1.js → message-card-BZnnffyB.js} +2 -2
- package/dist/_chunks/{message-circle-C23eicgb.js → message-circle-Bepl9JT5.js} +3 -3
- package/dist/_chunks/{message-tray-C0a6CL1_.js → message-tray-cUHOCdU0.js} +3 -3
- package/dist/_chunks/{mic-B4Gog3Gi.js → mic-CUklMZGF.js} +3 -3
- package/dist/_chunks/{monitor-D-SFdbrU.js → monitor-xXSrufmP.js} +3 -3
- package/dist/_chunks/{multi-select-WE4S9FIF.js → multi-select-D5QLBJM1.js} +3 -3
- package/dist/_chunks/{anatomy-scheme-CXSk11UJ.js → muscle-scheme-B9MIkuj0.js} +415 -1146
- package/dist/_chunks/{nav-grid-9xphY3FM.js → nav-grid-gRudLsPX.js} +2 -2
- package/dist/_chunks/{navigation-menu-DRUi6sSj.js → navigation-menu-D3VndouD.js} +2 -2
- package/dist/_chunks/{nl-L5SuDjyl.js → nl-CDVnnx1U.js} +2 -2
- package/dist/_chunks/{notes-panel-DXiMfuvp.js → notes-panel-CMyjUXD4.js} +68 -64
- package/dist/_chunks/{notification-card-BMqNzCIt.js → notification-card-BHJ07FkH.js} +2 -2
- package/dist/_chunks/{notification-tray-BmUlCx3g.js → notification-tray-Dzm1c3Wy.js} +4 -4
- package/dist/_chunks/{number-input-DxphVG_A.js → number-input-DjWzmlEY.js} +3 -3
- package/dist/_chunks/{operator-hero-BO8TqzX2.js → operator-hero-DVy0RGoD.js} +3 -3
- package/dist/_chunks/optical-prescription-Bmlbuopi.js +653 -0
- package/dist/_chunks/{pagination-D58kglCr.js → pagination-EkD5SiCK.js} +6 -6
- package/dist/_chunks/{patient-details-DgfTJimE.js → patient-details-pU_E5xM2.js} +106 -87
- package/dist/_chunks/{patient-search-CSWQKOSP.js → patient-search-X9SUZGpy.js} +10 -10
- package/dist/_chunks/{patient-shell-BMwsIKlW.js → patient-shell-oiIRqEAl.js} +7 -7
- package/dist/_chunks/{patient-summary-card-D4NdgYJB.js → patient-summary-card--t3BjTdU.js} +16 -16
- package/dist/_chunks/{patient-table-CERknpd8.js → patient-table-BgWgNIMf.js} +11 -11
- package/dist/_chunks/{payment-form-CxqIXqw7.js → payment-form-DL9xk9BA.js} +2 -2
- package/dist/_chunks/{payment-request-card-Blf-MFNY.js → payment-request-card-2ts7ITxd.js} +15 -15
- package/dist/_chunks/{pdf-viewer-QfebdLOd.js → pdf-viewer-DF3VMaPo.js} +8 -8
- package/dist/_chunks/{pencil-CfQX-0Qc.js → pencil-B1sKKyuT.js} +3 -3
- package/dist/_chunks/{periodontal-chart-card-hRRJY1NN.js → periodontal-chart-card-6c6Lt4ws.js} +2 -2
- package/dist/_chunks/{permission-matrix-Bw5oexUt.js → permission-matrix-BIJrGEmz.js} +3 -3
- package/dist/_chunks/{phone-Bi5yUm4I.js → phone-FceYcIFQ.js} +3 -3
- package/dist/_chunks/{phone-input-DjU-XmO_.js → phone-input-dtnrvnZf.js} +2 -2
- package/dist/_chunks/{pl-YAn5z2wR.js → pl-BWNumNrg.js} +3 -3
- package/dist/_chunks/{plus-CYKNmfuA.js → plus-DzMQ_c6b.js} +3 -3
- package/dist/_chunks/{popover-B2qCDhJC.js → popover-uJ6BvEU3.js} +2 -2
- package/dist/_chunks/{postal-code-input-UCOYuRY2.js → postal-code-input-BznBxVxf.js} +3 -3
- package/dist/_chunks/{practice-results-El5Z-oVp.js → practice-results-CSEHTH2V.js} +15 -15
- package/dist/_chunks/{pregnancy-dating-CunHrOpO.js → pregnancy-dating-CxVAA6_4.js} +10 -10
- package/dist/_chunks/{pregnancy-weight-gain-BUNpTsH-.js → pregnancy-weight-gain-C7zyrwow.js} +5 -5
- package/dist/_chunks/{printer-CeVEWfQq.js → printer-rkK0T1gi.js} +3 -3
- package/dist/_chunks/{privacy-lock-BzMLQu-j.js → privacy-lock-DrRmK8C7.js} +4 -4
- package/dist/_chunks/{product-hub-panel-DtU7KXxm.js → product-hub-panel-CaZqttvm.js} +5 -5
- package/dist/_chunks/{province-select-D_TZvix3.js → province-select-BDywtmL-.js} +2 -2
- package/dist/_chunks/{pt-D9xdT5KQ.js → pt-zqdQuryr.js} +2 -2
- package/dist/_chunks/{public-footer.agent-D0cFbjWl.js → public-footer.agent-BKkK3T3V.js} +3 -3
- package/dist/_chunks/{public-header.agent-TxmC_x1I.js → public-header.agent-C-opZaOw.js} +5 -5
- package/dist/_chunks/{radio-group-BPt7pKZW.js → radio-group-CI-6SmSw.js} +2 -2
- package/dist/_chunks/{radiograph-panel.agent-tWjN2nHX.js → radiograph-panel.agent-D1x33moc.js} +14 -14
- package/dist/_chunks/{rating-BRD7O74e.js → rating-BYbUowdK.js} +2 -2
- package/dist/_chunks/{refresh-cw-CC8jSKMr.js → refresh-cw-DnI0cLFC.js} +3 -3
- package/dist/_chunks/{reviews-panel-DxkSrgMl.js → reviews-panel-liUj6OPX.js} +5 -5
- package/dist/_chunks/{rich-text-editor-C8tyGjfb.js → rich-text-editor-DUgznqOf.js} +53 -53
- package/dist/_chunks/{ro-Cp--52bT.js → ro-CornQr64.js} +2 -2
- package/dist/_chunks/{rotate-ccw-BWANpitO.js → rotate-ccw-BBQnIVTr.js} +3 -3
- package/dist/_chunks/{ru-BM8eX_Zz.js → ru-CKAXNYVD.js} +3 -3
- package/dist/_chunks/{scan-line-lGioFwLC.js → scan-line-CNseIHQ0.js} +3 -3
- package/dist/_chunks/{search-BonnQsHv.js → search-QbWPlY5f.js} +3 -3
- package/dist/_chunks/{search-bar-C_T3pBJn.js → search-bar-CJj6sI9m.js} +3 -3
- package/dist/_chunks/{search-input-DQvGxR74.js → search-input-B7GmlPIE.js} +4 -4
- package/dist/_chunks/{select-KsyRr8WH.js → select-BmCbJMJS.js} +5 -5
- package/dist/_chunks/{send-CySZIRPJ.js → send-C5kDJ-Mz.js} +3 -3
- package/dist/_chunks/{session-countdown-X1Ki6i0M.js → session-countdown-qr8EO5QY.js} +5 -5
- package/dist/_chunks/{settings-ca2Yi9R8.js → settings-d25ju_6L.js} +3 -3
- package/dist/_chunks/{sheet-umkfZjF6.js → sheet-B_X54aZo.js} +2 -2
- package/dist/_chunks/{shield-check-BjCGH_Sr.js → shield-check-DCJALLVh.js} +3 -3
- package/dist/_chunks/{sidebar-QCp9wHNP.js → sidebar-B0OBmJrC.js} +10 -10
- package/dist/_chunks/{sign-document-By6hMOra.js → sign-document-nK03S73h.js} +3 -3
- package/dist/_chunks/{signature-field-Dy1JRjzE.js → signature-field-jgwYgUhO.js} +4 -4
- package/dist/_chunks/{smart-date-CWikAqZx.js → smart-date-CsPlilQA.js} +7 -7
- package/dist/_chunks/{sq-XRpr0r49.js → sq-CIIvqXZv.js} +2 -2
- package/dist/_chunks/{square-CZoGU14v.js → square-DASBRZ0U.js} +3 -3
- package/dist/_chunks/{square-check-big-Jr-0202D.js → square-check-big-dj0o8yA3.js} +3 -3
- package/dist/_chunks/{star-vav0SJ9e.js → star-Bf9L2Uot.js} +3 -3
- package/dist/_chunks/{stepper-accordion-DC-H-8v4.js → stepper-accordion-BeVMZPuG.js} +3 -3
- package/dist/_chunks/{stethoscope-DT5qCW8Y.js → stethoscope-sZXGC43m.js} +3 -3
- package/dist/_chunks/{streaming-text-BB9mvK4m.js → streaming-text-Cedc05ya.js} +2 -2
- package/dist/_chunks/subDays-DGSOp9d9.js +8 -0
- package/dist/_chunks/{sun-BuXE0xUS.js → sun-Bj9Mr553.js} +4 -4
- package/dist/_chunks/{sv-Z3APomE8.js → sv-Kpk1pzjz.js} +2 -2
- package/dist/_chunks/{tab-bar-Bv9nGNdO.js → tab-bar-Axhk6xzx.js} +6 -6
- package/dist/_chunks/{tabs-CYZVKKDl.js → tabs-DVQ941Sj.js} +4 -4
- package/dist/_chunks/{tag-BQXwuJq1.js → tag-3wgkwwDB.js} +2 -2
- package/dist/_chunks/{task-card-DCdsI0ZT.js → task-card-BUgK6yZT.js} +9 -9
- package/dist/_chunks/{task-tray-DNVejijD.js → task-tray-DP5A3Qnc.js} +5 -5
- package/dist/_chunks/{tasks-panel-C9odmawT.js → tasks-panel-BuxaYtEF.js} +40 -40
- package/dist/_chunks/{text-input-B-OWQ1Je.js → text-input-CUvCb6ST.js} +2 -2
- package/dist/_chunks/{theme-toggle-XB6o_lgs.js → theme-toggle-dtdy5EaL.js} +4 -4
- package/dist/_chunks/{timeline-CqA4nKTI.js → timeline-r-8IUoBS.js} +6 -6
- package/dist/_chunks/{toast.agent-57UzyR9U.js → toast.agent-BSxl057x.js} +6 -6
- package/dist/_chunks/{token-insert-menu-CFQqTe_n.js → token-insert-menu-Pok4nExI.js} +2 -2
- package/dist/_chunks/{tooth-scheme-DJZtzfeY.js → tooth-scheme-D_rso4uu.js} +4 -4
- package/dist/_chunks/{tr-e0-P4FON.js → tr-DHaeLFxG.js} +2 -2
- package/dist/_chunks/{transaction-chip-CscoQbxF.js → transaction-chip-B6iWoVmU.js} +8 -8
- package/dist/_chunks/{transcript-panel-CHGHHHdT.js → transcript-panel-BGkEhvHO.js} +3 -3
- package/dist/_chunks/{trash-2-rPAKaRgB.js → trash-2-uumy3fy1.js} +3 -3
- package/dist/_chunks/{triangle-alert-CBPUIzQo.js → triangle-alert-CBnO6nq_.js} +3 -3
- package/dist/_chunks/{unit-converter-CwlZbfdn.js → unit-converter-fEqluT8b.js} +5 -5
- package/dist/_chunks/{use-password-requirements-BXvS2MBS.js → use-password-requirements-Bwtqx1qN.js} +7 -7
- package/dist/_chunks/{user-CPxpqFjJ.js → user-B12p7bVF.js} +3 -3
- package/dist/_chunks/{user-cog-BS_qc8nA.js → user-cog-BTn98Arm.js} +3 -3
- package/dist/_chunks/{users-MBVtUzwd.js → users-BjS_Gg1E.js} +3 -3
- package/dist/_chunks/{video-BAeICxCT.js → video-BheNGvsu.js} +3 -3
- package/dist/_chunks/{warning-stack--sTrrBDA.js → warning-stack-BaMI7-n7.js} +4 -4
- package/dist/_chunks/{workflow-map-M8MBBHQm.js → workflow-map-qWsgCldq.js} +146 -146
- package/dist/_chunks/{x-CCcI3eJp.js → x-B5YnXwCz.js} +3 -3
- package/dist/_chunks/{zh-CN-B-igM5gY.js → zh-CN-BncsTBwM.js} +3 -3
- package/dist/_chunks/{zoom-out-CgVtf2Wx.js → zoom-out-Dnif4kJx.js} +4 -4
- package/dist/agent-catalog.json +1473 -317
- package/dist/agent-i18n/en.json +107 -15
- package/dist/components/accordion/index.js +1 -1
- package/dist/components/address-autocomplete/index.js +1 -1
- package/dist/components/address-fields/index.js +1 -1
- package/dist/components/agenda-card/index.js +1 -1
- package/dist/components/agenda-tray/index.js +1 -1
- package/dist/components/ai-consent-banner/index.js +1 -1
- package/dist/components/ai-prompt-input/index.js +1 -1
- package/dist/components/alert/index.js +1 -1
- package/dist/components/anamnesis-card/index.js +1 -1
- package/dist/components/annotation-marker/annotation-marker.d.ts +1 -1
- package/dist/components/appointment-card/index.js +2 -2
- package/dist/components/appointment-timeline/index.js +1 -1
- package/dist/components/audio-recorder/index.js +1 -1
- package/dist/components/bishop-score/index.js +1 -1
- package/dist/components/bmi-calculator/index.js +1 -1
- package/dist/components/booking/index.js +1 -1
- package/dist/components/breadcrumb/index.js +1 -1
- package/dist/components/calculator-dialog/index.js +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/care-plan-card/index.js +1 -1
- package/dist/components/care-plan-entry-card/index.js +1 -1
- package/dist/components/care-plan-header/index.js +1 -1
- package/dist/components/carousel/index.js +1 -1
- package/dist/components/chat-container/index.js +1 -1
- package/dist/components/chat-input/index.js +1 -1
- package/dist/components/chat-message/chat-message.d.ts +1 -1
- package/dist/components/chat-message/index.js +1 -1
- package/dist/components/checkbox-group/index.js +1 -1
- package/dist/components/city-input/index.js +1 -1
- package/dist/components/clinical-note-card/index.js +1 -1
- package/dist/components/color-picker/index.js +1 -1
- package/dist/components/combobox/index.js +1 -1
- package/dist/components/command-palette/index.js +1 -1
- package/dist/components/connection-status/index.js +1 -1
- package/dist/components/contact-card/index.js +1 -1
- package/dist/components/contact-profile-card/index.js +1 -1
- package/dist/components/control-room-rail/index.js +1 -1
- package/dist/components/copy-field/index.js +1 -1
- package/dist/components/country-select/index.js +1 -1
- package/dist/components/cycle-calculator/index.js +1 -1
- package/dist/components/data-table/index.js +2 -2
- package/dist/components/date-picker/index.js +1 -1
- package/dist/components/date-range-picker/index.js +1 -1
- package/dist/components/date-time-picker/index.js +1 -1
- package/dist/components/dependent-selector/index.js +1 -1
- package/dist/components/description-list/index.js +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/document-scanner/index.js +1 -1
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/due-date-calculator/index.js +2 -2
- package/dist/components/editor-overlay/index.js +1 -1
- package/dist/components/email-input/index.js +1 -1
- package/dist/components/entity-summary/index.js +1 -1
- package/dist/components/face-scheme/detect-face-landmarks.d.ts +26 -0
- package/dist/components/face-scheme/detect-face-yunet.d.ts +28 -0
- package/dist/components/face-scheme/face-scheme-data.d.ts +113 -0
- package/dist/components/face-scheme/face-scheme-zones.d.ts +11 -0
- package/dist/components/face-scheme/face-scheme.agent.d.ts +4 -0
- package/dist/components/face-scheme/face-scheme.d.ts +144 -0
- package/dist/components/face-scheme/index.d.ts +7 -0
- package/dist/components/face-scheme/index.js +17 -0
- package/dist/components/fetal-weight/index.js +1 -1
- package/dist/components/field-array/index.js +1 -1
- package/dist/components/file-upload/index.js +1 -1
- package/dist/components/finished-terminal/index.js +1 -1
- package/dist/components/fiscal-code-input/index.js +1 -1
- package/dist/components/form-field/index.js +1 -1
- package/dist/components/freemium-paywall/index.js +1 -1
- package/dist/components/gestational-age-calculator/index.js +1 -1
- package/dist/components/hcg-doubling/index.js +1 -1
- package/dist/components/header/index.js +1 -1
- package/dist/components/header-settings/index.js +1 -1
- package/dist/components/iban-input/index.js +1 -1
- package/dist/components/icon-picker/index.js +1 -1
- package/dist/components/image-cropper/index.js +1 -1
- package/dist/components/index.d.ts +3 -1
- package/dist/components/key-value-pair/index.js +1 -1
- package/dist/components/link/index.js +1 -1
- package/dist/components/locale-picker/index.js +1 -1
- package/dist/components/map-view/index.js +1 -1
- package/dist/components/message-card/index.js +1 -1
- package/dist/components/message-tray/index.js +1 -1
- package/dist/components/multi-select/index.js +1 -1
- package/dist/components/muscle-scheme/index.d.ts +6 -0
- package/dist/components/muscle-scheme/index.js +16 -0
- package/dist/components/{anatomy-scheme/anatomy-muscle-paths.d.ts → muscle-scheme/muscle-paths.d.ts} +3 -1
- package/dist/components/muscle-scheme/muscle-scheme-data.d.ts +107 -0
- package/dist/components/muscle-scheme/muscle-scheme.agent.d.ts +6 -0
- package/dist/components/{anatomy-scheme/anatomy-scheme.d.ts → muscle-scheme/muscle-scheme.d.ts} +24 -27
- package/dist/components/nav-grid/index.js +1 -1
- package/dist/components/navigation-menu/index.js +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notification-card/index.js +1 -1
- package/dist/components/notification-tray/index.js +1 -1
- package/dist/components/number-input/index.js +1 -1
- package/dist/components/operator-hero/index.js +1 -1
- package/dist/components/optical-prescription/index.d.ts +6 -0
- package/dist/components/optical-prescription/index.js +38 -0
- package/dist/components/optical-prescription/optical-prescription-data.d.ts +106 -0
- package/dist/components/optical-prescription/optical-prescription.agent.d.ts +6 -0
- package/dist/components/optical-prescription/optical-prescription.d.ts +43 -0
- package/dist/components/pagination/index.js +1 -1
- package/dist/components/password-input/index.js +1 -1
- package/dist/components/patient-details/index.js +1 -1
- package/dist/components/patient-search/index.js +1 -1
- package/dist/components/patient-summary-card/index.js +1 -1
- package/dist/components/patient-table/index.js +1 -1
- package/dist/components/payment-card/index.js +1 -1
- package/dist/components/payment-form/index.js +1 -1
- package/dist/components/pdf-viewer/index.js +1 -1
- package/dist/components/periodontal-chart-card/index.js +1 -1
- package/dist/components/permission-matrix/index.js +1 -1
- package/dist/components/phone-input/index.js +1 -1
- package/dist/components/popover/index.js +1 -1
- package/dist/components/postal-code-input/index.js +1 -1
- package/dist/components/practice-results/index.js +1 -1
- package/dist/components/pregnancy-dating/index.js +1 -1
- package/dist/components/pregnancy-weight-gain/index.js +1 -1
- package/dist/components/privacy-lock/index.js +1 -1
- package/dist/components/product-hub-tray/index.js +1 -1
- package/dist/components/province-select/index.js +1 -1
- package/dist/components/public-footer/index.js +1 -1
- package/dist/components/public-header/index.js +1 -1
- package/dist/components/radio-group/index.js +1 -1
- package/dist/components/radiograph-panel/index.js +1 -1
- package/dist/components/rating/index.js +1 -1
- package/dist/components/reviews-panel/index.js +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/search-bar/index.js +1 -1
- package/dist/components/search-input/index.js +1 -1
- package/dist/components/select/index.js +1 -1
- package/dist/components/session-countdown/index.js +1 -1
- package/dist/components/sheet/index.js +1 -1
- package/dist/components/sidebar/index.js +1 -1
- package/dist/components/sign-document/index.js +1 -1
- package/dist/components/signature-field/index.js +1 -1
- package/dist/components/smart-date/index.js +1 -1
- package/dist/components/stepper-accordion/index.js +1 -1
- package/dist/components/streaming-text/index.js +1 -1
- package/dist/components/tab-bar/index.js +1 -1
- package/dist/components/tabs/index.js +1 -1
- package/dist/components/tag/index.js +1 -1
- package/dist/components/task-card/index.js +1 -1
- package/dist/components/task-tray/index.js +1 -1
- package/dist/components/tasks-panel/index.js +1 -1
- package/dist/components/text-input/index.js +1 -1
- package/dist/components/theme-toggle/index.js +1 -1
- package/dist/components/timeline/index.js +1 -1
- package/dist/components/toast/index.js +1 -1
- package/dist/components/token-insert-menu/index.js +1 -1
- package/dist/components/tooth-scheme/index.js +1 -1
- package/dist/components/transaction-chip/index.js +1 -1
- package/dist/components/transcript-panel/index.js +1 -1
- package/dist/components/unit-converter/index.js +1 -1
- package/dist/components/warning-stack/index.js +1 -1
- package/dist/components/workflow/index.js +1 -1
- package/dist/i18n/locales/ar.d.ts +139 -98
- package/dist/i18n/locales/ar.js +141 -107
- package/dist/i18n/locales/de.d.ts +139 -98
- package/dist/i18n/locales/de.js +141 -107
- package/dist/i18n/locales/el.d.ts +139 -98
- package/dist/i18n/locales/el.js +141 -107
- package/dist/i18n/locales/en.d.ts +139 -98
- package/dist/i18n/locales/en.js +141 -107
- package/dist/i18n/locales/es.d.ts +139 -98
- package/dist/i18n/locales/es.js +141 -107
- package/dist/i18n/locales/fr.d.ts +139 -98
- package/dist/i18n/locales/fr.js +141 -107
- package/dist/i18n/locales/hi.d.ts +139 -98
- package/dist/i18n/locales/hi.js +141 -107
- package/dist/i18n/locales/it.d.ts +139 -98
- package/dist/i18n/locales/it.js +141 -107
- package/dist/i18n/locales/ja.d.ts +139 -98
- package/dist/i18n/locales/ja.js +141 -107
- package/dist/i18n/locales/nl.d.ts +139 -98
- package/dist/i18n/locales/nl.js +141 -107
- package/dist/i18n/locales/pl.d.ts +139 -98
- package/dist/i18n/locales/pl.js +141 -107
- package/dist/i18n/locales/pt.d.ts +139 -98
- package/dist/i18n/locales/pt.js +141 -107
- package/dist/i18n/locales/ro.d.ts +139 -98
- package/dist/i18n/locales/ro.js +141 -107
- package/dist/i18n/locales/ru.d.ts +139 -98
- package/dist/i18n/locales/ru.js +141 -107
- package/dist/i18n/locales/sq.d.ts +139 -98
- package/dist/i18n/locales/sq.js +141 -107
- package/dist/i18n/locales/sv.d.ts +139 -98
- package/dist/i18n/locales/sv.js +141 -107
- package/dist/i18n/locales/tr.d.ts +139 -98
- package/dist/i18n/locales/tr.js +141 -107
- package/dist/i18n/locales/zh.d.ts +139 -98
- package/dist/i18n/locales/zh.js +141 -107
- package/dist/index.js +710 -662
- package/dist/locales/ar.json +141 -100
- package/dist/locales/de.json +141 -100
- package/dist/locales/el.json +141 -100
- package/dist/locales/en.json +141 -100
- package/dist/locales/es.json +141 -100
- package/dist/locales/fr.json +141 -100
- package/dist/locales/hi.json +141 -100
- package/dist/locales/it.json +141 -100
- package/dist/locales/ja.json +141 -100
- package/dist/locales/nl.json +141 -100
- package/dist/locales/pl.json +141 -100
- package/dist/locales/pt.json +141 -100
- package/dist/locales/ro.json +141 -100
- package/dist/locales/ru.json +141 -100
- package/dist/locales/sq.json +141 -100
- package/dist/locales/sv.json +141 -100
- package/dist/locales/tr.json +141 -100
- package/dist/locales/zh.json +141 -100
- package/dist/patterns/alia-assistant/alia-asteroid-icon.d.ts +18 -0
- package/dist/patterns/alia-assistant/index.js +1 -1
- package/dist/patterns/marketplace-app-shell/index.js +1 -1
- package/dist/patterns/patient-shell/index.js +1 -1
- package/dist/tokens.css +7 -1
- package/package.json +13 -5
- package/dist/_chunks/calendar-B6soK1Yb.js +0 -17
- package/dist/_chunks/clipboard-list-S7s-MXQq.js +0 -25
- package/dist/_chunks/list-checks-BUs75d_o.js +0 -18
- package/dist/_chunks/sparkles-CuYXqQLg.js +0 -23
- package/dist/_chunks/subDays-BcYv1Lxi.js +0 -8
- package/dist/components/anatomy-scheme/anatomy-face-paths.d.ts +0 -15
- package/dist/components/anatomy-scheme/anatomy-scheme-data.d.ts +0 -121
- package/dist/components/anatomy-scheme/anatomy-scheme.agent.d.ts +0 -6
- package/dist/components/anatomy-scheme/index.d.ts +0 -6
- package/dist/components/anatomy-scheme/index.js +0 -17
|
@@ -0,0 +1,1450 @@
|
|
|
1
|
+
import { jsxs as T, jsx as g } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as At, useId as Tt, useRef as _, useState as X, useCallback as k, useMemo as nt, useEffect as Ie, useImperativeHandle as _t } from "react";
|
|
3
|
+
import * as ae from "@radix-ui/react-tooltip";
|
|
4
|
+
import { c as It } from "./index-D2ZczOXr.js";
|
|
5
|
+
import { useTranslation as Zt } from "react-i18next";
|
|
6
|
+
import { u as Ot } from "./registry-DvAUVLHh.js";
|
|
7
|
+
import { m as jt, A as $t } from "./annotation-marker-qt5R9WZX.js";
|
|
8
|
+
import { B as ie } from "./button-DD_0Xdmr.js";
|
|
9
|
+
import { S as zt } from "./slider-DN1CWkKB.js";
|
|
10
|
+
import { R as Dt } from "./radio-TWf9Q-mp.js";
|
|
11
|
+
import { R as Pt } from "./radio-group-CI-6SmSw.js";
|
|
12
|
+
const se = {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "Face-zone id (e.g. 'glabella', 'nasolabialFold', 'forehead', 'mandibularAngleLeft' on the front view; 'cheekbone', 'masseter', 'chin' on a profile view)."
|
|
15
|
+
}, Ut = {
|
|
16
|
+
type: "string",
|
|
17
|
+
enum: ["front", "profile-left", "profile-right"],
|
|
18
|
+
description: "Active view id: 'front', 'profile-left', or 'profile-right'."
|
|
19
|
+
}, ve = {
|
|
20
|
+
enum: ["observation", "treatment", "concern", "note"]
|
|
21
|
+
}, Bt = {
|
|
22
|
+
id: "face-scheme",
|
|
23
|
+
// pick — focus a zone (transient); set_value / edit_inline — record / clear
|
|
24
|
+
// findings on a zone; view_change — switch the active view (front / left /
|
|
25
|
+
// right profile), since each view renders a different zone set. Registration
|
|
26
|
+
// (the photo fit) is exposed only as the auto-align action.
|
|
27
|
+
capabilities: ["pick", "set_value", "edit_inline", "view_change"],
|
|
28
|
+
state: {
|
|
29
|
+
activeView: {
|
|
30
|
+
// Which view is mounted — it determines which zones are in the DOM, so an
|
|
31
|
+
// agent must read this before focus_zone on a profile-only zone.
|
|
32
|
+
type: "string",
|
|
33
|
+
descriptionKey: "ui.agent.faceScheme.state.activeView",
|
|
34
|
+
description: "Id of the currently displayed view (front / profile-left / profile-right).",
|
|
35
|
+
read: (t) => t.getView()
|
|
36
|
+
},
|
|
37
|
+
chart: {
|
|
38
|
+
// A9: identifiers + finding ENUMS only — never the free-text finding
|
|
39
|
+
// `note` (PHI) and never the patient-photo `src`. Notes are written but
|
|
40
|
+
// never read back through the snapshot.
|
|
41
|
+
type: "Record<string, string[]>",
|
|
42
|
+
descriptionKey: "ui.agent.faceScheme.state.chart",
|
|
43
|
+
description: "Current face chart — the finding types recorded on each zone, keyed by zone id. Free-text notes and the patient photo are not exposed here.",
|
|
44
|
+
read: (t) => Object.fromEntries(
|
|
45
|
+
Object.entries(t.getChart()).map(([n, c]) => [
|
|
46
|
+
n,
|
|
47
|
+
c.map((o) => o.type)
|
|
48
|
+
])
|
|
49
|
+
)
|
|
50
|
+
},
|
|
51
|
+
markedZones: {
|
|
52
|
+
type: "string[]",
|
|
53
|
+
descriptionKey: "ui.agent.faceScheme.state.markedZones",
|
|
54
|
+
description: "Zone ids carrying at least one finding.",
|
|
55
|
+
read: (t) => Object.keys(t.getChart())
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
actions: {
|
|
59
|
+
focus_zone: {
|
|
60
|
+
safety: "read",
|
|
61
|
+
argsType: "{ id: string }",
|
|
62
|
+
argsSchema: {
|
|
63
|
+
type: "object",
|
|
64
|
+
properties: { id: se },
|
|
65
|
+
required: ["id"]
|
|
66
|
+
},
|
|
67
|
+
idempotent: !0,
|
|
68
|
+
descriptionKey: "ui.agent.faceScheme.actions.focusZone",
|
|
69
|
+
description: "Move focus to a specific face zone by id.",
|
|
70
|
+
invoke: (t, n) => {
|
|
71
|
+
t.focusZone(n.id);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
get_zone: {
|
|
75
|
+
safety: "read",
|
|
76
|
+
argsType: "{ id: string }",
|
|
77
|
+
argsSchema: {
|
|
78
|
+
type: "object",
|
|
79
|
+
properties: { id: se },
|
|
80
|
+
required: ["id"]
|
|
81
|
+
},
|
|
82
|
+
returns: "string[]",
|
|
83
|
+
returnsSchema: { type: "array", items: ve },
|
|
84
|
+
idempotent: !0,
|
|
85
|
+
descriptionKey: "ui.agent.faceScheme.actions.getZone",
|
|
86
|
+
description: "Read the finding types recorded on one zone (notes are not returned).",
|
|
87
|
+
invoke: (t, n) => t.getZone(n.id).map((c) => c.type)
|
|
88
|
+
},
|
|
89
|
+
zones_with: {
|
|
90
|
+
safety: "read",
|
|
91
|
+
argsType: "{ finding: FaceFindingType }",
|
|
92
|
+
argsSchema: {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: { finding: ve },
|
|
95
|
+
required: ["finding"]
|
|
96
|
+
},
|
|
97
|
+
returns: "string[]",
|
|
98
|
+
returnsSchema: { type: "array", items: se },
|
|
99
|
+
idempotent: !0,
|
|
100
|
+
descriptionKey: "ui.agent.faceScheme.actions.zonesWith",
|
|
101
|
+
description: "List the zone ids carrying a given finding type.",
|
|
102
|
+
invoke: (t, n) => t.zonesWith(n.finding)
|
|
103
|
+
},
|
|
104
|
+
set_finding: {
|
|
105
|
+
safety: "write",
|
|
106
|
+
argsType: "{ id: string; finding: FaceFindingType; note?: string }",
|
|
107
|
+
argsSchema: {
|
|
108
|
+
type: "object",
|
|
109
|
+
properties: {
|
|
110
|
+
id: se,
|
|
111
|
+
finding: ve,
|
|
112
|
+
note: { type: "string" }
|
|
113
|
+
},
|
|
114
|
+
required: ["id", "finding"]
|
|
115
|
+
},
|
|
116
|
+
idempotent: !0,
|
|
117
|
+
descriptionKey: "ui.agent.faceScheme.actions.setFinding",
|
|
118
|
+
description: "Record a finding on a zone, with an optional free-text note.",
|
|
119
|
+
invoke: (t, n) => {
|
|
120
|
+
t.setFinding(n.id, n.finding, n.note);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
remove_finding: {
|
|
124
|
+
safety: "write",
|
|
125
|
+
argsType: "{ id: string; finding: FaceFindingType }",
|
|
126
|
+
argsSchema: {
|
|
127
|
+
type: "object",
|
|
128
|
+
properties: { id: se, finding: ve },
|
|
129
|
+
required: ["id", "finding"]
|
|
130
|
+
},
|
|
131
|
+
idempotent: !0,
|
|
132
|
+
descriptionKey: "ui.agent.faceScheme.actions.removeFinding",
|
|
133
|
+
description: "Remove a single finding from a zone.",
|
|
134
|
+
invoke: (t, n) => {
|
|
135
|
+
t.removeFinding(n.id, n.finding);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
clear_zone: {
|
|
139
|
+
safety: "destructive",
|
|
140
|
+
argsType: "{ id: string }",
|
|
141
|
+
argsSchema: {
|
|
142
|
+
type: "object",
|
|
143
|
+
properties: { id: se },
|
|
144
|
+
required: ["id"]
|
|
145
|
+
},
|
|
146
|
+
idempotent: !0,
|
|
147
|
+
descriptionKey: "ui.agent.faceScheme.actions.clearZone",
|
|
148
|
+
description: "Clear every finding from a zone.",
|
|
149
|
+
invoke: (t, n) => {
|
|
150
|
+
t.clearZone(n.id);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
auto_align: {
|
|
154
|
+
safety: "write",
|
|
155
|
+
argsType: "{}",
|
|
156
|
+
argsSchema: { type: "object", properties: {} },
|
|
157
|
+
idempotent: !0,
|
|
158
|
+
descriptionKey: "ui.agent.faceScheme.actions.autoAlign",
|
|
159
|
+
description: "Run the on-device detector to align the zone overlay to the patient photo (works on the active view — front or profile). No-op if detection is disabled or no face is found.",
|
|
160
|
+
invoke: (t) => {
|
|
161
|
+
t.detect();
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
set_view: {
|
|
165
|
+
safety: "write",
|
|
166
|
+
argsType: "{ view: FaceViewId }",
|
|
167
|
+
argsSchema: {
|
|
168
|
+
type: "object",
|
|
169
|
+
properties: { view: Ut },
|
|
170
|
+
required: ["view"]
|
|
171
|
+
},
|
|
172
|
+
idempotent: !0,
|
|
173
|
+
descriptionKey: "ui.agent.faceScheme.actions.setView",
|
|
174
|
+
description: "Switch the active view ('front' / 'profile-left' / 'profile-right'). Each view renders a different zone set, so switch before focusing a zone that belongs to another view.",
|
|
175
|
+
invoke: (t, n) => {
|
|
176
|
+
t.setView(n.view);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
domHooks: {
|
|
181
|
+
root: { attr: "data-component", value: "face-scheme" },
|
|
182
|
+
instanceId: {
|
|
183
|
+
attr: "data-component-id",
|
|
184
|
+
sourceProp: "id",
|
|
185
|
+
description: "Sourced from the id prop."
|
|
186
|
+
},
|
|
187
|
+
item: {
|
|
188
|
+
attr: "data-zone",
|
|
189
|
+
description: "Each clickable zone `<g>` carries its zone id as `data-zone` (plus `data-side` for the anatomical side). The root `<div>` carries the active view id as `data-view` — only the zones for the active view are in the DOM."
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, Wt = "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.18/vision_bundle.mjs", Vt = "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.18/wasm", Yt = "https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task", Ht = {
|
|
193
|
+
"right-eye": [33, 133],
|
|
194
|
+
// subject's right eye, outer + inner corners
|
|
195
|
+
"left-eye": [263, 362],
|
|
196
|
+
// subject's left eye, outer + inner corners
|
|
197
|
+
"nose-tip": [1],
|
|
198
|
+
chin: [152],
|
|
199
|
+
// Midline cephalometric points — the profile views fit on these (the detector
|
|
200
|
+
// tracks them on a side profile even though the contralateral side is
|
|
201
|
+
// occluded). The front view ignores ids it has no landmark for.
|
|
202
|
+
nasion: [168],
|
|
203
|
+
// bridge of the nose, between the brows
|
|
204
|
+
subnasale: [2]
|
|
205
|
+
// base of the nose / top of the philtrum
|
|
206
|
+
}, Ze = /* @__PURE__ */ new Map();
|
|
207
|
+
function Xt(t, n, c, o) {
|
|
208
|
+
const d = `${t}|${n}|${c}`, s = Ze.get(d);
|
|
209
|
+
if (s) return s;
|
|
210
|
+
o == null || o("loading");
|
|
211
|
+
const u = (async () => {
|
|
212
|
+
const l = await import(
|
|
213
|
+
/* @vite-ignore */
|
|
214
|
+
t
|
|
215
|
+
), f = await l.FilesetResolver.forVisionTasks(n);
|
|
216
|
+
return l.FaceLandmarker.createFromOptions(f, {
|
|
217
|
+
baseOptions: { modelAssetPath: c, delegate: "GPU" },
|
|
218
|
+
runningMode: "IMAGE",
|
|
219
|
+
numFaces: 1
|
|
220
|
+
});
|
|
221
|
+
})();
|
|
222
|
+
return Ze.set(d, u), u.catch(() => Ze.delete(d)), u;
|
|
223
|
+
}
|
|
224
|
+
function qt(t) {
|
|
225
|
+
const n = new Image();
|
|
226
|
+
return n.crossOrigin = "anonymous", n.src = t, n.decode().then(() => n);
|
|
227
|
+
}
|
|
228
|
+
async function Gt(t, n) {
|
|
229
|
+
if (typeof window > "u" || typeof Image > "u")
|
|
230
|
+
throw new Error("detectFaceLandmarks runs in the browser only.");
|
|
231
|
+
const {
|
|
232
|
+
viewWidth: c,
|
|
233
|
+
viewHeight: o,
|
|
234
|
+
visionModuleUrl: d = Wt,
|
|
235
|
+
wasmBaseUrl: s = Vt,
|
|
236
|
+
modelAssetPath: u = Yt,
|
|
237
|
+
onStage: l
|
|
238
|
+
} = n, [f, m] = await Promise.all([
|
|
239
|
+
qt(t),
|
|
240
|
+
Xt(d, s, u, l)
|
|
241
|
+
]);
|
|
242
|
+
l == null || l("detecting");
|
|
243
|
+
const x = m.detect(f).faceLandmarks[0];
|
|
244
|
+
if (!x || x.length === 0) return null;
|
|
245
|
+
const y = f.naturalWidth || f.width, C = f.naturalHeight || f.height, p = Math.max(c / y, o / C), N = (c - y * p) / 2, z = (o - C * p) / 2, K = (E) => ({
|
|
246
|
+
x: N + E.x * y * p,
|
|
247
|
+
y: z + E.y * C * p
|
|
248
|
+
}), R = [];
|
|
249
|
+
for (const [E, I] of Object.entries(Ht)) {
|
|
250
|
+
let Z = 0, V = 0, D = 0;
|
|
251
|
+
for (const q of I) {
|
|
252
|
+
const Y = x[q];
|
|
253
|
+
if (!Y) continue;
|
|
254
|
+
const h = K(Y);
|
|
255
|
+
Z += h.x, V += h.y, D++;
|
|
256
|
+
}
|
|
257
|
+
D > 0 && R.push({ id: E, photo: { x: Z / D, y: V / D } });
|
|
258
|
+
}
|
|
259
|
+
return R.length >= 3 ? R : null;
|
|
260
|
+
}
|
|
261
|
+
const Jt = "https://cdn.jsdelivr.net/npm/onnxruntime-web@1.19.2/dist/ort.min.mjs", Qt = "https://cdn.jsdelivr.net/npm/onnxruntime-web@1.19.2/dist/", L = 640, en = [8, 16, 32], tn = [
|
|
262
|
+
"right-eye",
|
|
263
|
+
"left-eye",
|
|
264
|
+
"nose-tip",
|
|
265
|
+
"mouth-right",
|
|
266
|
+
"mouth-left"
|
|
267
|
+
], Oe = /* @__PURE__ */ new Map();
|
|
268
|
+
async function nn(t, n, c, o) {
|
|
269
|
+
const d = `${t}|${n}|${c}`, s = Oe.get(d);
|
|
270
|
+
if (s) return s;
|
|
271
|
+
o == null || o("loading");
|
|
272
|
+
const u = (async () => {
|
|
273
|
+
const l = await import(
|
|
274
|
+
/* @vite-ignore */
|
|
275
|
+
t
|
|
276
|
+
);
|
|
277
|
+
l.env.wasm.wasmPaths = n, l.env.wasm.numThreads = 1, l.env.logLevel = "error";
|
|
278
|
+
const f = new Uint8Array(await (await fetch(c)).arrayBuffer()), m = await l.InferenceSession.create(f, {
|
|
279
|
+
executionProviders: ["wasm"]
|
|
280
|
+
});
|
|
281
|
+
return { ort: l, session: m };
|
|
282
|
+
})();
|
|
283
|
+
return Oe.set(d, u), u.catch(() => Oe.delete(d)), u;
|
|
284
|
+
}
|
|
285
|
+
function rn(t) {
|
|
286
|
+
const n = new Image();
|
|
287
|
+
return n.crossOrigin = "anonymous", n.src = t, n.decode().then(() => n);
|
|
288
|
+
}
|
|
289
|
+
async function an() {
|
|
290
|
+
return (await import("./face_detection_yunet_2023mar-BnsRs4bD.js")).default;
|
|
291
|
+
}
|
|
292
|
+
function sn(t, n) {
|
|
293
|
+
const c = n.naturalWidth || n.width, o = n.naturalHeight || n.height, d = Math.min(L / c, L / o), s = Math.round(c * d), u = Math.round(o * d), l = Math.floor((L - s) / 2), f = Math.floor((L - u) / 2), m = document.createElement("canvas");
|
|
294
|
+
m.width = L, m.height = L;
|
|
295
|
+
const w = m.getContext("2d");
|
|
296
|
+
if (!w) throw new Error("2D canvas context unavailable.");
|
|
297
|
+
w.fillRect(0, 0, L, L), w.drawImage(n, l, f, s, u);
|
|
298
|
+
const { data: x } = w.getImageData(0, 0, L, L), y = L * L, C = new Float32Array(3 * y);
|
|
299
|
+
for (let p = 0; p < y; p++)
|
|
300
|
+
C[p] = x[p * 4 + 2], C[y + p] = x[p * 4 + 1], C[2 * y + p] = x[p * 4];
|
|
301
|
+
return {
|
|
302
|
+
tensor: new t("float32", C, [1, 3, L, L]),
|
|
303
|
+
scale: d,
|
|
304
|
+
padX: l,
|
|
305
|
+
padY: f
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const rt = (t) => 1 / (1 + Math.exp(-t));
|
|
309
|
+
function cn(t, n) {
|
|
310
|
+
let c = !1;
|
|
311
|
+
const o = t.cls_8.data;
|
|
312
|
+
for (let s = 0; s < Math.min(o.length, 256); s++)
|
|
313
|
+
if (o[s] < 0 || o[s] > 1) {
|
|
314
|
+
c = !0;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
let d = null;
|
|
318
|
+
for (const s of en) {
|
|
319
|
+
const u = t[`cls_${s}`].data, l = t[`obj_${s}`].data, f = t[`kps_${s}`].data, m = L / s, w = L / s, x = m * w;
|
|
320
|
+
for (let y = 0; y < x; y++) {
|
|
321
|
+
let C = u[y], p = l[y];
|
|
322
|
+
c && (C = rt(C), p = rt(p)), C = Math.min(Math.max(C, 0), 1), p = Math.min(Math.max(p, 0), 1);
|
|
323
|
+
const N = Math.sqrt(C * p);
|
|
324
|
+
if (N < n || d && N <= d.score) continue;
|
|
325
|
+
const z = y % m, K = Math.floor(y / m), R = [];
|
|
326
|
+
for (let E = 0; E < 5; E++)
|
|
327
|
+
R.push([
|
|
328
|
+
(z + f[y * 10 + 2 * E]) * s,
|
|
329
|
+
(K + f[y * 10 + 2 * E + 1]) * s
|
|
330
|
+
]);
|
|
331
|
+
d = { score: N, keypoints: R };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return d;
|
|
335
|
+
}
|
|
336
|
+
async function on(t, n) {
|
|
337
|
+
if (typeof window > "u" || typeof Image > "u")
|
|
338
|
+
throw new Error("detectFaceYuNet runs in the browser only.");
|
|
339
|
+
const {
|
|
340
|
+
viewWidth: c,
|
|
341
|
+
viewHeight: o,
|
|
342
|
+
ortModuleUrl: d = Jt,
|
|
343
|
+
ortWasmBaseUrl: s = Qt,
|
|
344
|
+
modelUrl: u = await an(),
|
|
345
|
+
scoreThreshold: l = 0.6,
|
|
346
|
+
onStage: f
|
|
347
|
+
} = n, [m, { ort: w, session: x }] = await Promise.all([
|
|
348
|
+
rn(t),
|
|
349
|
+
nn(d, s, u, f)
|
|
350
|
+
]);
|
|
351
|
+
f == null || f("detecting");
|
|
352
|
+
const { tensor: y, scale: C, padX: p, padY: N } = sn(w.Tensor, m), z = await x.run({ [x.inputNames[0]]: y }), K = cn(z, l);
|
|
353
|
+
if (!K) return null;
|
|
354
|
+
const R = m.naturalWidth || m.width, E = m.naturalHeight || m.height, I = Math.max(c / R, o / E), Z = (c - R * I) / 2, V = (o - E * I) / 2;
|
|
355
|
+
return K.keypoints.map(([D, q], Y) => {
|
|
356
|
+
const h = (D - p) / C, ce = (q - N) / C;
|
|
357
|
+
return {
|
|
358
|
+
id: tn[Y],
|
|
359
|
+
photo: {
|
|
360
|
+
x: Z + h * I,
|
|
361
|
+
y: V + ce * I
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const je = "0 0 808 944", $e = { x: 404, y: 472 }, ut = {
|
|
367
|
+
id: "faceContour",
|
|
368
|
+
labelKey: "faceContour",
|
|
369
|
+
d: "M688.38,439.4c-9.78,0-15.37,4.04-17.86,6.47,1.31-10.99,2.5-20.62,3.49-28.2,7.55-57.89,5.03-94.39,5.03-94.39-15.15-165.92-111.73-221.46-186.21-239.39h0s-.1-.02-.1-.02c-6.18-1.49-12.21-2.72-18.02-3.73l-.96-.2c-46.02-9.51-93.5-9.51-139.52,0l-.95.2c-5.82,1.01-11.85,2.24-18.04,3.73l-.08.02h0c-74.48,17.94-171.06,73.48-186.21,239.39,0,0-2.52,36.5,5.03,94.39,1,7.68,2.2,17.45,3.53,28.61-2.25-2.35-7.91-6.88-18.26-6.88-13.97,0-29.06,16.21-20.12,63.71,8.94,47.5,17.3,80.48,18.43,97.24,1.11,16.47,24.08,47.91,41.43,38.23.9,8.33,1.42,13.17,1.42,13.17,0,0,8.81,59.15,56.63,104.46,12.62,11.95,25.84,23.46,38.49,33.94,7.14-4.56,24-16.96,29.06-35.21.9-3.24,1.73-6.33,2.52-9.29,2.46-9.17,4.59-17.1,7.4-24.46,3.44-9.01,7.62-16.28,13.25-23.04-47.54-46.57-49.82-89.3-48.75-104.93-21.75-2.47-38.06-19.4-47.37-49.37-7.27-23.39-7.77-46.39-7.79-47.36-.02-1.34.43-2.57,1.21-3.54-.47-2.21-.65-3.58-.67-3.77-.28-2.23.97-4.38,3.05-5.24.34-.14.69-.23,1.04-.29.47-3.26,2.23-10.86,8.8-18.21,10.82-12.11,28.95-17.92,53.93-17.22,41.5,1.13,55.11,17.49,59.58,28.15,1.45.85,2.49,2.34,2.68,4.14,0,.05.02.21.05.45.22.48.36,1,.42,1.56.04.41.34,3.71.16,8.68.17,6.11.1,14.39-.75,23.68-.27,2.9-.6,5.73-.98,8.49,4.1-9.94,7.68-20.29,11.15-30.32l.31-.89-10.84-54.18c-2.15-3.39-8.76-12.5-21.75-19.51-21.63-11.68-51.16-12.3-85.4-1.8-2.58.79-5.32-.61-6.19-3.16l-53.03-154.45c-.88-1.09-1.31-2.52-1.05-4.01.26-1.43,6.68-35.35,39.46-69.52,19.15-19.96,43.37-35.84,72.01-47.21,35.3-14.02,77.45-21.18,125.28-21.27h0s.98,0,.98,0c47.83.1,89.98,7.25,125.28,21.27,28.63,11.37,52.86,27.26,72.01,47.21,30.62,31.92,38.24,63.61,39.32,68.82.29.8.42,1.35.47,1.59.17.87.11,1.77-.17,2.61l-53.21,154.96c-.88,2.55-3.62,3.95-6.19,3.16-34.24-10.5-63.77-9.88-85.4,1.8-11.42,6.17-17.92,13.96-20.78,18.06l-11.25,56.25.04.11c2.95,8.52,5.98,17.28,9.34,25.81-.14-1.26-.28-2.53-.4-3.82-.53-5.79-.75-11.19-.81-15.92-1.11-9.09-.51-15.85-.45-16.44.11-1.1.59-2.08,1.3-2.85.19-.72.52-1.37.96-1.94,3.86-10.54,16.77-28.3,60.04-29.48,24.93-.69,43.04,5.1,53.85,17.2,6.53,7.3,8.3,14.85,8.78,18.13.53.04,1.05.16,1.56.37,2.08.86,3.32,3.01,3.05,5.24-.02.14-.12.93-.37,2.25,1.7.96,2.84,2.8,2.8,4.89-.02.97-.52,23.97-7.79,47.36-8.99,28.91-24.49,45.69-45.11,49.05,1.16,15.29-.68,58.78-49.42,106.1,5.35,6.56,9.36,13.63,12.68,22.33,2.81,7.36,4.94,15.28,7.4,24.45.79,2.96,1.62,6.05,2.52,9.29,5.07,18.28,21.97,30.69,29.09,35.23,12.65-10.48,25.88-21.99,38.5-33.95,47.82-45.31,56.63-104.46,56.63-104.46,0,0,.51-4.77,1.4-13,17.31,9.1,39.99-22.04,41.09-38.41,1.13-16.77,9.49-49.74,18.43-97.24,8.94-47.5-6.15-63.71-20.12-63.71Z"
|
|
370
|
+
}, dn = [
|
|
371
|
+
{
|
|
372
|
+
id: "lateralNeckRight",
|
|
373
|
+
labelKey: "lateralNeckRight",
|
|
374
|
+
d: "M234.37,783.6s32.84,133.08,163.93,137.04v-48.41s-103.52,3.15-163.93-88.63Z",
|
|
375
|
+
cx: 316,
|
|
376
|
+
cy: 852,
|
|
377
|
+
side: "right"
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
id: "lateralNeckLeft",
|
|
381
|
+
labelKey: "lateralNeckLeft",
|
|
382
|
+
d: "M572.98,783.6s-32.84,133.08-163.93,137.04v-48.41s103.52,3.15,163.93-88.63Z",
|
|
383
|
+
cx: 491,
|
|
384
|
+
cy: 852,
|
|
385
|
+
side: "left"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
id: "forehead",
|
|
389
|
+
labelKey: "forehead",
|
|
390
|
+
d: "M404,206.87s-.1,0-.14,0h-1.06s-.09,0-.14,0c-193.61.2-222.63,42.82-226.18,50.14l51.08,148.75c44.34-12.51,72.83-4.7,89.09,4.28,11.9,6.57,19.12,14.63,22.86,19.75,9.12-6.42,21.26-11.05,36.17-13.79,13.2-2.43,24.31-2.56,27.4-2.54.05,0,.1,0,.16,0h.04s.07,0,.11,0h.04c.2,0,.4,0,.64,0,3.65,0,14.33.22,26.92,2.54,14.91,2.74,27.05,7.37,36.17,13.79,3.74-5.12,10.96-13.18,22.86-19.75,16.26-8.98,44.75-16.79,89.09-4.28l51.08-148.75c-3.54-7.32-32.57-49.94-226.18-50.14Z",
|
|
391
|
+
cx: 403,
|
|
392
|
+
cy: 318,
|
|
393
|
+
side: "midline"
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
id: "glabella",
|
|
397
|
+
labelKey: "glabella",
|
|
398
|
+
d: "M403.28,472.75s.03,0,.04,0c.11,0,.22,0,.34,0,.11,0,.22,0,.34,0,.02,0,.03,0,.04,0,28.06.09,43.26,5.62,51.09,10.26l8.65-43.23c-19.58-15.79-54.78-16.31-59.89-16.33-.13,0-.27,0-.4,0h-.16s-.16,0-.16,0c-.13,0-.27,0-.4,0-5.09-.02-39.63.51-59.32,15.85l8.74,43.71c7.83-4.64,23.03-10.17,51.09-10.26Z",
|
|
399
|
+
cx: 404,
|
|
400
|
+
cy: 453,
|
|
401
|
+
side: "midline"
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
id: "nasalBase",
|
|
405
|
+
labelKey: "nasalBase",
|
|
406
|
+
d: "M403.9,608.63c-.19.02-.38.06-.58.06-34.25,0-47.76,9.72-52.65,15.19-.02.21-.05.42-.1.62,10.07,8.84,28.11,13.48,52.75,13.48.15,0,.29.03.43.04.15-.01.29-.04.43-.04,24.98,0,43.18-4.76,53.17-13.83-4.69-5.41-18.09-15.46-52.89-15.46-.2,0-.38-.04-.58-.06Z",
|
|
407
|
+
cx: 404,
|
|
408
|
+
cy: 623,
|
|
409
|
+
side: "midline"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
id: "nasolabialFold",
|
|
413
|
+
labelKey: "nasolabialFold",
|
|
414
|
+
d: "M347.77,580.98c-2.28,3.78-4.09,6.76-5.04,9.96-1.38,4.58-3.68,15.46,1.36,25.35,7.25-7.51,23.63-17.61,59.24-17.61.2,0,.38.04.58.06.19-.02.38-.06.58-.06,35.31,0,51.71,9.93,59.05,17.42,4.92-9.84,2.63-20.61,1.27-25.17-.96-3.19-2.76-6.18-5.04-9.96-5.23-8.65-12.39-20.5-14.97-45.03-2.34-22.26,2.15-36.18,6.11-43.75-5.65-3.61-19.1-9.4-47.23-9.45-27.9.05-41.36,5.75-47.09,9.36,3.98,7.55,8.51,21.49,6.16,43.84-2.58,24.53-9.74,36.38-14.97,45.03Z",
|
|
415
|
+
cx: 404,
|
|
416
|
+
cy: 550,
|
|
417
|
+
side: "midline"
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
id: "medialCheekboneRight",
|
|
421
|
+
labelKey: "medialCheekboneRight",
|
|
422
|
+
d: "M310.99,528.29c6.75-7.41,10.08-16.87,11.7-25.19-.55.67-1.13,1.34-1.73,2.02-11.93,13.41-27.69,20.63-45.58,20.88-24.57.33-43.87-10.86-55.92-20.57,6.83,15.71,22.29,36.28,56.41,36.28,15.2,0,27.02-4.51,35.12-13.42Z",
|
|
423
|
+
cx: 271,
|
|
424
|
+
cy: 522,
|
|
425
|
+
side: "right"
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
id: "medialCheekboneLeft",
|
|
429
|
+
labelKey: "medialCheekboneLeft",
|
|
430
|
+
d: "M529.65,526c-17.89-.25-33.66-7.47-45.58-20.88-.48-.54-.94-1.08-1.39-1.62.02.49.04.99.06,1.49,1.74,7.84,5.06,16.45,11.3,23.3,8.11,8.9,19.92,13.42,35.12,13.42,34.11,0,49.57-20.57,56.41-36.28-12.05,9.71-31.35,20.9-55.92,20.57Z",
|
|
431
|
+
cx: 534,
|
|
432
|
+
cy: 523,
|
|
433
|
+
side: "left"
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
id: "lateralCheekLeft",
|
|
437
|
+
labelKey: "lateralCheekLeft",
|
|
438
|
+
d: "M540.15,593.37c-18.18-.45-32.31-6.73-43.63-16.5-1.18-.24-2.29-.88-3.12-1.88-1.11-1.34-2.16-2.75-3.18-4.2-15.93-17.11-25.66-41.5-33.74-64.38-1.86,6.64-3.07,15.9-1.75,28.49,2.35,22.31,8.58,32.62,13.58,40.91,2.44,4.04,4.74,7.85,6.06,12.26,1.9,6.35,5.16,22.19-4,36.16,7.6,9.08,23.47,31.53,26.94,63.94,25.78-26.28,36.07-50.77,40.13-67.19,3.11-12.6,3.1-22.36,2.72-27.61Z",
|
|
439
|
+
cx: 497,
|
|
440
|
+
cy: 597,
|
|
441
|
+
side: "left"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
id: "lateralCheekRight",
|
|
445
|
+
labelKey: "lateralCheekRight",
|
|
446
|
+
d: "M350.8,505.59c-14.12,40.11-33.1,85.3-81.73,87.86-.37,5.26-.37,15,2.72,27.53,4.02,16.29,14.18,40.52,39.5,66.55,3.52-31.28,18.56-53.18,26.31-62.61-9.73-14.13-6.4-30.4-4.46-36.85,1.32-4.41,3.62-8.22,6.06-12.26,5-8.29,11.23-18.6,13.58-40.91,1.38-13.12,0-22.63-1.99-29.32Z",
|
|
447
|
+
cx: 311,
|
|
448
|
+
cy: 597,
|
|
449
|
+
side: "right"
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
id: "zygomaticArchRight",
|
|
453
|
+
labelKey: "zygomaticArchRight",
|
|
454
|
+
d: "M319.21,534.06c-.26.3-.51.61-.78.91-10.08,11.1-24.4,16.73-42.56,16.73-30.94,0-48.47-15.12-58-28.84,4.69,25.35,16.61,59.69,46.82,59.69,16.21,0,28.81-5.46,38.96-14.31.06-.09.11-.18.18-.26,7.83-9.48,12.57-21.69,15.39-33.93Z",
|
|
455
|
+
cx: 269,
|
|
456
|
+
cy: 553,
|
|
457
|
+
side: "right"
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
id: "zygomaticArchLeft",
|
|
461
|
+
labelKey: "zygomaticArchLeft",
|
|
462
|
+
d: "M542.24,582.4c31.74,0,43.29-37.91,47.48-63.47-.28.46-.57.93-.86,1.4-9.09,14.32-26.82,31.38-59.69,31.38-18.08,0-32.36-5.59-42.43-16.6,2.41,10.07,6.15,20.06,11.85,28.48,10.9,11.46,24.85,18.81,43.65,18.81Z",
|
|
463
|
+
cx: 538,
|
|
464
|
+
cy: 551,
|
|
465
|
+
side: "left"
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
id: "upperForehead",
|
|
469
|
+
labelKey: "upperForehead",
|
|
470
|
+
d: "M524.46,147.46c-34.16-13.49-75.08-20.35-121.64-20.4-46.56.05-87.49,6.91-121.64,20.4-27.26,10.76-50.3,25.76-68.48,44.56-15.39,15.91-24.67,31.94-30.13,44.09,4.92-3.6,11.3-7.4,19.61-11.17,40.86-18.52,108.25-27.96,200.32-28.07.05,0,.11,0,.16,0h.68s.68,0,.68,0c.05,0,.11,0,.16,0,92.07.1,159.46,9.55,200.32,28.07,7.48,3.39,13.39,6.81,18.08,10.08-5.52-12-14.69-27.55-29.63-43-18.18-18.8-41.22-33.79-68.48-44.56Z",
|
|
471
|
+
cx: 403,
|
|
472
|
+
cy: 182,
|
|
473
|
+
side: "midline"
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
id: "marionetteLines",
|
|
477
|
+
labelKey: "marionetteLines",
|
|
478
|
+
d: "M344.66,676.82c23.78-8.45,44.18-6.91,59.31,4.4,15.13-11.32,35.54-12.87,59.33-4.41,9.61,3.41,17.99,7.81,23.93,11.32-3.32-27.6-16.56-47.44-23.55-56.2-11.99,10.66-31.94,16.05-59.49,16.05-.15,0-.29-.03-.43-.04-.15.01-.29.04-.43.04-27.09,0-46.83-5.21-58.88-15.52-7.05,8.98-19.76,28.44-23.08,55.31,5.9-3.44,14.03-7.65,23.29-10.94Z",
|
|
479
|
+
cx: 404,
|
|
480
|
+
cy: 660,
|
|
481
|
+
side: "midline"
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
id: "lowerLip",
|
|
485
|
+
labelKey: "lowerLip",
|
|
486
|
+
d: "M487.84,709.63c-4.92,5.03-11.64,11.3-19.65,17.27-17.67,13.18-35.13,19.92-51.28,19.92-4.52,0-8.94-.53-13.23-1.6-4.29,1.06-8.71,1.6-13.23,1.6-16.15,0-33.61-6.74-51.28-19.92-7.36-5.49-13.63-11.23-18.42-16.03,1.76,38.11,15.57,71.15,82.56,71.15.33,0,.64.04.95.1.31-.06.62-.1.95-.1,67.72,0,81.09-33.76,82.62-72.39Z",
|
|
487
|
+
cx: 404,
|
|
488
|
+
cy: 746,
|
|
489
|
+
side: "midline"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
id: "lipCommissures",
|
|
493
|
+
labelKey: "lipCommissures",
|
|
494
|
+
d: "M407.45,691.27c-.9.8-2.02,1.19-3.13,1.23-1.34.13-2.72-.26-3.8-1.22-22.23-19.67-55.63-5.3-72.53,4.24,11.5,1.38,25.87,2.57,31.61,1.13,6.72-1.68,12.32.35,18.25,2.5,6.08,2.2,13.64,4.94,25.48,4.98,11.85-.04,19.41-2.78,25.48-4.98,5.93-2.15,11.53-4.18,18.25-2.5,5.93,1.48,21.03.17,32.69-1.26-16.96-9.54-50.17-23.72-72.31-4.13Z",
|
|
495
|
+
cx: 404,
|
|
496
|
+
cy: 688,
|
|
497
|
+
side: "midline"
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
id: "upperLip",
|
|
501
|
+
labelKey: "upperLip",
|
|
502
|
+
d: "M444.65,706.36c-3.59-.9-6.73.14-12.42,2.2-6.4,2.32-15.13,5.47-28.52,5.57-.03,0-.06,0-.09,0-.09,0-.18,0-.28,0-.09,0-.18,0-.28,0-.03,0-.06,0-.09,0-13.39-.1-22.12-3.25-28.52-5.57-5.69-2.06-8.83-3.1-12.42-2.2-6.87,1.72-20.85.72-32.07-.53,15.47,14.96,44.16,37.13,72.34,29.42.46-.13.93-.16,1.39-.15.46,0,.93.03,1.4.15,28.22,7.72,56.98-14.55,72.43-29.5-11.35,1.29-25.82,2.37-32.86.61Z",
|
|
503
|
+
cx: 404,
|
|
504
|
+
cy: 724,
|
|
505
|
+
side: "midline"
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
id: "submental",
|
|
509
|
+
labelKey: "submental",
|
|
510
|
+
d: "M402.47,796.81c-31.67.12-55.93,8.97-72.11,26.31-5.47,5.87-9.06,11.79-11.35,16.53.85.63,1.68,1.27,2.5,1.95,4.99,4.16,26.68,19.07,81.31,19.07s76.32-14.91,81.31-19.07c.65-.54,1.31-1.06,1.98-1.57-2.28-4.8-5.91-10.88-11.53-16.91-16.17-17.35-40.44-26.19-72.11-26.31Z",
|
|
511
|
+
cx: 403,
|
|
512
|
+
cy: 829,
|
|
513
|
+
side: "midline"
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
id: "mandibularAngleLeft",
|
|
517
|
+
labelKey: "mandibularAngleLeft",
|
|
518
|
+
d: "M514.03,757.42c-.91-3.27-1.74-6.39-2.54-9.37-2.39-8.91-4.46-16.6-7.08-23.48-1.84-4.83-3.93-9.07-6.37-12.99-1.26,23.6-6.85,40.74-17.31,53.43-10.17,12.33-24.87,20.32-44.53,24.16,17.13,3.95,34.7,11.85,48.39,26.79,5.59,6.1,9.46,12.22,12.09,17.4,10.43-7.53,28.1-20.6,47.98-36.72-9.19-6.29-25.19-19.64-30.61-39.21Z",
|
|
519
|
+
cx: 490,
|
|
520
|
+
cy: 772,
|
|
521
|
+
side: "left"
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
id: "mandibularAngleRight",
|
|
525
|
+
labelKey: "mandibularAngleRight",
|
|
526
|
+
d: "M372.3,789.03c-19.33-3.89-33.81-11.84-43.86-24.02-10.59-12.83-16.18-30.24-17.35-54.26-2.69,4.15-4.95,8.66-6.92,13.84-2.63,6.88-4.69,14.57-7.08,23.48-.8,2.98-1.64,6.1-2.54,9.37-5.42,19.55-21.39,32.89-30.58,39.19,19.56,15.86,36.98,28.78,47.47,36.36,2.63-5.1,6.44-11.07,11.9-17.03,13.85-15.11,31.67-23.02,48.98-26.92Z",
|
|
527
|
+
cx: 318,
|
|
528
|
+
cy: 772,
|
|
529
|
+
side: "right"
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
id: "eyelidRight",
|
|
533
|
+
labelKey: "eyelidRight",
|
|
534
|
+
d: "M270.93,458.23c-50.38-1.36-52.57,26.33-52.64,27.51-.08,1.39-.72,2.61-1.69,3.46,7.87,8.21,29.3,27.23,58.63,26.79,29.72-.41,43.34-22.6,47.54-31.28-.03-.39-.05-.75-.07-1.07-1.34-6.07-8.94-24.24-51.76-25.41Z",
|
|
535
|
+
cx: 270,
|
|
536
|
+
cy: 487,
|
|
537
|
+
side: "right"
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
id: "eyelidLeft",
|
|
541
|
+
labelKey: "eyelidLeft",
|
|
542
|
+
d: "M586.21,485.71c-.08-1.27-2.3-28.82-52.55-27.45-36.35.99-47.27,14.25-50.55,21.95.08.48.1.98.05,1.49-.01.11-.16,1.63-.31,4.22,4.82,9.37,18.52,29.69,46.94,30.08,29.04.43,50.34-18.21,58.4-26.55-1.13-.87-1.91-2.2-1.98-3.73Z",
|
|
543
|
+
cx: 536,
|
|
544
|
+
cy: 487,
|
|
545
|
+
side: "left"
|
|
546
|
+
}
|
|
547
|
+
], ln = [
|
|
548
|
+
{ id: "right-eye", labelKey: "rightEye", x: 268, y: 487 },
|
|
549
|
+
{ id: "left-eye", labelKey: "leftEye", x: 535, y: 487 },
|
|
550
|
+
{ id: "nose-tip", labelKey: "noseTip", x: 403, y: 620 },
|
|
551
|
+
{ id: "chin", labelKey: "chin", x: 404, y: 858 }
|
|
552
|
+
], mt = [
|
|
553
|
+
{
|
|
554
|
+
id: "cheekbone",
|
|
555
|
+
labelKey: "cheekbone",
|
|
556
|
+
d: "M610.94 390.75C608.16 382.3 605.46 381.87 596.6 382.08C591.51 382.28 584.59 382.59 575.62 381.39C557.25 379.38 481.3 349.58 454.86 341.75C422 333.52 392.16 327.22 375.57 324.41C381.84 329.92 388.57 338.91 380.64 346.05C389.64 348.16 401.43 351.27 415.06 355.22C467.31 373.66 535.67 406.59 557.94 417.54C568.72 423.72 574.39 429.66 578.65 434.5C584.76 442.1 588.17 446.76 600.61 448.17C605.08 448.79 608.5 446.59 611.06 441.43C614.87 433.1 616.26 409.71 610.94 390.76Z",
|
|
557
|
+
cx: 496,
|
|
558
|
+
cy: 387
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
id: "profileContour",
|
|
562
|
+
labelKey: "profileContour",
|
|
563
|
+
d: "M679.49 460.92C662.93 432.48 622.82 379.58 610.17 357.37C607.54 340.28 611.01 332.13 582.48 277.31C541.29 213.09 467.7 142.01 335.51 118.16C214.35 137.81 168.28 242.2 178.26 335.41C163.99 397.4 203.96 424.45 203.96 424.45L235.52 453C242.29 459.8 254.86 462.31 264.65 458.66L321.41 442.2C328.49 440.1 326.07 430.35 318.89 425.44C297.28 411.69 267.1 389.83 273 362.76C276.61 346.81 288 334.19 300.84 324.75C319.85 310.82 349.78 307.41 366.39 317.62C366.54 317.73 366.64 317.84 366.72 317.96C372.18 318.69 388.18 321.17 409.63 325.09C405.81 321.88 402.77 318.08 400.57 313.75C397.08 307.29 396.4 301.59 396.28 300.57C389.27 281.5 410.62 239.48 419.79 210.81L419.86 210.53C420.33 208.66 422.64 207.79 425.9 208.29C429.16 208.82 432.81 210.6 435.45 212.93L544.85 305.25C548.57 308.5 549.65 311.64 547.27 312.72C545.88 313.32 544.21 314.81 542.63 316.93C542.95 317.13 543.14 317.25 543.14 317.25L578.22 341.99C579.74 339.92 581.98 337.32 585.35 335.66C588.85 333.29 593.45 333.53 602.9 346.57C603.48 347.63 604.8 349.91 605.69 351.36C606.35 352.44 606.45 352.51 606.01 351.68C605.24 350.27 604.53 349 603.85 347.85C608.9 356.45 620.49 381.67 616.12 376.62C609.85 371.55 601.15 349.63 596.39 340.46C594.58 340.08 592.85 340.4 591.22 341.48C588.15 343.06 586.14 345.68 584.84 347.55L587.8 350.22C588.64 351.01 589.24 351.93 589.46 352.78C589.67 353.64 589.47 354.34 588.93 354.73L561.7 370.22C569.18 372.95 573.07 373.93 575.12 374.17C583.51 375.24 589.9 374.95 595.07 374.74C603.66 374.53 609.22 374.57 614.07 388.6C618.2 402.65 621.13 431.87 614.87 446.84C611.24 454.21 606 457.66 599.76 456.78C596.46 456.37 593.65 455.7 591.21 454.82C587.73 453.61 585.02 451.95 582.66 449.97C582.53 453.68 582.22 458.38 581.59 463.89C587.14 465.39 598.05 470.35 603.05 485.32C605.84 495.29 605.31 507.77 601.29 522.54C603.25 526.51 609.11 537.5 620.13 538.58C628.34 539.19 636.2 543.59 641.84 549.94C646.74 545.1 652.14 538.43 654.44 531.02C655.29 518.93 652.79 509.96 656.5 508.65C659.72 507.91 672 512.24 681.12 500.96C689.12 489.32 690.1 489.92 679.53 460.96Z",
|
|
564
|
+
cx: 427,
|
|
565
|
+
cy: 334
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
id: "temple",
|
|
569
|
+
labelKey: "temple",
|
|
570
|
+
d: "M532.36 315.34C532.57 314.85 532.88 314.51 533.27 314.29C535.46 311.03 538.01 308.57 540.36 307.57C540.87 307.35 540.68 306.7 539.9 306.02L430.37 214.29C429.7 213.7 429 213.52 428.64 213.47C428.29 213.41 427.67 213.39 427.56 213.86L427.48 214.14C425.45 221.87 420.09 238.28 415.47 255.43C409.74 269.9 401.22 289.46 405.13 299.8L405.18 299.95L405.19 300.1C405.22 300.32 406.48 322.76 432.19 329.92C432.5 330.01 432.79 330.12 433.05 330.25C441.15 332.22 449.62 334.37 458.27 336.64C495.23 347.63 521.06 355.99 538.7 361.94C536.62 359.47 534.53 356.66 532.75 353.55C528.88 347.24 527.33 341.48 527.2 336.3C525.08 326.23 528.9 321.14 531.31 317.29C531.35 317.24 531.37 317.19 531.4 317.14C531.76 316.51 532.09 315.92 532.35 315.34Z",
|
|
571
|
+
cx: 471,
|
|
572
|
+
cy: 288
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
id: "preauricularArea",
|
|
576
|
+
labelKey: "preauricularArea",
|
|
577
|
+
d: "M404.06 424.3C405.42 426.58 404.49 428.64 401.99 428.89L430.02 475.88C440.29 480.63 455.17 488.9 470.83 502.17C477.68 508.4 484.74 516.12 491.29 525.49C498.26 511.18 499.64 482.61 494.41 443.27C491.07 415.76 484.68 392.64 483.22 387.83C458.42 377.47 432.33 367.56 410.47 360.25C398.03 356.52 387.16 353.53 378.59 351.41C378.25 356.06 379.25 364.97 384.91 382.96C391.82 402.36 403.92 424.06 404.06 424.29Z",
|
|
578
|
+
cx: 439,
|
|
579
|
+
cy: 438
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
id: "mandibularBody",
|
|
583
|
+
labelKey: "mandibularBody",
|
|
584
|
+
d: "M467.95 509.13C456.53 499.21 445.4 492.21 436.52 487.47L459.05 533.53L459.14 533.79C459.89 536.18 467.05 571.24 498.43 592.3C500.51 593.92 502.72 595.62 505 597.38C503.47 562.75 491.22 532.29 467.95 509.13Z",
|
|
585
|
+
cx: 471,
|
|
586
|
+
cy: 542
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
id: "submentalProfile",
|
|
590
|
+
labelKey: "submentalProfile",
|
|
591
|
+
d: "M561.28 637.02C560.29 636.32 559.31 635.56 558.35 634.74C550.86 628.63 541.7 615.89 529.55 597.01C529.52 596.98 529.5 596.94 529.47 596.9C529.09 596.39 528.71 595.89 528.32 595.37C520.33 585.52 512.8 576.33 508.52 571.48C509.7 580.62 510.18 590.53 509.86 601.23C532.11 622.53 558.17 652.04 558.17 652.04C558.17 652.04 579.6 677.67 591.07 642.74C587.26 643.92 583.05 644.26 578.83 643.73C572.73 643.21 566.77 640.97 561.27 637.03Z",
|
|
592
|
+
cx: 550,
|
|
593
|
+
cy: 625
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
id: "masseter",
|
|
597
|
+
labelKey: "masseter",
|
|
598
|
+
d: "M573.89 440.59C569.65 435.8 564.53 430.44 554.61 424.7C543.46 418.85 521.77 406.59 494.84 393.1C500.65 416.63 515.03 501.76 496.1 533.47C500.2 541.35 503.71 550.24 506.34 560.17C507 560.02 507.7 560.24 508.29 560.88C508.51 561.11 517.6 571.65 528.38 584.23C550.75 552.98 563.86 516.16 570.4 490.42C576.1 466.55 576.18 448.24 575.95 443.02C575.27 442.23 574.59 441.42 573.88 440.59Z",
|
|
599
|
+
cx: 536,
|
|
600
|
+
cy: 489
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
id: "cheek",
|
|
604
|
+
labelKey: "cheek",
|
|
605
|
+
d: "M531.91 588.63L531.97 589.2C534.27 588.94 543.9 587.63 554.51 581.36C570.49 572.8 583.41 557.03 592.56 533.24C599.01 515.51 600.78 501.14 597.95 490.55C594.05 478.42 585.01 474.09 580.29 472.68C579.27 478.6 577.89 485.15 576.05 492.18C568.74 518.83 554.61 556.58 531.91 588.63Z",
|
|
606
|
+
cx: 566,
|
|
607
|
+
cy: 531
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
id: "chin",
|
|
611
|
+
labelKey: "chin",
|
|
612
|
+
d: "M633.63 557.45C629.08 552.63 623.13 549.04 616.46 548.35C606.36 547.06 600.75 538.23 597.86 532.69C597.5 533.64 597.15 534.59 596.76 535.56C585.82 562.54 571.02 580.56 554.12 589.53C547.61 593.34 541.62 595.3 537.29 596.35C545.21 608.73 553.26 621.16 560.49 627.26C573.24 638.7 586.3 638.16 594.18 633.77C594.79 631.8 595.4 629.7 596 627.43L605.24 597.03L605.32 596.82C605.67 595.83 608.76 587.94 612.99 586.93C617.67 585.64 629.4 566.81 632.93 558.71C633.12 558.27 633.35 557.86 633.61 557.47Z",
|
|
613
|
+
cx: 585,
|
|
614
|
+
cy: 586
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
id: "browTail",
|
|
618
|
+
labelKey: "browTail",
|
|
619
|
+
d: "M540.86 320.68C540.86 320.68 520.89 338.47 552.84 365.63L580.98 350.28L540.86 320.68Z",
|
|
620
|
+
cx: 551,
|
|
621
|
+
cy: 343
|
|
622
|
+
}
|
|
623
|
+
], at = mt.find((t) => t.id === "profileContour") ?? ut, it = mt.filter(
|
|
624
|
+
(t) => t.id !== "profileContour"
|
|
625
|
+
).map((t) => ({
|
|
626
|
+
id: t.id,
|
|
627
|
+
labelKey: t.labelKey,
|
|
628
|
+
d: t.d,
|
|
629
|
+
cx: t.cx ?? 0,
|
|
630
|
+
cy: t.cy ?? 0,
|
|
631
|
+
side: t.side ?? "midline"
|
|
632
|
+
})), st = [
|
|
633
|
+
{ id: "eye", labelKey: "eye", x: 561, y: 374 },
|
|
634
|
+
{ id: "nose-tip", labelKey: "noseTip", x: 668, y: 432 },
|
|
635
|
+
{ id: "mouth", labelKey: "mouth", x: 592, y: 532 }
|
|
636
|
+
], ct = {
|
|
637
|
+
front: {
|
|
638
|
+
id: "front",
|
|
639
|
+
labelKey: "front",
|
|
640
|
+
viewBox: je,
|
|
641
|
+
pivot: $e,
|
|
642
|
+
contour: ut,
|
|
643
|
+
// The generator guarantees every clickable zone carries cx/cy/side.
|
|
644
|
+
zones: dn,
|
|
645
|
+
landmarks: ln
|
|
646
|
+
},
|
|
647
|
+
// The reshaped profile zones face +x; the right profile is the same mesh
|
|
648
|
+
// mirrored. Both fit on the eye/nose-tip/mouth anchors — auto-detect and manual
|
|
649
|
+
// drag/sliders all work; the right profile mirrors the fit at render time.
|
|
650
|
+
"profile-left": {
|
|
651
|
+
id: "profile-left",
|
|
652
|
+
labelKey: "profileLeft",
|
|
653
|
+
viewBox: je,
|
|
654
|
+
pivot: $e,
|
|
655
|
+
contour: at,
|
|
656
|
+
zones: it,
|
|
657
|
+
landmarks: st
|
|
658
|
+
},
|
|
659
|
+
"profile-right": {
|
|
660
|
+
id: "profile-right",
|
|
661
|
+
labelKey: "profileRight",
|
|
662
|
+
viewBox: je,
|
|
663
|
+
pivot: $e,
|
|
664
|
+
contour: at,
|
|
665
|
+
zones: it,
|
|
666
|
+
landmarks: st,
|
|
667
|
+
mirror: !0
|
|
668
|
+
}
|
|
669
|
+
}, ot = [
|
|
670
|
+
"front",
|
|
671
|
+
"profile-left",
|
|
672
|
+
"profile-right"
|
|
673
|
+
], fn = [
|
|
674
|
+
"observation",
|
|
675
|
+
"treatment",
|
|
676
|
+
"concern",
|
|
677
|
+
"note"
|
|
678
|
+
], dt = {
|
|
679
|
+
observation: { shape: "circle", tone: "info" },
|
|
680
|
+
treatment: { shape: "square", tone: "success" },
|
|
681
|
+
concern: { shape: "triangle", tone: "warning" },
|
|
682
|
+
note: { shape: "diamond", tone: "neutral" }
|
|
683
|
+
}, fe = [1, 0, 0, 1, 0, 0];
|
|
684
|
+
function lt(t) {
|
|
685
|
+
return `matrix(${t[0]} ${t[1]} ${t[2]} ${t[3]} ${t[4]} ${t[5]})`;
|
|
686
|
+
}
|
|
687
|
+
function ze(t, n) {
|
|
688
|
+
return {
|
|
689
|
+
x: t[0] * n.x + t[2] * n.y + t[4],
|
|
690
|
+
y: t[1] * n.x + t[3] * n.y + t[5]
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
const xe = Math.PI / 180;
|
|
694
|
+
function un(t, n) {
|
|
695
|
+
const c = t.rotation * xe, o = Math.cos(c), d = Math.sin(c), s = Math.tan(t.shear * xe), u = t.scaleX * o, l = t.scaleX * d, f = t.scaleY * (s * o - d), m = t.scaleY * (s * d + o), w = t.translateX + n.x - (u * n.x + f * n.y), x = t.translateY + n.y - (l * n.x + m * n.y);
|
|
696
|
+
return [u, l, f, m, w, x];
|
|
697
|
+
}
|
|
698
|
+
function mn(t, n) {
|
|
699
|
+
const [c, o, d, s, u, l] = t, f = Math.hypot(c, o), m = Math.atan2(o, c) / xe, w = c * s - o * d, x = f === 0 ? 0 : w / f, y = Math.atan2(c * d + o * s, w) / xe, C = u - n.x + (c * n.x + d * n.y), p = l - n.y + (o * n.x + s * n.y);
|
|
700
|
+
return { scaleX: f, scaleY: x, rotation: m, shear: y, translateX: C, translateY: p };
|
|
701
|
+
}
|
|
702
|
+
function ft(t, n) {
|
|
703
|
+
const c = Math.min(t.length, n.length);
|
|
704
|
+
if (c < 3) return fe;
|
|
705
|
+
let o = 0, d = 0, s = 0, u = 0, l = 0, f = 0, m = 0, w = 0, x = 0, y = 0, C = 0;
|
|
706
|
+
for (let j = 0; j < c; j++) {
|
|
707
|
+
const M = t[j], F = n[j];
|
|
708
|
+
!M || !F || (o += M.x * M.x, d += M.x * M.y, s += M.x, u += M.y * M.y, l += M.y, f += F.x * M.x, m += F.x * M.y, w += F.x, x += F.y * M.x, y += F.y * M.y, C += F.y);
|
|
709
|
+
}
|
|
710
|
+
const p = o * (u * c - l * l) - d * (d * c - l * s) + s * (d * l - u * s);
|
|
711
|
+
if (Math.abs(p) < 1e-9) return fe;
|
|
712
|
+
const N = u * c - l * l, z = s * l - d * c, K = d * l - s * u, R = o * c - s * s, E = s * d - o * l, I = o * u - d * d, Z = (j, M, F) => [
|
|
713
|
+
(N * j + z * M + K * F) / p,
|
|
714
|
+
(z * j + R * M + E * F) / p,
|
|
715
|
+
(K * j + E * M + I * F) / p
|
|
716
|
+
], [V, D, q] = Z(f, m, w), [Y, h, ce] = Z(x, y, C);
|
|
717
|
+
return [V, Y, D, h, q, ce];
|
|
718
|
+
}
|
|
719
|
+
function hn(t) {
|
|
720
|
+
const n = (f) => {
|
|
721
|
+
var m;
|
|
722
|
+
return (m = t.find((w) => w.id === f)) == null ? void 0 : m.photo;
|
|
723
|
+
}, c = n("nose-tip"), o = n("right-eye"), d = n("left-eye"), s = n("mouth-right"), u = n("mouth-left");
|
|
724
|
+
if (!c || !o || !d || !s || !u) return null;
|
|
725
|
+
const l = (f, m) => Math.abs(f.x - c.x) >= Math.abs(m.x - c.x) ? f : m;
|
|
726
|
+
return [
|
|
727
|
+
{ id: "eye", photo: l(o, d) },
|
|
728
|
+
{ id: "nose-tip", photo: c },
|
|
729
|
+
{ id: "mouth", photo: l(s, u) }
|
|
730
|
+
];
|
|
731
|
+
}
|
|
732
|
+
function pn() {
|
|
733
|
+
return typeof navigator < "u" && typeof navigator.mediaDevices < "u" && typeof navigator.mediaDevices.getUserMedia == "function";
|
|
734
|
+
}
|
|
735
|
+
function gn(t) {
|
|
736
|
+
const n = t instanceof Error ? t.name : "";
|
|
737
|
+
return n === "NotAllowedError" || n === "SecurityError" ? "permission-denied" : n === "NotFoundError" || n === "OverconstrainedError" ? "no-camera" : n === "NotReadableError" || n === "AbortError" ? "not-readable" : "capture-failed";
|
|
738
|
+
}
|
|
739
|
+
const yn = {
|
|
740
|
+
"permission-denied": "faceScheme.capture.error.permissionDenied",
|
|
741
|
+
"no-camera": "faceScheme.capture.error.noCamera",
|
|
742
|
+
"not-readable": "faceScheme.capture.error.notReadable",
|
|
743
|
+
"insecure-context": "faceScheme.capture.error.insecureContext",
|
|
744
|
+
"capture-failed": "faceScheme.capture.error.captureFailed"
|
|
745
|
+
}, vn = {
|
|
746
|
+
neutral: "ds:[fill:var(--muted-foreground)]",
|
|
747
|
+
info: "ds:[fill:var(--info)]",
|
|
748
|
+
success: "ds:[fill:var(--success)]",
|
|
749
|
+
warning: "ds:[fill:var(--warning)]",
|
|
750
|
+
error: "ds:[fill:var(--destructive)]",
|
|
751
|
+
accent: "ds:[fill:var(--accent)]"
|
|
752
|
+
}, xn = It(
|
|
753
|
+
[
|
|
754
|
+
"ds:[vector-effect:non-scaling-stroke]",
|
|
755
|
+
"ds:transition-[fill-opacity] ds:[transition-duration:var(--animation-duration)]",
|
|
756
|
+
"ds:[fill:transparent] ds:[stroke:var(--accent)] ds:[stroke-width:1]"
|
|
757
|
+
].join(" "),
|
|
758
|
+
{
|
|
759
|
+
variants: {
|
|
760
|
+
interactive: { true: "ds:cursor-pointer", false: "" },
|
|
761
|
+
marked: { true: "", false: "" }
|
|
762
|
+
},
|
|
763
|
+
compoundVariants: [
|
|
764
|
+
{
|
|
765
|
+
marked: !1,
|
|
766
|
+
interactive: !0,
|
|
767
|
+
class: "ds:hover:[fill:var(--accent)] ds:hover:[fill-opacity:0.14]"
|
|
768
|
+
},
|
|
769
|
+
{
|
|
770
|
+
marked: !0,
|
|
771
|
+
class: "ds:[fill:var(--accent)] ds:[fill-opacity:0.18]"
|
|
772
|
+
}
|
|
773
|
+
],
|
|
774
|
+
defaultVariants: { interactive: !1, marked: !1 }
|
|
775
|
+
}
|
|
776
|
+
), Cn = {
|
|
777
|
+
scaleX: { min: 0.3, max: 1.8, step: 0.01 },
|
|
778
|
+
scaleY: { min: 0.3, max: 1.8, step: 0.01 },
|
|
779
|
+
rotation: { min: -20, max: 20, step: 0.5 },
|
|
780
|
+
shear: { min: -20, max: 20, step: 0.5 },
|
|
781
|
+
translateX: { min: -240, max: 240, step: 1 },
|
|
782
|
+
translateY: { min: -240, max: 240, step: 1 }
|
|
783
|
+
}, bn = [
|
|
784
|
+
"scaleX",
|
|
785
|
+
"scaleY",
|
|
786
|
+
"rotation",
|
|
787
|
+
"shear",
|
|
788
|
+
"translateX",
|
|
789
|
+
"translateY"
|
|
790
|
+
], wn = At(
|
|
791
|
+
({
|
|
792
|
+
id: t,
|
|
793
|
+
patientPhoto: n,
|
|
794
|
+
viewPhotos: c,
|
|
795
|
+
view: o,
|
|
796
|
+
defaultView: d = "front",
|
|
797
|
+
onViewChange: s,
|
|
798
|
+
showViewSwitcher: u = !0,
|
|
799
|
+
mode: l = "interactive",
|
|
800
|
+
value: f,
|
|
801
|
+
defaultValue: m,
|
|
802
|
+
onChange: w,
|
|
803
|
+
onSelectZone: x,
|
|
804
|
+
activeFinding: y,
|
|
805
|
+
registration: C,
|
|
806
|
+
defaultRegistration: p,
|
|
807
|
+
onRegistrationChange: N,
|
|
808
|
+
registrationMode: z = "off",
|
|
809
|
+
autoDetect: K,
|
|
810
|
+
onDetectStatus: R,
|
|
811
|
+
allowCapture: E = !1,
|
|
812
|
+
captureFacingMode: I = "user",
|
|
813
|
+
onCapture: Z,
|
|
814
|
+
legend: V = !1,
|
|
815
|
+
ariaLabel: D,
|
|
816
|
+
className: q
|
|
817
|
+
}, Y) => {
|
|
818
|
+
const { t: h } = Zt(), ce = Tt(), j = t ?? ce, M = _(null), F = _(null), ue = _(null), oe = _(null), De = _(null), Pe = _(null), Ce = _(!1), be = o !== void 0, [ht, pt] = X(
|
|
819
|
+
o ?? d
|
|
820
|
+
), A = be ? o : ht, Ue = _(A);
|
|
821
|
+
Ue.current = A;
|
|
822
|
+
const we = k(
|
|
823
|
+
(e) => {
|
|
824
|
+
be || pt(e), s == null || s(e);
|
|
825
|
+
},
|
|
826
|
+
[be, s]
|
|
827
|
+
), b = ct[A], [, , B, Q] = b.viewBox.split(" ").map(Number), G = l === "interactive", Be = G && z === "adjust", ke = f !== void 0, [gt, yt] = X(m ?? {}), Me = ke ? f : gt, O = _(Me);
|
|
828
|
+
O.current = Me;
|
|
829
|
+
const ee = k(
|
|
830
|
+
(e) => {
|
|
831
|
+
ke || yt(e), w == null || w(e);
|
|
832
|
+
},
|
|
833
|
+
[ke, w]
|
|
834
|
+
), me = k(
|
|
835
|
+
(e, r, a) => {
|
|
836
|
+
const i = O.current[e] ?? [];
|
|
837
|
+
i.some((v) => v.type === r) || ee({
|
|
838
|
+
...O.current,
|
|
839
|
+
[e]: [...i, { type: r, note: a }]
|
|
840
|
+
});
|
|
841
|
+
},
|
|
842
|
+
[ee]
|
|
843
|
+
), he = k(
|
|
844
|
+
(e, r) => {
|
|
845
|
+
const i = (O.current[e] ?? []).filter((S) => S.type !== r), v = { ...O.current };
|
|
846
|
+
i.length > 0 ? v[e] = i : delete v[e], ee(v);
|
|
847
|
+
},
|
|
848
|
+
[ee]
|
|
849
|
+
), We = k(
|
|
850
|
+
(e, r) => {
|
|
851
|
+
(O.current[e] ?? []).some(
|
|
852
|
+
(i) => i.type === r
|
|
853
|
+
) ? he(e, r) : me(e, r);
|
|
854
|
+
},
|
|
855
|
+
[me, he]
|
|
856
|
+
), Se = C !== void 0, [vt, xt] = X(
|
|
857
|
+
p ?? {}
|
|
858
|
+
), Ee = Se ? C : vt, P = Ee[A] ?? fe, Ve = _(P);
|
|
859
|
+
Ve.current = P;
|
|
860
|
+
const Ye = _(Ee);
|
|
861
|
+
Ye.current = Ee;
|
|
862
|
+
const U = k(
|
|
863
|
+
(e) => {
|
|
864
|
+
const r = { ...Ye.current, [A]: e };
|
|
865
|
+
Se || xt(r), N == null || N(r);
|
|
866
|
+
},
|
|
867
|
+
[Se, N, A]
|
|
868
|
+
), Re = nt(
|
|
869
|
+
() => mn(P, b.pivot),
|
|
870
|
+
[P, b.pivot]
|
|
871
|
+
), H = k(
|
|
872
|
+
(e) => b.mirror ? { x: B - e.x, y: e.y } : e,
|
|
873
|
+
[b.mirror, B]
|
|
874
|
+
), [Le, He] = X(
|
|
875
|
+
() => b.landmarks.map((e) => H(ze(P, e)))
|
|
876
|
+
), pe = _(null);
|
|
877
|
+
Ie(() => {
|
|
878
|
+
pe.current === null && He(
|
|
879
|
+
b.landmarks.map((e) => H(ze(P, e)))
|
|
880
|
+
);
|
|
881
|
+
}, [P, b.landmarks, H]);
|
|
882
|
+
const ge = k(
|
|
883
|
+
(e) => {
|
|
884
|
+
const r = [], a = [];
|
|
885
|
+
for (const i of e) {
|
|
886
|
+
const v = b.landmarks.find((S) => S.id === i.id);
|
|
887
|
+
v && (r.push({ x: v.x, y: v.y }), a.push(H(i.photo)));
|
|
888
|
+
}
|
|
889
|
+
r.length >= 3 && U(ft(r, a));
|
|
890
|
+
},
|
|
891
|
+
[U, b.landmarks, H]
|
|
892
|
+
), Xe = k(
|
|
893
|
+
(e, r) => {
|
|
894
|
+
const a = F.current;
|
|
895
|
+
if (!a) return { x: 0, y: 0 };
|
|
896
|
+
const i = a.createSVGPoint();
|
|
897
|
+
i.x = e, i.y = r;
|
|
898
|
+
const v = a.getScreenCTM();
|
|
899
|
+
if (!v) return { x: 0, y: 0 };
|
|
900
|
+
const S = i.matrixTransform(v.inverse());
|
|
901
|
+
return { x: S.x, y: S.y };
|
|
902
|
+
},
|
|
903
|
+
[]
|
|
904
|
+
), Ct = k(
|
|
905
|
+
(e) => (r) => {
|
|
906
|
+
pe.current = e, r.currentTarget.setPointerCapture(r.pointerId);
|
|
907
|
+
},
|
|
908
|
+
[]
|
|
909
|
+
), bt = k(
|
|
910
|
+
(e) => {
|
|
911
|
+
const r = pe.current;
|
|
912
|
+
if (r === null) return;
|
|
913
|
+
const a = Xe(e.clientX, e.clientY), i = Le.map((S, _e) => _e === r ? a : S);
|
|
914
|
+
He(i);
|
|
915
|
+
const v = b.landmarks.map((S) => ({ x: S.x, y: S.y }));
|
|
916
|
+
U(ft(v, i.map(H)));
|
|
917
|
+
},
|
|
918
|
+
[Le, Xe, b.landmarks, U, H]
|
|
919
|
+
), wt = k(() => {
|
|
920
|
+
pe.current = null;
|
|
921
|
+
}, []), [Ke, W] = X("idle"), [qe, te] = X(
|
|
922
|
+
null
|
|
923
|
+
), [kt, Mt] = X({}), J = (c == null ? void 0 : c[A]) ?? (A === "front" ? n : void 0), $ = kt[A] ?? (J == null ? void 0 : J.src), ne = k(() => {
|
|
924
|
+
var r;
|
|
925
|
+
(r = oe.current) == null || r.getTracks().forEach((a) => a.stop()), oe.current = null;
|
|
926
|
+
const e = ue.current;
|
|
927
|
+
e && (e.srcObject = null);
|
|
928
|
+
}, []), Ne = k(() => {
|
|
929
|
+
ne(), W("idle");
|
|
930
|
+
}, [ne]), Fe = k(async () => {
|
|
931
|
+
var e;
|
|
932
|
+
if (E) {
|
|
933
|
+
if (!pn()) {
|
|
934
|
+
te("insecure-context"), W("error");
|
|
935
|
+
return;
|
|
936
|
+
}
|
|
937
|
+
te(null), W("requesting");
|
|
938
|
+
try {
|
|
939
|
+
const r = await navigator.mediaDevices.getUserMedia({
|
|
940
|
+
video: { facingMode: I },
|
|
941
|
+
audio: !1
|
|
942
|
+
});
|
|
943
|
+
if (Ce.current) {
|
|
944
|
+
r.getTracks().forEach((i) => i.stop());
|
|
945
|
+
return;
|
|
946
|
+
}
|
|
947
|
+
oe.current = r;
|
|
948
|
+
const a = ue.current;
|
|
949
|
+
if (a) {
|
|
950
|
+
try {
|
|
951
|
+
a.srcObject = r;
|
|
952
|
+
} catch {
|
|
953
|
+
}
|
|
954
|
+
const i = (e = a.play) == null ? void 0 : e.call(a);
|
|
955
|
+
i && typeof i.catch == "function" && i.catch(() => {
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
W("streaming");
|
|
959
|
+
} catch (r) {
|
|
960
|
+
ne(), te(gn(r)), W("error");
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}, [E, I, ne]), de = k(
|
|
964
|
+
(e, r, a) => {
|
|
965
|
+
Mt((i) => ({ ...i, [A]: e })), Z == null || Z({ src: e, width: r, height: a, view: A });
|
|
966
|
+
},
|
|
967
|
+
[Z, A]
|
|
968
|
+
), St = k(() => {
|
|
969
|
+
const e = ue.current, r = (e == null ? void 0 : e.videoWidth) || (e == null ? void 0 : e.clientWidth) || 0, a = (e == null ? void 0 : e.videoHeight) || (e == null ? void 0 : e.clientHeight) || 0;
|
|
970
|
+
if (!e || e.readyState < 2 || r === 0 || a === 0) {
|
|
971
|
+
te("capture-failed"), W("error");
|
|
972
|
+
return;
|
|
973
|
+
}
|
|
974
|
+
const i = document.createElement("canvas");
|
|
975
|
+
i.width = r, i.height = a;
|
|
976
|
+
const v = i.getContext("2d");
|
|
977
|
+
if (!v) {
|
|
978
|
+
te("capture-failed"), W("error");
|
|
979
|
+
return;
|
|
980
|
+
}
|
|
981
|
+
try {
|
|
982
|
+
v.drawImage(e, 0, 0, r, a);
|
|
983
|
+
} catch {
|
|
984
|
+
te("capture-failed"), W("error");
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
ne(), de(i.toDataURL("image/jpeg", 0.92), r, a), W("idle");
|
|
988
|
+
}, [ne, de]), Et = k(
|
|
989
|
+
(e) => {
|
|
990
|
+
var i;
|
|
991
|
+
const r = (i = e.target.files) == null ? void 0 : i[0];
|
|
992
|
+
if (e.target.value = "", !r) return;
|
|
993
|
+
const a = new FileReader();
|
|
994
|
+
a.onload = () => {
|
|
995
|
+
const v = typeof a.result == "string" ? a.result : "";
|
|
996
|
+
if (!v) return;
|
|
997
|
+
const S = new Image();
|
|
998
|
+
S.onload = () => de(v, S.naturalWidth, S.naturalHeight), S.onerror = () => de(v, B, Q), S.src = v;
|
|
999
|
+
}, a.readAsDataURL(r);
|
|
1000
|
+
},
|
|
1001
|
+
[de, B, Q]
|
|
1002
|
+
);
|
|
1003
|
+
Ie(() => (Ce.current = !1, () => {
|
|
1004
|
+
var e;
|
|
1005
|
+
Ce.current = !0, (e = oe.current) == null || e.getTracks().forEach((r) => r.stop()), oe.current = null;
|
|
1006
|
+
}), []);
|
|
1007
|
+
const le = Ke === "streaming", Ge = _(!1);
|
|
1008
|
+
Ie(() => {
|
|
1009
|
+
var e;
|
|
1010
|
+
Ge.current && !le && ((e = Pe.current) == null || e.focus()), Ge.current = le;
|
|
1011
|
+
}, [le]);
|
|
1012
|
+
const [ye, Rt] = X("idle"), re = k(
|
|
1013
|
+
(e) => {
|
|
1014
|
+
Rt(e), R == null || R(e);
|
|
1015
|
+
},
|
|
1016
|
+
[R]
|
|
1017
|
+
), Ae = k(async () => {
|
|
1018
|
+
if (!K || !$ || b.landmarks.length === 0)
|
|
1019
|
+
return !1;
|
|
1020
|
+
const e = typeof K == "object" ? K : {}, r = (a) => re(a === "detecting" ? "detecting" : "loading");
|
|
1021
|
+
try {
|
|
1022
|
+
re("loading");
|
|
1023
|
+
let a;
|
|
1024
|
+
if (b.id === "front")
|
|
1025
|
+
a = await Gt($, {
|
|
1026
|
+
viewWidth: B,
|
|
1027
|
+
viewHeight: Q,
|
|
1028
|
+
onStage: r,
|
|
1029
|
+
wasmBaseUrl: e.wasmBaseUrl,
|
|
1030
|
+
modelAssetPath: e.modelAssetPath
|
|
1031
|
+
});
|
|
1032
|
+
else {
|
|
1033
|
+
const i = await on($, {
|
|
1034
|
+
viewWidth: B,
|
|
1035
|
+
viewHeight: Q,
|
|
1036
|
+
onStage: r,
|
|
1037
|
+
ortModuleUrl: e.ortModuleUrl,
|
|
1038
|
+
ortWasmBaseUrl: e.ortWasmBaseUrl,
|
|
1039
|
+
modelUrl: e.yunetModelUrl
|
|
1040
|
+
});
|
|
1041
|
+
a = i && hn(i);
|
|
1042
|
+
}
|
|
1043
|
+
return !a || a.length < 3 ? (re("no-face"), !1) : (ge(a), re("done"), !0);
|
|
1044
|
+
} catch {
|
|
1045
|
+
return re("error"), !1;
|
|
1046
|
+
}
|
|
1047
|
+
}, [
|
|
1048
|
+
K,
|
|
1049
|
+
$,
|
|
1050
|
+
b.id,
|
|
1051
|
+
b.landmarks,
|
|
1052
|
+
B,
|
|
1053
|
+
Q,
|
|
1054
|
+
re,
|
|
1055
|
+
ge
|
|
1056
|
+
]), Je = k((e) => {
|
|
1057
|
+
var r, a;
|
|
1058
|
+
(a = (r = M.current) == null ? void 0 : r.querySelector(`[data-zone="${e}"]`)) == null || a.focus();
|
|
1059
|
+
}, []), Te = nt(
|
|
1060
|
+
() => ({
|
|
1061
|
+
focusZone: Je,
|
|
1062
|
+
getChart: () => O.current,
|
|
1063
|
+
getZone: (e) => O.current[e] ?? [],
|
|
1064
|
+
zonesWith: (e) => Object.entries(O.current).filter(([, r]) => r.some((a) => a.type === e)).map(([r]) => r),
|
|
1065
|
+
setFinding: me,
|
|
1066
|
+
removeFinding: he,
|
|
1067
|
+
clearZone: (e) => {
|
|
1068
|
+
if (!O.current[e]) return;
|
|
1069
|
+
const r = { ...O.current };
|
|
1070
|
+
delete r[e], ee(r);
|
|
1071
|
+
},
|
|
1072
|
+
getRegistration: () => Ve.current,
|
|
1073
|
+
setRegistration: (e) => U(e),
|
|
1074
|
+
resetRegistration: () => U(fe),
|
|
1075
|
+
fitToLandmarks: ge,
|
|
1076
|
+
detect: Ae,
|
|
1077
|
+
startCapture: () => void Fe(),
|
|
1078
|
+
cancelCapture: Ne,
|
|
1079
|
+
getView: () => Ue.current,
|
|
1080
|
+
setView: we
|
|
1081
|
+
}),
|
|
1082
|
+
[
|
|
1083
|
+
Je,
|
|
1084
|
+
me,
|
|
1085
|
+
he,
|
|
1086
|
+
ee,
|
|
1087
|
+
U,
|
|
1088
|
+
ge,
|
|
1089
|
+
Ae,
|
|
1090
|
+
Fe,
|
|
1091
|
+
Ne,
|
|
1092
|
+
we
|
|
1093
|
+
]
|
|
1094
|
+
);
|
|
1095
|
+
_t(Y, () => Te, [Te]), Ot(Bt, Te, j);
|
|
1096
|
+
const Qe = k(
|
|
1097
|
+
(e) => {
|
|
1098
|
+
const r = h(`faceScheme.zone.${e.labelKey}`), a = O.current[e.id] ?? [];
|
|
1099
|
+
if (a.length === 0) return r;
|
|
1100
|
+
const i = a.map((v) => h(`faceScheme.finding.${v.type}`)).join(", ");
|
|
1101
|
+
return h("faceScheme.zoneWithFindings", {
|
|
1102
|
+
zone: r,
|
|
1103
|
+
findings: i
|
|
1104
|
+
});
|
|
1105
|
+
},
|
|
1106
|
+
[h]
|
|
1107
|
+
), et = k(
|
|
1108
|
+
(e) => {
|
|
1109
|
+
x == null || x(e.id), G && y && We(e.id, y);
|
|
1110
|
+
},
|
|
1111
|
+
[G, y, We, x]
|
|
1112
|
+
), Lt = J != null && J.altKey ? h(J.altKey) : h("faceScheme.photo.defaultAlt"), Kt = b.mirror ? `translate(${B} 0) scale(-1 1) ${lt(P)}` : lt(P), Nt = k(
|
|
1113
|
+
(e, r) => {
|
|
1114
|
+
U(un({ ...Re, [e]: r }, b.pivot));
|
|
1115
|
+
},
|
|
1116
|
+
[U, Re, b.pivot]
|
|
1117
|
+
), tt = !!K && !!$ && b.landmarks.length > 0, Ft = E;
|
|
1118
|
+
return /* @__PURE__ */ T(
|
|
1119
|
+
"div",
|
|
1120
|
+
{
|
|
1121
|
+
ref: M,
|
|
1122
|
+
"data-component": "face-scheme",
|
|
1123
|
+
"data-component-id": j,
|
|
1124
|
+
"data-view": A,
|
|
1125
|
+
className: ["ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", q].filter(Boolean).join(" "),
|
|
1126
|
+
role: "group",
|
|
1127
|
+
"aria-label": D ?? h("faceScheme.ariaLabel"),
|
|
1128
|
+
children: [
|
|
1129
|
+
u && ot.length > 1 && /* @__PURE__ */ g(
|
|
1130
|
+
Pt,
|
|
1131
|
+
{
|
|
1132
|
+
label: h("faceScheme.viewSwitcherLabel"),
|
|
1133
|
+
variant: "horizontal",
|
|
1134
|
+
value: A,
|
|
1135
|
+
onValueChange: (e) => we(e),
|
|
1136
|
+
children: ot.map((e) => /* @__PURE__ */ g(
|
|
1137
|
+
Dt,
|
|
1138
|
+
{
|
|
1139
|
+
value: e,
|
|
1140
|
+
label: h(`faceScheme.view.${ct[e].labelKey}`)
|
|
1141
|
+
},
|
|
1142
|
+
e
|
|
1143
|
+
))
|
|
1144
|
+
}
|
|
1145
|
+
),
|
|
1146
|
+
le && /* @__PURE__ */ T(
|
|
1147
|
+
"div",
|
|
1148
|
+
{
|
|
1149
|
+
"data-testid": "face-scheme-viewfinder",
|
|
1150
|
+
className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
|
|
1151
|
+
children: [
|
|
1152
|
+
/* @__PURE__ */ g(
|
|
1153
|
+
"video",
|
|
1154
|
+
{
|
|
1155
|
+
ref: ue,
|
|
1156
|
+
autoPlay: !0,
|
|
1157
|
+
playsInline: !0,
|
|
1158
|
+
muted: !0,
|
|
1159
|
+
"aria-label": h("faceScheme.capture.viewfinder"),
|
|
1160
|
+
className: "ds:mx-auto ds:block ds:w-full ds:max-w-[28rem] ds:[border-radius:var(--radius-md)] ds:[transform:scaleX(-1)]"
|
|
1161
|
+
}
|
|
1162
|
+
),
|
|
1163
|
+
/* @__PURE__ */ T("div", { className: "ds:flex ds:flex-wrap ds:justify-center ds:gap-[var(--spacing-xs)]", children: [
|
|
1164
|
+
/* @__PURE__ */ g(ie, { size: "sm", intent: "primary", onClick: () => St(), children: h("faceScheme.capture.capture") }),
|
|
1165
|
+
/* @__PURE__ */ g(ie, { size: "sm", intent: "outline", onClick: Ne, children: h("faceScheme.capture.cancel") })
|
|
1166
|
+
] })
|
|
1167
|
+
]
|
|
1168
|
+
}
|
|
1169
|
+
),
|
|
1170
|
+
!le && /* @__PURE__ */ g(ae.Provider, { delayDuration: 200, children: /* @__PURE__ */ T(
|
|
1171
|
+
"svg",
|
|
1172
|
+
{
|
|
1173
|
+
ref: F,
|
|
1174
|
+
"data-testid": "face-scheme-svg",
|
|
1175
|
+
viewBox: b.viewBox,
|
|
1176
|
+
role: "group",
|
|
1177
|
+
"aria-label": h(`faceScheme.view.${b.labelKey}`),
|
|
1178
|
+
className: "ds:mx-auto ds:block ds:h-auto ds:w-full ds:max-w-[28rem] ds:touch-none ds:[border-radius:var(--radius-md)]",
|
|
1179
|
+
children: [
|
|
1180
|
+
$ && /* @__PURE__ */ g(
|
|
1181
|
+
"image",
|
|
1182
|
+
{
|
|
1183
|
+
href: $,
|
|
1184
|
+
x: 0,
|
|
1185
|
+
y: 0,
|
|
1186
|
+
width: B,
|
|
1187
|
+
height: Q,
|
|
1188
|
+
preserveAspectRatio: "xMidYMid slice",
|
|
1189
|
+
role: "img",
|
|
1190
|
+
"aria-label": Lt
|
|
1191
|
+
}
|
|
1192
|
+
),
|
|
1193
|
+
/* @__PURE__ */ T("g", { transform: Kt, children: [
|
|
1194
|
+
!$ && /* @__PURE__ */ g(
|
|
1195
|
+
"path",
|
|
1196
|
+
{
|
|
1197
|
+
d: b.contour.d,
|
|
1198
|
+
"aria-hidden": "true",
|
|
1199
|
+
className: "ds:[fill:none] ds:[stroke:var(--accent)] ds:[stroke-opacity:0.4] ds:[stroke-width:1] ds:[vector-effect:non-scaling-stroke] ds:[stroke-dasharray:4_5]"
|
|
1200
|
+
}
|
|
1201
|
+
),
|
|
1202
|
+
b.zones.map((e) => {
|
|
1203
|
+
const r = Me[e.id] ?? [], a = r.length > 0;
|
|
1204
|
+
return /* @__PURE__ */ T(ae.Root, { children: [
|
|
1205
|
+
/* @__PURE__ */ g(ae.Trigger, { asChild: !0, children: /* @__PURE__ */ T(
|
|
1206
|
+
"g",
|
|
1207
|
+
{
|
|
1208
|
+
"data-zone": e.id,
|
|
1209
|
+
"data-side": e.side,
|
|
1210
|
+
role: G || x ? "button" : "img",
|
|
1211
|
+
"aria-label": Qe(e),
|
|
1212
|
+
"aria-pressed": G && y ? a : void 0,
|
|
1213
|
+
className: "ds:outline-none ds:[&:focus-visible>*:first-child]:[stroke:var(--ring)] ds:[&:focus-visible>*:first-child]:[stroke-width:var(--focus-ring-width)] ds:forced-colors:[&:focus-visible>*:first-child]:[stroke:CanvasText]",
|
|
1214
|
+
tabIndex: G || x ? 0 : -1,
|
|
1215
|
+
onClick: () => et(e),
|
|
1216
|
+
onKeyDown: (i) => {
|
|
1217
|
+
(i.key === "Enter" || i.key === " ") && (i.preventDefault(), et(e));
|
|
1218
|
+
},
|
|
1219
|
+
children: [
|
|
1220
|
+
/* @__PURE__ */ g(
|
|
1221
|
+
"path",
|
|
1222
|
+
{
|
|
1223
|
+
d: e.d,
|
|
1224
|
+
className: xn({ interactive: G, marked: a })
|
|
1225
|
+
}
|
|
1226
|
+
),
|
|
1227
|
+
r.map((i, v) => {
|
|
1228
|
+
const S = dt[i.type], _e = (v - (r.length - 1) / 2) * 26;
|
|
1229
|
+
return /* @__PURE__ */ g(
|
|
1230
|
+
"path",
|
|
1231
|
+
{
|
|
1232
|
+
d: jt(
|
|
1233
|
+
S.shape,
|
|
1234
|
+
e.cx + _e,
|
|
1235
|
+
e.cy,
|
|
1236
|
+
11
|
|
1237
|
+
),
|
|
1238
|
+
"aria-hidden": "true",
|
|
1239
|
+
className: vn[S.tone]
|
|
1240
|
+
},
|
|
1241
|
+
i.type
|
|
1242
|
+
);
|
|
1243
|
+
})
|
|
1244
|
+
]
|
|
1245
|
+
}
|
|
1246
|
+
) }),
|
|
1247
|
+
/* @__PURE__ */ g(ae.Portal, { children: /* @__PURE__ */ T(
|
|
1248
|
+
ae.Content,
|
|
1249
|
+
{
|
|
1250
|
+
sideOffset: 4,
|
|
1251
|
+
className: "ds:z-50 ds:rounded-[var(--radius-sm)] ds:bg-[var(--popover)] ds:px-2 ds:py-1 ds:text-[length:var(--font-size-xs)] ds:text-[var(--popover-foreground)] ds:shadow-[var(--shadow-md)]",
|
|
1252
|
+
children: [
|
|
1253
|
+
Qe(e),
|
|
1254
|
+
/* @__PURE__ */ g(ae.Arrow, { className: "ds:[fill:var(--popover)]" })
|
|
1255
|
+
]
|
|
1256
|
+
}
|
|
1257
|
+
) })
|
|
1258
|
+
] }, e.id);
|
|
1259
|
+
})
|
|
1260
|
+
] }),
|
|
1261
|
+
Be && $ && /* @__PURE__ */ g("g", { "aria-hidden": "true", "data-testid": "face-scheme-handles", children: b.landmarks.map((e, r) => {
|
|
1262
|
+
const a = Le[r] ?? H(ze(P, e));
|
|
1263
|
+
return /* @__PURE__ */ T("g", { children: [
|
|
1264
|
+
/* @__PURE__ */ g(
|
|
1265
|
+
"circle",
|
|
1266
|
+
{
|
|
1267
|
+
cx: a.x,
|
|
1268
|
+
cy: a.y,
|
|
1269
|
+
r: 13,
|
|
1270
|
+
"data-handle": e.id,
|
|
1271
|
+
onPointerDown: Ct(r),
|
|
1272
|
+
onPointerMove: bt,
|
|
1273
|
+
onPointerUp: wt,
|
|
1274
|
+
className: "ds:[fill:var(--background)] ds:[fill-opacity:0.9] ds:[stroke:var(--accent)] ds:[stroke-width:2.5] ds:[vector-effect:non-scaling-stroke] ds:cursor-grab ds:touch-none"
|
|
1275
|
+
}
|
|
1276
|
+
),
|
|
1277
|
+
/* @__PURE__ */ g(
|
|
1278
|
+
"path",
|
|
1279
|
+
{
|
|
1280
|
+
d: `M ${a.x - 5} ${a.y} H ${a.x + 5} M ${a.x} ${a.y - 5} V ${a.y + 5}`,
|
|
1281
|
+
className: "ds:[stroke:var(--accent)] ds:[stroke-width:2] ds:[vector-effect:non-scaling-stroke]",
|
|
1282
|
+
pointerEvents: "none"
|
|
1283
|
+
}
|
|
1284
|
+
)
|
|
1285
|
+
] }, e.id);
|
|
1286
|
+
}) })
|
|
1287
|
+
]
|
|
1288
|
+
}
|
|
1289
|
+
) }),
|
|
1290
|
+
Ft && /* @__PURE__ */ T("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]", children: [
|
|
1291
|
+
/* @__PURE__ */ T("div", { className: "ds:flex ds:flex-wrap ds:justify-center ds:gap-[var(--spacing-xs)]", children: [
|
|
1292
|
+
/* @__PURE__ */ g(
|
|
1293
|
+
ie,
|
|
1294
|
+
{
|
|
1295
|
+
ref: Pe,
|
|
1296
|
+
size: "sm",
|
|
1297
|
+
intent: $ ? "outline" : "primary",
|
|
1298
|
+
onClick: () => void Fe(),
|
|
1299
|
+
disabled: Ke === "requesting",
|
|
1300
|
+
children: h(
|
|
1301
|
+
$ ? "faceScheme.capture.retake" : "faceScheme.capture.take"
|
|
1302
|
+
)
|
|
1303
|
+
}
|
|
1304
|
+
),
|
|
1305
|
+
/* @__PURE__ */ g(
|
|
1306
|
+
ie,
|
|
1307
|
+
{
|
|
1308
|
+
size: "sm",
|
|
1309
|
+
intent: "outline",
|
|
1310
|
+
onClick: () => {
|
|
1311
|
+
var e;
|
|
1312
|
+
return (e = De.current) == null ? void 0 : e.click();
|
|
1313
|
+
},
|
|
1314
|
+
children: h("faceScheme.capture.upload")
|
|
1315
|
+
}
|
|
1316
|
+
),
|
|
1317
|
+
/* @__PURE__ */ g(
|
|
1318
|
+
"input",
|
|
1319
|
+
{
|
|
1320
|
+
ref: De,
|
|
1321
|
+
type: "file",
|
|
1322
|
+
accept: "image/*",
|
|
1323
|
+
capture: I,
|
|
1324
|
+
onChange: Et,
|
|
1325
|
+
className: "ds:sr-only",
|
|
1326
|
+
"aria-hidden": "true",
|
|
1327
|
+
tabIndex: -1,
|
|
1328
|
+
"data-testid": "face-scheme-file-input"
|
|
1329
|
+
}
|
|
1330
|
+
)
|
|
1331
|
+
] }),
|
|
1332
|
+
/* @__PURE__ */ g(
|
|
1333
|
+
"span",
|
|
1334
|
+
{
|
|
1335
|
+
role: "status",
|
|
1336
|
+
"aria-live": "polite",
|
|
1337
|
+
className: "ds:text-center ds:text-[length:var(--font-size-xs)] ds:text-[var(--destructive)] ds:empty:hidden",
|
|
1338
|
+
children: Ke === "error" && qe ? h(yn[qe]) : ""
|
|
1339
|
+
}
|
|
1340
|
+
)
|
|
1341
|
+
] }),
|
|
1342
|
+
Be && /* @__PURE__ */ T(
|
|
1343
|
+
"div",
|
|
1344
|
+
{
|
|
1345
|
+
className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]",
|
|
1346
|
+
"data-testid": "face-scheme-registration",
|
|
1347
|
+
children: [
|
|
1348
|
+
/* @__PURE__ */ g("p", { className: "ds:m-0 ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]", children: h("faceScheme.registration.hint") }),
|
|
1349
|
+
/* @__PURE__ */ g("div", { className: "ds:grid ds:grid-cols-1 ds:gap-[var(--spacing-xs)] ds:sm:grid-cols-2", children: bn.map((e) => {
|
|
1350
|
+
const r = Cn[e], a = e === "scaleX" || e === "scaleY";
|
|
1351
|
+
return /* @__PURE__ */ T(
|
|
1352
|
+
"div",
|
|
1353
|
+
{
|
|
1354
|
+
className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:text-[length:var(--font-size-xs)] ds:text-[var(--foreground)]",
|
|
1355
|
+
children: [
|
|
1356
|
+
/* @__PURE__ */ g("span", { children: h(`faceScheme.registration.${e}`) }),
|
|
1357
|
+
/* @__PURE__ */ g(
|
|
1358
|
+
zt,
|
|
1359
|
+
{
|
|
1360
|
+
"aria-label": h(`faceScheme.registration.${e}`),
|
|
1361
|
+
value: [Re[e]],
|
|
1362
|
+
min: r.min,
|
|
1363
|
+
max: r.max,
|
|
1364
|
+
step: r.step,
|
|
1365
|
+
formatValue: (i) => a ? `${Math.round(i * 100)}%` : e === "rotation" || e === "shear" ? `${i.toFixed(1)}°` : `${Math.round(i)}`,
|
|
1366
|
+
onValueChange: (i) => {
|
|
1367
|
+
const v = i[0];
|
|
1368
|
+
typeof v == "number" && Nt(e, v);
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
)
|
|
1372
|
+
]
|
|
1373
|
+
},
|
|
1374
|
+
e
|
|
1375
|
+
);
|
|
1376
|
+
}) }),
|
|
1377
|
+
/* @__PURE__ */ T("div", { className: "ds:flex ds:flex-wrap ds:gap-[var(--spacing-xs)]", children: [
|
|
1378
|
+
tt && /* @__PURE__ */ g(
|
|
1379
|
+
ie,
|
|
1380
|
+
{
|
|
1381
|
+
size: "sm",
|
|
1382
|
+
intent: "primary",
|
|
1383
|
+
onClick: () => void Ae(),
|
|
1384
|
+
disabled: ye === "loading" || ye === "detecting",
|
|
1385
|
+
children: h("faceScheme.registration.autoDetect")
|
|
1386
|
+
}
|
|
1387
|
+
),
|
|
1388
|
+
/* @__PURE__ */ g(
|
|
1389
|
+
ie,
|
|
1390
|
+
{
|
|
1391
|
+
size: "sm",
|
|
1392
|
+
intent: "outline",
|
|
1393
|
+
onClick: () => U(fe),
|
|
1394
|
+
children: h("faceScheme.registration.reset")
|
|
1395
|
+
}
|
|
1396
|
+
),
|
|
1397
|
+
tt && /* @__PURE__ */ g(
|
|
1398
|
+
"span",
|
|
1399
|
+
{
|
|
1400
|
+
role: "status",
|
|
1401
|
+
"aria-live": "polite",
|
|
1402
|
+
className: "ds:self-center ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]",
|
|
1403
|
+
children: ye === "idle" ? "" : h(`faceScheme.detect.${ye}`)
|
|
1404
|
+
}
|
|
1405
|
+
)
|
|
1406
|
+
] })
|
|
1407
|
+
]
|
|
1408
|
+
}
|
|
1409
|
+
),
|
|
1410
|
+
V && /* @__PURE__ */ g(
|
|
1411
|
+
"ul",
|
|
1412
|
+
{
|
|
1413
|
+
"aria-label": h("faceScheme.legendLabel"),
|
|
1414
|
+
className: "ds:flex ds:flex-wrap ds:gap-x-4 ds:gap-y-1 ds:p-0 ds:text-[length:var(--font-size-xs)] ds:text-[var(--muted-foreground)]",
|
|
1415
|
+
children: fn.map((e) => {
|
|
1416
|
+
const r = dt[e];
|
|
1417
|
+
return /* @__PURE__ */ g("li", { className: "ds:flex ds:list-none ds:items-center", children: /* @__PURE__ */ g(
|
|
1418
|
+
$t,
|
|
1419
|
+
{
|
|
1420
|
+
shape: r.shape,
|
|
1421
|
+
tone: r.tone,
|
|
1422
|
+
size: "sm",
|
|
1423
|
+
label: h(`faceScheme.finding.${e}`)
|
|
1424
|
+
}
|
|
1425
|
+
) }, e);
|
|
1426
|
+
})
|
|
1427
|
+
}
|
|
1428
|
+
)
|
|
1429
|
+
]
|
|
1430
|
+
}
|
|
1431
|
+
);
|
|
1432
|
+
}
|
|
1433
|
+
);
|
|
1434
|
+
wn.displayName = "FaceScheme";
|
|
1435
|
+
export {
|
|
1436
|
+
dt as F,
|
|
1437
|
+
fe as I,
|
|
1438
|
+
fn as a,
|
|
1439
|
+
ct as b,
|
|
1440
|
+
ot as c,
|
|
1441
|
+
wn as d,
|
|
1442
|
+
lt as e,
|
|
1443
|
+
ze as f,
|
|
1444
|
+
un as g,
|
|
1445
|
+
mn as h,
|
|
1446
|
+
Gt as i,
|
|
1447
|
+
Bt as j,
|
|
1448
|
+
ft as s
|
|
1449
|
+
};
|
|
1450
|
+
//# sourceMappingURL=face-scheme-DOZO3M_c.js.map
|