@sonordev/site-kit 3.4.0 → 3.6.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/README.md +2 -2
- package/agent-manifest.json +1 -1
- package/dist/AnalyticsProvider-GOLL2W6O.mjs +10 -0
- package/dist/{AnalyticsProvider-HIGSPNRA.mjs.map → AnalyticsProvider-GOLL2W6O.mjs.map} +1 -1
- package/dist/AnalyticsProvider-PK5E4TWJ.js +31 -0
- package/dist/{AnalyticsProvider-ARAWVJPX.js.map → AnalyticsProvider-PK5E4TWJ.js.map} +1 -1
- package/dist/ChatWidget-5RMDVEJL.js +19 -0
- package/dist/{ChatWidget-BDES6WUR.js.map → ChatWidget-5RMDVEJL.js.map} +1 -1
- package/dist/ChatWidget-LOZDGIVP.mjs +10 -0
- package/dist/{ChatWidget-47KAOFLG.mjs.map → ChatWidget-LOZDGIVP.mjs.map} +1 -1
- package/dist/EngageWidget-CYJK6RAJ.js +18 -0
- package/dist/{EngageWidget-X3NIWGMZ.js.map → EngageWidget-CYJK6RAJ.js.map} +1 -1
- package/dist/EngageWidget-HLJMP7MR.mjs +9 -0
- package/dist/{EngageWidget-HPZAI6SU.mjs.map → EngageWidget-HLJMP7MR.mjs.map} +1 -1
- package/dist/{SignalCore-K2CTZ52G.js → SignalCore-7SB26IPW.js} +11 -10
- package/dist/SignalCore-7SB26IPW.js.map +1 -0
- package/dist/{SignalCore-XABEH2GA.mjs → SignalCore-JPQMRYMF.mjs} +5 -4
- package/dist/SignalCore-JPQMRYMF.mjs.map +1 -0
- package/dist/SitemapSync-4UFM6LWW.mjs +8 -0
- package/dist/{SitemapSync-OQPRGBG3.mjs.map → SitemapSync-4UFM6LWW.mjs.map} +1 -1
- package/dist/SitemapSync-KIFK3OJO.js +17 -0
- package/dist/{SitemapSync-4BALOI4B.js.map → SitemapSync-KIFK3OJO.js.map} +1 -1
- package/dist/analytics/index.js +12 -11
- package/dist/analytics/index.mjs +5 -4
- package/dist/blog/index.d.mts +3 -3
- package/dist/blog/index.d.ts +3 -3
- package/dist/blog/index.js +11 -15
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +2 -2
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server-ui.d.mts +1 -1
- package/dist/blog/server-ui.d.ts +1 -1
- package/dist/blog/server-ui.js +198 -9
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +198 -2
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.mts +27 -8
- package/dist/blog/server.d.ts +27 -8
- package/dist/blog/server.js +45 -43
- package/dist/blog/server.mjs +3 -1
- package/dist/{chunk-WVAY4ZWC.mjs → chunk-253MGZYN.mjs} +10 -29
- package/dist/chunk-253MGZYN.mjs.map +1 -0
- package/dist/{chunk-WN5A3KSY.mjs → chunk-34IUDOBC.mjs} +2 -2
- package/dist/{chunk-WN5A3KSY.mjs.map → chunk-34IUDOBC.mjs.map} +1 -1
- package/dist/{chunk-56X3IUOL.js → chunk-3XQV5HDW.js} +12 -31
- package/dist/chunk-3XQV5HDW.js.map +1 -0
- package/dist/chunk-5BC7I3KH.mjs +134 -0
- package/dist/chunk-5BC7I3KH.mjs.map +1 -0
- package/dist/{chunk-O4RVFKQW.mjs → chunk-5WRJRJSM.mjs} +3 -3
- package/dist/{chunk-O4RVFKQW.mjs.map → chunk-5WRJRJSM.mjs.map} +1 -1
- package/dist/{chunk-7TX5BKVA.js → chunk-6T4NVCAT.js} +2 -2
- package/dist/{chunk-7TX5BKVA.js.map → chunk-6T4NVCAT.js.map} +1 -1
- package/dist/{chunk-E4VA4FYW.js → chunk-7F3RT2RX.js} +8 -8
- package/dist/{chunk-E4VA4FYW.js.map → chunk-7F3RT2RX.js.map} +1 -1
- package/dist/{chunk-C37DFD5F.js → chunk-7J47WT5V.js} +14 -14
- package/dist/{chunk-C37DFD5F.js.map → chunk-7J47WT5V.js.map} +1 -1
- package/dist/{chunk-MJV6RC7I.js → chunk-7ZY44LI4.js} +3 -3
- package/dist/{chunk-MJV6RC7I.js.map → chunk-7ZY44LI4.js.map} +1 -1
- package/dist/{chunk-WZHWWOUC.js → chunk-BX6FFL2Y.js} +6 -16
- package/dist/chunk-BX6FFL2Y.js.map +1 -0
- package/dist/chunk-BYW3MJ36.mjs +139 -0
- package/dist/chunk-BYW3MJ36.mjs.map +1 -0
- package/dist/{chunk-PYA4BR2N.mjs → chunk-C4JYWTI5.mjs} +3 -3
- package/dist/{chunk-PYA4BR2N.mjs.map → chunk-C4JYWTI5.mjs.map} +1 -1
- package/dist/{chunk-VE5XLADP.mjs → chunk-C7MKSHRI.mjs} +3 -3
- package/dist/{chunk-VE5XLADP.mjs.map → chunk-C7MKSHRI.mjs.map} +1 -1
- package/dist/chunk-CGCYZJYX.mjs +41 -0
- package/dist/chunk-CGCYZJYX.mjs.map +1 -0
- package/dist/{chunk-RMUOY6XB.js → chunk-CPYUZSJN.js} +7 -7
- package/dist/{chunk-RMUOY6XB.js.map → chunk-CPYUZSJN.js.map} +1 -1
- package/dist/{chunk-5WEADCND.mjs → chunk-DAVE4PEM.mjs} +4 -4
- package/dist/{chunk-5WEADCND.mjs.map → chunk-DAVE4PEM.mjs.map} +1 -1
- package/dist/{chunk-MCDQM75H.js → chunk-DF3MIQNB.js} +15 -15
- package/dist/{chunk-MCDQM75H.js.map → chunk-DF3MIQNB.js.map} +1 -1
- package/dist/{chunk-IB34IYMN.js → chunk-DLZEFUKB.js} +9 -9
- package/dist/{chunk-IB34IYMN.js.map → chunk-DLZEFUKB.js.map} +1 -1
- package/dist/chunk-FMUTOABC.js +129 -0
- package/dist/chunk-FMUTOABC.js.map +1 -0
- package/dist/{chunk-3SIIYHVE.mjs → chunk-GJSNM2A3.mjs} +4 -4
- package/dist/{chunk-3SIIYHVE.mjs.map → chunk-GJSNM2A3.mjs.map} +1 -1
- package/dist/{chunk-X4OPM3SK.mjs → chunk-GU5OTUQS.mjs} +5 -14
- package/dist/chunk-GU5OTUQS.mjs.map +1 -0
- package/dist/{chunk-SH4VZDVX.mjs → chunk-GUXB3QH7.mjs} +38 -67
- package/dist/chunk-GUXB3QH7.mjs.map +1 -0
- package/dist/{chunk-O7B7IEXY.js → chunk-JBRLJMXM.js} +14 -14
- package/dist/{chunk-O7B7IEXY.js.map → chunk-JBRLJMXM.js.map} +1 -1
- package/dist/{chunk-5SJKYZID.js → chunk-JZAKTBKV.js} +5 -5
- package/dist/{chunk-5SJKYZID.js.map → chunk-JZAKTBKV.js.map} +1 -1
- package/dist/chunk-K24NKI35.js +8 -0
- package/dist/{chunk-CDETOO5W.js.map → chunk-K24NKI35.js.map} +1 -1
- package/dist/{chunk-HV7IYMXK.js → chunk-KIUNFFDD.js} +13 -13
- package/dist/{chunk-HV7IYMXK.js.map → chunk-KIUNFFDD.js.map} +1 -1
- package/dist/{chunk-7523LJ52.js → chunk-KJD5UJ4C.js} +9 -9
- package/dist/{chunk-7523LJ52.js.map → chunk-KJD5UJ4C.js.map} +1 -1
- package/dist/chunk-KRZL6VYP.mjs +6 -0
- package/dist/{chunk-YCQHE2XT.mjs.map → chunk-KRZL6VYP.mjs.map} +1 -1
- package/dist/chunk-KTHQKVGZ.js +147 -0
- package/dist/chunk-KTHQKVGZ.js.map +1 -0
- package/dist/{chunk-BMKZHXWQ.js → chunk-MMON6EVI.js} +3 -194
- package/dist/chunk-MMON6EVI.js.map +1 -0
- package/dist/chunk-N5H6ORXN.mjs +35 -0
- package/dist/chunk-N5H6ORXN.mjs.map +1 -0
- package/dist/chunk-NB4MK2Q5.js +18 -0
- package/dist/chunk-NB4MK2Q5.js.map +1 -0
- package/dist/chunk-NI7OY4FW.mjs +16 -0
- package/dist/chunk-NI7OY4FW.mjs.map +1 -0
- package/dist/{chunk-7UYUVHCR.js → chunk-OIAAYRGO.js} +4 -4
- package/dist/{chunk-7UYUVHCR.js.map → chunk-OIAAYRGO.js.map} +1 -1
- package/dist/{chunk-IURQA3H5.mjs → chunk-QLBNK6WJ.mjs} +3 -3
- package/dist/{chunk-IURQA3H5.mjs.map → chunk-QLBNK6WJ.mjs.map} +1 -1
- package/dist/{chunk-6Q72JAL2.js → chunk-QO45Q7KW.js} +6 -6
- package/dist/{chunk-6Q72JAL2.js.map → chunk-QO45Q7KW.js.map} +1 -1
- package/dist/{chunk-VNQFKBKF.mjs → chunk-RHKFINCS.mjs} +3 -3
- package/dist/{chunk-VNQFKBKF.mjs.map → chunk-RHKFINCS.mjs.map} +1 -1
- package/dist/{chunk-LQHZFUZJ.mjs → chunk-RQV3FO33.mjs} +3 -3
- package/dist/{chunk-LQHZFUZJ.mjs.map → chunk-RQV3FO33.mjs.map} +1 -1
- package/dist/chunk-S32BEPZM.mjs +126 -0
- package/dist/chunk-S32BEPZM.mjs.map +1 -0
- package/dist/{chunk-472FTEPP.mjs → chunk-SOPPUXR3.mjs} +4 -4
- package/dist/{chunk-472FTEPP.mjs.map → chunk-SOPPUXR3.mjs.map} +1 -1
- package/dist/chunk-T3LOHTC6.js +136 -0
- package/dist/chunk-T3LOHTC6.js.map +1 -0
- package/dist/chunk-TPL2IHFI.js +43 -0
- package/dist/chunk-TPL2IHFI.js.map +1 -0
- package/dist/{chunk-JRUNONG5.mjs → chunk-V4LF47AS.mjs} +3 -3
- package/dist/{chunk-JRUNONG5.mjs.map → chunk-V4LF47AS.mjs.map} +1 -1
- package/dist/chunk-VELBKUIM.js +38 -0
- package/dist/chunk-VELBKUIM.js.map +1 -0
- package/dist/{chunk-G3G4HQT3.mjs → chunk-VN3TGLT3.mjs} +3 -3
- package/dist/{chunk-G3G4HQT3.mjs.map → chunk-VN3TGLT3.mjs.map} +1 -1
- package/dist/{chunk-AB2VYIYU.mjs → chunk-WTR7QJ32.mjs} +4 -194
- package/dist/chunk-WTR7QJ32.mjs.map +1 -0
- package/dist/{chunk-IB4FRJDV.js → chunk-XAWB2HFQ.js} +37 -67
- package/dist/chunk-XAWB2HFQ.js.map +1 -0
- package/dist/{chunk-QE53WRXW.mjs → chunk-ZTEQXVQF.mjs} +4 -4
- package/dist/{chunk-QE53WRXW.mjs.map → chunk-ZTEQXVQF.mjs.map} +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.mjs +1 -1
- package/dist/client/index.d.mts +15 -1
- package/dist/client/index.d.ts +15 -1
- package/dist/client/index.js +15 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +17 -0
- package/dist/client/index.mjs.map +1 -1
- package/dist/commerce/index.js +51 -50
- package/dist/commerce/index.mjs +6 -5
- package/dist/engage/index.js +9 -8
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +6 -5
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/index.js +8 -7
- package/dist/fleet/index.mjs +4 -3
- package/dist/forms/index.js +13 -12
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +5 -4
- package/dist/forms/index.mjs.map +1 -1
- package/dist/images/index.js +11 -10
- package/dist/images/index.mjs +4 -3
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +64 -63
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10 -9
- package/dist/index.mjs.map +1 -1
- package/dist/layout/client.js +9 -7
- package/dist/layout/client.mjs +8 -6
- package/dist/layout/index.js +11 -53
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +9 -51
- package/dist/layout/index.mjs.map +1 -1
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- package/dist/maps/index.js +5 -4
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/index.mjs +3 -2
- package/dist/maps/index.mjs.map +1 -1
- package/dist/seo/client.js +5 -4
- package/dist/seo/client.mjs +4 -3
- package/dist/seo/index.js +5 -4
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +4 -3
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-pages/contract.js +6 -5
- package/dist/seo-pages/contract.js.map +1 -1
- package/dist/seo-pages/contract.mjs +2 -1
- package/dist/seo-pages/contract.mjs.map +1 -1
- package/dist/server/index.d.mts +45 -1
- package/dist/server/index.d.ts +45 -1
- package/dist/server/index.js +6 -0
- package/dist/server/index.mjs +2 -0
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.mjs +1 -1
- package/dist/sites/contract.d.mts +36 -12
- package/dist/sites/contract.d.ts +36 -12
- package/dist/sites/contract.js +12 -11
- package/dist/sites/contract.mjs +2 -1
- package/dist/sync/index.js +16 -15
- package/dist/sync/index.mjs +4 -3
- package/dist/{types-DYOumpUT.d.mts → types-8IcjVMDa.d.mts} +1 -1
- package/dist/{types-DYOumpUT.d.ts → types-8IcjVMDa.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/AnalyticsProvider-ARAWVJPX.js +0 -30
- package/dist/AnalyticsProvider-HIGSPNRA.mjs +0 -9
- package/dist/ChatWidget-47KAOFLG.mjs +0 -9
- package/dist/ChatWidget-BDES6WUR.js +0 -18
- package/dist/EngageWidget-HPZAI6SU.mjs +0 -8
- package/dist/EngageWidget-X3NIWGMZ.js +0 -17
- package/dist/SignalCore-K2CTZ52G.js.map +0 -1
- package/dist/SignalCore-XABEH2GA.mjs.map +0 -1
- package/dist/SitemapSync-4BALOI4B.js +0 -16
- package/dist/SitemapSync-OQPRGBG3.mjs +0 -7
- package/dist/chunk-56X3IUOL.js.map +0 -1
- package/dist/chunk-AB2VYIYU.mjs.map +0 -1
- package/dist/chunk-BMKZHXWQ.js.map +0 -1
- package/dist/chunk-CDETOO5W.js +0 -8
- package/dist/chunk-IB4FRJDV.js.map +0 -1
- package/dist/chunk-SH4VZDVX.mjs.map +0 -1
- package/dist/chunk-WS4GNH3F.mjs +0 -259
- package/dist/chunk-WS4GNH3F.mjs.map +0 -1
- package/dist/chunk-WVAY4ZWC.mjs.map +0 -1
- package/dist/chunk-WZHWWOUC.js.map +0 -1
- package/dist/chunk-X4OPM3SK.mjs.map +0 -1
- package/dist/chunk-XKV73RDH.js +0 -266
- package/dist/chunk-XKV73RDH.js.map +0 -1
- package/dist/chunk-YCQHE2XT.mjs +0 -6
package/dist/forms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/forms/formsApi.ts","../../src/forms/DatePicker.tsx","../../src/forms/FormField.tsx","../../src/forms/FormClient.tsx","../../src/forms/ManagedForm.tsx"],"names":["sonorFetch","field","useState","useRef","useEffect","useCallback","jsxs","jsx","week","React","Fragment","config","DEFAULT_HONEYPOT_FIELD","useFormTracking","useMemo","submitForm","DEFAULT_FORM_SUCCESS_MESSAGE","useForm"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Forms API Client\n * \n * Full API client for form management. Allows developers to create, update,\n * and delete forms programmatically. Changes sync to Portal automatically.\n * \n * @example\n * ```tsx\n * import { formsApi } from '@sonordev/site-kit/forms'\n * \n * // Create a new form\n * const form = await formsApi.create({\n * projectId: 'xxx',\n * slug: 'contact-us',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * { slug: 'name', label: 'Name', fieldType: 'text', isRequired: true },\n * { slug: 'email', label: 'Email', fieldType: 'email', isRequired: true },\n * { slug: 'message', label: 'Message', fieldType: 'textarea' },\n * ]\n * })\n * \n * // Update fields\n * await formsApi.update(form.id, {\n * fields: [...form.fields, { slug: 'phone', label: 'Phone', fieldType: 'phone' }]\n * })\n * ```\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\n\n// ============================================\n// Types\n// ============================================\n\nexport type FormType =\n | 'prospect' // → CRM leads\n | 'contact' // → Contact form\n | 'support' // → Support tickets\n | 'feedback' // → Feedback entries\n | 'newsletter' // → Email subscribers\n | 'custom' // → Custom webhook\n\nexport type FieldType =\n | 'text'\n | 'email'\n | 'phone'\n | 'number'\n | 'textarea'\n | 'select'\n | 'multi_select'\n | 'radio'\n | 'checkbox'\n | 'date'\n | 'time'\n | 'datetime'\n | 'url'\n | 'file'\n | 'rating'\n | 'slider'\n | 'hidden'\n | 'heading'\n | 'paragraph'\n\nexport type FieldWidth = 'full' | 'half' | 'third' | 'quarter'\n\nexport interface FieldOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface FieldValidation {\n min?: number\n max?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n patternMessage?: string\n}\n\nexport interface FieldConditional {\n field: string\n operator: 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'is_empty' | 'not_empty' | 'greater_than' | 'less_than'\n value?: string | number | boolean\n}\n\nexport interface FormField {\n id?: string\n slug: string\n label: string\n fieldType: FieldType\n placeholder?: string\n helpText?: string\n defaultValue?: string\n isRequired?: boolean\n validation?: FieldValidation\n options?: FieldOption[]\n conditional?: FieldConditional\n width?: FieldWidth\n sortOrder?: number\n destinationField?: string\n stepId?: string\n}\n\nexport interface FormStep {\n id?: string\n stepNumber: number\n title?: string\n description?: string\n condition?: FieldConditional\n}\n\nexport interface Form {\n id: string\n projectId: string\n slug: string\n name: string\n description?: string\n formType: FormType\n successMessage: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText: string\n layout: 'stacked' | 'inline' | 'grid'\n showProgress: boolean\n enableSaveDraft: boolean\n isActive: boolean\n createdAt: string\n updatedAt: string\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface CreateFormInput {\n projectId: string\n slug: string\n name: string\n /**\n * Sub-site host this form belongs to (e.g. `ohiopowerstudies.com`). Lets\n * one Sonor project host one form per microsite — the dashboard's site\n * picker scopes the Forms list by this value. Optional for project-wide\n * forms. CLI scripts (migrate-contact-form) should derive this from\n * `NEXT_PUBLIC_SITE_URL` host.\n */\n site?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface UpdateFormInput {\n slug?: string\n name?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface FormsListOptions {\n projectId?: string\n formType?: FormType\n isActive?: boolean\n search?: string\n}\n\n// ============================================\n// API Client Configuration\n// ============================================\n\ninterface FormsApiConfig {\n baseUrl: string\n apiKey?: string\n getAuthToken?: () => Promise<string> | string\n}\n\nlet config: FormsApiConfig | null = null\n\n/**\n * Configure the forms API client\n */\nexport function configureFormsApi(options: FormsApiConfig) {\n config = options\n}\n\n/**\n * Get API config, falling back to SiteKitProvider globals\n */\nfunction getConfig(): FormsApiConfig {\n if (config) return config\n \n // Try to get from window globals (set by SiteKitProvider)\n if (typeof window !== 'undefined') {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (apiUrl && apiKey) {\n return { baseUrl: apiUrl, apiKey }\n }\n }\n \n throw new Error(\n 'Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first.'\n )\n}\n\n// ============================================\n// HTTP Helpers\n// ============================================\n\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: any\n): Promise<T> {\n const { baseUrl, apiKey, getAuthToken } = getConfig()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Use API key for public endpoints, auth token for admin endpoints\n if (apiKey) {\n headers['x-api-key'] = apiKey\n } else if (getAuthToken) {\n const token = await getAuthToken()\n headers['Authorization'] = `Bearer ${token}`\n }\n\n // retries: 0 — management CRUD is not idempotent; timeout only.\n const response = await sonorFetch(`${baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n }, { retries: 0 })\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }))\n throw new Error(error.message || `API error: ${response.status}`)\n }\n \n if (response.status === 204) {\n return undefined as T\n }\n \n return response.json()\n}\n\n// ============================================\n// Forms API\n// ============================================\n\nexport const formsApi = {\n /**\n * List all forms for a project\n */\n async list(options: FormsListOptions = {}): Promise<Form[]> {\n const params = new URLSearchParams()\n if (options.projectId) params.set('projectId', options.projectId)\n if (options.formType) params.set('formType', options.formType)\n if (options.isActive !== undefined) params.set('isActive', String(options.isActive))\n if (options.search) params.set('search', options.search)\n \n const query = params.toString()\n const result = await apiRequest<{ data: Form[] }>('GET', `/forms${query ? `?${query}` : ''}`)\n return result.data\n },\n \n /**\n * Get a single form by ID or slug\n */\n async get(idOrSlug: string): Promise<Form> {\n return apiRequest<Form>('GET', `/forms/${idOrSlug}`)\n },\n \n /**\n * Create a new form\n */\n async create(input: CreateFormInput): Promise<Form> {\n return apiRequest<Form>('POST', '/forms', input)\n },\n \n /**\n * Update an existing form\n */\n async update(id: string, input: UpdateFormInput): Promise<Form> {\n return apiRequest<Form>('PUT', `/forms/${id}`, input)\n },\n \n /**\n * Delete a form\n */\n async delete(id: string): Promise<void> {\n return apiRequest<void>('DELETE', `/forms/${id}`)\n },\n \n /**\n * Add a field to an existing form\n */\n async addField(formId: string, field: FormField): Promise<Form> {\n const form = await formsApi.get(formId)\n const maxSortOrder = Math.max(0, ...(form.fields || []).map(f => f.sortOrder || 0))\n \n return formsApi.update(formId, {\n fields: [\n ...(form.fields || []),\n { ...field, sortOrder: field.sortOrder ?? maxSortOrder + 1 }\n ]\n })\n },\n \n /**\n * Update a field in an existing form\n */\n async updateField(formId: string, fieldSlug: string, updates: Partial<FormField>): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).map(f => \n f.slug === fieldSlug ? { ...f, ...updates } : f\n )\n })\n },\n \n /**\n * Remove a field from a form\n */\n async removeField(formId: string, fieldSlug: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).filter(f => f.slug !== fieldSlug)\n })\n },\n \n /**\n * Reorder fields in a form\n */\n async reorderFields(formId: string, fieldSlugs: string[]): Promise<Form> {\n const form = await formsApi.get(formId)\n const fieldsMap = new Map((form.fields || []).map(f => [f.slug, f]))\n \n const orderedFields = fieldSlugs.map((slug, index) => {\n const field = fieldsMap.get(slug)\n if (!field) throw new Error(`Field not found: ${slug}`)\n return { ...field, sortOrder: index }\n })\n \n return formsApi.update(formId, { fields: orderedFields })\n },\n \n /**\n * Clone a form\n */\n async clone(formId: string, newSlug: string, newName?: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.create({\n projectId: form.projectId,\n slug: newSlug,\n name: newName || `${form.name} (Copy)`,\n description: form.description,\n formType: form.formType,\n successMessage: form.successMessage,\n redirectUrl: form.redirectUrl,\n notificationEmails: form.notificationEmails,\n submitButtonText: form.submitButtonText,\n layout: form.layout,\n showProgress: form.showProgress,\n enableSaveDraft: form.enableSaveDraft,\n isActive: false, // Clone as inactive\n fields: (form.fields || []).map(({ id, ...field }) => field), // Remove IDs\n steps: (form.steps || []).map(({ id, ...step }) => step), // Remove IDs\n })\n },\n \n /**\n * Activate or deactivate a form\n */\n async setActive(formId: string, isActive: boolean): Promise<Form> {\n return formsApi.update(formId, { isActive })\n },\n\n /**\n * Sync a form definition to the backend\n * Creates the form if it doesn't exist, updates if it does\n * Perfect for defining forms in code during development\n * \n * @example\n * ```tsx\n * // In your app initialization or form component\n * await formsApi.sync({\n * slug: 'contact',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.textarea('message', 'Message'),\n * ]\n * })\n * ```\n */\n async sync(input: Omit<CreateFormInput, 'projectId'>): Promise<Form & { synced: boolean; created: boolean; updated: boolean }> {\n return apiRequest<Form & { synced: boolean; created: boolean; updated: boolean }>(\n 'POST',\n '/api/public/forms/sync',\n input\n )\n },\n\n /**\n * Sync multiple forms at once\n * Useful for initializing all forms in your app\n *\n * Runs sequentially to avoid bursting the API (many hosts throttle concurrent POSTs → 429).\n */\n async syncAll(forms: Array<Omit<CreateFormInput, 'projectId'>>): Promise<Array<Form & { synced: boolean; created: boolean; updated: boolean }>> {\n const results: Array<Form & { synced: boolean; created: boolean; updated: boolean }> = []\n for (const form of forms) {\n results.push(await formsApi.sync(form))\n }\n return results\n },\n}\n\n// ============================================\n// Field Builder Helpers\n// ============================================\n\n/**\n * Helper functions to build field definitions\n */\nexport const field = {\n text: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'text',\n ...options,\n }),\n \n email: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'email',\n isRequired: true,\n ...options,\n }),\n \n phone: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'phone',\n ...options,\n }),\n \n textarea: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'textarea',\n ...options,\n }),\n \n select: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'select',\n options: choices,\n ...options,\n }),\n \n radio: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'radio',\n options: choices,\n ...options,\n }),\n \n checkbox: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'checkbox',\n ...options,\n }),\n \n date: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'date',\n ...options,\n }),\n \n number: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'number',\n ...options,\n }),\n \n rating: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'rating',\n ...options,\n }),\n \n file: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'file',\n ...options,\n }),\n \n hidden: (slug: string, defaultValue: string): FormField => ({\n slug,\n label: '',\n fieldType: 'hidden',\n defaultValue,\n }),\n \n heading: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'heading',\n }),\n \n paragraph: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'paragraph',\n }),\n}\n\n// ============================================\n// Form Definition Helper\n// ============================================\n\nexport interface FormDefinition extends Omit<CreateFormInput, 'projectId'> {\n slug: string\n name: string\n fields: FormField[]\n}\n\n/**\n * Define a form declaratively\n * Returns a form definition that can be synced to the backend\n * \n * @example\n * ```tsx\n * // forms/contact.ts\n * import { defineForm, field } from '@sonordev/site-kit/forms'\n * \n * export const contactForm = defineForm({\n * slug: 'contact',\n * name: 'Contact Us',\n * formType: 'prospect',\n * successMessage: 'Thanks! We\\'ll be in touch soon.',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.select('service', 'Service Needed', [\n * { value: 'consultation', label: 'Free Consultation' },\n * { value: 'representation', label: 'Legal Representation' },\n * ]),\n * field.textarea('message', 'Tell us about your case'),\n * ]\n * })\n * \n * // Then in your app:\n * await formsApi.sync(contactForm)\n * ```\n */\nexport function defineForm(definition: FormDefinition): FormDefinition {\n // Ensure fields have sort order\n const fieldsWithOrder = definition.fields.map((f, index) => ({\n ...f,\n sortOrder: f.sortOrder ?? index,\n }))\n \n return {\n ...definition,\n fields: fieldsWithOrder,\n formType: definition.formType || 'contact',\n successMessage: definition.successMessage || 'Thank you for your submission!',\n submitButtonText: definition.submitButtonText || 'Submit',\n layout: definition.layout || 'stacked',\n isActive: definition.isActive ?? true,\n }\n}\n\n/**\n * Initialize multiple forms and sync them to the backend\n * Call this once during app initialization (e.g., in layout.tsx or _app.tsx)\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { initializeForms } from '@sonordev/site-kit/forms'\n * import { contactForm } from './forms/contact'\n * import { consultationForm } from './forms/consultation'\n * \n * // Initialize forms (runs once per build/server start in dev)\n * if (process.env.NODE_ENV === 'development') {\n * initializeForms([contactForm, consultationForm])\n * }\n * ```\n */\nexport async function initializeForms(forms: FormDefinition[]): Promise<void> {\n if (typeof window === 'undefined') {\n // Server-side: log that forms need to be synced\n console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map(f => f.slug).join(', ')}`)\n return\n }\n \n try {\n const results = await formsApi.syncAll(forms)\n const created = results.filter(r => r.created).length\n const updated = results.filter(r => r.updated).length\n console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`)\n } catch (error) {\n console.error('[Site-Kit] Failed to sync forms:', error)\n }\n}\n","'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\n\ninterface DatePickerProps {\n value: string // YYYY-MM-DD or empty\n onChange: (value: string) => void\n id?: string\n name?: string\n required?: boolean\n minDate?: string // YYYY-MM-DD\n placeholder?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`\n}\n\nfunction toDateStr(y: number, m: number, d: number): string {\n return `${y}-${pad(m + 1)}-${pad(d)}`\n}\n\nfunction parseDate(str: string): { year: number; month: number; day: number } | null {\n if (!str) return null\n const [y, m, d] = str.split('-').map(Number)\n if (!y || !m || !d) return null\n return { year: y, month: m - 1, day: d }\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nfunction formatDisplay(dateStr: string): string {\n const parsed = parseDate(dateStr)\n if (!parsed) return ''\n return `${MONTHS[parsed.month]} ${parsed.day}, ${parsed.year}`\n}\n\nexport function DatePicker({\n value,\n onChange,\n id,\n name,\n required,\n minDate,\n placeholder = 'Select a date',\n className = '',\n style,\n}: DatePickerProps) {\n const today = new Date()\n const todayStr = toDateStr(today.getFullYear(), today.getMonth(), today.getDate())\n // Only restrict dates when a minDate is explicitly configured. Defaulting to\n // today silently disabled every valid day for past-date fields (birthdates).\n const effectiveMin = minDate || ''\n\n const parsed = parseDate(value)\n const [viewYear, setViewYear] = useState(parsed?.year || today.getFullYear())\n const [viewMonth, setViewMonth] = useState(parsed?.month ?? today.getMonth())\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Close on click outside\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n // Close on escape\n useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open])\n\n const prevMonth = useCallback(() => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(y => y - 1) }\n else setViewMonth(m => m - 1)\n }, [viewMonth])\n\n const nextMonth = useCallback(() => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(y => y + 1) }\n else setViewMonth(m => m + 1)\n }, [viewMonth])\n\n const selectDay = useCallback((day: number) => {\n const dateStr = toDateStr(viewYear, viewMonth, day)\n onChange(dateStr)\n setOpen(false)\n }, [viewYear, viewMonth, onChange])\n\n const isDisabled = useCallback((day: number): boolean => {\n const dateStr = toDateStr(viewYear, viewMonth, day)\n return dateStr < effectiveMin\n }, [viewYear, viewMonth, effectiveMin])\n\n const isSelected = useCallback((day: number): boolean => {\n if (!value) return false\n return toDateStr(viewYear, viewMonth, day) === value\n }, [viewYear, viewMonth, value])\n\n const isToday = useCallback((day: number): boolean => {\n return toDateStr(viewYear, viewMonth, day) === todayStr\n }, [viewYear, viewMonth, todayStr])\n\n // Build calendar grid\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDay = getFirstDayOfMonth(viewYear, viewMonth)\n const weeks: (number | null)[][] = []\n let week: (number | null)[] = Array(firstDay).fill(null)\n\n for (let d = 1; d <= daysInMonth; d++) {\n week.push(d)\n if (week.length === 7) { weeks.push(week); week = [] }\n }\n if (week.length > 0) {\n while (week.length < 7) week.push(null)\n weeks.push(week)\n }\n\n return (\n <div ref={containerRef} className={`sk-datepicker ${className}`} style={{ position: 'relative', ...style }}>\n {/* Hidden native input for form submission */}\n <input type=\"hidden\" name={name} value={value || ''} />\n\n {/* Trigger button styled as input */}\n <button\n type=\"button\"\n id={id}\n onClick={() => setOpen(!open)}\n aria-required={required}\n aria-expanded={open}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: 'var(--sk-input-padding, 10px 12px)',\n backgroundColor: 'var(--sk-input-bg, #fff)',\n border: `1px solid ${open ? 'var(--sk-input-border-focus, #2563eb)' : 'var(--sk-input-border, #d1d5db)'}`,\n borderRadius: 'var(--sk-input-radius, 0.375rem)',\n fontSize: 'var(--sk-font-size, 14px)',\n color: value ? 'var(--sk-form-success-text, #111)' : 'var(--sk-text-tertiary, #9ca3af)',\n cursor: 'pointer',\n outline: 'none',\n textAlign: 'left',\n }}\n >\n <span>{value ? formatDisplay(value) : placeholder}</span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ opacity: 0.5, flexShrink: 0 }}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n\n {/* Calendar dropdown */}\n {open && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n marginTop: '4px',\n backgroundColor: 'var(--sk-input-bg, #fff)',\n border: '1px solid var(--sk-input-border, #d1d5db)',\n borderRadius: 'var(--sk-input-radius, 0.375rem)',\n boxShadow: '0 10px 25px rgba(0,0,0,0.3)',\n zIndex: 50,\n padding: '12px',\n minWidth: '280px',\n }}\n >\n {/* Month/Year header */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '12px' }}>\n <button\n type=\"button\"\n onClick={prevMonth}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '4px 8px', color: 'var(--sk-label-color, #6b7280)', fontSize: '18px', lineHeight: 1 }}\n aria-label=\"Previous month\"\n >\n ‹\n </button>\n <span style={{ fontWeight: 600, fontSize: '14px', color: 'var(--sk-form-success-text, #111)' }}>\n {MONTHS[viewMonth]} {viewYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '4px 8px', color: 'var(--sk-label-color, #6b7280)', fontSize: '18px', lineHeight: 1 }}\n aria-label=\"Next month\"\n >\n ›\n </button>\n </div>\n\n {/* Day headers */}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: '2px', marginBottom: '4px' }}>\n {DAYS.map(d => (\n <div key={d} style={{ textAlign: 'center', fontSize: '11px', fontWeight: 600, color: 'var(--sk-text-tertiary, #9ca3af)', padding: '4px 0', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {d}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n {weeks.map((week, wi) => (\n <div key={wi} style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: '2px' }}>\n {week.map((day, di) => {\n if (day === null) {\n return <div key={di} style={{ padding: '6px' }} />\n }\n\n const disabled = isDisabled(day)\n const selected = isSelected(day)\n const todayMark = isToday(day)\n\n return (\n <button\n key={di}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectDay(day)}\n style={{\n padding: '6px',\n textAlign: 'center',\n fontSize: '13px',\n fontWeight: selected ? 700 : todayMark ? 600 : 400,\n borderRadius: '6px',\n border: todayMark && !selected ? '1px solid var(--sk-primary, #2563eb)' : '1px solid transparent',\n background: selected ? 'var(--sk-primary, #2563eb)' : 'transparent',\n color: disabled\n ? 'var(--sk-text-tertiary, #9ca3af)'\n : selected\n ? '#fff'\n : 'var(--sk-form-success-text, #111)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!disabled && !selected) {\n ;(e.target as HTMLElement).style.background = 'var(--sk-input-border, #e5e7eb)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !selected) {\n ;(e.target as HTMLElement).style.background = 'transparent'\n }\n }}\n aria-label={`${MONTHS[viewMonth]} ${day}, ${viewYear}`}\n aria-selected={selected}\n >\n {day}\n </button>\n )\n })}\n </div>\n ))}\n\n {/* Today shortcut */}\n <div style={{ marginTop: '8px', textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => { onChange(todayStr); setOpen(false) }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 600,\n color: 'var(--sk-primary, #2563eb)',\n padding: '4px 8px',\n }}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Form Field Component\n *\n * Renders individual form fields based on type.\n *\n * Styling Options:\n * 1. Use CSS variables to customize the default styles\n * 2. Use the `className` prop on ManagedForm for scoped styles\n * 3. Use the custom render function for complete control\n *\n * CSS Variables (set these in your stylesheet or import brand.css):\n * --sk-input-bg: #ffffff\n * --sk-input-border: #d1d5db\n * --sk-input-border-focus: #2563eb\n * --sk-input-border-error: #dc2626\n * --sk-input-radius: 0.375rem\n * --sk-input-padding: 10px 12px\n * --sk-label-color: inherit\n * --sk-label-weight: 500\n * --sk-error: #dc2626\n * --sk-text-tertiary: #6b7280\n * --sk-font-size: 16px\n */\n\n'use client'\n\nimport React from 'react'\nimport type { FormField as FormFieldType } from './types'\nimport { DatePicker } from './DatePicker'\nimport { sonorFetch } from '../shared/sonorFetch'\n\ninterface FormFieldProps {\n field: FormFieldType\n value: unknown\n error?: string\n onChange: (value: unknown) => void\n /** Optional class name prefix for custom styling */\n classPrefix?: string\n}\n\n/**\n * Normalize options from various DB formats into [{value, label}]\n * Handles:\n * - [{value, label}] → pass through\n * - {choices: [\"A\", \"B\"]} → [{value: \"A\", label: \"A\"}, ...]\n * - [\"A\", \"B\"] → [{value: \"A\", label: \"A\"}, ...]\n */\nfunction normalizeOptions(options: unknown): { value: string; label: string }[] {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((opt) => {\n if (typeof opt === 'string') return { value: opt, label: opt }\n if (typeof opt === 'object' && opt !== null && 'value' in opt && 'label' in opt) return opt as { value: string; label: string }\n if (typeof opt === 'object' && opt !== null && 'label' in opt) return { value: (opt as any).label, label: (opt as any).label }\n return { value: String(opt), label: String(opt) }\n })\n }\n if (typeof options === 'object' && options !== null) {\n const obj = options as Record<string, unknown>\n if (Array.isArray(obj.choices)) return normalizeOptions(obj.choices)\n if (Array.isArray(obj.items)) return normalizeOptions(obj.items)\n if (Array.isArray(obj.options)) return normalizeOptions(obj.options)\n }\n return []\n}\n\nexport function FormField({ field, value, error, onChange, classPrefix = 'sk-form' }: FormFieldProps) {\n // Stable id from field (no hooks - avoids \"Rendered fewer hooks than expected\" with early returns)\n const inputId = `sk-${(field as { id?: string }).id || field.slug}`\n // Normalize options once\n const options = normalizeOptions(field.options)\n // Use CSS variables with inline style fallbacks\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n padding: 'var(--sk-input-padding, 10px 12px)',\n fontSize: 'var(--sk-font-size, 16px)',\n border: error \n ? '1px solid var(--sk-input-border-error, #dc2626)' \n : '1px solid var(--sk-input-border, #d1d5db)',\n borderRadius: 'var(--sk-input-radius, 6px)',\n backgroundColor: 'var(--sk-input-bg, #ffffff)',\n outline: 'none',\n fontFamily: 'inherit',\n }\n \n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: 6,\n fontWeight: 'var(--sk-label-weight, 500)' as any,\n color: 'var(--sk-label-color, inherit)',\n }\n \n const errorStyle: React.CSSProperties = {\n color: 'var(--sk-error, #dc2626)',\n fontSize: 14,\n marginTop: 4,\n }\n \n const helpStyle: React.CSSProperties = {\n color: 'var(--sk-text-tertiary, #6b7280)',\n fontSize: 14,\n marginTop: 4,\n }\n \n // Heading / Section Header (display only)\n if (field.field_type === 'heading' || field.field_type === 'section_header') {\n return <h3 className={`${classPrefix}__heading`} style={{ margin: '16px 0 8px', fontWeight: 600, fontSize: 18 }}>{field.label}</h3>\n }\n \n // Paragraph (display only)\n if (field.field_type === 'paragraph') {\n return <p className={`${classPrefix}__paragraph`} style={{ color: 'var(--sk-text-tertiary, #6b7280)', margin: '8px 0' }}>{field.help_text || field.label}</p>\n }\n \n // Hidden field\n if (field.field_type === 'hidden') {\n return <input type=\"hidden\" name={field.slug} value={String(value || '')} />\n }\n\n const hideLabel = !!(field as { hide_label?: boolean }).hide_label\n const effectivePlaceholder = hideLabel ? field.label : field.placeholder\n\n return (\n <div className={`${classPrefix}__field ${classPrefix}__field--${field.field_type}`}>\n <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 } : {}) }}>\n {field.label}\n {field.is_required && <span style={{ color: 'var(--sk-error, #dc2626)' }}> *</span>}\n </label>\n \n {/* Text, Email, Phone/Tel, Number */}\n {['text', 'email', 'phone', 'tel', 'number'].includes(field.field_type) && (\n <input\n id={inputId}\n className={`${classPrefix}__input`}\n type={field.field_type === 'phone' || field.field_type === 'tel' ? 'tel' : field.field_type}\n name={field.slug}\n value={String(value || '')}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Textarea */}\n {field.field_type === 'textarea' && (\n <textarea\n id={inputId}\n className={`${classPrefix}__textarea`}\n name={field.slug}\n value={String(value || '')}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n rows={4}\n onChange={(e) => onChange(e.target.value)}\n style={{ ...baseInputStyle, resize: 'vertical' }}\n />\n )}\n \n {/* Select */}\n {field.field_type === 'select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select`}\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n >\n <option value=\"\">{effectivePlaceholder || 'Select an option'}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Multi-select */}\n {field.field_type === 'multi-select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select ${classPrefix}__select--multi`}\n name={field.slug}\n value={Array.isArray(value) ? value : []}\n required={field.is_required}\n multiple\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, opt => opt.value)\n onChange(selected)\n }}\n style={{ ...baseInputStyle, height: 120 }}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Radio */}\n {field.field_type === 'radio' && (\n <div className={`${classPrefix}__radio-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => (\n <label key={option.value} className={`${classPrefix}__radio-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={option.value}\n checked={value === option.value}\n onChange={() => onChange(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n \n {/* Checkbox (single) */}\n {field.field_type === 'checkbox' && options.length === 0 && (\n <label className={`${classPrefix}__checkbox`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n {field.help_text || field.label}\n </label>\n )}\n \n {/* Checkbox (multiple options) */}\n {field.field_type === 'checkbox' && options.length > 0 && (\n <div className={`${classPrefix}__checkbox-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => {\n const selectedValues = Array.isArray(value) ? value : []\n const isChecked = selectedValues.includes(option.value)\n \n return (\n <label key={option.value} className={`${classPrefix}__checkbox-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {\n if (isChecked) {\n onChange(selectedValues.filter(v => v !== option.value))\n } else {\n onChange([...selectedValues, option.value])\n }\n }}\n />\n {option.label}\n </label>\n )\n })}\n </div>\n )}\n \n {/* Date - Custom calendar picker */}\n {field.field_type === 'date' && (\n <DatePicker\n id={inputId}\n name={field.slug}\n value={String(value || '')}\n onChange={onChange}\n required={field.is_required}\n placeholder={field.placeholder || 'Select a date'}\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n />\n )}\n \n {/* Time */}\n {field.field_type === 'time' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--time`}\n type=\"time\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* DateTime */}\n {field.field_type === 'datetime' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--datetime`}\n type=\"datetime-local\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* File */}\n {field.field_type === 'file' && (\n <FileUploadField\n field={field}\n inputId={inputId}\n classPrefix={classPrefix}\n baseInputStyle={baseInputStyle}\n onChange={onChange}\n />\n )}\n \n {/* Rating */}\n {field.field_type === 'rating' && (\n <div className={`${classPrefix}__rating`} style={{ display: 'flex', gap: 4 }}>\n {[1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => onChange(star)}\n className={`${classPrefix}__rating-star`}\n style={{\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n color: (value as number) >= star ? 'var(--sk-rating-active, #fbbf24)' : 'var(--sk-rating-inactive, #d1d5db)',\n }}\n >\n ★\n </button>\n ))}\n </div>\n )}\n \n {/* Slider */}\n {field.field_type === 'slider' && (\n <div className={`${classPrefix}__slider`}>\n <input\n id={inputId}\n type=\"range\"\n name={field.slug}\n value={Number(value || 50)}\n min={field.validation?.min || 0}\n max={field.validation?.max || 100}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ width: '100%' }}\n />\n <div className={`${classPrefix}__slider-value`} style={{ textAlign: 'center', marginTop: 4 }}>{String(value || 50)}</div>\n </div>\n )}\n \n {/* Error message */}\n {error && <p className={`${classPrefix}__error`} style={errorStyle}>{error}</p>}\n \n {/* Help text */}\n {field.help_text && !error && field.field_type !== 'checkbox' && (\n <p className={`${classPrefix}__help`} style={helpStyle}>{field.help_text}</p>\n )}\n </div>\n )\n}\n\n/**\n * File upload field. Uploads the chosen file to the Sonor API, which stores it\n * and returns a public URL — that URL becomes the field value, so large files\n * never touch the JSON submission body. The field value stays empty until the\n * upload succeeds, so a required file field correctly blocks submission until\n * the upload completes (rather than submitting a useless bare filename).\n */\nfunction FileUploadField({\n field,\n inputId,\n classPrefix,\n baseInputStyle,\n onChange,\n}: {\n field: FormFieldType\n inputId: string\n classPrefix: string\n baseInputStyle: React.CSSProperties\n onChange: (value: unknown) => void\n}) {\n const [status, setStatus] = React.useState<'idle' | 'uploading' | 'error'>('idle')\n const [fileName, setFileName] = React.useState('')\n\n const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setFileName(file.name)\n setStatus('uploading')\n onChange('') // clear any prior URL until this upload completes\n try {\n const url = await uploadFormFile(file)\n onChange(url)\n setStatus('idle')\n } catch (err) {\n console.error('[Forms] File upload failed:', err)\n onChange('')\n setStatus('error')\n }\n }\n\n return (\n <>\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--file`}\n type=\"file\"\n name={field.slug}\n required={field.is_required}\n disabled={status === 'uploading'}\n onChange={handleFile}\n style={baseInputStyle}\n />\n {status === 'uploading' && (\n <p style={{ color: 'var(--sk-text-tertiary, #6b7280)', fontSize: 14, marginTop: 4 }}>\n Uploading {fileName}…\n </p>\n )}\n {status === 'error' && (\n <p role=\"alert\" style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 4 }}>\n Upload failed. Please choose the file again.\n </p>\n )}\n </>\n )\n}\n\n/** Upload a single file to the Sonor API and return its stored public URL. */\nasync function uploadFormFile(file: File): Promise<string> {\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey =\n typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n if (!apiKey) {\n throw new Error('API key is required to upload files.')\n }\n\n const body = new FormData()\n body.append('file', file)\n\n // No Content-Type header — the browser sets the multipart boundary itself.\n const response = await sonorFetch(\n `${apiUrl}/api/public/forms/upload`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n body,\n },\n { retries: 1, timeoutMs: 60000 },\n )\n\n if (!response.ok) {\n throw new Error(`Upload failed (${response.status})`)\n }\n const data = (await response.json().catch(() => null)) as { url?: string } | null\n if (!data?.url) {\n throw new Error('Upload did not return a URL.')\n }\n return data.url\n}\n","/**\n * @sonordev/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo, useRef } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n}: FormClientProps) {\n const [values, setValues] = useState<Record<string, unknown>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [honeypotValue, setHoneypotValue] = useState('')\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n // Anti-bot: record when form first rendered (bots submit in < 3 seconds)\n const formLoadedAt = useRef(Date.now())\n // Synchronous guard against a concurrent double-submit (Enter + click, etc.).\n const isSubmittingRef = useRef(false)\n\n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n totalSteps: config.total_steps,\n })\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue).includes(String(value))\n case 'not_contains':\n return !String(fieldValue).includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Validate field\n const validateField = useCallback((field: FormFieldType): string | null => {\n if (!isFieldVisible(field)) return null\n // Skip display-only field types\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check — guard against an invalid admin-entered pattern.\n if (rules.pattern) {\n try {\n if (!new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n } catch {\n // Malformed pattern — skip rather than crashing the whole form render.\n }\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [currentFields, validateField])\n\n // Validate EVERY field across all steps — used on final submit so a required\n // field left empty on an earlier step cannot slip through. Returns the first\n // step containing an error so the user can be taken straight to it.\n const validateAll = useCallback((): { ok: boolean; firstErrorStep: number | null } => {\n const allFields = config.fields || []\n const newErrors: Record<string, string> = {}\n for (const field of allFields) {\n const error = validateField(field)\n if (error) newErrors[field.slug] = error\n }\n setErrors(newErrors)\n if (Object.keys(newErrors).length === 0) return { ok: true, firstErrorStep: null }\n\n let firstErrorStep: number | null = null\n if (config.is_multi_step && config.steps) {\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n for (const s of ordered) {\n if (allFields.some((f) => f.step_id === s.id && newErrors[f.slug])) {\n firstErrorStep = s.step_number\n break\n }\n }\n }\n return { ok: false, firstErrorStep }\n }, [config, validateField])\n\n // Collect values for currently-visible fields only, so a value typed into a\n // field that later became conditionally hidden is never submitted.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [config, values, isFieldVisible])\n\n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n // Re-entrancy guard — refs update synchronously, so this blocks a second\n // submit fired in the same tick (Enter key + button click, or a double-tap).\n if (isSubmittingRef.current) return\n\n const { ok, firstErrorStep } = validateAll()\n if (!ok) {\n if (firstErrorStep != null) setStep(firstErrorStep)\n return\n }\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config,\n values: buildVisibleValues(),\n honeypotValue: config.honeypot_enabled ? honeypotValue : '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] Submission error:', error)\n setSubmitError('Something went wrong sending your submission. Please try again.')\n onError?.(error as Error)\n } finally {\n isSubmittingRef.current = false\n setIsSubmitting(false)\n }\n }, [config, honeypotValue, validateAll, buildVisibleValues, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n \n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message (fallback when API returns empty / null success_message)\n if (isComplete) {\n const raw = config.success_message\n const message =\n typeof raw === 'string' && raw.trim().length > 0\n ? raw.trim()\n : DEFAULT_FORM_SUCCESS_MESSAGE\n return (\n <div\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n style={{\n color: 'var(--sk-form-success-text, #111827)',\n lineHeight: 1.6,\n }}\n >\n <p style={{ margin: 0, fontSize: '1.0625rem' }}>{message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n \n // Default render\n return (\n <form\n className={`sk-form ${className || ''}`}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"sk-form__progress\" style={{ marginBottom: 20 }}>\n <div className=\"sk-form__progress-header\" style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 8 }}>\n <span className=\"sk-form__progress-step\">Step {step} of {config.total_steps}</span>\n <span className=\"sk-form__progress-percent\">{progress}%</span>\n </div>\n <div className=\"sk-form__progress-track\" style={{ \n height: 4, \n backgroundColor: 'var(--sk-progress-bg, #e5e7eb)', \n borderRadius: 2,\n overflow: 'hidden' \n }}>\n <div className=\"sk-form__progress-bar\" style={{ \n width: `${progress}%`, \n height: '100%', \n backgroundColor: 'var(--sk-progress-fill, #2563eb)',\n transition: 'width 0.3s ease'\n }} />\n </div>\n </div>\n )}\n \n {/* Fields */}\n <div className=\"sk-form__fields\">\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n \n return (\n <div key={field.id} className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n </div>\n )\n })}\n </div>\n \n {/* Navigation buttons */}\n <div className=\"sk-form__actions\" style={{ \n display: 'flex', \n justifyContent: step > 1 ? 'space-between' : 'flex-end',\n marginTop: 24 \n }}>\n {step > 1 && (\n <button type=\"button\" className=\"sk-form__btn sk-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting \n ? 'Submitting...' \n : step < config.total_steps \n ? 'Next' \n : config.submit_button_text\n }\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {/* Honeypot field */}\n {config.honeypot_enabled && (\n <input\n type=\"text\"\n name={honeypotFieldName}\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n style={{\n position: 'absolute', \n left: -9999, \n opacity: 0,\n pointerEvents: 'none' \n }}\n value={honeypotValue}\n onChange={(e) => {\n setHoneypotValue(e.target.value)\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n }}\n />\n )}\n </form>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: 'var(--sk-error, #dc2626)' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n />\n )\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/forms/formsApi.ts","../../src/forms/DatePicker.tsx","../../src/forms/FormField.tsx","../../src/forms/FormClient.tsx","../../src/forms/ManagedForm.tsx"],"names":["sonorFetch","field","useState","useRef","useEffect","useCallback","jsxs","jsx","week","React","Fragment","config","DEFAULT_HONEYPOT_FIELD","useFormTracking","useMemo","submitForm","DEFAULT_FORM_SUCCESS_MESSAGE","useForm"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Forms API Client\n * \n * Full API client for form management. Allows developers to create, update,\n * and delete forms programmatically. Changes sync to Portal automatically.\n * \n * @example\n * ```tsx\n * import { formsApi } from '@sonordev/site-kit/forms'\n * \n * // Create a new form\n * const form = await formsApi.create({\n * projectId: 'xxx',\n * slug: 'contact-us',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * { slug: 'name', label: 'Name', fieldType: 'text', isRequired: true },\n * { slug: 'email', label: 'Email', fieldType: 'email', isRequired: true },\n * { slug: 'message', label: 'Message', fieldType: 'textarea' },\n * ]\n * })\n * \n * // Update fields\n * await formsApi.update(form.id, {\n * fields: [...form.fields, { slug: 'phone', label: 'Phone', fieldType: 'phone' }]\n * })\n * ```\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\n\n// ============================================\n// Types\n// ============================================\n\nexport type FormType =\n | 'prospect' // → CRM leads\n | 'contact' // → Contact form\n | 'support' // → Support tickets\n | 'feedback' // → Feedback entries\n | 'newsletter' // → Email subscribers\n | 'custom' // → Custom webhook\n\nexport type FieldType =\n | 'text'\n | 'email'\n | 'phone'\n | 'number'\n | 'textarea'\n | 'select'\n | 'multi_select'\n | 'radio'\n | 'checkbox'\n | 'date'\n | 'time'\n | 'datetime'\n | 'url'\n | 'file'\n | 'rating'\n | 'slider'\n | 'hidden'\n | 'heading'\n | 'paragraph'\n\nexport type FieldWidth = 'full' | 'half' | 'third' | 'quarter'\n\nexport interface FieldOption {\n value: string\n label: string\n disabled?: boolean\n}\n\nexport interface FieldValidation {\n min?: number\n max?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n patternMessage?: string\n}\n\nexport interface FieldConditional {\n field: string\n operator: 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'is_empty' | 'not_empty' | 'greater_than' | 'less_than'\n value?: string | number | boolean\n}\n\nexport interface FormField {\n id?: string\n slug: string\n label: string\n fieldType: FieldType\n placeholder?: string\n helpText?: string\n defaultValue?: string\n isRequired?: boolean\n validation?: FieldValidation\n options?: FieldOption[]\n conditional?: FieldConditional\n width?: FieldWidth\n sortOrder?: number\n destinationField?: string\n stepId?: string\n}\n\nexport interface FormStep {\n id?: string\n stepNumber: number\n title?: string\n description?: string\n condition?: FieldConditional\n}\n\nexport interface Form {\n id: string\n projectId: string\n slug: string\n name: string\n description?: string\n formType: FormType\n successMessage: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText: string\n layout: 'stacked' | 'inline' | 'grid'\n showProgress: boolean\n enableSaveDraft: boolean\n isActive: boolean\n createdAt: string\n updatedAt: string\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface CreateFormInput {\n projectId: string\n slug: string\n name: string\n /**\n * Sub-site host this form belongs to (e.g. `ohiopowerstudies.com`). Lets\n * one Sonor project host one form per microsite — the dashboard's site\n * picker scopes the Forms list by this value. Optional for project-wide\n * forms. CLI scripts (migrate-contact-form) should derive this from\n * `NEXT_PUBLIC_SITE_URL` host.\n */\n site?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface UpdateFormInput {\n slug?: string\n name?: string\n description?: string\n formType?: FormType\n successMessage?: string\n redirectUrl?: string\n notificationEmails?: string[]\n submitButtonText?: string\n layout?: 'stacked' | 'inline' | 'grid'\n showProgress?: boolean\n enableSaveDraft?: boolean\n isActive?: boolean\n fields?: FormField[]\n steps?: FormStep[]\n}\n\nexport interface FormsListOptions {\n projectId?: string\n formType?: FormType\n isActive?: boolean\n search?: string\n}\n\n// ============================================\n// API Client Configuration\n// ============================================\n\ninterface FormsApiConfig {\n baseUrl: string\n apiKey?: string\n getAuthToken?: () => Promise<string> | string\n}\n\nlet config: FormsApiConfig | null = null\n\n/**\n * Configure the forms API client\n */\nexport function configureFormsApi(options: FormsApiConfig) {\n config = options\n}\n\n/**\n * Get API config, falling back to SiteKitProvider globals\n */\nfunction getConfig(): FormsApiConfig {\n if (config) return config\n \n // Try to get from window globals (set by SiteKitProvider)\n if (typeof window !== 'undefined') {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (apiUrl && apiKey) {\n return { baseUrl: apiUrl, apiKey }\n }\n }\n \n throw new Error(\n 'Forms API not configured. Either wrap your app in SiteKitProvider or call configureFormsApi() first.'\n )\n}\n\n// ============================================\n// HTTP Helpers\n// ============================================\n\nasync function apiRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n path: string,\n body?: any\n): Promise<T> {\n const { baseUrl, apiKey, getAuthToken } = getConfig()\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Use API key for public endpoints, auth token for admin endpoints\n if (apiKey) {\n headers['x-api-key'] = apiKey\n } else if (getAuthToken) {\n const token = await getAuthToken()\n headers['Authorization'] = `Bearer ${token}`\n }\n\n // retries: 0 — management CRUD is not idempotent; timeout only.\n const response = await sonorFetch(`${baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n }, { retries: 0 })\n \n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }))\n throw new Error(error.message || `API error: ${response.status}`)\n }\n \n if (response.status === 204) {\n return undefined as T\n }\n \n return response.json()\n}\n\n// ============================================\n// Forms API\n// ============================================\n\nexport const formsApi = {\n /**\n * List all forms for a project\n */\n async list(options: FormsListOptions = {}): Promise<Form[]> {\n const params = new URLSearchParams()\n if (options.projectId) params.set('projectId', options.projectId)\n if (options.formType) params.set('formType', options.formType)\n if (options.isActive !== undefined) params.set('isActive', String(options.isActive))\n if (options.search) params.set('search', options.search)\n \n const query = params.toString()\n const result = await apiRequest<{ data: Form[] }>('GET', `/forms${query ? `?${query}` : ''}`)\n return result.data\n },\n \n /**\n * Get a single form by ID or slug\n */\n async get(idOrSlug: string): Promise<Form> {\n return apiRequest<Form>('GET', `/forms/${idOrSlug}`)\n },\n \n /**\n * Create a new form\n */\n async create(input: CreateFormInput): Promise<Form> {\n return apiRequest<Form>('POST', '/forms', input)\n },\n \n /**\n * Update an existing form\n */\n async update(id: string, input: UpdateFormInput): Promise<Form> {\n return apiRequest<Form>('PUT', `/forms/${id}`, input)\n },\n \n /**\n * Delete a form\n */\n async delete(id: string): Promise<void> {\n return apiRequest<void>('DELETE', `/forms/${id}`)\n },\n \n /**\n * Add a field to an existing form\n */\n async addField(formId: string, field: FormField): Promise<Form> {\n const form = await formsApi.get(formId)\n const maxSortOrder = Math.max(0, ...(form.fields || []).map(f => f.sortOrder || 0))\n \n return formsApi.update(formId, {\n fields: [\n ...(form.fields || []),\n { ...field, sortOrder: field.sortOrder ?? maxSortOrder + 1 }\n ]\n })\n },\n \n /**\n * Update a field in an existing form\n */\n async updateField(formId: string, fieldSlug: string, updates: Partial<FormField>): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).map(f => \n f.slug === fieldSlug ? { ...f, ...updates } : f\n )\n })\n },\n \n /**\n * Remove a field from a form\n */\n async removeField(formId: string, fieldSlug: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.update(formId, {\n fields: (form.fields || []).filter(f => f.slug !== fieldSlug)\n })\n },\n \n /**\n * Reorder fields in a form\n */\n async reorderFields(formId: string, fieldSlugs: string[]): Promise<Form> {\n const form = await formsApi.get(formId)\n const fieldsMap = new Map((form.fields || []).map(f => [f.slug, f]))\n \n const orderedFields = fieldSlugs.map((slug, index) => {\n const field = fieldsMap.get(slug)\n if (!field) throw new Error(`Field not found: ${slug}`)\n return { ...field, sortOrder: index }\n })\n \n return formsApi.update(formId, { fields: orderedFields })\n },\n \n /**\n * Clone a form\n */\n async clone(formId: string, newSlug: string, newName?: string): Promise<Form> {\n const form = await formsApi.get(formId)\n \n return formsApi.create({\n projectId: form.projectId,\n slug: newSlug,\n name: newName || `${form.name} (Copy)`,\n description: form.description,\n formType: form.formType,\n successMessage: form.successMessage,\n redirectUrl: form.redirectUrl,\n notificationEmails: form.notificationEmails,\n submitButtonText: form.submitButtonText,\n layout: form.layout,\n showProgress: form.showProgress,\n enableSaveDraft: form.enableSaveDraft,\n isActive: false, // Clone as inactive\n fields: (form.fields || []).map(({ id, ...field }) => field), // Remove IDs\n steps: (form.steps || []).map(({ id, ...step }) => step), // Remove IDs\n })\n },\n \n /**\n * Activate or deactivate a form\n */\n async setActive(formId: string, isActive: boolean): Promise<Form> {\n return formsApi.update(formId, { isActive })\n },\n\n /**\n * Sync a form definition to the backend\n * Creates the form if it doesn't exist, updates if it does\n * Perfect for defining forms in code during development\n * \n * @example\n * ```tsx\n * // In your app initialization or form component\n * await formsApi.sync({\n * slug: 'contact',\n * name: 'Contact Form',\n * formType: 'prospect',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.textarea('message', 'Message'),\n * ]\n * })\n * ```\n */\n async sync(input: Omit<CreateFormInput, 'projectId'>): Promise<Form & { synced: boolean; created: boolean; updated: boolean }> {\n return apiRequest<Form & { synced: boolean; created: boolean; updated: boolean }>(\n 'POST',\n '/api/public/forms/sync',\n input\n )\n },\n\n /**\n * Sync multiple forms at once\n * Useful for initializing all forms in your app\n *\n * Runs sequentially to avoid bursting the API (many hosts throttle concurrent POSTs → 429).\n */\n async syncAll(forms: Array<Omit<CreateFormInput, 'projectId'>>): Promise<Array<Form & { synced: boolean; created: boolean; updated: boolean }>> {\n const results: Array<Form & { synced: boolean; created: boolean; updated: boolean }> = []\n for (const form of forms) {\n results.push(await formsApi.sync(form))\n }\n return results\n },\n}\n\n// ============================================\n// Field Builder Helpers\n// ============================================\n\n/**\n * Helper functions to build field definitions\n */\nexport const field = {\n text: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'text',\n ...options,\n }),\n \n email: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'email',\n isRequired: true,\n ...options,\n }),\n \n phone: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'phone',\n ...options,\n }),\n \n textarea: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'textarea',\n ...options,\n }),\n \n select: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'select',\n options: choices,\n ...options,\n }),\n \n radio: (slug: string, label: string, choices: Array<{ value: string; label: string }>, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'radio',\n options: choices,\n ...options,\n }),\n \n checkbox: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'checkbox',\n ...options,\n }),\n \n date: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'date',\n ...options,\n }),\n \n number: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'number',\n ...options,\n }),\n \n rating: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'rating',\n ...options,\n }),\n \n file: (slug: string, label: string, options?: Partial<FormField>): FormField => ({\n slug,\n label,\n fieldType: 'file',\n ...options,\n }),\n \n hidden: (slug: string, defaultValue: string): FormField => ({\n slug,\n label: '',\n fieldType: 'hidden',\n defaultValue,\n }),\n \n heading: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'heading',\n }),\n \n paragraph: (slug: string, label: string): FormField => ({\n slug,\n label,\n fieldType: 'paragraph',\n }),\n}\n\n// ============================================\n// Form Definition Helper\n// ============================================\n\nexport interface FormDefinition extends Omit<CreateFormInput, 'projectId'> {\n slug: string\n name: string\n fields: FormField[]\n}\n\n/**\n * Define a form declaratively\n * Returns a form definition that can be synced to the backend\n * \n * @example\n * ```tsx\n * // forms/contact.ts\n * import { defineForm, field } from '@sonordev/site-kit/forms'\n * \n * export const contactForm = defineForm({\n * slug: 'contact',\n * name: 'Contact Us',\n * formType: 'prospect',\n * successMessage: 'Thanks! We\\'ll be in touch soon.',\n * fields: [\n * field.text('name', 'Your Name', { isRequired: true }),\n * field.email('email', 'Email Address'),\n * field.phone('phone', 'Phone Number'),\n * field.select('service', 'Service Needed', [\n * { value: 'consultation', label: 'Free Consultation' },\n * { value: 'representation', label: 'Legal Representation' },\n * ]),\n * field.textarea('message', 'Tell us about your case'),\n * ]\n * })\n * \n * // Then in your app:\n * await formsApi.sync(contactForm)\n * ```\n */\nexport function defineForm(definition: FormDefinition): FormDefinition {\n // Ensure fields have sort order\n const fieldsWithOrder = definition.fields.map((f, index) => ({\n ...f,\n sortOrder: f.sortOrder ?? index,\n }))\n \n return {\n ...definition,\n fields: fieldsWithOrder,\n formType: definition.formType || 'contact',\n successMessage: definition.successMessage || 'Thank you for your submission!',\n submitButtonText: definition.submitButtonText || 'Submit',\n layout: definition.layout || 'stacked',\n isActive: definition.isActive ?? true,\n }\n}\n\n/**\n * Initialize multiple forms and sync them to the backend\n * Call this once during app initialization (e.g., in layout.tsx or _app.tsx)\n * \n * @example\n * ```tsx\n * // app/layout.tsx\n * import { initializeForms } from '@sonordev/site-kit/forms'\n * import { contactForm } from './forms/contact'\n * import { consultationForm } from './forms/consultation'\n * \n * // Initialize forms (runs once per build/server start in dev)\n * if (process.env.NODE_ENV === 'development') {\n * initializeForms([contactForm, consultationForm])\n * }\n * ```\n */\nexport async function initializeForms(forms: FormDefinition[]): Promise<void> {\n if (typeof window === 'undefined') {\n // Server-side: log that forms need to be synced\n console.log(`[Site-Kit] ${forms.length} form(s) ready to sync: ${forms.map(f => f.slug).join(', ')}`)\n return\n }\n \n try {\n const results = await formsApi.syncAll(forms)\n const created = results.filter(r => r.created).length\n const updated = results.filter(r => r.updated).length\n console.log(`[Site-Kit] Forms synced: ${created} created, ${updated} updated`)\n } catch (error) {\n console.error('[Site-Kit] Failed to sync forms:', error)\n }\n}\n","'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\n\ninterface DatePickerProps {\n value: string // YYYY-MM-DD or empty\n onChange: (value: string) => void\n id?: string\n name?: string\n required?: boolean\n minDate?: string // YYYY-MM-DD\n placeholder?: string\n className?: string\n style?: React.CSSProperties\n}\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\nconst MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : `${n}`\n}\n\nfunction toDateStr(y: number, m: number, d: number): string {\n return `${y}-${pad(m + 1)}-${pad(d)}`\n}\n\nfunction parseDate(str: string): { year: number; month: number; day: number } | null {\n if (!str) return null\n const [y, m, d] = str.split('-').map(Number)\n if (!y || !m || !d) return null\n return { year: y, month: m - 1, day: d }\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction getFirstDayOfMonth(year: number, month: number): number {\n return new Date(year, month, 1).getDay()\n}\n\nfunction formatDisplay(dateStr: string): string {\n const parsed = parseDate(dateStr)\n if (!parsed) return ''\n return `${MONTHS[parsed.month]} ${parsed.day}, ${parsed.year}`\n}\n\nexport function DatePicker({\n value,\n onChange,\n id,\n name,\n required,\n minDate,\n placeholder = 'Select a date',\n className = '',\n style,\n}: DatePickerProps) {\n const today = new Date()\n const todayStr = toDateStr(today.getFullYear(), today.getMonth(), today.getDate())\n // Only restrict dates when a minDate is explicitly configured. Defaulting to\n // today silently disabled every valid day for past-date fields (birthdates).\n const effectiveMin = minDate || ''\n\n const parsed = parseDate(value)\n const [viewYear, setViewYear] = useState(parsed?.year || today.getFullYear())\n const [viewMonth, setViewMonth] = useState(parsed?.month ?? today.getMonth())\n const [open, setOpen] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n\n // Close on click outside\n useEffect(() => {\n if (!open) return\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n // Close on escape\n useEffect(() => {\n if (!open) return\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [open])\n\n const prevMonth = useCallback(() => {\n if (viewMonth === 0) { setViewMonth(11); setViewYear(y => y - 1) }\n else setViewMonth(m => m - 1)\n }, [viewMonth])\n\n const nextMonth = useCallback(() => {\n if (viewMonth === 11) { setViewMonth(0); setViewYear(y => y + 1) }\n else setViewMonth(m => m + 1)\n }, [viewMonth])\n\n const selectDay = useCallback((day: number) => {\n const dateStr = toDateStr(viewYear, viewMonth, day)\n onChange(dateStr)\n setOpen(false)\n }, [viewYear, viewMonth, onChange])\n\n const isDisabled = useCallback((day: number): boolean => {\n const dateStr = toDateStr(viewYear, viewMonth, day)\n return dateStr < effectiveMin\n }, [viewYear, viewMonth, effectiveMin])\n\n const isSelected = useCallback((day: number): boolean => {\n if (!value) return false\n return toDateStr(viewYear, viewMonth, day) === value\n }, [viewYear, viewMonth, value])\n\n const isToday = useCallback((day: number): boolean => {\n return toDateStr(viewYear, viewMonth, day) === todayStr\n }, [viewYear, viewMonth, todayStr])\n\n // Build calendar grid\n const daysInMonth = getDaysInMonth(viewYear, viewMonth)\n const firstDay = getFirstDayOfMonth(viewYear, viewMonth)\n const weeks: (number | null)[][] = []\n let week: (number | null)[] = Array(firstDay).fill(null)\n\n for (let d = 1; d <= daysInMonth; d++) {\n week.push(d)\n if (week.length === 7) { weeks.push(week); week = [] }\n }\n if (week.length > 0) {\n while (week.length < 7) week.push(null)\n weeks.push(week)\n }\n\n return (\n <div ref={containerRef} className={`sk-datepicker ${className}`} style={{ position: 'relative', ...style }}>\n {/* Hidden native input for form submission */}\n <input type=\"hidden\" name={name} value={value || ''} />\n\n {/* Trigger button styled as input */}\n <button\n type=\"button\"\n id={id}\n onClick={() => setOpen(!open)}\n aria-required={required}\n aria-expanded={open}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: 'var(--sk-input-padding, 10px 12px)',\n backgroundColor: 'var(--sk-input-bg, #fff)',\n border: `1px solid ${open ? 'var(--sk-input-border-focus, #2563eb)' : 'var(--sk-input-border, #d1d5db)'}`,\n borderRadius: 'var(--sk-input-radius, 0.375rem)',\n fontSize: 'var(--sk-font-size, 14px)',\n color: value ? 'var(--sk-form-success-text, #111)' : 'var(--sk-text-tertiary, #9ca3af)',\n cursor: 'pointer',\n outline: 'none',\n textAlign: 'left',\n }}\n >\n <span>{value ? formatDisplay(value) : placeholder}</span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ opacity: 0.5, flexShrink: 0 }}>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n\n {/* Calendar dropdown */}\n {open && (\n <div\n style={{\n position: 'absolute',\n top: '100%',\n left: 0,\n right: 0,\n marginTop: '4px',\n backgroundColor: 'var(--sk-input-bg, #fff)',\n border: '1px solid var(--sk-input-border, #d1d5db)',\n borderRadius: 'var(--sk-input-radius, 0.375rem)',\n boxShadow: '0 10px 25px rgba(0,0,0,0.3)',\n zIndex: 50,\n padding: '12px',\n minWidth: '280px',\n }}\n >\n {/* Month/Year header */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '12px' }}>\n <button\n type=\"button\"\n onClick={prevMonth}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '4px 8px', color: 'var(--sk-label-color, #6b7280)', fontSize: '18px', lineHeight: 1 }}\n aria-label=\"Previous month\"\n >\n ‹\n </button>\n <span style={{ fontWeight: 600, fontSize: '14px', color: 'var(--sk-form-success-text, #111)' }}>\n {MONTHS[viewMonth]} {viewYear}\n </span>\n <button\n type=\"button\"\n onClick={nextMonth}\n style={{ background: 'none', border: 'none', cursor: 'pointer', padding: '4px 8px', color: 'var(--sk-label-color, #6b7280)', fontSize: '18px', lineHeight: 1 }}\n aria-label=\"Next month\"\n >\n ›\n </button>\n </div>\n\n {/* Day headers */}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: '2px', marginBottom: '4px' }}>\n {DAYS.map(d => (\n <div key={d} style={{ textAlign: 'center', fontSize: '11px', fontWeight: 600, color: 'var(--sk-text-tertiary, #9ca3af)', padding: '4px 0', textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n {d}\n </div>\n ))}\n </div>\n\n {/* Day grid */}\n {weeks.map((week, wi) => (\n <div key={wi} style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: '2px' }}>\n {week.map((day, di) => {\n if (day === null) {\n return <div key={di} style={{ padding: '6px' }} />\n }\n\n const disabled = isDisabled(day)\n const selected = isSelected(day)\n const todayMark = isToday(day)\n\n return (\n <button\n key={di}\n type=\"button\"\n disabled={disabled}\n onClick={() => selectDay(day)}\n style={{\n padding: '6px',\n textAlign: 'center',\n fontSize: '13px',\n fontWeight: selected ? 700 : todayMark ? 600 : 400,\n borderRadius: '6px',\n border: todayMark && !selected ? '1px solid var(--sk-primary, #2563eb)' : '1px solid transparent',\n background: selected ? 'var(--sk-primary, #2563eb)' : 'transparent',\n color: disabled\n ? 'var(--sk-text-tertiary, #9ca3af)'\n : selected\n ? '#fff'\n : 'var(--sk-form-success-text, #111)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n transition: 'background 0.15s, color 0.15s',\n }}\n onMouseEnter={(e) => {\n if (!disabled && !selected) {\n ;(e.target as HTMLElement).style.background = 'var(--sk-input-border, #e5e7eb)'\n }\n }}\n onMouseLeave={(e) => {\n if (!disabled && !selected) {\n ;(e.target as HTMLElement).style.background = 'transparent'\n }\n }}\n aria-label={`${MONTHS[viewMonth]} ${day}, ${viewYear}`}\n aria-selected={selected}\n >\n {day}\n </button>\n )\n })}\n </div>\n ))}\n\n {/* Today shortcut */}\n <div style={{ marginTop: '8px', textAlign: 'center' }}>\n <button\n type=\"button\"\n onClick={() => { onChange(todayStr); setOpen(false) }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 600,\n color: 'var(--sk-primary, #2563eb)',\n padding: '4px 8px',\n }}\n >\n Today\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Form Field Component\n *\n * Renders individual form fields based on type.\n *\n * Styling Options:\n * 1. Use CSS variables to customize the default styles\n * 2. Use the `className` prop on ManagedForm for scoped styles\n * 3. Use the custom render function for complete control\n *\n * CSS Variables (set these in your stylesheet or import brand.css):\n * --sk-input-bg: #ffffff\n * --sk-input-border: #d1d5db\n * --sk-input-border-focus: #2563eb\n * --sk-input-border-error: #dc2626\n * --sk-input-radius: 0.375rem\n * --sk-input-padding: 10px 12px\n * --sk-label-color: inherit\n * --sk-label-weight: 500\n * --sk-error: #dc2626\n * --sk-text-tertiary: #6b7280\n * --sk-font-size: 16px\n */\n\n'use client'\n\nimport React from 'react'\nimport type { FormField as FormFieldType } from './types'\nimport { DatePicker } from './DatePicker'\nimport { sonorFetch } from '../shared/sonorFetch'\n\ninterface FormFieldProps {\n field: FormFieldType\n value: unknown\n error?: string\n onChange: (value: unknown) => void\n /** Optional class name prefix for custom styling */\n classPrefix?: string\n}\n\n/**\n * Normalize options from various DB formats into [{value, label}]\n * Handles:\n * - [{value, label}] → pass through\n * - {choices: [\"A\", \"B\"]} → [{value: \"A\", label: \"A\"}, ...]\n * - [\"A\", \"B\"] → [{value: \"A\", label: \"A\"}, ...]\n */\nfunction normalizeOptions(options: unknown): { value: string; label: string }[] {\n if (!options) return []\n if (Array.isArray(options)) {\n return options.map((opt) => {\n if (typeof opt === 'string') return { value: opt, label: opt }\n if (typeof opt === 'object' && opt !== null && 'value' in opt && 'label' in opt) return opt as { value: string; label: string }\n if (typeof opt === 'object' && opt !== null && 'label' in opt) return { value: (opt as any).label, label: (opt as any).label }\n return { value: String(opt), label: String(opt) }\n })\n }\n if (typeof options === 'object' && options !== null) {\n const obj = options as Record<string, unknown>\n if (Array.isArray(obj.choices)) return normalizeOptions(obj.choices)\n if (Array.isArray(obj.items)) return normalizeOptions(obj.items)\n if (Array.isArray(obj.options)) return normalizeOptions(obj.options)\n }\n return []\n}\n\nexport function FormField({ field, value, error, onChange, classPrefix = 'sk-form' }: FormFieldProps) {\n // Stable id from field (no hooks - avoids \"Rendered fewer hooks than expected\" with early returns)\n const inputId = `sk-${(field as { id?: string }).id || field.slug}`\n // Normalize options once\n const options = normalizeOptions(field.options)\n // Use CSS variables with inline style fallbacks\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n padding: 'var(--sk-input-padding, 10px 12px)',\n fontSize: 'var(--sk-font-size, 16px)',\n border: error \n ? '1px solid var(--sk-input-border-error, #dc2626)' \n : '1px solid var(--sk-input-border, #d1d5db)',\n borderRadius: 'var(--sk-input-radius, 6px)',\n backgroundColor: 'var(--sk-input-bg, #ffffff)',\n outline: 'none',\n fontFamily: 'inherit',\n }\n \n const labelStyle: React.CSSProperties = {\n display: 'block',\n marginBottom: 6,\n fontWeight: 'var(--sk-label-weight, 500)' as any,\n color: 'var(--sk-label-color, inherit)',\n }\n \n const errorStyle: React.CSSProperties = {\n color: 'var(--sk-error, #dc2626)',\n fontSize: 14,\n marginTop: 4,\n }\n \n const helpStyle: React.CSSProperties = {\n color: 'var(--sk-text-tertiary, #6b7280)',\n fontSize: 14,\n marginTop: 4,\n }\n \n // Heading / Section Header (display only)\n if (field.field_type === 'heading' || field.field_type === 'section_header') {\n return <h3 className={`${classPrefix}__heading`} style={{ margin: '16px 0 8px', fontWeight: 600, fontSize: 18 }}>{field.label}</h3>\n }\n \n // Paragraph (display only)\n if (field.field_type === 'paragraph') {\n return <p className={`${classPrefix}__paragraph`} style={{ color: 'var(--sk-text-tertiary, #6b7280)', margin: '8px 0' }}>{field.help_text || field.label}</p>\n }\n \n // Hidden field\n if (field.field_type === 'hidden') {\n return <input type=\"hidden\" name={field.slug} value={String(value || '')} />\n }\n\n const hideLabel = !!(field as { hide_label?: boolean }).hide_label\n const effectivePlaceholder = hideLabel ? field.label : field.placeholder\n\n return (\n <div className={`${classPrefix}__field ${classPrefix}__field--${field.field_type}`}>\n <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 } : {}) }}>\n {field.label}\n {field.is_required && <span style={{ color: 'var(--sk-error, #dc2626)' }}> *</span>}\n </label>\n \n {/* Text, Email, Phone/Tel, Number */}\n {['text', 'email', 'phone', 'tel', 'number'].includes(field.field_type) && (\n <input\n id={inputId}\n className={`${classPrefix}__input`}\n type={field.field_type === 'phone' || field.field_type === 'tel' ? 'tel' : field.field_type}\n name={field.slug}\n value={String(value || '')}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* Textarea */}\n {field.field_type === 'textarea' && (\n <textarea\n id={inputId}\n className={`${classPrefix}__textarea`}\n name={field.slug}\n value={String(value || '')}\n placeholder={effectivePlaceholder}\n required={field.is_required}\n rows={4}\n onChange={(e) => onChange(e.target.value)}\n style={{ ...baseInputStyle, resize: 'vertical' }}\n />\n )}\n \n {/* Select */}\n {field.field_type === 'select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select`}\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n >\n <option value=\"\">{effectivePlaceholder || 'Select an option'}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Multi-select */}\n {field.field_type === 'multi-select' && (\n <select\n id={inputId}\n className={`${classPrefix}__select ${classPrefix}__select--multi`}\n name={field.slug}\n value={Array.isArray(value) ? value : []}\n required={field.is_required}\n multiple\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, opt => opt.value)\n onChange(selected)\n }}\n style={{ ...baseInputStyle, height: 120 }}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n )}\n \n {/* Radio */}\n {field.field_type === 'radio' && (\n <div className={`${classPrefix}__radio-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => (\n <label key={option.value} className={`${classPrefix}__radio-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"radio\"\n name={field.slug}\n value={option.value}\n checked={value === option.value}\n onChange={() => onChange(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n )}\n \n {/* Checkbox (single) */}\n {field.field_type === 'checkbox' && options.length === 0 && (\n <label className={`${classPrefix}__checkbox`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n name={field.slug}\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n />\n {field.help_text || field.label}\n </label>\n )}\n \n {/* Checkbox (multiple options) */}\n {field.field_type === 'checkbox' && options.length > 0 && (\n <div className={`${classPrefix}__checkbox-group`} style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {options.map((option) => {\n const selectedValues = Array.isArray(value) ? value : []\n const isChecked = selectedValues.includes(option.value)\n \n return (\n <label key={option.value} className={`${classPrefix}__checkbox-option`} style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {\n if (isChecked) {\n onChange(selectedValues.filter(v => v !== option.value))\n } else {\n onChange([...selectedValues, option.value])\n }\n }}\n />\n {option.label}\n </label>\n )\n })}\n </div>\n )}\n \n {/* Date - Custom calendar picker */}\n {field.field_type === 'date' && (\n <DatePicker\n id={inputId}\n name={field.slug}\n value={String(value || '')}\n onChange={onChange}\n required={field.is_required}\n placeholder={field.placeholder || 'Select a date'}\n className={`${classPrefix}__input ${classPrefix}__input--date`}\n />\n )}\n \n {/* Time */}\n {field.field_type === 'time' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--time`}\n type=\"time\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* DateTime */}\n {field.field_type === 'datetime' && (\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--datetime`}\n type=\"datetime-local\"\n name={field.slug}\n value={String(value || '')}\n required={field.is_required}\n onChange={(e) => onChange(e.target.value)}\n style={baseInputStyle}\n />\n )}\n \n {/* File */}\n {field.field_type === 'file' && (\n <FileUploadField\n field={field}\n inputId={inputId}\n classPrefix={classPrefix}\n baseInputStyle={baseInputStyle}\n onChange={onChange}\n />\n )}\n \n {/* Rating */}\n {field.field_type === 'rating' && (\n <div className={`${classPrefix}__rating`} style={{ display: 'flex', gap: 4 }}>\n {[1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => onChange(star)}\n className={`${classPrefix}__rating-star`}\n style={{\n background: 'none',\n border: 'none',\n fontSize: 24,\n cursor: 'pointer',\n color: (value as number) >= star ? 'var(--sk-rating-active, #fbbf24)' : 'var(--sk-rating-inactive, #d1d5db)',\n }}\n >\n ★\n </button>\n ))}\n </div>\n )}\n \n {/* Slider */}\n {field.field_type === 'slider' && (\n <div className={`${classPrefix}__slider`}>\n <input\n id={inputId}\n type=\"range\"\n name={field.slug}\n value={Number(value || 50)}\n min={field.validation?.min || 0}\n max={field.validation?.max || 100}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{ width: '100%' }}\n />\n <div className={`${classPrefix}__slider-value`} style={{ textAlign: 'center', marginTop: 4 }}>{String(value || 50)}</div>\n </div>\n )}\n \n {/* Error message */}\n {error && <p className={`${classPrefix}__error`} style={errorStyle}>{error}</p>}\n \n {/* Help text */}\n {field.help_text && !error && field.field_type !== 'checkbox' && (\n <p className={`${classPrefix}__help`} style={helpStyle}>{field.help_text}</p>\n )}\n </div>\n )\n}\n\n/**\n * File upload field. Uploads the chosen file to the Sonor API, which stores it\n * and returns a public URL — that URL becomes the field value, so large files\n * never touch the JSON submission body. The field value stays empty until the\n * upload succeeds, so a required file field correctly blocks submission until\n * the upload completes (rather than submitting a useless bare filename).\n */\nfunction FileUploadField({\n field,\n inputId,\n classPrefix,\n baseInputStyle,\n onChange,\n}: {\n field: FormFieldType\n inputId: string\n classPrefix: string\n baseInputStyle: React.CSSProperties\n onChange: (value: unknown) => void\n}) {\n const [status, setStatus] = React.useState<'idle' | 'uploading' | 'error'>('idle')\n const [fileName, setFileName] = React.useState('')\n\n const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (!file) return\n setFileName(file.name)\n setStatus('uploading')\n onChange('') // clear any prior URL until this upload completes\n try {\n const url = await uploadFormFile(file)\n onChange(url)\n setStatus('idle')\n } catch (err) {\n console.error('[Forms] File upload failed:', err)\n onChange('')\n setStatus('error')\n }\n }\n\n return (\n <>\n <input\n id={inputId}\n className={`${classPrefix}__input ${classPrefix}__input--file`}\n type=\"file\"\n name={field.slug}\n required={field.is_required}\n disabled={status === 'uploading'}\n onChange={handleFile}\n style={baseInputStyle}\n />\n {status === 'uploading' && (\n <p style={{ color: 'var(--sk-text-tertiary, #6b7280)', fontSize: 14, marginTop: 4 }}>\n Uploading {fileName}…\n </p>\n )}\n {status === 'error' && (\n <p role=\"alert\" style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 4 }}>\n Upload failed. Please choose the file again.\n </p>\n )}\n </>\n )\n}\n\n/** Upload a single file to the Sonor API and return its stored public URL. */\nasync function uploadFormFile(file: File): Promise<string> {\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey =\n typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n if (!apiKey) {\n throw new Error('API key is required to upload files.')\n }\n\n const body = new FormData()\n body.append('file', file)\n\n // No Content-Type header — the browser sets the multipart boundary itself.\n const response = await sonorFetch(\n `${apiUrl}/api/public/forms/upload`,\n {\n method: 'POST',\n headers: { Authorization: `Bearer ${apiKey}` },\n body,\n },\n { retries: 1, timeoutMs: 60000 },\n )\n\n if (!response.ok) {\n throw new Error(`Upload failed (${response.status})`)\n }\n const data = (await response.json().catch(() => null)) as { url?: string } | null\n if (!data?.url) {\n throw new Error('Upload did not return a URL.')\n }\n return data.url\n}\n","/**\n * @sonordev/site-kit/forms - Form Client Component\n * \n * Handles form state, validation, and submission\n */\n\n'use client'\n\nimport React, { useState, useCallback, useMemo, useRef } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { FormField } from './FormField'\nimport { submitForm, DEFAULT_HONEYPOT_FIELD } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField as FormFieldType, \n FormRenderProps,\n FormSubmission,\n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\n\ninterface FormClientProps {\n config: ManagedFormConfig\n className?: string\n onSuccess?: (submission: FormSubmission) => void\n onError?: (error: Error) => void\n customRender?: (props: FormRenderProps) => React.ReactNode\n}\n\nexport function FormClient({\n config,\n className,\n onSuccess,\n onError,\n customRender,\n}: FormClientProps) {\n const [values, setValues] = useState<Record<string, unknown>>({})\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n const [honeypotValue, setHoneypotValue] = useState('')\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n\n // Anti-bot: record when form first rendered (bots submit in < 3 seconds)\n const formLoadedAt = useRef(Date.now())\n // Synchronous guard against a concurrent double-submit (Enter + click, etc.).\n const isSubmittingRef = useRef(false)\n\n const { trackStepChange, trackComplete } = useFormTracking({\n formId: config.id,\n totalSteps: config.total_steps,\n })\n \n // Get fields for current step\n const currentFields = useMemo(() => {\n if (!config.is_multi_step) {\n return config.fields || []\n }\n \n const currentStepConfig = config.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return config.fields || []\n \n return (config.fields || []).filter(f => f.step_id === currentStepConfig.id)\n }, [config, step])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormFieldType): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue).includes(String(value))\n case 'not_contains':\n return !String(fieldValue).includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Validate field\n const validateField = useCallback((field: FormFieldType): string | null => {\n if (!isFieldVisible(field)) return null\n // Skip display-only field types\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return null\n \n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check — guard against an invalid admin-entered pattern.\n if (rules.pattern) {\n try {\n if (!new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n } catch {\n // Malformed pattern — skip rather than crashing the whole form render.\n }\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validateStep = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of currentFields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [currentFields, validateField])\n\n // Validate EVERY field across all steps — used on final submit so a required\n // field left empty on an earlier step cannot slip through. Returns the first\n // step containing an error so the user can be taken straight to it.\n const validateAll = useCallback((): { ok: boolean; firstErrorStep: number | null } => {\n const allFields = config.fields || []\n const newErrors: Record<string, string> = {}\n for (const field of allFields) {\n const error = validateField(field)\n if (error) newErrors[field.slug] = error\n }\n setErrors(newErrors)\n if (Object.keys(newErrors).length === 0) return { ok: true, firstErrorStep: null }\n\n let firstErrorStep: number | null = null\n if (config.is_multi_step && config.steps) {\n const ordered = [...config.steps].sort((a, b) => a.step_number - b.step_number)\n for (const s of ordered) {\n if (allFields.some((f) => f.step_id === s.id && newErrors[f.slug])) {\n firstErrorStep = s.step_number\n break\n }\n }\n }\n return { ok: false, firstErrorStep }\n }, [config, validateField])\n\n // Collect values for currently-visible fields only, so a value typed into a\n // field that later became conditionally hidden is never submitted.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of config.fields || []) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [config, values, isFieldVisible])\n\n // Set field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValues(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n if (errors[key]) {\n setErrors(prev => {\n const next = { ...prev }\n delete next[key]\n return next\n })\n }\n }, [errors])\n \n // Step navigation\n const nextStep = useCallback((): boolean => {\n if (!validateStep()) return false\n \n if (step < config.total_steps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, config.total_steps, validateStep, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= config.total_steps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [config.total_steps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n // Re-entrancy guard — refs update synchronously, so this blocks a second\n // submit fired in the same tick (Enter key + button click, or a double-tap).\n if (isSubmittingRef.current) return\n\n const { ok, firstErrorStep } = validateAll()\n if (!ok) {\n if (firstErrorStep != null) setStep(firstErrorStep)\n return\n }\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config,\n values: buildVisibleValues(),\n honeypotValue: config.honeypot_enabled ? honeypotValue : '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n if (config.redirect_url) {\n window.location.href = config.redirect_url\n }\n } catch (error) {\n console.error('[Forms] Submission error:', error)\n setSubmitError('Something went wrong sending your submission. Please try again.')\n onError?.(error as Error)\n } finally {\n isSubmittingRef.current = false\n setIsSubmitting(false)\n }\n }, [config, honeypotValue, validateAll, buildVisibleValues, trackComplete, onSuccess, onError])\n \n // Progress percentage\n const progress = useMemo(() => {\n return Math.round((step / config.total_steps) * 100)\n }, [step, config.total_steps])\n \n // Render props for custom rendering\n const renderProps: FormRenderProps = {\n config,\n fields: currentFields,\n step,\n totalSteps: config.total_steps,\n values,\n errors,\n isSubmitting,\n progress,\n nextStep,\n prevStep,\n goToStep,\n submit,\n setFieldValue,\n isFieldVisible,\n }\n \n // Show success message (fallback when API returns empty / null success_message)\n if (isComplete) {\n const raw = config.success_message\n const message =\n typeof raw === 'string' && raw.trim().length > 0\n ? raw.trim()\n : DEFAULT_FORM_SUCCESS_MESSAGE\n return (\n <div\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n style={{\n color: 'var(--sk-form-success-text, #111827)',\n lineHeight: 1.6,\n }}\n >\n <p style={{ margin: 0, fontSize: '1.0625rem' }}>{message}</p>\n </div>\n )\n }\n \n // Custom render\n if (customRender) {\n return <>{customRender(renderProps)}</>\n }\n \n // Default render\n return (\n <form\n className={`sk-form ${className || ''}`}\n onSubmit={(e) => {\n e.preventDefault()\n if (step < config.total_steps) {\n nextStep()\n } else {\n submit()\n }\n }}\n >\n {/* Step indicator for multi-step */}\n {config.is_multi_step && (\n <div className=\"sk-form__progress\" style={{ marginBottom: 20 }}>\n <div className=\"sk-form__progress-header\" style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 8 }}>\n <span className=\"sk-form__progress-step\">Step {step} of {config.total_steps}</span>\n <span className=\"sk-form__progress-percent\">{progress}%</span>\n </div>\n <div className=\"sk-form__progress-track\" style={{ \n height: 4, \n backgroundColor: 'var(--sk-progress-bg, #e5e7eb)', \n borderRadius: 2,\n overflow: 'hidden' \n }}>\n <div className=\"sk-form__progress-bar\" style={{ \n width: `${progress}%`, \n height: '100%', \n backgroundColor: 'var(--sk-progress-fill, #2563eb)',\n transition: 'width 0.3s ease'\n }} />\n </div>\n </div>\n )}\n \n {/* Fields */}\n <div className=\"sk-form__fields\">\n {currentFields.map((field) => {\n if (!isFieldVisible(field)) return null\n \n return (\n <div key={field.id} className={`sk-form__field-wrapper sk-form__field-wrapper--${field.width || 'full'}`}>\n <FormField\n field={field}\n value={values[field.slug]}\n error={errors[field.slug]}\n onChange={(value) => setFieldValue(field.slug, value)}\n />\n </div>\n )\n })}\n </div>\n \n {/* Navigation buttons */}\n <div className=\"sk-form__actions\" style={{ \n display: 'flex', \n justifyContent: step > 1 ? 'space-between' : 'flex-end',\n marginTop: 24 \n }}>\n {step > 1 && (\n <button type=\"button\" className=\"sk-form__btn sk-form__btn--back\" onClick={prevStep}>\n Back\n </button>\n )}\n <button type=\"submit\" className=\"sk-form__btn sk-form__btn--submit\" disabled={isSubmitting}>\n {isSubmitting \n ? 'Submitting...' \n : step < config.total_steps \n ? 'Next' \n : config.submit_button_text\n }\n </button>\n </div>\n\n {submitError && (\n <p\n className=\"sk-form__submit-error\"\n role=\"alert\"\n style={{ color: 'var(--sk-error, #dc2626)', fontSize: 14, marginTop: 12 }}\n >\n {submitError}\n </p>\n )}\n\n {/* Honeypot field */}\n {config.honeypot_enabled && (\n <input\n type=\"text\"\n name={honeypotFieldName}\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n style={{\n position: 'absolute', \n left: -9999, \n opacity: 0,\n pointerEvents: 'none' \n }}\n value={honeypotValue}\n onChange={(e) => {\n setHoneypotValue(e.target.value)\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n }}\n />\n )}\n </form>\n )\n}\n","/**\n * @sonordev/site-kit/forms - Managed Form Component\n * \n * Fetches form config from Portal API and renders fields with validation\n */\n\n'use client'\n\nimport type { ManagedFormProps } from './types'\nimport { useForm } from './useForm'\nimport { FormClient } from './FormClient'\n\n// ============================================\n// Main Component (Client Component)\n// ============================================\n\nexport function ManagedForm({\n formId,\n projectId,\n className,\n onSuccess,\n onError,\n children,\n}: ManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n } = useForm(formId, {\n projectId,\n onSuccess,\n onError,\n })\n \n if (isLoading) {\n return (\n <div className={className}>\n <p style={{ color: '#6b7280' }}>Loading form...</p>\n </div>\n )\n }\n \n if (fetchError || !form) {\n return (\n <div className={className}>\n <p style={{ color: 'var(--sk-error, #dc2626)' }}>\n {fetchError?.message || 'Form not found or inactive.'}\n </p>\n </div>\n )\n }\n \n // Pass to client component for interactivity\n return (\n <FormClient\n config={form}\n className={className}\n onSuccess={onSuccess}\n onError={onError}\n customRender={children}\n />\n )\n}\n\n"]}
|
package/dist/forms/index.mjs
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useFormTracking, submitForm, DEFAULT_FORM_SUCCESS_MESSAGE, useForm } from '../chunk-
|
|
3
|
-
export { DEFAULT_FORM_SUCCESS_MESSAGE, useForm, useFormTracking } from '../chunk-
|
|
2
|
+
import { useFormTracking, submitForm, DEFAULT_FORM_SUCCESS_MESSAGE, useForm } from '../chunk-RQV3FO33.mjs';
|
|
3
|
+
export { DEFAULT_FORM_SUCCESS_MESSAGE, useForm, useFormTracking } from '../chunk-RQV3FO33.mjs';
|
|
4
4
|
import { DEFAULT_HONEYPOT_FIELD } from '../chunk-X3S6KXAP.mjs';
|
|
5
5
|
import '../chunk-6EDVCUAG.mjs';
|
|
6
|
-
import { sonorFetch } from '../chunk-
|
|
7
|
-
import '../chunk-
|
|
6
|
+
import { sonorFetch } from '../chunk-S32BEPZM.mjs';
|
|
7
|
+
import '../chunk-BYW3MJ36.mjs';
|
|
8
|
+
import '../chunk-KRZL6VYP.mjs';
|
|
8
9
|
import '../chunk-4XPGGLVP.mjs';
|
|
9
10
|
import React2, { useState, useRef, useEffect, useCallback, useMemo } from 'react';
|
|
10
11
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|