Lokalizovane frontend biblioteke i popravljen prikaz u Opera/Chromium

Uklonjena zavisnost od spoljnih CDN-ova koja je u Operi prouzrokovala
  nestanak stilova i elemenata kada blocker/ekstenzija blokira CDN:

  - Tailwind (cdn.tailwindcss.com) potpuno izbačen; 9 korišćenih klasa
    (grid, grid-cols-*, md:grid-cols-*, gap-*, mb-6) prebačeno u main.css
  - HTMX i Chart.js skinuti lokalno u web/static/js/ i serviraju se
    preko go:embed umesto sa jsdelivr CDN-a
  - CSP očišćen u bezbednost.go — uklonjeni svi spoljni izvori, ostaje 'self'

  Popravljen grafikon na stranici Izveštaji: dodato color-scheme:only light
  na canvas i wrapper, jer Operin "tamni režim za web" (force-dark) zatamni
  canvas i učini tekst na osama nevidljivim.
This commit is contained in:
2026-06-09 02:32:24 +02:00
parent cf13d0fe15
commit 4a01bda7d2
6 changed files with 43 additions and 8 deletions
+2 -2
View File
@@ -13,8 +13,8 @@ func BezbednostHeaders() func(http.Handler) http.Handler {
h.Set("Referrer-Policy", "strict-origin-when-cross-origin") h.Set("Referrer-Policy", "strict-origin-when-cross-origin")
h.Set("Content-Security-Policy", h.Set("Content-Security-Policy",
"default-src 'self'; "+ "default-src 'self'; "+
"style-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com; "+ "style-src 'self' 'unsafe-inline'; "+
"script-src 'self' 'unsafe-inline' https://cdn.tailwindcss.com https://cdn.jsdelivr.net; "+ "script-src 'self' 'unsafe-inline'; "+
"img-src 'self' data: blob:; "+ "img-src 'self' data: blob:; "+
"font-src 'self'; "+ "font-src 'self'; "+
"connect-src 'self'") "connect-src 'self'")
+17
View File
@@ -740,3 +740,20 @@ select {
@view-transition { @view-transition {
navigation: auto; navigation: auto;
} }
/* pomoćne klase (ranije iz Tailwind-a, sada lokalno da ne zavisimo od CDN-a) */
.grid { display: grid; }
.gap-3 { gap: 12px; }
.gap-4 { gap: 16px; }
.mb-6 { margin-bottom: 24px; }
/* broj kolona u grid rasporedu — bazne (mobilni-first) vrednosti */
.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* responsive varijante — primenjuju se od 768px naviše (Tailwind „md") */
@media (min-width: 768px) {
.md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.md\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
+20
View File
File diff suppressed because one or more lines are too long
+1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -263,7 +263,7 @@
inicijalizujGrafikon(); inicijalizujGrafikon();
} else { } else {
var s = document.createElement('script'); var s = document.createElement('script');
s.src = 'https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js'; s.src = '/static/js/chart.umd.min.js';
s.onload = inicijalizujGrafikon; s.onload = inicijalizujGrafikon;
document.head.appendChild(s); document.head.appendChild(s);
} }
+2 -5
View File
@@ -22,9 +22,6 @@
<!-- glavni stilovi --> <!-- glavni stilovi -->
<link rel="stylesheet" href="/static/css/main.css" /> <link rel="stylesheet" href="/static/css/main.css" />
<!-- tailwind -->
<script src="https://cdn.tailwindcss.com"></script>
{{block "dodatni-css" .}}{{end}} {{block "dodatni-css" .}}{{end}}
{{if .AppPozadina}} {{if .AppPozadina}}
@@ -112,8 +109,8 @@
<!-- alpine.js CSP build (lokalno, bez unsafe-eval) --> <!-- alpine.js CSP build (lokalno, bez unsafe-eval) -->
<script src="/static/js/alpine.csp.min.js" defer></script> <script src="/static/js/alpine.csp.min.js" defer></script>
<!-- htmx za komunikaciju sa serverom --> <!-- htmx za komunikaciju sa serverom (lokalno) -->
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.x.x/dist/htmx.min.js"></script> <script src="/static/js/htmx.min.js"></script>
<!-- sidebar logika — sidebar se NIKAD ne menja pri HTMX navigaciji, pa nema potrebe za swap logikom --> <!-- sidebar logika — sidebar se NIKAD ne menja pri HTMX navigaciji, pa nema potrebe za swap logikom -->
<script> <script>