From 4d2a7ea947bfb8ce00fefce744dea1f91e1afdd0 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Thu, 16 Oct 2025 02:42:13 -0700 Subject: [PATCH] Responsive everything. --- package.components.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 12 +-- src/app/(main)/MobileNav.tsx | 62 ++++++-------- .../[websiteId]/ExpandedViewModal.tsx | 12 ++- .../[websiteId]/WebsiteExpandedMenu.tsx | 10 ++- .../[websiteId]/WebsiteExpandedView.tsx | 50 +++++++----- .../websites/[websiteId]/WebsiteNav.tsx | 20 ++++- .../[websiteId]/sessions/SessionInfo.tsx | 17 ++-- .../[websiteId]/sessions/SessionProfile.tsx | 67 ++++++++------- src/components/common/FilterRecord.tsx | 4 +- src/components/common/HamburgerButton.tsx | 20 ----- src/components/common/LoadingPanel.tsx | 2 +- src/components/common/MobileMenu.module.css | 39 --------- src/components/common/MobileMenu.tsx | 56 ++++--------- src/components/common/SideMenu.tsx | 14 +--- src/components/hooks/useFields.ts | 1 + src/components/input/DateFilter.tsx | 16 +++- src/components/input/FieldFilters.tsx | 44 +++++++++- src/components/input/FilterEditForm.tsx | 81 ++++++++++--------- src/components/input/NavButton.tsx | 5 +- src/components/input/WebsiteFilterButton.tsx | 10 ++- .../metrics/MetricsExpandedTable.tsx | 27 +++++-- 23 files changed, 286 insertions(+), 287 deletions(-) delete mode 100644 src/components/common/HamburgerButton.tsx delete mode 100644 src/components/common/MobileMenu.module.css diff --git a/package.components.json b/package.components.json index 51214f89..ab3454c0 100644 --- a/package.components.json +++ b/package.components.json @@ -1,6 +1,6 @@ { "name": "@umami/components", - "version": "0.129.0", + "version": "0.130.0", "description": "Umami React components.", "author": "Mike Cao ", "license": "MIT", diff --git a/package.json b/package.json index 78ee9268..abad2693 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.2", - "@umami/react-zen": "^0.196.0", + "@umami/react-zen": "^0.198.0", "@umami/redis-client": "^0.29.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f8e6427..280e1dc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,8 +45,8 @@ importers: specifier: ^5.90.2 version: 5.90.2(react@19.1.1) '@umami/react-zen': - specifier: ^0.196.0 - version: 0.196.0(@babel/core@7.28.3)(@types/react@19.1.16)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.1.3)(use-sync-external-store@1.6.0(react@19.1.1)) + specifier: ^0.198.0 + version: 0.198.0(@babel/core@7.28.3)(@types/react@19.1.16)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.1.3)(use-sync-external-store@1.6.0(react@19.1.1)) '@umami/redis-client': specifier: ^0.29.0 version: 0.29.0 @@ -364,6 +364,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 + dist: {} + packages: '@ampproject/remapping@2.3.0': @@ -2754,8 +2756,8 @@ packages: resolution: {integrity: sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@umami/react-zen@0.196.0': - resolution: {integrity: sha512-CLxrDAJOdo+0aJAclOq7naIDg+2I5wP9wXxAFhxhQVPXHV8yUHqH9Ula632cLMo51JYp0l+eEtOtuimpuKX3jg==} + '@umami/react-zen@0.198.0': + resolution: {integrity: sha512-usxXJPz5XnHzJ3Qo2RD0UZw+De/1QOx1f0SJDZNx8TZGLBNFqUHTAZgwOZANP7JgkS9cd4Q+WSobqP4JOp2saQ==} '@umami/redis-client@0.29.0': resolution: {integrity: sha512-Jaqh++jskqDB7ny75pfC02OvKp1JTS4asGDsFrRL3qy8sxL3PAl9+/mybCJe4/6vWrXDJKqpgkSfUDJq2bFjyw==} @@ -10385,7 +10387,7 @@ snapshots: '@typescript-eslint/types': 8.45.0 eslint-visitor-keys: 4.2.1 - '@umami/react-zen@0.196.0(@babel/core@7.28.3)(@types/react@19.1.16)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.1.3)(use-sync-external-store@1.6.0(react@19.1.1))': + '@umami/react-zen@0.198.0(@babel/core@7.28.3)(@types/react@19.1.16)(babel-plugin-react-compiler@19.1.0-rc.2)(immer@10.1.3)(use-sync-external-store@1.6.0(react@19.1.1))': dependencies: '@fontsource/jetbrains-mono': 5.2.8 '@internationalized/date': 3.10.0 diff --git a/src/app/(main)/MobileNav.tsx b/src/app/(main)/MobileNav.tsx index 32751f0e..5fea9f82 100644 --- a/src/app/(main)/MobileNav.tsx +++ b/src/app/(main)/MobileNav.tsx @@ -1,22 +1,11 @@ -import { - Row, - Dialog, - DialogTrigger, - Button, - Icon, - Modal, - NavMenu, - NavMenuItem, - IconLabel, - Text, - Grid, -} from '@umami/react-zen'; -import { Globe, Grid2x2, LinkIcon, Menu } from '@/components/icons'; +import { Row, NavMenu, NavMenuItem, IconLabel, Text, Grid } from '@umami/react-zen'; +import { Globe, Grid2x2, LinkIcon } from '@/components/icons'; import { useMessages, useNavigation } from '@/components/hooks'; import Link from 'next/link'; import { WebsiteNav } from '@/app/(main)/websites/[websiteId]/WebsiteNav'; import { Logo } from '@/components/svg'; import { NavButton } from '@/components/input/NavButton'; +import { MobileMenu } from '@/components/common/MobileMenu'; export function MobileNav() { const { formatMessage, labels } = useMessages(); @@ -45,30 +34,27 @@ export function MobileNav() { return ( - - - - - - - {links.map(link => { - return ( - - - - - - ); - })} - - {websiteId && } - - - + + {({ close }) => { + return ( + <> + + + {links.map(link => { + return ( + + + + + + ); + })} + + {websiteId && } + + ); + }} + } style={{ width: 'auto' }}> umami diff --git a/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx index 76a17fbb..08503334 100644 --- a/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx +++ b/src/app/(main)/websites/[websiteId]/ExpandedViewModal.tsx @@ -1,4 +1,4 @@ -import { Dialog, Modal } from '@umami/react-zen'; +import { Dialog, Modal, useBreakpoint } from '@umami/react-zen'; import { WebsiteExpandedView } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedView'; import { useNavigation } from '@/components/hooks'; @@ -14,6 +14,8 @@ export function ExpandedViewModal({ query: { view }, updateParams, } = useNavigation(); + const breakpoint = useBreakpoint(); + const isMobile = ['xs', 'sm', 'md'].includes(breakpoint); const handleClose = (close: () => void) => { router.push(updateParams({ view: undefined })); @@ -28,7 +30,13 @@ export function ExpandedViewModal({ return ( - + {({ close }) => { return ( void; +}) { const { formatMessage, labels } = useMessages(); const { updateParams, @@ -173,5 +179,5 @@ export function WebsiteExpandedMenu({ excludedIds = [] }: { excludedIds?: string }, ]; - return ; + return ; } diff --git a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx index 3fc6a1de..f8d4c5f4 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteExpandedView.tsx @@ -1,7 +1,8 @@ -import { Grid, Column } from '@umami/react-zen'; +import { Grid, Column, Row } from '@umami/react-zen'; import { useMessages, useNavigation } from '@/components/hooks'; import { MetricsExpandedTable } from '@/components/metrics/MetricsExpandedTable'; import { WebsiteExpandedMenu } from '@/app/(main)/websites/[websiteId]/WebsiteExpandedMenu'; +import { MobileMenu } from '@/components/common/MobileMenu'; export function WebsiteExpandedView({ websiteId, @@ -18,24 +19,33 @@ export function WebsiteExpandedView({ } = useNavigation(); return ( - - - - - - - - + + + + {({ close }) => { + return ; + }} + + + + + + + + + + + ); } diff --git a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx index bbbb0614..d63b1ad3 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteNav.tsx @@ -1,4 +1,4 @@ -import { Text } from '@umami/react-zen'; +import { Text, Column } from '@umami/react-zen'; import { Eye, User, @@ -14,7 +14,13 @@ import { useMessages, useNavigation } from '@/components/hooks'; import { SideMenu } from '@/components/common/SideMenu'; import { WebsiteSelect } from '@/components/input/WebsiteSelect'; -export function WebsiteNav({ websiteId }: { websiteId: string }) { +export function WebsiteNav({ + websiteId, + onItemClick, +}: { + websiteId: string; + onItemClick?: () => void; +}) { const { formatMessage, labels } = useMessages(); const { pathname, renderUrl, teamId, router } = useNavigation(); @@ -155,7 +161,7 @@ export function WebsiteNav({ websiteId }: { websiteId: string }) { .find(({ path }) => path && pathname.endsWith(path.split('?')[0]))?.id; return ( - + - + + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx index c2127cf5..e968daba 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionInfo.tsx @@ -1,9 +1,8 @@ import { ReactNode } from 'react'; -import { Icon, TextField, Column, Row, Label } from '@umami/react-zen'; +import { Icon, Grid, Column, Row, Label } from '@umami/react-zen'; import { useFormat, useLocale, useMessages, useRegionNames } from '@/components/hooks'; import { TypeIcon } from '@/components/common/TypeIcon'; -import { KeyRound, Calendar } from '@/components/icons'; -import { Location } from '@/components/svg'; +import { KeyRound, Calendar, MapPin, Landmark } from '@/components/icons'; import { DateDistance } from '@/components/common/DateDistance'; export function SessionInfo({ data }) { @@ -13,11 +12,7 @@ export function SessionInfo({ data }) { const { getRegionName } = useRegionNames(locale); return ( - - - - - + }> {data?.distinctId} @@ -37,11 +32,11 @@ export function SessionInfo({ data }) { {formatValue(data?.country, 'country')} - }> + }> {getRegionName(data?.region)} - }> + }> {data?.city} @@ -65,7 +60,7 @@ export function SessionInfo({ data }) { > {formatValue(data?.device, 'device')} - + ); } diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx index bdbfbc58..831b89c7 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionProfile.tsx @@ -1,4 +1,14 @@ -import { Grid, Row, Column, Tabs, TabList, Tab, TabPanel, Icon, Button } from '@umami/react-zen'; +import { + TextField, + Row, + Column, + Tabs, + TabList, + Tab, + TabPanel, + Icon, + Button, +} from '@umami/react-zen'; import { Avatar } from '@/components/common/Avatar'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { X } from '@/components/icons'; @@ -37,35 +47,34 @@ export function SessionProfile({ - - - - - - - - - + + + + + + + + + - - - {formatMessage(labels.activity)} - {formatMessage(labels.properties)} - - - - - - - - - - + + + {formatMessage(labels.activity)} + {formatMessage(labels.properties)} + + + + + + + + + )} diff --git a/src/components/common/FilterRecord.tsx b/src/components/common/FilterRecord.tsx index 7278d23c..4cc36d43 100644 --- a/src/components/common/FilterRecord.tsx +++ b/src/components/common/FilterRecord.tsx @@ -65,11 +65,11 @@ export function FilterRecord({ - +