Преминете към основното съдържание

HTML шаблони и Email шаблони

Licensing Server използва Go html/template за server-side rendering на HTML страници и програмно генерирани HTML/text email-и чрез Resend API.

HTML шаблони (templates/)

Всички шаблони се зареждат при стартиране чрез template.ParseGlob("templates/*.html") и се рендерират с Gin's c.HTML().

Общ дизайн

Всички HTML страници следват единен визуален стил:

  • Цветова схема: Dark mode (#0F172A фон, #1E293B container, #F1F5F9 текст)
  • Accent цвят: #3B82F6 (син) за бутони и линкове
  • Font: Inter / system fonts
  • Layout: Центриран container с max-width: 420-560px и border-radius: 16px
  • Responsive: Media query за max-width: 480px

login.html

Основната login страница, отваряна от desktop клиента в browser.

Функционалности:

  • Три OAuth бутона (/auth/login/google, /auth/login/azure, /auth/login/github) с SVG икони
  • Три формуляра (Login, Register, Forgot Password) -- switch-ване чрез JavaScript
  • Cloudflare Turnstile интеграция за login и register форми
  • i18n: Всички текстове идват от {{.T.xxx}} (server-side) и L.xxx (JavaScript)
  • Build version: Показва build time в footer-а

Turnstile интеграция:

Поведение при submit:

  • Login: POST /auth/login/email с JSON {email, password, cf-turnstile-response}
  • Register: POST /auth/register с JSON {name, email, password, cf-turnstile-response, lang}
  • Forgot: POST /auth/forgot-password с JSON {email, lang}
  • При redirect от сървъра (OAuth flow): browser следва redirect-а автоматично

verify_email_result.html

Страница за email верификация с три състояния:

СъстояниеКогаКакво показва
PendingGET /auth/verify-email?token=... (първо посещение)Бутон "Потвърди email" (POST form към /auth/confirm-email)
SuccessСлед натискане на бутона + валиден tokenСъобщение за успех + линк към login
FailureИзтекъл/използван tokenГрешка + опция за повторно изпращане (resend form)

Двустъпков процес: GET заявката показва бутон без да консумира token-а. Едва POST заявката (от бутона) реално верифицира. Това предотвратява email link pre-scanners (Microsoft Safe Links) от автоматично консумиране на token-а.

Resend формулярът (при failure) изпраща POST /auth/resend-verification с {email, lang}.

reset_password.html

Страница за задаване на нова парола.

Два режима:

  • Error: Ако token е празен -- показва грешка
  • Form: Два password полета (new + confirm) и submit бутон

Client-side валидация:

  • Парола >= 8 символа
  • Двете полета съвпадат
  • POST /auth/reset-password с {token, new_password}
  • При успех: скрива формата и показва "Password updated"

choose_plan.html

Страница за избор на план преди Stripe Checkout.

Features:

  • Цените идват динамично от Stripe (server-side rendering)
  • Annual планът има recommended CSS class и badge
  • Loading overlay с spinner по време на API call
  • JWT token се подава като query parameter (не Bearer header, понеже е browser page)

checkout_success.html

Статична страница "Payment Successful" -- показва се като fallback когато redirect параметрите липсват. Нормалният flow пренасочва директно обратно към клиента.

checkout_cancel.html

Статична страница "Checkout Cancelled" -- показва се при отказ от плащане.

Email шаблони

Email шаблоните са вградени в Go кода (services/email.go) като HTML strings. Изпращат се чрез Resend API.

Verification Email

ЕлементОписание
SubjectЗависи от lang (EN: "Verify your Dictaro email")
БрандингDictaro logo цвят: #D95070
Фон#1a1a2e (dark theme, съответстващ на app-а)
CTA бутон#D95070 фон, линк към /auth/verify-email?token=...
FallbackPlain text URL за копиране
i18nПълна поддръжка чрез i18n.Get(lang)

HTML структура:

[Dictaro heading]
[Verify Your Email heading]
[Hi {name}, ... body text ...]
[Verify Email Address button]
[Footer: ignore if not you]
[Plain text URL fallback]

Password Reset Email

ЕлементОписание
SubjectЗависи от lang (EN: "Reset your Dictaro password")
БрандингСъщото като verification email
CTA бутонЛинк към /auth/reset-password-page?token=...
FallbackPlain text URL
i18nПълна поддръжка

Dev Mode

Когато RESEND_API_KEY е празен (development), email-ите се принтират в stdout вместо да се изпращат:

[email] To: user@example.com | Subject: Verify your Dictaro email

i18n (Internationalization)

Всички шаблони поддържат многоезичност чрез i18n.Get(lang), който връща struct с преведени strings.

Server-side (Go templates): {{.T.SignInSubtitle}}, {{.T.ContinueGoogle}}, и т.н.

Client-side (JavaScript): Преведените strings се инжектират в JS обект L за динамични съобщения:

var L = {
signingIn: '{{.T.SigningIn}}',
somethingWrong: '{{.T.SomethingWrong}}',
// ...
};

Поддържани езици: Определят се от lang query/form parameter. Ако не е зададен, default е "en".