diff --git a/modules/blox/blox/collection/block.html b/modules/blox/blox/collection/block.html index 01d9e0d5..79fa5e2d 100644 --- a/modules/blox/blox/collection/block.html +++ b/modules/blox/blox/collection/block.html @@ -100,7 +100,6 @@ {{ range $query }} {{ if isset .Params "author_notes" }} {{ $page.Store.Set "has_alpine" true }} - {{ break }} {{ end }} {{ end }} diff --git a/modules/blox/i18n/bn.yaml b/modules/blox/i18n/bn.yaml index a8d96566..ccdd0f47 100644 --- a/modules/blox/i18n/bn.yaml +++ b/modules/blox/i18n/bn.yaml @@ -293,3 +293,351 @@ - id: portfolio_view_all translation: সমস্ত প্রকল্প দেখুন + +# Additional translations + +- id: about_me + translation: পেশাগত সারসংক্ষেপ + +- id: ai_insight + translation: এআই অন্তর্দৃষ্টি + +- id: content_type + translation: বিষয়ের ধরন + +- id: difficulty + translation: কঠিনতা + +- id: prerequisites + translation: পূর্বশর্ত + +- id: trending + translation: ট্রেন্ডিং + +- id: article + translation: প্রবন্ধ + +- id: articles + translation: প্রবন্ধসমূহ + +- id: all + translation: সব + +- id: helpful + translation: সহায়ক + + +# Buttons and links + +- id: btn_site + translation: সাইট + +- id: btn_canonical + translation: ক্যানোনিকাল + +- id: btn_crosspost + translation: ক্রসপোস্ট + +- id: btn_discussion + translation: আলোচনা + +- id: btn_event + translation: ইভেন্ট + +- id: btn_calendar + translation: ক্যালেন্ডার + +- id: btn_registration + translation: নিবন্ধন + +- id: btn_demo + translation: ডেমো + +- id: btn_model + translation: মডেল + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_note + translation: নোট + +- id: callout_abstract + translation: সারাংশ + +- id: callout_summary + translation: সারসংক্ষেপ + +- id: callout_info + translation: তথ্য + +- id: callout_todo + translation: করনীয় + +- id: callout_tip + translation: টিপস + +- id: callout_question + translation: প্রশ্ন + +- id: callout_quote + translation: উদ্ধৃতি + +- id: callout_warning + translation: সতর্কতা + +- id: callout_caution + translation: সতর্কতা + +- id: callout_danger + translation: বিপদ + +- id: callout_bug + translation: বাগ + +- id: callout_example + translation: উদাহরণ + +- id: callout_failure + translation: ব্যর্থতা + +- id: callout_success + translation: সাফল্য + +- id: callout_important + translation: গুরুত্বপূর্ণ + +# Slides + +- id: back_to_slides + translation: স্লাইডে ফিরে যান + +- id: present_slides + translation: প্রেজেন্ট + +- id: present_fullscreen + translation: প্রেজেন্ট (পূর্ণস্ক্রিন) + +- id: export_pdf_print + translation: পিডিএফ রপ্তানি (প্রিন্ট) + +- id: slides_print_hint + translation: প্রিন্ট মোডে খোলে - ব্রাউজার প্রিন্ট > PDF হিসেবে সেভ করুন + +- id: slides_search_placeholder + translation: শিরোনাম দিয়ে ডেক খুঁজুন... + +- id: slides_no_decks + translation: কোন স্লাইড ডেক পাওয়া যায়নি + +- id: slides_no_matches + translation: কোন ডেক ফিল্টারের সাথে মেলে না + +- id: clear_filters + translation: ফিল্টার মুছুন + +- id: topics + translation: বিষয় + +- id: details + translation: বিস্তারিত + +- id: related_resources + translation: সম্পর্কিত রিসোর্স + +- id: copy_link + translation: লিঙ্ক কপি করুন + +- id: copy_citation + translation: উদ্ধৃতি কপি করুন + +- id: how_to_cite + translation: কীভাবে উদ্ধৃতি দিবেন + +- id: citation + translation: উদ্ধৃতি + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: cite.bib ডাউনলোড করুন + +- id: lecture + translation: লেকচার + +- id: enter_fullscreen + translation: পূর্ণস্ক্রিনে যান + +- id: exit_fullscreen + translation: পূর্ণস্ক্রিন থেকে বের হন + +- id: speaker_notes_hint + translation: বক্তার নোটের জন্য + +- id: slides_not_found + translation: স্লাইড পাওয়া যায়নি + +# Q&A + +- id: qa + translation: প্রশ্নোত্তর + +- id: question + translation: প্রশ্ন + +- id: answer + translation: উত্তর + +- id: accepted_answer + translation: গৃহীত উত্তর + +- id: other_answers + translation: অন্যান্য উত্তর + +- id: questions + translation: প্রশ্নসমূহ + +- id: questions_count + translation: প্রশ্ন + +- id: related_questions + translation: সম্পর্কিত প্রশ্ন + +- id: search_questions + translation: প্রশ্ন অনুসন্ধান... + +- id: no_questions_yet + translation: এখনও কোনো প্রশ্ন নেই + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQs + +- id: browse_by_category + translation: বিভাগ অনুযায়ী দেখুন + +# General extras + +- id: backlinks + translation: ব্যাকলিঙ্কস + +- id: blog + translation: ব্লগ + +- id: browse + translation: ব্রাউজ + +- id: days + translation: দিন + +- id: hours + translation: ঘণ্টা + +- id: minutes + translation: মিনিট + +- id: seconds + translation: সেকেন্ড + +- id: experience + translation: অভিজ্ঞতা + +- id: read_more + translation: আরও পড়ুন + +- id: docs + translation: ডকুমেন্টেশন + +- id: featured + translation: বৈশিষ্ট্যযুক্ত + +- id: events + translation: ইভেন্ট + +- id: poweredby_button + translation: 'নিজেরটি বানান →' + +- id: block_contact_title + translation: যোগাযোগ করুন + +- id: block_contact_visit_title + translation: আমাদের দেখুন + +- id: block_contact_office_hours + translation: অফিস সময় + +- id: block_contact_view_on_map + translation: মানচিত্রে দেখুন + +- id: block_contact_connect_title + translation: সংযুক্ত হন + +- id: block_contact_follow_us + translation: আমাদের অনুসরণ করুন + +- id: block_contact_prospective_title + translation: সম্ভাব্য সদস্যরা + +- id: block_contact_form_title + translation: আমাদের বার্তা পাঠান + +- id: block_contact_form_name + translation: নাম + +- id: block_contact_form_email + translation: ইমেইল + +- id: block_contact_form_subject + translation: বিষয় + +- id: block_contact_form_message + translation: বার্তা + +- id: block_contact_form_submit + translation: বার্তা পাঠান + +# Feedback widget + +- id: feedback_widget_title + translation: মতামত + +- id: feedback_widget_question + translation: এই পেজটি কি সহায়ক ছিল? + +- id: feedback_widget_answer_positive + translation: 😍 হ্যাঁ + +- id: feedback_widget_answer_negative + translation: 😡 না diff --git a/modules/blox/i18n/de.yaml b/modules/blox/i18n/de.yaml index 82f7fee1..59099dff 100644 --- a/modules/blox/i18n/de.yaml +++ b/modules/blox/i18n/de.yaml @@ -387,3 +387,262 @@ - id: feedback_widget_answer_negative translation: 😡 Nein + +# AI Features + +- id: ai_insight + translation: KI-Einblick + +# Content Metadata + +- id: content_type + translation: Inhaltstyp + +- id: difficulty + translation: Schwierigkeitsgrad + +- id: prerequisites + translation: Voraussetzungen + +# Card metadata + +- id: trending + translation: Im Trend + +- id: article + translation: Artikel + +- id: articles + translation: Artikel + +- id: browse + translation: Durchsuchen + +- id: all + translation: Alle + +- id: helpful + translation: hilfreich + +# Additional buttons + +- id: btn_site + translation: Website + +- id: btn_canonical + translation: Kanonisch + +- id: btn_crosspost + translation: Crosspost + +- id: btn_discussion + translation: Diskussion + +- id: btn_event + translation: Event + +- id: btn_calendar + translation: Kalender + +- id: btn_registration + translation: Anmeldung + +- id: btn_demo + translation: Demo + +- id: btn_model + translation: Modell + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_abstract + translation: Abstract + +- id: callout_summary + translation: Zusammenfassung + +- id: callout_info + translation: Info + +- id: callout_todo + translation: To-do + +- id: callout_tip + translation: Tipp + +- id: callout_question + translation: Frage + +- id: callout_quote + translation: Zitat + +- id: callout_warning + translation: Warnung + +- id: callout_danger + translation: Gefahr + +- id: callout_bug + translation: Bug + +- id: callout_example + translation: Beispiel + +- id: callout_failure + translation: Fehlschlag + +- id: callout_success + translation: Erfolg + +# Slides + +- id: back_to_slides + translation: Zurück zu Slides + +- id: present_slides + translation: Präsentieren + +- id: present_fullscreen + translation: Präsentieren (Vollbild) + +- id: export_pdf_print + translation: PDF exportieren (Druck) + +- id: slides_print_hint + translation: Öffnet im Druckmodus – Browser Drucken > Als PDF speichern + +- id: slides_search_placeholder + translation: Decks nach Titel suchen... + +- id: slides_no_decks + translation: Keine Foliensätze gefunden + +- id: slides_no_matches + translation: Keine Sätze entsprechen deinen Filtern + +- id: clear_filters + translation: Filter zurücksetzen + +- id: topics + translation: Themen + +- id: details + translation: Details + +- id: related_resources + translation: Verwandte Ressourcen + +- id: copy_link + translation: Link kopieren + +- id: copy_citation + translation: Zitat kopieren + +- id: how_to_cite + translation: So zitieren + +- id: citation + translation: Zitat + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: cite.bib herunterladen + +- id: lecture + translation: Vorlesung + +- id: enter_fullscreen + translation: Vollbildmodus starten + +- id: exit_fullscreen + translation: Vollbildmodus beenden + +- id: speaker_notes_hint + translation: für Sprechernotizen + +- id: slides_not_found + translation: Folien nicht gefunden + +# Q&A + +- id: qa + translation: Q&A + +- id: question + translation: Frage + +- id: answer + translation: Antwort + +- id: accepted_answer + translation: Akzeptierte Antwort + +- id: other_answers + translation: Weitere Antworten + +- id: questions + translation: Fragen + +- id: questions_count + translation: Fragen + +- id: related_questions + translation: Ähnliche Fragen + +- id: search_questions + translation: Fragen durchsuchen... + +- id: no_questions_yet + translation: Noch keine Fragen vorhanden + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQs + +- id: browse_by_category + translation: Nach Kategorie durchsuchen + +# General extras + +- id: about_me + translation: Berufliches Profil + +- id: docs + translation: Dokumentation + +- id: featured + translation: Empfohlen diff --git a/modules/blox/i18n/en.yaml b/modules/blox/i18n/en.yaml index dc111094..353b573a 100644 --- a/modules/blox/i18n/en.yaml +++ b/modules/blox/i18n/en.yaml @@ -421,6 +421,80 @@ - id: questions_count translation: questions +# Slides + +- id: back_to_slides + translation: Back to Slides + +- id: featured + translation: Featured + +- id: details + translation: Details + +- id: present_slides + translation: Present + +- id: present_fullscreen + translation: Present (fullscreen) + +- id: export_pdf_print + translation: Export PDF (print) + +- id: slides_print_hint + translation: Opens in print mode - use browser Print > Save as PDF + +- id: slides_search_placeholder + translation: Search decks by title... + +- id: slides_no_decks + translation: No slide decks found + +- id: slides_no_matches + translation: No decks match your filters + +- id: clear_filters + translation: Clear filters + +- id: topics + translation: Topics + +- id: related_resources + translation: Related Resources + +- id: copy_link + translation: Copy Link + +- id: copy_citation + translation: Copy citation + +- id: how_to_cite + translation: How to cite + +- id: citation + translation: Citation + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: Download cite.bib + +- id: lecture + translation: Lecture + +- id: enter_fullscreen + translation: Enter fullscreen + +- id: exit_fullscreen + translation: Exit fullscreen + +- id: speaker_notes_hint + translation: for speaker notes + +- id: slides_not_found + translation: Slides not found + # Search - id: search diff --git a/modules/blox/i18n/es.yaml b/modules/blox/i18n/es.yaml index 0c01bfbe..6e7ecb59 100644 --- a/modules/blox/i18n/es.yaml +++ b/modules/blox/i18n/es.yaml @@ -356,3 +356,319 @@ - id: poweredby_button translation: 'Crea el tuyo →' + +# AI Features + +- id: ai_insight + translation: Perspectiva de IA + +# Content Metadata + +- id: content_type + translation: Tipo de contenido + +- id: difficulty + translation: Dificultad + +- id: prerequisites + translation: Requisitos previos + +# Card metadata + +- id: trending + translation: Tendencia + +- id: article + translation: artículo + +- id: articles + translation: artículos + +- id: browse + translation: Explorar + +- id: all + translation: Todo + +- id: helpful + translation: útil + +# Additional buttons + +- id: btn_site + translation: Sitio + +- id: btn_canonical + translation: Canónico + +- id: btn_crosspost + translation: Crosspost + +- id: btn_discussion + translation: Discusión + +- id: btn_event + translation: Evento + +- id: btn_calendar + translation: Calendario + +- id: btn_registration + translation: Registro + +- id: btn_demo + translation: Demo + +- id: btn_model + translation: Modelo + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_abstract + translation: Resumen + +- id: callout_summary + translation: Resumen + +- id: callout_info + translation: Info + +- id: callout_todo + translation: Tareas + +- id: callout_tip + translation: Consejo + +- id: callout_question + translation: Pregunta + +- id: callout_quote + translation: Cita + +- id: callout_warning + translation: Advertencia + +- id: callout_danger + translation: Peligro + +- id: callout_bug + translation: Error + +- id: callout_example + translation: Ejemplo + +- id: callout_failure + translation: Fallo + +- id: callout_success + translation: Éxito + +# Slides + +- id: back_to_slides + translation: Volver a diapositivas + +- id: present_slides + translation: Presentar + +- id: present_fullscreen + translation: Presentar (pantalla completa) + +- id: export_pdf_print + translation: Exportar PDF (impresión) + +- id: slides_print_hint + translation: Se abre en modo impresión - usa Imprimir > Guardar como PDF + +- id: slides_search_placeholder + translation: Busca mazos por título... + +- id: slides_no_decks + translation: No se encontraron diapositivas + +- id: slides_no_matches + translation: Ningún mazo coincide con tus filtros + +- id: clear_filters + translation: Borrar filtros + +- id: topics + translation: Temas + +- id: details + translation: Detalles + +- id: related_resources + translation: Recursos relacionados + +- id: copy_link + translation: Copiar enlace + +- id: copy_citation + translation: Copiar cita + +- id: how_to_cite + translation: Cómo citar + +- id: citation + translation: Cita + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: Descargar cite.bib + +- id: lecture + translation: Clase + +- id: enter_fullscreen + translation: Entrar en pantalla completa + +- id: exit_fullscreen + translation: Salir de pantalla completa + +- id: speaker_notes_hint + translation: para notas del presentador + +- id: slides_not_found + translation: Diapositivas no encontradas + +# Q&A + +- id: qa + translation: Preguntas y respuestas + +- id: question + translation: Pregunta + +- id: answer + translation: Respuesta + +- id: accepted_answer + translation: Respuesta aceptada + +- id: other_answers + translation: Otras respuestas + +- id: questions + translation: Preguntas + +- id: questions_count + translation: preguntas + +- id: related_questions + translation: Preguntas relacionadas + +- id: search_questions + translation: Buscar preguntas... + +- id: no_questions_yet + translation: Aún no hay preguntas + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQs + +- id: browse_by_category + translation: Navegar por categoría + +# General extras + +- id: about_me + translation: Resumen profesional + +- id: backlinks + translation: Enlaces de retorno + +- id: days + translation: Días + +- id: hours + translation: Horas + +- id: minutes + translation: Minutos + +- id: seconds + translation: Segundos + +- id: developer + translation: Desarrollador + +- id: docs + translation: Documentación + +- id: experience + translation: Experiencia + +- id: read_more + translation: Leer más + +- id: featured + translation: Destacado + +- id: block_contact_follow_me + translation: Encuéntrame en + +- id: portfolio_link_code + translation: Código + +- id: portfolio_link_live + translation: En vivo + +- id: portfolio_link_demo + translation: Demo + +- id: portfolio_link_default + translation: Enlace + +- id: portfolio_view_all + translation: Ver todos los proyectos + +- id: scroll_to_content + translation: Ir al contenido + +- id: feedback_widget_title + translation: Comentarios + +- id: feedback_widget_question + translation: ¿Esta página fue útil? + +- id: feedback_widget_answer_positive + translation: 😍 Sí + +- id: feedback_widget_answer_negative + translation: 😡 No diff --git a/modules/blox/i18n/hi.yaml b/modules/blox/i18n/hi.yaml new file mode 100644 index 00000000..8761a06c --- /dev/null +++ b/modules/blox/i18n/hi.yaml @@ -0,0 +1,638 @@ +# Navigation + +- id: toggle_navigation + translation: नेविगेशन टॉगल करें + +- id: table_of_contents + translation: सामग्री तालिका + +- id: on_this_page + translation: इस पेज पर + +- id: back_to_top + translation: ऊपर वापस जाएँ + +- id: home + translation: होम + +- id: close + translation: बंद करें + +- id: languages + translation: भाषाएँ + +# General + +- id: related + translation: संबंधित + +- id: backlinks + translation: बैकलिंक्स + +# Callouts - All Obsidian-compatible types + +- id: callout_note + translation: नोट + +- id: callout_abstract + translation: सार + +- id: callout_summary + translation: सारांश + +- id: callout_info + translation: जानकारी + +- id: callout_todo + translation: करना है + +- id: callout_tip + translation: सुझाव + +- id: callout_success + translation: सफलता + +- id: callout_question + translation: प्रश्न + +- id: callout_warning + translation: चेतावनी + +- id: callout_failure + translation: विफलता + +- id: callout_danger + translation: खतरा + +- id: callout_bug + translation: बग + +- id: callout_example + translation: उदाहरण + +- id: callout_quote + translation: उद्धरण + +- id: callout_important + translation: महत्वपूर्ण + +- id: callout_caution + translation: सावधानी + +- id: minute_read + translation: मिनट पढ़ें + +- id: previous + translation: पिछला + +- id: next + translation: अगला + +- id: figure + translation: 'चित्र %d:' + +- id: edit_page + translation: इस पेज को संपादित करें + +# Themes + +- id: theme_selector + translation: प्रदर्शन प्राथमिकताएँ + +- id: theme_light + translation: लाइट + +- id: theme_dark + translation: डार्क + +- id: theme_auto + translation: स्वचालित + +# Buttons + +- id: btn_preprint + translation: प्रीप्रिंट + +- id: btn_pdf + translation: पीडीएफ + +- id: btn_cite + translation: उद्धृत करें + +- id: btn_slides + translation: स्लाइड्स + +- id: btn_video + translation: वीडियो + +- id: btn_code + translation: कोड + +- id: btn_dataset + translation: डेटासेट + +- id: btn_project + translation: प्रोजेक्ट + +- id: btn_poster + translation: पोस्टर + +- id: btn_source + translation: स्रोत दस्तावेज़ + +# New link types + +- id: btn_doi + translation: DOI + +- id: btn_site + translation: साइट + +- id: btn_canonical + translation: कैनोनिकल + +- id: btn_crosspost + translation: क्रॉसपोस्ट + +- id: btn_discussion + translation: चर्चा + +- id: btn_event + translation: इवेंट + +- id: btn_calendar + translation: कैलेंडर + +- id: btn_registration + translation: पंजीकरण + +- id: btn_demo + translation: डेमो + +- id: btn_model + translation: मॉडल + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +- id: btn_copy + translation: कॉपी करें + +- id: btn_copied + translation: कॉपी किया गया + +- id: btn_download + translation: डाउनलोड + +# About widget + +- id: interests + translation: रुचियाँ + +- id: education + translation: शिक्षा + +- id: about_me + translation: व्यावसायिक सारांश + +- id: user_profile_latest + translation: नवीनतम + +# Countdown widget + +- id: days + translation: दिन + +- id: hours + translation: घंटे + +- id: minutes + translation: मिनट + +- id: seconds + translation: सेकंड + +# Accomplishments widget + +- id: see_certificate + translation: प्रमाणपत्र देखें + +# Experience widget + +- id: experience + translation: अनुभव + +- id: present + translation: वर्तमान + +# Pages widget + +- id: read_more + translation: और पढ़ें + +- id: more_pages + translation: सभी देखें + +- id: more_posts + translation: सभी पोस्ट देखें + +- id: more_talks + translation: सभी इवेंट देखें + +- id: more_publications + translation: सभी प्रकाशन देखें + +# Contact widget + +- id: contact_name + translation: नाम + +- id: contact_email + translation: ईमेल + +- id: contact_message + translation: संदेश + +- id: contact_attachment + translation: फ़ाइल संलग्न करें + +- id: contact_send + translation: भेजें + +- id: book_appointment + translation: अपॉइंटमेंट बुक करें + +# Contact info block + +- id: block_contact_title + translation: संपर्क करें + +- id: block_contact_visit_title + translation: हमसे मिलें + +- id: block_contact_office_hours + translation: ऑफिस समय + +- id: block_contact_view_on_map + translation: मैप पर देखें + +- id: block_contact_connect_title + translation: कनेक्ट करें + +- id: block_contact_follow_us + translation: हमें फॉलो करें + +- id: block_contact_follow_me + translation: मुझे यहाँ पाएँ + +- id: block_contact_prospective_title + translation: संभावित सदस्य + +- id: block_contact_form_title + translation: हमें संदेश भेजें + +- id: block_contact_form_name + translation: नाम + +- id: block_contact_form_email + translation: ईमेल + +- id: block_contact_form_subject + translation: विषय + +- id: block_contact_form_message + translation: संदेश + +- id: block_contact_form_submit + translation: संदेश भेजें + +# Publication/Event details + +- id: abstract + translation: सार + +- id: publication + translation: प्रकाशन + +- id: publication_type + translation: प्रकार + +- id: date + translation: तारीख + +- id: last_updated + translation: अंतिम अपडेट + +- id: event + translation: इवेंट + +- id: location + translation: स्थान + +- id: pub_paper_conference + translation: सम्मेलन पेपर + +- id: pub_article_journal + translation: जर्नल लेख + +- id: pub_article + translation: प्रीप्रिंट + +- id: pub_report + translation: रिपोर्ट + +- id: pub_book + translation: पुस्तक + +- id: pub_chapter + translation: पुस्तक अनुभाग + +- id: pub_thesis + translation: थीसिस + +- id: pub_patent + translation: पेटेंट + +# Project details + +- id: open_project_site + translation: प्रोजेक्ट साइट पर जाएँ + +# Content types for default archive page titles and search results + +- id: blog + translation: ब्लॉग + +- id: publications + translation: प्रकाशन + +- id: events + translation: इवेंट + +- id: projects + translation: प्रोजेक्ट + +- id: slides + translation: स्लाइड्स + +- id: authors + translation: लेखक + +- id: qa + translation: प्रश्नोत्तर + +- id: questions + translation: प्रश्न + +- id: faq + translation: अक्सर पूछे जाने वाले प्रश्न + +- id: faqs + translation: FAQs + +- id: docs + translation: प्रलेखन + +- id: question + translation: प्रश्न + +- id: answer + translation: उत्तर + +- id: accepted_answer + translation: स्वीकृत उत्तर + +- id: other_answers + translation: अन्य उत्तर + +- id: related_questions + translation: संबंधित प्रश्न + +- id: browse_by_category + translation: श्रेणी के अनुसार ब्राउज़ करें + +- id: search_questions + translation: प्रश्न खोजें... + +- id: no_questions_yet + translation: अभी तक कोई प्रश्न नहीं + +- id: questions_count + translation: प्रश्न + +# Slides + +- id: back_to_slides + translation: स्लाइड्स पर वापस जाएँ + +- id: featured + translation: विशेष + +- id: details + translation: विवरण + +- id: present_slides + translation: प्रस्तुति करें + +- id: present_fullscreen + translation: प्रस्तुति (फुलस्क्रीन) + +- id: export_pdf_print + translation: पीडीएफ निर्यात (प्रिंट) + +- id: slides_print_hint + translation: प्रिंट मोड में खुलेगा - ब्राउज़र प्रिंट > PDF के रूप में सहेजें + +- id: slides_search_placeholder + translation: शीर्षक से डेक खोजें... + +- id: slides_no_decks + translation: कोई स्लाइड डेक नहीं मिला + +- id: slides_no_matches + translation: कोई डेक आपके फ़िल्टर से मेल नहीं खाता + +- id: clear_filters + translation: फ़िल्टर साफ़ करें + +- id: topics + translation: विषय + +- id: related_resources + translation: संबंधित संसाधन + +- id: copy_link + translation: लिंक कॉपी करें + +- id: copy_citation + translation: उद्धरण कॉपी करें + +- id: how_to_cite + translation: कैसे उद्धृत करें + +- id: citation + translation: उद्धरण + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: cite.bib डाउनलोड करें + +- id: lecture + translation: व्याख्यान + +- id: enter_fullscreen + translation: फुलस्क्रीन में जाएँ + +- id: exit_fullscreen + translation: फुलस्क्रीन से बाहर निकलें + +- id: speaker_notes_hint + translation: वक्ता नोट्स के लिए + +- id: slides_not_found + translation: स्लाइड्स नहीं मिलीं + +# Search + +- id: search + translation: खोज + +- id: search_placeholder + translation: खोजें... + +- id: search_results + translation: परिणाम मिले + +- id: search_no_results + translation: कोई परिणाम नहीं मिला + +- id: search_common_queries + translation: सामान्य खोजें + +# Error 404 + +- id: page_not_found + translation: पेज नहीं मिला + +- id: 404_recommendations + translation: शायद आप इनमें से किसी को ढूँढ रहे थे? + +# Cookie consent + +- id: cookie_message + translation: यह वेबसाइट सर्वोत्तम अनुभव देने के लिए कुकीज़ का उपयोग करती है। + +- id: cookie_dismiss + translation: समझ गया! + +- id: cookie_learn + translation: और जानें + +# Published with + +- id: published_with + translation: '{hugoblox} के साथ बनाया गया — मुफ़्त {repo_link}ओपन सोर्स{/repo_link} वेबसाइट बिल्डर जो क्रिएटर्स को सशक्त करता है।' + +- id: poweredby_button + translation: 'अपनी बनाएँ →' + +# Dev Hero block + +- id: scroll_to_content + translation: सामग्री पर स्क्रॉल करें + +- id: developer + translation: डेवलपर + +# Portfolio block + +- id: portfolio_link_code + translation: कोड + +- id: portfolio_link_live + translation: लाइव + +- id: portfolio_link_demo + translation: डेमो + +- id: portfolio_link_default + translation: लिंक + +- id: portfolio_view_all + translation: सभी प्रोजेक्ट देखें + +# Feedback widget + +- id: feedback_widget_title + translation: प्रतिपुष्टि + +- id: feedback_widget_question + translation: क्या यह पेज सहायक था? + +- id: feedback_widget_answer_positive + translation: 😍 हाँ + +- id: feedback_widget_answer_negative + translation: 😡 नहीं + +# AI Features + +- id: ai_insight + translation: एआई अंतर्दृष्टि + +# Content Metadata + +- id: content_type + translation: सामग्री प्रकार + +- id: difficulty + translation: कठिनाई + +- id: prerequisites + translation: पूर्वापेक्षाएँ + +# Card metadata + +- id: trending + translation: ट्रेंडिंग + +- id: article + translation: लेख + +- id: articles + translation: लेख + +- id: browse + translation: ब्राउज़ + +- id: all + translation: सब + +- id: helpful + translation: सहायक diff --git a/modules/blox/i18n/id.yaml b/modules/blox/i18n/id.yaml index e167a295..ec0c550d 100644 --- a/modules/blox/i18n/id.yaml +++ b/modules/blox/i18n/id.yaml @@ -263,3 +263,384 @@ - id: published_with translation: Diterbitkan dengan {hugoblox} — Secara gratis, {repo_link}sumber terbuka{/repo_link} pembuat situs web yang memberdayakan para pembuat konten. + +# AI Features + +- id: ai_insight + translation: Wawasan AI + +# Content Metadata + +- id: content_type + translation: Jenis konten + +- id: difficulty + translation: Tingkat kesulitan + +- id: prerequisites + translation: Prasyarat + +# Card metadata + +- id: trending + translation: Sedang tren + +- id: article + translation: artikel + +- id: articles + translation: artikel + +- id: browse + translation: Jelajahi + +- id: all + translation: Semua + +- id: helpful + translation: bermanfaat + +# Additional buttons + +- id: btn_site + translation: Situs + +- id: btn_canonical + translation: Kanonikal + +- id: btn_crosspost + translation: Crosspost + +- id: btn_discussion + translation: Diskusi + +- id: btn_event + translation: Acara + +- id: btn_calendar + translation: Kalender + +- id: btn_registration + translation: Registrasi + +- id: btn_demo + translation: Demo + +- id: btn_model + translation: Model + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_note + translation: Catatan + +- id: callout_abstract + translation: Abstrak + +- id: callout_summary + translation: Ringkasan + +- id: callout_info + translation: Info + +- id: callout_todo + translation: To-do + +- id: callout_tip + translation: Tip + +- id: callout_question + translation: Pertanyaan + +- id: callout_quote + translation: Kutipan + +- id: callout_warning + translation: Peringatan + +- id: callout_caution + translation: Perhatian + +- id: callout_danger + translation: Bahaya + +- id: callout_bug + translation: Bug + +- id: callout_example + translation: Contoh + +- id: callout_failure + translation: Gagal + +- id: callout_success + translation: Sukses + +- id: callout_important + translation: Penting + +# Slides + +- id: back_to_slides + translation: Kembali ke slides + +- id: present_slides + translation: Presentasi + +- id: present_fullscreen + translation: Presentasi (layar penuh) + +- id: export_pdf_print + translation: Ekspor PDF (cetak) + +- id: slides_print_hint + translation: Membuka mode cetak - gunakan Cetak > Simpan sebagai PDF + +- id: slides_search_placeholder + translation: Cari deck berdasarkan judul... + +- id: slides_no_decks + translation: Tidak ada deck ditemukan + +- id: slides_no_matches + translation: Tidak ada deck sesuai filter + +- id: clear_filters + translation: Hapus filter + +- id: topics + translation: Topik + +- id: details + translation: Detail + +- id: related_resources + translation: Sumber terkait + +- id: copy_link + translation: Salin tautan + +- id: copy_citation + translation: Salin sitasi + +- id: how_to_cite + translation: Cara mengutip + +- id: citation + translation: Sitasi + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: Unduh cite.bib + +- id: lecture + translation: Kuliah + +- id: enter_fullscreen + translation: Masuk layar penuh + +- id: exit_fullscreen + translation: Keluar layar penuh + +- id: speaker_notes_hint + translation: untuk catatan pembicara + +- id: slides_not_found + translation: Slide tidak ditemukan + +- id: related + translation: Terkait + +# Q&A + +- id: qa + translation: Tanya Jawab + +- id: question + translation: Pertanyaan + +- id: answer + translation: Jawaban + +- id: accepted_answer + translation: Jawaban diterima + +- id: other_answers + translation: Jawaban lainnya + +- id: questions + translation: Pertanyaan + +- id: questions_count + translation: pertanyaan + +- id: related_questions + translation: Pertanyaan terkait + +- id: search_questions + translation: Cari pertanyaan... + +- id: no_questions_yet + translation: Belum ada pertanyaan + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQ + +- id: browse_by_category + translation: Telusuri per kategori + +# General extras + +- id: about_me + translation: Ringkasan profesional + +- id: backlinks + translation: Tautan balik + +- id: days + translation: Hari + +- id: hours + translation: Jam + +- id: minutes + translation: Menit + +- id: seconds + translation: Detik + +- id: experience + translation: Pengalaman + +- id: read_more + translation: Baca selengkapnya + +- id: docs + translation: Dokumentasi + +- id: featured + translation: Unggulan + +# Feedback widget + +- id: feedback_widget_title + translation: Masukan + +- id: feedback_widget_question + translation: Apakah halaman ini membantu? + +- id: feedback_widget_answer_positive + translation: 😍 Ya + +- id: feedback_widget_answer_negative + translation: 😡 Tidak + +- id: block_contact_title + translation: Hubungi Kami + +- id: block_contact_visit_title + translation: Kunjungi Kami + +- id: block_contact_office_hours + translation: Jam kerja + +- id: block_contact_view_on_map + translation: Lihat di Peta + +- id: block_contact_connect_title + translation: Terhubung + +- id: block_contact_follow_us + translation: Ikuti kami + +- id: block_contact_follow_me + translation: Temukan saya di + +- id: block_contact_prospective_title + translation: Calon anggota + +- id: block_contact_form_title + translation: Kirim Pesan + +- id: block_contact_form_name + translation: Nama + +- id: block_contact_form_email + translation: Email + +- id: block_contact_form_subject + translation: Subjek + +- id: block_contact_form_message + translation: Pesan + +- id: block_contact_form_submit + translation: Kirim pesan + +- id: blog + translation: Blog + +- id: events + translation: Acara + +- id: poweredby_button + translation: 'Bangun punyamu →' + +- id: developer + translation: Pengembang + +- id: scroll_to_content + translation: Gulir ke konten + +- id: portfolio_link_code + translation: Kode + +- id: portfolio_link_live + translation: Langsung + +- id: portfolio_link_demo + translation: Demo + +- id: portfolio_link_default + translation: Tautan + +- id: portfolio_view_all + translation: Lihat semua proyek + +- id: featured + translation: Unggulan diff --git a/modules/blox/i18n/nl.yaml b/modules/blox/i18n/nl.yaml index 401d83b5..a3de8b8c 100644 --- a/modules/blox/i18n/nl.yaml +++ b/modules/blox/i18n/nl.yaml @@ -337,3 +337,304 @@ - id: portfolio_view_all translation: Bekijk alle projecten + +# AI Features + +- id: ai_insight + translation: AI-inzicht + +# Content Metadata + +- id: content_type + translation: Contenttype + +- id: difficulty + translation: Moeilijkheidsgraad + +- id: prerequisites + translation: Vereisten + +# Card metadata + +- id: trending + translation: Populair + +- id: article + translation: artikel + +- id: articles + translation: artikelen + +- id: browse + translation: Bladeren + +- id: all + translation: Alles + +- id: helpful + translation: nuttig + +# Additional buttons + +- id: btn_site + translation: Site + +- id: btn_canonical + translation: Canoniek + +- id: btn_crosspost + translation: Crosspost + +- id: btn_discussion + translation: Discussie + +- id: btn_event + translation: Evenement + +- id: btn_calendar + translation: Kalender + +- id: btn_registration + translation: Registratie + +- id: btn_demo + translation: Demo + +- id: btn_model + translation: Model + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_note + translation: Notitie + +- id: callout_abstract + translation: Samenvatting + +- id: callout_summary + translation: Samenvatting + +- id: callout_info + translation: Info + +- id: callout_todo + translation: Te doen + +- id: callout_tip + translation: Tip + +- id: callout_question + translation: Vraag + +- id: callout_quote + translation: Citaat + +- id: callout_warning + translation: Waarschuwing + +- id: callout_caution + translation: Let op + +- id: callout_danger + translation: Gevaar + +- id: callout_bug + translation: Bug + +- id: callout_example + translation: Voorbeeld + +- id: callout_failure + translation: Mislukt + +- id: callout_success + translation: Succes + +- id: callout_important + translation: Belangrijk + +# Slides + +- id: back_to_slides + translation: Terug naar slides + +- id: present_slides + translation: Presenteren + +- id: present_fullscreen + translation: Presenteren (volledig scherm) + +- id: export_pdf_print + translation: PDF exporteren (print) + +- id: slides_print_hint + translation: Opent in printmodus - browser Afdrukken > Opslaan als PDF + +- id: slides_search_placeholder + translation: Zoek decks op titel... + +- id: slides_no_decks + translation: Geen decks gevonden + +- id: slides_no_matches + translation: Geen decks voldoen aan je filters + +- id: clear_filters + translation: Filters wissen + +- id: topics + translation: Onderwerpen + +- id: details + translation: Details + +- id: related_resources + translation: Gerelateerde bronnen + +- id: copy_link + translation: Link kopiëren + +- id: copy_citation + translation: Citatie kopiëren + +- id: how_to_cite + translation: Hoe te citeren + +- id: citation + translation: Citatie + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: cite.bib downloaden + +- id: lecture + translation: College + +- id: enter_fullscreen + translation: Volledig scherm + +- id: exit_fullscreen + translation: Volledig scherm afsluiten + +- id: speaker_notes_hint + translation: voor sprekersnotities + +- id: slides_not_found + translation: Slides niet gevonden + +# Q&A + +- id: qa + translation: Q&A + +- id: question + translation: Vraag + +- id: answer + translation: Antwoord + +- id: accepted_answer + translation: Geaccepteerd antwoord + +- id: other_answers + translation: Andere antwoorden + +- id: questions + translation: Vragen + +- id: questions_count + translation: vragen + +- id: related_questions + translation: Gerelateerde vragen + +- id: search_questions + translation: Zoek vragen... + +- id: no_questions_yet + translation: Nog geen vragen + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQs + +- id: browse_by_category + translation: Blader op categorie + +# General extras + +- id: about_me + translation: Professionele samenvatting + +- id: backlinks + translation: Backlinks + +- id: days + translation: Dagen + +- id: hours + translation: Uren + +- id: minutes + translation: Minuten + +- id: seconds + translation: Seconden + +- id: experience + translation: Ervaring + +- id: read_more + translation: Lees meer + +- id: docs + translation: Documentatie + +- id: featured + translation: Uitgelicht + +- id: feedback_widget_title + translation: Feedback + +- id: feedback_widget_question + translation: Was deze pagina nuttig? + +- id: feedback_widget_answer_positive + translation: 😍 Ja + +- id: feedback_widget_answer_negative + translation: 😡 Nee diff --git a/modules/blox/i18n/pt.yaml b/modules/blox/i18n/pt.yaml index 900542c1..d95f81df 100644 --- a/modules/blox/i18n/pt.yaml +++ b/modules/blox/i18n/pt.yaml @@ -304,3 +304,331 @@ - id: published_with translation: Made with {hugoblox}. + +# AI Features + +- id: ai_insight + translation: Insight de IA + +# Content Metadata + +- id: content_type + translation: Tipo de conteúdo + +- id: difficulty + translation: Dificuldade + +- id: prerequisites + translation: Pré-requisitos + +# Card metadata + +- id: trending + translation: Em alta + +- id: article + translation: artigo + +- id: articles + translation: artigos + +- id: browse + translation: Navegar + +- id: all + translation: Todos + +- id: helpful + translation: útil + +# Additional buttons + +- id: btn_site + translation: Site + +- id: btn_canonical + translation: Canônico + +- id: btn_crosspost + translation: Crosspost + +- id: btn_discussion + translation: Discussão + +- id: btn_event + translation: Evento + +- id: btn_calendar + translation: Calendário + +- id: btn_registration + translation: Inscrição + +- id: btn_demo + translation: Demo + +- id: btn_model + translation: Modelo + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_note + translation: Nota + +- id: callout_abstract + translation: Resumo + +- id: callout_summary + translation: Sumário + +- id: callout_info + translation: Informação + +- id: callout_todo + translation: Para fazer + +- id: callout_tip + translation: Dica + +- id: callout_question + translation: Pergunta + +- id: callout_quote + translation: Citação + +- id: callout_warning + translation: Aviso + +- id: callout_caution + translation: Cuidado + +- id: callout_danger + translation: Perigo + +- id: callout_bug + translation: Bug + +- id: callout_example + translation: Exemplo + +- id: callout_failure + translation: Falha + +- id: callout_success + translation: Sucesso + +- id: callout_important + translation: Importante + +# Slides + +- id: back_to_slides + translation: Voltar para slides + +- id: present_slides + translation: Apresentar + +- id: present_fullscreen + translation: Apresentar (tela cheia) + +- id: export_pdf_print + translation: Exportar PDF (impressão) + +- id: slides_print_hint + translation: Abre em modo de impressão - use Imprimir > Salvar como PDF + +- id: slides_search_placeholder + translation: Buscar decks por título... + +- id: slides_no_decks + translation: Nenhum conjunto de slides encontrado + +- id: slides_no_matches + translation: Nenhum deck corresponde aos filtros + +- id: clear_filters + translation: Limpar filtros + +- id: topics + translation: Tópicos + +- id: details + translation: Detalhes + +- id: related_resources + translation: Recursos relacionados + +- id: copy_link + translation: Copiar link + +- id: copy_citation + translation: Copiar citação + +- id: how_to_cite + translation: Como citar + +- id: citation + translation: Citação + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: Baixar cite.bib + +- id: lecture + translation: Aula + +- id: enter_fullscreen + translation: Entrar em tela cheia + +- id: exit_fullscreen + translation: Sair da tela cheia + +- id: speaker_notes_hint + translation: para notas do apresentador + +- id: slides_not_found + translation: Slides não encontrados + +# Q&A + +- id: qa + translation: Q&A + +- id: question + translation: Pergunta + +- id: answer + translation: Resposta + +- id: accepted_answer + translation: Resposta aceita + +- id: other_answers + translation: Outras respostas + +- id: questions + translation: Perguntas + +- id: questions_count + translation: perguntas + +- id: related_questions + translation: Perguntas relacionadas + +- id: search_questions + translation: Buscar perguntas... + +- id: no_questions_yet + translation: Ainda não há perguntas + +- id: faq + translation: FAQ + +- id: faqs + translation: FAQs + +- id: browse_by_category + translation: Navegar por categoria + +# General extras + +- id: about_me + translation: Resumo profissional + +- id: backlinks + translation: Backlinks + +- id: days + translation: Dias + +- id: hours + translation: Horas + +- id: minutes + translation: Minutos + +- id: seconds + translation: Segundos + +- id: developer + translation: Desenvolvedor + +- id: docs + translation: Documentação + +- id: experience + translation: Experiência + +- id: read_more + translation: Leia mais + +- id: featured + translation: Em destaque + +- id: block_contact_follow_me + translation: Encontre-me em + +- id: portfolio_link_code + translation: Código + +- id: portfolio_link_live + translation: Ao vivo + +- id: portfolio_link_demo + translation: Demo + +- id: portfolio_link_default + translation: Link + +- id: portfolio_view_all + translation: Ver todos os projetos + +- id: scroll_to_content + translation: Rolar para o conteúdo + +- id: feedback_widget_title + translation: Feedback + +- id: feedback_widget_question + translation: Esta página foi útil? + +- id: feedback_widget_answer_positive + translation: 😍 Sim + +- id: feedback_widget_answer_negative + translation: 😡 Não + +- id: poweredby_button + translation: 'Construa a sua →' diff --git a/modules/blox/i18n/zh-Hant.yaml b/modules/blox/i18n/zh-Hant.yaml index b2f4515c..e54bf992 100644 --- a/modules/blox/i18n/zh-Hant.yaml +++ b/modules/blox/i18n/zh-Hant.yaml @@ -307,3 +307,328 @@ - id: poweredby_button translation: '構建您的 →' + +# AI Features + +- id: ai_insight + translation: AI 洞察 + +# Content Metadata + +- id: content_type + translation: 內容類型 + +- id: difficulty + translation: 難度 + +- id: prerequisites + translation: 先決條件 + +# Card metadata + +- id: trending + translation: 熱門 + +- id: article + translation: 文章 + +- id: articles + translation: 文章 + +- id: browse + translation: 瀏覽 + +- id: all + translation: 全部 + +- id: helpful + translation: 有幫助 + +# Additional buttons + +- id: btn_site + translation: 網站 + +- id: btn_canonical + translation: 正規連結 + +- id: btn_crosspost + translation: 交叉發布 + +- id: btn_discussion + translation: 討論 + +- id: btn_event + translation: 活動 + +- id: btn_calendar + translation: 行事曆 + +- id: btn_registration + translation: 註冊 + +- id: btn_demo + translation: 示範 + +- id: btn_model + translation: 模型 + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_note + translation: 備註 + +- id: callout_abstract + translation: 摘要 + +- id: callout_summary + translation: 摘要 + +- id: callout_info + translation: 資訊 + +- id: callout_todo + translation: 待辦 + +- id: callout_tip + translation: 提示 + +- id: callout_question + translation: 問題 + +- id: callout_quote + translation: 引用 + +- id: callout_warning + translation: 警告 + +- id: callout_caution + translation: 注意 + +- id: callout_danger + translation: 危險 + +- id: callout_bug + translation: 錯誤 + +- id: callout_example + translation: 範例 + +- id: callout_failure + translation: 失敗 + +- id: callout_success + translation: 成功 + +- id: callout_important + translation: 重要 + +# Slides + +- id: back_to_slides + translation: 返回投影片 + +- id: present_slides + translation: 播放 + +- id: present_fullscreen + translation: 播放(全螢幕) + +- id: export_pdf_print + translation: 匯出 PDF(列印) + +- id: slides_print_hint + translation: 以列印模式開啟 - 瀏覽器列印 > 另存為 PDF + +- id: slides_search_placeholder + translation: 依標題搜尋投影片... + +- id: slides_no_decks + translation: 未找到投影片集 + +- id: slides_no_matches + translation: 沒有符合篩選的投影片 + +- id: clear_filters + translation: 清除篩選 + +- id: topics + translation: 主題 + +- id: details + translation: 詳細資訊 + +- id: related_resources + translation: 相關資源 + +- id: copy_link + translation: 複製連結 + +- id: copy_citation + translation: 複製引用 + +- id: how_to_cite + translation: 如何引用 + +- id: citation + translation: 引用 + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: 下載 cite.bib + +- id: lecture + translation: 講座 + +- id: enter_fullscreen + translation: 進入全螢幕 + +- id: exit_fullscreen + translation: 離開全螢幕 + +- id: speaker_notes_hint + translation: 用於講者備註 + +- id: slides_not_found + translation: 找不到投影片 + +# Q&A + +- id: qa + translation: 問答 + +- id: question + translation: 問題 + +- id: answer + translation: 回答 + +- id: accepted_answer + translation: 已接受的回答 + +- id: other_answers + translation: 其他回答 + +- id: questions + translation: 問題 + +- id: questions_count + translation: 個問題 + +- id: related_questions + translation: 相關問題 + +- id: search_questions + translation: 搜尋問題... + +- id: no_questions_yet + translation: 尚無問題 + +- id: faq + translation: 常見問題 + +- id: faqs + translation: 常見問題 + +- id: browse_by_category + translation: 依分類瀏覽 + +# General extras + +- id: about_me + translation: 職業簡介 + +- id: backlinks + translation: 反向連結 + +- id: days + translation: 天 + +- id: hours + translation: 小時 + +- id: minutes + translation: 分鐘 + +- id: seconds + translation: 秒 + +- id: developer + translation: 開發者 + +- id: docs + translation: 文件 + +- id: experience + translation: 經驗 + +- id: read_more + translation: 閱讀更多 + +- id: featured + translation: 精選 + +- id: block_contact_follow_me + translation: 在這裡找到我 + +- id: portfolio_link_code + translation: 程式碼 + +- id: portfolio_link_live + translation: 線上 + +- id: portfolio_link_demo + translation: 示範 + +- id: portfolio_link_default + translation: 連結 + +- id: portfolio_view_all + translation: 查看所有專案 + +- id: scroll_to_content + translation: 捲動至內容 + +- id: feedback_widget_title + translation: 回饋 + +- id: feedback_widget_question + translation: 此頁面有幫助嗎? + +- id: feedback_widget_answer_positive + translation: 😍 是 + +- id: feedback_widget_answer_negative + translation: 😡 否 diff --git a/modules/blox/i18n/zh.yaml b/modules/blox/i18n/zh.yaml index 039a0cce..1dc9c654 100644 --- a/modules/blox/i18n/zh.yaml +++ b/modules/blox/i18n/zh.yaml @@ -359,3 +359,292 @@ - id: portfolio_view_all translation: 查看所有项目 + +# AI Features + +- id: ai_insight + translation: AI 洞察 + +# Content Metadata + +- id: content_type + translation: 内容类型 + +- id: difficulty + translation: 难度 + +- id: prerequisites + translation: 先决条件 + +# Card metadata + +- id: trending + translation: 热门 + +- id: article + translation: 文章 + +- id: articles + translation: 文章 + +- id: browse + translation: 浏览 + +- id: all + translation: 全部 + +- id: helpful + translation: 有帮助 + +# Additional buttons + +- id: btn_site + translation: 网站 + +- id: btn_canonical + translation: 规范链接 + +- id: btn_crosspost + translation: 交叉发布 + +- id: btn_discussion + translation: 讨论 + +- id: btn_event + translation: 活动 + +- id: btn_calendar + translation: 日历 + +- id: btn_registration + translation: 注册 + +- id: btn_demo + translation: 演示 + +- id: btn_model + translation: 模型 + +- id: btn_doi + translation: DOI + +- id: btn_hal + translation: HAL + +- id: btn_dblp + translation: DBLP + +- id: btn_isbn + translation: ISBN + +- id: btn_osf + translation: OSF + +- id: btn_zenodo + translation: Zenodo + +- id: btn_kaggle + translation: Kaggle + +- id: btn_openalex + translation: OpenAlex + +- id: btn_semanticscholar + translation: Semantic Scholar + +- id: btn_pwc + translation: Papers With Code + +# Callouts + +- id: callout_abstract + translation: 摘要 + +- id: callout_summary + translation: 总结 + +- id: callout_info + translation: 信息 + +- id: callout_todo + translation: 待办 + +- id: callout_question + translation: 问题 + +- id: callout_quote + translation: 引用 + +- id: callout_warning + translation: 警告 + +- id: callout_danger + translation: 危险 + +- id: callout_bug + translation: 缺陷 + +- id: callout_example + translation: 示例 + +- id: callout_failure + translation: 失败 + +- id: callout_success + translation: 成功 + +# Slides + +- id: back_to_slides + translation: 返回幻灯 + +- id: present_slides + translation: 演示 + +- id: present_fullscreen + translation: 演示(全屏) + +- id: export_pdf_print + translation: 导出 PDF(打印) + +- id: slides_print_hint + translation: 在打印模式打开 - 浏览器打印 > 另存为 PDF + +- id: slides_search_placeholder + translation: 按标题搜索幻灯集... + +- id: slides_no_decks + translation: 未找到幻灯集 + +- id: slides_no_matches + translation: 没有符合筛选的幻灯集 + +- id: clear_filters + translation: 清除过滤 + +- id: topics + translation: 主题 + +- id: details + translation: 详情 + +- id: related_resources + translation: 相关资源 + +- id: copy_link + translation: 复制链接 + +- id: copy_citation + translation: 复制引用 + + +- id: citation + translation: 引用 + +- id: bibtex + translation: BibTeX + +- id: download_cite_bib + translation: 下载 cite.bib + +- id: lecture + translation: 讲座 + +- id: enter_fullscreen + translation: 进入全屏 + +- id: exit_fullscreen + translation: 退出全屏 + +- id: speaker_notes_hint + translation: 用于演讲者备注 + +- id: slides_not_found + translation: 未找到幻灯 + +# Q&A + +- id: qa + translation: 问答 + +- id: question + translation: 问题 + +- id: answer + translation: 答案 + +- id: accepted_answer + translation: 已采纳的回答 + +- id: other_answers + translation: 其他回答 + +- id: questions + translation: 问题 + +- id: questions_count + translation: 个问题 + +- id: related_questions + translation: 相关问题 + +- id: search_questions + translation: 搜索问题... + +- id: no_questions_yet + translation: 尚无问题 + +- id: faq + translation: 常见问题 + +- id: faqs + translation: 常见问题 + +- id: browse_by_category + translation: 按类别浏览 + +# General extras + +- id: about_me + translation: 职业简介 + +- id: backlinks + translation: 反向链接 + +- id: days + translation: 天 + +- id: hours + translation: 小时 + +- id: minutes + translation: 分钟 + +- id: seconds + translation: 秒 + +- id: docs + translation: 文档 + +- id: featured + translation: 精选 + +- id: read_more + translation: 阅读更多 + +# Feedback widget + +- id: feedback_widget_title + translation: 反馈 + +- id: feedback_widget_question + translation: 此页面有帮助吗? + +- id: feedback_widget_answer_positive + translation: 😍 是 + +- id: feedback_widget_answer_negative + translation: 😡 否 + +- id: how_to_cite + translation: 如何引用 diff --git a/modules/blox/layouts/_partials/components/slides-embed.html b/modules/blox/layouts/_partials/components/slides-embed.html new file mode 100644 index 00000000..3a3bbb78 --- /dev/null +++ b/modules/blox/layouts/_partials/components/slides-embed.html @@ -0,0 +1,155 @@ +{{/* + Hugo Blox Slides Embed Component - Reusable iframe embed with fullscreen support + Usage: {{ partial "components/slides-embed.html" (dict "page" . "slides_slug" .Params.slides) }} + + Params: + - page: current page context + - slides_slug: slug of slides to embed (e.g., "example") + - show_actions: (optional) show open/speaker notes links, default true + - title: (optional) title for iframe, defaults to page title +*/}} + +{{ $page := .page }} +{{ $slides_slug := .slides_slug }} +{{ $show_actions := .show_actions | default true }} +{{ $slides_label := i18n "slides" | default "Slides" }} +{{ $present_fullscreen_label := i18n "present_fullscreen" | default "Present (fullscreen)" }} +{{ $enter_fullscreen_label := i18n "enter_fullscreen" | default "Enter fullscreen" }} +{{ $exit_fullscreen_label := i18n "exit_fullscreen" | default "Exit fullscreen" }} +{{ $speaker_notes_hint := i18n "speaker_notes_hint" | default "for speaker notes" }} +{{ $slides_not_found_label := i18n "slides_not_found" | default "Slides not found" }} +{{ $embed_title := .title | default (printf "%s - %s" $page.Title $slides_label) }} + +{{/* Enable Alpine.js for fullscreen functionality */}} +{{ $page.Store.Set "has_alpine" true }} + +{{/* Get slides page */}} +{{ $slides_page := site.GetPage (printf "/slides/%s" $slides_slug) }} +{{ $scr := newScratch }} +{{ if $slides_page }} + {{ $scr.Set "slides_url" $slides_page.RelPermalink }} + {{ $scr.Set "present_url" $slides_page.RelPermalink }} + {{ $scr.Set "embed_url" $slides_page.RelPermalink }} + {{ $present_format := $slides_page.OutputFormats.Get "present" }} + {{ if not $present_format }} + {{ $present_format = $slides_page.OutputFormats.Get "Present" }} + {{ end }} + {{ with $present_format }} + {{ $scr.Set "present_url" .RelPermalink }} + {{ $scr.Set "embed_url" (printf "%s?embed=1" .RelPermalink) }} + {{ end }} +{{ end }} +{{ $slides_url := $scr.Get "slides_url" }} +{{ $present_url := $scr.Get "present_url" | default $slides_url }} +{{ $embed_url := $scr.Get "embed_url" | default $slides_url }} + +{{ if $slides_page }} +
+ {{/* Slides iframe container - wrapper for fullscreen API */}} +
+ + + {{/* Fullscreen toggle button - inside container for fullscreen visibility */}} + +
+ + {{ if $show_actions }} + {{/* Action links below embed */}} +
+
+ {{/* Open in new tab */}} + + + + + {{ $present_fullscreen_label }} + + + {{/* Presentation mode hint */}} + + S + {{ $speaker_notes_hint }} + +
+
+ {{ end }} +
+{{ else }} +

