@sonordev/site-kit 1.5.4 → 2.0.0
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/dist/AnalyticsProvider-J7UMCBCJ.mjs +4 -0
- package/dist/{AnalyticsProvider-BBLU4U2T.mjs.map → AnalyticsProvider-J7UMCBCJ.mjs.map} +1 -1
- package/dist/AnalyticsProvider-PPDJIGWY.js +25 -0
- package/dist/{AnalyticsProvider-EMDIAAWR.js.map → AnalyticsProvider-PPDJIGWY.js.map} +1 -1
- package/dist/EngageWidget-IDBEBGQR.js +13 -0
- package/dist/{EngageWidget-T2S5WUMJ.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
- package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
- package/dist/{EngageWidget-RWBCI4RM.mjs.map → EngageWidget-SRRI4W7U.mjs.map} +1 -1
- package/dist/SignalBridge-D6W6OLVG.mjs +4 -0
- package/dist/{SignalBridge-WGHMEILW.mjs.map → SignalBridge-D6W6OLVG.mjs.map} +1 -1
- package/dist/SignalBridge-THATXU2R.js +33 -0
- package/dist/{SignalBridge-6UYUZ2CN.js.map → SignalBridge-THATXU2R.js.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +2 -2
- package/dist/blog/index.js +75 -75
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +75 -75
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server.js +2 -2
- package/dist/blog/server.js.map +1 -1
- package/dist/blog/server.mjs +2 -2
- package/dist/blog/server.mjs.map +1 -1
- package/dist/brand.css +87 -0
- package/dist/{chunk-ZU6YPEAF.mjs → chunk-2OJCYWSQ.mjs} +85 -73
- package/dist/chunk-2OJCYWSQ.mjs.map +1 -0
- package/dist/{chunk-PM2KQ6YK.mjs → chunk-3CXAWGUP.mjs} +3 -3
- package/dist/{chunk-PM2KQ6YK.mjs.map → chunk-3CXAWGUP.mjs.map} +1 -1
- package/dist/{chunk-36Y7OWES.mjs → chunk-3YQCPLGP.mjs} +4 -4
- package/dist/chunk-3YQCPLGP.mjs.map +1 -0
- package/dist/{chunk-DK2WNYQA.js → chunk-6ZGM7S5O.js} +108 -86
- package/dist/chunk-6ZGM7S5O.js.map +1 -0
- package/dist/{chunk-XFOL6JDF.mjs → chunk-7LAOWIWE.mjs} +4 -4
- package/dist/chunk-7LAOWIWE.mjs.map +1 -0
- package/dist/{chunk-YBTYDBWY.js → chunk-7M3FNAS5.js} +6 -8
- package/dist/chunk-7M3FNAS5.js.map +1 -0
- package/dist/{chunk-4QHHFCAA.mjs → chunk-AOIG5PVY.mjs} +6 -8
- package/dist/chunk-AOIG5PVY.mjs.map +1 -0
- package/dist/{chunk-VZMDH3R4.mjs → chunk-B22WSN4L.mjs} +4 -4
- package/dist/chunk-B22WSN4L.mjs.map +1 -0
- package/dist/{chunk-ELDJDBQL.js → chunk-BVUOATPG.js} +7 -7
- package/dist/chunk-BVUOATPG.js.map +1 -0
- package/dist/{chunk-N24BPFF6.mjs → chunk-CU6OGBKK.mjs} +6 -6
- package/dist/chunk-CU6OGBKK.mjs.map +1 -0
- package/dist/{chunk-NRNK7LXK.mjs → chunk-DWI5ZKPM.mjs} +4 -4
- package/dist/chunk-DWI5ZKPM.mjs.map +1 -0
- package/dist/{chunk-KRPFLF62.mjs → chunk-F5NXD7VQ.mjs} +10 -12
- package/dist/{chunk-KRPFLF62.mjs.map → chunk-F5NXD7VQ.mjs.map} +1 -1
- package/dist/{chunk-PTTDKFL7.js → chunk-FCXQECM7.js} +6 -6
- package/dist/chunk-FCXQECM7.js.map +1 -0
- package/dist/{chunk-DY4K6X3A.js → chunk-GCPPXUAI.js} +6 -6
- package/dist/chunk-GCPPXUAI.js.map +1 -0
- package/dist/{chunk-KJN2C6YE.js → chunk-I34XL5VJ.js} +5 -5
- package/dist/chunk-I34XL5VJ.js.map +1 -0
- package/dist/{chunk-G6VGUAK2.js → chunk-IFVMZFNT.js} +4 -4
- package/dist/chunk-IFVMZFNT.js.map +1 -0
- package/dist/{chunk-FMB2RZDH.mjs → chunk-J4U3IEXL.mjs} +6 -6
- package/dist/chunk-J4U3IEXL.mjs.map +1 -0
- package/dist/{chunk-EUNL6GAL.js → chunk-JP5WGL75.js} +4 -4
- package/dist/chunk-JP5WGL75.js.map +1 -0
- package/dist/{chunk-MG23BS36.js → chunk-L3UB4B74.js} +5 -5
- package/dist/chunk-L3UB4B74.js.map +1 -0
- package/dist/{chunk-VZMRZQ2D.mjs → chunk-MSRLAD7F.mjs} +107 -86
- package/dist/chunk-MSRLAD7F.mjs.map +1 -0
- package/dist/{chunk-M5FLRLHI.mjs → chunk-OM6R7CDP.mjs} +3 -3
- package/dist/chunk-OM6R7CDP.mjs.map +1 -0
- package/dist/{chunk-4X5TFGKD.mjs → chunk-P3POHQWW.mjs} +422 -426
- package/dist/chunk-P3POHQWW.mjs.map +1 -0
- package/dist/{chunk-GJD4CFHN.js → chunk-RLNG67S5.js} +7 -7
- package/dist/chunk-RLNG67S5.js.map +1 -0
- package/dist/{chunk-FTSXKDP3.js → chunk-RO6DHV6S.js} +10 -12
- package/dist/{chunk-FTSXKDP3.js.map → chunk-RO6DHV6S.js.map} +1 -1
- package/dist/{chunk-WW7UM7XY.js → chunk-TZAD7CZD.js} +424 -428
- package/dist/chunk-TZAD7CZD.js.map +1 -0
- package/dist/{chunk-OE5DEMCV.js → chunk-UD5447TC.js} +13 -15
- package/dist/chunk-UD5447TC.js.map +1 -0
- package/dist/{chunk-TC6TOW2T.js → chunk-UJ757WGI.js} +4 -4
- package/dist/{chunk-TC6TOW2T.js.map → chunk-UJ757WGI.js.map} +1 -1
- package/dist/{chunk-C3A5HXHX.mjs → chunk-V6V6OXS2.mjs} +5 -5
- package/dist/chunk-V6V6OXS2.mjs.map +1 -0
- package/dist/{chunk-X4J33XQD.js → chunk-W6K7MQCC.js} +6 -6
- package/dist/chunk-W6K7MQCC.js.map +1 -0
- package/dist/{chunk-FI2ME55T.mjs → chunk-W7RZ3OTA.mjs} +7 -7
- package/dist/chunk-W7RZ3OTA.mjs.map +1 -0
- package/dist/{chunk-IJ2LWZID.js → chunk-WETCVFIK.js} +85 -73
- package/dist/chunk-WETCVFIK.js.map +1 -0
- package/dist/{chunk-35MALWVX.mjs → chunk-WN2PUL6B.mjs} +13 -15
- package/dist/chunk-WN2PUL6B.mjs.map +1 -0
- package/dist/cli/index.js +19339 -3461
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +19331 -3452
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cms/index.d.mts +1 -1
- package/dist/cms/index.d.ts +1 -1
- package/dist/cms/index.js +3 -3
- package/dist/cms/index.js.map +1 -1
- package/dist/cms/index.mjs +2 -2
- package/dist/cms/index.mjs.map +1 -1
- package/dist/cms/server.js +4 -4
- package/dist/cms/server.mjs +1 -1
- package/dist/commerce/index.js +47 -47
- package/dist/commerce/index.mjs +3 -3
- package/dist/engage/index.d.mts +3 -2
- package/dist/engage/index.d.ts +3 -2
- package/dist/engage/index.js +6 -6
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +3 -3
- package/dist/engage/index.mjs.map +1 -1
- package/dist/forms/index.js +379 -84
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +375 -65
- package/dist/forms/index.mjs.map +1 -1
- package/dist/forms/styles.css +312 -0
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +2 -2
- package/dist/images/server.js +4 -4
- package/dist/images/server.mjs +1 -1
- package/dist/index.d.mts +4 -131
- package/dist/index.d.ts +4 -131
- package/dist/index.js +85 -1373
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -1294
- package/dist/index.mjs.map +1 -1
- package/dist/layout/client.js +2 -2
- package/dist/layout/client.mjs +1 -1
- package/dist/layout/index.js +21 -11
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +17 -7
- package/dist/layout/index.mjs.map +1 -1
- package/dist/llms/index.d.mts +3 -3
- package/dist/llms/index.d.ts +3 -3
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.js.map +1 -1
- package/dist/llms/index.mjs +2 -2
- package/dist/llms/index.mjs.map +1 -1
- package/dist/manifest/index.js +4 -4
- package/dist/manifest/index.js.map +1 -1
- package/dist/manifest/index.mjs +3 -3
- package/dist/manifest/index.mjs.map +1 -1
- package/dist/middleware/index.js +3 -3
- package/dist/middleware/index.mjs +2 -2
- package/dist/redirects/index.js +6 -6
- package/dist/redirects/index.mjs +2 -2
- package/dist/robots/index.js +3 -3
- package/dist/robots/index.js.map +1 -1
- package/dist/robots/index.mjs +2 -2
- package/dist/robots/index.mjs.map +1 -1
- package/dist/{routing-DZYzyDHw.d.ts → routing-DQ_Et-OP.d.mts} +4 -4
- package/dist/{routing-B5XS-6_W.d.mts → routing-IYiJNIIX.d.ts} +4 -4
- package/dist/seo/index.d.mts +3 -5
- package/dist/seo/index.d.ts +3 -5
- package/dist/seo/index.js +77 -76
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +41 -40
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/register-sitemap-cli.js +3 -3
- package/dist/seo/register-sitemap-cli.js.map +1 -1
- package/dist/seo/register-sitemap-cli.mjs +3 -3
- package/dist/seo/register-sitemap-cli.mjs.map +1 -1
- package/dist/seo/server.d.mts +3 -3
- package/dist/seo/server.d.ts +3 -3
- package/dist/seo/server.js +7 -7
- package/dist/seo/server.js.map +1 -1
- package/dist/seo/server.mjs +5 -5
- package/dist/seo/server.mjs.map +1 -1
- package/dist/{server-api-XGKRGUMG.js → server-api-36R24YWN.js} +21 -21
- package/dist/{server-api-XGKRGUMG.js.map → server-api-36R24YWN.js.map} +1 -1
- package/dist/{server-api-COVFLFZ2.mjs → server-api-UIZU4JM3.mjs} +3 -3
- package/dist/{server-api-COVFLFZ2.mjs.map → server-api-UIZU4JM3.mjs.map} +1 -1
- package/dist/setup/index.d.mts +2 -5
- package/dist/setup/index.d.ts +2 -5
- package/dist/setup/index.js +0 -31
- package/dist/setup/index.mjs +1 -4
- package/dist/site-config/index.js +3 -3
- package/dist/site-config/index.mjs +1 -1
- package/dist/sitemap/index.js +10 -9
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +8 -7
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/sync/index.js +13 -13
- package/dist/sync/index.mjs +1 -1
- package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.mts} +2 -2
- package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.ts} +2 -2
- package/package.json +6 -13
- package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
- package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
- package/dist/EngageWidget-RWBCI4RM.mjs +0 -4
- package/dist/EngageWidget-T2S5WUMJ.js +0 -13
- package/dist/SetupWizard-Cki06kB0.d.mts +0 -12
- package/dist/SetupWizard-Cki06kB0.d.ts +0 -12
- package/dist/SignalBridge-6UYUZ2CN.js +0 -33
- package/dist/SignalBridge-WGHMEILW.mjs +0 -4
- package/dist/chunk-35MALWVX.mjs.map +0 -1
- package/dist/chunk-36Y7OWES.mjs.map +0 -1
- package/dist/chunk-373TK6TZ.js +0 -321
- package/dist/chunk-373TK6TZ.js.map +0 -1
- package/dist/chunk-4MOJJSNA.js +0 -14867
- package/dist/chunk-4MOJJSNA.js.map +0 -1
- package/dist/chunk-4QHHFCAA.mjs.map +0 -1
- package/dist/chunk-4X5TFGKD.mjs.map +0 -1
- package/dist/chunk-5YDPPOUU.mjs +0 -810
- package/dist/chunk-5YDPPOUU.mjs.map +0 -1
- package/dist/chunk-7FKPJQVS.mjs +0 -289
- package/dist/chunk-7FKPJQVS.mjs.map +0 -1
- package/dist/chunk-C3A5HXHX.mjs.map +0 -1
- package/dist/chunk-DK2WNYQA.js.map +0 -1
- package/dist/chunk-DY4K6X3A.js.map +0 -1
- package/dist/chunk-ELDJDBQL.js.map +0 -1
- package/dist/chunk-EUNL6GAL.js.map +0 -1
- package/dist/chunk-FI2ME55T.mjs.map +0 -1
- package/dist/chunk-FMB2RZDH.mjs.map +0 -1
- package/dist/chunk-G6VGUAK2.js.map +0 -1
- package/dist/chunk-GJD4CFHN.js.map +0 -1
- package/dist/chunk-GVXZWXQ7.js +0 -814
- package/dist/chunk-GVXZWXQ7.js.map +0 -1
- package/dist/chunk-HF2FWDBJ.mjs +0 -968
- package/dist/chunk-HF2FWDBJ.mjs.map +0 -1
- package/dist/chunk-IFAW7JFO.js +0 -1429
- package/dist/chunk-IFAW7JFO.js.map +0 -1
- package/dist/chunk-IJ2LWZID.js.map +0 -1
- package/dist/chunk-IKIJEKU3.mjs +0 -1427
- package/dist/chunk-IKIJEKU3.mjs.map +0 -1
- package/dist/chunk-JFTGG6HK.mjs +0 -14848
- package/dist/chunk-JFTGG6HK.mjs.map +0 -1
- package/dist/chunk-JM3ZR6LB.js +0 -981
- package/dist/chunk-JM3ZR6LB.js.map +0 -1
- package/dist/chunk-KJN2C6YE.js.map +0 -1
- package/dist/chunk-M5FLRLHI.mjs.map +0 -1
- package/dist/chunk-MCGLYYAR.mjs +0 -341
- package/dist/chunk-MCGLYYAR.mjs.map +0 -1
- package/dist/chunk-MG23BS36.js.map +0 -1
- package/dist/chunk-N24BPFF6.mjs.map +0 -1
- package/dist/chunk-NRNK7LXK.mjs.map +0 -1
- package/dist/chunk-OE5DEMCV.js.map +0 -1
- package/dist/chunk-PTTDKFL7.js.map +0 -1
- package/dist/chunk-S7FRYNSU.mjs +0 -315
- package/dist/chunk-S7FRYNSU.mjs.map +0 -1
- package/dist/chunk-SLB5V4RT.js +0 -302
- package/dist/chunk-SLB5V4RT.js.map +0 -1
- package/dist/chunk-VZMDH3R4.mjs.map +0 -1
- package/dist/chunk-VZMRZQ2D.mjs.map +0 -1
- package/dist/chunk-WW7UM7XY.js.map +0 -1
- package/dist/chunk-X4J33XQD.js.map +0 -1
- package/dist/chunk-XFOL6JDF.mjs.map +0 -1
- package/dist/chunk-YBTYDBWY.js.map +0 -1
- package/dist/chunk-ZQO6FZZB.js +0 -343
- package/dist/chunk-ZQO6FZZB.js.map +0 -1
- package/dist/chunk-ZU6YPEAF.mjs.map +0 -1
- package/dist/generators-DOFWGRXS.js +0 -37
- package/dist/generators-DOFWGRXS.js.map +0 -1
- package/dist/generators-R62APO62.mjs +0 -4
- package/dist/generators-R62APO62.mjs.map +0 -1
- package/dist/migrator-3WQB3KQ2.mjs +0 -4
- package/dist/migrator-3WQB3KQ2.mjs.map +0 -1
- package/dist/migrator-HFVQYK5R.js +0 -37
- package/dist/migrator-HFVQYK5R.js.map +0 -1
- package/dist/scanner-AF7YUCFG.mjs +0 -4
- package/dist/scanner-AF7YUCFG.mjs.map +0 -1
- package/dist/scanner-DBD5K6F7.js +0 -53
- package/dist/scanner-DBD5K6F7.js.map +0 -1
- package/dist/setup/client.d.mts +0 -60
- package/dist/setup/client.d.ts +0 -60
- package/dist/setup/client.js +0 -31
- package/dist/setup/client.js.map +0 -1
- package/dist/setup/client.mjs +0 -6
- package/dist/setup/client.mjs.map +0 -1
- package/dist/setup/server.d.mts +0 -14
- package/dist/setup/server.d.ts +0 -14
- package/dist/setup/server.js +0 -13
- package/dist/setup/server.js.map +0 -1
- package/dist/setup/server.mjs +0 -4
- package/dist/setup/server.mjs.map +0 -1
package/dist/forms/index.js
CHANGED
|
@@ -1,11 +1,321 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var chunk373TK6TZ_js = require('../chunk-373TK6TZ.js');
|
|
5
4
|
require('../chunk-ZSMWDLMK.js');
|
|
6
5
|
var react = require('react');
|
|
7
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
7
|
|
|
8
|
+
// src/forms/formsApi.ts
|
|
9
|
+
var config = null;
|
|
10
|
+
function configureFormsApi(options) {
|
|
11
|
+
config = options;
|
|
12
|
+
}
|
|
13
|
+
function getConfig() {
|
|
14
|
+
if (config) return config;
|
|
15
|
+
if (typeof window !== "undefined") {
|
|
16
|
+
const apiUrl = window.__SITE_KIT_API_URL__;
|
|
17
|
+
const apiKey = window.__SITE_KIT_API_KEY__;
|
|
18
|
+
if (apiUrl && apiKey) {
|
|
19
|
+
return { baseUrl: apiUrl, apiKey };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error(
|
|
23
|
+
"Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first."
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
async function apiRequest(method, path, body) {
|
|
27
|
+
const { baseUrl, apiKey, getAuthToken } = getConfig();
|
|
28
|
+
const headers = {
|
|
29
|
+
"Content-Type": "application/json"
|
|
30
|
+
};
|
|
31
|
+
if (apiKey) {
|
|
32
|
+
headers["x-api-key"] = apiKey;
|
|
33
|
+
} else if (getAuthToken) {
|
|
34
|
+
const token = await getAuthToken();
|
|
35
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
36
|
+
}
|
|
37
|
+
const response = await fetch(`${baseUrl}${path}`, {
|
|
38
|
+
method,
|
|
39
|
+
headers,
|
|
40
|
+
body: body ? JSON.stringify(body) : void 0
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
44
|
+
throw new Error(error.message || `API error: ${response.status}`);
|
|
45
|
+
}
|
|
46
|
+
if (response.status === 204) {
|
|
47
|
+
return void 0;
|
|
48
|
+
}
|
|
49
|
+
return response.json();
|
|
50
|
+
}
|
|
51
|
+
var formsApi = {
|
|
52
|
+
/**
|
|
53
|
+
* List all forms for a project
|
|
54
|
+
*/
|
|
55
|
+
async list(options = {}) {
|
|
56
|
+
const params = new URLSearchParams();
|
|
57
|
+
if (options.projectId) params.set("projectId", options.projectId);
|
|
58
|
+
if (options.formType) params.set("formType", options.formType);
|
|
59
|
+
if (options.isActive !== void 0) params.set("isActive", String(options.isActive));
|
|
60
|
+
if (options.search) params.set("search", options.search);
|
|
61
|
+
const query = params.toString();
|
|
62
|
+
const result = await apiRequest("GET", `/forms${query ? `?${query}` : ""}`);
|
|
63
|
+
return result.data;
|
|
64
|
+
},
|
|
65
|
+
/**
|
|
66
|
+
* Get a single form by ID or slug
|
|
67
|
+
*/
|
|
68
|
+
async get(idOrSlug) {
|
|
69
|
+
return apiRequest("GET", `/forms/${idOrSlug}`);
|
|
70
|
+
},
|
|
71
|
+
/**
|
|
72
|
+
* Create a new form
|
|
73
|
+
*/
|
|
74
|
+
async create(input) {
|
|
75
|
+
return apiRequest("POST", "/forms", input);
|
|
76
|
+
},
|
|
77
|
+
/**
|
|
78
|
+
* Update an existing form
|
|
79
|
+
*/
|
|
80
|
+
async update(id, input) {
|
|
81
|
+
return apiRequest("PUT", `/forms/${id}`, input);
|
|
82
|
+
},
|
|
83
|
+
/**
|
|
84
|
+
* Delete a form
|
|
85
|
+
*/
|
|
86
|
+
async delete(id) {
|
|
87
|
+
return apiRequest("DELETE", `/forms/${id}`);
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* Add a field to an existing form
|
|
91
|
+
*/
|
|
92
|
+
async addField(formId, field2) {
|
|
93
|
+
const form = await formsApi.get(formId);
|
|
94
|
+
const maxSortOrder = Math.max(0, ...(form.fields || []).map((f) => f.sortOrder || 0));
|
|
95
|
+
return formsApi.update(formId, {
|
|
96
|
+
fields: [
|
|
97
|
+
...form.fields || [],
|
|
98
|
+
{ ...field2, sortOrder: field2.sortOrder ?? maxSortOrder + 1 }
|
|
99
|
+
]
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Update a field in an existing form
|
|
104
|
+
*/
|
|
105
|
+
async updateField(formId, fieldSlug, updates) {
|
|
106
|
+
const form = await formsApi.get(formId);
|
|
107
|
+
return formsApi.update(formId, {
|
|
108
|
+
fields: (form.fields || []).map(
|
|
109
|
+
(f) => f.slug === fieldSlug ? { ...f, ...updates } : f
|
|
110
|
+
)
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
/**
|
|
114
|
+
* Remove a field from a form
|
|
115
|
+
*/
|
|
116
|
+
async removeField(formId, fieldSlug) {
|
|
117
|
+
const form = await formsApi.get(formId);
|
|
118
|
+
return formsApi.update(formId, {
|
|
119
|
+
fields: (form.fields || []).filter((f) => f.slug !== fieldSlug)
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* Reorder fields in a form
|
|
124
|
+
*/
|
|
125
|
+
async reorderFields(formId, fieldSlugs) {
|
|
126
|
+
const form = await formsApi.get(formId);
|
|
127
|
+
const fieldsMap = new Map((form.fields || []).map((f) => [f.slug, f]));
|
|
128
|
+
const orderedFields = fieldSlugs.map((slug, index) => {
|
|
129
|
+
const field2 = fieldsMap.get(slug);
|
|
130
|
+
if (!field2) throw new Error(`Field not found: ${slug}`);
|
|
131
|
+
return { ...field2, sortOrder: index };
|
|
132
|
+
});
|
|
133
|
+
return formsApi.update(formId, { fields: orderedFields });
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Clone a form
|
|
137
|
+
*/
|
|
138
|
+
async clone(formId, newSlug, newName) {
|
|
139
|
+
const form = await formsApi.get(formId);
|
|
140
|
+
return formsApi.create({
|
|
141
|
+
projectId: form.projectId,
|
|
142
|
+
slug: newSlug,
|
|
143
|
+
name: newName || `${form.name} (Copy)`,
|
|
144
|
+
description: form.description,
|
|
145
|
+
formType: form.formType,
|
|
146
|
+
successMessage: form.successMessage,
|
|
147
|
+
redirectUrl: form.redirectUrl,
|
|
148
|
+
notificationEmails: form.notificationEmails,
|
|
149
|
+
submitButtonText: form.submitButtonText,
|
|
150
|
+
layout: form.layout,
|
|
151
|
+
showProgress: form.showProgress,
|
|
152
|
+
enableSaveDraft: form.enableSaveDraft,
|
|
153
|
+
isActive: false,
|
|
154
|
+
// Clone as inactive
|
|
155
|
+
fields: (form.fields || []).map(({ id, ...field2 }) => field2),
|
|
156
|
+
// Remove IDs
|
|
157
|
+
steps: (form.steps || []).map(({ id, ...step }) => step)
|
|
158
|
+
// Remove IDs
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
/**
|
|
162
|
+
* Activate or deactivate a form
|
|
163
|
+
*/
|
|
164
|
+
async setActive(formId, isActive) {
|
|
165
|
+
return formsApi.update(formId, { isActive });
|
|
166
|
+
},
|
|
167
|
+
/**
|
|
168
|
+
* Sync a form definition to the backend
|
|
169
|
+
* Creates the form if it doesn't exist, updates if it does
|
|
170
|
+
* Perfect for defining forms in code during development
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```tsx
|
|
174
|
+
* // In your app initialization or form component
|
|
175
|
+
* await formsApi.sync({
|
|
176
|
+
* slug: 'contact',
|
|
177
|
+
* name: 'Contact Form',
|
|
178
|
+
* formType: 'prospect',
|
|
179
|
+
* fields: [
|
|
180
|
+
* field.text('name', 'Your Name', { isRequired: true }),
|
|
181
|
+
* field.email('email', 'Email Address'),
|
|
182
|
+
* field.phone('phone', 'Phone Number'),
|
|
183
|
+
* field.textarea('message', 'Message'),
|
|
184
|
+
* ]
|
|
185
|
+
* })
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
async sync(input) {
|
|
189
|
+
return apiRequest(
|
|
190
|
+
"POST",
|
|
191
|
+
"/api/public/forms/sync",
|
|
192
|
+
input
|
|
193
|
+
);
|
|
194
|
+
},
|
|
195
|
+
/**
|
|
196
|
+
* Sync multiple forms at once
|
|
197
|
+
* Useful for initializing all forms in your app
|
|
198
|
+
*/
|
|
199
|
+
async syncAll(forms) {
|
|
200
|
+
return Promise.all(forms.map((form) => formsApi.sync(form)));
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
var field = {
|
|
204
|
+
text: (slug, label, options) => ({
|
|
205
|
+
slug,
|
|
206
|
+
label,
|
|
207
|
+
fieldType: "text",
|
|
208
|
+
...options
|
|
209
|
+
}),
|
|
210
|
+
email: (slug, label, options) => ({
|
|
211
|
+
slug,
|
|
212
|
+
label,
|
|
213
|
+
fieldType: "email",
|
|
214
|
+
isRequired: true,
|
|
215
|
+
...options
|
|
216
|
+
}),
|
|
217
|
+
phone: (slug, label, options) => ({
|
|
218
|
+
slug,
|
|
219
|
+
label,
|
|
220
|
+
fieldType: "phone",
|
|
221
|
+
...options
|
|
222
|
+
}),
|
|
223
|
+
textarea: (slug, label, options) => ({
|
|
224
|
+
slug,
|
|
225
|
+
label,
|
|
226
|
+
fieldType: "textarea",
|
|
227
|
+
...options
|
|
228
|
+
}),
|
|
229
|
+
select: (slug, label, choices, options) => ({
|
|
230
|
+
slug,
|
|
231
|
+
label,
|
|
232
|
+
fieldType: "select",
|
|
233
|
+
options: choices,
|
|
234
|
+
...options
|
|
235
|
+
}),
|
|
236
|
+
radio: (slug, label, choices, options) => ({
|
|
237
|
+
slug,
|
|
238
|
+
label,
|
|
239
|
+
fieldType: "radio",
|
|
240
|
+
options: choices,
|
|
241
|
+
...options
|
|
242
|
+
}),
|
|
243
|
+
checkbox: (slug, label, options) => ({
|
|
244
|
+
slug,
|
|
245
|
+
label,
|
|
246
|
+
fieldType: "checkbox",
|
|
247
|
+
...options
|
|
248
|
+
}),
|
|
249
|
+
date: (slug, label, options) => ({
|
|
250
|
+
slug,
|
|
251
|
+
label,
|
|
252
|
+
fieldType: "date",
|
|
253
|
+
...options
|
|
254
|
+
}),
|
|
255
|
+
number: (slug, label, options) => ({
|
|
256
|
+
slug,
|
|
257
|
+
label,
|
|
258
|
+
fieldType: "number",
|
|
259
|
+
...options
|
|
260
|
+
}),
|
|
261
|
+
rating: (slug, label, options) => ({
|
|
262
|
+
slug,
|
|
263
|
+
label,
|
|
264
|
+
fieldType: "rating",
|
|
265
|
+
...options
|
|
266
|
+
}),
|
|
267
|
+
file: (slug, label, options) => ({
|
|
268
|
+
slug,
|
|
269
|
+
label,
|
|
270
|
+
fieldType: "file",
|
|
271
|
+
...options
|
|
272
|
+
}),
|
|
273
|
+
hidden: (slug, defaultValue) => ({
|
|
274
|
+
slug,
|
|
275
|
+
label: "",
|
|
276
|
+
fieldType: "hidden",
|
|
277
|
+
defaultValue
|
|
278
|
+
}),
|
|
279
|
+
heading: (slug, label) => ({
|
|
280
|
+
slug,
|
|
281
|
+
label,
|
|
282
|
+
fieldType: "heading"
|
|
283
|
+
}),
|
|
284
|
+
paragraph: (slug, label) => ({
|
|
285
|
+
slug,
|
|
286
|
+
label,
|
|
287
|
+
fieldType: "paragraph"
|
|
288
|
+
})
|
|
289
|
+
};
|
|
290
|
+
function defineForm(definition) {
|
|
291
|
+
const fieldsWithOrder = definition.fields.map((f, index) => ({
|
|
292
|
+
...f,
|
|
293
|
+
sortOrder: f.sortOrder ?? index
|
|
294
|
+
}));
|
|
295
|
+
return {
|
|
296
|
+
...definition,
|
|
297
|
+
fields: fieldsWithOrder,
|
|
298
|
+
formType: definition.formType || "contact",
|
|
299
|
+
successMessage: definition.successMessage || "Thank you for your submission!",
|
|
300
|
+
submitButtonText: definition.submitButtonText || "Submit",
|
|
301
|
+
layout: definition.layout || "stacked",
|
|
302
|
+
isActive: definition.isActive ?? true
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async function initializeForms(forms) {
|
|
306
|
+
if (typeof window === "undefined") {
|
|
307
|
+
console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map((f) => f.slug).join(", ")}`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
const results = await formsApi.syncAll(forms);
|
|
312
|
+
const created = results.filter((r) => r.created).length;
|
|
313
|
+
const updated = results.filter((r) => r.updated).length;
|
|
314
|
+
console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`);
|
|
315
|
+
} catch (error) {
|
|
316
|
+
console.error("[Site-Kit] Failed to sync forms:", error);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
9
319
|
function useFormTracking({
|
|
10
320
|
formId,
|
|
11
321
|
totalSteps,
|
|
@@ -465,7 +775,7 @@ function useForm(formIdOrSlug, options = {}) {
|
|
|
465
775
|
const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
|
|
466
776
|
const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
|
|
467
777
|
if (!apiKey) {
|
|
468
|
-
throw new Error("API key is required. Set SONOR_API_KEY
|
|
778
|
+
throw new Error("API key is required. Set SONOR_API_KEY in your .env");
|
|
469
779
|
}
|
|
470
780
|
const honeypotFieldName = form.honeypot_field || "website";
|
|
471
781
|
const recaptchaToken = form.recaptcha_enabled ? await getRecaptchaToken(form.recaptcha_site_key) : null;
|
|
@@ -483,7 +793,7 @@ function useForm(formIdOrSlug, options = {}) {
|
|
|
483
793
|
pageUrl: typeof window !== "undefined" ? window.location.href : null,
|
|
484
794
|
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
485
795
|
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
|
|
486
|
-
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("
|
|
796
|
+
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null,
|
|
487
797
|
recaptchaToken: recaptchaToken || void 0,
|
|
488
798
|
utmSource: utm.utm_source,
|
|
489
799
|
utmMedium: utm.utm_medium,
|
|
@@ -571,32 +881,32 @@ function normalizeOptions(options) {
|
|
|
571
881
|
}
|
|
572
882
|
return [];
|
|
573
883
|
}
|
|
574
|
-
function FormField({ field: field2, value, error, onChange, classPrefix = "
|
|
575
|
-
const inputId = `
|
|
884
|
+
function FormField({ field: field2, value, error, onChange, classPrefix = "sk-form" }) {
|
|
885
|
+
const inputId = `sk-${field2.id || field2.slug}`;
|
|
576
886
|
const options = normalizeOptions(field2.options);
|
|
577
887
|
const baseInputStyle = {
|
|
578
888
|
width: "100%",
|
|
579
|
-
padding: "var(--
|
|
580
|
-
fontSize: "var(--
|
|
581
|
-
border: error ? "1px solid var(--
|
|
582
|
-
borderRadius: "var(--
|
|
583
|
-
backgroundColor: "var(--
|
|
889
|
+
padding: "var(--sk-input-padding, 10px 12px)",
|
|
890
|
+
fontSize: "var(--sk-font-size, 16px)",
|
|
891
|
+
border: error ? "1px solid var(--sk-input-border-error, #ef4444)" : "1px solid var(--sk-input-border, #d1d5db)",
|
|
892
|
+
borderRadius: "var(--sk-input-radius, 6px)",
|
|
893
|
+
backgroundColor: "var(--sk-input-bg, #ffffff)",
|
|
584
894
|
outline: "none",
|
|
585
895
|
fontFamily: "inherit"
|
|
586
896
|
};
|
|
587
897
|
const labelStyle = {
|
|
588
898
|
display: "block",
|
|
589
899
|
marginBottom: 6,
|
|
590
|
-
fontWeight: "var(--
|
|
591
|
-
color: "var(--
|
|
900
|
+
fontWeight: "var(--sk-label-weight, 500)",
|
|
901
|
+
color: "var(--sk-label-color, inherit)"
|
|
592
902
|
};
|
|
593
903
|
const errorStyle = {
|
|
594
|
-
color: "var(--
|
|
904
|
+
color: "var(--sk-error, #ef4444)",
|
|
595
905
|
fontSize: 14,
|
|
596
906
|
marginTop: 4
|
|
597
907
|
};
|
|
598
908
|
const helpStyle = {
|
|
599
|
-
color: "var(--
|
|
909
|
+
color: "var(--sk-text-tertiary, #6b7280)",
|
|
600
910
|
fontSize: 14,
|
|
601
911
|
marginTop: 4
|
|
602
912
|
};
|
|
@@ -604,7 +914,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
604
914
|
return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: `${classPrefix}__heading`, style: { margin: "16px 0 8px", fontWeight: 600, fontSize: 18 }, children: field2.label });
|
|
605
915
|
}
|
|
606
916
|
if (field2.field_type === "paragraph") {
|
|
607
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: `${classPrefix}__paragraph`, style: { color: "var(--
|
|
917
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: `${classPrefix}__paragraph`, style: { color: "var(--sk-text-tertiary, #6b7280)", margin: "8px 0" }, children: field2.help_text || field2.label });
|
|
608
918
|
}
|
|
609
919
|
if (field2.field_type === "hidden") {
|
|
610
920
|
return /* @__PURE__ */ jsxRuntime.jsx("input", { type: "hidden", name: field2.slug, value: String(value || "") });
|
|
@@ -614,7 +924,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
614
924
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classPrefix}__field ${classPrefix}__field--${field2.field_type}`, children: [
|
|
615
925
|
/* @__PURE__ */ jsxRuntime.jsxs("label", { htmlFor: inputId, className: `${classPrefix}__label`, style: { ...labelStyle, ...hideLabel ? { position: "absolute", width: 1, height: 1, padding: 0, margin: -1, overflow: "hidden", clip: "rect(0,0,0,0)", whiteSpace: "nowrap", border: 0 } : {} }, children: [
|
|
616
926
|
field2.label,
|
|
617
|
-
field2.is_required && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--
|
|
927
|
+
field2.is_required && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sk-error, #ef4444)" }, children: " *" })
|
|
618
928
|
] }),
|
|
619
929
|
["text", "email", "phone", "tel", "number"].includes(field2.field_type) && /* @__PURE__ */ jsxRuntime.jsx(
|
|
620
930
|
"input",
|
|
@@ -790,7 +1100,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
790
1100
|
border: "none",
|
|
791
1101
|
fontSize: 24,
|
|
792
1102
|
cursor: "pointer",
|
|
793
|
-
color: value >= star ? "var(--
|
|
1103
|
+
color: value >= star ? "var(--sk-rating-active, #fbbf24)" : "var(--sk-rating-inactive, #d1d5db)"
|
|
794
1104
|
},
|
|
795
1105
|
children: "\u2605"
|
|
796
1106
|
},
|
|
@@ -817,7 +1127,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
817
1127
|
] });
|
|
818
1128
|
}
|
|
819
1129
|
function FormClient({
|
|
820
|
-
config,
|
|
1130
|
+
config: config2,
|
|
821
1131
|
className,
|
|
822
1132
|
onSuccess,
|
|
823
1133
|
onError,
|
|
@@ -829,19 +1139,19 @@ function FormClient({
|
|
|
829
1139
|
const [isSubmitting, setIsSubmitting] = react.useState(false);
|
|
830
1140
|
const [isComplete, setIsComplete] = react.useState(false);
|
|
831
1141
|
const [honeypotValue, setHoneypotValue] = react.useState("");
|
|
832
|
-
const honeypotFieldName =
|
|
1142
|
+
const honeypotFieldName = config2.honeypot_field || "website";
|
|
833
1143
|
const { trackStepChange, trackComplete } = useFormTracking({
|
|
834
|
-
formId:
|
|
835
|
-
totalSteps:
|
|
1144
|
+
formId: config2.id,
|
|
1145
|
+
totalSteps: config2.total_steps
|
|
836
1146
|
});
|
|
837
1147
|
const currentFields = react.useMemo(() => {
|
|
838
|
-
if (!
|
|
839
|
-
return
|
|
1148
|
+
if (!config2.is_multi_step) {
|
|
1149
|
+
return config2.fields || [];
|
|
840
1150
|
}
|
|
841
|
-
const currentStepConfig =
|
|
842
|
-
if (!currentStepConfig) return
|
|
843
|
-
return (
|
|
844
|
-
}, [
|
|
1151
|
+
const currentStepConfig = config2.steps?.find((s) => s.step_number === step);
|
|
1152
|
+
if (!currentStepConfig) return config2.fields || [];
|
|
1153
|
+
return (config2.fields || []).filter((f) => f.step_id === currentStepConfig.id);
|
|
1154
|
+
}, [config2, step]);
|
|
845
1155
|
const isFieldVisible = react.useCallback((field2) => {
|
|
846
1156
|
if (!field2.conditional?.show_when) return true;
|
|
847
1157
|
const { field: condField, operator, value } = field2.conditional.show_when;
|
|
@@ -923,14 +1233,14 @@ function FormClient({
|
|
|
923
1233
|
}, [errors]);
|
|
924
1234
|
const nextStep = react.useCallback(() => {
|
|
925
1235
|
if (!validateStep()) return false;
|
|
926
|
-
if (step <
|
|
1236
|
+
if (step < config2.total_steps) {
|
|
927
1237
|
const newStep = step + 1;
|
|
928
1238
|
setStep(newStep);
|
|
929
1239
|
trackStepChange(newStep);
|
|
930
1240
|
return true;
|
|
931
1241
|
}
|
|
932
1242
|
return false;
|
|
933
|
-
}, [step,
|
|
1243
|
+
}, [step, config2.total_steps, validateStep, trackStepChange]);
|
|
934
1244
|
const prevStep = react.useCallback(() => {
|
|
935
1245
|
if (step > 1) {
|
|
936
1246
|
const newStep = step - 1;
|
|
@@ -939,11 +1249,11 @@ function FormClient({
|
|
|
939
1249
|
}
|
|
940
1250
|
}, [step, trackStepChange]);
|
|
941
1251
|
const goToStep = react.useCallback((targetStep) => {
|
|
942
|
-
if (targetStep >= 1 && targetStep <=
|
|
1252
|
+
if (targetStep >= 1 && targetStep <= config2.total_steps) {
|
|
943
1253
|
setStep(targetStep);
|
|
944
1254
|
trackStepChange(targetStep);
|
|
945
1255
|
}
|
|
946
|
-
}, [
|
|
1256
|
+
}, [config2.total_steps, trackStepChange]);
|
|
947
1257
|
const submit = react.useCallback(async () => {
|
|
948
1258
|
if (!validateStep()) return;
|
|
949
1259
|
setIsSubmitting(true);
|
|
@@ -951,27 +1261,27 @@ function FormClient({
|
|
|
951
1261
|
const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
|
|
952
1262
|
const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
|
|
953
1263
|
if (!apiKey) {
|
|
954
|
-
throw new Error("API key is required. Set SONOR_API_KEY
|
|
1264
|
+
throw new Error("API key is required. Set SONOR_API_KEY in your .env");
|
|
955
1265
|
}
|
|
956
|
-
const recaptchaToken =
|
|
957
|
-
if (
|
|
1266
|
+
const recaptchaToken = config2.recaptcha_enabled ? await getRecaptchaToken(config2.recaptcha_site_key) : null;
|
|
1267
|
+
if (config2.recaptcha_enabled && !recaptchaToken) {
|
|
958
1268
|
throw new Error("reCAPTCHA is required but could not be initialized.");
|
|
959
1269
|
}
|
|
960
1270
|
const utm = getUTMParams2();
|
|
961
1271
|
const submission = {
|
|
962
|
-
form_id:
|
|
963
|
-
project_id:
|
|
1272
|
+
form_id: config2.id,
|
|
1273
|
+
project_id: config2.project_id,
|
|
964
1274
|
data: {
|
|
965
1275
|
...values,
|
|
966
|
-
...
|
|
1276
|
+
...config2.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}
|
|
967
1277
|
},
|
|
968
|
-
routing_type:
|
|
1278
|
+
routing_type: config2.form_type,
|
|
969
1279
|
status: "new",
|
|
970
1280
|
metadata: {
|
|
971
1281
|
pageUrl: typeof window !== "undefined" ? window.location.href : null,
|
|
972
1282
|
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
973
1283
|
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
|
|
974
|
-
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("
|
|
1284
|
+
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null,
|
|
975
1285
|
recaptchaToken: recaptchaToken || void 0,
|
|
976
1286
|
utmSource: utm.utm_source,
|
|
977
1287
|
utmMedium: utm.utm_medium,
|
|
@@ -994,8 +1304,8 @@ function FormClient({
|
|
|
994
1304
|
trackComplete();
|
|
995
1305
|
setIsComplete(true);
|
|
996
1306
|
onSuccess?.(data);
|
|
997
|
-
if (
|
|
998
|
-
window.location.href =
|
|
1307
|
+
if (config2.redirect_url) {
|
|
1308
|
+
window.location.href = config2.redirect_url;
|
|
999
1309
|
}
|
|
1000
1310
|
} catch (error) {
|
|
1001
1311
|
console.error("[Forms] Submission error:", error);
|
|
@@ -1003,15 +1313,15 @@ function FormClient({
|
|
|
1003
1313
|
} finally {
|
|
1004
1314
|
setIsSubmitting(false);
|
|
1005
1315
|
}
|
|
1006
|
-
}, [
|
|
1316
|
+
}, [config2, honeypotFieldName, honeypotValue, values, validateStep, trackComplete, onSuccess, onError]);
|
|
1007
1317
|
const progress = react.useMemo(() => {
|
|
1008
|
-
return Math.round(step /
|
|
1009
|
-
}, [step,
|
|
1318
|
+
return Math.round(step / config2.total_steps * 100);
|
|
1319
|
+
}, [step, config2.total_steps]);
|
|
1010
1320
|
const renderProps = {
|
|
1011
|
-
config,
|
|
1321
|
+
config: config2,
|
|
1012
1322
|
fields: currentFields,
|
|
1013
1323
|
step,
|
|
1014
|
-
totalSteps:
|
|
1324
|
+
totalSteps: config2.total_steps,
|
|
1015
1325
|
values,
|
|
1016
1326
|
errors,
|
|
1017
1327
|
isSubmitting,
|
|
@@ -1024,7 +1334,7 @@ function FormClient({
|
|
|
1024
1334
|
isFieldVisible
|
|
1025
1335
|
};
|
|
1026
1336
|
if (isComplete) {
|
|
1027
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children:
|
|
1337
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: config2.success_message }) });
|
|
1028
1338
|
}
|
|
1029
1339
|
if (customRender) {
|
|
1030
1340
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: customRender(renderProps) });
|
|
@@ -1032,44 +1342,44 @@ function FormClient({
|
|
|
1032
1342
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1033
1343
|
"form",
|
|
1034
1344
|
{
|
|
1035
|
-
className: `
|
|
1345
|
+
className: `sk-form ${className || ""}`,
|
|
1036
1346
|
onSubmit: (e) => {
|
|
1037
1347
|
e.preventDefault();
|
|
1038
|
-
if (step <
|
|
1348
|
+
if (step < config2.total_steps) {
|
|
1039
1349
|
nextStep();
|
|
1040
1350
|
} else {
|
|
1041
1351
|
submit();
|
|
1042
1352
|
}
|
|
1043
1353
|
},
|
|
1044
1354
|
children: [
|
|
1045
|
-
|
|
1046
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
1047
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "
|
|
1355
|
+
config2.is_multi_step && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-form__progress", style: { marginBottom: 20 }, children: [
|
|
1356
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-form__progress-header", style: { display: "flex", justifyContent: "space-between", marginBottom: 8 }, children: [
|
|
1357
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sk-form__progress-step", children: [
|
|
1048
1358
|
"Step ",
|
|
1049
1359
|
step,
|
|
1050
1360
|
" of ",
|
|
1051
|
-
|
|
1361
|
+
config2.total_steps
|
|
1052
1362
|
] }),
|
|
1053
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "
|
|
1363
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "sk-form__progress-percent", children: [
|
|
1054
1364
|
progress,
|
|
1055
1365
|
"%"
|
|
1056
1366
|
] })
|
|
1057
1367
|
] }),
|
|
1058
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
1368
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-form__progress-track", style: {
|
|
1059
1369
|
height: 4,
|
|
1060
|
-
backgroundColor: "var(--
|
|
1370
|
+
backgroundColor: "var(--sk-progress-bg, #e5e7eb)",
|
|
1061
1371
|
borderRadius: 2,
|
|
1062
1372
|
overflow: "hidden"
|
|
1063
|
-
}, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
1373
|
+
}, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-form__progress-bar", style: {
|
|
1064
1374
|
width: `${progress}%`,
|
|
1065
1375
|
height: "100%",
|
|
1066
|
-
backgroundColor: "var(--
|
|
1376
|
+
backgroundColor: "var(--sk-progress-fill, #3b82f6)",
|
|
1067
1377
|
transition: "width 0.3s ease"
|
|
1068
1378
|
} }) })
|
|
1069
1379
|
] }),
|
|
1070
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "
|
|
1380
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "sk-form__fields", children: currentFields.map((field2) => {
|
|
1071
1381
|
if (!isFieldVisible(field2)) return null;
|
|
1072
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `
|
|
1382
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `sk-form__field-wrapper sk-form__field-wrapper--${field2.width || "full"}`, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1073
1383
|
FormField,
|
|
1074
1384
|
{
|
|
1075
1385
|
field: field2,
|
|
@@ -1079,15 +1389,15 @@ function FormClient({
|
|
|
1079
1389
|
}
|
|
1080
1390
|
) }, field2.id);
|
|
1081
1391
|
}) }),
|
|
1082
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "
|
|
1392
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sk-form__actions", style: {
|
|
1083
1393
|
display: "flex",
|
|
1084
1394
|
justifyContent: step > 1 ? "space-between" : "flex-end",
|
|
1085
1395
|
marginTop: 24
|
|
1086
1396
|
}, children: [
|
|
1087
|
-
step > 1 && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "
|
|
1088
|
-
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", className: "
|
|
1397
|
+
step > 1 && /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", className: "sk-form__btn sk-form__btn--back", onClick: prevStep, children: "Back" }),
|
|
1398
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", className: "sk-form__btn sk-form__btn--submit", disabled: isSubmitting, children: isSubmitting ? "Submitting..." : step < config2.total_steps ? "Next" : config2.submit_button_text })
|
|
1089
1399
|
] }),
|
|
1090
|
-
|
|
1400
|
+
config2.honeypot_enabled && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1091
1401
|
"input",
|
|
1092
1402
|
{
|
|
1093
1403
|
type: "text",
|
|
@@ -1158,29 +1468,14 @@ function ManagedForm({
|
|
|
1158
1468
|
);
|
|
1159
1469
|
}
|
|
1160
1470
|
|
|
1161
|
-
Object.defineProperty(exports, "configureFormsApi", {
|
|
1162
|
-
enumerable: true,
|
|
1163
|
-
get: function () { return chunk373TK6TZ_js.configureFormsApi; }
|
|
1164
|
-
});
|
|
1165
|
-
Object.defineProperty(exports, "defineForm", {
|
|
1166
|
-
enumerable: true,
|
|
1167
|
-
get: function () { return chunk373TK6TZ_js.defineForm; }
|
|
1168
|
-
});
|
|
1169
|
-
Object.defineProperty(exports, "field", {
|
|
1170
|
-
enumerable: true,
|
|
1171
|
-
get: function () { return chunk373TK6TZ_js.field; }
|
|
1172
|
-
});
|
|
1173
|
-
Object.defineProperty(exports, "formsApi", {
|
|
1174
|
-
enumerable: true,
|
|
1175
|
-
get: function () { return chunk373TK6TZ_js.formsApi; }
|
|
1176
|
-
});
|
|
1177
|
-
Object.defineProperty(exports, "initializeForms", {
|
|
1178
|
-
enumerable: true,
|
|
1179
|
-
get: function () { return chunk373TK6TZ_js.initializeForms; }
|
|
1180
|
-
});
|
|
1181
1471
|
exports.FormClient = FormClient;
|
|
1182
1472
|
exports.FormFieldComponent = FormField;
|
|
1183
1473
|
exports.ManagedForm = ManagedForm;
|
|
1474
|
+
exports.configureFormsApi = configureFormsApi;
|
|
1475
|
+
exports.defineForm = defineForm;
|
|
1476
|
+
exports.field = field;
|
|
1477
|
+
exports.formsApi = formsApi;
|
|
1478
|
+
exports.initializeForms = initializeForms;
|
|
1184
1479
|
exports.useForm = useForm;
|
|
1185
1480
|
exports.useFormTracking = useFormTracking;
|
|
1186
1481
|
//# sourceMappingURL=index.js.map
|