@se-studio/hubspot 0.0.0-next16-20260822103555

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.
Files changed (72) hide show
  1. package/CHANGELOG.md +509 -0
  2. package/README.md +146 -0
  3. package/dist/external/createHubspotFormExternalRenderer.d.ts +23 -0
  4. package/dist/external/createHubspotFormExternalRenderer.d.ts.map +1 -0
  5. package/dist/external/createHubspotFormExternalRenderer.js +26 -0
  6. package/dist/external/createHubspotFormExternalRenderer.js.map +1 -0
  7. package/dist/forms/client/HubspotDynamicForm.d.ts +27 -0
  8. package/dist/forms/client/HubspotDynamicForm.d.ts.map +1 -0
  9. package/dist/forms/client/HubspotDynamicForm.js +113 -0
  10. package/dist/forms/client/HubspotDynamicForm.js.map +1 -0
  11. package/dist/forms/client/dependentFields.d.ts +11 -0
  12. package/dist/forms/client/dependentFields.d.ts.map +1 -0
  13. package/dist/forms/client/dependentFields.js +39 -0
  14. package/dist/forms/client/dependentFields.js.map +1 -0
  15. package/dist/forms/client/getCookieValue.d.ts +2 -0
  16. package/dist/forms/client/getCookieValue.d.ts.map +1 -0
  17. package/dist/forms/client/getCookieValue.js +8 -0
  18. package/dist/forms/client/getCookieValue.js.map +1 -0
  19. package/dist/forms/client/marketingParams.d.ts +28 -0
  20. package/dist/forms/client/marketingParams.d.ts.map +1 -0
  21. package/dist/forms/client/marketingParams.js +164 -0
  22. package/dist/forms/client/marketingParams.js.map +1 -0
  23. package/dist/forms/client/navigateAfterSubmit.d.ts +8 -0
  24. package/dist/forms/client/navigateAfterSubmit.d.ts.map +1 -0
  25. package/dist/forms/client/navigateAfterSubmit.js +20 -0
  26. package/dist/forms/client/navigateAfterSubmit.js.map +1 -0
  27. package/dist/forms/client/renderHubspotField.d.ts +11 -0
  28. package/dist/forms/client/renderHubspotField.d.ts.map +1 -0
  29. package/dist/forms/client/renderHubspotField.js +61 -0
  30. package/dist/forms/client/renderHubspotField.js.map +1 -0
  31. package/dist/forms/client/useHubspotSubmit.d.ts +25 -0
  32. package/dist/forms/client/useHubspotSubmit.d.ts.map +1 -0
  33. package/dist/forms/client/useHubspotSubmit.js +97 -0
  34. package/dist/forms/client/useHubspotSubmit.js.map +1 -0
  35. package/dist/forms/server/getFormDefinition.d.ts +7 -0
  36. package/dist/forms/server/getFormDefinition.d.ts.map +1 -0
  37. package/dist/forms/server/getFormDefinition.js +24 -0
  38. package/dist/forms/server/getFormDefinition.js.map +1 -0
  39. package/dist/forms/server/hubspotFormTag.d.ts +3 -0
  40. package/dist/forms/server/hubspotFormTag.d.ts.map +1 -0
  41. package/dist/forms/server/hubspotFormTag.js +5 -0
  42. package/dist/forms/server/hubspotFormTag.js.map +1 -0
  43. package/dist/forms/server/mapApiResponse.d.ts +4 -0
  44. package/dist/forms/server/mapApiResponse.d.ts.map +1 -0
  45. package/dist/forms/server/mapApiResponse.js +105 -0
  46. package/dist/forms/server/mapApiResponse.js.map +1 -0
  47. package/dist/forms/server/submitForm.d.ts +8 -0
  48. package/dist/forms/server/submitForm.d.ts.map +1 -0
  49. package/dist/forms/server/submitForm.js +30 -0
  50. package/dist/forms/server/submitForm.js.map +1 -0
  51. package/dist/forms/types.d.ts +102 -0
  52. package/dist/forms/types.d.ts.map +1 -0
  53. package/dist/forms/types.js +2 -0
  54. package/dist/forms/types.js.map +1 -0
  55. package/dist/index.d.ts +11 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +7 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/server.d.ts +7 -0
  60. package/dist/server.d.ts.map +1 -0
  61. package/dist/server.js +6 -0
  62. package/dist/server.js.map +1 -0
  63. package/dist/tracking/HubSpotAnalyticsAdapter.d.ts +23 -0
  64. package/dist/tracking/HubSpotAnalyticsAdapter.d.ts.map +1 -0
  65. package/dist/tracking/HubSpotAnalyticsAdapter.js +84 -0
  66. package/dist/tracking/HubSpotAnalyticsAdapter.js.map +1 -0
  67. package/dist/tracking/createHubSpotBootstrapScript.d.ts +9 -0
  68. package/dist/tracking/createHubSpotBootstrapScript.d.ts.map +1 -0
  69. package/dist/tracking/createHubSpotBootstrapScript.js +17 -0
  70. package/dist/tracking/createHubSpotBootstrapScript.js.map +1 -0
  71. package/docs/llms.md +46 -0
  72. package/package.json +76 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,509 @@
