Rename core film simulation pages

This commit is contained in:
Sam Becker 2025-03-29 22:40:44 -05:00
parent 2411b2a2b6
commit 763428547c
37 changed files with 73 additions and 74 deletions

View File

@ -7,7 +7,7 @@ import FieldSetWithStatus from '@/components/FieldSetWithStatus';
import AppGrid from '@/components/AppGrid';
import EntityLink from '@/components/primitives/EntityLink';
import LabeledIcon from '@/components/primitives/LabeledIcon';
import PhotoFilmSimulationIcon from '@/simulation/PhotoFilmSimulationIcon';
import PhotoFilmIcon from '@/film/PhotoFilmIcon';
import { useAppState } from '@/state/AppState';
import { clsx } from 'clsx/lite';
import { useEffect, useState } from 'react';
@ -129,7 +129,7 @@ export default function ComponentsPage() {
</div>
<div>
<EntityLink
icon={<PhotoFilmSimulationIcon simulation="astia" />}
icon={<PhotoFilmIcon simulation="astia" />}
label="Astia/Soft"
type="icon-last"
iconWide
@ -149,7 +149,7 @@ export default function ComponentsPage() {
</div>
<div>
<EntityLink
icon={<PhotoFilmSimulationIcon simulation="astia" />}
icon={<PhotoFilmIcon simulation="astia" />}
label="Astia/Soft"
type="icon-last"
iconWide
@ -184,7 +184,7 @@ export default function ComponentsPage() {
</div>
<div>
<EntityLink
icon={<PhotoFilmSimulationIcon simulation="astia" />}
icon={<PhotoFilmIcon simulation="astia" />}
label="Astia/Soft"
type="icon-last"
iconWide

View File

@ -10,7 +10,7 @@ import {
} from '@/app/config';
import ErrorNote from '@/components/ErrorNote';
import { getRecipeTitleForData } from '@/photo/db/query';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
export const maxDuration = 60;

View File

@ -5,7 +5,7 @@ import { clsx } from 'clsx/lite';
import {
FILM_SIMULATION_FORM_INPUT_OPTIONS,
} from '@/platforms/fujifilm/simulation';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
import { useEffect, useState } from 'react';
export default function FilmPage() {
@ -27,7 +27,7 @@ export default function FilmPage() {
<div className="dark:text-gray-500/50 uppercase">
Film Simulation:
</div>
<PhotoFilmSimulation
<PhotoFilm
simulation={FILM_SIMULATION_FORM_INPUT_OPTIONS[index].value}
type="icon-first"
/>

View File

@ -1,14 +1,14 @@
import {
FILM_SIMULATION_FORM_INPUT_OPTIONS,
} from '@/platforms/fujifilm/simulation';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
export default function FilmPage() {
return (
<div className="space-y-1 my-12">
{FILM_SIMULATION_FORM_INPUT_OPTIONS.map(({ value }) =>
<div key={value}>
<PhotoFilmSimulation
<PhotoFilm
simulation={value}
type="icon-first"
/>

View File

@ -11,7 +11,7 @@ import {
absolutePathForPhotoImage,
} from '@/app/paths';
import PhotoDetailPage from '@/photo/PhotoDetailPage';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import {
getPhotosMetaCached,
getPhotosNearIdCached,
@ -63,7 +63,7 @@ export async function generateMetadata({
};
}
export default async function PhotoFilmSimulationPage({
export default async function PhotoFilmPage({
params,
}: PhotoFilmSimulationProps) {
const { photoId, simulation } = await params;

View File

@ -3,9 +3,9 @@ import {
IMAGE_OG_DIMENSION_SMALL,
MAX_PHOTOS_TO_SHOW_PER_CATEGORY,
} from '@/image-response';
import FilmSimulationImageResponse from
'@/image-response/FilmSimulationImageResponse';
import { FilmSimulation } from '@/simulation';
import FilmImageResponse from
'@/image-response/FilmImageResponse';
import { FilmSimulation } from '@/film';
import { getIBMPlexMono } from '@/app/font';
import { ImageResponse } from 'next/og';
import { getImageResponseCacheControlHeaders } from '@/image-response/cache';
@ -38,7 +38,7 @@ export async function GET(
const { width, height } = IMAGE_OG_DIMENSION_SMALL;
return new ImageResponse(
<FilmSimulationImageResponse {...{
<FilmImageResponse {...{
simulation,
photos,
width,

View File

@ -1,8 +1,8 @@
import { INFINITE_SCROLL_GRID_INITIAL } from '@/photo';
import { getUniqueFilmSimulations } from '@/photo/db/query';
import { FilmSimulation, generateMetaForFilmSimulation } from '@/simulation';
import FilmSimulationOverview from '@/simulation/FilmSimulationOverview';
import { getPhotosFilmSimulationDataCached } from '@/simulation/data';
import { FilmSimulation, generateMetaForFilmSimulation } from '@/film';
import FilmOverview from '@/film/FilmOverview';
import { getPhotosFilmSimulationDataCached } from '@/film/data';
import { Metadata } from 'next/types';
import { cache } from 'react';
import { PATH_ROOT } from '@/app/paths';
@ -62,7 +62,7 @@ export async function generateMetadata({
};
}
export default async function FilmSimulationPage({
export default async function FilmPage({
params,
}: FilmSimulationProps) {
const { simulation } = await params;
@ -78,7 +78,7 @@ export default async function FilmSimulationPage({
if (photos.length === 0) { redirect(PATH_ROOT); }
return (
<FilmSimulationOverview {...{
<FilmOverview {...{
simulation,
photos,
count,

View File

@ -2,7 +2,7 @@ import CameraOGTile from '@/camera/CameraOGTile';
import FocalLengthOGTile from '@/focal/FocalLengthOGTile';
import PhotoOGTile from '@/photo/PhotoOGTile';
import { getPhotosCached } from '@/photo/cache';
import FilmSimulationOGTile from '@/simulation/FilmSimulationOGTile';
import FilmOGTile from '@/film/FilmOGTile';
import { TAG_FAVS } from '@/tag';
import TagOGTile from '@/tag/TagOGTile';
@ -45,7 +45,7 @@ export default async function OGOverviewPage() {
<TagOGTile tag={tag} photos={photosTag} />
<TagOGTile tag={TAG_FAVS} photos={photosFavs} />
<CameraOGTile camera={camera} photos={photosCamera} />
<FilmSimulationOGTile simulation={simulation} photos={photosSimulation} />
<FilmOGTile simulation={simulation} photos={photosSimulation} />
<FocalLengthOGTile focal={focal} photos={photosFocal} />
</div>
);

View File

@ -41,7 +41,7 @@ import ScoreCardContainer from '@/components/ScoreCardContainer';
import IconLens from '@/components/icons/IconLens';
import IconCamera from '@/components/icons/IconCamera';
import IconRecipe from '@/components/icons/IconRecipe';
import IconFilmSimulation from '@/components/icons/IconFilmSimulation';
import IconFilm from '@/components/icons/IconFilm';
import IconFocalLength from '@/components/icons/IconFocalLength';
import IconTag from '@/components/icons/IconTag';
import IconPhoto from '@/components/icons/IconPhoto';
@ -490,7 +490,7 @@ export default function AdminAppInsightsClient({
return filmSimulationsCount > 0
? <ScoreCardRow
key={category}
icon={<IconFilmSimulation size={15} />}
icon={<IconFilm size={15} />}
content={pluralize(filmSimulationsCount, 'film simulation')}
/>
: null;

View File

@ -2,7 +2,7 @@ import { Photo } from '@/photo';
import { PhotoSetCategory } from '@/category';
import { BASE_URL, GRID_HOMEPAGE_ENABLED } from './config';
import { Camera } from '@/camera';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import { parameterize } from '@/utility/string';
import { TAG_HIDDEN } from '@/tag';
import { Lens } from '@/lens';

View File

@ -1,7 +1,7 @@
import { Photo } from '../photo';
import { Camera, Cameras } from '@/camera';
import { PhotoDateRange } from '../photo';
import { FilmSimulation, FilmSimulations } from '@/simulation';
import { FilmSimulation, FilmSimulations } from '@/film';
import { Lens, Lenses } from '@/lens';
import { Tags } from '@/tag';
import { FocalLengths } from '@/focal';

View File

@ -69,7 +69,7 @@ import IconCamera from '../icons/IconCamera';
import IconPhoto from '../icons/IconPhoto';
import IconRecipe from '../icons/IconRecipe';
import IconFocalLength from '../icons/IconFocalLength';
import IconFilmSimulation from '../icons/IconFilmSimulation';
import IconFilm from '../icons/IconFilm';
import IconLock from '../icons/IconLock';
import useVisualViewportHeight from '@/utility/useVisualViewport';
import useMaskedScroll from '../useMaskedScroll';
@ -334,7 +334,7 @@ export default function CommandKClient({
};
case 'films': return {
heading: 'Film Simulations',
accessory: <IconFilmSimulation size={14} />,
accessory: <IconFilm size={14} />,
items: simulations.map(({ simulation, count }) => ({
label: labelForFilmSimulation(simulation).medium,
annotation: formatCount(count),

View File

@ -1,6 +1,6 @@
import { IconBaseProps } from 'react-icons';
import { IoFilmOutline } from 'react-icons/io5';
export default function IconFilmSimulation(props: IconBaseProps) {
export default function IconFilm(props: IconBaseProps) {
return <IoFilmOutline {...props} />;
}

View File

@ -1,10 +1,9 @@
import { Photo, PhotoDateRange } from '@/photo';
import { FilmSimulation, descriptionForFilmSimulationPhotos } from '.';
import PhotoHeader from '@/photo/PhotoHeader';
import PhotoFilmSimulation from
'@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
export default function FilmSimulationHeader({
export default function FilmHeader({
simulation,
photos,
selectedPhoto,
@ -22,7 +21,7 @@ export default function FilmSimulationHeader({
return (
<PhotoHeader
simulation={simulation}
entity={<PhotoFilmSimulation {...{ simulation }} />}
entity={<PhotoFilm {...{ simulation }} />}
entityDescription={descriptionForFilmSimulationPhotos(
photos, undefined, count, dateRange)}
photos={photos}

View File

@ -12,7 +12,7 @@ import {
export type OGLoadingState = 'unloaded' | 'loading' | 'loaded' | 'failed';
export default function FilmSimulationOGTile({
export default function FilmOGTile({
simulation,
photos,
loadingState: loadingStateExternal,

View File

@ -1,9 +1,9 @@
import { Photo, PhotoDateRange } from '@/photo';
import FilmSimulationHeader from './FilmSimulationHeader';
import FilmHeader from './FilmHeader';
import { FilmSimulation } from '.';
import PhotoGridContainer from '@/photo/PhotoGridContainer';
export default function FilmSimulationOverview({
export default function FilmOverview({
simulation,
photos,
count,
@ -22,7 +22,7 @@ export default function FilmSimulationOverview({
photos,
count,
simulation,
header: <FilmSimulationHeader {...{
header: <FilmHeader {...{
simulation,
photos,
count,

View File

@ -1,10 +1,10 @@
import { absolutePathForFilmSimulation } from '@/app/paths';
import { PhotoSetAttributes } from '../category';
import ShareModal from '@/share/ShareModal';
import FilmSimulationOGTile from './FilmSimulationOGTile';
import FilmOGTile from './FilmOGTile';
import { FilmSimulation, shareTextForFilmSimulation } from '.';
export default function FilmSimulationShareModal({
export default function FilmShareModal({
simulation,
photos,
count,
@ -17,7 +17,7 @@ export default function FilmSimulationShareModal({
pathShare={absolutePathForFilmSimulation(simulation)}
socialText={shareTextForFilmSimulation(simulation)}
>
<FilmSimulationOGTile {...{ simulation, photos, count, dateRange }} />
<FilmOGTile {...{ simulation, photos, count, dateRange }} />
</ShareModal>
);
};

View File

@ -1,5 +1,5 @@
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
import PhotoFilmSimulationIcon from './PhotoFilmSimulationIcon';
import PhotoFilmIcon from './PhotoFilmIcon';
import { pathForFilmSimulation } from '@/app/paths';
import { FilmSimulation } from '.';
import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
@ -8,7 +8,7 @@ import EntityLink, {
} from '@/components/primitives/EntityLink';
import clsx from 'clsx/lite';
export default function PhotoFilmSimulation({
export default function PhotoFilm({
simulation,
type = 'icon-last',
badged = true,
@ -28,7 +28,7 @@ export default function PhotoFilmSimulation({
label={medium}
labelSmall={small}
href={pathForFilmSimulation(simulation)}
icon={<PhotoFilmSimulationIcon
icon={<PhotoFilmIcon
simulation={simulation}
className={clsx(
contrast === 'frosted' && 'text-black',

View File

@ -6,7 +6,7 @@ import { FilmSimulation } from '.';
const INTRINSIC_WIDTH = 28;
const INTRINSIC_HEIGHT = 16;
export default function PhotoFilmSimulationIcon({
export default function PhotoFilmIcon({
simulation,
height = INTRINSIC_HEIGHT,
className,

View File

@ -5,12 +5,12 @@ import ImageContainer from './components/ImageContainer';
import {
labelForFilmSimulation,
} from '@/platforms/fujifilm/simulation';
import PhotoFilmSimulationIcon from
'@/simulation/PhotoFilmSimulationIcon';
import { FilmSimulation } from '@/simulation';
import PhotoFilmIcon from
'@/film/PhotoFilmIcon';
import { FilmSimulation } from '@/film';
import { NextImageSize } from '@/platforms/next-image';
export default function FilmSimulationImageResponse({
export default function FilmImageResponse({
simulation,
photos,
width,
@ -36,7 +36,7 @@ export default function FilmSimulationImageResponse({
width,
height,
fontFamily,
icon: <PhotoFilmSimulationIcon
icon: <PhotoFilmIcon
simulation={simulation}
height={height * .081}
style={{ transform: `translateY(${height * .001}px)`}}

View File

@ -5,7 +5,7 @@ import ImageContainer from './components/ImageContainer';
import type { NextImageSize } from '@/platforms/next-image';
import { formatTag } from '@/tag';
import { generateRecipeText, getPhotoWithRecipeFromPhotos } from '@/recipe';
import PhotoFilmSimulationIcon from '@/simulation/PhotoFilmSimulationIcon';
import PhotoFilmIcon from '@/film/PhotoFilmIcon';
import { isStringFilmSimulation } from '@/platforms/fujifilm/simulation';
import IconRecipe from '@/components/icons/IconRecipe';
const MAX_RECIPE_LINES = 8;
@ -111,7 +111,7 @@ export default function RecipeImageResponse({
{text}
{isStringFilmSimulation(text) && filmSimulation &&
<div tw="flex">
<PhotoFilmSimulationIcon
<PhotoFilmIcon
simulation={filmSimulation}
height={height * .06}
style={{ transform: `translateY(${-height * .001}px)`}}

View File

@ -6,7 +6,7 @@ import AppGrid from '@/components/AppGrid';
import PhotoGrid from './PhotoGrid';
import TagHeader from '@/tag/TagHeader';
import CameraHeader from '@/camera/CameraHeader';
import FilmSimulationHeader from '@/simulation/FilmSimulationHeader';
import FilmHeader from '@/film/FilmHeader';
import { TAG_HIDDEN } from '@/tag';
import HiddenHeader from '@/tag/HiddenHeader';
import FocalLengthHeader from '@/focal/FocalLengthHeader';
@ -78,7 +78,7 @@ export default function PhotoDetailPage({
dateRange={dateRange}
/>;
} else if (simulation) {
customHeader = <FilmSimulationHeader
customHeader = <FilmHeader
simulation={simulation}
photos={photos}
selectedPhoto={photo}

View File

@ -5,7 +5,7 @@ import HeaderList from '@/components/HeaderList';
import PhotoTag from '@/tag/PhotoTag';
import { PhotoDateRange, dateRangeForPhotos, photoQuantityText } from '.';
import { TAG_FAVS, TAG_HIDDEN, addHiddenToTags } from '@/tag';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
import FavsTag from '../tag/FavsTag';
import { useAppState } from '@/state/AppState';
import { useMemo, useRef } from 'react';
@ -20,7 +20,7 @@ import PhotoRecipe from '@/recipe/PhotoRecipe';
import IconCamera from '@/components/icons/IconCamera';
import IconRecipe from '@/components/icons/IconRecipe';
import IconTag from '@/components/icons/IconTag';
import IconFilmSimulation from '@/components/icons/IconFilmSimulation';
import IconFilm from '@/components/icons/IconFilm';
import IconLens from '@/components/icons/IconLens';
import PhotoLens from '@/lens/PhotoLens';
import IconFocalLength from '@/components/icons/IconFocalLength';
@ -196,11 +196,11 @@ export default function PhotoGridSidebar({
? <HeaderList
key="films"
title="Films"
icon={<IconFilmSimulation size={15} />}
icon={<IconFilm size={15} />}
maxItems={maxItemsPerCategory}
items={simulations
.map(({ simulation, count }) =>
<PhotoFilmSimulation
<PhotoFilm
key={simulation}
simulation={simulation}
countOnHover={count}

View File

@ -21,7 +21,7 @@ import ShareButton from '@/share/ShareButton';
import DownloadButton from '@/components/DownloadButton';
import PhotoCamera from '../camera/PhotoCamera';
import { cameraFromPhoto } from '@/camera';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
import { sortTagsArray } from '@/tag';
import DivDebugBaselineGrid from '@/components/DivDebugBaselineGrid';
import PhotoLink from './PhotoLink';
@ -394,7 +394,7 @@ export default function PhotoLarge({
{(showRecipeButton || showSimulationContent) &&
<div className="flex items-center gap-2 *:w-auto">
{showSimulationContent && photo.filmSimulation &&
<PhotoFilmSimulation
<PhotoFilm
simulation={photo.filmSimulation}
prefetch={prefetchRelatedLinks}
countOnHover={simulationCount}

View File

@ -60,7 +60,7 @@ import { convertUploadToPhoto } from './storage';
import { UrlAddStatus } from '@/admin/AdminUploadsClient';
import { convertStringToArray } from '@/utility/string';
import { after } from 'next/server';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
// Private actions

View File

@ -13,7 +13,7 @@ import {
} from '@/photo';
import { Cameras, createCameraKey } from '@/camera';
import { Tags } from '@/tag';
import { FilmSimulation, FilmSimulations } from '@/simulation';
import { FilmSimulation, FilmSimulations } from '@/film';
import { ADMIN_SQL_DEBUG_ENABLED } from '@/app/config';
import {
GetPhotosOptions,

View File

@ -1,7 +1,7 @@
import FieldSetWithStatus from '@/components/FieldSetWithStatus';
import { ComponentProps, useEffect, useState } from 'react';
import { getPhotosNeedingRecipeTitleCountAction } from '../actions';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
export default function ApplyRecipeTitleGloballyCheckbox({
photoId,

View File

@ -41,7 +41,7 @@ import ErrorNote from '@/components/ErrorNote';
import { convertRecipesForForm, Recipes } from '@/recipe';
import deepEqual from 'fast-deep-equal/es6/react';
import ApplyRecipeTitleGloballyCheckbox from './ApplyRecipesGloballyCheckbox';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import IconFavs from '@/components/icons/IconFavs';
import IconHidden from '@/components/icons/IconHidden';

View File

@ -19,7 +19,7 @@ import { generateNanoid } from '@/utility/nanoid';
import {
FILM_SIMULATION_FORM_INPUT_OPTIONS,
} from '@/platforms/fujifilm/simulation';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import { GEO_PRIVACY_ENABLED } from '@/app/config';
import { TAG_FAVS, getValidationMessageForTags } from '@/tag';
import { MAKE_FUJIFILM } from '@/platforms/fujifilm';

View File

@ -1,6 +1,6 @@
import { formatFocalLength } from '@/focal';
import { getNextImageUrlForRequest } from '@/platforms/next-image';
import { FilmSimulation, photoHasFilmSimulationData } from '@/simulation';
import { FilmSimulation, photoHasFilmSimulationData } from '@/film';
import {
HIGH_DENSITY_GRID,
IS_PREVIEW,

View File

@ -11,7 +11,7 @@ import {
} from '@/platforms/fujifilm/simulation';
import { ExifData, ExifParserFactory } from 'ts-exif-parser';
import { PhotoFormData } from './form';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import sharp, { Sharp } from 'sharp';
import {
GEO_PRIVACY_ENABLED,

View File

@ -1,6 +1,6 @@
import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
import { FilmSimulation } from '@/simulation';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import { FilmSimulation } from '@/film';
import PhotoFilm from '@/film/PhotoFilm';
import clsx from 'clsx/lite';
import { ReactNode, RefObject } from 'react';
import { addSign, formatWhiteBalance } from '.';
@ -87,7 +87,7 @@ export default function PhotoRecipeOGTile({
)}>
KODAK PORTRA 500
</div>
<PhotoFilmSimulation
<PhotoFilm
contrast="frosted"
simulation={simulation}
className="w-auto! grow-0!"

View File

@ -1,7 +1,7 @@
'use client';
import LoaderButton from '@/components/primitives/LoaderButton';
import PhotoFilmSimulation from '@/simulation/PhotoFilmSimulation';
import PhotoFilm from '@/film/PhotoFilm';
import clsx from 'clsx/lite';
import { ReactNode, RefObject } from 'react';
import { IoCloseCircle } from 'react-icons/io5';
@ -148,7 +148,7 @@ export default function PhotoRecipeOverlay({
{renderDataSquare(
<div className="flex items-center gap-1.5">
{labelForFilmSimulation(simulation).medium.toLocaleUpperCase()}
<PhotoFilmSimulation
<PhotoFilm
contrast="frosted"
simulation={simulation}
type="icon-only"

View File

@ -7,7 +7,7 @@ import {
formatCountDescriptive,
} from '@/utility/string';
import { FujifilmRecipe } from '@/platforms/fujifilm/recipe';
import { FilmSimulation } from '@/simulation';
import { FilmSimulation } from '@/film';
import { labelForFilmSimulation } from '@/platforms/fujifilm/simulation';
export type RecipeWithCount = {

View File

@ -3,7 +3,7 @@
import PhotoShareModal from '@/photo/PhotoShareModal';
import TagShareModal from '@/tag/TagShareModal';
import CameraShareModal from '@/camera/CameraShareModal';
import FilmSimulationShareModal from '@/simulation/FilmSimulationShareModal';
import FilmShareModal from '@/film/FilmShareModal';
import FocalLengthShareModal from '@/focal/FocalLengthShareModal';
import { useAppState } from '@/state/AppState';
import RecipeShareModal from '@/recipe/RecipeShareModal';
@ -43,7 +43,7 @@ export default function ShareModals() {
} else if (lens) {
return <LensShareModal {...{ lens, ...attributes }} />;
} else if (simulation) {
return <FilmSimulationShareModal {...{ simulation, ...attributes }} />;
return <FilmShareModal {...{ simulation, ...attributes }} />;
} else if (recipe) {
return <RecipeShareModal {...{ recipe, ...attributes }} />;
} else if (focal !== undefined) {