v0.6.0: ruimtes (verfemmer: functie, netto m², vloerafwerking, FIBO-wandpanelen, eigen verfkleur, vals plafond, ruimtestaat op de PDF), inrichting (sanitair, keuken, kookeiland, kasten, bed, zithoek, boiler; slepen met snappen op het wandvlak, draaien, kosten), kozijnen met deurrichting, glasdeur en schuifdeuren (inbouw/opbouw, deuren open in de loopmodus) plus dagkanten, gevel stucwerk en wandstukken splitsen met eigen gevel, dak over de hele woning met overkapping, geschilderd plafond, model Amstel als nieuw ontwerp, kosten en prijzen uit kosten/intern.csv en kosten/leveranciers.csv (CostCsv); easter egg verwijderd; overbodige comments opgeschoond (alleen copyright, uitzonderingen en valkuilen blijven)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Machiel
2026-10-11 00:34:27 +02:00
co-authored by Claude Opus 5.5
parent b5510d56c7
commit ceda0b554d
45 changed files with 4117 additions and 3700 deletions
+4 -14
View File
@@ -4,7 +4,7 @@
* Alle rechten voorbehouden. Gebruik uitsluitend met schriftelijke toestemming.
* Zie LICENTIE.md.
*/
const APP_VERSION = '0.5.3';
const APP_VERSION = '0.6.0';
// 0.0.X per kleine iteratie, 0.X.0 per mijlpaal, X.0.0 bij live-gang.
let tabs = [];
@@ -32,9 +32,6 @@ function setWorkspaceEmpty() {
</div>`;
}
// Ribbon (core/ribbon.js): app-tabbladen Bestand, Beeld en Extra; de
// editor voegt er zijn eigen tabbladen aan toe. Knoppen die de huidige
// editor niet ondersteunt staan uit.
function updateEditMenuState() {
Ribbon.refresh();
}
@@ -61,6 +58,7 @@ function appRibbonTabs() {
big('Openen', 'folder2-open', `data-app="triggerImport" title="JSON-ontwerp openen" ${disabledUnless('triggerImport')}`) +
big('Opslaan', 'save', `data-app="exportDesign" title="Opslaan als JSON + PDF (Ctrl+S)" ${disabledUnless('exportDesign')}`) },
{ label: 'Snel nieuw', html:
small('Woning Amstel', 'house-heart', 'data-app="new-kind" data-kind="woning" data-template="amstel"') +
small('Woning', 'house', 'data-app="new-kind" data-kind="woning" data-template="single"') +
small('Woning L-vorm', 'bounding-box-circles', 'data-app="new-kind" data-kind="woning" data-template="L"') +
small('Los: muur', 'bricks', 'data-app="new-kind" data-kind="muur"') +
@@ -127,7 +125,7 @@ function switchToTab(tabId) {
}
function openNew(kind, template) {
if (!editorModuleFor(kind)) return; // 'dak' nog niet beschikbaar
if (!editorModuleFor(kind)) return;
const oldTab = tabs.find(t => t.id === activeTabId);
if (oldTab && currentEditor && typeof currentEditor.getStateJson === 'function') {
@@ -196,7 +194,6 @@ function wireTabBar() {
});
}
// Minimale markdown-weergave voor de licentietekst (koppen + alinea's).
function renderLicenseHtml(md) {
const esc = (t) => t.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
return md.trim().split(/\n\s*\n/).map(block => {
@@ -248,12 +245,6 @@ function wireHotkeys() {
openNewModal();
return;
}
// Easter egg (shooter); e.code omdat Alt/Shift e.key per toetsenbord verandert.
if (e.ctrlKey && e.shiftKey && e.altKey && e.code === 'KeyL') {
e.preventDefault();
if (currentEditor && typeof currentEditor.toggleShooter === 'function') currentEditor.toggleShooter();
return;
}
if (inField || e.ctrlKey || e.metaKey || e.altKey) return;
if (e.key.toLowerCase() === 'f') {
@@ -279,14 +270,13 @@ document.addEventListener('DOMContentLoaded', () => {
wireNewModal();
wireHotkeys();
wireTabBar();
// Tectum draait via een webserver (texturen, lucht); file:// werkt niet volledig.
if (location.protocol === 'file:') {
const note = document.createElement('div');
note.className = 'ui-warn file-protocol-warning';
note.innerHTML = '<i class="bi bi-exclamation-triangle"></i><span>Tectum is geopend als bestand. Start het via een webserver: <code>./start.sh</code> of <code>python3 -m http.server</code>, en open <code>http://localhost:8000</code>. De omgeving (Dag/Nacht) werkt anders niet.</span>';
document.body.appendChild(note);
}
openNew('woning', 'L');
openNew('woning', 'amstel');
setTimeout(() => {
const splash = document.getElementById('splash-screen');