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 }}