{{ $slides_not_found_label }}: {{ $slides_slug }}

+{{ end }} diff --git a/modules/blox/layouts/_partials/functions/build_links.html b/modules/blox/layouts/_partials/functions/build_links.html index 5bb95c23..4d0d7301 100644 --- a/modules/blox/layouts/_partials/functions/build_links.html +++ b/modules/blox/layouts/_partials/functions/build_links.html @@ -89,22 +89,46 @@ {{/* 2b) Slides relation parameter (legacy but common) */}} {{ with $page.Params.slides }} - {{ with (site.GetPage (printf "slides/%s" .)) }} - {{ $typeF := "slides" }} - {{ $urlF := .RelPermalink }} - {{ $keyF := printf "%s::%s" $typeF $urlF }} - {{ if not ($seen.Get (printf "set.%s" $keyF)) }} - {{ $seen.SetInMap "set" $keyF true }} - {{ $links = $links | append (dict - "type" $typeF - "url" $urlF - "icon" (index (index $types $typeF) "icon") - "labelKey" (index (index $types $typeF) "label_i18n") - "contexts" (slice "list" "page") - ) }} + {{ if reflect.IsMap . }} + {{/* Skip: slides map is Reveal.js config for slide decks. */}} + {{ else if reflect.IsSlice . }} + {{ range . }} + {{ with (site.GetPage (printf "slides/%s" .)) }} + {{ $typeF := "slides" }} + {{ $urlF := .RelPermalink }} + {{ $keyF := printf "%s::%s" $typeF $urlF }} + {{ if not ($seen.Get (printf "set.%s" $keyF)) }} + {{ $seen.SetInMap "set" $keyF true }} + {{ $links = $links | append (dict + "type" $typeF + "url" $urlF + "icon" (index (index $types $typeF) "icon") + "labelKey" (index (index $types $typeF) "label_i18n") + "contexts" (slice "list" "page") + ) }} + {{ end }} + {{ else }} + {{ warnf "`slides` relation could not resolve to a page for %s" $page.File.Path }} + {{ end }} {{ end }} {{ else }} - {{ warnf "`slides` relation could not resolve to a page for %s" $page.File.Path }} + {{ with (site.GetPage (printf "slides/%s" .)) }} + {{ $typeF := "slides" }} + {{ $urlF := .RelPermalink }} + {{ $keyF := printf "%s::%s" $typeF $urlF }} + {{ if not ($seen.Get (printf "set.%s" $keyF)) }} + {{ $seen.SetInMap "set" $keyF true }} + {{ $links = $links | append (dict + "type" $typeF + "url" $urlF + "icon" (index (index $types $typeF) "icon") + "labelKey" (index (index $types $typeF) "label_i18n") + "contexts" (slice "list" "page") + ) }} + {{ end }} + {{ else }} + {{ warnf "`slides` relation could not resolve to a page for %s" $page.File.Path }} + {{ end }} {{ end }} {{ end }} diff --git a/modules/blox/layouts/_partials/views/slides-gallery--end.html b/modules/blox/layouts/_partials/views/slides-gallery--end.html new file mode 100644 index 00000000..b0f2d2fa --- /dev/null +++ b/modules/blox/layouts/_partials/views/slides-gallery--end.html @@ -0,0 +1,2 @@ + + diff --git a/modules/blox/layouts/_partials/views/slides-gallery--start.html b/modules/blox/layouts/_partials/views/slides-gallery--start.html new file mode 100644 index 00000000..da674c85 --- /dev/null +++ b/modules/blox/layouts/_partials/views/slides-gallery--start.html @@ -0,0 +1,5 @@ +{{ $columns := .config.columns | default 2 }} +{{ $len := .config.len | default 1 }} +{{/* Grid layout optimized for slide deck previews - 16:9 aspect ratio cards */}} +
+
diff --git a/modules/blox/layouts/_partials/views/slides-gallery.html b/modules/blox/layouts/_partials/views/slides-gallery.html new file mode 100644 index 00000000..25dab71f --- /dev/null +++ b/modules/blox/layouts/_partials/views/slides-gallery.html @@ -0,0 +1,203 @@ +{{/* Hugo Blox Slides Gallery View - Optimized for slide deck presentations */}} +{{/* Features: 16:9 aspect ratio, play button overlay, slide count, tags, featured badge */}} + +{{ $item := .item }} +{{ $link := $item.RelPermalink }} +{{ $html_format := $item.OutputFormats.Get "HTML" }} +{{ if not $html_format }} + {{ $html_format = $item.OutputFormats.Get "html" }} +{{ end }} +{{ with $html_format }} + {{ $link = .RelPermalink }} +{{ end }} +{{ $present_link := $link }} +{{ $present_format := $item.OutputFormats.Get "present" }} +{{ if not $present_format }} + {{ $present_format = $item.OutputFormats.Get "Present" }} +{{ end }} +{{ with $present_format }} + {{ $present_link = .RelPermalink }} +{{ end }} +{{ $resource := partial "functions/get_featured_image.html" $item }} +{{ $index := .index }} +{{ $featured_label := i18n "featured" | default "Featured" }} +{{ $details_label := i18n "details" | default "Details" }} +{{ $present_label := i18n "present_slides" | default "Present" }} +{{ $present_fullscreen_label := i18n "present_fullscreen" | default "Present (fullscreen)" }} +{{ $slides_label := i18n "slides" | default "Slides" }} + +{{/* Check if featured/pinned */}} +{{ $isFeatured := or $item.Params.featured $item.Params.pinned }} + +{{/* Calculate slide count by counting "---" separators in content */}} +{{ $content := $item.RawContent }} +{{ $slideCount := 1 }} +{{ $separators := findRE "(?m)^---$" $content }} +{{ if $separators }} + {{ $slideCount = add (len $separators) 1 }} + {{/* Subtract 1 for front matter separator if content starts with --- */}} + {{ if hasPrefix $content "---" }} + {{ $slideCount = sub $slideCount 1 }} + {{ end }} +{{ end }} + +{{/* Get summary - use description from front matter or truncate content */}} +{{ $summary := $item.Description | default $item.Summary | default "" }} +{{ $summary = $summary | plainify | truncate 160 }} + +
+ {{/* Featured Badge */}} + {{ if $isFeatured }} +
+ + + + {{ $featured_label }} +
+ {{ end }} + + {{/* Slide Preview Image - 16:9 aspect ratio */}} + + {{ with $resource }} + {{ if strings.Contains .MediaType.SubType "svg" }} + {{ $item.Title | plainify }} + {{ else if ne .MediaType.SubType "gif" }} + {{ $image := .Fill "800x450 Center" }} + {{ $responsive := partial "functions/process_responsive_image.html" (dict + "image" $image + "mode" "responsive" + "sizes" (slice 400 600 800) + "formats" (slice "avif" "webp" "jpg") + ) }} + {{ $item.Title | plainify }} + {{ else }} + {{ $item.Title | plainify }} + {{ end }} + {{ else }} + {{/* Fallback: Decorative gradient with slide icon - smaller, cleaner */}} +
+
+ + + +
+
+ {{ end }} + + {{/* Play button overlay on hover */}} +
+
+ + + +
+
+ + {{/* Slide count badge */}} + {{ if gt $slideCount 1 }} +
+ {{ $slideCount }} {{ $slides_label | lower }} +
+ {{ end }} +
+ + {{/* Content Section */}} +
+ {{/* Tags */}} + {{ if $item.Params.tags }} +
+ {{ range first 3 $item.Params.tags }} + + {{ . }} + + {{ end }} + {{ if gt (len $item.Params.tags) 3 }} + +{{ sub (len $item.Params.tags) 3 }} + {{ end }} +
+ {{ end }} + + {{ $authors := slice }} + {{ with $item.Params.authors }} + {{ if reflect.IsSlice . }} + {{ $authors = . }} + {{ else }} + {{ $authors = slice . }} + {{ end }} + {{ end }} + {{ if gt (len $authors) 0 }} + {{ $author := index $authors 0 }} + {{ $profile := partial "functions/get_author_profile" $author }} + {{ $avatar := $profile.avatar }} + {{ $authorName := $author }} + {{ if $profile.has_data }} + {{ $authorName = $profile.title }} + {{ end }} +
+
+ {{ if $avatar }} + {{ $avatar_48 := $avatar.Process "Fill 48x48 Center webp" }} + {{ $authorName }} + {{ else }} +
+ {{ partial "functions/get_icon" (dict "name" "hero/user" "attributes" "class=\"w-4 h-4 text-zinc-500 dark:text-zinc-400\"") }} +
+ {{ end }} +
+ {{ $authorName }} +
+ {{ end }} + + {{/* Title */}} +

