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фон,#1E293Bcontainer,#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 верификация с три състояния:
| Състояние | Кога | Какво показва |
|---|---|---|
| Pending | GET /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 планът има
recommendedCSS 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=... |
| Fallback | Plain 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=... |
| Fallback | Plain 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".