diff --git a/shared b/shared
index 65c4989..322ae48 160000
--- a/shared
+++ b/shared
@@ -1 +1 @@
-Subproject commit 65c4989d08b85a821a0932e4376f2ab088f50d0c
+Subproject commit 322ae481eeb47418245e669c3585f6d2195656da
diff --git a/templates/_types/calendar/_description.html b/templates/_types/calendar/_description.html
new file mode 100644
index 0000000..0f04f3a
--- /dev/null
+++ b/templates/_types/calendar/_description.html
@@ -0,0 +1,12 @@
+{% macro description(calendar, oob=False) %}
+
+ {{ calendar.description or ''}}
+
+
+{% endmacro %}
\ No newline at end of file
diff --git a/templates/_types/calendar/_oob_elements.html b/templates/_types/calendar/_oob_elements.html
new file mode 100644
index 0000000..1447e24
--- /dev/null
+++ b/templates/_types/calendar/_oob_elements.html
@@ -0,0 +1,22 @@
+{% extends "oob_elements.html" %}
+{# OOB elements for post admin page #}
+
+
+
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('post-header-child', 'calendar-header-child', '_types/calendar/header/_header.html')}}
+
+ {% from '_types/post/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+{% include '_types/calendar/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/calendar/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/calendar/admin/_nav.html b/templates/_types/calendar/admin/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/calendar/admin/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/calendar/admin/_oob_elements.html b/templates/_types/calendar/admin/_oob_elements.html
new file mode 100644
index 0000000..ec6244c
--- /dev/null
+++ b/templates/_types/calendar/admin/_oob_elements.html
@@ -0,0 +1,25 @@
+{% extends 'oob_elements.html' %}
+
+{# OOB elements for calendar admin page #}
+
+{# Import shared OOB macros #}
+{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
+{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
+
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('calendar-header-child', 'calendar-admin-header-child', '_types/calendar/admin/header/_header.html')}}
+
+ {% from '_types/calendar/header/_header.html' import header_row with context %}
+ {{header_row(oob=True)}}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/calendar/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/calendar/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/calendar/admin/index.html b/templates/_types/calendar/admin/index.html
new file mode 100644
index 0000000..c27d6d2
--- /dev/null
+++ b/templates/_types/calendar/admin/index.html
@@ -0,0 +1,24 @@
+{% extends '_types/calendar/index.html' %}
+{% import 'macros/layout.html' as layout %}
+
+{% block calendar_header_child %}
+ {% from '_types/root/_n/macros.html' import header with context %}
+ {% call header() %}
+ {% from '_types/calendar/admin/header/_header.html' import header_row with context %}
+ {{ header_row() }}
+
+ {% endcall %}
+{% endblock %}
+
+
+
+{% block _main_mobile_menu %}
+ {% include '_types/calendar/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/calendar/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/calendars/_nav.html b/templates/_types/calendars/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/calendars/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/calendars/_oob_elements.html b/templates/_types/calendars/_oob_elements.html
new file mode 100644
index 0000000..6de3bea
--- /dev/null
+++ b/templates/_types/calendars/_oob_elements.html
@@ -0,0 +1,28 @@
+{% extends 'oob_elements.html' %}
+
+{# OOB elements for HTMX navigation - all elements that need updating #}
+
+{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
+
+{# Header with app title - includes cart-mini, navigation, and market-specific header #}
+
+{% block oobs %}
+
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('post-admin-header-child', 'calendars-header-child', '_types/calendars/header/_header.html')}}
+
+ {% from '_types/post/admin/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/calendars/_nav.html' %}
+{% endblock %}
+
+
+{% block content %}
+ {% include "_types/calendars/_main_panel.html" %}
+{% endblock %}
+
+
diff --git a/templates/_types/cart/_mini.html b/templates/_types/cart/_mini.html
new file mode 100644
index 0000000..a8255e4
--- /dev/null
+++ b/templates/_types/cart/_mini.html
@@ -0,0 +1,45 @@
+{% macro mini(oob=False, count=None) %}
+
+ {# cart_count is set by the context processor in all apps.
+ Cart app computes it from g.cart + calendar_cart_entries;
+ other apps get it from the cart internal API.
+ count param allows explicit override when macro is imported without context. #}
+ {% if count is not none %}
+ {% set _count = count %}
+ {% elif cart_count is defined and cart_count is not none %}
+ {% set _count = cart_count %}
+ {% elif cart is defined and cart is not none %}
+ {% set _count = (cart | sum(attribute="quantity")) + ((calendar_cart_entries | length) if calendar_cart_entries else 0) %}
+ {% else %}
+ {% set _count = 0 %}
+ {% endif %}
+
+ {% if _count == 0 %}
+
+ {% else %}
+
+
+
+
+
+ {{ _count }}
+
+
+ {% endif %}
+
+{% endmacro %}
diff --git a/templates/_types/day/_main_panel.html b/templates/_types/day/_main_panel.html
new file mode 100644
index 0000000..0eea6f0
--- /dev/null
+++ b/templates/_types/day/_main_panel.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Name
+ Slot/Time
+ State
+ Cost
+ Tickets
+ Actions
+
+
+
+ {% for entry in day_entries %}
+ {% include '_types/day/_row.html' %}
+ {% else %}
+ No entries yet.
+ {% endfor %}
+
+
+
+
+
+
+ {% include '_types/day/_add_button.html' %}
+
+
+
diff --git a/templates/_types/day/_oob_elements.html b/templates/_types/day/_oob_elements.html
new file mode 100644
index 0000000..812e6b0
--- /dev/null
+++ b/templates/_types/day/_oob_elements.html
@@ -0,0 +1,18 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('calendar-header-child', 'day-header-child', '_types/day/header/_header.html')}}
+
+ {% from '_types/calendar/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/day/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/day/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/day/admin/_main_panel.html b/templates/_types/day/admin/_main_panel.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/day/admin/_main_panel.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/day/admin/_nav.html b/templates/_types/day/admin/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/day/admin/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/day/admin/_oob_elements.html b/templates/_types/day/admin/_oob_elements.html
new file mode 100644
index 0000000..20986bf
--- /dev/null
+++ b/templates/_types/day/admin/_oob_elements.html
@@ -0,0 +1,25 @@
+{% extends 'oob_elements.html' %}
+
+{# OOB elements for calendar admin page #}
+
+{# Import shared OOB macros #}
+{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
+{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
+
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('day-header-child', 'day-admin-header-child', '_types/day/admin/header/_header.html')}}
+
+ {% from '_types/calendar/header/_header.html' import header_row with context %}
+ {{header_row(oob=True)}}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/day/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/day/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/day/admin/index.html b/templates/_types/day/admin/index.html
new file mode 100644
index 0000000..f4f37b5
--- /dev/null
+++ b/templates/_types/day/admin/index.html
@@ -0,0 +1,24 @@
+{% extends '_types/day/index.html' %}
+{% import 'macros/layout.html' as layout %}
+{% import 'macros/links.html' as links %}
+
+
+{% block day_header_child %}
+ {% from '_types/root/_n/macros.html' import header with context %}
+ {% call header() %}
+ {% from '_types/day/admin/header/_header.html' import header_row with context %}
+ {{ header_row() }}
+
+ {% endcall %}
+{% endblock %}
+
+{% block _main_mobile_menu %}
+ {% include '_types/day/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/day/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/day/index.html b/templates/_types/day/index.html
new file mode 100644
index 0000000..655ee55
--- /dev/null
+++ b/templates/_types/day/index.html
@@ -0,0 +1,18 @@
+{% extends '_types/calendar/index.html' %}
+
+{% block calendar_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('day-header-child', '_types/day/header/_header.html') %}
+ {% block day_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+{% block _main_mobile_menu %}
+ {% include '_types/day/_nav.html' %}
+{% endblock %}
+
+
+{% block content %}
+ {% include '_types/day/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/entry/_oob_elements.html b/templates/_types/entry/_oob_elements.html
new file mode 100644
index 0000000..8981fa1
--- /dev/null
+++ b/templates/_types/entry/_oob_elements.html
@@ -0,0 +1,18 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('day-header-child', 'entry-header-child', '_types/entry/header/_header.html')}}
+
+ {% from '_types/day/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/entry/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/entry/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/entry/_optioned.html b/templates/_types/entry/_optioned.html
new file mode 100644
index 0000000..ba23391
--- /dev/null
+++ b/templates/_types/entry/_optioned.html
@@ -0,0 +1,9 @@
+
+{% include '_types/entry/_options.html' %}
+
+ {% include '_types/entry/_title.html' %}
+
+
+
+ {% include '_types/entry/_state.html' %}
+
\ No newline at end of file
diff --git a/templates/_types/entry/_state.html b/templates/_types/entry/_state.html
new file mode 100644
index 0000000..b67254a
--- /dev/null
+++ b/templates/_types/entry/_state.html
@@ -0,0 +1,15 @@
+{% if entry.state %}
+
+ {{ entry.state|capitalize }}
+
+ {% endif %}
\ No newline at end of file
diff --git a/templates/_types/entry/_times.html b/templates/_types/entry/_times.html
new file mode 100644
index 0000000..3543fe4
--- /dev/null
+++ b/templates/_types/entry/_times.html
@@ -0,0 +1,5 @@
+{% from 'macros/date.html' import t %}
+
+ {{ t(entry.start_at) }}
+ {% if entry.end_at %} → {{ t(entry.end_at) }}{% endif %}
+
\ No newline at end of file
diff --git a/templates/_types/entry/_title.html b/templates/_types/entry/_title.html
new file mode 100644
index 0000000..3c1dc63
--- /dev/null
+++ b/templates/_types/entry/_title.html
@@ -0,0 +1,3 @@
+
+ {{ entry.name }}
+ {% include '_types/entry/_state.html' %}
diff --git a/templates/_types/entry/admin/_main_panel.html b/templates/_types/entry/admin/_main_panel.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/entry/admin/_main_panel.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/entry/admin/_nav_posts_oob.html b/templates/_types/entry/admin/_nav_posts_oob.html
new file mode 100644
index 0000000..25ef1f1
--- /dev/null
+++ b/templates/_types/entry/admin/_nav_posts_oob.html
@@ -0,0 +1,31 @@
+{# OOB swap for entry posts nav when posts are associated/disassociated #}
+{% import 'macros/links.html' as links %}
+
+{# Associated Posts - vertical on mobile, horizontal with arrows on desktop #}
+{% if entry_posts %}
+
+ {% from 'macros/scrolling_menu.html' import scrolling_menu with context %}
+ {% call(entry_post) scrolling_menu('entry-posts-container', entry_posts) %}
+
+ {% if entry_post.feature_image %}
+
+ {% else %}
+
+ {% endif %}
+
+
{{ entry_post.title }}
+
+
+ {% endcall %}
+
+{% else %}
+ {# Empty placeholder to remove nav posts when all are disassociated #}
+
+{% endif %}
diff --git a/templates/_types/entry/admin/_oob_elements.html b/templates/_types/entry/admin/_oob_elements.html
new file mode 100644
index 0000000..bcf2255
--- /dev/null
+++ b/templates/_types/entry/admin/_oob_elements.html
@@ -0,0 +1,25 @@
+{% extends 'oob_elements.html' %}
+
+{# OOB elements for calendar admin page #}
+
+{# Import shared OOB macros #}
+{% from '_types/root/header/_oob.html' import root_header_start, root_header_end with context %}
+{% from '_types/root/_oob_menu.html' import mobile_menu with context %}
+
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('entry-header-child', 'entry-admin-header-child', '_types/entry/admin/header/_header.html')}}
+
+ {% from '_types/entry/header/_header.html' import header_row with context %}
+ {{header_row(oob=True)}}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/entry/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/entry/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/entry/admin/index.html b/templates/_types/entry/admin/index.html
new file mode 100644
index 0000000..caa100c
--- /dev/null
+++ b/templates/_types/entry/admin/index.html
@@ -0,0 +1,24 @@
+{% extends '_types/entry/index.html' %}
+{% import 'macros/layout.html' as layout %}
+{% import 'macros/links.html' as links %}
+
+
+{% block entry_header_child %}
+ {% from '_types/root/_n/macros.html' import header with context %}
+ {% call header() %}
+ {% from '_types/entry/admin/header/_header.html' import header_row with context %}
+ {{ header_row() }}
+
+ {% endcall %}
+{% endblock %}
+
+{% block _main_mobile_menu %}
+ {% include '_types/entry/admin/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/entry/admin/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/entry/index.html b/templates/_types/entry/index.html
new file mode 100644
index 0000000..a980f46
--- /dev/null
+++ b/templates/_types/entry/index.html
@@ -0,0 +1,20 @@
+{% extends '_types/day/index.html' %}
+
+{% block day_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('entry-header-child', '_types/entry/header/_header.html') %}
+ {% block entry_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+
+{% block _main_mobile_menu %}
+ {% include '_types/entry/_nav.html' %}
+{% endblock %}
+
+
+
+{% block content %}
+{% include '_types/entry/_main_panel.html' %}
+{% endblock %}
\ No newline at end of file
diff --git a/templates/_types/post/admin/_associated_entries.html b/templates/_types/post/admin/_associated_entries.html
new file mode 100644
index 0000000..d9fe853
--- /dev/null
+++ b/templates/_types/post/admin/_associated_entries.html
@@ -0,0 +1,50 @@
+
+
Associated Entries
+ {% if associated_entry_ids %}
+
+ {% for calendar in all_calendars %}
+ {% for entry in calendar.entries %}
+ {% if entry.id in associated_entry_ids and entry.deleted_at is none %}
+
+
+ {% if calendar.post.feature_image %}
+
+ {% else %}
+
+ {% endif %}
+
+
{{ entry.name }}
+
+ {{ calendar.name }} • {{ entry.start_at.strftime('%A, %B %d, %Y at %H:%M') }}
+ {% if entry.end_at %} – {{ entry.end_at.strftime('%H:%M') }}{% endif %}
+
+
+
+
+
+ {% endif %}
+ {% endfor %}
+ {% endfor %}
+
+ {% else %}
+
No entries associated yet. Browse calendars below to add entries.
+ {% endif %}
+
diff --git a/templates/_types/post/header/_header.html b/templates/_types/post/header/_header.html
new file mode 100644
index 0000000..143e79d
--- /dev/null
+++ b/templates/_types/post/header/_header.html
@@ -0,0 +1,28 @@
+{% import 'macros/links.html' as links %}
+{% macro header_row(oob=False) %}
+ {% call links.menu_row(id='post-row', oob=oob) %}
+ {% call links.link(url_for('blog.post.post_detail', slug=post.slug), hx_select_search ) %}
+ {% if post.feature_image %}
+
+ {% endif %}
+
+ {{ post.title | truncate(160, True, '…') }}
+
+ {% endcall %}
+ {% call links.desktop_nav() %}
+ {% if page_cart_count is defined and page_cart_count > 0 %}
+
+
+ {{ page_cart_count }}
+
+ {% endif %}
+ {% include '_types/post/_nav.html' %}
+ {% endcall %}
+ {% endcall %}
+{% endmacro %}
\ No newline at end of file
diff --git a/templates/_types/post_entries/_nav.html b/templates/_types/post_entries/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/post_entries/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/slot/__description.html b/templates/_types/slot/__description.html
new file mode 100644
index 0000000..7897fd2
--- /dev/null
+++ b/templates/_types/slot/__description.html
@@ -0,0 +1,13 @@
+{% macro description(slot, oob=False) %}
+
+ {{ slot.description or ''}}
+
+
+{% endmacro %}
diff --git a/templates/_types/slot/_description.html b/templates/_types/slot/_description.html
new file mode 100644
index 0000000..32e28e6
--- /dev/null
+++ b/templates/_types/slot/_description.html
@@ -0,0 +1,5 @@
+
+ {% if slot.description %}
+ {{ slot.description }}
+ {% endif %}
+
diff --git a/templates/_types/slot/_oob_elements.html b/templates/_types/slot/_oob_elements.html
new file mode 100644
index 0000000..3b82170
--- /dev/null
+++ b/templates/_types/slot/_oob_elements.html
@@ -0,0 +1,15 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('slots-header-child', 'slot-header-child', '_types/slot/header/_header.html')}}
+
+ {% from '_types/slots/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+
+{% block content %}
+ {% include '_types/slot/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/slot/index.html b/templates/_types/slot/index.html
new file mode 100644
index 0000000..265be24
--- /dev/null
+++ b/templates/_types/slot/index.html
@@ -0,0 +1,20 @@
+{% extends '_types/slots/index.html' %}
+{% import 'macros/layout.html' as layout %}
+
+
+{% block slots_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('slot-header-child', '_types/slot/header/_header.html') %}
+ {% block slot_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+
+{% block _main_mobile_menu %}
+ {#% include '_types/slot/_nav.html' %#}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/slot/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/slots/_main_panel.html b/templates/_types/slots/_main_panel.html
new file mode 100644
index 0000000..a2ac263
--- /dev/null
+++ b/templates/_types/slots/_main_panel.html
@@ -0,0 +1,26 @@
+
+
+
+
+ Name
+ Flexible
+ Days
+ Time
+ Cost
+ Actions
+
+
+
+ {% for s in slots %}
+ {% include '_types/slots/_row.html' %}
+ {% else %}
+ No slots yet.
+ {% endfor %}
+
+
+
+
+
+ {% include '_types/slots/_add_button.html' %}
+
+
diff --git a/templates/_types/slots/_oob_elements.html b/templates/_types/slots/_oob_elements.html
new file mode 100644
index 0000000..acf0d05
--- /dev/null
+++ b/templates/_types/slots/_oob_elements.html
@@ -0,0 +1,15 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('calendar-header-child', 'slots-header-child', '_types/slots/header/_header.html')}}
+
+ {% from '_types/calendar/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+
+{% block content %}
+ {% include '_types/slots/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/slots/index.html b/templates/_types/slots/index.html
new file mode 100644
index 0000000..453ba5f
--- /dev/null
+++ b/templates/_types/slots/index.html
@@ -0,0 +1,19 @@
+{% extends '_types/calendar/index.html' %}
+
+{% block calendar_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('slots-header-child', '_types/slots/header/_header.html') %}
+ {% block slots_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+{% block _main_mobile_menu %}
+ {#% include '_types/calendar/_nav.html' %#}
+{% endblock %}
+
+
+
+{% block content %}
+ {% include '_types/slots/_main_panel.html' %}
+{% endblock %}
\ No newline at end of file
diff --git a/templates/_types/ticket_type/_nav.html b/templates/_types/ticket_type/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/ticket_type/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/ticket_type/_oob_elements.html b/templates/_types/ticket_type/_oob_elements.html
new file mode 100644
index 0000000..824e62a
--- /dev/null
+++ b/templates/_types/ticket_type/_oob_elements.html
@@ -0,0 +1,18 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('ticket_types-header-child', 'ticket_type-header-child', '_types/ticket_type/header/_header.html')}}
+
+ {% from '_types/ticket_types/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/ticket_type/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/ticket_type/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/ticket_type/index.html b/templates/_types/ticket_type/index.html
new file mode 100644
index 0000000..245992c
--- /dev/null
+++ b/templates/_types/ticket_type/index.html
@@ -0,0 +1,19 @@
+{% extends '_types/ticket_types/index.html' %}
+{% import 'macros/layout.html' as layout %}
+
+{% block ticket_types_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('ticket_types-header-child', '_types/ticket_type/header/_header.html') %}
+ {% block ticket_type_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+
+{% block _main_mobile_menu %}
+ {#% include '_types/ticket_type/_nav.html' %#}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/ticket_type/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/ticket_types/_main_panel.html b/templates/_types/ticket_types/_main_panel.html
new file mode 100644
index 0000000..2afaa7a
--- /dev/null
+++ b/templates/_types/ticket_types/_main_panel.html
@@ -0,0 +1,24 @@
+
+
+
+
+ Name
+ Cost
+ Count
+ Actions
+
+
+
+ {% for tt in ticket_types %}
+ {% include '_types/ticket_types/_row.html' %}
+ {% else %}
+ No ticket types yet.
+ {% endfor %}
+
+
+
+
+
+ {% include '_types/ticket_types/_add_button.html' %}
+
+
diff --git a/templates/_types/ticket_types/_nav.html b/templates/_types/ticket_types/_nav.html
new file mode 100644
index 0000000..f5c504d
--- /dev/null
+++ b/templates/_types/ticket_types/_nav.html
@@ -0,0 +1,2 @@
+{% from 'macros/admin_nav.html' import placeholder_nav %}
+{{ placeholder_nav() }}
diff --git a/templates/_types/ticket_types/_oob_elements.html b/templates/_types/ticket_types/_oob_elements.html
new file mode 100644
index 0000000..a746f17
--- /dev/null
+++ b/templates/_types/ticket_types/_oob_elements.html
@@ -0,0 +1,18 @@
+{% extends "oob_elements.html" %}
+
+{% block oobs %}
+ {% from '_types/root/_n/macros.html' import oob_header with context %}
+ {{oob_header('entry-admin-header-child', 'ticket_types-header-child', '_types/ticket_types/header/_header.html')}}
+
+ {% from '_types/entry/admin/header/_header.html' import header_row with context %}
+ {{ header_row(oob=True) }}
+{% endblock %}
+
+
+{% block mobile_menu %}
+ {% include '_types/ticket_types/_nav.html' %}
+{% endblock %}
+
+{% block content %}
+ {% include '_types/ticket_types/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/_types/ticket_types/index.html b/templates/_types/ticket_types/index.html
new file mode 100644
index 0000000..9d0362a
--- /dev/null
+++ b/templates/_types/ticket_types/index.html
@@ -0,0 +1,20 @@
+{% extends '_types/entry/admin/index.html' %}
+
+{% block entry_admin_header_child %}
+ {% from '_types/root/_n/macros.html' import index_row with context %}
+ {% call index_row('ticket_type-header-child', '_types/ticket_types/header/_header.html') %}
+ {% block ticket_types_header_child %}
+ {% endblock %}
+ {% endcall %}
+{% endblock %}
+
+
+{% block _main_mobile_menu %}
+ {% include '_types/ticket_types/_nav.html' %}
+{% endblock %}
+
+
+
+{% block content %}
+ {% include '_types/ticket_types/_main_panel.html' %}
+{% endblock %}
diff --git a/templates/macros/date.html b/templates/macros/date.html
new file mode 100644
index 0000000..5954f28
--- /dev/null
+++ b/templates/macros/date.html
@@ -0,0 +1,7 @@
+{% macro dt(d) -%}
+{{ d.astimezone().strftime('%-d %b %Y, %H:%M') if d.tzinfo else d.strftime('%-d %b %Y, %H:%M') }}
+{%- endmacro %}
+
+{% macro t(d) -%}
+{{ d.astimezone().strftime('%H:%M') if d.tzinfo else d.strftime('%H:%M') }}
+{%- endmacro %}