Offer matte background color configuration

This commit is contained in:
Sam Becker 2025-03-29 13:00:24 -05:00
parent 6344a469b7
commit 813658a3d4
6 changed files with 58 additions and 5 deletions

View File

@ -23,6 +23,7 @@ import ShareModals from '@/share/ShareModals';
import AdminUploadPanel from '@/admin/upload/AdminUploadPanel'; import AdminUploadPanel from '@/admin/upload/AdminUploadPanel';
import { revalidatePath } from 'next/cache'; import { revalidatePath } from 'next/cache';
import RecipeModal from '@/recipe/RecipeModal'; import RecipeModal from '@/recipe/RecipeModal';
import ThemeColors from '@/app/ThemeColors';
import '../tailwind.css'; import '../tailwind.css';
@ -79,6 +80,7 @@ export default function RootLayout({
'3xl:flex flex-col items-center', '3xl:flex flex-col items-center',
)}> )}>
<AppStateProvider> <AppStateProvider>
<ThemeColors />
<ThemeProvider attribute="class" defaultTheme={DEFAULT_THEME}> <ThemeProvider attribute="class" defaultTheme={DEFAULT_THEME}>
<SwrConfigClient> <SwrConfigClient>
<div className={clsx( <div className={clsx(

View File

@ -71,6 +71,8 @@ export default function AdminAppConfigurationClient({
hasDefaultTheme, hasDefaultTheme,
defaultTheme, defaultTheme,
arePhotosMatted, arePhotosMatted,
matteColor,
matteColorDark,
// Display // Display
categoryVisibility, categoryVisibility,
hasCategoryVisibility, hasCategoryVisibility,
@ -114,8 +116,8 @@ export default function AdminAppConfigurationClient({
}) { }) {
const renderEnvVars = (variables: string[]) => const renderEnvVars = (variables: string[]) =>
<div className="pt-1 flex flex-col gap-1"> <div className="pt-1 flex flex-col gap-1">
{variables.map(envVar => {variables.map(variable =>
<EnvVar key={envVar} variable={envVar} />)} <EnvVar key={variable} variable={variable} />)}
</div>; </div>;
const renderSubStatus = ( const renderSubStatus = (
@ -478,7 +480,23 @@ export default function AdminAppConfigurationClient({
Set environment variable to {'"1"'} to constrain the size Set environment variable to {'"1"'} to constrain the size
{' '} {' '}
of each photo, and display a surrounding border: of each photo, and display a surrounding border:
{renderEnvVars(['NEXT_PUBLIC_MATTE_PHOTOS'])} <div className="pt-1 flex flex-col gap-1">
<EnvVar variable="NEXT_PUBLIC_MATTE_PHOTOS" />
<EnvVar
variable="NEXT_PUBLIC_MATTE_COLOR"
accessory={matteColor && <span
className="size-4 border-medium rounded-sm ml-1"
style={{ backgroundColor: matteColor }}
/>}
/>
<EnvVar
variable="NEXT_PUBLIC_MATTE_COLOR_DARK"
accessory={matteColorDark && <span
className="size-4 border-medium rounded-sm ml-1"
style={{ backgroundColor: matteColorDark }}
/>}
/>
</div>
</ChecklistRow> </ChecklistRow>
</ChecklistGroup> </ChecklistGroup>
<ChecklistGroup <ChecklistGroup

14
src/app/ThemeColors.tsx Normal file
View File

@ -0,0 +1,14 @@
'use client';
import { MATTE_COLOR, MATTE_COLOR_DARK } from './config';
export default function ThemeColors() {
return (<>
{MATTE_COLOR && <style jsx global>{`
:root { --matte-bg: ${MATTE_COLOR}; }
`}</style>}
{MATTE_COLOR_DARK && <style jsx global>{`
:root { --matte-bg-dark: ${MATTE_COLOR_DARK}; }
`}</style>}
</>);
}

View File

@ -232,6 +232,10 @@ export const DEFAULT_THEME =
: 'system'; : 'system';
export const MATTE_PHOTOS = export const MATTE_PHOTOS =
process.env.NEXT_PUBLIC_MATTE_PHOTOS === '1'; process.env.NEXT_PUBLIC_MATTE_PHOTOS === '1';
export const MATTE_COLOR =
process.env.NEXT_PUBLIC_MATTE_COLOR;
export const MATTE_COLOR_DARK =
process.env.NEXT_PUBLIC_MATTE_COLOR_DARK;
// DISPLAY // DISPLAY
@ -350,6 +354,8 @@ export const APP_CONFIGURATION = {
hasDefaultTheme: Boolean(process.env.NEXT_PUBLIC_DEFAULT_THEME), hasDefaultTheme: Boolean(process.env.NEXT_PUBLIC_DEFAULT_THEME),
defaultTheme: DEFAULT_THEME, defaultTheme: DEFAULT_THEME,
arePhotosMatted: MATTE_PHOTOS, arePhotosMatted: MATTE_PHOTOS,
matteColor: MATTE_COLOR,
matteColorDark: MATTE_COLOR_DARK,
// Display // Display
hasCategoryVisibility: hasCategoryVisibility:
Boolean(process.env.NEXT_PUBLIC_CATEGORY_VISIBILITY), Boolean(process.env.NEXT_PUBLIC_CATEGORY_VISIBILITY),

View File

@ -5,12 +5,14 @@ import CopyButton from './CopyButton';
export default function EnvVar({ export default function EnvVar({
variable, variable,
value, value,
accessory,
includeCopyButton = true, includeCopyButton = true,
trailingContent, trailingContent,
className, className,
}: { }: {
variable: string, variable: string,
value?: string, value?: string,
accessory?: ReactNode,
includeCopyButton?: boolean, includeCopyButton?: boolean,
trailingContent?: ReactNode, trailingContent?: ReactNode,
className?: string, className?: string,
@ -33,6 +35,7 @@ export default function EnvVar({
)}> )}>
{variable}{value && ` = ${value}`} {variable}{value && ` = ${value}`}
</span> </span>
{accessory}
{includeCopyButton && {includeCopyButton &&
<span className="translate-y-[1px]"> <span className="translate-y-[1px]">
<CopyButton <CopyButton

View File

@ -29,6 +29,8 @@ import {
SHOULD_PREFETCH_ALL_LINKS, SHOULD_PREFETCH_ALL_LINKS,
ALLOW_PUBLIC_DOWNLOADS, ALLOW_PUBLIC_DOWNLOADS,
SHOW_TAKEN_AT_TIME, SHOW_TAKEN_AT_TIME,
MATTE_COLOR,
MATTE_COLOR_DARK,
} from '@/app/config'; } from '@/app/config';
import AdminPhotoMenu from '@/admin/AdminPhotoMenu'; import AdminPhotoMenu from '@/admin/AdminPhotoMenu';
import { RevalidatePhoto } from './InfinitePhotoScroll'; import { RevalidatePhoto } from './InfinitePhotoScroll';
@ -237,8 +239,16 @@ export default function PhotoLarge({
ariaLabel: `Admin menu for '${titleForPhoto(photo)}' photo`, ariaLabel: `Admin menu for '${titleForPhoto(photo)}' photo`,
}} />; }} />;
const largePhotoContainerClassName = clsx(arePhotosMatted && const largePhotoContainerClassName = clsx(
'flex items-center justify-center aspect-3/2 bg-gray-100', arePhotosMatted && 'flex items-center justify-center aspect-3/2',
// Matte theme colors defined in root layout
arePhotosMatted && (MATTE_COLOR
? 'bg-(--matte-bg)'
: 'bg-gray-100'),
arePhotosMatted && (MATTE_COLOR_DARK
? 'dark:bg-(--matte-bg-dark)'
// Only specify dark background when MATTE_COLOR is not configured
: !MATTE_COLOR && 'dark:bg-gray-700/35'),
); );
return ( return (