Fork i18n + search + filtering- v0.2

First iteration of translation updates and new strings for the SmokeSignal i18n project.

+2725 -199
CLAUDE.md docs/i18n.md
+127
actions.txt
··· 1 + templates/admin_denylist.en-us.html:40: <button type="submit" class="button is-primary">Add/Update Entry</button> 2 + templates/admin_denylist.en-us.html:68: <button type="submit" class="button is-small is-danger">Remove</button> 3 + templates/admin_events.en-us.html:38: <button type="submit" class="button is-primary">Import Event</button> 4 + templates/admin_events.en-us.html:58: <div class="buttons"> 5 + templates/admin_events.en-us.html:59: <a href="/admin/event?aturi={{ event.aturi }}" class="button is-small is-info"> 6 + templates/admin_handles.en-us.html:44: <button class="button is-danger is-small" 7 + templates/admin_handles.en-us.html:46: hx-confirm="Are you sure you want to nuke this identity? This will delete all records and add the handle, PDS, and DID to the denylist." 8 + templates/admin_rsvps.en-us.html:48: <button class="button is-primary" type="submit">Import RSVP</button> 9 + templates/admin_rsvps.en-us.html:72: <div class="buttons"> 10 + templates/admin_rsvps.en-us.html:73: <a href="/admin/rsvp?aturi={{ rsvp.aturi }}" class="button is-small is-info"> 11 + templates/create_event.en-us.link_form.html:21: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" 12 + templates/create_event.en-us.link_form.html:23: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 13 + templates/create_event.en-us.link_form.html:26: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" 14 + templates/create_event.en-us.link_form.html:28: class="button is-danger">Cancel</button> 15 + templates/create_event.en-us.link_form.html:33: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 16 + templates/create_event.en-us.link_form.html:35: aria-label="close"></button> 17 + templates/create_event.en-us.link_form.html:45: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 18 + templates/create_event.en-us.link_form.html:47: class="button is-link is-outlined">Edit</button> 19 + templates/create_event.en-us.link_form.html:50: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 20 + templates/create_event.en-us.link_form.html:51: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 21 + templates/create_event.en-us.link_form.html:66: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 22 + templates/create_event.en-us.link_form.html:68: class="button is-link is-outlined">Edit</button> 23 + templates/create_event.en-us.location_form.html:57: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 24 + templates/create_event.en-us.location_form.html:60: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 25 + templates/create_event.en-us.location_form.html:65: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 26 + templates/create_event.en-us.location_form.html:67: aria-label="close"></button> 27 + templates/create_event.en-us.location_form.html:85: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 28 + templates/create_event.en-us.location_form.html:88: class="button is-link is-outlined">Edit</button> 29 + templates/create_event.en-us.location_form.html:91: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 30 + templates/create_event.en-us.location_form.html:93: class="button is-danger is-outlined">Clear</button> 31 + templates/create_event.en-us.location_form.html:126: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 32 + templates/create_event.en-us.location_form.html:129: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 33 + templates/create_event.en-us.location_form.html:171: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" 34 + templates/create_event.en-us.location_form.html:174: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 35 + templates/create_event.en-us.location_form.html:177: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" 36 + templates/create_event.en-us.location_form.html:179: class="button is-danger">Cancel</button> 37 + templates/create_event.en-us.location_form.html:184: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 38 + templates/create_event.en-us.location_form.html:186: aria-label="close"></button> 39 + templates/create_event.en-us.location_form.html:214: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 40 + templates/create_event.en-us.location_form.html:216: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 41 + templates/create_event.en-us.location_form.html:219: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 42 + templates/create_event.en-us.location_form.html:220: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 43 + templates/create_event.en-us.location_form.html:230: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 44 + templates/create_event.en-us.location_form.html:232: class="button is-link is-outlined">Edit</button> 45 + templates/create_event.en-us.partial.html:11: <p class="buttons"> 46 + templates/create_event.en-us.partial.html:12: <a class="button" href="{{ event_url }}"> 47 + templates/create_event.en-us.partial.html:24:<form hx-post="{{ submit_url }}" hx-swap="outerHTML" class="my-5"> 48 + templates/create_event.en-us.partial.html:82: <option {% if build_event_form.status=='cancelled' %} selected="selected" {% endif %} 49 + templates/create_event.en-us.partial.html:83: value="cancelled"> 50 + templates/create_event.en-us.partial.html:134: <p>Only events with a single location of type "Address" can be edited through this form.</p> 51 + templates/create_event.en-us.partial.html:171: <button data-loading-disable data-loading-aria-busy type="submit" id="createEventSubmit" 52 + templates/create_event.en-us.partial.html:172: class="button is-link" name="submit" value="Submit"> 53 + templates/create_event.en-us.partial.html:177: <a href="{{ cancel_url }}" class="button">Cancel</a> 54 + templates/create_event.en-us.starts_form.html:74: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 55 + templates/create_event.en-us.starts_form.html:77: class="button is-link">Remove End Time</button> 56 + templates/create_event.en-us.starts_form.html:83: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 57 + templates/create_event.en-us.starts_form.html:86: class="button is-link">Add End Time</button> 58 + templates/create_event.en-us.starts_form.html:92: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 59 + templates/create_event.en-us.starts_form.html:94: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 60 + templates/create_event.en-us.starts_form.html:99: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 61 + templates/create_event.en-us.starts_form.html:101: aria-label="close"></button> 62 + templates/create_event.en-us.starts_form.html:122: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 63 + templates/create_event.en-us.starts_form.html:125: data-bs-target="startAtModal" class="button is-link is-outlined">Edit</button> 64 + templates/create_event.en-us.starts_form.html:128: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 65 + templates/create_event.en-us.starts_form.html:130: class="button is-danger is-outlined">Clear</button> 66 + templates/create_event.en-us.starts_form.html:173: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 67 + templates/create_event.en-us.starts_form.html:175: class="button is-link is-outlined">Edit</button> 68 + templates/create_rsvp.en-us.partial.html:14: <p class="buttons"> 69 + templates/create_rsvp.en-us.partial.html:15: <a class="button" href="{{ event_url }}"> 70 + templates/create_rsvp.en-us.partial.html:94: <button data-loading-disable data-loading-aria-busy type="submit" id="createRsvpSubmit" 71 + templates/create_rsvp.en-us.partial.html:95: class="button is-link" name="submit" value="Submit">Record RSVP</button> 72 + templates/edit_event.en-us.bare.html:1:{% extends "bare.en-us.html" %} 73 + templates/edit_event.en-us.common.html:1:{% from "form_include.html" import text_input %} 74 + templates/edit_event.en-us.common.html:2:<section class="section is-fullheight"> 75 + templates/edit_event.en-us.common.html:3: <div class="container "> 76 + templates/edit_event.en-us.common.html:5: <div class="box content"> 77 + templates/edit_event.en-us.html:1:{% extends "base.en-us.html" %} 78 + templates/event_list.en-us.incl.html:80: {% elif event.status == "cancelled" %} 79 + templates/event_list.en-us.incl.html:81: <span class="level-item icon-text is-hidden-tablet is-danger" title="The event is cancelled."> 80 + templates/import.en-us.partial.html:7: <button class="button is-link" hx-post="/import" hx-target="#importRecords" hx-swap="outerHTML" 81 + templates/login.en-us.partial.html:21: <button data-loading-disable type="submit" id="loginSubmit" class="button is-link" name="submit" value="Submit">Sign-In</button> 82 + templates/migrate_event.en-us.common.html:48: <div class="buttons mt-5"> 83 + templates/migrate_event.en-us.common.html:49: <a href="{{ migrated_event_url }}" class="button is-primary"> 84 + templates/migrate_event.en-us.common.html:55: <a href="/{{ current_handle.handle }}" class="button is-light"> 85 + templates/nav.en-us.html:11: <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" 86 + templates/nav.en-us.html:35: <div class="buttons"> 87 + templates/nav.en-us.html:37: <a class="button is-primary" href="/event" hx-boost="true"> 88 + templates/nav.en-us.html:43: <a class="button is-link" href="/{{ current_handle.did }}" hx-boost="true"> 89 + templates/nav.en-us.html:49: <a class="button is-danger is-light" 90 + templates/nav.en-us.html:52: <a class="button is-primary" href="/oauth/login" hx-boost="true">Log in</a> 91 + templates/profile.en-us.common.html:5: <div class="buttons"> 92 + templates/profile.en-us.common.html:6: <a class="button is-link is-outlined" href="https://bsky.app/profile/{{ profile.did }}" target="_blank"> 93 + templates/profile.en-us.common.html:14: <a class="button is-info" href="/settings" hx-boost="true"> 94 + templates/profile.en-us.common.html:21: <a class="button is-primary is-outlined" href="/import"> 95 + templates/settings.en-us.html:10: <button class="delete"></button> 96 + templates/view_event.en-us.common.html:13: <a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary"> 97 + templates/view_event.en-us.common.html:23: <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/migrate" class="button is-small is-info"> 98 + templates/view_event.en-us.common.html:52: <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/edit" 99 + templates/view_event.en-us.common.html:53: class="button is-small is-outlined is-primary ml-2"> 100 + templates/view_event.en-us.common.html:55: <i class="fas fa-edit"></i> 101 + templates/view_event.en-us.common.html:83: {% elif event.status == "cancelled" %} 102 + templates/view_event.en-us.common.html:84: <span class="level-item icon-text is-danger" title="The event is cancelled."> 103 + templates/view_event.en-us.common.html:222: class="button is-small is-info"> 104 + templates/view_event.en-us.common.html:259: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 105 + templates/view_event.en-us.common.html:269: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 106 + templates/view_event.en-us.common.html:279: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 107 + templates/view_event.en-us.common.html:299: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 108 + templates/view_event.en-us.common.html:309: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 109 + templates/view_event.en-us.common.html:329: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 110 + templates/view_event.en-us.common.html:339: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 111 + templates/view_event.en-us.common.html:359: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 112 + templates/view_event.en-us.common.html:369: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 113 + templates/view_event.en-us.common.html:445: <br><a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary mt-2"> 114 + templates/view_rsvp.en-us.common.html:18: <button class="button is-primary" type="submit"> 115 + templates/create_event.en-us.link_form.html:23: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 116 + templates/create_event.en-us.link_form.html:51: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 117 + templates/create_event.en-us.location_form.html:60: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 118 + templates/create_event.en-us.location_form.html:129: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 119 + templates/create_event.en-us.location_form.html:174: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 120 + templates/create_event.en-us.location_form.html:216: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 121 + templates/create_event.en-us.location_form.html:220: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 122 + templates/create_event.en-us.partial.html:82: <option {% if build_event_form.status=='cancelled' %} selected="selected" {% endif %} 123 + templates/create_event.en-us.starts_form.html:94: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 124 + templates/edit_event.en-us.bare.html:3:{% include 'edit_event.en-us.common.html' %} 125 + templates/edit_event.en-us.common.html:8: {% include 'create_event.en-us.partial.html' %} 126 + templates/edit_event.en-us.html:5:{% include 'edit_event.en-us.common.html' %} 127 + templates/edit_event.en-us.partial.html:1:{% include 'create_event.en-us.partial.html' %}
+376
claude.md
··· 1 + # Smokesignal Template Migration Guidelines 2 + 3 + This document provides step-by-step guidance for migrating existing hardcoded templates to use the new i18n system with on-demand translation functions. 4 + 5 + ## Migration Overview 6 + 7 + Migrate from hardcoded strings in templates to Fluent-based translations using template functions. This migration eliminates pre-rendered translation HashMaps and improves HTMX performance. 8 + 9 + ## Migration Strategy 10 + 11 + ### Phase 1: Template Analysis & Key Extraction 12 + 13 + #### 1.1 Inventory Existing Strings 14 + ```bash 15 + # Find all hardcoded strings in templates 16 + find templates/ -name "*.html" -exec grep -Hn '"[^"]*"' {} \; > strings_inventory.txt 17 + find templates/ -name "*.html" -exec grep -Hn "'[^']*'" {} \; >> strings_inventory.txt 18 + 19 + # Categorize by domain for organized migration 20 + grep -E "(button|btn|submit|save|edit|delete|cancel)" strings_inventory.txt > actions.txt 21 + grep -E "(error|fail|invalid|required)" strings_inventory.txt > errors.txt 22 + grep -E "(title|heading|h1|h2|h3)" strings_inventory.txt > headings.txt 23 + grep -E "(label|placeholder|hint)" strings_inventory.txt > forms.txt 24 + ``` 25 + 26 + #### 1.2 Create Translation Key Naming Convention 27 + ``` 28 + # Pattern: domain-purpose[-variant] 29 + save-changes # Basic action 30 + edit-profile # Specific action 31 + validation-required # Error message 32 + profile-title # Page heading 33 + enter-name-placeholder # Form guidance 34 + welcome-message-feminine # Gender variant 35 + ``` 36 + 37 + ### Phase 2: Fluent File Creation 38 + 39 + #### 2.1 Organize by Category 40 + ```ftl 41 + # i18n/en-us/actions.ftl 42 + save-changes = Save Changes 43 + edit-profile = Edit Profile 44 + delete-item = Delete 45 + cancel-action = Cancel 46 + follow-user = Follow 47 + unfollow-user = Unfollow 48 + 49 + # i18n/en-us/errors.ftl 50 + validation-required = This field is required 51 + validation-email = Please enter a valid email 52 + validation-minlength = Must be at least {$min} characters 53 + form-submit-error = Unable to submit form 54 + profile-not-found = Profile not found 55 + 56 + # i18n/en-us/ui.ftl 57 + profile-title = Profile 58 + member-since = Member since 59 + events-created = Events Created 60 + welcome-message = Welcome 61 + search-placeholder = Search... 62 + 63 + # i18n/fr-ca/actions.ftl 64 + save-changes = Enregistrer les modifications 65 + edit-profile = Modifier le profil 66 + delete-item = Supprimer 67 + cancel-action = Annuler 68 + follow-user = Suivre 69 + unfollow-user = Ne plus suivre 70 + ``` 71 + 72 + #### 2.2 Gender-Aware Translations 73 + ```ftl 74 + # English (gender-neutral by default) 75 + welcome-message = Welcome 76 + profile-greeting = Hello there 77 + 78 + # French Canadian (gender variants) 79 + welcome-message = Bienvenue 80 + welcome-message-feminine = Bienvenue 81 + welcome-message-masculine = Bienvenu 82 + welcome-message-neutral = Bienvenue 83 + 84 + profile-greeting = Bonjour 85 + profile-greeting-feminine = Bonjour madame 86 + profile-greeting-masculine = Bonjour monsieur 87 + profile-greeting-neutral = Bonjour 88 + ``` 89 + 90 + ### Phase 3: Template Function Integration 91 + 92 + #### 3.1 Replace Simple Strings 93 + ```html 94 + <!-- Before --> 95 + <button class="button">Save Changes</button> 96 + <h1>Profile</h1> 97 + <p>Member since {{ profile.created_at }}</p> 98 + 99 + <!-- After --> 100 + <button class="button">{{ t(key="save-changes", locale=locale) }}</button> 101 + <h1>{{ t(key="profile-title", locale=locale) }}</h1> 102 + <p>{{ t(key="member-since", locale=locale) }} {{ profile.created_at }}</p> 103 + ``` 104 + 105 + #### 3.2 Add Gender-Aware Translations 106 + ```html 107 + <!-- Before --> 108 + <h2>Welcome, {{ user.name }}!</h2> 109 + 110 + <!-- After --> 111 + <h2>{{ tg(key="welcome-message", locale=locale, gender=user_gender) }}, {{ user.name }}!</h2> 112 + ``` 113 + 114 + #### 3.3 Handle Parameterized Messages 115 + ```html 116 + <!-- Before --> 117 + <p>You have {{ event_count }} events</p> 118 + 119 + <!-- After --> 120 + <p>{{ tc(key="events-count", locale=locale, count=event_count) }}</p> 121 + ``` 122 + 123 + ### Phase 4: HTMX-Specific Migration 124 + 125 + #### 4.1 Form Templates with Language Propagation 126 + ```html 127 + <!-- Before --> 128 + <form hx-post="/profile/update" hx-target="#profile-content"> 129 + <label>Display Name</label> 130 + <input name="display_name" placeholder="Enter your name" /> 131 + <button type="submit">Save Changes</button> 132 + </form> 133 + 134 + <!-- After --> 135 + <form hx-post="/profile/update" 136 + hx-target="#profile-content" 137 + hx-headers='{"HX-Current-Language": "{{ locale }}"}'> 138 + 139 + <label>{{ t(key="display-name", locale=locale) }}</label> 140 + <input name="display_name" 141 + placeholder="{{ t(key="enter-name-placeholder", locale=locale) }}" /> 142 + <button type="submit">{{ t(key="save-changes", locale=locale) }}</button> 143 + </form> 144 + ``` 145 + 146 + #### 4.2 Error Message Templates 147 + ```html 148 + <!-- Before --> 149 + <div class="error">Invalid email address</div> 150 + 151 + <!-- After --> 152 + <div class="error">{{ t(key="validation-email", locale=locale) }}</div> 153 + ``` 154 + 155 + ### Phase 5: Template Hierarchy Migration 156 + 157 + #### 5.1 Base Template Updates 158 + ```html 159 + <!-- templates/base.en-us.html --> 160 + <!doctype html> 161 + <html lang="{{ language }}"> 162 + <head> 163 + <title>{{ t(key="site-title", locale=locale) }}</title> 164 + <meta name="description" content="{{ t(key="site-description", locale=locale) }}"> 165 + </head> 166 + <body data-current-language="{{ locale }}"> 167 + {% include 'nav.html' %} 168 + {% block content %}{% endblock %} 169 + {% include 'footer.html' %} 170 + </body> 171 + </html> 172 + ``` 173 + 174 + #### 5.2 Partial Templates for HTMX 175 + ```html 176 + <!-- templates/partials/profile_form.html --> 177 + <div id="profile-form" data-current-language="{{ locale }}"> 178 + <h3>{{ t(key="edit-profile-title", locale=locale) }}</h3> 179 + 180 + {% if errors %} 181 + <div class="errors"> 182 + {% for error in errors %} 183 + <p class="error">{{ t(key=error.key, locale=locale) }}</p> 184 + {% endfor %} 185 + </div> 186 + {% endif %} 187 + 188 + <form hx-post="/profile/update" 189 + hx-target="#profile-content" 190 + hx-headers='{"HX-Current-Language": "{{ locale }}"}'> 191 + <!-- Form fields with translations --> 192 + </form> 193 + </div> 194 + ``` 195 + 196 + ## Migration Tools & Automation 197 + 198 + ### Automated String Replacement Script 199 + ```bash 200 + #!/bin/bash 201 + # migrate_template.sh 202 + 203 + TEMPLATE_FILE=$1 204 + BACKUP_FILE="${TEMPLATE_FILE}.bak" 205 + 206 + # Create backup 207 + cp "$TEMPLATE_FILE" "$BACKUP_FILE" 208 + 209 + # Replace common patterns 210 + sed -i 's/"Save Changes"/{{ t(key="save-changes", locale=locale) }}/g' "$TEMPLATE_FILE" 211 + sed -i 's/"Edit Profile"/{{ t(key="edit-profile", locale=locale) }}/g' "$TEMPLATE_FILE" 212 + sed -i 's/"Delete"/{{ t(key="delete-item", locale=locale) }}/g' "$TEMPLATE_FILE" 213 + sed -i 's/"Cancel"/{{ t(key="cancel-action", locale=locale) }}/g' "$TEMPLATE_FILE" 214 + 215 + # Handle form labels 216 + sed -i 's/"Display Name"/{{ t(key="display-name", locale=locale) }}/g' "$TEMPLATE_FILE" 217 + sed -i 's/"Email"/{{ t(key="email", locale=locale) }}/g' "$TEMPLATE_FILE" 218 + 219 + echo "Migrated $TEMPLATE_FILE (backup: $BACKUP_FILE)" 220 + ``` 221 + 222 + ### Translation Key Validator 223 + ```rust 224 + // tools/validate_keys.rs 225 + use std::collections::HashSet; 226 + use regex::Regex; 227 + 228 + fn extract_translation_keys_from_templates() -> HashSet<String> { 229 + let re = Regex::new(r#"\{\{\s*t\w*\(key="([^"]+)""#).unwrap(); 230 + // Extract all translation keys from templates 231 + // Return set of used keys 232 + } 233 + 234 + fn load_fluent_keys() -> HashSet<String> { 235 + // Load all keys from .ftl files 236 + // Return set of available keys 237 + } 238 + 239 + #[test] 240 + fn test_all_translation_keys_exist() { 241 + let used_keys = extract_translation_keys_from_templates(); 242 + let available_keys = load_fluent_keys(); 243 + 244 + for key in &used_keys { 245 + assert!( 246 + available_keys.contains(key), 247 + "Missing translation key: {} (used in templates)", 248 + key 249 + ); 250 + } 251 + 252 + println!("✅ All {} translation keys validated", used_keys.len()); 253 + } 254 + ``` 255 + 256 + ## Migration Validation 257 + 258 + ### Template Syntax Validation 259 + ```bash 260 + # Validate template syntax after migration 261 + find templates/ -name "*.html" -exec python3 -c " 262 + import sys 263 + import re 264 + 265 + def validate_template(file_path): 266 + with open(file_path, 'r') as f: 267 + content = f.read() 268 + 269 + # Check for proper function calls 270 + pattern = r'\{\{\s*t[gc]?\(key=[\"'\''][^\"\']+[\"'\''][^}]*\)\s*\}\}' 271 + matches = re.findall(pattern, content) 272 + 273 + # Check for missing locale parameter 274 + missing_locale = re.findall(r'\{\{\s*t[gc]?\([^}]*\)\s*\}\}', content) 275 + 276 + print(f'File: {file_path}') 277 + print(f' Translation calls: {len(matches)}') 278 + if missing_locale: 279 + print(f' ⚠️ Potential missing locale: {len(missing_locale)}') 280 + 281 + validate_template(sys.argv[1]) 282 + " {} \; 283 + ``` 284 + 285 + ### Performance Comparison 286 + ```rust 287 + // Compare before/after performance 288 + #[cfg(test)] 289 + mod migration_performance_tests { 290 + #[test] 291 + fn benchmark_old_vs_new_rendering() { 292 + // Test pre-rendered HashMap approach vs on-demand functions 293 + let start = std::time::Instant::now(); 294 + 295 + // Old approach: pre-render all translations 296 + let _old_result = render_with_prerendered_translations(); 297 + let old_duration = start.elapsed(); 298 + 299 + let start = std::time::Instant::now(); 300 + 301 + // New approach: on-demand translation functions 302 + let _new_result = render_with_template_functions(); 303 + let new_duration = start.elapsed(); 304 + 305 + println!("Old approach: {:?}", old_duration); 306 + println!("New approach: {:?}", new_duration); 307 + 308 + // Expect significant improvement 309 + assert!(new_duration < old_duration * 3 / 4); 310 + } 311 + } 312 + ``` 313 + 314 + ## Migration Checklist 315 + 316 + ### Per Template 317 + - [ ] Backup original template 318 + - [ ] Extract all hardcoded strings 319 + - [ ] Create corresponding Fluent keys 320 + - [ ] Replace strings with template functions 321 + - [ ] Add HTMX language headers if applicable 322 + - [ ] Test rendering in both languages 323 + - [ ] Validate gender variants (if applicable) 324 + - [ ] Performance test HTMX interactions 325 + 326 + ### Per Handler 327 + - [ ] Remove pre-rendered translation HashMap 328 + - [ ] Use minimal template context 329 + - [ ] Ensure Language extractor is used 330 + - [ ] Add proper error handling for missing keys 331 + - [ ] Test with HTMX requests 332 + 333 + ### Project-Wide 334 + - [ ] All templates migrated 335 + - [ ] All Fluent files complete 336 + - [ ] Translation key validator passes 337 + - [ ] HTMX language propagation working 338 + - [ ] Performance benchmarks improved 339 + - [ ] Documentation updated 340 + 341 + ## Common Migration Patterns 342 + 343 + ### Form Validation Messages 344 + ```html 345 + <!-- Pattern for validation errors --> 346 + {% if field_errors %} 347 + <div class="field-errors"> 348 + {% for error in field_errors %} 349 + <span class="error"> 350 + {{ t(key=error.translation_key, locale=locale, args=error.args) }} 351 + </span> 352 + {% endfor %} 353 + </div> 354 + {% endif %} 355 + ``` 356 + 357 + ### Conditional Gender Messages 358 + ```html 359 + <!-- Pattern for conditional gender content --> 360 + {% if user_gender == "feminine" %} 361 + {{ tg(key="welcome-message", locale=locale, gender="feminine") }} 362 + {% elif user_gender == "masculine" %} 363 + {{ tg(key="welcome-message", locale=locale, gender="masculine") }} 364 + {% else %} 365 + {{ tg(key="welcome-message", locale=locale, gender="neutral") }} 366 + {% endif %} 367 + ``` 368 + 369 + ### Count-Based Messages 370 + ```html 371 + <!-- Pattern for pluralization --> 372 + <p>{{ tc(key="events-created", locale=locale, count=profile.event_count) }}</p> 373 + <p>{{ tc(key="followers-count", locale=locale, count=profile.followers) }}</p> 374 + ``` 375 + 376 + This migration approach ensures a smooth transition from hardcoded strings to a flexible, performance-optimized i18n system while maintaining HTMX compatibility.
+57
errors.txt
··· 1 + templates/admin_denylist.en-us.html:24: <input class="input" type="text" placeholder="at://did:plc:..." name="subject" required> 2 + templates/admin_events.en-us.html:28: <input class="input" type="text" id="importAtUriInput" name="aturi" required="required" 3 + templates/admin_rsvps.en-us.html:42: <input class="input" type="text" name="aturi" placeholder="at://did:plc:abcdef/community.lexicon.calendar.rsvp/3jizzrxoalv2h" required> 4 + templates/create_event.en-us.link_form.html:13: value=link_form.link_name, error=link_form.link_name_error, extra='placeholder="Tickets"') }} 5 + templates/create_event.en-us.location_form.html:13: <label class="label" for="createEventLocationCountryInput">Country (required)</label> 6 + templates/create_event.en-us.location_form.html:31: <p class="help is-danger">{{ location_form.location_country_error }}</p> 7 + templates/create_event.en-us.location_form.html:191: error=location_form.location_name_error, class_extra=" is-static", extra=' readonly ') }} 8 + templates/create_event.en-us.location_form.html:195: error=location_form.location_street_error, class_extra=" is-static", extra=' readonly ') }} 9 + templates/create_event.en-us.location_form.html:201: error=location_form.location_locality_error, class_extra=" is-static", extra=' readonly ') }} 10 + templates/create_event.en-us.location_form.html:205: error=location_form.location_region_error, class_extra=" is-static", extra=' readonly ') }} 11 + templates/create_event.en-us.location_form.html:209: error=location_form.location_postal_code_error, class_extra=" is-static", extra=' readonly ') }} 12 + templates/create_event.en-us.partial.html:36: <label class="label" for="createEventNameInput">Name (required)</label> 13 + templates/create_event.en-us.partial.html:37: <div class="control {% if build_event_form.name_error %} has-icons-right{% endif %}" 14 + templates/create_event.en-us.partial.html:39: <input type="text" class="input {% if build_event_form.name_error %} is-danger{% endif %}" 15 + templates/create_event.en-us.partial.html:41: if build_event_form.name %}value="{{ build_event_form.name }}" {% endif %} required 16 + templates/create_event.en-us.partial.html:45: <p class="help is-danger">{{ build_event_form.name_error }}</p> 17 + templates/create_event.en-us.partial.html:52: <label class="label" for="createEventTextInput">Text (required)</label> 18 + templates/create_event.en-us.partial.html:54: <textarea class="textarea{% if build_event_form.description_error %} is-danger{% endif %}" 19 + templates/create_event.en-us.partial.html:56: placeholder="A helpful, brief description of the event." required 20 + templates/create_event.en-us.partial.html:60: <p class="help is-danger">{{ build_event_form.description_error }}</p> 21 + templates/create_event.en-us.partial.html:73: class="{% if build_event_form.status_error %}is-danger{% endif %}"> 22 + templates/create_event.en-us.partial.html:98: <p class="help is-danger">{{ build_event_form.status_error }}</p> 23 + templates/create_event.en-us.partial.html:106: class="{% if build_event_form.mode_error %}is-danger{% endif %}"> 24 + templates/create_event.en-us.partial.html:118: <p class="help is-danger">{{ build_event_form.mode_error }}</p> 25 + templates/create_event.en-us.starts_form.html:27: <label class="label" for="createEventStartsAtDate">Start Day (required)</label> 26 + templates/create_event.en-us.starts_form.html:31: value="{{ starts_form.starts_date }}" {% endif %} required /> 27 + templates/create_event.en-us.starts_form.html:35: <label class="label" for="createEventStartsAtTime">Start Time (required)</label> 28 + templates/create_event.en-us.starts_form.html:39: value="{{ starts_form.starts_time }}" {% endif %} required /> 29 + templates/create_event.en-us.starts_form.html:44: <p class="help is-danger">{{ starts_form.starts_at_error }}</p> 30 + templates/create_event.en-us.starts_form.html:52: <label class="label" for="createEventStartsAtDate">End Day (required)</label> 31 + templates/create_event.en-us.starts_form.html:60: <label class="label" for="createEventStartsAtTime">End Time (required)</label> 32 + templates/create_event.en-us.starts_form.html:69: <p class="help is-danger">{{ starts_form.ends_at_error }}</p> 33 + templates/create_rsvp.en-us.partial.html:41: <label class="label" for="createRsvpSubjectAtUriInput">Event AT-URI (required)</label> 34 + templates/create_rsvp.en-us.partial.html:42: <div class="control {% if build_rsvp_form.subject_aturi_error %} has-icons-right{% endif %}" 35 + templates/create_rsvp.en-us.partial.html:44: <input type="text" class="input {% if build_rsvp_form.subject_aturi_error %} is-danger{% endif %}" 36 + templates/create_rsvp.en-us.partial.html:46: if build_rsvp_form.subject_aturi %}value="{{ build_rsvp_form.subject_aturi }}" {% endif %} required 37 + templates/create_rsvp.en-us.partial.html:50: <p class="help is-danger">{{ build_rsvp_form.subject_aturi_error }}</p> 38 + templates/create_rsvp.en-us.partial.html:56: <div class="control {% if build_rsvp_form.subject_cid_error %} has-icons-right{% endif %}" 39 + templates/create_rsvp.en-us.partial.html:58: <input type="text" class="input {% if build_rsvp_form.subject_cid_error %} is-danger{% endif %}" 40 + templates/create_rsvp.en-us.partial.html:64: <p class="help is-danger">{{ build_rsvp_form.subject_cid_error }}</p> 41 + templates/create_rsvp.en-us.partial.html:73: class="{% if build_rsvp_form.status_error %}is-danger{% endif %}"> 42 + templates/create_rsvp.en-us.partial.html:87: <p class="help is-danger">{{ build_rsvp_form.status_error }}</p> 43 + templates/form_include.html:1:{%- macro text_input(label, id, name="", value="", class_extra="", error="", extra="") -%} 44 + templates/form_include.html:5: <input type="text" class="input {{ class_extra }}{% if error %} is-danger{% endif %}" id="{{ id }}" name="{{ name }}" {% if value %} value="{{ value }}"{% endif %}{% autoescape false %} {{ extra }}{% endautoescape %}> 45 + templates/form_include.html:7: {% if error %}<p class="help is-danger">{{ error }}</p>{% endif %} 46 + templates/login.en-us.partial.html:7: <div class="control has-icons-left{% if handle_error %} has-icons-right{% endif %}" data-loading-class="is-loading"> 47 + templates/login.en-us.partial.html:8: <input class="input{% if handle_error %} is-danger{% endif %}" type="text" id="loginHandleInput" name="handle" required="required" autocomplete="handle" {% if handle_input %} 48 + templates/login.en-us.partial.html:13: {% if handle_error %}<span class="icon is-small is-right"> 49 + templates/login.en-us.partial.html:17: {% if handle_error %}<p class="help is-danger">{{ error_message }}</p>{% endif %} 50 + templates/view_rsvp.en-us.common.html:11: <input class="input" type="text" name="aturi" placeholder="at://did:plc:example/community.lexicon.calendar.rsvp/abcdef123" required> 51 + templates/create_event.en-us.link_form.html:13: value=link_form.link_name, error=link_form.link_name_error, extra='placeholder="Tickets"') }} 52 + templates/create_event.en-us.link_form.html:15: {{ text_input('Link (required)', 'linkValue', 'link_value', 53 + templates/create_event.en-us.location_form.html:191: error=location_form.location_name_error, class_extra=" is-static", extra=' readonly ') }} 54 + templates/create_event.en-us.location_form.html:195: error=location_form.location_street_error, class_extra=" is-static", extra=' readonly ') }} 55 + templates/create_event.en-us.location_form.html:201: error=location_form.location_locality_error, class_extra=" is-static", extra=' readonly ') }} 56 + templates/create_event.en-us.location_form.html:205: error=location_form.location_region_error, class_extra=" is-static", extra=' readonly ') }} 57 + templates/create_event.en-us.location_form.html:209: error=location_form.location_postal_code_error, class_extra=" is-static", extra=' readonly ') }}
+99
headings.txt
··· 1 + templates/acknowledgement.en-us.common.html:3: <h1 class="title is-1">Acknowledgement</h1> 2 + templates/acknowledgement.en-us.common.html:8: <h4 class="title is-4">What are smoke signals?</h4> 3 + templates/acknowledgement.en-us.common.html:18: <h4 class="title is-4">Why the name?</h4> 4 + templates/acknowledgement.en-us.common.html:34: <h4 class="title is-4">Land Acknowledgement</h4> 5 + templates/acknowledgement.en-us.common.html:47: <h4 class="title is-4">Learning More</h4> 6 + templates/admin.en-us.html:7: <h1 class="title">Smoke Signal Admin</h1> 7 + templates/admin.en-us.html:10: <h2 class="subtitle">Administration Tools</h2> 8 + templates/admin_denylist.en-us.html:19: <h2 class="subtitle">Add or Update Entry</h2> 9 + templates/admin_event.en-us.html:27: <h1 class="title">Event Record</h1> 10 + templates/admin_events.en-us.html:19: <h1 class="title">Event Records ({{ total_count }})</h1> 11 + templates/admin_events.en-us.html:20: <p class="subtitle">View all events ordered by recent updates</p> 12 + templates/admin_events.en-us.html:23: <h2 class="title is-4">Import Event by AT-URI</h2> 13 + templates/admin_handles.en-us.html:19: <h1 class="title">Handle Records ({{ total_count }})</h1> 14 + templates/admin_handles.en-us.html:20: <p class="subtitle">View known handles</p> 15 + templates/admin_rsvp.en-us.html:27: <h1 class="title">RSVP Record</h1> 16 + templates/admin_rsvp.en-us.html:32: <h2 class="subtitle">RSVP Details</h2> 17 + templates/admin_rsvp.en-us.html:73: <h2 class="subtitle">RSVP JSON</h2> 18 + templates/admin_rsvps.en-us.html:20: <h1 class="title">RSVP Records ({{ total_count }})</h1> 19 + templates/admin_rsvps.en-us.html:21: <p class="subtitle">View all RSVPs ordered by recent updates</p> 20 + templates/admin_rsvps.en-us.html:37: <h2 class="subtitle">Import RSVP</h2> 21 + templates/cookie-policy.en-us.common.html:3: <h1 class="title is-1">Cookie Policy</h1> 22 + templates/cookie-policy.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 23 + templates/cookie-policy.en-us.common.html:9: <h4 class="title is-4">Service Description</h4> 24 + templates/cookie-policy.en-us.common.html:19: <h4 class="title is-4">What Are Cookies?</h4> 25 + templates/cookie-policy.en-us.common.html:29: <h4 class="title is-4">How We Use Cookies</h4> 26 + templates/cookie-policy.en-us.common.html:38: <h4 class="title is-4">Types of Cookies We Use</h4> 27 + templates/cookie-policy.en-us.common.html:39: <h5 class="title is-5">1. Essential Cookies</h5> 28 + templates/cookie-policy.en-us.common.html:51: <h5 class="title is-5">2. Functional Cookies</h5> 29 + templates/cookie-policy.en-us.common.html:64: <h4 class="title is-4">What We Don't Use</h4> 30 + templates/cookie-policy.en-us.common.html:77: <h4 class="title is-4">Changes to This Cookie Policy</h4> 31 + templates/event_list.en-us.incl.html:50: <a class="level-item title has-text-link is-size-4 has-text-weight-semibold mb-0" 32 + templates/event_list.en-us.incl.html:60: <span class="level-item icon-text is-hidden-tablet" title="The event is planned."> 33 + templates/event_list.en-us.incl.html:67: <span class="level-item icon-text is-hidden-tablet" title="The event is scheduled."> 34 + templates/event_list.en-us.incl.html:74: <span class="level-item icon-text is-hidden-tablet is-info" title="The event is rescheduled."> 35 + templates/event_list.en-us.incl.html:81: <span class="level-item icon-text is-hidden-tablet is-danger" title="The event is cancelled."> 36 + templates/event_list.en-us.incl.html:88: <span class="level-item icon-text is-hidden-tablet is-warning" title="The event is postponed."> 37 + templates/event_list.en-us.incl.html:96: <span class="level-item icon-text" title="Starts at {{ event.starts_at_human }}"> 38 + templates/event_list.en-us.incl.html:114: <span class="level-item icon-text" title="In Person"> 39 + templates/event_list.en-us.incl.html:121: <span class="level-item icon-text" title="An Virtual (Online) Event"> 40 + templates/event_list.en-us.incl.html:128: <span class="level-item icon-text" title="A Hybrid In-Person and Virtual (Online) Event"> 41 + templates/event_list.en-us.incl.html:136: <span class="level-item icon-text" title="{{ event.count_going }} Going"> 42 + templates/event_list.en-us.incl.html:142: <span class="level-item icon-text" title="{{ event.count_interested }} Interested"> 43 + templates/event_list.en-us.incl.html:148: <span class="level-item icon-text" title="{{ event.count_not_going }} Not Going"> 44 + templates/import.en-us.partial.html:36: <h2 class="title is-5">Imported Items</h2> 45 + templates/index.en-us.common.html:4: <h1 class="title is-1">Smoke Signal</h1> 46 + templates/index.en-us.common.html:5: <h2 class="subtitle">Find events, make connections, and create community.</h2> 47 + templates/index.en-us.common.html:15: <h2 class="title is-2">Recently Updated Events</h2> 48 + templates/index.en-us.html:5:<meta property="og:title" content="Smoke Signal"> 49 + templates/migrate_event.en-us.common.html:4: <h1 class="title">Event Migration Complete</h1> 50 + templates/privacy-policy.en-us.common.html:3: <h1 class="title is-1">Privacy Policy</h1> 51 + templates/privacy-policy.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 52 + templates/privacy-policy.en-us.common.html:22: <h4 class="title is-4">Information We Collect</h4> 53 + templates/privacy-policy.en-us.common.html:23: <h5 class="title is-5">1. Personal Information</h5> 54 + templates/privacy-policy.en-us.common.html:27: <h5 class="title is-5">2. Automatically Collected Information</h5> 55 + templates/privacy-policy.en-us.common.html:41: <h5 class="title is-5">3. Cookies and Tracking Technologies</h5> 56 + templates/privacy-policy.en-us.common.html:46: <h5 class="title is-5">4. ATProtocol Network Information</h5> 57 + templates/privacy-policy.en-us.common.html:73: <h4 class="title is-4">How We Use Your Information</h4> 58 + templates/privacy-policy.en-us.common.html:86: <h4 class="title is-4">Legal Basis for Processing (EU Users)</h4> 59 + templates/privacy-policy.en-us.common.html:100: <h4 class="title is-4">Sharing of Information</h4> 60 + templates/privacy-policy.en-us.common.html:113: <h4 class="title is-4">Your Rights and Choices</h4> 61 + templates/privacy-policy.en-us.common.html:114: <h5 class="title is-5">1. Access and Correction</h5> 62 + templates/privacy-policy.en-us.common.html:118: <h5 class="title is-5">2. Data Deletion</h5> 63 + templates/privacy-policy.en-us.common.html:123: <h5 class="title is-5">3. Do Not Track</h5> 64 + templates/privacy-policy.en-us.common.html:131: <h4 class="title is-4">Data Security and Retention</h4> 65 + templates/privacy-policy.en-us.common.html:144: <h4 class="title is-4">Children's Privacy</h4> 66 + templates/privacy-policy.en-us.common.html:153: <h4 class="title is-4">Indexed Data, External Content, and Third-Party Links</h4> 67 + templates/privacy-policy.en-us.common.html:168: <h4 class="title is-4">Changes to This Privacy Policy</h4> 68 + templates/profile.en-us.common.html:4: <h1 class="title">@{{ profile.handle }}</h1> 69 + templates/profile.en-us.html:6:<meta property="og:title" content="@{{ profile.handle }}" /> 70 + templates/settings.en-us.common.html:8: <h2 class="subtitle">Account Information</h2> 71 + templates/settings.en-us.common.html:32: <h2 class="subtitle">Preferences</h2> 72 + templates/settings.en-us.html:6: <h1 class="title">Settings</h1> 73 + templates/terms-of-service.en-us.common.html:3: <h1 class="title is-1">Terms of Service</h1> 74 + templates/terms-of-service.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 75 + templates/terms-of-service.en-us.common.html:9: <h4 class="title is-4">Service Description</h4> 76 + templates/terms-of-service.en-us.common.html:23: <h4 class="title is-4">User Rights and Responsibilities</h4> 77 + templates/terms-of-service.en-us.common.html:39: <h4 class="title is-4">Content Ownership and Intellectual Property</h4> 78 + templates/terms-of-service.en-us.common.html:52: <h4 class="title is-4">Privacy and Cookie Policy</h4> 79 + templates/terms-of-service.en-us.common.html:72: <h4 class="title is-4">Open Source Notice</h4> 80 + templates/terms-of-service.en-us.common.html:83: <h4 class="title is-4">Governing Law</h4> 81 + templates/terms-of-service.en-us.common.html:93: <h4 class="title is-4">Changes to Terms</h4> 82 + templates/view_event.en-us.common.html:46: <h1 class="title">{{ event.name }}</h1> 83 + templates/view_event.en-us.common.html:47: <h1 class="subtitle"> 84 + templates/view_event.en-us.common.html:61: <div class="level subtitle"> 85 + templates/view_event.en-us.common.html:63: <span class="icon-text" title="The event is planned."> 86 + templates/view_event.en-us.common.html:70: <span class="level-item icon-text" title="The event is scheduled."> 87 + templates/view_event.en-us.common.html:77: <span class="level-item icon-text is-info" title="The event is rescheduled."> 88 + templates/view_event.en-us.common.html:84: <span class="level-item icon-text is-danger" title="The event is cancelled."> 89 + templates/view_event.en-us.common.html:91: <span class="level-item icon-text is-warning" title="The event is postponed."> 90 + templates/view_event.en-us.common.html:98: <span class="level-item icon-text" title="No event status set."> 91 + templates/view_event.en-us.common.html:105: <span class="level-item icon-text" title=" 92 + templates/view_event.en-us.common.html:126: <span class="level-item icon-text" title=" 93 + templates/view_event.en-us.common.html:148: <span class="level-item icon-text" title="In Person"> 94 + templates/view_event.en-us.common.html:155: <span class="level-item icon-text" title="An Virtual (Online) Event"> 95 + templates/view_event.en-us.common.html:162: <span class="level-item icon-text" title="A Hybrid In-Person and Virtual (Online) Event"> 96 + templates/view_event.en-us.common.html:171: <div class="level subtitle"> 97 + templates/view_event.en-us.common.html:196: <div class="level subtitle"> 98 + templates/view_event.en-us.html:5:<meta property="og:title" content="{{ event.name }}"> 99 + templates/view_rsvp.en-us.common.html:4: <h1 class="title">RSVP Viewer</h1>
+66
i18n/en-us/actions.ftl
··· 1 + # Action buttons and controls - English (US) 2 + 3 + # Basic actions 4 + save-changes = Save Changes 5 + save = Save 6 + cancel = Cancel 7 + delete = Delete 8 + edit = Edit 9 + create = Create 10 + add = Add 11 + update = Update 12 + remove = Remove 13 + submit = Submit 14 + back = Back 15 + next = Next 16 + previous = Previous 17 + close = Close 18 + view = View 19 + clear = Clear 20 + loading = Loading... 21 + 22 + # Specific actions 23 + create-event = Create Event 24 + edit-event = Edit Event 25 + view-event = View Event 26 + update-event = Update Event 27 + add-update-entry = Add/Update Entry 28 + remove-entry = Remove 29 + follow = Follow 30 + unfollow = Unfollow 31 + login = Login 32 + logout = Logout 33 + create-rsvp = Create RSVP 34 + record-rsvp = Record RSVP 35 + 36 + # Admin actions 37 + manage-handles = Manage known handles 38 + manage-denylist = Manage blocked identities 39 + view-events = View all events ordered by recent updates 40 + view-rsvps = View all RSVPs ordered by recent updates 41 + 42 + # Event actions 43 + planned = Planned 44 + scheduled = Scheduled 45 + cancelled = Cancelled 46 + postponed = Postponed 47 + rescheduled = Rescheduled 48 + 49 + # Status options for events 50 + status-active = Active 51 + 52 + # Status options for RSVPs 53 + status-going = Going 54 + status-interested = Interested 55 + status-not-going = Not Going 56 + 57 + # Event modes 58 + mode-in-person = In Person 59 + mode-virtual = Virtual 60 + mode-hybrid = Hybrid 61 + 62 + # Location types 63 + location-type-venue = Venue 64 + location-type-address = Address 65 + location-type-coordinates = Coordinates 66 + location-type-virtual = Virtual
+20 -1
i18n/en-us/errors.ftl
··· 1 - error-unknown-1 = Unknown error 1 + # Error messages and validation - English (US) 2 + 3 + # Form validation 4 + validation-required = This field is required 5 + validation-email = Please enter a valid email 6 + validation-minlength = Must be at least {$min} characters 7 + validation-maxlength = Must be no more than {$max} characters 8 + validation-name-length = Must be at least 10 characters and no more than 500 characters 9 + validation-description-length = Must be at least 10 characters and no more than 3000 characters 10 + 11 + # Error messages 12 + error-unknown = Unknown error 13 + form-submit-error = Unable to submit form 14 + profile-not-found = Profile not found 15 + event-creation-failed = Failed to create event 16 + event-update-failed = Failed to update event 17 + 18 + # Help text 19 + help-subject-uri = URI of the content to block (at URI, DIDs, URLs, domains) 20 + help-reason-blocking = Reason for blocking this content
+71
i18n/en-us/forms.ftl
··· 1 + # Form labels, placeholders, and help text - English (US) 2 + 3 + # Form field labels 4 + label-name = Name 5 + label-text = Text 6 + label-description = Description 7 + label-subject = Subject 8 + label-reason = Reason 9 + label-status = Status 10 + label-display-name = Display Name 11 + label-handle = Handle 12 + label-email = Email 13 + label-password = Password 14 + label-location-name = Location Name 15 + label-address = Address 16 + label-city = City 17 + label-state = State 18 + label-zip = ZIP Code 19 + label-link-name = Link Name 20 + label-link-url = Link URL 21 + label-timezone = Timezone 22 + label-start-day = Start Day 23 + label-start-time = Start Time 24 + label-end-day = End Day 25 + label-end-time = End Time 26 + label-starts-at = Starts At 27 + label-ends-at = Ends At 28 + label-country = Country 29 + label-street-address = Street Address 30 + label-locality = Locality 31 + label-region = Region 32 + label-postal-code = Postal Code 33 + label-location = Location 34 + label-event-at-uri = Event AT-URI 35 + label-event-cid = Event CID 36 + 37 + # Form placeholders 38 + placeholder-awesome-event = My Awesome Event 39 + placeholder-event-description = A helpful, brief description of the event 40 + placeholder-at-uri = at://did:plc:... 41 + placeholder-reason-blocking = Reason for blocking... 42 + placeholder-handle = you.bsky.social 43 + placeholder-tickets = Tickets 44 + placeholder-tickets-url = https://smokesignal.tickets/ 45 + placeholder-venue-name = The Gem City 46 + placeholder-address = 555 Somewhere 47 + placeholder-city = Dayton 48 + placeholder-state = Ohio 49 + placeholder-zip = 11111 50 + placeholder-at-uri-event = at://smokesignal.events/community.lexicon.calendar.event/neat 51 + placeholder-at-uri-rsvp = at://did:plc:abc123/app.bsky.feed.post/record123 52 + placeholder-at-uri-admin = at://did:plc:abcdef/community.lexicon.calendar.rsvp/3jizzrxoalv2h 53 + 54 + # Help text 55 + help-name-length = Must be at least 10 characters and no more than 500 characters 56 + help-description-length = Must be at least 10 characters and no more than 3000 characters 57 + help-subject-uri = URI of the content to block (at URI, DIDs, URLs, domains) 58 + help-reason-blocking = Reason for blocking this content 59 + help-rsvp-public = RSVPs are public and can be viewed by anyone that can view the information stored in your PDS. 60 + help-rsvp-learn-more = Learn more about rsvps on the 61 + help-rsvp-help-page = RSVP Help 62 + 63 + # Required field indicators 64 + required-field = (required) 65 + optional-field = (optional) 66 + 67 + # Time and date 68 + not-set = Not Set 69 + add-end-time = Add End Time 70 + remove-end-time = Remove End Time 71 + clear = Clear
+135 -37
i18n/en-us/ui.ftl
··· 1 - # User interface elements - English (US) 2 - # Page titles 3 - page-title-home = Smoke Signal - Event Management 4 - page-title-events = Events - Smoke Signal 5 - page-title-profile = Profile - Smoke Signal 6 - page-title-settings = Settings - Smoke Signal 7 - page-title-admin = Admin - Smoke Signal 1 + # User interface labels and text - English (US) 8 2 9 - # Buttons and actions 10 - follow-user = Follow 11 - unfollow-user = Unfollow 12 - rsvp-yes = RSVP Yes 13 - rsvp-no = RSVP No 14 - rsvp-maybe = RSVP Maybe 15 - share-event = Share Event 16 - export-event = Export Event 17 - import-data = Import Data 3 + # Page titles and headings 4 + page-title-admin = Smoke Signal Admin 5 + page-title-create-event = Smoke Signal - Create Event 6 + page-title-edit-event = Smoke Signal - Edit Event 7 + acknowledgement = Acknowledgement 8 + administration-tools = Administration Tools 18 9 19 - # Status messages 20 - event-created = Event created successfully 21 - event-updated = Event updated successfully 22 - event-deleted = Event deleted successfully 23 - rsvp-confirmed = RSVP confirmed 24 - rsvp-cancelled = RSVP cancelled 10 + # Section headings 11 + what-are-smoke-signals = What are smoke signals? 12 + why-the-name = Why the name? 13 + land-acknowledgement = Land Acknowledgement 14 + learning-more = Learning More 25 15 26 - # Time and dates 27 - today = Today 28 - tomorrow = Tomorrow 29 - yesterday = Yesterday 30 - this-week = This Week 31 - next-week = Next Week 32 - last-week = Last Week 16 + # Admin interface 17 + admin = Admin 18 + denylist = Denylist 19 + handle-records = Handle Records 20 + event-records = Event Records 21 + rsvp-records = RSVP Records 22 + event-record = Event Record 23 + add-update-entry = Add or Update Entry 33 24 34 - # Notifications 35 - notification-new-event = New event: {$title} 36 - notification-event-updated = Event updated: {$title} 37 - notification-rsvp-received = New RSVP for {$title} 25 + # Table headers 26 + subject = Subject 27 + reason = Reason 28 + updated = Updated 29 + actions = Actions 30 + events = Events 31 + 32 + # Form labels 33 + display-name = Display Name 34 + handle = Handle 35 + name-required = Name (required) 36 + text-required = Text (required) 37 + status = Status 38 + mode = Mode 39 + location = Location 40 + email = Email 41 + 42 + # Event status options 43 + status-planned = Planned 44 + status-scheduled = Scheduled 45 + status-cancelled = Cancelled 46 + status-postponed = Postponed 47 + status-rescheduled = Rescheduled 48 + 49 + # Event mode options 50 + mode-virtual = Virtual 51 + mode-hybrid = Hybrid 52 + mode-inperson = In Person 38 53 39 - # Gender variants for notifications 40 - notification-invited-masculine = You have been invited sir 41 - notification-invited-feminine = You have been invited miss 42 - notification-invited-neutral = You have been invited 54 + # Location warnings 55 + location-cannot-edit = Location cannot be edited 56 + location-edit-restriction = Only events with a single location of type "Address" can be edited through this form. 57 + no-location-info = No location information available. 58 + 59 + # Location types 60 + location-type-link = Link 61 + location-type-address = Address 62 + location-type-other = Other location type 63 + 64 + # Placeholders 65 + placeholder-awesome-event = My Awesome Event 66 + placeholder-event-description = A helpful, brief description of the event 67 + placeholder-at-uri = at://did:plc:... 68 + placeholder-reason-blocking = Reason for blocking... 69 + placeholder-handle = you.bsky.social 70 + placeholder-tickets = Tickets 71 + placeholder-venue-name = The Gem City 72 + placeholder-address = 555 Somewhere 73 + placeholder-city = Dayton 74 + placeholder-state = Ohio 75 + placeholder-zip = 11111 76 + 77 + # Navigation 78 + nav-home = Home 79 + nav-events = Events 80 + nav-profile = Profile 81 + nav-settings = Settings 82 + nav-admin = Admin 83 + nav-logout = Logout 84 + 85 + # Content messages 86 + member-since = Member Since 87 + events-created = Events Created 88 + events-count = You have {$count -> 89 + [0] no events 90 + [1] 1 event 91 + *[other] {$count} events 92 + } 93 + back-to-profile = Back to Profile 94 + 95 + # Success messages 96 + event-created-success = The event has been created! 97 + event-updated-success = The event has been updated! 98 + 99 + # Info messages 100 + events-public-notice = Events are public and can be viewed by anyone that can view the information stored in your PDS. Do not publish personal or sensitive information in your events. 101 + event-help-link = Event Help 102 + 103 + # Gender-aware greetings 104 + profile-greeting = Hello there 105 + profile-greeting-feminine = Hello miss 106 + profile-greeting-masculine = Hello sir 107 + profile-greeting-neutral = Hello there 108 + 109 + welcome-user = Welcome {$name}! 110 + welcome-user-feminine = Welcome miss {$name}! 111 + welcome-user-masculine = Welcome sir {$name}! 112 + welcome-user-neutral = Welcome {$name}! 113 + 114 + # Page titles and headings - English (US) 115 + 116 + # Admin and configuration pages 117 + page-title-admin = Admin 118 + page-title-admin-denylist = Admin - Denylist 119 + page-title-create-event = Create Event 120 + page-title-create-rsvp = Create RSVP 121 + 122 + # Page headings and content 123 + heading-admin = Admin 124 + heading-admin-denylist = Denylist 125 + heading-create-event = Create Event 126 + heading-create-rsvp = Create RSVP 127 + 128 + # Status and notification messages 129 + message-rsvp-recorded = The RSVP has been recorded! 130 + 131 + # Navigation and breadcrumbs 132 + nav-home = Home 133 + nav-events = Events 134 + nav-admin = Admin 135 + nav-denylist = Denylist 136 + 137 + # Common UI elements 138 + greeting = Hello 139 + timezone = timezone 140 + event-id = Event ID
+65
i18n/fr-ca/actions.ftl
··· 1 + # Boutons d'action et contrôles - Français canadien 2 + 3 + # Actions de base 4 + save-changes = Enregistrer les modifications 5 + cancel = Annuler 6 + delete = Supprimer 7 + edit = Modifier 8 + create = Créer 9 + add = Ajouter 10 + update = Mettre à jour 11 + remove = Retirer 12 + submit = Soumettre 13 + back = Retour 14 + next = Suivant 15 + previous = Précédent 16 + close = Fermer 17 + view = Voir 18 + loading = Chargement... 19 + 20 + # Actions spécifiques 21 + create-event = Créer un événement 22 + edit-event = Modifier l'événement 23 + view-event = Voir l'événement 24 + add-update-entry = Ajouter/Mettre à jour l'entrée 25 + remove-entry = Retirer 26 + follow = Suivre 27 + unfollow = Ne plus suivre 28 + login = Connexion 29 + logout = Déconnexion 30 + create-rsvp = Créer une réponse 31 + record-rsvp = Enregistrer la réponse 32 + 33 + # Actions administratives 34 + manage-handles = Gérer les identifiants connus 35 + manage-denylist = Gérer les identités bloquées 36 + view-events = Voir tous les événements triés par mises à jour récentes 37 + view-rsvps = Voir toutes les confirmations triées par mises à jour récentes 38 + 39 + # Actions d'événement 40 + planned = Planifié 41 + scheduled = Programmé 42 + cancelled = Annulé 43 + postponed = Reporté 44 + rescheduled = Reprogrammé 45 + 46 + # Options de statut pour les événements 47 + status-planned = Planifié 48 + status-active = Actif 49 + status-cancelled = Annulé 50 + 51 + # Options de statut pour les réponses 52 + status-going = J'y vais 53 + status-interested = Intéressé(e) 54 + status-not-going = Je n'y vais pas 55 + 56 + # Modes d'événement 57 + mode-in-person = En personne 58 + mode-virtual = Virtuel 59 + mode-hybrid = Hybride 60 + 61 + # Types de lieu 62 + location-type-venue = Lieu 63 + location-type-address = Adresse 64 + location-type-coordinates = Coordonnées 65 + location-type-virtual = Virtuel
+22 -1
i18n/fr-ca/errors.ftl
··· 1 - # Error messages - French (Canada) 1 + # Messages d'erreur et validation - Français canadien 2 + 3 + # Validation de formulaire 4 + validation-required = Ce champ est obligatoire 5 + validation-email = Veuillez entrer une adresse courriel valide 6 + validation-minlength = Doit contenir au moins {$min} caractères 7 + validation-maxlength = Doit contenir au plus {$max} caractères 8 + validation-name-length = Doit contenir au moins 10 caractères et au plus 500 caractères 9 + validation-description-length = Doit contenir au moins 10 caractères et au plus 3000 caractères 10 + 11 + # Messages d'erreur 12 + error-unknown = Erreur inconnue 13 + form-submit-error = Impossible de soumettre le formulaire 14 + profile-not-found = Profil non trouvé 15 + event-creation-failed = Échec de la création de l'événement 16 + event-update-failed = Échec de la mise à jour de l'événement 17 + 18 + # Texte d'aide 19 + help-subject-uri = URI du contenu à bloquer (URI at, DID, URL, domaines) 20 + help-reason-blocking = Raison du blocage de ce contenu 21 + 22 + # Error pages 2 23 error-404-title = Page non trouvée 3 24 error-404-message = La page que vous cherchez n'existe pas. 4 25 error-500-title = Erreur interne du serveur
+71
i18n/fr-ca/forms.ftl
··· 1 + # Étiquettes de formulaire, textes d'aide et d'espace réservé - Français canadien 2 + 3 + # Étiquettes des champs de formulaire 4 + label-name = Nom 5 + label-text = Texte 6 + label-description = Description 7 + label-subject = Sujet 8 + label-reason = Raison 9 + label-status = Statut 10 + label-display-name = Nom d'affichage 11 + label-handle = Identifiant 12 + label-email = Courriel 13 + label-password = Mot de passe 14 + label-location-name = Nom du lieu 15 + label-address = Adresse 16 + label-city = Ville 17 + label-state = Province 18 + label-zip = Code postal 19 + label-link-name = Nom du lien 20 + label-link-url = URL du lien 21 + label-timezone = Fuseau horaire 22 + label-start-day = Jour de début 23 + label-start-time = Heure de début 24 + label-end-day = Jour de fin 25 + label-end-time = Heure de fin 26 + label-starts-at = Commence à 27 + label-ends-at = Se termine à 28 + label-country = Pays 29 + label-street-address = Adresse civique 30 + label-locality = Localité 31 + label-region = Région 32 + label-postal-code = Code postal 33 + label-location = Lieu 34 + label-event-at-uri = URI AT de l'événement 35 + label-event-cid = CID de l'événement 36 + 37 + # Textes d'espace réservé 38 + placeholder-awesome-event = Mon événement formidable 39 + placeholder-event-description = Une description utile et brève de l'événement 40 + placeholder-at-uri = at://did:plc:... 41 + placeholder-reason-blocking = Raison du blocage... 42 + placeholder-handle = vous.bsky.social 43 + placeholder-tickets = Billets 44 + placeholder-tickets-url = https://smokesignal.tickets/ 45 + placeholder-venue-name = Le Gem City 46 + placeholder-address = 555 Quelque part 47 + placeholder-city = Dayton 48 + placeholder-state = Ohio 49 + placeholder-zip = 11111 50 + placeholder-at-uri-event = at://smokesignal.events/community.lexicon.calendar.event/formidable 51 + placeholder-at-uri-rsvp = at://did:plc:abc123/app.bsky.feed.post/record123 52 + placeholder-at-uri-admin = at://did:plc:abcdef/community.lexicon.calendar.rsvp/3jizzrxoalv2h 53 + 54 + # Texte d'aide 55 + help-name-length = Doit contenir au moins 10 caractères et au plus 500 caractères 56 + help-description-length = Doit contenir au moins 10 caractères et au plus 3000 caractères 57 + help-subject-uri = URI du contenu à bloquer (URI at, DIDs, URLs, domaines) 58 + help-reason-blocking = Raison de bloquer ce contenu 59 + help-rsvp-public = Les réponses sont publiques et peuvent être consultées par quiconque peut accéder aux informations stockées dans votre PDS. 60 + help-rsvp-learn-more = En savoir plus sur les réponses sur la 61 + help-rsvp-help-page = page d'aide aux réponses 62 + 63 + # Indicateurs de champs obligatoires 64 + required-field = (obligatoire) 65 + optional-field = (optionnel) 66 + 67 + # Heure et date 68 + not-set = Non défini 69 + add-end-time = Ajouter l'heure de fin 70 + remove-end-time = Supprimer l'heure de fin 71 + clear = Effacer
+56 -37
i18n/fr-ca/ui.ftl
··· 1 - # User interface elements - French (Canada) 2 - # Page titles 3 - page-title-home = Smoke Signal - Gestion d'événements 4 - page-title-events = Événements - Smoke Signal 5 - page-title-profile = Profil - Smoke Signal 6 - page-title-settings = Paramètres - Smoke Signal 7 - page-title-admin = Admin - Smoke Signal 1 + # Étiquettes et texte d'interface utilisateur - Français canadien 2 + 3 + # Titres de page et en-têtes 4 + page-title-admin = Administration 5 + page-title-admin-denylist = Administration - Liste de refus 6 + page-title-create-event = Créer un événement 7 + page-title-create-rsvp = Créer une réponse 8 + 9 + # En-têtes et contenu de page 10 + heading-admin = Administration 11 + heading-admin-denylist = Liste de refus 12 + heading-create-event = Créer un événement 13 + heading-create-rsvp = Créer une réponse 14 + 15 + # Messages de statut et de notification 16 + message-rsvp-recorded = La réponse a été enregistrée! 17 + 18 + # Navigation et fil d'Ariane 19 + nav-home = Accueil 20 + nav-events = Événements 21 + nav-profile = Profil 22 + nav-settings = Paramètres 23 + nav-admin = Administration 24 + nav-denylist = Liste de refus 25 + 26 + # Messages de contenu 27 + member-since = Membre depuis 28 + events-created = Événements créés 29 + events-count = Vous avez {$count -> 30 + [0] aucun événement 31 + [1] 1 événement 32 + *[other] {$count} événements 33 + } 34 + back-to-profile = Retour au profil 8 35 9 - # Buttons and actions 10 - follow-user = Suivre 11 - unfollow-user = Ne plus suivre 12 - rsvp-yes = RSVP Oui 13 - rsvp-no = RSVP Non 14 - rsvp-maybe = RSVP Peut-être 15 - share-event = Partager l'événement 16 - export-event = Exporter l'événement 17 - import-data = Importer des données 36 + # Messages de succès 37 + event-created-success = L'événement a été créé! 38 + event-updated-success = L'événement a été mis à jour! 18 39 19 - # Status messages 20 - event-created = Événement créé avec succès 21 - event-updated = Événement mis à jour avec succès 22 - event-deleted = Événement supprimé avec succès 23 - rsvp-confirmed = RSVP confirmé 24 - rsvp-cancelled = RSVP annulé 40 + # Messages informatifs 41 + events-public-notice = Les événements sont publics et peuvent être vus par toute personne qui peut voir les informations stockées dans votre PDS. Ne publiez pas d'informations personnelles ou sensibles dans vos événements. 42 + event-help-link = Aide sur les événements 25 43 26 - # Time and dates 27 - today = Aujourd'hui 28 - tomorrow = Demain 29 - yesterday = Hier 30 - this-week = Cette semaine 31 - next-week = La semaine prochaine 32 - last-week = La semaine dernière 44 + # Salutations tenant compte du genre 45 + profile-greeting = Bonjour 46 + profile-greeting-feminine = Bonjour madame 47 + profile-greeting-masculine = Bonjour monsieur 48 + profile-greeting-neutral = Bonjour 33 49 34 - # Notifications 35 - notification-new-event = Nouvel événement : {$title} 36 - notification-event-updated = Événement mis à jour : {$title} 37 - notification-rsvp-received = Nouveau RSVP pour {$title} 50 + welcome-user = Bienvenue {$name}! 51 + welcome-user-feminine = Bienvenue madame {$name}! 52 + welcome-user-masculine = Bienvenu monsieur {$name}! 53 + welcome-user-neutral = Bienvenue {$name}! 38 54 39 - # Gender variants for notifications 40 - notification-invited-masculine = Vous avez été invité monsieur 41 - notification-invited-feminine = Vous avez été invitée madame 42 - notification-invited-neutral = Vous avez été invité 55 + # Éléments d'interface commune 56 + greeting = Bonjour 57 + greeting-masculine = Bonjour 58 + greeting-feminine = Bonjour 59 + greeting-neutral = Bonjour 60 + timezone = fuseau horaire 61 + event-id = ID d'événement
+1438
strings_inventory.txt
··· 1 + templates/acknowledgement.en-us.bare.html:1:{% extends "bare.en-us.html" %} 2 + templates/acknowledgement.en-us.common.html:1:<section class="section"> 3 + templates/acknowledgement.en-us.common.html:2: <div class="container"> 4 + templates/acknowledgement.en-us.common.html:3: <h1 class="title is-1">Acknowledgement</h1> 5 + templates/acknowledgement.en-us.common.html:6:<section class="section py-3"> 6 + templates/acknowledgement.en-us.common.html:7: <div class="container content"> 7 + templates/acknowledgement.en-us.common.html:8: <h4 class="title is-4">What are smoke signals?</h4> 8 + templates/acknowledgement.en-us.common.html:16:<section class="section py-3"> 9 + templates/acknowledgement.en-us.common.html:17: <div class="container content"> 10 + templates/acknowledgement.en-us.common.html:18: <h4 class="title is-4">Why the name?</h4> 11 + templates/acknowledgement.en-us.common.html:27: the ability to create events and facilitate communication around those events, "Smoke Signal Events" felt 12 + templates/acknowledgement.en-us.common.html:32:<section class="section py-3"> 13 + templates/acknowledgement.en-us.common.html:33: <div class="container content"> 14 + templates/acknowledgement.en-us.common.html:34: <h4 class="title is-4">Land Acknowledgement</h4> 15 + templates/acknowledgement.en-us.common.html:36: The name "Smoke Signal" borrows from language and concepts that originate from indigenous people. 16 + templates/acknowledgement.en-us.common.html:45:<section class="section py-3"> 17 + templates/acknowledgement.en-us.common.html:46: <div class="container content"> 18 + templates/acknowledgement.en-us.common.html:47: <h4 class="title is-4">Learning More</h4> 19 + templates/acknowledgement.en-us.common.html:49: <li><a href="https://en.wikipedia.org/wiki/Miami_people">https://en.wikipedia.org/wiki/Miami_people</a></li> 20 + templates/acknowledgement.en-us.common.html:50: <li><a href="https://native-land.ca/maps/territories/miami/"> 21 + templates/acknowledgement.en-us.common.html:54: <li><a href="https://www.miamiindians.org/">https://www.miamiindians.org/</a></li> 22 + templates/acknowledgement.en-us.common.html:55: <li><a href="https://urbannativecollective.org/">https://urbannativecollective.org/</a></li> 23 + templates/acknowledgement.en-us.common.html:56: <li><a href="https://www.midstory.org/the-forgotten-history-of-ohios-indigenous-peoples"> 24 + templates/acknowledgement.en-us.html:1:{% extends "base.en-us.html" %} 25 + templates/admin.en-us.html:1:{% extends "base.en-us.html" %} 26 + templates/admin.en-us.html:5:<section class="section pb-0"> 27 + templates/admin.en-us.html:6: <div class="container"> 28 + templates/admin.en-us.html:7: <h1 class="title">Smoke Signal Admin</h1> 29 + templates/admin.en-us.html:8: <div class="content"> 30 + templates/admin.en-us.html:9: <div class="block"> 31 + templates/admin.en-us.html:10: <h2 class="subtitle">Administration Tools</h2> 32 + templates/admin.en-us.html:12: <li><a href="/admin/handles">Handle Records</a> - Manage known handles</li> 33 + templates/admin.en-us.html:13: <li><a href="/admin/denylist">Manage Denylist</a> - Manage blocked identities</li> 34 + templates/admin.en-us.html:14: <li><a href="/admin/events">Event Records</a> - View all events ordered by recent updates</li> 35 + templates/admin.en-us.html:15: <li><a href="/admin/rsvps">RSVP Records</a> - View all RSVPs ordered by recent updates</li> 36 + templates/admin_denylist.en-us.html:1:{% extends "base.en-us.html" %} 37 + templates/admin_denylist.en-us.html:6:<section class="section"> 38 + templates/admin_denylist.en-us.html:7: <div class="container"> 39 + templates/admin_denylist.en-us.html:8: <nav class="breadcrumb" aria-label="breadcrumbs"> 40 + templates/admin_denylist.en-us.html:10: <li><a href="/admin">Admin</a></li> 41 + templates/admin_denylist.en-us.html:11: <li class="is-active"><a href="#" aria-current="page">Denylist</a></li> 42 + templates/admin_denylist.en-us.html:16:<section class="section"> 43 + templates/admin_denylist.en-us.html:17: <div class="container"> 44 + templates/admin_denylist.en-us.html:18: <div class="content"> 45 + templates/admin_denylist.en-us.html:19: <h2 class="subtitle">Add or Update Entry</h2> 46 + templates/admin_denylist.en-us.html:20: <form action="/admin/denylist/add" method="POST"> 47 + templates/admin_denylist.en-us.html:21: <div class="field"> 48 + templates/admin_denylist.en-us.html:22: <label class="label">Subject</label> 49 + templates/admin_denylist.en-us.html:23: <div class="control"> 50 + templates/admin_denylist.en-us.html:24: <input class="input" type="text" placeholder="at://did:plc:..." name="subject" required> 51 + templates/admin_denylist.en-us.html:26: <p class="help">URI of the content to block (at URI, DIDs, URLs, domains)</p> 52 + templates/admin_denylist.en-us.html:29: <div class="field"> 53 + templates/admin_denylist.en-us.html:30: <label class="label">Reason</label> 54 + templates/admin_denylist.en-us.html:31: <div class="control"> 55 + templates/admin_denylist.en-us.html:32: <textarea class="textarea" placeholder="Reason for blocking..." name="reason" 56 + templates/admin_denylist.en-us.html:35: <p class="help">Reason for blocking this content</p> 57 + templates/admin_denylist.en-us.html:38: <div class="field"> 58 + templates/admin_denylist.en-us.html:39: <div class="control"> 59 + templates/admin_denylist.en-us.html:40: <button type="submit" class="button is-primary">Add/Update Entry</button> 60 + templates/admin_denylist.en-us.html:47:<section class="section"> 61 + templates/admin_denylist.en-us.html:48: <div class="container"> 62 + templates/admin_denylist.en-us.html:49: <div class="content"> 63 + templates/admin_denylist.en-us.html:50: <table class="table is-fullwidth"> 64 + templates/admin_denylist.en-us.html:66: <form action="/admin/denylist/remove" method="POST"> 65 + templates/admin_denylist.en-us.html:67: <input type="hidden" name="subject" value="{{ entry.subject }}"> 66 + templates/admin_denylist.en-us.html:68: <button type="submit" class="button is-small is-danger">Remove</button> 67 + templates/admin_denylist.en-us.html:77: {{ view_pagination((canonical_url ~ "?"), pagination) }} 68 + templates/admin_event.en-us.html:1:{% extends "base.en-us.html" %} 69 + templates/admin_event.en-us.html:13:<section class="section"> 70 + templates/admin_event.en-us.html:14: <div class="container"> 71 + templates/admin_event.en-us.html:15: <nav class="breadcrumb" aria-label="breadcrumbs"> 72 + templates/admin_event.en-us.html:17: <li><a href="/admin">Admin</a></li> 73 + templates/admin_event.en-us.html:18: <li><a href="/admin/events">Events</a></li> 74 + templates/admin_event.en-us.html:19: <li class="is-active"><a href="#" aria-current="page">Event Record</a></li> 75 + templates/admin_event.en-us.html:24:<section class="section"> 76 + templates/admin_event.en-us.html:25: <div class="container"> 77 + templates/admin_event.en-us.html:26: <div class="content"> 78 + templates/admin_event.en-us.html:27: <h1 class="title">Event Record</h1> 79 + templates/admin_event.en-us.html:28: <div class="box"> 80 + templates/admin_events.en-us.html:1:{% extends "base.en-us.html" %} 81 + templates/admin_events.en-us.html:6:<section class="section"> 82 + templates/admin_events.en-us.html:7: <div class="container"> 83 + templates/admin_events.en-us.html:8: <nav class="breadcrumb" aria-label="breadcrumbs"> 84 + templates/admin_events.en-us.html:10: <li><a href="/admin">Admin</a></li> 85 + templates/admin_events.en-us.html:11: <li class="is-active"><a href="#" aria-current="page">Events</a></li> 86 + templates/admin_events.en-us.html:16:<section class="section"> 87 + templates/admin_events.en-us.html:17: <div class="container"> 88 + templates/admin_events.en-us.html:18: <div class="content"> 89 + templates/admin_events.en-us.html:19: <h1 class="title">Event Records ({{ total_count }})</h1> 90 + templates/admin_events.en-us.html:20: <p class="subtitle">View all events ordered by recent updates</p> 91 + templates/admin_events.en-us.html:22: <div class="box mb-5"> 92 + templates/admin_events.en-us.html:23: <h2 class="title is-4">Import Event by AT-URI</h2> 93 + templates/admin_events.en-us.html:24: <form action="/admin/events/import" method="post"> 94 + templates/admin_events.en-us.html:25: <div class="field"> 95 + templates/admin_events.en-us.html:26: <label class="label" for="importAtUriInput">AT-URI</label> 96 + templates/admin_events.en-us.html:27: <div class="control has-icons-left"> 97 + templates/admin_events.en-us.html:28: <input class="input" type="text" id="importAtUriInput" name="aturi" required="required" 98 + templates/admin_events.en-us.html:29: placeholder="at://did:plc:abc123/app.bsky.feed.post/record123"> 99 + templates/admin_events.en-us.html:30: <span class="icon is-small is-left"> 100 + templates/admin_events.en-us.html:31: <i class="fas fa-link"></i> 101 + templates/admin_events.en-us.html:34: <p class="help">Enter the full AT-URI of the event to import</p> 102 + templates/admin_events.en-us.html:36: <div class="field"> 103 + templates/admin_events.en-us.html:37: <div class="control"> 104 + templates/admin_events.en-us.html:38: <button type="submit" class="button is-primary">Import Event</button> 105 + templates/admin_events.en-us.html:44: <table class="table is-fullwidth"> 106 + templates/admin_events.en-us.html:55: <td><a href="/admin/event?aturi={{ event.aturi }}">{{ event.aturi }}</a></td> 107 + templates/admin_events.en-us.html:58: <div class="buttons"> 108 + templates/admin_events.en-us.html:59: <a href="/admin/event?aturi={{ event.aturi }}" class="button is-small is-info"> 109 + templates/admin_events.en-us.html:70: {{ view_pagination((canonical_url ~ "?"), pagination) }} 110 + templates/admin_handles.en-us.html:1:{% extends "base.en-us.html" %} 111 + templates/admin_handles.en-us.html:6:<section class="section"> 112 + templates/admin_handles.en-us.html:7: <div class="container"> 113 + templates/admin_handles.en-us.html:8: <nav class="breadcrumb" aria-label="breadcrumbs"> 114 + templates/admin_handles.en-us.html:10: <li><a href="/admin">Admin</a></li> 115 + templates/admin_handles.en-us.html:11: <li class="is-active"><a href="#" aria-current="page">Handles</a></li> 116 + templates/admin_handles.en-us.html:16:<section class="section"> 117 + templates/admin_handles.en-us.html:17: <div class="container"> 118 + templates/admin_handles.en-us.html:18: <div class="content"> 119 + templates/admin_handles.en-us.html:19: <h1 class="title">Handle Records ({{ total_count }})</h1> 120 + templates/admin_handles.en-us.html:20: <p class="subtitle">View known handles</p> 121 + templates/admin_handles.en-us.html:22: <table class="table is-fullwidth"> 122 + templates/admin_handles.en-us.html:37: <td><a href="/{{ handle.did }}">{{ handle.did }}</a></td> 123 + templates/admin_handles.en-us.html:44: <button class="button is-danger is-small" 124 + templates/admin_handles.en-us.html:45: hx-post="/admin/handles/nuke/{{ handle.did }}" 125 + templates/admin_handles.en-us.html:46: hx-confirm="Are you sure you want to nuke this identity? This will delete all records and add the handle, PDS, and DID to the denylist." 126 + templates/admin_handles.en-us.html:47: hx-target="body" 127 + templates/admin_handles.en-us.html:49: data-loading-class="is-loading"> 128 + templates/admin_handles.en-us.html:59: {{ view_pagination((canonical_url ~ "?"), pagination) }} 129 + templates/admin_rsvp.en-us.html:1:{% extends "base.en-us.html" %} 130 + templates/admin_rsvp.en-us.html:13:<section class="section"> 131 + templates/admin_rsvp.en-us.html:14: <div class="container"> 132 + templates/admin_rsvp.en-us.html:15: <nav class="breadcrumb" aria-label="breadcrumbs"> 133 + templates/admin_rsvp.en-us.html:17: <li><a href="/admin">Admin</a></li> 134 + templates/admin_rsvp.en-us.html:18: <li><a href="/admin/rsvps">RSVPs</a></li> 135 + templates/admin_rsvp.en-us.html:19: <li class="is-active"><a href="#" aria-current="page">RSVP Record</a></li> 136 + templates/admin_rsvp.en-us.html:24:<section class="section"> 137 + templates/admin_rsvp.en-us.html:25: <div class="container"> 138 + templates/admin_rsvp.en-us.html:26: <div class="content"> 139 + templates/admin_rsvp.en-us.html:27: <h1 class="title">RSVP Record</h1> 140 + templates/admin_rsvp.en-us.html:29: <div class="columns"> 141 + templates/admin_rsvp.en-us.html:30: <div class="column is-half"> 142 + templates/admin_rsvp.en-us.html:31: <div class="box"> 143 + templates/admin_rsvp.en-us.html:32: <h2 class="subtitle">RSVP Details</h2> 144 + templates/admin_rsvp.en-us.html:33: <table class="table is-fullwidth"> 145 + templates/admin_rsvp.en-us.html:45: <td><a href="/{{ rsvp.did }}"><code>{{ rsvp.did }}</code></a></td> 146 + templates/admin_rsvp.en-us.html:57: <td><a href="/admin/event?aturi={{ rsvp.event_aturi }}"><code>{{ rsvp.event_aturi }}</code></a></td> 147 + templates/admin_rsvp.en-us.html:71: <div class="column is-half"> 148 + templates/admin_rsvp.en-us.html:72: <div class="box"> 149 + templates/admin_rsvp.en-us.html:73: <h2 class="subtitle">RSVP JSON</h2> 150 + templates/admin_rsvps.en-us.html:1:{% extends "base.en-us.html" %} 151 + templates/admin_rsvps.en-us.html:6:<section class="section"> 152 + templates/admin_rsvps.en-us.html:7: <div class="container"> 153 + templates/admin_rsvps.en-us.html:8: <nav class="breadcrumb" aria-label="breadcrumbs"> 154 + templates/admin_rsvps.en-us.html:10: <li><a href="/admin">Admin</a></li> 155 + templates/admin_rsvps.en-us.html:11: <li class="is-active"><a href="#" aria-current="page">RSVPs</a></li> 156 + templates/admin_rsvps.en-us.html:17:<section class="section"> 157 + templates/admin_rsvps.en-us.html:18: <div class="container"> 158 + templates/admin_rsvps.en-us.html:19: <div class="content"> 159 + templates/admin_rsvps.en-us.html:20: <h1 class="title">RSVP Records ({{ total_count }})</h1> 160 + templates/admin_rsvps.en-us.html:21: <p class="subtitle">View all RSVPs ordered by recent updates</p> 161 + templates/admin_rsvps.en-us.html:24: <article class="message is-success"> 162 + templates/admin_rsvps.en-us.html:25: <div class="message-body"> 163 + templates/admin_rsvps.en-us.html:26: <span class="icon-text"> 164 + templates/admin_rsvps.en-us.html:27: <span class="icon"> 165 + templates/admin_rsvps.en-us.html:28: <i class="fas fa-check-circle"></i> 166 + templates/admin_rsvps.en-us.html:30: <span>RSVP imported successfully! <a href="/admin/rsvp?aturi={{ imported_aturi }}">View RSVP</a></span> 167 + templates/admin_rsvps.en-us.html:36: <div class="box"> 168 + templates/admin_rsvps.en-us.html:37: <h2 class="subtitle">Import RSVP</h2> 169 + templates/admin_rsvps.en-us.html:38: <form method="post" action="/admin/rsvps/import"> 170 + templates/admin_rsvps.en-us.html:39: <div class="field"> 171 + templates/admin_rsvps.en-us.html:40: <label class="label">RSVP AT-URI</label> 172 + templates/admin_rsvps.en-us.html:41: <div class="control"> 173 + templates/admin_rsvps.en-us.html:42: <input class="input" type="text" name="aturi" placeholder="at://did:plc:abcdef/community.lexicon.calendar.rsvp/3jizzrxoalv2h" required> 174 + templates/admin_rsvps.en-us.html:44: <p class="help">Enter the AT-URI of an RSVP to import - supports both "community.lexicon.calendar.rsvp" and "events.smokesignal.calendar.rsvp" collections</p> 175 + templates/admin_rsvps.en-us.html:46: <div class="field"> 176 + templates/admin_rsvps.en-us.html:47: <div class="control"> 177 + templates/admin_rsvps.en-us.html:48: <button class="button is-primary" type="submit">Import RSVP</button> 178 + templates/admin_rsvps.en-us.html:54: <table class="table is-fullwidth"> 179 + templates/admin_rsvps.en-us.html:67: <td><a href="/admin/rsvp?aturi={{ rsvp.aturi }}">{{ rsvp.aturi }}</a></td> 180 + templates/admin_rsvps.en-us.html:68: <td><a href="/admin/event?aturi={{ rsvp.event_aturi }}">{{ rsvp.event_aturi }}</a></td> 181 + templates/admin_rsvps.en-us.html:72: <div class="buttons"> 182 + templates/admin_rsvps.en-us.html:73: <a href="/admin/rsvp?aturi={{ rsvp.aturi }}" class="button is-small is-info"> 183 + templates/admin_rsvps.en-us.html:84: {{ view_pagination((canonical_url ~ "?"), pagination) }} 184 + templates/alert.en-us.bare.html:1:{% extends "bare.en-us.html" %} 185 + templates/alert.en-us.bare.html:3:<section class="section"> 186 + templates/alert.en-us.bare.html:4: <div class="container"> 187 + templates/alert.en-us.html:1:{% extends "base.en-us.html" %} 188 + templates/alert.en-us.html:5:<section class="section"> 189 + templates/alert.en-us.html:6: <div class="container"> 190 + templates/alert.en-us.partial.html:1:<article class="message is-{{ message_type | default("danger") }}"> 191 + templates/alert.en-us.partial.html:3: <div class="message-header"> 192 + templates/alert.en-us.partial.html:7: <div class="message-body"> 193 + templates/base.en-us.html:2:<html lang="en"> 194 + templates/base.en-us.html:4: <meta charset="utf-8"> 195 + templates/base.en-us.html:5: <meta http-equiv="X-UA-Compatible" content="IE=edge"> 196 + templates/base.en-us.html:6: <meta name="viewport" content="width=device-width, initial-scale=1"> 197 + templates/base.en-us.html:9: <link rel="canonical" href="{{ canonical_url }}"> 198 + templates/base.en-us.html:11: <link rel="stylesheet" href="/static/fontawesome.min.css"> 199 + templates/base.en-us.html:12: <link rel="stylesheet" href="/static/bulma.min.css"> 200 + templates/base.en-us.html:13: <script src="/static/htmx.js"></script> 201 + templates/base.en-us.html:14: <script src="/static/loading-states.js"></script> 202 + templates/base.en-us.html:15: <script src="/static/sse.js"></script> 203 + templates/base.en-us.html:16: <script src="/static/site.js"></script> 204 + templates/base.en-us.html:19: <meta name="theme-color" content="#00d1b2"> 205 + templates/base.en-us.html:21:<body hx-ext="loading-states"> 206 + templates/cookie-policy.en-us.bare.html:1:{% extends "bare.en-us.html" %} 207 + templates/cookie-policy.en-us.common.html:1:<section class="section"> 208 + templates/cookie-policy.en-us.common.html:2: <div class="container"> 209 + templates/cookie-policy.en-us.common.html:3: <h1 class="title is-1">Cookie Policy</h1> 210 + templates/cookie-policy.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 211 + templates/cookie-policy.en-us.common.html:7:<section class="section py-3"> 212 + templates/cookie-policy.en-us.common.html:8: <div class="container content"> 213 + templates/cookie-policy.en-us.common.html:9: <h4 class="title is-4">Service Description</h4> 214 + templates/cookie-policy.en-us.common.html:11: Smoke Signal ("we", "us", or "our") is an event and RSVP management application built on top of the 215 + templates/cookie-policy.en-us.common.html:13: <a href="https://smokesignal.events/">https://smokesignal.events</a> (the "Site"). 216 + templates/cookie-policy.en-us.common.html:17:<section class="section py-3"> 217 + templates/cookie-policy.en-us.common.html:18: <div class="container content"> 218 + templates/cookie-policy.en-us.common.html:19: <h4 class="title is-4">What Are Cookies?</h4> 219 + templates/cookie-policy.en-us.common.html:27:<section class="section py-3"> 220 + templates/cookie-policy.en-us.common.html:28: <div class="container content"> 221 + templates/cookie-policy.en-us.common.html:29: <h4 class="title is-4">How We Use Cookies</h4> 222 + templates/cookie-policy.en-us.common.html:36:<section class="section py-3"> 223 + templates/cookie-policy.en-us.common.html:37: <div class="container content"> 224 + templates/cookie-policy.en-us.common.html:38: <h4 class="title is-4">Types of Cookies We Use</h4> 225 + templates/cookie-policy.en-us.common.html:39: <h5 class="title is-5">1. Essential Cookies</h5> 226 + templates/cookie-policy.en-us.common.html:51: <h5 class="title is-5">2. Functional Cookies</h5> 227 + templates/cookie-policy.en-us.common.html:62:<section class="section py-3"> 228 + templates/cookie-policy.en-us.common.html:63: <div class="container content"> 229 + templates/cookie-policy.en-us.common.html:64: <h4 class="title is-4">What We Don't Use</h4> 230 + templates/cookie-policy.en-us.common.html:75:<section class="section py-3"> 231 + templates/cookie-policy.en-us.common.html:76: <div class="container content"> 232 + templates/cookie-policy.en-us.common.html:77: <h4 class="title is-4">Changes to This Cookie Policy</h4> 233 + templates/cookie-policy.en-us.html:1:{% extends "base.en-us.html" %} 234 + templates/create_event.countries_datalist.html:1:<datalist id="locations_country_data"> 235 + templates/create_event.countries_datalist.html:3: <option value="{{ code }}">{{ name }}</option> 236 + templates/create_event.en-us.bare.html:1:{% extends "bare.en-us.html" %} 237 + templates/create_event.en-us.common.html:1:{% from "form_include.html" import text_input %} 238 + templates/create_event.en-us.common.html:2:<section class="section is-fullheight"> 239 + templates/create_event.en-us.common.html:3: <div class="container "> 240 + templates/create_event.en-us.common.html:5: <div class="box content"> 241 + templates/create_event.en-us.common.html:9: <article class="message is-info"> 242 + templates/create_event.en-us.common.html:10: <div class="message-body"> 243 + templates/create_event.en-us.common.html:17: <a href="https://docs.smokesignal.events/docs/help/events/" rel="help"> 244 + templates/create_event.en-us.html:1:{% extends "base.en-us.html" %} 245 + templates/create_event.en-us.link_form.html:1:{% from "form_include.html" import text_input, text_input_display %} 246 + templates/create_event.en-us.link_form.html:2:<div id="linksGroup" class="field py-5"> 247 + templates/create_event.en-us.link_form.html:3: <div class="control"> 248 + templates/create_event.en-us.link_form.html:7: {% if link_form.build_state == "Selecting" %} 249 + templates/create_event.en-us.link_form.html:8: <div id="linksGroupModal" class="modal is-active" tabindex="-1"> 250 + templates/create_event.en-us.link_form.html:9: <div class="modal-background"></div> 251 + templates/create_event.en-us.link_form.html:10: <div class="modal-content"> 252 + templates/create_event.en-us.link_form.html:11: <div class="box"> 253 + templates/create_event.en-us.link_form.html:13: value=link_form.link_name, error=link_form.link_name_error, extra='placeholder="Tickets"') }} 254 + templates/create_event.en-us.link_form.html:17: extra='placeholder="https://smokesignal.tickets/"') }} 255 + templates/create_event.en-us.link_form.html:19: <div class="field is-grouped pt-4"> 256 + templates/create_event.en-us.link_form.html:20: <p class="control"> 257 + templates/create_event.en-us.link_form.html:21: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" 258 + templates/create_event.en-us.link_form.html:22: hx-trigger="click" hx-params="build_state,link_name,link_value" 259 + templates/create_event.en-us.link_form.html:23: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 260 + templates/create_event.en-us.link_form.html:25: <p class="control"> 261 + templates/create_event.en-us.link_form.html:26: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" 262 + templates/create_event.en-us.link_form.html:27: hx-trigger="click" hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 263 + templates/create_event.en-us.link_form.html:28: class="button is-danger">Cancel</button> 264 + templates/create_event.en-us.link_form.html:33: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 265 + templates/create_event.en-us.link_form.html:34: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 266 + templates/create_event.en-us.link_form.html:35: aria-label="close"></button> 267 + templates/create_event.en-us.link_form.html:37: {% elif (link_form.build_state == "Selected") %} 268 + templates/create_event.en-us.link_form.html:43: <div class="field is-grouped"> 269 + templates/create_event.en-us.link_form.html:44: <p class="control"> 270 + templates/create_event.en-us.link_form.html:45: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 271 + templates/create_event.en-us.link_form.html:46: hx-params="build_state,link_name,link_value" hx-vals='{ "build_state": "Selecting" }' 272 + templates/create_event.en-us.link_form.html:47: class="button is-link is-outlined">Edit</button> 273 + templates/create_event.en-us.link_form.html:49: <p class="control"> 274 + templates/create_event.en-us.link_form.html:50: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 275 + templates/create_event.en-us.link_form.html:51: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 276 + templates/create_event.en-us.link_form.html:55: <input hidden type="text" name="link_name" value="{{ link_form.link_name }}"> 277 + templates/create_event.en-us.link_form.html:58: <input hidden type="text" name="link_value" value="{{ link_form.link_value }}"> 278 + templates/create_event.en-us.link_form.html:60: {% elif link_form.build_state == "Reset" %} 279 + templates/create_event.en-us.link_form.html:64: <div class="field"> 280 + templates/create_event.en-us.link_form.html:65: <p class="control"> 281 + templates/create_event.en-us.link_form.html:66: <button hx-post="/event/links" hx-target="#linksGroup" hx-swap="outerHTML" hx-trigger="click" 282 + templates/create_event.en-us.link_form.html:67: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 283 + templates/create_event.en-us.link_form.html:68: class="button is-link is-outlined">Edit</button> 284 + templates/create_event.en-us.location_form.html:1:{% from "form_include.html" import text_input, text_input_display %} 285 + templates/create_event.en-us.location_form.html:2:<div id="locationGroup" class="field"> 286 + templates/create_event.en-us.location_form.html:3: <div class="control"> 287 + templates/create_event.en-us.location_form.html:7: {% if location_form.build_state == "Selecting" %} 288 + templates/create_event.en-us.location_form.html:8: <div id="locationModal" class="modal is-active" tabindex="-1"> 289 + templates/create_event.en-us.location_form.html:9: <div class="modal-background"></div> 290 + templates/create_event.en-us.location_form.html:10: <div class="modal-content"> 291 + templates/create_event.en-us.location_form.html:11: <div class="box"> 292 + templates/create_event.en-us.location_form.html:12: <div class="field"> 293 + templates/create_event.en-us.location_form.html:13: <label class="label" for="createEventLocationCountryInput">Country (required)</label> 294 + templates/create_event.en-us.location_form.html:14: <div class="control"> 295 + templates/create_event.en-us.location_form.html:15: <div class="select"> 296 + templates/create_event.en-us.location_form.html:16: <input class="input" id="createEventLocationCountryInput" name="location_country" 297 + templates/create_event.en-us.location_form.html:17: list="locations_country_data" {% if location_form.location_country %} 298 + templates/create_event.en-us.location_form.html:18: value="{{ location_form.location_country }}" {% endif %} autocomplete="off" 299 + templates/create_event.en-us.location_form.html:19: data-1p-ignore hx-get="/event/location/datalist" hx-target="#locations_country_data" 300 + templates/create_event.en-us.location_form.html:20: hx-trigger="keyup[checkUserKeydown.call(this, event)] changed delay:50ms, load" /> 301 + templates/create_event.en-us.location_form.html:21: <datalist id="locations_country_data"> 302 + templates/create_event.en-us.location_form.html:22: <option value="US">United States of America</option> 303 + templates/create_event.en-us.location_form.html:23: <option value="GB">United Kingdom</option> 304 + templates/create_event.en-us.location_form.html:24: <option value="MX">Mexico</option> 305 + templates/create_event.en-us.location_form.html:25: <option value="CA">Canada</option> 306 + templates/create_event.en-us.location_form.html:26: <option value="DE">Germany</option> 307 + templates/create_event.en-us.location_form.html:31: <p class="help is-danger">{{ location_form.location_country_error }}</p> 308 + templates/create_event.en-us.location_form.html:37: extra='autocomplete="off" data-1p-ignore placeholder="The Gem City"') }} 309 + templates/create_event.en-us.location_form.html:41: extra='autocomplete="off" data-1p-ignore placeholder="555 Somewhere"') }} 310 + templates/create_event.en-us.location_form.html:43: {{ text_input('Locality ("City", optional)', 'locationAddressLocality', 'location_locality', 311 + templates/create_event.en-us.location_form.html:45: extra='autocomplete="off" data-1p-ignore placeholder="Dayton"') }} 312 + templates/create_event.en-us.location_form.html:47: {{ text_input('Region ("State", optional)', 'locationAddressRegion', 'location_region', 313 + templates/create_event.en-us.location_form.html:49: extra='autocomplete="off" data-1p-ignore placeholder="Ohio"') }} 314 + templates/create_event.en-us.location_form.html:53: extra='autocomplete="off" data-1p-ignore placeholder="11111"') }} 315 + templates/create_event.en-us.location_form.html:55: <div class="field is-grouped pt-4"> 316 + templates/create_event.en-us.location_form.html:56: <p class="control"> 317 + templates/create_event.en-us.location_form.html:57: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 318 + templates/create_event.en-us.location_form.html:58: hx-trigger="click" 319 + templates/create_event.en-us.location_form.html:59: hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 320 + templates/create_event.en-us.location_form.html:60: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 321 + templates/create_event.en-us.location_form.html:65: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 322 + templates/create_event.en-us.location_form.html:66: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 323 + templates/create_event.en-us.location_form.html:67: aria-label="close"></button> 324 + templates/create_event.en-us.location_form.html:69: {% elif (location_form.build_state == "Selected") %} 325 + templates/create_event.en-us.location_form.html:83: <div class="field is-grouped"> 326 + templates/create_event.en-us.location_form.html:84: <p class="control"> 327 + templates/create_event.en-us.location_form.html:85: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 328 + templates/create_event.en-us.location_form.html:86: hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 329 + templates/create_event.en-us.location_form.html:87: hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" data-bs-target="startAtModal" 330 + templates/create_event.en-us.location_form.html:88: class="button is-link is-outlined">Edit</button> 331 + templates/create_event.en-us.location_form.html:90: <p class="control"> 332 + templates/create_event.en-us.location_form.html:91: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 333 + templates/create_event.en-us.location_form.html:92: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 334 + templates/create_event.en-us.location_form.html:93: class="button is-danger is-outlined">Clear</button> 335 + templates/create_event.en-us.location_form.html:97: <input hidden type="text" name="location_country" value="{{ location_form.location_country }}"> 336 + templates/create_event.en-us.location_form.html:100: <input hidden type="text" name="location_name" value="{{ location_form.location_name }}"> 337 + templates/create_event.en-us.location_form.html:103: <input hidden type="text" name="location_street" value="{{ location_form.location_street }}"> 338 + templates/create_event.en-us.location_form.html:106: <input hidden type="text" name="location_locality" value="{{ location_form.location_locality }}"> 339 + templates/create_event.en-us.location_form.html:109: <input hidden type="text" name="location_region" value="{{ location_form.location_region }}"> 340 + templates/create_event.en-us.location_form.html:112: <input hidden type="text" name="location_postal_code" value="{{ location_form.location_postal_code }}"> 341 + templates/create_event.en-us.location_form.html:114: {% elif location_form.build_state == "Reset" %} 342 + templates/create_event.en-us.location_form.html:115: <div class="field"> 343 + templates/create_event.en-us.location_form.html:116: <div class="field-body is-align-items-end"> 344 + templates/create_event.en-us.location_form.html:117: <div class="field"> 345 + templates/create_event.en-us.location_form.html:118: <label class="label" for="createEventLocationCountryInput">Location</label> 346 + templates/create_event.en-us.location_form.html:119: <div class="control"> 347 + templates/create_event.en-us.location_form.html:120: <input id="createEventLocationCountryInput" type="text" class="input is-static" value="Not Set" 348 + templates/create_event.en-us.location_form.html:124: <div class="field"> 349 + templates/create_event.en-us.location_form.html:125: <p class="control"> 350 + templates/create_event.en-us.location_form.html:126: <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 351 + templates/create_event.en-us.location_form.html:127: hx-trigger="click" 352 + templates/create_event.en-us.location_form.html:128: hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 353 + templates/create_event.en-us.location_form.html:129: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 354 + templates/create_event.en-us.location_form.html:137:{# {% from "form_include.html" import text_input %} 355 + templates/create_event.en-us.location_form.html:138:<div id="locationsGroup" class="field py-5"> 356 + templates/create_event.en-us.location_form.html:139: <div class="control"> 357 + templates/create_event.en-us.location_form.html:140: {% if location_form.build_state == "Selecting" %} 358 + templates/create_event.en-us.location_form.html:141: <div id="locationsGroupModal" class="modal is-active" tabindex="-1"> 359 + templates/create_event.en-us.location_form.html:142: <div class="modal-background"></div> 360 + templates/create_event.en-us.location_form.html:143: <div class="modal-content"> 361 + templates/create_event.en-us.location_form.html:144: <div class="box"> 362 + templates/create_event.en-us.location_form.html:151: extra='placeholder="555 Somewhere"') }} 363 + templates/create_event.en-us.location_form.html:153: <div class="field"> 364 + templates/create_event.en-us.location_form.html:154: <div class="field-body"> 365 + templates/create_event.en-us.location_form.html:155: {{ text_input('Locality ("City", optional)', 'locationAddressLocality', 'location_locality', 366 + templates/create_event.en-us.location_form.html:157: extra='placeholder="Dayton"') }} 367 + templates/create_event.en-us.location_form.html:159: {{ text_input('Region ("State", optional)', 'locationAddressRegion', 'location_region', 368 + templates/create_event.en-us.location_form.html:161: extra='placeholder="Ohio"') }} 369 + templates/create_event.en-us.location_form.html:165: extra='placeholder="11111"') }} 370 + templates/create_event.en-us.location_form.html:169: <div class="field is-grouped pt-4"> 371 + templates/create_event.en-us.location_form.html:170: <p class="control"> 372 + templates/create_event.en-us.location_form.html:171: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" 373 + templates/create_event.en-us.location_form.html:172: hx-trigger="click" 374 + templates/create_event.en-us.location_form.html:173: hx-params="build_state,location_name,location_street,location_locality,location_region,location_postal_code,location_country" 375 + templates/create_event.en-us.location_form.html:174: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 376 + templates/create_event.en-us.location_form.html:176: <p class="control"> 377 + templates/create_event.en-us.location_form.html:177: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" 378 + templates/create_event.en-us.location_form.html:178: hx-trigger="click" hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 379 + templates/create_event.en-us.location_form.html:179: class="button is-danger">Cancel</button> 380 + templates/create_event.en-us.location_form.html:184: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 381 + templates/create_event.en-us.location_form.html:185: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 382 + templates/create_event.en-us.location_form.html:186: aria-label="close"></button> 383 + templates/create_event.en-us.location_form.html:188: {% elif (location_form.build_state == "Selected") %} 384 + templates/create_event.en-us.location_form.html:191: error=location_form.location_name_error, class_extra=" is-static", extra=' readonly ') }} 385 + templates/create_event.en-us.location_form.html:195: error=location_form.location_street_error, class_extra=" is-static", extra=' readonly ') }} 386 + templates/create_event.en-us.location_form.html:197: <div class="field"> 387 + templates/create_event.en-us.location_form.html:198: <div class="field-body"> 388 + templates/create_event.en-us.location_form.html:201: error=location_form.location_locality_error, class_extra=" is-static", extra=' readonly ') }} 389 + templates/create_event.en-us.location_form.html:205: error=location_form.location_region_error, class_extra=" is-static", extra=' readonly ') }} 390 + templates/create_event.en-us.location_form.html:209: error=location_form.location_postal_code_error, class_extra=" is-static", extra=' readonly ') }} 391 + templates/create_event.en-us.location_form.html:212: <div class="field is-grouped"> 392 + templates/create_event.en-us.location_form.html:213: <p class="control"> 393 + templates/create_event.en-us.location_form.html:214: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 394 + templates/create_event.en-us.location_form.html:215: hx-params="build_state,location_name,location_street,location_locality,location_region,location_postal_code,location_country" 395 + templates/create_event.en-us.location_form.html:216: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 396 + templates/create_event.en-us.location_form.html:218: <p class="control"> 397 + templates/create_event.en-us.location_form.html:219: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 398 + templates/create_event.en-us.location_form.html:220: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 399 + templates/create_event.en-us.location_form.html:223: {% elif location_form.build_state == "Reset" %} 400 + templates/create_event.en-us.location_form.html:228: <div class="field"> 401 + templates/create_event.en-us.location_form.html:229: <p class="control"> 402 + templates/create_event.en-us.location_form.html:230: <button hx-post="/event/locations" hx-target="#locationsGroup" hx-swap="outerHTML" hx-trigger="click" 403 + templates/create_event.en-us.location_form.html:231: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 404 + templates/create_event.en-us.location_form.html:232: class="button is-link is-outlined">Edit</button> 405 + templates/create_event.en-us.partial.html:2:<article class="message is-success"> 406 + templates/create_event.en-us.partial.html:3: <div class="message-header"> 407 + templates/create_event.en-us.partial.html:10: <div class="message-body"> 408 + templates/create_event.en-us.partial.html:11: <p class="buttons"> 409 + templates/create_event.en-us.partial.html:12: <a class="button" href="{{ event_url }}"> 410 + templates/create_event.en-us.partial.html:13: <span class="icon"> 411 + templates/create_event.en-us.partial.html:14: <i class="fas fa-file"></i> 412 + templates/create_event.en-us.partial.html:23:{% from "form_include.html" import text_input %} 413 + templates/create_event.en-us.partial.html:24:<form hx-post="{{ submit_url }}" hx-swap="outerHTML" class="my-5"> 414 + templates/create_event.en-us.partial.html:26: {% if build_event_form.build_state == "Reset" %} 415 + templates/create_event.en-us.partial.html:27: <input type="hidden" name="build_state" value="Selecting"> 416 + templates/create_event.en-us.partial.html:28: {% elif build_event_form.build_state == "Selecting" %} 417 + templates/create_event.en-us.partial.html:29: <input type="hidden" name="build_state" value="Selected"> 418 + templates/create_event.en-us.partial.html:30: {% elif build_event_form.build_state == "Selected" %} 419 + templates/create_event.en-us.partial.html:31: <input type="hidden" name="build_state" value="Selected"> 420 + templates/create_event.en-us.partial.html:35: <div class="field"> 421 + templates/create_event.en-us.partial.html:36: <label class="label" for="createEventNameInput">Name (required)</label> 422 + templates/create_event.en-us.partial.html:37: <div class="control {% if build_event_form.name_error %} has-icons-right{% endif %}" 423 + templates/create_event.en-us.partial.html:38: data-loading-class="is-loading"> 424 + templates/create_event.en-us.partial.html:39: <input type="text" class="input {% if build_event_form.name_error %} is-danger{% endif %}" 425 + templates/create_event.en-us.partial.html:40: id="createEventNameInput" name="name" minlength="10" maxlength="500" placeholder="My Awesome Event" {% 426 + templates/create_event.en-us.partial.html:41: if build_event_form.name %}value="{{ build_event_form.name }}" {% endif %} required 427 + templates/create_event.en-us.partial.html:45: <p class="help is-danger">{{ build_event_form.name_error }}</p> 428 + templates/create_event.en-us.partial.html:47: <p class="help">Must be at least 10 characters and no more than 500 characters.</p> 429 + templates/create_event.en-us.partial.html:51: <div class="field"> 430 + templates/create_event.en-us.partial.html:52: <label class="label" for="createEventTextInput">Text (required)</label> 431 + templates/create_event.en-us.partial.html:53: <div class="control"> 432 + templates/create_event.en-us.partial.html:54: <textarea class="textarea{% if build_event_form.description_error %} is-danger{% endif %}" 433 + templates/create_event.en-us.partial.html:55: id="createEventTextInput" name="description" maxlength="3000" rows="10" 434 + templates/create_event.en-us.partial.html:56: placeholder="A helpful, brief description of the event." required 435 + templates/create_event.en-us.partial.html:60: <p class="help is-danger">{{ build_event_form.description_error }}</p> 436 + templates/create_event.en-us.partial.html:62: <p class="help">Must be at least 10 characters and no more than 3000 characters.</p> 437 + templates/create_event.en-us.partial.html:66: <div class="field"> 438 + templates/create_event.en-us.partial.html:67: <div class="field-body"> 439 + templates/create_event.en-us.partial.html:68: <div class="field"> 440 + templates/create_event.en-us.partial.html:69: <label class="label" for="createEventStatus">Status</label> 441 + templates/create_event.en-us.partial.html:70: <div class="control"> 442 + templates/create_event.en-us.partial.html:71: <div class="select"> 443 + templates/create_event.en-us.partial.html:72: <select id="createEventStatus" name="status" 444 + templates/create_event.en-us.partial.html:73: class="{% if build_event_form.status_error %}is-danger{% endif %}"> 445 + templates/create_event.en-us.partial.html:75: selected="selected" {% endif %} value="planned"> 446 + templates/create_event.en-us.partial.html:78: <option {% if build_event_form.status=='scheduled' %} selected="selected" {% endif %} 447 + templates/create_event.en-us.partial.html:79: value="scheduled"> 448 + templates/create_event.en-us.partial.html:82: <option {% if build_event_form.status=='cancelled' %} selected="selected" {% endif %} 449 + templates/create_event.en-us.partial.html:83: value="cancelled"> 450 + templates/create_event.en-us.partial.html:86: <option {% if build_event_form.status=='postponed' %} selected="selected" {% endif %} 451 + templates/create_event.en-us.partial.html:87: value="postponed"> 452 + templates/create_event.en-us.partial.html:90: <option {% if build_event_form.status=='rescheduled' %} selected="selected" {% endif %} 453 + templates/create_event.en-us.partial.html:91: value="rescheduled"> 454 + templates/create_event.en-us.partial.html:98: <p class="help is-danger">{{ build_event_form.status_error }}</p> 455 + templates/create_event.en-us.partial.html:101: <div class="field pb-5"> 456 + templates/create_event.en-us.partial.html:102: <label class="label" for="createEventMode">Mode</label> 457 + templates/create_event.en-us.partial.html:103: <div class="control"> 458 + templates/create_event.en-us.partial.html:104: <div class="select"> 459 + templates/create_event.en-us.partial.html:105: <select id="createEventMode" name="mode" 460 + templates/create_event.en-us.partial.html:106: class="{% if build_event_form.mode_error %}is-danger{% endif %}"> 461 + templates/create_event.en-us.partial.html:107: <option value="virtual" {% if build_event_form.mode=='virtual' %} selected{% endif %}> 462 + templates/create_event.en-us.partial.html:110: <option value="hybrid" {% if build_event_form.mode=='hybrid' %} selected{% endif %}>Hybrid 463 + templates/create_event.en-us.partial.html:112: <option value="inperson" {% if build_event_form.mode=='inperson' or not 464 + templates/create_event.en-us.partial.html:118: <p class="help is-danger">{{ build_event_form.mode_error }}</p> 465 + templates/create_event.en-us.partial.html:124: {% include "create_event.en-us.starts_form.html" %} 466 + templates/create_event.en-us.partial.html:127: {% include "create_event.en-us.location_form.html" %} 467 + templates/create_event.en-us.partial.html:129: <div class="field"> 468 + templates/create_event.en-us.partial.html:130: <label class="label">Location</label> 469 + templates/create_event.en-us.partial.html:131: <div class="notification is-warning"> 470 + templates/create_event.en-us.partial.html:134: <p>Only events with a single location of type "Address" can be edited through this form.</p> 471 + templates/create_event.en-us.partial.html:139: <div class="content"> 472 + templates/create_event.en-us.partial.html:143: {% if location.type == "uri" %} 473 + templates/create_event.en-us.partial.html:146: <a href="{{ location.uri }}" target="_blank">{{ location.uri }}</a> 474 + templates/create_event.en-us.partial.html:147: {% elif location.type == "address" %} 475 + templates/create_event.en-us.partial.html:166: {% include "create_event.en-us.link_form.html" %} 476 + templates/create_event.en-us.partial.html:169: <div class="field"> 477 + templates/create_event.en-us.partial.html:170: <div class="control"> 478 + templates/create_event.en-us.partial.html:171: <button data-loading-disable data-loading-aria-busy type="submit" id="createEventSubmit" 479 + templates/create_event.en-us.partial.html:172: class="button is-link" name="submit" value="Submit"> 480 + templates/create_event.en-us.partial.html:177: <a href="{{ cancel_url }}" class="button">Cancel</a> 481 + templates/create_event.en-us.starts_form.html:1:<div id="startsAt" class="field py-5"> 482 + templates/create_event.en-us.starts_form.html:2: <div class="control"> 483 + templates/create_event.en-us.starts_form.html:6: {% if starts_form.build_state == "Selecting" %} 484 + templates/create_event.en-us.starts_form.html:7: <div id="startAtModal" class="modal is-active" tabindex="-1"> 485 + templates/create_event.en-us.starts_form.html:8: <div class="modal-background"></div> 486 + templates/create_event.en-us.starts_form.html:9: <div class="modal-content"> 487 + templates/create_event.en-us.starts_form.html:10: <div class="box"> 488 + templates/create_event.en-us.starts_form.html:11: <div class="field"> 489 + templates/create_event.en-us.starts_form.html:12: <label class="label" for="createEventTzInput">Timezone</label> 490 + templates/create_event.en-us.starts_form.html:13: <div class="control"> 491 + templates/create_event.en-us.starts_form.html:14: <div class="select"> 492 + templates/create_event.en-us.starts_form.html:15: <select id="createEventStartsAtTZ" name="tz"> 493 + templates/create_event.en-us.starts_form.html:17: <option value="{{ timezone }}" {% if timezone==starts_form.tz %}selected{% endif %}> 494 + templates/create_event.en-us.starts_form.html:24: <div class="field"> 495 + templates/create_event.en-us.starts_form.html:25: <div class="field-body"> 496 + templates/create_event.en-us.starts_form.html:26: <div class="field"> 497 + templates/create_event.en-us.starts_form.html:27: <label class="label" for="createEventStartsAtDate">Start Day (required)</label> 498 + templates/create_event.en-us.starts_form.html:28: <div class="control"> 499 + templates/create_event.en-us.starts_form.html:29: <input id="createEventStartsAtDate" type="date" class="form-control" 500 + templates/create_event.en-us.starts_form.html:30: name="starts_date" {% if starts_form.starts_date %} 501 + templates/create_event.en-us.starts_form.html:31: value="{{ starts_form.starts_date }}" {% endif %} required /> 502 + templates/create_event.en-us.starts_form.html:34: <div class="field"> 503 + templates/create_event.en-us.starts_form.html:35: <label class="label" for="createEventStartsAtTime">Start Time (required)</label> 504 + templates/create_event.en-us.starts_form.html:36: <div class="control"> 505 + templates/create_event.en-us.starts_form.html:37: <input id="createEventStartsAtTime" type="time" class="form-control" 506 + templates/create_event.en-us.starts_form.html:38: name="starts_time" {% if starts_form.starts_time %} 507 + templates/create_event.en-us.starts_form.html:39: value="{{ starts_form.starts_time }}" {% endif %} required /> 508 + templates/create_event.en-us.starts_form.html:44: <p class="help is-danger">{{ starts_form.starts_at_error }}</p> 509 + templates/create_event.en-us.starts_form.html:48: <input hidden type="text" name="include_ends" value="true"> 510 + templates/create_event.en-us.starts_form.html:49: <div class="field"> 511 + templates/create_event.en-us.starts_form.html:50: <div class="field-body"> 512 + templates/create_event.en-us.starts_form.html:51: <div class="field"> 513 + templates/create_event.en-us.starts_form.html:52: <label class="label" for="createEventStartsAtDate">End Day (required)</label> 514 + templates/create_event.en-us.starts_form.html:53: <div class="control"> 515 + templates/create_event.en-us.starts_form.html:54: <input id="createEventEndsAtDate" type="date" class="form-control" name="ends_date" 516 + templates/create_event.en-us.starts_form.html:55: {% if starts_form.ends_date %} value="{{ starts_form.ends_date }}" {% endif %} 517 + templates/create_event.en-us.starts_form.html:59: <div class="field"> 518 + templates/create_event.en-us.starts_form.html:60: <label class="label" for="createEventStartsAtTime">End Time (required)</label> 519 + templates/create_event.en-us.starts_form.html:61: <div class="control"> 520 + templates/create_event.en-us.starts_form.html:62: <input id="createEventEndsAtTime" type="time" class="form-control" name="ends_time" 521 + templates/create_event.en-us.starts_form.html:63: {% if starts_form.ends_time %} value="{{ starts_form.ends_time }}" {% endif %} 522 + templates/create_event.en-us.starts_form.html:69: <p class="help is-danger">{{ starts_form.ends_at_error }}</p> 523 + templates/create_event.en-us.starts_form.html:72: <div class="field py-4"> 524 + templates/create_event.en-us.starts_form.html:73: <div class="control"> 525 + templates/create_event.en-us.starts_form.html:74: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 526 + templates/create_event.en-us.starts_form.html:75: hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 527 + templates/create_event.en-us.starts_form.html:76: hx-vals='{ "build_state": "Selecting", "include_ends": false }' 528 + templates/create_event.en-us.starts_form.html:77: class="button is-link">Remove End Time</button> 529 + templates/create_event.en-us.starts_form.html:81: <div class="field py-4"> 530 + templates/create_event.en-us.starts_form.html:82: <div class="control"> 531 + templates/create_event.en-us.starts_form.html:83: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 532 + templates/create_event.en-us.starts_form.html:84: hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 533 + templates/create_event.en-us.starts_form.html:85: hx-vals='{ "build_state": "Selecting", "include_ends": true }' 534 + templates/create_event.en-us.starts_form.html:86: class="button is-link">Add End Time</button> 535 + templates/create_event.en-us.starts_form.html:90: <div class="field is-grouped pt-4"> 536 + templates/create_event.en-us.starts_form.html:91: <p class="control"> 537 + templates/create_event.en-us.starts_form.html:92: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 538 + templates/create_event.en-us.starts_form.html:93: hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 539 + templates/create_event.en-us.starts_form.html:94: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 540 + templates/create_event.en-us.starts_form.html:99: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 541 + templates/create_event.en-us.starts_form.html:100: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 542 + templates/create_event.en-us.starts_form.html:101: aria-label="close"></button> 543 + templates/create_event.en-us.starts_form.html:103: {% elif (starts_form.build_state == "Selected") %} 544 + templates/create_event.en-us.starts_form.html:104: <div class="field"> 545 + templates/create_event.en-us.starts_form.html:105: <div class="field-body is-align-items-end"> 546 + templates/create_event.en-us.starts_form.html:106: <div class="field"> 547 + templates/create_event.en-us.starts_form.html:107: <label class="label" for="createEventStartsAt">Starts At</label> 548 + templates/create_event.en-us.starts_form.html:108: <div class="control"> 549 + templates/create_event.en-us.starts_form.html:109: <input id="createEventStartsAt" type="text" class="input is-static" 550 + templates/create_event.en-us.starts_form.html:110: value="{{ starts_form.starts_display }}" readonly /> 551 + templates/create_event.en-us.starts_form.html:113: <div class="field"> 552 + templates/create_event.en-us.starts_form.html:114: <label class="label" for="createEventEndsAt">Ends At</label> 553 + templates/create_event.en-us.starts_form.html:115: <div class="control"> 554 + templates/create_event.en-us.starts_form.html:116: <input id="createEventEndsAt" type="text" class="input is-static" 555 + templates/create_event.en-us.starts_form.html:117: value="{{ starts_form.ends_display if starts_form.ends_display is not none else '---' }}" readonly /> 556 + templates/create_event.en-us.starts_form.html:120: <div class="field is-grouped"> 557 + templates/create_event.en-us.starts_form.html:121: <p class="control"> 558 + templates/create_event.en-us.starts_form.html:122: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 559 + templates/create_event.en-us.starts_form.html:123: hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 560 + templates/create_event.en-us.starts_form.html:124: hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" 561 + templates/create_event.en-us.starts_form.html:125: data-bs-target="startAtModal" class="button is-link is-outlined">Edit</button> 562 + templates/create_event.en-us.starts_form.html:127: <p class="control"> 563 + templates/create_event.en-us.starts_form.html:128: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 564 + templates/create_event.en-us.starts_form.html:129: hx-params="build_state,tz" hx-vals='{ "build_state": "Reset" }' 565 + templates/create_event.en-us.starts_form.html:130: class="button is-danger is-outlined">Clear</button> 566 + templates/create_event.en-us.starts_form.html:136: <input hidden type="text" name="starts_date" value="{{ starts_form.starts_date }}"> 567 + templates/create_event.en-us.starts_form.html:139: <input hidden type="text" name="starts_time" value="{{ starts_form.starts_time }}"> 568 + templates/create_event.en-us.starts_form.html:142: <input hidden type="text" name="starts_at" value="{{ starts_form.starts_at }}"> 569 + templates/create_event.en-us.starts_form.html:145: <input hidden type="text" name="include_ends" value="{{ starts_form.include_ends }}"> 570 + templates/create_event.en-us.starts_form.html:148: <input hidden type="text" name="ends_date" value="{{ starts_form.ends_date }}"> 571 + templates/create_event.en-us.starts_form.html:151: <input hidden type="text" name="ends_time" value="{{ starts_form.ends_time }}"> 572 + templates/create_event.en-us.starts_form.html:154: <input hidden type="text" name="ends_at" value="{{ starts_form.ends_at }}"> 573 + templates/create_event.en-us.starts_form.html:156: {% elif starts_form.build_state == "Reset" %} 574 + templates/create_event.en-us.starts_form.html:157: <div class="field"> 575 + templates/create_event.en-us.starts_form.html:158: <div class="field-body is-align-items-end"> 576 + templates/create_event.en-us.starts_form.html:159: <div class="field"> 577 + templates/create_event.en-us.starts_form.html:160: <label class="label" for="createEventStartsAt">Starts At</label> 578 + templates/create_event.en-us.starts_form.html:161: <div class="control"> 579 + templates/create_event.en-us.starts_form.html:162: <input id="createEventStartsAt" type="text" class="input is-static" value="Not Set" readonly /> 580 + templates/create_event.en-us.starts_form.html:165: <div class="field"> 581 + templates/create_event.en-us.starts_form.html:166: <label class="label" for="createEventEndsAt">Ends At</label> 582 + templates/create_event.en-us.starts_form.html:167: <div class="control"> 583 + templates/create_event.en-us.starts_form.html:168: <input id="createEventEndsAt" type="text" class="input is-static" value="Not Set" readonly /> 584 + templates/create_event.en-us.starts_form.html:171: <div class="field"> 585 + templates/create_event.en-us.starts_form.html:172: <p class="control"> 586 + templates/create_event.en-us.starts_form.html:173: <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 587 + templates/create_event.en-us.starts_form.html:174: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 588 + templates/create_event.en-us.starts_form.html:175: class="button is-link is-outlined">Edit</button> 589 + templates/create_rsvp.en-us.bare.html:1:{% extends "bare.en-us.html" %} 590 + templates/create_rsvp.en-us.common.html:1:{% from "form_include.html" import text_input %} 591 + templates/create_rsvp.en-us.common.html:2:<section class="section is-fullheight"> 592 + templates/create_rsvp.en-us.common.html:3: <div class="container "> 593 + templates/create_rsvp.en-us.common.html:5: <div class="box content"> 594 + templates/create_rsvp.en-us.common.html:9: <article class="message is-info"> 595 + templates/create_rsvp.en-us.common.html:10: <div class="message-body"> 596 + templates/create_rsvp.en-us.common.html:16: <a href="https://docs.smokesignal.events/docs/help/events/" rel="help"> 597 + templates/create_rsvp.en-us.html:1:{% extends "base.en-us.html" %} 598 + templates/create_rsvp.en-us.partial.html:3:<article class="message is-success"> 599 + templates/create_rsvp.en-us.partial.html:4: <div class="message-body"> 600 + templates/create_rsvp.en-us.partial.html:9:<article class="message is-success"> 601 + templates/create_rsvp.en-us.partial.html:10: <div class="message-header"> 602 + templates/create_rsvp.en-us.partial.html:13: <div class="message-body"> 603 + templates/create_rsvp.en-us.partial.html:14: <p class="buttons"> 604 + templates/create_rsvp.en-us.partial.html:15: <a class="button" href="{{ event_url }}"> 605 + templates/create_rsvp.en-us.partial.html:16: <span class="icon"> 606 + templates/create_rsvp.en-us.partial.html:17: <i class="fas fa-file"></i> 607 + templates/create_rsvp.en-us.partial.html:27:{% from "form_include.html" import text_input %} 608 + templates/create_rsvp.en-us.partial.html:28:<form hx-post="/rsvp" hx-swap="outerHTML" class="my-5"> 609 + templates/create_rsvp.en-us.partial.html:30: {% if build_rsvp_form.build_state == "Reset" %} 610 + templates/create_rsvp.en-us.partial.html:31: <input type="hidden" name="build_state" value="Selecting"> 611 + templates/create_rsvp.en-us.partial.html:32: {% elif build_rsvp_form.build_state == "Selecting" %} 612 + templates/create_rsvp.en-us.partial.html:33: <input type="hidden" name="build_state" value="Selected"> 613 + templates/create_rsvp.en-us.partial.html:34: {% elif build_rsvp_form.build_state == "Selected" %} 614 + templates/create_rsvp.en-us.partial.html:35: <input type="hidden" name="build_state" value="Review"> 615 + templates/create_rsvp.en-us.partial.html:36: {% elif build_rsvp_form.build_state == "Review" %} 616 + templates/create_rsvp.en-us.partial.html:37: <input type="hidden" name="build_state" value="Review"> 617 + templates/create_rsvp.en-us.partial.html:40: <div class="field"> 618 + templates/create_rsvp.en-us.partial.html:41: <label class="label" for="createRsvpSubjectAtUriInput">Event AT-URI (required)</label> 619 + templates/create_rsvp.en-us.partial.html:42: <div class="control {% if build_rsvp_form.subject_aturi_error %} has-icons-right{% endif %}" 620 + templates/create_rsvp.en-us.partial.html:43: data-loading-class="is-loading"> 621 + templates/create_rsvp.en-us.partial.html:44: <input type="text" class="input {% if build_rsvp_form.subject_aturi_error %} is-danger{% endif %}" 622 + templates/create_rsvp.en-us.partial.html:45: id="createRsvpSubjectAtUriInput" name="subject_aturi" placeholder="at://smokesignal.events/community.lexicon.calendar.event/neat" {% 623 + templates/create_rsvp.en-us.partial.html:46: if build_rsvp_form.subject_aturi %}value="{{ build_rsvp_form.subject_aturi }}" {% endif %} required 624 + templates/create_rsvp.en-us.partial.html:50: <p class="help is-danger">{{ build_rsvp_form.subject_aturi_error }}</p> 625 + templates/create_rsvp.en-us.partial.html:54: <div class="field"> 626 + templates/create_rsvp.en-us.partial.html:55: <label class="label" for="createRsvpSubjectCidInput">Event CID</label> 627 + templates/create_rsvp.en-us.partial.html:56: <div class="control {% if build_rsvp_form.subject_cid_error %} has-icons-right{% endif %}" 628 + templates/create_rsvp.en-us.partial.html:57: data-loading-class="is-loading"> 629 + templates/create_rsvp.en-us.partial.html:58: <input type="text" class="input {% if build_rsvp_form.subject_cid_error %} is-danger{% endif %}" 630 + templates/create_rsvp.en-us.partial.html:59: id="createRsvpSubjectCidInput" name="subject_cid" {% 631 + templates/create_rsvp.en-us.partial.html:60: if build_rsvp_form.subject_cid %}value="{{ build_rsvp_form.subject_cid }}" {% endif %} 632 + templates/create_rsvp.en-us.partial.html:64: <p class="help is-danger">{{ build_rsvp_form.subject_cid_error }}</p> 633 + templates/create_rsvp.en-us.partial.html:68: <div class="field pb-5"> 634 + templates/create_rsvp.en-us.partial.html:69: <label class="label" for="createRsvpStatusInput">Status</label> 635 + templates/create_rsvp.en-us.partial.html:70: <div class="control"> 636 + templates/create_rsvp.en-us.partial.html:71: <div class="select"> 637 + templates/create_rsvp.en-us.partial.html:72: <select id="createRsvpStatusInput" name="status" 638 + templates/create_rsvp.en-us.partial.html:73: class="{% if build_rsvp_form.status_error %}is-danger{% endif %}"> 639 + templates/create_rsvp.en-us.partial.html:74: <option {% if build_rsvp_form.status=='going' or not build_rsvp_form.status %} selected="selected" {% endif %} value="going"> 640 + templates/create_rsvp.en-us.partial.html:77: <option {% if build_rsvp_form.status=='interested' %} selected="selected" {% endif %} value="interested"> 641 + templates/create_rsvp.en-us.partial.html:80: <option {% if build_rsvp_form.status=='notgoing' %} selected="selected" {% endif %} value="notgoing"> 642 + templates/create_rsvp.en-us.partial.html:87: <p class="help is-danger">{{ build_rsvp_form.status_error }}</p> 643 + templates/create_rsvp.en-us.partial.html:92: <div class="field"> 644 + templates/create_rsvp.en-us.partial.html:93: <div class="control"> 645 + templates/create_rsvp.en-us.partial.html:94: <button data-loading-disable data-loading-aria-busy type="submit" id="createRsvpSubmit" 646 + templates/create_rsvp.en-us.partial.html:95: class="button is-link" name="submit" value="Submit">Record RSVP</button> 647 + templates/edit_event.en-us.bare.html:1:{% extends "bare.en-us.html" %} 648 + templates/edit_event.en-us.common.html:1:{% from "form_include.html" import text_input %} 649 + templates/edit_event.en-us.common.html:2:<section class="section is-fullheight"> 650 + templates/edit_event.en-us.common.html:3: <div class="container "> 651 + templates/edit_event.en-us.common.html:5: <div class="box content"> 652 + templates/edit_event.en-us.html:1:{% extends "base.en-us.html" %} 653 + templates/event_list.en-us.incl.html:5:<article class="media"> 654 + templates/event_list.en-us.incl.html:6: <div class="media-content"> 655 + templates/event_list.en-us.incl.html:8: <div class="level mb-1"> 656 + templates/event_list.en-us.incl.html:9: <div class="level-left"> 657 + templates/event_list.en-us.incl.html:12: <span class="level-item tag is-info is-light"> 658 + templates/event_list.en-us.incl.html:13: <div class="icon-text"> 659 + templates/event_list.en-us.incl.html:14: <span class="icon"> 660 + templates/event_list.en-us.incl.html:46: {% if event.collection != "community.lexicon.calendar.event" %} 661 + templates/event_list.en-us.incl.html:47: <span class="level-item tag is-warning">Legacy</span> 662 + templates/event_list.en-us.incl.html:50: <a class="level-item title has-text-link is-size-4 has-text-weight-semibold mb-0" 663 + templates/event_list.en-us.incl.html:51: href="{{ base }}{{ event.site_url }}" hx-boost="true"> 664 + templates/event_list.en-us.incl.html:57: <div class="level mb-1"> 665 + templates/event_list.en-us.incl.html:58: <div class="level-left"> 666 + templates/event_list.en-us.incl.html:59: {% if event.status == "planned" %} 667 + templates/event_list.en-us.incl.html:60: <span class="level-item icon-text is-hidden-tablet" title="The event is planned."> 668 + templates/event_list.en-us.incl.html:61: <span class="icon"> 669 + templates/event_list.en-us.incl.html:62: <i class="fas fa-calendar-days"></i> 670 + templates/event_list.en-us.incl.html:66: {% elif event.status == "scheduled" %} 671 + templates/event_list.en-us.incl.html:67: <span class="level-item icon-text is-hidden-tablet" title="The event is scheduled."> 672 + templates/event_list.en-us.incl.html:68: <span class="icon"> 673 + templates/event_list.en-us.incl.html:69: <i class="fas fa-calendar-check"></i> 674 + templates/event_list.en-us.incl.html:73: {% elif event.status == "rescheduled" %} 675 + templates/event_list.en-us.incl.html:74: <span class="level-item icon-text is-hidden-tablet is-info" title="The event is rescheduled."> 676 + templates/event_list.en-us.incl.html:75: <span class="icon"> 677 + templates/event_list.en-us.incl.html:76: <i class="fas fa-calendar-plus"></i> 678 + templates/event_list.en-us.incl.html:80: {% elif event.status == "cancelled" %} 679 + templates/event_list.en-us.incl.html:81: <span class="level-item icon-text is-hidden-tablet is-danger" title="The event is cancelled."> 680 + templates/event_list.en-us.incl.html:82: <span class="icon"> 681 + templates/event_list.en-us.incl.html:83: <i class="fas fa-calendar-xmark"></i> 682 + templates/event_list.en-us.incl.html:87: {% elif event.status == "postponed" %} 683 + templates/event_list.en-us.incl.html:88: <span class="level-item icon-text is-hidden-tablet is-warning" title="The event is postponed."> 684 + templates/event_list.en-us.incl.html:89: <span class="icon"> 685 + templates/event_list.en-us.incl.html:90: <i class="fas fa-calendar-minus"></i> 686 + templates/event_list.en-us.incl.html:96: <span class="level-item icon-text" title="Starts at {{ event.starts_at_human }}"> 687 + templates/event_list.en-us.incl.html:97: <span class="icon"> 688 + templates/event_list.en-us.incl.html:98: <i class="fas fa-clock"></i> 689 + templates/event_list.en-us.incl.html:100: <span><time class="dt-start" {% if event.starts_at_machine %} 690 + templates/event_list.en-us.incl.html:101: datetime="{{ event.starts_at_machine }}" {% endif %}> 691 + templates/event_list.en-us.incl.html:107: <span class="level-item"> 692 + templates/event_list.en-us.incl.html:108: <a href="{{ base }}/{{ event.organizer_did }}" hx-boost="true"> 693 + templates/event_list.en-us.incl.html:113: {% if event.mode == "inperson" %} 694 + templates/event_list.en-us.incl.html:114: <span class="level-item icon-text" title="In Person"> 695 + templates/event_list.en-us.incl.html:115: <span class="icon"> 696 + templates/event_list.en-us.incl.html:116: <i class="fas fa-users"></i> 697 + templates/event_list.en-us.incl.html:118: <span class="is-hidden-tablet">In Person</span> 698 + templates/event_list.en-us.incl.html:120: {% elif event.mode == "virtual" %} 699 + templates/event_list.en-us.incl.html:121: <span class="level-item icon-text" title="An Virtual (Online) Event"> 700 + templates/event_list.en-us.incl.html:122: <span class="icon"> 701 + templates/event_list.en-us.incl.html:123: <i class="fas fa-globe"></i> 702 + templates/event_list.en-us.incl.html:125: <span class="is-hidden-tablet">Virtual</span> 703 + templates/event_list.en-us.incl.html:127: {% elif event.mode == "hybrid" %} 704 + templates/event_list.en-us.incl.html:128: <span class="level-item icon-text" title="A Hybrid In-Person and Virtual (Online) Event"> 705 + templates/event_list.en-us.incl.html:129: <span class="icon"> 706 + templates/event_list.en-us.incl.html:130: <i class="fas fa-user-plus"></i> 707 + templates/event_list.en-us.incl.html:132: <span class="is-hidden-tablet">Hybrid</span> 708 + templates/event_list.en-us.incl.html:136: <span class="level-item icon-text" title="{{ event.count_going }} Going"> 709 + templates/event_list.en-us.incl.html:137: <span class="icon"> 710 + templates/event_list.en-us.incl.html:138: <i class="fas fa-star"></i> 711 + templates/event_list.en-us.incl.html:140: <span>{{ event.count_going }}<span class="is-hidden-tablet"> Going</span></span> 712 + templates/event_list.en-us.incl.html:142: <span class="level-item icon-text" title="{{ event.count_interested }} Interested"> 713 + templates/event_list.en-us.incl.html:143: <span class="icon"> 714 + templates/event_list.en-us.incl.html:144: <i class="fas fa-eye"></i> 715 + templates/event_list.en-us.incl.html:146: <span>{{ event.count_interested }}<span class="is-hidden-tablet"> Interested</span></span> 716 + templates/event_list.en-us.incl.html:148: <span class="level-item icon-text" title="{{ event.count_not_going }} Not Going"> 717 + templates/event_list.en-us.incl.html:149: <span class="icon"> 718 + templates/event_list.en-us.incl.html:150: <i class="fas fa-ban"></i> 719 + templates/event_list.en-us.incl.html:152: <span>{{ event.count_not_going }}<span class="is-hidden-tablet"> Not Going</span></span> 720 + templates/event_list.en-us.incl.html:157: <div class="my-2"> 721 + templates/footer.en-us.html:1:<footer class="footer"> 722 + templates/footer.en-us.html:2: <div class="container content has-text-centered"> 723 + templates/footer.en-us.html:4: <strong>Smoke Signal Events</strong> made by <a href="https://ngerakines.me/">Nick Gerakines</a> 724 + templates/footer.en-us.html:5: (<a href="https://github.com/ngerakines">Source Code</a>) 725 + templates/footer.en-us.html:7: <nav class="level"> 726 + templates/footer.en-us.html:8: <div class="level-item has-text-centered"> 727 + templates/footer.en-us.html:9: <a href="https://docs.smokesignal.events/">Support</a> 728 + templates/footer.en-us.html:11: <div class="level-item has-text-centered"> 729 + templates/footer.en-us.html:12: <a href="/privacy-policy" hx-boost="true">Privacy Policy</a> 730 + templates/footer.en-us.html:14: <div class="level-item has-text-centered"> 731 + templates/footer.en-us.html:15: <a href="/cookie-policy" hx-boost="true">Cookie Policy</a> 732 + templates/footer.en-us.html:17: <div class="level-item has-text-centered"> 733 + templates/footer.en-us.html:18: <a href="/terms-of-service" hx-boost="true">Terms of Service</a> 734 + templates/footer.en-us.html:20: <div class="level-item has-text-centered"> 735 + templates/footer.en-us.html:21: <a href="/acknowledgement" hx-boost="true">Acknowledgement</a> 736 + templates/form_include.html:1:{%- macro text_input(label, id, name="", value="", class_extra="", error="", extra="") -%} 737 + templates/form_include.html:2:<div class="field"> 738 + templates/form_include.html:3: <label class="label" for="{{ id }}">{{ label }}</label> 739 + templates/form_include.html:4: <div class="control"> 740 + templates/form_include.html:5: <input type="text" class="input {{ class_extra }}{% if error %} is-danger{% endif %}" id="{{ id }}" name="{{ name }}" {% if value %} value="{{ value }}"{% endif %}{% autoescape false %} {{ extra }}{% endautoescape %}> 741 + templates/form_include.html:7: {% if error %}<p class="help is-danger">{{ error }}</p>{% endif %} 742 + templates/form_include.html:11:<div class="field"> 743 + templates/form_include.html:12: <label class="label" for="{{ id }}">{{ label }}</label> 744 + templates/form_include.html:13: <div class="control"> 745 + templates/form_include.html:14: <input type="text" class="input is-static" id="{{ id }}" value="{{ value if value is not none else '--' }}" readonly> 746 + templates/import.en-us.bare.html:1:{% extends "bare.en-us.html" %} 747 + templates/import.en-us.common.html:1:{% from "form_include.html" import text_input %} 748 + templates/import.en-us.common.html:2:<section class="section"> 749 + templates/import.en-us.common.html:3: <div class="container"> 750 + templates/import.en-us.common.html:5: <div class="box content"> 751 + templates/import.en-us.html:1:{% extends "base.en-us.html" %} 752 + templates/import.en-us.partial.html:1:<div id="importRecords"> 753 + templates/import.en-us.partial.html:2: <article class="message"> 754 + templates/import.en-us.partial.html:3: <div class="message-body"> 755 + templates/import.en-us.partial.html:7: <button class="button is-link" hx-post="/import" hx-target="#importRecords" hx-swap="outerHTML" 756 + templates/import.en-us.partial.html:8: hx-vals='{ {% if collection %} "collection": "{{ collection }}", {% endif %}{% if cursor %} "cursor": "{{ cursor }}", {% endif %} "ignore":"this"}'> 757 + templates/import.en-us.partial.html:9: <span class="icon"> 758 + templates/import.en-us.partial.html:10: <i class="fas fa-file-import"></i> 759 + templates/import.en-us.partial.html:24: <div class="mt-3"> 760 + templates/import.en-us.partial.html:35: <div class="box"> 761 + templates/import.en-us.partial.html:36: <h2 class="title is-5">Imported Items</h2> 762 + templates/index.en-us.bare.html:1:{% extends "bare.en-us.html" %} 763 + templates/index.en-us.common.html:1:{%- from "pagination.html" import view_pagination -%} 764 + templates/index.en-us.common.html:2:<section class="section"> 765 + templates/index.en-us.common.html:3: <div class="container"> 766 + templates/index.en-us.common.html:4: <h1 class="title is-1">Smoke Signal</h1> 767 + templates/index.en-us.common.html:5: <h2 class="subtitle">Find events, make connections, and create community.</h2> 768 + templates/index.en-us.common.html:6: <p class="content"> 769 + templates/index.en-us.common.html:7: The <a href="https://docs.smokesignal.events/docs/getting-started/quick-start/">Quick Start Guide</a> has a 770 + templates/index.en-us.common.html:13:<section class="section"> 771 + templates/index.en-us.common.html:14: <div class="container"> 772 + templates/index.en-us.common.html:15: <h2 class="title is-2">Recently Updated Events</h2> 773 + templates/index.en-us.common.html:18: <article class="message is-danger"> 774 + templates/index.en-us.common.html:19: <div class="message-body"> 775 + templates/index.en-us.common.html:29: {{ view_pagination((canonical_url ~ "?"), pagination) }} 776 + templates/index.en-us.html:1:{% extends "base.en-us.html" %} 777 + templates/index.en-us.html:4:<meta name="description" content="Smoke Signal is an event and RSVP management system."> 778 + templates/index.en-us.html:5:<meta property="og:title" content="Smoke Signal"> 779 + templates/index.en-us.html:6:<meta property="og:description" content="Smoke Signal is an event and RSVP management system."> 780 + templates/index.en-us.html:7:<meta property="og:site_name" content="Smoke Signal" /> 781 + templates/index.en-us.html:8:<meta property="og:type" content="website" /> 782 + templates/index.en-us.html:9:<meta property="og:url" content="https://smokesignal.events/" /> 783 + templates/index.en-us.html:10:<script type="application/ld+json"> 784 + templates/index.en-us.html:11:{ "@context" : "https://schema.org", "@type" : "Organization", "url" : "https://smokesignal.events/", "name": "Smoke Signal" } 785 + templates/login.en-us.bare.html:1:{% extends "bare.en-us.html" %} 786 + templates/login.en-us.bare.html:3:<section class="section is-fullheight"> 787 + templates/login.en-us.bare.html:4: <div class="container is-max-tablet"> 788 + templates/login.en-us.bare.html:6: <div class="box content"> 789 + templates/login.en-us.bare.html:8: <article class="message is-link"> 790 + templates/login.en-us.bare.html:9: <div class="message-body"> 791 + templates/login.en-us.bare.html:11: The <a href="https://docs.smokesignal.events/docs/getting-started/quick-start/">Quick Start Guide</a> has a 792 + templates/login.en-us.bare.html:19: <p><a target="_blank" href="#">Trouble signing in?</a></p> 793 + templates/login.en-us.html:1:{% extends "base.en-us.html" %} 794 + templates/login.en-us.html:5:<section class="section is-fullheight"> 795 + templates/login.en-us.html:6: <div class="container is-max-tablet"> 796 + templates/login.en-us.html:7: <div class="box content"> 797 + templates/login.en-us.html:8: <p class="has-text-weight-bold">Sign into Smoke Signal using your full ATProto handle.</p> 798 + templates/login.en-us.html:11: <a href="https://docs.smokesignal.events/docs/getting-started/quick-start/"> 799 + templates/login.en-us.html:18: {# <p><a target="_blank" href="#">Trouble signing in?</a></p> #} 800 + templates/login.en-us.partial.html:1:<form hx-post="/oauth/login" hx-swap="outerHTML" class="my-5"> 801 + templates/login.en-us.partial.html:3: <input type="hidden" name="destination" value="{{ destination }}"> 802 + templates/login.en-us.partial.html:5: <div class="field"> 803 + templates/login.en-us.partial.html:6: <label class="label" for="loginHandleInput">Handle</label> 804 + templates/login.en-us.partial.html:7: <div class="control has-icons-left{% if handle_error %} has-icons-right{% endif %}" data-loading-class="is-loading"> 805 + templates/login.en-us.partial.html:8: <input class="input{% if handle_error %} is-danger{% endif %}" type="text" id="loginHandleInput" name="handle" required="required" autocomplete="handle" {% if handle_input %} 806 + templates/login.en-us.partial.html:9: value="{{ handle_input }}" {% endif %} placeholder="you.bsky.social" data-loading-disable> 807 + templates/login.en-us.partial.html:10: <span class="icon is-small is-left"> 808 + templates/login.en-us.partial.html:11: <i class="fas fa-at"></i> 809 + templates/login.en-us.partial.html:13: {% if handle_error %}<span class="icon is-small is-right"> 810 + templates/login.en-us.partial.html:14: <i class="fas fa-exclamation-triangle"></i> 811 + templates/login.en-us.partial.html:17: {% if handle_error %}<p class="help is-danger">{{ error_message }}</p>{% endif %} 812 + templates/login.en-us.partial.html:19: <div class="field"> 813 + templates/login.en-us.partial.html:20: <div class="control"> 814 + templates/login.en-us.partial.html:21: <button data-loading-disable type="submit" id="loginSubmit" class="button is-link" name="submit" value="Submit">Sign-In</button> 815 + templates/migrate_event.en-us.common.html:1:<section class="section"> 816 + templates/migrate_event.en-us.common.html:2: <div class="container"> 817 + templates/migrate_event.en-us.common.html:3: <div class="content"> 818 + templates/migrate_event.en-us.common.html:4: <h1 class="title">Event Migration Complete</h1> 819 + templates/migrate_event.en-us.common.html:6: <div class="box"> 820 + templates/migrate_event.en-us.common.html:7: <article class="message is-success"> 821 + templates/migrate_event.en-us.common.html:8: <div class="message-body"> 822 + templates/migrate_event.en-us.common.html:9: <p class="has-text-weight-bold"> 823 + templates/migrate_event.en-us.common.html:10: <span class="icon has-text-success"> 824 + templates/migrate_event.en-us.common.html:11: <i class="fas fa-check-circle"></i> 825 + templates/migrate_event.en-us.common.html:13: The event "{{ event_name }}" has been successfully migrated! 826 + templates/migrate_event.en-us.common.html:18: <div class="mt-4"> 827 + templates/migrate_event.en-us.common.html:22: <div class="field mt-4"> 828 + templates/migrate_event.en-us.common.html:23: <label class="label">Migration Details</label> 829 + templates/migrate_event.en-us.common.html:24: <div class="table-container"> 830 + templates/migrate_event.en-us.common.html:25: <table class="table is-bordered is-fullwidth"> 831 + templates/migrate_event.en-us.common.html:48: <div class="buttons mt-5"> 832 + templates/migrate_event.en-us.common.html:49: <a href="{{ migrated_event_url }}" class="button is-primary"> 833 + templates/migrate_event.en-us.common.html:50: <span class="icon"> 834 + templates/migrate_event.en-us.common.html:51: <i class="fas fa-calendar-alt"></i> 835 + templates/migrate_event.en-us.common.html:55: <a href="/{{ current_handle.handle }}" class="button is-light"> 836 + templates/migrate_event.en-us.common.html:56: <span class="icon"> 837 + templates/migrate_event.en-us.common.html:57: <i class="fas fa-user"></i> 838 + templates/migrate_event.en-us.html:1:{% extends "base.en-us.html" %} 839 + templates/nav.en-us.html:1:<section class="section py-0"> 840 + templates/nav.en-us.html:2: <div class="container"> 841 + templates/nav.en-us.html:3: <nav class="navbar is-transparent" role="navigation" aria-label="main dropdown navigation"> 842 + templates/nav.en-us.html:5: <div class="navbar-brand"> 843 + templates/nav.en-us.html:6: <a class="navbar-item" href="/" hx-boost="true"> 844 + templates/nav.en-us.html:7: <img src="/static/logo-160x160.png" alt="Smoke Signal" height="160" /> 845 + templates/nav.en-us.html:11: <a role="button" class="navbar-burger" aria-label="menu" aria-expanded="false" 846 + templates/nav.en-us.html:12: data-target="navbarMenuMain"> 847 + templates/nav.en-us.html:13: <span aria-hidden="true"></span> 848 + templates/nav.en-us.html:14: <span aria-hidden="true"></span> 849 + templates/nav.en-us.html:15: <span aria-hidden="true"></span> 850 + templates/nav.en-us.html:16: <span aria-hidden="true"></span> 851 + templates/nav.en-us.html:20: <div id="navbarMenuMain" class="navbar-menu"> 852 + templates/nav.en-us.html:21: <div class="navbar-start"> 853 + templates/nav.en-us.html:22: <a class="navbar-item" href="/" hx-boost="true"> 854 + templates/nav.en-us.html:25: <a class="navbar-item" href="/"> 855 + templates/nav.en-us.html:28: <a class="navbar-item" href="/"> 856 + templates/nav.en-us.html:33: <div class="navbar-end"> 857 + templates/nav.en-us.html:34: <div class="navbar-item"> 858 + templates/nav.en-us.html:35: <div class="buttons"> 859 + templates/nav.en-us.html:37: <a class="button is-primary" href="/event" hx-boost="true"> 860 + templates/nav.en-us.html:38: <span class="icon"> 861 + templates/nav.en-us.html:39: <i class="fas fa-calendar-plus"></i> 862 + templates/nav.en-us.html:43: <a class="button is-link" href="/{{ current_handle.did }}" hx-boost="true"> 863 + templates/nav.en-us.html:44: <span class="icon"> 864 + templates/nav.en-us.html:45: <i class="fas fa-user"></i> 865 + templates/nav.en-us.html:49: <a class="button is-danger is-light" 866 + templates/nav.en-us.html:50: href="/logout">Log out</a> 867 + templates/nav.en-us.html:52: <a class="button is-primary" href="/oauth/login" hx-boost="true">Log in</a> 868 + templates/pagination.html:3:<nav class="pagination pt-5" role="navigation" aria-label="pagination"> 869 + templates/pagination.html:5: <a href="{{ url }}{{ pagination.previous_url }}" class="pagination-previous" 870 + templates/pagination.html:6: rel="nofollow">Previous</a> 871 + templates/pagination.html:8: <a class="pagination-previous is-disabled">Previous</a> 872 + templates/pagination.html:12: <a href="{{ url }}{{ pagination.next_url }}" class="pagination-next" 873 + templates/pagination.html:13: rel="nofollow">Next</a> 874 + templates/pagination.html:15: <a class="pagination-next is-disabled">Next</a> 875 + templates/privacy-policy.en-us.bare.html:1:{% extends "bare.en-us.html" %} 876 + templates/privacy-policy.en-us.common.html:1:<section class="section pb-3"> 877 + templates/privacy-policy.en-us.common.html:2: <div class="container"> 878 + templates/privacy-policy.en-us.common.html:3: <h1 class="title is-1">Privacy Policy</h1> 879 + templates/privacy-policy.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 880 + templates/privacy-policy.en-us.common.html:7:<section class="section py-3"> 881 + templates/privacy-policy.en-us.common.html:8: <div class="container content"> 882 + templates/privacy-policy.en-us.common.html:10: Smoke Signal ("we", "us", or "our") is an event and RSVP management application built on top of the 883 + templates/privacy-policy.en-us.common.html:12: https://smokesignal.events (the "Site"). 884 + templates/privacy-policy.en-us.common.html:20:<section class="section py-3"> 885 + templates/privacy-policy.en-us.common.html:21: <div class="container content"> 886 + templates/privacy-policy.en-us.common.html:22: <h4 class="title is-4">Information We Collect</h4> 887 + templates/privacy-policy.en-us.common.html:23: <h5 class="title is-5">1. Personal Information</h5> 888 + templates/privacy-policy.en-us.common.html:27: <h5 class="title is-5">2. Automatically Collected Information</h5> 889 + templates/privacy-policy.en-us.common.html:41: <h5 class="title is-5">3. Cookies and Tracking Technologies</h5> 890 + templates/privacy-policy.en-us.common.html:44: href="/cookie-policy">Cookie Policy</a>. 891 + templates/privacy-policy.en-us.common.html:46: <h5 class="title is-5">4. ATProtocol Network Information</h5> 892 + templates/privacy-policy.en-us.common.html:71:<section class="section py-3"> 893 + templates/privacy-policy.en-us.common.html:72: <div class="container content"> 894 + templates/privacy-policy.en-us.common.html:73: <h4 class="title is-4">How We Use Your Information</h4> 895 + templates/privacy-policy.en-us.common.html:84:<section class="section py-3"> 896 + templates/privacy-policy.en-us.common.html:85: <div class="container content"> 897 + templates/privacy-policy.en-us.common.html:86: <h4 class="title is-4">Legal Basis for Processing (EU Users)</h4> 898 + templates/privacy-policy.en-us.common.html:98:<section class="section py-3"> 899 + templates/privacy-policy.en-us.common.html:99: <div class="container content"> 900 + templates/privacy-policy.en-us.common.html:100: <h4 class="title is-4">Sharing of Information</h4> 901 + templates/privacy-policy.en-us.common.html:111:<section class="section py-3"> 902 + templates/privacy-policy.en-us.common.html:112: <div class="container content"> 903 + templates/privacy-policy.en-us.common.html:113: <h4 class="title is-4">Your Rights and Choices</h4> 904 + templates/privacy-policy.en-us.common.html:114: <h5 class="title is-5">1. Access and Correction</h5> 905 + templates/privacy-policy.en-us.common.html:118: <h5 class="title is-5">2. Data Deletion</h5> 906 + templates/privacy-policy.en-us.common.html:123: <h5 class="title is-5">3. Do Not Track</h5> 907 + templates/privacy-policy.en-us.common.html:129:<section class="section py-3"> 908 + templates/privacy-policy.en-us.common.html:130: <div class="container content"> 909 + templates/privacy-policy.en-us.common.html:131: <h4 class="title is-4">Data Security and Retention</h4> 910 + templates/privacy-policy.en-us.common.html:142:<section class="section py-3"> 911 + templates/privacy-policy.en-us.common.html:143: <div class="container content"> 912 + templates/privacy-policy.en-us.common.html:144: <h4 class="title is-4">Children's Privacy</h4> 913 + templates/privacy-policy.en-us.common.html:151:<section class="section py-3"> 914 + templates/privacy-policy.en-us.common.html:152: <div class="container content"> 915 + templates/privacy-policy.en-us.common.html:153: <h4 class="title is-4">Indexed Data, External Content, and Third-Party Links</h4> 916 + templates/privacy-policy.en-us.common.html:166:<section class="section py-3"> 917 + templates/privacy-policy.en-us.common.html:167: <div class="container content"> 918 + templates/privacy-policy.en-us.common.html:168: <h4 class="title is-4">Changes to This Privacy Policy</h4> 919 + templates/privacy-policy.en-us.html:1:{% extends "base.en-us.html" %} 920 + templates/profile.en-us.bare.html:1:{% extends "bare.en-us.html" %} 921 + templates/profile.en-us.common.html:1:{%- from "pagination.html" import view_pagination -%} 922 + templates/profile.en-us.common.html:2:<section class="section"> 923 + templates/profile.en-us.common.html:3: <div class="container"> 924 + templates/profile.en-us.common.html:4: <h1 class="title">@{{ profile.handle }}</h1> 925 + templates/profile.en-us.common.html:5: <div class="buttons"> 926 + templates/profile.en-us.common.html:6: <a class="button is-link is-outlined" href="https://bsky.app/profile/{{ profile.did }}" target="_blank"> 927 + templates/profile.en-us.common.html:7: <span class="icon"> 928 + templates/profile.en-us.common.html:8: <i class="fab fa-bluesky"></i> 929 + templates/profile.en-us.common.html:14: <a class="button is-info" href="/settings" hx-boost="true"> 930 + templates/profile.en-us.common.html:15: <span class="icon"> 931 + templates/profile.en-us.common.html:16: <i class="fas fa-cog"></i> 932 + templates/profile.en-us.common.html:21: <a class="button is-primary is-outlined" href="/import"> 933 + templates/profile.en-us.common.html:22: <span class="icon"> 934 + templates/profile.en-us.common.html:23: <i class="fas fa-download"></i> 935 + templates/profile.en-us.common.html:31:<section class="section"> 936 + templates/profile.en-us.common.html:32: <div class="container"> 937 + templates/profile.en-us.common.html:33: <div class="tabs"> 938 + templates/profile.en-us.common.html:35: <li class="is-active"><a>Recently Updated</a></li> 939 + templates/profile.en-us.common.html:40: {{ view_pagination((canonical_url ~ "?"), pagination) }} 940 + templates/profile.en-us.html:1:{% extends "base.en-us.html" %} 941 + templates/profile.en-us.html:4:<link rel="alternate" href="at://{{ profile.did }}" /> 942 + templates/profile.en-us.html:5:<meta name="description" content="@{{ profile.handle }} {{ profile.did }} on Smoke Signal"> 943 + templates/profile.en-us.html:6:<meta property="og:title" content="@{{ profile.handle }}" /> 944 + templates/profile.en-us.html:7:<meta property="og:description" content="@{{ profile.handle }} {{ profile.did }} on Smoke Signal" /> 945 + templates/profile.en-us.html:8:<meta property="og:type" content="website" /> 946 + templates/profile.en-us.html:9:<meta property="og:url" content="{{ external_base }}/{{ profile.did }}" /> 947 + templates/profile.en-us.html:10:<meta property="og:site_name" content="Smoke Signal" /> 948 + templates/profile.en-us.html:11:<script type="application/ld+json"> 949 + templates/profile.en-us.html:13: "@context": "https://schema.org", 950 + templates/profile.en-us.html:14: "@type": "Person", 951 + templates/profile.en-us.html:15: "name": "@{{ profile.handle }}", 952 + templates/profile.en-us.html:16: "url": "{{ external_base }}/{{ profile.did }}" 953 + templates/settings.en-us.bare.html:1:{% extends "bare.en-us.html" %} 954 + templates/settings.en-us.common.html:1:<section class="section"> 955 + templates/settings.en-us.common.html:2: <div class="container"> 956 + templates/settings.en-us.common.html:3: <div class="card"> 957 + templates/settings.en-us.common.html:4: <div class="card-content"> 958 + templates/settings.en-us.common.html:5: <div class="content"> 959 + templates/settings.en-us.common.html:6: <div class="columns"> 960 + templates/settings.en-us.common.html:7: <div class="column is-half"> 961 + templates/settings.en-us.common.html:8: <h2 class="subtitle">Account Information</h2> 962 + templates/settings.en-us.common.html:9: <div class="field"> 963 + templates/settings.en-us.common.html:10: <label class="label">DID</label> 964 + templates/settings.en-us.common.html:11: <div class="control"> 965 + templates/settings.en-us.common.html:12: <input class="input" type="text" value="{{ current_handle.did }}" readonly> 966 + templates/settings.en-us.common.html:16: <div class="field"> 967 + templates/settings.en-us.common.html:17: <label class="label">Handle</label> 968 + templates/settings.en-us.common.html:18: <div class="control"> 969 + templates/settings.en-us.common.html:19: <input class="input" type="text" value="{{ current_handle.handle }}" readonly> 970 + templates/settings.en-us.common.html:23: <div class="field"> 971 + templates/settings.en-us.common.html:24: <label class="label">PDS</label> 972 + templates/settings.en-us.common.html:25: <div class="control"> 973 + templates/settings.en-us.common.html:26: <input class="input" type="text" value="{{ current_handle.pds }}" readonly> 974 + templates/settings.en-us.common.html:31: <div class="column is-half"> 975 + templates/settings.en-us.common.html:32: <h2 class="subtitle">Preferences</h2> 976 + templates/settings.en-us.common.html:34: <div id="language-form"> 977 + templates/settings.en-us.common.html:35: {% include "settings.en-us.language.html" %} 978 + templates/settings.en-us.common.html:38: <div id="timezone-form"> 979 + templates/settings.en-us.common.html:39: {% include "settings.en-us.tz.html" %} 980 + templates/settings.en-us.html:1:{% extends "base.en-us.html" %} 981 + templates/settings.en-us.html:4:<section class="section"> 982 + templates/settings.en-us.html:5: <div class="container"> 983 + templates/settings.en-us.html:6: <h1 class="title">Settings</h1> 984 + templates/settings.en-us.html:9: <div class="notification is-success"> 985 + templates/settings.en-us.html:10: <button class="delete"></button> 986 + templates/settings.en-us.html:15: {% include "settings.en-us.common.html" %} 987 + templates/settings.en-us.language.html:1:<div class="field"> 988 + templates/settings.en-us.language.html:2: <label class="label">Language</label> 989 + templates/settings.en-us.language.html:3: <div class="control"> 990 + templates/settings.en-us.language.html:4: <div class="select"> 991 + templates/settings.en-us.language.html:5: <select name="language" 992 + templates/settings.en-us.language.html:6: hx-post="/settings/language" 993 + templates/settings.en-us.language.html:7: hx-target="#language-form" 994 + templates/settings.en-us.language.html:8: hx-swap="innerHTML" 995 + templates/settings.en-us.language.html:9: hx-trigger="change" 996 + templates/settings.en-us.language.html:13: <option value="{{ lang }}" {% if lang == current_handle.language %}selected{% endif %}>{{ lang }}</option> 997 + templates/settings.en-us.language.html:19: <p class="help is-success">Language updated successfully.</p> 998 + templates/settings.en-us.tz.html:1:<div class="field"> 999 + templates/settings.en-us.tz.html:2: <label class="label">Time Zone</label> 1000 + templates/settings.en-us.tz.html:3: <div class="control"> 1001 + templates/settings.en-us.tz.html:4: <div class="select"> 1002 + templates/settings.en-us.tz.html:5: <select name="timezone" hx-post="/settings/timezone" hx-target="#timezone-form" hx-swap="innerHTML" 1003 + templates/settings.en-us.tz.html:6: hx-trigger="change" data-loading-disable data-loading-aria-busy> 1004 + templates/settings.en-us.tz.html:8: <option value="{{ tz }}" {% if tz==current_handle.tz %}selected{% endif %}>{{ tz }}</option> 1005 + templates/settings.en-us.tz.html:14: <p class="help is-success">Time zone updated successfully.</p> 1006 + templates/terms-of-service.en-us.bare.html:1:{% extends "bare.en-us.html" %} 1007 + templates/terms-of-service.en-us.common.html:1:<section class="section pb-3"> 1008 + templates/terms-of-service.en-us.common.html:2: <div class="container"> 1009 + templates/terms-of-service.en-us.common.html:3: <h1 class="title is-1">Terms of Service</h1> 1010 + templates/terms-of-service.en-us.common.html:4: <h2 class="subtitle">Effective Date: May 8th, 2025</h2> 1011 + templates/terms-of-service.en-us.common.html:7:<section class="section py-3"> 1012 + templates/terms-of-service.en-us.common.html:8: <div class="container content"> 1013 + templates/terms-of-service.en-us.common.html:9: <h4 class="title is-4">Service Description</h4> 1014 + templates/terms-of-service.en-us.common.html:11: Smoke Signal ("we", "us", or "our") is an event and RSVP management application built on top of the 1015 + templates/terms-of-service.en-us.common.html:13: <a href="https://smokesignal.events/">https://smokesignal.events</a> (the "Site"). 1016 + templates/terms-of-service.en-us.common.html:21:<section class="section py-3"> 1017 + templates/terms-of-service.en-us.common.html:22: <div class="container content"> 1018 + templates/terms-of-service.en-us.common.html:23: <h4 class="title is-4">User Rights and Responsibilities</h4> 1019 + templates/terms-of-service.en-us.common.html:37:<section class="section py-3"> 1020 + templates/terms-of-service.en-us.common.html:38: <div class="container content"> 1021 + templates/terms-of-service.en-us.common.html:39: <h4 class="title is-4">Content Ownership and Intellectual Property</h4> 1022 + templates/terms-of-service.en-us.common.html:50:<section class="section py-3"> 1023 + templates/terms-of-service.en-us.common.html:51: <div class="container content"> 1024 + templates/terms-of-service.en-us.common.html:52: <h4 class="title is-4">Privacy and Cookie Policy</h4> 1025 + templates/terms-of-service.en-us.common.html:58: <a href="/privacy-policy"> 1026 + templates/terms-of-service.en-us.common.html:63: <a href="/cookie-policy"> 1027 + templates/terms-of-service.en-us.common.html:70:<section class="section py-3"> 1028 + templates/terms-of-service.en-us.common.html:71: <div class="container content"> 1029 + templates/terms-of-service.en-us.common.html:72: <h4 class="title is-4">Open Source Notice</h4> 1030 + templates/terms-of-service.en-us.common.html:76: <a href="https://smokesignal.events/">https://smokesignal.events</a> 1031 + templates/terms-of-service.en-us.common.html:81:<section class="section py-3"> 1032 + templates/terms-of-service.en-us.common.html:82: <div class="container content"> 1033 + templates/terms-of-service.en-us.common.html:83: <h4 class="title is-4">Governing Law</h4> 1034 + templates/terms-of-service.en-us.common.html:91:<section class="section py-3"> 1035 + templates/terms-of-service.en-us.common.html:92: <div class="container content"> 1036 + templates/terms-of-service.en-us.common.html:93: <h4 class="title is-4">Changes to Terms</h4> 1037 + templates/terms-of-service.en-us.html:1:{% extends "base.en-us.html" %} 1038 + templates/view_event.en-us.bare.html:1:{% extends "bare.en-us.html" %} 1039 + templates/view_event.en-us.common.html:1:<section class="section"> 1040 + templates/view_event.en-us.common.html:2: <div class="container"> 1041 + templates/view_event.en-us.common.html:4: <article class="message is-warning"> 1042 + templates/view_event.en-us.common.html:5: <div class="message-body"> 1043 + templates/view_event.en-us.common.html:6: <span class="icon-text"> 1044 + templates/view_event.en-us.common.html:7: <span class="icon"> 1045 + templates/view_event.en-us.common.html:8: <i class="fas fa-exclamation-triangle"></i> 1046 + templates/view_event.en-us.common.html:12: <span class="ml-3"> 1047 + templates/view_event.en-us.common.html:13: <a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary"> 1048 + templates/view_event.en-us.common.html:14: <span class="icon"> 1049 + templates/view_event.en-us.common.html:15: <i class="fas fa-calendar-alt"></i> 1050 + templates/view_event.en-us.common.html:22: <span class="ml-3"> 1051 + templates/view_event.en-us.common.html:23: <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/migrate" class="button is-small is-info"> 1052 + templates/view_event.en-us.common.html:24: <span class="icon"> 1053 + templates/view_event.en-us.common.html:25: <i class="fas fa-arrows-up-to-line"></i> 1054 + templates/view_event.en-us.common.html:35: <article class="message is-info"> 1055 + templates/view_event.en-us.common.html:36: <div class="message-body"> 1056 + templates/view_event.en-us.common.html:37: <span class="icon-text"> 1057 + templates/view_event.en-us.common.html:38: <span class="icon"> 1058 + templates/view_event.en-us.common.html:39: <i class="fas fa-info-circle"></i> 1059 + templates/view_event.en-us.common.html:41: <span>This event was found in the "{{ fallback_collection }}" collection.</span> 1060 + templates/view_event.en-us.common.html:46: <h1 class="title">{{ event.name }}</h1> 1061 + templates/view_event.en-us.common.html:47: <h1 class="subtitle"> 1062 + templates/view_event.en-us.common.html:48: <a href="{{ base }}/{{ event.organizer_did }}"> 1063 + templates/view_event.en-us.common.html:52: <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/edit" 1064 + templates/view_event.en-us.common.html:53: class="button is-small is-outlined is-primary ml-2"> 1065 + templates/view_event.en-us.common.html:54: <span class="icon"> 1066 + templates/view_event.en-us.common.html:55: <i class="fas fa-edit"></i> 1067 + templates/view_event.en-us.common.html:61: <div class="level subtitle"> 1068 + templates/view_event.en-us.common.html:62: {% if event.status == "planned" %} 1069 + templates/view_event.en-us.common.html:63: <span class="icon-text" title="The event is planned."> 1070 + templates/view_event.en-us.common.html:64: <span class="icon"> 1071 + templates/view_event.en-us.common.html:65: <i class="fas fa-calendar-days"></i> 1072 + templates/view_event.en-us.common.html:67: <span class="is-hidden-tablet">Planned</span> 1073 + templates/view_event.en-us.common.html:69: {% elif event.status == "scheduled" %} 1074 + templates/view_event.en-us.common.html:70: <span class="level-item icon-text" title="The event is scheduled."> 1075 + templates/view_event.en-us.common.html:71: <span class="icon"> 1076 + templates/view_event.en-us.common.html:72: <i class="fas fa-calendar-check"></i> 1077 + templates/view_event.en-us.common.html:76: {% elif event.status == "rescheduled" %} 1078 + templates/view_event.en-us.common.html:77: <span class="level-item icon-text is-info" title="The event is rescheduled."> 1079 + templates/view_event.en-us.common.html:78: <span class="icon"> 1080 + templates/view_event.en-us.common.html:79: <i class="fas fa-calendar-plus"></i> 1081 + templates/view_event.en-us.common.html:83: {% elif event.status == "cancelled" %} 1082 + templates/view_event.en-us.common.html:84: <span class="level-item icon-text is-danger" title="The event is cancelled."> 1083 + templates/view_event.en-us.common.html:85: <span class="icon"> 1084 + templates/view_event.en-us.common.html:86: <i class="fas fa-calendar-xmark"></i> 1085 + templates/view_event.en-us.common.html:90: {% elif event.status == "postponed" %} 1086 + templates/view_event.en-us.common.html:91: <span class="level-item icon-text is-warning" title="The event is postponed."> 1087 + templates/view_event.en-us.common.html:92: <span class="icon"> 1088 + templates/view_event.en-us.common.html:93: <i class="fas fa-calendar-minus"></i> 1089 + templates/view_event.en-us.common.html:98: <span class="level-item icon-text" title="No event status set."> 1090 + templates/view_event.en-us.common.html:99: <span class="icon"> 1091 + templates/view_event.en-us.common.html:100: <i class="fas fa-question"></i> 1092 + templates/view_event.en-us.common.html:102: <span class="is-italic">No Status Set</span> 1093 + templates/view_event.en-us.common.html:105: <span class="level-item icon-text" title=" 1094 + templates/view_event.en-us.common.html:111: <span class="icon"> 1095 + templates/view_event.en-us.common.html:112: <i class="fas fa-clock"></i> 1096 + templates/view_event.en-us.common.html:116: <time class="dt-start" {% if event.starts_at_machine %} datetime="{{ event.starts_at_machine }}" {% 1097 + templates/view_event.en-us.common.html:126: <span class="level-item icon-text" title=" 1098 + templates/view_event.en-us.common.html:132: <span class="icon"> 1099 + templates/view_event.en-us.common.html:133: <i class="fas fa-stop"></i> 1100 + templates/view_event.en-us.common.html:137: <time class="dt-end" {% if event.ends_at_machine %} datetime="{{ event.ends_at_machine }}" {% endif 1101 + templates/view_event.en-us.common.html:143: <span class="is-italic">No End Time Set</span> 1102 + templates/view_event.en-us.common.html:147: {% if event.mode == "inperson" %} 1103 + templates/view_event.en-us.common.html:148: <span class="level-item icon-text" title="In Person"> 1104 + templates/view_event.en-us.common.html:149: <span class="icon"> 1105 + templates/view_event.en-us.common.html:150: <i class="fas fa-users"></i> 1106 + templates/view_event.en-us.common.html:154: {% elif event.mode == "virtual" %} 1107 + templates/view_event.en-us.common.html:155: <span class="level-item icon-text" title="An Virtual (Online) Event"> 1108 + templates/view_event.en-us.common.html:156: <span class="icon"> 1109 + templates/view_event.en-us.common.html:157: <i class="fas fa-globe"></i> 1110 + templates/view_event.en-us.common.html:161: {% elif event.mode == "hybrid" %} 1111 + templates/view_event.en-us.common.html:162: <span class="level-item icon-text" title="A Hybrid In-Person and Virtual (Online) Event"> 1112 + templates/view_event.en-us.common.html:163: <span class="icon"> 1113 + templates/view_event.en-us.common.html:164: <i class="fas fa-user-plus"></i> 1114 + templates/view_event.en-us.common.html:171: <div class="level subtitle"> 1115 + templates/view_event.en-us.common.html:172: <span class="level-item"> 1116 + templates/view_event.en-us.common.html:175: <a class="level-item" href="//maps.apple.com/?q={{ event.address_display }}" rel="nofollow" target="blank"> 1117 + templates/view_event.en-us.common.html:176: <span class="icon-text"> 1118 + templates/view_event.en-us.common.html:177: <span class="icon"> 1119 + templates/view_event.en-us.common.html:178: <i class="fab fa-apple"></i> 1120 + templates/view_event.en-us.common.html:183: <a class="level-item" href="//maps.google.com/?q={{ event.address_display }}" rel="nofollow" target="blank"> 1121 + templates/view_event.en-us.common.html:184: <span class="icon-text"> 1122 + templates/view_event.en-us.common.html:185: <span class="icon"> 1123 + templates/view_event.en-us.common.html:186: <i class="fab fa-google"></i> 1124 + templates/view_event.en-us.common.html:196: <div class="level subtitle"> 1125 + templates/view_event.en-us.common.html:197: <a class="level-item" href="{{ link }}" rel="nofollow" target="blank"> 1126 + templates/view_event.en-us.common.html:198: <span class="icon-text"> 1127 + templates/view_event.en-us.common.html:199: <span class="icon"> 1128 + templates/view_event.en-us.common.html:200: <i class="fas fa-link"></i> 1129 + templates/view_event.en-us.common.html:209: <article class="message is-info"> 1130 + templates/view_event.en-us.common.html:210: <div class="message-body"> 1131 + templates/view_event.en-us.common.html:211: <span class="icon-text"> 1132 + templates/view_event.en-us.common.html:212: <span class="icon"> 1133 + templates/view_event.en-us.common.html:213: <i class="fas fa-info-circle"></i> 1134 + templates/view_event.en-us.common.html:217: <span>Please use the <a href="{{ base }}{{ standard_event_url }}">standard 1135 + templates/view_event.en-us.common.html:220: <div class="mt-2"> 1136 + templates/view_event.en-us.common.html:221: <a href="{{ base }}/{{ handle_slug }}/{{ event_rkey }}/migrate-rsvp" 1137 + templates/view_event.en-us.common.html:222: class="button is-small is-info"> 1138 + templates/view_event.en-us.common.html:223: <span class="icon"> 1139 + templates/view_event.en-us.common.html:224: <i class="fas fa-sync-alt"></i> 1140 + templates/view_event.en-us.common.html:230: <div class="mt-2"> 1141 + templates/view_event.en-us.common.html:231: <span class="tag is-success"> 1142 + templates/view_event.en-us.common.html:232: <span class="icon"> 1143 + templates/view_event.en-us.common.html:233: <i class="fas fa-check"></i> 1144 + templates/view_event.en-us.common.html:244: <article class="message is-success"> 1145 + templates/view_event.en-us.common.html:245: <div class="message-body"> 1146 + templates/view_event.en-us.common.html:246: <a href="{{ base }}/oauth/login">Log in</a> to RSVP to this 1147 + templates/view_event.en-us.common.html:252: <article class="message" id="rsvpFrame"> 1148 + templates/view_event.en-us.common.html:253: <div class="message-body"> 1149 + templates/view_event.en-us.common.html:254: <div class="columns is-vcentered is-multiline"> 1150 + templates/view_event.en-us.common.html:255: <div class="column"> 1151 + templates/view_event.en-us.common.html:258: <div class="column"> 1152 + templates/view_event.en-us.common.html:259: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1153 + templates/view_event.en-us.common.html:260: hx-swap="outerHTML" 1154 + templates/view_event.en-us.common.html:261: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1155 + templates/view_event.en-us.common.html:262: <span class="icon"> 1156 + templates/view_event.en-us.common.html:263: <i class="fas fa-star"></i> 1157 + templates/view_event.en-us.common.html:268: <div class="column"> 1158 + templates/view_event.en-us.common.html:269: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1159 + templates/view_event.en-us.common.html:270: hx-swap="outerHTML" 1160 + templates/view_event.en-us.common.html:271: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1161 + templates/view_event.en-us.common.html:272: <span class="icon"> 1162 + templates/view_event.en-us.common.html:273: <i class="fas fa-eye"></i> 1163 + templates/view_event.en-us.common.html:278: <div class="column"> 1164 + templates/view_event.en-us.common.html:279: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1165 + templates/view_event.en-us.common.html:280: hx-swap="outerHTML" 1166 + templates/view_event.en-us.common.html:281: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1167 + templates/view_event.en-us.common.html:282: <span class="icon"> 1168 + templates/view_event.en-us.common.html:283: <i class="fas fa-ban"></i> 1169 + templates/view_event.en-us.common.html:291: {% elif user_rsvp_status == "going" %} 1170 + templates/view_event.en-us.common.html:292: <article class="message is-info" id="rsvpFrame"> 1171 + templates/view_event.en-us.common.html:293: <div class="message-body"> 1172 + templates/view_event.en-us.common.html:294: <div class="columns is-vcentered is-multiline"> 1173 + templates/view_event.en-us.common.html:295: <div class="column"> 1174 + templates/view_event.en-us.common.html:298: <div class="column"> 1175 + templates/view_event.en-us.common.html:299: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1176 + templates/view_event.en-us.common.html:300: hx-swap="outerHTML" 1177 + templates/view_event.en-us.common.html:301: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1178 + templates/view_event.en-us.common.html:302: <span class="icon"> 1179 + templates/view_event.en-us.common.html:303: <i class="fas fa-eye"></i> 1180 + templates/view_event.en-us.common.html:308: <div class="column"> 1181 + templates/view_event.en-us.common.html:309: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1182 + templates/view_event.en-us.common.html:310: hx-swap="outerHTML" 1183 + templates/view_event.en-us.common.html:311: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1184 + templates/view_event.en-us.common.html:312: <span class="icon"> 1185 + templates/view_event.en-us.common.html:313: <i class="fas fa-ban"></i> 1186 + templates/view_event.en-us.common.html:321: {% elif user_rsvp_status == "interested" %} 1187 + templates/view_event.en-us.common.html:322: <article class="message is-info" id="rsvpFrame"> 1188 + templates/view_event.en-us.common.html:323: <div class="message-body"> 1189 + templates/view_event.en-us.common.html:324: <div class="columns is-vcentered is-multiline"> 1190 + templates/view_event.en-us.common.html:325: <div class="column"> 1191 + templates/view_event.en-us.common.html:328: <div class="column"> 1192 + templates/view_event.en-us.common.html:329: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1193 + templates/view_event.en-us.common.html:330: hx-swap="outerHTML" 1194 + templates/view_event.en-us.common.html:331: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1195 + templates/view_event.en-us.common.html:332: <span class="icon"> 1196 + templates/view_event.en-us.common.html:333: <i class="fas fa-star"></i> 1197 + templates/view_event.en-us.common.html:338: <div class="column"> 1198 + templates/view_event.en-us.common.html:339: <button class="button is-warning is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1199 + templates/view_event.en-us.common.html:340: hx-swap="outerHTML" 1200 + templates/view_event.en-us.common.html:341: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1201 + templates/view_event.en-us.common.html:342: <span class="icon"> 1202 + templates/view_event.en-us.common.html:343: <i class="fas fa-ban"></i> 1203 + templates/view_event.en-us.common.html:351: {% elif user_rsvp_status == "notgoing" %} 1204 + templates/view_event.en-us.common.html:352: <article class="message is-warning" id="rsvpFrame"> 1205 + templates/view_event.en-us.common.html:353: <div class="message-body"> 1206 + templates/view_event.en-us.common.html:354: <div class="columns is-vcentered is-multiline"> 1207 + templates/view_event.en-us.common.html:355: <div class="column"> 1208 + templates/view_event.en-us.common.html:358: <div class="column"> 1209 + templates/view_event.en-us.common.html:359: <button class="button is-success is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1210 + templates/view_event.en-us.common.html:360: hx-swap="outerHTML" 1211 + templates/view_event.en-us.common.html:361: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1212 + templates/view_event.en-us.common.html:362: <span class="icon"> 1213 + templates/view_event.en-us.common.html:363: <i class="fas fa-star"></i> 1214 + templates/view_event.en-us.common.html:368: <div class="column"> 1215 + templates/view_event.en-us.common.html:369: <button class="button is-link is-fullwidth" hx-post="/rsvp" hx-target="#rsvpFrame" 1216 + templates/view_event.en-us.common.html:370: hx-swap="outerHTML" 1217 + templates/view_event.en-us.common.html:371: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1218 + templates/view_event.en-us.common.html:372: <span class="icon"> 1219 + templates/view_event.en-us.common.html:373: <i class="fas fa-eye"></i> 1220 + templates/view_event.en-us.common.html:386:<section class="section"> 1221 + templates/view_event.en-us.common.html:387: <div class="container" style="word-break: break-word; white-space: pre-wrap;"> 1222 + templates/view_event.en-us.common.html:394:<section class="section"> 1223 + templates/view_event.en-us.common.html:395: <div class="container"> 1224 + templates/view_event.en-us.common.html:397: <div class="tabs"> 1225 + templates/view_event.en-us.common.html:399: <li {% if active_tab=="going" %}class="is-active" {% endif %}> 1226 + templates/view_event.en-us.common.html:400: <a href="?tab=going&collection={{ fallback_collection if using_fallback_collection else collection }}" 1227 + templates/view_event.en-us.common.html:401: rel="nofollow"> 1228 + templates/view_event.en-us.common.html:402: Going ({{ event.count_going | default("0") }}) 1229 + templates/view_event.en-us.common.html:405: <li {% if active_tab=="interested" %}class="is-active" {% endif %}> 1230 + templates/view_event.en-us.common.html:406: <a href="?tab=interested&collection={{ fallback_collection if using_fallback_collection else collection }}" 1231 + templates/view_event.en-us.common.html:407: rel="nofollow"> 1232 + templates/view_event.en-us.common.html:408: Interested ({{ event.count_interested | default("0") }}) 1233 + templates/view_event.en-us.common.html:411: <li {% if active_tab=="notgoing" %}class="is-active" {% endif %}> 1234 + templates/view_event.en-us.common.html:412: <a href="?tab=notgoing&collection={{ fallback_collection if using_fallback_collection else collection }}" 1235 + templates/view_event.en-us.common.html:413: rel="nofollow"> 1236 + templates/view_event.en-us.common.html:414: Not Going ({{ event.count_not_going | default("0") }}) 1237 + templates/view_event.en-us.common.html:419: <div class="grid is-col-min-12 has-text-centered"> 1238 + templates/view_event.en-us.common.html:420: {% if active_tab == "going" %} 1239 + templates/view_event.en-us.common.html:422: <span class="cell"> 1240 + templates/view_event.en-us.common.html:423: <a href="/@{{ handle }}">@{{ handle }}</a> 1241 + templates/view_event.en-us.common.html:426: {% elif active_tab == "interested" %} 1242 + templates/view_event.en-us.common.html:428: <span class="cell"> 1243 + templates/view_event.en-us.common.html:429: <a href="/@{{ handle }}">@{{ handle }}</a> 1244 + templates/view_event.en-us.common.html:434: <span class="cell"> 1245 + templates/view_event.en-us.common.html:435: <a href="/@{{ handle }}">@{{ handle }}</a> 1246 + templates/view_event.en-us.common.html:441: <div class="notification is-light"> 1247 + templates/view_event.en-us.common.html:442: <p class="has-text-centered"> 1248 + templates/view_event.en-us.common.html:445: <br><a href="{{ base }}{{ standard_event_url }}" class="button is-small is-primary mt-2"> 1249 + templates/view_event.en-us.common.html:446: <span class="icon"> 1250 + templates/view_event.en-us.common.html:447: <i class="fas fa-calendar-alt"></i> 1251 + templates/view_event.en-us.html:1:{% extends "base.en-us.html" %} 1252 + templates/view_event.en-us.html:4:<meta name="description" content="{{ event.description_short }}"> 1253 + templates/view_event.en-us.html:5:<meta property="og:title" content="{{ event.name }}"> 1254 + templates/view_event.en-us.html:6:<meta property="og:description" content="{{ event.description_short }}"> 1255 + templates/view_event.en-us.html:7:<meta property="og:site_name" content="Smoke Signal" /> 1256 + templates/view_event.en-us.html:8:<meta property="og:type" content="website" /> 1257 + templates/view_event.en-us.html:9:<meta property="og:url" content="{{ base }}{{ event.site_url }}" /> 1258 + templates/view_event.en-us.html:10:<script type="application/ld+json"> 1259 + templates/view_event.en-us.html:12: "@context": "https://schema.org", 1260 + templates/view_event.en-us.html:13: "@type": "Event", 1261 + templates/view_event.en-us.html:14: "name": "{{ event.name }}", 1262 + templates/view_event.en-us.html:15: "description": "{{ event.description_short }}", 1263 + templates/view_event.en-us.html:16: "url": "{{ base }}{{ event.site_url }}" 1264 + templates/view_event.en-us.html:19:<link rel="alternate" href="{{ event.aturi }}" /> 1265 + templates/view_rsvp.en-us.bare.html:1:{% extends "bare.en-us.html" %} 1266 + templates/view_rsvp.en-us.common.html:1:<section class="section"> 1267 + templates/view_rsvp.en-us.common.html:2: <div class="container"> 1268 + templates/view_rsvp.en-us.common.html:3: <div class="content"> 1269 + templates/view_rsvp.en-us.common.html:4: <h1 class="title">RSVP Viewer</h1> 1270 + templates/view_rsvp.en-us.common.html:6: <div class="box"> 1271 + templates/view_rsvp.en-us.common.html:7: <form hx-get="/rsvps" hx-target="#rsvp-result" hx-swap="innerHTML" hx-indicator="#spinner"> 1272 + templates/view_rsvp.en-us.common.html:8: <div class="field"> 1273 + templates/view_rsvp.en-us.common.html:9: <label class="label">RSVP AT-URI</label> 1274 + templates/view_rsvp.en-us.common.html:10: <div class="control"> 1275 + templates/view_rsvp.en-us.common.html:11: <input class="input" type="text" name="aturi" placeholder="at://did:plc:example/community.lexicon.calendar.rsvp/abcdef123" required> 1276 + templates/view_rsvp.en-us.common.html:13: <p class="help">Enter the full AT-URI of the RSVP you want to view</p> 1277 + templates/view_rsvp.en-us.common.html:16: <div class="field"> 1278 + templates/view_rsvp.en-us.common.html:17: <div class="control"> 1279 + templates/view_rsvp.en-us.common.html:18: <button class="button is-primary" type="submit"> 1280 + templates/view_rsvp.en-us.common.html:20: <span id="spinner" class="htmx-indicator"> 1281 + templates/view_rsvp.en-us.common.html:21: <i class="fas fa-spinner fa-spin"></i> 1282 + templates/view_rsvp.en-us.common.html:28: <div id="rsvp-result"> 1283 + templates/view_rsvp.en-us.html:1:{% extends "base.en-us.html" %} 1284 + templates/view_rsvp.en-us.html:4:<meta property="og:site_name" content="Smoke Signal" /> 1285 + templates/view_rsvp.en-us.html:5:<meta property="og:type" content="website" /> 1286 + templates/view_rsvp.en-us.partial.html:1:<div class="content"> 1287 + templates/view_rsvp.en-us.partial.html:5: <div class="box"> 1288 + templates/acknowledgement.en-us.bare.html:3:{% include 'acknowledgement.en-us.common.html' %} 1289 + templates/acknowledgement.en-us.html:5:{% include 'acknowledgement.en-us.common.html' %} 1290 + templates/admin_denylist.en-us.html:2:{% include 'pagination.html' %} 1291 + templates/admin_events.en-us.html:2:{% include 'pagination.html' %} 1292 + templates/admin_handles.en-us.html:2:{% include 'pagination.html' %} 1293 + templates/admin_rsvps.en-us.html:2:{% include 'pagination.html' %} 1294 + templates/alert.en-us.bare.html:5: {% include 'alert.en-us.partial.html' %} 1295 + templates/alert.en-us.html:7: {% include 'alert.en-us.partial.html' %} 1296 + templates/bare.en-us.html:1:{% include 'nav.en-us.html' %} 1297 + templates/bare.en-us.html:3:{% include 'footer.en-us.html' %} 1298 + templates/base.en-us.html:22: {% include 'nav.en-us.html' %} 1299 + templates/base.en-us.html:24: {% include 'footer.en-us.html' %} 1300 + templates/cookie-policy.en-us.bare.html:3:{% include 'cookie-policy.en-us.common.html' %} 1301 + templates/cookie-policy.en-us.html:5:{% include 'cookie-policy.en-us.common.html' %} 1302 + templates/create_event.en-us.bare.html:3:{% include 'create_event.en-us.common.html' %} 1303 + templates/create_event.en-us.common.html:25: {% include 'create_event.en-us.partial.html' %} 1304 + templates/create_event.en-us.html:5:{% include 'create_event.en-us.common.html' %} 1305 + templates/create_event.en-us.link_form.html:12: {{ text_input('Link Name (optional)', 'linkName', 'link_name', 1306 + templates/create_event.en-us.link_form.html:13: value=link_form.link_name, error=link_form.link_name_error, extra='placeholder="Tickets"') }} 1307 + templates/create_event.en-us.link_form.html:15: {{ text_input('Link (required)', 'linkValue', 'link_value', 1308 + templates/create_event.en-us.link_form.html:17: extra='placeholder="https://smokesignal.tickets/"') }} 1309 + templates/create_event.en-us.link_form.html:23: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 1310 + templates/create_event.en-us.link_form.html:27: hx-trigger="click" hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 1311 + templates/create_event.en-us.link_form.html:34: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 1312 + templates/create_event.en-us.link_form.html:39: {{ text_input_display('Link Name', 'link_name', value=link_form.link_name) }} 1313 + templates/create_event.en-us.link_form.html:41: {{ text_input_display('Link', 'link_value', value=link_form.link_value) }} 1314 + templates/create_event.en-us.link_form.html:46: hx-params="build_state,link_name,link_value" hx-vals='{ "build_state": "Selecting" }' 1315 + templates/create_event.en-us.link_form.html:51: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 1316 + templates/create_event.en-us.link_form.html:62: {{ text_input('Link', 'linkResetPlaceholder', value='--', class_extra=' is-static', extra=' readonly ') }} 1317 + templates/create_event.en-us.link_form.html:67: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 1318 + templates/create_event.en-us.location_form.html:35: {{ text_input('Location Name (optional)', 'locationAddressName', 'location_name', 1319 + templates/create_event.en-us.location_form.html:37: extra='autocomplete="off" data-1p-ignore placeholder="The Gem City"') }} 1320 + templates/create_event.en-us.location_form.html:39: {{ text_input('Street Address (optional)', 'locationAddressStreet', 'location_street', 1321 + templates/create_event.en-us.location_form.html:41: extra='autocomplete="off" data-1p-ignore placeholder="555 Somewhere"') }} 1322 + templates/create_event.en-us.location_form.html:43: {{ text_input('Locality ("City", optional)', 'locationAddressLocality', 'location_locality', 1323 + templates/create_event.en-us.location_form.html:45: extra='autocomplete="off" data-1p-ignore placeholder="Dayton"') }} 1324 + templates/create_event.en-us.location_form.html:47: {{ text_input('Region ("State", optional)', 'locationAddressRegion', 'location_region', 1325 + templates/create_event.en-us.location_form.html:49: extra='autocomplete="off" data-1p-ignore placeholder="Ohio"') }} 1326 + templates/create_event.en-us.location_form.html:51: {{ text_input('Postal Code (optional)', 'locationAddressPostalCode', 'location_postal_code', 1327 + templates/create_event.en-us.location_form.html:53: extra='autocomplete="off" data-1p-ignore placeholder="11111"') }} 1328 + templates/create_event.en-us.location_form.html:60: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 1329 + templates/create_event.en-us.location_form.html:66: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 1330 + templates/create_event.en-us.location_form.html:71: {{ text_input_display('Location Name', 'location_name', value=location_form.location_name) }} 1331 + templates/create_event.en-us.location_form.html:73: {{ text_input_display('Street Address', 'location_street', value=location_form.location_street) }} 1332 + templates/create_event.en-us.location_form.html:75: {{ text_input_display('Locality', 'location_locality', value=location_form.location_locality) }} 1333 + templates/create_event.en-us.location_form.html:77: {{ text_input_display('Region', 'location_region', value=location_form.location_region) }} 1334 + templates/create_event.en-us.location_form.html:79: {{ text_input_display('Postal Code', 'location_postal_code', value=location_form.location_postal_code) }} 1335 + templates/create_event.en-us.location_form.html:81: {{ text_input_display('Location Country', 'location_country', value=location_form.location_country) }} 1336 + templates/create_event.en-us.location_form.html:87: hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" data-bs-target="startAtModal" 1337 + templates/create_event.en-us.location_form.html:92: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 1338 + templates/create_event.en-us.location_form.html:129: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 1339 + templates/create_event.en-us.location_form.html:145: {{ text_input('Location Name (optional)', 'locationAddressName', 'location_name', 1340 + templates/create_event.en-us.location_form.html:149: {{ text_input('Street Address (optional)', 'locationAddressStreet', 'location_street', 1341 + templates/create_event.en-us.location_form.html:151: extra='placeholder="555 Somewhere"') }} 1342 + templates/create_event.en-us.location_form.html:155: {{ text_input('Locality ("City", optional)', 'locationAddressLocality', 'location_locality', 1343 + templates/create_event.en-us.location_form.html:157: extra='placeholder="Dayton"') }} 1344 + templates/create_event.en-us.location_form.html:159: {{ text_input('Region ("State", optional)', 'locationAddressRegion', 'location_region', 1345 + templates/create_event.en-us.location_form.html:161: extra='placeholder="Ohio"') }} 1346 + templates/create_event.en-us.location_form.html:163: {{ text_input('Postal Code (optional)', 'locationAddressPostalCode', 'location_postal_code', 1347 + templates/create_event.en-us.location_form.html:165: extra='placeholder="11111"') }} 1348 + templates/create_event.en-us.location_form.html:174: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 1349 + templates/create_event.en-us.location_form.html:178: hx-trigger="click" hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 1350 + templates/create_event.en-us.location_form.html:185: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 1351 + templates/create_event.en-us.location_form.html:189: {{ text_input('Location Name', 'locationAddressName', 'location_name', 1352 + templates/create_event.en-us.location_form.html:190: value=(location_form.location_name if location_form.location_name is not none else '--'), 1353 + templates/create_event.en-us.location_form.html:191: error=location_form.location_name_error, class_extra=" is-static", extra=' readonly ') }} 1354 + templates/create_event.en-us.location_form.html:193: {{ text_input('Street Address', 'locationAddressStreet', 'location_street', 1355 + templates/create_event.en-us.location_form.html:194: value=(location_form.location_street if location_form.location_street is not none else '--'), 1356 + templates/create_event.en-us.location_form.html:195: error=location_form.location_street_error, class_extra=" is-static", extra=' readonly ') }} 1357 + templates/create_event.en-us.location_form.html:199: {{ text_input('Locality', 'locationAddressLocality', 'location_locality', 1358 + templates/create_event.en-us.location_form.html:200: value=(location_form.location_locality if location_form.location_locality is not none else '--'), 1359 + templates/create_event.en-us.location_form.html:201: error=location_form.location_locality_error, class_extra=" is-static", extra=' readonly ') }} 1360 + templates/create_event.en-us.location_form.html:203: {{ text_input('Region', 'locationAddressRegion', 'location_region', 1361 + templates/create_event.en-us.location_form.html:204: value=(location_form.location_region if location_form.location_region is not none else '--'), 1362 + templates/create_event.en-us.location_form.html:205: error=location_form.location_region_error, class_extra=" is-static", extra=' readonly ') }} 1363 + templates/create_event.en-us.location_form.html:207: {{ text_input('Postal Code', 'locationAddressPostalCode', 'location_postal_code', 1364 + templates/create_event.en-us.location_form.html:208: value=(location_form.location_postal_code if location_form.location_postal_code is not none else '--'), 1365 + templates/create_event.en-us.location_form.html:209: error=location_form.location_postal_code_error, class_extra=" is-static", extra=' readonly ') }} 1366 + templates/create_event.en-us.location_form.html:216: hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 1367 + templates/create_event.en-us.location_form.html:220: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="button is-danger">Clear</button> 1368 + templates/create_event.en-us.location_form.html:225: {{ text_input('Location', 'locationResetPlaceholder', value='--', class_extra=' is-static', extra=' readonly ') 1369 + templates/create_event.en-us.location_form.html:231: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 1370 + templates/create_event.en-us.partial.html:74: <option {% if build_event_form.status=='planned' or not build_event_form.status %} 1371 + templates/create_event.en-us.partial.html:78: <option {% if build_event_form.status=='scheduled' %} selected="selected" {% endif %} 1372 + templates/create_event.en-us.partial.html:82: <option {% if build_event_form.status=='cancelled' %} selected="selected" {% endif %} 1373 + templates/create_event.en-us.partial.html:86: <option {% if build_event_form.status=='postponed' %} selected="selected" {% endif %} 1374 + templates/create_event.en-us.partial.html:90: <option {% if build_event_form.status=='rescheduled' %} selected="selected" {% endif %} 1375 + templates/create_event.en-us.partial.html:107: <option value="virtual" {% if build_event_form.mode=='virtual' %} selected{% endif %}> 1376 + templates/create_event.en-us.partial.html:110: <option value="hybrid" {% if build_event_form.mode=='hybrid' %} selected{% endif %}>Hybrid 1377 + templates/create_event.en-us.partial.html:112: <option value="inperson" {% if build_event_form.mode=='inperson' or not 1378 + templates/create_event.en-us.starts_form.html:76: hx-vals='{ "build_state": "Selecting", "include_ends": false }' 1379 + templates/create_event.en-us.starts_form.html:85: hx-vals='{ "build_state": "Selecting", "include_ends": true }' 1380 + templates/create_event.en-us.starts_form.html:94: hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 1381 + templates/create_event.en-us.starts_form.html:100: hx-params="build_state" hx-vals='{ "build_state": "Reset" }' class="modal-close is-large" 1382 + templates/create_event.en-us.starts_form.html:117: value="{{ starts_form.ends_display if starts_form.ends_display is not none else '---' }}" readonly /> 1383 + templates/create_event.en-us.starts_form.html:124: hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" 1384 + templates/create_event.en-us.starts_form.html:129: hx-params="build_state,tz" hx-vals='{ "build_state": "Reset" }' 1385 + templates/create_event.en-us.starts_form.html:174: hx-params="build_state" hx-vals='{ "build_state": "Selecting" }' 1386 + templates/create_rsvp.en-us.bare.html:3:{% include 'create_rsvp.en-us.common.html' %} 1387 + templates/create_rsvp.en-us.common.html:24: {% include 'create_rsvp.en-us.partial.html' %} 1388 + templates/create_rsvp.en-us.html:5:{% include 'create_rsvp.en-us.common.html' %} 1389 + templates/create_rsvp.en-us.partial.html:74: <option {% if build_rsvp_form.status=='going' or not build_rsvp_form.status %} selected="selected" {% endif %} value="going"> 1390 + templates/create_rsvp.en-us.partial.html:77: <option {% if build_rsvp_form.status=='interested' %} selected="selected" {% endif %} value="interested"> 1391 + templates/create_rsvp.en-us.partial.html:80: <option {% if build_rsvp_form.status=='notgoing' %} selected="selected" {% endif %} value="notgoing"> 1392 + templates/edit_event.en-us.bare.html:3:{% include 'edit_event.en-us.common.html' %} 1393 + templates/edit_event.en-us.common.html:8: {% include 'create_event.en-us.partial.html' %} 1394 + templates/edit_event.en-us.html:5:{% include 'edit_event.en-us.common.html' %} 1395 + templates/edit_event.en-us.partial.html:1:{% include 'create_event.en-us.partial.html' %} 1396 + templates/event_list.en-us.incl.html:16: {%- if role == 'going' -%} 1397 + templates/event_list.en-us.incl.html:18: {%- elif role == 'interested' -%} 1398 + templates/event_list.en-us.incl.html:20: {%- elif role == 'notgoing' -%} 1399 + templates/event_list.en-us.incl.html:22: {%- elif role == 'organizer' -%} 1400 + templates/event_list.en-us.incl.html:30: {%- if role == 'going' -%} 1401 + templates/event_list.en-us.incl.html:32: {%- elif role == 'interested' -%} 1402 + templates/event_list.en-us.incl.html:34: {%- elif role == 'notgoing' -%} 1403 + templates/event_list.en-us.incl.html:36: {%- elif role == 'organizer' -%} 1404 + templates/form_include.html:14: <input type="text" class="input is-static" id="{{ id }}" value="{{ value if value is not none else '--' }}" readonly> 1405 + templates/import.en-us.bare.html:3:{% include 'import.en-us.common.html' %} 1406 + templates/import.en-us.common.html:9: {% include 'import.en-us.partial.html' %} 1407 + templates/import.en-us.html:5:{% include 'import.en-us.common.html' %} 1408 + templates/import.en-us.partial.html:8: hx-vals='{ {% if collection %} "collection": "{{ collection }}", {% endif %}{% if cursor %} "cursor": "{{ cursor }}", {% endif %} "ignore":"this"}'> 1409 + templates/index.en-us.bare.html:3:{% include 'index.en-us.common.html' %} 1410 + templates/index.en-us.common.html:26: {% include 'event_list.en-us.incl.html' %} 1411 + templates/index.en-us.html:15:{% include 'index.en-us.common.html' %} 1412 + templates/login.en-us.bare.html:17: {% include 'login.en-us.partial.html' %} 1413 + templates/login.en-us.html:16: {% include 'login.en-us.partial.html' %} 1414 + templates/migrate_event.en-us.bare.html:1:{% include 'migrate_event.en-us.common.html' %} 1415 + templates/migrate_event.en-us.html:4:{% include 'migrate_event.en-us.common.html' %} 1416 + templates/privacy-policy.en-us.bare.html:3:{% include 'privacy-policy.en-us.common.html' %} 1417 + templates/privacy-policy.en-us.html:5:{% include 'privacy-policy.en-us.common.html' %} 1418 + templates/profile.en-us.bare.html:3:{% include 'profile.en-us.common.html' %} 1419 + templates/profile.en-us.common.html:38: {% include 'event_list.en-us.incl.html' %} 1420 + templates/profile.en-us.html:20:{% include 'profile.en-us.common.html' %} 1421 + templates/settings.en-us.bare.html:3:{% include 'settings.en-us.common.html' %} 1422 + templates/terms-of-service.en-us.bare.html:3:{% include 'terms-of-service.en-us.common.html' %} 1423 + templates/terms-of-service.en-us.common.html:42: These records are stored in each user's personal data server (PDS) and remain under the user's control. 1424 + templates/terms-of-service.en-us.html:5:{% include 'terms-of-service.en-us.common.html' %} 1425 + templates/view_event.en-us.bare.html:3:{% include 'view_event.en-us.common.html' %} 1426 + templates/view_event.en-us.common.html:261: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1427 + templates/view_event.en-us.common.html:271: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1428 + templates/view_event.en-us.common.html:281: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1429 + templates/view_event.en-us.common.html:301: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1430 + templates/view_event.en-us.common.html:311: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1431 + templates/view_event.en-us.common.html:331: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1432 + templates/view_event.en-us.common.html:341: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "notgoing"}'> 1433 + templates/view_event.en-us.common.html:361: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "going"}'> 1434 + templates/view_event.en-us.common.html:371: hx-vals='{"subject_aturi": "{{ event.aturi }}", "build_state": "Review", "status": "interested"}'> 1435 + templates/view_event.en-us.html:22:{% include 'view_event.en-us.common.html' %} 1436 + templates/view_rsvp.en-us.bare.html:3:{% include 'view_rsvp.en-us.common.html' %} 1437 + templates/view_rsvp.en-us.common.html:29: {% include 'view_rsvp.en-us.partial.html' %} 1438 + templates/view_rsvp.en-us.html:8:{% include 'view_rsvp.en-us.common.html' %}
+7 -7
templates/admin.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 - {% block title %}Smoke Signal Admin{% endblock %} 2 + {% block title %}{{ t(key="page-title-admin", locale=locale) }}{% endblock %} 3 3 {% block head %}{% endblock %} 4 4 {% block content %} 5 5 <section class="section pb-0"> 6 6 <div class="container"> 7 - <h1 class="title">Smoke Signal Admin</h1> 7 + <h1 class="title">{{ t(key="page-title-admin", locale=locale) }}</h1> 8 8 <div class="content"> 9 9 <div class="block"> 10 - <h2 class="subtitle">Administration Tools</h2> 10 + <h2 class="subtitle">{{ t(key="administration-tools", locale=locale) }}</h2> 11 11 <ul> 12 - <li><a href="/admin/handles">Handle Records</a> - Manage known handles</li> 13 - <li><a href="/admin/denylist">Manage Denylist</a> - Manage blocked identities</li> 14 - <li><a href="/admin/events">Event Records</a> - View all events ordered by recent updates</li> 15 - <li><a href="/admin/rsvps">RSVP Records</a> - View all RSVPs ordered by recent updates</li> 12 + <li><a href="/admin/handles">{{ t(key="handle-records", locale=locale) }}</a> - {{ t(key="manage-handles", locale=locale) }}</li> 13 + <li><a href="/admin/denylist">{{ t(key="denylist", locale=locale) }}</a> - {{ t(key="manage-denylist", locale=locale) }}</li> 14 + <li><a href="/admin/events">{{ t(key="event-records", locale=locale) }}</a> - {{ t(key="view-events", locale=locale) }}</li> 15 + <li><a href="/admin/rsvps">{{ t(key="rsvp-records", locale=locale) }}</a> - {{ t(key="view-rsvps", locale=locale) }}</li> 16 16 </ul> 17 17 </div> 18 18 </div>
+16 -16
templates/admin_denylist.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 2 {% include 'pagination.html' %} 3 - {% block title %}Manage Denylist - Smoke Signal Admin{% endblock %} 3 + {% block title %}{{ t(key="denylist", locale=locale) }} - {{ t(key="page-title-admin", locale=locale) }}{% endblock %} 4 4 {% block head %}{% endblock %} 5 5 {% block content %} 6 6 <section class="section"> 7 7 <div class="container"> 8 8 <nav class="breadcrumb" aria-label="breadcrumbs"> 9 9 <ul> 10 - <li><a href="/admin">Admin</a></li> 11 - <li class="is-active"><a href="#" aria-current="page">Denylist</a></li> 10 + <li><a href="/admin">{{ t(key="admin", locale=locale) }}</a></li> 11 + <li class="is-active"><a href="#" aria-current="page">{{ t(key="denylist", locale=locale) }}</a></li> 12 12 </ul> 13 13 </nav> 14 14 </div> ··· 16 16 <section class="section"> 17 17 <div class="container"> 18 18 <div class="content"> 19 - <h2 class="subtitle">Add or Update Entry</h2> 19 + <h2 class="subtitle">{{ t(key="add-update-entry", locale=locale) }}</h2> 20 20 <form action="/admin/denylist/add" method="POST"> 21 21 <div class="field"> 22 - <label class="label">Subject</label> 22 + <label class="label">{{ t(key="subject", locale=locale) }}</label> 23 23 <div class="control"> 24 - <input class="input" type="text" placeholder="at://did:plc:..." name="subject" required> 24 + <input class="input" type="text" placeholder="{{ t(key="placeholder-at-uri", locale=locale) }}" name="subject" required> 25 25 </div> 26 - <p class="help">URI of the content to block (at URI, DIDs, URLs, domains)</p> 26 + <p class="help">{{ t(key="help-subject-uri", locale=locale) }}</p> 27 27 </div> 28 28 29 29 <div class="field"> 30 - <label class="label">Reason</label> 30 + <label class="label">{{ t(key="reason", locale=locale) }}</label> 31 31 <div class="control"> 32 - <textarea class="textarea" placeholder="Reason for blocking..." name="reason" 32 + <textarea class="textarea" placeholder="{{ t(key="placeholder-reason-blocking", locale=locale) }}" name="reason" 33 33 required></textarea> 34 34 </div> 35 - <p class="help">Reason for blocking this content</p> 35 + <p class="help">{{ t(key="help-reason-blocking", locale=locale) }}</p> 36 36 </div> 37 37 38 38 <div class="field"> 39 39 <div class="control"> 40 - <button type="submit" class="button is-primary">Add/Update Entry</button> 40 + <button type="submit" class="button is-primary">{{ t(key="add-update-entry", locale=locale) }}</button> 41 41 </div> 42 42 </div> 43 43 </form> ··· 50 50 <table class="table is-fullwidth"> 51 51 <thead> 52 52 <tr> 53 - <th>Subject</th> 54 - <th>Reason</th> 55 - <th>Updated</th> 56 - <th>Actions</th> 53 + <th>{{ t(key="subject", locale=locale) }}</th> 54 + <th>{{ t(key="reason", locale=locale) }}</th> 55 + <th>{{ t(key="updated", locale=locale) }}</th> 56 + <th>{{ t(key="actions", locale=locale) }}</th> 57 57 </tr> 58 58 </thead> 59 59 <tbody> ··· 65 65 <td> 66 66 <form action="/admin/denylist/remove" method="POST"> 67 67 <input type="hidden" name="subject" value="{{ entry.subject }}"> 68 - <button type="submit" class="button is-small is-danger">Remove</button> 68 + <button type="submit" class="button is-small is-danger">{{ t(key="remove", locale=locale) }}</button> 69 69 </form> 70 70 </td> 71 71 </tr>
+3 -4
templates/create_event.en-us.common.html
··· 4 4 5 5 <div class="box content"> 6 6 7 - <h1>Create Event</h1> 7 + <h1>{{ t(key="create-event", locale=locale) }}</h1> 8 8 9 9 <article class="message is-info"> 10 10 <div class="message-body"> 11 11 <p> 12 - Events are public and can be viewed by anyone that can view the information stored in your PDS. Do not 13 - publish personal or sensitive information in your events. 12 + {{ t(key="events-public-notice", locale=locale) }} 14 13 </p> 15 14 <p> 16 15 Learn more about events on the 17 16 <a href="https://docs.smokesignal.events/docs/help/events/" rel="help"> 18 - Event Help 17 + {{ t(key="event-help-link", locale=locale) }} 19 18 </a> 20 19 page. 21 20 </p>
+1 -1
templates/create_event.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 - {% block title %}Smoke Signal - Create Event{% endblock %} 2 + {% block title %}{{ t(key="page-title-create-event", locale=locale) }}{% endblock %} 3 3 {% block head %}{% endblock %} 4 4 {% block content %} 5 5 {% include 'create_event.en-us.common.html' %}
+23 -23
templates/create_event.en-us.location_form.html
··· 10 10 <div class="modal-content"> 11 11 <div class="box"> 12 12 <div class="field"> 13 - <label class="label" for="createEventLocationCountryInput">Country (required)</label> 13 + <label class="label" for="createEventLocationCountryInput">{{ t(key="label-country", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 14 14 <div class="control"> 15 15 <div class="select"> 16 16 <input class="input" id="createEventLocationCountryInput" name="location_country" ··· 32 32 {% endif %} 33 33 </div> 34 34 35 - {{ text_input('Location Name (optional)', 'locationAddressName', 'location_name', 35 + {{ text_input(t(key="label-location-name", locale=locale) + " " + t(key="optional-field", locale=locale), 'locationAddressName', 'location_name', 36 36 value=location_form.location_name, error=location_form.location_name_error, 37 - extra='autocomplete="off" data-1p-ignore placeholder="The Gem City"') }} 37 + extra='autocomplete="off" data-1p-ignore placeholder="' + t(key="placeholder-venue-name", locale=locale) + '"') }} 38 38 39 - {{ text_input('Street Address (optional)', 'locationAddressStreet', 'location_street', 39 + {{ text_input(t(key="label-street-address", locale=locale) + " " + t(key="optional-field", locale=locale), 'locationAddressStreet', 'location_street', 40 40 value=location_form.location_street, error=location_form.location_street_error, 41 - extra='autocomplete="off" data-1p-ignore placeholder="555 Somewhere"') }} 41 + extra='autocomplete="off" data-1p-ignore placeholder="' + t(key="placeholder-address", locale=locale) + '"') }} 42 42 43 - {{ text_input('Locality ("City", optional)', 'locationAddressLocality', 'location_locality', 43 + {{ text_input(t(key="label-locality", locale=locale) + " (\"" + t(key="label-city", locale=locale) + "\", " + t(key="optional-field", locale=locale) + ")", 'locationAddressLocality', 'location_locality', 44 44 value=location_form.location_locality, error=location_form.location_locality_error, 45 - extra='autocomplete="off" data-1p-ignore placeholder="Dayton"') }} 45 + extra='autocomplete="off" data-1p-ignore placeholder="' + t(key="placeholder-city", locale=locale) + '"') }} 46 46 47 - {{ text_input('Region ("State", optional)', 'locationAddressRegion', 'location_region', 47 + {{ text_input(t(key="label-region", locale=locale) + " (\"" + t(key="label-state", locale=locale) + "\", " + t(key="optional-field", locale=locale) + ")", 'locationAddressRegion', 'location_region', 48 48 value=location_form.location_region, error=location_form.location_region_error, 49 - extra='autocomplete="off" data-1p-ignore placeholder="Ohio"') }} 49 + extra='autocomplete="off" data-1p-ignore placeholder="' + t(key="placeholder-state", locale=locale) + '"') }} 50 50 51 - {{ text_input('Postal Code (optional)', 'locationAddressPostalCode', 'location_postal_code', 51 + {{ text_input(t(key="label-postal-code", locale=locale) + " " + t(key="optional-field", locale=locale), 'locationAddressPostalCode', 'location_postal_code', 52 52 value=location_form.location_postal_code, error=location_form.location_postal_code_error, 53 - extra='autocomplete="off" data-1p-ignore placeholder="11111"') }} 53 + extra='autocomplete="off" data-1p-ignore placeholder="' + t(key="placeholder-zip", locale=locale) + '"') }} 54 54 55 55 <div class="field is-grouped pt-4"> 56 56 <p class="control"> 57 57 <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 58 58 hx-trigger="click" 59 59 hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 60 - hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 60 + hx-vals='{ "build_state": "Selected" }' class="button is-primary">{{ t(key="save", locale=locale) }}</button> 61 61 </p> 62 62 </div> 63 63 </div> ··· 68 68 </div> 69 69 {% elif (location_form.build_state == "Selected") %} 70 70 71 - {{ text_input_display('Location Name', 'location_name', value=location_form.location_name) }} 71 + {{ text_input_display(t(key="label-location-name", locale=locale), 'location_name', value=location_form.location_name) }} 72 72 73 - {{ text_input_display('Street Address', 'location_street', value=location_form.location_street) }} 73 + {{ text_input_display(t(key="label-street-address", locale=locale), 'location_street', value=location_form.location_street) }} 74 74 75 - {{ text_input_display('Locality', 'location_locality', value=location_form.location_locality) }} 75 + {{ text_input_display(t(key="label-locality", locale=locale), 'location_locality', value=location_form.location_locality) }} 76 76 77 - {{ text_input_display('Region', 'location_region', value=location_form.location_region) }} 77 + {{ text_input_display(t(key="label-region", locale=locale), 'location_region', value=location_form.location_region) }} 78 78 79 - {{ text_input_display('Postal Code', 'location_postal_code', value=location_form.location_postal_code) }} 79 + {{ text_input_display(t(key="label-postal-code", locale=locale), 'location_postal_code', value=location_form.location_postal_code) }} 80 80 81 - {{ text_input_display('Location Country', 'location_country', value=location_form.location_country) }} 81 + {{ text_input_display(t(key="label-country", locale=locale), 'location_country', value=location_form.location_country) }} 82 82 83 83 <div class="field is-grouped"> 84 84 <p class="control"> 85 85 <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 86 86 hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 87 87 hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" data-bs-target="startAtModal" 88 - class="button is-link is-outlined">Edit</button> 88 + class="button is-link is-outlined">{{ t(key="edit", locale=locale) }}</button> 89 89 </p> 90 90 <p class="control"> 91 91 <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" hx-trigger="click" 92 92 hx-params="build_state" hx-vals='{ "build_state": "Reset" }' 93 - class="button is-danger is-outlined">Clear</button> 93 + class="button is-danger is-outlined">{{ t(key="clear", locale=locale) }}</button> 94 94 </p> 95 95 </div> 96 96 {% if location_form.location_country %} ··· 115 115 <div class="field"> 116 116 <div class="field-body is-align-items-end"> 117 117 <div class="field"> 118 - <label class="label" for="createEventLocationCountryInput">Location</label> 118 + <label class="label" for="createEventLocationCountryInput">{{ t(key="label-location", locale=locale) }}</label> 119 119 <div class="control"> 120 - <input id="createEventLocationCountryInput" type="text" class="input is-static" value="Not Set" 120 + <input id="createEventLocationCountryInput" type="text" class="input is-static" value="{{ t(key="not-set", locale=locale) }}" 121 121 readonly /> 122 122 </div> 123 123 </div> ··· 126 126 <button hx-post="/event/location" hx-target="#locationGroup" hx-swap="outerHTML" 127 127 hx-trigger="click" 128 128 hx-params="build_state,location_country,location_name,location_street,location_locality,location_region,location_postal_code" 129 - hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">Edit</button> 129 + hx-vals='{ "build_state": "Selecting" }' class="button is-link is-outlined">{{ t(key="edit", locale=locale) }}</button> 130 130 </p> 131 131 </div> 132 132 </div>
+29 -29
templates/create_event.en-us.partial.html
··· 2 2 <article class="message is-success"> 3 3 <div class="message-header"> 4 4 {% if create_event %} 5 - <p>The event has been created!</p> 5 + <p>{{ t(key="event-created-success", locale=locale) }}</p> 6 6 {% else %} 7 - <p>The event has been updated!</p> 7 + <p>{{ t(key="event-updated-success", locale=locale) }}</p> 8 8 {% endif %} 9 9 </div> 10 10 <div class="message-body"> ··· 13 13 <span class="icon"> 14 14 <i class="fas fa-file"></i> 15 15 </span> 16 - <span>View Event</span> 16 + <span>{{ t(key="view-event", locale=locale) }}</span> 17 17 </a> 18 18 </p> 19 19 </div> ··· 33 33 34 34 35 35 <div class="field"> 36 - <label class="label" for="createEventNameInput">Name (required)</label> 36 + <label class="label" for="createEventNameInput">{{ t(key="name-required", locale=locale) }}</label> 37 37 <div class="control {% if build_event_form.name_error %} has-icons-right{% endif %}" 38 38 data-loading-class="is-loading"> 39 39 <input type="text" class="input {% if build_event_form.name_error %} is-danger{% endif %}" 40 - id="createEventNameInput" name="name" minlength="10" maxlength="500" placeholder="My Awesome Event" {% 40 + id="createEventNameInput" name="name" minlength="10" maxlength="500" placeholder="{{ t(key="placeholder-awesome-event", locale=locale) }}" {% 41 41 if build_event_form.name %}value="{{ build_event_form.name }}" {% endif %} required 42 42 data-loading-disable> 43 43 </div> 44 44 {% if build_event_form.name_error %} 45 45 <p class="help is-danger">{{ build_event_form.name_error }}</p> 46 46 {% else %} 47 - <p class="help">Must be at least 10 characters and no more than 500 characters.</p> 47 + <p class="help">{{ t(key="help-name-length", locale=locale) }}</p> 48 48 {% endif %} 49 49 </div> 50 50 51 51 <div class="field"> 52 - <label class="label" for="createEventTextInput">Text (required)</label> 52 + <label class="label" for="createEventTextInput">{{ t(key="text-required", locale=locale) }}</label> 53 53 <div class="control"> 54 54 <textarea class="textarea{% if build_event_form.description_error %} is-danger{% endif %}" 55 55 id="createEventTextInput" name="description" maxlength="3000" rows="10" 56 - placeholder="A helpful, brief description of the event." required 56 + placeholder="{{ t(key="placeholder-event-description", locale=locale) }}" required 57 57 data-loading-disable>{% if build_event_form.description %}{{ build_event_form.description }}{% endif %}</textarea> 58 58 </div> 59 59 {% if build_event_form.description_error %} 60 60 <p class="help is-danger">{{ build_event_form.description_error }}</p> 61 61 {% else %} 62 - <p class="help">Must be at least 10 characters and no more than 3000 characters.</p> 62 + <p class="help">{{ t(key="help-description-length", locale=locale) }}</p> 63 63 {% endif %} 64 64 </div> 65 65 66 66 <div class="field"> 67 67 <div class="field-body"> 68 68 <div class="field"> 69 - <label class="label" for="createEventStatus">Status</label> 69 + <label class="label" for="createEventStatus">{{ t(key="status", locale=locale) }}</label> 70 70 <div class="control"> 71 71 <div class="select"> 72 72 <select id="createEventStatus" name="status" 73 73 class="{% if build_event_form.status_error %}is-danger{% endif %}"> 74 74 <option {% if build_event_form.status=='planned' or not build_event_form.status %} 75 75 selected="selected" {% endif %} value="planned"> 76 - Planned 76 + {{ t(key="status-planned", locale=locale) }} 77 77 </option> 78 78 <option {% if build_event_form.status=='scheduled' %} selected="selected" {% endif %} 79 79 value="scheduled"> 80 - Scheduled 80 + {{ t(key="status-scheduled", locale=locale) }} 81 81 </option> 82 82 <option {% if build_event_form.status=='cancelled' %} selected="selected" {% endif %} 83 83 value="cancelled"> 84 - Cancelled 84 + {{ t(key="status-cancelled", locale=locale) }} 85 85 </option> 86 86 <option {% if build_event_form.status=='postponed' %} selected="selected" {% endif %} 87 87 value="postponed"> 88 - Postponed 88 + {{ t(key="status-postponed", locale=locale) }} 89 89 </option> 90 90 <option {% if build_event_form.status=='rescheduled' %} selected="selected" {% endif %} 91 91 value="rescheduled"> 92 - Rescheduled 92 + {{ t(key="status-rescheduled", locale=locale) }} 93 93 </option> 94 94 </select> 95 95 </div> ··· 99 99 {% endif %} 100 100 </div> 101 101 <div class="field pb-5"> 102 - <label class="label" for="createEventMode">Mode</label> 102 + <label class="label" for="createEventMode">{{ t(key="mode", locale=locale) }}</label> 103 103 <div class="control"> 104 104 <div class="select"> 105 105 <select id="createEventMode" name="mode" 106 106 class="{% if build_event_form.mode_error %}is-danger{% endif %}"> 107 107 <option value="virtual" {% if build_event_form.mode=='virtual' %} selected{% endif %}> 108 - Virtual 108 + {{ t(key="mode-virtual", locale=locale) }} 109 109 </option> 110 - <option value="hybrid" {% if build_event_form.mode=='hybrid' %} selected{% endif %}>Hybrid 110 + <option value="hybrid" {% if build_event_form.mode=='hybrid' %} selected{% endif %}>{{ t(key="mode-hybrid", locale=locale) }} 111 111 </option> 112 112 <option value="inperson" {% if build_event_form.mode=='inperson' or not 113 - build_event_form.mode %} selected{% endif %}>In Person</option> 113 + build_event_form.mode %} selected{% endif %}>{{ t(key="mode-inperson", locale=locale) }}</option> 114 114 </select> 115 115 </div> 116 116 </div> ··· 127 127 {% include "create_event.en-us.location_form.html" %} 128 128 {% else %} 129 129 <div class="field"> 130 - <label class="label">Location</label> 130 + <label class="label">{{ t(key="location", locale=locale) }}</label> 131 131 <div class="notification is-warning"> 132 - <p><strong>Location cannot be edited</strong></p> 132 + <p><strong>{{ t(key="location-cannot-edit", locale=locale) }}</strong></p> 133 133 <p>{{ location_edit_reason }}</p> 134 - <p>Only events with a single location of type "Address" can be edited through this form.</p> 134 + <p>{{ t(key="location-edit-restriction", locale=locale) }}</p> 135 135 </div> 136 136 137 137 {% if location_display_info %} ··· 141 141 {% for location in location_display_info %} 142 142 <li> 143 143 {% if location.type == "uri" %} 144 - <strong>Link:</strong> 144 + <strong>{{ t(key="location-type-link", locale=locale) }}:</strong> 145 145 {% if location.name %}{{ location.name }}{% endif %} 146 146 <a href="{{ location.uri }}" target="_blank">{{ location.uri }}</a> 147 147 {% elif location.type == "address" %} 148 - <strong>Address:</strong> 148 + <strong>{{ t(key="location-type-address", locale=locale) }}:</strong> 149 149 {% if location.name %}<div>{{ location.name }}</div>{% endif %} 150 150 {% if location.street %}<div>{{ location.street }}</div>{% endif %} 151 151 {% if location.locality %}{{ location.locality }}{% endif %}{% if location.region %}, {{ location.region }}{% endif %}{% if location.postal_code %} {{ location.postal_code }}{% endif %} 152 152 {% if location.country %}<div>{{ location.country }}</div>{% endif %} 153 153 {% else %} 154 - <strong>Other location type</strong> 154 + <strong>{{ t(key="location-type-other", locale=locale) }}</strong> 155 155 {% endif %} 156 156 </li> 157 157 {% endfor %} 158 158 </ul> 159 159 </div> 160 160 {% else %} 161 - <p>No location information available.</p> 161 + <p>{{ t(key="no-location-info", locale=locale) }}</p> 162 162 {% endif %} 163 163 </div> 164 164 {% endif %} ··· 170 170 <div class="control"> 171 171 <button data-loading-disable data-loading-aria-busy type="submit" id="createEventSubmit" 172 172 class="button is-link" name="submit" value="Submit"> 173 - {% if create_event %}Create{% else %}Update{% endif %} 174 - Event 173 + {% if create_event %}{{ t(key="create", locale=locale) }}{% else %}{{ t(key="update", locale=locale) }}{% endif %} 174 + {{ t(key="create-event", locale=locale) }} 175 175 </button> 176 176 {% if cancel_url %} 177 - <a href="{{ cancel_url }}" class="button">Cancel</a> 177 + <a href="{{ cancel_url }}" class="button">{{ t(key="cancel", locale=locale) }}</a> 178 178 {% endif %} 179 179 </div> 180 180 </div>
+16 -16
templates/create_event.en-us.starts_form.html
··· 9 9 <div class="modal-content"> 10 10 <div class="box"> 11 11 <div class="field"> 12 - <label class="label" for="createEventTzInput">Timezone</label> 12 + <label class="label" for="createEventTzInput">{{ t(key="label-timezone", locale=locale) }}</label> 13 13 <div class="control"> 14 14 <div class="select"> 15 15 <select id="createEventStartsAtTZ" name="tz"> ··· 24 24 <div class="field"> 25 25 <div class="field-body"> 26 26 <div class="field"> 27 - <label class="label" for="createEventStartsAtDate">Start Day (required)</label> 27 + <label class="label" for="createEventStartsAtDate">{{ t(key="label-start-day", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 28 28 <div class="control"> 29 29 <input id="createEventStartsAtDate" type="date" class="form-control" 30 30 name="starts_date" {% if starts_form.starts_date %} ··· 32 32 </div> 33 33 </div> 34 34 <div class="field"> 35 - <label class="label" for="createEventStartsAtTime">Start Time (required)</label> 35 + <label class="label" for="createEventStartsAtTime">{{ t(key="label-start-time", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 36 36 <div class="control"> 37 37 <input id="createEventStartsAtTime" type="time" class="form-control" 38 38 name="starts_time" {% if starts_form.starts_time %} ··· 49 49 <div class="field"> 50 50 <div class="field-body"> 51 51 <div class="field"> 52 - <label class="label" for="createEventStartsAtDate">End Day (required)</label> 52 + <label class="label" for="createEventStartsAtDate">{{ t(key="label-end-day", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 53 53 <div class="control"> 54 54 <input id="createEventEndsAtDate" type="date" class="form-control" name="ends_date" 55 55 {% if starts_form.ends_date %} value="{{ starts_form.ends_date }}" {% endif %} ··· 57 57 </div> 58 58 </div> 59 59 <div class="field"> 60 - <label class="label" for="createEventStartsAtTime">End Time (required)</label> 60 + <label class="label" for="createEventStartsAtTime">{{ t(key="label-end-time", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 61 61 <div class="control"> 62 62 <input id="createEventEndsAtTime" type="time" class="form-control" name="ends_time" 63 63 {% if starts_form.ends_time %} value="{{ starts_form.ends_time }}" {% endif %} ··· 74 74 <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 75 75 hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 76 76 hx-vals='{ "build_state": "Selecting", "include_ends": false }' 77 - class="button is-link">Remove End Time</button> 77 + class="button is-link">{{ t(key="remove-end-time", locale=locale) }}</button> 78 78 </div> 79 79 </div> 80 80 {% else %} ··· 83 83 <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 84 84 hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 85 85 hx-vals='{ "build_state": "Selecting", "include_ends": true }' 86 - class="button is-link">Add End Time</button> 86 + class="button is-link">{{ t(key="add-end-time", locale=locale) }}</button> 87 87 </div> 88 88 </div> 89 89 {% endif %} ··· 91 91 <p class="control"> 92 92 <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 93 93 hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 94 - hx-vals='{ "build_state": "Selected" }' class="button is-primary">Save</button> 94 + hx-vals='{ "build_state": "Selected" }' class="button is-primary">{{ t(key="save", locale=locale) }}</button> 95 95 </p> 96 96 </div> 97 97 </div> ··· 104 104 <div class="field"> 105 105 <div class="field-body is-align-items-end"> 106 106 <div class="field"> 107 - <label class="label" for="createEventStartsAt">Starts At</label> 107 + <label class="label" for="createEventStartsAt">{{ t(key="label-starts-at", locale=locale) }}</label> 108 108 <div class="control"> 109 109 <input id="createEventStartsAt" type="text" class="input is-static" 110 110 value="{{ starts_form.starts_display }}" readonly /> 111 111 </div> 112 112 </div> 113 113 <div class="field"> 114 - <label class="label" for="createEventEndsAt">Ends At</label> 114 + <label class="label" for="createEventEndsAt">{{ t(key="label-ends-at", locale=locale) }}</label> 115 115 <div class="control"> 116 116 <input id="createEventEndsAt" type="text" class="input is-static" 117 117 value="{{ starts_form.ends_display if starts_form.ends_display is not none else '---' }}" readonly /> ··· 122 122 <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 123 123 hx-params="build_state,include_ends,starts_date,starts_time,ends_date,ends_time,tz" 124 124 hx-vals='{ "build_state": "Selecting" }' data-bs-toggle="modal" 125 - data-bs-target="startAtModal" class="button is-link is-outlined">Edit</button> 125 + data-bs-target="startAtModal" class="button is-link is-outlined">{{ t(key="edit", locale=locale) }}</button> 126 126 </p> 127 127 <p class="control"> 128 128 <button hx-post="/event/starts" hx-target="#startsAt" hx-swap="outerHTML" hx-trigger="click" 129 129 hx-params="build_state,tz" hx-vals='{ "build_state": "Reset" }' 130 - class="button is-danger is-outlined">Clear</button> 130 + class="button is-danger is-outlined">{{ t(key="clear", locale=locale) }}</button> 131 131 </p> 132 132 </div> 133 133 </div> ··· 157 157 <div class="field"> 158 158 <div class="field-body is-align-items-end"> 159 159 <div class="field"> 160 - <label class="label" for="createEventStartsAt">Starts At</label> 160 + <label class="label" for="createEventStartsAt">{{ t(key="label-starts-at", locale=locale) }}</label> 161 161 <div class="control"> 162 - <input id="createEventStartsAt" type="text" class="input is-static" value="Not Set" readonly /> 162 + <input id="createEventStartsAt" type="text" class="input is-static" value="{{ t(key="not-set", locale=locale) }}" readonly /> 163 163 </div> 164 164 </div> 165 165 <div class="field"> 166 - <label class="label" for="createEventEndsAt">Ends At</label> 166 + <label class="label" for="createEventEndsAt">{{ t(key="label-ends-at", locale=locale) }}</label> 167 167 <div class="control"> 168 - <input id="createEventEndsAt" type="text" class="input is-static" value="Not Set" readonly /> 168 + <input id="createEventEndsAt" type="text" class="input is-static" value="{{ t(key="not-set", locale=locale) }}" readonly /> 169 169 </div> 170 170 </div> 171 171 <div class="field">
+4 -4
templates/create_rsvp.en-us.common.html
··· 4 4 5 5 <div class="box content"> 6 6 7 - <h1>Create RSVP</h1> 7 + <h1>{{ t(key="heading-create-rsvp", locale=locale) }}</h1> 8 8 9 9 <article class="message is-info"> 10 10 <div class="message-body"> 11 11 <p> 12 - RSVPs are public and can be viewed by anyone that can view the information stored in your PDS. 12 + {{ t(key="help-rsvp-public", locale=locale) }} 13 13 </p> 14 14 <p> 15 - Learn more about rsvps on the 15 + {{ t(key="help-rsvp-learn-more", locale=locale) }} 16 16 <a href="https://docs.smokesignal.events/docs/help/events/" rel="help"> 17 - RSVP Help 17 + {{ t(key="help-rsvp-help-page", locale=locale) }} 18 18 </a> 19 19 page. 20 20 </p>
+1 -1
templates/create_rsvp.en-us.html
··· 1 1 {% extends "base.en-us.html" %} 2 - {% block title %}Smoke Signal - Create RSVP{% endblock %} 2 + {% block title %}Smoke Signal - {{ t(key="page-title-create-rsvp", locale=locale) }}{% endblock %} 3 3 {% block head %}{% endblock %} 4 4 {% block content %} 5 5 {% include 'create_rsvp.en-us.common.html' %}
+11 -11
templates/create_rsvp.en-us.partial.html
··· 2 2 {% if hx_request %} 3 3 <article class="message is-success"> 4 4 <div class="message-body"> 5 - <p>The RSVP has been recorded!</p> 5 + <p>{{ t(key="message-rsvp-recorded", locale=locale) }}</p> 6 6 </div> 7 7 </article> 8 8 {% else %} 9 9 <article class="message is-success"> 10 10 <div class="message-header"> 11 - <p>The RSVP has been recorded!</p> 11 + <p>{{ t(key="message-rsvp-recorded", locale=locale) }}</p> 12 12 </div> 13 13 <div class="message-body"> 14 14 <p class="buttons"> ··· 16 16 <span class="icon"> 17 17 <i class="fas fa-file"></i> 18 18 </span> 19 - <span>View Event</span> 19 + <span>{{ t(key="view-event", locale=locale) }}</span> 20 20 </a> 21 21 </p> 22 22 </div> ··· 38 38 {% endif %} 39 39 40 40 <div class="field"> 41 - <label class="label" for="createRsvpSubjectAtUriInput">Event AT-URI (required)</label> 41 + <label class="label" for="createRsvpSubjectAtUriInput">{{ t(key="label-event-at-uri", locale=locale) }} {{ t(key="required-field", locale=locale) }}</label> 42 42 <div class="control {% if build_rsvp_form.subject_aturi_error %} has-icons-right{% endif %}" 43 43 data-loading-class="is-loading"> 44 44 <input type="text" class="input {% if build_rsvp_form.subject_aturi_error %} is-danger{% endif %}" 45 - id="createRsvpSubjectAtUriInput" name="subject_aturi" placeholder="at://smokesignal.events/community.lexicon.calendar.event/neat" {% 45 + id="createRsvpSubjectAtUriInput" name="subject_aturi" placeholder="{{ t(key="placeholder-at-uri-event", locale=locale) }}" {% 46 46 if build_rsvp_form.subject_aturi %}value="{{ build_rsvp_form.subject_aturi }}" {% endif %} required 47 47 data-loading-disable> 48 48 </div> ··· 52 52 </div> 53 53 54 54 <div class="field"> 55 - <label class="label" for="createRsvpSubjectCidInput">Event CID</label> 55 + <label class="label" for="createRsvpSubjectCidInput">{{ t(key="label-event-cid", locale=locale) }}</label> 56 56 <div class="control {% if build_rsvp_form.subject_cid_error %} has-icons-right{% endif %}" 57 57 data-loading-class="is-loading"> 58 58 <input type="text" class="input {% if build_rsvp_form.subject_cid_error %} is-danger{% endif %}" ··· 66 66 </div> 67 67 68 68 <div class="field pb-5"> 69 - <label class="label" for="createRsvpStatusInput">Status</label> 69 + <label class="label" for="createRsvpStatusInput">{{ t(key="label-status", locale=locale) }}</label> 70 70 <div class="control"> 71 71 <div class="select"> 72 72 <select id="createRsvpStatusInput" name="status" 73 73 class="{% if build_rsvp_form.status_error %}is-danger{% endif %}"> 74 74 <option {% if build_rsvp_form.status=='going' or not build_rsvp_form.status %} selected="selected" {% endif %} value="going"> 75 - Going 75 + {{ t(key="status-going", locale=locale) }} 76 76 </option> 77 77 <option {% if build_rsvp_form.status=='interested' %} selected="selected" {% endif %} value="interested"> 78 - Interested 78 + {{ t(key="status-interested", locale=locale) }} 79 79 </option> 80 80 <option {% if build_rsvp_form.status=='notgoing' %} selected="selected" {% endif %} value="notgoing"> 81 - Not Going 81 + {{ t(key="status-not-going", locale=locale) }} 82 82 </option> 83 83 </select> 84 84 </div> ··· 92 92 <div class="field"> 93 93 <div class="control"> 94 94 <button data-loading-disable data-loading-aria-busy type="submit" id="createRsvpSubmit" 95 - class="button is-link" name="submit" value="Submit">Record RSVP</button> 95 + class="button is-link" name="submit" value="Submit">{{ t(key="record-rsvp", locale=locale) }}</button> 96 96 </div> 97 97 </div> 98 98