From f6493f2507900a9f8d87e6921c0484b13680d33d Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sun, 11 Jan 2026 11:19:43 +0200 Subject: [PATCH] Beans --- .beans.yml | 6 +++ ...ndleradiogroupkeydown-in-commandpalette.md | 11 ++++++ ...-desktop-sidebar-and-mobile-tabs-layout.md | 39 +++++++++++++++++++ ...34--improve-tournament-search-relevance.md | 11 ++++++ ...-h8l0--fix-mobilenav-padding-on-android.md | 11 ++++++ ...ndou.ink-iam7--replace-placeholder-logo.md | 11 ++++++ ...ou.ink-j4zp--remove-and-redirect-u-page.md | 11 ++++++ ...nk-r6ry--streams-integration-in-sidebar.md | 10 +++++ ...nk-s23a--implement-hover-menu-switching.md | 11 ++++++ ...-inline-function-in-notificationpopover.md | 11 ++++++ ...ix-organizations-icon-in-commandpalette.md | 11 ++++++ ...vmid--define-navigation-menu-categories.md | 11 ++++++ ...ou.ink-y2wo--remove-and-redirect-t-page.md | 11 ++++++ ...ou.ink-y9e1--update-sidebar-cache-shape.md | 11 ++++++ app/components/MobileNav.tsx | 1 - app/components/layout/CommandPalette.tsx | 3 +- app/components/layout/NotificationPopover.tsx | 1 - app/components/layout/TopNavMenus.tsx | 2 - app/components/layout/index.tsx | 1 - app/features/search/routes/search.ts | 1 - app/features/sidebar/routes/sidebar.ts | 1 - app/features/team/routes/t.tsx | 1 - app/features/user-search/routes/u.tsx | 1 - 23 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 .beans.yml create mode 100644 .beans/sendou.ink-2oby--fix-handleradiogroupkeydown-in-commandpalette.md create mode 100644 .beans/sendou.ink-6eko--desktop-sidebar-and-mobile-tabs-layout.md create mode 100644 .beans/sendou.ink-gk34--improve-tournament-search-relevance.md create mode 100644 .beans/sendou.ink-h8l0--fix-mobilenav-padding-on-android.md create mode 100644 .beans/sendou.ink-iam7--replace-placeholder-logo.md create mode 100644 .beans/sendou.ink-j4zp--remove-and-redirect-u-page.md create mode 100644 .beans/sendou.ink-r6ry--streams-integration-in-sidebar.md create mode 100644 .beans/sendou.ink-s23a--implement-hover-menu-switching.md create mode 100644 .beans/sendou.ink-svz2--inline-function-in-notificationpopover.md create mode 100644 .beans/sendou.ink-vj1n--fix-organizations-icon-in-commandpalette.md create mode 100644 .beans/sendou.ink-vmid--define-navigation-menu-categories.md create mode 100644 .beans/sendou.ink-y2wo--remove-and-redirect-t-page.md create mode 100644 .beans/sendou.ink-y9e1--update-sidebar-cache-shape.md diff --git a/.beans.yml b/.beans.yml new file mode 100644 index 000000000..3affd93ba --- /dev/null +++ b/.beans.yml @@ -0,0 +1,6 @@ +beans: + path: .beans + prefix: sendou.ink- + id_length: 4 + default_status: todo + default_type: task diff --git a/.beans/sendou.ink-2oby--fix-handleradiogroupkeydown-in-commandpalette.md b/.beans/sendou.ink-2oby--fix-handleradiogroupkeydown-in-commandpalette.md new file mode 100644 index 000000000..5b0cc39c5 --- /dev/null +++ b/.beans/sendou.ink-2oby--fix-handleradiogroupkeydown-in-commandpalette.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-6eko--desktop-sidebar-and-mobile-tabs-layout.md b/.beans/sendou.ink-6eko--desktop-sidebar-and-mobile-tabs-layout.md new file mode 100644 index 000000000..83a693e00 --- /dev/null +++ b/.beans/sendou.ink-6eko--desktop-sidebar-and-mobile-tabs-layout.md @@ -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. \ No newline at end of file diff --git a/.beans/sendou.ink-gk34--improve-tournament-search-relevance.md b/.beans/sendou.ink-gk34--improve-tournament-search-relevance.md new file mode 100644 index 000000000..be1647614 --- /dev/null +++ b/.beans/sendou.ink-gk34--improve-tournament-search-relevance.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-h8l0--fix-mobilenav-padding-on-android.md b/.beans/sendou.ink-h8l0--fix-mobilenav-padding-on-android.md new file mode 100644 index 000000000..0df271e07 --- /dev/null +++ b/.beans/sendou.ink-h8l0--fix-mobilenav-padding-on-android.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-iam7--replace-placeholder-logo.md b/.beans/sendou.ink-iam7--replace-placeholder-logo.md new file mode 100644 index 000000000..ad77d9563 --- /dev/null +++ b/.beans/sendou.ink-iam7--replace-placeholder-logo.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-j4zp--remove-and-redirect-u-page.md b/.beans/sendou.ink-j4zp--remove-and-redirect-u-page.md new file mode 100644 index 000000000..82cd4c40b --- /dev/null +++ b/.beans/sendou.ink-j4zp--remove-and-redirect-u-page.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-r6ry--streams-integration-in-sidebar.md b/.beans/sendou.ink-r6ry--streams-integration-in-sidebar.md new file mode 100644 index 000000000..b2b89822f --- /dev/null +++ b/.beans/sendou.ink-r6ry--streams-integration-in-sidebar.md @@ -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. \ No newline at end of file diff --git a/.beans/sendou.ink-s23a--implement-hover-menu-switching.md b/.beans/sendou.ink-s23a--implement-hover-menu-switching.md new file mode 100644 index 000000000..88938f4b3 --- /dev/null +++ b/.beans/sendou.ink-s23a--implement-hover-menu-switching.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-svz2--inline-function-in-notificationpopover.md b/.beans/sendou.ink-svz2--inline-function-in-notificationpopover.md new file mode 100644 index 000000000..6957505ec --- /dev/null +++ b/.beans/sendou.ink-svz2--inline-function-in-notificationpopover.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-vj1n--fix-organizations-icon-in-commandpalette.md b/.beans/sendou.ink-vj1n--fix-organizations-icon-in-commandpalette.md new file mode 100644 index 000000000..1d88293cc --- /dev/null +++ b/.beans/sendou.ink-vj1n--fix-organizations-icon-in-commandpalette.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-vmid--define-navigation-menu-categories.md b/.beans/sendou.ink-vmid--define-navigation-menu-categories.md new file mode 100644 index 000000000..94596b548 --- /dev/null +++ b/.beans/sendou.ink-vmid--define-navigation-menu-categories.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-y2wo--remove-and-redirect-t-page.md b/.beans/sendou.ink-y2wo--remove-and-redirect-t-page.md new file mode 100644 index 000000000..8f6d6c291 --- /dev/null +++ b/.beans/sendou.ink-y2wo--remove-and-redirect-t-page.md @@ -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 \ No newline at end of file diff --git a/.beans/sendou.ink-y9e1--update-sidebar-cache-shape.md b/.beans/sendou.ink-y9e1--update-sidebar-cache-shape.md new file mode 100644 index 000000000..1b7b80a14 --- /dev/null +++ b/.beans/sendou.ink-y9e1--update-sidebar-cache-shape.md @@ -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 \ No newline at end of file diff --git a/app/components/MobileNav.tsx b/app/components/MobileNav.tsx index f234bf4a6..d6b85794e 100644 --- a/app/components/MobileNav.tsx +++ b/app/components/MobileNav.tsx @@ -32,7 +32,6 @@ import { SideNavLink } from "./SideNav"; type SidebarData = Awaited> | 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("closed"); const user = useUser(); diff --git a/app/components/layout/CommandPalette.tsx b/app/components/layout/CommandPalette.tsx index cc983ab2c..f261777de 100644 --- a/app/components/layout/CommandPalette.tsx +++ b/app/components/layout/CommandPalette.tsx @@ -39,7 +39,7 @@ const STORAGE_KEY = "command-palette-search-type"; const SEARCH_TYPE_ICONS: Record = { 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(); diff --git a/app/components/layout/NotificationPopover.tsx b/app/components/layout/NotificationPopover.tsx index 2485b44b0..94f57686d 100644 --- a/app/components/layout/NotificationPopover.tsx +++ b/app/components/layout/NotificationPopover.tsx @@ -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, diff --git a/app/components/layout/TopNavMenus.tsx b/app/components/layout/TopNavMenus.tsx index cbd61d631..3ee84f9ce 100644 --- a/app/components/layout/TopNavMenus.tsx +++ b/app/components/layout/TopNavMenus.tsx @@ -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", diff --git a/app/components/layout/index.tsx b/app/components/layout/index.tsx index f5e3e2f29..9d41b277a 100644 --- a/app/components/layout/index.tsx +++ b/app/components/layout/index.tsx @@ -256,7 +256,6 @@ function SiteTitle() {
- {/** xxx: placeholder logo */} S diff --git a/app/features/search/routes/search.ts b/app/features/search/routes/search.ts index 968df2912..d9b49e42c 100644 --- a/app/features/search/routes/search.ts +++ b/app/features/search/routes/search.ts @@ -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, diff --git a/app/features/sidebar/routes/sidebar.ts b/app/features/sidebar/routes/sidebar.ts index 2f1669e24..e0278aa45 100644 --- a/app/features/sidebar/routes/sidebar.ts +++ b/app/features/sidebar/routes/sidebar.ts @@ -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, diff --git a/app/features/team/routes/t.tsx b/app/features/team/routes/t.tsx index 59999b2a2..38e7d2e6f 100644 --- a/app/features/team/routes/t.tsx +++ b/app/features/team/routes/t.tsx @@ -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(""); diff --git a/app/features/user-search/routes/u.tsx b/app/features/user-search/routes/u.tsx index bd17924cc..413f21c44 100644 --- a/app/features/user-search/routes/u.tsx +++ b/app/features/user-search/routes/u.tsx @@ -41,7 +41,6 @@ export const meta: MetaFunction = (args) => { }); }; -// xxx: deprecate page export default function UserSearchPage() { const { t } = useTranslation(["user"]); const [searchParams, setSearchParams] = useSearchParams();