This introduces a user-scoped dashboard with board-style view/edit pages while keeping it unavailable in team context, and moves website targeting to component config so dashboard components can each select their own website.
Separate day name headers into their own grid row instead of embedding
them inside the hourly data grid with marginBottom, which pushed the
text outside the fixed 16px row height.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace raw strings with useMessages hook in BoardColumn and BoardComponentSelect
- Show WebsiteControls on edit screen so users can test filters
- Disable board body editing until a website is selected
- Scope website select to team websites when editing a team board
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create UserButton component at bottom of SideNav with Settings, Language,
Theme, Admin, and Logout menu items
- Move Settings/Logout/Admin/Docs/Support out of NavButton into UserButton
- Remove LanguageButton and ThemeButton from SideNav bottom
- Refactor NavButton into TeamsButton with simplified team switching
- Simplify WebsiteNav and move TeamsButton to App top bar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rewrite messages.ts to plain string key maps (remove MessageDescriptor)
- Rewrite useMessages hook to expose t from useTranslations() directly
- Rename formatMessage → t across 193 consumer files
- Replace custom FormattedMessage component with next-intl t.rich()
- Update 52 language files to use rich text tags (<b>, <a>)
- Remove all direct imports from @/components/messages in favor of useMessages()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate i18n from react-intl to next-intl, eliminating the formatjs
compilation pipeline. Translation files now live as nested JSON in
public/intl/messages/ (single source of truth), removing the duplicated
src/lang/ directory and the copy/compile build steps. The useMessages()
hook API is preserved so all 195+ consumer components are unchanged.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fall back to queried website name when local state hasn't been set yet,
since useState only captures the initial value which is undefined before
the query resolves.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the separate 240px WebsiteNav sidebar with website navigation
integrated into the main SideNav. When a websiteId is active, SideNav
shows a back arrow, WebsiteSelect dropdown, and grouped nav items
instead of the main links. Extract shared useWebsiteNavItems hook used
by both SideNav and WebsiteNav (still used by MobileNav).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove unnecessary wrapper Row around DateFilter and set min-width
on the date picker popover to 200px.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show NavButton text whenever sidebar is not collapsed, not only on
pages without sub-navigation. Also remove unused Sidebar component.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace render function children with mapped ListItem elements and remove
the unsupported items prop across all Select instances.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename SideMenu to NavMenu with visible group title labels and selected item highlighting
- Update react-zen to 0.242.0 and fix responsive breakpoints (xs -> base)
- Style floating tooltips with inverted background across WorldMap, charts, and WeeklyTraffic
- Add CSS variables for primary color and use IconLabel consistently
- Remove stray console.log from LoadingPanel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
/boards/[id] is now view mode (read-only) with an edit button.
/boards/[id]/edit is edit mode with save and cancel buttons.
Save navigates back to view, cancel discards changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove fixed width, position, and border on mobile
- Use 100% width when onItemClick is provided (mobile context)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>