handleiding_nieuw:sub_spacematrix
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| handleiding_nieuw:sub_spacematrix [2025/05/07 09:29] – support | handleiding_nieuw:sub_spacematrix [2026/01/31 10:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| <html lang=" | <html lang=" | ||
| < | < | ||
| - | <meta charset=" | + | <script src=" |
| - | < | + | <script src=" |
| - | < | + | <script src=" |
| - | body { font-family: | + | |
| - | .tabs { display: flex; gap: 10px; margin-bottom: 15px; } | + | < |
| - | .tab { padding: | + | |
| - | .tab.active { background: #f0f0f0; font-weight: | + | |
| - | .tabcontent { display: none; border: 1px solid #ccc; padding: 15px; border-radius: | + | /* ========== Tabs ========== */ |
| - | .tabcontent.active { display: block; } | + | |
| - | .inputrow { display: flex; align-items: | + | .tabs{ |
| - | .inputrow label { width: 240px; } | + | |
| - | .inputrow input { width: 80px; } | + | |
| - | table { border-collapse: | + | |
| - | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | + | padding: 0; |
| - | th { background: #f0f0f0; } | + | flex-wrap:wrap; |
| - | td: | + | } |
| + | |||
| + | .tab{ | ||
| + | | ||
| + | | ||
| + | | ||
| + | border:1px solid #cfcfcf; | ||
| + | border-bottom: | ||
| + | | ||
| + | color:# | ||
| + | font-weight: | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | .tab:hover{ background:# | ||
| + | |||
| + | .tab.active{ | ||
| + | | ||
| + | position: | ||
| + | top:1px; | ||
| + | | ||
| + | } | ||
| + | |||
| + | .tabcontent{ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .tabcontent.active{ display: | ||
| + | |||
| + | @media (max-width: 900px){ | ||
| + | .tabs{ gap:6px; } | ||
| + | } | ||
| + | |||
| + | |||
| + | body { font-family: | ||
| + | |||
| + | | ||
| + | .inputrow label { width: 240px; } | ||
| + | .inputrow input { width: 80px; } | ||
| + | |||
| + | | ||
| + | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | ||
| + | th { background: #f0f0f0; } | ||
| + | td: | ||
| + | |||
| + | .kaartcontainer { position: relative; max-width: 350px; margin-top: 20px; } | ||
| + | .kaartcontainer img { width: 100%; display: block; } | ||
| + | .stipje { position: absolute; width: 14px; height: 14px; background: red; border-radius: | ||
| + | |||
| + | .perc-warning{ color: #b00020; font-weight: | ||
| + | |||
| + | /* ========== Header + Scenario bar ========== */ | ||
| + | .pageheader{ | ||
| + | display: | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | gap:16px; | ||
| + | margin-bottom: | ||
| + | } | ||
| + | |||
| + | .pageheader h1{ | ||
| + | margin:0; | ||
| + | line-height: | ||
| + | } | ||
| + | |||
| + | |||
| + | .scenario-bar{ | ||
| + | display: | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | gap:12px; | ||
| + | flex-wrap: | ||
| + | } | ||
| + | |||
| + | .scenario-left{ | ||
| + | display: | ||
| + | flex-direction: | ||
| + | gap:4px; | ||
| + | min-width: | ||
| + | flex:1; | ||
| + | } | ||
| + | |||
| + | .scenario-left select{ | ||
| + | height: | ||
| + | padding:0 10px; | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .scenario-right{ | ||
| + | display: | ||
| + | align-items: | ||
| + | gap:8px; | ||
| + | flex-wrap: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn{ | ||
| + | height: | ||
| + | padding:0 10px; | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | background:# | ||
| + | color:# | ||
| + | font-weight: | ||
| + | cursor: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn: | ||
| + | background:# | ||
| + | border-color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary{ | ||
| + | background:# | ||
| + | border-color:# | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger{ | ||
| + | background:# | ||
| + | border-color:# | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # | ||
| + | |||
| + | |||
| + | /* ====== Spacematrix legenda (onder invoervelden, | ||
| + | |||
| + | .sm-legend{ | ||
| + | margin-top: 14px; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | border-radius: | ||
| + | background: #fff; | ||
| + | padding: 6px 8px; | ||
| + | max-width: 250px; | ||
| + | min-height: 118px; | ||
| + | margin-bottom: | ||
| + | } | ||
| + | |||
| + | .sm-legend-title{ | ||
| + | margin: 0 0 6px 0; | ||
| + | font-size: 0.84rem; | ||
| + | font-weight: | ||
| + | color: #113333; | ||
| + | } | ||
| + | |||
| + | .sm-legend-grid{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 5px; | ||
| + | } | ||
| + | |||
| + | .sm-legend-item{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 6px; | ||
| + | align-items: | ||
| + | font-size: 0.80rem; | ||
| + | line-height: | ||
| + | color: #1f3e3e; | ||
| + | } | ||
| + | |||
| + | .sm-zone-badge{ | ||
| + | width: 18px; | ||
| + | height: 18px; | ||
| + | border-radius: | ||
| + | font-size: 0.68rem; | ||
| + | font-weight: | ||
| + | background: #e9f1f1; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | color: #113333; | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .sm-legend-short{ | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | gap: 4px; | ||
| + | } | ||
| + | |||
| + | /* Info-icoon (klein en rustig) */ | ||
| + | .sm-legend-i{ | ||
| + | width: 16px; | ||
| + | height: 16px; | ||
| + | border-radius: | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | font-size: 0.72rem; | ||
| + | font-weight: | ||
| + | border: 1px solid #c9d6d6; | ||
| + | background: #f4f7f7; | ||
| + | color: #2b4a4a; | ||
| + | cursor: help; | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | /* ====== Tooltip mechaniek ======*/ | ||
| + | |||
| + | .sm-tip{ | ||
| + | position: relative; | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | } | ||
| + | |||
| + | /* Tooltip bubble */ | ||
| + | .sm-tip:: | ||
| + | content: attr(data-tip); | ||
| + | position: absolute; | ||
| + | left: 0; | ||
| + | top: calc(100% + 8px); | ||
| + | width: 260px; | ||
| + | max-width: 70vw; | ||
| + | background: #113333; | ||
| + | color: #fff; | ||
| + | padding: 8px 10px; | ||
| + | border-radius: | ||
| + | font-size: 0.8rem; | ||
| + | line-height: | ||
| + | box-shadow: 0 8px 18px rgba(0, | ||
| + | opacity: 0; | ||
| + | transform: translateY(-4px); | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: 50; | ||
| + | white-space: | ||
| + | } | ||
| + | |||
| + | /* Tooltip pijltje */ | ||
| + | .sm-tip:: | ||
| + | content: ""; | ||
| + | position: absolute; | ||
| + | left: 10px; | ||
| + | top: calc(100% + 2px); | ||
| + | border: 6px solid transparent; | ||
| + | border-bottom-color: | ||
| + | opacity: 0; | ||
| + | transform: translateY(-4px); | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: 51; | ||
| + | } | ||
| + | |||
| + | /* Toon tooltip bij hover/focus */ | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | opacity: 1; | ||
| + | transform: translateY(0); | ||
| + | } | ||
| + | |||
| + | /* Toegankelijk: | ||
| + | .sm-legend-i: | ||
| + | outline: none; | ||
| + | box-shadow: 0 0 0 3px rgba(0, 116, 217, 0.18); | ||
| + | border-color: | ||
| + | } | ||
| + | |||
| + | /* Mobiel: iets breder tooltip */ | ||
| + | @media (max-width: 600px){ | ||
| + | .sm-tip:: | ||
| + | } | ||
| </ | </ | ||
| + | | ||
| + | | ||
| + | <script src=" | ||
| </ | </ | ||
| < | < | ||
| - | <h1>Spacematrix & Voorzieningen</h1> | + | |
| + | <div class=" | ||
| + | | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | <select id=" | ||
| + | <span id=" | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <span id=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <!-- RESPONSIVE VOOR MOBIELE TELEFOONS --> | ||
| + | <div class=" | ||
| + | < | ||
| + | Deze pagina bevat interactieve grafieken en tabellen die zijn ontworpen voor gebruik op een groter scherm. | ||
| + | Voor een beter overzicht kun je je telefoon liggend houden of deze pagina openen op een tablet of laptop. | ||
| + | </ | ||
| + | |||
| <div class=" | <div class=" | ||
| - | | + | |
| - | <div class=" | + | |
| + | <div class=" | ||
| + | <div class=" | ||
| + | <div class=" | ||
| </ | </ | ||
| <div id=" | <div id=" | ||
| - | | + | <div class=" |
| + | <div class=" | ||
| + | | ||
| <label for=" | <label for=" | ||
| <input id=" | <input id=" | ||
| - | | + | |
| - | <div class=" | + | <div class=" |
| <label for=" | <label for=" | ||
| <input id=" | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <span id=" | ||
| + | <input type=" | ||
| + | </ | ||
| + | |||
| + | <!-- legenda Spacematrix --> | ||
| + | |||
| + | <div class=" | ||
| + | <div class=" | ||
| + | |||
| + | <div class=" | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Low-rise spacious blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| - | | + | |
| - | <label for="voorzieningenruimte">Voorzieningenruimte per woning (m²):</label> | + | |
| - | <input id="voorzieningenruimte" | + | <span class="sm-zone-badge">B</span> |
| + | <div class="sm-legend-short"> | ||
| + | Low-rise compact blocks | ||
| + | <span class="sm-tip" | ||
| + | <span class="sm-legend-i" | ||
| + | </ | ||
| + | </div> | ||
| </ | </ | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | <tbody id=" | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | <div id=" | ||
| - | </ | ||
| - | < | + | |
| - | <div class=" | + | < |
| - | | + | <div class=" |
| - | <input id="bewoners_per_woning" | + | |
| + | <span class="sm-tip" | ||
| + | <span class="sm-legend-i" | ||
| + | </ | ||
| + | </div> | ||
| </ | </ | ||
| - | < | + | |
| - | <thead> | + | <div class=" |
| - | <tr>< | + | <span class=" |
| - | | + | |
| - | <tbody id="voorzieningentabel"></ | + | |
| - | </ | + | <span class="sm-tip" |
| - | < | + | <span class=" |
| - | <button onclick="berekenVoorzieningenruimte()">Toepassen in rekenblok</button> | + | </span> |
| - | <div id=" | + | |
| </ | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise compact blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise closed blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise super-blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | High-rise developments | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| </ | </ | ||
| - | <script> | + | <!-- Einde Legenda en Tooltip --> |
| - | const voorzieningen = [ | + | |
| - | { naam: " | + | </ |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | { naam: " | + | |
| - | ]; | + | |
| - | const types = ["egw sociaal", "egw goedkoop", "egw midden", "egw duur", "egw top", "mgw sociaal", "mgw goedkoop", | + | |
| + | <div class="kaartcontainer" | ||
| + | <img src="/ | ||
| + | <div class="stipje" | ||
| + | </ | ||
| + | </ | ||
| - | function switchTab(tabId) { | + | <div class=" |
| - | document.querySelectorAll(' | + | |
| - | | + | < |
| - | | + | < |
| - | | + | </ |
| - | } | + | <tbody id=" |
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| - | function renderWoningtypes() { | + | <div style="margin-top: 10px; font-size: 0.9em; color: #555;"> |
| - | const tbody = document.getElementById("woningtypes" | + | <strong>Let op:</strong> de voorzieningenruimte zoals weergegeven in deze samenvatting kan iets afwijken van de berekening op het tabblad |
| - | tbody.innerHTML = "" | + | Dit komt doordat het aantal woningen iteratief wordt bepaald op basis van de beschikbare ruimte, inclusief ruimte voor voorzieningen en parkeren. |
| - | types.forEach((type, | + | Bij het toepassen van voorzieningen wordt eerst een schatting gemaakt op basis van een voorlopig aantal woningen. Daarna wordt het aantal woningen opnieuw berekend met de benodigde ruimte per woning. |
| - | const row = document.createElement(" | + | |
| - | row.innerHTML = ` | + | </ |
| - | < | + | |
| - | < | + | |
| - | <td><input type=" | + | |
| - | | + | |
| - | < | + | |
| - | `; | + | |
| - | tbody.appendChild(row); | + | |
| - | }); | + | |
| - | } | + | |
| - | function updateLaadvermogen() { | + | <div id=" |
| - | | + | |
| - | const fsi = parseFloat(document.getElementById("fsi").value); | + | < |
| - | | + | < |
| - | const voorzieningenruimte | + | < |
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | < | ||
| + | <td colspan=" | ||
| + | Kengetallen | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | | ||
| + | </ | ||
| + | |||
| + | <div style=" | ||
| + | < | ||
| + | 📄 Kickstart Dump downloaden | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| - | let gewogenBVO | + | <div id=" |
| - | let totalPerc | + | < |
| - | | + | |
| - | | + | |
| - | const perc = parseFloat(document.getElementById(`perc_${i}`).value) || 0; | + | </ |
| - | const bvo = parseFloat(document.getElementById(`bvo_${i}`).value) || 0; | + | < |
| - | | + | < |
| - | | + | < |
| - | | + | </ |
| - | | + | <tbody id=" |
| - | | + | </ |
| + | <div class=" | ||
| + | < | ||
| + | <div id=" | ||
| + | </ | ||
| + | < | ||
| + | <table id=" | ||
| + | < | ||
| + | | ||
| + | </ | ||
| + | <tbody id=" | ||
| + | < | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| - | let woningen = Math.floor(bvoTot / (gewogenBVO + voorzieningenruimte)); | ||
| - | let sumWon = 0; | ||
| - | let sumBVO = 0; | ||
| - | let wonPerType = []; | ||
| - | let restant = woningen; | ||
| - | for (let i = 0; i < details.length; | + | <div style=" |
| - | const { perc } = details[i]; | + | < |
| - | let aant = (perc / 100) * woningen; | + | Nadat dit oppervlak per woning is berekend, wordt het aantal woningen in het rekenblok opnieuw doorgerekend. Hierdoor kan het werkelijke totaal afwijken. |
| - | let afgerond = Math.floor(aant); | + | Deze iteratieve aanpak is nodig omdat de benodigde ruimte per woning invloed heeft op hoeveel woningen uiteindelijk in het plan passen. |
| - | wonPerType.push(afgerond); | + | </ |
| - | | + | </div> |
| - | } | + | |
| - | const decimaalSort = details.map((d, | + | |
| - | | + | |
| - | for (let j = 0; j < restant; j++) { | + | |
| - | wonPerType[decimaalSort[j].i]++; | + | |
| - | } | + | |
| - | for (let i = 0; i < details.length; | + | |
| - | const aant = wonPerType[i]; | + | |
| - | const bvoTot = aant * details[i].bvo; | + | |
| - | document.getElementById(`aantal_${i}`).innerText = aant; | + | |
| - | document.getElementById(`totbvo_${i}`).innerText = bvoTot.toFixed(0); | + | |
| - | sumWon += aant; | + | |
| - | sumBVO += bvoTot; | + | |
| - | } | + | |
| - | document.getElementById(" | + | |
| - | document.getElementById(" | + | |
| - | document.getElementById(" | + | |
| - | document.getElementById(" | + | |
| - | document.getElementById("output").innerHTML | + | <div id="parkeren" |
| - | `<p><b>Gewogen | + | < |
| - | } | + | <div class=" |
| + | < | ||
| + | <input id=" | ||
| + | </div> | ||
| + | | ||
| + | <label> | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | | ||
| + | | ||
| + | < | ||
| + | <input id=" | ||
| + | | ||
| + | <div class=" | ||
| + | <button id=" | ||
| + | <div id=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | function maakVoorzieningentabel() { | + | <div id=" |
| - | | + | < |
| - | | + | < |
| - | | + | < |
| - | | + | |
| - | <td>${v.naam}</ | + | <select id="stedelijkheidstype" |
| - | <td>${v.norm}</ | + | <option value=" |
| - | < | + | <option value=" |
| - | `; | + | <option value=" |
| - | tbody.appendChild(row); | + | <option value=" |
| - | }); | + | |
| - | } | + | < |
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </tbody> | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | <p style=" | ||
| + | <div id=" | ||
| + | < | ||
| + | </ | ||
| - | function berekenVoorzieningenruimte() { | ||
| - | const bewonersPerWoning = parseFloat(document.getElementById(" | ||
| - | const woningen = 131; // Voor nu vast; later dynamisch maken | ||
| - | const totaalBewoners = woningen * bewonersPerWoning; | ||
| - | let totaal_m2 | + | <script src="/ |
| - | voorzieningen.forEach((v, i) => { | + | |
| - | const checked = document.getElementById(`vchk_${i}`).checked; | + | |
| - | if (checked) { | + | |
| - | totaal_m2 += v.norm * totaalBewoners / 1000; | + | |
| - | } | + | |
| - | }); | + | |
| - | const m2_per_woning = totaal_m2 / woningen; | + | |
| - | document.getElementById("voorziening_resultaat" | + | |
| - | `<b>${totaal_m2.toFixed(1)} m² totaal</b> → ${m2_per_woning.toFixed(1)} m² per woning`; | + | |
| - | document.getElementById(" | + | |
| - | updateLaadvermogen(); | + | |
| - | } | + | |
| - | window.onload = () => { | ||
| - | renderWoningtypes(); | ||
| - | maakVoorzieningentabel(); | ||
| - | updateLaadvermogen(); | ||
| - | }; | ||
| - | </ | ||
| </ | </ | ||
| </ | </ | ||
handleiding_nieuw/sub_spacematrix.1746610161.txt.gz · Last modified: 2025/05/07 09:29 by support