+ {{ $item.Title }} +

+ + {{/* Summary */}} +

{{ if $summary }}{{ $summary }}{{ else }} {{ end }}

+ + {{/* Footer: Venue, Year, Details + Present Links */}} +
+
+ {{ with $item.Params.venue }} + {{ . }} + · + {{ end }} + +
+ +
+
+
diff --git a/modules/blox/layouts/events/page.html b/modules/blox/layouts/events/page.html index 4a5818be..c8984e5f 100644 --- a/modules/blox/layouts/events/page.html +++ b/modules/blox/layouts/events/page.html @@ -67,7 +67,6 @@ {{/* Set Alpine.js flag if author notes exist */}} {{ if isset .Params "author_notes" }} {{ .Store.Set "has_alpine" true }} - {{ end }} {{ range $i, $slug := .Params.authors }} @@ -138,117 +137,7 @@ {{/* EMBEDDED SLIDES SECTION - Replaces featured image for events with slides */}} {{ if .Params.slides }} - {{/* Enable Alpine.js for fullscreen functionality */}} - {{ .Store.Set "has_alpine" true }} - - {{/* Construct slides URL */}} - {{ $slides_page := site.GetPage (printf "/slides/%s" .Params.slides) }} - - {{ if $slides_page }} -
- {{/* Slides iframe container - must contain button for fullscreen visibility */}} -
- - - {{/* Fullscreen toggle button - must be inside fullscreen container */}} - -
- - {{/* Slides metadata */}} -
-
- {{/* Direct link to slides */}} - - - - - View slides in new tab - - - {{/* Presentation mode hint */}} - - S - for speaker notes - -
-
-
- {{ end }} + {{ partial "components/slides-embed.html" (dict "page" . "slides_slug" .Params.slides) }} {{ else }} {{/* Fallback to featured image if no slides */}} {{ $featured := partial "functions/get_featured_image.html" . }} diff --git a/modules/blox/layouts/list.html b/modules/blox/layouts/list.html index 6bcacf79..548fb990 100644 --- a/modules/blox/layouts/list.html +++ b/modules/blox/layouts/list.html @@ -24,7 +24,6 @@ {{ range .Pages }} {{ if isset .Params "author_notes" }} {{ $.Store.Set "has_alpine" true }} - {{ break }} {{ end }} {{ end }} diff --git a/modules/blox/layouts/single.html b/modules/blox/layouts/single.html index fab49d43..8016f4b3 100644 --- a/modules/blox/layouts/single.html +++ b/modules/blox/layouts/single.html @@ -76,7 +76,6 @@ {{/* Set Alpine.js flag if author notes exist */}} {{ if isset .Params "author_notes" }} {{ .Store.Set "has_alpine" true }} - {{ end }} {{ range $i, $slug := .Params.authors }} diff --git a/modules/slides/assets/js/hugoblox-slides.js b/modules/slides/assets/js/hugoblox-slides.js index 168fd92a..2d7444ca 100644 --- a/modules/slides/assets/js/hugoblox-slides.js +++ b/modules/slides/assets/js/hugoblox-slides.js @@ -11,6 +11,9 @@ import * as params from "@params"; +// Guard against null/undefined slides params - ensures decks render with sensible defaults +const slides = params.slides || {}; + // Enable core slide features. var enabledPlugins = [RevealMarkdown, RevealSearch, RevealNotes, RevealMath.KaTeX, RevealZoom]; @@ -38,15 +41,17 @@ const keysToCamelCase = (o) => { // reveal configurations can be included in front matter under slides.reveal var pluginOptions = {}; -if (typeof params.slides.reveal_options !== "undefined") { - pluginOptions = params.slides.reveal_options; +if (typeof slides.reveal_options !== "undefined") { + pluginOptions = slides.reveal_options; } pluginOptions = keysToCamelCase(pluginOptions); -//enable menu by default if not set +// Menu disabled by default (reveal.js-menu@2.1.0 has ESM compatibility issues) +// Menu plugin no longer maintained as of 2026-01 (last updated 6 years ago). +// TODO: consider removing this plugin as it's unlikely to work with modern browsers. if (typeof pluginOptions.menu_enabled === "undefined") { - pluginOptions.menu_enabled = true; + pluginOptions.menu_enabled = false; } // configure menu if enabled @@ -59,18 +64,18 @@ pluginOptions.plugins = enabledPlugins; Reveal.initialize(pluginOptions); // Disable Mermaid by default. -if (typeof params.slides.diagram === "undefined") { - params.slides.diagram = false; +if (typeof slides.diagram === "undefined") { + slides.diagram = false; } // Configure Mermaid only if diagrams are enabled. -if (params.slides.diagram) { +if (slides.diagram) { //mermaid options // mermaid: front matter configuration can be used to set mermaid options // You can also use directives (see mermaid documentation) let mermaidOptions = {}; - if (typeof params.slides.diagram_options !== "undefined") { - mermaidOptions = params.slides.diagram_options; + if (typeof slides.diagram_options !== "undefined") { + mermaidOptions = slides.diagram_options; } // `startOnLoad` must be false since diagrams are lazily rendered. diff --git a/modules/slides/config/_default/hugo.yaml b/modules/slides/config/_default/hugo.yaml new file mode 100644 index 00000000..01eaeeaf --- /dev/null +++ b/modules/slides/config/_default/hugo.yaml @@ -0,0 +1,15 @@ +outputFormats: + Present: + mediaType: text/html + baseName: index + isHTML: true + permalinkable: true + path: present + +cascade: + - _target: + path: "/slides/**" + kind: "page" + outputs: + - HTML + - Present diff --git a/modules/slides/layouts/slides/baseof.html b/modules/slides/layouts/slides/baseof.html index 29239f0d..48369223 100644 --- a/modules/slides/layouts/slides/baseof.html +++ b/modules/slides/layouts/slides/baseof.html @@ -1,78 +1,46 @@ - - +{{/* + Slides Baseof - Landing page chrome only + Presentation output lives in baseof.present.html +*/}} + + +{{- $language_code := site.LanguageCode | default "en-us" -}} + + - - {{/* Asset versions */}} - {{ $cdn_url_reveal := "https://cdn.jsdelivr.net/npm/reveal.js@5.0.4" }} - {{ $mermaid_version := "9.1.3" }} - {{ $mermaid_sri := "sha256-TIYL00Rhw/8WaoUhYTLX9SKIEFdXxg+yMWSLVUbhiLg=" }} - - - - - {{ with site.Home.OutputFormats.Get "WebAppManifest" }} - - {{ end }} - - - - - - - {{ .Title }} | {{ site.Title }} - - {{/* Load Reveal CSS */}} - - {{- $theme := $.Param "slides.theme" | default "black" -}} - - - {{/* Hugo Chroma Syntax Highlighter Initialization */}} - {{ $hl_theme := $.Param "slides.highlight_style" | default "dracula" }} - {{ $hl_theme_path := printf "css/libs/chroma/%s.css" $hl_theme }} - {{ if not (fileExists (printf "assets/%s" $hl_theme_path)) }} - {{ errorf "Hugo Chroma themes %s.css not found in `css/libs/chroma/`. See https://gohugo.io/commands/hugo_gen_chromastyles/" $hl_theme }} - {{ else }} - {{ $hl_theme_css := resources.Get $hl_theme_path | minify }} - - {{ end }} - - {{/* Load any Reveal CSS customizations */}} - {{ $custom_reveal_css := printf "css/reveal_custom.css" }} - {{ if (fileExists (printf "assets/%s" $custom_reveal_css)) }} - {{ $css_custom := resources.Get "css/reveal_custom.css" }} - {{ $style := slice $css_custom | resources.Concat "css/reveal_custom.css" | resources.Minify }} - - {{ end }} + {{ .Title }} | {{ site.Params.hugoblox.identity.name | default site.Title }} + + {{ partial "site_head" . }} + - - {{ block "main" . }}{{ end }} - - {{/* Load Reveal and built-in plugins. */}} - - - - - - - - {{/* Load third-party Reveal plugins. */}} - {{ if $.Param "slides.reveal_options.menu_enabled" | default true}} - - - - {{ end }} - - {{/* Load Mermaid. */}} - {{ if $.Param "slides.diagram" | default false}} - {{ printf "" (printf "https://cdn.jsdelivr.net/npm/mermaid@%s/dist/mermaid.min.js" $mermaid_version) $mermaid_sri | safeHTML }} - {{ end }} - - {{/* Initialize slides. */}} - {{ $slidejs := resources.Get "js/hugoblox-slides.js" | js.Build (dict "params" (dict "slides" $.Params.slides )) }} - + + {{/* Landing page chrome */}} +
+ +
+ {{ block "main" . }}{{ end }} +
+ + + {{ partial "notification-container" . }} + {{ partial "functions/get_hook" (dict "hook" "body-end" "context" .) }} diff --git a/modules/slides/layouts/slides/baseof.present.html b/modules/slides/layouts/slides/baseof.present.html new file mode 100644 index 00000000..340e476c --- /dev/null +++ b/modules/slides/layouts/slides/baseof.present.html @@ -0,0 +1,86 @@ +{{/* + Present Baseof - Presentation output only +*/}} + + +{{- $language_code := site.LanguageCode | default "en-us" -}} + + + + {{/* Asset versions */}} + {{ $cdn_url_reveal := "https://cdn.jsdelivr.net/npm/reveal.js@5.0.4" }} + {{ $mermaid_version := "9.1.3" }} + {{ $mermaid_sri := "sha256-TIYL00Rhw/8WaoUhYTLX9SKIEFdXxg+yMWSLVUbhiLg=" }} + + + + + + + {{ with site.Home.OutputFormats.Get "WebAppManifest" }} + + {{ end }} + + + + + {{ $landing_url := .Permalink }} + {{ with .OutputFormats.Get "HTML" }} + {{ $landing_url = .Permalink }} + {{ end }} + + + + {{ .Title }} | {{ site.Params.hugoblox.identity.name | default site.Title }} + + {{/* Load Reveal CSS */}} + + {{- $theme := $.Param "slides.theme" | default "black" -}} + + + {{/* Hugo Chroma Syntax Highlighter */}} + {{ $hl_theme := $.Param "slides.highlight_style" | default "dracula" }} + {{ $hl_theme_path := printf "css/libs/chroma/%s.css" $hl_theme }} + {{ if fileExists (printf "assets/%s" $hl_theme_path) }} + {{ $hl_theme_css := resources.Get $hl_theme_path | minify }} + + {{ end }} + + {{/* Reveal print styles (paper or PDF) */}} + + + + + {{ block "main" . }}{{ end }} + + {{/* Load Reveal and plugins */}} + + + + + + + + {{/* Load Mermaid if enabled */}} + {{ if $.Param "slides.diagram" | default false}} + {{ printf "" (printf "https://cdn.jsdelivr.net/npm/mermaid@%s/dist/mermaid.min.js" $mermaid_version) $mermaid_sri | safeHTML }} + {{ end }} + + {{/* Initialize Reveal */}} + {{ $slidejs := resources.Get "js/hugoblox-slides.js" | js.Build (dict "params" (dict "slides" $.Params.slides )) | fingerprint }} + + + {{ partial "functions/get_hook" (dict "hook" "body-end" "context" .) }} + + + diff --git a/modules/slides/layouts/slides/list.html b/modules/slides/layouts/slides/list.html index e69de29b..7bca76f3 100644 --- a/modules/slides/layouts/slides/list.html +++ b/modules/slides/layouts/slides/list.html @@ -0,0 +1,212 @@ +{{ define "main" }} + +{{/* Enable Alpine.js for tag filtering */}} +{{ .Store.Set "has_alpine" true }} + +{{/* Collect all unique tags from slides */}} +{{ $allTags := slice }} +{{ $featuredPages := slice }} +{{ $regularPages := slice }} +{{ $search_placeholder := i18n "slides_search_placeholder" | default "Search decks by title..." }} +{{ $all_label := i18n "all" | default "All" }} +{{ $no_decks_label := i18n "slides_no_decks" | default "No slide decks found" }} +{{ $no_matches_label := i18n "slides_no_matches" | default "No decks match your filters" }} +{{ $clear_filters_label := i18n "clear_filters" | default "Clear filters" }} + +{{ range .Pages }} + {{ if .Params.tags }} + {{ range .Params.tags }} + {{ $allTags = $allTags | append . }} + {{ end }} + {{ end }} + {{ if or .Params.featured .Params.pinned }} + {{ $featuredPages = $featuredPages | append . }} + {{ else }} + {{ $regularPages = $regularPages | append . }} + {{ end }} +{{ end }} + +{{ $allTags = $allTags | uniq | sort }} + +{{/* Sort featured by date descending, then regular by date descending */}} +{{ $featuredPages = sort $featuredPages ".Date" "desc" }} +{{ $regularPages = sort $regularPages ".Date" "desc" }} +{{ $sortedPages := $featuredPages | append $regularPages }} + +
+ + {{/* Page Header */}} +
+

