jekyll-theme-conference 3.7.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +543 -220
  4. data/UPGRADE_GUIDE.md +177 -0
  5. data/_data/lang.yml +233 -0
  6. data/_data/program.yml +12 -0
  7. data/_includes/{partials/checks.html → checks.html} +31 -8
  8. data/_includes/footer.html +18 -0
  9. data/_includes/{partials/get_day_time.html → get_day_time.html} +2 -2
  10. data/_includes/get_link.html +163 -0
  11. data/_includes/get_link_tag_streaming.html +24 -0
  12. data/_includes/{partials/get_link_types.html → get_link_types.html} +1 -1
  13. data/_includes/get_live_icon.html +14 -0
  14. data/_includes/{partials/get_live_timestamps.html → get_live_timestamps.html} +1 -1
  15. data/_includes/get_location_config.html +29 -0
  16. data/_includes/{partials/get_page_description.html → get_page_description.html} +1 -1
  17. data/_includes/get_program_config.html +18 -0
  18. data/_includes/{partials/get_tag_icon.html → get_tag_icon.html} +1 -1
  19. data/_includes/get_talk_overview_talk.html +65 -0
  20. data/_includes/{partials/get_talk_time.html → get_talk_time.html} +3 -2
  21. data/_includes/{partials/get_talk_timestamp.html → get_talk_timestamp.html} +1 -1
  22. data/_includes/header.html +68 -0
  23. data/_includes/infobox.html +114 -0
  24. data/_includes/list_header_live.html +14 -0
  25. data/_includes/list_header_meta.html +46 -0
  26. data/_includes/list_header_pwa.html +21 -0
  27. data/_includes/{partials/list_speakers.html → list_speakers.html} +3 -8
  28. data/_includes/list_tags.html +4 -0
  29. data/_includes/modal_link.html +19 -0
  30. data/_includes/modal_live.html +47 -0
  31. data/_includes/navbar.html +91 -0
  32. data/_includes/navbar_pwa.html +46 -0
  33. data/_includes/navbar_rooms.html +39 -0
  34. data/_includes/schema_conference.html +144 -0
  35. data/_includes/schema_location.html +48 -0
  36. data/_includes/schema_room.html +25 -0
  37. data/_includes/schema_speaker.html +44 -0
  38. data/_includes/schema_talk.html +151 -0
  39. data/_includes/show_live_icon.html +10 -0
  40. data/_includes/show_room.html +6 -0
  41. data/_includes/show_talk.html +5 -0
  42. data/_includes/show_talk_duration.html +3 -0
  43. data/_includes/show_talk_info.html +24 -0
  44. data/_includes/show_talk_listed.html +22 -0
  45. data/_includes/show_talk_time.html +25 -0
  46. data/_layouts/default.html +2 -2
  47. data/_layouts/home.html +38 -59
  48. data/_layouts/{config.html → json-config.html} +20 -17
  49. data/_layouts/{data.html → json-data.html} +6 -10
  50. data/_layouts/json-site.html +50 -0
  51. data/_layouts/location.html +27 -9
  52. data/_layouts/manifest.html +50 -0
  53. data/_layouts/page.html +2 -6
  54. data/_layouts/program.html +53 -62
  55. data/_layouts/room.html +9 -29
  56. data/_layouts/speaker-overview.html +6 -6
  57. data/_layouts/speaker.html +26 -56
  58. data/_layouts/stream-overview.html +6 -6
  59. data/_layouts/sw.js +65 -0
  60. data/_layouts/talk-overview.html +5 -5
  61. data/_layouts/talk.html +24 -63
  62. data/assets/css/conference-only.bundle.css +5 -0
  63. data/assets/css/conference.bundle.css +5 -0
  64. data/assets/js/conference.bundle.js +76 -0
  65. data/assets/js/config.json +1 -1
  66. data/assets/js/data.json +1 -1
  67. data/assets/js/leaflet.bundle.js +9 -0
  68. data/assets/js/main.js +23 -4
  69. data/assets/js/site.json +3 -0
  70. data/assets/webfonts/bootstrap-icons.woff +0 -0
  71. data/assets/webfonts/bootstrap-icons.woff2 +0 -0
  72. metadata +63 -226
  73. data/_includes/js/conference.js +0 -55
  74. data/_includes/js/init.js +0 -39
  75. data/_includes/js/lib/bootstrap.js +0 -6
  76. data/_includes/js/lib/jquery-3.5.1.min.js +0 -2
  77. data/_includes/js/lib/leaflet-easybutton.js +0 -376
  78. data/_includes/js/lib/leaflet-locatecontrol.js +0 -4
  79. data/_includes/js/lib/leaflet-providers.js +0 -877
  80. data/_includes/js/lib/leaflet.js +0 -5
  81. data/_includes/js/lib/popper.min.js +0 -4
  82. data/_includes/js/lib/syncscroll.js +0 -140
  83. data/_includes/js/live.js +0 -779
  84. data/_includes/js/map.js +0 -43
  85. data/_includes/js/modal.js +0 -78
  86. data/_includes/js/program.js +0 -41
  87. data/_includes/partials/footer.html +0 -15
  88. data/_includes/partials/get_enable_map.html +0 -11
  89. data/_includes/partials/get_link.html +0 -99
  90. data/_includes/partials/get_talk_overview_talk.html +0 -81
  91. data/_includes/partials/header.html +0 -54
  92. data/_includes/partials/info_bar.html +0 -38
  93. data/_includes/partials/list_page_meta.html +0 -23
  94. data/_includes/partials/list_tags.html +0 -7
  95. data/_includes/partials/modal_link.html +0 -21
  96. data/_includes/partials/modal_live.html +0 -49
  97. data/_includes/partials/navbar.html +0 -112
  98. data/_includes/partials/navbar_rooms.html +0 -36
  99. data/_includes/partials/show_live_button.html +0 -21
  100. data/_includes/partials/show_room.html +0 -5
  101. data/_includes/partials/show_talk.html +0 -5
  102. data/_includes/partials/show_talk_duration.html +0 -3
  103. data/_includes/partials/show_talk_time.html +0 -17
  104. data/_sass/bootstrap/_alert.scss +0 -52
  105. data/_sass/bootstrap/_badge.scss +0 -54
  106. data/_sass/bootstrap/_breadcrumb.scss +0 -44
  107. data/_sass/bootstrap/_button-group.scss +0 -163
  108. data/_sass/bootstrap/_buttons.scss +0 -142
  109. data/_sass/bootstrap/_card.scss +0 -286
  110. data/_sass/bootstrap/_carousel.scss +0 -197
  111. data/_sass/bootstrap/_close.scss +0 -40
  112. data/_sass/bootstrap/_code.scss +0 -48
  113. data/_sass/bootstrap/_custom-forms.scss +0 -524
  114. data/_sass/bootstrap/_dropdown.scss +0 -192
  115. data/_sass/bootstrap/_forms.scss +0 -347
  116. data/_sass/bootstrap/_functions.scss +0 -144
  117. data/_sass/bootstrap/_grid.scss +0 -73
  118. data/_sass/bootstrap/_images.scss +0 -42
  119. data/_sass/bootstrap/_input-group.scss +0 -192
  120. data/_sass/bootstrap/_jumbotron.scss +0 -17
  121. data/_sass/bootstrap/_list-group.scss +0 -154
  122. data/_sass/bootstrap/_media.scss +0 -8
  123. data/_sass/bootstrap/_mixins.scss +0 -47
  124. data/_sass/bootstrap/_modal.scss +0 -240
  125. data/_sass/bootstrap/_nav.scss +0 -123
  126. data/_sass/bootstrap/_navbar.scss +0 -324
  127. data/_sass/bootstrap/_pagination.scss +0 -74
  128. data/_sass/bootstrap/_popover.scss +0 -170
  129. data/_sass/bootstrap/_print.scss +0 -141
  130. data/_sass/bootstrap/_progress.scss +0 -47
  131. data/_sass/bootstrap/_reboot.scss +0 -484
  132. data/_sass/bootstrap/_root.scss +0 -20
  133. data/_sass/bootstrap/_spinners.scss +0 -56
  134. data/_sass/bootstrap/_tables.scss +0 -185
  135. data/_sass/bootstrap/_toasts.scss +0 -46
  136. data/_sass/bootstrap/_tooltip.scss +0 -115
  137. data/_sass/bootstrap/_transitions.scss +0 -20
  138. data/_sass/bootstrap/_type.scss +0 -125
  139. data/_sass/bootstrap/_utilities.scss +0 -18
  140. data/_sass/bootstrap/_variables.scss +0 -1142
  141. data/_sass/bootstrap/bootstrap-grid.scss +0 -29
  142. data/_sass/bootstrap/bootstrap-reboot.scss +0 -12
  143. data/_sass/bootstrap/bootstrap.scss +0 -44
  144. data/_sass/bootstrap/mixins/_alert.scss +0 -13
  145. data/_sass/bootstrap/mixins/_background-variant.scss +0 -23
  146. data/_sass/bootstrap/mixins/_badge.scss +0 -17
  147. data/_sass/bootstrap/mixins/_border-radius.scss +0 -76
  148. data/_sass/bootstrap/mixins/_box-shadow.scss +0 -20
  149. data/_sass/bootstrap/mixins/_breakpoints.scss +0 -123
  150. data/_sass/bootstrap/mixins/_buttons.scss +0 -110
  151. data/_sass/bootstrap/mixins/_caret.scss +0 -62
  152. data/_sass/bootstrap/mixins/_clearfix.scss +0 -7
  153. data/_sass/bootstrap/mixins/_deprecate.scss +0 -10
  154. data/_sass/bootstrap/mixins/_float.scss +0 -14
  155. data/_sass/bootstrap/mixins/_forms.scss +0 -178
  156. data/_sass/bootstrap/mixins/_gradients.scss +0 -45
  157. data/_sass/bootstrap/mixins/_grid-framework.scss +0 -80
  158. data/_sass/bootstrap/mixins/_grid.scss +0 -69
  159. data/_sass/bootstrap/mixins/_hover.scss +0 -37
  160. data/_sass/bootstrap/mixins/_image.scss +0 -36
  161. data/_sass/bootstrap/mixins/_list-group.scss +0 -21
  162. data/_sass/bootstrap/mixins/_lists.scss +0 -7
  163. data/_sass/bootstrap/mixins/_nav-divider.scss +0 -11
  164. data/_sass/bootstrap/mixins/_pagination.scss +0 -22
  165. data/_sass/bootstrap/mixins/_reset-text.scss +0 -17
  166. data/_sass/bootstrap/mixins/_resize.scss +0 -6
  167. data/_sass/bootstrap/mixins/_screen-reader.scss +0 -34
  168. data/_sass/bootstrap/mixins/_size.scss +0 -7
  169. data/_sass/bootstrap/mixins/_table-row.scss +0 -39
  170. data/_sass/bootstrap/mixins/_text-emphasis.scss +0 -17
  171. data/_sass/bootstrap/mixins/_text-hide.scss +0 -11
  172. data/_sass/bootstrap/mixins/_text-truncate.scss +0 -8
  173. data/_sass/bootstrap/mixins/_transition.scss +0 -26
  174. data/_sass/bootstrap/mixins/_visibility.scss +0 -8
  175. data/_sass/bootstrap/utilities/_align.scss +0 -8
  176. data/_sass/bootstrap/utilities/_background.scss +0 -19
  177. data/_sass/bootstrap/utilities/_borders.scss +0 -75
  178. data/_sass/bootstrap/utilities/_clearfix.scss +0 -3
  179. data/_sass/bootstrap/utilities/_display.scss +0 -26
  180. data/_sass/bootstrap/utilities/_embed.scss +0 -39
  181. data/_sass/bootstrap/utilities/_flex.scss +0 -51
  182. data/_sass/bootstrap/utilities/_float.scss +0 -11
  183. data/_sass/bootstrap/utilities/_interactions.scss +0 -5
  184. data/_sass/bootstrap/utilities/_overflow.scss +0 -5
  185. data/_sass/bootstrap/utilities/_position.scss +0 -32
  186. data/_sass/bootstrap/utilities/_screenreaders.scss +0 -11
  187. data/_sass/bootstrap/utilities/_shadows.scss +0 -6
  188. data/_sass/bootstrap/utilities/_sizing.scss +0 -20
  189. data/_sass/bootstrap/utilities/_spacing.scss +0 -73
  190. data/_sass/bootstrap/utilities/_stretched-link.scss +0 -19
  191. data/_sass/bootstrap/utilities/_text.scss +0 -72
  192. data/_sass/bootstrap/utilities/_visibility.scss +0 -13
  193. data/_sass/bootstrap/vendor/_rfs.scss +0 -204
  194. data/_sass/conference.scss +0 -255
  195. data/_sass/font-awesome/_animated.scss +0 -20
  196. data/_sass/font-awesome/_bordered-pulled.scss +0 -20
  197. data/_sass/font-awesome/_core.scss +0 -21
  198. data/_sass/font-awesome/_fixed-width.scss +0 -6
  199. data/_sass/font-awesome/_icons.scss +0 -1462
  200. data/_sass/font-awesome/_larger.scss +0 -23
  201. data/_sass/font-awesome/_list.scss +0 -18
  202. data/_sass/font-awesome/_mixins.scss +0 -56
  203. data/_sass/font-awesome/_rotated-flipped.scss +0 -24
  204. data/_sass/font-awesome/_screen-reader.scss +0 -5
  205. data/_sass/font-awesome/_shims.scss +0 -2066
  206. data/_sass/font-awesome/_stacked.scss +0 -31
  207. data/_sass/font-awesome/_variables.scss +0 -1479
  208. data/_sass/font-awesome/brands.scss +0 -23
  209. data/_sass/font-awesome/fontawesome.scss +0 -16
  210. data/_sass/font-awesome/regular.scss +0 -23
  211. data/_sass/font-awesome/scss/_animated.scss +0 -20
  212. data/_sass/font-awesome/scss/_bordered-pulled.scss +0 -20
  213. data/_sass/font-awesome/scss/_core.scss +0 -21
  214. data/_sass/font-awesome/scss/_fixed-width.scss +0 -6
  215. data/_sass/font-awesome/scss/_icons.scss +0 -1441
  216. data/_sass/font-awesome/scss/_larger.scss +0 -23
  217. data/_sass/font-awesome/scss/_list.scss +0 -18
  218. data/_sass/font-awesome/scss/_mixins.scss +0 -56
  219. data/_sass/font-awesome/scss/_rotated-flipped.scss +0 -24
  220. data/_sass/font-awesome/scss/_screen-reader.scss +0 -5
  221. data/_sass/font-awesome/scss/_shims.scss +0 -2066
  222. data/_sass/font-awesome/scss/_stacked.scss +0 -31
  223. data/_sass/font-awesome/scss/_variables.scss +0 -1458
  224. data/_sass/font-awesome/scss/brands.scss +0 -23
  225. data/_sass/font-awesome/scss/fontawesome.scss +0 -16
  226. data/_sass/font-awesome/scss/regular.scss +0 -23
  227. data/_sass/font-awesome/scss/solid.scss +0 -24
  228. data/_sass/font-awesome/scss/v4-shims.scss +0 -6
  229. data/_sass/font-awesome/solid.scss +0 -24
  230. data/_sass/font-awesome/v4-shims.scss +0 -6
  231. data/_sass/leaflet/leaflet-easybutton.scss +0 -56
  232. data/_sass/leaflet/leaflet-locatecontrol.scss +0 -2
  233. data/_sass/leaflet/leaflet.scss +0 -640
  234. data/assets/css/main.scss +0 -6
  235. data/assets/icons/live.svg +0 -57
  236. data/assets/webfonts/fa-brands-400.eot +0 -0
  237. data/assets/webfonts/fa-brands-400.svg +0 -3717
  238. data/assets/webfonts/fa-brands-400.ttf +0 -0
  239. data/assets/webfonts/fa-brands-400.woff +0 -0
  240. data/assets/webfonts/fa-brands-400.woff2 +0 -0
  241. data/assets/webfonts/fa-regular-400.eot +0 -0
  242. data/assets/webfonts/fa-regular-400.svg +0 -801
  243. data/assets/webfonts/fa-regular-400.ttf +0 -0
  244. data/assets/webfonts/fa-regular-400.woff +0 -0
  245. data/assets/webfonts/fa-regular-400.woff2 +0 -0
  246. data/assets/webfonts/fa-solid-900.eot +0 -0
  247. data/assets/webfonts/fa-solid-900.svg +0 -5028
  248. data/assets/webfonts/fa-solid-900.ttf +0 -0
  249. data/assets/webfonts/fa-solid-900.woff +0 -0
  250. data/assets/webfonts/fa-solid-900.woff2 +0 -0
  251. /data/_includes/{partials/get_day_hash.html → get_day_hash.html} +0 -0
  252. /data/_includes/{partials/get_page_title.html → get_page_title.html} +0 -0
  253. /data/_includes/{partials/get_room_live_href.html → get_room_live_href.html} +0 -0
  254. /data/_includes/{partials/get_time_pronoun.html → get_time_pronoun.html} +0 -0
  255. /data/_includes/{partials/get_track_properties.html → get_track_properties.html} +0 -0
