style(ui): improve bottom padding for safe area compatibility
update bottom padding on banners, status bars, and player controls to use env(safe-area-inset-bottom) for better support on devices with display cutouts or home indicators. also add viewportFit: cover to layout for full-viewport rendering on mobile browsers.
This commit is contained in:
parent
60c1540744
commit
0448835892
8 changed files with 15 additions and 8 deletions
|
|
@ -243,7 +243,7 @@ export default function EPUBPage() {
|
||||||
)}
|
)}
|
||||||
{isAtLimit ? (
|
{isAtLimit ? (
|
||||||
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
||||||
<div className="px-2 md:px-3 pt-1 pb-1.5 flex items-center justify-center gap-1 min-h-10">
|
<div className="px-2 md:px-3 pt-1 pb-[max(0.375rem,env(safe-area-inset-bottom))] flex items-center justify-center gap-1 min-h-10">
|
||||||
<RateLimitPauseButton />
|
<RateLimitPauseButton />
|
||||||
<RateLimitBanner />
|
<RateLimitBanner />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ export default function HTMLPage() {
|
||||||
)}
|
)}
|
||||||
{isAtLimit ? (
|
{isAtLimit ? (
|
||||||
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
||||||
<div className="px-2 md:px-3 pt-1 pb-1.5 flex items-center justify-center gap-1 min-h-10">
|
<div className="px-2 md:px-3 pt-1 pb-[max(0.375rem,env(safe-area-inset-bottom))] flex items-center justify-center gap-1 min-h-10">
|
||||||
<RateLimitPauseButton />
|
<RateLimitPauseButton />
|
||||||
<RateLimitBanner />
|
<RateLimitBanner />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -441,7 +441,7 @@ export default function PDFViewerPage() {
|
||||||
)}
|
)}
|
||||||
{isAtLimit ? (
|
{isAtLimit ? (
|
||||||
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
||||||
<div className="px-2 md:px-3 pt-1 pb-1.5 flex items-center justify-center gap-1 min-h-10">
|
<div className="px-2 md:px-3 pt-1 pb-[max(0.375rem,env(safe-area-inset-bottom))] flex items-center justify-center gap-1 min-h-10">
|
||||||
<RateLimitPauseButton />
|
<RateLimitPauseButton />
|
||||||
<RateLimitBanner />
|
<RateLimitBanner />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
import { ReactNode } from "react";
|
import { ReactNode } from "react";
|
||||||
import { Metadata } from "next";
|
import { Metadata, Viewport } from "next";
|
||||||
import { Figtree } from "next/font/google";
|
import { Figtree } from "next/font/google";
|
||||||
import { ConsentAwareAnalytics } from "@/components/ConsentAwareAnalytics";
|
import { ConsentAwareAnalytics } from "@/components/ConsentAwareAnalytics";
|
||||||
import { CookieConsentBanner } from "@/components/CookieConsentBanner";
|
import { CookieConsentBanner } from "@/components/CookieConsentBanner";
|
||||||
|
|
@ -30,6 +30,10 @@ const themeInitScript = `
|
||||||
})();
|
})();
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const viewport: Viewport = {
|
||||||
|
viewportFit: "cover",
|
||||||
|
};
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: {
|
title: {
|
||||||
default: "OpenReader",
|
default: "OpenReader",
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ export function CookieConsentBanner() {
|
||||||
leave="transition ease-in duration-200 transform"
|
leave="transition ease-in duration-200 transform"
|
||||||
leaveFrom="translate-y-0 opacity-100"
|
leaveFrom="translate-y-0 opacity-100"
|
||||||
leaveTo="translate-y-full opacity-0"
|
leaveTo="translate-y-full opacity-0"
|
||||||
className="fixed bottom-0 left-0 right-0 z-[60] p-4 md:p-6"
|
className="fixed bottom-0 left-0 right-0 z-[60] px-4 pt-4 pb-[max(1rem,env(safe-area-inset-bottom))] md:px-6 md:pt-6 md:pb-[max(1.5rem,env(safe-area-inset-bottom))]"
|
||||||
>
|
>
|
||||||
<div className="mx-auto max-w-5xl rounded-xl border border-offbase bg-base p-5 shadow-2xl md:flex md:items-center md:justify-between md:gap-8">
|
<div className="mx-auto max-w-5xl rounded-xl border border-offbase bg-base p-5 shadow-2xl md:flex md:items-center md:justify-between md:gap-8">
|
||||||
<div className="mb-4 md:mb-0">
|
<div className="mb-4 md:mb-0">
|
||||||
|
|
|
||||||
|
|
@ -354,7 +354,10 @@ export function FinderSidebar({
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{bottomSlot && (
|
{bottomSlot && (
|
||||||
<div className="shrink-0 border-t border-offbase p-2" onClick={(e) => e.stopPropagation()}>
|
<div
|
||||||
|
className="shrink-0 border-t border-offbase px-2 pt-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] md:pb-2"
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
>
|
||||||
{bottomSlot}
|
{bottomSlot}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ export function FinderStatusBar({
|
||||||
<div
|
<div
|
||||||
role="status"
|
role="status"
|
||||||
aria-live="polite"
|
aria-live="polite"
|
||||||
className="h-6 px-3 flex items-center justify-between gap-3 text-[11px] text-muted bg-base border-t border-offbase select-none"
|
className="min-h-6 px-3 pb-[env(safe-area-inset-bottom)] flex items-center justify-between gap-3 text-[11px] text-muted bg-base border-t border-offbase select-none"
|
||||||
>
|
>
|
||||||
<span className="truncate">{summary}</span>
|
<span className="truncate">{summary}</span>
|
||||||
<span className="shrink-0">
|
<span className="shrink-0">
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ export default function TTSPlayer({ currentPage, numPages }: {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
<div className="sticky bottom-0 z-30 w-full border-t border-offbase bg-base" data-app-ttsbar>
|
||||||
<div className="px-2 md:px-3 pt-1 pb-1.5 flex items-center justify-center gap-1 min-h-10">
|
<div className="px-2 md:px-3 pt-1 pb-[max(0.375rem,env(safe-area-inset-bottom))] flex items-center justify-center gap-1 min-h-10">
|
||||||
{/* Speed control */}
|
{/* Speed control */}
|
||||||
<SpeedControl
|
<SpeedControl
|
||||||
setSpeedAndRestart={setSpeedAndRestart}
|
setSpeedAndRestart={setSpeedAndRestart}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue