feat: sticky compare

This commit is contained in:
TrèsAbhi committed 2024-07-12 19:55:41 -05:00
1 parent f1383c54bc
commit faabea9c06
5 files changed
+43 -43

No files matched your search

+33 -40
View File
@@ -32,6 +32,9 @@ import { EquipmentManager } from '../../../components/EquipmentManager';
import { ModuleManager } from '../../../components/ModuleManager'; import { ModuleManager } from '../../../components/ModuleManager';
import PageWrapper from '../../../components/PageWrapper'; import PageWrapper from '../../../components/PageWrapper';
import { ProvisionsManager } from '../../../components/ProvisionsManager'; import { ProvisionsManager } from '../../../components/ProvisionsManager';
import { StickyColumnHeaderCell } from '../../../components/StickyColumnHeaderCell';
import { StickyRowHeaderCell } from '../../../components/StickyRowHeaderCell';
import { StickyTableRoot } from '../../../components/StickyTableRoot';
import { asset } from '../../../core/blitzkit/asset'; import { asset } from '../../../core/blitzkit/asset';
import { availableProvisions } from '../../../core/blitzkit/availableProvisions'; import { availableProvisions } from '../../../core/blitzkit/availableProvisions';
import { checkConsumableProvisionInclusivity } from '../../../core/blitzkit/checkConsumableProvisionInclusivity'; import { checkConsumableProvisionInclusivity } from '../../../core/blitzkit/checkConsumableProvisionInclusivity';
@@ -197,11 +200,11 @@ export default function Page() {
return ( return (
<Table.Row> <Table.Row>
<Table.RowHeaderCell> <StickyRowHeaderCell>
<Flex <Flex
align="center" align="center"
style={{ whiteSpace: 'nowrap' }} style={{ whiteSpace: 'nowrap' }}
gap={indent ? '6' : '2'} gap={indent ? { initial: '4', sm: '6' } : { initial: '1', sm: '2' }}
> >
<IconButton <IconButton
color={sorting?.by === name ? undefined : 'gray'} color={sorting?.by === name ? undefined : 'gray'}
@@ -242,9 +245,9 @@ export default function Page() {
)} )}
</IconButton> </IconButton>
{name} <Text size={{ initial: '1', sm: '2' }}>{name}</Text>
</Flex> </Flex>
</Table.RowHeaderCell> </StickyRowHeaderCell>
{values.map((value, index) => { {values.map((value, index) => {
const delta = value - values[0]; const delta = value - values[0];
@@ -329,14 +332,14 @@ export default function Page() {
function Title({ children }: { children: string }) { function Title({ children }: { children: string }) {
return ( return (
<Table.Header> <Table.Header style={{ height: 48 }}>
<Table.Row> <Table.Row align="center">
<Table.ColumnHeaderCell> <StickyColumnHeaderCell top={137} style={{ left: 0, zIndex: 2 }}>
<Heading size="4">{children}</Heading> <Heading size="4">{children}</Heading>
</Table.ColumnHeaderCell> </StickyColumnHeaderCell>
{members.map(({ key }) => ( {members.map(({ key }) => (
<Table.ColumnHeaderCell key={key} /> <StickyColumnHeaderCell key={key} top={137} />
))} ))}
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
@@ -433,10 +436,7 @@ export default function Page() {
}, []); }, []);
return ( return (
<Table.ColumnHeaderCell <StickyColumnHeaderCell>
width="0"
style={{ left: 0, position: 'relative' }}
>
<Flex direction="column" align="center" justify="between" gap="2"> <Flex direction="column" align="center" justify="between" gap="2">
<TankControl index={index} key={tank.id} id={tank.id} /> <TankControl index={index} key={tank.id} id={tank.id} />
@@ -477,7 +477,7 @@ export default function Page() {
</Flex> </Flex>
<InsertionMarker index={index + 1} /> <InsertionMarker index={index + 1} />
</Table.ColumnHeaderCell> </StickyColumnHeaderCell>
); );
} }
@@ -520,7 +520,7 @@ export default function Page() {
return ( return (
<PageWrapper color="crimson" size="100%"> <PageWrapper color="crimson" size="100%">
<Flex justify="center" gap="4" align="center" mt="4" direction="column"> <Flex justify="center" gap="4" align="center" direction="column">
{(haveReactive || haveDynamicArmor || haveSpallLiner) && ( {(haveReactive || haveDynamicArmor || haveSpallLiner) && (
<Callout.Root> <Callout.Root>
<Callout.Icon> <Callout.Icon>
@@ -629,16 +629,14 @@ export default function Page() {
{members.length > 0 && ( {members.length > 0 && (
<Flex justify="center"> <Flex justify="center">
<Box maxWidth="100%" position="relative"> <Box maxWidth="100%" position="relative">
<Table.Root size="1" variant="surface" style={{ maxWidth: '100%' }}> <StickyTableRoot
size="1"
variant="surface"
style={{ maxWidth: '100%', height: 'calc(100vh - 128px)' }}
>
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.ColumnHeaderCell <StickyColumnHeaderCell width="0" style={{ height: '100%' }}>
width="0"
style={{
position: 'relative',
height: '100%',
}}
>
<Flex <Flex
style={{ style={{
width: '100%', width: '100%',
@@ -650,7 +648,7 @@ export default function Page() {
<BlitzkitButtonWatermark width={64} height={64} /> <BlitzkitButtonWatermark width={64} height={64} />
<InsertionMarker index={0} /> <InsertionMarker index={0} />
</Flex> </Flex>
</Table.ColumnHeaderCell> </StickyColumnHeaderCell>
{members.map(({ tank, key }, index) => { {members.map(({ tank, key }, index) => {
return <TankCard index={index} key={key} tank={tank} />; return <TankCard index={index} key={key} tank={tank} />;
@@ -660,11 +658,7 @@ export default function Page() {
<Table.Body> <Table.Body>
<Table.Row> <Table.Row>
<Table.Cell <Table.Cell style={{ height: '100%' }}>
style={{
height: '100%',
}}
>
<Flex <Flex
style={{ style={{
width: '100%', width: '100%',
@@ -685,12 +679,7 @@ export default function Page() {
{Object.entries( {Object.entries(
awaitedSkillDefinitions.classes, awaitedSkillDefinitions.classes,
).map(([tankClass, skills]) => ( ).map(([tankClass, skills]) => (
<Flex <Flex key={tankClass} style={{ gap: 2 }}>
key={tankClass}
style={{
gap: 2,
}}
>
{skills.map((skill) => ( {skills.map((skill) => (
<div <div
key={skill} key={skill}
@@ -1179,14 +1168,17 @@ export default function Page() {
<Table.Header> <Table.Header>
<Table.Row> <Table.Row>
<Table.ColumnHeaderCell> <StickyColumnHeaderCell
top={137}
style={{ left: 0, zIndex: 2 }}
>
<Flex height="100%" align="center"> <Flex height="100%" align="center">
<Heading size="4">Firepower</Heading> <Heading size="4">Firepower</Heading>
</Flex> </Flex>
</Table.ColumnHeaderCell> </StickyColumnHeaderCell>
{members.map(({ gun, shell, key }, index) => ( {members.map(({ gun, shell, key }, index) => (
<Table.ColumnHeaderCell key={key}> <StickyColumnHeaderCell key={key} top={137}>
<Flex justify="center"> <Flex justify="center">
<Flex> <Flex>
{gun.shells.map((thisShell, shellIndex) => ( {gun.shells.map((thisShell, shellIndex) => (
@@ -1229,7 +1221,7 @@ export default function Page() {
))} ))}
</Flex> </Flex>
</Flex> </Flex>
</Table.ColumnHeaderCell> </StickyColumnHeaderCell>
))} ))}
</Table.Row> </Table.Row>
</Table.Header> </Table.Header>
@@ -1497,7 +1489,7 @@ export default function Page() {
decimals={1} decimals={1}
/> />
</Table.Body> </Table.Body>
</Table.Root> </StickyTableRoot>
<IconButton <IconButton
style={{ style={{
@@ -1505,6 +1497,7 @@ export default function Page() {
right: 0, right: 0,
top: 73, // lol nobody complain pls :) top: 73, // lol nobody complain pls :)
transform: 'translate(50%, -50%)', transform: 'translate(50%, -50%)',
zIndex: 1,
}} }}
onClick={() => setAddTankDialogOpen(true)} onClick={() => setAddTankDialogOpen(true)}
> >
+1
View File
@@ -46,6 +46,7 @@ export default function Navbar() {
return ( return (
<Box <Box
className={styles.navbar[showHamburgerMenu ? 'expanded' : 'collapsed']} className={styles.navbar[showHamburgerMenu ? 'expanded' : 'collapsed']}
style={{ zIndex: 3 }}
> >
<Flex direction="column" align="center" pt="2"> <Flex direction="column" align="center" pt="2">
<Flex <Flex
+7 -2
View File
@@ -1,15 +1,20 @@
import { Table } from '@radix-ui/themes'; import { Table } from '@radix-ui/themes';
import { ColumnHeaderCellProps } from '@radix-ui/themes/dist/cjs/components/table'; import { ColumnHeaderCellProps } from '@radix-ui/themes/dist/cjs/components/table';
interface StickyColumnHeaderCellProps extends ColumnHeaderCellProps {
top?: number | string;
}
export function StickyColumnHeaderCell({ export function StickyColumnHeaderCell({
style, style,
top = 0,
...props ...props
}: ColumnHeaderCellProps) { }: StickyColumnHeaderCellProps) {
return ( return (
<Table.ColumnHeaderCell <Table.ColumnHeaderCell
style={{ style={{
position: 'sticky', position: 'sticky',
top: 0, top,
background: 'var(--gray-3)', background: 'var(--gray-3)',
zIndex: 1, zIndex: 1,
...style, ...style,
+1
View File
@@ -5,6 +5,7 @@ export function StickyRowHeaderCell({ style, ...props }: RowHeaderCellProps) {
return ( return (
<Table.RowHeaderCell <Table.RowHeaderCell
style={{ style={{
display: 'flex',
position: 'sticky', position: 'sticky',
left: 0, left: 0,
backgroundColor: 'var(--color-panel)', backgroundColor: 'var(--color-panel)',
+1 -1
View File
@@ -15,7 +15,7 @@ export function TankRowHeaderCell({ tank }: TankRowHeaderCellProps) {
return ( return (
<StickyRowHeaderCell <StickyRowHeaderCell
maxWidth={{ initial: '144px', sm: '240px' }} maxWidth={{ initial: '144px', sm: '240px' }}
style={{ overflow: 'hidden', display: 'flex' }} style={{ overflow: 'hidden' }}
> >
<Link href={`/tools/tankopedia/${tank.id}`} tabIndex={-1}> <Link href={`/tools/tankopedia/${tank.id}`} tabIndex={-1}>
<img <img