PageSourceSearch

https://www.symbiocenter.com/js/5469-legacy.68080e33.js

js symbiocenter.com collected 2026-10-03 20:09:49 UTC 30,396 bytes, 2 lines download raw bytes

1"use strict";(self["webpackChunktherapeute"]=self["webpackChunktherapeute"]||[]).push([[5469],{7761:function(t,e,s){var i=s(14189),a=s(95066),r=(s(62629),s(81656)),n=(0,r.A)(a.A,i.X,i.Y,!1,null,"656c7b07",null);e.A=n.exports},25366:function(t,e,s){var i=s(15037),a=s(34281),r=(s(53299),s(81656)),n=(0,r.A)(a.A,i.X,i.Y,!1,null,"30e4a1d1",null);e.A=n.exports},45469:function(t,e,s){s.r(e);var i=s(89964),a=s(28562),r=(s(70359),s(81656)),n=(0,r.A)(a.A,i.X,i.Y,!1,null,null,null);e["default"]=n.exports},89964:function(t,e,s){s.d(e,{X:function(){return i.X},Y:function(){return i.Y}});var i=s(46237)},62629:function(t,e,s){s(93162)},53299:function(t,e,s){s(12612)},70359:function(t,e,s){s(31732)},95066:function(t,e,s){var i=s(88873);e.A=i.A},34281:function(t,e,s){var i=s(8670);e.A=i.A},28562:function(t,e,s){var i=s(39357);e.A=i.A},14189:function(t,e,s){s.d(e,{X:function(){return i},Y:function(){return a}});var i=function(){var t=this,e=t._self._c;return e("div",{staticClass:"respiratory-curve"},[e("div",{staticClass:"curve-heading"},[e("span",{staticClass:"curve-phase"},[t._v(t._s(t.phaseLabel))]),e("span",{staticClass:"curve-hint"},[t._v("Suivez le point")])]),e("svg",{staticClass:"curve-svg",attrs:{viewBox:"0 0 600 250",role:"img","aria-label":"Guide respiratoire : la courbe monte à l’inspiration et descend à l’expiration. Aucune mesure cardiaque."}},[t._l(t.bands,function(s){return e("g",{key:s.key},[e("rect",{attrs:{x:s.x,y:"36",width:s.width,height:"188",fill:s.inhale?"rgba(164, 199, 176, 0.09)":"rgba(164, 199, 176, 0.025)"}}),s.width>85?e("text",{staticClass:"band-label",attrs:{x:s.x+s.width/2,y:"22","text-anchor":"middle"}},[t._v(" "+t._s(s.inhale?"Inspiration":"Expiration")+" ")]):t._e()])}),e("line",{staticClass:"curve-midline",attrs:{x1:"0",y1:"130",x2:"600",y2:"130"}}),e("path",{staticClass:"curve-line curve-line--past",attrs:{d:t.pastPath}}),e("path",{staticClass:"curve-line curve-line--future",attrs:{d:t.futurePath}}),e("line",{staticClass:"curve-marker-line",attrs:{x1:t.markerX,y1:"36",x2:t.markerX,y2:"224"}}),e("circle",{staticClass:"curve-marker-halo",attrs:{cx:t.markerX,cy:t.markerY,r:"15"}}),e("circle",{staticClass:"curve-marker",attrs:{cx:t.markerX,cy:t.markerY,r:"6"}})],2),e("p",{staticClass:"curve-caption"},[t._v(" Rythme respiratoire proposé · Sans mesure cardiaque ")])])},a=[]},15037:function(t,e,s){s.d(e,{X:function(){return i},Y:function(){return a}});var i=function(){var t=this,e=t._self._c;return e("section",{staticClass:"breathing-end",attrs:{"aria-label":"Après votre séance"}},[t.showOffers?e("div",{staticClass:"breathing-end__offers"},[e("article",{staticClass:"breathing-end__card"},[e("span",{staticClass:"breathing-end__eyebrow"},[t._v("POUR VOUS")]),e("h2",[t._v("Envie d’être accompagné dans votre pratique ?")]),e("p",[t._v("Découvrez notre programme de cohérence cardiaque pour avancer progressivement.")]),e("p",[t._v("Avec un capteur compatible, observez aussi votre réponse cardiaque pendant les exercices.")]),e("a",{staticClass:"breathing-end__button breathing-end__button--primary",attrs:{href:t.programUrl}},[t._v("Découvrir le programme")]),t.sensorUrl?e("a",{staticClass:"breathing-end__button",attrs:{href:t.sensorUrl}},[t._v("Découvrir les capteurs")]):t._e()]),e("article",{staticClass:"breathing-end__card breathing-end__card--pro"},[e("span",{staticClass:"breathing-end__eyebrow"},[t._v("VOUS ÊTES PROFESSIONNEL ?")]),e("h3",[t._v("Proposez cet exercice à vos patients")]),e("p",[t._v("Partagez ce guide gratuit, sans compte. Découvrez aussi les possibilités d’accompagnement et de suivi de l’espace professionnel.")]),e("a",{staticClass:"breathing-end__button",attrs:{href:t.professionalUrl}},[t._v("Découvrir l’espace professionnel")])])]):t._e(),e("div",{staticClass:"breathing-end__actions"},[e("button",{staticClass:"breathing-end__button",attrs:{type:"button"},on:{click:function(e){return t.$emit("restart")}}},[t._v("Refaire une séance gratuite")]),e("button",{ref:"shareToggle",staticClass:"breathing-end__button",attrs:{type:"button","aria-expanded":t.shareOpen?"true":"false","aria-controls":t.panelId},on:{click:t.toggleShare}},[t._v(" "+t._s(t.shareOpen?"Fermer le partage":"Partager l’exercice")+" ")])]),t.shareOpen?e("section",{staticClass:"breathing-end__share",attrs:{id:t.panelId,"aria-labelledby":t.panelId+"-title"},on:{keydown:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"esc",27,e.key,["Esc","Escape"])?null:(e.stopPropagation(),e.preventDefault(),t.closeShare.apply(null,arguments))}}},[e("h3",{attrs:{id:t.panelId+"-title"}},[t._v("Une pause à partager")]),e("p",[t._v("Transmettez ce lien ou faites scanner le QR code pour ouvrir directement l’exercice gratuit.")]),e("label",{attrs:{for:t.panelId+"-link"}},[t._v("Lien de l’exercice")]),e("input",{ref:"shareInput",attrs:{id:t.panelId+"-link",type:"text",readonly:""},domProps:{value:t.publicUrl},on:{focus:function(t){return t.target.select()}}}),e("div",{staticClass:"breathing-end__actions"},[e("button",{staticClass:"breathing-end__button",attrs:{type:"button",disabled:!t.publicUrl||t.copying},on:{click:t.copyLink}},[t._v(" "+t._s(t.copying?"Copie en cours…":"Copier le lien")+" ")]),t.canShare?e("button",{staticClass:"breathing-end__button",attrs:{type:"button",disabled:t.sharing||!t.publicUrl},on:{click:t.nativeShare}},[t._v(" Partager via… ")]):t._e()]),t.qrDataUrl?e("figure",{staticClass:"breathing-end__qr"},[e("img",{attrs:{src:t.qrDataUrl,width:"240",height:"240",alt:"QR code pour ouvrir l’exercice gratuit de respiration SymbioCenter"}}),e("figcaption",[t._v("Gratuit · Sans compte · Sans capteur")]),e("a",{staticClass:"breathing-end__button",attrs:{href:t.qrDataUrl,download:"symbiocenter-respiration-qr.png"}},[t._v("Télécharger le QR code")])]):t.qrLoading?e("p",[t._v("Préparation du QR code…")]):t._e(),t.qrError?e("p",[t._v(t._s(t.qrError))]):t._e(),t.qrError?e("button",{staticClass:"breathing-end__button",attrs:{type:"button"},on:{click:t.generateQr}},[t._v("Réessayer le QR code")]):t._e(),e("p",{staticClass:"breathing-end__feedback",attrs:{role:"status","aria-live":"polite"}},[t._v(t._s(t.shareMessage))])]):t._e()])},a=[]},46237:function(t,e,s){s.d(e,{X:function(){return i},Y:function(){return a}});var i=function(){var t=this,e=t._self._c;
1return e("main",{staticClass:"respiration-page",class:{"is-running":"running"===t.status}},[t._m(0),e("section",{staticClass:"practice",attrs:{"aria-labelledby":"practice-title"}},[e("div",{staticClass:"practice-heading"},["ready"===t.status?e("span",{staticClass:"eyebrow"},[t._v(" RESPIRATION GUIDÉE · COHÉRENCE CARDIAQUE ")]):t._e(),e("h1",{attrs:{id:"practice-title"}},[t._v(t._s(t.pageTitle))]),e("p",{staticClass:"subtitle"},[t._v(t._s(t.pageSubtitle))])]),t.settingsOpen||"finished"===t.status?t._e():e("div",{staticClass:"view-selector",attrs:{role:"group","aria-label":"Affichage du guide respiratoire"}},[e("button",{class:{selected:"circle"===t.displayMode},attrs:{type:"button","aria-pressed":"circle"===t.displayMode},on:{click:function(e){t.displayMode="circle"}}},[t._v(" Cercle ")]),e("button",{class:{selected:"curve"===t.displayMode},attrs:{type:"button","aria-pressed":"curve"===t.displayMode},on:{click:function(e){t.displayMode="curve"}}},[t._v(" Courbe ")])]),e("div",{staticClass:"guide-stage",class:{"show-settings":t.settingsOpen}},[t.settingsOpen?e("section",{staticClass:"settings-panel",attrs:{id:"breathing-settings","aria-labelledby":"settings-title"}},[e("h2",{attrs:{id:"settings-title"}},[t._v("Trouvez votre rythme")]),e("p",{staticClass:"settings-intro"},[t._v(" Choisissez un cycle confortable pour vous, sans forcer. ")]),e("div",{staticClass:"preset-list"},t._l(t.rhythmPresets,function(s){return e("button",{key:s.id,staticClass:"preset-button",class:{selected:t.selectedRhythm===s.id},attrs:{type:"button","aria-pressed":t.selectedRhythm===s.id},on:{click:function(e){return t.chooseRhythm(s)}}},[e("span",[t._v(t._s(s.label))]),e("small",[t._v(" "+t._s(t.formatNumber(s.inspiration))+" s / "+t._s(t.formatNumber(s.expiration))+" s ")])])}),0),e("button",{staticClass:"text-button custom-toggle",attrs:{type:"button","aria-expanded":t.customSettingsOpen,"aria-controls":"custom-timing"},on:{click:function(e){t.customSettingsOpen=!t.customSettingsOpen}}},[t._v(" "+t._s(t.customSettingsOpen?"Masquer les réglages personnalisés":"Réglages personnalisés")+" ")]),t.customSettingsOpen?e("div",{staticClass:"timing-fields",attrs:{id:"custom-timing"}},[e("label",[e("span",[t._v("Inspiration")]),e("select",{domProps:{value:t.inspirationSeconds},on:{change:function(e){return t.changeTiming("inspirationSeconds",e)}}},t._l(t.timingOptions,function(s){return e("option",{key:s,domProps:{value:s}},[t._v(" "+t._s(t.formatNumber(s))+" secondes ")])}),0)]),e("label",[e("span",[t._v("Expiration")]),e("select",{domProps:{value:t.expirationSeconds},on:{change:function(e){return t.changeTiming("expirationSeconds",e)}}},t._l(t.timingOptions,function(s){return e("option",{key:s,domProps:{value:s}},[t._v(" "+t._s(t.formatNumber(s))+" secondes ")])}),0)])]):t._e(),e("p",{staticClass:"settings-summary"},[t._v(" "+t._s(t.cyclesPerMinute)+" cycles par minute · sans rétention ")]),e("fieldset",{staticClass:"duration-choice",attrs:{disabled:"ready"!==t.status}},[e("legend",[t._v("Durée de la séance")]),t._l([3,5],function(s){return e("label",{key:s},[e("input",{directives:[{name:"model",rawName:"v-model",value:t.duration,expression:"duration"}],attrs:{type:"radio",name:"session-duration"},domProps:{value:s,checked:t._q(t.duration,s)},on:{change:function(e){t.duration=s}}}),t._v(" "+t._s(s)+" minutes ")])})],2),"paused"===t.status?e("p",{staticClass:"settings-help"},[t._v(" Reprenez quand vous êtes prêt : le guide repartira sur une inspiration. ")]):t._e(),e("button",{staticClass:"settings-done",attrs:{type:"button"},on:{click:t.validateSettings}},[t._v(" "+t._s("paused"===t.status?"Valider et reprendre":"Valider et commencer")+" ")])]):"running"===t.status?e("div",{staticClass:"active-guide"},[e("BreathingGuide",{directives:[{name:"show",rawName:"v-show",value:"circle"===t.displayMode,expression:"displayMode === 'circle'"}],ref:"breathingGuide",on:{"hook:mounted":t.applyBreathingSettings,"breath-phase-change":t.onBreathPhaseChange}}),"curve"===t.displayMode?e("CourbeRespiratoire",{attrs:{inspiration:t.inspirationSeconds,expiration:t.expirationSeconds,"phase-state":t.breathPhaseState,active:!0}}):t._e()],1):"curve"===t.displayMode&&"finished"!==t.status?e("CourbeRespiratoire",{attrs:{inspiration:t.inspirationSeconds,expiration:t.expirationSeconds,active:!1}}):e("div",{staticClass:"resting-guide"},[e("div",{staticClass:"resting-circle",attrs:{"aria-hidden":"true"}},["finished"===t.status?e("span",{staticClass:"finished-mark"},[t._v(" ✓ ")]):e("span",{staticClass:"resting-core"})]),e("p",{staticClass:"resting-label"},[t._v(" "+t._s("finished"===t.status?"Un moment pour vous":"paused"===t.status?"À votre rythme":"Installez-vous confortablement")+" ")])])],1),"f
1inished"!==t.status?[t.settingsOpen?t._e():e("p",{staticClass:"time-display"},[e("span",{staticClass:"time-value"},[t._v(t._s(t.formattedRemaining))]),e("span",{staticClass:"time-caption"},[t._v(" "+t._s("ready"===t.status?"pour vous":"restantes")+" ")])]),t.settingsOpen?t._e():e("div",{staticClass:"main-actions"},["ready"===t.status?e("button",{staticClass:"primary-button",attrs:{type:"button"},on:{click:t.start}},[t._v(" Commencer ")]):"running"===t.status?e("button",{staticClass:"secondary-button",attrs:{type:"button"},on:{click:t.pause}},[t._v(" Mettre en pause ")]):e("button",{staticClass:"primary-button",attrs:{type:"button"},on:{click:t.start}},[t._v(" Reprendre ")])]),t.settingsOpen?t._e():e("div",{staticClass:"small-actions"},["running"===t.status?e("button",{staticClass:"sound-toggle",class:{"is-active":t.soundEnabled},attrs:{type:"button","aria-pressed":t.soundEnabled},on:{click:t.toggleSound}},[e("span",{staticClass:"sound-indicator",attrs:{"aria-hidden":"true"}}),t._v(" "+t._s(t.soundEnabled?"Son activé":"Activer le son")+" ")]):t._e(),e("button",{staticClass:"text-button",attrs:{type:"button","aria-expanded":t.settingsOpen,"aria-controls":"breathing-settings"},on:{click:t.toggleSettings}},[t._v(" "+t._s(t.settingsOpen?"Fermer les réglages":"Adapter mon rythme")+" ")]),"paused"===t.status?e("button",{staticClass:"text-button",attrs:{type:"button"},on:{click:t.reset}},[t._v(" Recommencer ")]):t._e()]),"running"===t.status||t.settingsOpen?t._e():e("p",{staticClass:"rhythm-summary"},[t._v(" Inspiration "+t._s(t.formatNumber(t.inspirationSeconds))+" s "),e("span",{attrs:{"aria-hidden":"true"}},[t._v("·")]),t._v(" Expiration "+t._s(t.formatNumber(t.expirationSeconds))+" s ")]),"ready"!==t.status||t.settingsOpen?t._e():e("p",{staticClass:"access-note"},[t._v(" Gratuit · Sans compte · Sans capteur ")]),"finished"===t.status||t.settingsOpen?t._e():e("div",{staticClass:"quick-share-actions"},[e("button",{staticClass:"share-exercise-button",attrs:{type:"button","aria-label":"Partager cet exercice de respiration guidée"},on:{click:t.shareExercise}},[e("svg",{staticClass:"share-exercise-icon",attrs:{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false"}},[e("circle",{attrs:{cx:"18",cy:"5",r:"3"}}),e("circle",{attrs:{cx:"6",cy:"12",r:"3"}}),e("circle",{attrs:{cx:"18",cy:"19",r:"3"}}),e("path",{attrs:{d:"M8.6 10.7 15.4 6.3"}}),e("path",{attrs:{d:"M8.6 13.3 15.4 17.7"}})]),e("span",[t._v("Partager")])]),e("button",{staticClass:"share-exercise-button",class:{"is-active":t.qrOpen},attrs:{type:"button","aria-expanded":t.qrOpen?"true":"false","aria-controls":"quick-respiration-qr"},on:{click:t.toggleQr}},[e("svg",{staticClass:"share-exercise-icon qr-icon",attrs:{viewBox:"0 0 24 24","aria-hidden":"true",focusable:"false"}},[e("rect",{attrs:{x:"3",y:"3",width:"6",height:"6",rx:"1"}}),e("rect",{attrs:{x:"15",y:"3",width:"6",height:"6",rx:"1"}}),e("rect",{attrs:{x:"3",y:"15",width:"6",height:"6",rx:"1"}}),e("path",{attrs:{d:"M15 15h2v2h-2z"}}),e("path",{attrs:{d:"M19 15h2v4"}}),e("path",{attrs:{d:"M15 19h4v2"}}),e("path",{attrs:{d:"M21 21h0"}})]),e("span",[t._v("QR code")])])]),t.qrOpen&&"finished"!==t.status&&!t.settingsOpen?e("div",{staticClass:"quick-qr-panel",attrs:{id:"quick-respiration-qr"}},[e("p",{staticClass:"quick-qr-title"},[t._v(" Scannez pour ouvrir l’exercice ")]),e("p",{staticClass:"quick-qr-subtitle"},[t._v(" Respiration guidée gratuite · Sans compte · Sans capteur ")]),t.qrLoading?e("div",{staticClass:"quick-qr-loading"},[t._v(" Préparation du QR code… ")]):t.qrDataUrl?e("img",{staticClass:"quick-qr-image",attrs:{src:t.qrDataUrl,width:"220",height:"220",alt:"QR code pour ouvrir l’exercice gratuit de respiration guidée SymbioCenter"}}):t._e(),t.qrError?e("p",{staticClass:"quick-qr-error"},[t._v(" "+t._s(t.qrError)+" ")]):t._e(),t.qrError?e("button",{staticClass:"text-button",attrs:{type:"button"},on:{click:t.generateQr}},[t._v(" Réessayer ")]):t._e()]):t._e()]:e("FinSeanceRespiration",{attrs:{"show-offers":!t.$isIOSAppFlutterWebView,"program-url":t.programUrl,"sensor-url":t.sensorUrl,"professional-url":"/#/inscription-credits","exercise-url":"/respiration-guidee/"},on:{restart:t.reset}}),e("p",{staticClass:"status-message",attrs:{role:"status"}},[t._v(" "+t._s(t.statusMessage)+" ")])],2),"ready"===t.status?e("section",{staticClass:"seo-content",attrs:{"aria-labelledby":"seo-title"}},[e("h2",{attrs:{id:"seo-title"}},[t._v(" Un exercice de respiration guidée gratuit en ligne ")]),t._m(1),e("h2",[t._v(" Comment pratiquer la cohérence cardiaque ? ")]),e("p",[t._v(" Suivez le cercle respiratoire ou la courbe affichée à l’écran : inspirez lorsque le guide monte ou se développe, puis expirez lorsqu’il redescend. Le rythme proposé peut être adapté afin de conserver une respiration confortable et régulière. ")]),e("h2",[t._v(" Une respiration que vous pouvez adapter à votre rythme ")]),e("p",[t._v(" SymbioCenter vous permet de choisir une respiration équilibrée, une expiration prolongée ou un cycle plus court. Vous pouvez aussi régler précisément la durée de l’inspiration et de l’expiration avant de commencer votre séance. ")]),e("h2",[t._v(" Respiration guidée, stress et retour au calme ")]),e("p",[t._v(" Une respiration lente et régulière peut être utilisée comme exercice de retour au calme et de régulation du stress. L’objectif n’est pas de forcer votre respiration, mais de trouver progressivement un rythme confortable que vous pouvez reproduire au quotidien. ")]),t._m(2)]):t._e(),t._m(3)])},a=[function(){var t=this,e=t._self._c;return e("header",{staticClass:"page-header"},[e("a",{attrs:{href:"/#/connexion","aria-label":"Retour à SymbioCenter"}},[e("img",{staticClass:"brand-logo",attrs:{src:s(83832),alt:"SymbioCenter"}})])])},function(){var t=this,e=t._self._c;
1return e("p",[t._v(" Cette respiration guidée vous accompagne pendant "),e("strong",[t._v("3 ou 5 minutes")]),t._v(" avec un rythme régulier d’inspiration et d’expiration. Elle permet de pratiquer simplement la "),e("strong",[t._v("cohérence cardiaque")]),t._v(", directement depuis votre navigateur, sans compte et sans capteur. ")])},function(){var t=this,e=t._self._c;return e("p",{staticClass:"seo-content__cta"},[t._v(" Vous souhaitez aller plus loin ? "),e("a",{attrs:{href:"/#/presentation-programmes-patients?section=coherence-cardiaque"}},[t._v(" Découvrez le programme de cohérence cardiaque SymbioCenter ")]),t._v(". ")])},function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-footer"},[e("p",[t._v(" Ce guide accompagne votre respiration. Il ne mesure pas votre activité cardiaque. ")]),e("a",{attrs:{href:"/#/presentation-programmes-patients?section=coherence-cardiaque"}},[t._v(" Revenir à l'accueil ")])])}]},93162:function(){},12612:function(){},31732:function(){},88873:function(t,e){e.A={name:"CourbeRespiratoire",props:{inspiration:{type:Number,default:4.5},expiration:{type:Number,default:5.5},phaseState:{type:Object,default:null},active:{type:Boolean,default:!1}},data(){return{currentTime:0,animationFrame:null,markerX:210}},computed:{inhaleSeconds(){return Number.isFinite(this.inspiration)?Math.max(.1,this.inspiration):4.5},exhaleSeconds(){return Number.isFinite(this.expiration)?Math.max(.1,this.expiration):5.5},cycleSeconds(){return this.inhaleSeconds+this.exhaleSeconds},visibleSeconds(){return 1.5*this.cycleSeconds},windowStart(){return this.currentTime-this.markerX/600*this.visibleSeconds},phaseLabel(){return this.phaseState?"Expirez"===this.phaseState.phase?"Expirez":"Inspirez":"Préparez-vous"},markerY(){return this.yAt(this.currentTime)},pastPath(){return this.makePath(0,this.markerX)},futurePath(){return this.makePath(this.markerX,600)},bands(){const t=[],e=Math.floor(this.windowStart/this.cycleSeconds);for(let s=e;s<=e+3;s++){const e=s*this.cycleSeconds,i=[{start:e,end:e+this.inhaleSeconds,inhale:!0},{start:e+this.inhaleSeconds,end:e+this.cycleSeconds,inhale:!1}];i.forEach((e,i)=>{const a=this.xAt(e.start),r=this.xAt(e.end),n=Math.max(0,a),o=Math.min(600,r);o>n&&t.push({key:`${s}-${i}`,x:n,width:o-n,inhale:e.inhale})})}return t}},watch:{active(t){t?this.startAnimation():this.stopAnimation()},phaseState(){this.syncTime()}},mounted(){this.syncTime(),this.active&&this.startAnimation()},beforeDestroy(){this.stopAnimation()},methods:{xAt(t){return(t-this.windowStart)/this.visibleSeconds*600},yAt(t){const e=(t%this.cycleSeconds+this.cycleSeconds)%this.cycleSeconds;let s;if(e<this.inhaleSeconds){const t=e/this.inhaleSeconds;s=-Math.cos(Math.PI*t)}else{const t=(e-this.inhaleSeconds)/this.exhaleSeconds;s=Math.cos(Math.PI*t)}return 130-72*s},makePath(t,e){const s=[];for(let a=t;a<e;a+=3){const t=this.windowStart+a/600*this.visibleSeconds;s.push(`${a.toFixed(2)},${this.yAt(t).toFixed(2)}`)}const i=this.windowStart+e/600*this.visibleSeconds;return s.push(`${e.toFixed(2)},${this.yAt(i).toFixed(2)}`),`M ${s.join(" L ")}`},syncTime(){const t=this.phaseState;if(!t||!Number.isFinite(t.phaseStartedAtPerf))return void(this.currentTime=0);const e="Expirez"===t.phase,s=e?this.exhaleSeconds:this.inhaleSeconds,i=Math.max(0,(performance.now()-t.phaseStartedAtPerf)/1e3),a=Math.min(s,i);this.currentTime=(e?this.inhaleSeconds:0)+a},startAnimation(){this.stopAnimation();const t=()=>{this.active&&(this.syncTime(),this.animationFrame=requestAnimationFrame(t))};t()},stopAnimation(){null!==this.animationFrame&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null)}}}},8670:function(t,e,s){var i=s(87583);e.A={name:"FinSeanceRespiration",props:{showOffers:{type:Boolean,default:!0},programUrl:{type:String,default:"/#/presentation-programmes-patients?section=coherence-cardiaque"},professionalUrl:{type:String,default:"/#/inscription-credits"},sensorUrl:{type:String,default:""},exerciseUrl:{type:String,default:""},panelId:{type:String,default:"breathing-share-panel"}},data(){return{shareOpen:!1,publicUrl:"",qrDataUrl:"",qrLoading:!1,qrError:"",shareMessage:"",canShare:!1,sharing:!1,copying:!1}},mounted(){this.canShare="function"===typeof navigator.share;try{const t=this.exerciseUrl||"/respiration-guidee/",e=new URL(t,window.location.origin);if(!["https:","http:"].includes(e.protocol))throw new Error("Unsupported URL");this.publicUrl=e.href}catch(t){this.shareMessage="Le lien est indisponible. Vérifiez l’adresse publique de l’exercice."}},methods:{async toggleShare(){this.shareOpen?this.closeShare():(this.shareOpen=!0,await this.$nextTick(),this.$refs.shareInput&&this.$refs.shareInput.focus(),this.generateQr())},closeShare(){this.shareOpen=!1,this.$nextTick(()=>{this.$refs.shareToggle&&this.$refs.shareToggle.focus()})},async generateQr(){if(this.publicUrl&&!this.qrDataUrl&&!this.qrLoading){this.qrLoading=!0,this.qrError="";try{this.qrDataUrl=await i.toDataURL(this.publicUrl,{width:480,margin:4,errorCorrectionLevel:"M",color:{dar
1k:"#17352C",light:"#FFFFFF"}})}catch(t){this.qrError="Le QR code n’a pas pu être créé. Vous pouvez toujours copier le lien."}finally{this.qrLoading=!1}}},async copyLink(){if(this.publicUrl&&!this.copying){this.copying=!0,this.shareMessage="";try{if(!navigator.clipboard||!navigator.clipboard.writeText)throw new Error("Clipboard unavailable");await navigator.clipboard.writeText(this.publicUrl),this.shareMessage="Lien copié. Vous pouvez le coller dans votre message."}catch(t){const e=this.$refs.shareInput;e&&(e.focus(),e.select(),e.setSelectionRange(0,e.value.length)),this.shareMessage="Sélectionnez et copiez le lien affiché ci-dessus avec la commande Copier de votre appareil."}finally{this.copying=!1}}},async nativeShare(){if(this.publicUrl&&!this.sharing){this.sharing=!0,this.shareMessage="";try{await navigator.share({title:"Une pause respiration avec SymbioCenter",text:"Un exercice de respiration guidée gratuit, sans compte et sans capteur.",url:this.publicUrl})}catch(t){t&&"AbortError"===t.name||(this.shareMessage="Le partage n’est pas disponible. Utilisez « Copier le lien ».")}finally{this.sharing=!1}}}}}},39357:function(t,e,s){var i=s(40621),a=s(7761),r=s(25366),n=s(87583);const o=new Intl.NumberFormat("fr-FR",{maximumFractionDigits:1});e.A={name:"RespirationGuidee",components:{BreathingGuide:i.A,CourbeRespiratoire:a.A,FinSeanceRespiration:r.A},data(){return{duration:3,status:"ready",elapsedMs:0,elapsedBeforeRun:0,startedAt:null,timerId:null,statusMessage:"",settingsOpen:!1,customSettingsOpen:!1,soundEnabled:!1,soundPending:!1,sharePending:!1,qrOpen:!1,qrDataUrl:"",qrLoading:!1,qrError:"",displayMode:"circle",breathPhaseState:null,inspirationSeconds:4.5,expirationSeconds:5.5,rhythmPresets:[{id:"balanced",label:"Temps égaux",inspiration:5,expiration:5},{id:"extended",label:"Expiration prolongée",inspiration:4.5,expiration:5.5},{id:"shorter",label:"Cycle plus court",inspiration:3,expiration:4}],timingOptions:Array.from({length:17},(t,e)=>2+.5*e),programUrl:"/#/presentation-programmes-patients?section=coherence-cardiaque",sensorUrl:""}},computed:{pageTitle(){return"running"===this.status?"Suivez votre respiration":"paused"===this.status?"Prenez votre temps":"finished"===this.status?"Votre pause est terminée":"Respiration guidée pour la cohérence cardiaque"},pageSubtitle(){return"running"===this.status?"Doucement. Sans chercher à forcer.":"paused"===this.status?"Reprenez lorsque vous en avez envie.":"finished"===this.status?"Prenez un instant pour observer votre ressenti.":`Laissez-vous guider pendant ${this.duration} minutes.`},totalMs(){return 60*this.duration*1e3},formattedRemaining(){const t=Math.ceil(Math.max(0,this.totalMs-this.elapsedMs)/1e3);return String(Math.floor(t/60)).padStart(2,"0")+":"+String(t%60).padStart(2,"0")},selectedRhythm(){const t=this.rhythmPresets.find(t=>t.inspiration===this.inspirationSeconds&&t.expiration===this.expirationSeconds);return t?t.id:null},cyclesPerMinute(){return this.formatNumber(60/(this.inspirationSeconds+this.expirationSeconds))}},mounted(){document.addEventListener("visibilitychange",this.onVisibilityChange)},beforeDestroy(){this.clearTimer(),this.startedAt=null,this.status="destroyed",document.removeEventListener("visibilitychange",this.onVisibilityChange)},methods:{getPublicExerciseUrl(){return new URL("/respiration-guidee/",window.location.origin).href},async shareExercise(){if(this.sharePending)return;this.sharePending=!0;const t=this.getPublicExerciseUrl();try{if("running"===this.status&&this.pause(),"function"===typeof navigator.share)try{return void await navigator.share({title:"Respiration guidée et cohérence cardiaque | SymbioCenter",text:"Un exercice gratuit de respiration guidée et de cohérence cardiaque, sans compte et sans capteur.",url:t})}catch(e){if(e&&"AbortError"===e.name)return}if("destroyed"===this.status)return;if(navigator.clipboard&&navigator.clipboard.writeText)return await navigator.clipboard.writeText(t),void("destroyed"!==this.status&&(this.statusMessage="Lien copié. Vous pouvez maintenant partager cet exercice."));this.statusMessage=`Partagez cette adresse : ${t}`}catch(e){"destroyed"!==this.status&&(this.statusMessage=`Copiez cette adresse pour partager l’exercice : ${t}`)}finally{this.sharePending=!1}},async toggleQr(){this.qrOpen?this.qrOpen=!1:("running"===this.status&&this.pause(),"finished"!==this.status&&"destroyed"!==this.status&&(this.qrOpen=!0,await this.generateQr()))},async generateQr(){if(!this.qrLoading&&!this.qrDataUrl){this.qrLoading=!0,this.qrError="";try{const t=await n.toDataURL(this.getPublicExerciseUrl(),{width:440,margin:3,errorCorrectionLevel:"M",color:{dar
1k:"#17352C",light:"#FFFFFF"}});"destroyed"!==this.status&&(this.qrDataUrl=t)}catch(t){"destroyed"!==this.status&&(this.qrError="Le QR code n’a pas pu être créé. Vous pouvez réessayer.")}finally{this.qrLoading=!1}}},validateSettings(){this.settingsOpen=!1,this.start()},onBreathPhaseChange(t){"running"===this.status&&t&&(this.breathPhaseState={...t})},formatNumber(t){return o.format(Number(t))},start(){"ready"!==this.status&&"paused"!==this.status||(this.breathPhaseState=null,this.qrOpen=!1,this.settingsOpen=!1,this.statusMessage="",this.elapsedBeforeRun=this.elapsedMs,this.startedAt=performance.now(),this.status="running",this.clearTimer(),this.timerId=window.setInterval(this.tick,100))},async applyBreathingSettings(){const t=this.$refs.breathingGuide;if(!t||"running"!==this.status)return;if(t.cpm=String(60/(this.inspirationSeconds+this.expirationSeconds)),t.updateCycle({inspi:this.inspirationSeconds,expi:this.expirationSeconds,pauseInspi:0,pauseExpi:0}),!this.soundEnabled)return;try{await t.unlockAudio()}catch(i){}if("running"!==this.status||this.$refs.breathingGuide!==t||!this.soundEnabled)return;if(!t.audioCtx||"running"!==t.audioCtx.state)return this.soundEnabled=!1,void(this.statusMessage="Touchez « Activer le son » pour rétablir le guide sonore.");t.metronomeEnabled=!0;const e="Inspirez"===t.currentPhase?"inspi":"Expirez"===t.currentPhase?"expi":null,s=Number(t.phaseRemaining);e&&s>=.8&&t.playBreathSound(e,s)},async toggleSound(){const t=this.$refs.breathingGuide;if(t&&"running"===this.status&&!this.soundPending){if(this.soundEnabled)return this.soundEnabled=!1,t.metronomeEnabled=!1,t.stopActiveAudio(),void(this.statusMessage="Son désactivé.");this.soundPending=!0;try{try{await t.unlockAudio()}catch(e){}if("running"!==this.status||this.$refs.breathingGuide!==t)return;if(!t.audioCtx||"running"!==t.audioCtx.state)return void(this.statusMessage="Le son n’a pas pu être activé. Vous pouvez réessayer.");this.soundEnabled=!0,t.metronomeEnabled=!0,this.statusMessage="Le son accompagnera la prochaine phase respiratoire."}finally{this.soundPending=!1}}},tick(){"running"===this.status&&null!==this.startedAt&&(this.elapsedMs=Math.min(this.totalMs,this.elapsedBeforeRun+performance.now()-this.startedAt),this.elapsedMs>=this.totalMs&&(this.clearTimer(),this.startedAt=null,this.soundEnabled=!1,this.settingsOpen=!1,this.qrOpen=!1,this.status="finished",this.statusMessage="Séance terminée."))},pause(){"running"===this.status&&(this.tick(),"finished"!==this.status&&(this.clearTimer(),this.startedAt=null,this.status="paused",this.statusMessage="Séance en pause."))},reset(){this.clearTimer(),this.startedAt=null,this.elapsedMs=0,this.elapsedBeforeRun=0,this.soundEnabled=!1,this.settingsOpen=!1,this.customSettingsOpen=!1,this.qrOpen=!1,this.breathPhaseState=null,this.status="ready",this.statusMessage=""},clearTimer(){null!==this.timerId&&(window.clearInterval(this.timerId),this.timerId=null)},toggleSettings(){"running"===this.status&&this.pause(),"finished"!==this.status&&(this.qrOpen=!1,this.settingsOpen=!this.settingsOpen)},chooseRhythm(t){this.inspirationSeconds=t.inspiration,this.expirationSeconds=t.expiration,this.announceRhythmChange()},changeTiming(t,e){const s=Number(e.target.value);this.timingOptions.includes(s)&&("inspirationSeconds"!==t&&"expirationSeconds"!==t||(this[t]=s,this.announceRhythmChange()))},announceRhythmChange(){this.statusMessage=`Rythme choisi : ${this.formatNumber(this.inspirationSeconds)} secondes d’inspiration et ${this.formatNumber(this.expirationSeconds)} secondes d’expiration.`},onVisibilityChange(){document.hidden&&"running"===this.status&&(this.pause(),"paused"===this.status&&(this.statusMessage="Votre séance a été mise en pause pendant votre absence."))}}}}}]);
2//# sourceMappingURL=5469-legacy.68080e33.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.