This commit is contained in:
Kalle 2026-01-11 11:19:43 +02:00
parent 6a396f5654
commit f6493f2507
23 changed files with 177 additions and 11 deletions

6
.beans.yml Normal file
View File

@ -0,0 +1,6 @@
beans:
path: .beans
prefix: sendou.ink-
id_length: 4
default_status: todo
default_type: task

View File

@ -0,0 +1,11 @@
---
# sendou.ink-2oby
title: Fix handleRadioGroupKeyDown in CommandPalette
status: todo
type: bug
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
The handleRadioGroupKeyDown function is not working. Location: app/components/layout/CommandPalette.tsx:151

View File

@ -0,0 +1,39 @@
---
# sendou.ink-6eko
title: Desktop sidebar and mobile tabs layout
status: in-progress
type: epic
priority: normal
created_at: 2026-01-11T08:58:29Z
updated_at: 2026-01-11T09:19:14Z
---
## Why
The previous layout had several limitations holding back the player experience:
1. **Poor mobile UX** - Navigation wasn't optimized for mobile players
2. **Hard to navigate** - No global search, sidebar only appeared on front page making it difficult to find features
3. **Slow path to matches** - Competitive players had too many clicks to join matches or check their tournament status
4. **No foundation for scheduling** - Future features like team scheduling and league match scheduling need a persistent navigation structure
5. **Streams not visible** - Community streams weren't highlighted, missing opportunity to showcase active players
## Goals
- Make it easy for competitive players to get into matches fast (1-click access to active matches/tournaments)
- Provide persistent navigation across all pages via sidebar (desktop) and bottom tabs (mobile)
- Add global search via command palette to quickly find users, teams, organizations, and tournaments
- Lay foundation for upcoming features: friend group quick-join, team scheduling, league scheduling
- Better highlight community content like streams
## What's been built
- **Desktop**: Fixed sidebar with user profile, tournament calendar, friends list, streams + top menu bar with category dropdowns
- **Mobile**: Bottom tab bar with modal panels for menu, friends, tournaments, and user profile
- **Command palette**: Global search (Cmd/Ctrl+K) for users, teams, organizations, tournaments
- **Breadcrumb navigation**: Context-aware page hierarchy
- **Quick match access**: Tournament and SendouQ match status prominently displayed
## Completion criteria
All child tickets resolved.

View File

@ -0,0 +1,11 @@
---
# sendou.ink-gk34
title: Improve tournament search relevance
status: todo
type: task
created_at: 2026-01-11T08:58:56Z
updated_at: 2026-01-11T08:58:56Z
parent: sendou.ink-6eko
---
For tournament search results, when there are equally good matches, show tournaments closest to current date first. Example: searching 'In The Zone' should show newest tournament first. Location: app/features/search/routes/search.ts:86

View File

@ -0,0 +1,11 @@
---
# sendou.ink-h8l0
title: Fix MobileNav padding on Android
status: todo
type: bug
created_at: 2026-01-11T08:58:54Z
updated_at: 2026-01-11T08:58:54Z
parent: sendou.ink-6eko
---
The mobile navigation lacks proper padding on Android devices. iOS displays correctly. Location: app/components/MobileNav.tsx:35

View File

@ -0,0 +1,11 @@
---
# sendou.ink-iam7
title: Replace placeholder logo
status: todo
type: task
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
Replace the placeholder logo with final logo asset when ready. Location: app/components/layout/index.tsx:259

View File

@ -0,0 +1,11 @@
---
# sendou.ink-j4zp
title: Remove and redirect /u page
status: todo
type: task
created_at: 2026-01-11T08:58:56Z
updated_at: 2026-01-11T08:58:56Z
parent: sendou.ink-6eko
---
Deprecate and remove the /u page. Add redirect to new location. Location: app/features/user-search/routes/u.tsx:44

View File

@ -0,0 +1,10 @@
---
# sendou.ink-r6ry
title: Streams integration in sidebar
status: todo
type: epic
created_at: 2026-01-11T09:18:00Z
updated_at: 2026-01-11T09:18:00Z
---
Display live Splatoon community streams in the sidebar. Data source and implementation details TBD.

View File

@ -0,0 +1,11 @@
---
# sendou.ink-s23a
title: Implement hover menu switching
status: todo
type: task
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
After clicking to open a menu, moving cursor to another menu item should show that menu's items. Menu should close on outside click or Escape key. Location: app/components/layout/TopNavMenus.tsx:14

View File

@ -0,0 +1,11 @@
---
# sendou.ink-svz2
title: Inline function in NotificationPopover
status: todo
type: task
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
Refactor NotificationPopover by inlining the separate function that makes no sense as standalone. Location: app/components/layout/NotificationPopover.tsx:40

