@se-studio/hubspot 17.2.1 → 17.3.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/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @se-studio/hubspot
2
2
 
3
+ ## 17.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 3b96c05: Keep HubSpot form field values out of the URL on a native submit before hydration (`method="post"` + `action="#"`), so `page_view` cannot send names/emails to GTM/GA.
8
+
9
+ ## 17.3.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 7415484: Add a shared analytics consent helper and make GTM / HubSpot adapters consent-aware.
14
+
15
+ `resolveAnalyticsConsent` / `createConsentGetter` read a site-supplied source plus optional Global Privacy Control and Do Not Track (both off by default). `HubSpotAnalyticsAdapter` skips the tracking script and `_hsq` events while `getConsent` is false, and pushes `doNotTrack` on a mid-session deny. `ConsentAwareAdapter` vendor sync (`updateConsent` / late initialize) is **opt-in** via `{ syncConsent: true }` and forwards **analytics only** (never advertising).
16
+
17
+ **GTM Consent Mode (Array → Arguments):** `GoogleTagManagerAdapter` now issues real `gtag('consent', …)` commands (an Arguments object, flushed before `gtm.js` / gtag.js). GA4-only setups (`measurementId`) also send `gtag('js')` and `config` as Arguments. Consent Mode `default` is pushed **only when `consentDefault` is set**; otherwise the adapter does not grant `ad_*` keys, and denying or undecided visitors never get advertising `granted` from the adapter.
18
+
19
+ Sites using Orejime now have Google tags respect denied consent. Sites without a CMP integration are unchanged. GA4 and Ads volumes may drop where those denies start to apply. Sites that do not load GTM via this adapter are unaffected. HubSpot script gating does not change unless a site passes `getConsent` / `{ syncConsent: true }`.
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [7415484]
24
+ - @se-studio/core-ui@1.34.0
25
+
3
26
  ## 17.2.1
4
27
 
5
28
  ### Patch Changes
package/README.md CHANGED
@@ -5,7 +5,7 @@ HubSpot tracking and API-driven form rendering for Next.js marketing sites.
5
5
  ## Features
6
6
 
7
7
  - **`HubSpotAnalyticsAdapter`** — `AnalyticsAdapter` for HubSpot tracking code (SPA Mode B page views, custom behavioural events)
8
- - **`HubspotDynamicForm`** — React renderer from HubSpot Marketing Forms API definitions
8
+ - **`HubspotDynamicForm`** — React renderer from HubSpot Marketing Forms API definitions (`method="post"` `action="#"` so a pre-hydration native submit cannot put field values in the URL)
9
9
  - **UTM / marketing hidden fields** — auto-fills empty hidden form fields from URL query params and first-touch `sessionStorage` (`utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content`, plus any query key that matches a hidden field name)
10
10
  - **`createHubspotFormExternalRenderer`** — CMS external component factory (`externalComponentType: "Hubspot form"`)
11
11
  - **Per-form fetch** — `GET /marketing/v3/forms/{formId}` with Next.js `unstable_cache` (no bulk form download)
@@ -26,19 +26,35 @@ pnpm add @se-studio/hubspot
26
26
  ## Analytics (with GTM)
27
27
 
