<script lang="ts"> import { base } from '$app/paths' import Banque from '../../Banque.svelte' import Simulation from './Simulation.svelte' import { page } from '$app/stores'; import { enhance, applyAction } from '$app/forms'; import { onMount } from 'svelte'; import type { SubmitFunction } from '@sveltejs/kit'; import type { Faisan } from '../../../helpers' export let data: { name: string, porteur: string, adresse: string, tel: string, id: string, img?: string, simulation: Faisan.SimulationCommunaute, guest?: boolean, prms: string, email?: string, } $: p = data.simulation let expert = $page.url.hash == "#expert" $: compteActive = ($page.url.hash == "#compte") ? "active": "" $: banqueActive = ($page.url.hash == "#banque") ? "active": "" $: expertActive = (expert && $page.url.hash == "#expert") ? "active": "" $: simuActive = ((true || !data.guest) && $page.url.hash == "#simu") ? "active": "" $: syntheseActive = (!compteActive && !banqueActive && !simuActive && !expertActive) ? "active": "" $: compteShow = compteActive ? "show": "" $: banqueShow = banqueActive ? "show": "" $: simuShow = simuActive ? "show": "" $: syntheseShow = syntheseActive ? "show": "" $: expertShow = expertActive ? "show": "" const N = 10 const arr = 0 let an = new Date().getFullYear() function tarifSurplus_(puissance: number): number { let resultat = p.tarifCRE.prix[0]; for(let i = 0; i < p.tarifCRE.limites.length; i++) { if(puissance < p.tarifCRE.limites[i]) { return resultat } else { resultat = p.tarifCRE.prix[i] } } return resultat } $: investissement = p.puissance ? (p.puissance * 1000 * p.ratio + p.enedis): 0 $: apport = Math.min(investissement, p.apport) $: primeInvestissement = (p.puissance <= 36) ? (0.21 * 1000 * p.puissance) : (p.puissance <= 100) ? (0.11 * 1000 * p.puissance) : 0 $: productionAnnuelle = (i: number) => p.productible * p.puissance * Math.pow(1-(p.degradation)/100, i) $: autoconso = p.autoconso / 100 $: tarifSurplus = (i: number) => tarifSurplus_(p.puissance) * Math.pow(1+p.tarifCRE.inflation/100, i) $: tarifLocal = (i: number) => p.tarif * Math.pow(1+p.inflation/100, i) $: chiffreAffaires = (i: number) => ((i == 0) ? primeInvestissement : 0) + productionAnnuelle(i) * (autoconso * tarifLocal(i) + (1 - autoconso) * tarifSurplus(i)) $: exploitation = (i: number) => p.puissance * p.maintenance * Math.pow(1 + p.inflation / 100, i) $: turpe = (i: number) => (p.puissance * p.turpe + (1-autoconso) * productionAnnuelle(i) * p.turpeInjection) * Math.pow(1+p.inflation/100, i) $: assurance = (i: number) => (investissement * p.assurance / 100) * Math.pow(1+p.inflation/100, i) $: divers = (i: number) => p.divers * p.puissance * Math.pow(1 + p.inflation/100, i) $: charges = (i: number) => (investissement && i == 0 ? p.fraisDivers : 0) + exploitation(i) + turpe(i) + assurance(i) + divers(i) $: valeurAjoutee = (i: number) => chiffreAffaires(i) - charges(i) // Impots $: ifer = (_: number) => (p.puissance < 100) ? 0: 3.394 * p.puissance * p.ratioDcAc // Exonération de taxe foncière: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000044996150 $: taxeFonciere = (_: number) => 0 // Formule compliquée, exonéré sur les cas concrets $: cfe = (_: number) => 0 $: impots = (i: number) => ifer(i) + taxeFonciere(i) + cfe(i) // EBE $: ebe = (i: number) => valeurAjoutee(i) - impots(i) // Déductions fiscales $: amortissement = (i: number) => (i < p.dureeAmortissement) ? investissement / p.dureeAmortissement: 0 $: provisionOnduleurs = (i: number) => p.puissance * 1000 * p.provisionOnduleurs * Math.pow(1 + p.inflation/100, i) / 10 let remboursementAnnuel = new Array() let interetsAnnuels = new Array() $: interetsDetteSenior = (i: number) => (i < interetsAnnuels.length) ? interetsAnnuels[i] : 0 $: interetsDSRA = (i: number) => interetsDetteSenior(i) * p.tauxDSRA / 100 $: tresorerieDisponibleDetteSenior = (i: number) => ebe(i) - is(i) $: serviceDetteSenior = (i: number) => interetsDSRA(i) + interetsDetteSenior(i) + remboursementAnnuel[i] $: dscr = (i: number) => (i < remboursementAnnuel.length) ? tresorerieDisponibleDetteSenior(i) / serviceDetteSenior(i) : 0 $: resultatFiscal = (i: number) => ebe(i) - amortissement(i) - provisionOnduleurs(i) - interetsDetteSenior(i) - interetsDSRA(i) $: is = (i: number) => (resultatFiscal(i) <= 0) ? 0: resultatFiscal(i) * p.tauxIS / 100 $: resultatNet = (i: number) => resultatFiscal(i) - is(i) let resultatNetData: { id: string, data: {x:number,y:number}[]}[] = [{id:"",data:[]}] $: { resultatNetData[0] = { id: "", data: new Array(N).fill(0).map((_, i) => { return { x: an + i, y: resultatNet(i) }}) } } // Synthèse $: CAMoyen10 = new Array(10).fill(0).reduce((acc, _, i) => acc + chiffreAffaires(i), 0) / 10 $: tarifLocalMoyen10 = new Array(10).fill(0).reduce((acc, _, i) => acc + tarifLocal(i), 0) / 10 $: netMoyenFutur = (new Array(10).fill(0)).reduce((acc, _, i) => acc + resultatNet(interetsAnnuels.length + i), 0) / 10 $: resultatNet30 = (new Array(30).fill(0)).reduce((acc, _, i) => acc + resultatNet(i), 0) $: rentabilite = resultatNet30 / apport $: CA30 = (new Array(30).fill(0)).reduce((acc, _, i) => acc + chiffreAffaires(i), 0) $: coutElec10 = () => { let cout = 0 for(let i = 0; i < 10; i++) { cout += p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * p.consoMoyenneFoyer } return cout } $: coutElecAuto10 = () => { let cout = 0 for(let i = 0; i < 10; i++) { cout += tarifLocal(i) * p.consoMoyenneFoyer * p.autoprod / 100 + p.coutElec * Math.pow(1 + p.inflationElec / 100, i) * p.consoMoyenneFoyer * (100 - p.autoprod) / 100 } return cout } $: dscrMoyen = remboursementAnnuel.reduce((acc, _, i) => acc + dscr(i), 0) / remboursementAnnuel.length let bootstrap: any; onMount(async () => { bootstrap = await import('bootstrap') }) let saveModal_: null | bootstrap.Modal = null; async function saveModal(e: Event) { console.log("saveModal", e, data.guest) if(!saveModal_) { saveModal_ = new bootstrap.Modal('#faisanSaveModal', { focus: true, keyboard: true, }) } saveModal_?.show() } let save: SubmitFunction = async ({ formData }) => { console.log("enhance") formData.set('data', JSON.stringify(p)) formData.set('prms', JSON.stringify(data.prms)) saveModal_?.hide() return async ({ result }) => { await applyAction(result); }; } </script> <div class="d-flex flex-lg-row flex-column"> <nav class="navbar navbar-expand-lg start-0 w-lg-25"> <button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#menuoff" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> </nav> <div class="offcanvas-lg offcanvas-start mb-auto" data-bs-scroll="true" tabindex="-1" id="menuoff"> <div class="offcanvas-body"> <div class="p-3 p-lg-0 overflow-lg-unset overflow-scroll"> {#if !data.guest} <a href="{base}">Retour</a> {/if} <h5>Projet</h5> <div class="mb-3 form-check form-switch"> <input class="form-check-input" type="checkbox" role="switch" id="expert" bind:checked={expert}> <label class="form-check-label" for="expert">Niveau expert</label> </div> <div class="mb-3"> <label class="form-label" for="puissance">Puissance (kWc)</label> <input class="form-control form-control-sm" type="number" id="puissance" min="1" bind:value={p.puissance}/> </div> <div class="mb-3"> <label class="form-label" for="autoconso">Taux d'autoconsommation (%)</label> <div class="d-flex"> <input class="form-range me-4" type="range" id="autoconso" bind:value={p.autoconso}/>{p.autoconso}% </div> </div> <div class="mb-3"> <label class="form-label" for="autoprod">Taux d'autoproduction (%)</label> <div class="d-flex"> <input class="form-range me-4" type="range" id="autoprod" bind:value={p.autoprod}/>{p.autoprod}% </div> </div> <div class="mb-3"> <label class="form-label" for="tarif">Tarif de vente local</label> <input class="form-control form-control-sm" type="number" step="any" min="0" id="tarif" bind:value={p.tarif}/> </div> <div class="mb-3"> <label class="form-label" for="inflationElec">Estimation de l'inflation de l'électricité</label> <input class="form-control form-control-sm" type="number" bind:value={p.inflationElec} min="0" id="inflationElec" /> </div> <h5>Financement</h5> <div class="mb-3"> <label class="form-label" for="apport">Apport initial</label> <input class="form-control form-control-sm" type="number" id="apport" min="0" bind:value={p.apport}/> </div> <div class="mb-3"> <label class="form-label" for="interet">Taux d'intérêt(%)</label> <input class="form-control form-control-sm" type="number" step="0.01" id="interet" min="0" bind:value={p.interet}/> </div> <div class="mb-3"> <label class="form-label" for="echeances">Nombre d'échéances (en mois)</label> <input class="form-control form-control-sm" type="number" id="echeances" min="0" bind:value={p.echeances}/> </div> {#if data.id} <form method="POST" action="?/save" use:enhance={save}> <button class="btn btn-primary">Sauvegarder</button><button class="ms-2 btn btn-outline-primary" formaction="?/del">Supprimer</button> </form> {:else if data.email} <button class="btn btn-primary" on:click={saveModal}>Sauvegarder</button> {/if} </div> </div> </div> <div class="ps-lg-5 w-100 ms-0"> <ul class="mt-5 mt-lg-3 nav nav-tabs d-print-none" id="tabs" role="tablist"> <li class="nav-item" role="presentation"> <a href="#synthese" class="nav-link {syntheseActive}" 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"> <a href="#compte" class="nav-link {compteActive}" id="profile-tab" type="button" role="tab" aria-controls="compte-tab-pane" aria-selected="false">Compte de résultats</a> </li> <li class="nav-item" role="presentation"> <a href="#banque" class="nav-link {banqueActive}" id="banque-tab" type="button" role="tab" aria-controls="banque-tab-pane" aria-selected="false">Emprunt</a> </li> {#if expert} <li class="nav-item" role="presentation"> <a href="#expert" class="nav-link {expertActive}" id="expert-tab" type="button" role="tab" aria-controls="expert-tab-pane" aria-selected="false">Mode expert</a> </li> {/if} {#if true || !data.guest} <li class="nav-item" role="presentation"> <a href="#simu" class="nav-link {simuActive}" id="prm-tab" type="button" role="tab" aria-controls="prm-tab-pane" aria-selected="false">Simulation</a> </li> {/if} </ul> <div class="tab-content" id="syntheseTabContent"> <div class="tab-pane fade {syntheseActive} {syntheseShow} p-3" id="synthese-tab-pane" role="tabpanel" aria-labelledby="synthese-tab" tabindex="0"> <h4 class="my-3">Projet</h4> <div class="ms-3 row"> <div> <table class="table table-bordered d-inline-block"> <tbody> <tr class="d-none d-print-table-row"><td>Puissance modules</td><td>{p.puissance}</td></tr> <tr class="d-none d-print-table-row"><td>Taux d'autoconsommation</td><td>{p.autoconso}</td></tr> <tr class="d-none d-print-table-row"><td>Taux d'autoproduction</td><td>{p.autoprod}</td></tr> <tr><td>Production annuelle</td><td>{productionAnnuelle(0).toFixed(0)}kWh</td></tr> <tr><td>Coût de la centrale</td><td>{investissement.toFixed(0)}€</td></tr> <tr><td>Nombre de foyers</td><td> {(productionAnnuelle(0) * p.autoconso / (p.consoMoyenneFoyer * p.autoprod)).toFixed(1)} </td></tr> </tbody> </table> </div> </div> <h4 class="my-3">Analyse économique</h4> <div class="ms-3 row"> <div class="col-12 col-lg-6"> <h5 class="my-3">Financement</h5> <table class="table table-bordered d-inline-block"> <tbody> <tr class="d-none d-print-table-row"><td>Apport</td><td>{apport}€</td></tr> <tr><td>Volume d'emprunt</td><td>{Math.max(0, investissement - apport).toFixed(0)}€</td></tr> {#if investissement > apport} <tr class="d-none d-print-table-row"><td>Taux d'intérêt</td><td>{p.interet}€</td></tr> <tr class="d-none d-print-table-row"><td>Durée du crédit</td><td>{p.echeances} mois</td></tr> <tr><td>Annuité</td><td>{(remboursementAnnuel[0] + interetsAnnuels[0]).toFixed(arr)}€</td></tr> <tr><td>Capacité de remboursement (DSCR)</td><td>{dscrMoyen ? dscrMoyen.toFixed(2): ""}</td></tr> {/if} </tbody> </table> </div> <div class="col-12 col-lg-6"> <h5 class="my-3">Revenus</h5> <table class="table table-bordered d-inline-block"> <tbody> <tr class="d-none d-print-table-row"><td>Tarif de vente local</td><td>{p.tarif}</td></tr> <tr class="d-none d-print-table-row"><td>Estimation de l'inflation de l'électricité</td><td>{p.inflationElec}</td></tr> <tr><td>Prix de vente de l'énergie moyen sur 10 ans</td><td>{(tarifLocalMoyen10).toFixed(2)}€</td></tr> <tr><td>Chiffre d'affaires moyen sur 10 ans</td><td>{CAMoyen10.toFixed(arr)}€</td></tr> <tr><td>Revenu annuel net moyen au-delà du prêt</td><td>{netMoyenFutur.toFixed(arr)}€</td></tr> </tbody> </table> </div> </div> <h4 class="my-3">Intérêt financier</h4> <div class="ms-3 row"> <div class="col-12 col-lg-6"> <h5 class="my-3">Pour le producteur</h5> <table class="table table-bordered d-inline-block"> <tbody> {#if apport} <tr><td>ROE sur 30 ans (résultat net / apport)</td> <td>{(rentabilite * 100 / 30).toFixed(0)}% par an</td></tr> {/if} {#if CA30} <tr><td>ROCE</td><td>{((resultatNet30 / CA30) * 100).toFixed(0)}%</td></tr> {/if} </tbody> </table> </div> <div class="col-12 col-lg-6"> <h5 class="my-3">Pour les consommateurs</h5> <table class="table table-bordered d-inline-block"> <tbody> <!-- <tr><td>Coût sur 10 ans sans autoconsommation collective</td><td>{coutElec10().toFixed(0)}€</td></tr> <tr><td>Coût sur 10 ans avec autoconsommation collective</td><td>{coutElecAuto10().toFixed(0)}€</td></tr> --> <tr><td>Économie réalisée</td><td>{(coutElec10() - coutElecAuto10()).toFixed(0)}€ {#if coutElec10() > 0}({((coutElec10() - coutElecAuto10()) * 100 / coutElec10()).toFixed(0)}%){/if}</td></tr> </tbody> </table> </div> </div> </div> <div class="tab-pane fade {compteActive} {compteShow} py-3" id="compte-tab-pane" role="tabpanel" aria-labelledby="compte-tab" tabindex="0"> <div class="my-5 ms-3 row d-inline-size"> <table class="table table-bordered d-inline-block" style="font-size:calc(min(18cqw/{N}, 1em))"> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>Résultat net</td> {#each Array(N) as _, i} <td>{resultatNet(i).toFixed(arr)}</td> {/each} </tr> </tbody> </table> </div> <h4 class="my-3">Détail</h4> <div class="ms-3 row"> <div> <h5 class="mt-5">Chiffre d'affaires</h5> <table class="table table-bordered d-inline-block" style="font-size:calc(min(16cqw/{N}, 1em))"> <!-- <thead> <tr> <th></th> <th></th> </tr> </thead> --> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>Vente locale (€)</td> {#each Array(N) as _, i} <td>{(productionAnnuelle(i) * (autoconso * tarifLocal(i))).toFixed(0)}</td> {/each} </tr> <tr><td>Vente de surplus (€)</td> {#each Array(N) as _, i} <td>{(productionAnnuelle(i) * ((1 - autoconso) * tarifSurplus(i))).toFixed(0)}</td> {/each} </tr> <tr><td>Prime</td> <td>{primeInvestissement}</td> {#each Array(N-1) as _} <td></td> {/each} </tr> </tbody> <tfoot class="table-group-divider"> <tr><td>Chiffre d'affaires</td> {#each Array(N) as _, i} <td>{chiffreAffaires(i).toFixed(arr)}</td> {/each} </tr> </tfoot> </table> <h5 class="my-3">Charges d'exploitation</h5> <table class="table table-bordered d-inline-block" style="font-size:calc(min(17cqw/{N}, 1em))"> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>Maintenance</td> {#each Array(N) as _, i} <td>{exploitation(i).toFixed(arr)}</td> {/each} </tr> <tr><td>TURPE</td> {#each Array(N) as _, i} <td>{turpe(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Assurance</td> {#each Array(N) as _, i} <td>{assurance(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Divers</td> {#each Array(N) as _, i} <td>{divers(i).toFixed(arr)}</td> {/each} </tr> </tbody> <tfoot class="table-group-divider"> <tr><td>Total charges</td> {#each Array(N) as _, i} <td>{charges(i).toFixed(arr)}</td> {/each} </tr> </tfoot> </table> <h5 class="my-3">Excédent brut d'exploitation</h5> <table class="table table-bordered d-inline-block" style="font-size:calc(min(18cqw/{N}, 1em))"> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>Valeur ajoutée</td> {#each Array(N) as _, i} <td>{valeurAjoutee(i).toFixed(arr)}</td> {/each} </tr> <tr><td>IFER</td> {#each Array(N) as _, i} <td>{ifer(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Taxe foncière</td> {#each Array(N) as _, i} <td>{taxeFonciere(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Cotisation foncière des entreprises</td> {#each Array(N) as _, i} <td>{cfe(i).toFixed(arr)}</td> {/each} </tr> </tbody> <tfoot class="table-group-divider"> <tr><td>Excédent brut d'exploitation</td> {#each Array(N) as _, i} <td>{ebe(i).toFixed(arr)}</td> {/each} </tr> </tfoot> </table> <h5 class="my-3">Résultat net</h5> <table class="table table-bordered d-inline-block" style="font-size:calc(min(18cqw/{N}, 1em))"> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>Onduleurs</td> {#each Array(N) as _, i} <td>{provisionOnduleurs(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Amortissement</td> {#each Array(N) as _, i} <td>{amortissement(i).toFixed(arr)}</td> {/each} </tr> {#if investissement > apport} <tr><td>Intérêts dette senior</td> {#each Array(N) as _, i} <td>{(interetsDetteSenior(i)).toFixed(arr)}</td> {/each} </tr> <tr><td>Intérêts DSRA</td> {#each Array(N) as _, i} <td>{interetsDSRA(i).toFixed(arr)}</td> {/each} </tr> {/if} <tr><td>Résultat fiscal</td> {#each Array(N) as _, i} <td>{resultatFiscal(i).toFixed(arr)}</td> {/each} </tr> <tr><td>Impôt sur les sociétés</td> {#each Array(N) as _, i} <td>{is(i).toFixed(arr)}</td> {/each} </tr> </tbody> <tfoot class="table-group-divider"> <tr><td>Résultat net</td> {#each Array(N) as _, i} <td>{resultatNet(i).toFixed(arr)}</td> {/each} </tr> </tfoot> </table> {#if investissement > apport } <h5 class="my-3">Couverture de la dette</h5> <table class="table table-bordered d-inline-block" style="font-size:calc(min(18cqw/{N}, 1em))"> <tbody> <tr><td>Année</td>{#each Array(N) as _, i}<td>{an + i}</td>{/each}</tr> <tr><td>DSCR</td> {#each Array(N) as _, i} <td>{dscr(i).toFixed(2)}</td> {/each} </tr> </tbody> </table> {/if} </div> </div> </div> <div class="tab-pane fade {banqueActive} {banqueShow} py-3" id="banque-tab-pane" role="tabpanel" aria-labelledby="banque-tab" tabindex="0"> <Banque dette = {Math.max(0, investissement - apport)} taux={p.interet / 100} duree={p.echeances} bind:interetsAnnuels={interetsAnnuels} bind:remboursementAnnuel={remboursementAnnuel} /> </div> {#if expert} <div class="tab-pane fade {expertActive} {expertShow} py-3" id="expert-tab-pane" role="tabpanel" aria-labelledby="expert-tab" tabindex="0"> <div style="max-width:300px"> <div class="mb-3"> <label class="form-label" for="enedis">Coût de raccordement Enedis</label> <input class="form-control form-control-sm" type="number" id="enedis" min="0" bind:value={p.enedis}/> </div> <div class="mb-3"> <label class="form-label" for="productible">Productible annuel (kWh/kWc)</label> <input class="form-control form-control-sm" type="number" id="productible" min="0" bind:value={p.productible}/> </div> <div class="mb-3"> <label class="form-label" for="ratio">Ratio installation (€/W)</label> <input class="form-control form-control-sm" type="number" id="ratio" min="0" bind:value={p.ratio}/> </div> <div class="mb-3"> <label class="form-label" for="degradation">Taux de dégradation PV(%)</label> <input class="form-control form-control-sm" type="number" id="degradation" min="0" bind:value={p.degradation}/> </div> <div class="mb-3"> <label class="form-label" for="inflation">Inflation tarif local</label> <input class="form-control form-control-sm" type="number" id="inflation" min="0" bind:value={p.inflation}/> </div> </div> </div> {/if} </div> {#if true || !data.guest} <div class="tab-content" id="simuTabContent"> <div class="tab-pane fade {simuActive} {simuShow} show p-3" id="simu-tab-pane" role="tabpanel" aria-labelledby="simu-tab" tabindex="0"> <h4 class="my-3">Simulation</h4> <Simulation active={simuActive} bind:prms={data.prms} puissance={p.puissance}/> </div> </div> {/if} </div> </div> <div class="modal" id="faisanSaveModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> {#if !data.guest} <div class="modal-body"> <h5 class="modal-title pb-3" id="saveModalLabel">Sauvegarder</h5> <form method="POST" action="?/save" use:enhance={save}> <div class="mb-3"> <label class="form-label" for="nom">Nom du projet</label> <input class="form-control" type="text" id="nom" name="name" bind:value={data.name} required/> </div> <div class="mb-3"> <label class="form-label" for="porteur">Prénom et nom du porteur du projet</label> <input class="form-control" type="text" id="porteur" name="porteur" bind:value={data.porteur}/> </div> <div class="mb-3"> <label class="form-label" for="adresse">Adresse</label> <input class="form-control" type="text" id="adresse" name="adresse" bind:value={data.adresse}/> </div> <div class="mb-3"> <label class="form-label" for="tel">Téléphone</label> <input class="form-control" type="text" id="tel" name="tel" bind:value={data.tel}/> </div> <div class="mb-3"> <label class="form-label" for="photo">Photo</label> <input class="form-control" type="file" id="photo" name="photo"/> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button> <button class="btn btn-primary">Sauvegarder</button> </div> {/if} </div> </div> </div> <style lang="scss"> @media (prefers-color-scheme: light) { nav { background-color: #fff !important; } } </style>