From 767cffd9314d2f08392f1c1b55af1b9e29cdff3a Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 14:34:12 -0600
Subject: [PATCH 1/7] Subtle improvements
---
src/elements/components/model-card.module.scss | 5 +++++
src/elements/components/model-card.tsx | 4 ++--
src/pages/index.tsx | 8 ++++++--
3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/elements/components/model-card.module.scss b/src/elements/components/model-card.module.scss
index c35e635d..dd458be1 100644
--- a/src/elements/components/model-card.module.scss
+++ b/src/elements/components/model-card.module.scss
@@ -9,9 +9,14 @@
border-radius: 0.5rem;
border-width: 1px;
border-style: solid;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
--inner-radius: calc(0.5rem - 1px);
+ &:hover {
+ transform: scale(1.02);
+ }
+
&.overflowHidden {
--inner-radius: 0;
diff --git a/src/elements/components/model-card.tsx b/src/elements/components/model-card.tsx
index 7b59d0d8..9f8538db 100644
--- a/src/elements/components/model-card.tsx
+++ b/src/elements/components/model-card.tsx
@@ -257,7 +257,7 @@ const useMakeLazyCard = (lazy: boolean, card: JSX.Element) => {
className={joinClasses(
style.modelCard,
!editMode && style.overflowHidden,
- 'border-gray-300 bg-white shadow-lg hover:shadow-xl dark:border-gray-700 dark:bg-fade-900'
+ 'border-gray-300 bg-white shadow-lg hover:shadow-2xl dark:border-gray-700 dark:bg-fade-900'
)}
>
{card}
@@ -270,7 +270,7 @@ const useMakeLazyCard = (lazy: boolean, card: JSX.Element) => {
}
>
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 63ab9ec5..85bdc462 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -133,8 +133,12 @@ export default function Page({ modelData: staticModelData }: Props) {
-
- The best place to find AI Upscaling models
+
+ The best place to find
+
+ AI Upscaling
+
+ models
From 52321bc1971b065a79a532e914b2711325a6fc21 Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 14:39:41 -0600
Subject: [PATCH 2/7] Update font
---
src/pages/_app.tsx | 29 ++++++++++++++++++++++-------
src/styles/globals.scss | 8 ++++----
tailwind.config.js | 3 +++
3 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 81e39a49..95c38654 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -1,3 +1,5 @@
+import { Inter } from 'next/font/google';
+import { useEffect } from 'react';
import '../styles/globals.scss';
import 'react-tooltip/dist/react-tooltip.css';
import { DevicePixelRatioProvider } from '../lib/hooks/use-device-pixel-ratio';
@@ -5,14 +7,27 @@ import { TooltipProvider } from '../lib/hooks/use-tooltip';
import { WebApiProvider } from '../lib/hooks/use-web-api';
import type { AppProps } from 'next/app';
+const inter = Inter({
+ subsets: ['latin'],
+ variable: '--font-inter',
+ display: 'swap',
+});
+
export default function App({ Component, pageProps }: AppProps) {
+ useEffect(() => {
+ // Ensure the font variable is available on the root element
+ document.documentElement.style.setProperty('--font-inter', inter.style.fontFamily);
+ }, []);
+
return (
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
);
}
diff --git a/src/styles/globals.scss b/src/styles/globals.scss
index 4c021e3c..398e6ca1 100644
--- a/src/styles/globals.scss
+++ b/src/styles/globals.scss
@@ -50,10 +50,10 @@
:root {
--max-page-width: 1400px;
- --fonts-heading: -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji',
- 'Segoe UI Emoji', 'Segoe UI Symbol';
- --fonts-body: -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji',
- 'Segoe UI Emoji', 'Segoe UI Symbol';
+ --fonts-heading: var(--font-inter), -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+ --fonts-body: var(--font-inter), -apple-system, blinkmacsystemfont, 'Segoe UI', helvetica, arial, sans-serif,
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
--fonts-mono: sfmono-regular, menlo, monaco, consolas, 'Liberation Mono', 'Courier New', monospace;
overflow-y: scroll;
diff --git a/tailwind.config.js b/tailwind.config.js
index 91f5140d..46f0fbf0 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -3,6 +3,9 @@ module.exports = {
content: ['./src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
+ fontFamily: {
+ sans: ['var(--font-inter)', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],
+ },
colors: {
'fade-50': '#f9f8ff',
'fade-100': '#f3f2fd',
From 7eaf3da5c4c19637b8e2dd308f52e7d0dff081a5 Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 14:47:18 -0600
Subject: [PATCH 3/7] increase size of image carousel
---
.../components/image-carousel.module.scss | 11 +++++++++
src/elements/components/image-carousel.tsx | 2 +-
src/pages/models/[id].tsx | 24 +++++++++++--------
3 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/src/elements/components/image-carousel.module.scss b/src/elements/components/image-carousel.module.scss
index 5289ff45..a1dbfdbf 100644
--- a/src/elements/components/image-carousel.module.scss
+++ b/src/elements/components/image-carousel.module.scss
@@ -1,7 +1,18 @@
.imageWrapper {
+ height: 350px;
+
+ @media screen and (min-width: 768px) {
+ height: 450px;
+ }
+
+ @media screen and (min-width: 1024px) {
+ height: 500px;
+ }
+
@media screen and (max-width: 1023px) {
border-radius: 0;
margin: -1rem 0 0 -1rem;
width: calc(100% + 2rem);
+ height: 300px;
}
}
diff --git a/src/elements/components/image-carousel.tsx b/src/elements/components/image-carousel.tsx
index 91f683fb..bee8a0c6 100644
--- a/src/elements/components/image-carousel.tsx
+++ b/src/elements/components/image-carousel.tsx
@@ -47,7 +47,7 @@ export const ImageCarousel = ({ images, readonly, indexKey, onChange }: ImageCar
return (
{selectedImage ? (
diff --git a/src/pages/models/[id].tsx b/src/pages/models/[id].tsx
index 8fe2b5cc..d42e0534 100644
--- a/src/pages/models/[id].tsx
+++ b/src/pages/models/[id].tsx
@@ -437,16 +437,20 @@ export default function Page({
)}
- {/* Two columns */}
-
- {/* Left column */}
+ {/* Full-width preview at top (YouTube-style) */}
+
+ updateModelProperty('images', images)}
+ />
+
+
+ {/* Two columns: Description and Sidebar */}
+
+ {/* Left column: Description */}
-
updateModelProperty('images', images)}
- />
{editMode && (
@@ -564,7 +568,7 @@ export default function Page({
- {/* Right column */}
+ {/* Right column: Sidebar */}
{/* Download Button */}
From 323a176d6b523bf29b6fe2ba9afb28655925ead9 Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 14:50:22 -0600
Subject: [PATCH 4/7] improved sidebar styling
---
src/pages/models/[id].tsx | 43 +++++++++++++++++++++++----------------
1 file changed, 25 insertions(+), 18 deletions(-)
diff --git a/src/pages/models/[id].tsx b/src/pages/models/[id].tsx
index d42e0534..3155e916 100644
--- a/src/pages/models/[id].tsx
+++ b/src/pages/models/[id].tsx
@@ -334,26 +334,33 @@ function isTrue(value: T | null | undefined | false | '' | 0): value is T {
}
function MetadataTable({ rows }: { rows: (false | null | undefined | readonly [string, ReactNode])[] }) {
+ const filteredRows = rows.filter(isTrue);
return (
-
-
- {rows.filter(isTrue).map((row, i) => {
- const [label, value] = row;
- const extraPadding = i === 0 ? 'pt-3' : i === rows.length - 1 ? 'pb-3' : '';
- return (
-
-
+
+
+ {filteredRows.map((row, i) => {
+ const [label, value] = row;
+ const extraPadding = i === 0 ? 'pt-3' : i === filteredRows.length - 1 ? 'pb-3' : '';
+ const isLastRow = i === filteredRows.length - 1;
+ return (
+
- {label}
-
- | {value} |
-
- );
- })}
-
-
+ |
+ {label}
+ |
+ {value} |
+
+ );
+ })}
+
+
+
);
}
export default function Page({
From 50bbb765748e896a784319400c58e04d7db31eb3 Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 15:08:33 -0600
Subject: [PATCH 5/7] ensure popovers stay visible
---
.../components/download-button-edit-popover.tsx | 2 +-
src/elements/components/editable-tags.tsx | 2 +-
.../components/image-carousel-edit-popover.tsx | 2 +-
src/elements/components/model-card.module.scss | 13 ++++++++++++-
4 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/src/elements/components/download-button-edit-popover.tsx b/src/elements/components/download-button-edit-popover.tsx
index c4f0d096..0ffcd942 100644
--- a/src/elements/components/download-button-edit-popover.tsx
+++ b/src/elements/components/download-button-edit-popover.tsx
@@ -196,7 +196,7 @@ export function EditResourceButton({
leaveTo="transform opacity-0 scale-95"
>
diff --git a/src/elements/components/editable-tags.tsx b/src/elements/components/editable-tags.tsx
index ac4b0494..dbd493c6 100644
--- a/src/elements/components/editable-tags.tsx
+++ b/src/elements/components/editable-tags.tsx
@@ -99,7 +99,7 @@ function EditTags({ tags, onChange }: { tags: readonly TagId[]; onChange: (value
leaveTo="transform opacity-0 scale-95"
>
diff --git a/src/elements/components/image-carousel-edit-popover.tsx b/src/elements/components/image-carousel-edit-popover.tsx
index 529dff52..5c0c9c4a 100644
--- a/src/elements/components/image-carousel-edit-popover.tsx
+++ b/src/elements/components/image-carousel-edit-popover.tsx
@@ -202,7 +202,7 @@ export function EditImageButton({ image, onChange, children }: React.PropsWithCh
leaveTo="transform opacity-0 scale-95"
>
diff --git a/src/elements/components/model-card.module.scss b/src/elements/components/model-card.module.scss
index dd458be1..c19189a7 100644
--- a/src/elements/components/model-card.module.scss
+++ b/src/elements/components/model-card.module.scss
@@ -10,11 +10,13 @@
border-width: 1px;
border-style: solid;
transition: transform 0.3s ease, box-shadow 0.3s ease;
+ z-index: 1;
--inner-radius: calc(0.5rem - 1px);
&:hover {
transform: scale(1.02);
+ z-index: 10;
}
&.overflowHidden {
@@ -23,6 +25,12 @@
overflow: hidden;
}
+ // Ensure popovers can escape the card's bounds when open
+ &:has([data-headlessui-state='open']) {
+ overflow: visible;
+ z-index: 100;
+ }
+
.inner {
position: relative;
display: flex;
@@ -65,6 +73,9 @@
.details {
padding: 0.75rem;
padding-top: 0;
+ overflow: visible;
+ position: relative;
+ z-index: 10;
&.paired {
position: absolute;
@@ -73,7 +84,7 @@
right: 0;
backdrop-filter: blur(2rem) saturate(2);
border-radius: 0 0 var(--inner-radius) var(--inner-radius);
- overflow: hidden;
+ overflow: visible;
@include themed using($t) {
background: linear-gradient(transparent, t($t, white, $fade-900))
From 9f1d875b98caeff333612d24e8dae30cfa63d9fe Mon Sep 17 00:00:00 2001
From: Joey Ballentine
Date: Sat, 8 Nov 2025 15:12:25 -0600
Subject: [PATCH 6/7] Fix loading issues for image comparisons
---
.../components/carousel/comparison.tsx | 61 ++++++++++++++++++-
1 file changed, 59 insertions(+), 2 deletions(-)
diff --git a/src/elements/components/carousel/comparison.tsx b/src/elements/components/carousel/comparison.tsx
index 523f3626..369287c2 100644
--- a/src/elements/components/carousel/comparison.tsx
+++ b/src/elements/components/carousel/comparison.tsx
@@ -19,6 +19,7 @@ export const ImageComparison = ({ image }: ImageComparisonProps) => {
scale: 1,
});
const prevTransformStateRef = useRef(transformState);
+ const imagesLoadedRef = useRef({ lr: false, sr: false });
useEffect(() => {
const prevTransformState = prevTransformStateRef.current;
@@ -38,13 +39,69 @@ export const ImageComparison = ({ image }: ImageComparisonProps) => {
}, [transformState]);
useEffect(() => {
- lrRef.current?.centerView(1, 0);
- srRef.current?.centerView(1, 0);
+ // Reset transform state when image changes
+ setTransformState({
+ positionX: 0,
+ positionY: 0,
+ scale: 1,
+ });
+ // Reset image load tracking
+ imagesLoadedRef.current = { lr: false, sr: false };
setHandlePosition(50);
}, [image]);
+ // Track image loading and center images once loaded
+ useEffect(() => {
+ // Center images function
+ const centerImages = () => {
+ if (lrRef.current && srRef.current) {
+ // Use requestAnimationFrame to ensure DOM is updated
+ requestAnimationFrame(() => {
+ lrRef.current?.centerView(1, 0);
+ srRef.current?.centerView(1, 0);
+ });
+ }
+ };
+
+ const lrImg = new Image();
+ const srImg = new Image();
+ let loadedCount = 0;
+
+ const checkAndCenter = () => {
+ loadedCount++;
+ if (loadedCount === 2) {
+ // Both images loaded, center them
+ setTimeout(() => {
+ centerImages();
+ }, 50); // Small delay to ensure DOM is ready
+ }
+ };
+
+ lrImg.onload = () => {
+ imagesLoadedRef.current.lr = true;
+ checkAndCenter();
+ };
+ srImg.onload = () => {
+ imagesLoadedRef.current.sr = true;
+ checkAndCenter();
+ };
+
+ lrImg.src = image.LR;
+ srImg.src = image.SR;
+
+ // Fallback: center after a timeout even if images don't load
+ const fallbackTimer = setTimeout(() => {
+ centerImages();
+ }, 500);
+
+ return () => {
+ clearTimeout(fallbackTimer);
+ };
+ }, [image]);
+
return (
Date: Sat, 8 Nov 2025 15:16:06 -0600
Subject: [PATCH 7/7] linting
---
src/elements/components/carousel/comparison.tsx | 2 +-
.../components/download-button-edit-popover.tsx | 2 +-
src/elements/components/editable-tags.tsx | 2 +-
.../components/image-carousel-edit-popover.tsx | 2 +-
tailwind.config.js | 10 +++++++++-
5 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/elements/components/carousel/comparison.tsx b/src/elements/components/carousel/comparison.tsx
index 369287c2..91318210 100644
--- a/src/elements/components/carousel/comparison.tsx
+++ b/src/elements/components/carousel/comparison.tsx
@@ -101,7 +101,6 @@ export const ImageComparison = ({ image }: ImageComparisonProps) => {
return (
{
}
+ key={`${image.LR}-${image.SR}`}
position={handlePosition}
onPositionChange={setHandlePosition}
/>
diff --git a/src/elements/components/download-button-edit-popover.tsx b/src/elements/components/download-button-edit-popover.tsx
index 0ffcd942..c4f0d096 100644
--- a/src/elements/components/download-button-edit-popover.tsx
+++ b/src/elements/components/download-button-edit-popover.tsx
@@ -196,7 +196,7 @@ export function EditResourceButton({
leaveTo="transform opacity-0 scale-95"
>
diff --git a/src/elements/components/editable-tags.tsx b/src/elements/components/editable-tags.tsx
index dbd493c6..ac4b0494 100644
--- a/src/elements/components/editable-tags.tsx
+++ b/src/elements/components/editable-tags.tsx
@@ -99,7 +99,7 @@ function EditTags({ tags, onChange }: { tags: readonly TagId[]; onChange: (value
leaveTo="transform opacity-0 scale-95"
>
diff --git a/src/elements/components/image-carousel-edit-popover.tsx b/src/elements/components/image-carousel-edit-popover.tsx
index 5c0c9c4a..529dff52 100644
--- a/src/elements/components/image-carousel-edit-popover.tsx
+++ b/src/elements/components/image-carousel-edit-popover.tsx
@@ -202,7 +202,7 @@ export function EditImageButton({ image, onChange, children }: React.PropsWithCh
leaveTo="transform opacity-0 scale-95"
>
diff --git a/tailwind.config.js b/tailwind.config.js
index 46f0fbf0..50a18ff1 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -4,7 +4,15 @@ module.exports = {
theme: {
extend: {
fontFamily: {
- sans: ['var(--font-inter)', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],
+ sans: [
+ 'var(--font-inter)',
+ '-apple-system',
+ 'BlinkMacSystemFont',
+ 'Segoe UI',
+ 'Helvetica',
+ 'Arial',
+ 'sans-serif',
+ ],
},
colors: {
'fade-50': '#f9f8ff',