{{ .Title }}

+ {{ with .Content }} +
+ {{ . }} +
+ {{ end }} +
+ + {{/* Search and Filter Bar */}} +
+ {{/* Search input */}} +
+ + + + +
+ + {{/* Tag Filter Chips */}} + {{ if $allTags }} +
+ + {{ range $allTags }} + + {{ end }} +
+ {{ end }} +
+ + {{/* Decks Grid */}} + {{ $view := .Params.view | default "slides-gallery" }} + {{ $config := dict + "columns" (.Params.columns | default 2) + "len" (len $sortedPages) + "fill_image" (.Params.fill_image | default true) + "show_date" (.Params.show_date | default true) + }} + + {{ partial "functions/render_view" (dict "fragment" "start" "page" . "item" . "view" $view "config" $config) }} + + {{ range $index, $item := $sortedPages }} + {{ $tags := $item.Params.tags | default (slice) }} + {{ $tagsJson := $tags | jsonify }} + {{ $authorList := slice }} + {{ with $item.Params.authors }} + {{ if reflect.IsSlice . }} + {{ $authorList = . }} + {{ else }} + {{ $authorList = slice . }} + {{ end }} + {{ end }} + {{ $authorNames := slice }} + {{ range $authorList }} + {{ $profile := partial "functions/get_author_profile" . }} + {{ $authorName := . }} + {{ if $profile.has_data }} + {{ $authorName = $profile.title }} + {{ end }} + {{ $authorNames = $authorNames | append $authorName }} + {{ end }} + {{ $searchParts := slice $item.Title }} + {{ with $item.Params.venue }} + {{ $searchParts = $searchParts | append . }} + {{ end }} + {{ if gt (len $authorNames) 0 }} + {{ $searchParts = $searchParts | append (delimit $authorNames " ") }} + {{ end }} + {{ if gt (len $tags) 0 }} + {{ $searchParts = $searchParts | append (delimit $tags " ") }} + {{ end }} + {{ $searchText := (delimit $searchParts " ") | lower }} + +
+ {{ partial "functions/render_view" (dict "page" $ "item" $item "view" $view "index" $index "config" $config) }} +
+ {{ end }} + + {{ partial "functions/render_view" (dict "fragment" "end" "page" . "item" . "view" $view) }} + + {{/* Empty state */}} + {{ if eq (len $sortedPages) 0 }} +
+ + + +