View File

@ -0,0 +1,11 @@
---
# sendou.ink-vj1n
title: Fix organizations icon in CommandPalette
status: todo
type: bug
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
The organizations category uses wrong icon. Should use the same icon as AnythingAdder uses for organizations. Location: app/components/layout/CommandPalette.tsx:42

View File

@ -0,0 +1,11 @@
---
# sendou.ink-vmid
title: Define navigation menu categories
status: todo
type: task
created_at: 2026-01-11T08:58:54Z
updated_at: 2026-01-11T08:58:54Z
parent: sendou.ink-6eko
---
Replace placeholder categories in TopNavMenus with actual navigation structure. Location: app/components/layout/TopNavMenus.tsx:13

View File

@ -0,0 +1,11 @@
---
# sendou.ink-y2wo
title: Remove and redirect /t page
status: todo
type: task
created_at: 2026-01-11T08:58:56Z
updated_at: 2026-01-11T08:58:56Z
parent: sendou.ink-6eko
---
Deprecate and remove the /t page. Add redirect to new location. Location: app/features/team/routes/t.tsx:51

View File

@ -0,0 +1,11 @@
---
# sendou.ink-y9e1
title: Update sidebar cache shape
status: todo
type: task
created_at: 2026-01-11T08:58:55Z
updated_at: 2026-01-11T08:58:55Z
parent: sendou.ink-6eko
---
The cached value matches previous usage pattern. Update to match the new usage requirements. Location: app/features/sidebar/routes/sidebar.ts:44

View File

@ -32,7 +32,6 @@ import { SideNavLink } from "./SideNav";
type SidebarData = Awaited<ReturnType<typeof sidebarLoader>> | undefined;
type PanelType = "closed" | "menu" | "friends" | "tourneys" | "you";
// xxx: seems to lack padding on Android
export function MobileNav({ sidebarData }: { sidebarData: SidebarData }) {
const [activePanel, setActivePanel] = React.useState<PanelType>("closed");
const user = useUser();

View File

@ -39,7 +39,7 @@ const STORAGE_KEY = "command-palette-search-type";
const SEARCH_TYPE_ICONS: Record<SearchType, string> = {
users: "u",
teams: "t",
organizations: "associations", // xxx: something correct here
organizations: "associations",
tournaments: "calendar",
};
@ -148,7 +148,6 @@ function CommandPaletteContent({ onClose }: { onClose: () => void }) {
setSearchType(value as SearchType);
};
// xxx: not working
const handleRadioGroupKeyDown = (e: React.KeyboardEvent) => {
if (e.key === "Enter") {
e.preventDefault();

View File

@ -37,7 +37,6 @@ export function useNotifications() {
return { notifications, unseenIds };
}
// xxx: probably makes no sense as a separate function
export function notificationPopoverClassName(notificationsLength: number) {
return clsx(styles.popoverContainer, {
[styles.noNotificationsContainer]: notificationsLength === 0,

View File

@ -10,8 +10,6 @@ import { SendouPopover } from "../elements/Popover";
import { Image, WeaponImage } from "../Image";
import styles from "./TopNavMenus.module.css";
// xxx: placeholder categories
// xxx: make it so that you can view menu with one click, click -> move cursor to another menu item should show the items of that menu
const NAV_CATEGORIES = [
{
name: "competition",

View File

@ -256,7 +256,6 @@ function SiteTitle() {
<Flipper flipKey={isFrontPage ? "front" : "other"}>
<div className={styles.siteTitle}>
<Flipped flipId="site-logo">
{/** xxx: placeholder logo */}
<Link to="/" className={styles.siteLogo}>
S
</Link>

View File

@ -83,7 +83,6 @@ async function searchByType({
}));
}
case "tournaments": {
// xxx: this needs more fancy logic like if i search for "In The Zone", it should show the newest in the zone first
const tournaments = await TournamentRepository.searchByName({
query,
limit,

View File

@ -41,7 +41,6 @@ export const loader = async (_args: LoaderFunctionArgs) => {
const tournamentMatchStatus = resolveTournamentMatchStatus(user.id);
return {
// xxx: cache the right shape
tournaments: [
...tournamentsData.participatingFor,
...tournamentsData.organizingFor,

View File

@ -48,7 +48,6 @@ export const handle: SendouRouteHandle = {
}),
};
// xxx: deprecate page
export default function TeamSearchPage() {
const { t, i18n } = useTranslation(["team"]);
const [inputValue, setInputValue] = React.useState("");

View File

@ -41,7 +41,6 @@ export const meta: MetaFunction = (args) => {
});
};
// xxx: deprecate page
export default function UserSearchPage() {
const { t } = useTranslation(["user"]);
const [searchParams, setSearchParams] = useSearchParams();