N44CYCGQAWWGNV4D53SEJFM4UTSEZDT2YO33XGFXI2W37HQHKWDQC 7MCTB5G2W6IB7JQXGO2HCMRHBUYIOKXI4MBODKLAJIK66EMLC5ZQC QHVOZBISIQ3E3P5F6GGKWVDSXC4OA23HCIH2OMXEVGXKSF5W4APAC P7KZ25R4CNS4PZITRWPBVXRFSLY5TKCOFO6U3SDKX45ITNVU773QC FERLNXU2QISSKOUBSPABB2ERHOWHQRI2GVKDJ352Y4B2FUXBRGRQC 3DZWNZUZGMHJH3JL3H7KN746C6XVNBRBFHBSVSB5AH7YYUFVYVDAC KNH5OGCTL3YCOQQPA32M76SGWHGHAPQRIZ7S2CBC5DGIEV32SOYQC TLRGOVFX6KIWQSWRPXS73WW4EHJQ5L5W5NYMO6UM2EF2H3EPAHHQC V3QTRVNR5EVDZ2O2WRK7ZCVKSGGYBSNILH44OWXKOJK2ME5JC7UQC Y62XTAEHAC5MNJELNKACRLEVBUU2MKYKFPHB5M2S5X46B4EI2JJQC XTPX4PYLPGJAEK52LYOYHLVRCL7N5FFAEY4E3OL23LOWLYPLCILQC 3LZ4UD3N3VL3ZVTS25P3QKICCM4VXODR2OHTE5GPS2WGG3WRILYQC UR5RFMWCD455OQZMTDQ2MSVJUPBNEUQHOBJ2UJBDWVHRJ4SOA5NAC LU257USNNJW57H5M5E46IB2E3IBFNYBXB6EPEM63BYC23NNVHCFQC PI6D6Y5EHSXHSILBYHKRKXWXZ6H6JOR5ZTP44CXBW4LUUIREY7OQC LX2ZVNAYX2FRCEIJ6XBCBILB3O7YT52AP56QDWCCGLATFCEB7KHQC E6LXIE7VBUGCR762DFTHYZISEWYFV5E3NM3MGLT5Z7YFQQ5GTYRQC 6NB2PU2F64XDSURKYMBECKEN7ZQ63RMDN2GL5CP74YA6HE4K3TTAC 5FPD6WH3Z6WVWVHWSU276I2JF7VRJZJB7GC76UY6MDRFJ7YGUMCQC WFOI5DN6JBBPNX7T3RCENHAHMHSZMO6MNCSNH7276AYS2REGK23QC UWD234SIIBCA45TXXSOSZEWLUF66NFPWET257C3WZQYX3L5EJPCAC 5B42RKMDCXT74BWXB7OVBMWVAEZAVFKV6T4I3KBESZIWSNQLPQCAC O63TXA57OHFIPUDT4QQBDVXRQA64CUIT7XU4G6MSQPMDRFJPM7IAC 3WWWPCD6BDUHGDTIQHSVUSETNZCM56FYV5EDE2XIH3BNSXBUIKLQC 6NRS3ZPPZ6A42IEDMRLQ7LZ5TPPLFQ6AGYVS32TQRGHBIJQW4WBAC 3O3IMVFKGSXMVLPLZR3H6MIG3EE5PS4632QE4JMK5SVX2PVSSKDAC VNWG7QG3VM3JCF3QQ4OJAY2RFBKBWZ7JJNAISIP6YIIX6L2LGBUQC CALQZ74ABIY2S35P4EHAX6NY6G7YXCCVVUMTFGIWGYZQ45XFT7OQC FHKSWRLS3UBAU6AMQTNZTCLKDUUJVMYRX6EUY5YDDHOITLQLQEFQC PQXDAWT2RRUZ3YCV77U4VOHJ576MPY3OZEU6ZO4RV6UKWQKP3OUAC REQ25X7QQUEWPLPCEG6NOZXUEULXMTYD6WU4VSHASGSNFRMATAMQC ZYH2OWMP45IDKCXQMNWQIL2DRIOYCF6YIIBY5FZT5APISGEMZ6VAC FBNGDITNOHDBGZL42XS5V2ROZNELYFSTDVXLIZ43OLL3KUOK42HAC 4HSXLC3CAM6KCESNNF3FF4BN5PUP3ZBFDDKLO7A2GO7NDINT3RIAC DWRIJC3G3GO36DMH65IRX4ZQQWMV34ALGAJCY36EWG6XDQDCFKLAC YG7GE7B4XADVZW6KH3YSLWTT2SWZG6TMANKXZGD7PFD7LZZKNIXAC 5RT5I4RQNLQYHDWB7YH54VF4YRWY6AZ2RE26GK4BSMV27NVPXTDQC LGZNYFFGJK4SH7YLVPOYQXMMCBRVJL7WVB4IUPFG2DIYDIRFDY3AC AGVDTNWBOEJ2FH5HJDFAZV2VOY36DGGPUAGFL57V4EDNOSQPBSDAC CR2255NATVJXRQTX4WYZAVA25EFXMPPJNOBEEGW3ABPJF72KOHQAC 6P7BMIJ3DK5H2DWBJNOF2PNVHL3GO7HA4GVS6DHSJ7VQNEJW4A7QC NS6IKTSXF4446K54EGRUUXYWT7EA6VXGR4LBH24R4GUEQKSXHZ4AC B3CBHD2MN763JZHDTB3OKGMYVSCMY6XRUFA2JWTNUPRZSWSCEOVAC H7W5L7UYIVL66HR5REBOOH2DADHL456CLTFIQZTKWMWCG3XDR2FAC .fullscreen-icon {background-image: url(icon-fullscreen.svg);background-size: 26px 52px;}.fullscreen-icon.leaflet-fullscreen-on {background-position: 0 -26px;}.leaflet-touch .fullscreen-icon {background-position: 2px 2px;}.leaflet-touch .fullscreen-icon.leaflet-fullscreen-on {background-position: 2px -24px;}/* one selector per rule as explained here : http://www.sitepoint.com/html5-full-screen-api/ */.leaflet-container:-webkit-full-screen {width: 100% !important;height: 100% !important;z-index: 99999;}.leaflet-container:-ms-fullscreen {width: 100% !important;height: 100% !important;z-index: 99999;}.leaflet-container:full-screen {width: 100% !important;height: 100% !important;z-index: 99999;}.leaflet-container:fullscreen {width: 100% !important;height: 100% !important;z-index: 99999;}.leaflet-pseudo-fullscreen {position: fixed !important;width: 100% !important;height: 100% !important;top: 0px !important;left: 0px !important;z-index: 99999;}
/* required styles */.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane > svg,.leaflet-pane > canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer {position: absolute;left: 0;top: 0;}.leaflet-container {overflow: hidden;}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow {-webkit-user-select: none;-moz-user-select: none;user-select: none;-webkit-user-drag: none;}/* Prevents IE11 from highlighting tiles in blue */.leaflet-tile::selection {background: transparent;}/* Safari renders non-retina tile on retina better with this, but Chrome is worse */.leaflet-safari .leaflet-tile {image-rendering: -webkit-optimize-contrast;}/* hack that prevents hw layers "stretching" when loading new tiles */.leaflet-safari .leaflet-tile-container {width: 1600px;height: 1600px;-webkit-transform-origin: 0 0;}.leaflet-marker-icon,.leaflet-marker-shadow {display: block;}/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x *//* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile {max-width: none !important;max-height: none !important;}.leaflet-container.leaflet-touch-zoom {-ms-touch-action: pan-x pan-y;touch-action: pan-x pan-y;}.leaflet-container.leaflet-touch-drag {-ms-touch-action: pinch-zoom;/* Fallback for FF which doesn't support pinch-zoom */touch-action: none;touch-action: pinch-zoom;}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {-ms-touch-action: none;touch-action: none;}.leaflet-container {-webkit-tap-highlight-color: transparent;}.leaflet-container a {-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);}.leaflet-tile {filter: inherit;visibility: hidden;}.leaflet-tile-loaded {visibility: inherit;}.leaflet-zoom-box {width: 0;height: 0;-moz-box-sizing: border-box;box-sizing: border-box;z-index: 800;}/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */.leaflet-overlay-pane svg {-moz-user-select: none;}.leaflet-pane {z-index: 400;}.leaflet-tile-pane {z-index: 200;}.leaflet-overlay-pane {z-index: 400;}.leaflet-shadow-pane {z-index: 500;}.leaflet-marker-pane {z-index: 600;}.leaflet-tooltip-pane {z-index: 650;}.leaflet-popup-pane {z-index: 700;}.leaflet-map-pane canvas {z-index: 100;}.leaflet-map-pane svg {z-index: 200;}.leaflet-vml-shape {width: 1px;height: 1px;}.lvml {behavior: url(#default#VML);display: inline-block;position: absolute;}/* control positioning */.leaflet-control {position: relative;z-index: 800;pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */pointer-events: auto;}.leaflet-top,.leaflet-bottom {position: absolute;z-index: 1000;pointer-events: none;}.leaflet-top {top: 0;}.leaflet-right {right: 0;}.leaflet-bottom {bottom: 0;}.leaflet-left {left: 0;}.leaflet-control {float: left;clear: both;}.leaflet-right .leaflet-control {float: right;}.leaflet-top .leaflet-control {margin-top: 10px;}.leaflet-bottom .leaflet-control {margin-bottom: 10px;}.leaflet-left .leaflet-control {margin-left: 10px;}.leaflet-right .leaflet-control {margin-right: 10px;}/* zoom and fade animations */.leaflet-fade-anim .leaflet-tile {will-change: opacity;}.leaflet-fade-anim .leaflet-popup {opacity: 0;-webkit-transition: opacity 0.2s linear;-moz-transition: opacity 0.2s linear;transition: opacity 0.2s linear;}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {opacity: 1;}.leaflet-zoom-animated {-webkit-transform-origin: 0 0;-ms-transform-origin: 0 0;transform-origin: 0 0;}.leaflet-zoom-anim .leaflet-zoom-animated {will-change: transform;}.leaflet-zoom-anim .leaflet-zoom-animated {-webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1);-moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1);transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1);}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile {-webkit-transition: none;-moz-transition: none;transition: none;}.leaflet-zoom-anim .leaflet-zoom-hide {visibility: hidden;}/* cursors */.leaflet-interactive {cursor: pointer;}.leaflet-grab {cursor: -webkit-grab;cursor: -moz-grab;cursor: grab;}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive {cursor: crosshair;}.leaflet-popup-pane,.leaflet-control {cursor: auto;}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable {cursor: move;cursor: -webkit-grabbing;cursor: -moz-grabbing;cursor: grabbing;}/* marker & overlays interactivity */.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane > svg path,.leaflet-tile-container {pointer-events: none;}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane > svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path {pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */pointer-events: auto;}/* visual tweaks */.leaflet-container {background: #ddd;outline: 0;}.leaflet-container a {color: #0078a8;}.leaflet-container a.leaflet-active {outline: 2px solid orange;}.leaflet-zoom-box {border: 2px dotted #38f;background: rgba(255, 255, 255, 0.5);}/* general typography */.leaflet-container {font:12px/1.5 'Helvetica Neue',Arial,Helvetica,sans-serif;}/* general toolbar styles */.leaflet-bar {box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);border-radius: 4px;}.leaflet-bar a,.leaflet-bar a:hover {background-color: #fff;border-bottom: 1px solid #ccc;width: 26px;height: 26px;line-height: 26px;display: block;text-align: center;text-decoration: none;color: black;}.leaflet-bar a,.leaflet-control-layers-toggle {background-position: 50% 50%;background-repeat: no-repeat;display: block;}.leaflet-bar a:hover {background-color: #f4f4f4;}.leaflet-bar a:first-child {border-top-left-radius: 4px;border-top-right-radius: 4px;}.leaflet-bar a:last-child {border-bottom-left-radius: 4px;border-bottom-right-radius: 4px;border-bottom: none;}.leaflet-bar a.leaflet-disabled {cursor: default;background-color: #f4f4f4;color: #bbb;}.leaflet-touch .leaflet-bar a {width: 30px;height: 30px;line-height: 30px;}.leaflet-touch .leaflet-bar a:first-child {border-top-left-radius: 2px;border-top-right-radius: 2px;}.leaflet-touch .leaflet-bar a:last-child {border-bottom-left-radius: 2px;border-bottom-right-radius: 2px;}/* zoom control */.leaflet-control-zoom-in,.leaflet-control-zoom-out {font:bold 18px 'Lucida Console',Monaco,monospace;text-indent: 1px;}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out {font-size: 22px;}/* layers control */.leaflet-control-layers {box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);background: #fff;border-radius: 5px;}.leaflet-control-layers-toggle {background-image: url(images/layers.png);width: 36px;height: 36px;}.leaflet-retina .leaflet-control-layers-toggle {background-image: url(images/layers-2x.png);background-size: 26px 26px;}.leaflet-touch .leaflet-control-layers-toggle {width: 44px;height: 44px;}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle {display: none;}.leaflet-control-layers-expanded .leaflet-control-layers-list {display: block;position: relative;}.leaflet-control-layers-expanded {padding: 6px 10px 6px 6px;color: #333;background: #fff;}.leaflet-control-layers-scrollbar {overflow-y: scroll;overflow-x: hidden;padding-right: 5px;}.leaflet-control-layers-selector {margin-top: 2px;position: relative;top: 1px;}.leaflet-control-layers label {display: block;}.leaflet-control-layers-separator {height: 0;border-top: 1px solid #ddd;margin: 5px -10px 5px -6px;}/* Default icon URLs */.leaflet-default-icon-path {background-image: url(images/marker-icon.png);}/* attribution and scale controls */.leaflet-container .leaflet-control-attribution {background: #fff;background: rgba(255, 255, 255, 0.7);margin: 0;}.leaflet-control-attribution,.leaflet-control-scale-line {padding: 0 5px;color: #333;}.leaflet-control-attribution a {text-decoration: none;}.leaflet-control-attribution a:hover {text-decoration: underline;}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale {font-size: 11px;}.leaflet-left .leaflet-control-scale {margin-left: 5px;}.leaflet-bottom .leaflet-control-scale {margin-bottom: 5px;}.leaflet-control-scale-line {border: 2px solid #777;border-top: none;line-height: 1.1;padding: 2px 5px 1px;font-size: 11px;white-space: nowrap;overflow: hidden;-moz-box-sizing: border-box;box-sizing: border-box;background: #fff;background: rgba(255, 255, 255, 0.5);}.leaflet-control-scale-line:not(:first-child) {border-top: 2px solid #777;border-bottom: none;margin-top: -2px;}.leaflet-control-scale-line:not(:first-child):not(:last-child) {border-bottom: 2px solid #777;}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar {box-shadow: none;}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar {border: 2px solid rgba(0, 0, 0, 0.2);background-clip: padding-box;}/* popup */.leaflet-popup {position: absolute;text-align: center;margin-bottom: 20px;}.leaflet-popup-content-wrapper {padding: 1px;text-align: left;border-radius: 12px;}.leaflet-popup-content {margin: 13px 19px;line-height: 1.4;}.leaflet-popup-content p {margin: 18px 0;}.leaflet-popup-tip-container {width: 40px;height: 20px;position: absolute;left: 50%;margin-left: -20px;overflow: hidden;pointer-events: none;}.leaflet-popup-tip {width: 17px;height: 17px;padding: 1px;margin: -10px auto 0;-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);-ms-transform: rotate(45deg);transform: rotate(45deg);}.leaflet-popup-content-wrapper,.leaflet-popup-tip {background: white;color: #333;box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);}.leaflet-container a.leaflet-popup-close-button {position: absolute;top: 0;right: 0;padding: 4px 4px 0 0;border: none;text-align: center;width: 18px;height: 14px;font:16px/14px Tahoma,Verdana,sans-serif;color: #c3c3c3;text-decoration: none;font-weight: bold;background: transparent;}.leaflet-container a.leaflet-popup-close-button:hover {color: #999;}.leaflet-popup-scrolled {overflow: auto;border-bottom: 1px solid #ddd;border-top: 1px solid #ddd;}.leaflet-oldie .leaflet-popup-content-wrapper {-ms-zoom: 1;}.leaflet-oldie .leaflet-popup-tip {width: 24px;margin: 0 auto;-ms-filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)';filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);}.leaflet-oldie .leaflet-popup-tip-container {margin-top: -1px;}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip {border: 1px solid #999;}/* div icon */.leaflet-div-icon {background: #fff;border: 1px solid #666;}/* Tooltip *//* Base styles for the element that has a tooltip */.leaflet-tooltip {position: absolute;padding: 6px;background-color: #fff;border: 1px solid #fff;border-radius: 3px;color: #222;white-space: nowrap;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;pointer-events: none;box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);}.leaflet-tooltip.leaflet-clickable {cursor: pointer;pointer-events: auto;}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before {position: absolute;pointer-events: none;border: 6px solid transparent;background: transparent;content: '';}/* Directions */.leaflet-tooltip-bottom {margin-top: 6px;}.leaflet-tooltip-top {margin-top: -6px;}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before {left: 50%;margin-left: -6px;}.leaflet-tooltip-top:before {bottom: 0;margin-bottom: -12px;border-top-color: #fff;}.leaflet-tooltip-bottom:before {top: 0;margin-top: -12px;margin-left: -6px;border-bottom-color: #fff;}.leaflet-tooltip-left {margin-left: -6px;}.leaflet-tooltip-right {margin-left: 6px;}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before {top: 50%;margin-top: -6px;}.leaflet-tooltip-left:before {right: 0;margin-right: -12px;border-left-color: #fff;}.leaflet-tooltip-right:before {left: 0;margin-left: -12px;border-right-color: #fff;}
@-webkit-keyframes leaflet-gestures-fadein {0% {opacity: 0;}100% {opacity: 1;}}@keyframes leaflet-gestures-fadein {0% {opacity: 0;}100% {opacity: 1;}}.leaflet-container:after {-webkit-animation: leaflet-gestures-fadein 0.8s backwards;animation: leaflet-gestures-fadein 0.8s backwards;color: #fff;font-family: Roboto, Arial, sans-serif;font-size: 22px;-webkit-box-pack: center;-ms-flex-pack: center;justify-content: center;display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;padding: 15px;position: absolute;top: 0;left: 0;right: 0;bottom: 0;background: rgba(0, 0, 0, 0.5);z-index: 461;pointer-events: none;}.leaflet-gesture-handling-scroll-warning:after,.leaflet-gesture-handling-touch-warning:after {-webkit-animation: leaflet-gestures-fadein 0.8s forwards;animation: leaflet-gestures-fadein 0.8s forwards;}.leaflet-gesture-handling-touch-warning:after {content: attr(data-gesture-handling-touch-content);}.leaflet-gesture-handling-scroll-warning:after {content: attr(data-gesture-handling-scroll-content);}
<div class="tab-content" id="simuTabContent"><divclass="tab-pane fade active show p-3"id="simu-tab-pane"role="tabpanel"aria-labelledby="simu-tab"tabindex="0"><h3 class="my-3 fs-1 fw-bold">Production… <span class="text-primary">Consommation</span></h3>
<div class="p-10 flex flex-col"><h1 class="my-8 text-4xl font-bold">Production… <span class="text-primary">Consommation</span></h1>
<form method="POST" action="/api/grain" id="pdl" onsubmit={refresh}></form>{#if erreur}<divid="erreur"class="alert alert-danger fade d-flex"class:show={erreur}role="alert">
<form method="POST" action="/api/grain" id="pdl" onsubmit={refresh}></form>{#if erreur}<divid="erreur"class="alert alert-error fade flex"class:show={erreur}role="alert"><div>
{/if}<h2 class="my-5">Profils de consommation</h2>{#if $profils?.length}{#if $expert}<div>Vous êtes en mode expert. Dans ce mode, vous avez un accèsdirect à tous les profils utilisés par les opérateurs duréseau pour simuler les consommations. Voir <ahref="https://www.enedis.fr/responsable-dequilibre-profilage-et-profils">la documentation</a>.</div>{/if}<table class="table"><thead><tr><th></th><th>Profil</th><th>Consommation annuelle (kWh)</th><th></th></tr></thead><tbody>{#each $profils as pr, i (i)}<tr><td class="px-3 align-middle">Profil</td><td><selectclass="form-select"bind:value={pr.type}onchange={() => {profils_modified.set(true)updatePlot(puissance, communaute)}}>{#each Object.keys(profils_) as p (p)}<option value={p}>{p}</option>{/each}</select></td><td><inputtype="number"class="form-control"placeholder="Abonnement (kW)"min="0"step="500"bind:value={pr.conso}onchange={() =>updatePlot(puissance, communaute)} /></td><tdstyle="width:1%;white-space:nowrap;text-align:center"><buttonclass="btn btn-link"onclick={() => delProfil(i)}aria-label="Supprimer ce profil"><i class="bi bi-x-circle text-primary"></i></button></td></tr>{/each}</tbody></table>{/if}<div class="text-center"><button class="btn btn-primary" onclick={addProfil}><i class="bi bi-plus-circle"></i> Ajouter un profil</button>
<buttontype="button"class="ms-auto"onclick={() => (erreur = '')}aria-label="Close"><svgxmlns="http://www.w3.org/2000/svg"fill="none"viewBox="0 0 24 24"stroke-width="1.5"stroke="currentColor"class="w-5"><pathstroke-linecap="round"stroke-linejoin="round"d="M6 18 18 6M6 6l12 12" /></svg></button>
<h2 class="my-5">Relevés de compteurs</h2>{#if data_.active && data_.id && data_.id != 'nouveau'}<div class="mb-5">Vous pouvez ajouter des compteurs d'entreprises oud'associations par leur numéro de compteur et leur numéro deSIRET.
{/if}<h2 class="text-2xl my-5">Profils de consommation</h2>{#if $profils?.length}{#if $expert}<div>Vous êtes en mode expert. Dans ce mode, vous avez un accèsdirect à tous les profils utilisés par les opérateurs du réseaupour simuler les consommations. Voir <ahref="https://www.enedis.fr/responsable-dequilibre-profilage-et-profils">la documentation</a>.
{#if $prms?.length}{#each $prms as prm, i (prm)}<div class="row my-2"><div class="col-3 d-flex align-middle"><label class="ms-auto form-label" for="prm-{i}">PRM</label><buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Un PRM, aussi appelé PDL, est l'identifiant d'un compteur électrique. On peut le trouver sur les factures d'électricité, ou en appuyant sur le bouton + du compteur Linky."aria-label="Un PRM, aussi appelé PDL, est l'identifiant d'un compteur électrique. On peut le trouver sur les factures d'électricité, ou en appuyant sur le bouton + du compteur Linky."><i class="bi bi-question-circle"></i></button>
{/if}<table class="table w-auto mx-auto my-5"><thead><tr><th>Profil</th><th>Consommation annuelle (kWh)</th><th></th></tr></thead><tbody>{#each $profils as pr, i (i)}<tr><td><selectclass="select"bind:value={pr.type}onchange={() => {profils_modified.set(true)updatePlot(puissance, communaute)}}>{#each Object.keys(profils_) as p (p)}<option value={p}>{p}</option>{/each}</select></td><td><inputtype="number"class="input"placeholder="Abonnement (kW)"min="0"step="500"bind:value={pr.conso}onchange={() =>updatePlot(puissance, communaute)} /></td><td><buttonclass="text-primary"onclick={() => delProfil(i)}aria-label="Supprimer ce profil"><XCircle /></button></td></tr>{/each}</tbody></table>{/if}<button class="mx-auto btn btn-primary" onclick={addProfil}><PlusCircle /> Ajouter un profil</button><h2 class="text-2xl mt-10 my-5">Relevés de compteurs</h2>{#if data_.active && data_.id && data_.id != 'nouveau'}<div class="mb-5">Vous pouvez ajouter des compteurs d'entreprises ou d'associationspar leur numéro de compteur et leur numéro de SIRET.</div>{#if $prms?.length}{#each $prms as prm, i (prm)}<div class="flex flex-wrap gap-x-10 gap-5"><div class="flex flex-col w-full gap-2"><div class="flex"><label class="label" for="prm-{i}">PRM</label> <Questiondatatip="Un PRM, aussi appelé PDL, est l'identifiant d'un compteur électrique. On peut le trouver sur les factures d'électricité, ou en appuyant sur le bouton + du compteur Linky." />
<div class="row my-2"><div class="col-3 d-flex align-middle"><label class="ms-auto form-label" for="prm-{i}">Relevé au format CSV</label></div><div class="col d-flex align-items-center">
<div class="flex flex-col gap-2"><label class="label" for="prm-{i}">Relevé au format CSV</label><div class="flex">
<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Nous avons enregistré votre fichier, mais vous pouvez le mettre à jour à tout moment."aria-label="Nous avons enregistré votre fichier, mais vous pouvez le mettre à jour à tout moment."><i class="bi bi-check-circle"></i></button>
<Questiondatatip="Nous avons enregistré votre fichier, mais vous pouvez le mettre à jour à tout moment." />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="siret-{i}">SIRET du titulaire du compteur</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="siret-{i}"bind:value={prm.siret} /></div>
<div class="flex flex-col my-2 gap-2 w-full"><label class="label" for="siret-{i}">SIRET du titulaire du compteur</label><inputclass="input input-sm"id="siret-{i}"bind:value={prm.siret} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="prenom-{i}">Prénom du titulaire du compteur</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="prenom-{i}"bind:value={prm.prenom} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="prenom-{i}">Prénom du titulaire du compteur</label><inputclass="input input-sm"id="prenom-{i}"bind:value={prm.prenom} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><label class="ms-auto form-label" for="nom-{i}">Nom du titulaire du compteur</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="nom-{i}"bind:value={prm.nom} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="nom-{i}">Nom du titulaire du compteur</label><inputclass="input input-sm"id="nom-{i}"bind:value={prm.nom} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="prenom-{i}">Prénom du titulaire du compteur</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="prenom-{i}"bind:value={prm.prenom} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="prenom-{i}">Prénom du titulaire du compteur</label><inputclass="input input-sm"id="prenom-{i}"bind:value={prm.prenom} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><label class="ms-auto form-label" for="nom-{i}">Nom du titulaire du compteur</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="nom-{i}"bind:value={prm.nom} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="nom-{i}">Nom du titulaire du compteur</label><inputclass="input input-sm"id="nom-{i}"bind:value={prm.nom} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="numerorue-{i}">Numéro et rue</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="numerorue-{i}"bind:value={prm.numerorue} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="numerorue-{i}">Numéro et rue</label><inputclass="input input-sm"id="numerorue-{i}"bind:value={prm.numerorue} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="codepostal-{i}">Code INSEE de la commune</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="codepostal-{i}"bind:value={prm.codeinsee} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="codepostal-{i}">Code INSEE de la commune</label><inputclass="input input-sm"id="codepostal-{i}"bind:value={prm.codeinsee} />
<div class="row my-2"><divclass="col-3 d-flex text-end align-items-center"><labelclass="ms-auto form-label"for="serie-{i}">Numéro de série</label></div><div class="col-9 d-flex align-items-center"><inputclass="form-control form-control-sm"id="serie-{i}"bind:value={prm.serie} /></div>
<div class="flex flex-col my-2 gap-2"><label class="label" for="serie-{i}">Numéro de série</label><inputclass="input input-sm"id="serie-{i}"bind:value={prm.serie} />
{/each}<div class="my-3">Ce service ne consulte la courbe de charge du compteurcommuniquant qu'une seule fois, et ce consentement expiredès que ces données pour l'année écoulée sont récupérées.Les données collectées depuis les compteurs communiquantssont stockées temporairement sur nos serveurs pour desraisons de performance, ne sont utilisées que pour affichercette page et produire le rapport, et ne sont jamaisconservées plus de 30 jours.
<div class="my-3">Les données envoyées via un fichier sont conservées jusqu'àce que vous supprimiez ce projet.</div>{/if}<div class="d-flex justify-content-center"><button class="mx-2 btn btn-primary" onclick={addPrm}><i class="bi bi-plus-circle"></i> Ajouter un compteur!</button>{#if $prms.length}<button class="mx-2 btn btn-primary" form="pdl">Mettre à jour</button><divclass="mx-2 spinner-border text-primary"class:d-none={!prm_loading}></div>{/if}</div>{:else if data_.active}
{/each}
Sauvegardez ce projet pour avoir accès aux relevés de compteursdétaillés.
Ce service ne consulte la courbe de charge du compteurcommuniquant qu'une seule fois, et ce consentement expire dèsque ces données pour l'année écoulée sont récupérées. Lesdonnées collectées depuis les compteurs communiquants sontstockées temporairement sur nos serveurs pour des raisons deperformance, ne sont utilisées que pour afficher cette page etproduire le rapport, et ne sont jamais conservées plus de 30jours.
Vous devez être abonné pour avoir accès aux relevés de compteursdétaillés. Cependant, si vous disposez des relevés au format CSV(au format de ligne: <code>2025-11-18T14:00:00+01:00; 440</code>), n'hésitez pas à les fournir ici.
Les données envoyées via un fichier sont conservées jusqu'à ceque vous supprimiez ce projet.
{/if}{#if $prms?.length}{#each $prms as prm, i (prm)}<div class="row my-2"><div class="col-3 d-flex align-middle"><label class="ms-auto form-label" for="prm-{i}">Relevé au format CSV</label></div><div class="col-auto flex-grow-1 d-flex align-items-center"><inputclass="form-control form-control-sm"id="releve-{i}"type="file" />{#if prm.releve?.length}<i class="ms-3 bi bi-check-circle"></i>{/if}</div><div class="col col-auto d-flex align-items-center"><buttonclass="btn btn-outline-primary btn-sm"onclick={(e) => {e.preventDefault()$prms.splice(i, 1)}}aria-label="Supprimer ce compteur"><i class="bi bi-trash"></i></button></div></div>{/each}
<h2 class="mt-5">Simulation</h2><table class="table table-bordered d-inline-block">
{:else if data_.active}<div class="my-3">Sauvegardez ce projet pour avoir accès aux relevés de compteursdétaillés.</div>{:else}<div class="my-3">Vous devez être abonné pour avoir accès aux relevés de compteursdétaillés. Cependant, si vous disposez des relevés au format CSV (auformat de ligne: <code>2025-11-18T14:00:00+01:00; 440</code>),n'hésitez pas à les fournir ici.</div>{/if}{#if $prms?.length}{#each $prms as prm, i (prm)}<div class="flex flex-col my-2 gap-2"><label class="label" for="prm-{i}">Relevé au format CSV</label><div class="flex items-center gap-2"><inputclass="file-input file-input-sm"id="releve-{i}"type="file" />{#if prm.releve?.length}<svgxmlns="http://www.w3.org/2000/svg"fill="none"viewBox="0 0 24 24"stroke-width="1.5"stroke="currentColor"class="size-6"><pathstroke-linecap="round"stroke-linejoin="round"d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" /></svg>{/if}<buttonclass="btn btn-outline btn-primary btn-sm"onclick={(e) => {e.preventDefault()$prms.splice(i, 1)}}aria-label="Supprimer ce compteur"><XCircle /></button></div></div>{/each}{/if}<div class="flex justify-center my-5"><button class="mx-2 btn btn-primary" onclick={addPrm}><PlusCircle /> Ajouter un compteur</button>{#if $prms.length}<button class="mx-2 btn btn-primary" form="pdl">Mettre à jour</button><div class="mx-2 loading text-primary" class:hidden={!prm_loading}></div>{/if}</div><h2 class="text-2xl mt-5 my-10">Simulation</h2><div class="me-auto"><table class="table inline-block">
{#if pvgis_loading}<div class="my-3 d-flex align-items-center text-primary"><div class="spinner-border text-primary me-3"></div>Chargement de la production solaire</div>{/if}
</div>{#if pvgis_loading}<div class="flex items-center text-primary my-5 gap-3"><div class="loading text-primary"></div>Chargement de la production solaire</div>{/if}
<div class="my-3"><div class="mx-auto" style="min-height:450px" id="plot"></div>
<div class="my-3"><div class="mx-auto" style="min-height:450px" id="plot"></div></div><div class="flex flex-wrap"><div class="p-0 m-0 sm:w-1/2 w-full" style={plotStyle} id="autoProd">
<h4 class="my-3">Détail</h4><div class="ms-3"><h5 class="mt-5">Chiffre d'affaires</h5><div class="fw-bold fs-4">
<h2 class="text-2xl my-3">Détail</h2><div class="ms-3 flex flex-col gap-5"><h3 class="text-xl mt-5">Chiffre d'affaires</h3><div class="font-bold text-lg">
Onduleurs<buttontype="button"class="btn btn-sm btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Provision pour le remplacement des onduleurs"aria-label="Provision pour le remplacement des onduleurs"><i class="bi bi-question-circle"></i></button>
Onduleurs <Questiondatatip="Provision pour le remplacement des onduleurs" />
Intérêts DSRA <buttontype="button"class="btn btn-sm btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Dans un emprunt, compte bancaire qui permettra de payer le service de la dette si jamais l'entité emprunteuse n'est plus en mesure de le faire."aria-label="Dans un emprunt, compte bancaire qui permettra de payer le service de la dette si jamais l'entité emprunteuse n'est plus en mesure de le faire."><i class="bi bi-question-circle"></i></button>
Intérêts DSRA <Questiondatatip="Dans un emprunt, compte bancaire qui permettra de payer le service de la dette si jamais l'entité emprunteuse n'est plus en mesure de le faire." />
<divclass="tab-pane fade active show p-3"id="description-tab-pane"role="tabpanel"aria-labelledby="description-tab"tabindex="0"><h3 class="my-3 fs-1 fw-bold">
<div class="p-10" style="min-height: calc(100vh - 180px);"><h1 class="my-8 text-4xl font-bold">
<div class="input-group"><input type="text" class="form-control" bind:value={endroit} /><buttonclass="btn btn-sm btn-outline-primary"onclick={geocoding}
<div class="flex gap-2 items-center"><input type="text" class="input" bind:value={endroit} /><button class="btn btn-outline btn-primary" onclick={geocoding}
<div class="p-3 overflow-auto"><label for="derog" class="form-label">Extension de périmètre (habitat rural et/ou dispersé)</label> <buttontype="button"class="btn btn-link align-baseline p-0"id="ext-popover"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Par dérogation, le rayon de la communauté peut être étendu à 5km ou 10km."aria-label="Par dérogation, le rayon de la communauté peut être étendu à 5km ou 10km."><i class="bi bi-question-circle"></i></button><selectid="derog"class="form-select form-select-sm w-auto d-inline"name="derog"bind:value={derogation}onchange={changeDerogation}><option value="non">Non</option><option value="10">10km</option><option value="20">20km</option></select>
<div class="p-3 flex flex-col"><div class="flex"><label for="derog" class="form-label">Extension de périmètre (habitat rural et/ou dispersé)</label> <Questiondatatip="Par dérogation, le rayon de la communauté peut être étendu à 5km ou 10km." /> <selectid="derog"class="select select-sm w-auto inline ms-5"name="derog"bind:value={derogation}onchange={changeDerogation}><option value="non">Non</option><option value="10">10km</option><option value="20">20km</option></select></div>
<divclass="tab-pane fade active show p-3"id="banque-tab-pane"role="tabpanel"aria-labelledby="banque-tab"tabindex="0"><h3 class="my-3 fs-1 fw-bold">
<div class="p-10" style="min-height: calc(100vh - 180px);"><h1 class="my-8 text-4xl font-bold">
<div class="tab-content" id="syntheseTabContent"><divclass="tab-pane fade show active p-3"id="synthese-tab-pane"role="tabpanel"aria-labelledby="synthese-tab"tabindex="0"><h3 class="my-3 text-body fs-1 fw-bold">En un regard, <span class="text-primary">tout</span> votre projet.</h3><div class="my-5 py-2 total"><h5>Synthèse durée totale {$N} ans</h5><div class="row px-4"><div class="d-flex justify-content-between p-5"><div class="flex-column text-center"><div class="donnee">{format(sum_($chiffreAffaires, $N))}</div><div>Chiffre d'affaire</div></div><div class="mx-3 flex-column text-center"><div class="donnee">{format(sum_($charges, $N))}</div><div>Charges d'exploitation</div></div><div class="flex-column text-center"><div class="donnee">{format(sum_($resultatNet, $N))}</div><div>Résultat net</div></div>
<div class="p-10"><h1 class="my-8 text-4xl font-bold">En un regard, <span class="text-primary">tout</span> votre projet.</h1><div class="my-5 py-2 total flex flex-col gap-20"><h2 class="text-2xl my-4">Synthèse durée totale {$N} ans</h2><div class="flex justify-around gap-10 px-10"><div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($chiffreAffaires, $N))}</div><div>Chiffre d'affaire</div></div><div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($charges, $N))}</div><div>Charges d'exploitation</div></div><div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($resultatNet, $N))}
<div class="row px-4"><div class="d-flex justify-content-between p-5"><div class="flex-column text-center"><div class="donnee">{format($investissement)}</div><div>Montant de l'investissement</div></div><div class="mx-3 flex-column text-center"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, $N))}</div><div>Retour sur investissement</div></div><div class="flex-column text-center"><div class="donnee">{roiDate}</div><div>Point de rentabilité</div></div>
<div class="flex justify-around gap-10 px-10"><div class="flex-col text-center gap-2"><div class="donnee">{format($investissement)}
<div>Montant de l'investissement</div></div><div class="flex-col text-center gap-2"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, $N))}</div><div>Retour sur investissement</div></div><div class="flex-col text-center gap-2"><div class="donnee">{roiDate}</div><div>Point de rentabilité</div>
<div class="row flex-row-reverse px-4"><div class="d-flex justify-content-around p-5"><divclass="d-flex flex-column justify-content-between text-center me-3"><div class="py-3 my-auto"><svgviewBox="{Math.floor(-$N * 0.05)} {Math.floor(-$tr.maxa - $tr.margin)} {Math.ceil($N * 1.1)} {Math.ceil($tr.maxa - $tr.mina + 2 * $tr.margin)}"xmlns="http://www.w3.org/2000/svg"width="250px"height="100px"preserveAspectRatio="none"><pathd={$tr.c}fill="transparent"stroke-width="2"vector-effect="non-scaling-stroke"stroke="#b71515" /></svg></div><div>Résultat net</div></div>
<div class="flex justify-around gap-10 px-10"><div class="flex flex-col justify-around text-center gap-2"><div class="py-3 my-auto"><svgviewBox="{Math.floor(-$N * 0.05)} {Math.floor(-$tr.maxa - $tr.margin)} {Math.ceil($N * 1.1)} {Math.ceil($tr.maxa - $tr.mina + 2 * $tr.margin)}"xmlns="http://www.w3.org/2000/svg"width="250px"height="100px"preserveAspectRatio="none"><pathd={$tr.c}fill="transparent"stroke-width="2"vector-effect="non-scaling-stroke"stroke="#b71515" /></svg></div><div>Résultat net</div></div>
<divclass="d-flex flex-column justify-content-between text-center ms-3"><div style="width:250px" class="py-3 my-auto"><divclass="spinner-border ms-3 loading"class:d-none={!$pvgis.loading}></div><svgclass:d-none={$pvgis.loading || !maxProd}viewBox="-10 0 270 {maxProd}"preserveAspectRatio="none"xmlns="http://www.w3.org/2000/svg"width="250px"height="100px">{#each $soleil.weekly.y as p, i (i)}<pathd="M {i * 5}, {maxProd} L {i *5}, {maxProd - p}"fill="transparent"stroke-width="2"stroke="#ffbf00" />{/each}</svg><svgclass="donnee"class:d-none={$pvgis.loading || maxProd}xmlns="http://www.w3.org/2000/svg"width="32"height="32"fill="currentColor"viewBox="0 0 16 16"><pathd="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278" /></svg></div><div>Production annuelle</div>
<div class="flex flex-col justify-between text-center gap-2"><divstyle="width:250px"class="py-3 flex justify-center my-auto"><div class="ms-3 loading" class:hidden={!$pvgis.loading}>
<svgclass:hidden={$pvgis.loading || !maxProd}viewBox="-10 0 270 {maxProd}"preserveAspectRatio="none"xmlns="http://www.w3.org/2000/svg"width="250px"height="100px">{#each $soleil.weekly.y as p, i (i)}<pathd="M {i * 5}, {maxProd} L {i * 5}, {maxProd -p}"fill="transparent"stroke-width="2"stroke="#ffbf00" />{/each}</svg><svgclass="donnee"class:hidden={$pvgis.loading || maxProd}xmlns="http://www.w3.org/2000/svg"width="32"height="32"fill="currentColor"viewBox="0 0 16 16"><pathd="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278" /></svg>
<div class="row flex-row-reverse px-4"><div class="d-flex justify-content-around p-5"><div class="me-3 flex-column text-center"><div class="donnee">{$N ? format(sum_($resultatNet, $N) / $N) : '0€'}</div><div>Bénéfice annuel moyen</div></div><div class="ms-3 flex-column text-center"><div class="donnee">{#if coutElec - coutElecAuto > 0}{format(coutElec - coutElecAuto)}({economieFoyerMois} mois){:else}Aucune 😢{/if}</div><div>Economies consommateur</div></div>
<div class="flex justify-around p-5"><div class="me-3 flex flex-col text-center gap-2"><div class="donnee">{$N ? format(sum_($resultatNet, $N) / $N) : '0€'}</div><div>Bénéfice annuel moyen</div></div><div class="ms-3 flex flex-col text-center gap-2"><div class="donnee">{#if coutElec - coutElecAuto > 0}{format(coutElec - coutElecAuto)}({economieFoyerMois} mois){:else}Aucune 😢{/if}
<div class="my-5 py-2 dix"><h5>Synthèse 10 ans</h5><div class="row flex-row-reverse px-4"><div class="d-flex justify-content-between p-5"><div class="flex-column text-center"><div class="donnee">{format(sum_($chiffreAffaires, 10))}</div><div>Chiffre d'affaire</div></div>
<div class="my-10 py-2 dix"><h2 class="text-2xl my-4">Synthèse 10 ans</h2><div class="flex justify-around p-10"><div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($chiffreAffaires, 10))}</div><div>Chiffre d'affaire</div></div>
<div class="mx-3 flex-column text-center"><div class="donnee">{format(sum_($charges, 10))}</div><div>Coût total</div></div>
<div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($charges, 10))}</div><div>Coût total</div></div>
<div class="flex-column text-center"><div class="donnee">{format(sum_($resultatNet, 10))}</div><div>Résultat net</div></div>
<div class="flex flex-col text-center gap-2"><div class="donnee">{format(sum_($resultatNet, 10))}
<div class="row flex-row-reverse px-4 dix"><div class="d-flex justify-content-around p-5"><divclass="flex-column justify-content-between text-center"><div class="donnee">{rembPret(10)}%</div><div>Prêt remboursé</div></div>
<div class="flex justify-around p-5"><div class="flex flex-col text-center gap-2"><div class="donnee">{rembPret(10)}%</div><div>Prêt remboursé</div></div>
<divclass="flex-column justify-content-between text-center"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, 10))}</div><div>Rentabilité</div></div>
<div class="flex flex-col text-center gap-2"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, 10))}
<div class="my-5 py-2 cinq"><h5>Synthèse 5 ans</h5><div class="row flex-row-reverse px-4"><div class="d-flex justify-content-between p-5"><div class="flex-column text-center"><div class="donnee">{format(sum_($chiffreAffaires, 5))}</div><div>Chiffre d'affaire</div></div>
<div class="my-5 py-10 cinq"><h2 class="text-2xl my-4">Synthèse 5 ans</h2><div class="flex justify-around p-5 gap-3"><div class="flex flex-col text-center"><div class="donnee">{format(sum_($chiffreAffaires, 5))}</div><div>Chiffre d'affaire</div></div>
<div class="mx-3 flex-column text-center"><div class="donnee">{format(sum_($charges, 5))}</div><div>Coût total</div></div>
<div class="flex flex-col text-center"><div class="donnee">{format(sum_($charges, 5))}</div><div>Coût total</div></div>
<div class="flex-column text-center"><div class="donnee">{format(sum_($resultatNet, 5))}</div><div>Résultat net</div></div>
<div class="flex flex-col text-center"><div class="donnee">{format(sum_($resultatNet, 5))}
<div class="row flex-row-reverse px-4"><div class="d-flex justify-content-around p-5"><div class="flex-column text-center"><div class="donnee">{rembPret(5)}%</div><div>Prêt remboursé</div></div>
<div class="flex justify-around p-5"><div class="flex flex-col text-center"><div class="donnee">{rembPret(5)}%</div><div>Prêt remboursé</div></div>
<div class="flex-column text-center"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, 5))}</div><div>Rentabilité</div></div>
<div class="flex-col text-center gap-2"><div class="donnee">{rentabiliteTaux(sum_($resultatNet, 5))}
<div class="my-5 py-2 moyenne"><h5>Synthèse année moyenne</h5><div class="row flex-row flex-wrap px-4"><div class="d-flex justify-content-between py-5"><div class="flex-column text-center mx-3"><div class="donnee">{format(sum_($resultatNet, $N) / $N)}</div><div>Bénéfices moyen</div></div>
<div class="my-5 py-10 moyenne"><h2 class="text-2xl my-4">Synthèse année moyenne</h2><div class="flex justify-between flex-wrap py-5"><div class="flex flex-col text-center mx-3"><div class="donnee">{format(sum_($resultatNet, $N) / $N)}</div><div>Bénéfices moyen</div></div>
<div class="flex-column text-center mx-3"><div class="donnee">{format(sum_($chiffreAffaires, $N) / $N)}</div><div>Chiffre d'affaire</div></div>
<div class="flex flex-col text-center mx-3"><div class="donnee">{format(sum_($chiffreAffaires, $N) / $N)}</div><div>Chiffre d'affaire</div></div>
<div class="flex-column text-center mx-3"><div class="donnee">{fmt2.format(($investissement? (sum_($resultatNet, $N) * 100) /$investissement -100: 0) / $N)}%</div><div>Rentabilité annuelle</div></div>
<div class="flex flex-col text-center mx-3"><div class="donnee">{fmt2.format(($investissement? (sum_($resultatNet, $N) * 100) / $investissement -100: 0) / $N)}%</div><div>Rentabilité annuelle</div></div>
<div class="flex-column text-center mx-3"><div class="donnee">{#if coutElec - coutElecAuto > 0}{fmt0.format(((coutElec - coutElecAuto) * 100) / coutElec)}%{:else}Aucune 😢{/if}</div><div>Économies consommateur</div></div>
<div class="flex flex-col text-center mx-3"><div class="donnee">{#if coutElec - coutElecAuto > 0}{fmt0.format(((coutElec - coutElecAuto) * 100) / coutElec)}%{:else}Aucune 😢{/if}
onMount(async () => {if (!window.bootstrap) {console.log('no window bootstrap, load')window.bootstrap = await import('bootstrap')}menuElt = document.getElementById('menuoff')if (!menuElt) {console.log('no menu off')return}new window.bootstrap.Offcanvas(menuElt)const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')for (let t of popoverTriggerList) {new window.bootstrap.Popover(t)}})
<div class="container-lg p-3 pb-5 overflow-auto"><div class="d-flex flex-lg-row flex-column"><nav class="navbar navbar-expand-lg start-0 w-lg-25"><buttonclass="navbar-toggler"type="button"data-bs-toggle="offcanvas"data-bs-target="#menuoff"aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="d-lg-none ms-3 me-auto"><h1>{data.nom}</h1></div></nav>
class="offcanvas-lg offcanvas-start mb-auto offmenu"data-bs-scroll="true"tabindex="-1"id="menuoff"><div class="offcanvas-body off-padding-md"><div class="p-3 p-lg-0 overflow-auto"><inputtype="text"class="form-control input-h1"bind:value={data.nom}placeholder="Nouveau projet" /><form onsubmit={save}><buttonclass="my-2 btn btn-sm btn-primary"disabled={!$needsSaving}>Sauvegarder</button></form>{#if data.email}<div class="my-3 form-check form-switch"><inputclass="form-check-input"type="checkbox"role="switch"id="expertsw"bind:checked={$expert} /><label class="form-check-label" for="expertsw">Niveau expert</label></div>{/if}<h2 class="mt-5">Communauté</h2><div class="my-3"><label class="form-label" for="puissance">Puissance totale (kWc)</label>
class="drawer-side shadow-xl z-100 lg:z-0 overflow-y-auto drawer-side-"><labelfor="grain-menu"aria-label="close sidebar"class="drawer-overlay"></label><div class="pt-10 px-5 bg-base-100"><div class="lg:hidden ms-3 me-auto"><h1 class="text-4xl">{data.nom}</h1></div><inputtype="text"class="input input-lg"bind:value={data.nom}placeholder="Nouveau projet" /><form onsubmit={save}><buttonclass="my-2 btn btn-sm btn-primary"disabled={!$needsSaving}>Sauvegarder</button></form>{#if data.email}<div class="flex gap-2 my-5">
class="form-control form-control-sm"type="number"id="puissance"min="1"max="3000"value={$puissance}onchange={onPuissanceChange} />{#if data.simulation.puissance > 3000}<spanclass="text-warning"><i class="bi bi-exclamation-circle-fill me-2"></i> Une communauté d'autoconsommation ne peutdépasser plus de 3MWc. Les résultats obtenusseront donc purement hypothétiques.</span>{/if}
class="checkbox"type="checkbox"role="switch"id="expertsw"bind:checked={$expert} /><label class="label ms" for="expertsw">Niveau expert</label>
<div class="my-3"><label class="form-label" for="surface">Surface totale (m²)<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Estimation de la surface de modules photovoltaïques en fonction de la puissance et du ratio (configurable en mode expert)."aria-label="Estimation de la surface de modules photovoltaïques en fonction de la puissance et du ratio (configurable en mode expert)."><i class="bi bi-question-circle"></i></button></label>
{/if}<h2 class="mt-5">Communauté</h2><div class="my-3 flex flex-col gap-1"><label class="label" for="puissance">Puissance totale (kWc)</label><inputclass="input input-sm"type="number"id="puissance"min="1"max="3000"value={$puissance}onchange={onPuissanceChange} />{#if data.simulation.puissance > 3000}<divclass="text-warning my-5 max-w-82"><ExclamationTriangle /> Une communautéd'autoconsommation ne peut dépasser plus de 3MWc.Les résultats obtenus seront donc purementhypothétiques.</div>{/if}</div><div class="my-3 flex flex-col gap-1"><label class="label" for="surface">Surface totale (m²)<Questiondatatip="Estimation de la surface de modules photovoltaïques en fonction de la puissance et du ratio (configurable en mode expert)." /></label><inputclass="input input-sm"type="number"id="surface"min="1"value={surface}onchange={onSurfaceChange} /></div><div class="mb-3 flex flex-col"><label class="label" for="autoconso">Taux d'autoconsommation (%)<Questiondatatip="Pourcentage de la production consommée localement, à valider plus finement dans l'onglet Simulation. C'est la valeur que l'application Coturnix optimise." /></label><div>
class="form-control form-control-sm"type="number"id="surface"min="1"value={surface}onchange={onSurfaceChange} />
class="range range-sm me-4 my-3 max-w-64"type="range"id="autoconso"bind:value={$autoconso} />{$autoconso}%
<div class="mb-3"><label class="form-label" for="autoconso">Taux d'autoconsommation (%)<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Pourcentage de la production consommée localement, à valider plus finement dans l'onglet Simulation. C'est la valeur que l'application Coturnix optimise."aria-label="Pourcentage de la production consommée localement, à valider plus finement dans l'onglet Simulation. C'est la valeur que l'application Coturnix optimise."><i class="bi bi-question-circle"></i></button></label><div class="d-flex"><inputclass="form-range me-4"type="range"id="autoconso"bind:value={$autoconso} />{$autoconso}%</div></div><div class="mb-3"><label class="form-label" for="autoprod">Taux d'autoproduction (%)<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Pourcentage des consommations venant de sources locales, à valider plus finement dans l'onglet Simulation."aria-label="Pourcentage des consommations venant de sources locales, à valider plus finement dans l'onglet Simulation."><i class="bi bi-question-circle"></i></button></label><div class="d-flex"><inputclass="form-range me-4"type="range"id="autoprod"bind:value={$autoprod} />{$autoprod}%</div></div><div class="mb-3"><label class="form-label" for="prix">Prix d'achat fournisseur (€/kWh)<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Prix d'achat moyen des consommateurs de la communauté à leur fournisseur d'électricité habituel (par exemple EDF)."aria-label="Prix d'achat moyen des consommateurs de la communauté à leur fournisseur d'électricité habituel (par exemple EDF)."><i class="bi bi-question-circle"></i></button></label>
</div><div class="mb-3 flex flex-col gap-1"><label class="label" for="autoprod">Taux d'autoproduction (%) <Questiondatatip="Pourcentage des consommations venant de sources locales, à valider plus finement dans l'onglet Simulation." /></label><div class="d-flex">
<div class="mb-3"><label class="form-label" for="prix">Prix de vente local (€/kWh)<buttontype="button"class="btn btn-link align-baseline p-0 ms-2"data-bs-toggle="popover"data-bs-trigger="hover focus"data-bs-content="Hypothèse sur le prix de vente moyen. Dans Coturnix, les producteurs et les consommateurs choisissent leurs prix acceptables, et Coturnix calcule à chaque instant le prix qui maximise la valeur totale créée par la communauté."aria-label="Hypothèse sur le prix de vente moyen. Dans Coturnix, les producteurs et les consommateurs choisissent leurs prix acceptables, et Coturnix calcule à chaque instant le prix qui maximise la valeur totale créée par la communauté."><i class="bi bi-question-circle"></i></button></label><inputclass="form-control form-control-sm"type="number"step="0.01"min="0"id="prix"bind:value={$prix} /></div><div class="mb-3"><label class="form-label" for="echeances">Durée d'analyse (an)</label><inputclass="form-control form-control-sm"type="number"id="echeances"min="0"bind:value={$N} /></div>
</div><div class="mb-3 flex flex-col gap-1"><label class="label" for="prix">Prix d'achat fournisseur (€/kWh)<Questiondatatip="Prix d'achat moyen des consommateurs de la communauté à leur fournisseur d'électricité habituel (par exemple EDF)." /></label><inputclass="input input-sm"type="number"step="0.01"min="0"id="coutElec"bind:value={$cout} /></div><div class="mb-3 flex flex-col gap-1"><label class="label" for="prix">Prix de vente local (€/kWh)<Questiondatatip="Hypothèse sur le prix de vente moyen. Dans Coturnix, les producteurs et les consommateurs choisissent leurs prix acceptables, et Coturnix calcule à chaque instant le prix qui maximise la valeur totale créée par la communauté." /></label><inputclass="input input-sm"type="number"step="0.01"min="0"id="prix"bind:value={$prix} /></div><div class="mb-3 flex flex-col gap-1"><label class="label" for="echeances">Durée d'analyse (an)</label><inputclass="input input-sm"type="number"id="echeances"min="0"bind:value={$N} /></div>
<h2 class="mt-5">Financement</h2><div class="my-3"><label class="form-label" for="apport">Apport initial (€)</label><inputclass="form-control form-control-sm"type="number"id="apport"min="0"step="1000"bind:value={$apport} /></div><div class="mb-3"><label class="form-label" for="interet">Taux d'intérêt(%)</label><inputclass="form-control form-control-sm"type="number"step="0.1"id="interet"min="0"max="100"onchange={onTauxChange}onkeyup={onTauxChange}bind:value={$interet} /></div><div class="mb-3"><label class="form-label" for="echeances">Nombre d'échéances (en mois)</label><inputclass="form-control form-control-sm"type="number"id="echeances"min="0"bind:value={$echeances} /></div>{#if data.id}<form method="POST" action="?/del"><button class="my-2 btn btn-outline-primary">Supprimer</button></form>{/if}
<h2 class="mt-5 text-2xl">Financement</h2><div class="my-3 flex flex-col gap-1"><label class="label" for="apport">Apport initial (€)</label><inputclass="input input-sm"type="number"id="apport"min="0"step="1000"bind:value={$apport} /></div><div class="mb-3 flex flex-col gap-1"><label class="label" for="interet">Taux d'intérêt(%)</label><inputclass="input input-sm"type="number"step="0.1"id="interet"min="0"max="100"onchange={onTauxChange}onkeyup={onTauxChange}bind:value={$interet} />
<div class="mb-3 flex flex-col gap-1"><label class="label" for="echeances">Nombre d'échéances (en mois)</label><inputclass="input input-sm"type="number"id="echeances"min="0"bind:value={$echeances} /></div>{#if data.id}<form method="POST" action="?/del"><button class="my-2 btn btn-outline btn-primary">Supprimer</button></form>{/if}
<div class="ps-lg-5 w-100 ms-0 z0 main"><ul class="mt-5 mt-lg-3 nav nav-tabs" id="tabs" role="tablist"><li class="nav-item" role="presentation"><ahref={resolve('/grain/projet/[id]', {id: data.id || 'nouveau',})}class="nav-link {syntheseActive ? 'active' : ''}"id="synthese-tab"type="button"role="tab"aria-controls="synthese-tab-pane"aria-selected="true">Synthèse</a></li><li class="nav-item" role="presentation"><ahref={resolve('/grain/projet/[id]/finances', {id: data.id || 'nouveau',})}class="nav-link {compteActive ? 'active' : ''}"id="profile-tab"type="button"role="tab"aria-controls="compte-tab-pane"aria-selected="false">Détails financiers</a></li>
<divclass="drawer-content flex flex-col p-5 overflow-y-auto drawer-side-"><div class="flex"><label for="grain-menu" class="btn drawer-button lg:hidden"><divtabindex="0"role="button"class="btn btn-ghost btn-circle"><svgxmlns="http://www.w3.org/2000/svg"class="h-5 w-5"fill="none"viewBox="0 0 24 24"stroke="currentColor"><pathstroke-linecap="round"stroke-linejoin="round"stroke-width="2"d="M4 6h16M4 12h16M4 18h7" /></svg></div></label><div><div role="tablist" class="tabs tabs-border"><ahref={resolve('/grain/projet/[id]', {id: data.id || 'nouveau',})}class="tab"class:tab-active={syntheseActive}id="synthese-tab"type="button"role="tab">Synthèse</a><ahref={resolve('/grain/projet/[id]/finances', {id: data.id || 'nouveau',})}class="tab"class:tab-active={compteActive}id="profile-tab"type="button"role="tab">Détails financiers</a><ahref={resolve('/grain/projet/[id]/description', {id: data.id || 'nouveau',})}class="tab"class:tab-active={descriptionActive}id="profile-tab"type="button"role="tab">Description</a>
<li class="nav-item" role="presentation"><ahref={resolve('/grain/projet/[id]/description', {id: data.id || 'nouveau',})}class="nav-link {descriptionActive ? 'active' : ''}"id="profile-tab"type="button"role="tab"aria-controls="description-tab-pane"aria-selected="false">Description</a></li>
<ahref={resolve('/grain/projet/[id]/banque', {id: data.id || 'nouveau',})}class="tab"class:tab-active={banqueActive}id="banque-tab"type="button"role="tab">Emprunt</a>
<li class="nav-item" role="presentation"><ahref={resolve('/grain/projet/[id]/banque', {id: data.id || 'nouveau',})}class="nav-link {banqueActive ? 'active' : ''}"id="banque-tab"type="button"role="tab"aria-controls="banque-tab-pane"aria-selected="false">Emprunt</a></li>
{#if $expert}<ahref={resolve('/grain/projet/[id]/expert', {id: data.id || 'nouveau',})}class="tab"class:tab-active={expertActive}id="expert-tab"type="button"role="tab">Mode expert</a>{/if}
role="tab"aria-controls="expert-tab-pane"aria-selected="false">Mode expert</a></li>{/if}<li class="nav-item" role="presentation"><ahref={resolve('/grain/projet/[id]/simulation', {id: data.id || 'nouveau',})}class="nav-link {simuActive ? 'active' : ''}"id="prm-tab"type="button"role="tab"aria-controls="prm-tab-pane"aria-selected="false">Simulation</a></li></ul>
role="tab">Simulation</a></div></div></div>
@media (min-width: 992px) {.offmenu {position: fixed;top: 80px;height: calc(100% - 120px);padding-bottom: 20px;overflow: scroll;padding-right: 20px;width: 25%;max-width: 280px;}.main {margin-left: calc(min(25%, 280px)) !important;padding-left: 0;
@media (width >= 64rem) {.drawer-side- {max-height: calc(100vh - var(--spacing) * 20);
<div style="padding-top:100px" class="container-md"><h1 class="text-uppercase lh-1" style="font-size:4rem;width:50%">
<div class="pt-80 mx-10"><h1class="uppercase"style="font-size:4rem;width:50%;line-height:1em">
<div class="list-group list-group-flush">{#each data.projets as p (p.id)}<ahref={resolve('/grain/projet/[pid]', {pid: p.id,})}class="list-group-item d-flex justify-content-between align-items-center">{p.nom}<span class="badge bg-primary rounded-pill">{p.puissance}kWc</span></a>{/each}
<div class="card-body"><div class="list-group list-group-flush">{#each data.projets as p (p.id)}<ahref={resolve('/grain/projet/[pid]', {pid: p.id,})}class="list-group-item d-flex justify-content-between align-items-center">{p.nom}<span class="badge bg-primary rounded-pill">{p.puissance}kWc</span></a>{/each}</div>
<h1 class="my-5 lh-1 text-center">Simulez <span class="text-primary fw-bold">gratuitement</span> vos<span class="text-primary fw-bold">revenus</span> photovoltaïques.
<h1 class="text-4xl text-balance my-5 lh-1 text-center">Simulez <span class="text-primary font-bold">gratuitement</span> vos<span class="text-primary font-bold">revenus</span> photovoltaïques.
<div class="row p-5"><div class="col-sm-0 col-md-1"></div><div class="col-12 col-md-6 me-auto"><h2>
<div class="flex p-5 mt-10"><div class="w-full sm:w-1/2 me-auto"><h2 class="text-2xl mb-5">
<div class="row p-5"><div class="col-12 col-md-6 text-md-end ms-md-auto"><h2>Reprenez <span class="text-primary fw-bold">les rennes</span>.
<div class="flex p-5"><div class="w-full sm:w-1/2 sm:text-end sm:ms-auto"><h2 class="text-2xl mb-5 mt-10">Reprenez <span class="text-primary font-bold">les rênes</span>.
<span class="text-primary fw-bold"> Simplement*</span>,<span class="text-primary fw-bold">rapidement</span>et <span class="text-primary fw-bold">gratuitement</span>.<br />
<span class="text-primary font-bold">Simplement</span>,<span class="text-primary font-bold">rapidement</span>et<span class="text-primary font-bold">gratuitement</span>.<br />
<div class="row p-5"><div class="col-sm-0 col-md-1"></div><div class="col-12 col-md-6 me-auto"><h2>Et <span class="text-primary fw-bold">ensuite</span> ?</h2>
<div class="flex p-5"><div class="w-full sm:w-1/2"><h2 class="text-2xl mb-5 mt-10">Et <span class="text-primary font-bold">ensuite</span> ?</h2>
<span style="font-size:25pt" class="align-bottom"><span class="co"><span class="g">G</span><span class="ra">RA</span>IN</span></span><img src="/grain/coturnix.svg" alt="Logo de Grain" />
<div class="flex items-center"><span style="font-size:25pt"><span class="co"><span class="g">G</span><span class="ra">RA</span>IN</span></span><img src="/grain/coturnix.svg" alt="Logo de Grain" /></div>
<div class="app w-100"><main><nav class="navbar navbar-expand-lg sticky-sm-top bg-body shadow mb-3"><div class="container-md"><a class="nav-link" href={resolve('/', {})}><Grain logo={true} /></a><div class="d-flex"><ul class="navbar-nav d-flex flex-row align-items-center"><li class="nav-item mx-2"><aclass="nav-link"href={resolve('/grain/apropos', {})}>À propos</a></li>{#if !page.url.pathname.startsWith('/grain/projet')}<li class="nav-item mx-2"><aclass="btn btn-sm btn-outline-primary"href={resolve('/grain/projet/[id]', {id: 'nouveau',})}>Je lance ma simulation</a></li>{/if}</ul></div></div></nav><style>@media (prefers-color-scheme: light) {nav {background-color: #f0f0f0 !important;}}</style><div class="d-flex flex-column">{@render children()}</div></main>
<div class="w-full flex flex-col min-h-screen"><divclass="navbar bg-base-200 shadow-sm sticky top-0 z-100 sm:px-10 flex-wrap justify-between"><a href={resolve('/', {})}><Grain logo={true} /></a><ul class="menu menu-horizontal"><li class=""><a class="nav-link" href={resolve('/grain/apropos', {})}>À propos</a></li>{#if !page.url.pathname.startsWith('/grain/projet')}<li class=""><aclass="btn btn-sm btn-outline btn-primary"href={resolve('/grain/projet/[id]', {id: 'nouveau',})}>Je lance ma simulation</a></li>{/if}</ul></div><div class="flex flex-col flex-1">{@render children()}</div>
<footer><div class="nav-item mt-1 mx-2"><a class="nav-link" href={resolve('/apropos', {})}>À propos</a></div></footer>
<footer class="bg-primary h-2"></footer>
<style lang="scss">.sticky-sm-top {position: static;width: 100%;}@media (min-width: 480px) {.sticky-sm-top {position: sticky;top: 0;}}.app {display: flex;flex-direction: column;min-height: 100vh;}
footer {display: flex;justify-content: center;align-items: center;padding: 8px;background-color: $primary;z-index: 1;}:global(.logoCol1) {color: $gp-3;}:global(.logoCol2) {color: $gp-2;}
<svgxmlns="http://www.w3.org/2000/svg"fill="none"viewBox="0 0 24 24"stroke-width="1.5"stroke="currentColor"class="size-6"><pathstroke-linecap="round"stroke-linejoin="round"d="m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z" /></svg>
<script lang="ts">const { datatip } = $props()</script><div class="tooltip text-primary z-99 overflow-visible flex" data-tip={datatip}><button type="button" class="link" aria-label={datatip}><svgxmlns="http://www.w3.org/2000/svg"style="width:20px;height:20px"fill="none"width="10"height="10"viewBox="0 0 24 24"stroke-width="1.5"stroke="currentColor"class="size-6"><pathstroke-linecap="round"stroke-linejoin="round"d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z" /></svg></button></div>
<svgxmlns="http://www.w3.org/2000/svg"fill="none"viewBox="0 0 24 24"stroke-width="1.5"stroke="var(--color-warning)"class="size-6 inline"><pathstroke-linecap="round"stroke-linejoin="round"d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z" /></svg>
@import './variables';
@import "tailwindcss";@plugin "daisyui";@plugin "daisyui/theme" {name: "light";default: true;color-scheme: light;--color-base-100: oklch(91% 0.0117 37.42);--color-base-200: oklch(88% 0.0117 37.42);--color-base-300: oklch(85% 0.0117 37.42);--color-base-content: oklch(12% 0.042 264.695);--color-primary: #b81413;--color-primary-content: oklch(98% 0.003 247.858);--color-secondary: #de5e1c;--color-secondary-content: oklch(94% 0.028 342.258);--color-accent: #b81413;--color-accent-content: oklch(98% 0.003 247.858);--color-neutral: oklch(14% 0.005 285.823);--color-neutral-content: oklch(98% 0.003 247.858);--color-info: oklch(0.8403 0.1724 84.08);--color-info-content: oklch(12% 0.042 264.695);--color-success: oklch(76% 0.177 163.223);--color-success-content: oklch(37% 0.077 168.94);--color-warning: oklch(82% 0.189 84.429);--color-warning-content: oklch(41% 0.112 45.904);--color-error: oklch(0.5915 0.202 21.24);--color-error-content: oklch(27% 0.105 12.094);}@plugin "daisyui/theme" {name: "dark";prefersdark: true; /* set as default dark mode (prefers-color-scheme:dark) */color-scheme: dark;--color-primary: #b81413;--color-primary-content: white;--color-secondary: #de5e1c;--color-secondary-content: black;--color-accent: #b81413;--color-accent-content: white;--color-info: oklch(0.8403 0.1724 84.08);--color-info-content: black;--color-success: oklch(76% 0.177 163.223);--color-success-content: oklch(37% 0.077 168.94);--color-warning: oklch(82% 0.189 84.429);--color-warning-content: oklch(41% 0.112 45.904);--color-error: oklch(0.5915 0.202 21.24);--color-error-content: oklch(27% 0.105 12.094);--tab-border-color: white;}@font-face {font-family: 'Lato';font-style: normal;font-weight: 400;src: url(/static/fonts/Lato-Regular.ttf) format('truetype');}@font-face {font-family: 'Lato';font-style: normal;font-weight: 700;src: url(/static/fonts/Lato-Bold.ttf) format('truetype');}@font-face {font-family: 'Lato';font-style: italic;font-weight: 400;src: url(/static/fonts/Lato-Italic.ttf) format('truetype');}@font-face {font-family: 'Lato';font-style: italic;font-weight: 700;src: url(/static/fonts/Lato-BoldItalic.ttf) format('truetype');}html {font-family: 'Lato', sans-serif;}
<body data-sveltekit-preload-data="hover" style="min-width: 490px"><div style="display: contents">%sveltekit.body%</div>
<body data-sveltekit-preload-data="hover"><div>%sveltekit.body%</div>