//! Askama template definitions for all HTML pages and fragments.
//!
//! Split by domain:
//! - `public`: landing, auth, content, blog, discover, health
//! - `dashboard`: creator dashboards, admin, export, account management
//! - `partials`: HTMX fragments, tab content, alerts, form status
mod public;
mod dashboard;
mod partials;
pub use public::*;
pub use dashboard::*;
pub use partials::*;
use askama::Template;
use axum::{
http::StatusCode,
response::{Html, IntoResponse, Response},
};
/// Base context shared by all templates.
/// Note: csrf_token is Option to allow templates to work without CSRF
/// but all authenticated pages should include it.
pub type CsrfTokenOption = Option;
/// Helper to convert any Askama template into an Axum response.
fn render_template(template: T) -> Response {
match template.render() {
Ok(html) => Html(html).into_response(),
Err(err) => {
tracing::error!(error = ?err, "template rendering error");
(StatusCode::INTERNAL_SERVER_ERROR, "Template error").into_response()
}
}
}
/// Implement `IntoResponse` for one or more Askama template structs.
macro_rules! impl_into_response {
($($T:ty),+ $(,)?) => {
$(
impl IntoResponse for $T {
fn into_response(self) -> Response {
render_template(self)
}
}
)+
};
}
impl_into_response!(
// Public pages
SandboxTemplate,
PolicyTemplate,
IndexTemplate,
LibraryTemplate,
CartTemplate,
LoginTemplate,
TwoFactorTemplate,
OAuthAuthorizeTemplate,
ForgotPasswordTemplate,
ResetPasswordTemplate,
UserTemplate,
ProjectTemplate,
ProjectPaywallTemplate,
ItemTemplate,
LibraryAudioTemplate,
LibraryDownloadsTemplate,
LibraryLockedTemplate,
LibraryTextTemplate,
LibraryVideoTemplate,
TextReaderTemplate,
AudioPlayerTemplate,
VideoPlayerTemplate,
DiscoverTemplate,
DiscoverResultsTemplate,
PurchaseTemplate,
ReceiptTemplate,
BuyPageTemplate,
FeedTemplate,
StripeConnectDisclaimerTemplate,
// Blog pages
ProjectBlogTemplate,
BlogPostTemplate,
// Documentation pages
DocTemplate,
DocIndexTemplate,
// Pricing calculator
PricingTemplate,
// Use cases
UseCasesTemplate,
// Team
TeamTemplate,
// Changelog
ChangelogTemplate,
// Fan+
FanPlusTemplate,
// Creator invite system
CreatorsTemplate,
// Email & account
EmailResultTemplate,
ConfirmDeleteTemplate,
AccountDeletedTemplate,
// Health
HealthTemplate,
// Dashboard pages
DashboardUserTemplate,
DashboardProjectTemplate,
DashboardItemTemplate,
// Admin
AdminWaitlistTemplate,
AdminUsersTemplate,
AdminUploadsTemplate,
AdminScanAuditTemplate,
AdminAppealsTemplate,
AdminReportsTemplate,
AdminSignupsTemplate,
AdminMetricsTemplate,
// Export, import & account management
ExportPortalTemplate,
ImportPortalTemplate,
DeleteAccountTemplate,
BlogEditorTemplate,
// HTMX partials
AlertTemplate,
LibraryStatusTemplate,
ExportDownloadTemplate,
ExportContentReadyTemplate,
TransactionsTableTemplate,
UserProfileTabTemplate,
UserSettingsTabTemplate,
UserAccountTabTemplate,
UserSshKeysTabTemplate,
UserPaymentsTabTemplate,
UserProjectsTabTemplate,
UserCreatorTabTemplate,
ProjectOverviewTabTemplate,
ProjectContentTabTemplate,
ProjectAnalyticsTabTemplate,
UserAnalyticsTabTemplate,
BuyerContactsPartialTemplate,
ProjectSettingsTabTemplate,
ProjectCodeTabTemplate,
ProjectBlogTabTemplate,
ProjectSubscriptionsTabTemplate,
ProjectMembersTabTemplate,
ProjectMonetizationTabTemplate,
ItemEditRowTemplate,
// Admin partials
AdminWaitlistEntriesTemplate,
AdminUserEntriesTemplate,
AdminUploadEntriesTemplate,
AdminQueueSummaryTemplate,
AdminAppealEntriesTemplate,
AdminReportEntriesTemplate,
SuspensionBannerTemplate,
// License keys
ItemLicenseKeysTemplate,
// Promo codes
PromoCodesListTemplate,
ProjectPromotionsTabTemplate,
// Sessions
UserSessionsPartialTemplate,
// SyncKit
UserSyncKitTabTemplate,
ProjectSyncKitTabTemplate,
// Forums (Multithreaded)
UserForumsTabTemplate,
// Media library
UserMediaTabTemplate,
// Support
UserSupportTabTemplate,
// Collections
CollectionTemplate,
// Library tabs
LibraryPurchasesTabTemplate,
LibraryFeedTabTemplate,
LibraryCollectionsTabTemplate,
LibraryContactsTabTemplate,
LibraryCommunitiesTabTemplate,
// Follow button
FollowButtonTemplate,
TagFollowToggleTemplate,
// Tag suggestions
TagSuggestionsTemplate,
// Item analytics
ItemAnalyticsPartialTemplate,
// Item dashboard tabs
ItemOverviewTabTemplate,
ItemDetailsTabTemplate,
ItemPricingTabTemplate,
ItemFilesTabTemplate,
ItemSalesTabTemplate,
ItemEmbedTabTemplate,
// Onboarding checklist
OnboardingChecklistPartialTemplate,
// Tag tree browser
TagTreeTemplate,
// TOTP 2FA
TotpSetupTemplate,
TotpStatusTemplate,
// Passkeys
PasskeyListTemplate,
// Git source browser
GitRepoTemplate,
GitTreeTemplate,
GitFileTemplate,
GitCommitsTemplate,
GitCommitDetailTemplate,
GitBlameTemplate,
GitUserReposTemplate,
GitExploreTemplate,
GitFileLogTemplate,
// Git issues
GitIssueListTemplate,
GitIssueDetailTemplate,
GitRepoSettingsTemplate,
// Join wizard
WizardJoinTemplate,
WizardJoinAccountTemplate,
WizardJoinProfileTemplate,
WizardJoinCompleteTemplate,
// Creation wizards — full pages
WizardProjectTemplate,
WizardItemTemplate,
// Creation wizards — project step partials
WizardProjectBasicsTemplate,
WizardProjectAppearanceTemplate,
WizardProjectMonetizationTemplate,
WizardProjectFirstContentTemplate,
WizardProjectPreviewTemplate,
// Creation wizards — item step partials
WizardItemTypeTemplate,
WizardItemBasicsTemplate,
WizardItemContentTemplate,
WizardItemSectionsTemplate,
WizardItemPricingTemplate,
WizardItemPreviewTemplate,
);