//! 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, );