diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6fefab3c..9099f793 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,13 @@ jobs: - name: Type check run: pnpm type-check + # The script existed and already failed — CSS said `sm` was 430px while + # src/config/breakpoints.ts said 428px — and it was wired into no workflow + # and no hook (#373 B2). Landing it green here is what keeps the two in + # step; without this step the mirror silently drifts again. + - name: Validate breakpoint configuration + run: pnpm validate:breakpoints + - name: Run tests run: pnpm test --run diff --git a/scripts/validate-ci.sh b/scripts/validate-ci.sh index ef4ac064..626e311e 100755 --- a/scripts/validate-ci.sh +++ b/scripts/validate-ci.sh @@ -83,6 +83,11 @@ run_check "ESLint" "pnpm lint" # 2. Type check run_check "TypeScript type check" "pnpm type-check" +# 2b. Breakpoint drift. The script existed and already failed — CSS said the `sm` +# breakpoint was 430px while src/config/breakpoints.ts said 428px — and it was +# wired into no workflow and no hook, so nothing ever ran it (#373 B2). +run_check "Breakpoint config" "pnpm validate:breakpoints" + # 3. Unit tests run_check "Unit tests" "pnpm test --run" diff --git a/src/app/accessibility/page.tsx b/src/app/accessibility/page.tsx index 697aa1bd..b10c73e2 100644 --- a/src/app/accessibility/page.tsx +++ b/src/app/accessibility/page.tsx @@ -9,7 +9,7 @@ export default function AccessibilityPage() { const { fontSize, lineHeight, fontFamily } = settings; return ( -
+

diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index db3eb5e5..cd4250d6 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -15,7 +15,7 @@ export const metadata: Metadata = { export default function ContactPage() { return ( -
+

diff --git a/src/app/globals.css b/src/app/globals.css index f42b2a12..80b7d029 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1190,7 +1190,7 @@ p:not([class*='text-']) { line-height: 1 !important; } -@media (min-width: 26.75rem) { +@media (width >= theme(--breakpoint-sm)) { .btn-mobile-compact { height: 2rem !important; min-height: 2rem !important; @@ -1211,7 +1211,7 @@ p:not([class*='text-']) { margin-bottom: 0.25rem !important; } -@media (min-width: 26.75rem) { +@media (width >= theme(--breakpoint-sm)) { /* sm breakpoint */ .page-title { font-size: var(--text-2xl) !important; @@ -1252,7 +1252,7 @@ p:not([class*='text-']) { font-weight: 600 !important; } -@media (min-width: 26.75rem) { +@media (width >= theme(--breakpoint-sm)) { .section-title { font-size: var(--text-xl) !important; margin-top: 1rem !important; @@ -1292,7 +1292,7 @@ p:not([class*='text-']) { margin-bottom: 0.25rem !important; } -@media (min-width: 26.75rem) { +@media (width >= theme(--breakpoint-sm)) { .subsection-title { font-size: var(--text-lg) !important; margin-top: 0.75rem !important; @@ -1324,7 +1324,7 @@ p:not([class*='text-']) { margin-bottom: 0.125rem !important; } -@media (min-width: 26.75rem) { +@media (width >= theme(--breakpoint-sm)) { .minor-heading { font-size: var(--text-base) !important; margin-top: 0.5rem !important; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 562c252f..c1051d14 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -186,7 +186,7 @@ export default function RootLayout({ -
+
{children}
diff --git a/src/app/messages/setup/page.tsx b/src/app/messages/setup/page.tsx index e8edf990..c52e0ffb 100644 --- a/src/app/messages/setup/page.tsx +++ b/src/app/messages/setup/page.tsx @@ -156,7 +156,7 @@ export default function MessagingSetupPage() { // Loading states if (authLoading || checkingKeys) { return ( -
+
); @@ -165,7 +165,7 @@ export default function MessagingSetupPage() { // Redirect if already set up if (hasExistingKeys) { return ( -
+
Redirecting to messages...
@@ -173,7 +173,7 @@ export default function MessagingSetupPage() { } return ( -
+

Set Up Encrypted Messaging

diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index 8040884c..6d032c40 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -2,7 +2,7 @@ import Link from 'next/link'; export default function NotFound() { return ( -
+

404

Page Not Found

diff --git a/src/app/themes/page.tsx b/src/app/themes/page.tsx index 8eb58eb1..757e0ad2 100644 --- a/src/app/themes/page.tsx +++ b/src/app/themes/page.tsx @@ -80,7 +80,7 @@ export default function ThemesPage() { }; return ( -
+

diff --git a/src/components/GlobalNav.tsx b/src/components/GlobalNav.tsx index cc129054..2294ccb5 100644 --- a/src/components/GlobalNav.tsx +++ b/src/components/GlobalNav.tsx @@ -182,6 +182,14 @@ function NavGroupMenu({ ); } +/** + * Every item in a DaisyUI `menu` needs an explicit height floor: `li > a` + * renders at 26px, and the 44px gate cannot see items inside a closed + * dropdown, so they stay under it indefinitely (#378). Named rather than + * repeated so a new entry cannot arrive without one. + */ +const MENU_ITEM = 'min-h-11 flex items-center'; + /** A single nav destination. */ type NavLeaf = { href: string; label: string; reload?: boolean }; /** A labelled group of destinations, rendered as a dropdown. */ @@ -519,10 +527,14 @@ export function GlobalNav() { {user.email}

  • - Profile + + Profile +
  • - Account Settings + + Account Settings +
  • - Connections + + Connections +
  • {isAdmin && (
  • - Admin Dashboard + + Admin Dashboard +
  • )}
  • @@ -624,14 +643,14 @@ export function GlobalNav() { {item.reload ? ( {item.label} ) : ( {item.label} @@ -644,15 +663,19 @@ export function GlobalNav() { Account
  • - Profile + + Profile +
  • - Settings + + Settings +
  • Messages {unreadCount > 0 && ( @@ -663,11 +686,18 @@ export function GlobalNav() {
  • - Connections + + Connections +
  • {isAdmin && (
  • - Admin Dashboard + + Admin Dashboard +
  • )}
  • @@ -695,10 +725,14 @@ export function GlobalNav() { Account
  • - Sign In + + Sign In +
  • - Sign Up + + Sign Up +
  • )} @@ -774,7 +808,7 @@ export function GlobalNav() {

    Theme

    -