28
28
  ```tsx
29
- import { AnalyticsPageTracker, AnalyticsProvider, CompositeAnalyticsAdapter, ConsentAwareAdapter, GoogleTagManagerAdapter } from '@se-studio/core-ui';
29
+ import { AnalyticsPageTracker, AnalyticsProvider, CompositeAnalyticsAdapter, ConsentAwareAdapter, GoogleTagManagerAdapter, createConsentGetter } from '@se-studio/core-ui';
30
30
  import { AbTestReporter } from '@se-studio/ab-testing/components';
31
31
  import { HubSpotAnalyticsAdapter, createHubSpotBootstrapScript } from '@se-studio/hubspot';
32
32
  import Script from 'next/script';
33
33
 
34
+ const hasConsent = createConsentGetter({
35
+ model: 'opt-out',
36
+ honorGlobalPrivacyControl: true,
37
+ honorDoNotTrack: true,
38
+ source: () => /* site cookie / CMP; undefined = model default */ undefined,
39
+ });
40
+
34
41
  const adapter = new ConsentAwareAdapter(
35
42
  new CompositeAnalyticsAdapter([
36
- new GoogleTagManagerAdapter({ containerId: process.env.GTM_TAG! }),
37
- new HubSpotAnalyticsAdapter({ portalId: process.env.HUBSPOT_PORTAL_ID! }),
43
+ new GoogleTagManagerAdapter({
44
+ containerId: process.env.GTM_TAG!,
45
+ // omit consentDefault when a CMP owns Consent Mode; set only for adapter-owned default
46
+ consentDefault: 'granted',
47
+ }),
48
+ new HubSpotAnalyticsAdapter({
49
+ portalId: process.env.HUBSPOT_PORTAL_ID!,
50
+ getConsent: hasConsent,
51
+ }),
38
52
  ]),
39
53
  'analytics',
40
- hasConsent,
54
+ () => hasConsent(),
55
+ { syncConsent: true },
41
56
  );
57
+ adapter.initialize();
42
58
 
43
59
  // layout.tsx — before HubSpot script loads (no args = SSG-safe; uses window.location.pathname)
44
60
  <Script id="hubspot-bootstrap" strategy="beforeInteractive"
@@ -1 +1 @@
1
- {"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAyBnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+FAA+F;IAC/F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GAClB,EAAE,uBAAuB,+BA+HzB"}
1
+ {"version":3,"file":"HubspotDynamicForm.d.ts","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA0BnG;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3C,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CA8CtC;AAgBD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,qBAAqB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACnE;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+FAA+F;IAC/F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GAClB,EAAE,uBAAuB,+BAiIzB"}
@@ -4,6 +4,7 @@ import { decode } from 'html-entities';
4
4
  import { useCallback, useEffect, useMemo } from 'react';
5
5
  import { collectVisibleFields } from './dependentFields';
6
6
  import { applyMarketingParamsToHiddenFields, captureMarketingParams } from './marketingParams';
7
+ import { CORE_FORM_NATIVE_ACTION, CORE_FORM_NATIVE_METHOD } from './nativeSubmitUrl';
7
8
  import { isSupportedFieldType, renderHubspotField } from './renderHubspotField';
8
9
  import { useHubspotSubmit } from './useHubspotSubmit';
9
10
  const DEFAULT_CLASS_NAMES = {
@@ -112,6 +113,6 @@ export function HubspotDynamicForm({ portalId, formDefinition, submitButtonText,
112
113
  }, [classNames, dependentFieldsMap, formData, handleInputChange, visibleFields]);
113
114
  const buttonText = submitButtonText ?? formDefinition.submitButtonText;
114
115
  const pendingButtonText = submittingButtonText?.trim() || 'Submitting…';
115
- return (_jsxs("form", { onSubmit: handleSubmit, className: classNames.form, "data-hsforms-manual": "true", "data-hs-do-not-collect": "true", children: [formDefinition.recaptchaEnabled && (_jsx("p", { className: classNames.message, children: "This form requires CAPTCHA in HubSpot. Configure bot protection for your deployment." })), formDefinition.fieldGroups.map((group) => (_jsxs("div", { className: classNames.fieldGroup, children: [renderRichText(group.richText, classNames.richText), group.fields.map((field) => renderField(field.name, field))] }, `${group.groupType}-${group.richText ?? group.fields.map((f) => f.name).join('-')}`))), formDefinition.legalConsentOptions && (_jsxs("div", { className: classNames.legalConsent, children: [formDefinition.legalConsentOptions.privacyText && (_jsx("p", { children: decode(formDefinition.legalConsentOptions.privacyText) })), formDefinition.legalConsentOptions.consentToProcessCheckboxLabel && (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: true, name: "consentToProcess" }), _jsx("span", { children: decode(formDefinition.legalConsentOptions.consentToProcessCheckboxLabel) })] })), formDefinition.legalConsentOptions.communicationsCheckboxes?.map((checkbox) => (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: checkbox.required, name: `communication-${checkbox.subscriptionTypeId ?? checkbox.label}` }), _jsx("span", { children: decode(checkbox.label) })] }, checkbox.label)))] })), _jsx("button", { type: "submit", className: classNames.submitButton, disabled: isSubmitting, "aria-busy": isSubmitting, children: decode(isSubmitting ? pendingButtonText : buttonText) }), submitError && (_jsx("p", { className: classNames.error ?? classNames.message, role: "alert", children: submitError })), message && !submitError && _jsx("p", { className: classNames.message, children: message })] }));
116
+ return (_jsxs("form", { method: CORE_FORM_NATIVE_METHOD, action: CORE_FORM_NATIVE_ACTION, onSubmit: handleSubmit, className: classNames.form, "data-hsforms-manual": "true", "data-hs-do-not-collect": "true", children: [formDefinition.recaptchaEnabled && (_jsx("p", { className: classNames.message, children: "This form requires CAPTCHA in HubSpot. Configure bot protection for your deployment." })), formDefinition.fieldGroups.map((group) => (_jsxs("div", { className: classNames.fieldGroup, children: [renderRichText(group.richText, classNames.richText), group.fields.map((field) => renderField(field.name, field))] }, `${group.groupType}-${group.richText ?? group.fields.map((f) => f.name).join('-')}`))), formDefinition.legalConsentOptions && (_jsxs("div", { className: classNames.legalConsent, children: [formDefinition.legalConsentOptions.privacyText && (_jsx("p", { children: decode(formDefinition.legalConsentOptions.privacyText) })), formDefinition.legalConsentOptions.consentToProcessCheckboxLabel && (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: true, name: "consentToProcess" }), _jsx("span", { children: decode(formDefinition.legalConsentOptions.consentToProcessCheckboxLabel) })] })), formDefinition.legalConsentOptions.communicationsCheckboxes?.map((checkbox) => (_jsxs("label", { className: classNames.checkboxLabel, children: [_jsx("input", { type: "checkbox", required: checkbox.required, name: `communication-${checkbox.subscriptionTypeId ?? checkbox.label}` }), _jsx("span", { children: decode(checkbox.label) })] }, checkbox.label)))] })), _jsx("button", { type: "submit", className: classNames.submitButton, disabled: isSubmitting, "aria-busy": isSubmitting, children: decode(isSubmitting ? pendingButtonText : buttonText) }), submitError && (_jsx("p", { className: classNames.error ?? classNames.message, role: "alert", children: submitError })), message && !submitError && _jsx("p", { className: classNames.message, children: message })] }));
116
117
  }
117
118
  //# sourceMappingURL=HubspotDynamicForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,mBAAmB,GAA0B;IACjD,IAAI,EAAE,qBAAqB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,oBAAoB;IACjC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,yBAAyB;IACrC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,6BAA6B;IAC3C,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,cAAqC,EACrC,YAAqC,EACrC,aAAsC,EACtC,OAA4C;IAE5C,IAAI,QAAQ,GAAyC,EAAE,CAAC;IAExD,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;gBAChD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EACH,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACxF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EAAE,KAAK,CAAC,YAAY;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,IAAI,OAAO,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC5C,sBAAsB,EAAE,CAAC;QACzB,QAAQ,GAAG,kCAAkC,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,SAAkB;IACrE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,CACL,cACE,SAAS,EAAE,SAAS;QACpB,wFAAwF;QACxF,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GACjD,CACH,CAAC;AACJ,CAAC;AAmCD,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GACO;IACxB,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,mBAAmB,EAAE,GAAG,cAAc,EAAE,CAAC,EACrD,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,GAAG,gBAAgB,CAAC;QACnB,QAAQ;QACR,cAAc;QACd,SAAS;QACT,SAAS;QACT,OAAO;QACP,mBAAmB;QACnB,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,SAAS;QAClD,cAAc,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,SAAS;KACvD,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAE/D,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,oBAAoB,CAChE,cAAc,CAAC,WAAW,EAC1B,QAAQ,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,SAAiB,EAAE,KAA0D,EAAE,EAAE;QAChF,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,CACL,aAAmB,SAAS,EAAE,UAAU,CAAC,OAAO,yCACrB,WAAW,CAAC,SAAS,KADxC,SAAS,CAEb,CACL,CAAC;QACJ,CAAC;QAED,OAAO,kBAAkB,CAAC;YACxB,KAAK,EAAE,WAAW;YAClB,QAAQ;YACR,iBAAiB;YACjB,UAAU;SACX,CAAC,CAAC;IACL,CAAC,EACD,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAC7E,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,IAAI,cAAc,CAAC,gBAAgB,CAAC;IACvE,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC;IAExE,OAAO,CACL,gBACE,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,UAAU,CAAC,IAAI,yBACN,MAAM,4BACH,MAAM,aAE5B,cAAc,CAAC,gBAAgB,IAAI,CAClC,YAAG,SAAS,EAAE,UAAU,CAAC,OAAO,qGAE5B,CACL,EAEA,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACzC,eAEE,SAAS,EAAE,UAAU,CAAC,UAAU,aAE/B,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,EACnD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAJvD,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAKpF,CACP,CAAC,EAED,cAAc,CAAC,mBAAmB,IAAI,CACrC,eAAK,SAAS,EAAE,UAAU,CAAC,YAAY,aACpC,cAAc,CAAC,mBAAmB,CAAC,WAAW,IAAI,CACjD,sBAAI,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAK,CAChE,EACA,cAAc,CAAC,mBAAmB,CAAC,6BAA6B,IAAI,CACnE,iBAAO,SAAS,EAAE,UAAU,CAAC,aAAa,aACxC,gBAAO,IAAI,EAAC,UAAU,EAAC,QAAQ,QAAC,IAAI,EAAC,kBAAkB,GAAG,EAC1D,yBACG,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,6BAA6B,CAAC,GACpE,IACD,CACT,EACA,cAAc,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC9E,iBAA4B,SAAS,EAAE,UAAU,CAAC,aAAa,aAC7D,gBACE,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,IAAI,EAAE,iBAAiB,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,KAAK,EAAE,GACtE,EACF,yBAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAQ,KAN3B,QAAQ,CAAC,KAAK,CAOlB,CACT,CAAC,IACE,CACP,EAED,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,UAAU,CAAC,YAAY,EAClC,QAAQ,EAAE,YAAY,eACX,YAAY,YAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,GAC/C,EAER,WAAW,IAAI,CACd,YAAG,SAAS,EAAE,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,EAAC,OAAO,YAC/D,WAAW,GACV,CACL,EACA,OAAO,IAAI,CAAC,WAAW,IAAI,YAAG,SAAS,EAAE,UAAU,CAAC,OAAO,YAAG,OAAO,GAAK,IACtE,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"HubspotDynamicForm.js","sourceRoot":"","sources":["../../../src/forms/client/HubspotDynamicForm.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,mBAAmB,GAA0B;IACjD,IAAI,EAAE,qBAAqB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,oBAAoB;IACjC,KAAK,EAAE,kBAAkB;IACzB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,kBAAkB;IAC1B,aAAa,EAAE,qBAAqB;IACpC,aAAa,EAAE,yBAAyB;IACxC,UAAU,EAAE,qBAAqB;IACjC,UAAU,EAAE,yBAAyB;IACrC,YAAY,EAAE,8BAA8B;IAC5C,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,6BAA6B;IAC3C,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,cAAqC,EACrC,YAAqC,EACrC,aAAsC,EACtC,OAA4C;IAE5C,IAAI,QAAQ,GAAyC,EAAE,CAAC;IAExD,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;gBAChD,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EACH,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACxF,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,KAAK,EAAE,KAAK,CAAC,YAAY;iBAC1B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,sFAAsF;IACtF,IAAI,OAAO,EAAE,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC5C,sBAAsB,EAAE,CAAC;QACzB,QAAQ,GAAG,kCAAkC,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,GAAG;YACf,IAAI;YACJ,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,IAAI,KAAK;YACnD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,OAA2B,EAAE,SAAkB;IACrE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,OAAO,CACL,cACE,SAAS,EAAE,SAAS;QACpB,wFAAwF;QACxF,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GACjD,CACH,CAAC;AACJ,CAAC;AAmCD,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EAAE,cAAc,EAC1B,YAAY,EACZ,aAAa,EACb,SAAS,EACT,SAAS,EACT,OAAO,EACP,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GACO;IACxB,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,mBAAmB,EAAE,GAAG,cAAc,EAAE,CAAC,EACrD,CAAC,cAAc,CAAC,CACjB,CAAC;IACF,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,GAAG,gBAAgB,CAAC;QACnB,QAAQ;QACR,cAAc;QACd,SAAS;QACT,SAAS;QACT,OAAO;QACP,mBAAmB;QACnB,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,SAAS;QAClD,cAAc,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,SAAS;KACvD,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IAE/D,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,oBAAoB,CAChE,cAAc,CAAC,WAAW,EAC1B,QAAQ,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,SAAiB,EAAE,KAA0D,EAAE,EAAE;QAChF,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,CACL,aAAmB,SAAS,EAAE,UAAU,CAAC,OAAO,yCACrB,WAAW,CAAC,SAAS,KADxC,SAAS,CAEb,CACL,CAAC;QACJ,CAAC;QAED,OAAO,kBAAkB,CAAC;YACxB,KAAK,EAAE,WAAW;YAClB,QAAQ;YACR,iBAAiB;YACjB,UAAU;SACX,CAAC,CAAC;IACL,CAAC,EACD,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAC7E,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,IAAI,cAAc,CAAC,gBAAgB,CAAC;IACvE,MAAM,iBAAiB,GAAG,oBAAoB,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC;IAExE,OAAO,CACL,gBACE,MAAM,EAAE,uBAAuB,EAC/B,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,UAAU,CAAC,IAAI,yBACN,MAAM,4BACH,MAAM,aAE5B,cAAc,CAAC,gBAAgB,IAAI,CAClC,YAAG,SAAS,EAAE,UAAU,CAAC,OAAO,qGAE5B,CACL,EAEA,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACzC,eAEE,SAAS,EAAE,UAAU,CAAC,UAAU,aAE/B,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,EACnD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,KAJvD,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAKpF,CACP,CAAC,EAED,cAAc,CAAC,mBAAmB,IAAI,CACrC,eAAK,SAAS,EAAE,UAAU,CAAC,YAAY,aACpC,cAAc,CAAC,mBAAmB,CAAC,WAAW,IAAI,CACjD,sBAAI,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAK,CAChE,EACA,cAAc,CAAC,mBAAmB,CAAC,6BAA6B,IAAI,CACnE,iBAAO,SAAS,EAAE,UAAU,CAAC,aAAa,aACxC,gBAAO,IAAI,EAAC,UAAU,EAAC,QAAQ,QAAC,IAAI,EAAC,kBAAkB,GAAG,EAC1D,yBACG,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,6BAA6B,CAAC,GACpE,IACD,CACT,EACA,cAAc,CAAC,mBAAmB,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAC9E,iBAA4B,SAAS,EAAE,UAAU,CAAC,aAAa,aAC7D,gBACE,IAAI,EAAC,UAAU,EACf,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,IAAI,EAAE,iBAAiB,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,KAAK,EAAE,GACtE,EACF,yBAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAQ,KAN3B,QAAQ,CAAC,KAAK,CAOlB,CACT,CAAC,IACE,CACP,EAED,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,UAAU,CAAC,YAAY,EAClC,QAAQ,EAAE,YAAY,eACX,YAAY,YAEtB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,GAC/C,EAER,WAAW,IAAI,CACd,YAAG,SAAS,EAAE,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,EAAC,OAAO,YAC/D,WAAW,GACV,CACL,EACA,OAAO,IAAI,CAAC,WAAW,IAAI,YAAG,SAAS,EAAE,UAAU,CAAC,OAAO,YAAG,OAAO,GAAK,IACtE,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Native-submit attributes for core HubSpot forms.
3
+ *
4
+ * HTML defaults to GET when `method` is omitted, which puts field values in the
5
+ * query string (and then `page_view` can send that URL to GTM/GA). POST keeps
6
+ * values out of the URL even before React hydrates `onSubmit`.
7
+ *
8
+ * `action="#"` stays on the current document URL with a fragment only — no
9
+ * extra query string, and no Next.js server-action interpretation of a missing
10
+ * `action`. After hydration, `onSubmit` still `preventDefault`s and posts via
11
+ * the HubSpot API.
12
+ */
13
+ export declare const CORE_FORM_NATIVE_METHOD = "post";
14
+ export declare const CORE_FORM_NATIVE_ACTION = "#";
15
+ /**
16
+ * URL the browser would navigate to for a native submit of `form` (no JS
17
+ * `preventDefault`). GET serializes successful controls into the query string;
18
+ * POST/other methods keep field values out of the URL.
19
+ */
20
+ export declare function urlAfterNativeSubmit(form: HTMLFormElement, currentHref: string): string;
21
+ //# sourceMappingURL=nativeSubmitUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeSubmitUrl.d.ts","sourceRoot":"","sources":["../../../src/forms/client/nativeSubmitUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAC9C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBvF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Native-submit attributes for core HubSpot forms.
3
+ *
4
+ * HTML defaults to GET when `method` is omitted, which puts field values in the
5
+ * query string (and then `page_view` can send that URL to GTM/GA). POST keeps
6
+ * values out of the URL even before React hydrates `onSubmit`.
7
+ *
8
+ * `action="#"` stays on the current document URL with a fragment only — no
9
+ * extra query string, and no Next.js server-action interpretation of a missing
10
+ * `action`. After hydration, `onSubmit` still `preventDefault`s and posts via
11
+ * the HubSpot API.
12
+ */
13
+ export const CORE_FORM_NATIVE_METHOD = 'post';
14
+ export const CORE_FORM_NATIVE_ACTION = '#';
15
+ /**
16
+ * URL the browser would navigate to for a native submit of `form` (no JS
17
+ * `preventDefault`). GET serializes successful controls into the query string;
18
+ * POST/other methods keep field values out of the URL.
19
+ */
20
+ export function urlAfterNativeSubmit(form, currentHref) {
21
+ const method = (form.getAttribute('method') || 'get').trim().toLowerCase();
22
+ const actionAttr = form.getAttribute('action');
23
+ const actionHref = actionAttr === null || actionAttr === '' ? currentHref : actionAttr;
24
+ const actionUrl = new URL(actionHref, currentHref);
25
+ if (method !== 'get') {
26
+ return actionUrl.href;
27
+ }
28
+ const params = new URLSearchParams();
29
+ for (const [name, value] of new FormData(form).entries()) {
30
+ if (typeof value === 'string') {
31
+ params.append(name, value);
32
+ }
33
+ }
34
+ actionUrl.search = params.toString();
35
+ return actionUrl.href;
36
+ }
37
+ //# sourceMappingURL=nativeSubmitUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeSubmitUrl.js","sourceRoot":"","sources":["../../../src/forms/client/nativeSubmitUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAqB,EAAE,WAAmB;IAC7E,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IACvF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { AnalyticsAdapter, ClickTrackingProperties, PageTrackingProperties } from '@se-studio/core-ui';
1
+ import type { AnalyticsAdapter, AnalyticsConsentState, ClickTrackingProperties, PageTrackingProperties } from '@se-studio/core-ui';
2
2
  declare global {
3
3
  interface Window {
4
4
  _hsq?: unknown[][];
@@ -10,12 +10,29 @@ export interface HubSpotAnalyticsAdapterConfig {
10
10
  eventNameMap?: Record<string, string>;
11
11
  /** Default behavioural event for trackClick when trackingInfo has no event name. */
12
12
  defaultClickEventName?: string;
13
+ /**
14
+ * When provided, `initialize()` does not inject the HubSpot script and
15
+ * `track*` does not push `_hsq` events while this returns false.
16
+ * Omit it for unchanged behaviour (script loads, events fire).
17
+ */
18
+ getConsent?: () => boolean;
13
19
  }
14
20
  export declare class HubSpotAnalyticsAdapter implements AnalyticsAdapter {
15
21
  private initialized;
16
22
  private readonly config;
23
+ /** Last explicit `updateConsent` analytics flag. Default allow when unset. */
24
+ private allowedFromUpdate;
25
+ private doNotTrackSent;
17
26
  constructor(config: HubSpotAnalyticsAdapterConfig);
27
+ private isAllowed;
28
+ private sendDoNotTrack;
18
29
  initialize(): void;
30
+ /**
31
+ * `analytics: false` pushes HubSpot `doNotTrack` and blocks later events.
32
+ * `analytics: true` allows `initialize()` to load the script on a later grant.
33
+ */
34
+ updateConsent(consent: AnalyticsConsentState): void;
35
+ private guardEvent;
19
36
  trackPage(_url: string, properties: PageTrackingProperties): void;
20
37
  trackEvent(event: string, properties: Record<string, unknown>): void;
21
38
  trackClick(properties: ClickTrackingProperties): void;
@@ -1 +1 @@
1
- {"version":3,"file":"HubSpotAnalyticsAdapter.d.ts","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;KACpB;CACF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AA8BD,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEvD,YAAY,MAAM,EAAE,6BAA6B,EAEhD;IAED,UAAU,IAAI,IAAI,CAsBjB;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAGhE;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAanE;IAED,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAqBpD;CACF"}
1
+ {"version":3,"file":"HubSpotAnalyticsAdapter.d.ts","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;KACpB;CACF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oFAAoF;IACpF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;CAC5B;AA8BD,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,8EAA8E;IAC9E,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,cAAc,CAAS;IAE/B,YAAY,MAAM,EAAE,6BAA6B,EAEhD;IAED,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,cAAc;IAQtB,UAAU,IAAI,IAAI,CA2BjB;IAED;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAgBlD;IAED,OAAO,CAAC,UAAU;IAQlB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAMhE;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAgBnE;IAED,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAwBpD;CACF"}
@@ -21,13 +21,32 @@ function getHubspotEventName(event, properties, eventNameMap) {
21
21
  export class HubSpotAnalyticsAdapter {
22
22
  initialized = false;
23
23
  config;
24
+ /** Last explicit `updateConsent` analytics flag. Default allow when unset. */
25
+ allowedFromUpdate = true;
26
+ doNotTrackSent = false;
24
27
  constructor(config) {
25
28
  this.config = config;
26
29
  }
30
+ isAllowed() {
31
+ if (this.config.getConsent) {
32
+ return this.config.getConsent();
33
+ }
34
+ return this.allowedFromUpdate;
35
+ }
36
+ sendDoNotTrack() {
37
+ if (this.doNotTrackSent || !this.initialized) {
38
+ return;
39
+ }
40
+ pushHsq(['doNotTrack']);
41
+ this.doNotTrackSent = true;
42
+ }
27
43
  initialize() {
28
44
  if (typeof window === 'undefined' || this.initialized) {
29
45
  return;
30
46
  }
47
+ if (!this.isAllowed()) {
48
+ return;
49
+ }
31
50
  const { portalId } = this.config;
32
51
  if (!portalId) {
33
52
  return;
@@ -43,12 +62,44 @@ export class HubSpotAnalyticsAdapter {
43
62
  document.head.appendChild(script);
44
63
  }
45
64
  this.initialized = true;
65
+ this.doNotTrackSent = false;
66
+ }
67
+ /**
68
+ * `analytics: false` pushes HubSpot `doNotTrack` and blocks later events.
69
+ * `analytics: true` allows `initialize()` to load the script on a later grant.
70
+ */
71
+ updateConsent(consent) {
72
+ if (consent.analytics === undefined) {
73
+ return;
74
+ }
75
+ this.allowedFromUpdate = consent.analytics;
76
+ if (!consent.analytics) {
77
+ this.sendDoNotTrack();
78
+ return;
79
+ }
80
+ this.doNotTrackSent = false;
81
+ if (!this.initialized) {
82
+ this.initialize();
83
+ }
84
+ }
85
+ guardEvent() {
86
+ if (!this.isAllowed()) {
87
+ this.sendDoNotTrack();
88
+ return false;
89
+ }
90
+ return true;
46
91
  }
47
92
  trackPage(_url, properties) {
93
+ if (!this.guardEvent()) {
94
+ return;
95
+ }
48
96
  pushHsq(['setPath', properties.pathname]);
49
97
  pushHsq(['trackPageView']);
50
98
  }
51
99
  trackEvent(event, properties) {
100
+ if (!this.guardEvent()) {
101
+ return;
102
+ }
52
103
  const hubspotEventName = getHubspotEventName(event, properties, this.config.eventNameMap);
53
104
  if (!hubspotEventName) {
54
105
  return;
@@ -62,6 +113,9 @@ export class HubSpotAnalyticsAdapter {
62
113
  ]);
63
114
  }
64
115
  trackClick(properties) {
116
+ if (!this.guardEvent()) {
117
+ return;
118
+ }
65
119
  const hubspotEventName = properties.trackingInfo?.trackingEventName?.trim() || this.config.defaultClickEventName;
66
120
  if (!hubspotEventName) {
67
121
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"HubSpotAnalyticsAdapter.js","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAsBb,SAAS,OAAO,CAAC,IAAe;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAa,EACb,UAAmC,EACnC,YAAqC;IAErC,MAAM,SAAS,GACZ,UAAU,CAAC,YAAmC;QAC9C,UAAU,CAAC,aAAoC,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAiE,CAAC;IAClG,IAAI,YAAY,EAAE,iBAAiB,EAAE,CAAC;QACpC,OAAO,YAAY,CAAC,iBAAiB,CAAC;IACxC,CAAC;IAED,OAAO,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,OAAO,uBAAuB;IAC1B,WAAW,GAAG,KAAK,CAAC;IACX,MAAM,CAAgC;IAEvD,YAAY,MAAqC;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,UAAU;QACR,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;YACrB,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC;YAChC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,MAAM,CAAC,GAAG,GAAG,6BAA6B,QAAQ,KAAK,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,UAAkC;QACxD,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,UAAmC;QAC3D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,OAAO,CAAC;YACN,4BAA4B;YAC5B;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,UAAmC;QAC5C,MAAM,gBAAgB,GACpB,UAAU,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAE1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,OAAO,CAAC;YACN,4BAA4B;YAC5B;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE;oBACV,aAAa,EAAE,UAAU,CAAC,aAAa;oBACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ;iBAC9B;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"HubSpotAnalyticsAdapter.js","sourceRoot":"","sources":["../../src/tracking/HubSpotAnalyticsAdapter.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AA6Bb,SAAS,OAAO,CAAC,IAAe;IAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAa,EACb,UAAmC,EACnC,YAAqC;IAErC,MAAM,SAAS,GACZ,UAAU,CAAC,YAAmC;QAC9C,UAAU,CAAC,aAAoC,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,YAAiE,CAAC;IAClG,IAAI,YAAY,EAAE,iBAAiB,EAAE,CAAC;QACpC,OAAO,YAAY,CAAC,iBAAiB,CAAC;IACxC,CAAC;IAED,OAAO,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,OAAO,uBAAuB;IAC1B,WAAW,GAAG,KAAK,CAAC;IACX,MAAM,CAAgC;IACvD,8EAA8E;IACtE,iBAAiB,GAAG,IAAI,CAAC;IACzB,cAAc,GAAG,KAAK,CAAC;IAE/B,YAAY,MAAqC;QAC/C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,UAAU;QACR,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;YACrB,MAAM,CAAC,IAAI,GAAG,iBAAiB,CAAC;YAChC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,MAAM,CAAC,GAAG,GAAG,6BAA6B,QAAQ,KAAK,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,OAA8B;QAC1C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC;QAE3C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,UAAkC;QACxD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,UAAmC;QAC3D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,OAAO,CAAC;YACN,4BAA4B;YAC5B;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,UAAmC;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GACpB,UAAU,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAE1F,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,OAAO,CAAC;YACN,4BAA4B;YAC5B;gBACE,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE;oBACV,aAAa,EAAE,UAAU,CAAC,aAAa;oBACvC,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ;iBAC9B;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
package/docs/llms.md CHANGED
@@ -21,6 +21,7 @@
21
21
  Policy (`docs/PHILOSOPHY.md` R7.6). Implementation gaps are tracked as se-core #187 (status/error handling) and related issues.
22
22
 
23
23
  - Render with our form components (`HubspotDynamicForm` / `createHubspotFormExternalRenderer`), not the HubSpot embed script. Submit server-side via `submitHubspotForm`.
24
+ - `HubspotDynamicForm` sets `method="post"` and `action="#"` so a native submit before hydration cannot put field values in the URL (and then into `page_view` / GTM). After hydration, `onSubmit` still `preventDefault`s and posts via the HubSpot API.
24
25
  - Check HubSpot's HTTP/response status. On failure, show the user an error, fire `form_error`, and do not treat the submit as success.
25
26
  - Block double submits while a request is in flight.
26
27
  - Anti-bot (never-started timer, reversed clocks, or under 3 seconds from form render): do **not** POST to HubSpot and do **not** return `{ success: true }`. Return `{ failure }` with `HUBSPOT_SUBMIT_TOO_FAST_MESSAGE` (default `Please wait a moment and try again.`). The visitor-facing string follows the same override chain as other form copy (`submitTooFastText` / `submitErrorText` / renderer options). Log a skip, call `onError`, keep field values, and re-enable submit. A result with no `data` is not treated as HubSpot acceptance.
@@ -56,6 +57,8 @@ After HubSpot form editor changes, revalidate: `revalidateTag(hubspotFormTag(for
56
57
 
57
58
  Use with `CompositeAnalyticsAdapter` + `AnalyticsPageTracker` from `@se-studio/core-ui`. HubSpot SPA Mode B: bootstrap `setPath` before script load; `AnalyticsPageTracker` skips first mount.
58
59
 
60
+ Consent: pass `getConsent` on `HubSpotAnalyticsAdapter`. While it returns false, `initialize()` does not inject the tracking script and `track*` does not push `_hsq` events. A mid-session deny (`updateConsent({ analytics: false })` or `ConsentAwareAdapter` with `{ syncConsent: true }`) pushes `_hsq doNotTrack`. Omit `getConsent` and leave wrapper sync off for unchanged behaviour. Helper: `createConsentGetter` / `resolveAnalyticsConsent` in `@se-studio/core-ui`.
61
+
59
62
  **SSG layouts:** call `createHubSpotBootstrapScript()` with **no args** in root layout. Do **not** use `headers()` or middleware to pass pathname — that breaks on-demand SSG routes in `next start`.
60
63
 
61
64
  ## Env
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/hubspot",
3
- "version": "17.2.1",
3
+ "version": "17.3.1",
4
4
  "description": "HubSpot tracking and API-driven form rendering for Next.js marketing sites",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,7 +41,7 @@
41
41
  ],
42
42
  "peerDependencies": {
43
43
  "@se-studio/core-data-types": "1.13.7",
44
- "@se-studio/core-ui": "1.33.3",
44
+ "@se-studio/core-ui": "1.34.0",
45
45
  "next": ">=15.5.0 <17",
46
46
  "react": "^19.0.0",
47
47
  "react-dom": "^19.0.0"
@@ -54,7 +54,7 @@
54
54
  "devDependencies": {
55
55
  "@biomejs/biome": "^2.5.12",
56
56
  "@se-studio/core-data-types": "1.13.7",
57
- "@se-studio/core-ui": "1.33.3",
57
+ "@se-studio/core-ui": "1.34.0",
58
58
  "@types/node": "^24.13.3",
59
59
  "@types/react": "^19.2.18",
60
60
  "@types/react-dom": "^19.2.5",