diff --git a/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx b/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx new file mode 100644 index 000000000..50f3ba234 --- /dev/null +++ b/src/app/tools/tankopedia/[id]/components/Model/HeroSection.tsx @@ -0,0 +1,103 @@ +import { EnterFullScreenIcon, ExitFullScreenIcon } from '@radix-ui/react-icons'; +import { Checkbox, Flex, Heading, IconButton, Text } from '@radix-ui/themes'; +import { TIER_ROMAN_NUMERALS } from '../../../../../../core/blitzkit/tankDefinitions/constants'; +import { useFullScreen } from '../../../../../../hooks/useFullScreen'; +import strings from '../../../../../../lang/en-US.json'; +import { theme } from '../../../../../../stitches.config'; +import { useDuel } from '../../../../../../stores/duel'; +import mutateTankopediaPersistent, { + useTankopediaPersistent, +} from '../../../../../../stores/tankopedia'; +import { TankSandbox } from './TankSandbox'; + +export function HeroSection() { + const tank = useDuel((state) => state.protagonist!.tank); + const mode = useTankopediaPersistent((state) => state.mode); + const isFullScreen = useFullScreen(); + + return ( + + + + {tank.name} + + Tier {TIER_ROMAN_NUMERALS[tank.tier]}{' '} + {(strings.common.nations as Record)[tank.nation]}{' '} + {strings.common.tank_class_short[tank.class]} + + + +
+
+ +
+ + { + mutateTankopediaPersistent((draft) => { + draft.mode = draft.mode === 'armor' ? 'model' : 'armor'; + }); + }} + > + + Armor + +
+
+ + { + document.body.requestFullscreen(); + }} + > + {isFullScreen ? : } + +
+ ); +} diff --git a/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx b/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx index b6046a772..1804c44d4 100644 --- a/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx +++ b/src/app/tools/tankopedia/[id]/components/Model/TankSandbox.tsx @@ -1,5 +1,3 @@ -import { LightningBoltIcon } from '@radix-ui/react-icons'; -import { Button, Card, Flex, Tabs, Text, Theme } from '@radix-ui/themes'; import { PerspectiveCamera } from '@react-three/drei'; import { Canvas } from '@react-three/fiber'; import { Suspense, use, useEffect, useRef, useState } from 'react'; @@ -10,24 +8,18 @@ import { applyPitchYawLimits } from '../../../../../../core/blitz/applyPitchYawL import { modelDefinitions } from '../../../../../../core/blitzkit/modelDefinitions'; import { modelTransformEvent } from '../../../../../../core/blitzkit/modelTransform'; import { Pose, poseEvent } from '../../../../../../core/blitzkit/pose'; -import { tankIcon } from '../../../../../../core/blitzkit/tankIcon'; import { useEquipment } from '../../../../../../hooks/useEquipment'; import { useFullScreen } from '../../../../../../hooks/useFullScreen'; import { useWideFormat } from '../../../../../../hooks/useWideFormat'; -import { BlitzkitWide } from '../../../../../../icons/BlitzkitWide'; import { mutateDuel, useDuel } from '../../../../../../stores/duel'; -import mutateTankopediaPersistent, { - TankopediaMode, +import { mutateTankopediaTemporary, useTankopediaPersistent, } from '../../../../../../stores/tankopedia'; -import { AntagonistBar } from '../AntagonistBar'; import { Controls } from '../Control'; import { Lighting } from '../Lighting'; -import { RotationInputs } from '../QuickInputs'; import { SceneProps } from '../SceneProps'; import { ModelLoader } from './components/ModelLoader'; -import { Options } from './components/Options'; import { TankModel } from './components/TankModel'; export function TankSandbox() { @@ -138,137 +130,30 @@ export function TankSandbox() { }, [protagonist.gun, protagonist.turret]); return ( - - - - { - mutateTankopediaPersistent((draft) => { - draft.mode = mode as TankopediaMode; - }); - }} - > - - - - Model - - - Armor - - + { + mutateTankopediaTemporary((draft) => { + draft.shot = undefined; + }); + }} + > + + + - {wideFormat && ( - - - - )} - -
- {loadModel ? ( -
- { - mutateTankopediaTemporary((draft) => { - draft.shot = undefined; - }); - }} - > - - - - - }> - - - - - - -
- ) : ( - - - - - - - - )} -
- - - - {isFullScreen && } - - {loadModel && } -
-
-
+ }> + + + + + + ); } diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index 43184f198..7b8ffbfe5 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -1,23 +1,12 @@ 'use client'; -import { Flex } from '@radix-ui/themes'; import { useEffect } from 'react'; import PageWrapper from '../../../../components/PageWrapper'; import { assignDuelMember } from '../../../../core/blitzkit/assignDuelMember'; import { useWideFormat } from '../../../../hooks/useWideFormat'; import { mutateDuel, useDuel } from '../../../../stores/duel'; import { mutateTankopediaTemporary } from '../../../../stores/tankopedia'; -import { AntagonistBar } from './components/AntagonistBar'; -import { Characteristics } from './components/Characteristics'; -import { Consumables } from './components/Characteristics/components/Consumables'; -import { Equipment } from './components/Characteristics/components/Equipment'; -import { Miscellaneous } from './components/Characteristics/components/Miscellaneous'; -import { Modules } from './components/Characteristics/components/Modules'; -import { Provisions } from './components/Characteristics/components/Provisions'; -import { Skills } from './components/Characteristics/components/Skills'; -import { TankSandbox } from './components/Model/TankSandbox'; -import { Title } from './components/Title'; -import { Videos } from './components/Videos'; +import { HeroSection } from './components/Model/HeroSection'; export default function Page({ params }: { params: { id: string } }) { const initialId = parseInt(params.id); @@ -66,52 +55,10 @@ export default function Page({ params }: { params: { id: string } }) { }, [initialId, assigned]); return ( - + {assigned && ( <> - - - <Flex - style={{ width: '100%' }} - gap="8" - direction={wideFormat ? 'row' : 'column'} - align="start" - justify="center" - > - <Flex - gap="8" - direction="column" - style={{ - flex: 1, - width: '100%', - top: 64 + 16, - position: wideFormat ? 'sticky' : undefined, - }} - > - <Flex gap="4" direction="column"> - <TankSandbox /> - <AntagonistBar /> - </Flex> - <Flex gap="5" wrap="wrap"> - <Modules /> - <Provisions /> - <Consumables /> - - <Flex gap="5" wrap="wrap"> - <Skills /> - <Equipment /> - </Flex> - - <Miscellaneous /> - </Flex> - </Flex> - - <Flex style={{ width: wideFormat ? 320 : '100%' }}> - <Characteristics /> - </Flex> - </Flex> - - <Videos /> + <HeroSection /> </> )} </PageWrapper> diff --git a/src/components/PageWrapper.tsx b/src/components/PageWrapper.tsx index 6a24b60fd..8de691c0a 100644 --- a/src/components/PageWrapper.tsx +++ b/src/components/PageWrapper.tsx @@ -4,6 +4,8 @@ import { ComponentProps } from 'react'; type PageWrapperProps = FlexProps & { color?: ComponentProps<typeof Theme>['accentColor']; size?: number | string; + noPadding?: boolean; + noMaxWidth?: boolean; }; export default function PageWrapper({ @@ -11,6 +13,8 @@ export default function PageWrapper({ color, size = 800, children, + noPadding = false, + noMaxWidth = false, ...props }: PageWrapperProps) { return ( @@ -27,9 +31,9 @@ export default function PageWrapper({ gap="4" style={{ width: '100%', - maxWidth: size, + maxWidth: noMaxWidth ? undefined : size, margin: 'auto', - padding: 16, + padding: noPadding ? 0 : 16, boxSizing: 'border-box', flex: 1, ...style,