{"id":"c1175","filename":"c1175_digigraf_top5_pwa.dok.json","weise3_id":"","tip":"implementacija","naziv":"digigraf.online TOP 5 PWA poboljšanja","kreator":"genesis","datum":"2026-05-29","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"digigraf.online TOP 5 PWA poboljšanja","c":"c1175","datum":"2026-05-29","sustav":"digigraf.online","server":"EU (217.160.71.124) + MAR sync","git_commits":["0f550078","4d11ff04"],"sto_treba":"Implementirati 5 najviše-ROI poboljšanja za digigraf.online PWA — performance, SEO, sigurnost, instalabilnost.","sto_je_napravljeno":{"P1_i18n_lazy_split":{"opis":"i18n.js (248KB monolith) razbijen na core + 17 lazy fajlova","rezultat":"248KB → 52KB na inicijalnom učitavanju (-79%)","detalji":["Core 5 jezika inline (hr/de/pl/tr/en) — uvijek dostupni","17 non-core jezika lazy-učitani tek kad korisnik promijeni jezik","Novi API: window.DgI18n.registerLang(lang, data) + _lazy_waiting mehanizam","Lazy fajlovi: /i18n/{lang}.js?v=1 (sr/bs/sl/mk/sq/bg/ro/sk/cs/hu/it/fr/nl/sv/no/da/fi)","Fallback queue: window._dgi18n_queue za slucaj race condition","Node.js simulacija potvrđena: core instant, lazy trigger + applyLang on arrival"],"bug_fiksevi":["setLang koristio d._T[lang] (undefined var) umjesto T[lang] (local const) — fiksano","Lazy fajlovi pisali u d._T umjesto window.DgI18n.registerLang — regenerirani"]},"P2_hreflang_sitemap":{"opis":"hreflang link tagovi u index.html + sitemap.xml xhtml:link alternates","rezultat":"23 hreflang alternata u head + 575 xhtml:link u sitemap.xml","detalji":["index.html: link rel=alternate hreflang=x-default + 22 jezicna alternata","sitemap.xml: 27 URL-ova, svaki s kompletnim setom 23 xhtml:link alternata","Novi jezici dodani: nl, sv, no, da, fi (prethodno nedostajali)","Prioriteti po jeziku: de/en=0.90, pl=0.85, tr=0.80, ostali 0.62-0.78"]},"P3_manifest_upgrade":{"opis":"manifest.json nadograden na PWA best practices","rezultat":"Installable PWA s maskable iconom, shortcuts, id, categories","detalji":["Dodano: id=/, scope=/, lang=hr","Dodano: categories=[navigation, productivity, business]","Maskable icon: icon-512.png s purpose=any maskable","Shortcuts: Novi zapis (?action=new) + Moji dokumenti (?action=docs)","name promijenjeno: Digigraf Genesis → Digigraf Tahograf"]},"P4_brotli_kompresija":{"opis":"Brotli kompresija omogucena na nginx EU serveru","rezultat":"Brotli + gzip za JS/CSS/HTML/SVG — modernim browserima manji payload","detalji":["Instalirani: libnginx-mod-http-brotli-filter + libnginx-mod-http-brotli-static","nginx.conf: brotli on, brotli_comp_level 6, brotli_static on","gzip_vary on, gzip_comp_level 6, prosireni MIME types","Potvrđeno: curl -H Accept-Encoding:br → content-encoding: br"]},"P5_csp_hardening":{"opis":"CSP: unsafe-inline uklonjen iz script-src, zamijenjen SHA-256 hashevima","rezultat":"Striktna CSP bez unsafe-inline na izvrsnim skriptama","detalji":["Pronadjene 3 inline skripte: Anti-FOUC + GDPR banner + theme toggle","Hashevi: sha256-yi0BLJG4... + sha256-5nzVc4... + sha256-MNpOFh...","Azurirani: /etc/nginx/snippets/digigraf-security.conf + sites-enabled/digigraf","style-src unsafe-inline ostaje (CSS ne izvrsava kod, prihvatljivo)"]}},"test_rezultati":{"HTTP_200":true,"hreflang_count":23,"i18n_core_size_kb":52,"lazy_files_count":17,"brotli_active":true,"csp_unsafe_inline_removed":true,"manifest_maskable":true,"sw_js_ok":true,"login_4_opcije":true,"sync_MAR":true},"faze":[{"id":1,"naziv":"P3 manifest.json","status":"DONE"},{"id":2,"naziv":"P2 hreflang + sitemap","status":"DONE"},{"id":3,"naziv":"P5 CSP hardening","status":"DONE"},{"id":4,"naziv":"P1 i18n lazy split","status":"DONE"},{"id":5,"naziv":"P4 Brotli nginx","status":"DONE"},{"id":6,"naziv":"Bug fix: setLang + registerLang","status":"DONE"},{"id":7,"naziv":"Sync na MAR","status":"DONE"}],"zakon":["ZAKON_1A","ZAKON_29","ZAKON_32"],"napomene":["digigraf.online serviran s EU (217.160.71.124), MAR = genesis cvor kopija","Nginx brotli samo EU (MAR nema digigraf nginx config)","i18n.js.bak sacuvan na EU serveru kao backup originalnog 248KB fajla","CSP hash-based pristup — pri svakoj promjeni inline skripte hash se mora rekalkulirati"]}}