| /** | |
| * @license | |
| * Copyright 2026 The Go Authors. All rights reserved. | |
| * Use of this source code is governed by a BSD-style | |
| * license that can be found in the LICENSE file. | |
| */ | |
| interface TagManagerEvent { | |
| /** | |
| * event is the name of the event, used to filter events in | |
| * Google Analytics. | |
| */ | |
| event: string; | |
| /** | |
| * event_category is a name that you supply as a way to group objects | |
| * that to analyze. Typically, you will use the same category name | |
| * multiple times over related UI elements (buttons, links, etc). | |
| */ | |
| event_category?: string; | |
| /** | |
| * event_action is used to name the type of event or interaction you | |
| * want to measure for a particular web object. For example, with a | |
| * single "form" category, you can analyze a number of specific events | |
| * with this parameter, such as: form entered, form submitted. | |
| */ | |
| event_action?: string; | |
| /** | |
| * event_label provide additional information for events that you want | |
| * to analyze, such as the text label of a link. | |
| */ | |
| event_label?: string; | |
| /** | |
| * gtm.start is used to initialize Google Tag Manager. | |
| */ | |
| 'gtm.start'?: number; | |
| } | |
| declare global { | |
| interface Window { | |
| dataLayer?: (TagManagerEvent | VoidFunction)[]; | |
| ga?: unknown; | |
| } | |
| } | |
| /** | |
| * track sends events to Google Tag Manager. | |
| */ | |
| export function track( | |
| event: string | TagManagerEvent, | |
| category?: string, | |
| action?: string, | |
| label?: string, | |
| ): void { | |
| window.dataLayer ??= []; | |
| if (typeof event === 'string') { | |
| window.dataLayer.push({ | |
| event, | |
| event_category: category, | |
| event_action: action, | |
| event_label: label, | |
| }); | |
| } else { | |
| window.dataLayer.push(event); | |
| } | |
| } | |
| /** | |
| * func adds functions to run sequentionally after | |
| * Google Tag Manager is ready. | |
| */ | |
| export function func(fn: () => void): void { | |
| window.dataLayer ??= []; | |
| window.dataLayer.push(fn); | |
| } |