Add layouts

This commit is contained in:
Sakura Knoll
2023-07-14 22:08:47 +09:00 Unverified
parent 0c0830d68d
commit 06ff200ed3
19 changed files with 1113 additions and 766 deletions
+11 -2
View File
@@ -6,6 +6,8 @@
"battlesuits": "Battlesuits", "battlesuits": "Battlesuits",
"weapons": "Weapons", "weapons": "Weapons",
"stigmata": "Stigmata", "stigmata": "Stigmata",
"stigmata-set": "Stigmata (Set)",
"stigmata-single": "Stigmata (Single)",
"elfs": "ELFs", "elfs": "ELFs",
"elysian-realm": "Elysian Realm", "elysian-realm": "Elysian Realm",
"wip": "WIP", "wip": "WIP",
@@ -44,8 +46,15 @@
}, },
"stigmata-list": { "stigmata-list": {
"description": "Stigmata list of Honkai 3rd", "description": "Stigmata list of Honkai 3rd",
"stigmata": "Stigmata", "stigmata-single": "Stigmata (Single)",
"set-list": "Set List" "set-list": "Set List",
"show-set-list": "Show Stigmata Set List"
},
"stigmata-set-list": {
"description": "Stigmata Set list of Honkai 3rd",
"stigmata-set": "Stigmata (Set)",
"set-list": "Set List",
"show-signle-list": "Show Single Stigmata List"
}, },
"stigmata-show": { "stigmata-show": {
"stigmata": "Stigmata", "stigmata": "Stigmata",
+11 -2
View File
@@ -7,6 +7,8 @@
"versions": "업데이트", "versions": "업데이트",
"weapons": "무기", "weapons": "무기",
"stigmata": "성흔", "stigmata": "성흔",
"stigmata-set": "성흔 (세트)",
"stigmata-single": "성흔 (단일)",
"elfs": "인형", "elfs": "인형",
"wip": "작업중", "wip": "작업중",
"media": "미디어", "media": "미디어",
@@ -34,8 +36,15 @@
}, },
"stigmata-list": { "stigmata-list": {
"description": "붕괴 3rd 성흔 목록", "description": "붕괴 3rd 성흔 목록",
"stigmata": "성흔", "stigmata-single": "성흔 (단일)",
"set-list": "세트 일람" "set-list": "세트 일람",
"show-set-list": "단일 성흔 목록"
},
"stigmata-set-list": {
"description": "붕괴 3rd 성흔 세트 목록",
"stigmata-set": "성흔 (세트)",
"set-list": "세트 일람",
"show-signle-list": "단일 성흔 목록"
}, },
"stigmata-show": { "stigmata-show": {
"stigmata": "성흔", "stigmata": "성흔",
+38 -45
View File
@@ -1,16 +1,7 @@
/** @jsxImportSource theme-ui */ /** @jsxImportSource theme-ui */
import { mdiClose, mdiMenuSwap } from '@mdi/js' import { mdiClose, mdiMenuSwap } from '@mdi/js'
import Icon from '@mdi/react' import Icon from '@mdi/react'
import { import { NavLink, Heading, Text, Box, Flex, IconButton, Switch, Label } from '@theme-ui/components'
NavLink,
Heading,
Text,
Box,
Flex,
IconButton,
Switch,
Label,
} from '@theme-ui/components'
import NextLink from 'next/link' import NextLink from 'next/link'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { useColorMode } from 'theme-ui' import { useColorMode } from 'theme-ui'
@@ -30,7 +21,7 @@ const Honkai3rdNavigator = ({ close }: Honkai3rdNavigatorProps) => {
return ( return (
<Box <Box
sx={{ sx={{
p: 2, p: 2
}} }}
> >
<Flex <Flex
@@ -40,38 +31,32 @@ const Honkai3rdNavigator = ({ close }: Honkai3rdNavigatorProps) => {
top: 0, top: 0,
height: 50, height: 50,
ml: -2, ml: -2,
mt: -2, mt: -2
}} }}
> >
<IconButton sx={{ width: 50, height: 50 }} onClick={close}> <IconButton sx={{ width: 50, height: 50 }} onClick={close}>
<Icon path={mdiClose} size={1} /> <Icon path={mdiClose} size={1} />
</IconButton> </IconButton>
</Flex> </Flex>
<NextLink href='/' passHref> <NextLink href="/" passHref>
<NavLink mb={2}>Abyss Lab</NavLink> <NavLink mb={2}>Abyss Lab</NavLink>
</NextLink> </NextLink>
<Heading mb={3}> <Heading mb={3}>
<NextLink href='/honkai3rd' passHref> <NextLink href="/honkai3rd" passHref>
<NavLink>{t('common.honkai-3rd')}</NavLink> <NavLink>{t('common.honkai-3rd')}</NavLink>
</NextLink> </NextLink>
</Heading> </Heading>
<Box sx={{ mb: 3 }}> <Box sx={{ mb: 3 }}>
<NavItem target='versions' /> <NavItem target="battlesuits" />
<NavItem target='battlesuits' /> <NavItem target="weapons" />
<NavItem target='weapons' /> <NavItem target="stigmata" />
<NavItem target='stigmata' /> <NavItem target="elfs" />
<NavItem target='elfs' /> <NavItem target="elysian-realm" />
<NavItem target='elysian-realm' /> <NavItem target="media" />
<NavItem target='media' />
</Box> </Box>
<NextLink <NextLink href={{ pathname, query }} locale={locale === 'en-US' ? 'ko-KR' : 'en-US'} as={asPath} passHref>
href={{ pathname, query }}
locale={locale === 'en-US' ? 'ko-KR' : 'en-US'}
as={asPath}
passHref
>
<NavLink <NavLink
sx={{ sx={{
overflow: 'hidden', overflow: 'hidden',
@@ -80,11 +65,11 @@ const Honkai3rdNavigator = ({ close }: Honkai3rdNavigatorProps) => {
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
px: 2, px: 2,
mb: 2, mb: 2
}} }}
> >
<Text>{locale === 'en-US' ? '🇺🇸 English(US)' : '🇰🇷 한국어'}</Text> <Text>{locale === 'en-US' ? '🇺🇸 English(US)' : '🇰🇷 한국어'}</Text>
<Icon path={mdiMenuSwap} size='20px' /> <Icon path={mdiMenuSwap} size="20px" />
</NavLink> </NavLink>
</NextLink> </NextLink>
<Box> <Box>
@@ -93,23 +78,23 @@ const Honkai3rdNavigator = ({ close }: Honkai3rdNavigatorProps) => {
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'left', justifyContent: 'left',
mb: 2, mb: 2
}} }}
> >
<Box> <Box>
<Switch <Switch
checked={colorMode === 'dark'} checked={colorMode === 'dark'}
onChange={(event) => { onChange={event => {
setColorMode(event.target.checked ? 'dark' : 'default') setColorMode(event.target.checked ? 'dark' : 'default')
}} }}
sx={{ sx={{
width: 50, width: 50,
'input ~ &': { 'input ~ &': {
backgroundColor: 'muted', backgroundColor: 'muted'
}, },
'input:checked ~ &': { 'input:checked ~ &': {
backgroundColor: 'primary', backgroundColor: 'primary'
}, }
}} }}
/> />
</Box> </Box>
@@ -122,28 +107,22 @@ const Honkai3rdNavigator = ({ close }: Honkai3rdNavigatorProps) => {
export default Honkai3rdNavigator export default Honkai3rdNavigator
type NavItemTarget = 'battlesuits' | 'stigmata' | 'weapons' | 'elfs' | 'elysian-realm' | 'media'
interface NavItemProps { interface NavItemProps {
target: target: NavItemTarget
| 'versions'
| 'battlesuits'
| 'stigmata'
| 'weapons'
| 'elfs'
| 'elysian-realm'
| 'media'
} }
const NavItem = ({ target }: NavItemProps) => { const NavItem = ({ target }: NavItemProps) => {
const { t } = useTranslation() const { t } = useTranslation()
return ( return (
<NextLink href={`/honkai3rd/${target}`} passHref> <NextLink href={getHref(target)} passHref>
<NavLink <NavLink
sx={{ sx={{
fontFamily: 'monospace', fontFamily: 'monospace',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
overflow: 'hidden', overflow: 'hidden',
p: 1, p: 1
}} }}
> >
<SquareImageBox size={30} mr={1} src={getIconByTarget(target)} /> <SquareImageBox size={30} mr={1} src={getIconByTarget(target)} />
@@ -151,7 +130,7 @@ const NavItem = ({ target }: NavItemProps) => {
sx={{ sx={{
overflow: 'hidden', overflow: 'hidden',
textOverflow: 'ellipsis', textOverflow: 'ellipsis',
whiteSpace: 'nowrap', whiteSpace: 'nowrap'
}} }}
> >
{t(`common.${target}`)} {t(`common.${target}`)}
@@ -171,3 +150,17 @@ function getIconByTarget(target: string) {
return `${assetsBucketBaseUrl}/honkai3rd/nav-icons/${target}.png` return `${assetsBucketBaseUrl}/honkai3rd/nav-icons/${target}.png`
} }
} }
function getHref(target: NavItemTarget) {
switch (target) {
case 'battlesuits':
case 'weapons':
case 'elfs':
return `/honkai3rd/v2/${target}`
case 'stigmata':
return '/honkai3rd/v2/stigmata-sets'
case 'elysian-realm':
return '/honkai3rd/v2/er'
}
return `/honkai3rd/${target}`
}
@@ -11,12 +11,7 @@ const BattlesuitCatalogItemCard = ({ battlesuit, label = false }: BattlesuitCata
return ( return (
<Box <Box
sx={{ sx={{
mb: 2, mb: 2
transform: 'scale(1)',
transition: 'transform 200ms ease-in-out',
'&:hover': {
transform: 'scale(1.05)'
}
}} }}
> >
<BattlesuitAvatarIcon battlesuit={battlesuit} /> <BattlesuitAvatarIcon battlesuit={battlesuit} />
+3 -3
View File
@@ -11,12 +11,12 @@ const starSize = 16
const StigmaIcon = ({ icon: fileName, rarity }: StigmaIconProps) => { const StigmaIcon = ({ icon: fileName, rarity }: StigmaIconProps) => {
return ( return (
<Box sx={{ width: 112 }}> <Box sx={{ width: 96 }}>
<Box <Box
sx={{ sx={{
borderRadius: 4, borderRadius: 4,
width: (128 / 8) * 7, width: (128 / 8) * 6,
height: (112 / 8) * 7, height: (112 / 8) * 6,
background: ` no-repeat 100% 100% /100% url(${assetsBucketBaseUrl}/raw/stigmataicons/${fileName}.png), ${getBackgroundByRarity( background: ` no-repeat 100% 100% /100% url(${assetsBucketBaseUrl}/raw/stigmataicons/${fileName}.png), ${getBackgroundByRarity(
rarity rarity
)}` )}`
+1 -1
View File
@@ -68,7 +68,7 @@ export function replaceNewLine(value: string) {
if (value == null) { if (value == null) {
return '' return ''
} }
return value.replace(/\\n/g, '\n') return value.replace(/\\n/g, '\n').trim()
} }
function convertToPercentage(value: number) { function convertToPercentage(value: number) {
@@ -22,125 +22,143 @@ import StarIcon from '../../../../components/v2/StarIcon'
import ChibiIcon from '../../../../components/v2/ChibiIcon' import ChibiIcon from '../../../../components/v2/ChibiIcon'
import WeaponTypeIcon from '../../../../components/v2/WeaponTypeIcon' import WeaponTypeIcon from '../../../../components/v2/WeaponTypeIcon'
import { sortBattlesuitSkill } from '../../../../lib/v2/data/utils' import { sortBattlesuitSkill } from '../../../../lib/v2/data/utils'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import { getI18NProps } from '../../../../server/i18n'
import Head from '../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
interface BattlesuitShowPageProps { interface BattlesuitShowPageProps {
battlesuit: Battlesuit battlesuit: Battlesuit
} }
const BattlesuitShowPage = ({ battlesuit }: BattlesuitShowPageProps) => { const BattlesuitShowPage = ({ battlesuit }: BattlesuitShowPageProps) => {
const { t } = useTranslation()
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">{battlesuit.fullName}</Heading> <Head
title={`${battlesuit.fullName} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
description={`${t('common.honkai-3rd')} ${t('battlesuit-show.battlesuit')} / ${battlesuit.fullName} / ${
battlesuit.attributeType
} / ${battlesuit.tags
.map(tag => {
return getTagTypeLabel(tag)
})
.join(', ')}`}
canonicalHref={`/honkai3rd/battlesuits/${battlesuit.id}`}
/>
<Box p={2}>
<Heading as="h1">{battlesuit.fullName}</Heading>
<AvatarFigureImage battlesuitId={battlesuit.id} sx={{ height: 400 }} /> <AvatarFigureImage battlesuitId={battlesuit.id} sx={{ height: 400 }} />
<Box mb={3}> <Box mb={3}>
<BattlesuitAvatarIcon battlesuit={battlesuit} /> <BattlesuitAvatarIcon battlesuit={battlesuit} />
</Box> </Box>
<Card mb={3}> <Card mb={3}>
<Flex sx={{ borderBottom: 'default', p: 1 }}> <Flex sx={{ borderBottom: 'default', p: 1 }}>
<Flex sx={{ alignItems: 'center' }}> <Flex sx={{ alignItems: 'center' }}>
<Box mr={2}> <Box mr={2}>
<StarIcon star={battlesuit.initialStar} /> <StarIcon star={battlesuit.initialStar} />
</Box> </Box>
<ChibiIcon id={battlesuit.character} /> <ChibiIcon id={battlesuit.character} />
<Box ml={1} mr={2}> <Box ml={1} mr={2}>
{getCharacterTypeLabel(battlesuit.character)} {getCharacterTypeLabel(battlesuit.character)}
</Box> </Box>
<AttributeIcon attributeType={battlesuit.attributeType} size={30} /> <AttributeIcon attributeType={battlesuit.attributeType} size={30} />
<Box ml={1} mr={2}> <Box ml={1} mr={2}>
{getAttributeLabel(battlesuit.attributeType)} {getAttributeLabel(battlesuit.attributeType)}
</Box> </Box>
<WeaponTypeIcon type={battlesuit.weapon} /> <WeaponTypeIcon type={battlesuit.weapon} />
<Box ml={1}>{getWeaponTypeLabel(battlesuit.weapon)}</Box> <Box ml={1}>{getWeaponTypeLabel(battlesuit.weapon)}</Box>
</Flex>
</Flex> </Flex>
</Flex> <Flex sx={{ p: 1 }}>
<Flex sx={{ p: 1 }}> {battlesuit.tags.map(tag => {
{battlesuit.tags.map(tag => {
return (
<Flex key={tag} sx={{ mr: 2, alignItems: 'center' }}>
<TagIcon type={tag} />
<Box ml={1}>{getTagTypeLabel(tag)}</Box>
</Flex>
)
})}
</Flex>
</Card>
<Heading as="h2">Skills</Heading>
{battlesuit.skills.sort(sortBattlesuitSkill).map(skill => {
return (
<Card key={skill.id} mb={3}>
<Box sx={{ borderBottom: 'default', p: 1 }}>
<Flex sx={{ alignItems: 'center' }}>
<AvatarSkillIcon icon={skill.icon} />
<Heading as="h3" sx={{ ml: 1, mb: 0 }}>
<FormattedText>{skill.name}</FormattedText>
</Heading>
{skill.tags.length > 0 && (
<Flex sx={{ ml: 1 }}>
{skill.tags.map((tag, index) => {
return <SkillTagItem key={index} tag={tag} />
})}
</Flex>
)}
</Flex>
<Box>{getSkillTypeLabel(skill.skillType)}</Box>
</Box>
<Box sx={{ whiteSpace: 'pre-wrap', borderBottom: 'default', p: 1 }}>
<FormattedText>{formatSkillInfo(skill)}</FormattedText>
</Box>
{skill.subSkills.map(subSkill => {
return ( return (
<Fragment key={subSkill.id}> <Flex key={tag} sx={{ mr: 2, alignItems: 'center' }}>
<Box sx={{ borderBottom: 'default', p: 1 }}> <TagIcon type={tag} />
<Flex sx={{ alignItems: 'center' }}> <Box ml={1}>{getTagTypeLabel(tag)}</Box>
<AvatarSubSkillIcon icon={subSkill.icon} /> </Flex>
<Heading as="h4" sx={{ ml: 1, mb: 0 }}>
<FormattedText>{subSkill.name}</FormattedText>
</Heading>
{subSkill.unlockStar.localeCompare(battlesuit.initialStar) > 0 && (
<Box ml={2}>
<StarIcon star={subSkill.unlockStar} />
</Box>
)}
{subSkill.tags.length > 0 && (
<Flex sx={{ ml: 2 }}>
{subSkill.tags.map((tag, index) => {
return <SkillTagItem key={index} tag={tag} />
})}
</Flex>
)}
</Flex>
</Box>
<Box
sx={{
whiteSpace: 'pre-wrap',
borderBottom: 'default',
'&:last-child': { borderBottom: 'none' },
p: 1
}}
>
<FormattedText>{formatSubSkillInfo(subSkill)}</FormattedText>
</Box>
</Fragment>
) )
})} })}
</Card> </Flex>
) </Card>
})}
{/* <pre>{JSON.stringify(battlesuit, null, 2)}</pre> */} <Heading as="h2">Skills</Heading>
</Box> {battlesuit.skills.sort(sortBattlesuitSkill).map(skill => {
return (
<Card key={skill.id} mb={3}>
<Box sx={{ borderBottom: 'default', p: 1 }}>
<Flex sx={{ alignItems: 'center' }}>
<AvatarSkillIcon icon={skill.icon} />
<Heading as="h3" sx={{ ml: 1, mb: 0 }}>
<FormattedText>{skill.name}</FormattedText>
</Heading>
{skill.tags.length > 0 && (
<Flex sx={{ ml: 1 }}>
{skill.tags.map((tag, index) => {
return <SkillTagItem key={index} tag={tag} />
})}
</Flex>
)}
</Flex>
<Box>{getSkillTypeLabel(skill.skillType)}</Box>
</Box>
<Box sx={{ whiteSpace: 'pre-wrap', borderBottom: 'default', p: 1 }}>
<FormattedText>{formatSkillInfo(skill)}</FormattedText>
</Box>
{skill.subSkills.map(subSkill => {
return (
<Fragment key={subSkill.id}>
<Box sx={{ borderBottom: 'default', p: 1 }}>
<Flex sx={{ alignItems: 'center' }}>
<AvatarSubSkillIcon icon={subSkill.icon} />
<Heading as="h4" sx={{ ml: 1, mb: 0 }}>
<FormattedText>{subSkill.name}</FormattedText>
</Heading>
{subSkill.unlockStar.localeCompare(battlesuit.initialStar) > 0 && (
<Box ml={2}>
<StarIcon star={subSkill.unlockStar} />
</Box>
)}
{subSkill.tags.length > 0 && (
<Flex sx={{ ml: 2 }}>
{subSkill.tags.map((tag, index) => {
return <SkillTagItem key={index} tag={tag} />
})}
</Flex>
)}
</Flex>
</Box>
<Box
sx={{
whiteSpace: 'pre-wrap',
borderBottom: 'default',
'&:last-child': { borderBottom: 'none' },
p: 1
}}
>
<FormattedText>{formatSubSkillInfo(subSkill)}</FormattedText>
</Box>
</Fragment>
)
})}
</Card>
)
})}
{/* <pre>{JSON.stringify(battlesuit, null, 2)}</pre> */}
</Box>
</Honkai3rdLayout>
) )
} }
@@ -150,7 +168,7 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
const battlesuit = loadBattlesuitData(params.battlesuitId) const battlesuit = loadBattlesuitData(params.battlesuitId)
return { return {
props: { battlesuit } props: { battlesuit, ...(await getI18NProps(locale)) }
} }
} }
+37 -15
View File
@@ -5,27 +5,49 @@ import { Flex, Link } from 'theme-ui'
import { loadBattlesuitCatalog } from '../../../../lib/v2/server/loadData' import { loadBattlesuitCatalog } from '../../../../lib/v2/server/loadData'
import { BattlesuitCatalogItem } from '../../../../lib/v2/data/types' import { BattlesuitCatalogItem } from '../../../../lib/v2/data/types'
import BattlesuitCatalogItemCard from '../../../../components/v2/BattlesuitCatalogItemCard' import BattlesuitCatalogItemCard from '../../../../components/v2/BattlesuitCatalogItemCard'
import Head from '../../../../components/atoms/Head'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import { useTranslation } from 'next-i18next'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
import { getI18NProps } from '../../../../server/i18n'
interface BattlesuitListPageProps { interface BattlesuitListPageProps {
battlesuitCatalog: BattlesuitCatalogItem[] battlesuitCatalog: BattlesuitCatalogItem[]
} }
const BattlesuitListPage = ({ battlesuitCatalog }: BattlesuitListPageProps) => { const BattlesuitListPage = ({ battlesuitCatalog }: BattlesuitListPageProps) => {
const { t } = useTranslation()
return ( return (
<Box> <Honkai3rdLayout>
<h1>Battlesuits</h1> <Head
<Flex sx={{ flexWrap: 'wrap' }}> title={`${t('common.battlesuits')} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
{battlesuitCatalog.map(battlesuit => { description={t('battlesuits-list.description')}
return ( canonicalHref={`/honkai3rd/battlesuits`}
<Box key={battlesuit.id}> />
<Link href={`/v2-pre/battlesuits/${battlesuit.id}`}> <Box p={2}>
<BattlesuitCatalogItemCard battlesuit={battlesuit} /> <Breadcrumb
</Link> items={[
</Box> { href: '/honkai3rd', label: t('common.honkai-3rd') },
) {
})} href: '/honkai3rd/v2/battlesuits',
</Flex> label: t('common.battlesuits')
</Box> }
]}
/>
<h1>{t('battlesuits-list.heading')}</h1>
<Flex sx={{ flexWrap: 'wrap' }}>
{battlesuitCatalog.map(battlesuit => {
return (
<Box key={battlesuit.id}>
<Link href={`/honkai3rd/v2/battlesuits/${battlesuit.id}`}>
<BattlesuitCatalogItemCard battlesuit={battlesuit} />
</Link>
</Box>
)
})}
</Flex>
</Box>
</Honkai3rdLayout>
) )
} }
@@ -35,6 +57,6 @@ export async function getStaticProps({ locale }: NextPageContext) {
const battlesuitCatalog = loadBattlesuitCatalog() const battlesuitCatalog = loadBattlesuitCatalog()
return { return {
props: { battlesuitCatalog } props: { battlesuitCatalog, ...(await getI18NProps(locale)) }
} }
} }
@@ -1,10 +1,16 @@
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { Box, Card, Flex, Heading, Image } from 'theme-ui' import { Box, Card, Flex, Heading, Image, Link } from 'theme-ui'
import AvatarFigureImage from '../../../../../components/v2/AvatarFigureImage' import AvatarFigureImage from '../../../../../components/v2/AvatarFigureImage'
import { loadBattlesuitData, loadErBattlesuit, loadErBattlesuitCatalog } from '../../../../../lib/v2/server/loadData' import { loadBattlesuitData, loadErBattlesuit, loadErBattlesuitCatalog } from '../../../../../lib/v2/server/loadData'
import { Battlesuit, ErBattlesuit, ErSignet } from '../../../../../lib/v2/data/types' import { Battlesuit, ErBattlesuit, ErSignet } from '../../../../../lib/v2/data/types'
import { Fragment, useMemo } from 'react' import { Fragment, useMemo } from 'react'
import { assetsBucketBaseUrl } from '../../../../../lib/consts' import { assetsBucketBaseUrl } from '../../../../../lib/consts'
import BattlesuitCatalogItemCard from '../../../../../components/v2/BattlesuitCatalogItemCard'
import Honkai3rdLayout from '../../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import Breadcrumb from '../../../../../components/organisms/Breadcrumb'
import { getI18NProps } from '../../../../../server/i18n'
interface BattlesuitShowPageProps { interface BattlesuitShowPageProps {
battlesuit: Battlesuit battlesuit: Battlesuit
@@ -12,6 +18,8 @@ interface BattlesuitShowPageProps {
} }
const BattlesuitShowPage = ({ battlesuit, erBattlesuit }: BattlesuitShowPageProps) => { const BattlesuitShowPage = ({ battlesuit, erBattlesuit }: BattlesuitShowPageProps) => {
const { t } = useTranslation()
const signetSets = useMemo(() => { const signetSets = useMemo(() => {
const signetSetMap = erBattlesuit.signets const signetSetMap = erBattlesuit.signets
.slice() .slice()
@@ -36,57 +44,89 @@ const BattlesuitShowPage = ({ battlesuit, erBattlesuit }: BattlesuitShowPageProp
}, [erBattlesuit.signets]) }, [erBattlesuit.signets])
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">{battlesuit.fullName}</Heading> <Head
title={`${battlesuit.fullName} (${t('common.elysian-realm')}) - ${t('common.honkai-3rd')} - ${t(
'common.abyss-lab'
)}`}
description={`${t('common.honkai-3rd')} ${t('common.elysian-realm')} ${t('battlesuit-show.battlesuit')}`}
canonicalHref={`/honkai3rd/v2/er/battlesuits/${battlesuit.id}`}
/>
<AvatarFigureImage battlesuitId={battlesuit.id} sx={{ height: 400 }} /> <Box p={2}>
<Breadcrumb
items={[
{ href: '/honkai3rd', label: t('common.honkai-3rd') },
{
href: '/honkai3rd/v2/er',
label: t('common.elysian-realm')
},
{
href: `/honkai3rd/v2/er/battlesuits/${battlesuit.id}`,
label: battlesuit.fullName
}
]}
/>
<Heading as="h2">ER Adjustments</Heading> <Heading as="h1">{battlesuit.fullName}</Heading>
<Card mb={3}> <AvatarFigureImage battlesuitId={battlesuit.id} sx={{ height: 400 }} />
{erBattlesuit.abilities.map(ability => {
<Box>
<Link href={`/battlesuits/${battlesuit.id}`}>
<BattlesuitCatalogItemCard battlesuit={battlesuit} />
</Link>
</Box>
<Heading as="h2">ER Adjustments</Heading>
<Card mb={3}>
{erBattlesuit.abilities.map(ability => {
return (
<Fragment key={ability.id}>
<Box sx={{ p: 1, borderBottom: 'default' }}>
<Heading as="h3" m={0}>
{ability.name}
</Heading>
</Box>
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>
{ability.desc}
</Box>
</Fragment>
)
})}
</Card>
<Heading as="h2">Exclusive Signets</Heading>
{signetSets.map((set, index) => {
return ( return (
<Fragment key={ability.id}> <Card key={index} mb={2}>
<Box sx={{ p: 1, borderBottom: 'default' }}> {set.map(signet => {
<Heading as="h3" m={0}> return (
{ability.name} <Fragment key={signet.id}>
</Heading> <Flex sx={{ p: 1, borderBottom: 'default', alignItems: 'center' }}>
</Box> <Image
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>{ability.desc}</Box> src={`${assetsBucketBaseUrl}/raw/supportbufficon/Elysia.png`}
</Fragment> width={30}
sx={{ flexShrink: 0 }}
alt={'Elysia'}
/>
<Heading as="h3" m={0}>
{signet.name}
</Heading>
</Flex>
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>
{signet.desc}
</Box>
</Fragment>
)
})}
</Card>
) )
})} })}
</Card> </Box>
</Honkai3rdLayout>
<Heading as="h2">Exclusive Signets</Heading>
{signetSets.map((set, index) => {
return (
<Card key={index} mb={2}>
{set.map(signet => {
return (
<Fragment key={signet.id}>
<Flex sx={{ p: 1, borderBottom: 'default', alignItems: 'center' }}>
<Image
src={`${assetsBucketBaseUrl}/raw/supportbufficon/Elysia.png`}
width={30}
sx={{ flexShrink: 0 }}
alt={'Elysia'}
/>
<Heading as="h3" m={0}>
{signet.name}
</Heading>
</Flex>
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>
{signet.desc}
</Box>
</Fragment>
)
})}
</Card>
)
})}
</Box>
) )
} }
@@ -97,7 +137,7 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
const erBattlesuit = loadErBattlesuit(params.battlesuitId) const erBattlesuit = loadErBattlesuit(params.battlesuitId)
return { return {
props: { battlesuit, erBattlesuit } props: { battlesuit, erBattlesuit, ...(await getI18NProps(locale)) }
} }
} }
+92 -65
View File
@@ -15,6 +15,11 @@ import SquareImage from '../../../../components/v2/SquareImage'
import { signetGroups } from '../../../../lib/v2/data/er' import { signetGroups } from '../../../../lib/v2/data/er'
import BattlesuitSmallIcon from '../../../../components/v2/BattlesuitSmallIcon' import BattlesuitSmallIcon from '../../../../components/v2/BattlesuitSmallIcon'
import MaterialIcon from '../../../../components/v2/MaterialIcon' import MaterialIcon from '../../../../components/v2/MaterialIcon'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../components/atoms/Head'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
import { useTranslation } from 'next-i18next'
import { getI18NProps } from '../../../../server/i18n'
interface ErPageProps { interface ErPageProps {
erBattlesuitCatalog: ErBattlesuitCatalogItem[] erBattlesuitCatalog: ErBattlesuitCatalogItem[]
@@ -24,6 +29,8 @@ interface ErPageProps {
} }
const ErPage = ({ erBattlesuitCatalog, battlesuitCatalog, erSupports, erSigils }: ErPageProps) => { const ErPage = ({ erBattlesuitCatalog, battlesuitCatalog, erSupports, erSigils }: ErPageProps) => {
const { t } = useTranslation()
const battlesuitCatalogMap = useMemo(() => { const battlesuitCatalogMap = useMemo(() => {
return battlesuitCatalog.reduce((map, item) => { return battlesuitCatalog.reduce((map, item) => {
map.set(item.id, item) map.set(item.id, item)
@@ -32,77 +39,97 @@ const ErPage = ({ erBattlesuitCatalog, battlesuitCatalog, erSupports, erSigils }
}, [battlesuitCatalog]) }, [battlesuitCatalog])
return ( return (
<Box> <Honkai3rdLayout>
<h1>Elysian Realm</h1> <Head
<Heading as="h2">Signets</Heading> title={`${t('common.elysian-realm')} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
<Flex sx={{ flexWrap: 'wrap' }}> description={t('common.elysian-realm')}
{signetGroups.map(signetGroup => { canonicalHref={`/honkai3rd/elysian-realm`}
return ( />
<Link href={`/v2-pre/er/signets/${signetGroup.id}`} key={signetGroup.id}>
<Card p={1} m={1}>
<Flex sx={{ alignItems: 'center' }}>
<SquareImage
src={`${assetsBucketBaseUrl}/raw/supportbufficon/${signetGroup.icon}.png`}
originalSize={120}
size={40}
/>
<Box p={1}>{signetGroup.name}</Box>
</Flex>
</Card>
</Link>
)
})}
</Flex>
<Heading as="h2">Battlesuits</Heading> <Box p={2}>
<Flex sx={{ flexWrap: 'wrap' }}> <Breadcrumb
{erBattlesuitCatalog.map(erBattlesuit => { items={[
const battlesuit = battlesuitCatalogMap.get(erBattlesuit.battlesuit)! { href: '/honkai3rd', label: t('common.honkai-3rd') },
return ( {
<Box key={battlesuit.id}> href: '/honkai3rd/v2/er',
<Link href={`/v2-pre/er/battlesuits/${battlesuit.id}`}> label: t('common.elysian-realm')
<BattlesuitCatalogItemCard battlesuit={battlesuit} /> }
]}
/>
<Heading as="h1">Elysian Realm</Heading>
<Heading as="h2">Signets</Heading>
<Flex sx={{ flexWrap: 'wrap', mb: 3 }}>
{signetGroups.map(signetGroup => {
return (
<Link href={`/honkai3rd/v2/er/signets/${signetGroup.id}`} key={signetGroup.id}>
<Card p={1} m={1}>
<Flex sx={{ alignItems: 'center' }}>
<SquareImage
src={`${assetsBucketBaseUrl}/raw/supportbufficon/${signetGroup.icon}.png`}
originalSize={120}
size={40}
/>
<Box p={1}>{signetGroup.name}</Box>
</Flex>
</Card>
</Link> </Link>
</Box> )
) })}
})} </Flex>
</Flex>
<Heading as="h2">Supports</Heading> <Heading as="h2">Battlesuits</Heading>
<Flex sx={{ flexWrap: 'wrap', mb: 3 }}>
{erBattlesuitCatalog.map(erBattlesuit => {
const battlesuit = battlesuitCatalogMap.get(erBattlesuit.battlesuit)!
return (
<Box key={battlesuit.id}>
<Link href={`/honkai3rd/v2/er/battlesuits/${battlesuit.id}`}>
<BattlesuitCatalogItemCard battlesuit={battlesuit} />
</Link>
</Box>
)
})}
</Flex>
<Flex sx={{ flexWrap: 'wrap' }}> <Heading as="h2">Supports</Heading>
{erSupports.map(support => {
const battlesuit = battlesuitCatalogMap.get(support)! <Flex sx={{ flexWrap: 'wrap' }}>
return ( {erSupports.map(support => {
<Box key={support}> const battlesuit = battlesuitCatalogMap.get(support)!
<Link href={`/v2-pre/er/supports#${support}`}> return (
<Box sx={{ p: 1, m: 1, width: 110 }}> <Box key={support}>
<BattlesuitSmallIcon battlesuit={battlesuit} ratio={0.8} /> <Link href={`/honkai3rd/v2/er/supports#${support}`}>
<Box sx={{ textAlign: 'center', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}> <Box sx={{ p: 1, m: 1, width: 110 }}>
{battlesuit.fullName} <BattlesuitSmallIcon battlesuit={battlesuit} ratio={0.8} />
<Box
sx={{ textAlign: 'center', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}
>
{battlesuit.fullName}
</Box>
</Box> </Box>
</Box> {/* <BattlesuitCatalogItemCard battlesuit={battlesuit} /> */}
{/* <BattlesuitCatalogItemCard battlesuit={battlesuit} /> */} </Link>
</Link> </Box>
</Box> )
) })}
})} </Flex>
</Flex>
<Heading as="h2">Sigils</Heading> <Heading as="h2">Sigils</Heading>
<Flex sx={{ flexWrap: 'wrap' }}> <Flex sx={{ flexWrap: 'wrap' }}>
{erSigils.map(sigil => { {erSigils.map(sigil => {
return ( return (
<Card key={sigil.id} p={1} m={1}> <Card key={sigil.id} p={1} m={1}>
<Link href={`/v2-pre/er/sigils#${sigil.id}`}> <Link href={`/honkai3rd/v2/er/sigils#${sigil.id}`}>
<MaterialIcon materialId={sigil.id} /> <MaterialIcon materialId={sigil.id} />
</Link> </Link>
</Card> </Card>
) )
})} })}
</Flex> </Flex>
</Box> </Box>
</Honkai3rdLayout>
) )
} }
@@ -123,6 +150,6 @@ export async function getStaticProps({ locale }: NextPageContext) {
}) })
return { return {
props: { erBattlesuitCatalog, battlesuitCatalog, erSupports, erSigils } props: { erBattlesuitCatalog, battlesuitCatalog, erSupports, erSigils, ...(await getI18NProps(locale)) }
} }
} }
+61 -30
View File
@@ -1,44 +1,75 @@
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { useTranslation } from 'next-i18next'
import { Box, Card, Flex, Heading } from 'theme-ui' import { Box, Card, Flex, Heading } from 'theme-ui'
import Head from '../../../../components/atoms/Head'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
import MaterialIcon from '../../../../components/v2/MaterialIcon' import MaterialIcon from '../../../../components/v2/MaterialIcon'
import { ErSigil } from '../../../../lib/v2/data/types' import { ErSigil } from '../../../../lib/v2/data/types'
import { loadErSigils } from '../../../../lib/v2/server/loadData' import { loadErSigils } from '../../../../lib/v2/server/loadData'
import { getI18NProps } from '../../../../server/i18n'
interface SigilsPageProps { interface SigilsPageProps {
erSigils: ErSigil[] erSigils: ErSigil[]
} }
const SigilsPage = ({ erSigils }: SigilsPageProps) => { const SigilsPage = ({ erSigils }: SigilsPageProps) => {
return ( const { t } = useTranslation()
<Box>
<Heading as="h1">ER Sigils</Heading>
<Card mb={3}> return (
{erSigils.map(sigil => { <Honkai3rdLayout>
return ( <Head
<Flex title={`${t('elysian-realm.remembrance-sigil')} (${t('common.elysian-realm')}) - ${t(
key={sigil.id} 'common.honkai-3rd'
sx={{ )} - ${t('common.abyss-lab')}`}
borderBottom: 'default', description={`${t('common.elysian-realm')} ${t('elysian-realm.supports')}`}
'&:last-child': { canonicalHref={`/honkai3rd/v2/er/sigils`}
borderBottom: 'none' />
}
}} <Box p={2}>
> <Breadcrumb
<Box sx={{ p: 1, flexShrink: 0, borderRight: 'default' }}> items={[
<MaterialIcon materialId={sigil.id} /> { href: '/honkai3rd', label: t('common.honkai-3rd') },
</Box> {
<Box sx={{ flexGrow: 1 }}> href: '/honkai3rd/v2/er',
<Heading as="h3" sx={{ m: 0, p: 1, borderBottom: 'default' }} id={sigil.id}> label: t('common.elysian-realm')
{sigil.name} },
</Heading> {
<Box p={1}>{sigil.desc}</Box> href: '/honkai3rd/v2/er/sigils',
</Box> label: t('elysian-realm.remembrance-sigil')
</Flex> }
) ]}
})} />
</Card>
</Box> <Heading as="h1">ER Sigils</Heading>
<Card mb={3}>
{erSigils.map(sigil => {
return (
<Flex
key={sigil.id}
sx={{
borderBottom: 'default',
'&:last-child': {
borderBottom: 'none'
}
}}
>
<Box sx={{ p: 1, flexShrink: 0, borderRight: 'default' }}>
<MaterialIcon materialId={sigil.id} />
</Box>
<Box sx={{ flexGrow: 1 }}>
<Heading as="h3" sx={{ m: 0, p: 1, borderBottom: 'default' }} id={sigil.id}>
{sigil.name}
</Heading>
<Box p={1}>{sigil.desc}</Box>
</Box>
</Flex>
)
})}
</Card>
</Box>
</Honkai3rdLayout>
) )
} }
@@ -48,6 +79,6 @@ export async function getStaticProps({ locale }: NextPageContext) {
const erSigils = loadErSigils() const erSigils = loadErSigils()
return { return {
props: { erSigils } props: { erSigils, ...(await getI18NProps(locale)) }
} }
} }
+63 -32
View File
@@ -7,6 +7,11 @@ import { assetsBucketBaseUrl } from '../../../../../lib/consts'
import { signetGroups } from '../../../../../lib/v2/data/er' import { signetGroups } from '../../../../../lib/v2/data/er'
import SquareImage from '../../../../../components/v2/SquareImage' import SquareImage from '../../../../../components/v2/SquareImage'
import { getErSignetTypeLabel } from '../../../../../lib/v2/data/text' import { getErSignetTypeLabel } from '../../../../../lib/v2/data/text'
import Honkai3rdLayout from '../../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import Breadcrumb from '../../../../../components/organisms/Breadcrumb'
import { getI18NProps } from '../../../../../server/i18n'
interface BattlesuitShowPageProps { interface BattlesuitShowPageProps {
group: ErSignetGroup group: ErSignetGroup
@@ -14,6 +19,8 @@ interface BattlesuitShowPageProps {
} }
const BattlesuitShowPage = ({ signets, group }: BattlesuitShowPageProps) => { const BattlesuitShowPage = ({ signets, group }: BattlesuitShowPageProps) => {
const { t } = useTranslation()
const signetSets = useMemo(() => { const signetSets = useMemo(() => {
const signetSetMap = signets.reduce<Map<string, ErSignet[]>>((map, signet) => { const signetSetMap = signets.reduce<Map<string, ErSignet[]>>((map, signet) => {
const [id1, _id2] = signet.id.split('-') const [id1, _id2] = signet.id.split('-')
@@ -28,41 +35,65 @@ const BattlesuitShowPage = ({ signets, group }: BattlesuitShowPageProps) => {
return [...signetSetMap.values()] return [...signetSetMap.values()]
}, [signets]) }, [signets])
return (
<Box>
<Heading as="h1">{group.name}</Heading>
{signetSets.map((set, index) => { return (
return ( <Honkai3rdLayout>
<Card key={index} mb={2}> <Head
{set.map(signet => { title={`${group.name} ${t('elysian-realm.signets')} (${t('common.elysian-realm')}) - ${t(
return ( 'common.honkai-3rd'
<Fragment key={signet.id}> )} - ${t('common.abyss-lab')}`}
<Flex sx={{ p: 1, borderBottom: 'default', alignItems: 'center' }}> description={`${t('common.honkai-3rd')} ${group.name} ${t('elysian-realm.signets')}`}
<SquareImage canonicalHref={`/honkai3rd/elysian-realm/signets/${group.id}`}
src={`${assetsBucketBaseUrl}/raw/supportbufficon/${group.icon}.png`} />
size={30}
originalSize={120} <Box p={2}>
/> <Breadcrumb
<Heading as="h3" my={0} ml={1}> items={[
{signet.name} { href: '/honkai3rd', label: t('common.honkai-3rd') },
</Heading> {
<Box sx={{ ml: 12, color: 'textMuted' }}>{getErSignetTypeLabel(signet.quality)}</Box> href: '/honkai3rd/v2/er',
</Flex> label: t('common.elysian-realm')
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}> },
{signet.desc} {
</Box> href: `/honkai3rd/v2/er/signets/${group.id}`,
</Fragment> label: group.name
) }
})} ]}
</Card> />
) <Heading as="h1">{group.name}</Heading>
})}
{/* {signetSets.map((set, index) => {
return (
<Card key={index} mb={2}>
{set.map(signet => {
return (
<Fragment key={signet.id}>
<Flex sx={{ p: 1, borderBottom: 'default', alignItems: 'center' }}>
<SquareImage
src={`${assetsBucketBaseUrl}/raw/supportbufficon/${group.icon}.png`}
size={30}
originalSize={120}
/>
<Heading as="h3" my={0} ml={1}>
{signet.name}
</Heading>
<Box sx={{ ml: 12, color: 'textMuted' }}>{getErSignetTypeLabel(signet.quality)}</Box>
</Flex>
<Box sx={{ p: 1, borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>
{signet.desc}
</Box>
</Fragment>
)
})}
</Card>
)
})}
{/*
<pre> <pre>
<code>{JSON.stringify(signets, null, 2)}</code> <code>{JSON.stringify(signets, null, 2)}</code>
</pre> */} </pre> */}
</Box> </Box>
</Honkai3rdLayout>
) )
} }
@@ -73,7 +104,7 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
const group = signetGroups.find(group => group.id === params.groupId) const group = signetGroups.find(group => group.id === params.groupId)
return { return {
props: { signets, group } props: { signets, group, ...(await getI18NProps(locale)) }
} }
} }
+55 -25
View File
@@ -1,9 +1,14 @@
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { useTranslation } from 'next-i18next'
import { useMemo } from 'react' import { useMemo } from 'react'
import { Box, Card, Flex, Heading } from 'theme-ui' import { Box, Card, Flex, Heading } from 'theme-ui'
import Head from '../../../../components/atoms/Head'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
import BattlesuitSmallIcon from '../../../../components/v2/BattlesuitSmallIcon' import BattlesuitSmallIcon from '../../../../components/v2/BattlesuitSmallIcon'
import { BattlesuitCatalogItem, ErSupportBattlesuit } from '../../../../lib/v2/data/types' import { BattlesuitCatalogItem, ErSupportBattlesuit } from '../../../../lib/v2/data/types'
import { loadBattlesuitCatalog, loadErSupports } from '../../../../lib/v2/server/loadData' import { loadBattlesuitCatalog, loadErSupports } from '../../../../lib/v2/server/loadData'
import { getI18NProps } from '../../../../server/i18n'
interface SupportsPageProps { interface SupportsPageProps {
battlesuitCatalog: BattlesuitCatalogItem[] battlesuitCatalog: BattlesuitCatalogItem[]
@@ -15,6 +20,8 @@ const SupportsPage = ({
erSupports erSupports
}: SupportsPageProps) => { }: SupportsPageProps) => {
const { t } = useTranslation()
const battlesuitCatalogMap = useMemo(() => { const battlesuitCatalogMap = useMemo(() => {
return battlesuitCatalog.reduce((map, item) => { return battlesuitCatalog.reduce((map, item) => {
map.set(item.id, item) map.set(item.id, item)
@@ -22,32 +29,55 @@ const SupportsPage = ({
}, new Map<string, BattlesuitCatalogItem>()) }, new Map<string, BattlesuitCatalogItem>())
}, [battlesuitCatalog]) }, [battlesuitCatalog])
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">ER Supports</Heading> <Head
title={`${t('elysian-realm.supports')} (${t('common.elysian-realm')}) - ${t('common.honkai-3rd')} - ${t(
'common.abyss-lab'
)}`}
description={`${t('common.elysian-realm')} ${t('elysian-realm.supports')}`}
canonicalHref={`/honkai3rd/elysian-realm/support-battlesuits`}
/>
<Card mb={3}> <Box p={2}>
{erSupports.map(support => { <Breadcrumb
const battlesuit = battlesuitCatalogMap.get(support.battlesuit)! items={[
return ( { href: '/honkai3rd', label: t('common.honkai-3rd') },
<Flex key={support.battlesuit} sx={{ borderBottom: 'default' }}> {
<Box sx={{ flexShrink: 0, p: 1, borderRight: 'default' }}> href: '/honkai3rd/v2/er',
<BattlesuitSmallIcon battlesuit={battlesuit} ratio={0.8} /> label: t('common.elysian-realm')
</Box> },
<Box> {
<Flex sx={{ p: 1, borderBottom: 'default', flexGrow: 1 }}> href: '/honkai3rd/v2/er/supports',
<Heading as="h3" sx={{ m: 0 }} id={support.battlesuit}> label: t('elysian-realm.supports')
{support.name} }
</Heading> ]}
/>
<Heading as="h1">ER Supports</Heading>
<Box sx={{ ml: 1, color: 'textMuted' }}>(CD {support.cd}s)</Box> <Card mb={3}>
</Flex> {erSupports.map(support => {
<Box p={1}>{support.desc}</Box> const battlesuit = battlesuitCatalogMap.get(support.battlesuit)!
</Box> return (
</Flex> <Flex key={support.battlesuit} sx={{ borderBottom: 'default' }}>
) <Box sx={{ flexShrink: 0, p: 1, borderRight: 'default' }}>
})} <BattlesuitSmallIcon battlesuit={battlesuit} ratio={0.8} />
</Card> </Box>
</Box> <Box>
<Flex sx={{ p: 1, borderBottom: 'default', flexGrow: 1 }}>
<Heading as="h3" sx={{ m: 0 }} id={support.battlesuit}>
{support.name}
</Heading>
<Box sx={{ ml: 1, color: 'textMuted' }}>(CD {support.cd}s)</Box>
</Flex>
<Box p={1}>{support.desc}</Box>
</Box>
</Flex>
)
})}
</Card>
</Box>
</Honkai3rdLayout>
) )
} }
@@ -58,6 +88,6 @@ export async function getStaticProps({ locale }: NextPageContext) {
const erSupports = loadErSupports() const erSupports = loadErSupports()
return { return {
props: { battlesuitCatalog, erSupports } props: { battlesuitCatalog, erSupports, ...(await getI18NProps(locale)) }
} }
} }
@@ -7,6 +7,11 @@ import { RootStigma, StigmataSet } from '../../../../lib/v2/data/types'
import { Fragment } from 'react' import { Fragment } from 'react'
import StigmaIcon from '../../../../components/v2/StigmaIcon' import StigmaIcon from '../../../../components/v2/StigmaIcon'
import StigmaFigureImage from '../../../../components/v2/StigmaFigureImage' import StigmaFigureImage from '../../../../components/v2/StigmaFigureImage'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import { getI18NProps } from '../../../../server/i18n'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
interface StigmataSetShowPage { interface StigmataSetShowPage {
stigmataSet: StigmataSet stigmataSet: StigmataSet
@@ -14,137 +19,167 @@ interface StigmataSetShowPage {
} }
const StigmataSetShowPage = ({ stigmataSet, stigmata }: StigmataSetShowPage) => { const StigmataSetShowPage = ({ stigmataSet, stigmata }: StigmataSetShowPage) => {
const { t } = useTranslation()
const rarity = stigmata[0].stigmata[0].maxRarity
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">{stigmataSet.name}</Heading> <Head
<Card mb={3}> title={`${stigmataSet.name} ${t('stigmata-show.stigmata-set')} - ${t('common.honkai-3rd')} - ${t(
{stigmata.map(rootStigma => { 'common.abyss-lab'
const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1] )}`}
return ( description={`${t('common.honkai-3rd')} ${t('stigmata-show.stigmata-set')} / ${'⭐'.repeat(rarity)} / ${
<> stigmataSet.name
<Flex sx={{ borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}> }`}
<Box sx={{ flexShrink: 0, borderRight: 'default', p: 1 }}> canonicalHref={`/honkai3rd/v2/stigmata-sets/${stigmataSet.id}-set`}
<StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.rarity} /> />
</Box>
<Box sx={{ flexGrow: 1 }}>
<Flex sx={{ borderBottom: 'default', alignItems: 'center', p: 1 }}>
<Heading
as="h3"
sx={{
my: 1
}}
>
<Link href={`/v2-pre/stigmata/${rootStigma.id}`}>{stigma.name}</Link>
</Heading>
</Flex>
<Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}> <Box p={2}>
<Box> <Breadcrumb
HP : {Math.floor(stigma.hpBase + stigma.hpAdd * (stigma.maxLv - 1))} / ATK :{' '} items={[
{Math.floor(stigma.attackBase + stigma.attackAdd * (stigma.maxLv - 1))} / DEF :{' '} { href: '/honkai3rd', label: t('common.honkai-3rd') },
{Math.floor(stigma.defenceBase + stigma.defenceAdd * (stigma.maxLv - 1))} / CRT :{' '} {
{Math.floor(stigma.criticalBase + stigma.criticalAdd * (stigma.maxLv - 1))} (at Max Lv{' '} href: {
{stigma.maxLv}) pathname: `/honkai3rd/v2/stigmata-sets`
</Box> },
</Flex> label: t('common.stigmata-set')
{stigma.skills.map(skill => { },
return ( {
<Fragment key={skill.id}> href: `/honkai3rd/v2/stigmata-sets/${stigmataSet.id}-set`,
<Box sx={{ borderBottom: 'default', p: 1 }}> label: stigmataSet.name
<Heading }
as="h3" ]}
/>
<Heading as="h1">{stigmataSet.name}</Heading>
<Card mb={3}>
{stigmata.map(rootStigma => {
const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1]
return (
<>
<Flex sx={{ borderBottom: 'default', '&:last-child': { borderBottom: 'none' } }}>
<Box sx={{ flexShrink: 0, borderRight: 'default', p: 1 }}>
<StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.rarity} />
</Box>
<Box sx={{ flexGrow: 1 }}>
<Flex sx={{ borderBottom: 'default', alignItems: 'center', p: 1 }}>
<Heading
as="h3"
sx={{
my: 1
}}
>
<Link href={`/honkai3rd/v2/stigmata/${rootStigma.id}`}>{stigma.name}</Link>
</Heading>
</Flex>
<Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}>
<Box>
HP : {Math.floor(stigma.hpBase + stigma.hpAdd * (stigma.maxLv - 1))} / ATK :{' '}
{Math.floor(stigma.attackBase + stigma.attackAdd * (stigma.maxLv - 1))} / DEF :{' '}
{Math.floor(stigma.defenceBase + stigma.defenceAdd * (stigma.maxLv - 1))} / CRT :{' '}
{Math.floor(stigma.criticalBase + stigma.criticalAdd * (stigma.maxLv - 1))} (at Max Lv{' '}
{stigma.maxLv})
</Box>
</Flex>
{stigma.skills.map(skill => {
return (
<Fragment key={skill.id}>
<Box sx={{ borderBottom: 'default', p: 1 }}>
<Heading
as="h3"
sx={{
mx: 0,
my: 1
}}
>
{skill.name}
</Heading>
</Box>
<Box
sx={{ sx={{
mx: 0, p: 1,
my: 1 borderBottom: 'default',
'&:last-child': {
borderBottom: 'none'
}
}} }}
> >
{skill.name} <FormattedText>
</Heading> {formatSubSkillInfo({
</Box> info: skill.info,
<Box maxLv: stigma.maxLv,
sx={{ paramBase1: skill.param1,
p: 1, paramBase2: skill.param2,
borderBottom: 'default', paramBase3: skill.param3,
'&:last-child': { paramAdd1: skill.param1Add,
borderBottom: 'none' paramAdd2: skill.param2Add,
} paramAdd3: skill.param3Add
}} })}
> </FormattedText>
<FormattedText> </Box>
{formatSubSkillInfo({ </Fragment>
info: skill.info, )
maxLv: stigma.maxLv, })}
paramBase1: skill.param1, </Box>
paramBase2: skill.param2, </Flex>
paramBase3: skill.param3, </>
paramAdd1: skill.param1Add, )
paramAdd2: skill.param2Add, })}
paramAdd3: skill.param3Add </Card>
})}
</FormattedText>
</Box>
</Fragment>
)
})}
</Box>
</Flex>
</>
)
})}
</Card>
<Card mb={3}> <Card mb={3}>
{stigmataSet.skills.map((skill, index) => { {stigmataSet.skills.map((skill, index) => {
return ( return (
<Fragment key={skill.id}> <Fragment key={skill.id}>
<Box sx={{ borderBottom: 'default' }}> <Box sx={{ borderBottom: 'default' }}>
<Heading <Heading
as="h3" as="h3"
sx={{
p: 1,
m: 1
}}
>
{skill.name} <small>{index + 2}</small>
</Heading>
</Box>
<Box
sx={{ sx={{
p: 1, p: 1,
m: 1 borderBottom: 'default',
'&:last-child': {
borderBottom: 'none'
}
}} }}
> >
{skill.name} <small>{index + 2}</small> <FormattedText>
</Heading> {formatSubSkillInfo({
</Box> info: skill.info,
<Box maxLv: 1,
sx={{ paramBase1: skill.param1,
p: 1, paramBase2: skill.param2,
borderBottom: 'default', paramBase3: skill.param3,
'&:last-child': { paramAdd1: skill.param1Add,
borderBottom: 'none' paramAdd2: skill.param2Add,
} paramAdd3: skill.param3Add
}} })}
> </FormattedText>
<FormattedText> </Box>
{formatSubSkillInfo({ </Fragment>
info: skill.info, )
maxLv: 1, })}
paramBase1: skill.param1, </Card>
paramBase2: skill.param2,
paramBase3: skill.param3,
paramAdd1: skill.param1Add,
paramAdd2: skill.param2Add,
paramAdd3: skill.param3Add
})}
</FormattedText>
</Box>
</Fragment>
)
})}
</Card>
<Heading>Images</Heading> <Heading>Images</Heading>
<Box mb={3}> <Box mb={3}>
{stigmata.map(rootStigma => { {stigmata.map(rootStigma => {
const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1] const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1]
return <StigmaFigureImage key={stigma.id} stigma={stigma} size={480} /> return <StigmaFigureImage key={stigma.id} stigma={stigma} size={480} />
})} })}
</Box>
{/* <pre>{JSON.stringify(stigmataSet, null, 2)}</pre> */}
</Box> </Box>
</Honkai3rdLayout>
{/* <pre>{JSON.stringify(stigmataSet, null, 2)}</pre> */}
</Box>
) )
} }
@@ -159,7 +194,8 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
return { return {
props: { props: {
stigmataSet, stigmataSet,
stigmata stigmata,
...(await getI18NProps(locale))
} }
} }
} }
+75 -51
View File
@@ -1,69 +1,93 @@
/** @jsxImportSource theme-ui */ /** @jsxImportSource theme-ui */
import { Box, Card } from '@theme-ui/components' import { Box, Card, Heading } from '@theme-ui/components'
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { Flex, Link } from 'theme-ui' import { Flex, Link } from 'theme-ui'
import { StigmataSetCatalogItem } from '../../../../lib/v2/data/types' import { StigmataSetCatalogItem } from '../../../../lib/v2/data/types'
import { loadStigmataSetCatalog } from '../../../../lib/v2/server/loadData' import { loadStigmataSetCatalog } from '../../../../lib/v2/server/loadData'
import StigmaIcon from '../../../../components/v2/StigmaIcon' import StigmaIcon from '../../../../components/v2/StigmaIcon'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import { getI18NProps } from '../../../../server/i18n'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
interface StigmataSetListPageProps { interface StigmataSetListPageProps {
stigmataSetCatalog: StigmataSetCatalogItem[] stigmataSetCatalog: StigmataSetCatalogItem[]
} }
const StigmataSetListPage = ({ stigmataSetCatalog }: StigmataSetListPageProps) => { const StigmataSetListPage = ({ stigmataSetCatalog }: StigmataSetListPageProps) => {
const { t } = useTranslation()
return ( return (
<Box> <Honkai3rdLayout>
<h1>Stigmata (Set)</h1> <Head
<Flex sx={{ flexWrap: 'wrap' }}> title={`${t('common.stigmata')} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
{stigmataSetCatalog description={t('stigmata-set-list.description')}
.sort((a, b) => { canonicalHref={`/honkai3rd/v2/stigmata`}
const aId = getId(a.id) />
const bId = getId(b.id) <Box p={2}>
return bId - aId <Breadcrumb
items={[
{ href: '/honkai3rd', label: t('common.honkai-3rd') },
{ href: '/honkai3rd/v2/stigmata-sets', label: t('common.stigmata-set') }
]}
/>
<Heading as="h1">{t('stigmata-set-list.stigmata-set')}</Heading>
function getId(id: string): number { <Box mb={3}>
if (id === '1290') { <Link href="/honkai3rd/v2/stigmata">{t('stigmata-set-list.show-signle-list')}</Link>
return 129.5 </Box>
<Flex sx={{ flexWrap: 'wrap' }}>
{stigmataSetCatalog
.sort((a, b) => {
const aId = getId(a.id)
const bId = getId(b.id)
return bId - aId
function getId(id: string): number {
if (id === '1290') {
return 129.5
}
if (id === '132') {
return 0.2
}
if (id === '120') {
return 0.1
}
return parseInt(id)
} }
if (id === '132') { })
return 0.2 .map(stigmataSet => {
} return (
if (id === '120') { <Box key={stigmataSet.id} m={1}>
return 0.1 <Link href={`/honkai3rd/v2/stigmata-sets/${stigmataSet.id}`}>
} <Card p={1}>
return parseInt(id) <Flex sx={{ justifyContent: 'center' }}>
} {stigmataSet.stigmataList.map(stigma => {
}) return <StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.maxRarity} />
.map(stigmataSet => { })}
return ( </Flex>
<Box key={stigmataSet.id} m={2}> <Box
<Link href={`/v2-pre/stigmata-sets/${stigmataSet.id}`}> sx={{
<Card p={1}> overflow: 'hidden',
<Flex sx={{ justifyContent: 'center' }}> textOverflow: 'ellipsis',
{stigmataSet.stigmataList.map(stigma => { whiteSpace: 'nowrap',
return <StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.maxRarity} /> px: 1,
})} textAlign: 'center'
</Flex> }}
<Box >
sx={{ {stigmataSet.name}
overflow: 'hidden', </Box>
textOverflow: 'ellipsis', {/* {stigma.id} */}
whiteSpace: 'nowrap', </Card>
px: 1, </Link>
textAlign: 'center' </Box>
}} )
> })}
{stigmataSet.name} </Flex>
</Box> </Box>
{/* {stigma.id} */} </Honkai3rdLayout>
</Card>
</Link>
</Box>
)
})}
</Flex>
</Box>
) )
} }
@@ -73,6 +97,6 @@ export async function getStaticProps({ locale }: NextPageContext) {
const stigmataSetCatalog = loadStigmataSetCatalog() const stigmataSetCatalog = loadStigmataSetCatalog()
return { return {
props: { stigmataSetCatalog } props: { stigmataSetCatalog, ...(await getI18NProps(locale)) }
} }
} }
+123 -92
View File
@@ -9,6 +9,11 @@ import { getStigmaTypeLabel } from '../../../../lib/v2/data/text'
import StigmaTypeIcon from '../../../../components/v2/StigmaTypeIcon' import StigmaTypeIcon from '../../../../components/v2/StigmaTypeIcon'
import StigmaIcon from '../../../../components/v2/StigmaIcon' import StigmaIcon from '../../../../components/v2/StigmaIcon'
import StigmaFigureImage from '../../../../components/v2/StigmaFigureImage' import StigmaFigureImage from '../../../../components/v2/StigmaFigureImage'
import { getI18NProps } from '../../../../server/i18n'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
interface StigmaShowPageProps { interface StigmaShowPageProps {
rootStigma: RootStigma rootStigma: RootStigma
@@ -16,109 +21,135 @@ interface StigmaShowPageProps {
} }
const StigmaShowPage = ({ rootStigma, stigmataSetCatalogItem }: StigmaShowPageProps) => { const StigmaShowPage = ({ rootStigma, stigmataSetCatalogItem }: StigmaShowPageProps) => {
const { t } = useTranslation()
const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1] const stigma = rootStigma.stigmata[rootStigma.stigmata.length - 1]
const atk = Math.floor(stigma.attackBase + stigma.attackAdd * (stigma.maxLv - 1))
const hp = Math.floor(stigma.hpBase + stigma.hpAdd * (stigma.maxLv - 1))
const def = Math.floor(stigma.defenceBase + stigma.defenceAdd * (stigma.maxLv - 1))
const crt = Math.floor(stigma.criticalBase + stigma.criticalAdd * (stigma.maxLv - 1))
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">{stigma.name}</Heading> <Head
title={`${stigma.name} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
description={`${t('common.honkai-3rd')} ${t('stigmata-show.stigmata')} /
${'⭐'.repeat(stigma.rarity)} / ${t(
`stigmata-show.${stigma.type}`
)} / HP : ${hp} / ATK : ${atk} / DEF : ${def} / CRT : ${crt}`}
canonicalHref={`/honkai3rd/stigmata/${stigma.id}`}
/>
<Box p={2}>
<Breadcrumb
items={[
{ href: '/honkai3rd', label: t('common.honkai-3rd') },
{ href: '/honkai3rd/v2/stigmata', label: t('common.stigmata') },
{
href: `/honkai3rd/v2/stigmata/${stigma.id}`,
label: stigma.name
}
]}
/>
<Box sx={{ display: ['none', 'none', 'block'] }}> <Heading as="h1">{stigma.name}</Heading>
<StigmaFigureImage stigma={stigma} size={720} />
</Box>
<Box sx={{ display: ['block', 'block', 'none'] }}>
<StigmaFigureImage stigma={stigma} size={480} />
</Box>
<Box mb={3}> <Box sx={{ display: ['none', 'none', 'block'] }}>
<StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.rarity} /> <StigmaFigureImage stigma={stigma} size={720} />
</Box> </Box>
<Box sx={{ display: ['block', 'block', 'none'] }}>
<Card mb={3}> <StigmaFigureImage stigma={stigma} size={480} />
<Box sx={{ p: 1, borderBottom: 'default' }}>{replaceNewLine(stigma.description)}</Box>
<Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}>
<StigmaTypeIcon type={stigma.type} />
<Box ml={1}>{getStigmaTypeLabel(stigma.type)}</Box>
</Flex>
<Box sx={{ p: 1 }}>
HP : {Math.floor(stigma.hpBase + stigma.hpAdd * (stigma.maxLv - 1))} / ATK :{' '}
{Math.floor(stigma.attackBase + stigma.attackAdd * (stigma.maxLv - 1))} / DEF :{' '}
{Math.floor(stigma.defenceBase + stigma.defenceAdd * (stigma.maxLv - 1))} / CRT :{' '}
{Math.floor(stigma.criticalBase + stigma.criticalAdd * (stigma.maxLv - 1))} (at Max Lv {stigma.maxLv})
</Box> </Box>
</Card>
<Heading as="h2">Skills</Heading> <Box mb={3}>
<Card mb={3}> <StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.rarity} />
{stigma.skills.map(skill => { </Box>
return (
<Fragment key={skill.id}>
<Box sx={{ borderBottom: 'default' }}>
<Heading
as="h3"
sx={{
p: 1,
m: 1
}}
>
{skill.name}
</Heading>
</Box>
<Box
sx={{
p: 1,
borderBottom: 'default',
'&:last-child': {
borderBottom: 'none'
}
}}
>
<FormattedText>
{formatSubSkillInfo({
info: skill.info,
maxLv: stigma.maxLv,
paramBase1: skill.param1,
paramBase2: skill.param2,
paramBase3: skill.param3,
paramAdd1: skill.param1Add,
paramAdd2: skill.param2Add,
paramAdd3: skill.param3Add
})}
</FormattedText>
</Box>
</Fragment>
)
})}
</Card>
{stigmataSetCatalogItem != null && ( <Card mb={3}>
<> <Box sx={{ p: 1, borderBottom: 'default' }}>{replaceNewLine(stigma.description)}</Box>
<Heading as="h2">Set</Heading> <Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}>
<Flex key={stigmataSetCatalogItem.id}> <StigmaTypeIcon type={stigma.type} />
<Link href={`/v2-pre/stigmata-sets/${stigmataSetCatalogItem.id}`}> <Box ml={1}>{getStigmaTypeLabel(stigma.type)}</Box>
<Card p={1}> </Flex>
<Flex sx={{ justifyContent: 'center' }}> <Box sx={{ p: 1 }}>
{stigmataSetCatalogItem.stigmataList.map(stigma => { HP : {hp} / ATK : {atk} / DEF : {def} / CRT : {crt} (at Max Lv {stigma.maxLv})
return <StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.maxRarity} /> </Box>
})} </Card>
</Flex>
<Heading as="h2">Skills</Heading>
<Card mb={3}>
{stigma.skills.map(skill => {
return (
<Fragment key={skill.id}>
<Box sx={{ borderBottom: 'default' }}>
<Heading
as="h3"
sx={{
p: 1,
m: 1
}}
>
{skill.name}
</Heading>
</Box>
<Box <Box
sx={{ sx={{
overflow: 'hidden', p: 1,
textOverflow: 'ellipsis', borderBottom: 'default',
whiteSpace: 'nowrap', '&:last-child': {
px: 1, borderBottom: 'none'
textAlign: 'center' }
}} }}
> >
{stigmataSetCatalogItem.name} <FormattedText>
{formatSubSkillInfo({
info: skill.info,
maxLv: stigma.maxLv,
paramBase1: skill.param1,
paramBase2: skill.param2,
paramBase3: skill.param3,
paramAdd1: skill.param1Add,
paramAdd2: skill.param2Add,
paramAdd3: skill.param3Add
})}
</FormattedText>
</Box> </Box>
{/* {stigma.id} */} </Fragment>
</Card> )
</Link> })}
</Flex> </Card>
</>
)} {stigmataSetCatalogItem != null && (
{/* <pre>{JSON.stringify(weapon, null, 2)}</pre> */} <>
</Box> <Heading as="h2">Set</Heading>
<Flex key={stigmataSetCatalogItem.id}>
<Link href={`/v2-pre/stigmata-sets/${stigmataSetCatalogItem.id}`}>
<Card p={1}>
<Flex sx={{ justifyContent: 'center' }}>
{stigmataSetCatalogItem.stigmataList.map(stigma => {
return <StigmaIcon key={stigma.id} icon={stigma.icon} rarity={stigma.maxRarity} />
})}
</Flex>
<Box
sx={{
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
px: 1,
textAlign: 'center'
}}
>
{stigmataSetCatalogItem.name}
</Box>
{/* {stigma.id} */}
</Card>
</Link>
</Flex>
</>
)}
{/* <pre>{JSON.stringify(weapon, null, 2)}</pre> */}
</Box>
</Honkai3rdLayout>
) )
} }
@@ -148,7 +179,7 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
} }
return { return {
props: { rootStigma, stigmataSetCatalogItem } props: { rootStigma, stigmataSetCatalogItem, ...(await getI18NProps(locale)) }
} }
} }
+41 -36
View File
@@ -1,11 +1,13 @@
/** @jsxImportSource theme-ui */ /** @jsxImportSource theme-ui */
import { Box, Card } from '@theme-ui/components' import { Box, Card, Heading } from '@theme-ui/components'
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { Flex, Link } from 'theme-ui' import { Flex, Link } from 'theme-ui'
import { StigmataCatalogItem } from '../../../../lib/v2/data/types' import { StigmataCatalogItem } from '../../../../lib/v2/data/types'
import { loadStigmataCatalog } from '../../../../lib/v2/server/loadData' import { loadStigmataCatalog } from '../../../../lib/v2/server/loadData'
import StigmaIcon from '../../../../components/v2/StigmaIcon' import StigmaIcon from '../../../../components/v2/StigmaIcon'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import { getI18NProps } from '../../../../server/i18n'
interface StigmataListPageProps { interface StigmataListPageProps {
stigmataCatalog: StigmataCatalogItem[] stigmataCatalog: StigmataCatalogItem[]
@@ -13,40 +15,43 @@ interface StigmataListPageProps {
const StigmataListPage = ({ stigmataCatalog }: StigmataListPageProps) => { const StigmataListPage = ({ stigmataCatalog }: StigmataListPageProps) => {
return ( return (
<Box> <Honkai3rdLayout>
<h1>Stigmata (Single)</h1> <Box>
<Flex sx={{ flexWrap: 'wrap' }}> <Heading as="h1">Stigmata (Single)</Heading>
{stigmataCatalog
.filter(filterStigmata) <Flex sx={{ flexWrap: 'wrap' }}>
.sort(sortStigmata) {stigmataCatalog
.map(stigma => { .filter(filterStigmata)
return ( .sort(sortStigmata)
<Box key={stigma.id} m={2}> .map(stigma => {
<Link href={`/v2-pre/stigmata/${stigma.id}`}> return (
<Card p={1}> <Box key={stigma.id} m={2}>
<Flex sx={{ justifyContent: 'center' }}> <Link href={`/v2-pre/stigmata/${stigma.id}`}>
<StigmaIcon icon={stigma.icon} rarity={stigma.maxRarity} /> <Card p={1}>
</Flex> <Flex sx={{ justifyContent: 'center' }}>
<Box <StigmaIcon icon={stigma.icon} rarity={stigma.maxRarity} />
sx={{ </Flex>
overflow: 'hidden', <Box
textOverflow: 'ellipsis', sx={{
whiteSpace: 'nowrap', overflow: 'hidden',
px: 1, textOverflow: 'ellipsis',
width: 112, whiteSpace: 'nowrap',
textAlign: 'center' px: 1,
}} width: 112,
> textAlign: 'center'
{stigma.name} }}
</Box> >
{/* {stigma.id} */} {stigma.name}
</Card> </Box>
</Link> {/* {stigma.id} */}
</Box> </Card>
) </Link>
})} </Box>
</Flex> )
</Box> })}
</Flex>
</Box>
</Honkai3rdLayout>
) )
} }
@@ -56,7 +61,7 @@ export async function getStaticProps({ locale }: NextPageContext) {
const stigmataCatalog = loadStigmataCatalog() const stigmataCatalog = loadStigmataCatalog()
return { return {
props: { stigmataCatalog } props: { stigmataCatalog, ...(await getI18NProps(locale)) }
} }
} }
+83 -56
View File
@@ -8,77 +8,104 @@ import { Fragment } from 'react'
import { getWeaponTypeLabel } from '../../../../lib/v2/data/text' import { getWeaponTypeLabel } from '../../../../lib/v2/data/text'
import WeaponTypeIcon from '../../../../components/v2/WeaponTypeIcon' import WeaponTypeIcon from '../../../../components/v2/WeaponTypeIcon'
import WeaponIcon from '../../../../components/v2/WeaponIcon' import WeaponIcon from '../../../../components/v2/WeaponIcon'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import Head from '../../../../components/atoms/Head'
import { useTranslation } from 'next-i18next'
import { getI18NProps } from '../../../../server/i18n'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
interface WeaponShowPageProps { interface WeaponShowPageProps {
rootWeapon: RootWeaponData rootWeapon: RootWeaponData
} }
const WeaponShowPage = ({ rootWeapon }: WeaponShowPageProps) => { const WeaponShowPage = ({ rootWeapon }: WeaponShowPageProps) => {
const { t } = useTranslation()
const weapon = rootWeapon.weapons[rootWeapon.weapons.length - 1] const weapon = rootWeapon.weapons[rootWeapon.weapons.length - 1]
const weaponTypeLabel = getWeaponTypeLabel(weapon.type)
const atk = Math.floor(weapon.attackBase + weapon.attackAdd * (weapon.maxLv - 1))
const crt = Math.floor(weapon.criticalBase + weapon.criticalAdd * (weapon.maxLv - 1))
return ( return (
<Box> <Honkai3rdLayout>
<Heading as="h1">{weapon.name}</Heading> <Head
title={`${weapon.name} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
description={`${t('common.honkai-3rd')} ${t('weapons-show.weapon')} / ${'⭐'.repeat(
weapon.rarity
)} / ${weaponTypeLabel} / ATK : ${atk} / CRT : ${crt}`}
canonicalHref={`/honkai3rd/v2/weapons/${weapon.id}`}
/>
<Box p={2}>
<Breadcrumb
items={[
{ href: '/honkai3rd', label: t('common.honkai-3rd') },
{ href: '/honkai3rd/v2/weapons', label: t('common.weapons') },
{ href: `/honkai3rd/v2/weapons/${weapon.id}`, label: weapon.name }
]}
/>
<Box mb={3}> <Heading as="h1">{weapon.name}</Heading>
<WeaponIcon key={weapon.id} icon={weapon.icon} rarity={weapon.rarity} />
</Box>
<Card mb={3}> <Box mb={3}>
<Box sx={{ p: 1, borderBottom: 'default' }}>{replaceNewLine(weapon.description)}</Box> <WeaponIcon key={weapon.id} icon={weapon.icon} rarity={weapon.rarity} />
<Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}>
<WeaponTypeIcon type={weapon.type} />
<Box ml={1}>{getWeaponTypeLabel(weapon.type)}</Box>
</Flex>
<Box sx={{ p: 1 }}>
ATK : {Math.floor(weapon.attackBase + weapon.attackAdd * (weapon.maxLv - 1))} / CRT :{' '}
{Math.floor(weapon.criticalBase + weapon.criticalAdd * (weapon.maxLv - 1))} (at Max Lv {weapon.maxLv})
</Box> </Box>
</Card>
<Heading as="h2">Skills</Heading> <Card mb={3}>
<Card> <Box sx={{ p: 1, borderBottom: 'default' }}>{replaceNewLine(weapon.description)}</Box>
{weapon.skills.map(skill => { <Flex sx={{ alignItems: 'center', p: 1, borderBottom: 'default' }}>
return ( <WeaponTypeIcon type={weapon.type} />
<Fragment key={skill.id}> <Box ml={1}>{getWeaponTypeLabel(weapon.type)}</Box>
<Box sx={{ borderBottom: 'default' }}> </Flex>
<Heading <Box sx={{ p: 1 }}>
as="h3" ATK : {atk} / CRT : {crt} (at Max Lv {weapon.maxLv})
</Box>
</Card>
<Heading as="h2">Skills</Heading>
<Card>
{weapon.skills.map(skill => {
return (
<Fragment key={skill.id}>
<Box sx={{ borderBottom: 'default' }}>
<Heading
as="h3"
sx={{
p: 1,
m: 1
}}
>
{skill.name}
</Heading>
</Box>
<Box
sx={{ sx={{
p: 1, p: 1,
m: 1 borderBottom: 'default',
'&:last-child': {
borderBottom: 'none'
}
}} }}
> >
{skill.name} <FormattedText>
</Heading> {formatSubSkillInfo({
</Box> info: skill.info,
<Box maxLv: weapon.maxLv,
sx={{ paramBase1: skill.param1,
p: 1, paramBase2: skill.param2,
borderBottom: 'default', paramBase3: skill.param3,
'&:last-child': { paramAdd1: skill.param1Add,
borderBottom: 'none' paramAdd2: skill.param2Add,
} paramAdd3: skill.param3Add
}} })}
> </FormattedText>
<FormattedText> </Box>
{formatSubSkillInfo({ </Fragment>
info: skill.info, )
maxLv: weapon.maxLv, })}
paramBase1: skill.param1, </Card>
paramBase2: skill.param2, {/* <pre>{JSON.stringify(weapon, null, 2)}</pre> */}
paramBase3: skill.param3, </Box>
paramAdd1: skill.param1Add, </Honkai3rdLayout>
paramAdd2: skill.param2Add,
paramAdd3: skill.param3Add
})}
</FormattedText>
</Box>
</Fragment>
)
})}
</Card>
{/* <pre>{JSON.stringify(weapon, null, 2)}</pre> */}
</Box>
) )
} }
@@ -88,7 +115,7 @@ export async function getStaticProps({ locale, params }: NextPageContext & { par
const rootWeapon = loadWeaponData(params.weaponId) const rootWeapon = loadWeaponData(params.weaponId)
return { return {
props: { rootWeapon } props: { rootWeapon, ...(await getI18NProps(locale)) }
} }
} }
+55 -36
View File
@@ -1,51 +1,70 @@
/** @jsxImportSource theme-ui */ /** @jsxImportSource theme-ui */
import { Box, Card } from '@theme-ui/components' import { Box, Card } from '@theme-ui/components'
import { NextPageContext } from 'next' import { NextPageContext } from 'next'
import { Flex, Link } from 'theme-ui' import { Flex, Heading, Link } from 'theme-ui'
import { loadWeaponCatalog } from '../../../../lib/v2/server/loadData' import { loadWeaponCatalog } from '../../../../lib/v2/server/loadData'
import { WeaponCatalogItem } from '../../../../lib/v2/data/types' import { WeaponCatalogItem } from '../../../../lib/v2/data/types'
import WeaponIcon from '../../../../components/v2/WeaponIcon' import WeaponIcon from '../../../../components/v2/WeaponIcon'
import Head from '../../../../components/atoms/Head'
import Honkai3rdLayout from '../../../../components/layouts/Honkai3rdLayout'
import { useTranslation } from 'next-i18next'
import { getI18NProps } from '../../../../server/i18n'
import Breadcrumb from '../../../../components/organisms/Breadcrumb'
interface WeaponListPageProps { interface WeaponListPageProps {
weaponCatalog: WeaponCatalogItem[] weaponCatalog: WeaponCatalogItem[]
} }
const WeaponListPage = ({ weaponCatalog }: WeaponListPageProps) => { const WeaponListPage = ({ weaponCatalog }: WeaponListPageProps) => {
const { t } = useTranslation()
return ( return (
<Box> <Honkai3rdLayout>
<h1>Weapons</h1> <Head
<Flex sx={{ flexWrap: 'wrap' }}> title={`${t('common.weapons')} - ${t('common.honkai-3rd')} - ${t('common.abyss-lab')}`}
{weaponCatalog description={t('weapons-list.description')}
.filter(filterWeapons) canonicalHref={`/honkai3rd/v2/weapons`}
.sort(sortWeapons) />
.map(weapon => { <Box p={2}>
return ( <Breadcrumb
<Box key={weapon.id} m={2}> items={[
<Link href={`/v2-pre/weapons/${weapon.id}`}> { href: '/honkai3rd', label: t('common.honkai-3rd') },
<Card p={1}> { href: '/honkai3rd/v2/weapons', label: t('common.weapons') }
<Flex sx={{ justifyContent: 'center' }}> ]}
<WeaponIcon icon={weapon.icon} rarity={weapon.maxRarity} /> />
</Flex> <Heading as="h1">{t('common.weapons')}</Heading>
<Box <Flex sx={{ flexWrap: 'wrap' }}>
sx={{ {weaponCatalog
overflow: 'hidden', .filter(filterWeapons)
textOverflow: 'ellipsis', .sort(sortWeapons)
whiteSpace: 'nowrap', .map(weapon => {
px: 1, return (
width: 112, <Box key={weapon.id} m={1}>
textAlign: 'center' <Link href={`/honkai3rd/v2/weapons/${weapon.id}`}>
}} <Card p={1}>
> <Flex sx={{ justifyContent: 'center' }}>
{weapon.name} <WeaponIcon icon={weapon.icon} rarity={weapon.maxRarity} />
</Box> </Flex>
{/* {weapon.id} */} <Box
</Card> sx={{
</Link> overflow: 'hidden',
</Box> textOverflow: 'ellipsis',
) whiteSpace: 'nowrap',
})} px: 1,
</Flex> width: 112,
</Box> textAlign: 'center'
}}
>
{weapon.name}
</Box>
{/* {weapon.id} */}
</Card>
</Link>
</Box>
)
})}
</Flex>
</Box>
</Honkai3rdLayout>
) )
} }
@@ -55,7 +74,7 @@ export async function getStaticProps({ locale }: NextPageContext) {
const weaponCatalog = loadWeaponCatalog() const weaponCatalog = loadWeaponCatalog()
return { return {
props: { weaponCatalog } props: { weaponCatalog, ...(await getI18NProps(locale)) }
} }
} }