@se-studio/core-ui 1.35.9 → 1.35.11
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/ANALYTICS.md +3 -3
- package/CHANGELOG.md +13 -0
- package/dist/analytics/form/index.d.ts +1 -1
- package/dist/analytics/form/index.d.ts.map +1 -1
- package/dist/analytics/form/index.js +1 -1
- package/dist/analytics/form/index.js.map +1 -1
- package/dist/analytics/form/useFormAnalytics.d.ts +25 -2
- package/dist/analytics/form/useFormAnalytics.d.ts.map +1 -1
- package/dist/analytics/form/useFormAnalytics.js +45 -5
- package/dist/analytics/form/useFormAnalytics.js.map +1 -1
- package/dist/analytics/formAnalyticsEntry.d.ts +1 -1
- package/dist/analytics/formAnalyticsEntry.d.ts.map +1 -1
- package/dist/analytics/formAnalyticsEntry.js +1 -1
- package/dist/analytics/formAnalyticsEntry.js.map +1 -1
- package/docs/llms.md +1 -1
- package/package.json +2 -2
package/ANALYTICS.md
CHANGED
|
@@ -81,7 +81,7 @@ Target names (same property names where the site already uses them):
|
|
|
81
81
|
|-------|------|
|
|
82
82
|
| `page_view` | Full and soft navigations |
|
|
83
83
|
| `click` | Tracked UI clicks (`trackClick`) |
|
|
84
|
-
| `form_view` | Form
|
|
84
|
+
| `form_view` | Form first enters the viewport (IntersectionObserver, threshold 0.5; once per form instance) |
|
|
85
85
|
| `form_start` | First interaction with a form field |
|
|
86
86
|
| `form_submit` | Successful submit (HubSpot/API accept) |
|
|
87
87
|
| `form_error` | Submit failed (validation or HubSpot/API error shown to the user) |
|
|
@@ -91,9 +91,9 @@ Sites may add extra events. Do not rename or drop an existing site event only to
|
|
|
91
91
|
|
|
92
92
|
### Form analytics (non-PII)
|
|
93
93
|
|
|
94
|
-
`useFormAnalytics` / `createFormAnalyticsSession` emit the four events through `useAnalytics().trackEvent`. Import them from `@se-studio/core-ui/form-analytics` (not the root `@se-studio/core-ui` barrel). `@se-studio/hubspot` `useHubspotSubmit` and `HubspotDynamicForm` emit only when you pass `formAnalytics={true}` (off by default so upgrades are a no-op).
|
|
94
|
+
`useFormAnalytics` / `createFormAnalyticsSession` emit the four events through `useAnalytics().trackEvent`. Import them from `@se-studio/core-ui/form-analytics` (not the root `@se-studio/core-ui` barrel). `@se-studio/hubspot` `useHubspotSubmit` and `HubspotDynamicForm` emit only when you pass `formAnalytics={true}` (off by default so upgrades are a no-op). Attach the returned `rootRef` to the form root (HubSpot wrappers already do this).
|
|
95
95
|
|
|
96
|
-
`form_view` fires **
|
|
96
|
+
`form_view` fires **once per form instance** when the form first enters the viewport (`IntersectionObserver`, default threshold **0.5** — half of the form visible). Scroll bounce does not re-fire (`markView` is idempotent; the observer disconnects after the first intersection). Optional hook overrides: `viewTrigger: 'viewport' | 'mount'` (default `'viewport'`) and `viewThreshold?: number` (default `0.5`). Use `'mount'` only for rare above-the-fold callers that need the old behaviour. If `IntersectionObserver` is missing, `form_view` falls back to mount so views are not silently dropped. `form_start` / `form_submit` / `form_error` are unchanged.
|
|
97
97
|
|
|
98
98
|
Allowed parameters only:
|
|
99
99
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @se-studio/core-ui
|
|
2
2
|
|
|
3
|
+
## 1.35.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @se-studio/contentful-rest-api@2.0.2
|
|
9
|
+
|
|
10
|
+
## 1.35.10
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Gate `form_view` on viewport intersection (default threshold 0.5) instead of mount. Opt-in `formAnalytics` sites get a correct impression metric; `form_start` / `form_submit` / `form_error` are unchanged. HubSpot wrappers attach the analytics `rootRef` to the form. Use `viewTrigger: 'mount'` to restore the previous behaviour.
|
|
15
|
+
|
|
3
16
|
## 1.35.9
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { type CreateFormAnalyticsSessionOptions, createFormAnalyticsSession, type FormAnalyticsSession, type FormAnalyticsSessionState, } from './createFormAnalyticsSession';
|
|
2
2
|
export { FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, type FormAnalyticsAllowedKey, type FormAnalyticsErrorInfo, type FormAnalyticsEventName, type FormAnalyticsIdentity, type FormAnalyticsProperties, type FormAnalyticsTrackFn, type FormErrorCategory, } from './formAnalyticsTypes';
|
|
3
3
|
export { sanitizeFormAnalyticsProperties } from './sanitizeFormAnalyticsProperties';
|
|
4
|
-
export { type UseFormAnalyticsOptions, useFormAnalytics } from './useFormAnalytics';
|
|
4
|
+
export { FORM_VIEW_DEFAULT_THRESHOLD, type FormViewTrigger, type UseFormAnalyticsOptions, type UseFormAnalyticsResult, useFormAnalytics, } from './useFormAnalytics';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analytics/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iCAAiC,EACtC,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,GAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analytics/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iCAAiC,EACtC,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,GAC/B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EACL,2BAA2B,EAC3B,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createFormAnalyticsSession, } from './createFormAnalyticsSession';
|
|
2
2
|
export { FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, } from './formAnalyticsTypes';
|
|
3
3
|
export { sanitizeFormAnalyticsProperties } from './sanitizeFormAnalyticsProperties';
|
|
4
|
-
export { useFormAnalytics } from './useFormAnalytics';
|
|
4
|
+
export { FORM_VIEW_DEFAULT_THRESHOLD, useFormAnalytics, } from './useFormAnalytics';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analytics/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,GAG3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GAQtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analytics/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,GAG3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GAQtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EACL,2BAA2B,EAI3B,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,13 +1,36 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
1
2
|
import { type FormAnalyticsSession } from './createFormAnalyticsSession';
|
|
2
3
|
import type { FormAnalyticsIdentity } from './formAnalyticsTypes';
|
|
4
|
+
/** IntersectionObserver threshold for default `form_view` (50% of the form visible). */
|
|
5
|
+
export declare const FORM_VIEW_DEFAULT_THRESHOLD = 0.5;
|
|
6
|
+
export type FormViewTrigger = 'viewport' | 'mount';
|
|
3
7
|
export interface UseFormAnalyticsOptions {
|
|
4
8
|
identity: FormAnalyticsIdentity;
|
|
5
9
|
/** When false, no events are emitted. Default true. */
|
|
6
10
|
enabled?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* When to fire `form_view`. Default `viewport` (first intersection).
|
|
13
|
+
* `mount` restores v1 behaviour for rare above-the-fold-only callers.
|
|
14
|
+
*/
|
|
15
|
+
viewTrigger?: FormViewTrigger;
|
|
16
|
+
/**
|
|
17
|
+
* IntersectionObserver threshold when `viewTrigger` is `viewport`.
|
|
18
|
+
* Default {@link FORM_VIEW_DEFAULT_THRESHOLD} (0.5).
|
|
19
|
+
*/
|
|
20
|
+
viewThreshold?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Form root to observe. When omitted, the hook creates a ref — attach it to the
|
|
23
|
+
* form (or wrapper) element so viewport `form_view` has a target.
|
|
24
|
+
*/
|
|
25
|
+
rootRef?: RefObject<HTMLElement | null>;
|
|
26
|
+
}
|
|
27
|
+
export interface UseFormAnalyticsResult extends FormAnalyticsSession {
|
|
28
|
+
rootRef: RefObject<HTMLElement | null>;
|
|
7
29
|
}
|
|
8
30
|
/**
|
|
9
31
|
* Binds a form analytics session to `useAnalytics().trackEvent`.
|
|
10
|
-
* Fires `form_view` once
|
|
32
|
+
* Fires `form_view` once when the form first enters the viewport (default),
|
|
33
|
+
* or on mount when `viewTrigger` is `'mount'`. `markView` stays idempotent.
|
|
11
34
|
*/
|
|
12
|
-
export declare function useFormAnalytics({ identity, enabled, }: UseFormAnalyticsOptions):
|
|
35
|
+
export declare function useFormAnalytics({ identity, enabled, viewTrigger, viewThreshold, rootRef: rootRefOption, }: UseFormAnalyticsOptions): UseFormAnalyticsResult;
|
|
13
36
|
//# sourceMappingURL=useFormAnalytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormAnalytics.d.ts","sourceRoot":"","sources":["../../../src/analytics/form/useFormAnalytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useFormAnalytics.d.ts","sourceRoot":"","sources":["../../../src/analytics/form/useFormAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAkC,MAAM,OAAO,CAAC;AAEvE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE1F,wFAAwF;AACxF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,OAAc,EACd,WAAwB,EACxB,aAA2C,EAC3C,OAAO,EAAE,aAAa,GACvB,EAAE,uBAAuB,GAAG,sBAAsB,CAmHlD"}
|
|
@@ -2,15 +2,20 @@
|
|
|
2
2
|
import { useCallback, useEffect, useRef } from 'react';
|
|
3
3
|
import { useAnalytics } from '../useAnalytics';
|
|
4
4
|
import { createFormAnalyticsSession, } from './createFormAnalyticsSession';
|
|
5
|
+
/** IntersectionObserver threshold for default `form_view` (50% of the form visible). */
|
|
6
|
+
export const FORM_VIEW_DEFAULT_THRESHOLD = 0.5;
|
|
5
7
|
/**
|
|
6
8
|
* Binds a form analytics session to `useAnalytics().trackEvent`.
|
|
7
|
-
* Fires `form_view` once
|
|
9
|
+
* Fires `form_view` once when the form first enters the viewport (default),
|
|
10
|
+
* or on mount when `viewTrigger` is `'mount'`. `markView` stays idempotent.
|
|
8
11
|
*/
|
|
9
|
-
export function useFormAnalytics({ identity, enabled = true, }) {
|
|
12
|
+
export function useFormAnalytics({ identity, enabled = true, viewTrigger = 'viewport', viewThreshold = FORM_VIEW_DEFAULT_THRESHOLD, rootRef: rootRefOption, }) {
|
|
10
13
|
const { trackEvent } = useAnalytics();
|
|
11
14
|
const trackEventRef = useRef(trackEvent);
|
|
12
15
|
trackEventRef.current = trackEvent;
|
|
13
16
|
const sessionRef = useRef(null);
|
|
17
|
+
const internalRootRef = useRef(null);
|
|
18
|
+
const rootRef = rootRefOption ?? internalRootRef;
|
|
14
19
|
const formId = identity.form_id ?? '';
|
|
15
20
|
const formName = identity.form_name ?? '';
|
|
16
21
|
const formType = identity.form_type ?? '';
|
|
@@ -34,13 +39,48 @@ export function useFormAnalytics({ identity, enabled = true, }) {
|
|
|
34
39
|
},
|
|
35
40
|
});
|
|
36
41
|
sessionRef.current = session;
|
|
37
|
-
|
|
42
|
+
const fireView = () => {
|
|
43
|
+
sessionRef.current?.markView();
|
|
44
|
+
};
|
|
45
|
+
if (viewTrigger === 'mount') {
|
|
46
|
+
fireView();
|
|
47
|
+
return () => {
|
|
48
|
+
if (sessionRef.current === session) {
|
|
49
|
+
sessionRef.current = null;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (typeof IntersectionObserver === 'undefined') {
|
|
54
|
+
fireView();
|
|
55
|
+
return () => {
|
|
56
|
+
if (sessionRef.current === session) {
|
|
57
|
+
sessionRef.current = null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const el = rootRef.current;
|
|
62
|
+
if (!el) {
|
|
63
|
+
return () => {
|
|
64
|
+
if (sessionRef.current === session) {
|
|
65
|
+
sessionRef.current = null;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const observer = new IntersectionObserver((entries) => {
|
|
70
|
+
const entry = entries[0];
|
|
71
|
+
if (entry?.isIntersecting) {
|
|
72
|
+
fireView();
|
|
73
|
+
observer.disconnect();
|
|
74
|
+
}
|
|
75
|
+
}, { threshold: viewThreshold });
|
|
76
|
+
observer.observe(el);
|
|
38
77
|
return () => {
|
|
78
|
+
observer.disconnect();
|
|
39
79
|
if (sessionRef.current === session) {
|
|
40
80
|
sessionRef.current = null;
|
|
41
81
|
}
|
|
42
82
|
};
|
|
43
|
-
}, [enabled, formId, formName, formType, cmsEntryId, step]);
|
|
83
|
+
}, [enabled, formId, formName, formType, cmsEntryId, step, viewTrigger, viewThreshold, rootRef]);
|
|
44
84
|
const markView = useCallback(() => {
|
|
45
85
|
sessionRef.current?.markView();
|
|
46
86
|
}, []);
|
|
@@ -62,6 +102,6 @@ export function useFormAnalytics({ identity, enabled = true, }) {
|
|
|
62
102
|
validationErrorThisAttempt: false,
|
|
63
103
|
});
|
|
64
104
|
}, []);
|
|
65
|
-
return { markView, markStart, markSubmit, markError, getState };
|
|
105
|
+
return { markView, markStart, markSubmit, markError, getState, rootRef };
|
|
66
106
|
}
|
|
67
107
|
//# sourceMappingURL=useFormAnalytics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormAnalytics.js","sourceRoot":"","sources":["../../../src/analytics/form/useFormAnalytics.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,
|
|
1
|
+
{"version":3,"file":"useFormAnalytics.js","sourceRoot":"","sources":["../../../src/analytics/form/useFormAnalytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* main `core-ui` barrel (Visual / Lottie) is not pulled into the form graph.
|
|
5
5
|
*/
|
|
6
6
|
export { AnalyticsProvider, useAnalyticsContext } from './AnalyticsProvider';
|
|
7
|
-
export { type CreateFormAnalyticsSessionOptions, createFormAnalyticsSession, FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, type FormAnalyticsAllowedKey, type FormAnalyticsErrorInfo, type FormAnalyticsEventName, type FormAnalyticsIdentity, type FormAnalyticsProperties, type FormAnalyticsSession, type FormAnalyticsSessionState, type FormAnalyticsTrackFn, type FormErrorCategory, sanitizeFormAnalyticsProperties, type UseFormAnalyticsOptions, useFormAnalytics, } from './form';
|
|
7
|
+
export { type CreateFormAnalyticsSessionOptions, createFormAnalyticsSession, FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, FORM_VIEW_DEFAULT_THRESHOLD, type FormAnalyticsAllowedKey, type FormAnalyticsErrorInfo, type FormAnalyticsEventName, type FormAnalyticsIdentity, type FormAnalyticsProperties, type FormAnalyticsSession, type FormAnalyticsSessionState, type FormAnalyticsTrackFn, type FormErrorCategory, type FormViewTrigger, sanitizeFormAnalyticsProperties, type UseFormAnalyticsOptions, type UseFormAnalyticsResult, useFormAnalytics, } from './form';
|
|
8
8
|
export type { AnalyticsAdapter, ClickTrackingProperties, PageTrackingProperties } from './types';
|
|
9
9
|
export { useAnalytics } from './useAnalytics';
|
|
10
10
|
//# sourceMappingURL=formAnalyticsEntry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formAnalyticsEntry.d.ts","sourceRoot":"","sources":["../../src/analytics/formAnalyticsEntry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,KAAK,iCAAiC,EACtC,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,+BAA+B,EAC/B,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"formAnalyticsEntry.d.ts","sourceRoot":"","sources":["../../src/analytics/formAnalyticsEntry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,KAAK,iCAAiC,EACtC,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,+BAA+B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* main `core-ui` barrel (Visual / Lottie) is not pulled into the form graph.
|
|
5
5
|
*/
|
|
6
6
|
export { AnalyticsProvider, useAnalyticsContext } from './AnalyticsProvider';
|
|
7
|
-
export { createFormAnalyticsSession, FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, sanitizeFormAnalyticsProperties, useFormAnalytics, } from './form';
|
|
7
|
+
export { createFormAnalyticsSession, FORM_ANALYTICS_ALLOWED_KEYS, FORM_ANALYTICS_EVENT_NAMES, FORM_ANALYTICS_EVENTS, FORM_ERROR_CATEGORIES, FORM_VIEW_DEFAULT_THRESHOLD, sanitizeFormAnalyticsProperties, useFormAnalytics, } from './form';
|
|
8
8
|
export { useAnalytics } from './useAnalytics';
|
|
9
9
|
//# sourceMappingURL=formAnalyticsEntry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formAnalyticsEntry.js","sourceRoot":"","sources":["../../src/analytics/formAnalyticsEntry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAEL,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"formAnalyticsEntry.js","sourceRoot":"","sources":["../../src/analytics/formAnalyticsEntry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAEL,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAW3B,+BAA+B,EAG/B,gBAAgB,GACjB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
package/docs/llms.md
CHANGED
|
@@ -187,7 +187,7 @@ Export `VIDEO_ENGAGEMENT_EVENTS` / `VIDEO_ENGAGEMENT_EVENT_NAMES` for GTM or Hub
|
|
|
187
187
|
|
|
188
188
|
### Form analytics events
|
|
189
189
|
|
|
190
|
-
`form_view` (once
|
|
190
|
+
`form_view` (once when the form first enters the viewport, IntersectionObserver threshold 0.5; `viewTrigger: 'mount'` for the old immediate behaviour) · `form_start` (first interaction) · `form_submit` (success) · `form_error` (validation or API failure). Attach `rootRef` to the form root.
|
|
191
191
|
|
|
192
192
|
Export `FORM_ANALYTICS_EVENTS` / `useFormAnalytics` / `sanitizeFormAnalyticsProperties` from `@se-studio/core-ui/form-analytics` only (not the root barrel). Payload keys: `form_id`, `form_name`, `form_type`, `cms_entry_id`, `step`, `error_code`, `error_category`. Never field values or raw error text. HubSpot forms emit these from `useHubspotSubmit` only when `formAnalytics={true}` (default off).
|
|
193
193
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/core-ui",
|
|
3
|
-
"version": "1.35.
|
|
3
|
+
"version": "1.35.11",
|
|
4
4
|
"description": "Shared React UI component library with Tailwind CSS v4 for SE Studio applications",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"@contentful/rich-text-react-renderer": "^16.2.2",
|
|
81
81
|
"@contentful/rich-text-types": "^17.2.7",
|
|
82
82
|
"@radix-ui/react-slot": "1.3.3",
|
|
83
|
-
"@se-studio/contentful-rest-api": "2.0.
|
|
83
|
+
"@se-studio/contentful-rest-api": "2.0.2",
|
|
84
84
|
"@se-studio/core-data-types": "2.0.1",
|
|
85
85
|
"@types/mustache": "4.2.6",
|
|
86
86
|
"@vimeo/player": "^2.30.4",
|