data/README.md CHANGED
@@ -2,20 +2,26 @@
2
2
 
3
3
  ![Screenshot](screenshot.png)
4
4
 
5
- This is a responsive [Jekyll](http://jekyllrb.com) theme based on [Bootstrap 4](http://getbootstrap.com) for conferences. It contains
5
+ This is a responsive [Jekyll](http://jekyllrb.com) theme based on [Bootstrap 5](http://getbootstrap.com) for conferences. It contains
6
6
 
7
- - multiday program / schedule,
7
+ - multi-day program / schedule,
8
8
  - talk and speaker descriptions,
9
9
  - maps for directions,
10
- - real-time indications during the conference, and
11
- - supports embedded video streaming or recordings.
10
+ - real-time indications during the conference,
11
+ - support for embedded video streaming or recordings
12
+ - support for an all offline progressive web app, and
13
+ - automatic dark mode support based on system preferences.
12
14
 
13
- All components such as talks, speakers or rooms are represented as collection of files. The schedule is defined via a simple structure stored in a [YAML](https://en.wikipedia.org/wiki/YAML) file. There is no need for databases and once generated the website consists only of static files. A script and workflows are available for easy import, e.g., of [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible schedules.
15
+ All components such as talks, speakers or rooms are represented as a collection of files. The schedule is defined via a simple structure stored in a [YAML](https://en.wikipedia.org/wiki/YAML) file. There is no need for databases and once generated the website consists only of static files. A script and workflows are available for easy import, e.g., of [frab](https://github.com/frab/frab/wiki/Manual#introduction) compatible schedules.
14
16
  The design is easily customizable and is adapted for mobile uses and printing.
15
17
 
16
18
  The theme was created for the yearly Winterkongress conference of the [Digital Society Switzerland](https://digitale-gesellschaft.ch/). You can see this theme active here:
17
19
 
18
- - [Demo: Winterkongress](https://digitale-gesellschaft.ch/kongress/)
20
+ - [Demo: Winterkongress](https://winterkongress.ch/)
21
+
22
+ > [!WARNING]
23
+ > If you were using the theme up to version 3, please note the changes to migrate to the new version 4 in the [upgrade guide](UPGRADE_GUIDE.md).
24
+
19
25
 
20
26
  ## Table of Contents
21
27
 
@@ -23,7 +29,6 @@ The theme was created for the yearly Winterkongress conference of the [Digital S
23
29
  - [Gem-based Method](#gem-based-method)
24
30
  - [Remote Theme Method](#remote-theme-method)
25
31
  - [Setup](#setup)
26
- - [Jump Start](#jump-start)
27
32
  - [Automatic Import](#automatic-import)
28
33
  - [Automatic Build](#automatic-build)
29
34
  - [Configuration](#configuration)
@@ -32,13 +37,12 @@ The theme was created for the yearly Winterkongress conference of the [Digital S
32
37
  - [Language](#language)
33
38
  - [Timezone](#timezone)
34
39
  - [Navigation Bar](#navigation-bar)
35
- - [Open Graph Link Preview](#open-graph-link-preview)
40
+ - [Meta Data for Search Engines and Link Previews](#meta-data-for-search-engines-and-link-previews)
36
41
  - [Main Landing Page](#main-landing-page)
37
- - [Information Boxes](#information-boxes)
42
+ - [Information Boxes & Modals](#information-boxes--modals)
38
43
  - [Live Indications & Streaming](#live-indications--streaming)
39
- - [Map](#map)
44
+ - [Progressive Web App (PWA)](#progressive-web-app-pwa)
40
45
  - [Talk Settings](#talk-settings)
41
- - [Speaker Settings](#speaker-settings)
42
46
  - [Location Settings](#location-settings)
43
47
  - [Program Settings](#program-settings)
44
48
  - [Content](#content)
@@ -47,21 +51,29 @@ The theme was created for the yearly Winterkongress conference of the [Digital S
47
51
  - [Speakers](#speakers)
48
52
  - [Rooms](#rooms)
49
53
  - [Links](#links)
50
- - [Overview Pages](#overview-pages)
51
- - [Location / Room Overview](#location--room-overview)
52
- - [Live Stream Overview](#live-stream-overview)
54
+ - [Overview Pages](#overview-pages)
53
55
  - [Additional Pages](#additional-pages)
54
56
  - [Design](#design)
57
+ - [Pre-compiled Bundle (Default)](#pre-compiled-bundle-default)
58
+ - [Split Bundle (Custom Bootstrap CSS)](#split-bundle-custom-bootstrap-css)
59
+ - [JavaScript](#javascript)
55
60
  - [Development](#development)
61
+ - [Jekyll Theme Development](#jekyll-theme-development)
62
+ - [JavaScript & CSS Development](#javascript--css-development)
56
63
  - [License](#license)
57
64
 
65
+
58
66
  ## Installation
59
67
 
60
- There are three ways to install: As a [Gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes), as a [remote theme](https://github.blog/2017-11-29-use-any-theme-with-github-pages/) (GitHub Pages compatible), or by cloning/forking this repository and reference to it directly.
68
+ There are three ways to install this theme:
69
+
70
+ 1. **Gem-based method**: Install as a [Gem-based theme](https://jekyllrb.com/docs/themes/#understanding-gem-based-themes) (recommended for most users)
71
+ 2. **Remote theme method**: Use as a [remote theme](https://github.blog/2017-11-29-use-any-theme-with-github-pages/) (ideal for GitHub Pages)
72
+ 3. **Local development**: Clone or fork this repository for local development and customization (see [Development](#development) section)
61
73
 
62
74
  ### Gem-based Method
63
75
 
64
- With Gem-based themes, directories such as the `assets`, `_layouts`, `_includes`, and `_sass` are stored in the themes gem, hidden from your immediate view. Yet all the necessary directories will be read and processed during Jekylls build process.
76
+ With Gem-based themes, directories such as `assets`, `_layouts`, and `_includes` are stored in the theme's gem, hidden from your immediate view. All necessary directories will be read and processed during Jekyll's build process.
65
77
 
66
78
  This allows for easier installation and updating as you don't have to manage any of the theme files. To install:
67
79
 
@@ -83,17 +95,17 @@ This allows for easier installation and updating as you don't have to manage any
83
95
  theme: jekyll-theme-conference
84
96
  ```
85
97
 
86
- 4. Continue with the _Setup_ section further below to customize the theme and add some content for your conference
98
+ 4. Continue with the [_Setup_](#setup) section below to customize the theme and add content for your conference.
87
99
 
88
- To update the theme run `bundle update`.
100
+ To update the theme, run `bundle update jekyll-theme-conference`.
89
101
 
90
102
  ### Remote Theme Method
91
103
 
92
- Remote themes are similar to Gem-based themes, but do not require `Gemfile` changes or whitelisting making them ideal for sites hosted with GitHub Pages.
104
+ Remote themes are similar to Gem-based themes but are ideal for sites hosted with GitHub Pages, as they don't require theme whitelisting.
93
105
 
94
106
  To install:
95
107
 
96
- 1. Create/replace the contents of your `Gemfile` with the following:
108
+ 1. Create or replace the contents of your `Gemfile` with the following:
97
109
 
98
110
  ```ruby
99
111
  source "https://rubygems.org"
@@ -102,7 +114,12 @@ To install:
102
114
  gem "jekyll-include-cache", group: :jekyll_plugins
103
115
  ```
104
116
 
105
- 2. Add `jekyll-include-cache` to the `plugins` array of your `_config.yml`.
117
+ 2. Add `jekyll-include-cache` to the `plugins` array in your `_config.yml`:
118
+
119
+ ```yaml
120
+ plugins:
121
+ - jekyll-include-cache
122
+ ```
106
123
 
107
124
  3. Fetch and update bundled gems by running the following [Bundler](http://bundler.io/) command:
108
125
 
@@ -110,36 +127,29 @@ To install:
110
127
  bundle
111
128
  ```
112
129
 
113
- 4. Add `remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@v3.6.3"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry.
130
+ 4. Add `remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@4.0.0"` to your `_config.yml` file. Remove any other `theme:` or `remote_theme:` entry.
114
131
 
115
- 5. Continue with the _Setup_ section further below to customize the theme and add some content for your conference
132
+ ```yaml
133
+ remote_theme: "DigitaleGesellschaft/jekyll-theme-conference@4.0.0"
134
+ ```
116
135
 
117
- ## Setup
136
+ 5. Continue with the [_Setup_](#setup) section below to customize the theme and add content for your conference.
118
137
 
119
- The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [FrontMatter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description. Their exact use and meaning is described further below in the section _Content_. Additional configuration options can be found in the section _Configuration_.
138
+ To update the theme, change the version tag in the `remote_theme` value (e.g., `@4.0.0` to `@v4.1.0`).
120
139
 
121
- The schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/) under `_data/program.yml`. For further details about it see below in the section _Content_.
122
140
 
123
- :warning: Please note that the generated website can be large containing many unnecessary whitespaces. It is recommended to minimize the generated output files before uploading them to a server (e.g., with [minify](https://github.com/tdewolff/minify)).
141
+ ## Setup
124
142
 
125
- ### Jump Start
143
+ The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [FrontMatter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description. Their exact use and meaning is described further below in the section [_Content_](#content). Additional configuration options can be found in the section [_Configuration_](#configuration).
126
144
 
127
- To be up and running simply use the default content of this repository as an initial base for your new website. After having set up a new Jekyll website copy the following files and folders into the website's folder:
145
+ The schedule defining when and in which room a talk takes place is stored as a [YAML data file](https://jekyllrb.com/docs/datafiles/) under `_data/program.yml`. For further details about it see below in the section [_Content_](#content).
128
146
 
129
- - `_config.example.yml` -> `_config.yml`
130
- - `_data/`
131
- - `_rooms/`
132
- - `_speakers/`
133
- - `_talks/`
134
- - `index.md`
135
- - `location/`
136
- - `program/`
137
- - `speakers/`
138
- - `talks/`
147
+ > [!TIP]
148
+ > Please note that the generated website can be large containing many unnecessary whitespaces. It is recommended to minimize the generated output files before uploading them to a server (e.g., with [minify](https://github.com/tdewolff/minify)).
139
149
 
140
150
  ### Automatic Import
141
151
 
142
- In this repository, you'll find the Python file `_tools/import_schedule.py`. This script allows you to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction)-compatible JSON file, such as those exported from [pretalx.com](https://pretalx.com/p/about/)."
152
+ In this repository, you'll find the Python file `_tools/import_schedule.py`. This script allows you to import content from a [frab](https://github.com/frab/frab/wiki/Manual#introduction)-compatible JSON file, such as those exported from [pretalx.com](https://pretalx.com/p/about/).
143
153
 
144
154
  1. Copy the files `_tools/import_schedule.py` and `_tools/requirements.txt` from this repository
145
155
 
@@ -166,7 +176,7 @@ In this repository, you'll find the Python file `_tools/import_schedule.py`. Thi
166
176
 
167
177
  If you prefer not to install the full Ruby/Jekyll toolchain locally, you can leverage [GitHub Actions](https://github.com/features/actions), GitHub's continuous integration platform. This repository includes several example GitHub Actions configuration files in the `_tools/` folder:
168
178
 
169
- - `build.yml`: This workflow automatically builds and optimizes the website whenever a new tag starting with `v` (e.g., `v2020.01.01`) is added. It then attaches the generated website as an archive to a release for easy download. Note that `purgecss.config.js` must also be copied to the project's root for this to work.
179
+ - `build.yml`: This workflow automatically builds and optimizes the website whenever a new tag starting with `v` (e.g., `v2020.01.01`) is added. It then attaches the generated website as an archive to a release for easy download.
170
180
  - `test.yml`: This workflow automatically attempts to build the website upon a new pull request, making it suitable for use as a status check before merging.
171
181
  - `schedule.yml`: This workflow automatically generates schedule and content files when a new pull request includes a `schedule.json` file (refer to the 'Automatic Import' section for details). This enables quick content updates from [pretalx.com](https://pretalx.com/p/about/) exports.
172
182
 
@@ -174,7 +184,9 @@ To get started, simply copy the desired workflow file to your repository and ada
174
184
 
175
185
  - `_tools/build.yml` -> `.github/workflows/build.yml`
176
186
 
177
- Please note that the `Gemfile.lock` of your project must be adapted to include specific versions required by Github's workflow server, i.e., run `bundle lock --add-platform x86_64-linux` to add support for them.
187
+ > [!IMPORTANT]
188
+ > Please note that the `Gemfile.lock` of your project must be adapted to include specific versions required by GitHub's workflow server, i.e., run `bundle lock --add-platform x86_64-linux` to add support for them.
189
+
178
190
 
179
191
  ## Configuration
180
192
 
@@ -182,7 +194,7 @@ All configurations and customization for this theme are stored under the `confer
182
194
 
183
195
  ### Theme Verification
184
196
 
185
- Upon building, the theme runs some basic verification to check if all necessary files and configurations are in place. If it encounters an error it shows so in adding an information bar on all your sites. You can disable this, e.g., in a production environment, by setting `show_errors` to `false` (default: `true`).
197
+ Upon building, the theme runs some basic verification to check if all necessary files and configurations are in place. If it encounters an error it shows this by adding an information bar on all your sites. You can disable this, e.g., in a production environment, by setting `show_errors` to `false` (default: `true`).
186
198
 
187
199
  Example:
188
200
 
@@ -191,11 +203,12 @@ conference:
191
203
  show_errors: false
192
204
  ```
193
205
 
194
- :warning: Please be sure to disable this parameter for your production system.
206
+ > [!WARNING]
207
+ > Please be sure to disable this parameter for your production system.
195
208
 
196
209
  ### Collection URLs
197
210
 
198
- The three required collections containing the files for the talks, speakers and rooms have to be specified in the `_config.yml` file. The first block declares them and sets the URL under which they will later be accessed. The second block defines the default layout for each of the collection.
211
+ The three required collections containing the files for the talks, speakers and rooms have to be specified in the `_config.yml` file. The first block declares them and sets the URL under which they will later be accessed. The second block defines the default layout for each collection.
199
212
 
200
213
  ```yaml
201
214
  collections:
@@ -227,13 +240,14 @@ defaults:
227
240
  layout: room
228
241
  ```
229
242
 
230
- To change the URL of the collection, simply edit the `permalink` property and replace the `:collection` tag (which translates to `talks`, `speakers` and `rooms`) with your desired value. Please note that the talk and speaker overview pages should residue in a folder of the same name.
243
+ To change the URL of the collection, simply edit the `permalink` property and replace the `:collection` tag (which translates to `talks`, `speakers` and `rooms`) with your desired value. Please note that the talk and speaker overview pages should reside in a folder of the same name.
231
244
 
232
- _Note:_ While you might want to change the URLs, the name of the three collections (`talks`, `speakers` and `rooms`) is fixed and cannot be changed.
245
+ > [!NOTE]
246
+ > Please note that while you might want to change the URLs, the name of the three collections (`talks`, `speakers` and `rooms`) is fixed and cannot be changed.
233
247
 
234
248
  ### Language
235
249
 
236
- To adapt the language of the theme set the `lang` property. If you change it from its default, make sure you have copied the internationalization file from this repository to `_data/lang.yml`. The following languages are supported:
250
+ To set the theme's language, use the `lang` property. The following languages are supported:
237
251
 
238
252
  - English: `en` (Default)
239
253
  - German: `de`
@@ -247,6 +261,8 @@ conference:
247
261
  lang: en
248
262
  ```
249
263
 
264
+ To add more languages, copy the internationalization file from this repository to `_data/lang.yml`, modify it, and store it in your own repository at the same path.
265
+
250
266
  ### Timezone
251
267
 
252
268
  Multiple dynamic features such as showing the current day in the program or live indications require correct timing. Define the timezone in which the conference takes place with the `tz` property set to a valid [UTC timezone offset](https://en.wikipedia.org/wiki/List_of_UTC_offsets) in the format `"+/-HH:MM"`:
@@ -260,7 +276,7 @@ conference:
260
276
 
261
277
  ### Navigation Bar
262
278
 
263
- The navigation bar is located at the top and visible on every site. On the right, it shows the title of the website (`site.title`) followed by the links listed under the `links` property of the `navigation` property. See the _Content_ > _Links_ section below for the available properties per link.
279
+ The navigation bar is located at the top and visible on every site. On the left, it shows the title of the website (`site.title`) followed by the links listed under the `links` property of the `navigation` property. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link. Please note that icons are ignored for the navigation bar.
264
280
 
265
281
  Example:
266
282
 
@@ -284,6 +300,7 @@ Optionally, a logo or link of your organization hosting the conference can be sh
284
300
  - the text to show (`name`),
285
301
  - an absolute link address (`url`), and
286
302
  - optionally a logo to show instead of the text (`img`), whereby the path to the image file relative to the `/assets/images/` folder has to be specified.
303
+ - optionally a dark mode logo (`img_dark`), which will be automatically displayed when the user's system is in dark mode. If not specified, the regular `img` will be used in both light and dark modes.
287
304
 
288
305
  Example:
289
306
 
@@ -294,106 +311,205 @@ conference:
294
311
  logo:
295
312
  name: Magic Organisation
296
313
  img: 'logo.svg' # inside /assets/images/
314
+ img_dark: 'logo-dark.svg' # optional: dark mode version
297
315
  url: 'https://github.com'
298
316
  ```
299
317
 
300
- The navigation bar automatically collapses when the available space is too small (e.g. on a smaller screen). The breakpoints are given by [Bootstrap](https://getbootstrap.com/docs/4.6/layout/overview/#responsive-breakpoints). The default breakpoint is `md` (collapsing if the screen width is smaller than 992px). It can be adapted by setting the `breakpoint` property under the `navigation` property to either `sm`, `md`, `lg`, or `xl`.
318
+ The navigation bar automatically collapses when the available space is too small (e.g., on a smaller screen). The breakpoints are given by [Bootstrap](https://getbootstrap.com/docs/5.3/layout/breakpoints/). The default breakpoint is `md` (collapsing if the screen width is smaller than 992px). It can be adapted by setting the `breakpoint` property under the `navigation` property to either `sm`, `md`, `lg`, or `xl`.
319
+
320
+ When installed as a progressive web application (see the [_Progressive Web App (PWA)_](#progressive-web-app-pwa) section below), the navigation bar moves to the bottom. In PWA mode, it displays link icons and ignores links with `live: true`. Please note that the navigation bar has a limited width and no vertical scrolling. To hide an entry in this mode, set `pwa_hide: true` on its link.
321
+
322
+ ```yaml
323
+ conference:
324
+ navigation:
325
+ links:
326
+ - name: Program
327
+ icon: calendar4-week
328
+ relative_url: /program/
329
+ - name: Supporters
330
+ pwa_hide: true
331
+ relative_url: /supporters/
332
+ ```
301
333
 
302
- ### Open Graph Link Preview
334
+ ### Meta Data for Search Engines and Link Previews
303
335
 
304
- The theme automatically includes the necessary `<meta>` tags to ease link previewing when sharing links based on the [Open Graph protocol](https://ogp.me/) and [Twitter Cards](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards). These tags control how a link is shown when shared via different platform and apps. To disable these `<meta>` tags add the `disable: true` setting (default: `false`) to the `link_preview` property.
336
+ The theme automatically includes the necessary `<meta>` tags to ease link previewing when sharing links based on the [Open Graph protocol](https://ogp.me/) (used by all major social networks and messenger apps) and [Twitter Cards](https://developer.x.com/en/docs/x-for-websites/cards/overview/abouts-cards) (used by X). These tags control how a link is shown when shared via different platforms and apps. The theme also includes [Schema.org](https://schema.org/) JSON-LD structured data to help search engines better understand and display the conference and its talks, potentially showing event cards, speaker information, and enhanced search listings.
305
337
 
306
- To generate a meaningful description for each of the links, the preposition for the conference title as given under the `title` property can be defined by using the `preposition` property. For example, if `title` is set to "Conference 2020" the corresponding `preposition` would be "at". The template can then use it to generate descriptions such as "Talk _at_ Conference 2020".
338
+ Both configurations are organized under the `meta` property.
307
339
 
308
- Optionally, an image that is shown as preview for all links can be specified. For sharing via Open Graph an image ratio of 1.91:1 and an ideal size of 1200x630 pixel is recommended. For sharing via Twitter an image ratio of 1:1 and a minimal size of 600x600 pixel (better 1200x1200 pixel) is recommended. SVG image files are not supported. It is activated through the `img` property under the `link_preview` property containing an image file shown for Open Graph (`open_graph`) and on the Twitter Cards (`twitter`), whereby the path to the image file relative to the `/assets/images/` folder has to be specified.
340
+ To generate a meaningful description for each of the schemas and links, the preposition for the conference title as given under the `title` property can be defined by using the `preposition` property. For example, if `title` is set to "Conference 2020" the corresponding `preposition` would be "at". The template can then use it to generate descriptions such as "Talk _at_ Conference 2020".
309
341
 
310
342
  ```yaml
311
343
  title: Conference 2020
312
344
  preposition: "at"
313
-
314
- ...
315
-
316
- conference:
317
- link_preview:
318
- disable: false
319
- img:
320
- twitter: "twitter_preview.png" # inside /assets/images/
321
- open_graph: "facebook_preview.png" # inside /assets/images/
322
345
  ```
323
346
 
324
- ### Main Landing Page
347
+ #### Link Previews
325
348
 
326
- The main landing page is shown at the root of the website to greet new visitors. To show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: main`. The remaining customizations are specified in the `_config.yml` file.
349
+ Support for link preview is organized under the `link_preview` property part of the `meta` property. It can be disabled by setting `disable` to `true`.
327
350
 
328
- The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `logo` property under the `main` property containing
351
+ Optionally, an image that is shown as preview for all links can be specified. For sharing via Open Graph an image ratio of 1.91:1 and an ideal size of 1200x630 pixel is recommended. For sharing via Twitter an image ratio of 1.91:1 and a minimal size of 300x157 pixel (better 1200x628 pixel) is recommended. SVG image files are not supported. It is activated through the `img` property under the `link_preview` property containing an image file shown for Open Graph (`open_graph`) and on the Twitter Cards (`twitter`), whereby the path to the image file relative to the `/assets/images/` folder has to be specified.
329
352
 
330
- - a `img` property specifying the path to the image file relative to the `/assets/images/` folder.
353
+ ```yaml
354
+ conference:
355
+ meta:
356
+ link_preview:
357
+ disable: false # Set to true to disable Open Graph and Twitter Card meta tags
358
+ img:
359
+ twitter: "twitter_preview.png" # inside /assets/images/
360
+ open_graph: "facebook_preview.png" # inside /assets/images/
361
+ ```
331
362
 
332
- Example:
363
+ #### Meta Data for Search Engines
364
+
365
+ Support for [Schema.org](https://schema.org/) JSON-LD structured data is organized under the `schema_org` property part of the `meta` property. It can be disabled by setting `disable` to `true`. Different schemas are generated depending on the page type, and these schemas are interconnected. The following schemas are generated:
366
+ - `ConferenceEvent` (main and program page)
367
+ - `Event` (talk pages)
368
+ - `Place` (location and room pages)
369
+ - `Person` (speaker pages)
370
+
371
+ > [!NOTE]
372
+ > Please note that any talk, room, or speaker set to `hide: true` will not be included in the generated schemas or their relations.
373
+
374
+ Optionally, the following properties can be added under the `schema_org` property to provide further information about the conference:
375
+ - Event Status (`event_status`):
376
+ - `scheduled` (default)
377
+ - `cancelled`
378
+ - `postponed`
379
+ - `moved_online`
380
+ - Event Attendance Mode (`event_attendance_mode`):
381
+ - `offline` (default)
382
+ - `online`
383
+ - `mixed`
384
+ - Organizer hosting the conference (`organizer`) with the following properties
385
+ - `name`
386
+ - `url`
387
+ - Call for Participation (`has_participation_offer`) with the following property
388
+ - `url`
389
+ - Ticket offer (`tickets`) with the following optional properties
390
+ - `url`
391
+ - `availability`:
392
+ - `in_stock`
393
+ - `pre_order`
394
+ - `sold_out`
395
+ - `limited_availability`
396
+ - `out_of_stock`
397
+ - `online_only`
398
+ - `in_store_only`
399
+ - `price`
400
+ - `priceCurrency`: Currency code (ISO 4217, e.g., `"USD"`, `"EUR"`, `"CHF"`)
401
+ - Image file path (`img`) relative to the `/assets/images/`
333
402
 
334
403
  ```yaml
335
404
  conference:
336
- main:
337
- logo:
338
- img: "main_logo.png"
405
+ schema_org:
406
+ disable: false # Set to true to disable Schema.org JSON-LD structured data
407
+ event_status: "scheduled" # Options: scheduled, cancelled, postponed, moved_online
408
+ event_attendance_mode: "offline" # Options: offline, online, mixed
409
+ organizer: # Organization hosting the conference
410
+ name: "Your Organization Name" # Organization name
411
+ url: "https://example.com" # Organization website URL (optional, can use name or url)
412
+ has_participation_offer: # Call for participation
413
+ url: "https://example.com/register" # URL for participation offer
414
+ tickets: # Ticket offer
415
+ url: "https://example.com/tickets" # URL to purchase tickets
416
+ availability: "in_stock" # Options: in_stock, pre_order, sold_out, limited_availability, out_of_stock, online_only, in_store_only
417
+ price: "50.00" # Price as a string (e.g., "50.00")
418
+ priceCurrency: "USD" # Currency code (ISO 4217, e.g., "USD", "EUR", "CHF")
419
+ img: "conference.png" # inside /assets/images/
339
420
  ```
340
421
 
341
- The title/logo on the main page is followed by a description of your site (`site.description`) and the content of your `index.md` file. It ends with an optional list of link buttons. See the _Content_ > _Links_ section below for the available properties per link.
422
+ ### Main Landing Page
342
423
 
343
- Example:
424
+ The main landing page is shown at the root of the website to greet new visitors. To show it you need to create a `index.md` file in the root of your website's folder and specify its layout as `layout: home`.
425
+
426
+ The main page states your site's title (`site.title`) or a logo instead. The logo can be configured through the `header` property of the main page's FrontMatter containing
427
+
428
+ - a `img` property specifying the path to the image file relative to the `/assets/images/` folder.
429
+ - optionally a `img_dark` property for a dark mode version of the logo, which will be automatically displayed when the user's system is in dark mode. If not specified, the regular `img` will be used in both light and dark modes.
430
+
431
+ The title/logo on the main page is followed by a description of your site (`site.description`) and the content of your `index.md` file. It ends with an optional list of link buttons. See the [_Content_](#content) > [_Links_](#links) section below for the available properties per link.
344
432
 
345
433
  ```yaml
346
- conference:
347
- main:
348
- ...
349
- links:
350
- - name: Program
351
- relative_url: /program/
352
- - name: Tickets
353
- disabled: true
354
- absolute_url: ''
434
+ layout: home
435
+ header:
436
+ img: "main_logo.png"
437
+ img_dark: "main_logo_dark.png" # optional: dark mode version
438
+ links:
439
+ - name: Program
440
+ relative_url: /program/
441
+ - name: Tickets
442
+ disabled: true
443
+ absolute_url: ''
355
444
  ```
356
445
 
357
- ### Information Boxes
446
+ ### Information Boxes & Modals
447
+
448
+ The theme supports two types of information displays: banners at the top of the page (`bars`) and dialog popups (`modals`). Both can be used to inform your visitors about important news and announcements.
358
449
 
359
- One or multiple information banners or boxes can be shown at the top of the website just below the navigation bar. They are prominent but dismissible and can inform your visitors about recent changes. They are activated through the `info_bars` property, which contains a list for each information banner to show. Each banner consists of
450
+ One or multiple information banners can be shown at the top of the website just below the navigation bar. They are prominent and can inform your visitors about important news. They are activated through the `info.bars` property, which contains a list for each information banner to show. Each banner consists of
360
451
 
361
452
  - a title (`title`),
362
453
  - a color (`color`) following the Bootstrap color scheme (see below), possible values are:
363
454
  - `primary` (your website's main color, normally blue)
364
455
  - `secondary` (your website's secondary color, normally grey)
365
456
  - `success` (green)
366
- - `alert` (red)
457
+ - `danger` (red)
367
458
  - `warning` (yellow)
368
459
  - `info` (blue)
369
460
  - `light` (white)
370
461
  - `dark` (dark grey)
371
462
  - an additional text (`text`, markdown supported),
372
- - the option to show it on all pages, only the main landing page (`main_only: true`), or all pages except the main landing page (`pages_only: true`).
463
+ - the option to show it on all pages, only the main landing page (`main_only: true`), or all pages except the main landing page (`pages_only: true`),
464
+ - optionally, the number of days to keep the info bar dismissed after a user closes it (`dismissal_days`, default: `7`). Each info bar can have its own dismissal period. Setting `dismissal_days: 0` will disable dismissibility entirely (no close button will be shown, and the info bar cannot be dismissed).
465
+
466
+ Information modals appear as modal dialog popups that overlay the page content, dimming the background. They are useful for displaying important announcements that require user attention. Modals are activated through the `info.modals` property, which contains a list for each information modal to show. Each modal consists of
467
+
468
+ - a title (`title`),
469
+ - an additional text (`text`, markdown supported),
470
+ - the option to show it on all pages, only the main landing page (`main_only: true`), or all pages except the main landing page (`pages_only: true`),
471
+ - optionally, the number of days to keep the info modal dismissed after a user closes it (`dismissal_days`, default: `7`). Each modal can have its own dismissal period. Setting `dismissal_days: 0` will disable dismissibility entirely (cannot be closed).
472
+
473
+ Modals automatically appear when a page loads. The dismissal state is persisted in the browser's localStorage, so users won't see dismissed modals again until the dismissal period expires.
373
474
 
374
475
  Example:
375
476
 
376
477
  ```yaml
377
478
  conference:
378
- info_bars:
379
- - title: Sold Out!
380
- color: primary
381
- main_only: true
382
- text: |
383
- We're truly sorry but we are sold out.
384
-
385
- ---
386
-
387
- Try again next year.
479
+ info:
480
+ # Information modals (shown as modal dialogs)
481
+ modals:
482
+ - title: Important Announcement
483
+ main_only: true
484
+ dismissal_days: 7
485
+ text: This is an information modal that appears as a dialog.
486
+
487
+ # Information bars (shown as alerts at the top of the page)
488
+ bars:
489
+ - title: Sold Out!
490
+ color: primary
491
+ main_only: true
492
+ dismissal_days: 14
493
+ text: |
494
+ We're truly sorry but we are **sold out**.
495
+
496
+ ---
497
+
498
+ Try again next year.
499
+ - title: Important Notice
500
+ color: warning
501
+ dismissal_days: 0
502
+ text: |
503
+ This is a non-dismissible information banner that will always be visible.
388
504
  ```
389
505
 
390
506
  ### Live Indications & Streaming
391
507
 
392
- To help users navigating the program during the conference, a _Live_ indication can be shown next to talks, which are currently taking place. A small JavaScript functions keeps the site automatically up-to-date (without the need to refresh) showing the indication as soon as the talk has started and hiding it once it is over (according to the timetable indicated in the `_data/program.yml` file).
508
+ To help users navigate the program during the conference, a _Live_ indication can be shown next to talks that are currently taking place. A small JavaScript function keeps the site automatically up-to-date (without the need to refresh) showing the indication as soon as the talk has started and hiding it once it is over (according to the timetable indicated in the `_data/program.yml` file).
393
509
 
394
- This can be further extended if some talks have an associated live stream: Upon clicking one of the live indications a modal will open containing the corresponding embedded live stream. The URL to the live stream has to be set via `live` property in each room (see the _Content_ > _Room_ section below). Instead of opening the modal an external link can also be used.
510
+ This can be further extended if some talks have an associated live stream: When clicking one of the live indications, a modal will open containing the corresponding embedded live stream. The URL to the live stream has to be set via `live` property in each room (see the [_Content_](#content) > [_Rooms_](#rooms) section below). Instead of opening the modal an external link can also be used.
395
511
 
396
- To activate these functionalities, each day in the `program.yml` file must contain a `date` property (see section _Content_ > _Schedule / Program_ below) and the `live` property has to be set in the configuration file containing
512
+ To activate these functionalities, each day in the `program.yml` file must contain a `date` property (see section [_Content_](#content) > [Schedule / Program](#schedule--program) below) and the `live` property has to be set in the configuration file containing
397
513
 
398
514
  - how long a pause between two consecutive talks has to be for the live indication to pause (`stop`),
399
515
  - optionally, under the `streaming` property:
@@ -402,10 +518,6 @@ To activate these functionalities, each day in the `program.yml` file must conta
402
518
  - how many minutes the stream stays active after a talk (`extend`),
403
519
  - how long a pause between two consecutive talks has to be for the stream to pause (`pause`), and
404
520
  - an external (absolute) link to which the user will be redirected instead of opening the modal (`external`),
405
- - optionally, under the `demo` property:
406
- - if a demonstration mode should be enabled (`enable`), whereby the JavaScript function cycles continuously through the entire program in a few minutes, and if enabled
407
- - how long the demonstration should take (`duration`), and
408
- - how long the pause between two demonstration cycles should be (`pause`).
409
521
 
410
522
  ```yaml
411
523
  conference:
@@ -416,50 +528,91 @@ conference:
416
528
  pause: 60 # in minutes
417
529
  prepend: 5 # in minutes
418
530
  extend: 5 # in minutes
419
- demo:
420
- enable: false
421
- duration: 300 # in seconds
422
- pause: 10 # in seconds
531
+ external: "https://example.com/stream" # optional: external link instead of modal
423
532
  ```
424
533
 
425
- ### Map
534
+ ### Progressive Web App (PWA)
426
535
 
427
- To help users finding your venue, an [OpenStreetMap](https://www.openstreetmap.org/) container displaying a map can be shown on any page. The map's initial position is globally defined and thus the same for all map containers. You can define the initial position of the map by setting the default zoom level `default_zoom`, the center coordinates `home_coord`, and the map provider for the tiles `map_provider`. Alternative map providers can be found [here](https://leaflet-extras.github.io/leaflet-providers/preview/).
428
- The map contains small control buttons to zoom in and out, center the map back to the initial position, and show the visitors current location (has to be manually activated and granted by the visitor).
536
+ The theme includes built-in support for Progressive Web App (PWA) functionality, allowing your conference website to be installed on users' devices and work offline. PWA functionality is disabled by default. To enable it, multiple manual steps are necessary to add the necessary files:
429
537
 
430
- The map can be added to any page by setting `map: true` in its Front Matter or on the location main page by setting `conference.location.map: true` (see _Location Settings_ section below).
538
+ 1. Enable and optionally customize the functionality in your `_config.yml`:
539
+ ```yaml
540
+ conference:
541
+ pwa:
542
+ enable: true
543
+
544
+ # Theme color for the PWA (default: Bootstrap primary color, #0d6efd)
545
+ theme_color: "#0d6efd"
546
+
547
+ # Background color for the PWA (default: Bootstrap primary color, #ffffff)
548
+ background_color: "#ffffff"
549
+
550
+ # PWA icons configuration
551
+ icons:
552
+ - img: "icons/icon-192.png"
553
+ sizes: "192x192"
554
+ type: "image/png"
555
+ - img: "icons/icon-512.png"
556
+ sizes: "512x512"
557
+ type: "image/png"
558
+ - img: "icons/maskable-512.png"
559
+ sizes: "512x512"
560
+ type: "image/png"
561
+ purpose: "maskable"
562
+ ```
431
563
 
432
- ```yaml
433
- conference:
434
- map:
435
- default_zoom: 17
436
- home_coord: 47.37808, 8.53935
437
- map_provider: "OpenStreetMap.Mapnik"
438
- ```
564
+ Icons can be configured as an array of objects containing:
565
+ - `img`: Path to the icon file relative to `/assets/images/` (required)
566
+ - `sizes`: Optional, icon size in format `"WIDTHxHEIGHT"` (e.g., `"192x192"`)
567
+ - `type`: Optional, MIME type (e.g., `"image/png"`)
568
+ - `purpose`: Defaults to `"any"`, see [mdn Manifest Reference](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest/Reference/icons#purpose) for alternative values
569
+
570
+ 2. Create a manifest file in the root of your project, `manifest.json` with the following content:
571
+ ```yaml
572
+ ---
573
+ layout: manifest
574
+ ---
575
+ ```
576
+ 3. Create a service worker JavaScript file in the root of your project, `sw.js` with the following content:
577
+ ```yaml
578
+ ---
579
+ layout: sw
580
+ ---
581
+ ```
582
+ 4. Create specified icon files. It is recommended to have at least icons for the following three settings:
583
+ - `size: "192x192"`
584
+ - `size: "512x512"`
585
+ - `size: "512x512", purpose: "maskable"`
586
+
587
+ These icons will be used when users install the app on their devices. You can generate these from a single high-resolution logo using a tool like:
588
+ - [PWA Asset Generator](https://github.com/onderceylan/pwa-asset-generator)
589
+
590
+ > [!NOTE]
591
+ > Please note that when installed as a PWA, the navigation bar moves to the bottom and includes icons. See the [_Navigation Bar_](#navigation-bar) section above for more information.
439
592
 
440
593
  ### Talk Settings
441
594
 
442
- Talks can optionally be organized into tracks, where each track groups talks under a common subject. Tracks are visually distinct across the website, especially in the program, by a unique color. Additionally, each talk can have one or more associated tags. Both tracks and tags are linked via the talk's FrontMatter (refer to the _Individual Pages: Talks_ section for more details).
595
+ Talks can optionally be organized into tracks, where each track groups talks under a common subject. Tracks are visually distinct across the website, especially in the program, by a unique color. Additionally, each talk can have one or more associated tags. Both tracks and tags are linked via the talk's Front Matter (refer to the [_Content_](#content) > [_Talks_](#talks) > section below for more details).
443
596
 
444
597
  To define available tracks, add the `tracks` property under the `talks` property in the configuration file. This property is a list of tracks, with each track requiring:
445
598
 
446
- - its `name`, which must match the track specified in the talk's FrontMatter.
599
+ - its `name`, which must match the track specified in the talk's Front Matter.
447
600
  - a color (`color`) following the Bootstrap color scheme (see below), possible values include:
448
601
  - `primary` (your website's main color, normally blue)
449
602
  - `secondary` (your website's secondary color, normally grey)
450
603
  - `success` (green)
451
- - `alert` (red)
604
+ - `danger` (red)
452
605
  - `warning` (yellow)
453
606
  - `info` (blue)
454
607
  - `light` (white)
455
608
  - `dark` (dark grey)
456
609
 
457
- Instead of displaying the tag name, you can replace it with an icon. To define tags with icons, add the `tags` property under the `talks property in your configuration file. Each listed tag requires:
610
+ Instead of displaying the tag name, you can replace it with an icon. To define tags with icons, add the `tags` property under the `talks` property in your configuration file. Each listed tag requires:
458
611
 
459
- - its `name`, which must match the tag specified in the talk's FrontMatter.
460
- - optionally, an icon to show instead of the tag's name (`icon: ` followed by the [FontAwesome](https://fontawesome.com/icons?d=gallery&s=solid&m=free) icon name to show).
612
+ - its `name`, which must match the tag specified in the talk's Front Matter.
613
+ - optionally, an icon to show instead of the tag's name (`icon: ` followed by the [Bootstrap Icons](https://icons.getbootstrap.com/) icon name to show).
461
614
 
462
- Talks can also have associated links displayed at the end of their content. If these links have an icon (see _Content_ > _Talks_ below), they will also appear on the talk overview page (e.g., to indicate which talks have video recordings). To prevent icon links from showing on the overview page, set the `hide_link_icons` property to `true` (default is `false`).
615
+ Talks can also have associated links displayed at the end of their content. If these links have an icon (see [_Content_](#content) > [_Talks_](#talks) below), they will also appear on the talk overview page (e.g., to indicate which talks have video recordings).
463
616
 
464
617
  Example:
465
618
 
@@ -477,93 +630,95 @@ conference:
477
630
  tags:
478
631
  - name: No recording
479
632
  icon: video-slash
480
-
481
- # Hide link icons on talk overview page
482
- hide_link_icons: false
483
- ```
484
-
485
- ### Speaker Settings
486
-
487
- In the program as well as the speaker's overview the speaker's first name can be abbreviated to its first letter if present. To do so, add the `show_firstname: true` setting (default: `false`) to the `speakers` property.
488
-
489
- Example:
490
-
491
- ```yaml
492
- conference:
493
- speakers:
494
- show_firstname: false
495
633
  ```
496
634
 
497
635
  ### Location Settings
498
636
 
499
- If the location of your rooms is obvious (e.g., on a campus) you can decide to disable the location page and links to all the rooms. You still need to create the different rooms as files in the `_rooms/` directory, since they are needed as a reference. But there will not be any link pointing to it (effectively hiding them).
500
- To hide all rooms add the `hide: true` setting (default: `false`) to the `location` property.
501
-
502
- If your `location` overview file is not located under `/location` you can indicate an alternative path by setting the `url` property (default: `/location`) under the `location` property.
637
+ To help users find your venue, an [OpenStreetMap](https://www.openstreetmap.org/) container displaying a map can be shown on the location page as well as the address of the venue. You can define the initial position of the map by setting the default zoom level `default_zoom`, the center coordinates `home_coord`, and the map provider for the tiles `map_provider`. Alternative map providers can be found [here](https://leaflet-extras.github.io/leaflet-providers/preview/).
638
+ The map contains small control buttons to zoom in and out, center the map back to the initial position, and show the visitor's current location (has to be manually activated and granted by the visitor).
503
639
 
504
- The location main page shows a navigation bar listing all the different rooms by name. Due to the quirks of Jekyll, the main page itself cannot be listed by title as defined in its Front Matter. Instead, the title of the main landing page for the navigation bar is taken from the language files and defaults to "Directions". To change this, you can either change the language files directly (see the _Language_ section above), or you provide an alternative title by setting the `navbar_title` to the desired title under the `location` property.
640
+ Location settings are configured directly in the Front Matter of the location page (the page with `layout: location`). The location page's Front Matter supports the following properties:
505
641
 
506
- The `location` layout can include a map to point to your venue by adding the `map: true` setting (default: `true`) to the `location` property. See the _Map_ section above for more information.
642
+ - `title`: The title shown in the navigation bar for the location section (defaults to "Location")
643
+ - `hide`: Set to `true` to hide the location page and all room links (default: `false`). Hidden rooms still need to exist in the `_rooms/` directory as references.
644
+ - `map`: Map configuration object with the following properties:
645
+ - `home_coord`: Center coordinates of the map (e.g., `47.37808, 8.53935`)
646
+ - `default_zoom`: Initial zoom level (e.g., `17`)
647
+ - `map_provider`: Tile provider (default: `"OpenStreetMap.Mapnik"`)
648
+ - `postal_address`: Postal address displayed on the location page and used in schema.org structured data. Can contain:
649
+ - `name`: Venue name (e.g., "Zentralwäscherei")
650
+ - `street`: Street address (e.g., "Neue Hard 12")
651
+ - `locality`: City or locality (e.g., "Zurich")
652
+ - `postal_code`: Postal or ZIP code (e.g., "8005")
653
+ - `region`: State, province, or region (e.g., "ZH", "Zurich")
654
+ - `country`: ISO 3166-1 alpha-2 country code (e.g., "CH")
507
655
 
508
- Example:
656
+ Example location page (`location/index.md`):
509
657
 
510
658
  ```yaml
511
- conference:
512
- location:
513
- hide: false
514
- url: "/location"
515
- navbar_title: "Location"
516
- map: true
659
+ ---
660
+ layout: location
661
+ title: Conference Venue
662
+ hide: false
663
+ postal_address:
664
+ name: "Zentralwäscherei"
665
+ street: "Neue Hard 12"
666
+ locality: "Zurich"
667
+ postal_code: "8005"
668
+ region: "ZH"
669
+ country: "CH"
670
+ map:
671
+ default_zoom: 17
672
+ home_coord: 47.37808, 8.53935
673
+ map_provider: "OpenStreetMap.Mapnik"
674
+ ---
675
+
676
+ Welcome to our conference venue!
517
677
  ```
518
678
 
519
- The map is based on the [Leaflet](https://leafletjs.com/) JavaScript library. The map object can be customized by adding additional layers with markers, text, or shapes. To do so, one has to edit the main JavaScript file, `assets/js/main.js`:
679
+ The map is based on the [Leaflet](https://leafletjs.com/) JavaScript library. The map object can be customized by adding additional layers with markers, text, or shapes. To do so, edit the `assets/js/main.js` file in your project:
520
680
 
521
- 1. Import the JavaScript library of the theme (via Jekyll `include` command)
522
- 2. Await the initialization of the theme's object
523
- 3. Fetch the map object and verify it is set (while the JavaScript code is imported and executed on each page, the map object will only exist on the location site)
681
+ 1. The conference JavaScript bundle (`conference.bundle.js`) is automatically loaded and provides all necessary libraries
682
+ 2. Await the initialization of the theme's object using `window.conference.awaitReady()`
683
+ 3. Fetch the map object and verify it is set (while the JavaScript code is executed on each page, the map object will only exist on the location page)
524
684
  4. Modify the map.
525
685
 
526
- Following an example is given adding a simple marker to the map:
686
+ The following example for `assets/js/main.js` adds a simple marker to the map:
527
687
 
528
688
  ```javascript
529
- ---
530
- ---
689
+ window.conference.awaitReady().then(async () => {
690
+ const map = await window.conference.map.getMap();
531
691
 
532
- {% include js/conference.js %}
533
-
534
- window.conference.awaitReady().then(() => {
535
- const map = window.conference.map.getMap();
536
-
537
- if (typeof map !== 'undefined') {
692
+ if (map) {
538
693
  let main_station = L.marker([47.37785, 8.54035], {
539
694
  icon: L.divIcon({
540
695
  className: '',
541
- html: '<span class="fas fa-train"></span> Main Station',
696
+ html: '<span class="bi bi-train-front" aria-hidden="true"></span> Main Station',
542
697
  iconSize: [120, 56]
543
698
  })
544
699
  }).addTo(map);
545
700
  }
546
701
  });
547
-
548
702
  ```
549
703
 
550
704
  ### Program Settings
551
705
 
552
- The schedule shown as program can be slightly customized:
706
+ Program settings are configured directly in the Front Matter of the program page (the page with `layout: program`). The program page's Front Matter supports the following properties:
553
707
 
554
- - The time steps shown with a new line can be adapted with the `time_steps` setting given in minute (default: `15` minutes)
555
- - Besides the full hour the individual time steps can be hidden by setting `show_alltimes: false` (default: `true`)
556
-
557
- If your `program` file is not located under `/program` you can indicate an alternative path by setting the `url` property (default: `/program`) under the `program` property.
558
- Example:
708
+ - `title`: The title shown on the program page (defaults to "Program")
709
+ - `time_steps`: The time interval in minutes for each row in the schedule grid (default: `15`)
710
+ - `show_alltimes`: Show time labels for all intervals, not just full hours (default: `false`)
559
711
 
560
712
  ```yaml
561
- conference:
562
- program:
563
- time_steps: 15 # in minutes
564
- show_alltimes: true
713
+ ---
714
+ layout: program
715
+ title: Conference Program
716
+ time_steps: 15
717
+ show_alltimes: true
718
+ ---
565
719
  ```
566
720
 
721
+
567
722
  ## Content
568
723
 
569
724
  The different talks, speakers and rooms are stored as a collection of files. Each file contains a small header in form of a YAML block (called [FrontMatter](https://jekyllrb.com/docs/front-matter/)) used to store additional information beside a description.
@@ -571,26 +726,26 @@ The schedule defining when and in which room a talk takes place is stored as a [
571
726
 
572
727
  ### Schedule / Program
573
728
 
574
- The schedule of the conference linking the talks with the rooms and indicating when each talk talks place and how long it goes, is set in the `_data/program.yml` file. It contains a list of days, whereby each day contains a list of rooms, whereby each room contains a list of talks.
729
+ The schedule of the conference linking the talks with the rooms and indicating when each talk takes place and how long it lasts, is set in the `_data/program.yml` file. It contains a list of days, whereby each day contains a list of rooms, whereby each room contains a list of talks.
575
730
 
576
731
  Each day consists of
577
732
 
578
733
  - a list of rooms (`rooms`) in which talks are taking place on that day
579
734
  - optionally, the day's `name`, e.g., the weekday
580
735
  - optionally, the short form of the day's name (`abbr`), and
581
- - optionally and only if no live indications are active, a `date` in the format `YYYY-MM-DD`.
736
+ - a `date` in the format `YYYY-MM-DD` (required if live indications are enabled, optional otherwise)
582
737
 
583
738
  Each room consists of
584
739
 
585
- - the room's `name` (must correspond to one of the room identifier), and
740
+ - the room's `name` (must correspond to one of the room identifiers), and
586
741
  - a list of talks (`talks`) which also can be empty `[]`.
587
742
 
588
743
  The order of the rooms in the list defines the order of the rooms as shown in the schedule on the program page. For the live-streaming or the room overview the order of the rooms is alphabetical but can be adapted via the [main configuration file](https://jekyllrb.com/docs/collections/#sort-by-front-matter-key).
589
744
 
590
745
  Each talk consists of
591
746
 
592
- - a `name` (must correspond to one of the talk identifier),
593
- - a starting time `time_start` given as `H:M` ([`strftime`](http://www.strfti.me) formated) or `H:M +∆` whereby ∆ is the day offset in relation to the date given for the given day, and
747
+ - a `name` (must correspond to one of the talk identifiers),
748
+ - a starting time `time_start` given as `H:M` ([`strftime`](http://www.strfti.me) formatted) or `H:M +∆` whereby ∆ is the day offset in relation to the date given for the given day, and
594
749
  - an end time `time_end`.
595
750
 
596
751
  The list of talks should (manually) be ordered by time, i.e., the first occurring talk should be listed first.
@@ -627,7 +782,7 @@ Each talk is represented by a file in the `_talks/` directory. It must begin wit
627
782
  - one or more existing `speakers` name(s),
628
783
  - optionally, a `track` which should match the tracks defined in the site's configuration,
629
784
  - optionally, a list of `tags`
630
- - optionally, a list of `links` (see the _Links_ subsection below for the available properties):
785
+ - optionally, a list of `links` (see the [_Links_](#links) subsection below for the available properties):
631
786
  - Links with an `icon` are treated separately and are also included on the talk overview page.
632
787
  - Links with `live: true` are only shown below the live stream for the given talk in form of buttons.
633
788
  - optionally, `hide: true` if the talk's page should not be linked to.
@@ -652,11 +807,11 @@ Each speaker is represented by a file in the `_speakers/` directory. It must beg
652
807
  - the speaker's `name` (used as identifier), as well as its
653
808
  - `first_name`,
654
809
  - `last_name`,
655
- - optionally, a list of `links` (see the _Links_ subsection below for the available properties):
810
+ - optionally, a list of `links` (see the [_Links_](#links) subsection below for the available properties):
656
811
  - Links with an `icon` are treated separately and are also included on the speaker overview page.
657
812
  - optionally, `hide: true` if the speaker's page should not be linked to.
658
813
 
659
- If the speaker's name consists only out of one word, populate the `last_name` property and leave the `first_name` property empty. The last name is generally used for sorting the speakers.
814
+ If the speaker's name consists of only one word, populate the `last_name` property and leave the `first_name` property empty. The last name is generally used for sorting the speakers.
660
815
 
661
816
  Example:
662
817
 
@@ -677,7 +832,7 @@ Each room is represented by a file in the `_rooms/` directory. It must begin wit
677
832
 
678
833
  - the room's `name`
679
834
  - optionally, `hide: true` if the room's page should not be linked to, and
680
- - optionally under the `live` property, a URL pointing to a live stream for the given room during the conference (see the section _Live Indications & Streaming_ above), either:
835
+ - optionally under the `live` property, a URL pointing to a live stream for the given room during the conference (see the section [_Configuration_](#configuration) > [_Live Indications & Streaming_](#live-indications--streaming) above), either:
681
836
  - as an `absolute_url`, or
682
837
  - a `relative_url`.
683
838
 
@@ -694,7 +849,7 @@ live:
694
849
 
695
850
  ### Links
696
851
 
697
- Links are used at different location throughout the theme: They can either be used in the configuration file (for the landing page or the navigation bar), or in talks and for speakers. A link can thereby have the following properties:
852
+ Links are used at different locations throughout the theme: They can either be used in the configuration file (for the landing page or the navigation bar), or in talks and for speakers. A link can thereby have the following properties:
698
853
 
699
854
  - the text to show (`name`),
700
855
  - the link address:
@@ -703,8 +858,8 @@ Links are used at different location throughout the theme: They can either be us
703
858
  - pointing to a _file_ uploaded to the `/documents` folder: `file:`, or
704
859
  - pointing to an external _video_: `video:`.
705
860
  - optionally, if it is disabled (`disabled: true`),
706
- - optionally, if it should open in a iframe embedded in a popup-like modal (`iframe: true`), and
707
- - optionally, an icon to show in front of the title (`icon: ` followed by the [FontAwesome](https://fontawesome.com/icons?d=gallery&s=solid&m=free) icon name to show).
861
+ - optionally, if it should open in an iframe embedded in a popup-like modal (`iframe: true`), and
862
+ - optionally, an icon to show in front of the title (`icon: ` followed by the [Bootstrap Icons](https://icons.getbootstrap.com/) icon name to show).
708
863
 
709
864
  Using the `file:` indicator, the
710
865
 
@@ -717,7 +872,7 @@ Using the `file:` indicator, the
717
872
  Using the `video:` indicator, the
718
873
 
719
874
  - link address is set to an absolute address as given by the value.
720
- - the link's `iframe:` attribute is set to `true` top embed the video in a popup-like modal having a default iframe ratio of 24:11.
875
+ - the link's `iframe:` attribute is set to `true` to embed the video in a popup-like modal having a default iframe ratio of 24:11.
721
876
  - the link's `icon:` is set to `video`.
722
877
 
723
878
  Additionally, a _talk_ link can also have the following property:
@@ -728,8 +883,8 @@ Additionally, a _navigation bar_ or _main landing page_ link can also have the f
728
883
 
729
884
  - `live: true` making the link only visible during the conference and adds a live indication.
730
885
  - The link is only shown if `name` is set. If `name` is an empty string, "Live Stream" is shown instead.
731
- - If `name_inactive` is set, its value is used to be shown as a placeholder text, while the conference is **not** live. If `name_inactive` is an empty string, "Live Stream" is shown instead.
732
- - If streaming is enabled and any URL property is omitted, a click on the link will open the streaming modal (see section _Live Indications_ above).
886
+ - If `name_inactive` is set, its value is used as a placeholder text while the conference is **not** live. If `name_inactive` is an empty string, "Live Stream" is shown instead.
887
+ - If streaming is enabled and any URL property is omitted, a click on the link will open the streaming modal (see section [_Configuration_](#configuration) > [_Live Indications & Streaming_](#live-indications--streaming) above).
733
888
  - `menu` containing another list of links. This creates a dropdown menu of multiple sublinks, while the URL of the parent link is ignored. The sublinks have the same properties as regular links.
734
889
 
735
890
  #### Import link files
@@ -757,59 +912,172 @@ There exists a Python file in this repository, `_tools/import_resources.py`, whi
757
912
  python _tools/import_resources.py --help
758
913
  ```
759
914
 
760
- ## Overview Pages
915
+ ### Overview Pages
761
916
 
762
- For each of the three collections there exist a dedicated layout giving an overview among all items of the collection. Furthermore, there exists a layout to show the program as a time schedule. Simply create an empty page and associate the corresponding layout with it:
917
+ For each of the three collections, there exists a dedicated layout giving an overview of all items in the collection. Furthermore, there exists a layout to show the program as a time schedule. Simply create an empty page and associate the corresponding layout with it:
763
918
 
764
919
  - `talks/index.md` with `layout: talk-overview`
765
920
  - `speakers/index.md` with `layout: speaker-overview`
766
921
  - `location/index.md` with `layout: location`
767
922
  - `program/index.md` with `layout: program`
768
923
 
769
- They can be empty but should contain the `layout` property in the FrontMatter header.
924
+ They can be empty but should contain the `layout` property in the Front Matter header.
770
925
 
771
926
  If you choose a different location for the overview pages you must:
772
927
 
773
- - if of the `talks` and `speaker` overview file, adapt the URL of the two collections as described further above in the section _Collection URLs_, and
774
- - if of the `location` and `program` file, adapt the corresponding `url` parameter as described further above in the sections _Location Settings_ and _Program Settings_.
928
+ - for the `talks` and `speakers` overview files, adapt the URL of the two collections as described further above in the section [_Configuration_](#configuration) > [_Collection URLs_](#collection-urls), and
929
+ - for the `location` and `program` files, adapt the corresponding `url` parameter as described further above in the sections [_Configuration_](#configuration) > [_Location Settings_](#location-settings) and [_Configuration_](#configuration) > [_Program Settings_](#program-settings).
775
930
 
776
- ### Location / Room Overview
931
+ ### Additional Pages
777
932
 
778
- The `location` layout can include a map container (if not disabled, see the _Location Settings_ section above) which can be customized (see the _Map_ section above).
933
+ Additional static pages can easily be added as files and linked to via navigation bar or main landing page.
779
934
 
780
- ### Live Stream Overview
781
935
 
782
- The `stream-overview` layout contains all active streams on a single page (see the section _Live Indications & Streaming_ above).
936
+ ## Design
783
937
 
784
- ### Additional Pages
938
+ The design is based on [Bootstrap 5](http://getbootstrap.com) and is highly customizable. It integrates [Bootstrap Icons](https://icons.getbootstrap.com/) and [Leaflet](https://leafletjs.com/) for mapping. The theme also features automatic dark mode, adapting to user system preferences.
785
939
 
786
- Additional static pages can easily be added as files and linked to via navigation bar or main landing page (see above on how to).
940
+ The theme offers three distinct approaches to Bootstrap integration, allowing you to choose the level of customization that suits your needs:
787
941
 
788
- Each of these pages can include a map at its end (e.g., to point to your venue) by adding the `map: true` setting to its Front Matter. See the _Map_ section above for more information.
942
+ ### Pre-compiled Bundle (Default)
789
943
 
790
- ## Design
944
+ This is the default option and requires no setup. As the Bootstrap framework is pre-compiled, direct modifications to its core (e.g., theme colors) are not possible. However, you can add custom styles to `assets/css/main.scss`; these will be loaded last and override existing styles.
791
945
 
792
- The design is based on the [Bootstrap 4](http://getbootstrap.com) and thus easily expandable. Furthermore, it makes use of the [FontAwesome Icons](fontawesome.com/) across the theme.
793
- Custom Bootstrap themes or simple color schemes such as designed with [Bootstrap Magic](https://pikock.github.io/bootstrap-magic/) can be added in the [main](assets/css/main.scss) SASS stylesheet:
946
+ ```yaml
947
+ conference:
948
+ custom_style: "none" # or omit this line (default)
949
+ ```
794
950
 
795
- 1. Create a new file under `assets/css/main.scss` with the following content (or copy the one of this repository):
951
+ The `assets/css/` directory contains:
796
952
 
797
- ```scss
798
- ---
799
- ---
953
+ - `conference.bundle.css`: Complete bundle containing:
954
+ - Pre-compiled Bootstrap 5 framework
955
+ - Bootstrap Icons
956
+ - Leaflet map styles
957
+ - Conference theme customizations
958
+ - `main.scss`: For user-modifiable custom styles.
800
959
 
801
- $fa-font-path: "{{ site.baseurl }}/assets/webfonts";
960
+ Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [FrontMatter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
802
961
 
803
- @import "conference";
804
- ```
805
962
 
806
- Do not skip the `$fa-font-path` variable or modify it as otherwise, the FontAwesome icons will not be able to load.
963
+ ```scss
964
+ ---
965
+ ---
966
+
967
+ // Custom styles
968
+ // ...
969
+ ```
970
+
971
+ ### Split Bundle (Custom Bootstrap CSS)
972
+
973
+ Integrate your own Bootstrap file, such as a theme from [Bootswatch](https://bootswatch.com/). Similar to the default option, `assets/css/main.scss` can be used for additional custom styles, which will override previous styles.
974
+
975
+ ```yaml
976
+ conference:
977
+ custom_style: "bootstrap"
978
+ ```
979
+
980
+ The `assets/css/` directory contains:
981
+
982
+ - `bootstrap.min.css`: Your custom Bootstrap framework (user-provided).
983
+ - `conference-only.bundle.css`: Complete bundle containing:
984
+ - Bootstrap Icons
985
+ - Leaflet map styles
986
+ - Conference theme customizations
987
+ - `main.scss`: For additional custom styles.
988
+
989
+ Including `assets/css/main.scss` in your project is optional. If included, it must begin with a [FrontMatter](https://jekyllrb.com/docs/front-matter/) header for Jekyll recognition:
990
+
991
+ ```scss
992
+ ---
993
+ ---
994
+
995
+ // Custom styles
996
+ // ...
997
+ ```
998
+
999
+ #### Custom SCSS
1000
+
1001
+ Compile your Bootstrap framework by modifying [Bootstrap variables](https://getbootstrap.com/docs/5.3/customize/sass/#variable-defaults). This provides complete control over Bootstrap's SCSS variables, enabling source-level customization.
1002
+
1003
+ The theme simplifies this by including all Bootstrap SCSS source files. These are located in the Gem's `_sass` folder and are automatically overlaid with your project's `_sass` folder.
1004
+
1005
+ While offering the most flexibility, this setup requires several steps:
1006
+
1007
+ 1. Configure Jekyll's [SASS compiler](https://jekyllrb.com/docs/assets/#sassscss) in `_config.yml`. Ensure `sass_dir` is either unset (using the default) or points to the `_sass` folder. Output compression is recommended.
1008
+ ```yaml
1009
+ sass:
1010
+ sass_dir: _sass # or omit this line
1011
+ style: compressed
1012
+ ```
1013
+ 2. Configure the theme to use the full custom style setup:
1014
+ ```yaml
1015
+ conference:
1016
+ custom_style: "full"
1017
+ ```
1018
+ 3. Create `_sass/bootstrap-variables.scss` to override Bootstrap variables.
1019
+ ```scss
1020
+ // If needed, include Bootstrap functions first
1021
+ @use "bootstrap/functions" as *;
1022
+
1023
+ // Override Bootstrap variables
1024
+ $green: #4ea93f;
1025
+ $primary: $green;
1026
+ ```
1027
+ 4. Include the compiled conference bundle, incorporating your Bootstrap modifications, in `assets/css/main.scss`:
1028
+ ```scss
1029
+ ---
1030
+ ---
1031
+
1032
+ @use "conference";
1033
+
1034
+ // Custom styles
1035
+ // ...
1036
+ ```
1037
+
1038
+
1039
+ ## JavaScript
1040
+
1041
+ The theme includes a pre-built JavaScript bundle (`assets/js/conference.bundle.js`). This bundle is automatically included in the theme gem, pre-compiled, and minified, requiring no build tools for end users. Please do not modify this file directly.
1042
+
1043
+ To add custom JavaScript, edit the `assets/js/main.js` file in your project. This file loads after the conference bundle, giving you full access to all theme functionality.
1044
+
1045
+ **Available Global Objects:**
1046
+
1047
+ - `window.conference`: Main conference object with the following modules:
1048
+ - `conference.program`: Program navigation and tab management
1049
+ - `conference.map`: Map functionality (if enabled)
1050
+ - `conference.modal`: Modal popup handling
1051
+ - `conference.live`: Live streaming and real-time updates
1052
+ - `conference.awaitReady()`: Promise-based initialization helper
1053
+ - `window.$` / `window.jQuery`: jQuery library
1054
+ - `window.L`: Leaflet map library (if map is enabled)
1055
+
1056
+ **Example Usage:**
1057
+
1058
+ ```javascript
1059
+ // Wait for conference to initialize
1060
+ window.conference.awaitReady().then(async () => {
1061
+ // Access the map (returns a promise)
1062
+ const map = await window.conference.map.getMap();
1063
+ if (map) {
1064
+ // Add custom map markers
1065
+ L.marker([47.37785, 8.54035]).addTo(map);
1066
+ }
1067
+
1068
+ // Access live data
1069
+ const liveData = window.conference.live.getData();
1070
+
1071
+ // Custom program interactions
1072
+ // ...
1073
+ });
1074
+ ```
807
1075
 
808
- 2. Add your Bootstrap variables in front of the `@import 'conference'` line, e.g., currently the primary color is set internally to green (instead of Bootstrap's default blue): `$primary: #074 !default;`
809
- 3. Add any additional CSS styles after it.
810
1076
 
811
1077
  ## Development
812
1078
 
1079
+ ### Jekyll Theme Development
1080
+
813
1081
  If you want to modify this theme and see its changes on an existing project, simply indicate in your `Gemfile` that you want to use the local copy of the theme by adding a `path` indication after the gem instantiation:
814
1082
 
815
1083
  ```ruby
@@ -818,8 +1086,63 @@ group :jekyll_plugins do
818
1086
  end
819
1087
  ```
820
1088
 
1089
+ ### JavaScript & CSS Development
1090
+
1091
+ The theme's JavaScript and CSS are built using [Vite](https://vitejs.dev/). Source files are located in:
1092
+
1093
+ **JavaScript** (`_js/` directory):
1094
+ ```
1095
+ _js/
1096
+ ├── main.js # Main entry point
1097
+ ├── init.js # Initialization module
1098
+ ├── core/
1099
+ │ └── conference.js # Core conference object
1100
+ └── modules/
1101
+ ├── program.js # Program navigation
1102
+ ├── map.js # Map functionality
1103
+ ├── modal.js # Modal popups
1104
+ └── live.js # Live streaming
1105
+ ```
1106
+
1107
+ **CSS/SCSS** (`_css/` directory):
1108
+ ```
1109
+ _css/
1110
+ ├── main.scss # Main entry point (with Bootstrap)
1111
+ ├── main-only.scss # Alternative entry point (without Bootstrap)
1112
+ ├── bootstrap.scss # Adapted Bootstrap Framework
1113
+ ├── bootstrap-variables.scss # Placeholder for custom build of Bootstrap Framework
1114
+ └── theme.scss # Conference-specific styles
1115
+ ```
1116
+
1117
+ The CSS source imports libraries from npm:
1118
+ - `bootstrap` - Bootstrap framework
1119
+ - `bootstrap-icons` - Bootstrap Icons
1120
+ - `leaflet` and plugins - Map styles
1121
+
1122
+ To modify the theme's source code and rebuild:
1123
+
1124
+ 1. Install dependencies:
1125
+ ```bash
1126
+ npm install
1127
+ ```
1128
+
1129
+ 2. Build the bundles:
1130
+ ```bash
1131
+ npm run build
1132
+ ```
1133
+ This compiles:
1134
+ - `_js/` → `assets/js/conference.bundle.js`
1135
+ - `_css/` → `assets/css/conference.bundle.css` and `assets/css/conference-only.bundle.css`
1136
+ This copies:
1137
+ - `_css/` + any SASS file from the different framework libraries → `_sass`
1138
+ - Webfonts → `assets/webfonts/`
1139
+
1140
+ 3. Test your changes locally:
1141
+ ```bash
1142
+ bundle exec jekyll serve
1143
+ ```
1144
+
1145
+
821
1146
  ## License
822
1147
 
823
1148
  This project is licensed under the MIT License. You can view [LICENSE.md](LICENSE.md) for more details.
824
-
825
- This project redistributes other open source tools and libraries. You can view [REDISTRIBUTED.md](REDISTRIBUTED.md) for third party licenses.