Files
tykkaa.fi/api.php
Jukka Lampikoski 6be4414da5 Lisää 8 uutta kategoriaa ja esimerkkipostaukset (2-4 per kategoria)
Kategoriat: Käsityöt ✂️, Puutarha 🌱, Sisustus 🏠, Kirjat 📚,
            Hyvinvointi 🧘, Lemmikit 🐾, Kasvit 🪴, Matkustus ✈️
- Jokaisessa 2–4 esimerkkipostausta, yhteensä 26 uutta
- Tekijänimet vähennetty 5:een: Maija-Liisa, Tiina K., Riitta H., Sinikka, Pekka
- Pekka vain resepteissä (bolognese, lihapullat, karjalanpaisti)
- getOrInitCategories() lisää uudet kategoriat automaattisesti live-serverille

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 09:11:49 +02:00

690 lines
70 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* tykkää.fi — API backend
* Tallentaa julkaisut, kommentit, tykkäykset ja kategoriat JSON-tiedostoihin.
*/
session_start();
header('Content-Type: application/json; charset=UTF-8');
// ─── VAIHDA TÄMÄ SALASANA! ──────────────────────────────────────
define('ADMIN_PASSWORD', 'passus');
// ────────────────────────────────────────────────────────────────
define('DATA_DIR', __DIR__ . '/data/');
if (!is_dir(DATA_DIR)) mkdir(DATA_DIR, 0755, true);
$action = $_GET['action'] ?? '';
$body = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$raw = file_get_contents('php://input');
$body = json_decode($raw, true) ?? [];
if (!$action) $action = $body['action'] ?? '';
}
// ─── Apufunktiot ───────────────────────────────────────────────
function readData(string $file, $default = []) {
$path = DATA_DIR . $file;
if (!file_exists($path)) return $default;
$d = json_decode(file_get_contents($path), true);
return $d !== null ? $d : $default;
}
function writeData(string $file, $data): void {
file_put_contents(
DATA_DIR . $file,
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)
);
}
function ok($data = []): void {
echo json_encode(array_merge(['ok' => true], $data));
exit;
}
function err(string $msg, int $code = 400): void {
http_response_code($code);
echo json_encode(['error' => $msg]);
exit;
}
function isAdmin(): bool {
return !empty($_SESSION['tykkaafi_admin']);
}
// ─── Oletusdata ────────────────────────────────────────────────
function defaultCategories(): array {
return [
['id' => 'recipes', 'fi' => 'Reseptit', 'en' => 'Recipes', 'emoji' => '🍳',
'subcategories' => [
['id' => 'kasvis', 'fi' => 'Kasvis'],
['id' => 'vegaaniset', 'fi' => 'Vegaaniset'],
['id' => 'jalkiruuat', 'fi' => 'Jälkiruuat'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'knitting', 'fi' => 'Neulominen', 'en' => 'Knitting', 'emoji' => '🧶',
'subcategories' => [
['id' => 'aloittelijoille', 'fi' => 'Aloittelijoille'],
['id' => 'vaatteet', 'fi' => 'Vaatteet'],
['id' => 'kodin_tekstiilit', 'fi' => 'Kodin tekstiilit'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'kasityot', 'fi' => 'Käsityöt', 'en' => 'Crafts', 'emoji' => '✂️',
'subcategories' => [
['id' => 'virkkaus', 'fi' => 'Virkkaus'],
['id' => 'ommelu', 'fi' => 'Ommelu'],
['id' => 'askartelu', 'fi' => 'Askartelu'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'puutarha', 'fi' => 'Puutarha', 'en' => 'Gardening', 'emoji' => '🌱',
'subcategories' => [
['id' => 'vihannekset', 'fi' => 'Vihannekset'],
['id' => 'kukat', 'fi' => 'Kukat'],
['id' => 'parvekeviljeily', 'fi' => 'Parvekeviljeily'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'sisustus', 'fi' => 'Sisustus', 'en' => 'Interior', 'emoji' => '🏠',
'subcategories' => [
['id' => 'diy', 'fi' => 'DIY'],
['id' => 'valaistus', 'fi' => 'Valaistus'],
['id' => 'tekstiilit', 'fi' => 'Tekstiilit'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'kirjat', 'fi' => 'Kirjat', 'en' => 'Books', 'emoji' => '📚',
'subcategories' => [
['id' => 'romaanit', 'fi' => 'Romaanit'],
['id' => 'tietokirjat', 'fi' => 'Tietokirjat'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'hyvinvointi', 'fi' => 'Hyvinvointi', 'en' => 'Wellbeing', 'emoji' => '🧘',
'subcategories' => [
['id' => 'liikunta', 'fi' => 'Liikunta'],
['id' => 'uni', 'fi' => 'Uni'],
['id' => 'mieli', 'fi' => 'Mieli'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'lemmikit', 'fi' => 'Lemmikit', 'en' => 'Pets', 'emoji' => '🐾',
'subcategories' => [
['id' => 'koirat', 'fi' => 'Koirat'],
['id' => 'kissat', 'fi' => 'Kissat'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'kasvit', 'fi' => 'Kasvit', 'en' => 'Plants', 'emoji' => '🪴',
'subcategories' => [
['id' => 'huonekasvit', 'fi' => 'Huonekasvit'],
['id' => 'puutarhakasvit', 'fi' => 'Puutarhakasvit'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'matkustus', 'fi' => 'Matkustus', 'en' => 'Travel', 'emoji' => '✈️',
'subcategories' => [
['id' => 'suomi', 'fi' => 'Suomi'],
['id' => 'eurooppa', 'fi' => 'Eurooppa'],
['id' => 'muut', 'fi' => 'Muut'],
]],
['id' => 'tips', 'fi' => 'Vinkit', 'en' => 'Tips', 'emoji' => '💡',
'subcategories' => [
['id' => 'muut', 'fi' => 'Muut'],
]],
];
}
function defaultPosts(): array {
return [
// ── RESEPTIT ──────────────────────────────────────────────
[
'id' => 'pancakes', 'emoji' => '🥞', 'title' => 'Kuohkeat letut',
'category' => 'recipes', 'author' => 'Maija-Liisa',
'time' => '20 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Kultaisia, voisia lettuja, jotka sulavat suuhun. Täydellisiä laiskaan sunnuntaiaamuun.',
'ingredients' => ['1½ dl vehnäjauhoja','3½ tl leivinjauhetta','1 tl suolaa','1 rkl sokeria','3 dl maitoa','1 muna','3 rkl sulatettua voita','Voita tai öljyä paistamiseen'],
'steps' => ['Sekoita kulhossa jauhot, leivinjauhe, suola ja sokeri.','Tee keskelle kuoppa ja kaada sekaan maito, muna ja sulatettu voi.','Sekoita tasaiseksi — pienet paakut ovat ok.','Kuumenna pannua keskilämmöllä.','Kaada noin ¼ dl taikinaa per lettu.','Paista kunnes pintaan nousee kuplia, käännä ja paista kullanruskeaksi.','Tarjoile vaahterasiirapilla ja marjoilla.'],
],
[
'id' => 'bolognese', 'emoji' => '🍝', 'title' => 'Klassinen spagetti bolognese',
'category' => 'recipes', 'author' => 'Tiina K.',
'time' => '1 t 20 min', 'servings' => '6 annosta', 'type' => 'recipe',
'desc' => 'Runsas, hitaasti haudutettu lihamauste al dente -spagetin päällä. Ajaton italialainen klassikko.',
'ingredients' => ['500 g jauhelihaa','400 g spagettia','1 sipuli, hienonnettuna','3 valkosipulinkynttä','800 g murskattuja tomaatteja','2 dl punaviiniä','2 rkl tomaattipyrettä','Suolaa, pippuria, basilikaa, oreganoa','Parmesaanijuustoa tarjoiluun'],
'steps' => ['Kuullota sipuli ja valkosipuli oliiviöljyssä.','Ruskista jauheliha.','Lisää viini ja anna pelkistyä (5 min).','Lisää tomaatit ja mausteet.','Hauduta miedolla lämmöllä 1 tunti.','Keitä spagetti al denteksi.','Tarjoile parmesaanin kera.'],
],
[
'id' => 'cookies', 'emoji' => '🍪', 'title' => 'Suklaahippukeksit',
'category' => 'recipes', 'author' => 'Riitta H.',
'time' => '30 min', 'servings' => '24 keksiä', 'type' => 'recipe',
'desc' => 'Sitkeä sisältä, rapea reunoilta — täydellinen kotitekoinen keksi.',
'ingredients' => ['5½ dl vehnäjauhoja','1 tl ruokasoodaa','1 tl suolaa','225 g pehmeää voita','1½ dl sokeria','1½ dl ruskeaa sokeria','2 munaa','2 tl vaniljauutetta','4 dl suklaahippuja'],
'steps' => ['Kuumenna uuni 190°C.','Sekoita jauhot, sooda ja suola.','Vatkaa voi ja sokerit kuohkeaksi.','Lisää munat ja vanilja.','Yhdistä aineet ja lisää suklaa.','Lusikoi pellille.','Paista 911 min kullanruskeaksi.'],
],
[
'id' => 'soup', 'emoji' => '🍲', 'title' => 'Täyttävä kasviskeitto',
'category' => 'recipes', 'subcategory' => 'kasvis', 'author' => 'Sinikka',
'time' => '45 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Lämmittävä kulhollinen paksuja kasviksia rikkaassa yrttiliemessä.',
'ingredients' => ['2 rkl oliiviöljyä','1 sipuli','3 valkosipulia','3 porkkanaa, siivuina','2 perunaa, kuutioina','1 kesäkurpitsa','400 g tomaattimurskaa','1½ l kasvislientä','Timjami, rosmariini, suola, pippuri'],
'steps' => ['Kuullota sipuli ja valkosipuli.','Lisää kasvikset ja sekoittele 5 min.','Kaada liemi ja tomaatit, lisää yrtit.','Hauduta 25 min.','Lisää kesäkurpitsa, keitä 10 min.','Mausta ja tarjoile.'],
],
[
'id' => 'banana_bread', 'emoji' => '🍌', 'title' => 'Mehevä banaanileipä',
'category' => 'recipes', 'author' => 'Tiina K.',
'time' => '1 t 10 min', 'servings' => '10 siivua', 'type' => 'recipe',
'desc' => 'Täydellinen tapa käyttää ylikypsät banaanit. Kosteaa, makeaa ja ihanan aromaattista.',
'ingredients' => ['3 ylikypsää banaania','2 dl vehnäjauhoja','1 tl ruokasoodaa','½ tl suolaa','75 g sulatettua voita','1½ dl sokeria','1 muna','1 tl vaniljauutetta','½ dl smetanaa tai piimää'],
'steps' => ['Kuumenna uuni 175°C ja voitele leipävuoka.','Soseuta banaanit haarukalla.','Sekoita jauhot, sooda ja suola kulhossa.','Yhdistä banaanisose, voi, sokeri, muna ja vanilja toisessa kulhossa.','Sekoita kuivat ja märät ainekset, lisää smetana.','Kaada taikina vuokaan.','Paista 6065 min, kunnes tikku tulee puhtaana ulos.','Anna jäähtyä ennen leikkaamista.'],
],
[
'id' => 'salmon_soup', 'emoji' => '🐟', 'title' => 'Perinteinen lohikeitto',
'category' => 'recipes', 'author' => 'Sinikka',
'time' => '40 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Kermainen ja täyteläinen lohikeitto — suomalainen sieluruoka parhaimmillaan.',
'ingredients' => ['500 g lohifileetä, kuutioina','4 perunaa, kuutioina','2 porkkanaa, siivuina','1 purjo, siivuina','1 l kalaliemi tai vesi','2 dl kuohukermaa','Tilliä, suolaa, valkopippuria','Voita paistamiseen'],
'steps' => ['Kuullota purjo voissa kattilassa.','Lisää porkkanat ja perunat, paistele 3 min.','Kaada liemi ja keitä kasvikset kypsiksi (15 min).','Lisää lohikuutiot ja keitä 57 min.','Kaada kerma ja kuumenna (ei kiehauta).','Mausta tillillä, suolalla ja pippurilla.','Tarjoile ruisleivän kera.'],
],
[
'id' => 'cinnamon_rolls', 'emoji' => '🌀', 'title' => 'Korvapuustit',
'category' => 'recipes', 'author' => 'Riitta H.',
'time' => '2 t 30 min', 'servings' => '20 kpl', 'type' => 'recipe',
'desc' => 'Pehmeät, kanelilla ja kardemummalla maustetut korvapuustit — suomalaiseen kahvipöytään kuuluvat klassikoista klassisin.',
'ingredients' => ['5 dl maitoa','50 g hiivaa','1½ dl sokeria','1 tl suolaa','2 tl jauhettua kardemummaa','noin 13 dl vehnäjauhoja','150 g pehmeää voita','Täyte: 100 g pehmeää voita, 1 dl sokeria, 2 rkl kanelia','Munaa voiteluun, karkeaa sokeria päälle'],
'steps' => ['Lämmitä maito 37°C ja liuota siihen hiiva.','Lisää sokeri, suola, kardemumma ja puolet jauhoista, sekoita.','Lisää voi ja loput jauhot, vaivaa pehmeäksi taikinaksi.','Anna kohota liinan alla 45 min.','Kauli taikina suorakaiteeksi, levitä täyte.','Kääri rullaksi ja leikkaa viipaleiksi, asettele pellille.','Anna kohota 30 min, voitele munalla, ripottele sokeria.','Paista 200°C 1215 min kullanruskeaksi.'],
],
[
'id' => 'strawberry_quark', 'emoji' => '🍓', 'title' => 'Mansikkarahka',
'category' => 'recipes', 'subcategory' => 'jalkiruuat', 'author' => 'Tiina K.',
'time' => '15 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Helppo ja raikas jälkiruoka kesän makeimmista mansikoista. Valmistuu vartin kymmenessä minuutissa!',
'ingredients' => ['500 g tuoreita mansikoita','400 g rahkaa tai maitorahkaa','2 dl kuohukermaa','3 rkl sokeria tai hunajaa','1 tl vaniljasokeria','Mintunlehtiä koristeluun'],
'steps' => ['Soseuta puolet mansikoista haarukalla tai sauvasekoittimella.','Vatkaa kerma löysäksi vaahdoksi.','Sekoita rahka, mansikasose, sokeri ja vaniljasokeri.','Nostele kermavaahto joukkoon.','Pilko loput mansikat paloiksi ja sekoita tai laita päälle.','Jäähdytä tunnin verran ennen tarjoilua.'],
],
[
'id' => 'carrot_ginger_soup', 'emoji' => '🥕', 'title' => 'Porkkana-inkiväärikeitto',
'category' => 'recipes', 'subcategory' => 'vegaaniset', 'author' => 'Maija-Liisa',
'time' => '35 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Kirpeä inkivääri ja makea porkkana luovat täydellisen liiton tässä lämmittävässä keitossa.',
'ingredients' => ['700 g porkkanoita, siivuina','1 sipuli','3 valkosipulinkynttä','4 cm tuoretta inkivääriä, raastettuna','1 l kasvislientä','2 dl kookoskermaa','2 rkl oliiviöljyä','Suolaa, pippuria','Korianteria tai persiljaa tarjoiluun'],
'steps' => ['Kuullota sipuli ja valkosipuli öljyssä.','Lisää inkivääri, paistele 1 min.','Lisää porkkanat ja liemi.','Keitä 20 min kunnes porkkanat ovat pehmeitä.','Soseuta keitto sauvasekoittimella.','Lisää kookoskerma ja kuumenna.','Mausta ja tarjoile yrteillä koristeltuna.'],
],
[
'id' => 'homemade_pizza', 'emoji' => '🍕', 'title' => 'Kotitekoinen pizza',
'category' => 'recipes', 'author' => 'Sinikka',
'time' => '1 t 30 min', 'servings' => '2 pizzaa', 'type' => 'recipe',
'desc' => 'Rapea, ohut pohja ja täyteläinen tomaattikastike. Kotipizza voittaa aina.',
'ingredients' => ['3 dl lämmintä vettä','1 tl kuivahiivaa','1 tl sokeria','1 tl suolaa','5 dl vehnäjauhoja','2 rkl oliiviöljyä','Kastike: 400 g tomaattimurskaa, 2 valkosipulinkynttä, oreganoa','Täytteet: mozzarella, mitä haluat'],
'steps' => ['Liuota hiiva lämpimään veteen sokerin kera, odota 5 min.','Lisää suola, öljy ja jauhot, vaivaa 8 min.','Anna kohota 1 tunti.','Keitä tomaattikastike valkosipulilla ja oreganolla 10 min.','Kuumenna uuni 250°C.','Kauli taikina ohueksi, levitä kastike, lisää täytteet.','Paista 1012 min kunnes pohja on rapea.'],
],
[
'id' => 'oat_blueberry_porridge', 'emoji' => '🫐', 'title' => 'Kaura-mustikkapuuro',
'category' => 'recipes', 'subcategory' => 'vegaaniset', 'author' => 'Maija-Liisa',
'time' => '15 min', 'servings' => '2 annosta', 'type' => 'recipe',
'desc' => 'Täyttävä aamiainen, joka antaa energiaa koko aamulle. Mustikka tekee siitä erityisen.',
'ingredients' => ['2 dl kaurahiutaleita','5 dl maitoa tai kasvijuomaa','½ tl suolaa','1 rkl voita','2 dl mustikkaa (tuore tai pakaste)','Hunajaa tai vaahterasiirappia','Mantelilastuja päälle'],
'steps' => ['Mittaa kaura ja maito kattilaan.','Kuumenna sekoittaen keskilämmöllä.','Kun puuro sakenee (n. 8 min), lisää suola ja voi.','Nosta liedeltä, lisää mustikka.','Sekoita kevyesti — mustikka saa jäädä osittain ehjäksi.','Tarjoile hunajalla ja mantelilastuilla.'],
],
[
'id' => 'chicken_risotto', 'emoji' => '🍚', 'title' => 'Kermainen kanarisotto',
'category' => 'recipes', 'author' => 'Tiina K.',
'time' => '45 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Italialaisittain valmistettu risotto, joka muuttuu kermaisen täydelliseksi kärsivällisyydellä.',
'ingredients' => ['300 g risottoriisiä (arborio)','2 kananrintaa, paloina','1 sipuli','3 valkosipulinkynttä','1 l kuumaa kanaliemi','1 dl valkoviiniä','50 g parmesaania, raastettuna','2 rkl voita','Oliiviöljyä, suolaa, pippuria, timjamia'],
'steps' => ['Ruskista kanapalat öljyssä, ota sivuun.','Kuullota sipuli ja valkosipuli samassa pannussa.','Lisää riisi, paistele 2 min.','Kaada viini, sekoita kunnes imeytyy.','Lisää kuumaa lientä kauhallinen kerrallaan, sekoita jatkuvasti.','Jatka 2025 min kunnes riisi on al dente.','Lisää kana, parmesaani ja voi. Mausta. Tarjoile.'],
],
[
'id' => 'blueberry_pie', 'emoji' => '🫐', 'title' => 'Mustikkapiirakka',
'category' => 'recipes', 'subcategory' => 'jalkiruuat', 'author' => 'Riitta H.',
'time' => '1 t 10 min', 'servings' => '8 palaa', 'type' => 'recipe',
'desc' => 'Mummolan klassikko — murea taikina ja täyteläinen mustikkatäyte. Parasta vaniljakastikkeen kera.',
'ingredients' => ['Pohja: 150 g voita, 1 dl sokeria, 1 muna, 3½ dl vehnäjauhoja, 1 tl leivinjauhetta','Täyte: 4 dl mustikkaa, ½ dl sokeria, 1 rkl perunajauhoja','Vaniljakastiketta tarjoiluun'],
'steps' => ['Kuumenna uuni 200°C.','Vatkaa voi ja sokeri kuohkeaksi, lisää muna.','Sekoita jauhot ja leivinjauhe joukkoon.','Painele ¾ taikinasta piirasvuoan pohjalle ja reunoille.','Sekoita mustikka, sokeri ja perunajauho, levitä täyte.','Murustele loppu taikina päälle.','Paista 3540 min kullanruskeaksi.'],
],
[
'id' => 'avocado_pasta', 'emoji' => '🥑', 'title' => 'Kermainen avokadopasta',
'category' => 'recipes', 'subcategory' => 'kasvis', 'author' => 'Sinikka',
'time' => '20 min', 'servings' => '2 annosta', 'type' => 'recipe',
'desc' => 'Nopea arkipäivän pasta, jonka kastike valmistuu siinä ajassa kuin pasta kiehuu.',
'ingredients' => ['200 g pastaa','2 kypsää avokadoa','1 valkosipulinkynsi','1 sitruunan mehu','2 rkl oliiviöljyä','Suolaa, pippuria','Kirsikkatomaatteja, basilikanlehtiä tarjoiluun','Parmesaania päälle'],
'steps' => ['Keitä pasta al denteksi, säästä 1 dl keitinvettä.','Soseuta avokado, valkosipuli, sitruunanmehu ja öljy tehosekoittimessa.','Lisää keitinvettä tarpeen mukaan tasaisen kastikkeen saamiseksi.','Mausta suolalla ja pippurilla.','Sekoita pasta ja kastike.','Koristele tomaateilla, basilikaalla ja parmesaanilla.'],
],
[
'id' => 'meatballs', 'emoji' => '🍖', 'title' => 'Lihapullat ruskeassa kastikkeessa',
'category' => 'recipes', 'author' => 'Pekka',
'time' => '1 t', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Perinteiset kotimaiset lihapullat kermaisen ruskean kastikkeen kera. Tarjoile muusiperunan ja puolukan kera.',
'ingredients' => ['500 g jauhelihaa (naudan ja sian sekoitus)','1 dl korppujauhoja','1 dl maitoa','1 muna','1 sipuli, hienonnettuna','Suolaa, pippuria, maustepippuria','Kastike: 3 dl lihalientä, 1½ dl kermaa, 1 rkl vehnäjauhoja'],
'steps' => ['Liota korppujauhot maidossa.','Sekoita kaikki lihapullan aineet tasaiseksi massaksi.','Pyörittele märillä käsillä tasaisia palloja.','Ruskista lihapullat voissa pannulla.','Siirrä uunivuokaan ja paista 175°C 15 min.','Tee kastike: sekoita jauhot kermaan, lisää liemi, keitä paksuksi.','Tarjoile lihapullat kastikkeessa muusiperunan kera.'],
],
[
'id' => 'cauliflower_soup', 'emoji' => '🥦', 'title' => 'Samettinen kukkakaalikeitto',
'category' => 'recipes', 'subcategory' => 'kasvis', 'author' => 'Sinikka',
'time' => '30 min', 'servings' => '4 annosta', 'type' => 'recipe',
'desc' => 'Silky-sileä kukkakaalikeitto — yllättävän täyteläinen ja herkullinen arki-illalliseksi.',
'ingredients' => ['1 kukkakaali, paloina','1 sipuli','2 valkosipulinkynttä','1 l kasvislientä','2 dl kermaa','2 rkl oliiviöljyä','Suolaa, valkopippuria','Paahdettuja pähkinöitä tai yrttejä tarjoiluun'],
'steps' => ['Kuullota sipuli ja valkosipuli öljyssä.','Lisää kukkakaalipalat ja liemi.','Keitä 20 min kunnes kukkakaali on pehmeää.','Soseuta keitto silkinsileäksi.','Lisää kerma ja kuumenna.','Mausta suolalla ja valkopippurilla.','Tarjoile paahdettujen pähkinöiden kera.'],
],
[
'id' => 'karjalanpaisti', 'emoji' => '🥘', 'title' => 'Karjalanpaisti',
'category' => 'recipes', 'author' => 'Pekka',
'time' => '34 t', 'servings' => '6 annosta', 'type' => 'recipe',
'desc' => 'Perinteinen suomalainen pataruoka, joka hautuu uunissa itsekseen. Tuoksu täyttää koko kodin.',
'ingredients' => ['600 g naudanlihaa (esim. lapa), kuutioina','400 g sianlihaa (esim. niska), kuutioina','2 sipulia, lohkottuna','2 porkkanaa, siivuina','2 laakerinlehteä','10 maustepippuria','Suolaa','Vettä tai lihalientä'],
'steps' => ['Kuumenna uuni 175°C.','Laita lihat, sipulit ja porkkanat uunipastaan tai pataan.','Lisää laakerinlehdet ja maustepippurit.','Kaada vettä tai lientä juuri lihan verran.','Mausta suolalla.','Peitä kannella tai foliolla.','Hauduta uunissa 34 tuntia kunnes liha on ylikypsää ja irtoaa.','Tarjoile perunoiden ja puolukkahillon kera.'],
],
// ── NEULOMINEN ───────────────────────────────────────────
[
'id' => 'knitting_scarf', 'emoji' => '🧶', 'title' => 'Helppo huivi aloittelijalle',
'category' => 'knitting', 'subcategory' => 'aloittelijoille', 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Neulo kaunis huivi muutamassa tunnissa — täydellinen ensimmäinen projekti!',
'body' => '<p><strong>Tarvitset:</strong></p><ul><li>Paksu lanka (noin 200 g)</li><li>Pyöröneulat nro 68</li></ul><p><strong>Ohje:</strong> Luo 20 silmukkaa. Neulo suoraan (edestakaisin oikein silmukoin) kunnes huivi on noin 150 cm pitkä. Päättele silmukat ja viimeistele päät. Valmis! 🎉</p><p>Vinkki: Paksuilla langoilla ja suurilla neuloilla saat huivista nopeasti valmiin, vaikka olisit aloittelija.</p>',
],
[
'id' => 'knitting_mittens', 'emoji' => '🧤', 'title' => 'Peukalolapaset aloittelijalle',
'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Yksinkertaiset lapaset jotka valmistuvat viikonloppuna — lämpimät ja persoonalliset.',
'body' => '<p><strong>Tarvitset:</strong></p><ul><li>Villalankaa nro 45 (noin 100 g per lapanen)</li><li>Neulat nro 4</li><li>Pistomerkki</li></ul><p><strong>Ohje:</strong></p><ol><li>Luo 36 silmukkaa pyöröneulalle ja neulo 2×2-joustinta 8 cm.</li><li>Vaihda sileään neuleeseen ja lisää peukaloreikää varten 8 silmukkaa.</li><li>Neulo suora 15 cm peukaloreikään saakka.</li><li>Sulje yläpää vähentämällä 8 silmukkaa joka toisella kerroksella.</li><li>Neulo peukalo erillisistä silmukoista.</li></ol><p>Vinkki: Käytä värillistä lankaa tekemään kirjoneuleraita, niin lapasista tulee yksilölliset! 🎨</p>',
],
[
'id' => 'knitting_hat', 'emoji' => '🎩', 'title' => 'Yksinkertainen pipo',
'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Pipo syntyy parissa illassa — kiva lahja tai itselle talven varalle.',
'body' => '<p>Pipo on helppo ja nopea projekti, täydellinen aloittelijalle!</p><p><strong>Tarvitset:</strong></p><ul><li>Villalankaa, paksuus nro 45</li><li>Pyöröneulat 40 cm, nro 4</li></ul><p><strong>Ohje (koko S/M):</strong></p><ol><li>Luo 88 silmukkaa ja liitä rengasneuleeksi.</li><li>Neulo 2×2-joustinta 8 cm.</li><li>Vaihda sileään neuleeseen ja neulo 18 cm.</li><li>Pienennä: * 8 oikein, 2 yhteen * — toista koko kerrokselle.</li><li>Neulo 1 kerros suoraan. Toista pienennykset kunnes jäljellä on 9 silmukkaa.</li><li>Vedä lanka silmukoiden lävitse ja kiristä napakasti.</li></ol>',
],
[
'id' => 'knitting_socks', 'emoji' => '🧦', 'title' => 'Ensimmäiset villasukat',
'category' => 'knitting', 'subcategory' => 'vaatteet', 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Sukat ovat hauskempia neuloa kuin luulet — ja miten hyvältä ne tuntuivatkaan jalassa!',
'body' => '<p>Villasukat ovat yksi neulomisen perinteisimmistä ja palkitsevimmista projekteista.</p><p><strong>Tarvikeet:</strong></p><ul><li>Sukkawool-lankaa (noin 100 g per pari)</li><li>5 sukkaneulaa, nro 2,5</li></ul><p><strong>Rakenne:</strong></p><ol><li><strong>Varsi:</strong> Luo 60 silmukkaa 5 neulalle. Neulo 2×2-joustinta 1520 cm.</li><li><strong>Kantapää:</strong> Neulo 30 silmukkaa edestakainen 30 kerrosta, tee kantapäämuoto lyhentämällä.</li><li><strong>Jalka:</strong> Nosta silmukat, neulo tasaisesti 1820 cm tai kenkänumeron mukaan.</li><li><strong>Varvas:</strong> Pienennä symmetrisesti kunnes 16 silmukkaa jäljellä. Sulje Kitchener-ompeleella.</li></ol><p>Ensimmäinen sukka näyttää hassulta — älä luovuta! Toinen onnistuu jo paremmin. 😄</p>',
],
[
'id' => 'knitting_basics', 'emoji' => '📚', 'title' => 'Neulomisen perusteet — näin aloitat',
'category' => 'knitting', 'subcategory' => 'aloittelijoille', 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Oletko aina haaveillut neulomisesta mutta et tiedä mistä aloittaa? Tässä kaikki mitä tarvitset tietää.',
'body' => '<p>Neulominen on rentouttava harrastus, jonka voi aloittaa hyvin pienellä välineistöllä.</p><h3>Perusvälineet</h3><ul><li><strong>Neulat:</strong> Aloita paksuilla neuloilla (nro 68) — ne ovat helpompia käsitellä.</li><li><strong>Lanka:</strong> Paksu akryyliä tai villalankaa on aloittelijalle paras.</li><li><strong>Sakset ja lanka-neula</strong></li></ul><h3>Perustekniikat</h3><ol><li><strong>Silmukoiden luominen:</strong> Tee lenkkejä peukalonympäri tai käytä puikolle-tekniikkaa.</li><li><strong>Oikea silmukka:</strong> Pistä neula silmukan läpi takaa eteen, kierrä lanka ja vedä läpi.</li><li><strong>Nurja silmukka:</strong> Pistä neula silmukan läpi edestä taakse, kierrä lanka ja vedä läpi.</li></ol><p>Harjoittele ensin pienellä neliöllä ennen kuin alat varsinaiseen projektiin. Pian kädet muistavat liikkeet itsestään! 🧶</p>',
],
[
'id' => 'knitting_baby_hat', 'emoji' => '👶', 'title' => 'Vauvan neulottu pipo',
'category' => 'knitting', 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Söpö ja pehmeä pipo vauvalle — syntyy muutamassa tunnissa ja on heti käyttövalmis.',
'body' => '<p>Vauvan pipo on ihanteellinen lahjaprojekti — pieni, nopea ja aina tarpeellinen. Sopii noin 06 kk ikäiselle.</p><p><strong>Tarvikeet:</strong></p><ul><li>Pehmeää merino- tai bambuvillalankaa (lankavahvuus 23)</li><li>Pyöröneulat 40 cm, nro 33,5</li></ul><p><strong>Ohje:</strong></p><ol><li>Luo 72 silmukkaa ja liitä rengasneuleeksi.</li><li>Neulo 2×2-joustinta 3 cm.</li><li>Vaihda sileään neuleeseen, neulo 8 cm.</li><li>Pienennä: * 4 oikein, 2 yhteen * — toista. Neulo 1 kerros suoraan.</li><li>Jatka pienentämistä kunnes jäljellä on 12 silmukkaa. Vedä lanka läpi.</li></ol><p>💡 Valitse aina pehmeä, ihoa ärsyttämätön lanka vauvoille!</p>',
],
[
'id' => 'knitting_dishcloth', 'emoji' => '🫧', 'title' => 'Neulottu tiskiliina',
'category' => 'knitting', 'subcategory' => 'kodin_tekstiilit', 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Ekologinen vaihtoehto kertakäyttöisille tiskisienille. Valmistuu tunnissa ja kestää vuosia.',
'body' => '<p>Neulottu tiskiliina on täydellinen ensiprojekti — yksinkertainen, nopea ja hyödyllinen!</p><p><strong>Tarvikeet:</strong></p><ul><li>Puuvillalankakerä (noin 50 g)</li><li>Neulat nro 3,54</li></ul><p><strong>Ohje:</strong></p><ol><li>Luo 30 silmukkaa.</li><li>Neulo helmineuletta: * 1 oikein, 1 nurjin * — toista joka kerros.</li><li>Jatka kunnes tiskiliina on neliön muotoinen (noin 20×20 cm).</li><li>Päättele silmukat löysästi.</li></ol><p>Helmineule tarkoittaa, että molemmat puolet ovat samannäköisiä. Tee useampia eri väreissä! 🎨</p>',
],
[
'id' => 'knitting_cowl', 'emoji' => '🌀', 'title' => 'Kauluri talveen',
'category' => 'knitting', 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Muhkea kauluri pitää lämpimänä ja on käytännöllisempi kuin huivi — ei liiku paikaltaan!',
'body' => '<p>Kauluri pysyy paikallaan eikä tipu, toisin kuin huivi. Tämä kauluri on nopea neuloa.</p><p><strong>Tarvikeet:</strong></p><ul><li>Paksua villalankaa, lankavahvuus 56, noin 150 g</li><li>Pyöröneulat 60 cm, nro 6</li></ul><p><strong>Ohje:</strong></p><ol><li>Luo 80 silmukkaa pyöröneulalle. Liitä rengasneuleeksi.</li><li>Merkitse kierroksen alku pistomerkillä.</li><li>Neulo 2×2-joustinta koko kierros.</li><li>Jatka kunnes kauluri on 30 cm pitkä.</li><li>Päättele joustinpäättelyllä (löysästi!).</li></ol><p>Joustinpäättely antaa kauniin ja joustavan reunuksen. ✨</p>',
],
[
'id' => 'crochet_basket', 'emoji' => '🧺', 'title' => 'Virkkaa kori langantähteistä',
'category' => 'knitting', 'subcategory' => 'kodin_tekstiilit', 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Käytä lankatähteet hyödyksi! Kori syntyy muutamassa tunnissa ja sopii kaikkeen säilyttämiseen.',
'body' => '<p>Tässä pääset eroon lankatähteistä luovasti. Yhdistä eri värejä raidalliseen koriin!</p><p><strong>Tarvikeet:</strong></p><ul><li>Paksu puuvilla- tai jutelajanka, eri värejä (yhteensä noin 200 g)</li><li>Virkkuukoukku nro 56</li></ul><p><strong>Ohje:</strong></p><ol><li><strong>Pohja:</strong> Luo taikusilmukka. Virkkaa 12 pistettä ensimmäiseen kierrokseen. Lisää joka toisella kierroksella 6 pistettä. Jatka 5 kierrosta kunnes halkaisija on noin 15 cm.</li><li><strong>Reunat:</strong> Virkkaa vain jokaisen pisteen takimmaisen silmukan lävitse (pystyy korin reunan). Virkkaa suoraan ylöspäin 1015 cm.</li><li><strong>Viimeistely:</strong> Päätä piste tiukasti ja piilota langat.</li></ol><p>💡 Paksuilla langoilla kori kasvaa nopeasti. Kokeile tehdä eri kokoisia koreja sarjana!</p>',
],
// ── VINKIT ───────────────────────────────────────────────
[
'id' => 'tip_morning', 'emoji' => '💡', 'title' => 'Rauhallinen aamurutiini',
'category' => 'tips', 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Pienet muutokset aamurutiiniin tekevät koko päivästä paremman.',
'body' => '<p>Kokeile näitä vinkkejä parempaan aamuun:</p><ul><li>🌅 Herää 15 minuuttia aiemmin kuin tarvitset</li><li>💧 Juo lasi vettä ennen kahvia</li><li>📵 Älä katso puhelinta heti herätessä</li><li>🚶 Pieni lenkki tai venyttely ennen päivää</li></ul><p>Pienet muutokset, iso vaikutus!</p>',
],
[
'id' => 'tip_digital_detox', 'emoji' => '📵', 'title' => 'Digipaasto — kokeile viikon ajan',
'category' => 'tips', 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Vähennä ruutuaikaa ja huomaa miten elämä muuttuu. Ei tarvitse lopettaa kokonaan!',
'body' => '<p>Kokeilin viime kuussa viikon digipaastoa ja muutos oli hämmästyttävä. Tässä omat vinkkini:</p><h3>Käytännön vinkit</h3><ul><li>📱 <strong>Puhelin makuuhuoneen ulkopuolelle yöllä</strong> — heräät virkeämpänä</li><li>⏰ <strong>Ruutuaikaikkunat</strong> — esim. sähköposti vain klo 9 ja 15</li><li>🚫 <strong>Poista some-sovellukset puhelimesta</strong> ja käytä selainta tietokoneella</li><li>📚 <strong>Korvaa selaaminen kirjalla</strong> — 20 min ennen nukkumista</li></ul><p>Nukuin paremmin jo ensimmäisestä yöstä alkaen. Ja parasta: tajusin, miten paljon aikaa minulla oikeasti on!</p>',
],
[
'id' => 'tip_budgeting', 'emoji' => '💰', 'title' => 'Säästövinkit arkeen',
'category' => 'tips', 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Pienet muutokset arjessa voivat säästää satoja euroja vuodessa — ilman että elämänlaatu kärsii.',
'body' => '<p>Olen oppinut säästämään arjessa ilman tinkimistä mieluisista asioista. Tässä parhaat vinkkini:</p><h3>Ruokaostokset</h3><ul><li>Tee kauppalista ennen kauppaan menoa ja pidä siitä kiinni</li><li>Käytä tarjoukset hyödyksi — pakasta erikoistarjouksessa ostettu liha</li><li>Kasvata omia yrttejä ikkunalaudalla</li><li>Kokkaa isompia eriä ja pakasta loput</li></ul><h3>Energia</h3><ul><li>LED-polttimot kaikkialle</li><li>Pyykinpesukone yöllä (halvempi sähkö)</li><li>Laske vesilämmitin 60°C → 55°C</li></ul><p>Ja muista: paras kauppa on se johon et mene lainkaan! 😄</p>',
],
[
'id' => 'tip_balcony_garden', 'emoji' => '🌱', 'title' => 'Kasvimaa parvekkeella',
'category' => 'tips', 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Oma tomaatti tai yrtit parvekkeen laatikoista — helpompaa kuin luulet!',
'body' => '<p>Parvekeviljelyä voi harrastaa vaikka asuisi kerrostalossa. Tässä helppo aloitus:</p><h3>Mitä viljellä parvekkeella</h3><ul><li>🌿 <strong>Yrtit:</strong> basilika, persilja, ruohosipuli — helppoja ja käytännöllisiä</li><li>🍅 <strong>Tomaatit:</strong> parveketomaatit (pieni lajike) tuottavat hyvin pienessäkin ruukussa</li><li>🌶️ <strong>Paprikat:</strong> kasvavat hyvin ruukussa lämpimällä paikalla</li><li>🥬 <strong>Salaatit:</strong> kasvavat nopeasti ja voit korjata lehti kerrallaan</li></ul><h3>Tärkeimmät vinkit</h3><ul><li>Valitse tarpeeksi iso ruukku — liian pieni kuivuu nopeasti</li><li>Kastele säännöllisesti, kesällä ehkä päivittäin</li><li>Lannoita kerran viikossa nestemäisellä lannoitteella</li><li>Sijoita aurinkoisen paikan suojaan tuulelta</li></ul><p>Oman sadon maku on aivan eri kuin kaupan — kannattaa ehdottomasti kokeilla! 🌞</p>',
],
[
'id' => 'tip_eco_cleaning', 'emoji' => '♻️', 'title' => 'Ekologinen siivous',
'category' => 'tips', 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Puhdista koti turvallisilla aineilla — parempi sinulle, parempi ympäristölle ja halvempaa!',
'body' => '<p>Tehokkain siivousaine löytyy usein kaapistasi: etikka, ruokasooda ja sitruuna tekevät ihmeitä.</p><h3>Perusreseptit</h3><ul><li>🧹 <strong>Yleispuhdistusaine:</strong> 1 osa etikkaa + 1 osa vettä + muutama tippa astianpesuainetta. Toimii lähes kaikkialla.</li><li>🪥 <strong>Hankausaine:</strong> Ruokasooda + muutama tippa nestesaippuaa. Ihanteellinen altaisiin ja uuniin.</li><li>🍋 <strong>Kalkkitahrat:</strong> Sitruunanpuolisko suoraan hanaan tai pinnoille. Anna vaikuttaa 10 min ja huuhtele.</li></ul><h3>Mitä kannattaa vältellä</h3><p>Klooripohjaiset aineet ovat tehokkaita mutta raskaita ympäristölle ja hengitysteille. Useimmissa kotitöissä pärjät ilman niitä. Säilytä ne vain tosi tarpeelliseen.</p>',
],
// ── KÄSITYÖT ─────────────────────────────────────────────
[
'id' => 'craft_crochet_heart', 'emoji' => '🧶', 'title' => 'Virkattu sydän — helppo lahja',
'category' => 'kasityot', 'subcategory' => ['virkkaus'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Pieni virkattu sydän syntyy tunnissa ja on täydellinen lahja tai koriste.',
'body' => '<p>Tämä söpö sydän on helppo myös aloittelijalle!</p><p><strong>Tarvikeet:</strong></p><ul><li>Puuvillalankakerä, noin 20 g</li><li>Virkkuukoukku nro 3</li><li>Täytevanua</li></ul><p><strong>Ohje:</strong></p><ol><li>Luo taikusilmukka. Virkkaa 3 ketjusilmukkaa (= 1 pylväs).</li><li>Kierros 1: Virkkaa 2 pylvästä taikusilmukkaan, 3 ketjusilmukkaa, 2 pylvästä, 3 ketjua, 1 pylväs. Sulje.</li><li>Jatka kiertämällä ja lisäämällä pylväitä sydämen muodon mukaan — YouTube-tutoriaalit auttavat!</li><li>Tee kaksi samanlaista osaa, ompele yhteen ja täytä vanulla.</li></ol><p>💡 Kaksivärinen lanka tekee sydämestä erityisen kauniin!</p>',
],
[
'id' => 'craft_tote_bag', 'emoji' => '👜', 'title' => 'Ompele oma kangaskassi',
'category' => 'kasityot', 'subcategory' => ['ommelu'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Ekologinen ja persoonallinen kangaskassi onnistuu jopa ilman ompelukonetta — mutta koneella nopeammin!',
'body' => '<p>Kangaskassi on helppo ensimmäinen ompelutyö. Tarvitset vain suorat saumat!</p><p><strong>Tarvikeet:</strong></p><ul><li>Kangaspalanen 40×80 cm (esim. puuvillaa)</li><li>Kaitale kantohihnoja varten: 2 kpl, 60 cm pitkiä</li><li>Ompelukone tai neula ja lanka</li></ul><p><strong>Ohje:</strong></p><ol><li>Taita kangas oikeat puolet vastakkain, leveyssuunnassa puoliksi.</li><li>Ompele sivusaumat ja pohja (jätä aukon yläreuna auki).</li><li>Viimeistele yläreuna kääntämällä noin 2 cm sisäänpäin ja ompele.</li><li>Kiinnitä kantohihnat ompelemalla lujasti yläreunaan, molemmille puolille.</li><li>Käännä oikea puoli ulos — valmis!</li></ol><p>Vinkki: Pese kangas ennen ompelemista, niin se ei enää kutistu käytössä. 🧺</p>',
],
[
'id' => 'craft_macrame', 'emoji' => '🎨', 'title' => 'Makramee-seinäkoriste',
'category' => 'kasityot', 'subcategory' => ['askartelu'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Trendikäs makramee-koriste syntyy muutamassa tunnissa ja koristaa seinää vuosia.',
'body' => '<p>Makramee on solmimistaidetta joka näyttää vaikeammalta kuin onkaan!</p><p><strong>Tarvikeet:</strong></p><ul><li>Makrameelankaa (3-säikeistä puuvillaa), noin 50 m</li><li>Puinen keppi tai oksa, noin 30 cm</li><li>Sakset</li></ul><p><strong>Perussolmut:</strong></p><ul><li><strong>Tasainen solmu (Square knot):</strong> Käytä 4 lankaa — 2 ulompaa solmitaan 2 sisemmän ympäri vuorotellen.</li><li><strong>Puolisolmu:</strong> Kuten tasainen mutta vain toiseen suuntaan — syntyy kierre.</li></ul><p><strong>Ohje:</strong></p><ol><li>Leikkaa 8 lankaa, kukin 2 m pitkiä. Taita puoliksi ja ripusta kepille larkshead-solmulla.</li><li>Tee 3 tasaista solmua peräkkäin jokaisella 4 langan ryhmällä.</li><li>Vaihda ryhmiä: ota 2 lankaa viereisestä ryhmästä ja tee uusi solmu (luo verkkokuvion).</li><li>Jatka haluamasi pituuteen, viimeistele hajanaisilla langanpäillä.</li></ol>',
],
// ── PUUTARHA ─────────────────────────────────────────────
[
'id' => 'garden_tomatoes', 'emoji' => '🍅', 'title' => 'Tomaatit ruukussa — oma sato parvekkeelta',
'category' => 'puutarha', 'subcategory' => ['parvekeviljeily', 'vihannekset'], 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Parveketomaatti on helppo aloittelijan kasvi — ja oma sato maistuu aina kaupan tomaatilta paremmalta.',
'body' => '<p>Tomaatit viihtyvät mainiosti ruukussa, kunhan valitset parvekelajikkeen.</p><h3>Lajikkeen valinta</h3><p>Valitse <strong>parveketomaatti</strong> tai <strong>kirsikkatomaatti</strong> — ne kasvavat pieniksi ja sopivat ruukkuun. Isot beef-tomaatit tarvitsevat enemmän tilaa.</p><h3>Hoito-ohjeet</h3><ul><li>🌱 Istuta keväthallojen jälkeen (toukokuu) isoon ruukkuun (min. 15 litraa)</li><li>☀️ Tomaatti rakastaa aurinkoa — valitse valoisin paikka parvekkeella</li><li>💧 Kastele säännöllisesti, mutta älä anna seistä vedessä</li><li>🌿 Lannoita kerran viikossa tomaattilannoitteella kun kasvi alkaa kukkia</li><li>✂️ Poista sivuversot (hanganversot) kasvun aikana</li></ul><p>Ensimmäinen oma tomaatti on kuin pieni ihme! 🍅</p>',
],
[
'id' => 'garden_herbs', 'emoji' => '🌿', 'title' => 'Yrttipuutarha ikkunalaudalle',
'category' => 'puutarha', 'subcategory' => ['parvekeviljeily'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Tuoreita yrttejä suoraan ikkunalaudalta — basilika, persilja ja ruohosipuli onnistuvat helposti.',
'body' => '<p>Yrttipuutarha on helpoin tapa aloittaa viljely. Pienikin ikkunalauta riittää!</p><h3>Parhaat yrtit aloittelijalle</h3><ul><li>🌿 <strong>Basilika</strong> — haluaa lämpöä ja valoa, pidä kosteana</li><li>🌱 <strong>Ruohosipuli</strong> — kestävin, sietää hieman varjoa</li><li>🪴 <strong>Persilja</strong> — kasvaa hitaasti mutta on kestävä</li><li>🍃 <strong>Minttu</strong> — kasvaa niin reippaasti, pidä omassa ruukussa!</li></ul><h3>Hoitovinkit</h3><ul><li>Käytä yrttiä säännöllisesti — leikkaaminen edistää kasvua</li><li>Kastele mieluiten alta (aseta lautaselle vettä)</li><li>Ikkunalaudalla etelään päin on paras paikka</li></ul><p>Tuore basilika pastaan tai ruohosipuli munakkaaseen — yksinkertaiset ilot ovat parhaita! 🌞</p>',
],
[
'id' => 'garden_strawberries', 'emoji' => '🍓', 'title' => 'Mansikat parvekkeen laatikoissa',
'category' => 'puutarha', 'subcategory' => ['parvekeviljeily', 'vihannekset'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Mansikat viihtyvät hyvin parvekkeen laatikoissa — kesä on makulomaa kun omat mansikat kypsyvät.',
'body' => '<p>Mansikka on yksi parhaista parvekekasveista — helppohoitoinen ja tuottava!</p><h3>Istutus</h3><ul><li>Osta taimia puutarhamyymälästä toukokuussa</li><li>Käytä pitkää, matalaa laatikoita tai amppeliruukkuja</li><li>Sekoita multaan hieman hiekkaa — mansikka ei pidä seisovasta vedestä</li></ul><h3>Hoito</h3><ul><li>💧 Kastele päivittäin kuumalla säällä — multaa ei saa päästää kuivumaan</li><li>🌿 Lannoita kerran viikossa mansikkalannoitteella</li><li>✂️ Poista rönsyt (pitkät varret) ellei halua lisätä taimia</li></ul><p>Ensimmäinen oma mansikka suusta — sen makua ei unohda! 🍓</p>',
],
[
'id' => 'garden_sunflowers', 'emoji' => '🌻', 'title' => 'Auringonkukat — ilon kasvattajia',
'category' => 'puutarha', 'subcategory' => ['kukat'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Auringonkukka on helpoin kukkakasvi — siemenet maan ja kesän lopussa on metrin taimi.',
'body' => '<p>Auringonkukka piristää koko naapuruston ja kasvaa lähes itsekseen!</p><h3>Kylvö ja kasvatus</h3><ul><li>Kylvä toukokuussa suoraan maahan tai isoon ruukkuun</li><li>Peitä siemen noin 2 cm mullalla</li><li>Kastele säännöllisesti, varsinkin idätysvaiheessa</li><li>Harvenna taimet niin ettei jää liian tiuhaan</li></ul><h3>Vinkit</h3><ul><li>☀️ Täysi aurinko on ehdoton — varjossa kasvi ei kuki kunnolla</li><li>🌬️ Tukipuu pitkille lajikkeille — tuuli kaataa helposti</li><li>🐝 Auringonkukka houkuttelee mehiläisiä — hyvä koko puutarhalle</li></ul><p>Elokuussa voit korjata siemenet — ne maistuvat paahdettuna! 🌻</p>',
],
// ── SISUSTUS ─────────────────────────────────────────────
[
'id' => 'deco_flea_market', 'emoji' => '🏺', 'title' => 'Kirpputorilöydöt sisustukseen',
'category' => 'sisustus', 'subcategory' => ['muut'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Parhaat sisustushelmet löytyvät kirpputoreilta — vinkit mitä etsiä ja miten hyödyntää.',
'body' => '<p>Kirpputorit ovat aarreaittoja sisustajalle. Tässä vinkkini parhaiden löytöjen tekemiseen!</p><h3>Mitä kannattaa etsiä</h3><ul><li>🕯️ <strong>Kynttilänjalat ja maljakot</strong> — näistä maksetaan kaupoissa paljon, kirpparilla saa euroilla</li><li>🖼️ <strong>Taulut ja peilit</strong> — vanhat kultakehyksiset peilit ovat trendikkäitä</li><li>🧺 <strong>Korit ja säilytysastiat</strong> — rottinkikorit ovat aina käyttökelpoisia</li><li>🪑 <strong>Tuolit</strong> — vanha tuoli uudella verhoilukankaalla muuttuu täysin</li></ul><h3>Maalaamisen taito</h3><p>Lähes mikä tahansa kirpparilöytö paranee maalaamalla. Kreidemaali tarttuu hyvin ilman pohjamaaliakin ja luo kauniin mattapinnan. Suosikkivärejäni ovat valkoinen, savia ja tummanvihreä.</p><p>Parhaat löydöt odottavat sinua! 🔍</p>',
],
[
'id' => 'deco_candles', 'emoji' => '🕯️', 'title' => 'Kynttilät tunnelman luojina',
'category' => 'sisustus', 'subcategory' => ['valaistus'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Kynttilät ovat halvin ja tehokkain tapa muuttaa huoneen tunnelma — vinkit niiden käyttöön.',
'body' => '<p>Kynttilät ovat sisustuksen salaisin ase. Tässä miten käytän niitä kotonani:</p><h3>Ryhmittely toimii</h3><p>Älä laita yksittäisiä kynttilöitä ympäri huonetta — ryhmittele niitä kolmen tai viiden ryhmiin. Eri korkuiset kynttilät samalla tasolla luovat kauniin asetelman.</p><h3>Kynttilänjalat</h3><ul><li>Lasiset ja metallisiaset yhdistyvät hyvin</li><li>Luonnolliset materiaalit (puu, kivi) sopivat skandinaaviseen tyyliin</li><li>Kirpparilta löytää parhaita!</li></ul><h3>Turvallisuus</h3><ul><li>Älä jätä kynttilää palaamaan ilman valvontaa</li><li>LED-kynttilät ovat hyvä vaihtoehto lapsiperheen kotiin</li></ul><p>Hämärässä kynttilänvalossa kaikki tuntuu paremmalta. 🕯️</p>',
],
[
'id' => 'deco_gallery_wall', 'emoji' => '🖼️', 'title' => 'Gallerioseinä kotiin — näin se onnistuu',
'category' => 'sisustus', 'subcategory' => ['diy'], 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Gallerioseinä on tehokkain tapa tuoda persoonallisuutta kotiin. Tässä ohjeet suunnitteluun ja toteutukseen.',
'body' => '<p>Gallerioseinä kuulostaa hankalalta mutta onnistuu helposti kun suunnittelee ensin!</p><h3>Suunnittelu</h3><ol><li>Valitse seinä — mieluiten suuri yhtenäinen pinta</li><li>Kokoa taulut, valokuvat, peilit — sekoita rohkeasti eri kokoja</li><li>Asettele ne ensin lattialle ja kokeile erilaisia järjestyksiä</li><li>Ota kuva puhelimella kun löydät mieluisan järjestyksen</li></ol><h3>Ripustus</h3><ul><li>Aloita keskimmäisestä taulusta, laajene siitä ulospäin</li><li>Käytä paperimalleja — leikkaa taulujen kokoiset paperit ja teippaa seinälle ensin</li><li>Command-strips ovat ystävällisiä seinälle (ei reikiä!)</li></ul><p>Oma gallerioseinä on kuin kotimuseo parhaista muistoistasi! 🖼️</p>',
],
// ── KIRJAT ───────────────────────────────────────────────
[
'id' => 'book_summer_reads', 'emoji' => '📖', 'title' => 'Kesän lukuvinkit — kirjoja jotka upposi',
'category' => 'kirjat', 'subcategory' => ['romaanit'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Kolme kirjaa joihin upposi tänä kesänä — vaihtelevaa luettavaa eri mielentiloihin.',
'body' => '<p>Kesä on parasta lukuaikaa. Tässä kolme kirjaa jotka pysäyttivät minut:</p><h3>1. Jännitys</h3><p>Pohjoismainen jännityskirjallisuus ei petä koskaan. Tunnelma, kylmä ilmasto ja monimutkaiset hahmot tekevät siitä koukuttavaa. Etsi kirjastosta suomalaisia tai ruotsalaisia rikosromaaneja.</p><h3>2. Kevyt kesälukeminen</h3><p>Välillä tarvitaan kirja jossa on hyvä loppu. Romantiikka tai humoristinen kotimainen proosa sopii täydellisesti mökkilaiturin tunnelmaan.</p><h3>3. Tarina joka jäi mieleen</h3><p>Paras kesäkirja on se johon palaa ajatuksissaan vielä syksyllä. Sellainen löytyy usein yllättäen — anna kirjaston vinkata!</p><p>Hyvää lukuhetkeä! 📚</p>',
],
[
'id' => 'book_audiobooks', 'emoji' => '🎧', 'title' => 'Äänikirjat — luen nyt enemmän kuin koskaan',
'category' => 'kirjat', 'subcategory' => ['muut'], 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Äänikirjat muuttivat tapani "lukea" — kuuntelen nykyään keittiössä, lenkillä ja käsitöitä tehdessä.',
'body' => '<p>Äänikirjat ovat mullistaneet lukuharrastukseni. Tässä miksi suosittelen:</p><h3>Milloin kuuntelen</h3><ul><li>🍳 Ruoanlaittoa ja tiskailua</li><li>🚶 Kävelylenkeillä</li><li>🧶 Neulomisen tai virkkaamisen aikana</li><li>🚗 Automatkoilla</li></ul><h3>Palvelut</h3><ul><li><strong>Storytel</strong> — suuri suomenkielinen valikoima</li><li><strong>Kirjasto</strong> — monella kirjastolla on ilmaisia äänikirjoja (Ellibs, OverDrive)</li><li><strong>Spotify</strong> — löytyy myös joitain äänikirjoja</li></ul><p>Vinkki: Aloita hitaammalla puhenopeudella (0.9×) jos et ole tottunut. Sopeutut nopeasti ja voit nostaa tahdin! 🎧</p>',
],
// ── HYVINVOINTI ──────────────────────────────────────────
[
'id' => 'wellness_morning', 'emoji' => '🌅', 'title' => 'Aamurutiini joka oikeasti toimii',
'category' => 'hyvinvointi', 'subcategory' => ['mieli'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Kolme pientä muutosta aamuun jotka muuttivat koko päivän laadun.',
'body' => '<p>Olen kokeillut monia aamurutiinejä. Tässä se mikä oikeasti toimii minulle:</p><h3>1. Puhelin pois ensimmäiseksi puoleksi tunniksi</h3><p>En katso puhelinta ennen kuin olen juonut kahvin. Tuntuu aluksi vaikealta, mutta mieli on paljon rauhallisempi koko aamun.</p><h3>2. Lasi vettä heti herätessä</h3><p>Ennen kahvia. Keho on kuivunut yön aikana ja vesi käynnistää aineenvaihdunnan.</p><h3>3. Jokin asia joka ilahduttaa</h3><p>Minulle se on rauhallinen kahvihetki ikkunan ääressä. Sinulle se voi olla lenkki, meditaatio tai hyvä podcast. Viisi minuuttia riittää.</p><p>Et tarvitse täydellistä aamurutiinia — tarvitset vain kolme pientä asiaa. 🌅</p>',
],
[
'id' => 'wellness_yoga', 'emoji' => '🧘', 'title' => 'Kotijoogaa aloittelijalle — 15 min päivässä',
'category' => 'hyvinvointi', 'subcategory' => ['liikunta'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Et tarvitse joogastudiota tai erityisiä vaatteita — tässä helppo aloitus kotona.',
'body' => '<p>Jooga tuntuu pelottavalta aloittaa mutta on itse asiassa hyvin helppo! Tässä oma 15 min aloittelijan ohjelma:</p><h3>Alkuasento: Lapsen asento (Balasana)</h3><p>Polvillaan, istuen kantapäillä, kädet edessä lattialla. Hengitä syvään 5 kertaa. Rentouttaa selkää ja rauhoittaa mielen.</p><h3>Koira katsoo alas (Downward Dog)</h3><p>Kädet ja jalat lattialla, lantio ylös — muodostuu kolmio. Kantapäät kohti lattiaa (ei haittaa vaikka eivät yletä). 5 hengitystä.</p><h3>Soturi I (Warrior I)</h3><p>Hyvä asento alaraajoihin. Yksi jalka eteen, toinen taakse, kädet ylös. Pidä 5 hengitystä, vaihda puoli.</p><p>YouTube on täynnä ilmaisia aloittelijaohjeita — hae "jooga aloittelijoille suomi"! 🧘</p>',
],
[
'id' => 'wellness_sleep', 'emoji' => '😴', 'title' => 'Parempi uni — vinkit jotka toimivat',
'category' => 'hyvinvointi', 'subcategory' => ['uni'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Nukuin huonosti vuosia ennen kuin opin nämä yksinkertaiset asiat.',
'body' => '<p>Uni on tärkein hyvinvoinnin pilari, mutta niin monelle se on haasteellista. Tässä mitä minulle toimi:</p><h3>Illalla</h3><ul><li>📵 <strong>Puhelin pois tunnin ennen nukkumaanmenoa</strong> — sininen valo häiritsee melatoniinia</li><li>🌡️ <strong>Viileä makuuhuone</strong> (1618°C on ihanteellinen)</li><li>📖 <strong>Kirja tai rauhoittava podcast</strong> — ei uutisia tai someselailua</li></ul><h3>Aamulla</h3><ul><li>☀️ <strong>Luonnonvalo heti herätessä</strong> — auttaa vuorokausirytmiä</li><li>⏰ <strong>Sama heräämisaika joka päivä</strong> — myös viikonloppuisin</li></ul><p>Nukkuminen ei parane yhdessä yössä, mutta jo viikon rutiinilla huomaa eron. 😴</p>',
],
[
'id' => 'wellness_forest', 'emoji' => '🌲', 'title' => 'Metsäkävelyjen taika',
'category' => 'hyvinvointi', 'subcategory' => ['liikunta', 'mieli'], 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Tutkimukset vahvistavat sen minkä jokainen suomalainen jo tietää: metsässä oleminen tekee hyvää.',
'body' => '<p>Olen alkanut käydä metsässä vähintään kerran viikossa, ja muutos hyvinvoinnissani on selvä.</p><h3>Miksi metsä auttaa?</h3><ul><li>🌿 Fytonsidit — puiden erittämät yhdisteet alentavat stressihormoneja</li><li>👁️ Vihreä väri rauhoittaa hermostoa</li><li>🔇 Hiljaisuus tai luonnon äänet antavat aivoille lepoa</li><li>🚶 Epätasainen maasto aktivoi kehoa eri tavalla kuin asfaltti</li></ul><h3>Miten lähden metsään?</h3><p>En lataa podcastia. En kuuntele musiikkia. Vain minä ja metsä. Aluksi hiljaisuus tuntuu oudolta — pian se tuntuu parhaimmalta asialta maailmassa.</p><p>Jopa 20 minuuttia metsässä laskee verenpainetta. Kokeile! 🌲</p>',
],
// ── LEMMIKIT ─────────────────────────────────────────────
[
'id' => 'pet_dog_training', 'emoji' => '🐕', 'title' => 'Koiran peruskoulutus kotona',
'category' => 'lemmikit', 'subcategory' => ['koirat'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Istu, maahan ja paikka onnistuvat kotona ilman kouluttajaa — kärsivällisyys on avain.',
'body' => '<p>Kouluttanut koiriani itse jo 15 vuotta. Tässä parhaat peruskäskyt ja vinkit:</p><h3>Perusperiaatteet</h3><ul><li>✅ <strong>Positiivinen vahvistaminen</strong> — palkitse onnistumiset, älä rankaise epäonnistumisia</li><li>⏱️ <strong>Lyhyet harjoitustuokiot</strong> — 510 min kerrallaan, useita päivässä</li><li>🔄 <strong>Johdonmukaisuus</strong> — kaikki perheenjäsenet käyttävät samoja käskyjä</li></ul><h3>Istu-käsky</h3><ol><li>Pidä herkku nenän edessä</li><li>Vie herkku hitaasti koiran pään yli taaksepäin</li><li>Koira istuu automaattisesti seuratessaan herkkua</li><li>Sano "istu" juuri kun takamus osuu lattiaan</li><li>Palkitse heti!</li></ol><p>Koiran kouluttaminen on mukavaa yhdessäoloa. Nauti siitä! 🐕</p>',
],
[
'id' => 'pet_cat_enrichment', 'emoji' => '🐈', 'title' => 'Kissan elämää rikastuttavat aktiviteetit',
'category' => 'lemmikit', 'subcategory' => ['kissat'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Sisäkissa tarvitsee virikkeita — nämä helpot ideat pitävät kissan virkeänä ja onnellisena.',
'body' => '<p>Sisäkissa elää pitkän ja terveen elämän, mutta tarvitsee virikkeita. Tässä mitä meillä toimii:</p><h3>Päivittäiset leikkituokiot</h3><ul><li>🪄 <strong>Sulkasauva</strong> — simuloi saaliin liikettä, aktivoi metsästysvaiston</li><li>🔴 <strong>Laserpiste</strong> — loistava liikuttaja, mutta lopeta aina oikeaan leluun niin kissa saa "saaliin"</li><li>📦 <strong>Pahvilaatikot</strong> — kissan suosikki, täysin ilmainen!</li></ul><h3>Ympäristön rikastaminen</h3><ul><li>🪟 Kissanikkuna tai hylly ikkunan eteen — kissa voi seurata lintuja</li><li>🌿 Kissanruoho (catnip tai valerian) — osa kissoista rakastaa</li><li>🗼 Kiipeilyteline — kissa haluaa olla korkealla</li></ul><p>15 minuuttia leikkiä päivässä tekee isoja ihmeitä! 🐈</p>',
],
[
'id' => 'pet_winter', 'emoji' => '❄️', 'title' => 'Lemmikki talvella — vinkit kylmään aikaan',
'category' => 'lemmikit', 'subcategory' => ['muut'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Kylmä talvi tuo omat haasteensa lemmikkien hoidossa — nämä vinkit auttavat.',
'body' => '<p>Suomen talvi on rankka sekä meille että lemmikeillämme. Tässä mitä olen oppinut:</p><h3>Koiran talvihoito</h3><ul><li>🧥 Lyhytkarvaiset rodut tarvitsevat takin — ne eivät ole turhia hempeilyjä</li><li>🐾 Tarkista tassuista suolan aiheuttamat haavat lenkiltä palatessa</li><li>🛁 Pese tassu suolosta lenkiltä tultuasi, tai käytä tassusuojaa</li><li>⏱️ Lyhennä lenkki pakkasen kiristyessä alle -20°C</li></ul><h3>Kissan talvi</h3><ul><li>🔥 Varmista ettei kissa nuku liian lähellä lämpöpatteria — kuivattaa ihoa</li><li>💧 Lisää vesipisteitä — talvi-ilma on kuivaa</li></ul><p>Lemmikki ei valita — sinun tehtäväsi on huomata! ❄️</p>',
],
// ── KASVIT ───────────────────────────────────────────────
[
'id' => 'plant_beginners', 'emoji' => '🪴', 'title' => 'Helpoimmat huonekasvit — ei voi tappaa',
'category' => 'kasvit', 'subcategory' => ['huonekasvit'], 'author' => 'Sinikka', 'type' => 'post',
'desc' => 'Jos olet tappanu jokaisen kasvin jonka olet ostanut, nämä lajikkeet ovat sinulle.',
'body' => '<p>Kaikki voivat kasvattaa huonekasveja! Avain on valita oikea kasvi oikeaan paikkaan.</p><h3>Top 4 helpointa</h3><ul><li>🌵 <strong>Aloe vera</strong> — kastele kerran kahdessa viikossa, rakastaa aurinkoa. Täysin anteeksiantava!</li><li>💚 <strong>Pothos (viinikasvi)</strong> — viihtyy varjossakin, juontuu vedessä, kasvaa milloin tahansa</li><li>🪨 <strong>Mehikasvit</strong> — kastele kerran kuussa, älä enempää. Ikkunalauta riittää.</li><li>🌱 <strong>Sansevieria (anoppien kieli)</strong> — kestää kuivuutta, varjoa, lähes kaiken</li></ul><h3>Yleisin virhe</h3><p>Liikakastelu tappaa enemmän kasveja kuin kuivuus. Epäillessäsi — älä kastele. Enemmän on harvoin parempi. 💧</p>',
],
[
'id' => 'plant_monstera', 'emoji' => '🌿', 'title' => 'Monstera — kuningattaren hoito-opas',
'category' => 'kasvit', 'subcategory' => ['huonekasvit'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Monstera deliciosa on tämän hetken suosituin huonekasvi — ja hyvästä syystä. Tässä kaikki mitä sen hoidosta pitää tietää.',
'body' => '<p>Monstera on upea kasvi johon rakastuin heti. Tässä mitä olen oppinut sen hoidosta:</p><h3>Valo</h3><p>Epäsuora kirkas valo on paras. Suora aurinko polttaa lehdet. Sopii hyvin ikkunan viereen etelä- tai länsiseinustalle.</p><h3>Kastelu</h3><p>Kastele kun ylimmäinen 5 cm multaa on kuivaa. Talvella harvemmin kuin kesällä. Käytä huoneenlämpöistä vettä.</p><h3>Lannoitus</h3><p>Kasvukaudella (maaliselokuu) kerran kuussa nesteylannoitteella. Talvella ei tarvita.</p><h3>Tukikeppi</h3><p>Monstera haluaa kiivetä. Sammalpatsas (moss pole) pitää kasvun pystysuorana ja lehdet kasvavat isommiksi!</p><p>Palkitsevin kasvi jonka minulla on. 🌿</p>',
],
[
'id' => 'plant_seeds', 'emoji' => '🌱', 'title' => 'Kasvien kasvatus siemenistä — kevätprojekti',
'category' => 'kasvit', 'subcategory' => ['puutarhakasvit'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Oman kasvin kasvattaminen siemenestä on tyydyttävintä mitä puutarhassa voi tehdä.',
'body' => '<p>Kun ensimmäinen oma taimi nousee mullasta, tuntuu kuin olisi luonut jotain ihmeellistä.</p><h3>Milloin aloittaa?</h3><p>Helmikuumaaliskuu on hyvä aika aloittaa sisäkylvöt. Taimet siirretään ulos toukokuussa hallojen jälkeen.</p><h3>Mitä tarvitaan?</h3><ul><li>🌱 Kylvömultaa — tavallinen multaa on liian raskas</li><li>☀️ Valoa — ikkunalauta tai kasvivalo</li><li>💧 Tasainen kosteus — älä päästä kylvöalustaa kuivumaan</li><li>🌡️ Lämpöä — 2022°C on ihanteellinen itämislämpötila</li></ul><h3>Helpot aloittelijakasvit siemenestä</h3><ul><li>🌻 Auringonkukka — nopea, iso ja näyttävä</li><li>🌿 Basilika — hyödyllinen ja nopea</li><li>🥬 Salaatti — kerätään jo 46 viikossa</li></ul><p>Aloita pienestä, nauti prosessista! 🌱</p>',
],
// ── MATKUSTUS ────────────────────────────────────────────
[
'id' => 'travel_lapland', 'emoji' => '🏔️', 'title' => 'Lappi talvella — ensikertalaiselle',
'category' => 'matkustus', 'subcategory' => ['suomi'], 'author' => 'Tiina K.', 'type' => 'post',
'desc' => 'Lapin talvimatka on elämys — mutta se kannattaa suunnitella etukäteen. Tässä vinkit ensimmäiselle kerralle.',
'body' => '<p>Kävin Lapissa talvella ensimmäistä kertaa viime vuonna. Ei jäänyt viimeiseksi! Tässä mitä opin:</p><h3>Milloin mennä?</h3><p><strong>Joulukuutammikuu:</strong> Kaamos, revontulet, luminen maisema. Kylmintä.<br><strong>Helmikuumaaliskuu:</strong> Aurinkoisempaa, revontulien sesonki, hieman lämpimämpää. Suosikkini!</p><h3>Mitä tehdä?</h3><ul><li>🌌 <strong>Revontulet</strong> — varaa selkeä yö ja mene pois kaupunkivaloista</li><li>🎿 <strong>Murtomaahiihto</strong> — latuverkostot ovat erinomaisia</li><li>🐕 <strong>Huskyajelu</strong> — kallis mutta elämys</li><li>🛷 <strong>Poroajelu</strong> — rauhallisempi vaihtoehto</li></ul><h3>Vaatetus</h3><p>Kerrosvaatetus on avain. Villakerros, fleece, tuulensuoja ja toppatakki päälle. Kunnolliset talvikengät — älä aliarvio! 🧥</p>',
],
[
'id' => 'travel_tallinn', 'emoji' => '🏛️', 'title' => 'Tallinna viikonlopuksi — parhaat vinkit',
'category' => 'matkustus', 'subcategory' => ['eurooppa'], 'author' => 'Maija-Liisa', 'type' => 'post',
'desc' => 'Tallinna on ihanteellinen lähimatka — laivalla sinne, historiallinen vanha kaupunki, hyvä ruoka.',
'body' => '<p>Tallinna on suomalaisten klassinen kohde syystä. Tässä omat suosikkini:</p><h3>Vanha kaupunki</h3><p>Raatihuoneentori on must — mutta mene sinne aamulla ennen turistiruuhkaa. Illalla torilla on paljon baareja, päivällä enemmän tilaa ihailla arkkitehtuuria.</p><h3>Syöminen</h3><ul><li>🥣 <strong>Leib Restaurant</strong> — paikallista fermentoitua ruokaa, täytyy varata pöytä</li><li>🍺 <strong>Põhjala Tap Room</strong> — virolainen panimoravintola, hyvät craft-oluet</li><li>🥐 <strong>Kohvik Von Krahli Aed</strong> — hyvä brunssi</li></ul><h3>Käytännön vinkit</h3><ul><li>💶 Käteinen kannattaa — monessa paikassa ei oteta korttia</li><li>🚶 Vanha kaupunki on pieni — kaikki kannattaa kävellä</li><li>🛒 Kauppahalli (Balti Jaam Market) — paikallinen tunnelma</li></ul>',
],
[
'id' => 'travel_saaristo', 'emoji' => '⛵', 'title' => 'Saaristo-Suomi kesällä — veneellä tai laivalla',
'category' => 'matkustus', 'subcategory' => ['suomi'], 'author' => 'Riitta H.', 'type' => 'post',
'desc' => 'Suomen saaristo on yksi maailman kauneimmista — ja helposti saavutettavissa myös ilman venettä.',
'body' => '<p>Saaristo kesällä on suomalaisen maiseman parhaimmistoa. Tässä miten pääset nauttimaan siitä:</p><h3>Ilman venettä</h3><ul><li>⛴️ <strong>Yhteysalukset</strong> — Saaristomeren alueella kulkee säännöllisiä linjoja</li><li>🏨 <strong>Saaristohotellit</strong> — mukava tapa yöpyä saarella ilman omaa venettä</li><li>🚲 <strong>Pyöräveneellä</strong> — joillain saarilla voi vuokrata pyörän ja lautan yhdistelmän</li></ul><h3>Veneen kanssa</h3><p>Jos sinulla on vene tai pääset tutun kyydissä, avautuvat saariston parhaat paikat. Pienet luodot, uimarannat joihin ei muuten pääse, hiljaiset lahdet — se on Suomea parhaimmillaan.</p><p>Saaristo odottaa! ⛵</p>',
],
];
}
function getOrInitPosts(): array {
if (!file_exists(DATA_DIR . 'posts.json')) {
$posts = defaultPosts();
writeData('posts.json', $posts);
return $posts;
}
return readData('posts.json', []);
}
function getOrInitCategories(): array {
if (!file_exists(DATA_DIR . 'categories.json')) {
$cats = defaultCategories();
writeData('categories.json', $cats);
return $cats;
}
$cats = readData('categories.json', []);
// Merge in subcategories (and new ones) from defaults if missing
$defaults = defaultCategories();
$defaultMap = [];
foreach ($defaults as $d) { $defaultMap[$d['id']] = $d; }
$changed = false;
foreach ($cats as &$cat) {
$defSubs = $defaultMap[$cat['id']]['subcategories'] ?? [];
if (!isset($cat['subcategories'])) {
$cat['subcategories'] = $defSubs;
$changed = true;
} else {
// Add any new subcategory ids from defaults that don't exist yet
$existingIds = array_column($cat['subcategories'], 'id');
foreach ($defSubs as $ds) {
if (!in_array($ds['id'], $existingIds)) {
$cat['subcategories'][] = $ds;
$changed = true;
}
}
}
}
unset($cat);
// Also append brand-new default categories that don't exist in file yet
$existingCatIds = array_column($cats, 'id');
foreach ($defaults as $def) {
if (!in_array($def['id'], $existingCatIds)) {
$cats[] = $def;
$changed = true;
}
}
if ($changed) writeData('categories.json', $cats);
return $cats;
}
// ─── Routing ───────────────────────────────────────────────────
switch ($action) {
case 'posts':
ok(['posts' => getOrInitPosts()]);
case 'categories':
ok(['categories' => getOrInitCategories()]);
case 'likes':
$likes = readData('likes.json', new stdClass());
$userLikes = $_SESSION['user_likes'] ?? [];
ok(['likes' => $likes, 'userLikes' => $userLikes]);
case 'toggle_like':
$postId = $body['postId'] ?? '';
if (!$postId) err('Missing postId');
$likes = readData('likes.json', []);
$userLikes = $_SESSION['user_likes'] ?? [];
$idx = array_search($postId, $userLikes, true);
if ($idx === false) {
$likes[$postId] = ($likes[$postId] ?? 0) + 1;
$userLikes[] = $postId;
$liked = true;
} else {
$likes[$postId] = max(0, ($likes[$postId] ?? 1) - 1);
array_splice($userLikes, $idx, 1);
$liked = false;
}
$_SESSION['user_likes'] = array_values($userLikes);
writeData('likes.json', $likes);
ok(['liked' => $liked, 'count' => $likes[$postId] ?? 0]);
case 'comments':
$postId = $_GET['postId'] ?? '';
$comments = readData('comments.json', []);
ok(['comments' => $comments[$postId] ?? []]);
case 'add_comment':
$postId = $body['postId'] ?? '';
$name = trim($body['name'] ?? '');
$text = trim($body['text'] ?? '');
if (!$postId || !$name || !$text) err('Missing fields');
$now = time();
$win = 10 * 60;
$times = array_values(array_filter($_SESSION['comment_times'] ?? [], fn($t) => $now - $t < $win));
if (count($times) >= 3) err('Liian monta kommenttia. Odota hetki.');
$times[] = $now;
$_SESSION['comment_times'] = $times;
$comments = readData('comments.json', []);
if (!isset($comments[$postId])) $comments[$postId] = [];
$comment = [
'name' => htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8'),
'text' => htmlspecialchars($text, ENT_QUOTES | ENT_HTML5, 'UTF-8'),
'time' => date('d.m.Y'),
];
$comments[$postId][] = $comment;
writeData('comments.json', $comments);
ok(['comment' => $comment]);
case 'add_post':
$post = $body['post'] ?? [];
if (empty($post['title'])) err('Missing title');
$post['id'] = preg_replace('/[^a-z0-9_]/', '', strtolower($post['id'] ?? '')) ?: 'post_' . time();
$posts = getOrInitPosts();
$posts[] = $post;
writeData('posts.json', $posts);
ok();
case 'update_post':
if (!isAdmin()) err('Unauthorized', 403);
$post = $body['post'] ?? [];
if (empty($post['id'])) err('Missing id');
$posts = getOrInitPosts();
foreach ($posts as &$p) {
if ($p['id'] === $post['id']) { $p = $post; break; }
}
unset($p);
writeData('posts.json', $posts);
ok();
case 'delete_post':
if (!isAdmin()) err('Unauthorized', 403);
$id = $body['id'] ?? '';
if (!$id) err('Missing id');
$posts = array_values(array_filter(getOrInitPosts(), fn($p) => ($p['id'] ?? '') !== $id));
writeData('posts.json', $posts);
ok();
case 'save_categories':
if (!isAdmin()) err('Unauthorized', 403);
writeData('categories.json', $body['categories'] ?? []);
ok();
case 'seed_posts':
if (!isAdmin()) err('Unauthorized', 403);
$posts = defaultPosts();
writeData('posts.json', $posts);
ok(['count' => count($posts)]);
case 'seed_categories':
if (!isAdmin()) err('Unauthorized', 403);
$cats = defaultCategories();
writeData('categories.json', $cats);
ok(['count' => count($cats)]);
case 'admin_login':
if (($body['password'] ?? '') === ADMIN_PASSWORD) {
$_SESSION['tykkaafi_admin'] = true;
ok();
}
err('Väärä salasana');
case 'admin_logout':
$_SESSION['tykkaafi_admin'] = false;
ok();
case 'admin_check':
ok(['loggedIn' => isAdmin()]);
default:
err('Unknown action');
}