@codebards/ik-embeddable-form 0.0.2622736993-qa → 0.0.2664433215-qa
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/README.md +135 -73
- package/dist/embed.js +20599 -4
- package/dist/embed.js.map +1 -0
- package/dist/form-variants/masterclass.json +18 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
A production-ready, config-driven embeddable form platform built with **Preact**, **TypeScript**, **Vite**, **Tailwind CSS**, and **Shadow DOM** isolation.
|
|
4
4
|
|
|
5
|
+
> **Integrating the form on your site?** See **[INTEGRATION.md](INTEGRATION.md)** for step-by-step guides (HTML, WordPress, React), variant usage, custom JSON variants, and fallback behavior.
|
|
6
|
+
|
|
5
7
|
---
|
|
6
8
|
|
|
7
9
|
## Table of Contents
|
|
@@ -36,8 +38,9 @@ src/
|
|
|
36
38
|
│ └── Shared/ # Button · Input · Select · Textarea · Radio · Checkbox
|
|
37
39
|
│
|
|
38
40
|
├── configs/
|
|
39
|
-
│ ├──
|
|
40
|
-
│
|
|
41
|
+
│ ├── gql-webinar.base.ts # Full webinar form superset
|
|
42
|
+
│ ├── gql-webinar.config.ts # Base + bundled variants registry
|
|
43
|
+
│ └── variants/ # Structural overrides (default, india, event)
|
|
41
44
|
│
|
|
42
45
|
├── hooks/
|
|
43
46
|
│ ├── useFormEngine.ts # Subscribes to FormEngine state
|
|
@@ -70,7 +73,7 @@ The form is mounted inside a **Shadow DOM** attached to a `<div id="ik-form-host
|
|
|
70
73
|
### Via CDN (Recommended)
|
|
71
74
|
|
|
72
75
|
```html
|
|
73
|
-
<script src="https://cdn.example.com/forms/v1/embed.js"></script>
|
|
76
|
+
<script src="https://cdn.example.com/forms/v1.0.11/embed.js" async></script>
|
|
74
77
|
```
|
|
75
78
|
|
|
76
79
|
### Self-hosted
|
|
@@ -85,15 +88,22 @@ npm run build:production
|
|
|
85
88
|
### npm (for framework integration)
|
|
86
89
|
|
|
87
90
|
```bash
|
|
88
|
-
npm install ik-embeddable-form
|
|
91
|
+
npm install @codebards/ik-embeddable-form
|
|
89
92
|
```
|
|
90
93
|
|
|
91
94
|
```ts
|
|
92
|
-
import { IKForm } from 'ik-embeddable-form';
|
|
95
|
+
import { IKForm } from '@codebards/ik-embeddable-form';
|
|
93
96
|
|
|
94
|
-
IKForm.open({
|
|
97
|
+
IKForm.open({
|
|
98
|
+
eventName: 'How to Nail your next Technical Interview',
|
|
99
|
+
webinarType: 'REGULAR',
|
|
100
|
+
site: 'organic',
|
|
101
|
+
variant: 'default',
|
|
102
|
+
});
|
|
95
103
|
```
|
|
96
104
|
|
|
105
|
+
Full integration examples (HTML, WordPress, React, variants, custom JSON): **[INTEGRATION.md](INTEGRATION.md)**
|
|
106
|
+
|
|
97
107
|
---
|
|
98
108
|
|
|
99
109
|
## Script Usage
|
|
@@ -101,64 +111,59 @@ IKForm.open({ eventName: 'my-webinar', webinarType: 'live', ... });
|
|
|
101
111
|
### Basic
|
|
102
112
|
|
|
103
113
|
```html
|
|
104
|
-
<script src="https://cdn.example.com/forms/embed.js"></script>
|
|
114
|
+
<script src="https://cdn.example.com/forms/v1.0.11/embed.js" async></script>
|
|
105
115
|
<script>
|
|
106
116
|
window.IKForm.open({
|
|
107
|
-
eventName:
|
|
108
|
-
webinarType:
|
|
109
|
-
site:
|
|
110
|
-
variant:
|
|
117
|
+
eventName: 'How to Nail your next Technical Interview',
|
|
118
|
+
webinarType: 'REGULAR',
|
|
119
|
+
site: 'organic', // or 'learn'
|
|
120
|
+
variant: 'default', // 'default' | 'india' | 'event' | content variant name
|
|
111
121
|
});
|
|
112
122
|
</script>
|
|
113
123
|
```
|
|
114
124
|
|
|
115
|
-
###
|
|
125
|
+
### Common options
|
|
116
126
|
|
|
117
127
|
```ts
|
|
118
128
|
window.IKForm.open({
|
|
119
129
|
// Required
|
|
120
|
-
eventName:
|
|
121
|
-
webinarType:
|
|
122
|
-
site:
|
|
123
|
-
variant:
|
|
130
|
+
eventName: 'How to Nail your next Technical Interview',
|
|
131
|
+
webinarType: 'REGULAR',
|
|
132
|
+
site: 'learn',
|
|
133
|
+
variant: 'india',
|
|
124
134
|
|
|
125
135
|
// Optional
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
email: 'user@example.com',
|
|
130
|
-
firstName: 'Jane',
|
|
136
|
+
prefilledValues: {
|
|
137
|
+
email: 'user@example.com',
|
|
138
|
+
fullName: 'Jane Doe',
|
|
131
139
|
},
|
|
132
140
|
|
|
133
|
-
configOverrides: {
|
|
134
|
-
|
|
141
|
+
configOverrides: {
|
|
142
|
+
layout: {
|
|
143
|
+
leftPanel: { data: { headline: 'Campaign headline' } },
|
|
144
|
+
},
|
|
135
145
|
},
|
|
136
146
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
onError:
|
|
146
|
-
console.error('Form error:', err.code, err.message);
|
|
147
|
-
},
|
|
147
|
+
dataClickId: 'hero_cta',
|
|
148
|
+
|
|
149
|
+
// WordPress — theme already loads GTM
|
|
150
|
+
loadGtm: false,
|
|
151
|
+
loadClarity: false,
|
|
152
|
+
|
|
153
|
+
onSuccess: (result) => console.log('Submitted:', result.data),
|
|
154
|
+
onClose: () => console.log('Closed'),
|
|
155
|
+
onError: (err) => console.error(err.code, err.message),
|
|
148
156
|
});
|
|
149
157
|
```
|
|
150
158
|
|
|
159
|
+
See **[INTEGRATION.md](INTEGRATION.md)** for WordPress, React/SPA, variant JSON, and fallback details.
|
|
160
|
+
|
|
151
161
|
### Programmatic Control
|
|
152
162
|
|
|
153
163
|
```ts
|
|
154
|
-
// Close the modal
|
|
155
164
|
window.IKForm.close();
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
window.IKForm.destroy();
|
|
159
|
-
|
|
160
|
-
// Get loaded version
|
|
161
|
-
console.log(window.IKForm.getVersion()); // "1.0.0"
|
|
165
|
+
window.IKForm.destroy(); // SPA route change
|
|
166
|
+
console.log(window.IKForm.getVersion()); // "1.0.11"
|
|
162
167
|
```
|
|
163
168
|
|
|
164
169
|
---
|
|
@@ -352,53 +357,110 @@ The `__VERSION__` constant is automatically injected from `package.json` at buil
|
|
|
352
357
|
|
|
353
358
|
## Adding New Form Variants
|
|
354
359
|
|
|
355
|
-
|
|
360
|
+
The form uses a **base config + variant overrides** merge pattern. See **[INTEGRATION.md](INTEGRATION.md)** for host-page usage, JSON schema, resolution order, and fallback behavior.
|
|
361
|
+
|
|
362
|
+
| Tier | Examples | Where | Deploy needed? |
|
|
363
|
+
|------|----------|-------|----------------|
|
|
364
|
+
| **Structural** | `default`, `india`, `event` | `src/configs/variants/*.variant.ts` | Yes (code review) |
|
|
365
|
+
| **Content** | `masterclass`, campaign names | CDN JSON at `{VITE_FORM_VARIANTS_BASE_URL}/{variant}.json` | No (upload JSON only) |
|
|
366
|
+
|
|
367
|
+
**Resolution order:** bundled variant → remote JSON → fallback to `default` (console warning).
|
|
368
|
+
|
|
369
|
+
Set `VITE_FORM_VARIANTS_BASE_URL` at build time. Local dev defaults to `/form-variants` (`public/form-variants/masterclass.json`).
|
|
356
370
|
|
|
357
|
-
|
|
371
|
+
### Bundled variant files
|
|
372
|
+
|
|
373
|
+
| File | Purpose |
|
|
374
|
+
|------|---------|
|
|
375
|
+
| `default.variant.ts` | Standard flow |
|
|
376
|
+
| `india.variant.ts` | Hide `primaryGoal` on profile step |
|
|
377
|
+
| `event.variant.ts` | Hide slot picker; event copy; auto-book slot |
|
|
378
|
+
|
|
379
|
+
Base config (`gql-webinar.base.ts`) holds the full superset. Each variant file declares only what differs.
|
|
380
|
+
|
|
381
|
+
### Adding a structural variant (engineering)
|
|
382
|
+
|
|
383
|
+
1. Create `src/configs/variants/my-variant.variant.ts` with only the diff:
|
|
358
384
|
|
|
359
385
|
```ts
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
386
|
+
import type { FormVariant } from '@/types';
|
|
387
|
+
|
|
388
|
+
export const myVariant: FormVariant = {
|
|
389
|
+
id: 'my-variant',
|
|
390
|
+
overrides: {
|
|
391
|
+
steps: {
|
|
392
|
+
'profile-details': {
|
|
393
|
+
fields: { primaryGoal: { show: false } },
|
|
394
|
+
},
|
|
367
395
|
},
|
|
368
396
|
},
|
|
369
|
-
|
|
397
|
+
};
|
|
370
398
|
```
|
|
371
399
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
400
|
+
2. Register in `src/configs/variants/index.ts`
|
|
401
|
+
3. Deploy embed
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
### Adding a content variant (no code deploy)
|
|
406
|
+
|
|
407
|
+
1. Create `{variant}.json` — see [INTEGRATION.md → Create your own variant JSON](INTEGRATION.md#create-your-own-variant-json)
|
|
408
|
+
2. Upload to `{VITE_FORM_VARIANTS_BASE_URL}/{variant}.json`
|
|
409
|
+
3. Landing page: `IKForm.open({ ..., variant: 'masterclass' })`
|
|
410
|
+
|
|
411
|
+
---
|
|
376
412
|
|
|
377
413
|
### Option B — New FormConfig File
|
|
378
414
|
|
|
379
|
-
|
|
380
|
-
2. Export a `FormConfig` object with a unique `eventName` + `webinarType`
|
|
381
|
-
3. Register it in `src/configs/index.ts`:
|
|
415
|
+
For a fundamentally different product flow (not a variant of GQL webinar):
|
|
382
416
|
|
|
383
|
-
|
|
384
|
-
|
|
417
|
+
1. Create `src/configs/my-new-form.base.ts`
|
|
418
|
+
2. Export a `FormConfig` with a unique `webinarType`
|
|
419
|
+
3. Register in `src/configs/index.ts`
|
|
385
420
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
contactConfig,
|
|
389
|
-
myNewFormConfig, // ← add here
|
|
390
|
-
];
|
|
421
|
+
```ts
|
|
422
|
+
IKForm.open({ webinarType: 'MASTERCLASS', variant: 'default', ... });
|
|
391
423
|
```
|
|
392
424
|
|
|
393
|
-
No other files need to change. The platform supports **25+ variants** this way.
|
|
394
|
-
|
|
395
425
|
---
|
|
396
426
|
|
|
397
427
|
## Analytics Integration
|
|
398
428
|
|
|
399
429
|
### GTM
|
|
400
430
|
|
|
401
|
-
|
|
431
|
+
The embed can **load its own GTM container** (per architecture doc) so form conversions work on Lovable / Framer / plain HTML without host-page GTM.
|
|
432
|
+
|
|
433
|
+
| Setting | Default | Purpose |
|
|
434
|
+
|---------|---------|---------|
|
|
435
|
+
| `VITE_GTM_ID` | `GTM-P335R9N` (staging/prod) | Container injected when form opens |
|
|
436
|
+
| `loadGtm` in `IKForm.open()` | `true` | Set `false` on WordPress if the theme already loads the same container |
|
|
437
|
+
| `gtmContainerId` in `IKForm.open()` | build-time ID | Optional override (e.g. dedicated embed container) |
|
|
438
|
+
|
|
439
|
+
```ts
|
|
440
|
+
// Self-contained LP (embed loads GTM)
|
|
441
|
+
IKForm.open({
|
|
442
|
+
eventName: 'How to Nail your next Technical Interview',
|
|
443
|
+
webinarType: 'REGULAR',
|
|
444
|
+
site: 'learn',
|
|
445
|
+
variant: 'default',
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// WordPress page that already has GTM-P335R9N in the theme
|
|
449
|
+
IKForm.open({ ..., loadGtm: false, loadClarity: false });
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
**dataLayer events** (WordPress parity + embed lifecycle):
|
|
453
|
+
|
|
454
|
+
| When | Event |
|
|
455
|
+
|------|--------|
|
|
456
|
+
| Contact step success | `new_webinar_registration_form_submitted` |
|
|
457
|
+
| Slot proceed | `wordpress_form_submitted` (`formName: "Webinar Slot Selection"`) |
|
|
458
|
+
| Profile step | `pa_new_webinar_registration_form_submitted` (conversion — Meta / Google Ads / LinkedIn) |
|
|
459
|
+
| Form open / step view | `form_open`, `form_step_view`, … |
|
|
460
|
+
|
|
461
|
+
GTM fires **marketing pixels**. **Clickstream** (`ve2lt1a8il/qa` → BigQuery) is separate — see above.
|
|
462
|
+
|
|
463
|
+
Events are pushed to `window.dataLayer`. Configure GTM triggers on:
|
|
402
464
|
|
|
403
465
|
- `form_open` — fired when modal opens
|
|
404
466
|
- `form_close` — fired when modal closes
|
|
@@ -434,9 +496,9 @@ All API calls are defined in `ApiContract` objects inside your form config — *
|
|
|
434
496
|
### Dynamic URL Interpolation
|
|
435
497
|
|
|
436
498
|
```ts
|
|
437
|
-
endpoint: '
|
|
438
|
-
// If form data has {
|
|
439
|
-
// → POST https://api.example.com/api/
|
|
499
|
+
endpoint: 'webinar/{site}/add-info'
|
|
500
|
+
// If form data has { site: "organic" }
|
|
501
|
+
// → POST https://api.example.com/api/webinar/organic/add-info
|
|
440
502
|
```
|
|
441
503
|
|
|
442
504
|
### Body Mapping
|
|
@@ -464,7 +526,7 @@ responseMapping: {
|
|
|
464
526
|
### Auth Token
|
|
465
527
|
|
|
466
528
|
```ts
|
|
467
|
-
import { apiClient } from 'ik-embeddable-form';
|
|
529
|
+
import { apiClient } from '@codebards/ik-embeddable-form';
|
|
468
530
|
|
|
469
531
|
apiClient.setAuthToken('Bearer your-token-here');
|
|
470
532
|
```
|
|
@@ -484,7 +546,7 @@ import type {
|
|
|
484
546
|
OpenConfig,
|
|
485
547
|
ConditionalRule,
|
|
486
548
|
IKFormSDK,
|
|
487
|
-
} from 'ik-embeddable-form';
|
|
549
|
+
} from '@codebards/ik-embeddable-form';
|
|
488
550
|
```
|
|
489
551
|
|
|
490
552
|
---
|