updated language loading changes on all pages

This commit is contained in:
Henri
2026-04-08 00:13:42 +03:00
parent 3d27217769
commit 438aa957a1
24 changed files with 749 additions and 534 deletions

View File

@@ -0,0 +1,3 @@
{
"placeholder": "In development..."
}

View File

@@ -0,0 +1,3 @@
{
"iframeTitle": "Lapikud Calendar"
}

View File

@@ -0,0 +1,60 @@
{
"hero": {
"title": "Get in touch",
"description": "Have questions? Want to join? Or start a collaboration? Feel free to contact us!"
},
"methods": {
"title": "How to reach us?",
"subtitle": "Choose the method that works for you",
"addressTitle": "Address",
"emailTitle": "Email",
"phoneTitle": "Phone",
"messengerTitle": "Messenger",
"addressSubtitle": "ICT faculty, Raja 15 room 111"
},
"form": {
"title": "Send us a message",
"subtitle": "Fill in the form and we will get back to you",
"nameLabel": "Name *",
"namePlaceholder": "Your name",
"emailLabel": "Email *",
"emailPlaceholder": "you@email.com",
"subjectLabel": "Subject *",
"subjectPlaceholder": "Message subject",
"messageLabel": "Message *",
"messagePlaceholder": "Write your message here...",
"submit": "Send message",
"mailBody": {
"name": "Name",
"email": "Email",
"message": "Message"
}
},
"hours": {
"title": "Opening hours",
"weekdays": "Monday - Friday:",
"weekdaysTime": "10:00 - 16:00",
"weekend": "Saturday - Sunday:",
"weekendTime": "Closed",
"note": "* We recommend contacting us before visiting to avoid waiting"
},
"location": {
"title": "How to find us?",
"addressLabel": "Address:",
"buildingLabel": "Building:",
"roomLabel": "Room:",
"address": "Akadeemia tee 5, 12616 Tallinn",
"building": "ICT faculty (Raja 15)",
"room": "111",
"note": "We are located in TalTech ICT faculty building. If you come by public transport, the nearest stops are \"Mustakivi\" and \"Tehnikaülikool\"."
},
"social": {
"title": "Follow us on social media"
},
"organization": {
"title": "Lapikud NGO",
"registryTitle": "Registry code",
"bankTitle": "Bank account",
"bankSubtitle": "Swedbank"
}
}

View File

@@ -8,6 +8,6 @@
"reg": "Reg. code: ", "reg": "Reg. code: ",
"bank": "Swedbank", "bank": "Swedbank",
"socials": "Social Media", "socials": "Social Media",
"organization": "Lapikud NGO" "organization": "MTÜ Lapikud"
} }
} }

View File

@@ -0,0 +1,6 @@
{
"hero": {
"title": "Our Mentors",
"intro": "Lapikud who are always ready to support you in your studies and personal development, and with whom it's just nice to spend time together."
}
}

View File

@@ -0,0 +1,102 @@
{
"hero": {
"title": "For companies",
"description": "We help bring your ideas to life. Our experienced students are ready to deliver your projects."
},
"services": {
"title": "What do we offer?",
"subtitle": "A wide range of IT services for your business needs",
"items": [
{
"title": "Web solutions",
"description": "Modern and responsive websites that work on every device"
},
{
"title": "Mobile applications",
"description": "iOS and Android apps with user-friendly interfaces"
},
{
"title": "Software development",
"description": "Custom software solutions for your business needs"
},
{
"title": "Consulting",
"description": "IT consulting and project planning"
}
]
},
"whyUs": {
"title": "Why collaborate with us?",
"items": [
{
"title": "Motivated team",
"description": "Our students are talented, eager, and ready to prove their skills"
},
{
"title": "Quality results",
"description": "We take every project seriously and aim for the best outcome"
},
{
"title": "Modern technologies",
"description": "We use up-to-date tools and technologies"
}
]
},
"process": {
"title": "How do we work?",
"steps": [
{
"title": "First meeting",
"description": "We discuss your idea, needs, and goals to understand what you want to achieve."
},
{
"title": "Planning",
"description": "We prepare a project plan, quote, and timeline, then align on details."
},
{
"title": "Development",
"description": "Our team works on your project and keeps you regularly updated."
},
{
"title": "Delivery",
"description": "We deliver the final product with documentation and onboarding."
},
{
"title": "Support",
"description": "We provide ongoing support and maintenance when needed."
}
]
},
"fit": {
"title": "When are we a good fit?",
"items": [
{
"title": "Startups and small businesses:",
"description": "Our services are cost-effective and flexible, ideal for limited budgets."
},
{
"title": "Prototype development:",
"description": "Need a working prototype fast? Our agile team can move quickly."
},
{
"title": "Thesis and projects:",
"description": "Your project can become a thesis topic for our students, ensuring a dedicated team."
},
{
"title": "Long-term projects:",
"description": "We also offer long-term cooperation for more complex systems."
}
]
},
"portfolio": {
"title": "Our work",
"subtitle": "See what we have built before",
"projectLink": "View project"
},
"cta": {
"title": "Shall we start working together?",
"description": "Get in touch and let's discuss how we can bring your idea to life.",
"emailButton": "Send email",
"contactButton": "Contact details"
}
}

View File

@@ -0,0 +1,7 @@
{
"streamAlts": {
"first": "Camera 1 stream",
"second": "Camera 2 stream",
"third": "Camera 3 stream"
}
}

View File

@@ -0,0 +1,81 @@
{
"hero": {
"title": "Join Us!",
"description": "Develop your skills, make great friends, and gain practical experience through real projects."
},
"benefits": {
"title": "Why join Lapikud?",
"subtitle": "Here are a few reasons why our community is a great place to grow",
"items": [
{
"title": "Practical projects",
"description": "Work on real software projects and gain experience you don't get from classes alone."
},
{
"title": "Strong community",
"description": "Join friendly and ambitious students, find your team, and build lasting friendships."
},
{
"title": "Mentorship",
"description": "Get guidance from experienced students and developers, and improve faster."
},
{
"title": "Events",
"description": "Take part in exciting events, hackathons, and trainings to expand your network."
},
{
"title": "Thesis opportunities",
"description": "Interesting thesis topics grow from our projects. Find your topic and supervisor with us."
},
{
"title": "Work experience",
"description": "Active members can gain their first paid work experience through our projects."
}
]
},
"activities": {
"title": "What can you do?",
"items": [
{
"title": "Software development:",
"description": "Work on real projects with modern technologies and learn team collaboration and quality practices."
},
{
"title": "Helpdesk:",
"description": "Help students and lecturers solve IT issues while improving your technical and communication skills."
},
{
"title": "Project management:",
"description": "Take responsibility for project coordination and learn planning, leadership, and client communication."
},
{
"title": "Marketing and design:",
"description": "Support project and event promotion, create social content, design materials, and track results."
}
]
},
"join": {
"title": "How to join?",
"steps": [
{
"title": "Get in touch",
"description": "Write to us at",
"descriptionEnd": "or visit our office at Akadeemia tee 5."
},
{
"title": "Introduction",
"description": "Meet our team, introduce yourself, and share your interests. We'll show you our projects and opportunities."
},
{
"title": "Start contributing",
"description": "Find a suitable project or team and get started. Our mentors will support you at every step."
}
]
},
"members": {
"title": "Our members",
"subtitle": "Great people who make up our community",
"senior": "Senior members",
"junior": "Junior members"
}
}

View File

@@ -0,0 +1,3 @@
{
"placeholder": "Arenduses..."
}

View File

@@ -0,0 +1,3 @@
{
"iframeTitle": "Lapikute kalender"
}

View File

@@ -0,0 +1,60 @@
{
"hero": {
"title": "Võta ühendust",
"description": "Kas sul on küsimusi? Tahad liituda? Või soovid alustada koostööd? Võta julgelt ühendust!"
},
"methods": {
"title": "Kuidas meiega ühendust võtta?",
"subtitle": "Vali endale sobiv viis",
"addressTitle": "Aadress",
"emailTitle": "E-post",
"phoneTitle": "Telefon",
"messengerTitle": "Messenger",
"addressSubtitle": "ICT-teaduskond, Raja 15 ruum 111"
},
"form": {
"title": "Saada meile sõnum",
"subtitle": "Täida vorm ja me võtame sinuga ühendust",
"nameLabel": "Nimi *",
"namePlaceholder": "Sinu nimi",
"emailLabel": "E-post *",
"emailPlaceholder": "sinu@email.ee",
"subjectLabel": "Teema *",
"subjectPlaceholder": "Sõnumi teema",
"messageLabel": "Sõnum *",
"messagePlaceholder": "Kirjuta oma sõnum siia...",
"submit": "Saada sõnum",
"mailBody": {
"name": "Nimi",
"email": "E-post",
"message": "Sõnum"
}
},
"hours": {
"title": "Lahtiolekuajad",
"weekdays": "Esmaspäev - Reede:",
"weekdaysTime": "10:00 - 16:00",
"weekend": "Laupäev - Pühapäev:",
"weekendTime": "Suletud",
"note": "* Soovitame enne külastamist võtta ühendust, et vältida ootamist"
},
"location": {
"title": "Kuidas meid leida?",
"addressLabel": "Aadress:",
"buildingLabel": "Hoone:",
"roomLabel": "Ruum:",
"address": "Akadeemia tee 5, 12616 Tallinn",
"building": "ICT-teaduskond (Raja 15)",
"room": "111",
"note": "Asume Tallinna Tehnikaülikooli ICT-teaduskonna hoones. Kui tuled ühistranspordiga, on lähimad peatused \"Mustakivi\" ja \"Tehnikaülikool\"."
},
"social": {
"title": "Jälgi meid sotsiaalmeedias"
},
"organization": {
"title": "MTÜ Lapikud",
"registryTitle": "Registrikood",
"bankTitle": "Pangakonto",
"bankSubtitle": "Swedbank"
}
}

