feat: add partial support for ancient browsers
Some checks failed
Check / check (push) Has been cancelled

This commit is contained in:
ThaUnknown 2025-07-23 15:41:56 +02:00
parent 7ff57561c2
commit 7f84100c22
No known key found for this signature in database
11 changed files with 108 additions and 46 deletions

View file

@ -1,6 +1,6 @@
{
"name": "ui",
"version": "6.4.84",
"version": "6.4.85",
"license": "BUSL-1.1",
"private": true,
"packageManager": "pnpm@9.15.5",

View file

@ -19,7 +19,7 @@ importers:
version: 5.2.6
'@prgm/sveltekit-progress-bar':
specifier: 2.0.0
version: 2.0.0(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)
version: 2.0.0(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)
'@thaunknown/web-irc':
specifier: ^1.0.3
version: 1.0.3
@ -143,13 +143,13 @@ importers:
version: 1.0.1(svelte@4.2.19)(typescript@5.8.3)
'@sveltejs/adapter-static':
specifier: ^3.0.8
version: 3.0.8(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))
version: 3.0.8(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))
'@sveltejs/kit':
specifier: ^2.21.0
version: 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
version: 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
'@sveltejs/vite-plugin-svelte':
specifier: ^3.1.2
version: 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
version: 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
'@types/debug':
specifier: ^4.1.12
version: 4.1.12
@ -176,7 +176,7 @@ importers:
version: 1.8.10(@gql.tada/svelte-support@1.0.1(svelte@4.2.19)(typescript@5.8.3))(graphql@16.10.0)(typescript@5.8.3)
hayase-extensions:
specifier: github:hayase-app/extensions
version: https://codeload.github.com/hayase-app/extensions/tar.gz/a9415c297a899459be34a135a9adbcd72115e019
version: https://codeload.github.com/hayase-app/extensions/tar.gz/675c4a7cfa1e2b4e88c2d11c4c195c33c68116e0
jassub:
specifier: ^1.8.6
version: 1.8.6
@ -212,10 +212,10 @@ importers:
version: 0.3.2(svelte@4.2.19)
vite:
specifier: ^5.4.11
version: 5.4.19(terser@5.39.0)
version: 5.4.19(terser@5.43.1)
vite-plugin-static-copy:
specifier: ^3.0.2
version: 3.0.2(vite@5.4.19(terser@5.39.0))
version: 3.0.2(vite@5.4.19(terser@5.43.1))
packages:
@ -488,6 +488,9 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
'@jridgewell/gen-mapping@0.3.12':
resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
@ -509,6 +512,9 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@jridgewell/trace-mapping@0.3.29':
resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==}
'@melt-ui/svelte@0.76.2':
resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==}
peerDependencies:
@ -1574,8 +1580,8 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
hayase-extensions@https://codeload.github.com/hayase-app/extensions/tar.gz/a9415c297a899459be34a135a9adbcd72115e019:
resolution: {tarball: https://codeload.github.com/hayase-app/extensions/tar.gz/a9415c297a899459be34a135a9adbcd72115e019}
hayase-extensions@https://codeload.github.com/hayase-app/extensions/tar.gz/675c4a7cfa1e2b4e88c2d11c4c195c33c68116e0:
resolution: {tarball: https://codeload.github.com/hayase-app/extensions/tar.gz/675c4a7cfa1e2b4e88c2d11c4c195c33c68116e0}
version: 1.0.6
idb-keyval@6.2.2:
@ -2482,8 +2488,8 @@ packages:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
terser@5.39.0:
resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
terser@5.43.1:
resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==}
engines: {node: '>=10'}
hasBin: true
@ -2957,6 +2963,12 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
'@jridgewell/gen-mapping@0.3.12':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.29
optional: true
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
@ -2969,8 +2981,8 @@ snapshots:
'@jridgewell/source-map@0.3.6':
dependencies:
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/gen-mapping': 0.3.12
'@jridgewell/trace-mapping': 0.3.29
optional: true
'@jridgewell/sourcemap-codec@1.5.0': {}
@ -2980,6 +2992,12 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping@0.3.29':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
optional: true
'@melt-ui/svelte@0.76.2(svelte@4.2.19)':
dependencies:
'@floating-ui/core': 1.7.0
@ -3007,9 +3025,9 @@ snapshots:
'@polka/url@1.0.0-next.29': {}
'@prgm/sveltekit-progress-bar@2.0.0(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)':
'@prgm/sveltekit-progress-bar@2.0.0(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)':
dependencies:
'@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
'@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
svelte: 4.2.19
'@rollup/rollup-android-arm-eabi@4.40.2':
@ -3090,14 +3108,14 @@ snapshots:
dependencies:
acorn: 8.14.1
'@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))':
'@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))':
dependencies:
'@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
'@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
'@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))':
'@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))':
dependencies:
'@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1)
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
'@types/cookie': 0.6.0
acorn: 8.14.1
cookie: 0.6.0
@ -3110,28 +3128,28 @@ snapshots:
set-cookie-parser: 2.7.1
sirv: 3.0.1
svelte: 4.2.19
vite: 5.4.19(terser@5.39.0)
vite: 5.4.19(terser@5.43.1)
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))':
'@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))':
dependencies:
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
'@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
debug: 4.4.1
svelte: 4.2.19
vite: 5.4.19(terser@5.39.0)
vite: 5.4.19(terser@5.43.1)
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))':
'@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))':
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.39.0)))(svelte@4.2.19)(vite@5.4.19(terser@5.39.0))
'@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.19(terser@5.43.1)))(svelte@4.2.19)(vite@5.4.19(terser@5.43.1))
debug: 4.4.1
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.17
svelte: 4.2.19
svelte-hmr: 0.16.0(svelte@4.2.19)
vite: 5.4.19(terser@5.39.0)
vitefu: 0.2.5(vite@5.4.19(terser@5.39.0))
vite: 5.4.19(terser@5.43.1)
vitefu: 0.2.5(vite@5.4.19(terser@5.43.1))
transitivePeerDependencies:
- supports-color
@ -4255,7 +4273,7 @@ snapshots:
dependencies:
function-bind: 1.1.2
hayase-extensions@https://codeload.github.com/hayase-app/extensions/tar.gz/a9415c297a899459be34a135a9adbcd72115e019: {}
hayase-extensions@https://codeload.github.com/hayase-app/extensions/tar.gz/675c4a7cfa1e2b4e88c2d11c4c195c33c68116e0: {}
idb-keyval@6.2.2: {}
@ -5211,7 +5229,7 @@ snapshots:
tapable@2.2.1: {}
terser@5.39.0:
terser@5.43.1:
dependencies:
'@jridgewell/source-map': 0.3.6
acorn: 8.14.1
@ -5360,27 +5378,27 @@ snapshots:
rvfc-polyfill: 1.0.7
twgl.js: 5.5.4
vite-plugin-static-copy@3.0.2(vite@5.4.19(terser@5.39.0)):
vite-plugin-static-copy@3.0.2(vite@5.4.19(terser@5.43.1)):
dependencies:
chokidar: 3.6.0
fs-extra: 11.3.0
p-map: 7.0.3
picocolors: 1.1.1
tinyglobby: 0.2.14
vite: 5.4.19(terser@5.39.0)
vite: 5.4.19(terser@5.43.1)
vite@5.4.19(terser@5.39.0):
vite@5.4.19(terser@5.43.1):
dependencies:
esbuild: 0.21.5
postcss: 8.5.3
rollup: 4.40.2
optionalDependencies:
fsevents: 2.3.3
terser: 5.39.0
terser: 5.43.1
vitefu@0.2.5(vite@5.4.19(terser@5.39.0)):
vitefu@0.2.5(vite@5.4.19(terser@5.43.1)):
optionalDependencies:
vite: 5.4.19(terser@5.39.0)
vite: 5.4.19(terser@5.43.1)
vscode-languageserver-textdocument@1.0.12: {}

