ahoy_analytics 0.1.0
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +163 -0
- data/Rakefile +6 -0
- data/app/assets/ahoy_analytics/build/assets/Combination-BpSXUjp9.js +41 -0
- data/app/assets/ahoy_analytics/build/assets/analytics-5KyfCxh6.css +1 -0
- data/app/assets/ahoy_analytics/build/assets/analytics-dashboard-uOXx8zYZ.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/analytics-layout-ClAft5OU.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/analytics-tracker-B3f8P98z.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/analytics-ui-DMSkNqd6.js +90 -0
- data/app/assets/ahoy_analytics/build/assets/behaviors-panel-ChNGYbdH.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/button-JVCrlR4s.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/cable-DO-7y1-E.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/createLucideIcon-BGzacY2v.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/date-range-dialog-DWDp3cLG.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/details-button-NqKfSGEG.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/devices-panel-cXvlmNBY.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/dialog-path-BBPNlB4Z.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/dropdown-menu-Adj3O5fh.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/filter-dialog-BN-rf4lp.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/index-B1K1NTKT.js +3 -0
- data/app/assets/ahoy_analytics/build/assets/index-BcHeb-Rh.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/index-DzpzLoG4.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/index-vX97OY1J.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/input-e4v_v0kE.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/jsx-runtime-u17CrQMm.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/last-load-context-De5uA95L.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/list-table-ChHEzzF9.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/live-Cp2MHECh.js +2 -0
- data/app/assets/ahoy_analytics/build/assets/locations-panel-BaISRmaQ.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/mercator-BnxX5RzL.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/pages-panel-Bh25L8mP.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/panel-tabs-B2kvGFJx.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/query-context-B-PgE00D.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/remote-details-dialog-DDTcKaM5.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/show-CCRicksg.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/simple-tabs-D6G6Bs0k.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/site-context-BNteYRlR.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/sources-panel-DyB21hxD.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/top-bar-FSiLBjq6.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/top-stats-context-DU15P9jS.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/use-debounce-VBpXQRL8.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/user-context-DbYteluY.js +1 -0
- data/app/assets/ahoy_analytics/build/assets/visitor-globe-BWLDihid.js +4789 -0
- data/app/assets/ahoy_analytics/build/assets/visitor-graph-uKXjLvcu.js +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/brave.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/chrome.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/chromium.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/duckduckgo.svg +2151 -0
- data/app/assets/ahoy_analytics/images/icon/browser/edge.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/fallback.svg +5 -0
- data/app/assets/ahoy_analytics/images/icon/browser/firefox.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/opera.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/safari.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/browser/samsung-internet.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/uc.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/vivaldi.svg +1 -0
- data/app/assets/ahoy_analytics/images/icon/browser/yandex.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/android.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/chrome_os.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/fallback.svg +5 -0
- data/app/assets/ahoy_analytics/images/icon/os/fedora.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/freebsd.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/gnu_linux.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/ios.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/ipad_os.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/mac.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/ubuntu.png +0 -0
- data/app/assets/ahoy_analytics/images/icon/os/windows.png +0 -0
- data/app/assets/stylesheets/ahoy_analytics/application.css +15 -0
- data/app/channels/ahoy_analytics/analytics_channel.rb +9 -0
- data/app/controllers/ahoy_analytics/analytics_controller.rb +9 -0
- data/app/controllers/ahoy_analytics/application_controller.rb +8 -0
- data/app/controllers/ahoy_analytics/assets_controller.rb +46 -0
- data/app/controllers/ahoy_analytics/base_controller.rb +285 -0
- data/app/controllers/ahoy_analytics/behaviors_controller.rb +14 -0
- data/app/controllers/ahoy_analytics/devices_controller.rb +14 -0
- data/app/controllers/ahoy_analytics/export_controller.rb +12 -0
- data/app/controllers/ahoy_analytics/live_controller.rb +9 -0
- data/app/controllers/ahoy_analytics/locations_controller.rb +14 -0
- data/app/controllers/ahoy_analytics/main_graph_controller.rb +10 -0
- data/app/controllers/ahoy_analytics/pages_controller.rb +14 -0
- data/app/controllers/ahoy_analytics/referrers_controller.rb +34 -0
- data/app/controllers/ahoy_analytics/search_terms_controller.rb +47 -0
- data/app/controllers/ahoy_analytics/sources_controller.rb +14 -0
- data/app/controllers/ahoy_analytics/top_stats_controller.rb +13 -0
- data/app/controllers/concerns/ahoy_analytics/set_current_request.rb +17 -0
- data/app/frontend/components/analytics/hex-highlights.tsx +165 -0
- data/app/frontend/components/analytics/hex-land-layer.tsx +61 -0
- data/app/frontend/components/analytics/metric-card.tsx +138 -0
- data/app/frontend/components/analytics/sessions-by-location.tsx +62 -0
- data/app/frontend/components/analytics/visitor-globe.tsx +424 -0
- data/app/frontend/components/ui/accordion.tsx +64 -0
- data/app/frontend/components/ui/alert.tsx +66 -0
- data/app/frontend/components/ui/avatar.tsx +53 -0
- data/app/frontend/components/ui/badge.tsx +46 -0
- data/app/frontend/components/ui/button.tsx +62 -0
- data/app/frontend/components/ui/calendar.tsx +212 -0
- data/app/frontend/components/ui/card.tsx +91 -0
- data/app/frontend/components/ui/checkbox.tsx +32 -0
- data/app/frontend/components/ui/dropdown-menu.tsx +255 -0
- data/app/frontend/components/ui/input.tsx +21 -0
- data/app/frontend/components/ui/label.tsx +22 -0
- data/app/frontend/components/ui/popover.tsx +46 -0
- data/app/frontend/components/ui/select.tsx +183 -0
- data/app/frontend/components/ui/separator.tsx +26 -0
- data/app/frontend/components/ui/sheet.tsx +139 -0
- data/app/frontend/components/ui/sidebar.tsx +726 -0
- data/app/frontend/components/ui/skeleton.tsx +13 -0
- data/app/frontend/components/ui/sonner.tsx +33 -0
- data/app/frontend/components/ui/tooltip.tsx +59 -0
- data/app/frontend/data/countries-110m.json +1 -0
- data/app/frontend/data/globe-data.json +1 -0
- data/app/frontend/entrypoints/analytics-tracker.ts +680 -0
- data/app/frontend/entrypoints/analytics-ui.tsx +26 -0
- data/app/frontend/entrypoints/analytics.css +77 -0
- data/app/frontend/layouts/analytics-layout.tsx +28 -0
- data/app/frontend/lib/cable.ts +13 -0
- data/app/frontend/lib/geocode.ts +65 -0
- data/app/frontend/lib/utils.ts +6 -0
- data/app/frontend/pages/admin/analytics/api.ts +221 -0
- data/app/frontend/pages/admin/analytics/hooks/use-debounce.ts +36 -0
- data/app/frontend/pages/admin/analytics/last-load-context.tsx +29 -0
- data/app/frontend/pages/admin/analytics/lib/base-path.ts +28 -0
- data/app/frontend/pages/admin/analytics/lib/dialog-path.ts +242 -0
- data/app/frontend/pages/admin/analytics/lib/number-formatter.ts +100 -0
- data/app/frontend/pages/admin/analytics/live.tsx +608 -0
- data/app/frontend/pages/admin/analytics/query-context.tsx +61 -0
- data/app/frontend/pages/admin/analytics/show.tsx +40 -0
- data/app/frontend/pages/admin/analytics/site-context.tsx +22 -0
- data/app/frontend/pages/admin/analytics/top-stats-context.tsx +37 -0
- data/app/frontend/pages/admin/analytics/types.ts +161 -0
- data/app/frontend/pages/admin/analytics/ui/analytics-dashboard.tsx +60 -0
- data/app/frontend/pages/admin/analytics/ui/behaviors-panel.tsx +456 -0
- data/app/frontend/pages/admin/analytics/ui/date-range-dialog.tsx +173 -0
- data/app/frontend/pages/admin/analytics/ui/details-button.tsx +33 -0
- data/app/frontend/pages/admin/analytics/ui/devices-panel.tsx +474 -0
- data/app/frontend/pages/admin/analytics/ui/filter-dialog.tsx +558 -0
- data/app/frontend/pages/admin/analytics/ui/list-table.tsx +346 -0
- data/app/frontend/pages/admin/analytics/ui/locations-panel.tsx +566 -0
- data/app/frontend/pages/admin/analytics/ui/pages-panel.tsx +207 -0
- data/app/frontend/pages/admin/analytics/ui/panel-tabs.tsx +65 -0
- data/app/frontend/pages/admin/analytics/ui/remote-details-dialog.tsx +356 -0
- data/app/frontend/pages/admin/analytics/ui/simple-tabs.tsx +54 -0
- data/app/frontend/pages/admin/analytics/ui/sources-panel.tsx +771 -0
- data/app/frontend/pages/admin/analytics/ui/top-bar.tsx +793 -0
- data/app/frontend/pages/admin/analytics/ui/visitor-graph.tsx +891 -0
- data/app/frontend/pages/admin/analytics/user-context.tsx +22 -0
- data/app/frontend/styles/shared.css +156 -0
- data/app/helpers/ahoy_analytics/application_helper.rb +96 -0
- data/app/jobs/ahoy_analytics/application_job.rb +4 -0
- data/app/jobs/ahoy_analytics/update_job.rb +12 -0
- data/app/mailers/ahoy_analytics/application_mailer.rb +6 -0
- data/app/models/ahoy/event/filters.rb +7 -0
- data/app/models/ahoy/event.rb +9 -0
- data/app/models/ahoy/visit/cache_key.rb +15 -0
- data/app/models/ahoy/visit/constants.rb +11 -0
- data/app/models/ahoy/visit/devices.rb +144 -0
- data/app/models/ahoy/visit/export.rb +24 -0
- data/app/models/ahoy/visit/filters.rb +286 -0
- data/app/models/ahoy/visit/imports.rb +36 -0
- data/app/models/ahoy/visit/locations.rb +276 -0
- data/app/models/ahoy/visit/metrics.rb +473 -0
- data/app/models/ahoy/visit/ordering.rb +110 -0
- data/app/models/ahoy/visit/pages.rb +533 -0
- data/app/models/ahoy/visit/pagination.rb +17 -0
- data/app/models/ahoy/visit/ranges.rb +227 -0
- data/app/models/ahoy/visit/series.rb +177 -0
- data/app/models/ahoy/visit/sources.rb +418 -0
- data/app/models/ahoy/visit/url_labels.rb +32 -0
- data/app/models/ahoy/visit.rb +143 -0
- data/app/models/ahoy_analytics/application_record.rb +5 -0
- data/app/models/ahoy_analytics/current.rb +8 -0
- data/app/models/ahoy_analytics/funnel.rb +16 -0
- data/app/models/ahoy_analytics/imported_entry_page.rb +5 -0
- data/app/models/ahoy_analytics/imported_exit_page.rb +5 -0
- data/app/models/ahoy_analytics/imported_page.rb +5 -0
- data/app/models/ahoy_analytics/live_stats.rb +152 -0
- data/app/models/ahoy_analytics/setting.rb +19 -0
- data/app/models/analytics/source_catalog.rb +48 -0
- data/app/views/layouts/ahoy_analytics/application.html.erb +15 -0
- data/config/routes.rb +21 -0
- data/config/vite.json +22 -0
- data/db/migrate/20251006104056_create_ahoy_visits_and_events.rb +62 -0
- data/db/migrate/20251006105012_add_analytics_fields_to_ahoy_visits.rb +11 -0
- data/db/migrate/20251012090000_create_analytics_funnels_and_imports.rb +52 -0
- data/db/migrate/20251013021500_add_analytics_indexes.rb +14 -0
- data/lib/ahoy_analytics/ahoy_store.rb +429 -0
- data/lib/ahoy_analytics/asset_manifest.rb +56 -0
- data/lib/ahoy_analytics/device_bucket.rb +39 -0
- data/lib/ahoy_analytics/engine.rb +55 -0
- data/lib/ahoy_analytics/maxmind_geo.rb +77 -0
- data/lib/ahoy_analytics/version.rb +3 -0
- data/lib/ahoy_analytics.rb +52 -0
- data/lib/generators/ahoy_analytics/install/install_generator.rb +111 -0
- data/lib/generators/ahoy_analytics/install/templates/initializer.rb +28 -0
- data/lib/tasks/ahoy_analytics_tasks.rake +4 -0
- metadata +352 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e}from"./jsx-runtime-u17CrQMm.js";import{r as x}from"./analytics-ui-DMSkNqd6.js";import{S as Q,c as W,B as D}from"./button-JVCrlR4s.js";import{D as S,a as $,b as F,d as J,e as I,c as p,f as N}from"./dropdown-menu-Adj3O5fh.js";import{c as K}from"./index-vX97OY1J.js";import{useSiteContext as V}from"./site-context-BNteYRlR.js";import{useTopStatsContext as X}from"./top-stats-context-DU15P9jS.js";import{a as H,u as _}from"./query-context-B-PgE00D.js";import G from"./filter-dialog-BN-rf4lp.js";import L from"./date-range-dialog-DWDp3cLG.js";import{g as Z}from"./cable-DO-7y1-E.js";import{X as z}from"./input-e4v_v0kE.js";import{c as A}from"./createLucideIcon-BGzacY2v.js";/* empty css */import"./Combination-BpSXUjp9.js";import"./index-BcHeb-Rh.js";import"./index-DzpzLoG4.js";import"./use-debounce-VBpXQRL8.js";const q=[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]],ee=A("calendar",q);const te=[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]],ae=A("funnel",te);const re=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],se=A("layers",re);const ne=[["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22",key:"1ailkh"}],["path",{d:"M2 6h1.972a4 4 0 0 1 3.6 2.2",key:"km57vx"}],["path",{d:"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45",key:"os18l9"}]],oe=A("shuffle",ne),ie=W("inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",secondary:"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",destructive:"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",outline:"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"}},defaultVariants:{variant:"default"}});function Y({className:t,variant:a,asChild:u=!1,...c}){const o=u?Q:"span";return e.jsx(o,{"data-slot":"badge",className:K(ie({variant:a}),t),...c})}const R=[{title:"URL",items:[{label:"Page",key:"page",value:"/dashboard"}]},{title:"Acquisition",items:[{label:"Source",key:"source",value:""},{label:"UTM tags",key:"utm",value:""}]},{title:"Device",items:[{label:"Location",key:"location",value:""},{label:"Screen size",key:"size",value:""},{label:"Browser",key:"browser",value:""},{label:"Operating System",key:"os",value:""}]}];function Ae({showCurrentVisitors:t}){const a=V(),u=Array.isArray(a.segments)&&a.segments.length>1,[c,o]=x.useState(!1),s=x.useRef(null);return x.useEffect(()=>{const l=s.current;if(!l)return;const r=new IntersectionObserver(([i])=>{o(!i.isIntersecting)},{rootMargin:"-80px 0px 0px 0px"});return r.observe(l),()=>r.disconnect()},[]),e.jsxs("div",{className:"relative",children:[e.jsx("div",{ref:s,"aria-hidden":"true",className:"absolute -top-16 h-16 w-full"}),e.jsx("div",{className:["relative z-10 flex flex-col gap-3 border-b border-transparent transition-colors",c?"sticky top-0 bg-background/95 backdrop-blur-sm border-border shadow-[0_4px_12px_rgba(7,9,16,0.3)]":""].join(" "),children:e.jsxs("div",{className:"flex flex-col gap-3 px-2 pt-3 pb-1 sm:pb-2 sm:px-0",children:[e.jsxs("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2.5 sm:gap-2.5",children:[t&&e.jsx(le,{}),e.jsx("div",{className:"hidden sm:contents",children:e.jsx(E,{})})]}),e.jsxs("div",{className:"flex shrink-0 flex-wrap items-center gap-2",children:[e.jsx(ce,{}),u?e.jsx(ue,{}):null,e.jsx(de,{})]})]}),e.jsx("div",{className:"flex flex-wrap items-center gap-2.5 sm:hidden",children:e.jsx(E,{})})]})})]})}function le(){const{payload:t,update:a}=X();x.useEffect(()=>{let c=null,o=null;const s=()=>{try{c=Z().subscriptions.create({channel:"AhoyAnalytics::AnalyticsChannel"},{received:r=>{typeof r?.currentVisitors=="number"&&a(i=>{const m=i.topStats.map(d=>d.graphMetric!=="currentVisitors"?d:{...d,value:r.currentVisitors});return{...i,topStats:m}})},disconnected:()=>{o=setTimeout(s,5e3)},rejected:()=>{o=setTimeout(s,5e3)}})}catch{o=setTimeout(s,5e3)}};return s(),()=>{o&&clearTimeout(o);try{c&&c.unsubscribe?.()}catch{}}},[a]);const u=x.useMemo(()=>{const c=t.topStats.find(s=>s.graphMetric==="currentVisitors");if(c)return Math.round(c.value);const o=t.topStats[0];return o?Math.round(o.value):0},[t.topStats]);return e.jsxs("a",{href:H("live"),className:"flex items-center gap-2 rounded-full bg-cyan-400/10 px-3 py-1.5 text-sm font-semibold text-cyan-400 transition hover:bg-cyan-400/15",children:[e.jsx("span",{className:"inline-flex size-2 animate-pulse rounded-full bg-cyan-400","aria-hidden":"true"}),e.jsxs("span",{children:[u," live visitors"]})]})}function E(){const{query:t,updateQuery:a}=_(),u=Object.entries(t.filters),c=Array.isArray(t.advancedFilters)?t.advancedFilters:[],o=["page","entry_page","exit_page","source","channel","referrer","utm_source","utm_medium","utm_campaign","utm_content","utm_term","country","region","city","browser","os","goal","prop","segment"],s=u.slice().sort(([r],[i])=>o.indexOf(r)-o.indexOf(i)),l=c.slice().sort((r,i)=>o.indexOf(r[1])-o.indexOf(i[1]));return s.length===0&&l.length===0?null:e.jsxs(e.Fragment,{children:[s.map(([r,i])=>e.jsxs(Y,{variant:"secondary",className:"flex items-center gap-1 bg-white/10 hover:bg-primary/10",children:[e.jsxs("span",{className:"capitalize",children:[P(r),":"]}),e.jsx("span",{children:t.labels&&t.labels[r]||i}),e.jsxs(D,{variant:"ghost",size:"icon",className:"size-5 p-0",onClick:()=>{a(m=>{const d={...m.filters};delete d[r];const v={...m.labels||{}};delete v[r];const n=Object.keys(d).length===0?void 0:v;return{...m,filters:d,labels:n}})},children:[e.jsx(z,{className:"size-3"}),e.jsxs("span",{className:"sr-only",children:["Remove filter ",r]})]})]},`eq:${r}`)),l.map(([r,i,m],d)=>e.jsxs(Y,{variant:"secondary",className:"flex items-center gap-1 bg-white/10 hover:bg-primary/10",children:[e.jsxs("span",{className:"capitalize",children:[P(i),":"]}),e.jsx("span",{className:"lowercase",children:String(r).replace("_"," ")}),e.jsx("span",{className:"font-medium",children:m}),e.jsxs(D,{variant:"ghost",size:"icon",className:"size-5 p-0",onClick:()=>{a(v=>{const f=(Array.isArray(v.advancedFilters)?v.advancedFilters:[]).filter(g=>!(g[0]===r&&g[1]===i&&g[2]===m));return{...v,advancedFilters:f}})},children:[e.jsx(z,{className:"size-3"}),e.jsxs("span",{className:"sr-only",children:["Remove filter ",i," ",r," ",m]})]})]},`adv:${d}:${r}:${i}:${m}`)),s.length+l.length>=2?e.jsx(D,{variant:"ghost",size:"sm",className:"h-6 px-2 text-xs",onClick:()=>a(r=>({...r,filters:{},labels:void 0,advancedFilters:[]})),children:"Clear all"}):null]})}function P(t){switch(t){case"hostname":return"Hostname";case"source":return"Source";case"channel":return"Channel";case"size":return"Screen Size";case"country":return"Country";case"region":return"Region";case"city":return"City";case"goal":return"Goal";case"segment":return"Segment";case"page":return"Page";case"browser":return"Browser";case"os":return"Operating System";case"utm_source":return"UTM Source";case"utm_medium":return"UTM Medium";case"utm_campaign":return"UTM Campaign";case"utm_content":return"UTM Content";case"utm_term":return"UTM Term";case"referrer":return"Referrer URL";case"entry_page":return"Entry Page";case"exit_page":return"Exit Page";case"prop":return"Property";default:return t}}function ce(){const{updateQuery:t}=_(),[a,u]=x.useState(!1),[c,o]=x.useState(!1),[s,l]=x.useState("page"),r=(i,m)=>{t(d=>({...d,filters:{...d.filters,[i]:m}}))};return e.jsxs(S,{open:a,onOpenChange:u,children:[e.jsx($,{asChild:!0,children:e.jsxs(D,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(ae,{className:"size-4"}),e.jsx("span",{className:"hidden sm:inline",children:"Filters"})]})}),e.jsx(F,{align:"start",sideOffset:8,alignOffset:-6,className:"w-64 p-1 rounded-md border border-border bg-popover/95 shadow-md",children:R.map((i,m)=>e.jsxs("div",{className:"mb-1 last:mb-0",children:[e.jsx(J,{className:"text-[11px] font-extrabold uppercase tracking-wider text-primary",children:i.title}),e.jsx(I,{children:i.items.map(d=>e.jsx(p,{onClick:()=>{d.key==="page"?(l("page"),o(!0)):d.key==="location"?(l("location"),o(!0)):d.key==="source"?(l("source"),o(!0)):d.key==="utm"?(l("utm"),o(!0)):d.key==="browser"?(l("browser"),o(!0)):d.key==="os"?(l("os"),o(!0)):d.key==="size"?(l("size"),o(!0)):r(d.key,d.value),u(!1)},children:d.label},d.label))}),m<R.length-1?e.jsx(N,{}):null]},i.title))}),e.jsx(G,{open:c,onOpenChange:o,type:s})]})}function ue(){const t=V(),{query:a,updateQuery:u}=_(),c=a.filters.segment,o=s=>{u(l=>{const r={...l.filters};return s?r.segment=s:delete r.segment,{...l,filters:r}})};return e.jsxs(S,{children:[e.jsx($,{asChild:!0,children:e.jsxs(D,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(se,{className:"size-4"}),e.jsx("span",{className:"hidden sm:inline",children:c?t.segments.find(s=>s.id===c)?.name??"Segment":"Segments"})]})}),e.jsxs(F,{align:"end",className:"w-56",children:[e.jsx(J,{children:"Saved segments"}),t.segments.map(s=>e.jsx(p,{onClick:()=>o(s.id),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:s.name},s.id)),e.jsx(N,{}),e.jsx(p,{onClick:()=>o(null),className:"hover:bg-white/10",children:"All visitors"})]})]})}function de(){const{query:t,updateQuery:a}=_(),[u,c]=x.useState(!1),o=x.useRef(null),s=x.useRef(null),[l,r]=x.useState(!1),[i,m]=x.useState(!1);x.useEffect(()=>{function n(f){const g=f.target,y=(g?.tagName||"").toLowerCase();if(y==="input"||y==="textarea"||(g?.isContentEditable??!1)||f.metaKey||f.ctrlKey||f.altKey)return;const k=(f.key||"").toUpperCase(),j={D:{value:"day",setDate:"current"},E:{value:"day",setDate:"last"},R:{value:"realtime"},W:{value:"7d"},F:{value:"28d"},N:{value:"91d"},M:{value:"month",setDate:"current"},P:{value:"month",setDate:"last"},Y:{value:"year",setDate:"current"},L:{value:"12mo"},A:{value:"all"},C:"custom",X:"toggle-compare"}[k];if(j){if(f.preventDefault(),j==="custom"){r(!0);return}if(j==="toggle-compare"){a(w=>({...w,comparison:w.comparison==="previous_period"?null:"previous_period"}));return}a(w=>b(w,j))}}return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[a,o]);const d=!!t.comparison,v=(()=>{if(!t.comparison)return"Compare";if(t.comparison==="previous_period")return"Previous period";if(t.comparison==="year_over_year")return"Year over year";if(t.comparison==="custom"&&t.compareFrom&&t.compareTo){const n=String(t.compareFrom).slice(0,10),f=String(t.compareTo).slice(0,10),g=new Date(n),y=new Date(f),T=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],k=T[g.getMonth()],M=T[y.getMonth()],j=g.getDate(),w=y.getDate(),C=g.getFullYear(),O=y.getFullYear();return C===O?k===M?`${k} ${j}–${w}, ${C}`:`${k} ${j}–${M} ${w}, ${C}`:`${k} ${j}, ${C}–${M} ${w}, ${O}`}return"Compare"})();return e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs(S,{open:u,onOpenChange:c,children:[e.jsx($,{asChild:!0,children:e.jsxs(D,{variant:"outline",size:"sm",className:"gap-2",children:[e.jsx(ee,{className:"size-4 shrink-0"}),e.jsx("span",{className:"truncate",children:me(t)})]})}),e.jsxs(F,{align:"end",className:"w-56",children:[e.jsx(p,{className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",onClick:()=>a(n=>b(n,{value:"day",setDate:"current"})),children:e.jsx(h,{label:"Today",hint:"D",active:B(t,"current")})}),e.jsx(p,{className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",onClick:()=>a(n=>b(n,{value:"day",setDate:"last"})),children:e.jsx(h,{label:"Yesterday",hint:"E",active:B(t,"last")})}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"realtime"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Realtime",hint:"R",active:t.period==="realtime"})}),e.jsx(N,{}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"7d"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Last 7 Days",hint:"W",active:t.period==="7d"})}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"28d"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Last 28 Days",hint:"F",active:t.period==="28d"})}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"91d"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Last 91 Days",hint:"N",active:t.period==="91d"})}),e.jsx(N,{}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"month",setDate:"current"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Month to Date",hint:"M",active:U(t,"current")})}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"month",setDate:"last"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Last Month",hint:"P",active:U(t,"last")})}),e.jsx(N,{}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"year",setDate:"current"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Year to Date",hint:"Y",active:pe(t,"current")})}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"12mo"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Last 12 Months",hint:"L",active:t.period==="12mo"})}),e.jsx(N,{}),e.jsx(p,{onClick:()=>a(n=>b(n,{value:"all"})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"All time",hint:"A",active:t.period==="all"})}),e.jsx(p,{onClick:()=>{c(!1),setTimeout(()=>r(!0),0)},className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Custom Range",hint:"C",active:t.period==="custom"})}),e.jsx(N,{}),t.comparison?e.jsx(p,{onClick:()=>a(n=>({...n,comparison:null,compareFrom:null,compareTo:null})),className:"hover:bg-white/10",children:e.jsx(h,{label:"Disable comparison",hint:"X"})}):e.jsx(p,{onClick:()=>a(n=>({...n,comparison:"previous_period"})),className:"hover:bg-white/10",children:e.jsx(h,{label:"Compare",hint:"X",leftIcon:e.jsx(oe,{className:"mr-2 size-4"})})})]})]}),d&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-sm text-muted-foreground shrink-0",children:"vs."}),e.jsxs(S,{children:[e.jsx($,{asChild:!0,children:e.jsx(D,{variant:"outline",size:"sm",className:"gap-2",children:e.jsx("span",{className:"truncate",children:v})})}),e.jsxs(F,{align:"end",className:"w-56",children:[e.jsx(p,{onClick:()=>a(n=>({...n,comparison:null,compareFrom:null,compareTo:null})),className:"hover:bg-white/10",children:e.jsx(h,{label:"Disable comparison"})}),e.jsx(p,{onClick:()=>a(n=>({...n,comparison:"previous_period",compareFrom:null,compareTo:null})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Previous period",active:t.comparison==="previous_period"})}),e.jsx(p,{onClick:()=>a(n=>({...n,comparison:"year_over_year",compareFrom:null,compareTo:null})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Year over year",active:t.comparison==="year_over_year"})}),e.jsx(p,{onClick:()=>{c(!1),setTimeout(()=>m(!0),0)},className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Custom period…",active:t.comparison==="custom"})}),e.jsx(N,{}),e.jsx(p,{onClick:()=>a(n=>({...n,matchDayOfWeek:!0})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Match day of week",active:!!t.matchDayOfWeek})}),e.jsx(p,{onClick:()=>a(n=>({...n,matchDayOfWeek:!1})),className:"hover:bg-white/10 data-[selected=true]:bg-primary/10",children:e.jsx(h,{label:"Match exact date",active:!t.matchDayOfWeek})})]})]})]}),e.jsx(L,{buttonRef:o,open:l,onOpenChange:r,initialFrom:t.period==="custom"?t.from:void 0,initialTo:t.period==="custom"?t.to:void 0,onApply:(n,f)=>{r(!1),a(g=>({...g,period:"custom",from:n,to:f}))}}),e.jsx(L,{buttonRef:s,open:i,onOpenChange:m,initialFrom:t.comparison==="custom"?t.compareFrom:void 0,initialTo:t.comparison==="custom"?t.compareTo:void 0,onApply:(n,f)=>{m(!1),a(g=>({...g,comparison:"custom",compareFrom:n,compareTo:f}))}})]})}function me(t){const a=s=>String(s).padStart(2,"0"),u=s=>`${s.getFullYear()}-${a(s.getMonth()+1)}-${a(s.getDate())}`,c=s=>{if(!s)return"Month to Date";const[l,r]=String(s).split("-"),i=["January","February","March","April","May","June","July","August","September","October","November","December"],m=new Date;return Number(l)===m.getFullYear()&&Number(r)===m.getMonth()+1?"Month to Date":`${i[Math.max(0,Math.min(11,Number(r)-1))]} ${l}`},o=s=>{if(!s)return"Year to Date";const l=String(s).slice(0,4),r=new Date;return Number(l)===r.getFullYear()?"Year to Date":l};switch(t.period){case"realtime":return"Realtime (30m)";case"day":{const s=new Date;if(!t.date)return"Today";const l=new Date(s);return l.setDate(s.getDate()-1),t.date===u(s)?"Today":t.date===u(l)?"Yesterday":t.date}case"7d":return"Last 7 days";case"28d":return"Last 28 days";case"30d":return"Last 30 days";case"91d":return"Last 91 days";case"month":return c(t.date);case"year":return o(t.date);case"12mo":return"Last 12 Months";case"all":return"All time";case"custom":{const s=t.from,l=t.to;if(!s||!l)return"Custom range";const r=new Date(String(s).slice(0,10)),i=new Date(String(l).slice(0,10)),m=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],d=m[r.getMonth()],v=m[i.getMonth()],n=r.getDate(),f=i.getDate(),g=r.getFullYear(),y=i.getFullYear();return g===y?d===v?`${d} ${n}–${f}, ${g}`:`${d} ${n}–${v} ${f}, ${g}`:`${d} ${n}, ${g}–${v} ${f}, ${y}`}default:return"Period"}}function h({label:t,hint:a,active:u,leftIcon:c,rightIcon:o}){return e.jsxs("span",{className:"flex w-full items-center justify-between",children:[e.jsxs("span",{className:`flex items-center ${u?"font-semibold text-primary":""}`,children:[c,t]}),o||(a?e.jsx("span",{className:"rounded-md border border-foreground/20 px-1.5 py-0.5 text-[11px] text-foreground/60",children:a}):null)]})}function B(t,a){if(t.period!=="day")return!1;const u=new Date,c=l=>String(l).padStart(2,"0"),o=l=>`${l.getFullYear()}-${c(l.getMonth()+1)}-${c(l.getDate())}`;if(a==="current")return!t.date||t.date===o(u);const s=new Date(u);return s.setDate(u.getDate()-1),t.date===o(s)}function U(t,a){if(t.period!=="month")return!1;const u=new Date,c=new Date(u);a==="last"&&c.setMonth(c.getMonth()-1);const o=c.getFullYear(),s=c.getMonth()+1;if(!t.date)return a==="current";const[l,r]=String(t.date).split("-").map(i=>Number(i));return l===o&&r===s}function pe(t,a){if(t.period!=="year")return!1;const c=new Date().getFullYear();return t.date?Number(String(t.date).slice(0,4))===c:a==="current"}function b(t,a){const u=new Date,c=i=>String(i).padStart(2,"0"),o=i=>`${i.getFullYear()}-${c(i.getMonth()+1)}-${c(i.getDate())}`,s=i=>{const m=new Date(u);return i==="last"&&m.setMonth(m.getMonth()-1),`${m.getFullYear()}-${c(m.getMonth()+1)}-01`},l=i=>`${i==="last"?u.getFullYear()-1:u.getFullYear()}-01-01`;let r={...t,period:a.value,from:null,to:null};if(a.value==="day"&&a.setDate==="last"){const i=new Date(u);return i.setDate(u.getDate()-1),r.date=o(i),r}return a.value==="month"?(r.date=s(a.setDate??"current"),r):a.value==="year"?(r.date=l(a.setDate??"current"),r):(r.date=null,r)}export{Ae as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as u}from"./jsx-runtime-u17CrQMm.js";import{r as o}from"./analytics-ui-DMSkNqd6.js";/* empty css */const r=o.createContext(null);function c({initial:t,children:s}){const[e,n]=o.useState(t),a=o.useMemo(()=>({payload:e,update:n}),[e]);return u.jsx(r.Provider,{value:a,children:s})}function m(){const t=o.useContext(r);if(!t)throw new Error("useTopStatsContext must be used within a TopStatsProvider");return t}export{c as TopStatsProvider,m as useTopStatsContext};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r}from"./analytics-ui-DMSkNqd6.js";const n=300;function s(t,u=n){const e=r.useRef(null);return r.useEffect(()=>()=>{e.current&&clearTimeout(e.current)},[]),r.useCallback(((...c)=>{e.current&&clearTimeout(e.current),e.current=setTimeout(()=>{t(...c)},u)}),[t,u])}export{s as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as n}from"./jsx-runtime-u17CrQMm.js";import{r as t}from"./analytics-ui-DMSkNqd6.js";/* empty css */const e=t.createContext(null);function x({value:r,children:o}){return n.jsx(e.Provider,{value:r,children:o})}function c(){const r=t.useContext(e);if(!r)throw new Error("useUserContext must be used within a UserProvider");return r}export{x as UserProvider,c as useUserContext};
|