From 45dd78396493ee053f3d156731d124139ee288ec Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 6 Sep 2026 10:30:21 -0400 Subject: [PATCH] refactor(nav): migrate header, dashboard chrome and discovery UI to v3 - Header/MobileBar: MenuRoot/Positioner/Content + Portal + Tooltip shims, ghost icon buttons, 2rem padded user/settings menus, hover token gray.700; MobileBar drawer API (open/onOpenChange/finalFocusEl) - FilterBar/ActiveFilters: DrawerRoot/CloseTrigger, Divider -> Separator, Tag shim, FixedSelect with typed handlers and width-preserving chakraStyles, blue active-filter pills untouched - Pagination: NumberInputRoot/Field + NativeSelect shims, first/last arrows back to double chevrons (LuChevronsLeft/Right), single chevrons kept for prev/next - Search/SearchModal, Home, NoGames, LoadingModal, DashboardLoadingModal: Dialog/Toaster-era props, gap/align/textAlign renames; App.test target content updated accordingly --- src/components/ActiveFilters.tsx | 26 ++- src/components/FilterBar.tsx | 116 ++++++----- src/components/Footer.tsx | 2 +- src/components/GamesDashboard.tsx | 24 +-- src/components/Header.tsx | 182 +++++++++--------- src/components/Home.tsx | 8 +- src/components/LoadingModal.tsx | 9 +- src/components/MobileBar.tsx | 76 +++----- src/components/NoGames.tsx | 8 +- src/components/Pagination.tsx | 108 ++++++----- src/components/Search.tsx | 36 ++-- src/components/SearchModal.tsx | 22 +-- .../DashboardLoadingModal.tsx | 9 +- .../helperComponents/ResetFilterButton.tsx | 10 +- .../helperComponents/SteamAndDeckLogo.tsx | 15 +- 15 files changed, 325 insertions(+), 326 deletions(-) diff --git a/src/components/ActiveFilters.tsx b/src/components/ActiveFilters.tsx index 0c2720f..032dc68 100644 --- a/src/components/ActiveFilters.tsx +++ b/src/components/ActiveFilters.tsx @@ -1,7 +1,8 @@ import React from 'react' import { useHookstate } from '@hookstate/core' import { gameDashboardState } from '../stateManagement/gameState' -import { Flex, Stack, HStack, Link, Spacer, Tag, TagCloseButton, TagLabel } from '@chakra-ui/react' +import { Flex, Stack, HStack, Link, Spacer } from '@chakra-ui/react' +import {Tag} from './ui/tag' import getWithFilters from '../componentUtils/getWithFilters' import { loadingState, @@ -53,7 +54,7 @@ const ActiveFilters = () => { }} direction={{ base: 'column', md: 'row' - }} spacing={4}> + }} gap={4}> {searchParams.length >= 1 && ( <>

Search:

@@ -61,11 +62,8 @@ const ActiveFilters = () => { size={'md'} borderRadius="full" variant="solid" - colorScheme="blue" - > - setSearchModalOpen.set(true)}>{searchParams} - { + colorPalette="blue" + onClose={async () => { const newSearchParams = "" ChangeActiveFilterHeader(filters, newSearchParams, setShowFiltersModuleState) searchComplete.set(false) @@ -80,7 +78,9 @@ const ActiveFilters = () => { useRatingState, useSteamRatingState, ) - }} /> + }} + > setSearchModalOpen.set(true)}>{searchParams} )} @@ -99,22 +99,20 @@ const ActiveFilters = () => { <>

{filter}

- + {filters[filter as keyof typeof filters].split(',').map((item: string, index) => ( - { + colorPalette="blue" + onClose={() => removeFilters(filter, item)} + >{ item.includes('lte') ? item.replace('lte', '<= ') : item.includes('gte') ? item.replace('gte', '>= ') : item} - - removeFilters(filter, item)} /> ))} diff --git a/src/components/FilterBar.tsx b/src/components/FilterBar.tsx index ea36a8f..ccc794d 100644 --- a/src/components/FilterBar.tsx +++ b/src/components/FilterBar.tsx @@ -1,17 +1,12 @@ import React, {MutableRefObject, useEffect} from 'react' import { Center, - Divider, - Drawer, - DrawerBody, - DrawerCloseButton, - DrawerContent, - DrawerFooter, - DrawerHeader, - DrawerOverlay, Flex, + Separator, + Flex, Heading, Spacer, Text, } from '@chakra-ui/react' +import {DrawerBody, DrawerCloseTrigger, DrawerContent, DrawerFooter, DrawerHeader, DrawerRoot} from './ui/drawer' import AdminMode from './authComponents/AdminMode' import {StateMethods, useHookstate} from '@hookstate/core' import {tagState} from '../stateManagement/tagState' @@ -25,7 +20,7 @@ import { } from '../componentUtils/SelectValues' import {retrieveTags} from '../componentUtils/retrieveTags' import {gameDashboardState} from '../stateManagement/gameState' -import {Select} from 'chakra-react-select' +import {Select} from './FixedSelect' import getWithFilters from '../componentUtils/getWithFilters' import {loadingState, showFiltersModuleState} from '../stateManagement/loadingState' import {adminMode} from '../stateManagement/userState' @@ -99,26 +94,25 @@ function FilterBar({filterIsOpen, filterOnClose, btnRef}: Props) { } return ( - { if (!e.open) filterOnClose() }} + finalFocusEl={() => btnRef.current as unknown as HTMLElement} > - - + Filters - +
- + Series { - const value = event.map(a => a.value).join(',') + onChange={(event: any) => { + const value = event.map((a: any) => a.value).join(',') changeFilters("playStatus", value) }} options={playStatusValues} /> - + Genres { - const value = event.map(a => a.value).join(',') + onChange={(event: any) => { + const value = event.map((a: any) => a.value).join(',') changeFilters("os", value) }} options={osValues} /> - + Store { - const value = event.map(a => a.value).join(',') + onChange={(event: any) => { + const value = event.map((a: any) => a.value).join(',') changeFilters("controller", value) }} options={controllerValues} /> - + Developer { - const value = event.map(a => a.value).join(',') + onChange={(event: any) => { + const value = event.map((a: any) => a.value).join(',') changeFilters("publisher", value) }} options={tags.publisher} /> - + Do you own the Soundtrack? { - const value = event.map(a => a.value).join(',') + onChange={(event: any) => { + const value = event.map((a: any) => a.value).join(',') changeFilters("intel", value) }} options={wineIntelValues} /> - + Does is work with Wine? { - setPageSize(Number(e.target.value)) - }} > - {[10, 20, 30, 40, 50].map((pageSize) => ( - - ))} - + { + setPageSize(Number(e.target.value)) + }} + > + {[10, 20, 30, 40, 50].map((pageSize) => ( + + ))} + + + Games Found: {games.count.totalGames} - + = pageCount} - icon={} - /> + disabled={pageIndex >= pageCount} + > + + - + gotoPage(pageCount)} - isDisabled={pageIndex >= pageCount} - icon={} + disabled={pageIndex >= pageCount} ml={4} - /> + > + + diff --git a/src/components/Search.tsx b/src/components/Search.tsx index e6ce6dd..d051828 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -1,6 +1,7 @@ import React, { FormEvent } from 'react' -import { Button, FormControl, Input, InputGroup, InputRightElement, useColorModeValue } from '@chakra-ui/react' -import { SearchIcon } from '@chakra-ui/icons' +import { Button, Input, Group } from '@chakra-ui/react' +import { Field } from './ui/field' +import { LuSearch } from 'react-icons/lu' import { GameList } from '../models/game' import { useHookstate } from '@hookstate/core' import { gameDashboardState } from '../stateManagement/gameState' @@ -14,6 +15,7 @@ import { adminMode } from '../stateManagement/userState' import getWithFilters from '../componentUtils/getWithFilters' import {ChangeActiveFilterHeader} from "../componentUtils/changeActiveFilterHeader"; import {ratingState, steamRatingState} from "../stateManagement/ratingState"; +import {useColorModeValue} from "./ui/color-mode"; export default function Search() { const gamesState = useHookstate(gameDashboardState) @@ -54,16 +56,16 @@ export default function Search() { return ( <>
- - + + - - - - - + + +
) -} \ No newline at end of file +} diff --git a/src/components/SearchModal.tsx b/src/components/SearchModal.tsx index c124d13..4d9eb11 100644 --- a/src/components/SearchModal.tsx +++ b/src/components/SearchModal.tsx @@ -1,8 +1,6 @@ import React from 'react' -import { - Modal, ModalBody, ModalCloseButton, ModalContent, - ModalHeader, -} from '@chakra-ui/react' +import { Dialog } from '@chakra-ui/react' +import {DialogBody, DialogCloseTrigger, DialogContent, DialogHeader, DialogRoot} from './ui/dialog' import { useHookstate } from '@hookstate/core' import { openAndCloseSearchDialogue } from '../stateManagement/loadingState' import Search from './Search' @@ -16,14 +14,14 @@ export default function SearchModal() { } return ( - - - Search - handleClose()}/> - + { if (!e.open) handleClose() }}> + + Search + handleClose()}/> + - - - + + + ) } diff --git a/src/components/dashboardComponents/DashboardLoadingModal.tsx b/src/components/dashboardComponents/DashboardLoadingModal.tsx index e8e35a3..9f774c4 100644 --- a/src/components/dashboardComponents/DashboardLoadingModal.tsx +++ b/src/components/dashboardComponents/DashboardLoadingModal.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { Center, CircularProgress } from '@chakra-ui/react' +import { Center, ProgressCircle } from '@chakra-ui/react' export default function DashboardLoadingModal() { @@ -9,7 +9,12 @@ export default function DashboardLoadingModal() { w="100%" mt={'1rem'} > - + + + + + + ) diff --git a/src/components/helperComponents/ResetFilterButton.tsx b/src/components/helperComponents/ResetFilterButton.tsx index f1bcd2c..7fd1151 100644 --- a/src/components/helperComponents/ResetFilterButton.tsx +++ b/src/components/helperComponents/ResetFilterButton.tsx @@ -9,12 +9,12 @@ import { ratingState, steamRatingState } from "../../stateManagement/ratingState interface Props { text?: string - size?: string - variant?: string - colorScheme?: string + size?: "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl" + variant?: "solid" | "subtle" | "surface" | "outline" | "ghost" | "plain" + colorPalette?: string } -const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', variant = 'solid', colorScheme = 'gray' }: Props) => { +const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', variant = 'solid', colorPalette = 'gray' }: Props) => { const gameState = useHookstate(gameDashboardState) const games = gameState.get() const admin = useHookstate(adminMode).get() @@ -58,7 +58,7 @@ const ResetFilterButton = ({ text = "Reset Search and Filters", size = 'md', var } return ( - ) diff --git a/src/components/helperComponents/SteamAndDeckLogo.tsx b/src/components/helperComponents/SteamAndDeckLogo.tsx index 602216d..7dc11ad 100644 --- a/src/components/helperComponents/SteamAndDeckLogo.tsx +++ b/src/components/helperComponents/SteamAndDeckLogo.tsx @@ -9,17 +9,19 @@ const SteamAndDeckLogo = (props: ISteamAndDeckLogo) => { return (
+ SteamAndDeckLogo { +
);