@@ -81,6 +81,8 @@ sendou.ink/
|
||||
└── scripts/ -- Stand-alone scripts to be run outside of the app
|
||||
```
|
||||
|
||||
NOTE: `public/static-assets` should only have files that don't change as it is cached for 1 month.
|
||||
|
||||
## Commands
|
||||
|
||||
### Converting gifs (badges) to thumbnail (.png)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import clsx from "clsx";
|
||||
import type { User } from "~/db/types";
|
||||
import * as React from "react";
|
||||
import { BLANK_IMAGE_URL } from "~/utils/urls";
|
||||
|
||||
const dimensions = {
|
||||
xxs: 24,
|
||||
@@ -38,7 +39,7 @@ export function Avatar({
|
||||
? `https://cdn.discordapp.com/avatars/${user.discordId}/${
|
||||
user.discordAvatar
|
||||
}.webp${size === "lg" ? "?size=240" : "?size=80"}`
|
||||
: "/img/blank.gif" // avoid broken image placeholder
|
||||
: BLANK_IMAGE_URL // avoid broken image placeholder
|
||||
}
|
||||
alt={alt}
|
||||
title={alt ? alt : undefined}
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
import { useTranslation } from "~/hooks/useTranslation";
|
||||
import {
|
||||
FIRST_PLACEMENT_ICON_PATH,
|
||||
SECOND_PLACEMENT_ICON_PATH,
|
||||
THIRD_PLACEMENT_ICON_PATH,
|
||||
} from "~/utils/urls";
|
||||
|
||||
export type PlacementProps = {
|
||||
placement: number;
|
||||
@@ -9,11 +14,11 @@ export type PlacementProps = {
|
||||
const getSpecialPlacementIconPath = (placement: number): string | null => {
|
||||
switch (placement) {
|
||||
case 3:
|
||||
return "/svg/placements/third.svg";
|
||||
return THIRD_PLACEMENT_ICON_PATH;
|
||||
case 2:
|
||||
return "/svg/placements/second.svg";
|
||||
return SECOND_PLACEMENT_ICON_PATH;
|
||||
case 1:
|
||||
return "/svg/placements/first.svg";
|
||||
return FIRST_PLACEMENT_ICON_PATH;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
SENDOU_INK_GITHUB_URL,
|
||||
SENDOU_INK_PATREON_URL,
|
||||
SENDOU_INK_TWITTER_URL,
|
||||
SENDOU_LOVE_EMOJI_PATH,
|
||||
SPLATOON_2_SENDOU_IN_URL,
|
||||
userPage,
|
||||
} from "~/utils/urls";
|
||||
@@ -86,7 +87,7 @@ export function Footer({
|
||||
{t("footer.thanks")}
|
||||
<Image
|
||||
alt=""
|
||||
path="/img/layout/sendou_love"
|
||||
path={SENDOU_LOVE_EMOJI_PATH}
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useIsMounted } from "~/hooks/useIsMounted";
|
||||
import { canPerformAdminActions } from "~/permissions";
|
||||
import { useUser } from "~/modules/auth";
|
||||
import { useTranslation } from "~/hooks/useTranslation";
|
||||
import { navIconUrl } from "~/utils/urls";
|
||||
|
||||
export function Menu({
|
||||
expanded,
|
||||
@@ -47,7 +48,7 @@ export function Menu({
|
||||
>
|
||||
<Image
|
||||
className="layout__menu__link__icon"
|
||||
path={`/img/layout/${navItem.name.replace(" ", "")}`}
|
||||
path={navIconUrl(navItem.name)}
|
||||
alt={navItem.name}
|
||||
/>
|
||||
<div>{t(`pages.${navItem.name}` as any)}</div>
|
||||
|
||||
@@ -461,7 +461,7 @@ dialog::backdrop {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
background-color: var(--bg-lighter);
|
||||
background-image: url("/svg/background-pattern.svg");
|
||||
background-image: url("/static-assets/svg/background-pattern.svg");
|
||||
margin-block-end: var(--s-4);
|
||||
overflow-x: auto;
|
||||
}
|
||||
@@ -648,7 +648,7 @@ dialog::backdrop {
|
||||
.avatar {
|
||||
border-radius: 50%;
|
||||
background-color: var(--bg-lighter);
|
||||
background-image: url("/svg/background-pattern.svg");
|
||||
background-image: url("/static-assets/svg/background-pattern.svg");
|
||||
}
|
||||
|
||||
.alert > svg {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
justify-content: center;
|
||||
border-radius: var(--rounded);
|
||||
background-color: var(--bg-lighter);
|
||||
background-image: url("/svg/background-pattern.svg");
|
||||
background-image: url("/static-assets/svg/background-pattern.svg");
|
||||
}
|
||||
|
||||
.layout__avatar {
|
||||
@@ -153,7 +153,7 @@
|
||||
height: max-content;
|
||||
margin-top: 5rem;
|
||||
background-color: var(--bg-lighter);
|
||||
background-image: url("/svg/background-pattern.svg");
|
||||
background-image: url("/static-assets/svg/background-pattern.svg");
|
||||
border-end-start-radius: var(--rounded);
|
||||
border-start-start-radius: var(--rounded);
|
||||
overflow-y: auto;
|
||||
@@ -171,7 +171,7 @@
|
||||
height: 2rem;
|
||||
border-radius: var(--rounded);
|
||||
background-color: var(--bg-lighter);
|
||||
background-image: url("/svg/background-pattern.svg");
|
||||
background-image: url("/static-assets/svg/background-pattern.svg");
|
||||
}
|
||||
|
||||
.layout__menu__links {
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
export const layoutIcon = (icon: string) => `/img/layout/${icon}.webp`;
|
||||
@@ -48,9 +48,18 @@ export const STOP_IMPERSONATING_URL = "/auth/impersonate/stop";
|
||||
export const SEED_URL = "/seed";
|
||||
export const PLANNER_URL = "/plans";
|
||||
|
||||
export const COMMON_PREVIEW_IMAGE = "/img/layout/common-preview.png";
|
||||
export const ERROR_GIRL_IMAGE_PATH = `/img/layout/error-girl`;
|
||||
export const LOGO_PATH = `/img/layout/logo`;
|
||||
export const BLANK_IMAGE_URL = "/static-assets/img/blank.gif";
|
||||
export const COMMON_PREVIEW_IMAGE =
|
||||
"/static-assets/img/layout/common-preview.png";
|
||||
export const ERROR_GIRL_IMAGE_PATH = "/static-assets/img/layout/error-girl";
|
||||
export const LOGO_PATH = "/static-assets/img/layout/logo";
|
||||
export const SENDOU_LOVE_EMOJI_PATH = "/static-assets/img/layout/sendou_love";
|
||||
export const FIRST_PLACEMENT_ICON_PATH =
|
||||
"/static-assets/svg/placements/first.svg";
|
||||
export const SECOND_PLACEMENT_ICON_PATH =
|
||||
"/static-assets/svg/placements/second.svg";
|
||||
export const THIRD_PLACEMENT_ICON_PATH =
|
||||
"/static-assets/svg/placements/third.svg";
|
||||
|
||||
export const GET_ALL_USERS_ROUTE = "/users";
|
||||
export const GET_ALL_EVENTS_WITH_MAP_POOLS_ROUTE = "/calendar/map-pool-events";
|
||||
@@ -115,36 +124,38 @@ export const badgeUrl = ({
|
||||
}: {
|
||||
code: Badge["code"];
|
||||
extension?: "gif";
|
||||
}) => `/badges/${code}${extension ? `.${extension}` : ""}`;
|
||||
}) => `/static-assets/badges/${code}${extension ? `.${extension}` : ""}`;
|
||||
export const articlePreviewUrl = (slug: string) =>
|
||||
`/img/article-previews/${slug}.png`;
|
||||
`/static-assets/img/article-previews/${slug}.png`;
|
||||
|
||||
export const navIconUrl = (navItem: typeof navItems[number]["name"]) =>
|
||||
`/img/layout/${navItem}`;
|
||||
`/static-assets/img/layout/${navItem}`;
|
||||
export const gearImageUrl = (gearType: GearType, gearSplId: number) =>
|
||||
`/img/gear/${gearType.toLowerCase()}/${gearSplId}`;
|
||||
`/static-assets/img/gear/${gearType.toLowerCase()}/${gearSplId}`;
|
||||
export const weaponCategoryUrl = (
|
||||
category: typeof weaponCategories[number]["name"]
|
||||
) => `/img/weapon-categories/${category}`;
|
||||
) => `/static-assets/img/weapon-categories/${category}`;
|
||||
export const mainWeaponImageUrl = (mainWeaponSplId: MainWeaponId) =>
|
||||
`/img/main-weapons/${mainWeaponSplId}`;
|
||||
`/static-assets/img/main-weapons/${mainWeaponSplId}`;
|
||||
export const outlinedMainWeaponImageUrl = (mainWeaponSplId: MainWeaponId) =>
|
||||
`/img/main-weapons-outlined/${mainWeaponSplId}`;
|
||||
`/static-assets/img/main-weapons-outlined/${mainWeaponSplId}`;
|
||||
export const subWeaponImageUrl = (subWeaponSplId: SubWeaponId) =>
|
||||
`/img/sub-weapons/${subWeaponSplId}`;
|
||||
`/static-assets/img/sub-weapons/${subWeaponSplId}`;
|
||||
export const specialWeaponImageUrl = (specialWeaponSplId: SpecialWeaponId) =>
|
||||
`/img/special-weapons/${specialWeaponSplId}`;
|
||||
`/static-assets/img/special-weapons/${specialWeaponSplId}`;
|
||||
export const abilityImageUrl = (ability: AbilityWithUnknown) =>
|
||||
`/img/abilities/${ability}`;
|
||||
export const modeImageUrl = (mode: ModeShort) => `/img/modes/${mode}`;
|
||||
export const stageImageUrl = (stageId: StageId) => `/img/stages/${stageId}`;
|
||||
`/static-assets/img/abilities/${ability}`;
|
||||
export const modeImageUrl = (mode: ModeShort) =>
|
||||
`/static-assets/img/modes/${mode}`;
|
||||
export const stageImageUrl = (stageId: StageId) =>
|
||||
`/static-assets/img/stages/${stageId}`;
|
||||
export const stageMinimapImageUrlWithEnding = ({
|
||||
stageId,
|
||||
modeShort,
|
||||
}: {
|
||||
stageId: StageId;
|
||||
modeShort: ModeShort;
|
||||
}) => `/img/stage-minimaps/${stageId}-${modeShort}.jpeg`;
|
||||
}) => `/static-assets/img/stage-minimaps/${stageId}-${modeShort}.jpeg`;
|
||||
|
||||
export function resolveBaseUrl(url: string) {
|
||||
return new URL(url).host;
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 282 KiB After Width: | Height: | Size: 282 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 287 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 340 KiB After Width: | Height: | Size: 340 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 666 B After Width: | Height: | Size: 666 B |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 275 KiB After Width: | Height: | Size: 275 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 247 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 240 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 749 B After Width: | Height: | Size: 749 B |
|
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 234 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 803 B After Width: | Height: | Size: 803 B |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 861 B After Width: | Height: | Size: 861 B |
|
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 387 KiB After Width: | Height: | Size: 387 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 867 B After Width: | Height: | Size: 867 B |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 175 KiB After Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 938 B |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 182 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 885 B After Width: | Height: | Size: 885 B |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 161 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 998 B After Width: | Height: | Size: 998 B |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 327 KiB After Width: | Height: | Size: 327 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 753 B After Width: | Height: | Size: 753 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 783 B After Width: | Height: | Size: 783 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 793 B After Width: | Height: | Size: 793 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 763 B After Width: | Height: | Size: 763 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 732 B After Width: | Height: | Size: 732 B |
|
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 652 B After Width: | Height: | Size: 652 B |