diff --git a/locenice/app.html b/locenice/app.html index f4a8eb7..391822a 100644 --- a/locenice/app.html +++ b/locenice/app.html @@ -324,7 +324,6 @@ -
Načítání modelu…
@@ -343,6 +342,11 @@ + \ No newline at end of file diff --git a/locenice/data/app-config.json b/locenice/data/app-config.json index 9fe9532..be300e4 100644 --- a/locenice/data/app-config.json +++ b/locenice/data/app-config.json @@ -1,6 +1,6 @@ { "version": "locenice-web-01", - "model": "./models/dum.glb?v=20261022b", + "model": "./models/dum.glb?v=20261022c", "renderer": "auto", "threeModule": "https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js", "threeLoader": "https://cdn.jsdelivr.net/npm/three@0.180.0/examples/jsm/loaders/GLTFLoader.js", diff --git a/locenice/data/catalog.json b/locenice/data/catalog.json index afa6685..4c0a69d 100644 --- a/locenice/data/catalog.json +++ b/locenice/data/catalog.json @@ -319,9 +319,9 @@ ], "kitchenColor": [ [ - "#4e5952", + "#4b5449", "Zelená", - "#4e5952" + "#4b5449" ], [ "#eeeae1", @@ -353,7 +353,7 @@ [ "oak", "Dřevo", - "#b59369" + "#a97a50" ], [ "white", @@ -372,6 +372,11 @@ ] ], "backsplash": [ + [ + "none", + "Bez obkladu", + "#efede8" + ], [ "stone", "Světlý kámen", @@ -385,7 +390,7 @@ [ "worktop", "Jako deska", - "#b59369" + "#a97a50" ] ], "faucet": [ @@ -424,9 +429,9 @@ ], "kitchenBodyColor": [ [ - "#4e5952", + "#4b5449", "Zelená", - "#4e5952" + "#4b5449" ], [ "#eeeae1", @@ -512,10 +517,10 @@ "intDoorCode": "", "intDoorType": "hinged", "intHandle": "square", - "kitchenColor": "#4e5952", - "kitchenBodyColor": "#4e5952", + "kitchenColor": "#4b5449", + "kitchenBodyColor": "#4b5449", "worktop": "oak", - "backsplash": "stone", + "backsplash": "none", "shower": "tray", "faucet": "chrome", "hood": "facade", diff --git a/locenice/js/app.js b/locenice/js/app.js index c60cf29..7f65d75 100644 --- a/locenice/js/app.js +++ b/locenice/js/app.js @@ -752,6 +752,7 @@ let backend=null,projectPanel=null; if(e.stdFullOnly && interior.enabled && interior.mode!=='walk')return false; if(e.stdBlind && (!stdState.blinds || (e.stdBlindFraction!==undefined && e.stdBlindFraction>stdState.blindDrop/100)))return false; if(e.stdWhen && Object.entries(e.stdWhen).some(([k,v])=>stdState[k]!==v))return false; + if(e.stdUnless && Object.entries(e.stdUnless).some(([k,v])=>stdState[k]===v))return false; return true; } function stdSetMaterial(role,color,texture){ @@ -797,8 +798,8 @@ let backend=null,projectPanel=null; for(const r of STD_ROOMS){if(v[r[0]]===undefined)continue;const f=v[r[0]];if(!f||!['lam','tile'].includes(f.type)||!Number.isInteger(f.sample)||f.sample<1||f.sample>9)throw Error('Neplatn\u00e1 podlaha m\u00edstnosti '+r[0]);d.floors[r[0]]={type:f.type,sample:f.sample};} } else if(['wallPaint','kitchenColor','kitchenBodyColor','intDoorColor'].includes(k)){ if(typeof v!=='string'||!/^#[0-9a-f]{6}$/i.test(v))throw Error('Neplatn\u00e1 barva: '+k);d[k]=v.toLowerCase(); - // The kitchen green was re-tinted; selections saved with the previous shade follow it. - if(k.startsWith('kitchen')&&d[k]==='#35463e')d[k]='#4e5952'; + // The kitchen green was re-tinted; selections saved with an earlier shade follow it. + if(k.startsWith('kitchen')&&['#35463e','#4e5952'].includes(d[k]))d[k]='#4b5449'; } else if(STD_OPTIONS[k]){if(!STD_OPTIONS[k].some(o=>o[0]===v))throw Error('Nezn\u00e1m\u00e1 varianta: '+k);d[k]=v; } else if(enums[k]){if(!enums[k].includes(v))throw Error('Nezn\u00e1m\u00e1 varianta: '+k);d[k]=v; } else if(typeof d[k]==='boolean'){if(typeof v!=='boolean')throw Error('Neplatn\u00fd p\u0159ep\u00edna\u010d: '+k);d[k]=v; diff --git a/locenice/js/bootstrap.js b/locenice/js/bootstrap.js index e2cdc7e..1442a51 100644 --- a/locenice/js/bootstrap.js +++ b/locenice/js/bootstrap.js @@ -6,8 +6,9 @@ try{ const response=await fetch(config.model);if(!response.ok)throw Error('Model / HTTP '+response.status); const modelBytes=new Uint8Array(await response.arrayBuffer()); config.threeModule=new URL(config.threeModule,location.href).href;config.threeLoader=new URL(config.threeLoader,location.href).href; - // The standard GLTFLoader imports the same pinned Three.js copy. - const map=document.createElement('script');map.type='importmap';map.textContent=JSON.stringify({imports:{three:config.threeModule}});document.head.appendChild(map); + // The standard GLTFLoader imports the same pinned Three.js copy. app.html normally adds this map + // before any module loads (Firefox ignores a later one); this is only the fallback. + if(!document.querySelector('script[type=importmap]')){const map=document.createElement('script');map.type='importmap';map.textContent=JSON.stringify({imports:{three:config.threeModule}});document.head.appendChild(map);} const hash=location.hash; if(hash.startsWith('#vyber='))try{ let text=hash.slice(7).replace(/-/g,'+').replace(/_/g,'/');text+='='.repeat((4-text.length%4)%4); @@ -16,7 +17,7 @@ try{ document.getElementById('stdSavedState').textContent=JSON.stringify({selection:payload.selection}); }catch(error){console.warn('Invalid shared selection:',error);} window.LOCENICE_RESOURCES={config,catalog,assets,references,scene,site,modelBytes}; - await import('./app.js?v=20261022b'); + await import('./app.js?v=20261022c'); }catch(error){ console.error(error);const box=document.getElementById('loading');box.className='error';box.innerHTML='

Nahrajte celou slozku vcetne js, css, data, models a assets. Otevrete ji pres HTTP(S), nikoli dvojklikem na HTML.

Stahnout model GLB'; box.querySelector('.errorDetail').textContent=error.message;document.getElementById('webStatus').textContent='Chyba nacitani'; diff --git a/locenice/models/dum.glb b/locenice/models/dum.glb index f10a1bc..0994c3e 100644 Binary files a/locenice/models/dum.glb and b/locenice/models/dum.glb differ