@sonordev/site-kit 1.5.5 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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-UHWXXCAX.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
- package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
- package/dist/{EngageWidget-CVZMTSB6.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-XWWBUC2I.js → chunk-6ZGM7S5O.js} +77 -61
- 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-ELDJDBQL.js → chunk-A7RCX6OI.js} +7 -7
- package/dist/chunk-A7RCX6OI.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-N24BPFF6.mjs → chunk-CU6OGBKK.mjs} +6 -6
- package/dist/chunk-CU6OGBKK.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-DY4K6X3A.js → chunk-GCPPXUAI.js} +6 -6
- package/dist/chunk-GCPPXUAI.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-GJD4CFHN.js → chunk-ITPVKQB6.js} +78 -8
- package/dist/chunk-ITPVKQB6.js.map +1 -0
- package/dist/{chunk-NRNK7LXK.mjs → chunk-IYQUFQYM.mjs} +4 -4
- package/dist/chunk-IYQUFQYM.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-M5FLRLHI.mjs → chunk-L7XPPFSS.mjs} +3 -3
- package/dist/chunk-L7XPPFSS.mjs.map +1 -0
- package/dist/{chunk-FVCQBTNK.mjs → chunk-MSRLAD7F.mjs} +77 -61
- package/dist/chunk-MSRLAD7F.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-KJN2C6YE.js → chunk-PKUTYMN7.js} +5 -5
- package/dist/chunk-PKUTYMN7.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-FMB2RZDH.mjs → chunk-TUFP3FGI.mjs} +5 -5
- package/dist/chunk-TUFP3FGI.mjs.map +1 -0
- package/dist/{chunk-WW7UM7XY.js → chunk-TZAD7CZD.js} +424 -428
- package/dist/chunk-TZAD7CZD.js.map +1 -0
- package/dist/{chunk-TXZNP76P.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-PTTDKFL7.js → chunk-VU4GL5ZG.js} +5 -5
- package/dist/chunk-VU4GL5ZG.js.map +1 -0
- package/dist/{chunk-X4J33XQD.js → chunk-W6K7MQCC.js} +6 -6
- package/dist/chunk-W6K7MQCC.js.map +1 -0
- package/dist/{chunk-IJ2LWZID.js → chunk-WETCVFIK.js} +85 -73
- package/dist/chunk-WETCVFIK.js.map +1 -0
- package/dist/{chunk-VNAJQKYG.mjs → chunk-WN2PUL6B.mjs} +13 -15
- package/dist/chunk-WN2PUL6B.mjs.map +1 -0
- package/dist/{chunk-FI2ME55T.mjs → chunk-Z6EHHJWU.mjs} +78 -8
- package/dist/chunk-Z6EHHJWU.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.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 +5 -5
- package/dist/llms/index.d.ts +5 -5
- 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-COVFLFZ2.mjs → server-api-O7SSHYQS.mjs} +3 -3
- package/dist/{server-api-COVFLFZ2.mjs.map → server-api-O7SSHYQS.mjs.map} +1 -1
- package/dist/{server-api-XGKRGUMG.js → server-api-W4BXUFCT.js} +21 -21
- package/dist/{server-api-XGKRGUMG.js.map → server-api-W4BXUFCT.js.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.d.mts +28 -2
- package/dist/sitemap/index.d.ts +28 -2
- package/dist/sitemap/index.js +38 -9
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +36 -8
- 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-Blb2QNkV.d.mts → types-BxzT7yhf.d.mts} +22 -1
- package/dist/{types-Blb2QNkV.d.ts → types-BxzT7yhf.d.ts} +22 -1
- package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.mts} +2 -2
- package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.ts} +2 -2
- package/package.json +4 -12
- package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
- package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
- package/dist/EngageWidget-CVZMTSB6.mjs +0 -4
- package/dist/EngageWidget-UHWXXCAX.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-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-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-FVCQBTNK.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-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-TXZNP76P.js.map +0 -1
- package/dist/chunk-VNAJQKYG.mjs.map +0 -1
- package/dist/chunk-VZMDH3R4.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-XWWBUC2I.js.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.mjs
CHANGED
|
@@ -1,9 +1,319 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
export { configureFormsApi, defineForm, field, formsApi, initializeForms } from '../chunk-S7FRYNSU.mjs';
|
|
3
2
|
import '../chunk-4XPGGLVP.mjs';
|
|
4
3
|
import { useRef, useEffect, useCallback, useState, useMemo } from 'react';
|
|
5
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
5
|
|
|
6
|
+
// src/forms/formsApi.ts
|
|
7
|
+
var config = null;
|
|
8
|
+
function configureFormsApi(options) {
|
|
9
|
+
config = options;
|
|
10
|
+
}
|
|
11
|
+
function getConfig() {
|
|
12
|
+
if (config) return config;
|
|
13
|
+
if (typeof window !== "undefined") {
|
|
14
|
+
const apiUrl = window.__SITE_KIT_API_URL__;
|
|
15
|
+
const apiKey = window.__SITE_KIT_API_KEY__;
|
|
16
|
+
if (apiUrl && apiKey) {
|
|
17
|
+
return { baseUrl: apiUrl, apiKey };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
throw new Error(
|
|
21
|
+
"Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first."
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
async function apiRequest(method, path, body) {
|
|
25
|
+
const { baseUrl, apiKey, getAuthToken } = getConfig();
|
|
26
|
+
const headers = {
|
|
27
|
+
"Content-Type": "application/json"
|
|
28
|
+
};
|
|
29
|
+
if (apiKey) {
|
|
30
|
+
headers["x-api-key"] = apiKey;
|
|
31
|
+
} else if (getAuthToken) {
|
|
32
|
+
const token = await getAuthToken();
|
|
33
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
34
|
+
}
|
|
35
|
+
const response = await fetch(`${baseUrl}${path}`, {
|
|
36
|
+
method,
|
|
37
|
+
headers,
|
|
38
|
+
body: body ? JSON.stringify(body) : void 0
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
42
|
+
throw new Error(error.message || `API error: ${response.status}`);
|
|
43
|
+
}
|
|
44
|
+
if (response.status === 204) {
|
|
45
|
+
return void 0;
|
|
46
|
+
}
|
|
47
|
+
return response.json();
|
|
48
|
+
}
|
|
49
|
+
var formsApi = {
|
|
50
|
+
/**
|
|
51
|
+
* List all forms for a project
|
|
52
|
+
*/
|
|
53
|
+
async list(options = {}) {
|
|
54
|
+
const params = new URLSearchParams();
|
|
55
|
+
if (options.projectId) params.set("projectId", options.projectId);
|
|
56
|
+
if (options.formType) params.set("formType", options.formType);
|
|
57
|
+
if (options.isActive !== void 0) params.set("isActive", String(options.isActive));
|
|
58
|
+
if (options.search) params.set("search", options.search);
|
|
59
|
+
const query = params.toString();
|
|
60
|
+
const result = await apiRequest("GET", `/forms${query ? `?${query}` : ""}`);
|
|
61
|
+
return result.data;
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Get a single form by ID or slug
|
|
65
|
+
*/
|
|
66
|
+
async get(idOrSlug) {
|
|
67
|
+
return apiRequest("GET", `/forms/${idOrSlug}`);
|
|
68
|
+
},
|
|
69
|
+
/**
|
|
70
|
+
* Create a new form
|
|
71
|
+
*/
|
|
72
|
+
async create(input) {
|
|
73
|
+
return apiRequest("POST", "/forms", input);
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Update an existing form
|
|
77
|
+
*/
|
|
78
|
+
async update(id, input) {
|
|
79
|
+
return apiRequest("PUT", `/forms/${id}`, input);
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Delete a form
|
|
83
|
+
*/
|
|
84
|
+
async delete(id) {
|
|
85
|
+
return apiRequest("DELETE", `/forms/${id}`);
|
|
86
|
+
},
|
|
87
|
+
/**
|
|
88
|
+
* Add a field to an existing form
|
|
89
|
+
*/
|
|
90
|
+
async addField(formId, field2) {
|
|
91
|
+
const form = await formsApi.get(formId);
|
|
92
|
+
const maxSortOrder = Math.max(0, ...(form.fields || []).map((f) => f.sortOrder || 0));
|
|
93
|
+
return formsApi.update(formId, {
|
|
94
|
+
fields: [
|
|
95
|
+
...form.fields || [],
|
|
96
|
+
{ ...field2, sortOrder: field2.sortOrder ?? maxSortOrder + 1 }
|
|
97
|
+
]
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
/**
|
|
101
|
+
* Update a field in an existing form
|
|
102
|
+
*/
|
|
103
|
+
async updateField(formId, fieldSlug, updates) {
|
|
104
|
+
const form = await formsApi.get(formId);
|
|
105
|
+
return formsApi.update(formId, {
|
|
106
|
+
fields: (form.fields || []).map(
|
|
107
|
+
(f) => f.slug === fieldSlug ? { ...f, ...updates } : f
|
|
108
|
+
)
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
/**
|
|
112
|
+
* Remove a field from a form
|
|
113
|
+
*/
|
|
114
|
+
async removeField(formId, fieldSlug) {
|
|
115
|
+
const form = await formsApi.get(formId);
|
|
116
|
+
return formsApi.update(formId, {
|
|
117
|
+
fields: (form.fields || []).filter((f) => f.slug !== fieldSlug)
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* Reorder fields in a form
|
|
122
|
+
*/
|
|
123
|
+
async reorderFields(formId, fieldSlugs) {
|
|
124
|
+
const form = await formsApi.get(formId);
|
|
125
|
+
const fieldsMap = new Map((form.fields || []).map((f) => [f.slug, f]));
|
|
126
|
+
const orderedFields = fieldSlugs.map((slug, index) => {
|
|
127
|
+
const field2 = fieldsMap.get(slug);
|
|
128
|
+
if (!field2) throw new Error(`Field not found: ${slug}`);
|
|
129
|
+
return { ...field2, sortOrder: index };
|
|
130
|
+
});
|
|
131
|
+
return formsApi.update(formId, { fields: orderedFields });
|
|
132
|
+
},
|
|
133
|
+
/**
|
|
134
|
+
* Clone a form
|
|
135
|
+
*/
|
|
136
|
+
async clone(formId, newSlug, newName) {
|
|
137
|
+
const form = await formsApi.get(formId);
|
|
138
|
+
return formsApi.create({
|
|
139
|
+
projectId: form.projectId,
|
|
140
|
+
slug: newSlug,
|
|
141
|
+
name: newName || `${form.name} (Copy)`,
|
|
142
|
+
description: form.description,
|
|
143
|
+
formType: form.formType,
|
|
144
|
+
successMessage: form.successMessage,
|
|
145
|
+
redirectUrl: form.redirectUrl,
|
|
146
|
+
notificationEmails: form.notificationEmails,
|
|
147
|
+
submitButtonText: form.submitButtonText,
|
|
148
|
+
layout: form.layout,
|
|
149
|
+
showProgress: form.showProgress,
|
|
150
|
+
enableSaveDraft: form.enableSaveDraft,
|
|
151
|
+
isActive: false,
|
|
152
|
+
// Clone as inactive
|
|
153
|
+
fields: (form.fields || []).map(({ id, ...field2 }) => field2),
|
|
154
|
+
// Remove IDs
|
|
155
|
+
steps: (form.steps || []).map(({ id, ...step }) => step)
|
|
156
|
+
// Remove IDs
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
/**
|
|
160
|
+
* Activate or deactivate a form
|
|
161
|
+
*/
|
|
162
|
+
async setActive(formId, isActive) {
|
|
163
|
+
return formsApi.update(formId, { isActive });
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Sync a form definition to the backend
|
|
167
|
+
* Creates the form if it doesn't exist, updates if it does
|
|
168
|
+
* Perfect for defining forms in code during development
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```tsx
|
|
172
|
+
* // In your app initialization or form component
|
|
173
|
+
* await formsApi.sync({
|
|
174
|
+
* slug: 'contact',
|
|
175
|
+
* name: 'Contact Form',
|
|
176
|
+
* formType: 'prospect',
|
|
177
|
+
* fields: [
|
|
178
|
+
* field.text('name', 'Your Name', { isRequired: true }),
|
|
179
|
+
* field.email('email', 'Email Address'),
|
|
180
|
+
* field.phone('phone', 'Phone Number'),
|
|
181
|
+
* field.textarea('message', 'Message'),
|
|
182
|
+
* ]
|
|
183
|
+
* })
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
async sync(input) {
|
|
187
|
+
return apiRequest(
|
|
188
|
+
"POST",
|
|
189
|
+
"/api/public/forms/sync",
|
|
190
|
+
input
|
|
191
|
+
);
|
|
192
|
+
},
|
|
193
|
+
/**
|
|
194
|
+
* Sync multiple forms at once
|
|
195
|
+
* Useful for initializing all forms in your app
|
|
196
|
+
*/
|
|
197
|
+
async syncAll(forms) {
|
|
198
|
+
return Promise.all(forms.map((form) => formsApi.sync(form)));
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
var field = {
|
|
202
|
+
text: (slug, label, options) => ({
|
|
203
|
+
slug,
|
|
204
|
+
label,
|
|
205
|
+
fieldType: "text",
|
|
206
|
+
...options
|
|
207
|
+
}),
|
|
208
|
+
email: (slug, label, options) => ({
|
|
209
|
+
slug,
|
|
210
|
+
label,
|
|
211
|
+
fieldType: "email",
|
|
212
|
+
isRequired: true,
|
|
213
|
+
...options
|
|
214
|
+
}),
|
|
215
|
+
phone: (slug, label, options) => ({
|
|
216
|
+
slug,
|
|
217
|
+
label,
|
|
218
|
+
fieldType: "phone",
|
|
219
|
+
...options
|
|
220
|
+
}),
|
|
221
|
+
textarea: (slug, label, options) => ({
|
|
222
|
+
slug,
|
|
223
|
+
label,
|
|
224
|
+
fieldType: "textarea",
|
|
225
|
+
...options
|
|
226
|
+
}),
|
|
227
|
+
select: (slug, label, choices, options) => ({
|
|
228
|
+
slug,
|
|
229
|
+
label,
|
|
230
|
+
fieldType: "select",
|
|
231
|
+
options: choices,
|
|
232
|
+
...options
|
|
233
|
+
}),
|
|
234
|
+
radio: (slug, label, choices, options) => ({
|
|
235
|
+
slug,
|
|
236
|
+
label,
|
|
237
|
+
fieldType: "radio",
|
|
238
|
+
options: choices,
|
|
239
|
+
...options
|
|
240
|
+
}),
|
|
241
|
+
checkbox: (slug, label, options) => ({
|
|
242
|
+
slug,
|
|
243
|
+
label,
|
|
244
|
+
fieldType: "checkbox",
|
|
245
|
+
...options
|
|
246
|
+
}),
|
|
247
|
+
date: (slug, label, options) => ({
|
|
248
|
+
slug,
|
|
249
|
+
label,
|
|
250
|
+
fieldType: "date",
|
|
251
|
+
...options
|
|
252
|
+
}),
|
|
253
|
+
number: (slug, label, options) => ({
|
|
254
|
+
slug,
|
|
255
|
+
label,
|
|
256
|
+
fieldType: "number",
|
|
257
|
+
...options
|
|
258
|
+
}),
|
|
259
|
+
rating: (slug, label, options) => ({
|
|
260
|
+
slug,
|
|
261
|
+
label,
|
|
262
|
+
fieldType: "rating",
|
|
263
|
+
...options
|
|
264
|
+
}),
|
|
265
|
+
file: (slug, label, options) => ({
|
|
266
|
+
slug,
|
|
267
|
+
label,
|
|
268
|
+
fieldType: "file",
|
|
269
|
+
...options
|
|
270
|
+
}),
|
|
271
|
+
hidden: (slug, defaultValue) => ({
|
|
272
|
+
slug,
|
|
273
|
+
label: "",
|
|
274
|
+
fieldType: "hidden",
|
|
275
|
+
defaultValue
|
|
276
|
+
}),
|
|
277
|
+
heading: (slug, label) => ({
|
|
278
|
+
slug,
|
|
279
|
+
label,
|
|
280
|
+
fieldType: "heading"
|
|
281
|
+
}),
|
|
282
|
+
paragraph: (slug, label) => ({
|
|
283
|
+
slug,
|
|
284
|
+
label,
|
|
285
|
+
fieldType: "paragraph"
|
|
286
|
+
})
|
|
287
|
+
};
|
|
288
|
+
function defineForm(definition) {
|
|
289
|
+
const fieldsWithOrder = definition.fields.map((f, index) => ({
|
|
290
|
+
...f,
|
|
291
|
+
sortOrder: f.sortOrder ?? index
|
|
292
|
+
}));
|
|
293
|
+
return {
|
|
294
|
+
...definition,
|
|
295
|
+
fields: fieldsWithOrder,
|
|
296
|
+
formType: definition.formType || "contact",
|
|
297
|
+
successMessage: definition.successMessage || "Thank you for your submission!",
|
|
298
|
+
submitButtonText: definition.submitButtonText || "Submit",
|
|
299
|
+
layout: definition.layout || "stacked",
|
|
300
|
+
isActive: definition.isActive ?? true
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async function initializeForms(forms) {
|
|
304
|
+
if (typeof window === "undefined") {
|
|
305
|
+
console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map((f) => f.slug).join(", ")}`);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
const results = await formsApi.syncAll(forms);
|
|
310
|
+
const created = results.filter((r) => r.created).length;
|
|
311
|
+
const updated = results.filter((r) => r.updated).length;
|
|
312
|
+
console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`);
|
|
313
|
+
} catch (error) {
|
|
314
|
+
console.error("[Site-Kit] Failed to sync forms:", error);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
7
317
|
function useFormTracking({
|
|
8
318
|
formId,
|
|
9
319
|
totalSteps,
|
|
@@ -463,7 +773,7 @@ function useForm(formIdOrSlug, options = {}) {
|
|
|
463
773
|
const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
|
|
464
774
|
const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
|
|
465
775
|
if (!apiKey) {
|
|
466
|
-
throw new Error("API key is required. Set SONOR_API_KEY
|
|
776
|
+
throw new Error("API key is required. Set SONOR_API_KEY in your .env");
|
|
467
777
|
}
|
|
468
778
|
const honeypotFieldName = form.honeypot_field || "website";
|
|
469
779
|
const recaptchaToken = form.recaptcha_enabled ? await getRecaptchaToken(form.recaptcha_site_key) : null;
|
|
@@ -481,7 +791,7 @@ function useForm(formIdOrSlug, options = {}) {
|
|
|
481
791
|
pageUrl: typeof window !== "undefined" ? window.location.href : null,
|
|
482
792
|
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
483
793
|
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
|
|
484
|
-
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("
|
|
794
|
+
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null,
|
|
485
795
|
recaptchaToken: recaptchaToken || void 0,
|
|
486
796
|
utmSource: utm.utm_source,
|
|
487
797
|
utmMedium: utm.utm_medium,
|
|
@@ -569,32 +879,32 @@ function normalizeOptions(options) {
|
|
|
569
879
|
}
|
|
570
880
|
return [];
|
|
571
881
|
}
|
|
572
|
-
function FormField({ field: field2, value, error, onChange, classPrefix = "
|
|
573
|
-
const inputId = `
|
|
882
|
+
function FormField({ field: field2, value, error, onChange, classPrefix = "sk-form" }) {
|
|
883
|
+
const inputId = `sk-${field2.id || field2.slug}`;
|
|
574
884
|
const options = normalizeOptions(field2.options);
|
|
575
885
|
const baseInputStyle = {
|
|
576
886
|
width: "100%",
|
|
577
|
-
padding: "var(--
|
|
578
|
-
fontSize: "var(--
|
|
579
|
-
border: error ? "1px solid var(--
|
|
580
|
-
borderRadius: "var(--
|
|
581
|
-
backgroundColor: "var(--
|
|
887
|
+
padding: "var(--sk-input-padding, 10px 12px)",
|
|
888
|
+
fontSize: "var(--sk-font-size, 16px)",
|
|
889
|
+
border: error ? "1px solid var(--sk-input-border-error, #ef4444)" : "1px solid var(--sk-input-border, #d1d5db)",
|
|
890
|
+
borderRadius: "var(--sk-input-radius, 6px)",
|
|
891
|
+
backgroundColor: "var(--sk-input-bg, #ffffff)",
|
|
582
892
|
outline: "none",
|
|
583
893
|
fontFamily: "inherit"
|
|
584
894
|
};
|
|
585
895
|
const labelStyle = {
|
|
586
896
|
display: "block",
|
|
587
897
|
marginBottom: 6,
|
|
588
|
-
fontWeight: "var(--
|
|
589
|
-
color: "var(--
|
|
898
|
+
fontWeight: "var(--sk-label-weight, 500)",
|
|
899
|
+
color: "var(--sk-label-color, inherit)"
|
|
590
900
|
};
|
|
591
901
|
const errorStyle = {
|
|
592
|
-
color: "var(--
|
|
902
|
+
color: "var(--sk-error, #ef4444)",
|
|
593
903
|
fontSize: 14,
|
|
594
904
|
marginTop: 4
|
|
595
905
|
};
|
|
596
906
|
const helpStyle = {
|
|
597
|
-
color: "var(--
|
|
907
|
+
color: "var(--sk-text-tertiary, #6b7280)",
|
|
598
908
|
fontSize: 14,
|
|
599
909
|
marginTop: 4
|
|
600
910
|
};
|
|
@@ -602,7 +912,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
602
912
|
return /* @__PURE__ */ jsx("h3", { className: `${classPrefix}__heading`, style: { margin: "16px 0 8px", fontWeight: 600, fontSize: 18 }, children: field2.label });
|
|
603
913
|
}
|
|
604
914
|
if (field2.field_type === "paragraph") {
|
|
605
|
-
return /* @__PURE__ */ jsx("p", { className: `${classPrefix}__paragraph`, style: { color: "var(--
|
|
915
|
+
return /* @__PURE__ */ jsx("p", { className: `${classPrefix}__paragraph`, style: { color: "var(--sk-text-tertiary, #6b7280)", margin: "8px 0" }, children: field2.help_text || field2.label });
|
|
606
916
|
}
|
|
607
917
|
if (field2.field_type === "hidden") {
|
|
608
918
|
return /* @__PURE__ */ jsx("input", { type: "hidden", name: field2.slug, value: String(value || "") });
|
|
@@ -612,7 +922,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
612
922
|
return /* @__PURE__ */ jsxs("div", { className: `${classPrefix}__field ${classPrefix}__field--${field2.field_type}`, children: [
|
|
613
923
|
/* @__PURE__ */ 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: [
|
|
614
924
|
field2.label,
|
|
615
|
-
field2.is_required && /* @__PURE__ */ jsx("span", { style: { color: "var(--
|
|
925
|
+
field2.is_required && /* @__PURE__ */ jsx("span", { style: { color: "var(--sk-error, #ef4444)" }, children: " *" })
|
|
616
926
|
] }),
|
|
617
927
|
["text", "email", "phone", "tel", "number"].includes(field2.field_type) && /* @__PURE__ */ jsx(
|
|
618
928
|
"input",
|
|
@@ -788,7 +1098,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
788
1098
|
border: "none",
|
|
789
1099
|
fontSize: 24,
|
|
790
1100
|
cursor: "pointer",
|
|
791
|
-
color: value >= star ? "var(--
|
|
1101
|
+
color: value >= star ? "var(--sk-rating-active, #fbbf24)" : "var(--sk-rating-inactive, #d1d5db)"
|
|
792
1102
|
},
|
|
793
1103
|
children: "\u2605"
|
|
794
1104
|
},
|
|
@@ -815,7 +1125,7 @@ function FormField({ field: field2, value, error, onChange, classPrefix = "uptra
|
|
|
815
1125
|
] });
|
|
816
1126
|
}
|
|
817
1127
|
function FormClient({
|
|
818
|
-
config,
|
|
1128
|
+
config: config2,
|
|
819
1129
|
className,
|
|
820
1130
|
onSuccess,
|
|
821
1131
|
onError,
|
|
@@ -827,19 +1137,19 @@ function FormClient({
|
|
|
827
1137
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
828
1138
|
const [isComplete, setIsComplete] = useState(false);
|
|
829
1139
|
const [honeypotValue, setHoneypotValue] = useState("");
|
|
830
|
-
const honeypotFieldName =
|
|
1140
|
+
const honeypotFieldName = config2.honeypot_field || "website";
|
|
831
1141
|
const { trackStepChange, trackComplete } = useFormTracking({
|
|
832
|
-
formId:
|
|
833
|
-
totalSteps:
|
|
1142
|
+
formId: config2.id,
|
|
1143
|
+
totalSteps: config2.total_steps
|
|
834
1144
|
});
|
|
835
1145
|
const currentFields = useMemo(() => {
|
|
836
|
-
if (!
|
|
837
|
-
return
|
|
1146
|
+
if (!config2.is_multi_step) {
|
|
1147
|
+
return config2.fields || [];
|
|
838
1148
|
}
|
|
839
|
-
const currentStepConfig =
|
|
840
|
-
if (!currentStepConfig) return
|
|
841
|
-
return (
|
|
842
|
-
}, [
|
|
1149
|
+
const currentStepConfig = config2.steps?.find((s) => s.step_number === step);
|
|
1150
|
+
if (!currentStepConfig) return config2.fields || [];
|
|
1151
|
+
return (config2.fields || []).filter((f) => f.step_id === currentStepConfig.id);
|
|
1152
|
+
}, [config2, step]);
|
|
843
1153
|
const isFieldVisible = useCallback((field2) => {
|
|
844
1154
|
if (!field2.conditional?.show_when) return true;
|
|
845
1155
|
const { field: condField, operator, value } = field2.conditional.show_when;
|
|
@@ -921,14 +1231,14 @@ function FormClient({
|
|
|
921
1231
|
}, [errors]);
|
|
922
1232
|
const nextStep = useCallback(() => {
|
|
923
1233
|
if (!validateStep()) return false;
|
|
924
|
-
if (step <
|
|
1234
|
+
if (step < config2.total_steps) {
|
|
925
1235
|
const newStep = step + 1;
|
|
926
1236
|
setStep(newStep);
|
|
927
1237
|
trackStepChange(newStep);
|
|
928
1238
|
return true;
|
|
929
1239
|
}
|
|
930
1240
|
return false;
|
|
931
|
-
}, [step,
|
|
1241
|
+
}, [step, config2.total_steps, validateStep, trackStepChange]);
|
|
932
1242
|
const prevStep = useCallback(() => {
|
|
933
1243
|
if (step > 1) {
|
|
934
1244
|
const newStep = step - 1;
|
|
@@ -937,11 +1247,11 @@ function FormClient({
|
|
|
937
1247
|
}
|
|
938
1248
|
}, [step, trackStepChange]);
|
|
939
1249
|
const goToStep = useCallback((targetStep) => {
|
|
940
|
-
if (targetStep >= 1 && targetStep <=
|
|
1250
|
+
if (targetStep >= 1 && targetStep <= config2.total_steps) {
|
|
941
1251
|
setStep(targetStep);
|
|
942
1252
|
trackStepChange(targetStep);
|
|
943
1253
|
}
|
|
944
|
-
}, [
|
|
1254
|
+
}, [config2.total_steps, trackStepChange]);
|
|
945
1255
|
const submit = useCallback(async () => {
|
|
946
1256
|
if (!validateStep()) return;
|
|
947
1257
|
setIsSubmitting(true);
|
|
@@ -949,27 +1259,27 @@ function FormClient({
|
|
|
949
1259
|
const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
|
|
950
1260
|
const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
|
|
951
1261
|
if (!apiKey) {
|
|
952
|
-
throw new Error("API key is required. Set SONOR_API_KEY
|
|
1262
|
+
throw new Error("API key is required. Set SONOR_API_KEY in your .env");
|
|
953
1263
|
}
|
|
954
|
-
const recaptchaToken =
|
|
955
|
-
if (
|
|
1264
|
+
const recaptchaToken = config2.recaptcha_enabled ? await getRecaptchaToken(config2.recaptcha_site_key) : null;
|
|
1265
|
+
if (config2.recaptcha_enabled && !recaptchaToken) {
|
|
956
1266
|
throw new Error("reCAPTCHA is required but could not be initialized.");
|
|
957
1267
|
}
|
|
958
1268
|
const utm = getUTMParams2();
|
|
959
1269
|
const submission = {
|
|
960
|
-
form_id:
|
|
961
|
-
project_id:
|
|
1270
|
+
form_id: config2.id,
|
|
1271
|
+
project_id: config2.project_id,
|
|
962
1272
|
data: {
|
|
963
1273
|
...values,
|
|
964
|
-
...
|
|
1274
|
+
...config2.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}
|
|
965
1275
|
},
|
|
966
|
-
routing_type:
|
|
1276
|
+
routing_type: config2.form_type,
|
|
967
1277
|
status: "new",
|
|
968
1278
|
metadata: {
|
|
969
1279
|
pageUrl: typeof window !== "undefined" ? window.location.href : null,
|
|
970
1280
|
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
971
1281
|
userAgent: typeof navigator !== "undefined" ? navigator.userAgent : null,
|
|
972
|
-
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("
|
|
1282
|
+
sessionId: typeof sessionStorage !== "undefined" ? sessionStorage.getItem("_sk_sid") : null,
|
|
973
1283
|
recaptchaToken: recaptchaToken || void 0,
|
|
974
1284
|
utmSource: utm.utm_source,
|
|
975
1285
|
utmMedium: utm.utm_medium,
|
|
@@ -992,8 +1302,8 @@ function FormClient({
|
|
|
992
1302
|
trackComplete();
|
|
993
1303
|
setIsComplete(true);
|
|
994
1304
|
onSuccess?.(data);
|
|
995
|
-
if (
|
|
996
|
-
window.location.href =
|
|
1305
|
+
if (config2.redirect_url) {
|
|
1306
|
+
window.location.href = config2.redirect_url;
|
|
997
1307
|
}
|
|
998
1308
|
} catch (error) {
|
|
999
1309
|
console.error("[Forms] Submission error:", error);
|
|
@@ -1001,15 +1311,15 @@ function FormClient({
|
|
|
1001
1311
|
} finally {
|
|
1002
1312
|
setIsSubmitting(false);
|
|
1003
1313
|
}
|
|
1004
|
-
}, [
|
|
1314
|
+
}, [config2, honeypotFieldName, honeypotValue, values, validateStep, trackComplete, onSuccess, onError]);
|
|
1005
1315
|
const progress = useMemo(() => {
|
|
1006
|
-
return Math.round(step /
|
|
1007
|
-
}, [step,
|
|
1316
|
+
return Math.round(step / config2.total_steps * 100);
|
|
1317
|
+
}, [step, config2.total_steps]);
|
|
1008
1318
|
const renderProps = {
|
|
1009
|
-
config,
|
|
1319
|
+
config: config2,
|
|
1010
1320
|
fields: currentFields,
|
|
1011
1321
|
step,
|
|
1012
|
-
totalSteps:
|
|
1322
|
+
totalSteps: config2.total_steps,
|
|
1013
1323
|
values,
|
|
1014
1324
|
errors,
|
|
1015
1325
|
isSubmitting,
|
|
@@ -1022,7 +1332,7 @@ function FormClient({
|
|
|
1022
1332
|
isFieldVisible
|
|
1023
1333
|
};
|
|
1024
1334
|
if (isComplete) {
|
|
1025
|
-
return /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsx("p", { children:
|
|
1335
|
+
return /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsx("p", { children: config2.success_message }) });
|
|
1026
1336
|
}
|
|
1027
1337
|
if (customRender) {
|
|
1028
1338
|
return /* @__PURE__ */ jsx(Fragment, { children: customRender(renderProps) });
|
|
@@ -1030,44 +1340,44 @@ function FormClient({
|
|
|
1030
1340
|
return /* @__PURE__ */ jsxs(
|
|
1031
1341
|
"form",
|
|
1032
1342
|
{
|
|
1033
|
-
className: `
|
|
1343
|
+
className: `sk-form ${className || ""}`,
|
|
1034
1344
|
onSubmit: (e) => {
|
|
1035
1345
|
e.preventDefault();
|
|
1036
|
-
if (step <
|
|
1346
|
+
if (step < config2.total_steps) {
|
|
1037
1347
|
nextStep();
|
|
1038
1348
|
} else {
|
|
1039
1349
|
submit();
|
|
1040
1350
|
}
|
|
1041
1351
|
},
|
|
1042
1352
|
children: [
|
|
1043
|
-
|
|
1044
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
1045
|
-
/* @__PURE__ */ jsxs("span", { className: "
|
|
1353
|
+
config2.is_multi_step && /* @__PURE__ */ jsxs("div", { className: "sk-form__progress", style: { marginBottom: 20 }, children: [
|
|
1354
|
+
/* @__PURE__ */ jsxs("div", { className: "sk-form__progress-header", style: { display: "flex", justifyContent: "space-between", marginBottom: 8 }, children: [
|
|
1355
|
+
/* @__PURE__ */ jsxs("span", { className: "sk-form__progress-step", children: [
|
|
1046
1356
|
"Step ",
|
|
1047
1357
|
step,
|
|
1048
1358
|
" of ",
|
|
1049
|
-
|
|
1359
|
+
config2.total_steps
|
|
1050
1360
|
] }),
|
|
1051
|
-
/* @__PURE__ */ jsxs("span", { className: "
|
|
1361
|
+
/* @__PURE__ */ jsxs("span", { className: "sk-form__progress-percent", children: [
|
|
1052
1362
|
progress,
|
|
1053
1363
|
"%"
|
|
1054
1364
|
] })
|
|
1055
1365
|
] }),
|
|
1056
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
1366
|
+
/* @__PURE__ */ jsx("div", { className: "sk-form__progress-track", style: {
|
|
1057
1367
|
height: 4,
|
|
1058
|
-
backgroundColor: "var(--
|
|
1368
|
+
backgroundColor: "var(--sk-progress-bg, #e5e7eb)",
|
|
1059
1369
|
borderRadius: 2,
|
|
1060
1370
|
overflow: "hidden"
|
|
1061
|
-
}, children: /* @__PURE__ */ jsx("div", { className: "
|
|
1371
|
+
}, children: /* @__PURE__ */ jsx("div", { className: "sk-form__progress-bar", style: {
|
|
1062
1372
|
width: `${progress}%`,
|
|
1063
1373
|
height: "100%",
|
|
1064
|
-
backgroundColor: "var(--
|
|
1374
|
+
backgroundColor: "var(--sk-progress-fill, #3b82f6)",
|
|
1065
1375
|
transition: "width 0.3s ease"
|
|
1066
1376
|
} }) })
|
|
1067
1377
|
] }),
|
|
1068
|
-
/* @__PURE__ */ jsx("div", { className: "
|
|
1378
|
+
/* @__PURE__ */ jsx("div", { className: "sk-form__fields", children: currentFields.map((field2) => {
|
|
1069
1379
|
if (!isFieldVisible(field2)) return null;
|
|
1070
|
-
return /* @__PURE__ */ jsx("div", { className: `
|
|
1380
|
+
return /* @__PURE__ */ jsx("div", { className: `sk-form__field-wrapper sk-form__field-wrapper--${field2.width || "full"}`, children: /* @__PURE__ */ jsx(
|
|
1071
1381
|
FormField,
|
|
1072
1382
|
{
|
|
1073
1383
|
field: field2,
|
|
@@ -1077,15 +1387,15 @@ function FormClient({
|
|
|
1077
1387
|
}
|
|
1078
1388
|
) }, field2.id);
|
|
1079
1389
|
}) }),
|
|
1080
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
1390
|
+
/* @__PURE__ */ jsxs("div", { className: "sk-form__actions", style: {
|
|
1081
1391
|
display: "flex",
|
|
1082
1392
|
justifyContent: step > 1 ? "space-between" : "flex-end",
|
|
1083
1393
|
marginTop: 24
|
|
1084
1394
|
}, children: [
|
|
1085
|
-
step > 1 && /* @__PURE__ */ jsx("button", { type: "button", className: "
|
|
1086
|
-
/* @__PURE__ */ jsx("button", { type: "submit", className: "
|
|
1395
|
+
step > 1 && /* @__PURE__ */ jsx("button", { type: "button", className: "sk-form__btn sk-form__btn--back", onClick: prevStep, children: "Back" }),
|
|
1396
|
+
/* @__PURE__ */ 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 })
|
|
1087
1397
|
] }),
|
|
1088
|
-
|
|
1398
|
+
config2.honeypot_enabled && /* @__PURE__ */ jsx(
|
|
1089
1399
|
"input",
|
|
1090
1400
|
{
|
|
1091
1401
|
type: "text",
|
|
@@ -1156,6 +1466,6 @@ function ManagedForm({
|
|
|
1156
1466
|
);
|
|
1157
1467
|
}
|
|
1158
1468
|
|
|
1159
|
-
export { FormClient, FormField as FormFieldComponent, ManagedForm, useForm, useFormTracking };
|
|
1469
|
+
export { FormClient, FormField as FormFieldComponent, ManagedForm, configureFormsApi, defineForm, field, formsApi, initializeForms, useForm, useFormTracking };
|
|
1160
1470
|
//# sourceMappingURL=index.mjs.map
|
|
1161
1471
|
//# sourceMappingURL=index.mjs.map
|