From 0bfd7db42a17f49fddbcef4c9285e6b9a5b7aaf6 Mon Sep 17 00:00:00 2001 From: Martin Dvorak Date: Mon, 14 Sep 2026 15:35:38 +0200 Subject: [PATCH] 1984 - George Orwille - Czech Maturita Readings --- cetba.c | 890 +++++++++++++++++++++++++++++++++++++++++++++++++++++ czech.c | 6 + i18n.c | 20 ++ icons.c | 189 ++++++++++++ main.c | 6 + maturita.h | 16 + style.css | 123 ++++++++ 7 files changed, 1250 insertions(+) create mode 100644 cetba.c diff --git a/cetba.c b/cetba.c new file mode 100644 index 0000000..db8ad15 --- /dev/null +++ b/cetba.c @@ -0,0 +1,890 @@ +#include "maturita.h" + +/* ------------------------------------------------------------------ */ +/* Maturitní četba: George Orwell – 1984 */ +/* ------------------------------------------------------------------ */ + +typedef struct { + const char *q; + const char *opts[4]; + int correct; + const char *expl; +} LitQ; + +static const LitQ lit_qs[] = { + { + "Kdo je hlavní hrdina románu a co dělá?", + { + "Winston Smith – přepisuje historii na Ministerstvu pravdy", + "O'Brien – řídí Ministerstvo lásky", + "Emmanuel Goldstein – vede Bratrstvo", + "Winston Smith – velí Policii myšlení", + }, + 0, + "Winston Smith je vnější člen strany, který na Ministerstvu pravdy " + "upravuje staré záznamy a novinové články.", + }, + { + "Ve kterém fiktivním státě se děj odehrává?", + {"V Eurasii", "V Oceánii", "Ve Východasii", "V Angsocu"}, + 1, + "Příběh se odehrává v Oceánii, v provincii Letopočet 1 (bývalá " + "Anglie), jejímž hlavním městem je Londýn.", + }, + { + "Co znamená slogan „VÁLKA JE MÍR, SVOBODA JE OTROCTVÍ, " + "NEVĚDOMOST JE SÍLA“?", + { + "Jsou to tři zásady Bratrstva", + "Jsou to názvy ministerstev", + "Jde o hesla prolety", + "Jsou to paradoxní hesla, kterými strana ospravedlňuje útlak", + }, + 3, + "Strana používá dvojité myšlení: hesla znějí vznešeně, ale ve " + "skutečnosti obhajují válku, otroctví a nevědomost.", + }, + { + "Kdo je Velký bratr a je reálnou osobou?", + { + "Skutečný vůdce Bratrstva", + "Winstonův nadřízený na ministerstvu", + "Symbol všemocné moci a kultu osobnosti; možná vůbec neexistuje", + "O'Brienův pseudonym", + }, + 2, + "Velký bratr je tvář režimu. Není jasné, zda jde o živou osobu, " + "nebo jen o symbol, který drží strach a poslušnost.", + }, + { + "Co je Newspeak (novořeč) a proč ho strana zavádí?", + { + "Tajná řeč Bratrstva", + "Zjednodušená angličtina omezující slovní zásobu, aby nešlo " + "vyslovit zakázané myšlenky", + "Úřední jazyk prolety", + "Šifra Policie myšlení", + }, + 1, + "Newspeak neustále ubírá slova. Když pro svobodu nebo odpor " + "neexistuje slovo, nelze o nich ani myslet.", + }, + { + "Co je teleobrazovka (telescreen) a jak funguje?", + { + "Televize určená jen pro zábavu", + "Zařízení, které vysílá i sleduje; nelze ji úplně vypnout", + "Rozhlasová stanice", + "Počítač Ministerstva pravdy", + }, + 1, + "Telescreen funguje obousměrně – neustále sleduje občany. Vypnout " + "lze jen zvuk, obraz běží dál.", + }, + { + "Jak se jmenují tři supervelmoci světa 1984?", + { + "Oceánie, Eurasie a Východasie", + "Oceánie, Evropa a Asie", + "Anglie, Eurasie a Ostasie", + "Oceánie, Východasie a Afrika", + }, + 0, + "Svět je rozdělen na tři státy ve věčném, ale nerozhodném " + "konfliktu: Oceánii, Eurasii a Východasii.", + }, + { + "Čím se zabývá Ministerstvo pravdy?", + { + "Vede válku", + "Dohlíží na morálku a sňatky", + "Upravuje a přepisuje historii, noviny a archivy", + "Rozděluje potraviny", + }, + 2, + "Ministerstvo pravdy vyrábí „pravdu“ – Winston v něm přepisuje " + "staré záznamy tak, aby vždy odpovídaly současné linii strany.", + }, + { + "K čemu slouží Ministerstvo lásky?", + { + "Zajišťuje sňatky a lásku", + "Je to budova bez oken, kde se mučí a likvidují nepřátelé strany", + "Vyrábí zbraně", + "Školí děti", + }, + 1, + "Ministerstvo lásky je opakem svého názvu – sídlí tam mučírny a " + "nachází se v něm i obávaná místnost 101.", + }, + { + "V čem je paradox Ministerstva hojnosti?", + { + "Má na starosti hospodářství, ale ve skutečnosti drží lidi " + "v nedostatku", + "Rozdává jídlo a zboží zdarma", + "Zajišťuje dostatek pro všechny", + "Starají se o něj prolety", + }, + 0, + "Ministerstvo hojnosti plánuje výrobu, ale ekonomika je záměrně " + "nastavena tak, aby lidé žili v trvalém nedostatku.", + }, + { + "Co je Ministerstvo míru a čím se zabývá?", + { + "Uzavírá mírové smlouvy", + "Dojednává příměří", + "Ve skutečnosti vede válku", + "Velí Policii myšlení", + }, + 2, + "Název je přesně opačný: Ministerstvo míru řídí válku, protože " + "trvalý válečný stav pomáhá udržet moc strany.", + }, + { + "Kdo je Julie a jaký vztah s ní Winston naváže?", + { + "Winstonova žena", + "Mladá členka strany, s níž Winston prožije tajnou milostnou " + "aféru", + "O'Brienova asistentka", + "Proletka a obchodnice", + }, + 1, + "Julie pracuje v oddělení beletrie a naoko je vzornou členkou " + "strany. S Winstonem vytvoří tajný milostný vztah.", + }, + { + "Proč je vztah Winstona a Julie zakázaný?", + { + "Strana zakazuje lásku a sexualitu jako zločin; vztah je navíc " + "tajný", + "Julie je vdaná za člena vnitřní strany", + "Winston je jejím nadřízeným", + "Julie patří k proletům", + }, + 0, + "Strana potlačuje citové a sexuální vazby, protože oddanost má " + "patřit jen straně. Tajný vztah je proto dvojnásob nebezpečný.", + }, + { + "Kdo je O'Brien a jakou roli hraje v příběhu?", + { + "Skutečný vůdce Bratrstva", + "Vysoce postavený člen vnitřní strany, který Winstona nakonec " + "mučí a „vyléčí“", + "Winstonův přítel z dětství", + "Proletářský básník", + }, + 1, + "Winston věří, že O'Brien je odbojář. Ve skutečnosti je to věrný " + "člen vnitřní strany, který ho dostane do místnosti 101.", + }, + { + "Co je Bratrstvo a existuje vůbec?", + { + "Skutečná armáda Oceánie", + "Náboženská organizace", + "Údajná tajná organizace odporu; není jisté, zda existuje", + "Odbory prolety", + }, + 2, + "Bratrstvo zmiňuje Goldstein i O'Brien, ale kniha nikdy nepotvrdí, " + "že doopravdy existuje – může jít o past strany.", + }, + { + "Kdo je Emmanuel Goldstein?", + { + "Ministr pravdy", + "Oficiální nepřítel státu a údajný vůdce Bratrstva", + "Winstonův kolega", + "Velký bratrův dvojník", + }, + 1, + "Goldstein je terčem dvouminutovky nenávisti. Má ztělesňovat " + "nepřítele, proti kterému strana sjednocuje občany.", + }, + { + "Co je dvojité myšlení (doublethink)?", + { + "Schopnost myslet ve dvou jazycích", + "Zdvojení osobnosti", + "Schopnost věřit dvěma protikladným tvrzením zároveň", + "Tajné zapisování myšlenek", + }, + 2, + "Dvojité myšlení je jádro stranické ideologie – člověk přijme i " + "zjevné rozpory, jako „válka je mír“.", + }, + { + "Proč strana neustále přepisuje minulost?", + { + "Aby opravila chyby v archivech", + "Aby měla vždy pravdu a nepřítel jí nemohl dokázat opak", + "Aby ušetřila papír", + "Aby potěšila prolety", + }, + 1, + "Kdo ovládá minulost, ovládá i budoucnost. Přepisováním historie " + "strana udržuje absolutní kontrolu nad pravdou.", + }, + { + "Co je zločin myšlení (thoughtcrime)?", + { + "Pouhá myšlenka nebo názor, který se nelíbí straně", + "Krádež státního majetku", + "Nelegální obchod", + "Opomenutí dvouminutovky", + }, + 0, + "Strana trestá už samotné myšlenky. Winston se proviní tím, že si " + "do deníku napíše „Dolů s Velkým bratrem“.", + }, + { + "Kdo je pan Charrington a jaké je jeho skutečné postavení?", + { + "Winstonův přítel a majitel hospody", + "Proletářský básník", + "Zdánlivě starý majitel obchodu, ve skutečnosti agent Policie " + "myšlení", + "Člen Bratrstva", + }, + 2, + "Charrington Winstonovi pronajme pokoj bez teleobrazovky, ale " + "právě on nakonec oba milence udá.", + }, + { + "Co je místnost 101?", + { + "Winstonova cela na policii", + "Skladiště knih", + "Místnost, ve které každého čeká jeho největší strach", + "Zasedací místnost vnitřní strany", + }, + 2, + "Místnost 101 je vrcholný mučicí nástroj. Winstonovi v ní hrozí " + "krysy – jeho největší fobie.", + }, + { + "Jak skončí vztah Winstona a Julie?", + { + "Utečou spolu do Eurasie", + "Vezmou se a žijí svobodně", + "Winston se stane členem Bratrstva", + "Zradí se a nakonec se přestanou milovat", + }, + 3, + "Oba jsou po mučení zlomení a vzájemně se zradí. Na konci už " + "k sobě nic necítí.", + }, + { + "Co znamená závěrečná věta „Miloval Velkého bratra“?", + { + "Winstonův vzdor se změnil v pokornou lásku k režimu", + "Winston se stal novým vůdcem", + "Byl to jen Winstonův sen", + "Julie mu to řekla", + }, + 0, + "Winston byl vnitřně zlomen. Přestal být sám sebou a nakonec " + "režim opravdu přijal za svůj.", + }, + { + "Které tvrzení NENÍ jedním z hlavních témat románu?", + { + "Moc a absolutní kontrola", + "Pravda a přepisování historie", + "Svoboda a identita", + "Idylický venkovský život", + }, + 3, + "1984 je temná antiutopie. Hlavními tématy jsou moc, kontrola, " + "manipulace s pravdou a ztráta svobody, ne venkovská idyla.", + }, + { + "V jakém roce byl román 1984 poprvé vydán?", + {"1936", "1949", "1954", "1984"}, + 1, + "Román vyšel v roce 1949; letopočet 1984 označuje blízkou " + "budoucnost, do níž Orwell příběh zasadil.", + }, + { + "Které další Orwellovo dílo se dá s 1984 srovnat?", + {"Farma zvířat", "Velký Gatsby", "Zločin a trest", "Babička"}, + 0, + "Obě Orwellova díla varují před totalitou. Farma zvířat ji líčí " + "alegoricky pomocí zvířat, 1984 očima jedince.", + }, + { + "Co je „dvouminutovka nenávisti“?", + { + "Krátká každodenní akce, při níž občané společně nenávidí " + "Goldsteina a nepřítele", + "Pravidelná modlitba ke Velkému bratrovi", + "Sportovní přestávka ve škole", + "Porada vedení ministerstva", + }, + 0, + "Slouží k uvolnění a přesměrování agrese občanů na nepřítele " + "státu, čímž strana posiluje svou moc.", + }, + { + "Proč je podle knihy válka pro systém nezbytná?", + { + "Přináší mír a blahobyt", + "Udržuje strach, spotřebovává výrobu a zachovává chudobu " + "i hierarchii", + "Rozvíjí vědu a techniku", + "Sjednocuje vládu s prolety", + }, + 1, + "Trvalá válka pohlcuje nadbytečnou produkci a udržuje lidi ve " + "strachu i chudobě, takže se nemohou vzbouřit.", + }, + { + "Jaký je rozdíl mezi vnějšími členy strany a prolety?", + { + "Proleti mají více práv než členové strany", + "Vnější členové jsou dozíráni, kdežto proleti žijí v chudobě " + "a strana o ně nestojí", + "Není mezi nimi žádný rozdíl", + "Proleti tvoří vedení strany", + }, + 1, + "Proleti tvoří asi 85 % obyvatel. Žijí v bídě a jsou považováni " + "za neškodné, dokud si neuvědomí svou sílu.", + }, + { + "Jak strana kontroluje sexualitu a osobní vztahy?", + { + "Podporuje volnou lásku a nezávislost", + "Potlačuje lásku a sexualitu, děti vede k oddanosti straně", + "Zakazuje veškerá manželství", + "Povoluje vztahy jen s prolety", + }, + 1, + "Strana chce, aby veškerá oddanost a energie patřily jí. Proto " + "podporuje zdrženlivost a vede děti v Antisexuální lize mládeže.", + }, + { + "Co symbolizuje papírové těžítko, které si Winston koupí?", + { + "Jeho nenávist ke Goldsteinovi", + "Kousek krásy a minulosti, kterou už nelze vrátit", + "Moc Velkého bratra", + "Lásku k Julii", + }, + 1, + "Těžítko je drobný, krásný předmět z minulosti. Pro Winstona " + "ztělesňuje svět, který strana zničila.", + }, + { + "Jaké poselství chtěl Orwell románem nejspíš předat?", + { + "Varování před totalitou a ztrátou svobody i pravdy", + "Oslavu technického pokroku", + "Návod, jak založit stát", + "Kritiku sportu a zábavy", + }, + 0, + "1984 je varování: když lidé přestanou bránit pravdu a svobodu, " + "mohou o ně nenávratně přijít.", + }, +}; + +#define LIT_NQ ((int)G_N_ELEMENTS(lit_qs)) + +typedef struct { + const LitQ *qs; + int n; + int idx; + int score; + int answered; + int finished; + GtkWidget *progress; + GtkWidget *score_lbl; + GtkWidget *prompt; + GtkWidget *grid; + GtkWidget *opts[4]; + GtkWidget *opt_lbl[4]; + GtkWidget *expl; + GtkWidget *next; +} LitQuiz; + +static void lit_quiz_show(LitQuiz *z) { + const LitQ *q = &z->qs[z->idx]; + char buf[128]; + + g_snprintf(buf, sizeof(buf), tr("lit_question_fmt"), z->idx + 1, z->n); + gtk_label_set_text(GTK_LABEL(z->progress), buf); + g_snprintf(buf, sizeof(buf), tr("lit_score_fmt"), z->score, z->n); + gtk_label_set_text(GTK_LABEL(z->score_lbl), buf); + + gtk_label_set_text(GTK_LABEL(z->prompt), q->q); + for (int i = 0; i < 4; i++) { + gtk_label_set_text(GTK_LABEL(z->opt_lbl[i]), q->opts[i]); + gtk_widget_remove_css_class(z->opts[i], "ok"); + gtk_widget_remove_css_class(z->opts[i], "wrong"); + gtk_widget_set_sensitive(z->opts[i], TRUE); + } + gtk_widget_set_visible(z->grid, TRUE); + gtk_widget_set_visible(z->expl, FALSE); + gtk_widget_set_visible(z->next, FALSE); + z->answered = 0; +} + +static void lit_quiz_finish(LitQuiz *z) { + char buf[128]; + + z->finished = 1; + gtk_label_set_text(GTK_LABEL(z->progress), tr("lit_finished")); + gtk_label_set_text(GTK_LABEL(z->prompt), tr("lit_finished_text")); + g_snprintf(buf, sizeof(buf), tr("lit_score_fmt"), z->score, z->n); + gtk_label_set_text(GTK_LABEL(z->score_lbl), buf); + gtk_widget_set_visible(z->grid, FALSE); + gtk_widget_set_visible(z->expl, FALSE); + gtk_widget_set_visible(z->next, TRUE); + gtk_button_set_label(GTK_BUTTON(z->next), tr("lit_again")); +} + +static void lit_opt_clicked(GtkButton *button, gpointer data) { + LitQuiz *z = data; + int chosen = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "idx")); + const LitQ *q; + char buf[128]; + + if (z->answered) + return; + z->answered = 1; + q = &z->qs[z->idx]; + + for (int i = 0; i < 4; i++) + gtk_widget_set_sensitive(z->opts[i], FALSE); + + gtk_widget_add_css_class(z->opts[q->correct], "ok"); + if (chosen == q->correct) + z->score++; + else + gtk_widget_add_css_class(z->opts[chosen], "wrong"); + + g_snprintf(buf, sizeof(buf), tr("lit_score_fmt"), z->score, z->n); + gtk_label_set_text(GTK_LABEL(z->score_lbl), buf); + + gtk_label_set_text(GTK_LABEL(z->expl), q->expl); + gtk_widget_set_visible(z->expl, TRUE); + + gtk_button_set_label(GTK_BUTTON(z->next), + z->idx + 1 >= z->n ? tr("lit_show_result") + : tr("lit_next")); + gtk_widget_set_visible(z->next, TRUE); +} + +static void lit_next_clicked(GtkButton *button, gpointer data) { + LitQuiz *z = data; + + (void)button; + + if (z->finished) { + z->finished = 0; + z->idx = 0; + z->score = 0; + lit_quiz_show(z); + return; + } + if (z->idx + 1 >= z->n) { + lit_quiz_finish(z); + return; + } + z->idx++; + lit_quiz_show(z); +} + +GtkWidget *build_cetba1984_quiz_page(void) { + GtkWidget *page; + GtkWidget *scroll; + GtkWidget *box; + GtkWidget *head; + LitQuiz *z = g_new0(LitQuiz, 1); + + z->qs = lit_qs; + z->n = LIT_NQ; + + page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_margin_start(page, 32); + gtk_widget_set_margin_end(page, 32); + gtk_widget_set_margin_top(page, 24); + gtk_widget_set_margin_bottom(page, 24); + + gtk_box_append(GTK_BOX(page), + top_bar("cetba1984", "lit_quiz_title", "lit_quiz_sub")); + + scroll = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_set_vexpand(scroll, TRUE); + gtk_widget_set_margin_top(scroll, 14); + gtk_box_append(GTK_BOX(page), scroll); + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 14); + gtk_widget_set_margin_start(box, 6); + gtk_widget_set_margin_end(box, 6); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), box); + + head = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); + gtk_box_append(GTK_BOX(box), head); + + z->progress = gtk_label_new(""); + gtk_widget_set_halign(z->progress, GTK_ALIGN_START); + gtk_widget_set_hexpand(z->progress, TRUE); + gtk_label_set_xalign(GTK_LABEL(z->progress), 0.0); + gtk_widget_add_css_class(z->progress, "lit-progress"); + gtk_box_append(GTK_BOX(head), z->progress); + + z->score_lbl = gtk_label_new(""); + gtk_widget_set_halign(z->score_lbl, GTK_ALIGN_END); + gtk_widget_add_css_class(z->score_lbl, "lit-score"); + gtk_box_append(GTK_BOX(head), z->score_lbl); + + z->prompt = gtk_label_new(""); + gtk_widget_set_halign(z->prompt, GTK_ALIGN_START); + gtk_label_set_wrap(GTK_LABEL(z->prompt), TRUE); + gtk_widget_set_margin_top(z->prompt, 4); + gtk_widget_add_css_class(z->prompt, "lit-prompt"); + gtk_box_append(GTK_BOX(box), z->prompt); + + z->grid = gtk_grid_new(); + gtk_grid_set_row_spacing(GTK_GRID(z->grid), 12); + gtk_grid_set_column_spacing(GTK_GRID(z->grid), 12); + gtk_grid_set_row_homogeneous(GTK_GRID(z->grid), TRUE); + gtk_grid_set_column_homogeneous(GTK_GRID(z->grid), TRUE); + gtk_widget_set_vexpand(z->grid, TRUE); + gtk_box_append(GTK_BOX(box), z->grid); + + for (int i = 0; i < 4; i++) { + GtkWidget *btn = gtk_button_new(); + GtkWidget *lbl; + char cls[16]; + + lbl = gtk_label_new(""); + gtk_label_set_wrap(GTK_LABEL(lbl), TRUE); + gtk_label_set_justify(GTK_LABEL(lbl), GTK_JUSTIFY_CENTER); + gtk_label_set_max_width_chars(GTK_LABEL(lbl), 26); + + g_snprintf(cls, sizeof(cls), "kahoot-%d", i); + gtk_widget_add_css_class(btn, "kahoot-opt"); + gtk_widget_add_css_class(btn, cls); + gtk_widget_set_hexpand(btn, TRUE); + gtk_widget_set_vexpand(btn, TRUE); + gtk_button_set_child(GTK_BUTTON(btn), lbl); + g_object_set_data(G_OBJECT(btn), "idx", GINT_TO_POINTER(i)); + g_signal_connect(btn, "clicked", G_CALLBACK(lit_opt_clicked), z); + + z->opts[i] = btn; + z->opt_lbl[i] = lbl; + gtk_grid_attach(GTK_GRID(z->grid), btn, i % 2, i / 2, 1, 1); + } + + z->expl = gtk_label_new(""); + gtk_widget_set_halign(z->expl, GTK_ALIGN_START); + gtk_label_set_wrap(GTK_LABEL(z->expl), TRUE); + gtk_label_set_xalign(GTK_LABEL(z->expl), 0.0); + gtk_widget_add_css_class(z->expl, "lit-expl"); + gtk_widget_set_visible(z->expl, FALSE); + gtk_box_append(GTK_BOX(box), z->expl); + + z->next = gtk_button_new(); + i18n_bind(z->next, "lit_next", 1); + gtk_widget_add_css_class(z->next, "btn-primary"); + gtk_widget_set_halign(z->next, GTK_ALIGN_END); + gtk_widget_set_margin_top(z->next, 6); + gtk_widget_set_visible(z->next, FALSE); + gtk_box_append(GTK_BOX(box), z->next); + g_signal_connect(z->next, "clicked", G_CALLBACK(lit_next_clicked), z); + + lit_quiz_show(z); + + return page; +} + +/* ------------------------------------------------------------------ */ +/* Sestavte děj (drag & drop) */ +/* ------------------------------------------------------------------ */ + +static const AssemblyItem lit_plot_items[] = { + { + "Přetáhněte části příběhu do správného pořadí:", + { + "Winston upravuje historii na Ministerstvu pravdy", + "Seznámí se s Julií a začnou se tajně scházet", + "Pronajme si pokoj nad obchodem pana Charringtona", + "Přečte Goldsteinovu knihu u O'Briena", + "Jsou zatčeni Policií myšlení", + "Winston se zlomí v místnosti 101", + }, + 6, + }, +}; + +static const char *lit_plot_meaning[] = { + "Správné pořadí: přepisování historie → seznámení s Julií → " + "pronájem pokoje → četba Goldsteinovy knihy → zatčení → místnost 101.", +}; + +static UnitCtx lit_plot_unit; + +GtkWidget *build_cetba1984_plot_page(void) { + lit_plot_unit.page = "cetba1984"; + lit_plot_unit.progress_file = "progress/cetba.conf"; + return build_assembly(&lit_plot_unit, tr("lit_plot_title"), + "lit_plot_sub", 1, lit_plot_items, + lit_plot_meaning, 1); +} + +/* ------------------------------------------------------------------ */ +/* Reading list and 1984 overview */ +/* ------------------------------------------------------------------ */ + +static GtkWidget *lit_link_card(const char *target, const char *title, + const char *sub, GtkDrawingAreaDrawFunc icon) { + GtkWidget *btn = gtk_button_new(); + GtkWidget *row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 14); + GtkWidget *ic; + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 3); + GtkWidget *t = gtk_label_new(NULL); + GtkWidget *s = gtk_label_new(NULL); + + gtk_widget_add_css_class(btn, "lit-link"); + gtk_widget_set_hexpand(btn, TRUE); + + ic = icon_area_new(icon, 0, 0, 0, 34); + gtk_widget_set_valign(ic, GTK_ALIGN_CENTER); + gtk_box_append(GTK_BOX(row), ic); + + gtk_widget_set_valign(box, GTK_ALIGN_CENTER); + gtk_widget_set_hexpand(box, TRUE); + gtk_widget_set_halign(t, GTK_ALIGN_START); + gtk_label_set_xalign(GTK_LABEL(t), 0.0); + gtk_label_set_wrap(GTK_LABEL(t), TRUE); + gtk_label_set_max_width_chars(GTK_LABEL(t), 40); + gtk_widget_add_css_class(t, "lit-link-title"); + i18n_bind(t, title, 0); + gtk_box_append(GTK_BOX(box), t); + + gtk_widget_set_halign(s, GTK_ALIGN_START); + gtk_label_set_xalign(GTK_LABEL(s), 0.0); + gtk_label_set_wrap(GTK_LABEL(s), TRUE); + gtk_label_set_max_width_chars(GTK_LABEL(s), 46); + gtk_widget_add_css_class(s, "lit-link-sub"); + i18n_bind(s, sub, 0); + gtk_box_append(GTK_BOX(box), s); + + gtk_box_append(GTK_BOX(row), box); + gtk_button_set_child(GTK_BUTTON(btn), row); + g_object_set_data_full(G_OBJECT(btn), "target", g_strdup(target), g_free); + g_signal_connect(btn, "clicked", G_CALLBACK(on_nav_clicked), NULL); + return btn; +} + +static void lit_note_card(GtkWidget *parent, const char *title, + GtkDrawingAreaDrawFunc icon, + const char *const *lines) { + GtkWidget *card = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); + GtkWidget *head; + GtkWidget *ic; + GtkWidget *t; + + gtk_widget_add_css_class(card, "notes-card"); + gtk_widget_set_margin_bottom(card, 14); + gtk_box_append(GTK_BOX(parent), card); + + head = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10); + gtk_box_append(GTK_BOX(card), head); + + ic = icon_area_new(icon, 0, 0, 0, 26); + gtk_widget_set_valign(ic, GTK_ALIGN_CENTER); + gtk_box_append(GTK_BOX(head), ic); + + t = gtk_label_new(title); + gtk_widget_set_halign(t, GTK_ALIGN_START); + gtk_label_set_wrap(GTK_LABEL(t), TRUE); + gtk_widget_set_valign(t, GTK_ALIGN_CENTER); + gtk_widget_add_css_class(t, "notes-title"); + gtk_box_append(GTK_BOX(head), t); + + for (int i = 0; lines[i]; i++) { + GtkWidget *l = gtk_label_new(lines[i]); + + gtk_widget_set_halign(l, GTK_ALIGN_START); + gtk_label_set_wrap(GTK_LABEL(l), TRUE); + gtk_label_set_xalign(GTK_LABEL(l), 0.0); + gtk_widget_add_css_class(l, "notes-body"); + gtk_box_append(GTK_BOX(card), l); + } +} + +GtkWidget *build_readinglist_page(void) { + GtkWidget *page; + GtkWidget *scroll; + GtkWidget *wrap; + GtkWidget *col; + GtkWidget *hero; + GtkWidget *card; + GtkWidget *row; + GtkWidget *ic; + GtkWidget *texts; + GtkWidget *title; + GtkWidget *author; + GtkWidget *sub; + + page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_margin_start(page, 32); + gtk_widget_set_margin_end(page, 32); + gtk_widget_set_margin_top(page, 24); + gtk_widget_set_margin_bottom(page, 24); + + gtk_box_append(GTK_BOX(page), + top_bar("czechmap", "Maturitní četba", "reading_sub")); + + scroll = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_set_vexpand(scroll, TRUE); + gtk_widget_set_margin_top(scroll, 14); + gtk_box_append(GTK_BOX(page), scroll); + + wrap = gtk_center_box_new(); + gtk_widget_set_vexpand(wrap, TRUE); + gtk_widget_set_hexpand(wrap, TRUE); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), wrap); + + col = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18); + gtk_widget_set_valign(col, GTK_ALIGN_CENTER); + gtk_center_box_set_center_widget(GTK_CENTER_BOX(wrap), col); + + hero = icon_area_new(draw_book_icon, 0, 0, 0, 92); + gtk_widget_add_css_class(hero, "reading-hero"); + gtk_box_append(GTK_BOX(col), hero); + + card = gtk_button_new(); + gtk_widget_add_css_class(card, "book-card"); + gtk_widget_set_hexpand(card, TRUE); + + row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16); + gtk_button_set_child(GTK_BUTTON(card), row); + + ic = icon_area_new(draw_book_icon, 0, 0, 0, 54); + gtk_widget_set_valign(ic, GTK_ALIGN_CENTER); + gtk_box_append(GTK_BOX(row), ic); + + texts = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2); + gtk_widget_set_valign(texts, GTK_ALIGN_CENTER); + gtk_widget_set_hexpand(texts, TRUE); + gtk_box_append(GTK_BOX(row), texts); + + title = gtk_label_new("1984"); + gtk_widget_set_halign(title, GTK_ALIGN_START); + gtk_widget_add_css_class(title, "book-title"); + gtk_box_append(GTK_BOX(texts), title); + + author = gtk_label_new("George Orwell"); + gtk_widget_set_halign(author, GTK_ALIGN_START); + gtk_widget_add_css_class(author, "book-author"); + gtk_box_append(GTK_BOX(texts), author); + + sub = gtk_label_new(NULL); + gtk_widget_set_halign(sub, GTK_ALIGN_START); + gtk_label_set_wrap(GTK_LABEL(sub), TRUE); + gtk_widget_add_css_class(sub, "book-sub"); + i18n_bind(sub, "book_1984_sub", 0); + gtk_box_append(GTK_BOX(texts), sub); + + g_object_set_data_full(G_OBJECT(card), "target", g_strdup("cetba1984"), + g_free); + g_signal_connect(card, "clicked", G_CALLBACK(on_nav_clicked), NULL); + gtk_box_append(GTK_BOX(col), card); + + return page; +} + +GtkWidget *build_cetba1984_page(void) { + GtkWidget *page; + GtkWidget *scroll; + GtkWidget *box; + GtkWidget *links; + static const char *about[] = { + "Autor: George Orwell (vl. jm. Eric Arthur Blair)", + "Žánr: antiutopický (dystopický) román", + "Poprvé vydáno: 1949", + "Děj: Londýn, provincie Letopočet 1, stát Oceánie", + "Vyprávění: v er-formě, po deníkových zápiscích Winstona Smithe", + NULL, + }; + static const char *world[] = { + "Svět je rozdělen na tři supervelmoci: Oceánii, Eurasii a Východasii, " + "které spolu vedou trvalou válku.", + "Vládne jediná strana (Angsoc) v čele s kultem Velkého bratra.", + "Ministerstvo pravdy – přepisuje historii a vyrábí „pravdu“.", + "Ministerstvo lásky – mučírny a likvidace nepohodlných.", + "Ministerstvo hojnosti – plánuje hospodářství a drží lidi v " + "nedostatku.", + "Ministerstvo míru – vede válku.", + NULL, + }; + static const char *people[] = { + "Winston Smith – hlavní hrdina, přepisuje historii, touží po svobodě.", + "Julie – mladá členka strany, Winstonova tajná láska.", + "O'Brien – člen vnitřní strany, předstírá odboj a Winstona zničí.", + "Emmanuel Goldstein – nepřítel státu, údajný vůdce Bratrstva.", + "Velký bratr – symbol všemocné moci strany.", + "Pan Charrington – zdánlivý obchodník, ve skutečnosti agent.", + NULL, + }; + static const char *terms[] = { + "Newspeak – uměle zjednodušovaný jazyk, který omezuje myšlení.", + "Dvojité myšlení – ochota věřit dvěma protikladným pravdám.", + "Zločin myšlení – už samotná zakázaná myšlenka.", + "Policie myšlení – tajná policie, která zatýká a mučí.", + "Bratrstvo – možná neexistující odbojová organizace.", + "Místnost 101 – nejhlubší mučírna, pro každého jeho největší strach.", + NULL, + }; + + page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_margin_start(page, 32); + gtk_widget_set_margin_end(page, 32); + gtk_widget_set_margin_top(page, 24); + gtk_widget_set_margin_bottom(page, 24); + + gtk_box_append(GTK_BOX(page), + top_bar("readinglist", "George Orwell – 1984", + "cetba1984_sub")); + + scroll = gtk_scrolled_window_new(); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_widget_set_vexpand(scroll, TRUE); + gtk_widget_set_margin_top(scroll, 14); + gtk_widget_set_margin_bottom(scroll, 14); + gtk_box_append(GTK_BOX(page), scroll); + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(scroll), box); + + links = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); + gtk_widget_set_margin_bottom(links, 14); + gtk_box_append(GTK_BOX(box), links); + gtk_box_append(GTK_BOX(links), + lit_link_card("cetba1984quiz", "lit_quiz_title", + "lit_quiz_sub", draw_quiz_icon)); + gtk_box_append(GTK_BOX(links), + lit_link_card("cetba1984dej", "lit_plot_title", + "lit_plot_sub", draw_order_icon)); + + lit_note_card(box, "O knize", draw_book_icon, about); + lit_note_card(box, "Svět a strana", draw_globe_icon, world); + lit_note_card(box, "Postavy", draw_people_icon, people); + lit_note_card(box, "Klíčové pojmy", draw_bulb_icon, terms); + + return page; +} diff --git a/czech.c b/czech.c index 578c3ce..875539c 100644 --- a/czech.c +++ b/czech.c @@ -129,6 +129,12 @@ GtkWidget *build_czechmap_page(void) { GtkWidget *btn = cz_make_node(i); GtkWidget *name = gtk_label_new(NULL); + if (i == 2) { + g_object_set_data_full(G_OBJECT(btn), "target", + g_strdup("readinglist"), g_free); + g_signal_connect(btn, "clicked", G_CALLBACK(on_nav_clicked), NULL); + } + i18n_bind(name, cz_keys[i], 0); gtk_widget_set_size_request(name, (int)CZ_LABEL_W, -1); gtk_widget_set_halign(name, GTK_ALIGN_CENTER); diff --git a/i18n.c b/i18n.c index 5f930d2..79584a2 100644 --- a/i18n.c +++ b/i18n.c @@ -456,6 +456,26 @@ const TrEntry tr_ui[] = { {"Literatura", "Literatura", "Literature"}, {"Mluvnice", "Mluvnice", "Grammar"}, {"Maturitní četba", "Maturitní četba", "Maturita reading list"}, + {"reading_sub", "Vyberte knihu, kterou chcete studovat.", + "Pick a book to study."}, + {"book_1984_sub", "Antiutopický román • 1949", "Dystopian novel • 1949"}, + {"cetba1984_sub", "Přehled knihy, klíčové pojmy a cvičení.", + "Book overview, key terms and exercises."}, + {"lit_quiz_title", "Kvíz: George Orwell – 1984", + "Quiz: George Orwell – 1984"}, + {"lit_quiz_sub", "U každé otázky vyberte jednu správnou odpověď.", + "Pick one correct answer for each question."}, + {"lit_plot_title", "Sestavte děj", "Order the plot"}, + {"lit_plot_sub", "Přetáhněte části příběhu do správného pořadí.", + "Drag the story parts into the correct order."}, + {"lit_next", "Další", "Next"}, + {"lit_show_result", "Zobrazit výsledek", "Show result"}, + {"lit_again", "Zkusit znovu", "Try again"}, + {"lit_question_fmt", "Otázka %d / %d", "Question %d / %d"}, + {"lit_score_fmt", "Skóre: %d / %d", "Score: %d / %d"}, + {"lit_finished", "Hotovo!", "Done!"}, + {"lit_finished_text", "Prošli jste všemi otázkami.", + "You have finished all the questions."}, {NULL, NULL, NULL} }; diff --git a/icons.c b/icons.c index 79ff688..7a434ad 100644 --- a/icons.c +++ b/icons.c @@ -142,6 +142,195 @@ void draw_chip_icon(GtkDrawingArea *area, cairo_t *cr, } } +/* Open book icon – used for the reading list and overview sections. */ +void draw_book_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const double w = width; + const double h = height; + const double mid = w * 0.5; + const double left = w * 0.13; + const double right = w * 0.87; + const double top = h * 0.24; + const double bot = h * 0.80; + const Rgb c = mix_rgb(color_from_hex(app_theme.accent2), + color_from_hex(app_theme.accent3), 0.35); + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + + cairo_new_path(cr); + cairo_move_to(cr, mid, top); + cairo_curve_to(cr, w * 0.40, top - h * 0.07, + w * 0.24, top - h * 0.02, left, top + h * 0.07); + cairo_line_to(cr, left, bot - h * 0.05); + cairo_curve_to(cr, w * 0.24, bot - h * 0.11, + w * 0.40, bot - h * 0.05, mid, bot); + cairo_close_path(cr); + cairo_fill(cr); + + cairo_new_path(cr); + cairo_move_to(cr, mid, top); + cairo_curve_to(cr, w * 0.60, top - h * 0.07, + w * 0.76, top - h * 0.02, right, top + h * 0.07); + cairo_line_to(cr, right, bot - h * 0.05); + cairo_curve_to(cr, w * 0.76, bot - h * 0.11, + w * 0.60, bot - h * 0.05, mid, bot); + cairo_close_path(cr); + cairo_fill(cr); +} + +/* Question mark in a circle – quiz. */ +void draw_quiz_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const Rgb c = color_from_hex(app_theme.accent); + PangoLayout *layout; + PangoFontDescription *fd; + int tw, th; + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + layout = pango_cairo_create_layout(cr); + fd = pango_font_description_new(); + pango_font_description_set_weight(fd, PANGO_WEIGHT_HEAVY); + pango_font_description_set_absolute_size( + fd, MIN(width, height) * 1.05 * PANGO_SCALE); + pango_layout_set_font_description(layout, fd); + pango_layout_set_text(layout, "?", -1); + pango_layout_get_pixel_size(layout, &tw, &th); + cairo_move_to(cr, (width - tw) / 2.0, (height - th) / 2.0); + pango_cairo_show_layout(cr, layout); + pango_font_description_free(fd); + g_object_unref(layout); +} + +/* Two opposing arrows – ordering / drag & drop. */ +void draw_order_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const double w = width; + const double h = height; + const Rgb c = color_from_hex(app_theme.success2); + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + cairo_set_line_width(cr, MAX(1.6, MIN(w, h) * 0.11)); + cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); + + cairo_new_path(cr); + cairo_move_to(cr, w * 0.36, h * 0.80); + cairo_line_to(cr, w * 0.36, h * 0.24); + cairo_move_to(cr, w * 0.22, h * 0.40); + cairo_line_to(cr, w * 0.36, h * 0.24); + cairo_line_to(cr, w * 0.50, h * 0.40); + cairo_stroke(cr); + + cairo_new_path(cr); + cairo_move_to(cr, w * 0.64, h * 0.20); + cairo_line_to(cr, w * 0.64, h * 0.76); + cairo_move_to(cr, w * 0.50, h * 0.60); + cairo_line_to(cr, w * 0.64, h * 0.76); + cairo_line_to(cr, w * 0.78, h * 0.60); + cairo_stroke(cr); +} + +/* Globe – the world / superpowers. */ +void draw_globe_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const double cx = width / 2.0; + const double cy = height / 2.0; + const double r = MIN(width, height) * 0.36; + const Rgb c = color_from_hex(app_theme.accent2); + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + cairo_set_line_width(cr, MAX(1.4, r * 0.13)); + + cairo_new_path(cr); + cairo_arc(cr, cx, cy, r, 0.0, 2.0 * G_PI); + cairo_stroke(cr); + + cairo_save(cr); + cairo_translate(cr, cx, cy); + cairo_scale(cr, 0.52, 1.0); + cairo_new_path(cr); + cairo_arc(cr, 0.0, 0.0, r, 0.0, 2.0 * G_PI); + cairo_stroke(cr); + cairo_restore(cr); + + cairo_new_path(cr); + cairo_move_to(cr, cx - r, cy); + cairo_line_to(cr, cx + r, cy); + cairo_move_to(cr, cx - r * 0.86, cy - r * 0.52); + cairo_line_to(cr, cx + r * 0.86, cy - r * 0.52); + cairo_move_to(cr, cx - r * 0.86, cy + r * 0.52); + cairo_line_to(cr, cx + r * 0.86, cy + r * 0.52); + cairo_stroke(cr); +} + +/* Two people – characters. */ +void draw_people_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const Rgb c = color_from_hex(app_theme.accent3); + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + + cairo_new_path(cr); + cairo_arc(cr, width * 0.38, height * 0.36, width * 0.15, + 0.0, 2.0 * G_PI); + cairo_fill(cr); + cairo_new_path(cr); + cairo_arc(cr, width * 0.38, height * 1.02, width * 0.30, + G_PI, 2.0 * G_PI); + cairo_fill(cr); + + cairo_new_path(cr); + cairo_arc(cr, width * 0.67, height * 0.42, width * 0.13, + 0.0, 2.0 * G_PI); + cairo_fill(cr); + cairo_new_path(cr); + cairo_arc(cr, width * 0.67, height * 1.06, width * 0.27, + G_PI, 2.0 * G_PI); + cairo_fill(cr); +} + +/* Light bulb – key terms / ideas. */ +void draw_bulb_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data) { + const double cx = width / 2.0; + const double r = MIN(width, height) * 0.30; + const double cy = height * 0.40; + const Rgb c = color_from_hex(app_theme.warning); + + (void)area; + (void)data; + + cairo_set_source_rgb(cr, c.r, c.g, c.b); + + cairo_new_path(cr); + cairo_arc(cr, cx, cy, r, 0.0, 2.0 * G_PI); + cairo_fill(cr); + + cairo_new_path(cr); + cairo_rectangle(cr, cx - r * 0.45, cy + r * 0.72, + r * 0.90, r * 0.66); + cairo_fill(cr); + + cairo_new_path(cr); + cairo_arc(cr, cx, cy + r * 1.72, r * 0.52, 0.0, G_PI); + cairo_fill(cr); +} + void draw_back_icon(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer data) { const double size = 15.0; /* fixed logical icon size */ diff --git a/main.c b/main.c index 103a3cf..e838f85 100644 --- a/main.c +++ b/main.c @@ -233,6 +233,12 @@ void activate(GtkApplication *app, gpointer user_data) { gtk_stack_add_named(main_stack, build_netmap_page(), "netmap"); gtk_stack_add_named(main_stack, build_hwmap_page(), "hwmap"); gtk_stack_add_named(main_stack, build_czechmap_page(), "czechmap"); + gtk_stack_add_named(main_stack, build_readinglist_page(), "readinglist"); + gtk_stack_add_named(main_stack, build_cetba1984_page(), "cetba1984"); + gtk_stack_add_named(main_stack, build_cetba1984_quiz_page(), + "cetba1984quiz"); + gtk_stack_add_named(main_stack, build_cetba1984_plot_page(), + "cetba1984dej"); gtk_stack_add_named(main_stack, build_hw_unit1_page(), "hwunit1"); gtk_stack_add_named(main_stack, build_hw_unit1_exercise_page(), "hwex1"); gtk_stack_add_named(main_stack, build_hw_unit2_page(), "hwunit2"); diff --git a/maturita.h b/maturita.h index eb2b12e..ef3d258 100644 --- a/maturita.h +++ b/maturita.h @@ -800,6 +800,10 @@ void czech_rail_theme_reset(void); void hw_lessons_apply_lang(void); GtkWidget *build_hwmap_page(void); GtkWidget *build_czechmap_page(void); +GtkWidget *build_readinglist_page(void); +GtkWidget *build_cetba1984_page(void); +GtkWidget *build_cetba1984_quiz_page(void); +GtkWidget *build_cetba1984_plot_page(void); GtkWidget *build_hw_unit1_page(void); GtkWidget *build_hw_unit1_exercise_page(void); GtkWidget *build_hw_unit2_page(void); @@ -810,6 +814,18 @@ void draw_chip_icon(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer data); void draw_czech_flag(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer data); +void draw_book_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); +void draw_quiz_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); +void draw_order_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); +void draw_globe_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); +void draw_people_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); +void draw_bulb_icon(GtkDrawingArea *area, cairo_t *cr, + int width, int height, gpointer data); void net_lesson_notes_ensure(NetLesson *L); void net_rescale_lesson_notes(NetLesson *L, int body, int head, int kick); GtkWidget *make_back_button(const char *target); diff --git a/style.css b/style.css index c491f1a..2a51d6a 100644 --- a/style.css +++ b/style.css @@ -371,6 +371,129 @@ windowcontrols button:not(:hover) image { padding: 1px 6px; border-radius: 8px; } +.book-card { + background-image: none; + background-color: alpha(@bg_surface0, 0.92); + border: 1px solid @bg_surface1; + border-radius: 18px; + padding: 20px 26px; + color: @fg_text; + box-shadow: 0 6px 18px alpha(@bg_crust, 0.22); + transition: box-shadow 160ms ease, border-color 160ms ease, + background-color 160ms ease; +} +.book-card:hover { + border-color: @accent; + background-color: alpha(@accent, 0.10); + box-shadow: 0 12px 30px alpha(@accent, 0.32); +} +.book-card:active { + background-color: alpha(@accent, 0.18); + box-shadow: 0 4px 12px alpha(@accent, 0.25); +} +.reading-hero { + opacity: 0.22; +} +.book-title { + color: @fg_text; + font-size: 24px; + font-weight: 800; +} +.book-author { + color: @accent2; + font-size: 15px; + font-weight: 700; +} +.book-sub { + color: @fg_subtext; + font-size: 14px; +} +.lit-link { + background-image: none; + background-color: alpha(@bg_surface0, 0.92); + border: 1px solid @bg_surface1; + border-radius: 16px; + padding: 14px 18px; + color: @fg_text; + box-shadow: 0 5px 16px alpha(@bg_crust, 0.18); + transition: box-shadow 160ms ease, border-color 160ms ease, + background-color 160ms ease; +} +.lit-link:hover { + border-color: @accent; + background-color: alpha(@accent, 0.10); + box-shadow: 0 10px 26px alpha(@accent, 0.30); +} +.lit-link:active { + background-color: alpha(@accent, 0.18); + box-shadow: 0 4px 12px alpha(@accent, 0.25); +} +.lit-link-title { + color: @fg_text; + font-size: 17px; + font-weight: 800; +} +.lit-link-sub { + color: @fg_subtext; + font-size: 13px; +} +.lit-progress { + color: @accent2; + font-size: 13px; + font-weight: 800; + letter-spacing: 1px; +} +.lit-score { + color: @fg_subtext; + font-size: 13px; + font-weight: 700; +} +.lit-prompt { + color: @fg_text; + font-size: 20px; + font-weight: 800; +} +.lit-expl { + color: @success2; + font-size: 15px; + font-weight: 600; + background-color: alpha(@bg_surface0, 0.85); + border-left: 4px solid @success; + border-radius: 8px; + padding: 10px 14px; +} +.kahoot-opt { + background-image: none; + color: @on_accent; + font-size: 15px; + font-weight: 700; + padding: 16px; + border: 3px solid transparent; + border-radius: 14px; + box-shadow: 0 4px 14px alpha(@bg_crust, 0.30); +} +.kahoot-opt:hover { + box-shadow: 0 7px 22px alpha(@bg_crust, 0.42); +} +.kahoot-0 { + background-color: @accent; +} +.kahoot-1 { + background-color: @error; +} +.kahoot-2 { + background-color: @warning; +} +.kahoot-3 { + background-color: @success; +} +.kahoot-opt.ok { + border-color: @fg_text; + box-shadow: 0 0 0 3px alpha(@fg_text, 0.35); +} +.kahoot-opt.wrong { + opacity: 0.35; +} .ex-prompt { color: @fg_text; font-size: 16px;