This commit is contained in:
ponzischeme89
2026-08-22 11:32:50 +12:00
parent b131932a4e
commit f982d391b9
40 changed files with 25594 additions and 9575 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -13,9 +13,9 @@
rel="icon"
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ccircle cx='16' cy='16' r='16' fill='%2352b54b'/%3E%3Ctext x='16' y='23' font-family='system-ui,sans-serif' font-size='19' font-weight='800' text-anchor='middle' fill='%2306240a'%3EM%3C/text%3E%3C/svg%3E"
/>
<script type="module" crossorigin src="/admin/assets/index-Db7bWHnD.js"></script>
<script type="module" crossorigin src="/admin/assets/index-BQVB9Fvj.js"></script>
<link rel="modulepreload" crossorigin href="/admin/assets/router-D9WH5XEU.js">
<link rel="stylesheet" crossorigin href="/admin/assets/index-BS_y3llT.css">
<link rel="stylesheet" crossorigin href="/admin/assets/index-BIMcejkS.css">
</head>
<body>
<div id="root"></div>
+1
View File
@@ -789,6 +789,7 @@ export interface MetadataHeroOption {
export interface MetadataHeroSettings {
contentOrder: string[];
timeRemainingColour: 'green' | 'white';
updatedAt?: string;
updatedBy?: string;
}
+30 -6
View File
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
import { api } from '../api/client';
import type { MetadataHeroSettingsResponse } from '../api/types';
import { Banner, Button, Card, Loading, PageHead, Toggle } from '../components/ui';
import { Banner, Button, Card, Loading, PageHead, Segments, Toggle } from '../components/ui';
import { useAction, useQuery } from '../lib/hooks';
import { useToast } from '../lib/toast';
@@ -12,12 +12,17 @@ export function MetadataHeroPage() {
const { busy, run } = useAction();
const { wrap } = useToast();
const [order, setOrder] = useState<string[] | null>(null);
const [timeRemainingColour, setTimeRemainingColour] = useState<'green' | 'white' | null>(null);
useEffect(() => {
if (order === null && query.data) setOrder(query.data.settings.contentOrder);
}, [order, query.data]);
if (timeRemainingColour === null && query.data) {
setTimeRemainingColour(query.data.settings.timeRemainingColour ?? 'green');
}
}, [order, query.data, timeRemainingColour]);
const selected = order ?? DEFAULT_ORDER;
const selectedTimeRemainingColour = timeRemainingColour ?? 'green';
const options = query.data?.options ?? [];
const displayOptions = [
...selected,
@@ -35,12 +40,16 @@ export function MetadataHeroPage() {
};
const save = () => run('save', async () => {
const response = await wrap(
() => api.post<MetadataHeroSettingsResponse>('/admin/api/metadata-hero', { contentOrder: selected }),
() => api.post<MetadataHeroSettingsResponse>('/admin/api/metadata-hero', {
contentOrder: selected,
timeRemainingColour: selectedTimeRemainingColour,
}),
'Metadata hero saved for every television.',
);
if (response) {
query.set(response);
setOrder(response.settings.contentOrder);
setTimeRemainingColour(response.settings.timeRemainingColour);
}
});
@@ -62,7 +71,10 @@ export function MetadataHeroPage() {
<Button variant="primary" busy={busy === 'save'} onClick={() => void save()}>
Save metadata hero
</Button>
<Button onClick={() => setOrder(DEFAULT_ORDER)}>Restore default order</Button>
<Button onClick={() => {
setOrder(DEFAULT_ORDER);
setTimeRemainingColour('green');
}}>Restore defaults</Button>
</>
}
>
@@ -94,6 +106,18 @@ export function MetadataHeroPage() {
);
})}
</div>
<div className="metadata-hero-colour">
<b>Time-remaining text colour</b>
<p>Choose the caption colour used beside the resume progress bar.</p>
<Segments
value={selectedTimeRemainingColour}
options={[
{ value: 'green', label: 'Emby green' },
{ value: 'white', label: 'White' },
]}
onChange={setTimeRemainingColour}
/>
</div>
</Card>
<Card
@@ -111,8 +135,8 @@ export function MetadataHeroPage() {
<b>4K</b><b>5.1</b>
</div>;
if (section === 'recommendation_reason') return <div className="metadata-preview-reason" key={section}>Because you watched Harbour Lights</div>;
if (section === 'time_remaining') return <div className="metadata-preview-progress" key={section}>
<span><i /></span><b>47 MINUTES REMAINING</b>
if (section === 'time_remaining') return <div className="metadata-preview-progress" data-colour={selectedTimeRemainingColour} key={section}>
<span><i /></span><b>47 minutes remaining</b>
</div>;
if (section === 'summary') return <p className="metadata-preview-summary" key={section}>A quiet coastal town follows an unexpected signal across the winter sky.</p>;
return null;
+12 -1
View File
@@ -3698,6 +3698,16 @@ details summary {
}
.metadata-hero-order-actions { display: flex; gap: 5px; }
.metadata-hero-order-actions button { min-width: 34px; padding-inline: 8px; }
.metadata-hero-colour {
display: grid;
gap: 7px;
margin-top: 18px;
padding-top: 16px;
border-top: 1px solid var(--line-soft);
}
.metadata-hero-colour > b { font-size: 13.5px; }
.metadata-hero-colour > p { margin: 0; color: var(--muted); font-size: 12.5px; }
.metadata-hero-colour .segments { width: fit-content; }
.metadata-hero-preview {
position: relative;
isolation: isolate;
@@ -3805,7 +3815,8 @@ details summary {
height: 100%;
background: var(--accent);
}
.metadata-preview-progress b { font-size: inherit; line-height: inherit; }
.metadata-preview-progress b { color: var(--accent); font-size: inherit; line-height: inherit; }
.metadata-preview-progress[data-colour="white"] b { color: #fff; }
.metadata-preview-summary { margin: 0; color: #cbd2d7; font-size: 12px; line-height: 1.45; }
@media (max-width: 980px) {