feat: port Markdown Slides template from Wowchemy/Bootstrap

This commit is contained in:
George Cushen committed 2026-01-06 20:12:26 +00:00
1 parent c792830419
commit bfdcb6603c
53 files changed
+6587 -209

No files matched your search

-1
View File
@@ -100,7 +100,6 @@
{{ range $query }}
{{ if isset .Params "author_notes" }}
{{ $page.Store.Set "has_alpine" true }}
<script>console.log('Author notes found in collection - Alpine.js enabled');</script>
{{ break }}
{{ end }}
{{ end }}
+348
View File
@@ -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: 😡 না
+259
View File
@@ -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
+74
View File
@@ -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
+316
View File
@@ -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
+638
View File
@@ -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: सहायक
+381
View File
@@ -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
+301
View File
@@ -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
+328
View File
@@ -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 →'
+325
View File
@@ -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: 😡 否
+289
View File
@@ -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: 如何引用
@@ -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 }}
<div
x-data="{
isFullscreen: false,
toggleFullscreen() {
const container = this.$refs.slideContainer;
if (!this.isFullscreen) {
if (container.requestFullscreen) {
container.requestFullscreen();
} else if (container.webkitRequestFullscreen) {
container.webkitRequestFullscreen();
} else if (container.msRequestFullscreen) {
container.msRequestFullscreen();
}
} else {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
}
}
}"
@fullscreenchange.window="isFullscreen = document.fullscreenElement === $refs.slideContainer"
@webkitfullscreenchange.window="isFullscreen = document.webkitFullscreenElement === $refs.slideContainer"
class="mb-12"
>
{{/* Slides iframe container - wrapper for fullscreen API */}}
<div
x-ref="slideContainer"
class="relative w-full bg-black rounded-lg shadow-2xl overflow-visible"
style="aspect-ratio: 16 / 9;"
:class="isFullscreen ? 'h-screen' : ''"
>
<iframe
src="{{ $embed_url }}"
class="w-full h-full border-0 rounded-lg"
allowfullscreen
allow="autoplay"
title="{{ $embed_title }}"
loading="lazy"
></iframe>
{{/* Fullscreen toggle button - inside container for fullscreen visibility */}}
<button
@click="toggleFullscreen()"
class="absolute top-4 right-4 p-3 bg-white/95 dark:bg-gray-800/95 hover:bg-white dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 transition-all duration-200 hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 backdrop-blur-sm"
:aria-label="isFullscreen ? {{ $exit_fullscreen_label | jsonify }} : {{ $enter_fullscreen_label | jsonify }}"
type="button"
style="z-index: 9999;"
>
{{/* Expand icon (when not fullscreen) */}}
<svg
x-show="!isFullscreen"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="2"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4" />
</svg>
{{/* Compress icon (when fullscreen) */}}
<svg
x-show="isFullscreen"
x-cloak
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="2"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25" />
</svg>
</button>
</div>
{{ if $show_actions }}
{{/* Action links below embed */}}
<div class="mt-4 flex items-center justify-between text-sm text-gray-600 dark:text-gray-400">
<div class="flex items-center gap-4">
{{/* Open in new tab */}}
<a
href="{{ $present_url }}"
target="_blank"
rel="noopener"
class="inline-flex items-center gap-1 hover:text-primary-600 dark:hover:text-primary-400 transition-colors"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
<span>{{ $present_fullscreen_label }}</span>
</a>
{{/* Presentation mode hint */}}
<span class="text-xs">
<kbd class="px-2 py-1 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded dark:bg-gray-600 dark:text-gray-100 dark:border-gray-500">S</kbd>
{{ $speaker_notes_hint }}
</span>
</div>
</div>
{{ end }}
</div>
{{ else }}
<p class="text-sm text-red-600 dark:text-red-400">{{ $slides_not_found_label }}: {{ $slides_slug }}</p>
{{ end }}
@@ -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 }}
@@ -0,0 +1,2 @@
</div>
</div>
@@ -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 */}}
<div class="container px-4 sm:px-6 mx-auto max-w-6xl py-8">
<div class="grid gap-6 sm:gap-8 {{ if eq $columns 1 }}max-w-xl mx-auto{{ else if eq $columns 2 }}grid-cols-1 md:grid-cols-2{{ else }}grid-cols-1 md:grid-cols-2 lg:grid-cols-3{{ end }}">
@@ -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 }}
<article class="group relative flex flex-col bg-white dark:bg-zinc-900 rounded-xl shadow-sm ring-1 ring-zinc-900/5 dark:ring-white/10 overflow-hidden transition-all duration-300 hover:shadow-lg hover:shadow-primary-500/10 hover:-translate-y-1{{ if $isFeatured }} ring-2 ring-primary-500/50{{ end }}">
{{/* Featured Badge */}}
{{ if $isFeatured }}
<div class="absolute top-3 left-3 z-10 px-2.5 py-1 rounded-full text-xs font-semibold bg-primary-500 text-white flex items-center gap-1.5 shadow-lg">
<svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
{{ $featured_label }}
</div>
{{ end }}
{{/* Slide Preview Image - 16:9 aspect ratio */}}
<a href="{{ $present_link }}" target="_blank" rel="noopener" class="block relative aspect-video bg-gradient-to-br from-zinc-100 to-zinc-200 dark:from-zinc-800 dark:to-zinc-900 overflow-hidden" aria-label="{{ printf "%s %s" $present_fullscreen_label ($item.Title | plainify) }}">
{{ with $resource }}
{{ if strings.Contains .MediaType.SubType "svg" }}
<img
class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
src="{{ .RelPermalink }}"
loading="lazy"
decoding="async"
alt="{{ $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")
) }}
<img
class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
srcset="{{ $responsive.srcset }}"
sizes="(max-width: 768px) 100vw, 50vw"
src="{{ $responsive.fallback.RelPermalink }}"
width="{{ $image.Width }}"
height="{{ $image.Height }}"
loading="lazy"
decoding="async"
{{ if eq $index 0 }}fetchpriority="high"{{ end }}
alt="{{ $item.Title | plainify }}">
{{ else }}
<img
class="w-full h-full object-cover transition-transform duration-500 group-hover:scale-105"
src="{{ .RelPermalink }}"
loading="lazy"
decoding="async"
alt="{{ $item.Title | plainify }}">
{{ end }}
{{ else }}
{{/* Fallback: Decorative gradient with slide icon - smaller, cleaner */}}
<div class="w-full h-full bg-gradient-to-br from-primary-500/10 via-secondary-500/10 to-primary-700/15 dark:from-primary-600/20 dark:via-secondary-600/15 dark:to-primary-800/25 flex items-center justify-center">
<div class="text-center px-4">
<svg class="w-8 h-8 mx-auto text-primary-500/40 dark:text-primary-400/40" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5m.75-9l3-3 2.148 2.148A12.061 12.061 0 0116.5 7.605" />
</svg>
</div>
</div>
{{ end }}
{{/* Play button overlay on hover */}}
<div class="absolute inset-0 flex items-center justify-center bg-black/0 group-hover:bg-black/30 transition-all duration-300">
<div class="w-14 h-14 rounded-full bg-white/90 dark:bg-zinc-900/90 flex items-center justify-center opacity-0 group-hover:opacity-100 transform scale-75 group-hover:scale-100 transition-all duration-300 shadow-lg">
<svg class="w-6 h-6 text-primary-600 dark:text-primary-400 ml-1" fill="currentColor" viewBox="0 0 24 24">
<path d="M8 5v14l11-7z"/>
</svg>
</div>
</div>
{{/* Slide count badge */}}
{{ if gt $slideCount 1 }}
<div class="absolute bottom-3 right-3 px-2.5 py-1 rounded-full text-xs font-medium bg-black/60 backdrop-blur-sm text-white">
{{ $slideCount }} {{ $slides_label | lower }}
</div>
{{ end }}
</a>
{{/* Content Section */}}
<div class="flex flex-col flex-1 p-5">
{{/* Tags */}}
{{ if $item.Params.tags }}
<div class="flex flex-wrap gap-2 mb-3">
{{ range first 3 $item.Params.tags }}
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-primary-100 text-primary-800 dark:bg-primary-900/40 dark:text-primary-300">
{{ . }}
</span>
{{ end }}
{{ if gt (len $item.Params.tags) 3 }}
<span class="text-xs text-zinc-500 dark:text-zinc-400">+{{ sub (len $item.Params.tags) 3 }}</span>
{{ end }}
</div>
{{ 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 }}
<div class="flex items-center gap-2 mb-2 text-xs text-zinc-500 dark:text-zinc-400">
<div class="relative h-6 w-6 flex-shrink-0">
{{ if $avatar }}
{{ $avatar_48 := $avatar.Process "Fill 48x48 Center webp" }}
<img alt="{{ $authorName }}" class="rounded-full object-cover" src="{{ $avatar_48.RelPermalink }}" width="24" height="24" loading="lazy" decoding="async" />
{{ else }}
<div class="w-6 h-6 bg-zinc-100 dark:bg-zinc-800 rounded-full flex items-center justify-center">
{{ partial "functions/get_icon" (dict "name" "hero/user" "attributes" "class=\"w-4 h-4 text-zinc-500 dark:text-zinc-400\"") }}
</div>
{{ end }}
</div>
<span class="truncate max-w-[10rem]">{{ $authorName }}</span>
</div>
{{ end }}
{{/* Title */}}
<h3 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100 group-hover:text-primary-600 dark:group-hover:text-primary-400 transition-colors line-clamp-2 mb-2">
<a href="{{ $link }}">{{ $item.Title }}</a>
</h3>
{{/* Summary */}}
<p class="text-sm text-zinc-600 dark:text-zinc-400 line-clamp-3 min-h-[3.75rem] mb-3 flex-1">{{ if $summary }}{{ $summary }}{{ else }}&nbsp;{{ end }}</p>
{{/* Footer: Venue, Year, Details + Present Links */}}
<div class="flex items-center justify-between pt-3 border-t border-zinc-100 dark:border-zinc-800 mt-auto">
<div class="flex items-center gap-2 text-xs text-zinc-500 dark:text-zinc-500">
{{ with $item.Params.venue }}
<span class="truncate max-w-[120px]" title="{{ . }}">{{ . }}</span>
<span class="text-zinc-300 dark:text-zinc-600">·</span>
{{ end }}
<time datetime="{{ $item.Date.Format "2006-01-02" }}">
{{ $item.Date.Format "2006" }}
</time>
</div>
<div class="flex items-center gap-3">
<a href="{{ $link }}" class="inline-flex items-center gap-1 text-xs font-medium text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100 transition-colors">
<span>{{ $details_label }}</span>
</a>
<a href="{{ $present_link }}" target="_blank" rel="noopener" class="inline-flex items-center gap-1 text-xs font-medium text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 transition-colors">
<span>{{ $present_label }}</span>
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"/>
</svg>
</a>
</div>
</div>
</div>
</article>
+1 -112
View File
@@ -67,7 +67,6 @@
{{/* Set Alpine.js flag if author notes exist */}}
{{ if isset .Params "author_notes" }}
{{ .Store.Set "has_alpine" true }}
<script>console.log('Author notes detected in events/single.html, Alpine.js should load');</script>
{{ 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 }}
<div
x-data="{
isFullscreen: false,
toggleFullscreen() {
const container = this.$refs.slideContainer;
if (!this.isFullscreen) {
if (container.requestFullscreen) {
container.requestFullscreen();
} else if (container.webkitRequestFullscreen) {
container.webkitRequestFullscreen();
} else if (container.msRequestFullscreen) {
container.msRequestFullscreen();
}
} else {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
}
}
}"
@fullscreenchange.window="isFullscreen = document.fullscreenElement === $refs.slideContainer"
@webkitfullscreenchange.window="isFullscreen = document.webkitFullscreenElement === $refs.slideContainer"
class="mb-12"
>
{{/* Slides iframe container - must contain button for fullscreen visibility */}}
<div
x-ref="slideContainer"
class="relative w-full bg-black rounded-lg shadow-2xl overflow-visible"
style="aspect-ratio: 16 / 9;"
:class="isFullscreen ? 'h-screen' : ''"
>
<iframe
src="{{ $slides_page.RelPermalink }}"
class="w-full h-full border-0 rounded-lg"
allowfullscreen
allow="autoplay"
title="{{ $.Title }} - Slides"
loading="lazy"
></iframe>
{{/* Fullscreen toggle button - must be inside fullscreen container */}}
<button
@click="toggleFullscreen()"
class="absolute top-4 right-4 p-3 bg-white/95 dark:bg-gray-800/95 hover:bg-white dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 transition-all duration-200 hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 backdrop-blur-sm"
:aria-label="isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'"
type="button"
style="z-index: 9999;"
>
{{/* Expand icon (when not fullscreen) */}}
<svg
x-show="!isFullscreen"
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="2"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4" />
</svg>
{{/* Compress icon (when fullscreen) */}}
<svg
x-show="isFullscreen"
x-cloak
xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
stroke-width="2"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25" />
</svg>
</button>
</div>
{{/* Slides metadata */}}
<div class="mt-4 flex items-center justify-between text-sm text-gray-600 dark:text-gray-400">
<div class="flex items-center gap-4">
{{/* Direct link to slides */}}
<a
href="{{ $slides_page.RelPermalink }}"
target="_blank"
class="inline-flex items-center gap-1 hover:text-primary-600 dark:hover:text-primary-400 transition-colors"
>
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14" />
</svg>
<span>View slides in new tab</span>
</a>
{{/* Presentation mode hint */}}
<span class="text-xs">
<kbd class="px-2 py-1 text-xs font-semibold text-gray-800 bg-gray-100 border border-gray-200 rounded dark:bg-gray-600 dark:text-gray-100 dark:border-gray-500">S</kbd>
for speaker notes
</span>
</div>
</div>
</div>
{{ 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" . }}
-1
View File
@@ -24,7 +24,6 @@
{{ range .Pages }}
{{ if isset .Params "author_notes" }}
{{ $.Store.Set "has_alpine" true }}
<script>console.log('Author notes found in list - Alpine.js enabled');</script>
{{ break }}
{{ end }}
{{ end }}
-1
View File
@@ -76,7 +76,6 @@
{{/* Set Alpine.js flag if author notes exist */}}
{{ if isset .Params "author_notes" }}
{{ .Store.Set "has_alpine" true }}
<script>console.log('Author notes detected in single.html, Alpine.js should load');</script>
{{ end }}
{{ range $i, $slug := .Params.authors }}
+14 -9
View File
@@ -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.
+15
View File
@@ -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
+38 -70
View File
@@ -1,78 +1,46 @@
<!DOCTYPE html>
<html lang="{{ site.LanguageCode | default "en-us" }}">
{{/*
Slides Baseof - Landing page chrome only
Presentation output lives in baseof.present.html
*/}}
<!doctype html>
{{- $language_code := site.LanguageCode | default "en-us" -}}
<html lang="{{$language_code}}" {{ if in site.Data.i18n.rtl.rtl $language_code }}dir="rtl"{{else}}dir="ltr"{{end}}
data-wc-theme-default="{{ (lower site.Params.hugoblox.theme.mode) | default "system" }}"
data-hbb-relurl="{{ "" | relURL }}">
<head>
{{/* 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=" }}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="HugoBlox Kit {{with site.Data.hugoblox.version}}{{.}}{{end}}">
{{ with site.Home.OutputFormats.Get "WebAppManifest" }}
<link rel="manifest" href="{{ .RelPermalink }}">
{{ end }}
<link rel="icon" type="image/png" href="{{ "media/icon.png" | relURL }}">
<link rel="apple-touch-icon" type="image/png" href="{{ "media/icon.png" | relURL }}">
<link rel="canonical" href="{{ .Permalink }}">
<title>{{ .Title }} | {{ site.Title }}</title>
{{/* Load Reveal CSS */}}
<link rel="stylesheet" href="{{ $cdn_url_reveal }}/dist/reveal.min.css">
{{- $theme := $.Param "slides.theme" | default "black" -}}
<link rel="stylesheet" href="{{ $cdn_url_reveal }}/dist/theme/{{ $theme }}.min.css">
{{/* 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 }}
<link rel="stylesheet" href="{{ $hl_theme_css.RelPermalink }}">
{{ 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 }}
<link rel="stylesheet" href="{{ $style.RelPermalink }}">
{{ end }}
<title>{{ .Title }} | {{ site.Params.hugoblox.identity.name | default site.Title }}</title>
{{ partial "site_head" . }}
</head>
<body>
{{ block "main" . }}{{ end }}
{{/* Load Reveal and built-in plugins. */}}
<script src="{{ $cdn_url_reveal }}/dist/reveal.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/markdown/markdown.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/notes/notes.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/search/search.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/math/math.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/zoom/zoom.min.js" crossorigin="anonymous"></script>
{{/* Load third-party Reveal plugins. */}}
{{ if $.Param "slides.reveal_options.menu_enabled" | default true}}
<script src="https://cdn.jsdelivr.net/npm/reveal.js-menu@2.1.0/plugin.js" integrity="sha256-M6JwAjnRAWmi+sbXURR/yAhWZKYhAw7YXnnLvIxrdGs=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/reveal.js-menu@2.1.0/menu.js" integrity="sha256-l14dklFcW5mWar6w/9KaW0fWVerf3mYr7Wt0+rXzFAA=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reveal.js-menu@2.1.0/menu.css" integrity="sha256-0fU8HKLaTjgzfaV9CgSqbsN8ilA3zo6zK1M6rlgULd8=" crossorigin="anonymous">
{{ end }}
{{/* Load Mermaid. */}}
{{ if $.Param "slides.diagram" | default false}}
{{ printf "<script src=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" title=\"mermaid\"></script>" (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 )) }}
<script src="{{ $slidejs.RelPermalink }}"></script>
<body class="bg-[var(--color-background)] text-[var(--color-foreground)] page-wrapper" id="top">
{{/* Landing page chrome */}}
<div id="page-bg"></div>
<div class="page-header {{ if site.Params.hugoblox.header.sticky }}sticky top-0 z-30{{ end }}">
{{ $show_navbar := ((site.Params.hugoblox.header.enable | default true) | and (ne .Params.header.navbar.enable false)) | or .Params.header.navbar.enable }}
{{ if $show_navbar }}
{{- $header_config := .Params.header.navbar | default site.Params.hugoblox.header | default dict -}}
{{- $block_name := partial "hbx/resolve-block-param" (dict "config" $header_config "context" "header") | default "navbar" -}}
{{ $block_path := printf "components/headers/%s.html" $block_name }}
{{ if templates.Exists (printf "_partials/%s" $block_path) }}
{{ partial $block_path . }}
{{ end }}
{{ end }}
</div>
<div class="page-body my-10">
{{ block "main" . }}{{ end }}
</div>
<div class="page-footer">
{{ partial "site_footer" . }}
</div>
{{ partial "notification-container" . }}
{{ partial "functions/get_hook" (dict "hook" "body-end" "context" .) }}
</body>
</html>
@@ -0,0 +1,86 @@
{{/*
Present Baseof - Presentation output only
*/}}
<!doctype html>
{{- $language_code := site.LanguageCode | default "en-us" -}}
<html lang="{{$language_code}}" {{ if in site.Data.i18n.rtl.rtl $language_code }}dir="rtl"{{else}}dir="ltr"{{end}}>
<head>
{{/* 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=" }}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="generator" content="HugoBlox Kit {{with site.Data.hugoblox.version}}{{.}}{{end}}">
{{ with site.Home.OutputFormats.Get "WebAppManifest" }}
<link rel="manifest" href="{{ .RelPermalink }}">
{{ end }}
<link rel="icon" type="image/png" href="{{ "media/icon.png" | relURL }}">
<link rel="apple-touch-icon" type="image/png" href="{{ "media/icon.png" | relURL }}">
{{ $landing_url := .Permalink }}
{{ with .OutputFormats.Get "HTML" }}
{{ $landing_url = .Permalink }}
{{ end }}
<link rel="canonical" href="{{ $landing_url }}">
<meta name="robots" content="noindex, nofollow">
<title>{{ .Title }} | {{ site.Params.hugoblox.identity.name | default site.Title }}</title>
{{/* Load Reveal CSS */}}
<link rel="stylesheet" href="{{ $cdn_url_reveal }}/dist/reveal.min.css">
{{- $theme := $.Param "slides.theme" | default "black" -}}
<link rel="stylesheet" href="{{ $cdn_url_reveal }}/dist/theme/{{ $theme }}.min.css">
{{/* 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 }}
<link rel="stylesheet" href="{{ $hl_theme_css.RelPermalink }}">
{{ end }}
{{/* Reveal print styles (paper or PDF) */}}
<script>
(function() {
const link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
const params = new URLSearchParams(window.location.search);
const mode = params.has("print-pdf") ? "pdf" : "paper";
link.href = "{{ $cdn_url_reveal }}/dist/print/" + mode + ".css";
document.head.appendChild(link);
})();
</script>
</head>
<body>
{{ block "main" . }}{{ end }}
{{/* Load Reveal and plugins */}}
<script src="{{ $cdn_url_reveal }}/dist/reveal.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/markdown/markdown.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/notes/notes.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/search/search.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/math/math.min.js" crossorigin="anonymous"></script>
<script src="{{ $cdn_url_reveal }}/plugin/zoom/zoom.min.js" crossorigin="anonymous"></script>
{{/* Load Mermaid if enabled */}}
{{ if $.Param "slides.diagram" | default false}}
{{ printf "<script src=\"%s\" integrity=\"%s\" crossorigin=\"anonymous\" title=\"mermaid\"></script>" (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 }}
<script src="{{ $slidejs.RelPermalink }}"></script>
{{ partial "functions/get_hook" (dict "hook" "body-end" "context" .) }}
</body>
</html>
+212
View File
@@ -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 }}
<div class="container mx-auto px-4 sm:px-6 max-w-6xl py-8" x-data="slidesFilter()">
{{/* Page Header */}}
<div class="mb-8">
<h1 class="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-zinc-100 mb-2">{{ .Title }}</h1>
{{ with .Content }}
<div class="prose prose-zinc dark:prose-invert max-w-none">
{{ . }}
</div>
{{ end }}
</div>
{{/* Search and Filter Bar */}}
<div class="mb-8 space-y-4">
{{/* Search input */}}
<div class="relative max-w-md">
<input
type="text"
x-model="searchQuery"
@input="filterDecks()"
placeholder="{{ $search_placeholder }}"
class="w-full pl-10 pr-4 py-2.5 rounded-lg border border-zinc-200 dark:border-zinc-700 bg-white dark:bg-zinc-800 text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 dark:placeholder-zinc-500 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent transition-shadow"
>
<svg class="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-zinc-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"/>
</svg>
</div>
{{/* Tag Filter Chips */}}
{{ if $allTags }}
<div class="flex flex-wrap gap-2">
<button
@click="setTag('all')"
:class="activeTag === 'all' ? 'bg-primary-600 text-white' : 'bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700'"
class="px-3 py-1.5 rounded-full text-sm font-medium transition-colors"
>
{{ $all_label }}
</button>
{{ range $allTags }}
<button
@click="setTag({{ . | jsonify }})"
:class="activeTag === {{ . | jsonify }} ? 'bg-primary-600 text-white' : 'bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700'"
class="px-3 py-1.5 rounded-full text-sm font-medium transition-colors"
>
{{ . }}
</button>
{{ end }}
</div>
{{ end }}
</div>
{{/* 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 }}
<div
class="deck-card"
data-tags="{{ $tagsJson }}"
data-search="{{ $searchText }}"
>
{{ partial "functions/render_view" (dict "page" $ "item" $item "view" $view "index" $index "config" $config) }}
</div>
{{ end }}
{{ partial "functions/render_view" (dict "fragment" "end" "page" . "item" . "view" $view) }}
{{/* Empty state */}}
{{ if eq (len $sortedPages) 0 }}
<div class="text-center py-12">
<svg class="mx-auto h-12 w-12 text-zinc-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
<p class="mt-4 text-zinc-600 dark:text-zinc-400">{{ $no_decks_label }}</p>
</div>
{{ end }}
{{/* No matches empty state */}}
<div
x-show="noMatches"
x-cloak
class="text-center py-12"
>
<svg class="mx-auto h-12 w-12 text-zinc-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
<p class="mt-4 text-zinc-600 dark:text-zinc-400">{{ $no_matches_label }}</p>
<button @click="clearFilters()" class="mt-2 text-primary-600 dark:text-primary-400 hover:underline">
{{ $clear_filters_label }}
</button>
</div>
</div>
<script>
function slidesFilter() {
return {
activeTag: 'all',
searchQuery: '',
noMatches: false,
setTag(tag) {
this.activeTag = tag;
this.filterDecks();
},
clearFilters() {
this.activeTag = 'all';
this.searchQuery = '';
this.filterDecks();
},
filterDecks() {
const cards = document.querySelectorAll('.deck-card');
let visibleCount = 0;
const query = this.searchQuery.toLowerCase().trim();
cards.forEach(card => {
const tags = JSON.parse(card.dataset.tags || '[]');
const searchText = card.dataset.search || '';
const matchesTag = this.activeTag === 'all' || tags.includes(this.activeTag);
const matchesSearch = query === '' || searchText.includes(query);
if (matchesTag && matchesSearch) {
card.style.display = '';
visibleCount++;
} else {
card.style.display = 'none';
}
});
this.noMatches = visibleCount === 0 && cards.length > 0;
}
}
}
</script>
{{ end }}
@@ -0,0 +1,14 @@
{{/*
Presenter Layout - Full-screen Reveal.js presentation
Uses parent page's slide content
Route: /slides/<deck>/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) }}
+333 -1
View File
@@ -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 */}}
<div id="deck-landing">
{{/* 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 }}
<div class="container mx-auto px-4 sm:px-6 max-w-5xl py-12" x-data="{ copied: false, showCitation: false, copyText: {{ $copy_link_label | jsonify }}, citationCopied: false, citationCopyText: {{ $copy_citation_label | jsonify }}, citationValue: {{ $citation_copy | jsonify }} }">
{{/* Back to library link */}}
<a href="{{ "/slides/" | relURL }}" class="inline-flex items-center gap-2 text-sm text-zinc-600 dark:text-zinc-400 hover:text-primary-600 dark:hover:text-primary-400 mb-6 transition-colors">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 19l-7-7m0 0l7-7m-7 7h18"/>
</svg>
{{ $back_to_slides_label }}
</a>
{{/* Main content card */}}
<div class="bg-white dark:bg-zinc-900 rounded-2xl shadow-lg ring-1 ring-zinc-900/5 dark:ring-white/10 overflow-hidden mb-8">
{{/* Hero section with gradient */}}
<div class="relative px-8 py-12 bg-gradient-to-br from-primary-600 to-primary-800 dark:from-primary-700 dark:to-primary-900 text-white">
{{/* Featured badge */}}
{{ if or .Params.featured .Params.pinned }}
<div class="absolute top-4 right-4 px-3 py-1 rounded-full text-xs font-semibold bg-white/20 backdrop-blur-sm flex items-center gap-1.5">
<svg class="w-3 h-3" fill="currentColor" viewBox="0 0 20 20">
<path d="M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z"/>
</svg>
{{ $featured_label }}
</div>
{{ end }}
<h1 class="text-3xl md:text-4xl font-bold mb-4">{{ .Title }}</h1>
{{/* Meta info */}}
<div class="flex flex-wrap items-center gap-x-4 gap-y-2 text-sm text-white/80">
{{ if gt (len $authorNames) 0 }}
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"/>
</svg>
{{ delimit $authorNames ", " }}
</div>
{{ end }}
{{ with $venue }}
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"/>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"/>
</svg>
{{ . }}
</div>
{{ end }}
{{ with $event }}
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 5v2m0 4v2m0 4v2M5 5a2 2 0 00-2 2v3a2 2 0 110 4v3a2 2 0 002 2h14a2 2 0 002-2v-3a2 2 0 110-4V7a2 2 0 00-2-2H5z"/>
</svg>
{{ . }}
</div>
{{ end }}
{{ if $course }}
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"/>
</svg>
{{ $course }}{{ with $lecture }} - {{ $lecture_label }} {{ . }}{{ end }}
</div>
{{ end }}
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/>
</svg>
{{ .Date | time.Format "January 2006" }}
</div>
<div class="flex items-center gap-1.5">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
{{ $slideCount }} {{ $slides_label | lower }}
</div>
</div>
</div>
{{/* Content section */}}
<div class="px-8 py-8">
{{/* Description/Abstract */}}
{{ with $description }}
<div class="mb-6">
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100 mb-2">{{ $abstract_label }}</h2>
<p class="text-zinc-600 dark:text-zinc-400 leading-relaxed">{{ . }}</p>
</div>
{{ end }}
{{/* Topics/Tags */}}
{{ if $topics }}
<div class="mb-6">
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100 mb-2">{{ $topics_label }}</h2>
<div class="flex flex-wrap gap-2">
{{ range $topics }}
<a href="{{ "/slides/" | relURL }}" class="px-3 py-1 rounded-full text-sm font-medium bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-primary-100 dark:hover:bg-primary-900/40 hover:text-primary-700 dark:hover:text-primary-300 transition-colors">
{{ . }}
</a>
{{ end }}
</div>
</div>
{{ end }}
{{/* Related Resources - Use HugoBlox standard links */}}
{{ if $resourceLinks }}
<div class="mb-6">
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100 mb-2">{{ $related_resources_label }}</h2>
<div class="flex flex-wrap gap-3">
{{ 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 }}
<a href="{{ .url }}" {{ with $target }}target="{{ . }}"{{ end }} {{ with $rel }}rel="{{ . }}"{{ end }} class="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors">
{{ partial "functions/get_icon" (dict "name" (.icon | default "hero/link") "attributes" "class='w-4 h-4'") }}
{{ $linkLabel }}
</a>
{{ end }}
</div>
</div>
{{ end }}
{{/* Share Panel */}}
<div class="flex flex-wrap gap-3 pt-6 border-t border-zinc-100 dark:border-zinc-800 mb-6">
{{/* Open Presenter */}}
{{ with $present_format }}
<a href="{{ .RelPermalink }}" target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-6 py-3 rounded-lg bg-primary-600 hover:bg-primary-700 text-white font-semibold transition-colors shadow-lg shadow-primary-500/25 cursor-pointer">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
<path d="M8 5v14l11-7z"/>
</svg>
{{ $present_fullscreen_label }}
</a>
{{ end }}
{{/* Copy Link */}}
<button
@click="navigator.clipboard.writeText('{{ .Permalink }}'); copied = true; copyText = {{ $copied_label | jsonify }}; setTimeout(() => { copied = false; copyText = {{ $copy_link_label | jsonify }}; }, 2000)"
class="inline-flex items-center gap-2 px-4 py-3 rounded-lg bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors"
>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" x-show="!copied">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
</svg>
<svg class="w-5 h-5 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" x-show="copied" x-cloak>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
</svg>
<span x-text="copyText">{{ $copy_link_label }}</span>
</button>
{{/* Copy Citation */}}
{{ if $has_citation_copy }}
<button
@click="navigator.clipboard.writeText(citationValue); citationCopied = true; citationCopyText = {{ $copied_label | jsonify }}; setTimeout(() => { citationCopied = false; citationCopyText = {{ $copy_citation_label | jsonify }}; }, 2000)"
class="inline-flex items-center gap-2 px-4 py-3 rounded-lg bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors"
>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" x-show="!citationCopied">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
</svg>
<svg class="w-5 h-5 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" x-show="citationCopied" x-cloak>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
</svg>
<span x-text="citationCopyText">{{ $copy_citation_label }}</span>
</button>
{{ end }}
{{/* Print PDF */}}
{{ with $present_format }}
<a href="{{ .RelPermalink }}?print-pdf" target="_blank" rel="noopener" class="inline-flex items-center gap-2 px-4 py-3 rounded-lg bg-zinc-100 dark:bg-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-200 dark:hover:bg-zinc-700 transition-colors" title="{{ $print_hint }}">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"/>
</svg>
{{ $export_pdf_label }}
</a>
{{ end }}
</div>
{{/* Citation Section - Use HugoBlox standard links + citation field */}}
{{ if or $citation $citationLinks }}
<div class="pt-6 border-t border-zinc-100 dark:border-zinc-800">
<button
@click="showCitation = !showCitation"
class="flex items-center gap-2 text-sm font-medium text-zinc-600 dark:text-zinc-400 hover:text-zinc-900 dark:hover:text-zinc-100 transition-colors"
>
<svg class="w-4 h-4 transition-transform" :class="showCitation && 'rotate-90'" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
</svg>
{{ $how_to_cite_label }}
</button>
<div x-show="showCitation" x-transition class="mt-3 space-y-3">
{{ with $citation }}
<div>
<h4 class="text-xs font-semibold text-zinc-500 dark:text-zinc-400 mb-1">{{ $citation_label }}</h4>
<pre class="p-4 bg-zinc-50 dark:bg-zinc-800/50 rounded-lg text-sm text-zinc-700 dark:text-zinc-300 overflow-x-auto"><code>{{ . }}</code></pre>
</div>
{{ end }}
{{/* DOI and BibTeX from standard links structure */}}
{{ range $citationLinks }}
{{ if eq .type "doi" }}
<div>
<h4 class="text-xs font-semibold text-zinc-500 dark:text-zinc-400 mb-1">{{ $doi_label }}</h4>
<a href="{{ .url }}" target="_blank" rel="noopener" class="text-sm text-primary-600 dark:text-primary-400 hover:underline">
{{ .url | replaceRE "^https://doi.org/" "" }}
</a>
</div>
{{ else if eq .type "bibtex" }}
<div>
<h4 class="text-xs font-semibold text-zinc-500 dark:text-zinc-400 mb-1">{{ $bibtex_label }}</h4>
<a href="{{ .url }}" class="text-sm text-primary-600 dark:text-primary-400 hover:underline">
{{ $download_cite_bib_label }}
</a>
</div>
{{ end }}
{{ end }}
</div>
</div>
{{ end }}
</div>
</div>
</div>
</div>
{{ end }}
@@ -0,0 +1,3 @@
{{ define "main" }}
{{ partial "slides" (union (slice .Page) .Pages) }}
{{ end }}
@@ -17,6 +17,16 @@ hasCJKLanguage: false
defaultContentLanguageInSubdir: false
removePathAccents: true
############################
## PAGE OPTIONS
############################
cascade:
- _target:
path: /slides/**
kind: page
outputs: [HTML, present]
############################
## ADVANCED
############################
@@ -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
@@ -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"
}
}
}
+2
View File
@@ -0,0 +1,2 @@
github: gcushen
custom: https://hugoblox.com/sponsor/
Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

+125
View File
@@ -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
+69
View File
@@ -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*
+21
View File
@@ -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.
+128
View File
@@ -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)
<h1 align="center">The Presentation Framework for Researchers</h1>
<p align="center">
<strong>Stop wrestling with PowerPoint.</strong><br/>
Write slides in Markdown, version control your talks, and present code & math beautifully.
</p>
<p align="center">
<a href="https://hugoblox.com/templates/markdown-slides/start?utm_source=github&utm_medium=readme"><b>🚀 Deploy in 60s (Free)</b></a>
&nbsp;•&nbsp;
<a href="https://hugoblox.com/templates/?open=markdown-slides&loading=true&utm_source=github&utm_medium=readme">Live Demo</a>
&nbsp;•&nbsp;
<a href="https://docs.hugoblox.com/guides/studio/">HugoBlox Studio (Visual Editor)</a>
</p>
<p align="center">
<b>▶︎ Watch Preview</b>
</p>
<!-- Video placeholder - replace with actual video link when available -->
<p align="center">
<i>Video coming soon...</i>
</p>
<p align="center">
<a href="https://discord.gg/z8wNYzb"><img src="https://img.shields.io/discord/722225264733716590?label=Join%20Discord&style=social" alt="Discord"></a>
<a href="https://github.com/HugoBlox/kit"><img src="https://img.shields.io/github/stars/HugoBlox/kit?label=Star%20HugoBlox&style=social" alt="GitHub Stars"></a>
<a href="https://x.com/BuildLore"><img src="https://img.shields.io/twitter/follow/BuildLore?label=Follow&style=social" alt="Follow on X"></a>
</p>
---
## 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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="3" width="20" height="14" rx="2" ry="2"/>
<line x1="8" y1="21" x2="16" y2="21"/>
<line x1="12" y1="17" x2="12" y2="21"/>
<polygon points="10 9 15 12 10 15 10 9" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 372 B

@@ -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: <sup>^</sup>
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
@@ -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
@@ -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
@@ -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: ""
@@ -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
---
@@ -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.
@@ -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
<div class="r-hstack">
<div style="flex: 1; padding-right: 1rem;">
### Benefits
- Open source
- Version control
- No vendor lock-in
- Works offline
</div>
<div style="flex: 1; padding-left: 1rem;">
### Use Cases
- Tech talks
- Academic papers
- Team updates
- Training sessions
</div>
</div>
---
{{< slide background-color="#1e3a8a" >}}
## Custom Backgrounds
Slides can have **custom colors** or images.
Use `{{</* slide background-color="#hex" */>}}`
---
## 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*
@@ -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 }}
<article>
<h2>{{ .Title }}</h2>
<p>{{ .Summary }}</p>
<a href="{{ .Permalink }}">Read more</a>
</article>
{{ 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
@@ -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
<div class="r-hstack">
<div style="flex: 1; padding-right: 1rem;">
### Dataset
- **Size**: 1M samples
- **Split**: 80/10/10
- **Preprocessing**: Tokenization, normalization
</div>
<div style="flex: 1; padding-left: 1rem;">
### Training
- **Optimizer**: AdamW
- **Learning rate**: 3e-4
- **Batch size**: 256
- **Epochs**: 100
</div>
</div>
---
## 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.
@@ -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
+9
View File
@@ -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
)
+6
View File
@@ -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"
+49
View File
@@ -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"
+19
View File
@@ -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"
}
}
+714
View File
@@ -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: {}