{{ $no_decks_label }}

+
+ {{ end }} + + {{/* No matches empty state */}} +
+ + + +

{{ $no_matches_label }}

+ +
+ +
+ + + +{{ end }} diff --git a/modules/slides/layouts/slides/presenter.html b/modules/slides/layouts/slides/presenter.html new file mode 100644 index 00000000..27ffc29c --- /dev/null +++ b/modules/slides/layouts/slides/presenter.html @@ -0,0 +1,14 @@ +{{/* + Presenter Layout - Full-screen Reveal.js presentation + Uses parent page's slide content + Route: /slides//present/ +*/}} + +{{/* Get parent deck page (the actual slides content) */}} +{{ $deckPage := .Parent }} +{{ if not $deckPage }} + {{ $deckPage = . }} +{{ end }} + +{{/* Render using modules/slides presentation layout */}} +{{ partial "slides" (union (slice $deckPage) $deckPage.Pages) }} diff --git a/modules/slides/layouts/slides/single.html b/modules/slides/layouts/slides/single.html index 6bd27b18..134a872d 100644 --- a/modules/slides/layouts/slides/single.html +++ b/modules/slides/layouts/slides/single.html @@ -1,3 +1,335 @@ +{{/* + Smart Slides Single Layout + Landing page for slide decks. + Presentation output is rendered via the present output format. +*/}} + {{ define "main" }} -{{ partial "slides" (union (slice .Page) .Pages) }} + +{{ $present_format := .OutputFormats.Get "present" }} +{{ $back_to_slides_label := i18n "back_to_slides" | default "Back to Slides" }} +{{ $featured_label := i18n "featured" | default "Featured" }} +{{ $slides_label := i18n "slides" | default "Slides" }} +{{ $abstract_label := i18n "callout_abstract" | default "Abstract" }} +{{ $topics_label := i18n "topics" | default "Topics" }} +{{ $related_resources_label := i18n "related_resources" | default "Related Resources" }} +{{ $present_fullscreen_label := i18n "present_fullscreen" | default "Present (fullscreen)" }} +{{ $copy_link_label := i18n "copy_link" | default "Copy Link" }} +{{ $copy_citation_label := i18n "copy_citation" | default "Copy citation" }} +{{ $copied_label := i18n "btn_copied" | default "Copied" }} +{{ $export_pdf_label := i18n "export_pdf_print" | default "Export PDF (print)" }} +{{ $print_hint := i18n "slides_print_hint" | default "Opens in print mode - use browser Print > Save as PDF" }} +{{ $how_to_cite_label := i18n "how_to_cite" | default "How to cite" }} +{{ $citation_label := i18n "citation" | default "Citation" }} +{{ $doi_label := i18n "btn_doi" | default "DOI" }} +{{ $bibtex_label := i18n "bibtex" | default "BibTeX" }} +{{ $download_cite_bib_label := i18n "download_cite_bib" | default "Download cite.bib" }} +{{ $lecture_label := i18n "lecture" | default "Lecture" }} + +{{/* LANDING PAGE CONTENT */}} +
+ + {{/* Get slide metadata */}} + {{ $authors := .Params.authors | default (slice) }} + {{ $venue := .Params.venue }} + {{ $event := .Params.event }} + {{ $course := .Params.course }} + {{ $lecture := .Params.lecture_number }} + {{ $tags := .Params.tags | default (slice) }} + {{ $topics := .Params.topics | default $tags }} + {{ $description := .Params.abstract | default .Params.summary | default .Description }} + {{ $citation := .Params.citation }} + + {{ $authorNames := slice }} + {{ $authorList := slice }} + {{ with $authors }} + {{ if reflect.IsSlice . }} + {{ $authorList = . }} + {{ else }} + {{ $authorList = slice . }} + {{ end }} + {{ end }} + {{ range $authorList }} + {{ $profile := partial "functions/get_author_profile" . }} + {{ $authorName := . }} + {{ if $profile.has_data }} + {{ $authorName = $profile.title }} + {{ end }} + {{ $authorNames = $authorNames | append $authorName }} + {{ end }} + + {{/* Build links using HugoBlox standard structure */}} + {{ $builtLinks := partial "functions/build_links.html" (dict "page" . "is_list" false) }} + + {{/* Filter links by type for Related Resources section */}} + {{ $resourceLinks := slice }} + {{ $citationLinks := slice }} + {{ range $builtLinks }} + {{ if in (slice "pdf" "preprint" "code" "video" "dataset" "demo" "site") .type }} + {{ $resourceLinks = $resourceLinks | append . }} + {{ else if in (slice "doi" "bibtex") .type }} + {{ $citationLinks = $citationLinks | append . }} + {{ end }} + {{ end }} + + {{ $citation_copy := "" }} + {{ if $citation }} + {{ $citation_copy = $citation }} + {{ else }} + {{ range $citationLinks }} + {{ if and (eq $citation_copy "") (eq .type "doi") }} + {{ $citation_copy = .url }} + {{ else if and (eq $citation_copy "") (eq .type "bibtex") }} + {{ $citation_copy = .url }} + {{ end }} + {{ end }} + {{ end }} + {{ $has_citation_copy := ne $citation_copy "" }} + + {{/* Calculate slide count */}} + {{ $content := .RawContent }} + {{ $slideCount := 1 }} + {{ $separators := findRE "(?m)^---$" $content }} + {{ if $separators }} + {{ $slideCount = add (len $separators) 1 }} + {{ if hasPrefix $content "---" }} + {{ $slideCount = sub $slideCount 1 }} + {{ end }} + {{ end }} + +
+ + {{/* Back to library link */}} + + + + + {{ $back_to_slides_label }} + + + {{/* Main content card */}} +
+ + {{/* Hero section with gradient */}} +
+ {{/* Featured badge */}} + {{ if or .Params.featured .Params.pinned }} +
+ + + + {{ $featured_label }} +
+ {{ end }} + +

