@litemetrics/ui 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +169 -0
- package/dist/WorldMapInner-AJ3WDZR2.js +46 -0
- package/dist/WorldMapInner-AJ3WDZR2.js.map +1 -0
- package/dist/chunk-CBT6H723.js +192 -0
- package/dist/chunk-CBT6H723.js.map +1 -0
- package/dist/index.cjs +1360 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +269 -0
- package/dist/index.d.ts +269 -0
- package/dist/index.js +1050 -0
- package/dist/index.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/index.ts","../src/context/LitemetricsUIContext.tsx","../src/context/LitemetricsProvider.tsx","../src/hooks/queryKeys.ts","../src/hooks/useLitemetricsUI.ts","../src/hooks/useStats.ts","../src/hooks/useTimeSeries.ts","../src/hooks/useOverview.ts","../src/hooks/useThemeColors.ts","../src/utils/theme.ts","../src/components/StatCard.tsx","../src/components/TopList.tsx","../src/utils/icons.tsx","../src/components/PieChartCard.tsx","../src/components/PeriodSelector.tsx","../src/components/DateRangePicker.tsx","../src/components/ExportButton.tsx","../src/widgets/StatCards.tsx","../src/widgets/TimeSeriesChart.tsx","../src/utils/formatters.ts","../src/widgets/TopPages.tsx","../src/widgets/TopReferrers.tsx","../src/widgets/TopCountries.tsx","../src/widgets/TopEvents.tsx","../src/widgets/TopBrowsers.tsx","../src/widgets/TopDevices.tsx","../src/widgets/BrowsersChart.tsx","../src/widgets/DevicesChart.tsx","../src/widgets/WorldMap.tsx","../src/widgets/AnalyticsDashboard.tsx"],"sourcesContent":["export interface LitemetricsTheme {\n bg?: string;\n bgSecondary?: string;\n bgTertiary?: string;\n border?: string;\n borderHover?: string;\n text?: string;\n textSecondary?: string;\n textTertiary?: string;\n textMuted?: string;\n accent?: string;\n accentLight?: string;\n accentText?: string;\n accentHover?: string;\n positive?: string;\n negative?: string;\n chartStroke?: string;\n chartFill?: string;\n chartGrid?: string;\n chartAxis?: string;\n tooltipBg?: string;\n tooltipText?: string;\n tooltipMuted?: string;\n bar?: string;\n barHover?: string;\n pie1?: string;\n pie2?: string;\n pie3?: string;\n pie4?: string;\n pie5?: string;\n pie6?: string;\n pie7?: string;\n pie8?: string;\n mapEmpty?: string;\n mapStroke?: string;\n mapHover?: string;\n}\n\nconst KEY_TO_VAR: Record<keyof LitemetricsTheme, string> = {\n bg: '--lm-bg',\n bgSecondary: '--lm-bg-secondary',\n bgTertiary: '--lm-bg-tertiary',\n border: '--lm-border',\n borderHover: '--lm-border-hover',\n text: '--lm-text',\n textSecondary: '--lm-text-secondary',\n textTertiary: '--lm-text-tertiary',\n textMuted: '--lm-text-muted',\n accent: '--lm-accent',\n accentLight: '--lm-accent-light',\n accentText: '--lm-accent-text',\n accentHover: '--lm-accent-hover',\n positive: '--lm-positive',\n negative: '--lm-negative',\n chartStroke: '--lm-chart-stroke',\n chartFill: '--lm-chart-fill',\n chartGrid: '--lm-chart-grid',\n chartAxis: '--lm-chart-axis',\n tooltipBg: '--lm-tooltip-bg',\n tooltipText: '--lm-tooltip-text',\n tooltipMuted: '--lm-tooltip-muted',\n bar: '--lm-bar',\n barHover: '--lm-bar-hover',\n pie1: '--lm-pie-1',\n pie2: '--lm-pie-2',\n pie3: '--lm-pie-3',\n pie4: '--lm-pie-4',\n pie5: '--lm-pie-5',\n pie6: '--lm-pie-6',\n pie7: '--lm-pie-7',\n pie8: '--lm-pie-8',\n mapEmpty: '--lm-map-empty',\n mapStroke: '--lm-map-stroke',\n mapHover: '--lm-map-hover',\n};\n\nexport const defaultTheme: Required<LitemetricsTheme> = {\n bg: '255 255 255',\n bgSecondary: '250 250 250',\n bgTertiary: '244 244 245',\n border: '228 228 231',\n borderHover: '212 212 216',\n text: '24 24 27',\n textSecondary: '113 113 122',\n textTertiary: '161 161 170',\n textMuted: '212 212 216',\n accent: '99 102 241',\n accentLight: '238 242 255',\n accentText: '67 56 202',\n accentHover: '129 140 248',\n positive: '5 150 105',\n negative: '239 68 68',\n chartStroke: '99 102 241',\n chartFill: '99 102 241',\n chartGrid: '244 244 245',\n chartAxis: '161 161 170',\n tooltipBg: '24 24 27',\n tooltipText: '255 255 255',\n tooltipMuted: '161 161 170',\n bar: '238 242 255',\n barHover: '224 231 255',\n pie1: '99 102 241',\n pie2: '139 92 246',\n pie3: '59 130 246',\n pie4: '20 184 166',\n pie5: '16 185 129',\n pie6: '245 158 11',\n pie7: '239 68 68',\n pie8: '236 72 153',\n mapEmpty: '244 244 245',\n mapStroke: '228 228 231',\n mapHover: '129 140 248',\n};\n\nexport const darkTheme: Required<LitemetricsTheme> = {\n bg: '24 24 27',\n bgSecondary: '39 39 42',\n bgTertiary: '63 63 70',\n border: '63 63 70',\n borderHover: '82 82 91',\n text: '244 244 245',\n textSecondary: '161 161 170',\n textTertiary: '113 113 122',\n textMuted: '82 82 91',\n accent: '129 140 248',\n accentLight: '30 27 75',\n accentText: '165 180 252',\n accentHover: '165 180 252',\n positive: '52 211 153',\n negative: '248 113 113',\n chartStroke: '129 140 248',\n chartFill: '129 140 248',\n chartGrid: '63 63 70',\n chartAxis: '113 113 122',\n tooltipBg: '244 244 245',\n tooltipText: '24 24 27',\n tooltipMuted: '113 113 122',\n bar: '30 27 75',\n barHover: '49 46 129',\n pie1: '129 140 248',\n pie2: '167 139 250',\n pie3: '96 165 250',\n pie4: '45 212 191',\n pie5: '52 211 153',\n pie6: '251 191 36',\n pie7: '248 113 113',\n pie8: '244 114 182',\n mapEmpty: '39 39 42',\n mapStroke: '63 63 70',\n mapHover: '165 180 252',\n};\n\nexport function themeToCSS(theme: Partial<LitemetricsTheme>): string {\n return Object.entries(theme)\n .filter(([, v]) => v !== undefined)\n .map(([key, value]) => `${KEY_TO_VAR[key as keyof LitemetricsTheme]}: ${value};`)\n .join('\\n ');\n}\n\nexport function buildStyleSheet(\n light?: Partial<LitemetricsTheme>,\n dark?: Partial<LitemetricsTheme>,\n): string {\n const mergedLight = { ...defaultTheme, ...light };\n const mergedDark = { ...darkTheme, ...dark };\n\n return `:root, .litemetrics-light {\\n ${themeToCSS(mergedLight)}\\n}\\n\\n.dark, .litemetrics-dark {\\n ${themeToCSS(mergedDark)}\\n}`;\n}\n\nexport const STYLE_ID = 'litemetrics-ui-theme';\n","import { createContext } from 'react';\nimport type { LitemetricsClient } from '@litemetrics/client';\nimport type { Period } from '@litemetrics/core';\n\nexport interface LitemetricsUIContextValue {\n client: LitemetricsClient;\n siteId: string;\n period: Period;\n setPeriod: (period: Period) => void;\n dateFrom: string;\n setDateFrom: (date: string) => void;\n dateTo: string;\n setDateTo: (date: string) => void;\n staleTime: number;\n}\n\nexport const LitemetricsUIContext = createContext<LitemetricsUIContextValue | null>(null);\n","import { useState, useMemo, useEffect, type ReactNode } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { createClient } from '@litemetrics/client';\nimport type { Period } from '@litemetrics/core';\nimport { LitemetricsUIContext, type LitemetricsUIContextValue } from './LitemetricsUIContext';\nimport { buildStyleSheet, STYLE_ID, type LitemetricsTheme } from '../theme';\n\ninterface LitemetricsProviderProps {\n baseUrl: string;\n siteId: string;\n secretKey?: string;\n defaultPeriod?: Period;\n queryClient?: QueryClient;\n staleTime?: number;\n theme?: Partial<LitemetricsTheme>;\n darkTheme?: Partial<LitemetricsTheme>;\n children: ReactNode;\n}\n\nexport function LitemetricsProvider({\n baseUrl,\n siteId,\n secretKey,\n defaultPeriod = '7d',\n queryClient: externalQueryClient,\n staleTime = 30_000,\n theme,\n darkTheme: darkThemeProp,\n children,\n}: LitemetricsProviderProps) {\n const [period, setPeriod] = useState<Period>(defaultPeriod);\n const [dateFrom, setDateFrom] = useState('');\n const [dateTo, setDateTo] = useState('');\n\n const client = useMemo(\n () => createClient({ baseUrl, siteId, secretKey }),\n [baseUrl, siteId, secretKey],\n );\n\n const internalQueryClient = useMemo(\n () => new QueryClient({ defaultOptions: { queries: { staleTime } } }),\n [staleTime],\n );\n\n const queryClient = externalQueryClient ?? internalQueryClient;\n\n // Inject CSS custom properties via <style> tag\n useEffect(() => {\n const css = buildStyleSheet(theme, darkThemeProp);\n let el = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!el) {\n el = document.createElement('style');\n el.id = STYLE_ID;\n document.head.appendChild(el);\n }\n el.textContent = css;\n return () => {\n el?.remove();\n };\n }, [theme, darkThemeProp]);\n\n const value = useMemo<LitemetricsUIContextValue>(\n () => ({ client, siteId, period, setPeriod, dateFrom, setDateFrom, dateTo, setDateTo, staleTime }),\n [client, siteId, period, dateFrom, dateTo, staleTime],\n );\n\n const content = (\n <LitemetricsUIContext.Provider value={value}>\n {children}\n </LitemetricsUIContext.Provider>\n );\n\n if (externalQueryClient) {\n return content;\n }\n\n return (\n <QueryClientProvider client={queryClient}>\n {content}\n </QueryClientProvider>\n );\n}\n","const PREFIX = 'litemetrics-ui' as const;\n\nexport const queryKeys = {\n stats: (siteId: string, metric: string, period: string, dateFrom?: string, dateTo?: string) =>\n [PREFIX, 'stats', siteId, metric, period, dateFrom, dateTo] as const,\n timeSeries: (siteId: string, metric: string, period: string) =>\n [PREFIX, 'timeSeries', siteId, metric, period] as const,\n overview: (siteId: string, period: string, dateFrom?: string, dateTo?: string) =>\n [PREFIX, 'overview', siteId, period, dateFrom, dateTo] as const,\n worldMap: (siteId: string, period: string) =>\n [PREFIX, 'worldMap', siteId, period] as const,\n};\n","import { useContext } from 'react';\nimport { LitemetricsUIContext, type LitemetricsUIContextValue } from '../context/LitemetricsUIContext';\n\nexport function useLitemetricsUI(): LitemetricsUIContextValue {\n const ctx = useContext(LitemetricsUIContext);\n if (!ctx) {\n throw new Error('useLitemetricsUI must be used within a <LitemetricsProvider>');\n }\n return ctx;\n}\n","import { useQuery } from '@tanstack/react-query';\nimport type { Metric, Period, QueryResult } from '@litemetrics/core';\nimport { useLitemetricsUI } from './useLitemetricsUI';\nimport { queryKeys } from './queryKeys';\n\ninterface UseStatsOptions {\n period?: Period;\n limit?: number;\n enabled?: boolean;\n}\n\nexport function useStats(metric: Metric, options?: UseStatsOptions) {\n const { client, siteId, period: ctxPeriod, dateFrom, dateTo, staleTime } = useLitemetricsUI();\n const period = options?.period ?? ctxPeriod;\n\n const statsOptions = period === 'custom' && dateFrom && dateTo\n ? { period, dateFrom: new Date(dateFrom).toISOString(), dateTo: new Date(dateTo + 'T23:59:59').toISOString(), limit: options?.limit, compare: true }\n : { period, limit: options?.limit, compare: true };\n\n return useQuery<QueryResult>({\n queryKey: queryKeys.stats(siteId, metric, period, dateFrom, dateTo),\n queryFn: async () => {\n client.setSiteId(siteId);\n return client.getStats(metric, statsOptions);\n },\n staleTime,\n enabled: options?.enabled !== false && (period !== 'custom' || (!!dateFrom && !!dateTo)),\n });\n}\n","import { useQuery } from '@tanstack/react-query';\nimport type { Period, TimeSeriesResult } from '@litemetrics/core';\nimport type { ChartMetric } from '../types';\nimport { useLitemetricsUI } from './useLitemetricsUI';\nimport { queryKeys } from './queryKeys';\n\ninterface UseTimeSeriesOptions {\n period?: Period;\n enabled?: boolean;\n}\n\nexport function useTimeSeries(metric: ChartMetric, options?: UseTimeSeriesOptions) {\n const { client, siteId, period: ctxPeriod, staleTime } = useLitemetricsUI();\n const period = options?.period ?? ctxPeriod;\n\n return useQuery<TimeSeriesResult>({\n queryKey: queryKeys.timeSeries(siteId, metric, period),\n queryFn: async () => {\n client.setSiteId(siteId);\n return client.getTimeSeries(metric, { period });\n },\n staleTime,\n enabled: options?.enabled !== false,\n });\n}\n","import { useQuery } from '@tanstack/react-query';\nimport type { Metric, Period, QueryResult } from '@litemetrics/core';\nimport { useLitemetricsUI } from './useLitemetricsUI';\nimport { queryKeys } from './queryKeys';\n\ninterface UseOverviewOptions {\n period?: Period;\n metrics?: Metric[];\n enabled?: boolean;\n}\n\nexport function useOverview(options?: UseOverviewOptions) {\n const { client, siteId, period: ctxPeriod, dateFrom, dateTo, staleTime } = useLitemetricsUI();\n const period = options?.period ?? ctxPeriod;\n const metrics = options?.metrics ?? ['pageviews', 'visitors', 'sessions', 'events'] as Metric[];\n\n const statsOptions = period === 'custom' && dateFrom && dateTo\n ? { period, dateFrom: new Date(dateFrom).toISOString(), dateTo: new Date(dateTo + 'T23:59:59').toISOString(), compare: true }\n : { period, compare: true };\n\n return useQuery<Record<Metric, QueryResult>>({\n queryKey: queryKeys.overview(siteId, period, dateFrom, dateTo),\n queryFn: async () => {\n client.setSiteId(siteId);\n return client.getOverview(metrics, statsOptions);\n },\n staleTime,\n enabled: options?.enabled !== false && (period !== 'custom' || (!!dateFrom && !!dateTo)),\n });\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { cssVar } from '../utils/theme';\n\n/**\n * Hook that re-renders when the `<html>` element's class list changes (e.g. dark mode toggle).\n * Returns a `get()` helper that reads CSS custom properties as rgb() strings — perfect for\n * Recharts / SVG attributes that require concrete color values rather than Tailwind classes.\n */\nexport function useThemeColors() {\n const [, setTick] = useState(0);\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const target = document.documentElement;\n const observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === 'attributes' && (m.attributeName === 'class' || m.attributeName === 'style')) {\n setTick((t) => t + 1);\n break;\n }\n }\n });\n observer.observe(target, { attributes: true, attributeFilter: ['class', 'style'] });\n return () => observer.disconnect();\n }, []);\n\n const get = useCallback((varName: string, fallback?: string) => cssVar(varName, fallback), []);\n\n return { get };\n}\n","/** Read a CSS custom property and return it as an rgb() string for SVG/Recharts use */\nexport function cssVar(name: string, fallback?: string): string {\n if (typeof document === 'undefined') return fallback ? `rgb(${fallback})` : '';\n const raw = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n if (!raw) return fallback ? `rgb(${fallback})` : '';\n // If it looks like an RGB triplet (space-separated numbers), wrap in rgb()\n if (/^\\d+\\s+\\d+\\s+\\d+$/.test(raw)) return `rgb(${raw.replace(/ /g, ', ')})`;\n return raw;\n}\n\nconst DEFAULT_PIE = [\n '99 102 241', '139 92 246', '59 130 246', '20 184 166',\n '16 185 129', '245 158 11', '239 68 68', '236 72 153',\n];\n\n/** Read --lm-pie-1..8 CSS variables, returning hex/rgb strings for Recharts Cell fill */\nexport function getPieColors(): string[] {\n return Array.from({ length: 8 }, (_, i) =>\n cssVar(`--lm-pie-${i + 1}`, DEFAULT_PIE[i]),\n );\n}\n","interface StatCardProps {\n title: string;\n value: number | string;\n loading?: boolean;\n previousValue?: number;\n changePercent?: number;\n className?: string;\n}\n\nexport function StatCard({ title, value, loading, changePercent, className }: StatCardProps) {\n const hasComparison = changePercent !== undefined && changePercent !== null;\n const isPositive = hasComparison && changePercent! > 0;\n const isNegative = hasComparison && changePercent! < 0;\n\n return (\n <div className={`rounded-xl bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] p-6 hover:border-[rgb(var(--lm-border-hover))] hover:shadow-md hover:-translate-y-0.5 transition-all duration-200 ${className ?? ''}`}>\n <p className=\"text-xs font-medium text-[rgb(var(--lm-text-tertiary))] uppercase tracking-wide mb-1\">{title}</p>\n {loading ? (\n <div className=\"h-8 w-20 bg-[rgb(var(--lm-bg-tertiary))] rounded animate-pulse\" />\n ) : (\n <div className=\"flex items-end gap-2\">\n <p className=\"text-3xl font-semibold tabular-nums text-[rgb(var(--lm-text))]\">\n {typeof value === 'number' ? value.toLocaleString() : value}\n </p>\n {hasComparison && (\n <span\n className={`text-xs font-medium pb-0.5 ${\n isPositive ? 'text-[rgb(var(--lm-positive))]' : isNegative ? 'text-[rgb(var(--lm-negative))]' : 'text-[rgb(var(--lm-text-tertiary))]'\n }`}\n >\n {isPositive && (\n <svg className=\"w-3 h-3 inline mr-0.5 -mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n )}\n {isNegative && (\n <svg className=\"w-3 h-3 inline mr-0.5 -mt-0.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n )}\n {changePercent === 0 ? '0%' : `${changePercent! > 0 ? '+' : ''}${changePercent!.toFixed(1)}%`}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { QueryDataPoint } from '@litemetrics/core';\nimport type { TopListType } from '../types';\nimport { getBrowserIcon, getDeviceIcon, getReferrerIcon, countryToFlag } from '../utils/icons';\n\ninterface TopListProps {\n title: string;\n data: QueryDataPoint[] | null;\n loading?: boolean;\n type?: TopListType;\n className?: string;\n}\n\nfunction getIcon(type: TopListType | undefined, key: string): React.ReactNode {\n if (!type) return null;\n switch (type) {\n case 'pages':\n return (\n <svg className=\"w-4 h-4 flex-shrink-0 text-[rgb(var(--lm-text-tertiary))]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n case 'referrers':\n return getReferrerIcon(key);\n case 'countries': {\n const flag = countryToFlag(key);\n return flag ? <span className=\"text-sm flex-shrink-0 leading-none\">{flag}</span> : null;\n }\n case 'events':\n return (\n <svg className=\"w-4 h-4 flex-shrink-0 text-amber-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n );\n case 'browsers':\n return getBrowserIcon(key);\n case 'devices':\n return getDeviceIcon(key);\n }\n}\n\nexport function TopList({ title, data, loading, type, className }: TopListProps) {\n const [tooltip, setTooltip] = useState<{ key: string; value: number; pct: number; x: number; y: number } | null>(null);\n const maxValue = data ? Math.max(...data.map((d) => d.value), 1) : 1;\n const totalValue = data ? data.reduce((sum, d) => sum + d.value, 0) : 0;\n\n return (\n <div className={`rounded-xl bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] p-5 hover:shadow-sm transition-all duration-200 ${className ?? ''}`}>\n <h3 className=\"text-xs font-medium text-[rgb(var(--lm-text-tertiary))] uppercase tracking-wide mb-4\">{title}</h3>\n {loading ? (\n <div className=\"space-y-3\">\n {[...Array(5)].map((_, i) => (\n <div key={i} className=\"h-7 bg-[rgb(var(--lm-bg-secondary))] rounded animate-pulse\" />\n ))}\n </div>\n ) : !data || data.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-[rgb(var(--lm-text-muted))] text-sm\">No data yet</p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {data.map((item) => {\n const pct = totalValue > 0 ? Math.round((item.value / totalValue) * 100) : 0;\n const icon = getIcon(type, item.key);\n return (\n <div\n key={item.key}\n className=\"relative group\"\n onMouseEnter={(e) => {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setTooltip({ key: item.key, value: item.value, pct, x: rect.left + rect.width / 2, y: rect.top });\n }}\n onMouseLeave={() => setTooltip(null)}\n >\n <div\n className=\"absolute inset-0 bg-[rgb(var(--lm-bar))] rounded transition-all group-hover:bg-[rgb(var(--lm-bar-hover))]\"\n style={{ width: `${(item.value / maxValue) * 100}%` }}\n />\n <div className=\"relative flex items-center justify-between px-2.5 py-1.5 text-sm\">\n <div className=\"flex items-center gap-2 truncate mr-3\">\n {icon}\n <span className=\"truncate text-[rgb(var(--lm-text-secondary))]\">{item.key || '(direct)'}</span>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <span className=\"text-[rgb(var(--lm-text-secondary))] tabular-nums text-xs font-medium\">\n {item.value.toLocaleString()}\n </span>\n <span className=\"text-[rgb(var(--lm-text-tertiary))] tabular-nums text-xs w-8 text-right\">\n {pct}%\n </span>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n {tooltip && (\n <div\n className=\"fixed z-50 bg-[rgb(var(--lm-tooltip-bg))] text-[rgb(var(--lm-tooltip-text))] text-xs rounded-lg px-3 py-2 shadow-lg pointer-events-none max-w-xs\"\n style={{ left: tooltip.x, top: tooltip.y - 8, transform: 'translate(-50%, -100%)' }}\n >\n <p className=\"font-medium break-all\">{tooltip.key || '(direct)'}</p>\n <p className=\"text-[rgb(var(--lm-tooltip-muted))] mt-0.5\">{tooltip.value.toLocaleString()} · {tooltip.pct}%</p>\n </div>\n )}\n </div>\n );\n}\n","import { SiGooglechrome, SiFirefox, SiSafari, SiOpera, SiApple, SiLinux, SiAndroid } from 'react-icons/si';\nimport { SiGoogle, SiInstagram, SiX, SiFacebook, SiLinkedin, SiYoutube, SiGithub, SiReddit, SiPinterest, SiTiktok } from 'react-icons/si';\nimport { FaEdge, FaInternetExplorer, FaGlobe, FaWindows } from 'react-icons/fa6';\nimport { HiOutlineDesktopComputer, HiOutlineDeviceMobile, HiOutlineDeviceTablet } from 'react-icons/hi';\n\nconst iconClass = 'w-4 h-4 flex-shrink-0';\n\nexport function getBrowserIcon(browser: string): React.ReactNode {\n const b = browser.toLowerCase();\n if (b.includes('chrome') && !b.includes('edge')) return <SiGooglechrome className={`${iconClass} text-[#4285F4]`} />;\n if (b.includes('firefox')) return <SiFirefox className={`${iconClass} text-[#FF7139]`} />;\n if (b.includes('safari') && !b.includes('chrome')) return <SiSafari className={`${iconClass} text-[#006CFF]`} />;\n if (b.includes('edge')) return <FaEdge className={`${iconClass} text-[#0078D7]`} />;\n if (b.includes('opera')) return <SiOpera className={`${iconClass} text-[#FF1B2D]`} />;\n if (b.includes('ie') || b.includes('internet explorer')) return <FaInternetExplorer className={`${iconClass} text-blue-400`} />;\n return <FaGlobe className={`${iconClass} text-zinc-400`} />;\n}\n\nexport function getOSIcon(os: string): React.ReactNode {\n const o = os.toLowerCase();\n if (o.includes('windows')) return <FaWindows className={`${iconClass} text-[#0078D4]`} />;\n if (o.includes('mac') || o.includes('ios')) return <SiApple className={`${iconClass} text-zinc-700`} />;\n if (o.includes('linux')) return <SiLinux className={`${iconClass} text-[#FCC624]`} />;\n if (o.includes('android')) return <SiAndroid className={`${iconClass} text-[#34A853]`} />;\n return <HiOutlineDesktopComputer className={`${iconClass} text-zinc-400`} />;\n}\n\nexport function getDeviceIcon(type: string): React.ReactNode {\n const t = type.toLowerCase();\n if (t.includes('mobile')) return <HiOutlineDeviceMobile className={`${iconClass} text-zinc-500`} />;\n if (t.includes('tablet')) return <HiOutlineDeviceTablet className={`${iconClass} text-zinc-500`} />;\n return <HiOutlineDesktopComputer className={`${iconClass} text-zinc-500`} />;\n}\n\nexport function getReferrerIcon(referrer: string): React.ReactNode {\n const r = referrer.toLowerCase();\n if (r.includes('google')) return <SiGoogle className={`${iconClass} text-[#4285F4]`} />;\n if (r.includes('instagram')) return <SiInstagram className={`${iconClass} text-[#E4405F]`} />;\n if (r.includes('twitter') || r.includes('t.co') || r.includes('x.com')) return <SiX className={`${iconClass} text-zinc-800`} />;\n if (r.includes('facebook') || r.includes('fb.com')) return <SiFacebook className={`${iconClass} text-[#1877F2]`} />;\n if (r.includes('linkedin')) return <SiLinkedin className={`${iconClass} text-[#0A66C2]`} />;\n if (r.includes('youtube')) return <SiYoutube className={`${iconClass} text-[#FF0000]`} />;\n if (r.includes('github')) return <SiGithub className={`${iconClass} text-zinc-800`} />;\n if (r.includes('reddit')) return <SiReddit className={`${iconClass} text-[#FF4500]`} />;\n if (r.includes('pinterest')) return <SiPinterest className={`${iconClass} text-[#BD081C]`} />;\n if (r.includes('tiktok')) return <SiTiktok className={`${iconClass} text-zinc-800`} />;\n return <FaGlobe className={`${iconClass} text-zinc-400`} />;\n}\n\nexport function countryToFlag(code: string): string {\n if (!code || code.length !== 2) return '';\n const upper = code.toUpperCase();\n return String.fromCodePoint(\n ...Array.from(upper).map((c) => 0x1F1E6 + c.charCodeAt(0) - 65)\n );\n}\n","import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from 'recharts';\nimport { getPieColors, cssVar } from '../utils/theme';\n\ninterface PieChartCardProps {\n title: string;\n data: { name: string; value: number }[];\n loading?: boolean;\n className?: string;\n}\n\nexport function PieChartCard({ title, data, loading, className }: PieChartCardProps) {\n const total = data.reduce((sum, d) => sum + d.value, 0);\n const colors = getPieColors();\n\n return (\n <div className={`rounded-xl bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] p-5 ${className ?? ''}`}>\n <h3 className=\"text-xs font-medium text-[rgb(var(--lm-text-tertiary))] uppercase tracking-wide mb-4\">{title}</h3>\n {loading ? (\n <div className=\"h-48 bg-[rgb(var(--lm-bg-secondary))] rounded-lg animate-pulse\" />\n ) : data.length === 0 ? (\n <div className=\"h-48 flex items-center justify-center\">\n <p className=\"text-[rgb(var(--lm-text-muted))] text-sm\">No data yet</p>\n </div>\n ) : (\n <div className=\"flex items-center gap-4\">\n <div className=\"w-36 h-36 flex-shrink-0\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={data}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={35}\n outerRadius={55}\n dataKey=\"value\"\n strokeWidth={2}\n stroke={cssVar('--lm-bg', '255 255 255')}\n >\n {data.map((_, index) => (\n <Cell key={index} fill={colors[index % colors.length]} />\n ))}\n </Pie>\n <Tooltip\n content={({ active, payload }) => {\n if (!active || !payload?.[0]) return null;\n const item = payload[0];\n const pct = total > 0 ? Math.round(((item.value as number) / total) * 100) : 0;\n return (\n <div className=\"bg-[rgb(var(--lm-tooltip-bg))] text-[rgb(var(--lm-tooltip-text))] text-xs rounded-lg px-3 py-2 shadow-lg\">\n <p className=\"font-medium\">{item.name}</p>\n <p className=\"text-[rgb(var(--lm-tooltip-muted))]\">{(item.value as number).toLocaleString()} ({pct}%)</p>\n </div>\n );\n }}\n />\n </PieChart>\n </ResponsiveContainer>\n </div>\n <div className=\"flex-1 space-y-1.5 min-w-0\">\n {data.slice(0, 6).map((item, i) => {\n const pct = total > 0 ? Math.round((item.value / total) * 100) : 0;\n return (\n <div key={item.name} className=\"flex items-center gap-2 text-sm\">\n <span\n className=\"w-2.5 h-2.5 rounded-full flex-shrink-0\"\n style={{ backgroundColor: colors[i % colors.length] }}\n />\n <span className=\"text-[rgb(var(--lm-text-secondary))] truncate\">{item.name || '(unknown)'}</span>\n <span className=\"text-[rgb(var(--lm-text-tertiary))] ml-auto flex-shrink-0 tabular-nums text-xs\">{pct}%</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { Period } from '@litemetrics/core';\nimport { DateRangePicker } from './DateRangePicker';\n\nconst periods: { value: Period; label: string }[] = [\n { value: '1h', label: '1H' },\n { value: '24h', label: '24H' },\n { value: '7d', label: '7D' },\n { value: '30d', label: '30D' },\n { value: '90d', label: '90D' },\n { value: 'custom', label: 'Custom' },\n];\n\ninterface PeriodSelectorProps {\n value: Period;\n onChange: (period: Period) => void;\n dateFrom?: string;\n dateTo?: string;\n onDateFromChange?: (date: string) => void;\n onDateToChange?: (date: string) => void;\n className?: string;\n}\n\nexport function PeriodSelector({ value, onChange, dateFrom, dateTo, onDateFromChange, onDateToChange, className }: PeriodSelectorProps) {\n const [showCustom, setShowCustom] = useState(value === 'custom');\n\n return (\n <div className={`flex items-center gap-3 ${className ?? ''}`}>\n <div className=\"flex gap-1 bg-[rgb(var(--lm-bg-tertiary))] rounded-lg p-1 border border-[rgb(var(--lm-border))]\">\n {periods.map((p) => (\n <button\n key={p.value}\n onClick={() => {\n onChange(p.value);\n setShowCustom(p.value === 'custom');\n }}\n className={`px-3 py-1.5 text-sm rounded-md transition-colors ${\n value === p.value\n ? 'bg-[rgb(var(--lm-bg))] text-[rgb(var(--lm-text))] shadow-sm'\n : 'text-[rgb(var(--lm-text-secondary))] hover:text-[rgb(var(--lm-text))]'\n }`}\n >\n {p.label}\n </button>\n ))}\n </div>\n {showCustom && onDateFromChange && onDateToChange && (\n <DateRangePicker\n startDate={dateFrom || ''}\n endDate={dateTo || ''}\n onStartChange={onDateFromChange}\n onEndChange={onDateToChange}\n />\n )}\n </div>\n );\n}\n","interface DateRangePickerProps {\n startDate: string;\n endDate: string;\n onStartChange: (date: string) => void;\n onEndChange: (date: string) => void;\n className?: string;\n}\n\nexport function DateRangePicker({ startDate, endDate, onStartChange, onEndChange, className }: DateRangePickerProps) {\n return (\n <div className={`flex items-center gap-2 ${className ?? ''}`}>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => onStartChange(e.target.value)}\n max={endDate || undefined}\n className=\"bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] rounded-lg px-2.5 py-1.5 text-sm text-[rgb(var(--lm-text))] focus:outline-none focus:border-[rgb(var(--lm-accent))]\"\n />\n <span className=\"text-[rgb(var(--lm-text-tertiary))] text-sm\">to</span>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => onEndChange(e.target.value)}\n min={startDate || undefined}\n max={new Date().toISOString().split('T')[0]}\n className=\"bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] rounded-lg px-2.5 py-1.5 text-sm text-[rgb(var(--lm-text))] focus:outline-none focus:border-[rgb(var(--lm-accent))]\"\n />\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\n\ntype ExportFormat = 'csv' | 'json' | 'markdown';\n\ninterface ExportButtonProps {\n data: Record<string, unknown>[];\n filename: string;\n className?: string;\n}\n\nexport function ExportButton({ data, filename, className }: ExportButtonProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n if (!data || data.length === 0) return null;\n\n function download(format: ExportFormat) {\n let content: string;\n let mimeType: string;\n let ext: string;\n\n const headers = Object.keys(data[0]);\n\n switch (format) {\n case 'csv': {\n const rows = [\n headers.join(','),\n ...data.map((row) =>\n headers.map((h) => {\n const val = row[h];\n const str = val === null || val === undefined ? '' : String(val);\n return str.includes(',') || str.includes('\"') || str.includes('\\n')\n ? `\"${str.replace(/\"/g, '\"\"')}\"`\n : str;\n }).join(',')\n ),\n ];\n content = rows.join('\\n');\n mimeType = 'text/csv';\n ext = 'csv';\n break;\n }\n case 'json': {\n content = JSON.stringify(data, null, 2);\n mimeType = 'application/json';\n ext = 'json';\n break;\n }\n case 'markdown': {\n const headerRow = '| ' + headers.join(' | ') + ' |';\n const separator = '| ' + headers.map(() => '---').join(' | ') + ' |';\n const bodyRows = data.map((row) =>\n '| ' + headers.map((h) => String(row[h] ?? '')).join(' | ') + ' |'\n );\n content = [headerRow, separator, ...bodyRows].join('\\n');\n mimeType = 'text/markdown';\n ext = 'md';\n break;\n }\n }\n\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${filename}.${ext}`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setOpen(false);\n }\n\n return (\n <div ref={ref} className={`relative ${className ?? ''}`}>\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-sm border border-[rgb(var(--lm-border))] rounded-lg hover:border-[rgb(var(--lm-border-hover))] transition-colors text-[rgb(var(--lm-text-secondary))]\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n Export\n </button>\n {open && (\n <div className=\"absolute top-full mt-1 right-0 w-36 bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] rounded-lg shadow-lg z-50 py-1\">\n <button onClick={() => download('csv')} className=\"w-full text-left px-3 py-2 text-sm hover:bg-[rgb(var(--lm-bg-secondary))] text-[rgb(var(--lm-text-secondary))]\">\n CSV\n </button>\n <button onClick={() => download('json')} className=\"w-full text-left px-3 py-2 text-sm hover:bg-[rgb(var(--lm-bg-secondary))] text-[rgb(var(--lm-text-secondary))]\">\n JSON\n </button>\n <button onClick={() => download('markdown')} className=\"w-full text-left px-3 py-2 text-sm hover:bg-[rgb(var(--lm-bg-secondary))] text-[rgb(var(--lm-text-secondary))]\">\n Markdown\n </button>\n </div>\n )}\n </div>\n );\n}\n","import type { Period } from '@litemetrics/core';\nimport { useOverview } from '../hooks/useOverview';\nimport { StatCard } from '../components/StatCard';\n\ninterface StatCardsProps {\n period?: Period;\n className?: string;\n}\n\nexport function StatCards({ period, className }: StatCardsProps) {\n const { data: overview, isLoading: loading } = useOverview({ period });\n\n return (\n <div className={`grid grid-cols-2 md:grid-cols-4 gap-5 ${className ?? ''}`}>\n <StatCard\n title=\"Pageviews\"\n value={overview?.pageviews?.total ?? 0}\n changePercent={overview?.pageviews?.changePercent}\n loading={loading}\n />\n <StatCard\n title=\"Visitors\"\n value={overview?.visitors?.total ?? 0}\n changePercent={overview?.visitors?.changePercent}\n loading={loading}\n />\n <StatCard\n title=\"Sessions\"\n value={overview?.sessions?.total ?? 0}\n changePercent={overview?.sessions?.changePercent}\n loading={loading}\n />\n <StatCard\n title=\"Events\"\n value={overview?.events?.total ?? 0}\n changePercent={overview?.events?.changePercent}\n loading={loading}\n />\n </div>\n );\n}\n","import { useState } from 'react';\nimport { AreaChart, Area, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid } from 'recharts';\nimport type { Period, TimeSeriesPoint } from '@litemetrics/core';\nimport type { ChartMetric } from '../types';\nimport { useTimeSeries } from '../hooks/useTimeSeries';\nimport { useLitemetricsUI } from '../hooks/useLitemetricsUI';\nimport { useThemeColors } from '../hooks/useThemeColors';\nimport { formatDate, formatTooltipDate } from '../utils/formatters';\n\nconst metrics: { value: ChartMetric; label: string }[] = [\n { value: 'pageviews', label: 'Pageviews' },\n { value: 'visitors', label: 'Visitors' },\n { value: 'sessions', label: 'Sessions' },\n];\n\ninterface TimeSeriesChartProps {\n defaultMetric?: ChartMetric;\n period?: Period;\n className?: string;\n}\n\nexport function TimeSeriesChart({ defaultMetric = 'pageviews', period: periodProp, className }: TimeSeriesChartProps) {\n const [metric, setMetric] = useState<ChartMetric>(defaultMetric);\n const { period: ctxPeriod } = useLitemetricsUI();\n const period = periodProp ?? ctxPeriod;\n const { get } = useThemeColors();\n\n const { data: result, isLoading: loading } = useTimeSeries(metric, { period });\n const data = result?.data ?? [];\n\n const strokeColor = get('--lm-chart-stroke', '99 102 241');\n const fillColor = get('--lm-chart-fill', '99 102 241');\n const gridColor = get('--lm-chart-grid', '244 244 245');\n const axisColor = get('--lm-chart-axis', '161 161 170');\n\n return (\n <div className={`rounded-xl bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] p-6 ${className ?? ''}`}>\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-sm font-medium text-[rgb(var(--lm-text-secondary))]\">Overview</h3>\n <div className=\"flex gap-1\">\n {metrics.map((m) => (\n <button\n key={m.value}\n onClick={() => setMetric(m.value)}\n className={`px-2.5 py-1 text-xs rounded-md transition-colors ${\n metric === m.value\n ? 'bg-[rgb(var(--lm-accent-light))] text-[rgb(var(--lm-accent-text))] font-medium'\n : 'text-[rgb(var(--lm-text-tertiary))] hover:text-[rgb(var(--lm-text-secondary))]'\n }`}\n >\n {m.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"h-64\">\n {loading ? (\n <div className=\"h-full bg-[rgb(var(--lm-bg-secondary))] rounded-lg animate-pulse\" />\n ) : data.length === 0 ? (\n <div className=\"h-full flex items-center justify-center text-[rgb(var(--lm-text-tertiary))] text-sm\">\n No data for this period\n </div>\n ) : (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={data} margin={{ top: 4, right: 4, bottom: 0, left: -20 }}>\n <defs>\n <linearGradient id=\"lm-chartGradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={fillColor} stopOpacity={0.2} />\n <stop offset=\"100%\" stopColor={fillColor} stopOpacity={0} />\n </linearGradient>\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={gridColor} vertical={false} />\n <XAxis\n dataKey=\"date\"\n tickFormatter={(v) => formatDate(v, period)}\n tick={{ fontSize: 11, fill: axisColor }}\n tickLine={false}\n axisLine={{ stroke: gridColor }}\n interval=\"preserveStartEnd\"\n minTickGap={40}\n />\n <YAxis\n tick={{ fontSize: 11, fill: axisColor }}\n tickLine={false}\n axisLine={false}\n allowDecimals={false}\n />\n <Tooltip\n content={({ active, payload }) => {\n if (!active || !payload?.[0]) return null;\n const point = payload[0].payload as TimeSeriesPoint;\n return (\n <div className=\"bg-[rgb(var(--lm-tooltip-bg))] text-[rgb(var(--lm-tooltip-text))] text-xs rounded-lg px-3 py-2 shadow-lg\">\n <p className=\"text-[rgb(var(--lm-tooltip-muted))] mb-0.5\">{formatTooltipDate(point.date, period)}</p>\n <p className=\"font-medium\">{point.value.toLocaleString()} {metric}</p>\n </div>\n );\n }}\n />\n <Area\n type=\"monotone\"\n dataKey=\"value\"\n stroke={strokeColor}\n strokeWidth={2}\n fill=\"url(#lm-chartGradient)\"\n />\n </AreaChart>\n </ResponsiveContainer>\n )}\n </div>\n </div>\n );\n}\n","import type { Period } from '@litemetrics/core';\n\nexport function formatDate(iso: string, period: Period): string {\n const d = new Date(iso);\n if (period === '1h' || period === '24h') {\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n return d.toLocaleDateString([], { month: 'short', day: 'numeric' });\n}\n\nexport function formatTooltipDate(iso: string, period: Period): string {\n const d = new Date(iso);\n if (period === '1h' || period === '24h') {\n return d.toLocaleString([], { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' });\n }\n return d.toLocaleDateString([], { weekday: 'short', month: 'short', day: 'numeric' });\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopPagesProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopPages({ period, limit = 10, className }: TopPagesProps) {\n const { data, isLoading } = useStats('top_pages', { period, limit });\n return <TopList title=\"Pages\" type=\"pages\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopReferrersProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopReferrers({ period, limit = 10, className }: TopReferrersProps) {\n const { data, isLoading } = useStats('top_referrers', { period, limit });\n return <TopList title=\"Referrers\" type=\"referrers\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopCountriesProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopCountries({ period, limit = 10, className }: TopCountriesProps) {\n const { data, isLoading } = useStats('top_countries', { period, limit });\n return <TopList title=\"Countries\" type=\"countries\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopEventsProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopEvents({ period, limit = 10, className }: TopEventsProps) {\n const { data, isLoading } = useStats('top_events', { period, limit });\n return <TopList title=\"Events\" type=\"events\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopBrowsersProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopBrowsers({ period, limit = 10, className }: TopBrowsersProps) {\n const { data, isLoading } = useStats('top_browsers', { period, limit });\n return <TopList title=\"Browsers\" type=\"browsers\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { TopList } from '../components/TopList';\n\ninterface TopDevicesProps {\n period?: Period;\n limit?: number;\n className?: string;\n}\n\nexport function TopDevices({ period, limit = 10, className }: TopDevicesProps) {\n const { data, isLoading } = useStats('top_devices', { period, limit });\n return <TopList title=\"Devices\" type=\"devices\" data={data?.data ?? null} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { PieChartCard } from '../components/PieChartCard';\n\ninterface BrowsersChartProps {\n period?: Period;\n className?: string;\n}\n\nexport function BrowsersChart({ period, className }: BrowsersChartProps) {\n const { data, isLoading } = useStats('top_browsers', { period });\n const pieData = (data?.data ?? []).map((d) => ({ name: d.key, value: d.value }));\n return <PieChartCard title=\"Browsers\" data={pieData} loading={isLoading} className={className} />;\n}\n","import type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { PieChartCard } from '../components/PieChartCard';\n\ninterface DevicesChartProps {\n period?: Period;\n className?: string;\n}\n\nexport function DevicesChart({ period, className }: DevicesChartProps) {\n const { data, isLoading } = useStats('top_devices', { period });\n const pieData = (data?.data ?? []).map((d) => ({ name: d.key, value: d.value }));\n return <PieChartCard title=\"Devices\" data={pieData} loading={isLoading} className={className} />;\n}\n","import { useState, memo, lazy, Suspense } from 'react';\nimport type { Period } from '@litemetrics/core';\nimport { useStats } from '../hooks/useStats';\nimport { useThemeColors } from '../hooks/useThemeColors';\n\nconst geoUrl = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n\ninterface CountryData {\n [iso: string]: number;\n}\n\ninterface WorldMapProps {\n period?: Period;\n className?: string;\n}\n\nconst WorldMapInner = lazy(() => import('./WorldMapInner'));\n\nexport const WorldMap = memo(function WorldMap({ period, className }: WorldMapProps) {\n const [tooltip, setTooltip] = useState<{ name: string; value: number; x: number; y: number } | null>(null);\n const { get } = useThemeColors();\n\n const { data: statsResult, isLoading: loading } = useStats('top_countries', { period, limit: 200 });\n\n const countryData: CountryData = {};\n if (statsResult?.data) {\n for (const d of statsResult.data) {\n countryData[d.key] = d.value;\n }\n }\n\n const maxValue = Math.max(...Object.values(countryData), 1);\n\n // Parse RGB triplet string \"R G B\" into [r, g, b]\n function parseRGB(triplet: string): [number, number, number] {\n const parts = triplet.trim().split(/\\s+/).map(Number);\n return [parts[0] || 0, parts[1] || 0, parts[2] || 0];\n }\n\n function getColor(iso: string): string {\n const value = countryData[iso] || 0;\n const emptyColor = get('--lm-map-empty', '244 244 245');\n if (value === 0) return emptyColor;\n\n const intensity = Math.min(value / maxValue, 1);\n // Interpolate from empty color to accent color\n const emptyRaw = getComputedStyle(document.documentElement).getPropertyValue('--lm-map-empty').trim() || '244 244 245';\n const accentRaw = getComputedStyle(document.documentElement).getPropertyValue('--lm-accent').trim() || '99 102 241';\n const [er, eg, eb] = parseRGB(emptyRaw);\n const [ar, ag, ab] = parseRGB(accentRaw);\n const r = Math.round(er + intensity * (ar - er));\n const g = Math.round(eg + intensity * (ag - eg));\n const b = Math.round(eb + intensity * (ab - eb));\n return `rgb(${r}, ${g}, ${b})`;\n }\n\n const strokeColor = get('--lm-map-stroke', '228 228 231');\n const hoverColor = get('--lm-map-hover', '129 140 248');\n\n return (\n <div className={`rounded-xl bg-[rgb(var(--lm-bg))] border border-[rgb(var(--lm-border))] p-5 ${className ?? ''}`}>\n <h3 className=\"text-xs font-medium text-[rgb(var(--lm-text-tertiary))] uppercase tracking-wide mb-3\">Visitors by Country</h3>\n {loading ? (\n <div className=\"h-64 bg-[rgb(var(--lm-bg-secondary))] rounded-lg animate-pulse\" />\n ) : (\n <Suspense fallback={<div className=\"h-64 bg-[rgb(var(--lm-bg-secondary))] rounded-lg flex items-center justify-center text-[rgb(var(--lm-text-tertiary))] text-sm\">Loading map...</div>}>\n <WorldMapInner\n geoUrl={geoUrl}\n countryData={countryData}\n getColor={getColor}\n setTooltip={setTooltip}\n strokeColor={strokeColor}\n hoverColor={hoverColor}\n />\n </Suspense>\n )}\n {tooltip && (\n <div\n className=\"fixed z-50 bg-[rgb(var(--lm-tooltip-bg))] text-[rgb(var(--lm-tooltip-text))] text-xs rounded-lg px-3 py-2 shadow-lg pointer-events-none\"\n style={{ left: tooltip.x + 10, top: tooltip.y - 30 }}\n >\n <p className=\"font-medium\">{tooltip.name}</p>\n <p className=\"text-[rgb(var(--lm-tooltip-muted))]\">{tooltip.value.toLocaleString()} visitor{tooltip.value !== 1 ? 's' : ''}</p>\n </div>\n )}\n </div>\n );\n});\n","import type { Period } from '@litemetrics/core';\nimport { useLitemetricsUI } from '../hooks/useLitemetricsUI';\nimport { PeriodSelector } from '../components/PeriodSelector';\nimport { ExportButton } from '../components/ExportButton';\nimport { StatCards } from './StatCards';\nimport { TimeSeriesChart } from './TimeSeriesChart';\nimport { TopPages } from './TopPages';\nimport { TopReferrers } from './TopReferrers';\nimport { TopCountries } from './TopCountries';\nimport { TopEvents } from './TopEvents';\nimport { TopBrowsers } from './TopBrowsers';\nimport { TopDevices } from './TopDevices';\nimport { BrowsersChart } from './BrowsersChart';\nimport { DevicesChart } from './DevicesChart';\nimport { WorldMap } from './WorldMap';\n\ninterface AnalyticsDashboardProps {\n showPeriodSelector?: boolean;\n showExport?: boolean;\n showWorldMap?: boolean;\n showPieCharts?: boolean;\n period?: Period;\n className?: string;\n}\n\nexport function AnalyticsDashboard({\n showPeriodSelector = true,\n showExport = true,\n showWorldMap = true,\n showPieCharts = true,\n period,\n className,\n}: AnalyticsDashboardProps) {\n const { period: ctxPeriod, setPeriod, dateFrom, setDateFrom, dateTo, setDateTo } = useLitemetricsUI();\n const effectivePeriod = period ?? ctxPeriod;\n\n return (\n <div className={className}>\n {/* Period selector + export */}\n {(showPeriodSelector || showExport) && (\n <div className=\"flex items-center justify-between mb-6 flex-wrap gap-3\">\n {showPeriodSelector && (\n <PeriodSelector\n value={effectivePeriod}\n onChange={setPeriod}\n dateFrom={dateFrom}\n dateTo={dateTo}\n onDateFromChange={setDateFrom}\n onDateToChange={setDateTo}\n />\n )}\n {showExport && (\n <ExportButton data={[]} filename={`analytics-${effectivePeriod}`} />\n )}\n </div>\n )}\n\n {/* Time Series Chart */}\n <TimeSeriesChart period={effectivePeriod} className=\"mb-6\" />\n\n {/* Overview Stats */}\n <StatCards period={effectivePeriod} className=\"mb-6\" />\n\n {/* World Map */}\n {showWorldMap && <WorldMap period={effectivePeriod} className=\"mb-6\" />}\n\n {/* Pie Charts */}\n {showPieCharts && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5 mb-6\">\n <BrowsersChart period={effectivePeriod} />\n <DevicesChart period={effectivePeriod} />\n </div>\n )}\n\n {/* Top Lists */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <TopPages period={effectivePeriod} />\n <TopReferrers period={effectivePeriod} />\n <TopCountries period={effectivePeriod} />\n <TopEvents period={effectivePeriod} />\n <TopBrowsers period={effectivePeriod} />\n <TopDevices period={effectivePeriod} />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","metrics","useQuery","useState","useEffect","useState","useEffect","jsx","useState","jsx","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useState","useState","useEffect","jsx","jsxs","jsx","jsxs","useState","Tooltip","ResponsiveContainer","jsx","jsxs","useState","ResponsiveContainer","Tooltip","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","useState","jsx","jsxs","WorldMap","useState","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@litemetrics/ui",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Pre-built React dashboard components for Litemetrics analytics",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Metehan Kurucu",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/metehankurucu/litemetrics",
|
|
10
|
+
"directory": "packages/ui"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"analytics",
|
|
14
|
+
"litemetrics",
|
|
15
|
+
"react",
|
|
16
|
+
"dashboard",
|
|
17
|
+
"components",
|
|
18
|
+
"ui"
|
|
19
|
+
],
|
|
20
|
+
"type": "module",
|
|
21
|
+
"main": "./dist/index.cjs",
|
|
22
|
+
"module": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"require": "./dist/index.cjs"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "tsup",
|
|
39
|
+
"dev": "tsup --watch",
|
|
40
|
+
"typecheck": "tsc --noEmit",
|
|
41
|
+
"clean": "rm -rf dist"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@litemetrics/client": "0.1.1",
|
|
45
|
+
"@litemetrics/core": "0.1.1",
|
|
46
|
+
"react-icons": "^5.5.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"react": ">=18",
|
|
50
|
+
"react-dom": ">=18",
|
|
51
|
+
"recharts": ">=2",
|
|
52
|
+
"@tanstack/react-query": ">=5",
|
|
53
|
+
"tailwindcss": ">=3"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"react-simple-maps": {
|
|
57
|
+
"optional": true
|
|
58
|
+
},
|
|
59
|
+
"tailwindcss": {
|
|
60
|
+
"optional": true
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@tanstack/react-query": "^5",
|
|
65
|
+
"@types/react": "^19",
|
|
66
|
+
"@types/react-dom": "^19",
|
|
67
|
+
"react": "^19",
|
|
68
|
+
"react-dom": "^19",
|
|
69
|
+
"react-simple-maps": "^3",
|
|
70
|
+
"recharts": "^2",
|
|
71
|
+
"tsup": "^8",
|
|
72
|
+
"typescript": "^5.7"
|
|
73
|
+
}
|
|
74
|
+
}
|