chore: lint and format
All checks were successful
Build and Push Backend Image / build (push) Successful in 50s
All checks were successful
Build and Push Backend Image / build (push) Successful in 50s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,17 +2,17 @@
|
|||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
/* ── Design tokens — exact mirror of frontend app.css :root ── */
|
/* ── Design tokens — exact mirror of frontend app.css :root ── */
|
||||||
--color-background: oklch(0.98 0.01 320);
|
--color-background: oklch(0.98 0.01 320);
|
||||||
--color-foreground: oklch(0.08 0.02 280);
|
--color-foreground: oklch(0.08 0.02 280);
|
||||||
--color-card: oklch(0.99 0.005 320);
|
--color-card: oklch(0.99 0.005 320);
|
||||||
--color-card-foreground: oklch(0.08 0.02 280);
|
--color-card-foreground: oklch(0.08 0.02 280);
|
||||||
--color-muted: oklch(0.95 0.01 280);
|
--color-muted: oklch(0.95 0.01 280);
|
||||||
--color-muted-foreground: oklch(0.4 0.02 280);
|
--color-muted-foreground: oklch(0.4 0.02 280);
|
||||||
--color-border: oklch(0.85 0.02 280);
|
--color-border: oklch(0.85 0.02 280);
|
||||||
--color-primary: oklch(56.971% 0.27455 319.257);
|
--color-primary: oklch(56.971% 0.27455 319.257);
|
||||||
--color-primary-foreground: oklch(0.98 0.01 320);
|
--color-primary-foreground: oklch(0.98 0.01 320);
|
||||||
|
|
||||||
/* ── Font ── */
|
/* ── Font ── */
|
||||||
--font-sans: 'Noto Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
|
--font-sans:
|
||||||
Helvetica, Arial, sans-serif;
|
"Noto Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,7 @@ export interface RenderOptions {
|
|||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function renderTemplate(
|
export async function renderTemplate(name: string, locals: RenderOptions): Promise<string> {
|
||||||
name: string,
|
|
||||||
locals: RenderOptions,
|
|
||||||
): Promise<string> {
|
|
||||||
// Dynamic import: @maizzle/framework v6 is ESM-only
|
// Dynamic import: @maizzle/framework v6 is ESM-only
|
||||||
const { render } = await import("@maizzle/framework");
|
const { render } = await import("@maizzle/framework");
|
||||||
|
|
||||||
@@ -35,7 +32,7 @@ export async function renderTemplate(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
locals: {
|
locals: {
|
||||||
cssPath: CSS_PATH, // layout uses {{ cssPath }} in <link href="{{ cssPath }}" inline>
|
cssPath: CSS_PATH, // layout uses {{ cssPath }} in <link href="{{ cssPath }}" inline>
|
||||||
baseUrl: BASE_URL,
|
baseUrl: BASE_URL,
|
||||||
...locals,
|
...locals,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,68 +1,81 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
|
<html
|
||||||
<head>
|
lang="en"
|
||||||
<meta charset="UTF-8" />
|
xmlns="http://www.w3.org/1999/xhtml"
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
xmlns:v="urn:schemas-microsoft-com:vml"
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
xmlns:o="urn:schemas-microsoft-com:office:office"
|
||||||
<meta name="x-apple-disable-message-reformatting" />
|
>
|
||||||
<!--[if mso]>
|
<head>
|
||||||
<noscript><xml><o:OfficeDocumentSettings><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml></noscript>
|
<meta charset="UTF-8" />
|
||||||
<![endif]-->
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>{{ page.title || 'sexy.pivoine.art' }}</title>
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="x-apple-disable-message-reformatting" />
|
||||||
|
<!--[if mso]>
|
||||||
|
<noscript
|
||||||
|
><xml
|
||||||
|
><o:OfficeDocumentSettings
|
||||||
|
><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings
|
||||||
|
></xml
|
||||||
|
></noscript
|
||||||
|
>
|
||||||
|
<![endif]-->
|
||||||
|
<title>{{ page.title || 'sexy.pivoine.art' }}</title>
|
||||||
|
|
||||||
<!-- Noto Sans — progressive enhancement for clients that support web fonts -->
|
<!-- Noto Sans — progressive enhancement for clients that support web fonts -->
|
||||||
<style plain>
|
<style plain>
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700&display=swap');
|
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;600;700&display=swap");
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- Design tokens + Tailwind preset — path resolved by render.ts -->
|
<!-- Design tokens + Tailwind preset — path resolved by render.ts -->
|
||||||
<link rel="stylesheet" href="{{ cssPath }}" inline>
|
<link rel="stylesheet" href="{{ cssPath }}" inline />
|
||||||
</head>
|
</head>
|
||||||
<body class="bg-background m-0 p-0 font-sans">
|
<body class="bg-background m-0 p-0 font-sans">
|
||||||
|
<!-- Preview text (hidden) -->
|
||||||
|
<if condition="page.previewText || previewText">
|
||||||
|
<div class="hidden max-h-0 overflow-hidden">
|
||||||
|
{{ page.previewText || previewText }}
|
||||||
|
‌ ‌ ‌ ‌ ‌ ‌
|
||||||
|
</div>
|
||||||
|
</if>
|
||||||
|
|
||||||
<!-- Preview text (hidden) -->
|
<div class="py-8 px-4">
|
||||||
<if condition="page.previewText || previewText">
|
<table
|
||||||
<div class="hidden max-h-0 overflow-hidden">
|
class="w-full max-w-[600px] mx-auto"
|
||||||
{{ page.previewText || previewText }}
|
role="presentation"
|
||||||
‌ ‌ ‌ ‌ ‌ ‌
|
cellpadding="0"
|
||||||
|
cellspacing="0"
|
||||||
|
border="0"
|
||||||
|
>
|
||||||
|
<!-- Brand header — uses --foreground as dark bg -->
|
||||||
|
<tr>
|
||||||
|
<td class="bg-foreground rounded-t-2xl px-8 py-6 text-center">
|
||||||
|
<a href="{{ baseUrl }}" style="text-decoration: none">
|
||||||
|
<span class="text-sm font-semibold tracking-[0.22em] uppercase text-background">
|
||||||
|
sexy<span class="text-primary">.</span>pivoine<span class="text-primary">.</span>art
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<!-- Card body -->
|
||||||
|
<tr>
|
||||||
|
<td class="bg-card px-8 py-10 text-[14px] text-card-foreground leading-relaxed">
|
||||||
|
<yield />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<tr>
|
||||||
|
<td class="bg-muted border-t border-border rounded-b-2xl px-8 py-6 text-center">
|
||||||
|
<p class="text-[11px] text-muted-foreground m-0">
|
||||||
|
© {{ new Date().getFullYear() }} sexy.pivoine.art — For adults only (18+)
|
||||||
|
</p>
|
||||||
|
<p class="text-[11px] text-muted-foreground mt-2 mb-0">
|
||||||
|
If you did not request this email, you can safely ignore it.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</if>
|
</body>
|
||||||
|
|
||||||
<div class="py-8 px-4">
|
|
||||||
<table class="w-full max-w-[600px] mx-auto" role="presentation" cellpadding="0" cellspacing="0" border="0">
|
|
||||||
|
|
||||||
<!-- Brand header — uses --foreground as dark bg -->
|
|
||||||
<tr>
|
|
||||||
<td class="bg-foreground rounded-t-2xl px-8 py-6 text-center">
|
|
||||||
<a href="{{ baseUrl }}" style="text-decoration: none">
|
|
||||||
<span class="text-sm font-semibold tracking-[0.22em] uppercase text-background">
|
|
||||||
sexy<span class="text-primary">.</span>pivoine<span class="text-primary">.</span>art
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- Card body -->
|
|
||||||
<tr>
|
|
||||||
<td class="bg-card px-8 py-10 text-[14px] text-card-foreground leading-relaxed">
|
|
||||||
<yield />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- Footer -->
|
|
||||||
<tr>
|
|
||||||
<td class="bg-muted border-t border-border rounded-b-2xl px-8 py-6 text-center">
|
|
||||||
<p class="text-[11px] text-muted-foreground m-0">
|
|
||||||
© {{ new Date().getFullYear() }} sexy.pivoine.art — For adults only (18+)
|
|
||||||
</p>
|
|
||||||
<p class="text-[11px] text-muted-foreground mt-2 mb-0">
|
|
||||||
If you did not request this email, you can safely ignore it.
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -4,21 +4,21 @@ previewText: "You requested a password reset. Use the link below to set a new on
|
|||||||
---
|
---
|
||||||
|
|
||||||
<x-main>
|
<x-main>
|
||||||
|
<h1 class="text-[22px] font-semibold text-foreground m-0 mb-2">Reset your password</h1>
|
||||||
<h1 class="text-[22px] font-semibold text-foreground m-0 mb-2">
|
|
||||||
Reset your password
|
|
||||||
</h1>
|
|
||||||
<p class="text-muted-foreground m-0 mb-6">
|
<p class="text-muted-foreground m-0 mb-6">
|
||||||
We received a request to reset the password for your account. Click the button below to choose a new one.
|
We received a request to reset the password for your account. Click the button below to choose a
|
||||||
|
new one.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<!-- CTA button — inline style needed for Outlook -->
|
<!-- CTA button — inline style needed for Outlook -->
|
||||||
<table role="presentation" cellpadding="0" cellspacing="0" border="0" class="mb-6">
|
<table role="presentation" cellpadding="0" cellspacing="0" border="0" class="mb-6">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="rounded-lg" style="background: #b700d9">
|
<td class="rounded-lg" style="background: #b700d9">
|
||||||
<a href="{{ url }}"
|
<a
|
||||||
class="inline-block px-8 py-[14px] text-[14px] font-semibold text-primary-foreground no-underline rounded-lg"
|
href="{{ url }}"
|
||||||
style="background: #b700d9; color: #faf4fb">
|
class="inline-block px-8 py-[14px] text-[14px] font-semibold text-primary-foreground no-underline rounded-lg"
|
||||||
|
style="background: #b700d9; color: #faf4fb"
|
||||||
|
>
|
||||||
Reset my password
|
Reset my password
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@@ -26,8 +26,8 @@ previewText: "You requested a password reset. Use the link below to set a new on
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p class="text-[13px] text-muted-foreground m-0 mb-6">
|
<p class="text-[13px] text-muted-foreground m-0 mb-6">
|
||||||
This link expires in <strong class="text-foreground">1 hour</strong>.
|
This link expires in <strong class="text-foreground">1 hour</strong>. If you did not request a
|
||||||
If you did not request a password reset, no action is needed — your account remains secure.
|
password reset, no action is needed — your account remains secure.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<hr class="border-0 border-t border-border my-6" />
|
<hr class="border-0 border-t border-border my-6" />
|
||||||
@@ -36,9 +36,6 @@ previewText: "You requested a password reset. Use the link below to set a new on
|
|||||||
Button not working? Copy and paste this link into your browser:
|
Button not working? Copy and paste this link into your browser:
|
||||||
</p>
|
</p>
|
||||||
<p class="text-[12px] m-0 mt-1">
|
<p class="text-[12px] m-0 mt-1">
|
||||||
<a href="{{ url }}" class="text-primary break-all" style="color: #b700d9">
|
<a href="{{ url }}" class="text-primary break-all" style="color: #b700d9"> {{ url }} </a>
|
||||||
{{ url }}
|
|
||||||
</a>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</x-main>
|
</x-main>
|
||||||
|
|||||||
@@ -4,21 +4,21 @@ previewText: "Almost there — confirm your email address to activate your accou
|
|||||||
---
|
---
|
||||||
|
|
||||||
<x-main>
|
<x-main>
|
||||||
|
<h1 class="text-[22px] font-semibold text-foreground m-0 mb-2">Verify your email address</h1>
|
||||||
<h1 class="text-[22px] font-semibold text-foreground m-0 mb-2">
|
|
||||||
Verify your email address
|
|
||||||
</h1>
|
|
||||||
<p class="text-muted-foreground m-0 mb-6">
|
<p class="text-muted-foreground m-0 mb-6">
|
||||||
Thanks for signing up! Click the button below to confirm your email address and activate your account.
|
Thanks for signing up! Click the button below to confirm your email address and activate your
|
||||||
|
account.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<!-- CTA button — inline style needed for Outlook -->
|
<!-- CTA button — inline style needed for Outlook -->
|
||||||
<table role="presentation" cellpadding="0" cellspacing="0" border="0" class="mb-6">
|
<table role="presentation" cellpadding="0" cellspacing="0" border="0" class="mb-6">
|
||||||
<tr>
|
<tr>
|
||||||
<td class="rounded-lg" style="background: #b700d9">
|
<td class="rounded-lg" style="background: #b700d9">
|
||||||
<a href="{{ url }}"
|
<a
|
||||||
class="inline-block px-8 py-[14px] text-[14px] font-semibold text-primary-foreground no-underline rounded-lg"
|
href="{{ url }}"
|
||||||
style="background: #b700d9; color: #faf4fb">
|
class="inline-block px-8 py-[14px] text-[14px] font-semibold text-primary-foreground no-underline rounded-lg"
|
||||||
|
style="background: #b700d9; color: #faf4fb"
|
||||||
|
>
|
||||||
Verify my email
|
Verify my email
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
@@ -35,9 +35,6 @@ previewText: "Almost there — confirm your email address to activate your accou
|
|||||||
Button not working? Copy and paste this link into your browser:
|
Button not working? Copy and paste this link into your browser:
|
||||||
</p>
|
</p>
|
||||||
<p class="text-[12px] m-0 mt-1">
|
<p class="text-[12px] m-0 mt-1">
|
||||||
<a href="{{ url }}" class="text-primary break-all" style="color: #b700d9">
|
<a href="{{ url }}" class="text-primary break-all" style="color: #b700d9"> {{ url }} </a>
|
||||||
{{ url }}
|
|
||||||
</a>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</x-main>
|
</x-main>
|
||||||
|
|||||||
Reference in New Issue
Block a user