{{ .Title }}

+ + {{/* Meta info */}} +
+ {{ if gt (len $authorNames) 0 }} +
+ + + + {{ delimit $authorNames ", " }} +
+ {{ end }} + + {{ with $venue }} +
+ + + + + {{ . }} +
+ {{ end }} + + {{ with $event }} +
+ + + + {{ . }} +
+ {{ end }} + + {{ if $course }} +
+ + + + {{ $course }}{{ with $lecture }} - {{ $lecture_label }} {{ . }}{{ end }} +
+ {{ end }} + +
+ + + + {{ .Date | time.Format "January 2006" }} +
+ +
+ + + + {{ $slideCount }} {{ $slides_label | lower }} +
+
+
+ + {{/* Content section */}} +
+ {{/* Description/Abstract */}} + {{ with $description }} +
+

{{ $abstract_label }}

+

{{ . }}

+
+ {{ end }} + + {{/* Topics/Tags */}} + {{ if $topics }} +
+

{{ $topics_label }}

+
+ {{ range $topics }} + + {{ . }} + + {{ end }} +
+
+ {{ end }} + + {{/* Related Resources - Use HugoBlox standard links */}} + {{ if $resourceLinks }} +
+

{{ $related_resources_label }}

+
+ {{ range $resourceLinks }} + {{ $linkLabel := .label }} + {{ with .labelKey }} + {{ $linkLabel = i18n . | default $linkLabel }} + {{ end }} + {{ $target := "" }} + {{ $rel := "" }} + {{ $scheme := (urls.Parse .url).Scheme }} + {{ if in (slice "http" "https") $scheme }} + {{ $target = "_blank" }} + {{ $rel = "noopener" }} + {{ end }} + + + {{ partial "functions/get_icon" (dict "name" (.icon | default "hero/link") "attributes" "class='w-4 h-4'") }} + {{ $linkLabel }} + + {{ end }} +
+
+ {{ end }} + + {{/* Share Panel */}} +
+ {{/* Open Presenter */}} + {{ with $present_format }} + + + + + {{ $present_fullscreen_label }} + + {{ end }} + + {{/* Copy Link */}} + + + {{/* Copy Citation */}} + {{ if $has_citation_copy }} + + {{ end }} + + {{/* Print PDF */}} + {{ with $present_format }} + + + + + {{ $export_pdf_label }} + + {{ end }} +
+ + {{/* Citation Section - Use HugoBlox standard links + citation field */}} + {{ if or $citation $citationLinks }} +
+ +
+ {{ with $citation }} +
+

{{ $citation_label }}

+
{{ . }}
+
+ {{ end }} + + {{/* DOI and BibTeX from standard links structure */}} + {{ range $citationLinks }} + {{ if eq .type "doi" }} + + {{ else if eq .type "bibtex" }} +
+

{{ $bibtex_label }}

+ + {{ $download_cite_bib_label }} + +
+ {{ end }} + {{ end }} +
+
+ {{ end }} + +
+
+ +
+ +
+ {{ end }} diff --git a/modules/slides/layouts/slides/single.present.html b/modules/slides/layouts/slides/single.present.html new file mode 100644 index 00000000..6bd27b18 --- /dev/null +++ b/modules/slides/layouts/slides/single.present.html @@ -0,0 +1,3 @@ +{{ define "main" }} +{{ partial "slides" (union (slice .Page) .Pages) }} +{{ end }} diff --git a/templates/academic-cv/config/_default/hugo.yaml b/templates/academic-cv/config/_default/hugo.yaml index 16c633f1..5767523f 100644 --- a/templates/academic-cv/config/_default/hugo.yaml +++ b/templates/academic-cv/config/_default/hugo.yaml @@ -17,6 +17,16 @@ hasCJKLanguage: false defaultContentLanguageInSubdir: false removePathAccents: true +############################ +## PAGE OPTIONS +############################ + +cascade: + - _target: + path: /slides/** + kind: page + outputs: [HTML, present] + ############################ ## ADVANCED ############################ diff --git a/templates/academic-cv/content/slides/example/index.md b/templates/academic-cv/content/slides/example/index.md index 0d562503..8f4d7760 100644 --- a/templates/academic-cv/content/slides/example/index.md +++ b/templates/academic-cv/content/slides/example/index.md @@ -3,6 +3,7 @@ title: "Example Talk: Recent Work" date: 2024-01-01 # `type: slides` is inferred from folder, but can be set explicitly: type: slides +summary: "A quick tour of recent research highlights: multimodal LLMs, efficient training, and responsible AI." slides: theme: black highlight_style: dracula diff --git a/templates/markdown-slides/.devcontainer/devcontainer.json b/templates/markdown-slides/.devcontainer/devcontainer.json new file mode 100644 index 00000000..cba4ea48 --- /dev/null +++ b/templates/markdown-slides/.devcontainer/devcontainer.json @@ -0,0 +1,25 @@ +{ + "name": "HugoBlox Codespace", + "image": "ghcr.io/HugoBlox/hugo-blox-dev:hugo0.154.2", + "updateContentCommand": "pnpm install --frozen-lockfile --prefer-offline", + "postCreateCommand": "pnpm --version && hugo version", + "customizations": { + "vscode": { + "extensions": [ + "hugoblox.hugoblox-studio" + ] + } + }, + "mounts": [ + "source=pnpm-store,target=/home/vscode/.local/share/pnpm,type=volume" + ], + "remoteUser": "vscode", + "forwardPorts": [ + 1313 + ], + "portsAttributes": { + "1313": { + "label": "Hugo Server" + } + } +} diff --git a/templates/markdown-slides/.github/FUNDING.yml b/templates/markdown-slides/.github/FUNDING.yml new file mode 100644 index 00000000..2ed14d29 --- /dev/null +++ b/templates/markdown-slides/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: gcushen +custom: https://hugoblox.com/sponsor/ diff --git a/templates/markdown-slides/.github/preview.png b/templates/markdown-slides/.github/preview.png new file mode 100644 index 00000000..989667b8 Binary files /dev/null and b/templates/markdown-slides/.github/preview.png differ diff --git a/templates/markdown-slides/.github/workflows/deploy.yml b/templates/markdown-slides/.github/workflows/deploy.yml new file mode 100644 index 00000000..fc593765 --- /dev/null +++ b/templates/markdown-slides/.github/workflows/deploy.yml @@ -0,0 +1,125 @@ +name: Deploy website to GitHub Pages + +env: + NODE_VERSION: '20' + +on: + # Trigger the workflow every time you push to the `main` branch + push: + branches: ['main'] + # Allows you to run this workflow manually from the Actions tab on GitHub + workflow_dispatch: + +# Provide permission to clone the repo and deploy it to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: 'pages' + cancel-in-progress: false + +jobs: + # Build website + build: + if: github.repository_owner != 'HugoBlox' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + # Fetch history for Hugo's .GitInfo and .Lastmod + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Setup pnpm + if: hashFiles('package.json') != '' + uses: pnpm/action-setup@v4 + + - name: Get Hugo Version + id: hugo-version + run: | + VERSION=$(grep "hugo_version" hugoblox.yaml | awk '{print $2}' | tr -d "'\"") + echo "HUGO_VERSION=$VERSION" >> $GITHUB_ENV + + - name: Install dependencies + run: | + # Install Tailwind CLI if package.json exists + if [ -f "package.json" ]; then + echo "Installing Tailwind dependencies..." + pnpm install --no-frozen-lockfile || npm install + fi + + - name: Setup Hugo + uses: peaceiris/actions-hugo@v3 + with: + hugo-version: ${{ env.HUGO_VERSION }} + extended: true + + # Cache dependencies (Go modules, node_modules) - stable, rarely changes + - uses: actions/cache@v4 + with: + path: | + /tmp/hugo_cache_runner/ + node_modules/ + modules/*/node_modules/ + key: ${{ runner.os }}-hugo-deps-${{ hashFiles('**/go.mod', '**/package-lock.json', + '**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-hugo-deps- + + # Cache Hugo resources (processed images, CSS) - invalidates only when assets/config change + - uses: actions/cache@v4 + with: + path: resources/ + key: ${{ runner.os }}-hugo-resources-${{ hashFiles('assets/**/*', 'config/**/*', + 'hugo.yaml', 'package.json') }} + restore-keys: | + ${{ runner.os }}-hugo-resources- + + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + + - name: Build with Hugo + env: + HUGO_ENVIRONMENT: production + HUGO_BLOX_LICENSE: ${{ secrets.HUGO_BLOX_LICENSE }} + run: | + echo "Hugo Cache Dir: $(hugo config | grep cachedir)" + hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/" + + - name: Generate Pagefind search index (if applicable) + run: | + # Check if site uses Pagefind search + if [ -f "package.json" ] && grep -q "pagefind" package.json; then + pnpm run pagefind || npx pagefind --site "public" + fi + + - name: Upload artifact + uses: actions/upload-pages-artifact@v4 + with: + path: ./public + + # Deploy website to GitHub Pages hosting + deploy: + if: github.repository_owner != 'HugoBlox' + needs: build + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/templates/markdown-slides/.gitignore b/templates/markdown-slides/.gitignore new file mode 100644 index 00000000..5c572926 --- /dev/null +++ b/templates/markdown-slides/.gitignore @@ -0,0 +1,69 @@ +# ============================================================================ +# Hugo Site .gitignore +# ============================================================================ + +# ============================================================================ +# Hugo Build Artifacts +# ============================================================================ + +# Generated site output +public/ + +# Hugo resources (processed assets) +resources/ + +# Hugo build lock +.hugo_build.lock + +# Hugo stats +hugo_stats.json + +# Auto-generated JS config +**/assets/jsconfig.json + +# ============================================================================ +# Node.js & Package Managers +# ============================================================================ + +# Dependencies +node_modules/ + +# ============================================================================ +# Environment & Configuration +# ============================================================================ + +# Environment variables +.env +.env.local +.env.*.local + +# ============================================================================ +# Generated Content +# ============================================================================ + +# Pagefind search index +pagefind/ +static/pagefind/ + +# ============================================================================ +# Operating System +# ============================================================================ + +# macOS +.DS_Store +.DS_Store? +._* + +# Windows +Thumbs.db +Desktop.ini + +# Linux +*~ + +# ============================================================================ +# Logs & Temporary Files +# ============================================================================ + +*.log +npm-debug.log* diff --git a/templates/markdown-slides/LICENSE.md b/templates/markdown-slides/LICENSE.md new file mode 100644 index 00000000..d25bdeb5 --- /dev/null +++ b/templates/markdown-slides/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023-present George Cushen (https://georgecushen.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/templates/markdown-slides/README.md b/templates/markdown-slides/README.md new file mode 100644 index 00000000..5ddf6739 --- /dev/null +++ b/templates/markdown-slides/README.md @@ -0,0 +1,128 @@ +# [Markdown Slides](https://hugoblox.com/templates/markdown-slides/start?utm_source=github&utm_medium=readme) + +[![Screenshot](.github/preview.png)](https://hugoblox.com/templates/markdown-slides/start?utm_source=github&utm_medium=readme) + +

The Presentation Framework for Researchers

+ +

+ Stop wrestling with PowerPoint.
+ Write slides in Markdown, version control your talks, and present code & math beautifully. +

+ +

+ 🚀 Deploy in 60s (Free) +  •  + Live Demo +  •  + HugoBlox Studio (Visual Editor) +

+ + +

+ ▶︎ Watch Preview +

+ + +

+ Video coming soon... +

+ +

+ Discord + GitHub Stars + Follow on X +

+ +--- + +## Why this template? + +Traditional slide software (PowerPoint, Keynote) locks your content in binary files, breaks code formatting, and makes version control a nightmare. + +- **📝 Markdown-first**: Write slides like you write papers. Focus on content, not pixel-perfect alignment. +- **⚗️ Research-ready**: Native support for LaTeX math ($E=mc^2$), citations, and rich metadata (venue, DOI, authors). +- **💻 Code-native**: Beautiful syntax highlighting for 100+ languages without screenshots. +- **🎓 Deck Landing Pages**: Every presentation gets a dedicated searchable landing page with abstract and download links. +- **🚀 Present Anywhere**: Browser-based presenter mode (Reveal.js) with speaker notes, timer, and offline support. + +--- + +## Who it’s for + +- **Academics** presenting at conferences (share a URL, not a USB drive). +- **Data Scientists** explaining complex analyses with real code snippets. +- **Lecturers** creating course materials that students can actually search, read, and fork. +- **Developers** who prefer their IDE over a GUI presentation tool. + +--- + +## What you get (Free) + +- **Professional Presenter Mode**: Speaker notes, timer, and next-slide preview. +- **Rich Metadata**: Associate events, co-authors, and related links with each deck. +- **PDF Export**: One-click printable version for handouts. +- **Mermaid Diagrams**: Draw flowcharts and sequence diagrams in text. +- **Theming**: Light, dark, and custom themes included. +- **Mobile Optimized**: Responsive gallery and slide viewer. + +--- + +## Get started (recommended) + +### Option 1 — Online deployer (fastest) + +Deploy this template in ~60 seconds: + +- [Deploy in browser →](https://hugoblox.com/templates/markdown-slides/start?utm_source=github&utm_medium=readme) + +### Option 2 — HugoBlox Studio (visual editor in VS Code) + +- [Studio guide →](https://docs.hugoblox.com/guides/studio/?utm_source=github&utm_medium=readme) +- [Studio AI automation plans (Free/Plus/Pro) →](https://hugoblox.com/pricing/?utm_source=github&utm_medium=readme) + +### Option 3 — HugoBlox CLI (developer workflow) + +Install: + +```bash +npm install -g hugoblox@latest +``` + +Create a site: + +```bash +hugoblox create site --template markdown-slides +``` + +[CLI docs →](https://docs.hugoblox.com/start/cli/?utm_source=github&utm_medium=readme) + +--- + +## Customize in 10 minutes + +- **Create a deck**: `content/slides/my-talk/index.md` +- **Slide syntax**: Use `---` to separate slides. +- **Speaker notes**: Use `Note:` at the end of a slide. +- **Theme**: Set `slides.theme: black` (or white, league, night, etc.) in frontmatter. +- **Site Identity**: `config/_default/params.yaml` + +--- + +## Want the Pro version? 💎 + +If you want a version that feels meaningfully more premium (and helps fund open source + research): + +- [Premium templates →](https://hugoblox.com/templates/?utm_source=github&utm_medium=readme) +- [HugoBlox Pro / Studio →](https://hugoblox.com/pricing?utm_source=github&utm_medium=readme) + +--- + +## Community & support + +- **Docs**: [docs.hugoblox.com →](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme) +- **Discord**: [Join Discord →](https://discord.gg/z8wNYzb) +- **Issues**: [Open an issue →](https://github.com/HugoBlox/kit/issues) + +--- + +MIT © 2016–Present [George Cushen](https://neuralgeo.com/?utm_source=github&utm_medium=readme) diff --git a/templates/markdown-slides/assets/media/authors/me.png b/templates/markdown-slides/assets/media/authors/me.png new file mode 100644 index 00000000..5ebc1f3b Binary files /dev/null and b/templates/markdown-slides/assets/media/authors/me.png differ diff --git a/templates/markdown-slides/assets/media/icon.svg b/templates/markdown-slides/assets/media/icon.svg new file mode 100644 index 00000000..920fae34 --- /dev/null +++ b/templates/markdown-slides/assets/media/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/templates/markdown-slides/config/_default/hugo.yaml b/templates/markdown-slides/config/_default/hugo.yaml new file mode 100644 index 00000000..fef73e9c --- /dev/null +++ b/templates/markdown-slides/config/_default/hugo.yaml @@ -0,0 +1,62 @@ +# Configuration of Hugo +# Documentation: https://gohugo.io/getting-started/configuration/ + +# Website name (set in params.yaml under hugoblox.identity.name) +title: '' +# Website URL +baseURL: 'https://example.com/' + +############################ +## LANGUAGE +############################ + +defaultContentLanguage: en +hasCJKLanguage: false +removePathAccents: true + +############################ +## ADVANCED +############################ + +build: + writeStats: true +enableGitInfo: false +summaryLength: 30 +pagination: + pagerSize: 12 +enableEmoji: true +enableRobotsTXT: true +footnotereturnlinkcontents: ^ +disableAliases: true +outputs: + home: [HTML, RSS, headers, redirects] + section: [HTML, RSS] + page: [HTML] +outputFormats: + HTML: + baseName: index + present: + baseName: index + isHTML: true + mediaType: text/html + permalinkable: true + path: present + rel: alternate + +permalinks: + slides: /slides/:contentbasename/ +imaging: + resampleFilter: lanczos + quality: 90 + anchor: smart +timeout: 600000 +taxonomies: + tag: tags +markup: + _merge: deep + highlight: + lineNos: false +security: + _merge: deep +sitemap: + _merge: deep diff --git a/templates/markdown-slides/config/_default/menus.yaml b/templates/markdown-slides/config/_default/menus.yaml new file mode 100644 index 00000000..402eaa36 --- /dev/null +++ b/templates/markdown-slides/config/_default/menus.yaml @@ -0,0 +1,10 @@ +# Navigation Links +# Simple navigation for a slides-focused site + +main: + - name: Home + url: / + weight: 10 + - name: Browse Decks + url: /slides/ + weight: 20 diff --git a/templates/markdown-slides/config/_default/module.yaml b/templates/markdown-slides/config/_default/module.yaml new file mode 100644 index 00000000..aadb9dc5 --- /dev/null +++ b/templates/markdown-slides/config/_default/module.yaml @@ -0,0 +1,10 @@ +############################ +## HUGO MODULES +## Install or uninstall themes and plugins here. +## Docs: https://gohugo.io/hugo-modules/ +############################ + +imports: + - path: github.com/HugoBlox/kit/modules/integrations/netlify + - path: github.com/HugoBlox/kit/modules/blox + - path: github.com/HugoBlox/kit/modules/slides diff --git a/templates/markdown-slides/config/_default/params.yaml b/templates/markdown-slides/config/_default/params.yaml new file mode 100644 index 00000000..8d32912b --- /dev/null +++ b/templates/markdown-slides/config/_default/params.yaml @@ -0,0 +1,131 @@ +# ══════════════════════════════════════════════════════════════════════════════ +# MARKDOWN SLIDES - HUGO BLOX CONFIGURATION +# A minimal template for hosting and sharing slide decks +# Documentation: https://docs.hugoblox.com/ +# ══════════════════════════════════════════════════════════════════════════════ +hugoblox: + schema: "2.0" + + # ──────────────────────────────────────────────────────────────────────────── + # IDENTITY + # Customize your slide deck site branding + # ──────────────────────────────────────────────────────────────────────────── + identity: + name: "My Slides" + organization: "" + type: person # person | organization + tagline: "Open-source slide decks" + description: "Markdown-based slide presentations. Write in Markdown, present anywhere, share with anyone." + social: + twitter: "" # Twitter/X handle for social cards + + # ──────────────────────────────────────────────────────────────────────────── + # THEME + # ──────────────────────────────────────────────────────────────────────────── + theme: + mode: system # light | dark | system + pack: "default" + colors: + primary: "" + secondary: "" + neutral: "" + + # ──────────────────────────────────────────────────────────────────────────── + # TYPOGRAPHY + # ──────────────────────────────────────────────────────────────────────────── + typography: + font: "sans" # sans | serif | native + size: "md" # sm | md | lg | xl + + # ──────────────────────────────────────────────────────────────────────────── + # LAYOUT + # ──────────────────────────────────────────────────────────────────────────── + layout: + radius: "md" + spacing: "comfortable" + + # ──────────────────────────────────────────────────────────────────────────── + # HEADER + # ──────────────────────────────────────────────────────────────────────────── + header: + enable: true + style: navbar-simple # Clean, minimal navbar + sticky: true + align: center + search: true # Enable search for larger deck collections + theme_toggle: true + theme_picker: false + language_switcher: false + + # ──────────────────────────────────────────────────────────────────────────── + # FOOTER + # ──────────────────────────────────────────────────────────────────────────── + footer: + style: minimal + language_switcher: false + text: "" + + # ──────────────────────────────────────────────────────────────────────────── + # COPYRIGHT + # ──────────────────────────────────────────────────────────────────────────── + copyright: + notice: "© {year} {name}" + license: + type: cc + allow_derivatives: true + share_alike: true + allow_commercial: false + + # ──────────────────────────────────────────────────────────────────────────── + # CONTENT + # Math is enabled by default for technical presentations + # ──────────────────────────────────────────────────────────────────────────── + content: + math: + enable: true # Enable LaTeX math for technical decks + toc: + enable: false # Not needed for slides + reading_time: + enable: false # Not relevant for slides + + # ──────────────────────────────────────────────────────────────────────────── + # SEARCH + # ──────────────────────────────────────────────────────────────────────────── + search: + enable: true + suggestions: [] + + # ──────────────────────────────────────────────────────────────────────────── + # COMMENTS - Disabled by default + # ──────────────────────────────────────────────────────────────────────────── + comments: + enable: false + + # ──────────────────────────────────────────────────────────────────────────── + # ANALYTICS - Add your tracking IDs + # ──────────────────────────────────────────────────────────────────────────── + analytics: + google: + measurement_id: "" + plausible: + domain: "" + + # ──────────────────────────────────────────────────────────────────────────── + # LOCALE + # ──────────────────────────────────────────────────────────────────────────── + locale: + date_format: "Jan 2, 2006" + time_format: "3:04 PM" + + # ──────────────────────────────────────────────────────────────────────────── + # SECURITY - Allow slides to be embedded in iframes + # ──────────────────────────────────────────────────────────────────────────── + security: + frame_options: sameorigin + + # ──────────────────────────────────────────────────────────────────────────── + # PRO + # ──────────────────────────────────────────────────────────────────────────── + pro: + hide_attribution: false + affiliate_code: "" diff --git a/templates/markdown-slides/content/_index.md b/templates/markdown-slides/content/_index.md new file mode 100644 index 00000000..286892fc --- /dev/null +++ b/templates/markdown-slides/content/_index.md @@ -0,0 +1,77 @@ +--- +title: '' +summary: '' +date: 2025-01-01 +type: landing + +design: + spacing: '4rem' + +sections: + # Hero Section + - block: hero + content: + title: Markdown Slides + text: |- + **Open-source slide decks.** + Write in Markdown, present anywhere, share with anyone. + primary_action: + text: Browse Decks + url: '/slides/' + icon: play + secondary_action: + text: Create Your Own + url: https://hugoblox.com/templates/markdown-slides/start?utm_source=hugoblox&utm_medium=demo + design: + spacing: + padding: ['5rem', '0', '4rem', '0'] + css_class: 'dark:bg-zinc-900' + + - block: features + content: + title: Why Markdown Slides + text: 'Best for: lab meetings, course lectures, paper reading groups, and startup demos.' + items: + - name: Version-controlled research + description: Write decks like code, track diffs, and cite stable versions. + icon: hero/code-bracket + - name: Research-native media + description: Math, citations, syntax highlighting, and diagrams out of the box. + icon: hero/document-text + - name: Future-proof format + description: Most future-proof format - Markdown is LLM-native for human-first, AI-assisted workflows. + icon: hero/bolt + + # Featured Decks Row + - block: collection + id: decks + content: + title: Featured Decks + text: '' + filters: + folders: + - slides + featured_only: true + sort_by: Date + sort_ascending: false + count: 3 + design: + view: slides-gallery + columns: 2 + + - block: collection + id: recent + content: + title: Recent Decks + text: '' + filters: + folders: + - slides + exclude_featured: true + sort_by: Date + sort_ascending: false + count: 0 + design: + view: slides-gallery + columns: 2 +--- diff --git a/templates/markdown-slides/content/slides/_index.md b/templates/markdown-slides/content/slides/_index.md new file mode 100644 index 00000000..e0194096 --- /dev/null +++ b/templates/markdown-slides/content/slides/_index.md @@ -0,0 +1,12 @@ +--- +title: All Slide Decks +description: Browse all available slide presentations +view: slides-gallery +columns: 2 +cascade: + outputs: + - HTML + - present +--- + +Browse all slide decks below. Click any deck to start the presentation. diff --git a/templates/markdown-slides/content/slides/example/index.md b/templates/markdown-slides/content/slides/example/index.md new file mode 100644 index 00000000..6e8161ac --- /dev/null +++ b/templates/markdown-slides/content/slides/example/index.md @@ -0,0 +1,166 @@ +--- +title: "Markdown Slides Demo" +date: 2025-12-15 +description: "A comprehensive demo of all Reveal.js features available in Hugo Blox" +authors: ["me", "Hugo Blox Team"] +tags: ["demo", "tutorial", "features"] +venue: "Hugo Blox Tutorial" +featured: true +type: slides +slides: + theme: black + highlight_style: dracula + diagram: true + reveal_options: + controls: true + progress: true + slideNumber: true + hash: true +--- + +# Markdown Slides + +### Write in Markdown. Present Anywhere. + +--- + +## What You Can Do + +- Write slides in **pure Markdown** +- Include **code**, **math**, and **diagrams** +- Add **speaker notes** for presenter view +- Use **progressive reveals** for storytelling +- Customize **themes** and **transitions** + +--- + +## Code Highlighting + +```python +def fibonacci(n: int) -> int: + if n <= 1: + return n + return fibonacci(n-1) + fibonacci(n-2) + +# Calculate the 10th Fibonacci number +print(fibonacci(10)) # Output: 55 +``` + +--- + +## Mathematical Equations + +Einstein's famous equation: + +$$E = mc^2$$ + +The quadratic formula: + +$$x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}$$ + +--- + +## Mermaid Diagrams + +```mermaid +graph LR + A[Markdown] --> B[Hugo] + B --> C[Reveal.js] + C --> D[Beautiful Slides] +``` + +--- + +## Progressive Reveals + +Build your narrative step by step: + +{{< fragment >}}First, introduce the concept{{< /fragment >}} + +{{< fragment >}}Then, add supporting details{{< /fragment >}} + +{{< fragment >}}Finally, deliver the conclusion{{< /fragment >}} + +--- + +## Speaker Notes + +Press **S** to open presenter view! + +Note: +- These notes are only visible in presenter mode +- Perfect for talking points and reminders +- Supports **Markdown** formatting +- Add timing cues and references here + +--- + +## Dual Column Layout + +
+ +
+ +### Benefits + +- Open source +- Version control +- No vendor lock-in +- Works offline + +
+ +
+ +### Use Cases + +- Tech talks +- Academic papers +- Team updates +- Training sessions + +
+ +
+ +--- + +{{< slide background-color="#1e3a8a" >}} + +## Custom Backgrounds + +Slides can have **custom colors** or images. + +Use `{{}}` + +--- + +## Keyboard Shortcuts + +| Key | Action | +|-----|--------| +| `→` / `←` | Navigate slides | +| `S` | Speaker notes | +| `F` | Fullscreen | +| `O` | Overview mode | +| `ESC` | Exit modes | + +--- + +## Get Started + +1. Create a file in `content/slides/` +2. Add front matter with `type: slides` +3. Write your content in Markdown +4. Separate slides with `---` + +--- + +## Thank You! + +**Questions?** + +- GitHub: [HugoBlox/kit](https://github.com/HugoBlox/kit) +- Docs: [docs.hugoblox.com](https://docs.hugoblox.com) + +*Built with Markdown Slides* diff --git a/templates/markdown-slides/content/slides/hugo-static-sites/index.md b/templates/markdown-slides/content/slides/hugo-static-sites/index.md new file mode 100644 index 00000000..967b3de6 --- /dev/null +++ b/templates/markdown-slides/content/slides/hugo-static-sites/index.md @@ -0,0 +1,189 @@ +--- +title: "Introduction to Hugo & Static Sites" +date: 2025-12-20 +description: "Learn how static site generators like Hugo revolutionize web development" +authors: ["me", "Hugo Blox Team"] +tags: ["hugo", "web-development", "tutorial"] +topics: ["static-sites", "hugo", "jamstack"] +course: "CS 101: Web Development" +lecture_number: 5 +type: slides + +# HugoBlox standard links structure +links: + - type: video + url: "https://youtube.com/watch?v=example" + icon: hero/video-camera + +slides: + theme: white + highlight_style: github-light + diagram: true + reveal_options: + controls: true + progress: true + slideNumber: true + hash: true +--- + +# Static Site Generators + +### The Modern Way to Build Websites + +--- + +## The Problem with Traditional CMS + +- **Security vulnerabilities** from databases +- **Slow performance** due to server-side rendering +- **Complex hosting** requirements +- **Expensive scaling** for traffic spikes + +--- + +## Enter Static Sites + +```mermaid +graph LR + A[Markdown Files] --> B[Static Generator] + B --> C[HTML/CSS/JS] + C --> D[CDN] + D --> E[Users] +``` + +No database. No server. Just files. + +--- + +## Why Hugo? + +| Feature | Hugo | Jekyll | Next.js | +|---------|------|--------|---------| +| Build Speed | ⚡ ~1ms/page | ~100ms/page | ~50ms/page | +| Language | Go | Ruby | JavaScript | +| Templates | Go HTML | Liquid | React | +| Learning | Moderate | Easy | Complex | + +--- + +## Hugo Architecture + +```go +// Basic Hugo project structure +mysite/ +├── config.yaml // Site configuration +├── content/ // Your Markdown content +├── layouts/ // HTML templates +├── static/ // Images, CSS, JS +└── themes/ // Reusable themes +``` + +--- + +## Content Organization + +```markdown +--- +title: "My Blog Post" +date: 2025-01-01 +tags: ["hugo", "tutorial"] +--- + +Your content goes here in **Markdown**. +``` + +{{< fragment >}}Simple. Clean. Version-controlled.{{< /fragment >}} + +--- + +## Template System + +```html +{{ range .Pages }} +
+

{{ .Title }}

+

{{ .Summary }}

