diff options
| author | Fuwn <[email protected]> | 2026-03-01 16:04:11 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-03-01 16:04:11 -0800 |
| commit | 48f0c30d47d62e4f35706edb93a1bb2f97eba14c (patch) | |
| tree | 44866d7a61adfdf01a780e0108c370294d3db78b /src/lib/User | |
| parent | chore(biome): re-enable useAltText rule (diff) | |
| download | due.moe-48f0c30d47d62e4f35706edb93a1bb2f97eba14c.tar.xz due.moe-48f0c30d47d62e4f35706edb93a1bb2f97eba14c.zip | |
chore(biome): enable svelte formatting
Diffstat (limited to 'src/lib/User')
| -rw-r--r-- | src/lib/User/BadgeWall/AWC.svelte | 92 | ||||
| -rw-r--r-- | src/lib/User/BadgeWall/BadgePreview.svelte | 178 | ||||
| -rw-r--r-- | src/lib/User/BadgeWall/Badges.svelte | 32 | ||||
| -rw-r--r-- | src/lib/User/BadgeWall/FallbackBadge.svelte | 112 |
4 files changed, 207 insertions, 207 deletions
diff --git a/src/lib/User/BadgeWall/AWC.svelte b/src/lib/User/BadgeWall/AWC.svelte index 8d340282..52eb670a 100644 --- a/src/lib/User/BadgeWall/AWC.svelte +++ b/src/lib/User/BadgeWall/AWC.svelte @@ -1,63 +1,63 @@ <script lang="ts"> - import Spacer from '$lib/Layout/Spacer.svelte'; - import type { AWCBadgesGroup } from '$lib/Data/awc'; - import { cdn, thumbnail } from '$lib/Utility/image'; - import type { Preferences } from '../../../graphql/$types'; - import FallbackBadge from './FallbackBadge.svelte'; - import './badges.css'; +import Spacer from '$lib/Layout/Spacer.svelte'; +import type { AWCBadgesGroup } from '$lib/Data/awc'; +import { cdn, thumbnail } from '$lib/Utility/image'; +import type { Preferences } from '../../../graphql/$types'; +import FallbackBadge from './FallbackBadge.svelte'; +import './badges.css'; - export let awcPromise: Promise<Response>; - export let categoryFilter: string | null; - export let isOwner: boolean; - export let preferences: Preferences; +export let awcPromise: Promise<Response>; +export let categoryFilter: string | null; +export let isOwner: boolean; +export let preferences: Preferences; - const awcBadgesGrouped = (awcResponse: string): AWCBadgesGroup[] => { - return Array.from( - new DOMParser().parseFromString(awcResponse, 'text/html').querySelectorAll('.container') - ) - .map((c) => { - const container = c as HTMLDivElement; - const header = container.querySelector('.container-header') as HTMLDivElement; +const awcBadgesGrouped = (awcResponse: string): AWCBadgesGroup[] => { + return Array.from( + new DOMParser().parseFromString(awcResponse, 'text/html').querySelectorAll('.container') + ) + .map((c) => { + const container = c as HTMLDivElement; + const header = container.querySelector('.container-header') as HTMLDivElement; - if (!header) return; + if (!header) return; - if (!['Anime', 'Manga', 'Special'].includes(header.innerText)) return; - - if (header.innerText === 'Special') { - return { - group: header.innerText, - badges: Array.from(container.querySelectorAll('.badge-display img')).map((b) => { - const badge = b as HTMLImageElement; - - return { - link: '#', - description: badge.alt, - image: badge.src.includes('placeholder') - ? cdn('https://awc.moe/static/images/badge-placeholder.png') - : badge.src - }; - }) - }; - } + if (!['Anime', 'Manga', 'Special'].includes(header.innerText)) return; + if (header.innerText === 'Special') { return { group: header.innerText, - badges: Array.from(container.querySelectorAll('.badge-display a')).map((b) => { - const badge = b as HTMLAnchorElement; - const image = badge.querySelector('img') as HTMLImageElement; + badges: Array.from(container.querySelectorAll('.badge-display img')).map((b) => { + const badge = b as HTMLImageElement; return { - link: badge.href, - description: image.alt, - image: image.src.includes('placeholder') + link: '#', + description: badge.alt, + image: badge.src.includes('placeholder') ? cdn('https://awc.moe/static/images/badge-placeholder.png') - : image.src + : badge.src }; }) }; - }) - .filter((b) => b !== undefined) as AWCBadgesGroup[]; - }; + } + + return { + group: header.innerText, + badges: Array.from(container.querySelectorAll('.badge-display a')).map((b) => { + const badge = b as HTMLAnchorElement; + const image = badge.querySelector('img') as HTMLImageElement; + + return { + link: badge.href, + description: image.alt, + image: image.src.includes('placeholder') + ? cdn('https://awc.moe/static/images/badge-placeholder.png') + : image.src + }; + }) + }; + }) + .filter((b) => b !== undefined) as AWCBadgesGroup[]; +}; </script> {#await awcPromise then badges} diff --git a/src/lib/User/BadgeWall/BadgePreview.svelte b/src/lib/User/BadgeWall/BadgePreview.svelte index 062fdac7..cf0cb284 100644 --- a/src/lib/User/BadgeWall/BadgePreview.svelte +++ b/src/lib/User/BadgeWall/BadgePreview.svelte @@ -1,104 +1,104 @@ <script lang="ts"> - import Spacer from '$lib/Layout/Spacer.svelte'; - import { thumbnail } from '$lib/Utility/image'; - import type { Badge } from '$lib/Database/SB/User/badges'; - import { cdn } from '$lib/Utility/image'; - import { databaseTimeToDate } from '$lib/Utility/time'; - import locale from '$stores/locale'; - import { onMount } from 'svelte'; - import root from '$lib/Utility/root'; - import ParallaxImage from '$lib/Image/ParallaxImage.svelte'; - - export let selectedBadge: Badge | undefined; - export let onNext: () => void = () => undefined; - export let onPrevious: () => void = () => undefined; - export let hasNext: boolean; - export let hasPrevious: boolean; - - let source = cdn(thumbnail(selectedBadge?.image || '')) || ''; - let badgeReference: HTMLImageElement; - - $: { - if (selectedBadge && selectedBadge.image) { - const image = new Image(); - - image.src = cdn(selectedBadge.image) || ''; - image.onload = () => { - source = image.src; - }; - } - } - - $: { - if (selectedBadge) - fetch(root(`/api/badges?incrementClickCount=${selectedBadge.id}`), { - method: 'PUT' - }); +import Spacer from '$lib/Layout/Spacer.svelte'; +import { thumbnail } from '$lib/Utility/image'; +import type { Badge } from '$lib/Database/SB/User/badges'; +import { cdn } from '$lib/Utility/image'; +import { databaseTimeToDate } from '$lib/Utility/time'; +import locale from '$stores/locale'; +import { onMount } from 'svelte'; +import root from '$lib/Utility/root'; +import ParallaxImage from '$lib/Image/ParallaxImage.svelte'; + +export let selectedBadge: Badge | undefined; +export let onNext: () => void = () => undefined; +export let onPrevious: () => void = () => undefined; +export let hasNext: boolean; +export let hasPrevious: boolean; + +let source = cdn(thumbnail(selectedBadge?.image || '')) || ''; +let badgeReference: HTMLImageElement; + +$: { + if (selectedBadge && selectedBadge.image) { + const image = new Image(); + + image.src = cdn(selectedBadge.image) || ''; + image.onload = () => { + source = image.src; + }; } +} - onMount(() => { - badgeReference = document.querySelector('.badge-container-image') as HTMLImageElement; +$: { + if (selectedBadge) + fetch(root(`/api/badges?incrementClickCount=${selectedBadge.id}`), { + method: 'PUT' + }); +} - const handleClickOutside = (event: MouseEvent) => { - if ((event.target as HTMLElement).classList.contains('popup')) selectedBadge = undefined; - }; +onMount(() => { + badgeReference = document.querySelector('.badge-container-image') as HTMLImageElement; - document.addEventListener('click', handleClickOutside); + const handleClickOutside = (event: MouseEvent) => { + if ((event.target as HTMLElement).classList.contains('popup')) selectedBadge = undefined; + }; - return () => { - document.removeEventListener('click', handleClickOutside); - }; - }); - - const classifySource = (source: string) => { - let name = source; - const sourceLower = source.toLowerCase(); - - if (sourceLower.includes('pixiv.net')) { - name = 'Pixiv'; - } else if (sourceLower.includes('twitter.com') || sourceLower.includes('x.com')) { - name = 'X (Twitter)'; - } else if (sourceLower.includes('zerochan.net')) { - name = 'Zerochan'; - } else if (sourceLower.includes('imgur.com')) { - name = 'Imgur'; - } else if (sourceLower.includes('lofter.com')) { - name = 'Lofter'; - } + document.addEventListener('click', handleClickOutside); - return `<a href="${source}" target="_blank">${name}</a>`; + return () => { + document.removeEventListener('click', handleClickOutside); }; +}); + +const classifySource = (source: string) => { + let name = source; + const sourceLower = source.toLowerCase(); + + if (sourceLower.includes('pixiv.net')) { + name = 'Pixiv'; + } else if (sourceLower.includes('twitter.com') || sourceLower.includes('x.com')) { + name = 'X (Twitter)'; + } else if (sourceLower.includes('zerochan.net')) { + name = 'Zerochan'; + } else if (sourceLower.includes('imgur.com')) { + name = 'Imgur'; + } else if (sourceLower.includes('lofter.com')) { + name = 'Lofter'; + } - const classifyDesigner = (designer: string) => { - let name = designer; - let userLink = designer; - const designerLower = designer.toLowerCase(); - const anilistUser = designer.match(/https?:\/\/anilist\.co\/user\/([^/]+)\/?/); - - if (anilistUser) { - name = anilistUser[1]; - } else if (designerLower.startsWith('@')) { - name = designer.replace('@', ''); - userLink = `https://anilist.co/user/${name}/`; - } else if (!designerLower.startsWith('http')) { - userLink = `https://anilist.co/user/${name}/`; - } + return `<a href="${source}" target="_blank">${name}</a>`; +}; + +const classifyDesigner = (designer: string) => { + let name = designer; + let userLink = designer; + const designerLower = designer.toLowerCase(); + const anilistUser = designer.match(/https?:\/\/anilist\.co\/user\/([^/]+)\/?/); + + if (anilistUser) { + name = anilistUser[1]; + } else if (designerLower.startsWith('@')) { + name = designer.replace('@', ''); + userLink = `https://anilist.co/user/${name}/`; + } else if (!designerLower.startsWith('http')) { + userLink = `https://anilist.co/user/${name}/`; + } - return `<a href="${userLink}" target="_blank">@${name}</a>`; - }; + return `<a href="${userLink}" target="_blank">@${name}</a>`; +}; - const onClick = (event: MouseEvent) => { - event.preventDefault(); +const onClick = (event: MouseEvent) => { + event.preventDefault(); - if ( - event.clientX < - badgeReference.getBoundingClientRect().left + badgeReference.getBoundingClientRect().width / 2 - ) { - onPrevious(); - } else { - onNext(); - } - }; + if ( + event.clientX < + badgeReference.getBoundingClientRect().left + badgeReference.getBoundingClientRect().width / 2 + ) { + onPrevious(); + } else { + onNext(); + } +}; </script> {#if selectedBadge} diff --git a/src/lib/User/BadgeWall/Badges.svelte b/src/lib/User/BadgeWall/Badges.svelte index 99d500da..04943c64 100644 --- a/src/lib/User/BadgeWall/Badges.svelte +++ b/src/lib/User/BadgeWall/Badges.svelte @@ -1,21 +1,21 @@ <script lang="ts"> - import Spacer from '$lib/Layout/Spacer.svelte'; - import LinkedTooltip from '$lib/Tooltip/LinkedTooltip.svelte'; - import tooltip from '$lib/Tooltip/tooltip'; - import locale from '$stores/locale'; - import { databaseTimeToDate } from '$lib/Utility/time'; - import FallbackImage from '$lib/Image/FallbackImage.svelte'; - import { cdn, thumbnail } from '$lib/Utility/image'; - import FallbackBadge from './FallbackBadge.svelte'; - import type { Preferences } from '../../../graphql/$types'; - import type { IndexedBadge } from './badge'; +import Spacer from '$lib/Layout/Spacer.svelte'; +import LinkedTooltip from '$lib/Tooltip/LinkedTooltip.svelte'; +import tooltip from '$lib/Tooltip/tooltip'; +import locale from '$stores/locale'; +import { databaseTimeToDate } from '$lib/Utility/time'; +import FallbackImage from '$lib/Image/FallbackImage.svelte'; +import { cdn, thumbnail } from '$lib/Utility/image'; +import FallbackBadge from './FallbackBadge.svelte'; +import type { Preferences } from '../../../graphql/$types'; +import type { IndexedBadge } from './badge'; - export let ungroupedBadges: IndexedBadge[]; - export let groupedBadges: [string, IndexedBadge[]][]; - export let categoryFilter: string | null; - export let editMode: boolean; - export let preferences: Preferences | undefined; - export let selectedBadge: IndexedBadge | undefined = undefined; +export let ungroupedBadges: IndexedBadge[]; +export let groupedBadges: [string, IndexedBadge[]][]; +export let categoryFilter: string | null; +export let editMode: boolean; +export let preferences: Preferences | undefined; +export let selectedBadge: IndexedBadge | undefined = undefined; </script> {#if ungroupedBadges.length === 0} diff --git a/src/lib/User/BadgeWall/FallbackBadge.svelte b/src/lib/User/BadgeWall/FallbackBadge.svelte index bda93e4e..86e90939 100644 --- a/src/lib/User/BadgeWall/FallbackBadge.svelte +++ b/src/lib/User/BadgeWall/FallbackBadge.svelte @@ -1,70 +1,70 @@ <script lang="ts"> - import { classifyDesignerName } from './badge'; - import locale from '$stores/locale'; - import { tweened } from 'svelte/motion'; - import type { Badge } from '../../Database/SB/User/badges'; - import type { AWCBadge } from '../../Data/awc'; - import Tooltip from '../../Tooltip/LinkedTooltip.svelte'; - import { databaseTimeToDate } from '../../Utility/time'; - import { cubicOut } from 'svelte/easing'; - import { dev } from '$app/environment'; - import type { Preferences } from '../../../graphql/$types'; +import { classifyDesignerName } from './badge'; +import locale from '$stores/locale'; +import { tweened } from 'svelte/motion'; +import type { Badge } from '../../Database/SB/User/badges'; +import type { AWCBadge } from '../../Data/awc'; +import Tooltip from '../../Tooltip/LinkedTooltip.svelte'; +import { databaseTimeToDate } from '../../Utility/time'; +import { cubicOut } from 'svelte/easing'; +import { dev } from '$app/environment'; +import type { Preferences } from '../../../graphql/$types'; - export let source: string | null | undefined; - export let alternative: string | null | undefined; - export let fallback: string | null | undefined; - export let maxReplaceCount = 1; - export let replaceDelay = 1000; - export let error = 'https://i2.kym-cdn.com/photos/images/newsfeed/000/290/992/0aa.jpg'; - export let hideOnError = false; - export let badge: Badge | AWCBadge; - export let style = ''; - export let selectedBadge: Badge | null = null; - export let awc = false; - export let index: number | null = null; - export let preferences: Preferences | undefined; +export let source: string | null | undefined; +export let alternative: string | null | undefined; +export let fallback: string | null | undefined; +export let maxReplaceCount = 1; +export let replaceDelay = 1000; +export let error = 'https://i2.kym-cdn.com/photos/images/newsfeed/000/290/992/0aa.jpg'; +export let hideOnError = false; +export let badge: Badge | AWCBadge; +export let style = ''; +export let selectedBadge: Badge | null = null; +export let awc = false; +export let index: number | null = null; +export let preferences: Preferences | undefined; - let replaceCount = 0; - let badgeReference: HTMLImageElement; - const mouse = tweened( - { x: 0, y: 0 }, - { - duration: 75, - easing: cubicOut - } - ); +let replaceCount = 0; +let badgeReference: HTMLImageElement; +const mouse = tweened( + { x: 0, y: 0 }, + { + duration: 75, + easing: cubicOut + } +); - const delayedReplace = (event: Event, image: string | undefined | null) => { - if (replaceCount >= maxReplaceCount) return; +const delayedReplace = (event: Event, image: string | undefined | null) => { + if (replaceCount >= maxReplaceCount) return; - setTimeout(() => { - (event.target as HTMLImageElement).src = image || ''; + setTimeout(() => { + (event.target as HTMLImageElement).src = image || ''; - replaceCount += 1; - }, replaceDelay); - }; + replaceCount += 1; + }, replaceDelay); +}; - const handleMouseMove = (event: MouseEvent) => { - const boundingRectangle = badgeReference.getBoundingClientRect(); - const factor = 1.25; - const limit = 50; +const handleMouseMove = (event: MouseEvent) => { + const boundingRectangle = badgeReference.getBoundingClientRect(); + const factor = 1.25; + const limit = 50; - if ($mouse.x === 0 && $mouse.y === 0) $mouse = { x: event.clientX, y: event.clientY }; + if ($mouse.x === 0 && $mouse.y === 0) $mouse = { x: event.clientX, y: event.clientY }; - $mouse.x += - (-(event.clientX - boundingRectangle.left - boundingRectangle.width / 2) - $mouse.x) * factor; - $mouse.y += - (-(event.clientY - boundingRectangle.top - boundingRectangle.height / 2) - $mouse.y) * factor; - $mouse.x = Math.max(Math.min($mouse.x, limit), -limit); - $mouse.y = Math.max(Math.min($mouse.y, limit), -limit); - }; + $mouse.x += + (-(event.clientX - boundingRectangle.left - boundingRectangle.width / 2) - $mouse.x) * factor; + $mouse.y += + (-(event.clientY - boundingRectangle.top - boundingRectangle.height / 2) - $mouse.y) * factor; + $mouse.x = Math.max(Math.min($mouse.x, limit), -limit); + $mouse.y = Math.max(Math.min($mouse.y, limit), -limit); +}; - const handleMouseLeave = () => { - $mouse = { x: 0, y: 0 }; - }; +const handleMouseLeave = () => { + $mouse = { x: 0, y: 0 }; +}; - const isDBBadge = (b: Badge | AWCBadge): b is Badge => 'id' in b; - const asAWCBadge = (b: Badge | AWCBadge) => b as AWCBadge; +const isDBBadge = (b: Badge | AWCBadge): b is Badge => 'id' in b; +const asAWCBadge = (b: Badge | AWCBadge) => b as AWCBadge; </script> {#if replaceCount < maxReplaceCount} |