View file

@ -34,6 +34,20 @@
animation-duration: 0s !important;
}
@supports not (overflow: clip) {
.overflow-clip {
overflow: hidden;
}
.overflow-x-clip {
overflow-x: hidden;
}
.overflow-y-clip {
overflow-y: hidden;
}
}
:root {
--background: 0 0% 100%;
--foreground: 240 10% 3.9%;

View file

@ -5,7 +5,7 @@ import Root from './button.svelte'
import type { Button as ButtonPrimitive } from 'bits-ui'
const buttonVariants = tv({
base: 'focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50',
base: 'bg-transparent focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50',
variants: {
variant: {
default: 'bg-primary text-primary-foreground select:bg-neutral-500 shadow',

View file

@ -904,7 +904,7 @@
<div class='flex flex-col gap-2 text-left cursor-pointer'>
<a class='text-white text-lg font-normal leading-none line-clamp-1 hover:text-neutral-300 hover:underline' href='/app/anime/{mediaInfo.media.id}' data-up='#player-options-button-top'>{mediaInfo.session.title}</a>
<Sheet.Root portal={wrapper} bind:open={episodeListOpen}>
<Sheet.Trigger id='episode-list-button' data-down='#player-seekbar' class='text-[rgba(217,217,217,0.6)] hover:text-neutral-500 text-sm leading-none font-light line-clamp-1 text-left hover:underline'>{mediaInfo.session.description}</Sheet.Trigger>
<Sheet.Trigger id='episode-list-button' data-down='#player-seekbar' class='text-[rgba(217,217,217,0.6)] hover:text-neutral-500 text-sm leading-none font-light line-clamp-1 text-left hover:underline bg-transparent'>{mediaInfo.session.description}</Sheet.Trigger>
<Sheet.Content class='w-full sm:w-[550px] p-3 sm:p-6 max-w-full sm:max-w-full h-full overflow-y-scroll flex flex-col pb-0 shrink-0 gap-0 bg-black justify-between overflow-x-clip'>
{#if mediaInfo.media}
{#await Promise.all([episodes(mediaInfo.media.id), client.single(mediaInfo.media.id)]) then [eps, media]}

View file

@ -518,10 +518,6 @@ class AnilistClient {
// sveltekit/vite does the funny and evaluates at compile, this is a hack to fix development mode
const client = (typeof indexedDB !== 'undefined' && new AnilistClient()) as AnilistClient
// hydrating the cache re-starts all queries, it's better to wait for cache to hydrate, than waste rate limit on requests which are dumped anyways
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
await client.storagePromise?.promise
export default client
export function asyncStore<Result, Variables = AnyVariables> (query: TypedDocumentNode<Result, Variables>, variables: AnyVariables, context?: Partial<OperationContext>): Promise<Writable<Result>> {

View file

@ -18,10 +18,11 @@ export const activityState = readable<'active' | 'inactive'>(document.hasFocus()
})
// @ts-expect-error non-standard API
const idleDetector = new IdleDetector()
idleDetector.start({ threshold: 60_000 })
const idleDetector = typeof IdleDetector !== 'undefined' && new IdleDetector()
if (idleDetector) idleDetector.start({ threshold: 60_000 })
export const idleState = readable<'active' | 'idle'>(idleDetector.userState, set => {
if (!idleDetector) return set('active')
set(idleDetector.userState)
const ctrl = new AbortController()
@ -32,6 +33,7 @@ export const idleState = readable<'active' | 'idle'>(idleDetector.userState, set
})
export const lockedState = readable<'locked' | 'unlocked'>(idleDetector.screenState, set => {
if (!idleDetector) return set('unlocked')
set(idleDetector.screenState)
const ctrl = new AbortController()

View file

@ -195,7 +195,12 @@ function getElementPosition (element: HTMLElement): ElementPosition {
*/
function getFocusableElementPositions (): ElementPosition[] {
const elements = []
for (const element of getKeyboardFocusableElements(document.querySelector('[role="dialog"]') ?? document.querySelector('[role="application"]') ?? document.querySelector(':has(> [role="listbox"])') ?? document.body)) {
let listbox: Element | null = null
try {
// support for :has() pseudo-class, which is not widely supported yet
listbox = document.querySelector(':has(> [role="listbox"])')
} catch {}
for (const element of getKeyboardFocusableElements(document.querySelector('[role="dialog"]') ?? document.querySelector('[role="application"]') ?? listbox ?? document.body)) {
const position = getElementPosition(element)
elements.push(position)
}

View file

@ -26,3 +26,24 @@ if (typeof Object.groupBy === 'undefined') {
}, {})
}
}
if (!Array.prototype.at) {
// eslint-disable-next-line no-extend-native
Array.prototype.at = function <T> (this: T[], index: number): T | undefined {
const len = this.length
const relativeIndex = Math.trunc(index) || 0
const k = relativeIndex >= 0 ? relativeIndex : len + relativeIndex
if (k < 0 || k >= len) return undefined
return this[k]
}
}
// randomUUID
if (typeof crypto.randomUUID === 'undefined') {
crypto.randomUUID = () => {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0
const v = c === 'x' ? r : (r & 0x3 | 0x8)
return v.toString(16)
}) as `${string}-${string}-${string}-${string}-${string}`
}
}

View file

@ -2,6 +2,7 @@ import { error, redirect } from '@sveltejs/kit'
import { dev } from '$app/environment'
import { SETUP_VERSION } from '$lib'
import { client } from '$lib/modules/anilist'
import native from '$lib/modules/native'
import { outdatedComponent } from '$lib/modules/update'
@ -10,4 +11,9 @@ export async function load () {
if (Number(localStorage.getItem('setup-finished')) < SETUP_VERSION) redirect(307, '/setup')
if (await outdatedComponent) redirect(307, '/update/')
// hydrating the cache re-starts all queries, it's better to wait for cache to hydrate, than waste rate limit on requests which are dumped anyways
// this was previously in anilist/client but it was a top level await, which isn't a great solution, this *should* be better?
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
await client.storagePromise?.promise
}

View file

@ -38,7 +38,7 @@ export default defineConfig({
},
server: { port: 7344 },
build: {
target: 'esnext',
target: 'es2020',
sourcemap: true
},
ssr: {