View File

@@ -0,0 +1,6 @@
{
"hero": {
"title": "Meie Mentorid",
"intro": "Lapikud, kes on alati valmis olema sinu toeks nii õpingutes kui ka isiklikus arengus ja kellega on lihtsalt tore koos aega veeta."
}
}

View File

@@ -0,0 +1,102 @@
{
"hero": {
"title": "Ettevõttele",
"description": "Aitame sinu ideed ellu viia! Meie kogenud tudengid on valmis teie projekte realiseerima."
},
"services": {
"title": "Mida me pakume?",
"subtitle": "Laia valik IT-teenuseid teie ärivajaduste täitmiseks",
"items": [
{
"title": "Veebilahendused",
"description": "Kaasaegsed ja responsiivsed veebilehed, mis toimivad igal seadmel"
},
{
"title": "Mobiilirakendused",
"description": "iOS ja Android rakendused kasutajasõbralike liidestega"
},
{
"title": "Tarkvara arendus",
"description": "Kohandatud tarkvaralahendused teie ärivajadusteks"
},
{
"title": "Konsultatsioon",
"description": "IT-nõustamine ja projekti planeerimine"
}
]
},
"whyUs": {
"title": "Miks meiega koostööd teha?",
"items": [
{
"title": "Motiveeritud meeskond",
"description": "Meie tudengid on andekad, õhevil ja tahavad tõestada oma oskuseid"
},
{
"title": "Kvaliteetne tulemus",
"description": "Võtame iga projekti tõsiselt ja pingutame parima tulemuse nimel"
},
{
"title": "Kaasaegsed tehnoloogiad",
"description": "Kasutame uusimaid tööriistu ja tehnoloogiaid"
}
]
},
"process": {
"title": "Kuidas töötame?",
"steps": [
{
"title": "Esimene kohtumine",
"description": "Arutame teie ideed, vajadusi ja eesmärke. Mõistame, mida soovite saavutada."
},
{
"title": "Planeerimine",
"description": "Koostame projekti plaani, hinnapakkumise ja ajakava. Lepime kokku detailides."
},
{
"title": "Arendus",
"description": "Meie meeskond töötab teie projekti kallal. Hoiame teid regulaarselt kursis."
},
{
"title": "Üleandmine",
"description": "Anname valmis toote üle koos dokumentatsiooni ja juhendamisega."
},
{
"title": "Tugi",
"description": "Pakume vajadusel jätkuvat tuge ja hooldust."
}
]
},
"fit": {
"title": "Millal meie sobime?",
"items": [
{
"title": "Startup ja väikeettevõtted:",
"description": "Meie teenused on hinnaefektiivsed ja paindlikud, sobides hästi piiratud eelarvega projektidele."
},
{
"title": "Prototüüpide arendus:",
"description": "Vajate kiiresti töökorras prototüüpi? Meie agile meeskond suudab kiiresti teie idee ellu viia."
},
{
"title": "Lõputööd ja projektid:",
"description": "Teie projekt võib saada meie tudengite lõputöö teemaks, mis tagab motiveeritud ja pühendunud meeskonna."
},
{
"title": "Pikaajalised projektid:",
"description": "Pakume ka pikemaajalisi koostöövõimalusi keerulisemate süsteemide arendamiseks."
}
]
},
"portfolio": {
"title": "Meie tehtud tööd",
"subtitle": "Vaata, mida oleme varem loonud",
"projectLink": "Vaata projekti"
},
"cta": {
"title": "Alustame koostööd?",
"description": "Võta ühendust ja arutame, kuidas saame sinu ideed ellu viia!",
"emailButton": "Saada e-kiri",
"contactButton": "Kontaktandmed"
}
}

View File

@@ -0,0 +1,7 @@
{
"streamAlts": {
"first": "Kaamera 1 voog",
"second": "Kaamera 2 voog",
"third": "Kaamera 3 voog"
}
}

View File

@@ -0,0 +1,81 @@
{
"hero": {
"title": "Liitu Meiega!",
"description": "Tule arenda oma oskuseid ja saa ägedaid sõpru! Omanda praktilist kogemust reaalsetest projektidest."
},
"benefits": {
"title": "Miks Lapikutega liituda?",
"subtitle": "Siin on mõned põhjused, miks meie kogukond on suurepärane koht arenguks",
"items": [
{
"title": "Praktilised projektid",
"description": "Osale reaalsetel tarkvaraarenduse projektidel. Omanda kogemust, mida ei õpeta ühelgi kursusel."
},
{
"title": "Tugev kogukond",
"description": "Liitu sõbralike ja ambitsioonikate tudengitega. Leia oma meeskond ja loo püsivaid sõprussuhteid."
},
{
"title": "Mentorlus",
"description": "Saa juhendamist kogenud tudengitelt ja arendajatelt. Õpi parimate käest ja arene kiiremini."
},
{
"title": "Üritused",
"description": "Osale huvitavatel üritustel, hackathonidel ja koolitustel. Laienda oma silmaringi ja võrgustikku."
},
{
"title": "Lõputööd",
"description": "Meie projektidest kasvavad välja huvitavad lõputööd. Leia oma teema ja juhendaja meie seast."
},
{
"title": "Töökogemus",
"description": "Aktiivsed liikmed saavad võimaluse teenida oma esimest töökogemust ja palka meie projektides."
}
]
},
"activities": {
"title": "Mida saad teha?",
"items": [
{
"title": "Tarkvara arendus:",
"description": "Töötad reaalsetel projektidel kasutades kaasaegseid tehnoloogiaid. Õpid koodi kirjutamist meeskonnas, versioonihaldustööriistade kasutamist ja tarkvara kvaliteedi tagamist."
},
{
"title": "Helpdesk:",
"description": "Aita tudengeid ja õppejõude IT-probleemide lahendamisel. Arenda oma tehnilisi oskuseid ja õpi suhtlemist klientidega."
},
{
"title": "Projektijuhtimine:",
"description": "Võta vastutus projekti koordineerimise eest. Õpi planeerimist, meeskonna juhtimist ja suhtlemist klientidega."
},
{
"title": "Turundus ja disain:",
"description": "Aita meie projektide ja ürituste turundamisel. Loo sisu sotsiaalmeedias, disaini materjale ja jälgi tulemusi."
}
]
},
"join": {
"title": "Kuidas liituda?",
"steps": [
{
"title": "Võta ühendust",
"description": "Kirjuta meile e-posti aadressil",
"descriptionEnd": "või tule meie kontorisse Akadeemia tee 5."
},
{
"title": "Tutvumine",
"description": "Kohtu meie meeskonnaga, tutvusta ennast ja räägi oma huvidest. Näitame sulle meie projekte ja võimalusi."
},
{
"title": "Alusta tööd",
"description": "Leia endale sobiv projekt või meeskond ja hakka tegutsema! Meie mentorid aitavad sind iga sammu juures."
}
]
},
"members": {
"title": "Meie liikmed",
"subtitle": "Suurepärased inimesed, kes moodustavad meie kogukonna",
"senior": "Vanemliikmed",
"junior": "Noorliikmed"
}
}

View File