+ Read more +
+{{ end }} +``` + +--- + +## Build Performance + +Hugo builds **thousands of pages in seconds**: + +{{< fragment >}}📄 10 pages → 50ms{{< /fragment >}} + +{{< fragment >}}📄 1,000 pages → 500ms{{< /fragment >}} + +{{< fragment >}}📄 10,000 pages → 5 seconds{{< /fragment >}} + +{{< fragment >}}**The fastest static site generator!**{{< /fragment >}} + +--- + +## Deployment Options + +- **Netlify** - Git-based deploys +- **Vercel** - Edge functions +- **Cloudflare Pages** - Global CDN +- **GitHub Pages** - Free hosting +- **AWS S3** - Scalable storage + +--- + +## When to Use Hugo + +✅ Documentation sites + +✅ Blogs and portfolios + +✅ Marketing landing pages + +✅ Conference websites + +✅ **Slide presentations!** + +--- + +## Getting Started + +```bash +# Install Hugo +brew install hugo + +# Create a new site +hugo new site mysite + +# Add content +hugo new posts/hello-world.md + +# Start dev server +hugo server -D +``` + +--- + +## Resources + +- **Documentation**: [gohugo.io/documentation](https://gohugo.io/documentation/) +- **Themes**: [themes.gohugo.io](https://themes.gohugo.io/) +- **Community**: [discourse.gohugo.io](https://discourse.gohugo.io/) +- **Hugo Blox**: [hugoblox.com](https://hugoblox.com) + +--- + +## Thank You! + +### Questions? + +**Start building faster websites today** 🚀 + +Note: +Key takeaways: +1. Static sites are more secure, faster, and cheaper +2. Hugo is the fastest static site generator +3. Perfect for content-focused websites +4. Easy to deploy on any CDN diff --git a/templates/markdown-slides/content/slides/ml-research-overview/index.md b/templates/markdown-slides/content/slides/ml-research-overview/index.md new file mode 100644 index 00000000..1fcf0c13 --- /dev/null +++ b/templates/markdown-slides/content/slides/ml-research-overview/index.md @@ -0,0 +1,252 @@ +--- +title: "Machine Learning Research Overview" +date: 2025-12-25 +description: "A research presentation on recent advances in deep learning and neural networks" +authors: ["me", "Dr. Example Researcher"] +tags: ["machine-learning", "research", "data-science"] +topics: ["deep-learning", "transformers", "neural-networks"] +venue: "ICML 2025" +event: "International Conference on Machine Learning" +citation: "Researcher, E., Smith, J., & Doe, J. (2025). Machine Learning Research Overview. ICML 2025." +type: slides + +# HugoBlox standard links structure +links: + - type: preprint + url: "https://arxiv.org/abs/example" + icon: hero/document-text + - type: code + url: "https://github.com/example/ml-research" + icon: hero/code-bracket + +# HugoBlox standard identifiers - auto-generates DOI link +hugoblox: + ids: + doi: "10.1234/example.doi" + +slides: + theme: black + highlight_style: dracula + diagram: true + reveal_options: + controls: true + progress: true + slideNumber: true + hash: true +--- + +# Machine Learning +## Research Overview 2025 + +Dr. Example Researcher + +--- + +## Agenda + +1. Background & Motivation +2. Neural Network Fundamentals +3. Transformer Architecture +4. Experimental Results +5. Future Directions + +--- + +## The Deep Learning Revolution + +```mermaid +graph TD + A[Traditional ML] --> B[Deep Learning] + B --> C[Computer Vision] + B --> D[NLP] + B --> E[Reinforcement Learning] + C --> F[Multimodal AI] + D --> F +``` + +--- + +## Neural Network Basics + +A neuron computes: + +$$y = f\left(\sum_{i=1}^{n} w_i x_i + b\right)$$ + +Where: +- $x_i$ = inputs +- $w_i$ = weights +- $b$ = bias +- $f$ = activation function + +--- + +## Activation Functions + +**ReLU (Rectified Linear Unit):** + +$$f(x) = \max(0, x)$$ + +**Sigmoid:** + +$$\sigma(x) = \frac{1}{1 + e^{-x}}$$ + +**Softmax:** + +$$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$ + +--- + +## Transformer Architecture + +{{< fragment >}}**Self-Attention Mechanism:**{{< /fragment >}} + +{{< fragment >}}$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$${{< /fragment >}} + +{{< fragment >}}Enables parallel processing of sequences{{< /fragment >}} + +Note: +- Q = Query matrix +- K = Key matrix +- V = Value matrix +- d_k = dimension of keys + +--- + +## Model Architecture + +```python +class TransformerBlock(nn.Module): + def __init__(self, d_model, n_heads): + super().__init__() + self.attention = MultiHeadAttention(d_model, n_heads) + self.ffn = FeedForward(d_model) + self.norm1 = LayerNorm(d_model) + self.norm2 = LayerNorm(d_model) + + def forward(self, x): + x = x + self.attention(self.norm1(x)) + x = x + self.ffn(self.norm2(x)) + return x +``` + +--- + +## Experimental Setup + +
+ +
+ +### Dataset + +- **Size**: 1M samples +- **Split**: 80/10/10 +- **Preprocessing**: Tokenization, normalization + +
+ +
+ +### Training + +- **Optimizer**: AdamW +- **Learning rate**: 3e-4 +- **Batch size**: 256 +- **Epochs**: 100 + +
+ +
+ +--- + +## Results + +| Model | Accuracy | F1 Score | Latency | +|-------|----------|----------|---------| +| Baseline | 82.3% | 0.81 | 45ms | +| Ours (small) | 89.7% | 0.88 | 38ms | +| **Ours (large)** | **94.2%** | **0.93** | 52ms | + +{{< fragment >}}**+11.9% improvement over baseline**{{< /fragment >}} + +--- + +## Ablation Study + +| Component | Accuracy Drop | +|-----------|---------------| +| w/o Attention | -8.3% | +| w/o FFN | -4.1% | +| w/o LayerNorm | -2.7% | +| w/o Residual | -6.5% | + +{{< fragment >}}Self-attention is the most critical component{{< /fragment >}} + +--- + +## Loss Curve + +The training converged smoothly: + +$$\mathcal{L} = -\sum_{i=1}^{N} y_i \log(\hat{y}_i)$$ + +{{< fragment >}}Cross-entropy loss with label smoothing (α=0.1){{< /fragment >}} + +--- + +{{< slide background-color="#1a365d" >}} + +## Key Findings + +1. **Scaling matters**: Larger models = better results +2. **Attention is critical**: Core to performance +3. **Efficiency trade-offs**: Accuracy vs. latency +4. **Transfer learning**: Pre-training helps + +--- + +## Limitations + +- Computational requirements +- Data dependency +- Interpretability challenges +- Environmental impact + +{{< fragment >}}Future work should address these concerns{{< /fragment >}} + +--- + +## Future Directions + +```mermaid +graph LR + A[Current Work] --> B[Efficient Transformers] + A --> C[Multimodal Learning] + A --> D[Explainable AI] + B --> E[Real-world Deployment] + C --> E + D --> E +``` + +--- + +## References + +1. Vaswani et al. (2017). *Attention is All You Need* +2. Brown et al. (2020). *Language Models are Few-Shot Learners* +3. Dosovitskiy et al. (2021). *An Image is Worth 16x16 Words* + +--- + +## Thank You + +### Questions? + +📧 researcher@example.edu + +📄 Full paper: [arxiv.org/abs/example](https://arxiv.org) + +Note: +Contact information and resources for follow-up questions. +Open for collaboration on future research directions. diff --git a/templates/markdown-slides/data/authors/me.yaml b/templates/markdown-slides/data/authors/me.yaml new file mode 100644 index 00000000..76f48ac9 --- /dev/null +++ b/templates/markdown-slides/data/authors/me.yaml @@ -0,0 +1,116 @@ +schema: hugoblox/author/v1 +slug: me +is_owner: true +name: + display: Dr. Alex Johnson + given: Alex + family: Johnson + alternate: '' # Example: 王伟 + pronunciation: '' # Example: Wáng Wěi + pronouns: he/him +postnominals: + - PhD + - MIEEE +status: + icon: "☕️" +role: Senior AI Research Scientist +bio: | + Alex Johnson is a Senior AI Research Scientist at Meta AI. His research + has been published in top conferences like NeurIPS and ICML, with over + 10,000 citations. Alex is passionate about pushing the boundaries of AI + while ensuring ethical development. + +affiliations: + - name: Meta AI + url: https://ai.meta.com/ + +links: + - icon: at-symbol + url: mailto:alex.johnson@example.com + label: E-mail Me + - icon: brands/x + url: https://x.com/example + - icon: brands/github + url: https://github.com/example + - icon: brands/linkedin + url: https://www.linkedin.com/in/example/ + - icon: academicons/google-scholar + url: https://scholar.google.com/citations?user=example + - icon: academicons/orcid + url: https://orcid.org/0000-0002-1825-0097 + +interests: + - Large Language Models + - Computer Vision + - Reinforcement Learning + - AI Ethics + +education: + - degree: PhD Computer Science + institution: Stanford University + start: 2015-09-01 + end: 2019-06-30 + summary: | + Thesis on scaling laws for neural language models. Published 5 papers in NeurIPS and ICML. + button: + text: Download dissertation + url: /resume.pdf + icon: hero/arrow-down-tray + - degree: MS Computer Science + institution: Carnegie Mellon University + start: 2013-09-01 + end: 2015-05-31 + - degree: BS Computer Science + institution: MIT + start: 2009-09-01 + end: 2013-05-31 + +experience: + - role: Senior AI Research Scientist + org: Meta AI + start: 2020-01-01 + summary: | + Leading research on multimodal AI systems. Contributed to Llama 2 and other open-source models. + button: + text: View portfolio + url: / + icon: hero/arrow-down-tray + - role: AI Research Intern + org: OpenAI + start: 2019-06-01 + end: 2019-12-31 + summary: | + Worked on GPT-3 scaling. Co-authored paper on prompt engineering. + +skills: + - name: Technical Skills + items: + - label: Python + level: 5 + - label: Machine Learning + level: 5 + - label: Cloud Computing + level: 4 + - name: Research & Communication + items: + - label: Academic Writing + level: 5 + - label: Conference Presentations + level: 4 + - label: Grant Proposals + level: 4 + +languages: + - name: English + level: 5 + label: Native + - name: Spanish + level: 4 + label: Fluent + +awards: + - title: Best Paper Award + awarder: NeurIPS + date: "2022-12-01" + summary: Awarded for groundbreaking work on efficient training of large models. + icon: hero/trophy diff --git a/templates/markdown-slides/go.mod b/templates/markdown-slides/go.mod new file mode 100644 index 00000000..bce6340f --- /dev/null +++ b/templates/markdown-slides/go.mod @@ -0,0 +1,9 @@ +module github.com/HugoBlox/kit/templates/markdown-slides + +go 1.19 + +require ( + github.com/HugoBlox/kit/modules/integrations/netlify v0.0.0-20260102210655-66cba27dc652 + github.com/HugoBlox/kit/modules/blox v0.0.0-20260105203838-3526fb1ca1e5 + github.com/HugoBlox/kit/modules/slides v0.0.0-20260102220738-ad2af1f3521d +) diff --git a/templates/markdown-slides/hugoblox.yaml b/templates/markdown-slides/hugoblox.yaml new file mode 100644 index 00000000..8939d0a6 --- /dev/null +++ b/templates/markdown-slides/hugoblox.yaml @@ -0,0 +1,6 @@ +build: + hugo_version: '0.154.2' +template: + id: "markdown-slides" + name: "Markdown Slides" + description: "A minimal template for hosting and sharing Markdown-based slide decks" diff --git a/templates/markdown-slides/netlify.toml b/templates/markdown-slides/netlify.toml new file mode 100644 index 00000000..e402917d --- /dev/null +++ b/templates/markdown-slides/netlify.toml @@ -0,0 +1,49 @@ +[build] + command = """ + set -e + echo "=== Starting Markdown Slides build process ===" + echo "Node version: $(node --version)" + echo "pnpm version: $(pnpm --version)" + echo "Hugo version: $(hugo version)" + + echo "=== Installing dependencies ===" + pnpm install --no-frozen-lockfile + + echo "=== Running Hugo build ===" + hugo --gc --minify -b $URL + + echo "=== Running Pagefind indexing ===" + pnpm run pagefind + + echo "=== Build completed successfully ===" + """ + publish = "public" + +[build.environment] + HUGO_VERSION = "0.154.2" + GO_VERSION = "1.21.5" + NODE_VERSION = "22" + PNPM_FLAGS = "--no-frozen-lockfile" + HUGO_ENABLEGITINFO = "true" + +[context.production.environment] + HUGO_ENV = "production" + +[context.deploy-preview] + command = """ + set -e + pnpm install --no-frozen-lockfile + hugo --gc --minify --buildFuture -b $DEPLOY_PRIME_URL + pnpm run pagefind + """ + +[context.branch-deploy] + command = """ + set -e + pnpm install --no-frozen-lockfile + hugo --gc --minify -b $DEPLOY_PRIME_URL + pnpm run pagefind + """ + +[[plugins]] + package = "netlify-plugin-hugo-cache-resources" diff --git a/templates/markdown-slides/package.json b/templates/markdown-slides/package.json new file mode 100644 index 00000000..9ee844aa --- /dev/null +++ b/templates/markdown-slides/package.json @@ -0,0 +1,19 @@ +{ + "name": "hugo-blox-markdown-slides-starter", + "version": "1.0.0", + "private": true, + "packageManager": "pnpm@10.14.0", + "description": "Markdown Slides template - host and share slide decks built with Hugo Blox", + "scripts": { + "dev": "hugo server --disableFastRender", + "build": "hugo --minify && pnpm run pagefind", + "pagefind": "pagefind --site public" + }, + "dependencies": { + "@tailwindcss/cli": "^4.1.12", + "@tailwindcss/typography": "^0.5.10", + "pagefind": "^1.4.0", + "preact": "^10.27.2", + "tailwindcss": "^4.1.12" + } +} diff --git a/templates/markdown-slides/pnpm-lock.yaml b/templates/markdown-slides/pnpm-lock.yaml new file mode 100644 index 00000000..2049b436 --- /dev/null +++ b/templates/markdown-slides/pnpm-lock.yaml @@ -0,0 +1,714 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@tailwindcss/cli': + specifier: ^4.1.12 + version: 4.1.18 + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.19(tailwindcss@4.1.18) + pagefind: + specifier: ^1.4.0 + version: 1.4.0 + preact: + specifier: ^10.27.2 + version: 10.28.1 + tailwindcss: + specifier: ^4.1.12 + version: 4.1.18 + +packages: + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@pagefind/darwin-arm64@1.4.0': + resolution: {integrity: sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.4.0': + resolution: {integrity: sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==} + cpu: [x64] + os: [darwin] + + '@pagefind/freebsd-x64@1.4.0': + resolution: {integrity: sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==} + cpu: [x64] + os: [freebsd] + + '@pagefind/linux-arm64@1.4.0': + resolution: {integrity: sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.4.0': + resolution: {integrity: sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.4.0': + resolution: {integrity: sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==} + cpu: [x64] + os: [win32] + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@tailwindcss/cli@4.1.18': + resolution: {integrity: sha512-sMZ+lZbDyxwjD2E0L7oRUjJ01Ffjtme5OtjvvnC+cV4CEDcbqzbp25TCpxHj6kWLU9+DlqJOiNgSOgctC2aZmg==} + hasBin: true + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/typography@0.5.19': + resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + pagefind@1.4.0: + resolution: {integrity: sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + + preact@10.28.1: + resolution: {integrity: sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + +snapshots: + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@pagefind/darwin-arm64@1.4.0': + optional: true + + '@pagefind/darwin-x64@1.4.0': + optional: true + + '@pagefind/freebsd-x64@1.4.0': + optional: true + + '@pagefind/linux-arm64@1.4.0': + optional: true + + '@pagefind/linux-x64@1.4.0': + optional: true + + '@pagefind/windows-x64@1.4.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@tailwindcss/cli@4.1.18': + dependencies: + '@parcel/watcher': 2.5.1 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + enhanced-resolve: 5.18.4 + mri: 1.2.0 + picocolors: 1.1.1 + tailwindcss: 4.1.18 + + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.18)': + dependencies: + postcss-selector-parser: 6.0.10 + tailwindcss: 4.1.18 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cssesc@3.0.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.1.2: {} + + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + graceful-fs@4.2.11: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + jiti@2.6.1: {} + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mri@1.2.0: {} + + node-addon-api@7.1.1: {} + + pagefind@1.4.0: + optionalDependencies: + '@pagefind/darwin-arm64': 1.4.0 + '@pagefind/darwin-x64': 1.4.0 + '@pagefind/freebsd-x64': 1.4.0 + '@pagefind/linux-arm64': 1.4.0 + '@pagefind/linux-x64': 1.4.0 + '@pagefind/windows-x64': 1.4.0 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + postcss-selector-parser@6.0.10: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + preact@10.28.1: {} + + source-map-js@1.2.1: {} + + tailwindcss@4.1.18: {} + + tapable@2.3.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + util-deprecate@1.0.2: {}