diff --git a/assets/images/blog/2025-11-15-prihaja-kmalu/header.png b/assets/images/blog/2025-11-15-prihaja-kmalu/header.png new file mode 100644 index 0000000..08eba96 Binary files /dev/null and b/assets/images/blog/2025-11-15-prihaja-kmalu/header.png differ diff --git a/assets/images/blog/2025-11-16-prihaja-kmalu/header.png b/assets/images/blog/2025-11-16-prihaja-kmalu/header.png new file mode 100644 index 0000000..08eba96 Binary files /dev/null and b/assets/images/blog/2025-11-16-prihaja-kmalu/header.png differ diff --git a/blog/clanki-source/2025-11-17-medkulturnost-prostor-za-rast.html b/blog/clanki-source/2025-11-17-medkulturnost-prostor-za-rast.html new file mode 100644 index 0000000..e9ce3bb --- /dev/null +++ b/blog/clanki-source/2025-11-17-medkulturnost-prostor-za-rast.html @@ -0,0 +1,382 @@ + + + + + + + + Medkulturnost: prostor za rast v razredih in skupinah vrtca | Prosberry + + + + + + + + + + + + + + + +
+ +
+
+
+
+ 17. november 2025 +

Medkulturnost: prostor za rast v razredih in skupinah vrtca

+ +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+ Medkulturnost prostor za rast +
+ +

V mnogih slovenskih šolah in vrtcih so danes v razredih in + skupinah tudi otroci iz različnih kulturnih okolij. Takšna raznolikost prinaša svoje + izzive, a hkrati ogromno priložnosti za rast, empatijo in nove poglede. Ta stik med + različnimi kulturami – to, čemur pravimo medkulturnost – pomeni, da se učimo razumeti, + spoštovati in ceniti različne običaje, jezike in načine izražanja, hkrati pa ohranjamo + svojo identiteto. V praksi to pomeni ustvariti prijazno in spodbudno vzdušje, kjer se + vsak otrok počuti varno in vključeno.

+ +

Kaj pomenijo medkulturne razlike v razredu in vrtcu?

+ +
+ Medkulturne razlike +
+ +

Medkulturne razlike se ne kažejo le v jeziku, praznovanjih ali videzu otrok, temveč + predvsem v načinu razmišljanja, izražanja in vedenja – v stvareh, ki so pogosto + nevidne, + dokler nanje ne opozorimo. Vsak otrok prihaja iz okolja, kjer so bile določene + vrednote + in navade učene, cenjene in razumljene nekoliko drugače. To vpliva na to, kako se + vključuje v razred ali skupino, sodeluje in doživlja šolo ali vrtec kot varen + prostor za + napredovanje in razvoj.

+

Pomembno: To niso pravila, temveč opazovanja. Otroci iz iste države + se + lahko med seboj zelo razlikujejo – vsak prinese svojo zgodbo, družinske vrednote in + izkušnje. Te razlike so priložnost za razumevanje in odprtost, ne razlog za sodbo + ali + primerjavo.

+ +

Kako se otroci izražajo: besede, tišina in pogledi

+ +
+ Kako se otroci izražajo +
+ +

V razredu ali skupini se otroci ne izražajo samo z besedami – govorica telesa, očesni + stik in tišina prav tako povedo veliko o tem, kako se počutijo, razumejo učne vsebine in + sodelujejo z drugimi. Razumevanje teh razlik je ključ do uspešne medkulturne + komunikacije, saj različni načini izražanja pogosto izhajajo iz kulturnega ozadja otrok. +

+ +
    +
  • Komunikacija in odnos do avtoritete: Nekateri otroci so + neposredni + in povedo stvari naravnost, drugi pa uporabljajo bolj taktičen ali previden + način + izražanja, da ohranijo harmonijo. Enako velja za odnos do učiteljev – v + nekaterih + kulturah je avtoriteta formalna in nedotakljiva, drugje pa bolj partnerska in + pogajalska. Če tega ne prepoznamo, lahko napačno razumemo otrokove motive ali + namene.
  • +
  • Tišina in aktivno sodelovanje: Nekateri otroci bodo takoj + delili + svoje mnenje, drugi pa raje poslušajo in premislijo, preden spregovorijo. Ti + trenutki tišine niso znak nezainteresiranosti, temveč drugačen način učenja in + participacije, ki ga je pomembno razumeti v kontekstu njihove kulturne izkušnje. +
  • +
  • Očesni stik in neverbalna komunikacija: Neposreden očesni stik + je v + nekaterih kulturah znak pozornosti in iskrenosti, v drugih pa lahko pomeni + predrznost ali nespoštovanje. Geste, mimika in fizična bližina se prav tako + razlikujejo – nasmeh je lahko znak prijaznosti ali način, kako otrok skrije + neprijetna čustva. Če ne poznamo kulturnega ozadja, lahko napačno + interpretiramo, + zakaj se otrok vede na določen način.
  • +
+
+ Nasvet +
+

➡️ Nasvet: Ne sklepajte avtomatično, da otrok ne želi sodelovati ali + ni + pozoren. Opazujte, poslušajte in prilagajajte interpretacijo kulturnemu kontekstu. + Uporabite igre, delo v parih ali manjše skupine, da omogočite postopno vključevanje + in + udobno interakcijo.

+ +

Primeri iz prakse

+
    +
  1. Učenka iz Ukrajine ne sodeluje pri ustnih odgovorih Učitelj + lahko + pomisli, da se noče vključiti, a v resnici še ni samozavestna v slovenščini ali + se + boji neposrednega nastopa v tujem jeziku.
  2. +

    ➡️ Nasvet: Ponudite možnost pisnega odgovarjanja ali dela v + paru. + Spodbujajte postopno vključevanje brez pritiska.

    +
  3. Starši otrok iz Albanije se ne udeležijo roditeljskega sestanka + Ni + nujno, da jih ne zanima – morda se zaradi omejenega znanja jezika počutijo + nelagodno + pri javnem izražanju svojih mnenj.
  4. +

    ➡️ Nasvet: Povabilo pošljite v preprostem jeziku in ponudite + možnost + prvega individualnega srečanja, da zgradite zaupanje.

    +
  5. Otrok iz Sirije se izogiba očesnemu stiku V nekaterih kulturah + je + neposreden očesni stik lahko razumljen kot predrznost ali nespoštovanje, zato se + ga + otrok izogiba.
  6. +

    ➡️ Nasvet: Pristopite z razumevanjem in uporabite igre ali + naloge, + ki omogočajo sodelovanje brez pritiska na neposreden očesni stik.

    +
+ +

5 praktičnih nasvetov

+ +
+ Praktični nasveti +
+ +
    +
  1. Vprašajte, ne predvidevajte. Vsaka družina ima svojo zgodbo – + pristopite z radovednostjo, ne s sodbo.
  2. +
  3. Učite o raznolikosti. Pogovorite se o različnih jezikih, + praznikih + in običajih – otroci bodo to doživeli kot bogastvo, ne kot razliko.
  4. +
  5. Ustvarite varno okolje. Naj učenci vedo, da je v redu, če + delajo + napake v jeziku. Vzdušje sprejemanja spodbuja učenje.
  6. +
  7. Sodelujte s starši. Tudi kratka sporočila o napredku otroka + gradijo + zaupanje.
  8. +
  9. Povežite se s strokovnjaki. Delavnice medkulturnega + posredovanja + ali svetovanja lahko učiteljem in staršem pomagajo bolje razumeti kulturne + razlike v + praksi.
  10. +
+ +

Zaključek

+
+ Zaključek +
+

Medkulturnost v razredu ni ovira, ampak priložnost, da skupaj ustvarimo okolje, kjer + se + vsak otrok počuti slišan, spoštovan in sprejet. Z nekaj razumevanja, potrpežljivosti + in + medsebojnega sodelovanja lahko razred postane resnično bogata skupnost. Delite svoje + izkušnje in vprašanja v kontaktnem obrazcu – skupaj lahko gradimo močnejše in bolj + vključujoče šolske in vrtčevske skupnosti.

+
+
+
+ + +
+
+
+
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvarimo prostor za učenje in povezovanje.

+
+
+
+ + + + + + \ No newline at end of file diff --git a/blog/clanki-source/2025-11-17-sample-article.html b/blog/clanki-source/2025-11-17-sample-article.html new file mode 100644 index 0000000..54f1332 --- /dev/null +++ b/blog/clanki-source/2025-11-17-sample-article.html @@ -0,0 +1,222 @@ + + + + + + + + Sample Article Title - Prosberry + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +

Sample Article Title

+

This is a sample summary for the article. It should be one or two sentences + long.

+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvarimo prostor za učenje, razumevanje in povezovanje.

+
+
+
+ + + + + + \ No newline at end of file diff --git a/blog/clanki-source/2025-11-18-dojemanje-casa-tocnosti-discipline.html b/blog/clanki-source/2025-11-18-dojemanje-casa-tocnosti-discipline.html new file mode 100644 index 0000000..ae51e68 --- /dev/null +++ b/blog/clanki-source/2025-11-18-dojemanje-casa-tocnosti-discipline.html @@ -0,0 +1,223 @@ + + + + + + + + Dojemanje časa, točnosti in discipline – od juga proti severu Evrope - Prosberry + + + + + + + + + + + + + + + +
+ +
+
+
+
+ +

Dojemanje časa, točnosti in discipline – od juga proti severu Evrope

+

Medkulturne razlike v dojemanju časa segajo od sproščenih odnosov na jugu do + natančne discipline na severu Evrope, zato je pomembno razumeti, kaj posamezne skupine resnično + sporočajo z zamudo ali redom.

+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvarimo prostor za učenje, razumevanje in povezovanje.

+
+
+
+ + + + + + \ No newline at end of file diff --git a/blog/clanki/2025-11-15-prihaja-kmalu.html b/blog/clanki/2025-11-15-prihaja-kmalu.html new file mode 100644 index 0000000..e090d54 --- /dev/null +++ b/blog/clanki/2025-11-15-prihaja-kmalu.html @@ -0,0 +1,246 @@ + + + + + + + + Prihaja kmalu | Prosberry + + + + + + + + + + + + + + + +
+ +
+
+
+
+ 16. november 2025 +

Prihaja kmalu

+
+
+
+
+
+
+ +
+
+
+
+
+

+ Prihajajo novi članki o medkulturnih temah, na katerih delamo v ozadju. Medtem ko dokončujemo + vsebine, si lahko preberete že objavljene prispevke in najdete navdih ali praktične ideje za delo + s skupinami. Novi naslovi bodo kmalu razkriti – spremljajte nas na tej strani ali preko kontaktnega + obrazca. +

+
+ Prihaja kmalu +
+
+ +
+

Ostanite na tekočem

+

Ko bomo pripravljeni, boste tu našli nove prispevke o dojemanju časa, raznolikosti v učnih skupinah + ali vpeljevanju strukturiranih praks v multikulturnih okoljih. Zdaj pa vas vabimo, da preberete + prej objavljene članke:

+ +

Če si želite svežega vpogleda, izberite enega od zgornjih člankov ali pokličite, da skupaj najdemo podporne poti.

+
+
+
+ + +
+
+
+
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvarimo prostor za učenje in povezovanje.

+
+
+
+ + + + + + diff --git a/blog/clanki/2025-11-16-prihaja-kmalu.html b/blog/clanki/2025-11-16-prihaja-kmalu.html new file mode 100644 index 0000000..6cb4c10 --- /dev/null +++ b/blog/clanki/2025-11-16-prihaja-kmalu.html @@ -0,0 +1,246 @@ + + + + + + + + Prihaja kmalu | Prosberry + + + + + + + + + + + + + + + +
+ +
+
+
+
+ 16. november 2025 +

Prihaja kmalu

+
+
+
+
+
+
+ +
+
+
+
+
+

+ Prihajajo novi članki o medkulturnih temah, na katerih delamo v ozadju. Medtem ko dokončujemo + vsebine, si lahko preberete že objavljene prispevke in najdete navdih ali praktične ideje za delo + s skupinami. Novi naslovi bodo kmalu razkriti – spremljajte nas na tej strani ali preko kontaktnega + obrazca. +

+
+ Prihaja kmalu +
+
+ +
+

Ostanite na tekočem

+

Ko bomo pripravljeni, boste tu našli nove prispevke o dojemanju časa, raznolikosti v učnih skupinah + ali vpeljevanju strukturiranih praks v multikulturnih okoljih. Zdaj pa vas vabimo, da preberete + prej objavljene članke:

+ +

Če si želite svežega vpogleda, izberite enega od zgornjih člankov ali pokličite, da skupaj najdemo podporne poti.

+
+
+
+ + +
+
+
+
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvarimo prostor za učenje in povezovanje.

+
+
+
+ + + + + + diff --git a/blog/clanki/2025-11-17-medkulturnost-prostor-za-rast.html b/blog/clanki/2025-11-17-medkulturnost-prostor-za-rast.html index e09422e..6389e4c 100644 --- a/blog/clanki/2025-11-17-medkulturnost-prostor-za-rast.html +++ b/blog/clanki/2025-11-17-medkulturnost-prostor-za-rast.html @@ -1,3 +1,9 @@ + @@ -156,9 +162,7 @@
17. november 2025

Medkulturnost: prostor za rast v razredih in skupinah vrtca

-

V mnogih slovenskih šolah in vrtcih so danes v razredih in skupinah tudi - otroci iz različnih kulturnih okolij. Takšna raznolikost prinaša svoje izzive, a hkrati ogromno - priložnosti za rast, empatijo in nove poglede.

+
@@ -170,11 +174,15 @@
- Medkulturnost: prostor za rast +
-

V mnogih slovenskih šolah in vrtcih so danes v razredih in +

+ Medkulturnost prostor za rast +
+ +

V mnogih slovenskih šolah in vrtcih so danes v razredih in skupinah tudi otroci iz različnih kulturnih okolij. Takšna raznolikost prinaša svoje izzive, a hkrati ogromno priložnosti za rast, empatijo in nove poglede. Ta stik med različnimi kulturami – to, čemur pravimo medkulturnost – pomeni, da se učimo razumeti, @@ -182,13 +190,13 @@ svojo identiteto. V praksi to pomeni ustvariti prijazno in spodbudno vzdušje, kjer se vsak otrok počuti varno in vključeno.

-
- Medkulturnost prostor za rast -
-

Kaj pomenijo medkulturne razlike v razredu in vrtcu?

+
+ Medkulturne razlike +
+

Medkulturne razlike se ne kažejo le v jeziku, praznovanjih ali videzu otrok, temveč predvsem v načinu razmišljanja, izražanja in vedenja – v stvareh, ki so pogosto nevidne, @@ -207,9 +215,9 @@

Kako se otroci izražajo: besede, tišina in pogledi

-
- Medkulturne razlike +
+ Kako se otroci izražajo

V razredu ali skupini se otroci ne izražajo samo z besedami – govorica telesa, očesni @@ -243,6 +251,10 @@ interpretiramo, zakaj se otrok vede na določen način. +

+ Nasvet +

➡️ Nasvet: Ne sklepajte avtomatično, da otrok ne želi sodelovati ali ni pozoren. Opazujte, poslušajte in prilagajajte interpretacijo kulturnemu kontekstu. @@ -250,11 +262,6 @@ in udobno interakcijo.

-
- Nasvet -
-

Primeri iz prakse

  1. Učenka iz Ukrajine ne sodeluje pri ustnih odgovorih Učitelj @@ -286,7 +293,7 @@

    5 praktičnih nasvetov

    - Praktični nasveti
    @@ -310,6 +317,10 @@

Zaključek

+
+ Zaključek +

Medkulturnost v razredu ni ovira, ampak priložnost, da skupaj ustvarimo okolje, kjer se vsak otrok počuti slišan, spoštovan in sprejet. Z nekaj razumevanja, potrpežljivosti @@ -368,4 +379,4 @@ - \ No newline at end of file + diff --git a/blog/clanki/2025-11-17-sample-article.html b/blog/clanki/2025-11-17-sample-article.html deleted file mode 100644 index d3143ce..0000000 --- a/blog/clanki/2025-11-17-sample-article.html +++ /dev/null @@ -1,10 +0,0 @@ - -

This is the content of the sample article. It can contain any valid HTML.

-

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

\ No newline at end of file diff --git a/blog/clanki/2025-11-18-dojemanje-casa-tocnosti-discipline.html b/blog/clanki/2025-11-18-dojemanje-casa-tocnosti-discipline.html index 6a2c089..10f1213 100644 --- a/blog/clanki/2025-11-18-dojemanje-casa-tocnosti-discipline.html +++ b/blog/clanki/2025-11-18-dojemanje-casa-tocnosti-discipline.html @@ -1,25 +1,23 @@ - + "image": "/assets/images/blog/2025-11-18-dojemanje-casa-tocnosti-discipline/header.png", + "summary": "Razumevanje časovne raznolikosti in disciplina v različnih kulturnih kontekstih pomaga zmanjšati nesporazume v razredu." +} --> - Dojemanje časa, točnosti in discipline – od juga proti severu Evrope - Prosberry + Dojemanje časa, točnosti in discipline – od juga proti severu Evrope | Prosberry + content="Medkulturne razlike v dojemanju časa segajo od sproščenih odnosov na jugu do natančne discipline na severu Evrope, zato je pomembno razumeti, kaj posamezne skupine resnično sporočajo z zamudo ali redom."> - + @@ -90,8 +88,7 @@ Zaposleni
@@ -121,8 +118,7 @@ Šola @@ -131,8 +127,7 @@ Vrtec
-

Skupaj ustvarimo prostor za učenje, razumevanje in povezovanje.

+

Skupaj ustvarimo prostor za učenje in povezovanje.

@@ -316,4 +321,4 @@ - \ No newline at end of file + diff --git a/blog/index.html b/blog/index.html index 868f803..55a4c30 100644 --- a/blog/index.html +++ b/blog/index.html @@ -23,68 +23,63 @@
-
+ Blog + Kdo sem + Kontakt + Pogosta vprašanja + Cene in reference + +
+ + + +
+ +
@@ -168,48 +161,41 @@
+ + Dojemanje časa, točnosti in discipline – od juga proti severu Evrope +
+ +

Dojemanje časa, točnosti in discipline – od juga proti severu Evrope

+

Razumevanje časovne raznolikosti in disciplina v različnih kulturnih kontekstih pomaga zmanjšati nesporazume v razredu.

+
+
+
+ + + + diff --git a/cene-in-reference/index.html b/cene-in-reference/index.html index 8b9a9b7..6db0c28 100644 --- a/cene-in-reference/index.html +++ b/cene-in-reference/index.html @@ -1,11 +1,14 @@ + Cene in reference - Prosberry - - + + @@ -13,7 +16,8 @@ - + @@ -24,65 +28,71 @@ + -
- +
@@ -221,13 +233,30 @@

Kaj pravijo meni/o meni...

-
+
-

V veliko veselje mi je nekaj malega napisati o Amri Kurešepi za njeno spletno stran v okencu 'kaj pravijo o meni'.

-

Amra je prišla v Ljubljano iz Prištine in tu nadaljevala študij angleščine na bolonjski magistrski stopnji. Poleg predanega magistrskega študija se je ves čas tudi zelo intenzivno učila slovenščine. Ves čas študija je kazala iskren interes in zavzetost za poučevanje, hkrati pa tudi zadostno mero kritičnosti do sebe in drugih. Amra je sprva morda delovala plaho (verjetno zaradi velikih življenjskih sprememb), vendar se je hitro sprostila in lepo vključila v razred. K dobremu delu skupine je prispevala s tem, da je bila pripravljena prevzeti pobudo; natančnost, vztrajnost in zdrava samozavest pa so ji zagotavljaje uspeh v razredu.

-

Pod mojim mentorstvom je uspešno opravila pedagoško prakso na OŠ Hinka Smrekarja, v času študija smo skupaj opravili veliko hospitacij po različnih srednjih in osnovnih šolah v Ljubljani, svoj izpitni nastop pa je opravljala na Gimnaziji Bežigrad. Oktobra 2019 je pod mojim mentorstvom študij zaključila z magistrskim delom z naslovom "Factors that Influence the Process of Learning Foreign Languages and Some Potential Effects of Multilingualism" (Dejavniki, ki vplivajo na proces učenja tujih jezikov in nekaj morebitnih učinkov večjezičnosti).

-

V luči mojega osebnega poznavanja kolegice Amre Kurešepi sem prepričan, da lastnosti, ki jih je izkazovala že med študijem, tj. zavzetost, resnost, odgovornost, samostojnost in ustvarjalnost, izkazuje pri vsakem delu, ki ga opravlja.

+

V veliko veselje mi je nekaj malega napisati o Amri Kurešepi za njeno spletno stran v + okencu 'kaj pravijo o meni'.

+

Amra je prišla v Ljubljano iz Prištine in tu nadaljevala študij angleščine na + bolonjski magistrski stopnji. Poleg predanega magistrskega študija se je ves čas + tudi zelo intenzivno učila slovenščine. Ves čas študija je kazala iskren interes in + zavzetost za poučevanje, hkrati pa tudi zadostno mero kritičnosti do sebe in drugih. + Amra je sprva morda delovala plaho (verjetno zaradi velikih življenjskih sprememb), + vendar se je hitro sprostila in lepo vključila v razred. K dobremu delu skupine je + prispevala s tem, da je bila pripravljena prevzeti pobudo; natančnost, vztrajnost in + zdrava samozavest pa so ji zagotavljaje uspeh v razredu.

+

Pod mojim mentorstvom je uspešno opravila pedagoško prakso na OŠ Hinka Smrekarja, v + času študija smo skupaj opravili veliko hospitacij po različnih srednjih in osnovnih + šolah v Ljubljani, svoj izpitni nastop pa je opravljala na Gimnaziji Bežigrad. + Oktobra 2019 je pod mojim mentorstvom študij zaključila z magistrskim delom z + naslovom "Factors that Influence the Process of Learning Foreign Languages and Some + Potential Effects of Multilingualism" (Dejavniki, ki vplivajo na proces učenja tujih + jezikov in nekaj morebitnih učinkov večjezičnosti).

+

V luči mojega osebnega poznavanja kolegice Amre Kurešepi sem prepričan, da lastnosti, + ki jih je izkazovala že med študijem, tj. zavzetost, resnost, odgovornost, + samostojnost in ustvarjalnost, izkazuje pri vsakem delu, ki ga opravlja.

@@ -238,46 +267,78 @@
-

Amra, ful ti hvala za vse res. Tako sem vesela, da nimam odpora do učenja angleščine. Res čutim, da sem na pravi poti in želim od tega tečaja odnesit max. Me je pa treba priganjati in ti počneš to zelo prijazno in profesionalno, za kar sem ti neskočno hvaležna. Tokrat prvič nimam strahu in sramu, da bom povedala ali naredila kaj narobe.

+

Amra, ful ti hvala za vse res. Tako sem vesela, da nimam odpora do učenja angleščine. Res + čutim, da sem na pravi poti in želim od tega tečaja odnesit max. Me je pa treba + priganjati in ti počneš to zelo prijazno in profesionalno, za kar sem ti neskočno + hvaležna. Tokrat prvič nimam strahu in sramu, da bom povedala ali naredila kaj narobe. +

Mojca Triller

Predstavnik klicnega centra

+ +
+
+
+

Na osnovni šoli, kjer sem zaposlena kot svetovalna delavka imamo tudi kar nekaj otrok + iz Kosova. Sodelovanje s temi družinami je poseben izziv, zaradi jezikovnih in tudi + medkulturnih razlik. Večina staršev naših albanskih otrok ne govori slovensko, niti + angleško, tako da je bila Amra Kurešepi izjemno v pomoč pri prevajanju na sestankih + s temi družinami.

+

Z današnjo tehnologijo si s prevajalnikom sicer lahko prevedemo osnovne informacije, + za bolj kočljive teme pa je pogovor v živo neprecenljiv. Kadar gre za teme, ki so za + starše bolj čustvene (kot so otrokove težave s sošolci ali učne težave, medvrstniško + izključevanje, čustvene in vedenjske težave...) je še toliko bolj pomembno, da je + sporočilo pravilno posredovano in informacije niso izgubljene s prevodom.

+

Amra se je izkazala kot odlična prevajalka prav v teh situacijah, saj je sama tudi + učiteljica na osnovni šoli, pozna tako slovenski kot albanski šolski sistem ter + tekoče govori oba jezika. Poleg tega Amra je po mojem mnenju po naravi mirna in + spoštljiva, ter se trudi razumeti in objektivno predati sliko obeh strank v + pogovoru. Vsekakor priporočam njeno pomoč.

+
+
+
+

mag. Barbara Vodopivec, socialna pedagoginja

+

Svetovalna delavka, OŠ Livada, Ljubljana

+
+
-
-

Imaš vprašanje? Pokliči ali piši!

-
- +386 30 312 855 - info@prosberry.si +
+

Imaš vprašanje? Pokliči ali piši!

+ +

Skupaj ustvariva prostor za učenje in povezovanje.

-

Skupaj ustvariva prostor za učenje in povezovanje.

-
-
+ -
+ - + - + + \ No newline at end of file diff --git a/css/style.css b/css/style.css index cea1772..3345f6a 100644 --- a/css/style.css +++ b/css/style.css @@ -13,7 +13,8 @@ } html { - overflow-x: hidden + height: auto !important; + min-height: 100vh; } body { @@ -21,7 +22,9 @@ body { line-height: 1.6; color: var(--text-color); background: var(--bg-color); - overflow-x: hidden + overflow: visible !important; + height: auto !important; + min-height: 100vh; } body.no-scroll { @@ -5773,7 +5776,6 @@ footer { border-radius: 24px; box-shadow: 0 30px 60px rgba(15, 25, 40, 0.08); padding: 2.5rem; - margin-bottom: 2rem } .article-featured-image { @@ -5830,12 +5832,12 @@ footer { .article-inline-image.float-left { float: left; - margin: 0.5rem 2rem 1rem 0 + margin: 1.2rem 2rem 1rem 0 } .article-inline-image.float-right { float: right; - margin: 0.5rem 0 1rem 2rem + margin: 1.2rem 0 1rem 2rem } .article-inline-image img { diff --git a/js/main.js b/js/main.js index dc28a5e..1e19fb0 100644 --- a/js/main.js +++ b/js/main.js @@ -1 +1 @@ -document.addEventListener('DOMContentLoaded', function() { const mobileMenuBtn = document.querySelector('.mobile-menu-btn'); const navLinks = document.querySelector('.nav-links'); let closeMobileMenu = () => {}; let resetMobileSubmenus = () => {}; const normalizePath = (value) => { if (!value) { return '/'; } let clean = value.split('?')[0].split('#')[0]; clean = clean.replace(/index\.html$/i, ''); clean = clean.replace(/\/+$/, ''); if (clean === '') { clean = '/'; } return clean; }; const applyActiveNavState = () => { const navRoot = document.querySelector('.nav-links'); if (!navRoot) { return; } navRoot.querySelectorAll('a.active, .dropbtn.active').forEach(el => { el.classList.remove('active'); }); const currentPath = normalizePath(window.location.pathname); const navAnchors = navRoot.querySelectorAll('a[href]'); let matchedLink = null; navAnchors.forEach(anchor => { const href = anchor.getAttribute('href'); if (!href || href.startsWith('http') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) { return; } const linkPath = normalizePath(href); if (linkPath === currentPath) { matchedLink = anchor; } }); if (!matchedLink) { return; } matchedLink.classList.add('active'); const highlightDropdownParents = (element) => { let parentContent = element.closest('.dropdown-submenu-content, .dropdown-content'); while (parentContent) { const trigger = parentContent.previousElementSibling; if (trigger && (trigger.tagName === 'A' || trigger.classList.contains('dropbtn'))) { trigger.classList.add('active'); } parentContent = parentContent.parentElement ? parentContent.parentElement.closest('.dropdown-submenu-content, .dropdown-content') : null; } }; highlightDropdownParents(matchedLink); const topLevelDropdown = matchedLink.closest('.dropdown'); if (topLevelDropdown) { const trigger = topLevelDropdown.querySelector('.dropbtn'); if (trigger) { trigger.classList.add('active'); } } }; if (mobileMenuBtn && navLinks) { resetMobileSubmenus = () => { navLinks.querySelectorAll('.dropdown-content, .dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); navLinks.querySelectorAll('.dropbtn, .dropdown-submenu > a').forEach(link => { link.classList.remove('active'); }); applyActiveNavState(); }; closeMobileMenu = () => { mobileMenuBtn.classList.remove('active'); navLinks.classList.remove('active'); document.body.classList.remove('no-scroll'); resetMobileSubmenus(); }; mobileMenuBtn.addEventListener('click', (event) => { event.stopPropagation(); const willOpen = !navLinks.classList.contains('active'); if (willOpen) { mobileMenuBtn.classList.add('active'); navLinks.classList.add('active'); document.body.classList.add('no-scroll'); resetMobileSubmenus(); } else { closeMobileMenu(); } }); } applyActiveNavState(); const dropdowns = document.querySelectorAll('.nav-links .dropdown-submenu > a, .nav-links .dropdown > .dropbtn'); dropdowns.forEach(item => { item.addEventListener('click', function(event) { if (window.innerWidth <= 768) { if (item.tagName === 'A') { event.preventDefault(); } event.stopPropagation(); const submenu = item.nextElementSibling; if (!submenu) { return; } const isTopLevelTrigger = item.classList.contains('dropbtn'); if (isTopLevelTrigger) { navLinks.querySelectorAll('.dropdown-content').forEach(panel => { if (panel !== submenu) { panel.style.display = 'none'; const trigger = panel.parentElement.querySelector('.dropbtn'); if (trigger) { trigger.classList.remove('active'); } panel.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } }); } else { const siblingsWrapper = item.parentElement && item.parentElement.parentElement; if (siblingsWrapper) { siblingsWrapper.querySelectorAll(':scope > .dropdown-submenu > .dropdown-submenu-content').forEach(panel => { if (panel !== submenu) { panel.style.display = 'none'; const trigger = panel.parentElement.querySelector(':scope > a'); if (trigger) { trigger.classList.remove('active'); } panel.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } }); } } const shouldOpen = submenu.style.display !== 'block'; if (shouldOpen) { submenu.style.display = 'block'; item.classList.add('active'); submenu.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } else { submenu.style.display = 'none'; item.classList.remove('active'); submenu.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } } }); }); document.addEventListener('click', function(event) { if (window.innerWidth <= 768 && navLinks && navLinks.classList.contains('active')) { const isClickInsideNav = navLinks.contains(event.target); const isClickOnBtn = mobileMenuBtn && mobileMenuBtn.contains(event.target); if (!isClickInsideNav && !isClickOnBtn) { closeMobileMenu(); } } }); const navLinkItems = document.querySelectorAll('.nav-links a'); navLinkItems.forEach(link => { link.addEventListener('click', (event) => { const hasSubmenu = link.parentElement.classList.contains('dropdown-submenu') || link.classList.contains('dropbtn'); if (window.innerWidth <= 768) { if (hasSubmenu) { return; } closeMobileMenu(); } }); }); const accordions = document.querySelectorAll('.accordion-toggle'); accordions.forEach(accordion => { accordion.addEventListener('click', function() { const accordionItem = this.closest('.mediation-accordion-item'); const content = accordionItem ? accordionItem.querySelector('.accordion-content') : null; if (!content) { return; } this.classList.toggle('active'); const isOpen = this.classList.contains('active'); this.setAttribute('aria-expanded', String(isOpen)); content.setAttribute('aria-hidden', String(!isOpen)); if (isOpen) { content.style.maxHeight = content.scrollHeight + "px"; this.textContent = 'Manj'; } else { content.style.maxHeight = null; this.textContent = 'Več'; } }); accordion.textContent = 'Več'; accordion.setAttribute('aria-expanded', 'false'); const initialContent = accordion.closest('.mediation-accordion-item')?.querySelector('.accordion-content'); if (initialContent) { initialContent.setAttribute('aria-hidden', 'true'); } }); const header = document.querySelector('.main-header'); if (header) { let lastScroll = 0; window.addEventListener('scroll', () => { const currentScroll = window.pageYOffset; if (currentScroll <= 0) { header.classList.remove('scroll-up'); return; } if (currentScroll > lastScroll && !header.classList.contains('scroll-down')) { header.classList.remove('scroll-up'); header.classList.add('scroll-down'); } else if (currentScroll < lastScroll && header.classList.contains('scroll-down')) { header.classList.remove('scroll-down'); header.classList.add('scroll-up'); } lastScroll = currentScroll; }); } const mediationSections = document.querySelectorAll('.mediation-section'); if (mediationSections.length) { const mediationTitles = document.querySelectorAll('.mediation-section h2'); const closeAllSections = () => { mediationSections.forEach(section => { section.classList.remove('active'); }); }; mediationTitles.forEach(title => { title.addEventListener('click', () => { const parentSection = title.parentElement; const isAlreadyActive = parentSection.classList.contains('active'); closeAllSections(); if (!isAlreadyActive) { parentSection.classList.add('active'); } }); }); const openSectionFromHash = () => { const hash = window.location.hash; if (hash) { const targetSection = document.querySelector(hash); if (targetSection && targetSection.classList.contains('mediation-section')) { closeAllSections(); targetSection.classList.add('active'); } } }; window.addEventListener('hashchange', openSectionFromHash); openSectionFromHash(); if (!document.querySelector('.mediation-section.active') && mediationSections[0]) { mediationSections[0].classList.add('active'); } } const dropdownContainers = document.querySelectorAll('.nav-links .dropdown'); if (dropdownContainers.length) { const closeAllDropdowns = () => { dropdownContainers.forEach(container => { const dropdownContent = container.querySelector('.dropdown-content'); if (!dropdownContent) { return; } container.classList.remove('is-open'); dropdownContent.style.display = 'none'; dropdownContent.querySelectorAll('.dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); }); }; dropdownContainers.forEach(container => { const dropBtn = container.querySelector('.dropbtn'); const dropdownContent = container.querySelector('.dropdown-content'); if (!dropBtn || !dropdownContent) { return; } const closeDropdown = () => { container.classList.remove('is-open'); dropdownContent.style.display = 'none'; dropdownContent.querySelectorAll('.dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); }; const openDropdown = () => { container.classList.add('is-open'); dropdownContent.style.display = 'block'; }; dropBtn.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } event.preventDefault(); const isOpen = container.classList.contains('is-open'); closeAllDropdowns(); if (!isOpen) { openDropdown(); } }); const submenuLinks = container.querySelectorAll('.dropdown-submenu > a'); submenuLinks.forEach(link => { const submenu = link.nextElementSibling; if (!submenu) { return; } link.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } const parentList = link.parentElement.parentElement; parentList.querySelectorAll(':scope > .dropdown-submenu > .dropdown-submenu-content').forEach(sm => { if (sm !== submenu) { sm.style.display = 'none'; } }); const isOpen = submenu.style.display === 'block'; const href = link.getAttribute('href') || ''; if (href === '#' || href.trim() === '') { event.preventDefault(); submenu.style.display = isOpen ? 'none' : 'block'; return; } if (!isOpen) { event.preventDefault(); submenu.style.display = 'block'; } else { closeDropdown(); } }); }); container.querySelectorAll('.dropdown-submenu-content a').forEach(link => { if (link.nextElementSibling) { return; } link.addEventListener('click', () => { if (window.innerWidth <= 768) { return; } closeAllDropdowns(); closeMobileMenu(); }); }); }); document.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } const clickedInside = Array.from(dropdownContainers).some(container => container.contains(event.target)); if (!clickedInside) { closeAllDropdowns(); } }); window.addEventListener('resize', () => { if (window.innerWidth <= 768) { closeAllDropdowns(); closeMobileMenu(); } }); } window.addEventListener('resize', () => { if (window.innerWidth > 768) { closeMobileMenu(); } }); if (typeof AOS !== 'undefined') { AOS.init({ duration: 600, easing: 'ease-out', once: true, offset: 50, delay: 100, disable: 'mobile' }); } const readMoreBtn = document.querySelector('.read-more-btn'); const moreStoryContent = document.querySelector('.more-story-content'); if (readMoreBtn && moreStoryContent) { if (moreStoryContent.id) { readMoreBtn.setAttribute('aria-controls', moreStoryContent.id); } const applyStoryState = (isVisible) => { readMoreBtn.textContent = isVisible ? 'Skrij zgodbo' : 'Moja zgodba'; readMoreBtn.setAttribute('aria-expanded', isVisible ? 'true' : 'false'); moreStoryContent.setAttribute('aria-hidden', isVisible ? 'false' : 'true'); }; let isExpanded = moreStoryContent.classList.contains('visible'); applyStoryState(isExpanded); moreStoryContent.style.height = isExpanded ? 'auto' : '0px'; const openStory = () => { moreStoryContent.classList.add('visible'); const targetHeight = moreStoryContent.scrollHeight; moreStoryContent.classList.add('is-animating'); moreStoryContent.style.height = '0px'; requestAnimationFrame(() => { moreStoryContent.style.height = `${targetHeight}px`; }); }; const closeStory = () => { const currentHeight = moreStoryContent.scrollHeight; moreStoryContent.style.height = `${currentHeight}px`; moreStoryContent.classList.add('is-animating'); requestAnimationFrame(() => { moreStoryContent.style.height = '0px'; }); }; moreStoryContent.addEventListener('transitionend', (event) => { if (event.propertyName !== 'height') { return; } moreStoryContent.classList.remove('is-animating'); if (isExpanded) { moreStoryContent.style.height = 'auto'; } else { moreStoryContent.classList.remove('visible'); moreStoryContent.style.height = ''; } }); readMoreBtn.addEventListener('click', () => { if (moreStoryContent.classList.contains('is-animating')) { return; } isExpanded = !isExpanded; applyStoryState(isExpanded); if (isExpanded) { openStory(); } else { closeStory(); } }); } }); function showError(input, message) { const formControl = input.parentElement; const errorDiv = formControl.querySelector('.error-message') || document.createElement('div'); errorDiv.className = 'error-message'; errorDiv.textContent = message; if (!formControl.querySelector('.error-message')) { formControl.appendChild(errorDiv); } formControl.classList.add('error'); } function removeError(input) { const formControl = input.parentElement; const errorDiv = formControl.querySelector('.error-message'); if (errorDiv) { formControl.removeChild(errorDiv); } formControl.classList.remove('error'); } function isValidEmail(email) { const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(String(email).toLowerCase()); } \ No newline at end of file +document.addEventListener('DOMContentLoaded', function () { const mobileMenuBtn = document.querySelector('.mobile-menu-btn'); const navLinks = document.querySelector('.nav-links'); let closeMobileMenu = () => { }; let resetMobileSubmenus = () => { }; const normalizePath = (value) => { if (!value) { return '/'; } let clean = value.split('?')[0].split('#')[0]; clean = clean.replace(/index\.html$/i, ''); clean = clean.replace(/\/+$/, ''); if (clean === '') { clean = '/'; } return clean; }; const applyActiveNavState = () => { const navRoot = document.querySelector('.nav-links'); if (!navRoot) { return; } navRoot.querySelectorAll('a.active, .dropbtn.active').forEach(el => { el.classList.remove('active'); }); const currentPath = normalizePath(window.location.pathname); const navAnchors = navRoot.querySelectorAll('a[href]'); let matchedLink = null; navAnchors.forEach(anchor => { const href = anchor.getAttribute('href'); if (!href || href.startsWith('http') || href.startsWith('mailto:') || href.startsWith('tel:') || href.startsWith('#')) { return; } const linkPath = normalizePath(href); if (linkPath === currentPath) { matchedLink = anchor; } }); if (!matchedLink) { return; } matchedLink.classList.add('active'); const highlightDropdownParents = (element) => { let parentContent = element.closest('.dropdown-submenu-content, .dropdown-content'); while (parentContent) { const trigger = parentContent.previousElementSibling; if (trigger && (trigger.tagName === 'A' || trigger.classList.contains('dropbtn'))) { trigger.classList.add('active'); } parentContent = parentContent.parentElement ? parentContent.parentElement.closest('.dropdown-submenu-content, .dropdown-content') : null; } }; highlightDropdownParents(matchedLink); const topLevelDropdown = matchedLink.closest('.dropdown'); if (topLevelDropdown) { const trigger = topLevelDropdown.querySelector('.dropbtn'); if (trigger) { trigger.classList.add('active'); } } }; if (mobileMenuBtn && navLinks) { resetMobileSubmenus = () => { navLinks.querySelectorAll('.dropdown-content, .dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); navLinks.querySelectorAll('.dropbtn, .dropdown-submenu > a').forEach(link => { link.classList.remove('active'); }); applyActiveNavState(); }; closeMobileMenu = () => { mobileMenuBtn.classList.remove('active'); navLinks.classList.remove('active'); document.body.classList.remove('no-scroll'); resetMobileSubmenus(); }; mobileMenuBtn.addEventListener('click', (event) => { event.stopPropagation(); const willOpen = !navLinks.classList.contains('active'); if (willOpen) { mobileMenuBtn.classList.add('active'); navLinks.classList.add('active'); document.body.classList.add('no-scroll'); resetMobileSubmenus(); } else { closeMobileMenu(); } }); } applyActiveNavState(); const dropdowns = document.querySelectorAll('.nav-links .dropdown-submenu > a, .nav-links .dropdown > .dropbtn'); dropdowns.forEach(item => { item.addEventListener('click', function (event) { if (window.innerWidth <= 768) { if (item.tagName === 'A') { event.preventDefault(); } event.stopPropagation(); const submenu = item.nextElementSibling; if (!submenu) { return; } const isTopLevelTrigger = item.classList.contains('dropbtn'); if (isTopLevelTrigger) { navLinks.querySelectorAll('.dropdown-content').forEach(panel => { if (panel !== submenu) { panel.style.display = 'none'; const trigger = panel.parentElement.querySelector('.dropbtn'); if (trigger) { trigger.classList.remove('active'); } panel.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } }); } else { const siblingsWrapper = item.parentElement && item.parentElement.parentElement; if (siblingsWrapper) { siblingsWrapper.querySelectorAll(':scope > .dropdown-submenu > .dropdown-submenu-content').forEach(panel => { if (panel !== submenu) { panel.style.display = 'none'; const trigger = panel.parentElement.querySelector(':scope > a'); if (trigger) { trigger.classList.remove('active'); } panel.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } }); } } const shouldOpen = submenu.style.display !== 'block'; if (shouldOpen) { submenu.style.display = 'block'; item.classList.add('active'); submenu.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } else { submenu.style.display = 'none'; item.classList.remove('active'); submenu.querySelectorAll('.dropdown-submenu-content').forEach(child => { child.style.display = 'none'; const childTrigger = child.parentElement.querySelector(':scope > a'); if (childTrigger) { childTrigger.classList.remove('active'); } }); } } }); }); document.addEventListener('click', function (event) { if (window.innerWidth <= 768 && navLinks && navLinks.classList.contains('active')) { const isClickInsideNav = navLinks.contains(event.target); const isClickOnBtn = mobileMenuBtn && mobileMenuBtn.contains(event.target); if (!isClickInsideNav && !isClickOnBtn) { closeMobileMenu(); } } }); const navLinkItems = document.querySelectorAll('.nav-links a'); navLinkItems.forEach(link => { link.addEventListener('click', (event) => { const hasSubmenu = link.parentElement.classList.contains('dropdown-submenu') || link.classList.contains('dropbtn'); if (window.innerWidth <= 768) { if (hasSubmenu) { return; } closeMobileMenu(); } }); }); const accordions = document.querySelectorAll('.accordion-toggle'); accordions.forEach(accordion => { accordion.addEventListener('click', function () { const accordionItem = this.closest('.mediation-accordion-item'); const content = accordionItem ? accordionItem.querySelector('.accordion-content') : null; if (!content) { return; } this.classList.toggle('active'); const isOpen = this.classList.contains('active'); this.setAttribute('aria-expanded', String(isOpen)); content.setAttribute('aria-hidden', String(!isOpen)); if (isOpen) { content.style.maxHeight = content.scrollHeight + "px"; this.textContent = 'Manj'; } else { content.style.maxHeight = null; this.textContent = 'Več'; } }); accordion.textContent = 'Več'; accordion.setAttribute('aria-expanded', 'false'); const initialContent = accordion.closest('.mediation-accordion-item')?.querySelector('.accordion-content'); if (initialContent) { initialContent.setAttribute('aria-hidden', 'true'); } }); const header = document.querySelector('.main-header'); if (header) { let lastScroll = 0; window.addEventListener('scroll', () => { const currentScroll = window.pageYOffset; if (currentScroll <= 0) { header.classList.remove('scroll-up'); return; } if (currentScroll > lastScroll && !header.classList.contains('scroll-down')) { header.classList.remove('scroll-up'); header.classList.add('scroll-down'); } else if (currentScroll < lastScroll && header.classList.contains('scroll-down')) { header.classList.remove('scroll-down'); header.classList.add('scroll-up'); } lastScroll = currentScroll; }); } const mediationSections = document.querySelectorAll('.mediation-section'); if (mediationSections.length) { const mediationTitles = document.querySelectorAll('.mediation-section h2'); const closeAllSections = () => { mediationSections.forEach(section => { section.classList.remove('active'); }); }; mediationTitles.forEach(title => { title.addEventListener('click', () => { const parentSection = title.parentElement; const isAlreadyActive = parentSection.classList.contains('active'); closeAllSections(); if (!isAlreadyActive) { parentSection.classList.add('active'); } }); }); const openSectionFromHash = () => { const hash = window.location.hash; if (hash) { const targetSection = document.querySelector(hash); if (targetSection && targetSection.classList.contains('mediation-section')) { closeAllSections(); targetSection.classList.add('active'); } } }; window.addEventListener('hashchange', openSectionFromHash); openSectionFromHash(); if (!document.querySelector('.mediation-section.active') && mediationSections[0]) { mediationSections[0].classList.add('active'); } } const dropdownContainers = document.querySelectorAll('.nav-links .dropdown'); if (dropdownContainers.length) { const closeAllDropdowns = () => { dropdownContainers.forEach(container => { const dropdownContent = container.querySelector('.dropdown-content'); if (!dropdownContent) { return; } container.classList.remove('is-open'); dropdownContent.style.display = 'none'; dropdownContent.querySelectorAll('.dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); }); }; dropdownContainers.forEach(container => { const dropBtn = container.querySelector('.dropbtn'); const dropdownContent = container.querySelector('.dropdown-content'); if (!dropBtn || !dropdownContent) { return; } const closeDropdown = () => { container.classList.remove('is-open'); dropdownContent.style.display = 'none'; dropdownContent.querySelectorAll('.dropdown-submenu-content').forEach(submenu => { submenu.style.display = 'none'; }); }; const openDropdown = () => { container.classList.add('is-open'); dropdownContent.style.display = 'block'; }; dropBtn.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } event.preventDefault(); const isOpen = container.classList.contains('is-open'); closeAllDropdowns(); if (!isOpen) { openDropdown(); } }); const submenuLinks = container.querySelectorAll('.dropdown-submenu > a'); submenuLinks.forEach(link => { const submenu = link.nextElementSibling; if (!submenu) { return; } link.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } const parentList = link.parentElement.parentElement; parentList.querySelectorAll(':scope > .dropdown-submenu > .dropdown-submenu-content').forEach(sm => { if (sm !== submenu) { sm.style.display = 'none'; } }); const isOpen = submenu.style.display === 'block'; const href = link.getAttribute('href') || ''; if (href === '#' || href.trim() === '') { event.preventDefault(); submenu.style.display = isOpen ? 'none' : 'block'; return; } if (!isOpen) { event.preventDefault(); submenu.style.display = 'block'; } else { closeDropdown(); } }); }); container.querySelectorAll('.dropdown-submenu-content a').forEach(link => { if (link.nextElementSibling) { return; } link.addEventListener('click', () => { if (window.innerWidth <= 768) { return; } closeAllDropdowns(); closeMobileMenu(); }); }); }); document.addEventListener('click', (event) => { if (window.innerWidth <= 768) { return; } const clickedInside = Array.from(dropdownContainers).some(container => container.contains(event.target)); if (!clickedInside) { closeAllDropdowns(); } }); window.addEventListener('resize', () => { if (window.innerWidth <= 768) { closeAllDropdowns(); closeMobileMenu(); } }); } window.addEventListener('resize', () => { if (window.innerWidth > 768) { closeMobileMenu(); } }); if (typeof AOS !== 'undefined') { AOS.init({ duration: 600, easing: 'ease-out', once: true, offset: 50, delay: 100, disable: 'mobile' }); } const readMoreBtn = document.querySelector('.read-more-btn'); const moreStoryContent = document.querySelector('.more-story-content'); if (readMoreBtn && moreStoryContent) { if (moreStoryContent.id) { readMoreBtn.setAttribute('aria-controls', moreStoryContent.id); } const applyStoryState = (isVisible) => { readMoreBtn.textContent = isVisible ? 'Skrij zgodbo' : 'Moja zgodba'; readMoreBtn.setAttribute('aria-expanded', isVisible ? 'true' : 'false'); moreStoryContent.setAttribute('aria-hidden', isVisible ? 'false' : 'true'); }; let isExpanded = moreStoryContent.classList.contains('visible'); applyStoryState(isExpanded); moreStoryContent.style.height = isExpanded ? 'auto' : '0px'; const openStory = () => { moreStoryContent.classList.add('visible'); const targetHeight = moreStoryContent.scrollHeight; moreStoryContent.classList.add('is-animating'); moreStoryContent.style.height = '0px'; requestAnimationFrame(() => { moreStoryContent.style.height = `${targetHeight}px`; }); }; const closeStory = () => { const currentHeight = moreStoryContent.scrollHeight; moreStoryContent.style.height = `${currentHeight}px`; moreStoryContent.classList.add('is-animating'); requestAnimationFrame(() => { moreStoryContent.style.height = '0px'; }); }; moreStoryContent.addEventListener('transitionend', (event) => { if (event.propertyName !== 'height') { return; } moreStoryContent.classList.remove('is-animating'); if (isExpanded) { moreStoryContent.style.height = 'auto'; } else { moreStoryContent.classList.remove('visible'); moreStoryContent.style.height = ''; } }); readMoreBtn.addEventListener('click', () => { if (moreStoryContent.classList.contains('is-animating')) { return; } isExpanded = !isExpanded; applyStoryState(isExpanded); if (isExpanded) { openStory(); } else { closeStory(); } }); } }); function showError(input, message) { const formControl = input.parentElement; const errorDiv = formControl.querySelector('.error-message') || document.createElement('div'); errorDiv.className = 'error-message'; errorDiv.textContent = message; if (!formControl.querySelector('.error-message')) { formControl.appendChild(errorDiv); } formControl.classList.add('error'); } function removeError(input) { const formControl = input.parentElement; const errorDiv = formControl.querySelector('.error-message'); if (errorDiv) { formControl.removeChild(errorDiv); } formControl.classList.remove('error'); } function isValidEmail(email) { const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(String(email).toLowerCase()); } \ No newline at end of file diff --git a/posodobi_blog.sh b/posodobi_blog.sh index fd106bd..edc86fd 100755 --- a/posodobi_blog.sh +++ b/posodobi_blog.sh @@ -94,6 +94,12 @@ format_long_date() { fi } +get_article_image() { + local file="$1" + local filename=$(basename "$file" .html) + echo "/assets/images/blog/${filename}/header.png" +} + generate_featured_article_html() { local file="$1" local metadata_json="$2" @@ -101,7 +107,7 @@ generate_featured_article_html() { title=$(echo "$metadata_json" | jq -r '.title') date=$(echo "$metadata_json" | jq -r '.date') - image=$(echo "$metadata_json" | jq -r '.image') + image=$(get_article_image "$file") summary=$(echo "$metadata_json" | jq -r '.summary // ""') article_path=$(basename "$file") long_date=$(format_long_date "$date") @@ -127,7 +133,7 @@ generate_recent_article_card_html() { title=$(echo "$metadata_json" | jq -r '.title') date=$(echo "$metadata_json" | jq -r '.date') - image=$(echo "$metadata_json" | jq -r '.image') + image=$(get_article_image "$file") summary=$(echo "$metadata_json" | jq -r '.summary // ""') article_path=$(basename "$file") short_date=$(format_short_date "$date") @@ -240,9 +246,10 @@ while IFS='|' read -r _ file; do elif [ "$ARTICLE_COUNT" -le 3 ]; then RECENT_ARTICLES_HTML+=$'\n'"$(generate_recent_article_card_html "$file" "$metadata")" RECENT_COUNT=$((RECENT_COUNT + 1)) - else - ARCHIVE_HTML+=$'\n'"$(generate_archive_list_item_html "$file" "$metadata")" fi + + # Add ALL articles to archive list + ARCHIVE_HTML+=$'\n'"$(generate_archive_list_item_html "$file" "$metadata")" ARTICLE_COUNT=$((ARTICLE_COUNT + 1)) done <<< "$SORTED_ENTRIES" @@ -263,6 +270,7 @@ export RECENT_ARTICLES_HTML export ARCHIVE_HTML export BLOG_TEMPLATE export BLOG_INDEX +export ARTICLE_TEMPLATE export HEADER_TEMPLATE_FILE export FOOTER_TEMPLATE_FILE @@ -280,51 +288,3 @@ Path(os.environ["BLOG_INDEX"]).write_text(template) PY echo "Blog page generated successfully at $BLOG_INDEX" - -# Generate individual article pages -echo "Generating individual article pages..." - -ARTICLE_COUNT=0 -while IFS='|' read -r _ file; do - metadata=$(extract_metadata "$file") - if [ -z "${metadata:-}" ]; then - continue - fi - - title=$(echo "$metadata" | jq -r '.title') - date=$(echo "$metadata" | jq -r '.date') - image=$(echo "$metadata" | jq -r '.image') - summary=$(echo "$metadata" | jq -r '.summary // ""') - long_date=$(format_long_date "$date") - - # Extract article content (everything after the JSON comment) - content=$(perl -0777 -ne 'if (/--\u003e\s*(.*)$/s) { print $1 }' "$file") - - # Export variables for Python - export ARTICLE_TITLE="$title" - export ARTICLE_DATE="$long_date" - export ARTICLE_IMAGE="$image" - export ARTICLE_SUMMARY="$summary" - export ARTICLE_CONTENT="$content" - export ARTICLE_FILE="$file" - - python3 \u003c\u003c'PY' -import os -from pathlib import Path - -template = Path(os.environ["ARTICLE_TEMPLATE"]).read_text() -template = template.replace("__HEADER_CONTENT__", Path(os.environ["HEADER_TEMPLATE_FILE"]).read_text()) -template = template.replace("__ARTICLE_TITLE__", os.environ.get("ARTICLE_TITLE", "")) -template = template.replace("__ARTICLE_DATE__", os.environ.get("ARTICLE_DATE", "")) -template = template.replace("__ARTICLE_IMAGE__", os.environ.get("ARTICLE_IMAGE", "")) -template = template.replace("__ARTICLE_SUMMARY__", os.environ.get("ARTICLE_SUMMARY", "")) -template = template.replace("__ARTICLE_CONTENT__", os.environ.get("ARTICLE_CONTENT", "")) -template = template.replace("__FOOTER_CONTENT__", Path(os.environ["FOOTER_TEMPLATE_FILE"]).read_text()) -Path(os.environ["ARTICLE_FILE"]).write_text(template) -PY - - ARTICLE_COUNT=$((ARTICLE_COUNT + 1)) - echo " Generated: $(basename "$file")" -done \u003c\u003c\u003c "$SORTED_ENTRIES" - -echo "Generated $ARTICLE_COUNT article pages successfully"