@@ -1,276 +1,20 @@
<script> <script>
import { import {
Section, Section,
Grid,
Card,
Center,
} from "$components"; } from "$components";
import { onMount } from "svelte"; import { onDestroy } from "svelte";
import yaml from 'js-yaml'; import { createPageTextStore } from "$lib";
import { currentLang, getLangText } from "$lib";
import Users from "lucide-svelte/icons/users"; const text = createPageTextStore("AboutUs");
import History from "lucide-svelte/icons/history";
import Target from "lucide-svelte/icons/target";
import Heart from "lucide-svelte/icons/heart";
import Award from "lucide-svelte/icons/award";
import Sparkles from "lucide-svelte/icons/sparkles";
import Mail from "lucide-svelte/icons/mail";
import Phone from "lucide-svelte/icons/phone";
let management = []; onDestroy(() => {
let pastManagement = []; text.destroy();
onMount(async () => {
const [mgmtResponse, pastResponse] = await Promise.all([
fetch('/_data/management.yml'),
fetch('/_data/past_management.yml')
]);
const [mgmtText, pastText] = await Promise.all([
mgmtResponse.text(),
pastResponse.text()
]);
management = yaml.load(mgmtText);
pastManagement = yaml.load(pastText);
}); });
</script> </script>
<div class="safe-area-navbar"> <div class="safe-area-navbar">
<!-- Hero Section -->
<Section background="orange">
<Center>
<div class="text-center max-w-4xl">
<h1 class="text-5xl font-bold mb-6">Kes me oleme?</h1>
<p class="text-2xl leading-relaxed">
MTÜ Lapikud on Tallinna Tehnikaülikooli Tarkvaraarendusklubi,
mis ühendab endisi ja praegusi IT huvilisi tudengeid
</p>
</div>
</Center>
</Section>
<!-- History Section -->
<Section> <Section>
<Grid gap="var(--space-5)"> {$text.placeholder || "In development..."}
<Card variant="glass">
<div class="flex items-center gap-4 mb-6">
<div class="feature-icon" style="color: var(--orange)">
<History size={32} strokeWidth={1.5} />
</div>
<h2 class="text-4xl font-bold">Meie lugu</h2>
</div>
<div class="space-y-4 text-lg">
<p>
Organisatsioon loodi <strong>2002. aastal</strong> informaatika tudengite poolt,
kelle erialatunnuseks oli "LAP". Targad mehed otsustasid, et järelikult on nad "Lapikud".
</p>
<p>
Üle 20 aasta oleme kasvanud väikesest tudengite grupist suureks kogukonnaks,
mis on aidanud sadadel tudengitel saada väärtuslikku kogemust IT-valdkonnas.
</p>
<p>
Täna oleme uhked oma traditsiooni üle ja jätkame sellega,
et pakkuda tudengitele võimalusi areneda ja kasvada.
</p>
</div>
</Card>
<Card variant="glass">
<div class="flex items-center gap-4 mb-6">
<div class="feature-icon" style="color: var(--orange)">
<Target size={32} strokeWidth={1.5} />
</div>
<h2 class="text-4xl font-bold">Meie eesmärk</h2>
</div>
<div class="space-y-4 text-lg">
<p>
Meie põhieesmärgiks on Tallinna Tehnikaülikooli IT tudengitele
<strong>erialase lisandväärtuse loomine</strong>.
</p>
<p>
Kaasame tudengeid huvitavatesse IT projektidesse ning anname tudengitele võimaluse
midagi reaalset oma käega ära teha. Aktiivsetel tudengitel on võimalus saada meie juures esimene töökogemus.
</p>
<p>
Meie projektidest kooruvad välja huvitavad ja tarvilikud lõputööd ning
meie liikmeskonnast on tulnud ka lõputöö juhendajaid.
</p>
</div>
</Card>
</Grid>
</Section> </Section>
<!-- Values Section -->
<Section background="neutral">
<div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Meie väärtused</h2>
<p class="text-xl text-gray-600">Mis meile oluline on</p>
</div>
<Grid columns={3} gap="var(--space-5)">
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Users size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Kogukond</h3>
<p class="text-gray-600">
Oleme tugev kogukond, kus iga liige on oluline. Toetame ja aitame üksteist.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Award size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Kvaliteet</h3>
<p class="text-gray-600">
Teeme tööd südamega ja püüdleme alati parima tulemuse poole.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Sparkles size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Innovatsioon</h3>
<p class="text-gray-600">
Kasutame uusimaid tehnoloogiaid ja otsime alati paremaid lahendusi.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Heart size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Kirg</h3>
<p class="text-gray-600">
Teeme seda, mida armastame. Meie kirglikud liikmed on meie tugevus.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Users size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Kaasamine</h3>
<p class="text-gray-600">
Kaasame kõiki teaduskondi - IT, majandus, inseneeria ja muud.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Target size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Praktiline</h3>
<p class="text-gray-600">
Teeme reaalset tööd, mis annab tudengitele praktilist kogemust.
</p>
</Card>
</Grid>
</Section>
<!-- Current Management -->
<Section>
<div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Meie juhatus</h2>
<p class="text-xl text-gray-600">Inimesed, kes viivad organisatsiooni edasi</p>
</div>
<Grid columns={2} gap="var(--space-6)">
{#each management as person}
<Card variant="glass">
<div class="flex flex-col md:flex-row gap-6">
{#if person.photo}
<div class="shrink-0">
<img
src={`/assets/management-images/${person.photo}`}
alt={person.name}
class="w-full md:w-48 h-48 object-cover rounded-lg"
/>
</div>
{/if}
<div class="flex-1">
<h3 class="text-2xl font-bold mb-2">{person.name}</h3>
<p class="text-lg font-semibold mb-2" style="color: var(--orange)">
{getLangText(person, 'role', $currentLang)}
</p>
{#if person.subrole}
<p class="text-gray-600 mb-4">{getLangText(person, 'subrole', $currentLang)}</p>
{/if}
<div class="space-y-2">
{#if person.email}
<div class="flex items-center gap-2">
<Mail size={18} style="color: var(--orange)" />
<a href={`mailto:${person.email}`} class="hover:underline">
{person.email}
</a>
</div>
{/if}
{#if person.phone}
<div class="flex items-center gap-2">
<Phone size={18} style="color: var(--orange)" />
<a href={`tel:${person.phone}`} class="hover:underline">
{person.phone}
</a>
</div>
{/if}
</div>
</div>
</div>
</Card>
{/each}
</Grid>
</Section>
<!-- Past Management -->
{#if pastManagement && pastManagement.length > 0}
<Section background="neutral">
<div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Endised juhatused</h2>
<p class="text-xl text-gray-600">Täname kõiki, kes on organisatsiooni juhtinud</p>
</div>
<div class="space-y-12">
{#each pastManagement as yearGroup}
<div>
<h3 class="text-3xl font-bold mb-6 text-center">{yearGroup.year}</h3>
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-6">
{#each yearGroup.members as member}
<Card variant="glass" class="text-center">
{#if member.image}
<img
src={`/assets/past-management-images/optimised/${member.image}`}
alt={member.name}
class="w-full h-32 object-cover rounded-lg mb-3"
on:error={(e) => {
e.target.src = '/assets/past-management-images/original/' + member.image;
}}
/>
{/if}
<p class="font-semibold">{member.name}</p>
</Card>
{/each}
</div>
</div>
{/each}
</div>
</Section>
{/if}
</div> </div>
<style>
.feature-icon {
display: flex;
align-items: center;
justify-content: center;
width: 80px;
height: 80px;
background: rgba(255, 127, 0, 0.1);
border-radius: 50%;
}
</style>

View File

@@ -1,12 +1,18 @@
<script> <script>
import { Section, Center } from "$components"; import { Section, Center } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import { createPageTextStore } from "$lib";
let sectionElement; let sectionElement;
const text = createPageTextStore("Calendar");
onMount(() => { onMount(() => {
sectionElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); sectionElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
}); });
onDestroy(() => {
text.destroy();
});
</script> </script>
<div class="safe-area-navbar" bind:this={sectionElement}> <div class="safe-area-navbar" bind:this={sectionElement}>
@@ -16,7 +22,7 @@
<iframe <iframe
style="border: 0;" style="border: 0;"
src="https://www.google.com/calendar/embed?src=lapikud%40gmail.com&ctz=Europe/Tallinn&showTitle=0&showPrint=0&showCalendars=0&showTz=0&wkst=2" src="https://www.google.com/calendar/embed?src=lapikud%40gmail.com&ctz=Europe/Tallinn&showTitle=0&showPrint=0&showCalendars=0&showTz=0&wkst=2"
title="Lapikud Calendar" title={$text.iframeTitle || "Lapikud Calendar"}
class="w-full" class="w-full"
height="600" height="600"
frameborder="0" frameborder="0"

View File

@@ -5,6 +5,8 @@
Card, Card,
Center, Center,
} from "$components"; } from "$components";
import { onDestroy } from "svelte";
import { createPageTextStore } from "$lib";
import MapPin from "lucide-svelte/icons/map-pin"; import MapPin from "lucide-svelte/icons/map-pin";
import Mail from "lucide-svelte/icons/mail"; import Mail from "lucide-svelte/icons/mail";
@@ -16,29 +18,31 @@
import Building from "lucide-svelte/icons/building"; import Building from "lucide-svelte/icons/building";
import Clock from "lucide-svelte/icons/clock"; import Clock from "lucide-svelte/icons/clock";
const contactMethods = [ const text = createPageTextStore("Contact");
$: contactMethods = [
{ {
icon: MapPin, icon: MapPin,
title: "Aadress", title: $text["methods"]?.addressTitle || "Aadress",
content: "Akadeemia tee 5, 12616 Tallinn", content: "Akadeemia tee 5, 12616 Tallinn",
subtitle: "ICT-teaduskond, Raja 15 ruum 111", subtitle: $text["methods"]?.addressSubtitle || "ICT-teaduskond, Raja 15 ruum 111",
link: "https://goo.gl/maps/..." link: "https://goo.gl/maps/..."
}, },
{ {
icon: Mail, icon: Mail,
title: "E-post", title: $text["methods"]?.emailTitle || "E-post",
content: "lapikud@lapikud.ee", content: "lapikud@lapikud.ee",
link: "mailto:lapikud@lapikud.ee" link: "mailto:lapikud@lapikud.ee"
}, },
{ {
icon: Phone, icon: Phone,
title: "Telefon", title: $text["methods"]?.phoneTitle || "Telefon",
content: "+372 58 160 799", content: "+372 58 160 799",
link: "tel:+37258160799" link: "tel:+37258160799"
}, },
{ {
icon: MessageCircle, icon: MessageCircle,
title: "Messenger", title: $text["methods"]?.messengerTitle || "Messenger",
content: "m.me/Lapikud", content: "m.me/Lapikud",
link: "https://m.me/Lapikud" link: "https://m.me/Lapikud"
} }
@@ -62,17 +66,17 @@
} }
]; ];
const organizationInfo = [ $: organizationInfo = [
{ {
icon: Building, icon: Building,
title: "Registrikood", title: $text["organization"]?.registryTitle || "Registrikood",
content: "80167145" content: "80167145"
}, },
{ {
icon: Building, icon: Building,
title: "Pangakonto", title: $text["organization"]?.bankTitle || "Pangakonto",
content: "EE812200221019551756", content: "EE812200221019551756",
subtitle: "Swedbank" subtitle: $text["organization"]?.bankSubtitle || "Swedbank"
} }
]; ];
@@ -86,9 +90,13 @@
function handleSubmit(e) { function handleSubmit(e) {
e.preventDefault(); e.preventDefault();
// Create mailto link with form data // Create mailto link with form data
const mailtoLink = `mailto:lapikud@lapikud.ee?subject=${encodeURIComponent(formData.subject)}&body=${encodeURIComponent(`Nimi: ${formData.name}\nE-post: ${formData.email}\n\nSõnum:\n${formData.message}`)}`; const mailtoLink = `mailto:lapikud@lapikud.ee?subject=${encodeURIComponent(formData.subject)}&body=${encodeURIComponent(`${$text["form"]?.mailBody?.name || "Nimi"}: ${formData.name}\n${$text["form"]?.mailBody?.email || "E-post"}: ${formData.email}\n\n${$text["form"]?.mailBody?.message || "Sõnum"}:\n${formData.message}`)}`;
window.location.href = mailtoLink; window.location.href = mailtoLink;
} }
onDestroy(() => {
text.destroy();
});
</script> </script>
<div class="safe-area-navbar"> <div class="safe-area-navbar">
@@ -96,9 +104,9 @@
<Section background="orange"> <Section background="orange">
<Center> <Center>
<div class="text-center max-w-4xl"> <div class="text-center max-w-4xl">
<h1 class="text-5xl font-bold mb-6">Võta ühendust</h1> <h1 class="text-5xl font-bold mb-6">{$text["hero"]?.title || "Võta ühendust"}</h1>
<p class="text-2xl leading-relaxed"> <p class="text-2xl leading-relaxed">
Kas sul on küsimusi? Tahad liituda? Või soovid alustada koostööd? Võta julgelt ühendust! {$text["hero"]?.description || "Kas sul on küsimusi? Tahad liituda? Või soovid alustada koostööd? Võta julgelt ühendust!"}
</p> </p>
</div> </div>
</Center> </Center>
@@ -107,8 +115,8 @@
<!-- Contact Methods --> <!-- Contact Methods -->
<Section> <Section>
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Kuidas meiega ühendust võtta?</h2> <h2 class="text-4xl font-bold mb-4">{$text["methods"]?.title || "Kuidas meiega ühendust võtta?"}</h2>
<p class="text-xl text-gray-600">Vali endale sobiv viis</p> <p class="text-xl text-gray-600">{$text["methods"]?.subtitle || "Vali endale sobiv viis"}</p>
</div> </div>
<Grid columns={2} gap="var(--space-5)"> <Grid columns={2} gap="var(--space-5)">
@@ -147,57 +155,57 @@
<Section background="neutral"> <Section background="neutral">
<div class="max-w-3xl mx-auto"> <div class="max-w-3xl mx-auto">
<div class="text-center mb-8"> <div class="text-center mb-8">
<h2 class="text-4xl font-bold mb-4">Saada meile sõnum</h2> <h2 class="text-4xl font-bold mb-4">{$text["form"]?.title || "Saada meile sõnum"}</h2>
<p class="text-xl text-gray-600">Täida vorm ja me võtame sinuga ühendust</p> <p class="text-xl text-gray-600">{$text["form"]?.subtitle || "Täida vorm ja me võtame sinuga ühendust"}</p>
</div> </div>
<Card variant="glass"> <Card variant="glass">
<form on:submit={handleSubmit} class="space-y-6"> <form on:submit={handleSubmit} class="space-y-6">
<div> <div>
<label for="name" class="block text-sm font-semibold mb-2">Nimi *</label> <label for="name" class="block text-sm font-semibold mb-2">{$text["form"]?.nameLabel || "Nimi *"}</label>
<input <input
type="text" type="text"
id="name" id="name"
bind:value={formData.name} bind:value={formData.name}
required required
class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition"
placeholder="Sinu nimi" placeholder={$text["form"]?.namePlaceholder || "Sinu nimi"}
/> />
</div> </div>
<div> <div>
<label for="email" class="block text-sm font-semibold mb-2">E-post *</label> <label for="email" class="block text-sm font-semibold mb-2">{$text["form"]?.emailLabel || "E-post *"}</label>
<input <input
type="email" type="email"
id="email" id="email"
bind:value={formData.email} bind:value={formData.email}
required required
class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition"
placeholder="sinu@email.ee" placeholder={$text["form"]?.emailPlaceholder || "sinu@email.ee"}
/> />
</div> </div>
<div> <div>
<label for="subject" class="block text-sm font-semibold mb-2">Teema *</label> <label for="subject" class="block text-sm font-semibold mb-2">{$text["form"]?.subjectLabel || "Teema *"}</label>
<input <input
type="text" type="text"
id="subject" id="subject"
bind:value={formData.subject} bind:value={formData.subject}
required required
class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition"
placeholder="Sõnumi teema" placeholder={$text["form"]?.subjectPlaceholder || "Sõnumi teema"}
/> />
</div> </div>
<div> <div>
<label for="message" class="block text-sm font-semibold mb-2">Sõnum *</label> <label for="message" class="block text-sm font-semibold mb-2">{$text["form"]?.messageLabel || "Sõnum *"}</label>
<textarea <textarea
id="message" id="message"
bind:value={formData.message} bind:value={formData.message}
required required
rows="6" rows="6"
class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition resize-none" class="w-full px-4 py-3 rounded-lg border border-gray-300 focus:border-orange-500 focus:ring-2 focus:ring-orange-200 outline-none transition resize-none"
placeholder="Kirjuta oma sõnum siia..." placeholder={$text["form"]?.messagePlaceholder || "Kirjuta oma sõnum siia..."}
></textarea> ></textarea>
</div> </div>
@@ -205,7 +213,7 @@
type="submit" type="submit"
class="w-full py-3 px-6 bg-orange-500 hover:bg-orange-600 text-white font-semibold rounded-lg transition-colors" class="w-full py-3 px-6 bg-orange-500 hover:bg-orange-600 text-white font-semibold rounded-lg transition-colors"
> >
Saada sõnum {$text["form"]?.submit || "Saada sõnum"}
</button> </button>
</form> </form>
</Card> </Card>
@@ -221,20 +229,20 @@
<Clock size={32} strokeWidth={1.5} /> <Clock size={32} strokeWidth={1.5} />
</div> </div>
<div> <div>
<h2 class="text-3xl font-bold mb-4">Lahtiolekuajad</h2> <h2 class="text-3xl font-bold mb-4">{$text["hours"]?.title || "Lahtiolekuajad"}</h2>
</div> </div>
</div> </div>
<div class="space-y-3 text-lg"> <div class="space-y-3 text-lg">
<div class="flex justify-between"> <div class="flex justify-between">
<span class="font-semibold">Esmaspäev - Reede:</span> <span class="font-semibold">{$text["hours"]?.weekdays || "Esmaspäev - Reede:"}</span>
<span>10:00 - 16:00</span> <span>{$text["hours"]?.weekdaysTime || "10:00 - 16:00"}</span>
</div> </div>
<div class="flex justify-between"> <div class="flex justify-between">
<span class="font-semibold">Laupäev - Pühapäev:</span> <span class="font-semibold">{$text["hours"]?.weekend || "Laupäev - Pühapäev:"}</span>
<span>Suletud</span> <span>{$text["hours"]?.weekendTime || "Suletud"}</span>
</div> </div>
<p class="text-sm text-gray-600 mt-4"> <p class="text-sm text-gray-600 mt-4">
* Soovitame enne külastamist võtta ühendust, et vältida ootamist {$text["hours"]?.note || "* Soovitame enne külastamist võtta ühendust, et vältida ootamist"}
</p> </p>
</div> </div>
</Card> </Card>
@@ -245,16 +253,15 @@
<MapPin size={32} strokeWidth={1.5} /> <MapPin size={32} strokeWidth={1.5} />
</div> </div>
<div> <div>
<h2 class="text-3xl font-bold mb-4">Kuidas meid leida?</h2> <h2 class="text-3xl font-bold mb-4">{$text["location"]?.title || "Kuidas meid leida?"}</h2>
</div> </div>
</div> </div>
<div class="space-y-3 text-lg"> <div class="space-y-3 text-lg">
<p><strong>Aadress:</strong> Akadeemia tee 5, 12616 Tallinn</p> <p><strong>{$text["location"]?.addressLabel || "Aadress:"}</strong> {$text["location"]?.address || "Akadeemia tee 5, 12616 Tallinn"}</p>
<p><strong>Hoone:</strong> ICT-teaduskond (Raja 15)</p> <p><strong>{$text["location"]?.buildingLabel || "Hoone:"}</strong> {$text["location"]?.building || "ICT-teaduskond (Raja 15)"}</p>
<p><strong>Ruum:</strong> 111</p> <p><strong>{$text["location"]?.roomLabel || "Ruum:"}</strong> {$text["location"]?.room || "111"}</p>
<p class="text-sm text-gray-600 mt-4"> <p class="text-sm text-gray-600 mt-4">
Asume Tallinna Tehnikaülikooli ICT-teaduskonna hoones. {$text["location"]?.note || "Asume Tallinna Tehnikaülikooli ICT-teaduskonna hoones. Kui tuled ühistranspordiga, on lähimad peatused \"Mustakivi\" ja \"Tehnikaülikool\"."}
Kui tuled ühistranspordiga, on lähimad peatused "Mustakivi" ja "Tehnikaülikool".
</p> </p>
</div> </div>
</Card> </Card>
@@ -265,7 +272,7 @@
<Section background="neutral"> <Section background="neutral">
<Grid gap="var(--space-5)"> <Grid gap="var(--space-5)">
<Card variant="glass"> <Card variant="glass">
<h2 class="text-3xl font-bold mb-6 text-center">Jälgi meid sotsiaalmeedias</h2> <h2 class="text-3xl font-bold mb-6 text-center">{$text["social"]?.title || "Jälgi meid sotsiaalmeedias"}</h2>
<div class="flex flex-wrap justify-center gap-4"> <div class="flex flex-wrap justify-center gap-4">
{#each socialMedia as social} {#each socialMedia as social}
<a <a
@@ -282,7 +289,7 @@
</Card> </Card>
<Card variant="glass"> <Card variant="glass">
<h2 class="text-3xl font-bold mb-6 text-center">MTÜ Lapikud</h2> <h2 class="text-3xl font-bold mb-6 text-center">{$text["organization"]?.title || "MTÜ Lapikud"}</h2>
<div class="space-y-3"> <div class="space-y-3">
{#each organizationInfo as info} {#each organizationInfo as info}
<div class="flex items-start gap-4"> <div class="flex items-start gap-4">

View File

@@ -3,8 +3,8 @@
Section, Section,
Grid, Grid,
} from "$components"; } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import { text } from "$lib/i18n"; import { createPageTextStore } from "$lib";
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import { MapLibre, Marker } from "svelte-maplibre"; import { MapLibre, Marker } from "svelte-maplibre";
@@ -35,12 +35,17 @@
// Load pricing data // Load pricing data
let pricingData = { services: [] }; let pricingData = { services: [] };
const text = createPageTextStore("Helpdesk");
onMount(async () => { onMount(async () => {
const response = await fetch('/_data/helpdesk/hinnakiri.yml'); const response = await fetch('/_data/helpdesk/hinnakiri.yml');
const yamlText = await response.text(); const yamlText = await response.text();
pricingData = yaml.load(yamlText); pricingData = yaml.load(yamlText);
}); });
onDestroy(() => {
text.destroy();
});
</script> </script>
<div class="safe-area-navbar"> <div class="safe-area-navbar">

View File

@@ -5,11 +5,9 @@
Container, Container,
Image, Image,
} from "$components"; } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import yaml from "js-yaml"; import yaml from "js-yaml";
import { currentLang, getLangText } from "$lib"; import { currentLang, getLangText, createPageTextStore } from "$lib";
import estManagementText from "$lib/locales/est/Management.json";
import enManagementText from "$lib/locales/en/Management.json";
import Mail from "lucide-svelte/icons/mail"; import Mail from "lucide-svelte/icons/mail";
import Phone from "lucide-svelte/icons/phone"; import Phone from "lucide-svelte/icons/phone";
@@ -17,13 +15,7 @@
let pastManagement = []; let pastManagement = [];
let loading = true; let loading = true;
let loadError = false; let loadError = false;
const text = createPageTextStore("Management");
const managementTextByLang = {
est: estManagementText,
en: enManagementText,
};
$: t = managementTextByLang[$currentLang] || managementTextByLang.est;
function parseYearLabel(label) { function parseYearLabel(label) {
const value = String(label ?? ""); const value = String(label ?? "");
@@ -66,6 +58,10 @@
loading = false; loading = false;
} }
}); });
onDestroy(() => {
text.destroy();
});
</script> </script>
<div class="safe-area-navbar"> <div class="safe-area-navbar">
@@ -81,9 +77,9 @@
<Container class="relative z-10 py-[clamp(3rem,8vw,6rem)]"> <Container class="relative z-10 py-[clamp(3rem,8vw,6rem)]">
<div class="max-w-4xl"> <div class="max-w-4xl">
<p class="mb-4 text-xs tracking-[0.16em] uppercase text-orange-500">{t.hero.eyebrow}</p> <p class="mb-4 text-xs tracking-[0.16em] uppercase text-orange-500">{$text.hero?.eyebrow || "MTÜ Lapikud"}</p>
<h1 class="m-0 text-[clamp(2.4rem,6vw,4.2rem)] font-bold">{t.hero.title}</h1> <h1 class="m-0 text-[clamp(2.4rem,6vw,4.2rem)] font-bold">{$text.hero?.title || "Management"}</h1>
<p class="mt-4 max-w-[52ch] text-[clamp(1.05rem,1.5vw,1.25rem)] text-white/75">{t.hero.intro}</p> <p class="mt-4 max-w-[52ch] text-[clamp(1.05rem,1.5vw,1.25rem)] text-white/75">{$text.hero?.intro || "People who keep the organisation moving forward."}</p>
</div> </div>
</Container> </Container>
</div> </div>
@@ -91,7 +87,7 @@
<!-- Current Management Section --> <!-- Current Management Section -->
<Section padding="large"> <Section padding="large">
<h1 class="m-0 text-[clamp(1.8rem,3vw,2.6rem)] leading-[1.12] tracking-[-0.03em] mb-10">{t.current.label}</h1> <h1 class="m-0 text-[clamp(1.8rem,3vw,2.6rem)] leading-[1.12] tracking-[-0.03em] mb-10">{$text.current?.label || "Current board"}</h1>
<Grid min="500px"> <Grid min="500px">
{#each currentManagement as member (member.name)} {#each currentManagement as member (member.name)}
<div class="flex flex-col sm:flex-row gap-6 items-start"> <div class="flex flex-col sm:flex-row gap-6 items-start">
@@ -129,15 +125,15 @@
<Section padding="large"> <Section padding="large">
<div class="mb-7 flex flex-col items-start justify-between gap-6 md:flex-row md:items-end"> <div class="mb-7 flex flex-col items-start justify-between gap-6 md:flex-row md:items-end">
<div> <div>
<h2 class="m-0 text-[clamp(1.8rem,3vw,2.6rem)] leading-[1.12] tracking-[-0.03em]">{t.history.label}</h2> <h2 class="m-0 text-[clamp(1.8rem,3vw,2.6rem)] leading-[1.12] tracking-[-0.03em]">{$text.history?.label || "People who have led the organisation over time"}</h2>
<p class="mt-2 text-[0.98rem] text-[rgba(13,13,13,0.62)]">{t.history.hint}</p> <p class="mt-2 text-[0.98rem] text-[rgba(13,13,13,0.62)]">{$text.history?.hint || "Thanks to everyone who has helped guide Lapikud"}</p>
</div> </div>
</div> </div>
{#if loading} {#if loading}
<p class="m-0 py-4 text-black">{t.loading}</p> <p class="m-0 py-4 text-black">{$text.loading || "Loading data..."}</p>
{:else if loadError} {:else if loadError}
<p class="m-0 py-4 text-red-500">{t.error}</p> <p class="m-0 py-4 text-red-500">{$text.error || "Failed to load the management data."}</p>
{:else} {:else}
<div class="flex flex-col gap-10"> <div class="flex flex-col gap-10">
{#each pastManagement as yearData (yearData.year)} {#each pastManagement as yearData (yearData.year)}

View File

@@ -1,8 +1,8 @@
<script> <script>
import { Section, Card, Center } from "$components"; import { Section, Container } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import yaml from "js-yaml"; import yaml from "js-yaml";
import { currentLang, getLangText } from "$lib"; import { currentLang, getLangText, createPageTextStore } from "$lib";
import Mail from "lucide-svelte/icons/mail"; import Mail from "lucide-svelte/icons/mail";
import Phone from "lucide-svelte/icons/phone"; import Phone from "lucide-svelte/icons/phone";
@@ -10,6 +10,8 @@
import User from "lucide-svelte/icons/user"; import User from "lucide-svelte/icons/user";
let mentors = []; let mentors = [];
const text = createPageTextStore("Mentors");
onMount(async () => { onMount(async () => {
const response = await fetch("/_data/mentors.yml"); const response = await fetch("/_data/mentors.yml");
@@ -17,6 +19,10 @@
mentors = yaml.load(yamlText); mentors = yaml.load(yamlText);
}); });
onDestroy(() => {
text.destroy();
});
function getContactIcon(contactType) { function getContactIcon(contactType) {
const type = contactType.toLowerCase(); const type = contactType.toLowerCase();
if (type.includes("email") || type.includes("e-post")) return Mail; if (type.includes("email") || type.includes("e-post")) return Mail;
@@ -48,15 +54,23 @@
<div class="safe-area-navbar"> <div class="safe-area-navbar">
<!-- Hero Section --> <!-- Hero Section -->
<Section background="orange"> <Section
<Center> padding="none"
<div class="text-center max-w-4xl"> fullWidth={true}
<h1 class="text-5xl font-bold mb-6">Meie Mentorid</h1> contentClass="!px-0 !py-0"
<p class="text-2xl leading-relaxed"> class="overflow-hidden text-white"
Lapikud, kes on alati valmis olema sinu toeks nii õpingutes kui ka isiklikus arengus ja kellega on lihtsalt tore koos aega veeta. >
</p> <div class="relative overflow-hidden bg-linear-to-b bg-gray-900 after:absolute after:inset-x-0 after:bottom-0 after:h-px after:bg-[rgba(240,148,29,0.16)] after:content-['']">
<div class="pointer-events-none absolute -right-16 -top-16 h-80 w-80 rounded-full border border-[rgba(240,148,29,0.12)]" aria-hidden="true"></div>
<div class="pointer-events-none absolute -bottom-20 right-16 h-52 w-52 rounded-full border border-[rgba(240,148,29,0.08)]" aria-hidden="true"></div>
<Container class="relative z-10 py-[clamp(3rem,8vw,6rem)]">
<div class="max-w-4xl">
<h1 class="m-0 text-[clamp(2.4rem,6vw,4.2rem)] font-bold">{$text.hero?.title || "Our Mentors"}</h1>
<p class="mt-4 max-w-[52ch] text-[clamp(1.05rem,1.5vw,1.25rem)] text-white/75">{$text.hero?.intro || "Lapikud who are always ready to support you in your studies and personal development."}</p>
</div>
</Container>
</div> </div>
</Center>
</Section> </Section>
<!-- Mentors Grid --> <!-- Mentors Grid -->

View File

@@ -5,9 +5,9 @@
Card, Card,
Center, Center,
} from "$components"; } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import { currentLang, getLangText } from "$lib"; import { currentLang, getLangText, createPageTextStore } from "$lib";
import Rocket from "lucide-svelte/icons/rocket"; import Rocket from "lucide-svelte/icons/rocket";
import Users from "lucide-svelte/icons/users"; import Users from "lucide-svelte/icons/users";
@@ -20,6 +20,7 @@
import ExternalLink from "lucide-svelte/icons/external-link"; import ExternalLink from "lucide-svelte/icons/external-link";
let projects = []; let projects = [];
const text = createPageTextStore("OurWork");
onMount(async () => { onMount(async () => {
const response = await fetch('/_data/ourwork.yml'); const response = await fetch('/_data/ourwork.yml');
@@ -27,44 +28,48 @@
projects = yaml.load(yamlText).filter(p => p.title); projects = yaml.load(yamlText).filter(p => p.title);
}); });
const services = [ onDestroy(() => {
text.destroy();
});
$: services = [
{ {
icon: Globe, icon: Globe,
title: "Veebilahendused", title: $text["services"]?.items?.[0]?.title || "Veebilahendused",
description: "Kaasaegsed ja responsiivsed veebilehed, mis toimivad igal seadmel" description: $text["services"]?.items?.[0]?.description || "Kaasaegsed ja responsiivsed veebilehed, mis toimivad igal seadmel"
}, },
{ {
icon: Smartphone, icon: Smartphone,
title: "Mobiilirakendused", title: $text["services"]?.items?.[1]?.title || "Mobiilirakendused",
description: "iOS ja Android rakendused kasutajasõbralike liidestega" description: $text["services"]?.items?.[1]?.description || "iOS ja Android rakendused kasutajasõbralike liidestega"
}, },
{ {
icon: Code, icon: Code,
title: "Tarkvara arendus", title: $text["services"]?.items?.[2]?.title || "Tarkvara arendus",
description: "Kohandatud tarkvaralahendused teie ärivajadusteks" description: $text["services"]?.items?.[2]?.description || "Kohandatud tarkvaralahendused teie ärivajadusteks"
}, },
{ {
icon: Briefcase, icon: Briefcase,
title: "Konsultatsioon", title: $text["services"]?.items?.[3]?.title || "Konsultatsioon",
description: "IT-nõustamine ja projekti planeerimine" description: $text["services"]?.items?.[3]?.description || "IT-nõustamine ja projekti planeerimine"
} }
]; ];
const whyUs = [ $: whyUs = [
{ {
icon: Users, icon: Users,
title: "Motiveeritud meeskond", title: $text["whyUs"]?.items?.[0]?.title || "Motiveeritud meeskond",
description: "Meie tudengid on andekad, õhevil ja tahavad tõestada oma oskuseid" description: $text["whyUs"]?.items?.[0]?.description || "Meie tudengid on andekad, õhevil ja tahavad tõestada oma oskuseid"
}, },
{ {
icon: Target, icon: Target,
title: "Kvaliteetne tulemus", title: $text["whyUs"]?.items?.[1]?.title || "Kvaliteetne tulemus",
description: "Võtame iga projekti tõsiselt ja pingutame parima tulemuse nimel" description: $text["whyUs"]?.items?.[1]?.description || "Võtame iga projekti tõsiselt ja pingutame parima tulemuse nimel"
}, },
{ {
icon: Rocket, icon: Rocket,
title: "Kaasaegsed tehnoloogiad", title: $text["whyUs"]?.items?.[2]?.title || "Kaasaegsed tehnoloogiad",
description: "Kasutame uusimaid tööriistu ja tehnoloogiaid" description: $text["whyUs"]?.items?.[2]?.description || "Kasutame uusimaid tööriistu ja tehnoloogiaid"
} }
]; ];
</script> </script>
@@ -74,9 +79,9 @@
<Section background="orange"> <Section background="orange">
<Center> <Center>
<div class="text-center max-w-4xl"> <div class="text-center max-w-4xl">
<h1 class="text-5xl font-bold mb-6">Ettevõttele</h1> <h1 class="text-5xl font-bold mb-6">{$text["hero"]?.title || "Ettevõttele"}</h1>
<p class="text-2xl leading-relaxed"> <p class="text-2xl leading-relaxed">
Aitame sinu ideed ellu viia! Meie kogenud tudengid on valmis teie projekte realiseerima. {$text["hero"]?.description || "Aitame sinu ideed ellu viia! Meie kogenud tudengid on valmis teie projekte realiseerima."}
</p> </p>
</div> </div>
</Center> </Center>
@@ -85,8 +90,8 @@
<!-- Services Section --> <!-- Services Section -->
<Section> <Section>
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Mida me pakume?</h2> <h2 class="text-4xl font-bold mb-4">{$text["services"]?.title || "Mida me pakume?"}</h2>
<p class="text-xl text-gray-600">Laia valik IT-teenuseid teie ärivajaduste täitmiseks</p> <p class="text-xl text-gray-600">{$text["services"]?.subtitle || "Laia valik IT-teenuseid teie ärivajaduste täitmiseks"}</p>
</div> </div>
<Grid columns={2} gap="var(--space-5)"> <Grid columns={2} gap="var(--space-5)">
@@ -105,7 +110,7 @@
<!-- Why Choose Us --> <!-- Why Choose Us -->
<Section background="neutral"> <Section background="neutral">
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Miks meiega koostööd teha?</h2> <h2 class="text-4xl font-bold mb-4">{$text["whyUs"]?.title || "Miks meiega koostööd teha?"}</h2>
</div> </div>
<Grid columns={3} gap="var(--space-5)"> <Grid columns={3} gap="var(--space-5)">
@@ -125,65 +130,28 @@
<Section> <Section>
<Grid gap="var(--space-5)"> <Grid gap="var(--space-5)">
<Card variant="glass"> <Card variant="glass">
<h2 class="text-4xl font-bold mb-6">Kuidas töötame?</h2> <h2 class="text-4xl font-bold mb-6">{$text["process"]?.title || "Kuidas töötame?"}</h2>
<div class="space-y-6"> <div class="space-y-6">
{#each $text["process"]?.steps || [] as step, index}
<div class="flex items-start gap-4"> <div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">1.</div> <div class="text-3xl font-bold" style="color: var(--orange)">{index + 1}.</div>
<div> <div>
<strong class="text-lg">Esimene kohtumine</strong><br/> <strong class="text-lg">{step.title}</strong><br/>
Arutame teie ideed, vajadusi ja eesmärke. Mõistame, mida soovite saavutada. {step.description}
</div>
</div>
<div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">2.</div>
<div>
<strong class="text-lg">Planeerimine</strong><br/>
Koostame projekti plaani, hinnapakkumise ja ajakava. Lepime kokku detailides.
</div>
</div>
<div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">3.</div>
<div>
<strong class="text-lg">Arendus</strong><br/>
Meie meeskond töötab teie projekti kallal. Hoiame teid regulaarselt kursis.
</div>
</div>
<div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">4.</div>
<div>
<strong class="text-lg">Üleandmine</strong><br/>
Anname valmis toote üle koos dokumentatsiooni ja juhendamisega.
</div>
</div>
<div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">5.</div>
<div>
<strong class="text-lg">Tugi</strong><br/>
Pakume vajadusel jätkuvat tuge ja hooldust.
</div> </div>
</div> </div>
{/each}
</div> </div>
</Card> </Card>
<Card variant="glass"> <Card variant="glass">
<h2 class="text-4xl font-bold mb-6">Millal meie sobime?</h2> <h2 class="text-4xl font-bold mb-6">{$text["fit"]?.title || "Millal meie sobime?"}</h2>
<div class="space-y-4 text-lg"> <div class="space-y-4 text-lg">
{#each $text["fit"]?.items || [] as item}
<p> <p>
<strong>Startup ja väikeettevõtted:</strong> Meie teenused on hinnaefektiivsed ja paindlikud, <strong>{item.title}</strong> {item.description}
sobides hästi piiratud eelarvega projektidele.
</p>
<p>
<strong>Prototüüpide arendus:</strong> Vajate kiiresti töökorras prototüüpi?
Meie agile meeskond suudab kiiresti teie idee ellu viia.
</p>
<p>
<strong>Lõputööd ja projektid:</strong> Teie projekt võib saada meie tudengite
lõputöö teemaks, mis tagab motiveeritud ja pühendunud meeskonna.
</p>
<p>
<strong>Pikaajalised projektid:</strong> Pakume ka pikemaajalisi koostöövõimalusi
keerulisemate süsteemide arendamiseks.
</p> </p>
{/each}
</div> </div>
</Card> </Card>
</Grid> </Grid>
@@ -192,8 +160,8 @@
<!-- Portfolio Section --> <!-- Portfolio Section -->
<Section> <Section>
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Meie tehtud tööd</h2> <h2 class="text-4xl font-bold mb-4">{$text["portfolio"]?.title || "Meie tehtud tööd"}</h2>
<p class="text-xl text-gray-600">Vaata, mida oleme varem loonud</p> <p class="text-xl text-gray-600">{$text["portfolio"]?.subtitle || "Vaata, mida oleme varem loonud"}</p>
</div> </div>
<Grid columns={3} gap="var(--space-5)"> <Grid columns={3} gap="var(--space-5)">
@@ -225,7 +193,7 @@
rel="noopener noreferrer" rel="noopener noreferrer"
class="inline-flex items-center gap-2 text-orange-500 hover:text-orange-600 font-semibold" class="inline-flex items-center gap-2 text-orange-500 hover:text-orange-600 font-semibold"
> >
Vaata projekti <ExternalLink size={16} /> {$text["portfolio"]?.projectLink || "Vaata projekti"} <ExternalLink size={16} />
</a> </a>
{/if} {/if}
</Card> </Card>
@@ -237,22 +205,22 @@
<Section background="orange"> <Section background="orange">
<Center> <Center>
<div class="text-center max-w-4xl text-white"> <div class="text-center max-w-4xl text-white">
<h2 class="text-4xl font-bold mb-6">Alustame koostööd?</h2> <h2 class="text-4xl font-bold mb-6">{$text["cta"]?.title || "Alustame koostööd?"}</h2>
<p class="text-xl mb-8"> <p class="text-xl mb-8">
Võta ühendust ja arutame, kuidas saame sinu ideed ellu viia! {$text["cta"]?.description || "Võta ühendust ja arutame, kuidas saame sinu ideed ellu viia!"}
</p> </p>
<div class="flex flex-wrap gap-4 justify-center"> <div class="flex flex-wrap gap-4 justify-center">
<a <a
href="mailto:lapikud@lapikud.ee" href="mailto:lapikud@lapikud.ee"
class="inline-flex items-center gap-2 px-8 py-3 bg-white text-orange-500 hover:bg-gray-100 font-semibold rounded-lg transition-colors" class="inline-flex items-center gap-2 px-8 py-3 bg-white text-orange-500 hover:bg-gray-100 font-semibold rounded-lg transition-colors"
> >
Saada e-kiri <ArrowRight size={20} /> {$text["cta"]?.emailButton || "Saada e-kiri"} <ArrowRight size={20} />
</a> </a>
<a <a
href="/contact" href="/contact"
class="inline-flex items-center gap-2 px-8 py-3 bg-transparent border-2 border-white hover:bg-white hover:text-orange-500 font-semibold rounded-lg transition-colors" class="inline-flex items-center gap-2 px-8 py-3 bg-transparent border-2 border-white hover:bg-white hover:text-orange-500 font-semibold rounded-lg transition-colors"
> >
Kontaktandmed {$text["cta"]?.contactButton || "Kontaktandmed"}
</a> </a>
</div> </div>
</div> </div>

View File

@@ -1,9 +1,12 @@
<script> <script>
import { Section, Grid } from "$components"; import { Section, Grid } from "$components";
import { onDestroy } from "svelte";
import { createPageTextStore } from "$lib";
let sectionElement; let sectionElement;
let imagesLoaded = 0; let imagesLoaded = 0;
const totalImages = 3; const totalImages = 3;
const text = createPageTextStore("Striim");
function handleImageLoad() { function handleImageLoad() {
imagesLoaded++; imagesLoaded++;
@@ -11,21 +14,25 @@
sectionElement.scrollIntoView({ behavior: 'smooth', block: 'start' }); sectionElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
} }
} }
onDestroy(() => {
text.destroy();
});
</script> </script>
<div class="safe-area-navbar" bind:this={sectionElement}> <div class="safe-area-navbar" bind:this={sectionElement}>
<Section fullWidth={true} contentClass="flex items-start"> <Section fullWidth={true} contentClass="flex items-start">
<Grid min="400px" class="w-full"> <Grid min="400px" class="w-full">
<a href="https://master.lapikud.ee/stream/1/stream"> <a href="https://master.lapikud.ee/stream/1/stream">
<img src="https://master.lapikud.ee/stream/1/substream" alt="video0" style="width:100%;" on:load={handleImageLoad}/> <img src="https://master.lapikud.ee/stream/1/substream" alt={$text.streamAlts?.first || "camera 1 stream"} style="width:100%;" on:load={handleImageLoad}/>
</a> </a>
<a href="https://master.lapikud.ee/stream/2/stream"> <a href="https://master.lapikud.ee/stream/2/stream">
<img src="https://master.lapikud.ee/stream/2/substream" alt="video1" style="width:100%;" on:load={handleImageLoad}/> <img src="https://master.lapikud.ee/stream/2/substream" alt={$text.streamAlts?.second || "camera 2 stream"} style="width:100%;" on:load={handleImageLoad}/>
</a> </a>
<a href="https://master.lapikud.ee/stream/3/stream"> <a href="https://master.lapikud.ee/stream/3/stream">
<img src="https://master.lapikud.ee/stream/3/substream" alt="video2" style="width:100%;" on:load={handleImageLoad}/> <img src="https://master.lapikud.ee/stream/3/substream" alt={$text.streamAlts?.third || "camera 3 stream"} style="width:100%;" on:load={handleImageLoad}/>
</a> </a>
</Grid> </Grid>
</Section> </Section>

View File

@@ -4,10 +4,10 @@
Grid, Grid,
Card, Card,
Center, Center,
Container,
} from "$components"; } from "$components";
import { onMount } from "svelte"; import { onMount, onDestroy } from "svelte";
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import { createPageTextStore } from "$lib";
import Users from "lucide-svelte/icons/users"; import Users from "lucide-svelte/icons/users";
import GraduationCap from "lucide-svelte/icons/graduation-cap"; import GraduationCap from "lucide-svelte/icons/graduation-cap";
@@ -17,12 +17,26 @@
import Trophy from "lucide-svelte/icons/trophy"; import Trophy from "lucide-svelte/icons/trophy";
let members = { junior: [], senior: [] }; let members = { junior: [], senior: [] };
const text = createPageTextStore("Student");
onMount(async () => { onMount(async () => {
const response = await fetch('/_data/members.yml'); const response = await fetch('/_data/members.yml');
const yamlText = await response.text(); const yamlText = await response.text();
members = yaml.load(yamlText); members = yaml.load(yamlText);
}); });
onDestroy(() => {
text.destroy();
});
$: benefits = [
{ icon: Code, ...($text["benefits"]?.items?.[0] || { title: "Praktilised projektid", description: "Osale reaalsetel tarkvaraarenduse projektidel. Omanda kogemust, mida ei õpeta ühelgi kursusel." }) },
{ icon: Users, ...($text["benefits"]?.items?.[1] || { title: "Tugev kogukond", description: "Liitu sõbralike ja ambitsioonikate tudengitega. Leia oma meeskond ja loo püsivaid sõprussuhteid." }) },
{ icon: GraduationCap, ...($text["benefits"]?.items?.[2] || { title: "Mentorlus", description: "Saa juhendamist kogenud tudengitelt ja arendajatelt. Õpi parimate käest ja arene kiiremini." }) },
{ icon: Calendar, ...($text["benefits"]?.items?.[3] || { title: "Üritused", description: "Osale huvitavatel üritustel, hackathonidel ja koolitustel. Laienda oma silmaringi ja võrgustikku." }) },
{ icon: Lightbulb, ...($text["benefits"]?.items?.[4] || { title: "Lõputööd", description: "Meie projektidest kasvavad välja huvitavad lõputööd. Leia oma teema ja juhendaja meie seast." }) },
{ icon: Trophy, ...($text["benefits"]?.items?.[5] || { title: "Töökogemus", description: "Aktiivsed liikmed saavad võimaluse teenida oma esimest töökogemust ja palka meie projektides." }) },
];
</script> </script>
<div class="safe-area-navbar"> <div class="safe-area-navbar">
@@ -30,9 +44,9 @@
<Section background="orange"> <Section background="orange">
<Center> <Center>
<div class="text-center max-w-4xl"> <div class="text-center max-w-4xl">
<h1 class="text-5xl font-bold mb-6">Liitu Meiega!</h1> <h1 class="text-5xl font-bold mb-6">{$text["hero"]?.title || "Liitu Meiega!"}</h1>
<p class="text-2xl leading-relaxed"> <p class="text-2xl leading-relaxed">
Tule arenda oma oskuseid ja saa ägedaid sõpru! Omanda praktilist kogemust reaalsetest projektidest. {$text["hero"]?.description || "Tule arenda oma oskuseid ja saa ägedaid sõpru! Omanda praktilist kogemust reaalsetest projektidest."}
</p> </p>
</div> </div>
</Center> </Center>
@@ -41,70 +55,20 @@
<!-- Benefits Section --> <!-- Benefits Section -->
<Section> <Section>
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Miks Lapikutega liituda?</h2> <h2 class="text-4xl font-bold mb-4">{$text["benefits"]?.title || "Miks Lapikutega liituda?"}</h2>
<p class="text-xl text-gray-600">Siin on mõned põhjused, miks meie kogukond on suurepärane koht arenguks</p> <p class="text-xl text-gray-600">{$text["benefits"]?.subtitle || "Siin on mõned põhjused, miks meie kogukond on suurepärane koht arenguks"}</p>
</div> </div>
<Grid columns={3} gap="var(--space-5)"> <Grid columns={3} gap="var(--space-5)">
{#each benefits as benefit}
<Card variant="glass"> <Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)"> <div class="feature-icon mb-4" style="color: var(--orange)">
<Code size={48} strokeWidth={1.5} /> <svelte:component this={benefit.icon} size={48} strokeWidth={1.5} />
</div> </div>
<h3 class="text-2xl font-bold mb-3">Praktilised projektid</h3> <h3 class="text-2xl font-bold mb-3">{benefit.title}</h3>
<p class="text-gray-600"> <p class="text-gray-600">{benefit.description}</p>
Osale reaalsetel tarkvaraarenduse projektidel. Omanda kogemust, mida ei õpeta ühelgi kursusel.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Users size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Tugev kogukond</h3>
<p class="text-gray-600">
Liitu sõbralike ja ambitsioonikate tudengitega. Leia oma meeskond ja loo püsivaid sõprussuhteid.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<GraduationCap size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Mentorlus</h3>
<p class="text-gray-600">
Saa juhendamist kogenud tudengitelt ja arendajatelt. Õpi parimate käest ja arene kiiremini.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Calendar size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Üritused</h3>
<p class="text-gray-600">
Osale huvitavatel üritustel, hackathonidel ja koolitustel. Laienda oma silmaringi ja võrgustikku.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Lightbulb size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Lõputööd</h3>
<p class="text-gray-600">
Meie projektidest kasvavad välja huvitavad lõputööd. Leia oma teema ja juhendaja meie seast.
</p>
</Card>
<Card variant="glass">
<div class="feature-icon mb-4" style="color: var(--orange)">
<Trophy size={48} strokeWidth={1.5} />
</div>
<h3 class="text-2xl font-bold mb-3">Töökogemus</h3>
<p class="text-gray-600">
Aktiivsed liikmed saavad võimaluse teenida oma esimest töökogemust ja palka meie projektides.
</p>
</Card> </Card>
{/each}
</Grid> </Grid>
</Section> </Section>
@@ -112,52 +76,32 @@
<Section background="neutral"> <Section background="neutral">
<Grid gap="var(--space-5)"> <Grid gap="var(--space-5)">
<Card variant="glass"> <Card variant="glass">
<h2 class="text-4xl font-bold mb-4">Mida saad teha?</h2> <h2 class="text-4xl font-bold mb-4">{$text["activities"]?.title || "Mida saad teha?"}</h2>
<div class="space-y-4 text-lg"> <div class="space-y-4 text-lg">
{#each $text["activities"]?.items || [] as item}
<p> <p>
<strong>Tarkvara arendus:</strong> Töötad reaalsetel projektidel kasutades kaasaegseid tehnoloogiaid. <strong>{item.title}</strong> {item.description}
Õpid koodi kirjutamist meeskonnas, versioonihaldustööriistade kasutamist ja tarkvara kvaliteedi tagamist.
</p>
<p>
<strong>Helpdesk:</strong> Aita tudengeid ja õppejõude IT-probleemide lahendamisel.
Arenda oma tehnilisi oskuseid ja õpi suhtlemist klientidega.
</p>
<p>
<strong>Projektijuhtimine:</strong> Võta vastutus projekti koordineerimise eest.
Õpi planeerimist, meeskonna juhtimist ja suhtlemist klientidega.
</p>
<p>
<strong>Turundus ja disain:</strong> Aita meie projektide ja ürituste turundamisel.
Loo sisu sotsiaalmeedias, disaini materjale ja jälgi tulemusi.
</p> </p>
{/each}
</div> </div>
</Card> </Card>
<Card variant="glass"> <Card variant="glass">
<h2 class="text-4xl font-bold mb-4">Kuidas liituda?</h2> <h2 class="text-4xl font-bold mb-4">{$text["join"]?.title || "Kuidas liituda?"}</h2>
<div class="space-y-4 text-lg"> <div class="space-y-4 text-lg">
{#each $text["join"]?.steps || [] as step, index}
<div class="flex items-start gap-4"> <div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">1.</div> <div class="text-3xl font-bold" style="color: var(--orange)">{index + 1}.</div>
<div> <div>
<strong>Võta ühendust</strong><br/> <strong>{step.title}</strong><br/>
Kirjuta meile e-posti aadressil <a href="mailto:lapikud@lapikud.ee" class="text-orange-500 hover:underline">lapikud@lapikud.ee</a> {#if index === 0}
või tule meie kontorisse Akadeemia tee 5. {step.description || "Kirjuta meile e-posti aadressil"} <a href="mailto:lapikud@lapikud.ee" class="text-orange-500 hover:underline">lapikud@lapikud.ee</a> {step.descriptionEnd || "või tule meie kontorisse Akadeemia tee 5."}
</div> {:else}
</div> {step.description}
<div class="flex items-start gap-4"> {/if}
<div class="text-3xl font-bold" style="color: var(--orange)">2.</div>
<div>
<strong>Tutvumine</strong><br/>
Kohtu meie meeskonnaga, tutvusta ennast ja räägi oma huvidest. Näitame sulle meie projekte ja võimalusi.
</div>
</div>
<div class="flex items-start gap-4">
<div class="text-3xl font-bold" style="color: var(--orange)">3.</div>
<div>
<strong>Alusta tööd</strong><br/>
Leia endale sobiv projekt või meeskond ja hakka tegutsema! Meie mentorid aitavad sind iga sammu juures.
</div> </div>
</div> </div>
{/each}
</div> </div>
</Card> </Card>
</Grid> </Grid>
@@ -166,13 +110,13 @@
<!-- Members Section --> <!-- Members Section -->
<Section> <Section>
<div class="text-center mb-12"> <div class="text-center mb-12">
<h2 class="text-4xl font-bold mb-4">Meie liikmed</h2> <h2 class="text-4xl font-bold mb-4">{$text["members"]?.title || "Meie liikmed"}</h2>
<p class="text-xl text-gray-600">Suurepärased inimesed, kes moodustavad meie kogukonna</p> <p class="text-xl text-gray-600">{$text["members"]?.subtitle || "Suurepärased inimesed, kes moodustavad meie kogukonna"}</p>
</div> </div>
{#if members.senior && members.senior.length > 0} {#if members.senior && members.senior.length > 0}
<div class="mb-12"> <div class="mb-12">
<h3 class="text-3xl font-bold mb-6 text-center">Vanemliikmed</h3> <h3 class="text-3xl font-bold mb-6 text-center">{$text["members"]?.senior || "Vanemliikmed"}</h3>
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4"> <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4">
{#each members.senior as member} {#each members.senior as member}
<div class="bg-white rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow"> <div class="bg-white rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow">
@@ -185,7 +129,7 @@
{#if members.junior && members.junior.length > 0} {#if members.junior && members.junior.length > 0}
<div> <div>
<h3 class="text-3xl font-bold mb-6 text-center">Noorliikmed</h3> <h3 class="text-3xl font-bold mb-6 text-center">{$text["members"]?.junior || "Noorliikmed"}</h3>
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4"> <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4">
{#each members.junior as member} {#each members.junior as member}
<div class="bg-white rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow"> <div class="bg-white rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow">