This commit is contained in:
Chris Kruining 2025-05-28 13:17:00 +02:00
commit 35213e1add
No known key found for this signature in database
GPG key ID: EB894A3560CCCAD2
3 changed files with 44 additions and 24 deletions

View file

@ -1,6 +1,6 @@
.container { .container {
isolation: isolate; isolation: isolate;
display: block grid; display: block grid;
container-type: inline-size; container-type: inline-size;
} }
@ -14,10 +14,13 @@
position: absolute; position: absolute;
inset: 0; inset: 0;
display: block; display: block;
background: linear-gradient(182.5deg, transparent 20%, var(--surface-2) 90%), background: linear-gradient(
linear-gradient(transparent 50%, #0007 75%); calc(atan(var(--ratio))),
var(--surface-2) 20em,
transparent 90%
);
} }
& > .background { & > .background {
position: absolute; position: absolute;
inset: 0; inset: 0;
@ -28,4 +31,3 @@
z-index: 0; z-index: 0;
} }
} }

View file

@ -1,19 +1,38 @@
import { Component } from 'solid-js'; import { Component, createSignal, onCleanup, onMount } from "solid-js";
import { Entry } from '~/features/content'; import { Entry } from "~/features/content";
import css from './details.module.css'; import css from "./details.module.css";
interface DetailsProps { interface DetailsProps {
entry: Entry entry: Entry;
} }
export const Details: Component<DetailsProps> = (props) => { export const Details: Component<DetailsProps> = (props) => {
return ( const [header, setHeader] = createSignal<HTMLElement>();
<div class={css.container}>
<header class={css.header}>
<img class={css.background} src={props.entry.image} />
<h1>{props.entry.title}</h1> onMount(() => {
</header> const observer = new ResizeObserver(([entry]) => {
</div> const _20em = 20 * 16;
); const { inlineSize, blockSize } = entry.contentBoxSize[0];
}; console.log(blockSize / inlineSize);
(entry.target as HTMLElement).style.setProperty(
"--ratio",
String(_20em / inlineSize),
);
});
observer.observe(header()!);
onCleanup(() => observer.disconnect());
});
return (
<div class={css.container}>
<header ref={setHeader} class={css.header}>
<img class={css.background} src={props.entry.image} />
<h1>{props.entry.title}</h1>
</header>
</div>
);
};

View file

@ -24,7 +24,6 @@ const getBaseUrl = () => {
return process.env.JELLYFIN_BASE_URL; return process.env.JELLYFIN_BASE_URL;
}; };
const getClient = () => { const getClient = () => {
"use server"; "use server";
@ -34,11 +33,11 @@ const getClient = () => {
Authorization: `MediaBrowser DeviceId="Streamarr", Token="${process.env.JELLYFIN_API_KEY}"`, Authorization: `MediaBrowser DeviceId="Streamarr", Token="${process.env.JELLYFIN_API_KEY}"`,
"Content-Type": 'application/json; profile="CamelCase"', "Content-Type": 'application/json; profile="CamelCase"',
}, },
}) });
}; };
export const getCurrentUser = query(async () => { export const getCurrentUser = query(async () => {
"use server"; "use server";
const { data, error, response } = await getClient().GET("/Users/Public", { const { data, error, response } = await getClient().GET("/Users/Public", {
params: {}, params: {},
@ -48,7 +47,7 @@ export const getCurrentUser = query(async () => {
}, "jellyfin.getCurrentUser"); }, "jellyfin.getCurrentUser");
export const listUsers = query(async () => { export const listUsers = query(async () => {
"use server"; "use server";
const { data, error } = await getClient().GET("/Users", { const { data, error } = await getClient().GET("/Users", {
params: {}, params: {},
@ -134,8 +133,8 @@ export const getRandomItem = query(
async (userId: string): Promise<Entry | undefined> => { async (userId: string): Promise<Entry | undefined> => {
"use server"; "use server";
return getRandomItems(userId, 1).then((items) => items?.at(0)); return getRandomItems(userId, 1).then((items) => items?.at(0));
}, },
"jellyfin.listRandomItem", "jellyfin.listRandomItem",
); );