Heavily customized version of smokesignal - https://whtwnd.com/kayrozen.com/3lpwe4ymowg2t
at main 25 kB view raw
1<section class="section"> 2 <div class="container"> 3 {% if is_legacy_event %} 4 <article class="message is-warning"> 5 <div class="message-body"> 6 <span class="icon-text"> 7 <span class="icon"> 8 <i class="fas fa-exclamation-triangle"></i> 9 </span> 10 <span>{{ t("legacy-event-warning") }}</span> 11 {% if standard_event_exists %} 12 <span class="ml-3"> 13 <a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary"> 14 <span class="icon"> 15 <i class="fas fa-calendar-alt"></i> 16 </span> 17 <span>{{ t("view-latest") }}</span> 18 </a> 19 </span> 20 {% endif %} 21 {% if can_edit and not standard_event_exists %} 22 <span class="ml-3"> 23 <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/migrate" class="button is-small is-info"> 24 <span class="icon"> 25 <i class="fas fa-arrows-up-to-line"></i> 26 </span> 27 <span>{{ t("migrate-event") }}</span> 28 </a> 29 </span> 30 {% endif %} 31 </span> 32 </div> 33 </article> 34 {% elif using_fallback_collection %} 35 <article class="message is-info"> 36 <div class="message-body"> 37 <span class="icon-text"> 38 <span class="icon"> 39 <i class="fas fa-info-circle"></i> 40 </span> 41 <span>{{ t("fallback-collection-info", collection=fallback_collection) }}</span> 42 </span> 43 </div> 44 </article> 45 {% endif %} 46 <h1 class="title">{{ event.name }}</h1> 47 <h1 class="subtitle"> 48 <a href="{{ base }}/{{ event.organizer_did }}"> 49 @{{ event.organizer_display_name }} 50 </a> 51 {% if can_edit %} 52 <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/edit" 53 class="button is-small is-outlined is-primary ml-2"> 54 <span class="icon"> 55 <i class="fas fa-edit"></i> 56 </span> 57 <span>{{ t("button-edit") }}</span> 58 </a> 59 {% endif %} 60 <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/ical" 61 class="button is-small is-outlined is-info ml-2" 62 download="{{ event.name }}.ics"> 63 <span class="icon"> 64 <i class="fas fa-calendar-plus"></i> 65 </span> 66 <span>{{ t("button-download-ical") }}</span> 67 </a> 68 </h1> 69 <div class="level subtitle"> 70 {% if event.status == "planned" %} 71 <span class="icon-text" title="{{ t("tooltip-planned") }}"> 72 <span class="icon"> 73 <i class="fas fa-calendar-days"></i> 74 </span> 75 <span class="is-hidden-tablet">{{ t("status-planned") }}</span> 76 </span> 77 {% elif event.status == "scheduled" %} 78 <span class="level-item icon-text" title="{{ t("tooltip-scheduled") }}"> 79 <span class="icon"> 80 <i class="fas fa-calendar-check"></i> 81 </span> 82 <span>{{ t("status-scheduled") }}</span> 83 </span> 84 {% elif event.status == "rescheduled" %} 85 <span class="level-item icon-text is-info" title="{{ t("tooltip-rescheduled") }}"> 86 <span class="icon"> 87 <i class="fas fa-calendar-plus"></i> 88 </span> 89 <span>{{ t("status-rescheduled") }}</span> 90 </span> 91 {% elif event.status == "cancelled" %} 92 <span class="level-item icon-text is-danger" title="{{ t("tooltip-cancelled") }}"> 93 <span class="icon"> 94 <i class="fas fa-calendar-xmark"></i> 95 </span> 96 <span>{{ t("status-cancelled") }}</span> 97 </span> 98 {% elif event.status == "postponed" %} 99 <span class="level-item icon-text is-warning" title="{{ t("tooltip-postponed") }}"> 100 <span class="icon"> 101 <i class="fas fa-calendar-minus"></i> 102 </span> 103 <span>{{ t("status-postponed") }}</span> 104 </span> 105 {% else %} 106 <span class="level-item icon-text" title="{{ t("tooltip-no-status") }}"> 107 <span class="icon"> 108 <i class="fas fa-question"></i> 109 </span> 110 <span class="is-italic">{{ t("status-no-status") }}</span> 111 </span> 112 {% endif %} 113 <span class="level-item icon-text" title=" 114 {%- if event.starts_at_human -%} 115 {{ t("starts-at", time=event.starts_at_human) }} 116 {%- else -%} 117 {{ t("no-start-time") }} 118 {%- endif -%}"> 119 <span class="icon"> 120 <i class="fas fa-clock"></i> 121 </span> 122 <span> 123 {% if event.starts_at_human %} 124 <time class="dt-start" {% if event.starts_at_machine %} datetime="{{ event.starts_at_machine }}" {% 125 endif %}> 126 {{- event.starts_at_human -}} 127 </time> 128 {% else %} 129 {{ t("no-start-time-set") }} 130 {% endif %} 131 </span> 132 </span> 133 134 <span class="level-item icon-text" title=" 135 {%- if event.ends_at_human -%} 136 {{ t("ends-at", time=event.ends_at_human) }} 137 {%- else -%} 138 {{ t("no-end-time") }} 139 {%- endif -%}"> 140 <span class="icon"> 141 <i class="fas fa-stop"></i> 142 </span> 143 {% if event.ends_at_human %} 144 <span> 145 <time class="dt-end" {% if event.ends_at_machine %} datetime="{{ event.ends_at_machine }}" {% endif 146 %}> 147 {{- event.ends_at_human -}} 148 </time> 149 </span> 150 {% else %} 151 <span class="is-italic">{{ t("no-end-time-set") }}</span> 152 {% endif %} 153 </span> 154 155 {% if event.mode == "inperson" %} 156 <span class="level-item icon-text" title="{{ t("tooltip-in-person") }}"> 157 <span class="icon"> 158 <i class="fas fa-users"></i> 159 </span> 160 <span>{{ t("mode-in-person") }}</span> 161 </span> 162 {% elif event.mode == "virtual" %} 163 <span class="level-item icon-text" title="{{ t("tooltip-virtual") }}"> 164 <span class="icon"> 165 <i class="fas fa-globe"></i> 166 </span> 167 <span>{{ t("mode-virtual") }}</span> 168 </span> 169 {% elif event.mode == "hybrid" %} 170 <span class="level-item icon-text" title="{{ t("tooltip-hybrid") }}"> 171 <span class="icon"> 172 <i class="fas fa-user-plus"></i> 173 </span> 174 <span>{{ t("mode-hybrid") }}</span> 175 </span> 176 {% endif %} 177 </div> 178 {% if event.address_display %} 179 <div class="level subtitle"> 180 <span class="level-item"> 181 {{ event.address_display }} 182 </span> 183 <a class="level-item" href="//maps.apple.com/?q={{ event.address_display }}" rel="nofollow" target="blank"> 184 <span class="icon-text"> 185 <span class="icon"> 186 <i class="fab fa-apple"></i> 187 </span> 188 <span>{{ t("apple-maps") }}</span> 189 </span> 190 </a> 191 <a class="level-item" href="//maps.google.com/?q={{ event.address_display }}" rel="nofollow" target="blank"> 192 <span class="icon-text"> 193 <span class="icon"> 194 <i class="fab fa-google"></i> 195 </span> 196 <span>{{ t("google-maps") }}</span> 197 </span> 198 </a> 199 </div> 200 {% endif %} 201 202 {% if event.links %} 203 {% for (link, link_label) in event.links %} 204 <div class="level subtitle"> 205 <a class="level-item" href="{{ link }}" rel="nofollow" target="blank"> 206 <span class="icon-text"> 207 <span class="icon"> 208 <i class="fas fa-link"></i> 209 </span> 210 <span>{{ link_label if link_label else link }}</span> 211 </span> 212 </a> 213 </div> 214 {% endfor %} 215 {% endif %} 216 {% if is_legacy_event %} 217 <article class="message is-info"> 218 <div class="message-body"> 219 <span class="icon-text"> 220 <span class="icon"> 221 <i class="fas fa-info-circle"></i> 222 </span> 223 <span>{{ t("legacy-rsvp-unavailable") }}</span> 224 {% if standard_event_exists %} 225 <span>{{ t("legacy-use-standard", url=base+standard_event_url) }}</span> 226 {% if user_rsvp_status and not user_has_standard_rsvp %} 227 <div class="mt-2"> 228 <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/migrate-rsvp" 229 class="button is-small is-info"> 230 <span class="icon"> 231 <i class="fas fa-sync-alt"></i> 232 </span> 233 <span>{{ t("migrate-rsvp") }}</span> 234 </a> 235 </div> 236 {% elif user_rsvp_status and user_has_standard_rsvp %} 237 <div class="mt-2"> 238 <span class="tag is-success"> 239 <span class="icon"> 240 <i class="fas fa-check"></i> 241 </span> 242 <span>{{ t("legacy-rsvp-migrated") }}</span> 243 </span> 244 </div> 245 {% endif %} 246 {% endif %} 247 </span> 248 </div> 249 </article> 250 {% elif not current_handle %} 251 <article class="message is-success"> 252 <div class="message-body"> 253 {{ t("message-login-to-rsvp") }} 254 </div> 255 </article> 256 {% else %} 257 {% if not user_rsvp_status %} 258 <article class="message" id="rsvpFrame"> 259 <div class="message-body"> 260 <div class="columns is-vcentered is-multiline"> 261 <div class="column"> 262 <p>{{ t("rsvp-not-rsvpd") }}</p> 263 </div> 264 <div class="column"> 265 <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 266 hx-swap="outerHTML" 267 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 268 <span class="icon"> 269 <i class="fas fa-star"></i> 270 </span> 271 <span>{{ t("rsvp-going") }}</span> 272 </button> 273 </div> 274 <div class="column"> 275 <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 276 hx-swap="outerHTML" 277 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 278 <span class="icon"> 279 <i class="fas fa-eye"></i> 280 </span> 281 <span>{{ t("rsvp-interested") }}</span> 282 </button> 283 </div> 284 <div class="column"> 285 <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 286 hx-swap="outerHTML" 287 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 288 <span class="icon"> 289 <i class="fas fa-ban"></i> 290 </span> 291 <span>{{ t("rsvp-not-going") }}</span> 292 </button> 293 </div> 294 </div> 295 </div> 296 </article> 297 {% elif user_rsvp_status == "going" %} 298 <article class="message is-info" id="rsvpFrame"> 299 <div class="message-body"> 300 <div class="columns is-vcentered is-multiline"> 301 <div class="column"> 302 <p>{{ t("rsvp-going-msg") }}</p> 303 </div> 304 <div class="column"> 305 <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 306 hx-swap="outerHTML" 307 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 308 <span class="icon"> 309 <i class="fas fa-eye"></i> 310 </span> 311 <span>{{ t("rsvp-interested") }}</span> 312 </button> 313 </div> 314 <div class="column"> 315 <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 316 hx-swap="outerHTML" 317 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 318 <span class="icon"> 319 <i class="fas fa-ban"></i> 320 </span> 321 <span>{{ t("rsvp-not-going") }}</span> 322 </button> 323 </div> 324 </div> 325 </div> 326 </article> 327 {% elif user_rsvp_status == "interested" %} 328 <article class="message is-info" id="rsvpFrame"> 329 <div class="message-body"> 330 <div class="columns is-vcentered is-multiline"> 331 <div class="column"> 332 <p>{{ t("rsvp-interested-msg") }}</p> 333 </div> 334 <div class="column"> 335 <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 336 hx-swap="outerHTML" 337 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 338 <span class="icon"> 339 <i class="fas fa-star"></i> 340 </span> 341 <span>{{ t("rsvp-going") }}</span> 342 </button> 343 </div> 344 <div class="column"> 345 <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 346 hx-swap="outerHTML" 347 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 348 <span class="icon"> 349 <i class="fas fa-ban"></i> 350 </span> 351 <span>{{ t("rsvp-not-going") }}</span> 352 </button> 353 </div> 354 </div> 355 </div> 356 </article> 357 {% elif user_rsvp_status == "notgoing" %} 358 <article class="message is-warning" id="rsvpFrame"> 359 <div class="message-body"> 360 <div class="columns is-vcentered is-multiline"> 361 <div class="column"> 362 <p>{{ t("rsvp-not-going-msg") }}</p> 363 </div> 364 <div class="column"> 365 <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 366 hx-swap="outerHTML" 367 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 368 <span class="icon"> 369 <i class="fas fa-star"></i> 370 </span> 371 <span>{{ t("rsvp-going") }}</span> 372 </button> 373 </div> 374 <div class="column"> 375 <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 376 hx-swap="outerHTML" 377 hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 378 <span class="icon"> 379 <i class="fas fa-eye"></i> 380 </span> 381 <span>{{ t("rsvp-interested") }}</span> 382 </button> 383 </div> 384 </div> 385 </div> 386 </article> 387 {% endif %} 388 {% endif %} 389 390 <!-- Bookmark Section --> 391 {% if current_handle and not is_legacy_event %} 392 <div class="columns is-vcentered"> 393 <div class="column"> 394 <div id="bookmarkFrame"> 395 {% if user_bookmark_status %} 396 <article class="message is-info"> 397 <div class="message-body"> 398 <div class="columns is-vcentered"> 399 <div class="column"> 400 <span class="icon-text"> 401 <span class="icon"> 402 <i class="fas fa-bookmark"></i> 403 </span> 404 <span>Bookmarked{% if user_bookmark_tags %} with tags: {{ user_bookmark_tags | join(", ") }}{% endif %}</span> 405 </span> 406 </div> 407 <div class="column is-narrow"> 408 <button class="button is-outlined is-danger is-small" 409 hx-delete="/bookmarks/{{ user_bookmark_aturi | urlencode }}" 410 hx-target="#bookmarkFrame" 411 hx-swap="outerHTML" 412 hx-confirm="Are you sure you want to remove this bookmark?"> 413 <span class="icon"> 414 <i class="fas fa-times"></i> 415 </span> 416 <span>Remove Bookmark</span> 417 </button> 418 </div> 419 </div> 420 </div> 421 </article> 422 {% else %} 423 <article class="message is-light"> 424 <div class="message-body"> 425 <div class="columns is-vcentered"> 426 <div class="column"> 427 <span class="icon-text"> 428 <span class="icon"> 429 <i class="far fa-bookmark"></i> 430 </span> 431 <span>Bookmark this event to add it to your personal calendar</span> 432 </span> 433 </div> 434 <div class="column is-narrow"> 435 <button class="button is-primary is-small" 436 hx-get="/bookmarks/modal?event_aturi={{ event.aturi | urlencode }}" 437 hx-target="#bookmarkModal" 438 hx-swap="innerHTML" 439 onclick="document.getElementById('bookmarkModal').classList.add('is-active')"> 440 <span class="icon"> 441 <i class="fas fa-bookmark"></i> 442 </span> 443 <span>Bookmark Event</span> 444 </button> 445 </div> 446 </div> 447 </div> 448 </article> 449 {% endif %} 450 </div> 451 </div> 452 </div> 453 {% endif %} 454 <!-- End Bookmark Section --> 455 </div> 456</section> 457 458<section class="section"> 459 <div class="container" style="word-break: break-word; white-space: pre-wrap;"> 460 {%- autoescape false -%} 461 {{- event.description -}} 462 {%- endautoescape -%} 463 </div> 464</section> 465 466<section class="section"> 467 <div class="container"> 468 {% if not is_legacy_event %} 469 <div class="tabs"> 470 <ul> 471 <li {% if active_tab=="going" %}class="is-active" {% endif %}> 472 <a href="?tab=going&collection={{ fallback_collection if using_fallback_collection else collection }}" 473 rel="nofollow"> 474 {{ t("going-count", count=event.count_going | default("0")) }} 475 </a> 476 </li> 477 <li {% if active_tab=="interested" %}class="is-active" {% endif %}> 478 <a href="?tab=interested&collection={{ fallback_collection if using_fallback_collection else collection }}" 479 rel="nofollow"> 480 {{ t("interested-count", count=event.count_interested | default("0")) }} 481 </a> 482 </li> 483 <li {% if active_tab=="notgoing" %}class="is-active" {% endif %}> 484 <a href="?tab=notgoing&collection={{ fallback_collection if using_fallback_collection else collection }}" 485 rel="nofollow"> 486 {{ t("not-going-count", count=event.count_not_going | default("0")) }} 487 </a> 488 </li> 489 </ul> 490 </div> 491 <div class="grid is-col-min-12 has-text-centered"> 492 {% if active_tab == "going" %} 493 {% for handle in going %} 494 <span class="cell"> 495 <a href="/@{{ handle }}">@{{ handle }}</a> 496 </span> 497 {% endfor %} 498 {% elif active_tab == "interested" %} 499 {% for handle in interested %} 500 <span class="cell"> 501 <a href="/@{{ handle }}">@{{ handle }}</a> 502 </span> 503 {% endfor %} 504 {% else %} 505 {% for handle in notgoing %} 506 <span class="cell"> 507 <a href="/@{{ handle }}">@{{ handle }}</a> 508 </span> 509 {% endfor %} 510 {% endif %} 511 </div> 512 {% else %} 513 <div class="notification is-light"> 514 <p class="has-text-centered"> 515 {{ t("legacy-rsvp-info-unavailable") }} 516 {% if standard_event_exists %} 517 <br><a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary mt-2"> 518 <span class="icon"> 519 <i class="fas fa-calendar-alt"></i> 520 </span> 521 <span>{{ t("legacy-view-latest-rsvps") }}</span> 522 </a> 523 {% endif %} 524 </p> 525 </div> 526 {% endif %} 527 </div> 528</section> 529 530<!-- Bookmark Modal --> 531<div class="modal" id="bookmarkModal"> 532 <div class="modal-background" onclick="document.getElementById('bookmarkModal').classList.remove('is-active')"></div> 533 <div class="modal-content"> 534 <!-- Modal content will be loaded via HTMX --> 535 </div> 536 <button class="modal-close is-large" aria-label="close" onclick="document.getElementById('bookmarkModal').classList.remove('is-active')"></button> 537</div>