1
+ # @se-studio/hubspot
2
+
3
+ ## 0.0.0-next16-20260822103555
4
+
5
+ ### Minor Changes
6
+
7
+ - eeed547: Support Next.js 16.3 while remaining compatible with Next.js 15.5 (peer `>=15.5.0 <17`). CMS webhooks call `revalidateTag(tag, { expire: 0 })` so published content is not served stale. Template apps use `proxy.ts` on Next 16.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [eeed547]
12
+ - @se-studio/core-ui@0.0.0-next16-20260822103555
13
+
14
+ ## 16.0.4
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [f8a2ec2]
19
+ - @se-studio/core-ui@1.24.7
20
+
21
+ ## 16.0.3
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [b6434f7]
26
+ - @se-studio/core-ui@1.24.6
27
+
28
+ ## 16.0.2
29
+
30
+ ### Patch Changes
31
+
32
+ - Updated dependencies [dbfb662]
33
+ - @se-studio/core-ui@1.24.5
34
+
35
+ ## 16.0.1
36
+
37
+ ### Patch Changes
38
+
39
+ - Updated dependencies [2c479e7]
40
+ - @se-studio/core-ui@1.24.4
41
+
42
+ ## 16.0.0
43
+
44
+ ### Patch Changes
45
+
46
+ - Updated dependencies [f6a7b89]
47
+ - @se-studio/core-data-types@1.12.0
48
+ - @se-studio/core-ui@1.24.3
49
+
50
+ ## 15.0.2
51
+
52
+ ### Patch Changes
53
+
54
+ - Updated dependencies
55
+ - @se-studio/core-ui@1.24.2
56
+
57
+ ## 15.0.1
58
+
59
+ ### Patch Changes
60
+
61
+ - Updated dependencies
62
+ - @se-studio/core-ui@1.24.1
63
+
64
+ ## 15.0.0
65
+
66
+ ### Patch Changes
67
+
68
+ - Updated dependencies [50d02a0]
69
+ - @se-studio/core-data-types@1.11.0
70
+ - @se-studio/core-ui@1.24.0
71
+
72
+ ## 14.0.2
73
+
74
+ ### Patch Changes
75
+
76
+ - @se-studio/core-ui@1.23.2
77
+
78
+ ## 14.0.1
79
+
80
+ ### Patch Changes
81
+
82
+ - Updated dependencies
83
+ - @se-studio/core-data-types@1.10.1
84
+ - @se-studio/core-ui@1.23.1
85
+
86
+ ## 14.0.0
87
+
88
+ ### Patch Changes
89
+
90
+ - Updated dependencies
91
+ - @se-studio/core-data-types@1.10.0
92
+ - @se-studio/core-ui@1.23.0
93
+
94
+ ## 13.0.1
95
+
96
+ ### Patch Changes
97
+
98
+ - Updated dependencies [5b69ac6]
99
+ - @se-studio/core-ui@1.22.1
100
+
101
+ ## 13.0.0
102
+
103
+ ### Patch Changes
104
+
105
+ - Updated dependencies [760c9c4]
106
+ - @se-studio/core-data-types@1.9.0
107
+ - @se-studio/core-ui@1.22.0
108
+
109
+ ## 12.0.0
110
+
111
+ ### Patch Changes
112
+
113
+ - Updated dependencies
114
+ - @se-studio/core-data-types@1.8.0
115
+ - @se-studio/core-ui@1.21.0
116
+
117
+ ## 11.0.0
118
+
119
+ ### Patch Changes
120
+
121
+ - Updated dependencies [928562f]
122
+ - @se-studio/core-ui@1.20.0
123
+
124
+ ## 10.0.11
125
+
126
+ ### Patch Changes
127
+
128
+ - Updated dependencies
129
+ - @se-studio/core-ui@1.19.10
130
+
131
+ ## 10.0.10
132
+
133
+ ### Patch Changes
134
+
135
+ - Updated dependencies
136
+ - @se-studio/core-ui@1.19.9
137
+
138
+ ## 10.0.9
139
+
140
+ ### Patch Changes
141
+
142
+ - 908141d: Map HubSpot `dependentCondition` values to plain objects so form definitions are safe to pass from Server Components to Client Components (React Flight rejects SDK class instances such as `DependentFieldFilter`).
143
+
144
+ ## 10.0.8
145
+
146
+ ### Patch Changes
147
+
148
+ - Updated dependencies [bfb7eb4]
149
+ - @se-studio/core-data-types@1.7.1
150
+ - @se-studio/core-ui@1.19.8
151
+
152
+ ## 10.0.7
153
+
154
+ ### Patch Changes
155
+
156
+ - @se-studio/core-ui@1.19.7
157
+
158
+ ## 10.0.6
159
+
160
+ ### Patch Changes
161
+
162
+ - Fix HubSpot form post-submit redirects for external URLs and treat `onSuccess` as a side-effect.
163
+
164
+ - Preserve full `redirectUri` from the Forms Submit API (no longer strip host to path-only)
165
+ - Navigate external absolute URLs with `window.location.assign`; same-origin with `router.push`
166
+ - Call `onSuccess` without suppressing thank-you or redirect handling
167
+ - Add optional `redirectUrlOverride` for CMS overrides (`externalUrl` / `successRedirectUrl`)
168
+ - Export `navigateAfterSubmit` helper
169
+
170
+ ## 10.0.5
171
+
172
+ ### Patch Changes
173
+
174
+ - @se-studio/core-ui@1.19.5
175
+
176
+ ## 10.0.4
177
+
178
+ ### Patch Changes
179
+
180
+ - @se-studio/core-ui@1.19.4
181
+
182
+ ## 10.0.3
183
+
184
+ ### Patch Changes
185
+
186
+ - Updated dependencies
187
+ - @se-studio/core-ui@1.19.3
188
+
189
+ ## 10.0.2
190
+
191
+ ### Patch Changes
192
+
193
+ - Updated dependencies [14aeb6d]
194
+ - @se-studio/core-ui@1.19.2
195
+
196
+ ## 10.0.1
197
+
198
+ ### Patch Changes
199
+
200
+ - Updated dependencies [d9ddfa0]
201
+ - @se-studio/core-ui@1.19.1
202
+
203
+ ## 10.0.0
204
+
205
+ ### Patch Changes
206
+
207
+ - Updated dependencies [e716d0e]
208
+ - @se-studio/core-ui@1.19.0
209
+
210
+ ## 9.0.0
211
+
212
+ ### Patch Changes
213
+
214
+ - Updated dependencies [f909658]
215
+ - @se-studio/core-ui@1.18.0
216
+
217
+ ## 8.0.2
218
+
219
+ ### Patch Changes
220
+
221
+ - Updated dependencies [d54f872]
222
+ - @se-studio/core-ui@1.17.2
223
+
224
+ ## 8.0.1
225
+
226
+ ### Patch Changes
227
+
228
+ - Updated dependencies [6984d10]
229
+ - @se-studio/core-ui@1.17.1
230
+
231
+ ## 8.0.0
232
+
233
+ ### Patch Changes
234
+
235
+ - Updated dependencies [0bc1e24]
236
+ - @se-studio/core-ui@1.17.0
237
+
238
+ ## 7.0.0
239
+
240
+ ### Patch Changes
241
+
242
+ - Updated dependencies [a01b598]
243
+ - @se-studio/core-data-types@1.7.0
244
+ - @se-studio/core-ui@1.16.0
245
+
246
+ ## 6.0.13
247
+
248
+ ### Patch Changes
249
+
250
+ - Updated dependencies
251
+ - @se-studio/core-ui@1.15.3
252
+
253
+ ## 6.0.12
254
+
255
+ ### Patch Changes
256
+
257
+ - Updated dependencies [b211635]
258
+ - @se-studio/core-ui@1.15.2
259
+
260
+ ## 6.0.11
261
+
262
+ ### Patch Changes
263
+
264
+ - Updated dependencies [cded864]
265
+ - @se-studio/core-ui@1.15.1
266
+
267
+ ## 6.0.10
268
+
269
+ ### Patch Changes
270
+
271
+ - Updated dependencies
272
+ - @se-studio/core-ui@1.15.0
273
+
274
+ ## 6.0.9
275
+
276
+ ### Patch Changes
277
+
278
+ - Updated dependencies [748ba92]
279
+ - @se-studio/core-ui@1.14.9
280
+
281
+ ## 6.0.8
282
+
283
+ ### Patch Changes
284
+
285
+ - Updated dependencies
286
+ - @se-studio/core-ui@1.14.8
287
+
288
+ ## 6.0.7
289
+
290
+ ### Patch Changes
291
+
292
+ - Updated dependencies [2ebf4f2]
293
+ - @se-studio/core-ui@1.14.7
294
+
295
+ ## 6.0.6
296
+
297
+ ### Patch Changes
298
+
299
+ - @se-studio/core-ui@1.14.6
300
+
301
+ ## 6.0.5
302
+
303
+ ### Patch Changes
304
+
305
+ - Updated dependencies [90358cb]
306
+ - @se-studio/core-ui@1.14.5
307
+
308
+ ## 6.0.4
309
+
310
+ ### Patch Changes
311
+
312
+ - 6438b49: Auto-fill empty HubSpot form hidden fields from UTM/query params and first-touch sessionStorage (exported helpers for site forks).
313
+ - @se-studio/core-ui@1.14.4
314
+
315
+ ## 6.0.3
316
+
317
+ ### Patch Changes
318
+
319
+ - @se-studio/core-ui@1.14.3
320
+
321
+ ## 6.0.2
322
+
323
+ ### Patch Changes
324
+
325
+ - @se-studio/core-ui@1.14.2
326
+
327
+ ## 6.0.1
328
+
329
+ ### Patch Changes
330
+
331
+ - @se-studio/core-ui@1.14.1
332
+
333
+ ## 6.0.0
334
+
335
+ ### Patch Changes
336
+
337
+ - Updated dependencies
338
+ - @se-studio/core-ui@1.14.0
339
+
340
+ ## 5.0.4
341
+
342
+ ### Patch Changes
343
+
344
+ - @se-studio/core-ui@1.13.4
345
+
346
+ ## 5.0.3
347
+
348
+ ### Patch Changes
349
+
350
+ - Updated dependencies [c02a950]
351
+ - @se-studio/core-ui@1.13.3
352
+
353
+ ## 5.0.2
354
+
355
+ ### Patch Changes
356
+
357
+ - @se-studio/core-ui@1.13.2
358
+
359
+ ## 5.0.1
360
+
361
+ ### Patch Changes
362
+
363
+ - Updated dependencies
364
+ - @se-studio/core-ui@1.13.1
365
+
366
+ ## 5.0.0
367
+
368
+ ### Patch Changes
369
+
370
+ - Updated dependencies
371
+ - @se-studio/core-ui@1.13.0
372
+
373
+ ## 4.0.4
374
+
375
+ ### Patch Changes
376
+
377
+ - @se-studio/core-ui@1.12.4
378
+
379
+ ## 4.0.3
380
+
381
+ ### Patch Changes
382
+
383
+ - Updated dependencies
384
+ - @se-studio/core-ui@1.12.3
385
+
386
+ ## 4.0.2
387
+
388
+ ### Patch Changes
389
+
390
+ - Updated dependencies
391
+ - @se-studio/core-ui@1.12.2
392
+
393
+ ## 4.0.1
394
+
395
+ ### Patch Changes
396
+
397
+ - Updated dependencies
398
+ - @se-studio/core-ui@1.12.1
399
+
400
+ ## 4.0.0
401
+
402
+ ### Patch Changes
403
+
404
+ - Updated dependencies
405
+ - @se-studio/core-ui@1.12.0
406
+
407
+ ## 3.0.8
408
+
409
+ ### Patch Changes
410
+
411
+ - Updated dependencies
412
+ - @se-studio/core-ui@1.11.8
413
+
414
+ ## 3.0.7
415
+
416
+ ### Patch Changes
417
+
418
+ - @se-studio/core-ui@1.11.7
419
+
420
+ ## 3.0.6
421
+
422
+ ### Patch Changes
423
+
424
+ - Bulk version bump: patch for all packages
425
+ - Updated dependencies
426
+ - @se-studio/core-data-types@1.6.1
427
+ - @se-studio/core-ui@1.11.6
428
+
429
+ ## 3.0.5
430
+
431
+ ### Patch Changes
432
+
433
+ - @se-studio/core-ui@1.11.5
434
+
435
+ ## 3.0.4
436
+
437
+ ### Patch Changes
438
+
439
+ - Updated dependencies
440
+ - @se-studio/core-ui@1.11.4
441
+
442
+ ## 3.0.3
443
+
444
+ ### Patch Changes
445
+
446
+ - @se-studio/core-ui@1.11.3
447
+
448
+ ## 3.0.2
449
+
450
+ ### Patch Changes
451
+
452
+ - bc538fd: chore: dependency updates (contentful-management, live-preview, hubspot api-client, js-yaml, biome js-api)
453
+ - Updated dependencies [bc538fd]
454
+ - @se-studio/core-ui@1.11.2
455
+
456
+ ## 3.0.1
457
+
458
+ ### Patch Changes
459
+
460
+ - @se-studio/core-ui@1.11.1
461
+
462
+ ## 3.0.0
463
+
464
+ ### Patch Changes
465
+
466
+ - Updated dependencies
467
+ - @se-studio/core-data-types@1.6.0
468
+ - @se-studio/core-ui@1.11.0
469
+
470
+ ## 2.0.3
471
+
472
+ ### Patch Changes
473
+
474
+ - Updated dependencies [a9600c8]
475
+ - @se-studio/core-ui@1.10.2
476
+
477
+ ## 2.0.2
478
+
479
+ ### Patch Changes
480
+
481
+ - @se-studio/core-ui@1.10.1
482
+
483
+ ## 2.0.1
484
+
485
+ ### Patch Changes
486
+
487
+ - Make `createHubSpotBootstrapScript()` SSG-safe by default: no-arg variant uses `window.location.pathname` instead of requiring a server pathname.
488
+
489
+ ## 2.0.0
490
+
491
+ ### Patch Changes
492
+
493
+ - Updated dependencies
494
+ - @se-studio/core-ui@1.10.0
495
+
496
+ ## 1.0.0
497
+
498
+ ### Minor Changes
499
+
500
+ - Add `@se-studio/hubspot` shared package for HubSpot tracking (`HubSpotAnalyticsAdapter`) and API-driven form rendering with CMS external component support.
501
+
502
+ Add `CompositeAnalyticsAdapter` and `AnalyticsPageTracker` to core-ui for multi-provider analytics (GTM + HubSpot SPA Mode B).
503
+
504
+ Update `AbTestReporter` to route experiment impressions through `useAnalytics`, including `hubspot_event` for HubSpot behavioural events.
505
+
506
+ ### Patch Changes
507
+
508
+ - Updated dependencies
509
+ - @se-studio/core-ui@1.9.0
package/README.md ADDED
@@ -0,0 +1,146 @@
1
+ # @se-studio/hubspot
2
+
3
+ HubSpot tracking and API-driven form rendering for Next.js marketing sites.
4
+
5
+ ## Features
6
+
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
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
+ - **`createHubspotFormExternalRenderer`** — CMS external component factory (`externalComponentType: "Hubspot form"`)
11
+ - **Per-form fetch** — `GET /marketing/v3/forms/{formId}` with Next.js `unstable_cache` (no bulk form download)
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ pnpm add @se-studio/hubspot
17
+ ```
18
+
19
+ ## Environment variables
20
+
21
+ | Variable | Purpose |
22
+ |----------|---------|
23
+ | `HUBSPOT_PORTAL_ID` | Portal ID for tracking script and form submissions |
24
+ | `HUBSPOT_PAT` | Private app token with `forms` scope (server-only, form definition fetch) |
25
+
26
+ ## Analytics (with GTM)
27
+
28
+ ```tsx
29
+ import { AnalyticsPageTracker, AnalyticsProvider, CompositeAnalyticsAdapter, ConsentAwareAdapter, GoogleTagManagerAdapter } from '@se-studio/core-ui';
30
+ import { AbTestReporter } from '@se-studio/ab-testing/components';
31
+ import { HubSpotAnalyticsAdapter, createHubSpotBootstrapScript } from '@se-studio/hubspot';
32
+ import Script from 'next/script';
33
+
34
+ const adapter = new ConsentAwareAdapter(
35
+ new CompositeAnalyticsAdapter([
36
+ new GoogleTagManagerAdapter({ containerId: process.env.GTM_TAG! }),
37
+ new HubSpotAnalyticsAdapter({ portalId: process.env.HUBSPOT_PORTAL_ID! }),
38
+ ]),
39
+ 'analytics',
40
+ hasConsent,
41
+ );
42
+
43
+ // layout.tsx — before HubSpot script loads (no args = SSG-safe; uses window.location.pathname)
44
+ <Script id="hubspot-bootstrap" strategy="beforeInteractive"
45
+ dangerouslySetInnerHTML={{ __html: createHubSpotBootstrapScript() }} />
46
+
47
+ <AnalyticsProvider adapter={adapter}>
48
+ <AnalyticsPageTracker />
49
+ <AbTestReporter />
50
+ {children}
51
+ </AnalyticsProvider>
52
+ ```
53
+
54
+ ## CMS external component
55
+
56
+ Add `"Hubspot form"` to your `externalComponent` enum. `data` JSON:
57
+
58
+ ```json
59
+ {
60
+ "formId": "hubspot-form-guid",
61
+ "portalId": "optional-override",
62
+ "submitButtonText": "Optional label",
63
+ "hiddenFields": { "campaign": "value" }
64
+ }
65
+ ```
66
+
67
+ ```tsx
68
+ import { defineExternalComponent } from '@se-studio/core-ui';
69
+ import { createHubspotFormExternalRenderer } from '@se-studio/hubspot/external';
70
+ import { Section } from '@/framework/Section';
71
+
72
+ export const HubspotFormRegistration = defineExternalComponent({
73
+ name: 'Hubspot form',
74
+ renderer: createHubspotFormExternalRenderer({
75
+ wrap: ({ information, children, componentName }) => (
76
+ <Section information={information} componentName={componentName}>
77
+ {children}
78
+ </Section>
79
+ ),
80
+ }),
81
+ });
82
+ ```
83
+
84
+ ### Hidden UTM / campaign fields
85
+
86
+ If the HubSpot form defines **hidden** fields whose internal names match query params (e.g. `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content`), `HubspotDynamicForm` fills them on mount from:
87
+
88
+ 1. HubSpot form defaults (if any)
89
+ 2. First-touch `sessionStorage` + current URL (URL wins for keys present on the form page)
90
+ 3. CMS `data.hiddenFields` / `data.initialValues` (**highest** — static overrides win)
91
+
92
+ First-touch is stored under `sessionStorage` key `se_studio_marketing_params` so a visitor who lands with UTMs on `/` and submits on `/contact-us/` still attributes correctly.
93
+
94
+ Sites that fork the form renderer should call the same helpers (do not reimplement):
95
+
96
+ ```tsx
97
+ import {
98
+ applyMarketingParamsToHiddenFields,
99
+ buildDefaultValues,
100
+ captureMarketingParams,
101
+ } from '@se-studio/hubspot';
102
+
103
+ // Optional: call once in a root client provider so multi-page capture runs before the form mounts
104
+ captureMarketingParams();
105
+
106
+ // When seeding form state (same order as HubspotDynamicForm):
107
+ setFormData(buildDefaultValues(formDefinition, hiddenFields, initialValues));
108
+ // or applyMarketingParamsToHiddenFields(formDefinition, baseDefaults)
109
+ ```
110
+
111
+ Submissions already send Forms API `context` (`hutk`, `pageUri`, `pageName`) via `useHubspotSubmit`.
112
+
113
+ ## Post-submit behaviour
114
+
115
+ These forms are **not** HubSpot’s native embed script — the package rebuilds fields from the Marketing Forms API and posts via the Forms Submit API. Redirect / thank-you must be handled in our client:
116
+
117
+ | Priority | Source | Behaviour |
118
+ |----------|--------|-----------|
119
+ | 1 | `redirectUrlOverride` prop | CMS override (e.g. Contentful `externalUrl` or `data.successRedirectUrl`) |
120
+ | 2 | Submit API `redirectUri` | Includes HubSpot conditional redirects when returned |
121
+ | 3 | Form definition `postSubmitAction` type `redirect_url` | Configured in HubSpot form editor |
122
+ | 4 | `inlineMessage` / `thank_you` | Inline message on the form |
123
+
124
+ **Navigation:** external absolute URLs use `window.location.assign`; same-origin paths use Next.js `router.push`. Full redirect URLs are preserved (hosts are not stripped).
125
+
126
+ **`onSuccess`:** side-effect only (analytics, swap to CMS `extraCopy`). It does **not** suppress thank-you or redirect. When a redirect is configured, navigation wins after the callback.
127
+
128
+ ```tsx
129
+ <HubspotDynamicForm
130
+ portalId={portalId}
131
+ formDefinition={formDefinition}
132
+ redirectUrlOverride={cmsExternalUrl} // optional CMS override
133
+ onSuccess={() => setShowExtraCopy(true)} // optional; redirect still runs if set
134
+ />
135
+ ```
136
+
137
+ ## Cache revalidation
138
+
139
+ When a form changes in HubSpot, revalidate:
140
+
141
+ ```ts
142
+ import { revalidateTag } from 'next/cache';
143
+ import { hubspotFormTag } from '@se-studio/hubspot/server';
144
+
145
+ revalidateTag(hubspotFormTag(formId), { expire: 0 });
146
+ ```
@@ -0,0 +1,23 @@
1
+ import type { ITyped } from '@se-studio/core-data-types';
2
+ import type { ExternalComponentRenderer } from '@se-studio/core-ui';
3
+ import type { ReactNode } from 'react';
4
+ import type { HubspotFormClassNames } from '../forms/types';
5
+ export interface HubspotFormExternalRendererOptions<TExternal extends ITyped> {
6
+ /** Wrap the form in the project's Section/layout component. */
7
+ wrap: (params: {
8
+ information: TExternal;
9
+ children: ReactNode;
10
+ componentName: string;
11
+ }) => ReactNode;
12
+ /** Resolve portal ID from env when not set in CMS data. */
13
+ getPortalId?: () => string | undefined;
14
+ /** Optional Tailwind/class overrides for form fields. */
15
+ classNames?: HubspotFormClassNames;
16
+ }
17
+ /**
18
+ * Factory for a CMS external component renderer (`externalComponentType: "Hubspot form"`).
19
+ */
20
+ export declare function createHubspotFormExternalRenderer<TExternal extends ITyped & {
21
+ data?: unknown;
22
+ }>(options: HubspotFormExternalRendererOptions<TExternal>): ExternalComponentRenderer<TExternal>;
23
+ //# sourceMappingURL=createHubspotFormExternalRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHubspotFormExternalRenderer.d.ts","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,kCAAkC,CAAC,SAAS,SAAS,MAAM;IAC1E,+DAA+D;IAC/D,IAAI,EAAE,CAAC,MAAM,EAAE;QACb,WAAW,EAAE,SAAS,CAAC;QACvB,QAAQ,EAAE,SAAS,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,KAAK,SAAS,CAAC;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACvC,yDAAyD;IACzD,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,SAAS,MAAM,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7F,OAAO,EAAE,kCAAkC,CAAC,SAAS,CAAC,GACrD,yBAAyB,CAAC,SAAS,CAAC,CA+BtC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { HubspotDynamicForm } from '../forms/client/HubspotDynamicForm';
3
+ import { getHubspotFormDefinition } from '../forms/server/getFormDefinition';
4
+ /**
5
+ * Factory for a CMS external component renderer (`externalComponentType: "Hubspot form"`).
6
+ */
7
+ export function createHubspotFormExternalRenderer(options) {
8
+ const getPortalId = options.getPortalId ?? (() => process.env.HUBSPOT_PORTAL_ID);
9
+ return async function HubspotFormExternalRenderer({ information }) {
10
+ const data = (information.data ?? {});
11
+ const portalId = data.portalId ?? getPortalId();
12
+ if (!data.formId || !portalId) {
13
+ return null;
14
+ }
15
+ const formDefinition = await getHubspotFormDefinition(data.formId);
16
+ if (!formDefinition) {
17
+ return null;
18
+ }
19
+ return options.wrap({
20
+ information,
21
+ componentName: 'Hubspot form',
22
+ children: (_jsx(HubspotDynamicForm, { portalId: portalId, formDefinition: formDefinition, submitButtonText: data.submitButtonText, classNames: options.classNames, hiddenFields: data.hiddenFields, initialValues: data.initialValues })),
23
+ });
24
+ };
25
+ }
26
+ //# sourceMappingURL=createHubspotFormExternalRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHubspotFormExternalRenderer.js","sourceRoot":"","sources":["../../src/external/createHubspotFormExternalRenderer.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgB7E;;GAEG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAAsD;IAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEjF,OAAO,KAAK,UAAU,2BAA2B,CAAC,EAAE,WAAW,EAAE;QAC/D,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QAEhD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,WAAW;YACX,aAAa,EAAE,cAAc;YAC7B,QAAQ,EAAE,CACR,KAAC,kBAAkB,IACjB,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,UAAU,EAAE,OAAO,CAAC,UAAU,EAC9B,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,aAAa,EAAE,IAAI,CAAC,aAAa,GACjC,CACH;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}