Merge branch 'main' into static

This commit is contained in:
Sam Becker 2024-03-23 11:26:28 -05:00
commit bf4a8c047d
7 changed files with 954 additions and 969 deletions

View File

@ -12,11 +12,11 @@ Features
-
- Built-in auth
- Photo upload with EXIF extraction
- Organize photos by tag and camera model
- Organize photos by tag
- Infinite scroll
- Light/dark mode
- CMD-K menu with photo search
- Automatic OG image generation
- CMD-K menu with photo search
- Experimental support for AI-generated descriptions
- Support for Fujifilm simulations
@ -28,7 +28,7 @@ Installation
1. Click Deploy
2. Add required storage ([Vercel Postgres](https://vercel.com/docs/storage/vercel-postgres/quickstart#create-a-postgres-database) + [Vercel Blob](https://vercel.com/docs/storage/vercel-blob/quickstart#create-a-blob-store))
3. Add environment variables
3. Add environment variables:
- `NEXT_PUBLIC_SITE_TITLE` (e.g., My Photos)
- `NEXT_PUBLIC_SITE_DOMAIN` (e.g., photos.domain.com)
- `NEXT_PUBLIC_SITE_DESCRIPTION` (optional—mainly used for OG meta)
@ -53,8 +53,9 @@ Installation
1. Clone code
2. Run `pnpm i` to install dependencies
3. Set environment variable `AUTH_URL` locally (not in production) to `http://localhost:3000/api/url` (_this is a temporary limitation of `next-auth` v5.0_)
4. Run `vc dev` to start dev server, and utilize Vercel-stored environment variables
3. Set environment variable `AUTH_URL` locally (not in production) to `http://localhost:3000/api/url` (_this is a temporary limitation of `next-auth` v5.0 Beta_)
4. Install [Vercel CLI](https://vercel.com/docs/cli#installing-vercel-cli)
5. Run `vc dev` to start dev server with Vercel-stored environment variables
### 5. Add Analytics (optional)
@ -81,7 +82,7 @@ _⚠ READ BEFORE PROCEEDING_
2. Add rate limiting (_recommended_)
- As an additional precaution, create a [Vercel KV](https://vercel.com/docs/storage/vercel-kv/quickstart#create-a-kv-database) store and link it to your project in order to enable rate limiting
3. Configure auto-generated fields (optional)
- Set which text fields should auto-generate when uploading a photo by storing a comma-separated list, e.g., `AI_TEXT_AUTO_GENERATED_FIELDS = title, semantic`
- Set which text fields auto-generate when uploading a photo by storing a comma-separated list, e.g., `AI_TEXT_AUTO_GENERATED_FIELDS = title, semantic`
- Accepted values: title, caption, tags, description, all, or none (default is "all")
### 8. Optional configuration
@ -200,7 +201,7 @@ FAQ
> Navigate to `/admin/configuration` and click "Clear Cache." If this doesn't help, [open an issue](https://github.com/sambecker/exif-photo-blog/issues/new).
#### Why aren't my Fujifilm simulations importing alongside EXIF data?
> Fujifilm simulation data is stored in vendor-specific Makernote binaries embedded in EXIF data. Under certain circumstances an intermediary may strip out this data for a variety of reasons. For instance, there is a known issue on iOS where editing an image, e.g., cropping it, causes Makernote data loss. If your simulation data appears to be missing, try importing the original file as it was stored by the camera. Additionally, if you can confirm the simulation mode on camera, you can then edit the photo record and manually select it.
> Fujifilm simulation data is stored in vendor-specific Makernote binaries embedded in EXIF data. Under certain circumstances an intermediary may strip out this data. For instance, there is a known issue on iOS where editing an image, e.g., cropping it, causes Makernote data loss. If your simulation data appears to be missing, try importing the original file as it was stored by the camera. Additionally, if you can confirm the simulation mode on camera, you can then edit the photo record and manually select it.
#### Why do my images appear flipped/rotated incorrectly?
> For a number of reasons, only EXIF orientations: 1, 3, 6, and 8 are supported. Orientations 2, 4, 5, and 7—which make use of mirroring—are not supported.

View File

@ -9,20 +9,20 @@
"analyze": "ANALYZE=true next build"
},
"dependencies": {
"@aws-sdk/client-s3": "3.529.1",
"@aws-sdk/s3-request-presigner": "3.529.1",
"@next/bundle-analyzer": "14.1.3",
"@aws-sdk/client-s3": "3.540.0",
"@aws-sdk/s3-request-presigner": "3.540.0",
"@next/bundle-analyzer": "14.1.4",
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@tailwindcss/container-queries": "^0.1.1",
"@tailwindcss/forms": "^0.5.7",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^14.2.1",
"@testing-library/react": "^14.2.2",
"@types/jest": "^29.5.12",
"@types/node": "^20.11.26",
"@types/react": "18.2.65",
"@types/react-dom": "18.2.21",
"@typescript-eslint/eslint-plugin": "^7.2.0",
"@typescript-eslint/parser": "^7.2.0",
"@types/node": "^20.11.30",
"@types/react": "18.2.69",
"@types/react-dom": "18.2.22",
"@typescript-eslint/eslint-plugin": "^7.3.1",
"@typescript-eslint/parser": "^7.3.1",
"@upstash/ratelimit": "^1.0.1",
"@vercel/analytics": "^1.2.2",
"@vercel/blob": "^0.22.1",
@ -30,15 +30,15 @@
"@vercel/postgres": "0.7.2",
"@vercel/speed-insights": "^1.0.10",
"ai": "^3.0.13",
"autoprefixer": "10.4.18",
"autoprefixer": "10.4.19",
"camelcase-keys": "^9.1.3",
"clsx": "^2.1.0",
"cmdk": "^1.0.0",
"date-fns": "^3.4.0",
"date-fns": "^3.6.0",
"eslint": "8.57.0",
"eslint-config-next": "14.1.3",
"eslint-config-next": "14.1.4",
"exifr": "^7.1.3",
"framer-motion": "^11.0.12",
"framer-motion": "^11.0.20",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"nanoid": "^5.0.6",
@ -46,14 +46,14 @@
"next-auth": "5.0.0-beta.15",
"next-themes": "^0.3.0",
"openai": "^4.29.2",
"postcss": "8.4.35",
"postcss": "8.4.38",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-icons": "^5.0.1",
"sonner": "^1.4.3",
"sonner": "^1.4.41",
"tailwindcss": "3.4.1",
"ts-exif-parser": "^0.2.2",
"typescript": "5.4.2",
"typescript": "5.4.3",
"use-debounce": "^10.0.0"
}
}

1868
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,7 @@ export default function AdminGrid ({
{title}
</div>}
{/* py-[1px] fixes Safari vertical scroll bug */}
<div className="min-w-[14rem] overflow-x-scroll py-[1px]">
<div className="min-w-[14rem] overflow-x-auto py-[1px]">
<div className={clsx(
'w-full',
'grid grid-cols-[auto_1fr_auto] ',

View File

@ -31,7 +31,7 @@ export default function AdminNavClient({
)}>
<div className={clsx(
'flex gap-2 md:gap-4',
'flex-grow overflow-x-scroll',
'flex-grow overflow-x-auto',
)}>
{items.map(({ label, href, count }) =>
<Link

View File

@ -196,7 +196,7 @@ export default function CommandKClient({
</span>}
</div>
<Command.List className={clsx(
'relative overflow-y-scroll',
'relative overflow-y-auto',
'max-h-48 sm:max-h-72',
)}>
<Command.Empty className="mt-1 pl-3 text-dim">

View File

@ -106,7 +106,7 @@ export default function SiteChecklistClient({
<div
key={variable}
className={clsx(
'overflow-x-scroll overflow-y-hidden',
'overflow-x-auto overflow-y-hidden',
minimal && 'inline-flex',
)}
>