diff --git a/package.json b/package.json index 973ccfc3e..48b5481d0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "type": "module", "scripts": { - "dev": "next dev -p 4444 --turbo", + "dev": "next dev -p 3001 --turbo", "build": "npm-run-all check-env build-db check-db build-tracker build-geo build-app", "start": "next start", "build-docker": "npm-run-all build-db build-tracker build-geo build-app", @@ -72,7 +72,7 @@ "@react-spring/web": "^10.0.3", "@svgr/cli": "^8.1.0", "@tanstack/react-query": "^5.90.20", - "@umami/react-zen": "^0.239.0", + "@umami/react-zen": "^0.242.0", "@umami/redis-client": "^0.30.0", "bcryptjs": "^3.0.2", "chalk": "^5.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8313e17f..480d489dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: ^5.90.20 version: 5.90.20(react@19.2.4) '@umami/react-zen': - specifier: ^0.239.0 - version: 0.239.0(@types/react@19.2.13)(immer@10.2.0)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4)) + specifier: ^0.242.0 + version: 0.242.0(@types/react@19.2.13)(immer@10.2.0)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4)) '@umami/redis-client': specifier: ^0.30.0 version: 0.30.0 @@ -1469,9 +1469,6 @@ packages: cpu: [x64] os: [win32] - '@internationalized/date@3.10.1': - resolution: {integrity: sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==} - '@internationalized/date@3.11.0': resolution: {integrity: sha512-BOx5huLAWhicM9/ZFs84CzP+V3gBW6vlpM02yzsdYC7TGlZJX1OJiEEHcSayF00Z+3jLlm4w79amvSt6RqKN3Q==} @@ -1834,12 +1831,6 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/focus@3.21.3': - resolution: {integrity: sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/focus@3.21.4': resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} peerDependencies: @@ -1870,12 +1861,6 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.26.0': - resolution: {integrity: sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.27.0': resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} peerDependencies: @@ -2053,12 +2038,6 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.32.0': - resolution: {integrity: sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.33.0': resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} peerDependencies: @@ -2391,11 +2370,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.32.1': - resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.33.0': resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} peerDependencies: @@ -2914,8 +2888,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@umami/react-zen@0.239.0': - resolution: {integrity: sha512-6CSPYPnpCnau+Ie8nyC1BDVFrNoes5XOuy+b6hb6htDTvqTKIB8nvky0hJHe6kLz6Kp7xTbknjP+PQ5EnLBC6w==} + '@umami/react-zen@0.242.0': + resolution: {integrity: sha512-dahKoYDrFg1MVjww6M0RpUacFidHoXBRuFKOe68AZ9PWQaXX/kUweo/5m1YzmUMcnouwwCer/rAzCfHJ2Vso9w==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-aria-components: ^1.0.0 @@ -8181,10 +8155,6 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@internationalized/date@3.10.1': - dependencies: - '@swc/helpers': 0.5.18 - '@internationalized/date@3.11.0': dependencies: '@swc/helpers': 0.5.18 @@ -8768,16 +8738,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@react-aria/focus@3.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/interactions': 3.26.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-aria/utils': 3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-types/shared': 3.32.1(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - '@react-aria/focus@3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-aria/interactions': 3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -8844,16 +8804,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@react-aria/interactions@3.26.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-aria/utils': 3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.32.1(react@19.2.4) - '@swc/helpers': 0.5.18 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - '@react-aria/interactions@3.27.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-aria/ssr': 3.9.10(react@19.2.4) @@ -9216,17 +9166,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@react-aria/utils@3.32.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@react-aria/ssr': 3.9.10(react@19.2.4) - '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.11.0(react@19.2.4) - '@react-types/shared': 3.32.1(react@19.2.4) - '@swc/helpers': 0.5.18 - clsx: 2.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - '@react-aria/utils@3.33.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@react-aria/ssr': 3.9.10(react@19.2.4) @@ -9696,10 +9635,6 @@ snapshots: '@react-types/shared': 3.33.0(react@19.2.4) react: 19.2.4 - '@react-types/shared@3.32.1(react@19.2.4)': - dependencies: - react: 19.2.4 - '@react-types/shared@3.33.0(react@19.2.4)': dependencies: react: 19.2.4 @@ -10157,10 +10092,10 @@ snapshots: '@types/node': 24.10.11 optional: true - '@umami/react-zen@0.239.0(@types/react@19.2.13)(immer@10.2.0)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4))': + '@umami/react-zen@0.242.0(@types/react@19.2.13)(immer@10.2.0)(react-aria-components@1.14.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(tailwindcss@4.1.18)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: - '@internationalized/date': 3.10.1 - '@react-aria/focus': 3.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@internationalized/date': 3.11.0 + '@react-aria/focus': 3.21.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@react-spring/web': 9.7.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) clsx: 2.1.1 lucide-react: 0.555.0(react@19.2.4) diff --git a/src/app/(main)/admin/AdminLayout.tsx b/src/app/(main)/admin/AdminLayout.tsx index 3c8fa20a1..0164fba4b 100644 --- a/src/app/(main)/admin/AdminLayout.tsx +++ b/src/app/(main)/admin/AdminLayout.tsx @@ -13,9 +13,9 @@ export function AdminLayout({ children }: { children: ReactNode }) { } return ( - + void }) { ?.find(({ path }) => path && pathname.startsWith(path))?.id; return ( - + void }) { .find(({ path }) => path && pathname.includes(path.split('?')[0]))?.id; return ( - - + @@ -104,7 +104,7 @@ export function Attribution({ - + diff --git a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx index 48611c46e..485277f20 100644 --- a/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx +++ b/src/app/(main)/websites/[websiteId]/(reports)/attribution/AttributionPage.tsx @@ -17,7 +17,7 @@ export function AttributionPage({ websiteId }: { websiteId: string }) { return ( - + type === 'string')} value={operator} diff --git a/src/components/common/GridRow.tsx b/src/components/common/GridRow.tsx index 72f1db6ec..2fd01ed02 100644 --- a/src/components/common/GridRow.tsx +++ b/src/components/common/GridRow.tsx @@ -4,18 +4,18 @@ const LAYOUTS = { one: { columns: '1fr' }, two: { columns: { - xs: '1fr', + base: '1fr', md: 'repeat(auto-fill, minmax(560px, 1fr))', }, }, three: { columns: { - xs: '1fr', + base: '1fr', md: 'repeat(auto-fill, minmax(360px, 1fr))', }, }, - 'one-two': { columns: { xs: '1fr', md: 'repeat(3, 1fr)' } }, - 'two-one': { columns: { xs: '1fr', md: 'repeat(3, 1fr)' } }, + 'one-two': { columns: { base: '1fr', md: 'repeat(3, 1fr)' } }, + 'two-one': { columns: { base: '1fr', md: 'repeat(3, 1fr)' } }, }; export function GridRow(props: { diff --git a/src/components/common/LoadingPanel.tsx b/src/components/common/LoadingPanel.tsx index 635b783da..fb37e1408 100644 --- a/src/components/common/LoadingPanel.tsx +++ b/src/components/common/LoadingPanel.tsx @@ -29,8 +29,6 @@ export function LoadingPanel({ }: LoadingPanelProps): ReactNode { const empty = isEmpty ?? checkEmpty(data); - console.log({ empty, isEmpty, data }); - // Show loading spinner only if no data exists if (isLoading || isFetching) { return ( diff --git a/src/components/common/SideMenu.tsx b/src/components/common/NavMenu.tsx similarity index 57% rename from src/components/common/SideMenu.tsx rename to src/components/common/NavMenu.tsx index 6c7f7fc11..8f5f599b3 100644 --- a/src/components/common/SideMenu.tsx +++ b/src/components/common/NavMenu.tsx @@ -2,39 +2,46 @@ import { Column, Heading, Row, Text } from '@umami/react-zen'; import Link from 'next/link'; import { IconLabel } from '@/components/common/IconLabel'; -interface SideMenuData { +interface NavMenuData { id: string; label: string; icon?: any; path: string; } -interface SideMenuItems { +interface NavMenuItems { label?: string; - items: SideMenuData[]; + items: NavMenuData[]; } -export interface SideMenuProps { - items: SideMenuItems[]; +export interface NavMenuProps { + items: NavMenuItems[]; title?: string; selectedKey?: string; allowMinimize?: boolean; + onItemClick?: () => void; } -export function SideMenu({ +export function NavMenu({ items = [], title, selectedKey, allowMinimize, + onItemClick, ...props -}: SideMenuProps) { - const renderItems = (items: SideMenuData[]) => { +}: NavMenuProps) { + const renderItems = (items: NavMenuData[]) => { return items?.map(({ id, label, icon, path }) => { const isSelected = selectedKey === id; return ( - - + + {label} @@ -45,13 +52,7 @@ export function SideMenu({ }; return ( - + {title && ( {title} @@ -61,13 +62,10 @@ export function SideMenu({ {items?.map(({ label, items }, index) => { if (label) { return ( - + + + {label} + {renderItems(items)} ); diff --git a/src/components/common/PageBody.tsx b/src/components/common/PageBody.tsx index c70b9dfec..9feab71fe 100644 --- a/src/components/common/PageBody.tsx +++ b/src/components/common/PageBody.tsx @@ -34,7 +34,7 @@ export function PageBody({ minHeight="100vh" paddingBottom="6" maxWidth={maxWidth} - paddingX={{ xs: '3', md: '6' }} + paddingX={{ base: '3', md: '6' }} style={{ margin: '0 auto' }} > {children} diff --git a/src/components/hooks/useMobile.ts b/src/components/hooks/useMobile.ts index 6b40f3da1..c3b659720 100644 --- a/src/components/hooks/useMobile.ts +++ b/src/components/hooks/useMobile.ts @@ -2,8 +2,8 @@ import { useBreakpoint } from '@umami/react-zen'; export function useMobile() { const breakpoint = useBreakpoint(); - const isMobile = ['xs', 'sm', 'md'].includes(breakpoint); - const isPhone = ['xs', 'sm'].includes(breakpoint); + const isMobile = ['base', 'sm', 'md'].includes(breakpoint); + const isPhone = ['base', 'sm'].includes(breakpoint); return { breakpoint, isMobile, isPhone }; } diff --git a/src/components/input/DownloadButton.tsx b/src/components/input/DownloadButton.tsx index 5df3305d4..47e6d00e4 100644 --- a/src/components/input/DownloadButton.tsx +++ b/src/components/input/DownloadButton.tsx @@ -1,4 +1,4 @@ -import { Button, Icon, Tooltip, TooltipTrigger } from '@umami/react-zen'; +import { Button, Icon, Text, Tooltip, TooltipTrigger } from '@umami/react-zen'; import Papa from 'papaparse'; import { useMessages } from '@/components/hooks'; import { Download } from '@/components/icons'; @@ -24,7 +24,9 @@ export function DownloadButton({ - {formatMessage(labels.download)} + + {formatMessage(labels.download)} + ); } diff --git a/src/components/input/FieldFilters.tsx b/src/components/input/FieldFilters.tsx index b61e638e2..2a80bb04a 100644 --- a/src/components/input/FieldFilters.tsx +++ b/src/components/input/FieldFilters.tsx @@ -69,8 +69,8 @@ export function FieldFilters({ websiteId, value, exclude = [], onChange }: Field }; return ( - - + +