aboutsummaryrefslogtreecommitdiff
path: root/src/lib/User
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-03-01 16:04:11 -0800
committerFuwn <[email protected]>2026-03-01 16:04:11 -0800
commit48f0c30d47d62e4f35706edb93a1bb2f97eba14c (patch)
tree44866d7a61adfdf01a780e0108c370294d3db78b /src/lib/User
parentchore(biome): re-enable useAltText rule (diff)
downloaddue.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.svelte92
-rw-r--r--src/lib/User/BadgeWall/BadgePreview.svelte178
-rw-r--r--src/lib/User/BadgeWall/Badges.svelte32
-rw-r--r--src/lib/User/BadgeWall/FallbackBadge.svelte112
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}