+
{entry.file.type.startsWith('video/') ? 'MOV' : 'IMG'}
@@ -159,7 +186,7 @@ export function UploadDropzone({ galleryId, onMedia, onRefresh }: UploadDropzone
{(entry.status === 'uploading' || entry.status === 'processing') && (
);
-}
+}
\ No newline at end of file
diff --git a/frontend/src/components/gallery/ClientGallery.tsx b/frontend/src/components/gallery/ClientGallery.tsx
index 2ee2070..229d276 100644
--- a/frontend/src/components/gallery/ClientGallery.tsx
+++ b/frontend/src/components/gallery/ClientGallery.tsx
@@ -126,7 +126,7 @@ export function ClientGallery({ gallery }: ClientGalleryProps) {
) : (
{branding.studioName?.slice(0, 1) || 'N'}
)}
-
{branding.studioName || 'Your studio'}
+
{branding.studioName || 'Noah Bianchi'}
{gallery.downloadAllEnabled !== false && gallery.downloadsEnabled !== false && (
@@ -136,7 +136,6 @@ export function ClientGallery({ gallery }: ClientGalleryProps) {
: downloadJob?.status === 'READY'
? 'ZIP ready'
: 'Download gallery'}{' '}
-
↓
)}
{gallery.clientName}
@@ -207,12 +206,6 @@ export function ClientGallery({ gallery }: ClientGalleryProps) {
Downloads
-
- Download
-
- originals.
-
-
Download the original files from this gallery.
{gallery.downloadsEnabled !== false && (
diff --git a/frontend/src/pages/dashboard/DashboardPage.tsx b/frontend/src/pages/dashboard/DashboardPage.tsx
index 20e1165..442752a 100644
--- a/frontend/src/pages/dashboard/DashboardPage.tsx
+++ b/frontend/src/pages/dashboard/DashboardPage.tsx
@@ -56,25 +56,21 @@ export default function DashboardPage() {
diff --git a/frontend/src/pages/dashboard/GalleryEditorPage.tsx b/frontend/src/pages/dashboard/GalleryEditorPage.tsx
index 05988a4..fa1dd03 100644
--- a/frontend/src/pages/dashboard/GalleryEditorPage.tsx
+++ b/frontend/src/pages/dashboard/GalleryEditorPage.tsx
@@ -135,6 +135,9 @@ export default function GalleryEditorPage() {
...current,
coverMediaId: value.coverMediaId || current.coverMediaId,
}));
+ if (value.media.some((m) => m.processingStatus === 'PROCESSING')) {
+ setTimeout(() => void refreshGallery(), 3000);
+ }
} catch {
// A completed upload can take a moment to appear while processing.
}
@@ -602,7 +605,7 @@ export default function GalleryEditorPage() {
type="url"
value={draft.websiteUrl}
onChange={(event) => setField('websiteUrl', event.target.value)}
- placeholder="https://yourstudio.com"
+ placeholder="https://noahbianchi.be"
/>
@@ -708,13 +711,16 @@ function EditorMediaTile({
{isVideo ? (
) : item.previewUrl ? (

@@ -724,7 +730,7 @@ function EditorMediaTile({
)}
{isVideo && (
-
+
Film {formatDuration(item.durationSeconds)}
)}
diff --git a/frontend/src/styles/index.css b/frontend/src/styles/index.css
index e6e162c..53f9417 100644
--- a/frontend/src/styles/index.css
+++ b/frontend/src/styles/index.css
@@ -961,9 +961,9 @@ a {
.studio-sidebar {
display: flex;
flex-direction: column;
- width: 220px;
- min-width: 220px;
- padding: 28px 20px;
+ width: 240px;
+ min-width: 240px;
+ padding: 0;
background: var(--surface);
border-right: 1px solid var(--border-subtle);
overflow-y: auto;
@@ -971,44 +971,73 @@ a {
z-index: 100;
}
+.studio-sidebar__header {
+ display: flex;
+ flex-direction: column;
+ padding: 28px 24px 20px;
+ border-bottom: 1px solid var(--border-subtle);
+ margin-bottom: 24px;
+ gap: 6px;
+}
+
.studio-sidebar__label {
- font-size: 9px;
+ font-size: 10px;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--fg-muted);
- margin-bottom: 14px;
+ padding: 0 24px;
+ margin-bottom: 8px;
}
.studio-logo {
display: inline-flex;
align-items: center;
- gap: 10px;
- margin-bottom: 36px;
+ gap: 12px;
}
.studio-logo__mark {
display: inline-flex;
align-items: center;
justify-content: center;
- width: 32px;
- height: 32px;
+ width: 34px;
+ height: 34px;
flex-shrink: 0;
border-radius: 50%;
overflow: hidden;
background: var(--accent);
color: var(--bg);
font-family: Georgia, 'Times New Roman', serif;
- font-size: 14px;
+ font-size: 15px;
font-weight: 600;
line-height: 1;
}
+.studio-logo__text {
+ display: flex;
+ flex-direction: column;
+ gap: 1px;
+}
+
+.studio-logo__name {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--fg);
+ line-height: 1.2;
+}
+
+.studio-logo__sub {
+ font-size: 9px;
+ color: var(--fg-muted);
+ letter-spacing: 0.04em;
+}
+
.studio-nav {
display: flex;
flex-direction: column;
- gap: 2px;
- margin-bottom: 24px;
+ gap: 1px;
+ padding: 8px 12px;
+ margin-bottom: 0;
}
.studio-nav__item {
@@ -1040,23 +1069,29 @@ a {
height: 4px;
border-radius: 50%;
background: var(--fg-muted);
+ flex-shrink: 0;
}
.studio-nav__item.is-active .studio-nav__dot {
background: var(--accent);
}
+.studio-sidebar__nav-wrap {
+ flex: 1;
+ padding: 0 12px;
+}
+
.studio-sidebar__note {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 12px;
+ margin: 0 24px 16px;
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
font-size: 10px;
color: var(--fg-muted);
line-height: 1.5;
- margin-bottom: 24px;
}
.studio-sidebar__note strong {
@@ -2121,13 +2156,14 @@ input[type='color'] {
}
.editor-media-tile__video-placeholder {
+ position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
- gap: 8px;
+ gap: 4px;
color: var(--fg-muted);
font-size: 9px;
font-weight: 600;
@@ -2137,19 +2173,53 @@ input[type='color'] {
border: 0;
cursor: pointer;
transition: background var(--transition);
+ overflow: hidden;
+}
+
+.editor-media-tile__video-placeholder.has-thumb {
+ background: transparent;
}
.editor-media-tile__video-placeholder:hover {
background: var(--surface-hover);
}
-.editor-media-tile__play-icon {
- font-size: 24px;
- color: var(--fg-secondary);
- line-height: 1;
+.editor-media-tile__video-placeholder.has-thumb:hover {
+ background: rgba(0, 0, 0, 0.3);
}
-.editor-media-tile__video-label {
+.editor-media-tile__video-thumb {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ pointer-events: none;
+}
+
+.editor-media-tile__play-icon {
+ position: relative;
+ z-index: 1;
+ font-size: 28px;
+ color: rgba(243, 237, 232, 0.9);
+ line-height: 1;
+ text-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
+ transition: transform var(--transition);
+}
+
+.editor-media-tile__video-placeholder:hover .editor-media-tile__play-icon {
+ transform: scale(1.1);
+}
+
+.editor-media-tile__video-label-text {
+ position: relative;
+ z-index: 1;
+ font-size: 8px;
+ color: rgba(243, 237, 232, 0.8);
+ text-shadow: 0 1px 6px rgba(0, 0, 0, 0.5);
+}
+
+.editor-media-tile__film-label {
position: absolute;
bottom: 8px;
left: 8px;
@@ -2160,6 +2230,7 @@ input[type='color'] {
text-transform: uppercase;
background: rgba(0, 0, 0, 0.6);
color: var(--fg);
+ z-index: 1;
}
.editor-media-tile__placeholder {