#35: keep the redesign's source ASCII
The previous commit put four literal non-ASCII characters into source, which lang-lint rejects (PLAN.md 21.1: all code in English, ASCII-only, enforced by CI rather than review). Nine lines failed. The brand mark in the four rails and sign-in cards was a literal lambda, and the domains screen's meta line joined DMARC, MTA-STS and DANE with a literal middot. Both are now \u escapes, so the source is ASCII and the rendered page is unchanged - the served sign-in page emits ce bb for the mark, and the domains chunk carries the middot as \xb7. globals.css goes with them. The linter does not scan .css today, so this was passing, but the stylesheet was the only file in the tree using box-drawing section rules and em dashes, and there is no reason for it to be the exception - ASCII hyphens read the same in a comment. Verified: lang-lint clean, 98 tests green, tsc clean, production build clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b33fc12f08
commit
4f1b9c5217
6 files changed
+22
-22
No files matched your search
@@ -256,9 +256,9 @@ export default function AdminDomainsPage() {
|
||||
<div className="break-words text-lg font-medium leading-tight text-slate-100">{d.name}</div>
|
||||
<div className="mt-1 text-[12.5px] leading-relaxed text-slate-400">
|
||||
{t("admin.mailboxCount", { count: d.mailbox_count })}
|
||||
{d.dmarc_policy ? ` · DMARC: ${d.dmarc_policy}` : ""}
|
||||
{d.mta_sts_mode ? ` · MTA-STS: ${d.mta_sts_mode}` : ""}
|
||||
{d.dane_enabled ? " · DANE" : ""}
|
||||
{d.dmarc_policy ? ` \u00b7 DMARC: ${d.dmarc_policy}` : ""}
|
||||
{d.mta_sts_mode ? ` \u00b7 MTA-STS: ${d.mta_sts_mode}` : ""}
|
||||
{d.dane_enabled ? " \u00b7 DANE" : ""}
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-none flex-wrap items-center gap-2.5">
|
||||
|
||||
@@ -51,7 +51,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
|
||||
<div className="flex h-full flex-col gap-4 p-3">
|
||||
<div className="flex items-center gap-2.5 px-2 py-1">
|
||||
<div className="flex h-8 w-8 flex-none items-center justify-center rounded-[10px] bg-dark-card text-[17px] leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<div className="text-[15px] font-medium leading-tight">LambdaMail</div>
|
||||
@@ -137,7 +137,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
|
||||
<div className="fixed left-0 top-0 z-20 flex w-full items-center justify-between bg-dark-rail px-4 py-3 shadow-[inset_0_-1px_0_0_rgba(233,233,237,0.09)] md:hidden">
|
||||
<div className="flex min-w-0 items-center gap-2.5">
|
||||
<div className="flex h-8 w-8 flex-none items-center justify-center rounded-[10px] bg-dark-card text-[17px] leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<span className="min-w-0 truncate font-medium text-slate-100">
|
||||
{t("common.appName")} {t("common.adminPortal")}
|
||||
|
||||
@@ -108,7 +108,7 @@ export default function AdminLoginPage() {
|
||||
different product. */}
|
||||
<div className="mb-6 flex items-center gap-3">
|
||||
<div className="flex h-10 w-10 flex-none items-center justify-center rounded-xl bg-dark-card text-xl leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h1 className="text-lg font-medium leading-tight text-slate-100">{t("auth.adminLoginTitle")}</h1>
|
||||
|
||||
@@ -59,7 +59,7 @@ export default function UserLoginPage() {
|
||||
<div className="w-full max-w-[400px] rounded-2xl bg-dark-panel p-7 shadow-edge">
|
||||
<div className="mb-6 flex items-center gap-3">
|
||||
<div className="flex h-10 w-10 flex-none items-center justify-center rounded-xl bg-dark-card text-xl leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h1 className="text-lg font-medium leading-tight text-slate-100">{t("auth.userLoginTitle")}</h1>
|
||||
|
||||
@@ -59,7 +59,7 @@ export default function UserWebmailLayout({ children }: { children: React.ReactN
|
||||
the only thing that says which one you are in. */}
|
||||
<div className="flex items-center gap-2.5 px-2 py-1">
|
||||
<div className="flex h-8 w-8 flex-none items-center justify-center rounded-[10px] bg-dark-card text-[17px] leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<div className="text-[15px] font-medium leading-tight">LambdaMail</div>
|
||||
@@ -215,7 +215,7 @@ export default function UserWebmailLayout({ children }: { children: React.ReactN
|
||||
<div className="fixed left-0 top-0 z-20 flex w-full items-center justify-between bg-dark-rail px-4 py-3 shadow-[inset_0_-1px_0_0_rgba(233,233,237,0.09)] md:hidden">
|
||||
<div className="flex items-center gap-2.5">
|
||||
<div className="flex h-8 w-8 items-center justify-center rounded-[10px] bg-dark-card text-[17px] leading-none text-indigo-500 shadow-[inset_0_0_0_1px_#9184d9]">
|
||||
λ
|
||||
{"\u03bb"}
|
||||
</div>
|
||||
<span className="font-medium text-slate-100">LambdaMail</span>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
@tailwind utilities;
|
||||
|
||||
/**
|
||||
* Nocturne — the one visual language for both surfaces.
|
||||
* Nocturne - the one visual language for both surfaces.
|
||||
*
|
||||
* The webmail used to be indigo over glass and the console green over glass,
|
||||
* so the two halves of the same product did not look related. Everything below
|
||||
@@ -62,9 +62,9 @@ h1, h2, h3, h4, h5, h6 {
|
||||
background: rgba(145, 132, 217, 0.3);
|
||||
}
|
||||
|
||||
/* ────────────────────────────────────────────────────────────────────────
|
||||
/* --------------------------------------------------------------------
|
||||
Surfaces
|
||||
──────────────────────────────────────────────────────────────────────── */
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
/** A code or DNS-record block: the darkest ground, monospace, accent ink. */
|
||||
.lm-code {
|
||||
@@ -78,7 +78,7 @@ h1, h2, h3, h4, h5, h6 {
|
||||
}
|
||||
|
||||
/**
|
||||
* A rule that fades to transparent at both ends rather than stopping cleanly —
|
||||
* A rule that fades to transparent at both ends rather than stopping cleanly -
|
||||
* the one Nocturne signature that has to be CSS, because Tailwind has no
|
||||
* gradient border.
|
||||
*/
|
||||
@@ -94,13 +94,13 @@ h1, h2, h3, h4, h5, h6 {
|
||||
);
|
||||
}
|
||||
|
||||
/* ────────────────────────────────────────────────────────────────────────
|
||||
/* --------------------------------------------------------------------
|
||||
Navigation, rows and chips
|
||||
──────────────────────────────────────────────────────────────────────── */
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* A sidebar item. The 3px mark on the left is the accent's whole appearance
|
||||
* here — an active item is not a filled pill. Nothing in this block is sized
|
||||
* here - an active item is not a filled pill. Nothing in this block is sized
|
||||
* by its text: the label wraps to a second line instead of being clipped,
|
||||
* which is what broke when the interface was read in Portuguese or Spanish.
|
||||
*/
|
||||
@@ -202,9 +202,9 @@ h1, h2, h3, h4, h5, h6 {
|
||||
box-shadow: inset 0 0 0 1px var(--lm-edge);
|
||||
}
|
||||
|
||||
/* ────────────────────────────────────────────────────────────────────────
|
||||
Tables — the header and the row rules fade at their ends, as the rules do
|
||||
──────────────────────────────────────────────────────────────────────── */
|
||||
/* --------------------------------------------------------------------
|
||||
Tables - the header and the row rules fade at their ends, as the rules do
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
.lm-table {
|
||||
width: 100%;
|
||||
@@ -258,9 +258,9 @@ h1, h2, h3, h4, h5, h6 {
|
||||
no-repeat bottom / 100% 1px;
|
||||
}
|
||||
|
||||
/* ────────────────────────────────────────────────────────────────────────
|
||||
Scrollbars — a thin neutral thumb on no track
|
||||
──────────────────────────────────────────────────────────────────────── */
|
||||
/* --------------------------------------------------------------------
|
||||
Scrollbars - a thin neutral thumb on no track
|
||||
-------------------------------------------------------------------- */
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 8px;
|
||||
|
||||
Reference in new issue
Block a user